From 64d7ebe1664bb17c3a6e18a7cd0a8e2ae6d046ac Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Thu, 6 Apr 2006 19:48:32 +0000 Subject: [PATCH] added libtomcrypt-1.11 --- Doxyfile | 2 +- TODO | 3 + build.sh | 8 +- changes | 27 +- crypt.tex | 27 +- demos/test.c | 2 + demos/timing.c | 2 + demos/tv_gen.c | 76 ++- doc/crypt.pdf | Bin 629809 -> 629948 bytes doc/footer.html | 6 +- makefile | 16 +- makefile.icc | 13 +- makefile.msvc | 8 +- makefile.shared | 24 +- notes/lrw_tv.txt | 126 +++++ src/ciphers/aes/aes.c | 2 +- src/ciphers/aes/aes_tab.c | 6 +- src/ciphers/anubis.c | 2 +- src/ciphers/blowfish.c | 2 +- src/ciphers/cast5.c | 2 +- src/ciphers/des.c | 2 +- src/ciphers/khazad.c | 2 +- src/ciphers/noekeon.c | 2 +- src/ciphers/rc2.c | 2 +- src/ciphers/rc5.c | 2 +- src/ciphers/rc6.c | 2 +- src/ciphers/safer/safer.c | 2 +- src/ciphers/safer/safer_tab.c | 2 +- src/ciphers/safer/saferp.c | 2 +- src/ciphers/skipjack.c | 2 +- src/ciphers/twofish/twofish.c | 2 +- src/ciphers/twofish/twofish_tab.c | 2 +- src/ciphers/xtea.c | 2 +- src/encauth/ccm/ccm_memory.c | 2 +- src/encauth/ccm/ccm_test.c | 2 +- src/encauth/eax/eax_addheader.c | 2 +- src/encauth/eax/eax_decrypt.c | 2 +- src/encauth/eax/eax_decrypt_verify_memory.c | 2 +- src/encauth/eax/eax_done.c | 2 +- src/encauth/eax/eax_encrypt.c | 2 +- .../eax/eax_encrypt_authenticate_memory.c | 2 +- src/encauth/eax/eax_init.c | 2 +- src/encauth/eax/eax_test.c | 2 +- src/encauth/gcm/gcm_add_aad.c | 2 +- src/encauth/gcm/gcm_add_iv.c | 2 +- src/encauth/gcm/gcm_done.c | 2 +- src/encauth/gcm/gcm_gf_mult.c | 2 +- src/encauth/gcm/gcm_init.c | 2 +- src/encauth/gcm/gcm_memory.c | 2 +- src/encauth/gcm/gcm_mult_h.c | 2 +- src/encauth/gcm/gcm_process.c | 2 +- src/encauth/gcm/gcm_reset.c | 2 +- src/encauth/gcm/gcm_test.c | 2 +- src/encauth/ocb/ocb_decrypt.c | 2 +- src/encauth/ocb/ocb_decrypt_verify_memory.c | 2 +- src/encauth/ocb/ocb_done_decrypt.c | 2 +- src/encauth/ocb/ocb_done_encrypt.c | 2 +- src/encauth/ocb/ocb_encrypt.c | 2 +- .../ocb/ocb_encrypt_authenticate_memory.c | 2 +- src/encauth/ocb/ocb_init.c | 2 +- src/encauth/ocb/ocb_ntz.c | 2 +- src/encauth/ocb/ocb_shift_xor.c | 2 +- src/encauth/ocb/ocb_test.c | 2 +- src/encauth/ocb/s_ocb_done.c | 2 +- src/hashes/chc/chc.c | 2 +- src/hashes/helper/hash_file.c | 2 +- src/hashes/helper/hash_filehandle.c | 2 +- src/hashes/helper/hash_memory.c | 2 +- src/hashes/helper/hash_memory_multi.c | 2 +- src/hashes/md2.c | 2 +- src/hashes/md4.c | 2 +- src/hashes/md5.c | 2 +- src/hashes/rmd128.c | 2 +- src/hashes/rmd160.c | 2 +- src/hashes/sha1.c | 2 +- src/hashes/sha2/sha224.c | 2 +- src/hashes/sha2/sha256.c | 2 +- src/hashes/sha2/sha384.c | 2 +- src/hashes/sha2/sha512.c | 2 +- src/hashes/tiger.c | 2 +- src/hashes/whirl/whirl.c | 2 +- src/headers/tomcrypt.h | 4 +- src/headers/tomcrypt_cfg.h | 8 +- src/headers/tomcrypt_cipher.h | 1 + src/headers/tomcrypt_custom.h | 6 +- src/headers/tomcrypt_macros.h | 6 +- src/headers/tomcrypt_math.h | 16 +- src/headers/tomcrypt_pk.h | 2 + src/mac/hmac/hmac_done.c | 2 +- src/mac/hmac/hmac_file.c | 2 +- src/mac/hmac/hmac_init.c | 2 +- src/mac/hmac/hmac_memory.c | 2 +- src/mac/hmac/hmac_memory_multi.c | 2 +- src/mac/hmac/hmac_process.c | 2 +- src/mac/hmac/hmac_test.c | 2 +- src/mac/omac/omac_done.c | 2 +- src/mac/omac/omac_file.c | 2 +- src/mac/omac/omac_init.c | 2 +- src/mac/omac/omac_memory.c | 2 +- src/mac/omac/omac_memory_multi.c | 2 +- src/mac/omac/omac_process.c | 2 +- src/mac/omac/omac_test.c | 2 +- src/mac/pelican/pelican.c | 4 +- src/mac/pelican/pelican_memory.c | 2 +- src/mac/pelican/pelican_test.c | 2 +- src/mac/pmac/pmac_done.c | 2 +- src/mac/pmac/pmac_file.c | 2 +- src/mac/pmac/pmac_init.c | 2 +- src/mac/pmac/pmac_memory.c | 2 +- src/mac/pmac/pmac_memory_multi.c | 2 +- src/mac/pmac/pmac_ntz.c | 2 +- src/mac/pmac/pmac_process.c | 2 +- src/mac/pmac/pmac_shift_xor.c | 2 +- src/mac/pmac/pmac_test.c | 2 +- src/math/gmp_desc.c | 473 ++++++++++++++++++ src/math/ltm_desc.c | 5 +- src/math/multi.c | 2 +- src/math/rand_prime.c | 2 +- src/math/tfm_desc.c | 285 ++++++++++- src/misc/base64/base64_decode.c | 2 +- src/misc/base64/base64_encode.c | 2 +- src/misc/burn_stack.c | 2 +- src/misc/crypt/crypt.c | 8 +- src/misc/crypt/crypt_argchk.c | 2 +- src/misc/crypt/crypt_cipher_descriptor.c | 2 +- src/misc/crypt/crypt_cipher_is_valid.c | 2 +- src/misc/crypt/crypt_find_cipher.c | 2 +- src/misc/crypt/crypt_find_cipher_any.c | 2 +- src/misc/crypt/crypt_find_cipher_id.c | 2 +- src/misc/crypt/crypt_find_hash.c | 2 +- src/misc/crypt/crypt_find_hash_any.c | 2 +- src/misc/crypt/crypt_find_hash_id.c | 2 +- src/misc/crypt/crypt_find_hash_oid.c | 2 +- src/misc/crypt/crypt_find_prng.c | 2 +- src/misc/crypt/crypt_hash_descriptor.c | 2 +- src/misc/crypt/crypt_hash_is_valid.c | 2 +- src/misc/crypt/crypt_ltc_mp_descriptor.c | 2 +- src/misc/crypt/crypt_prng_descriptor.c | 2 +- src/misc/crypt/crypt_prng_is_valid.c | 2 +- src/misc/crypt/crypt_register_cipher.c | 2 +- src/misc/crypt/crypt_register_hash.c | 2 +- src/misc/crypt/crypt_register_prng.c | 2 +- src/misc/crypt/crypt_unregister_cipher.c | 2 +- src/misc/crypt/crypt_unregister_hash.c | 2 +- src/misc/crypt/crypt_unregister_prng.c | 2 +- src/misc/error_to_string.c | 2 +- src/misc/pkcs5/pkcs_5_1.c | 2 +- src/misc/pkcs5/pkcs_5_2.c | 2 +- src/misc/zeromem.c | 2 +- src/modes/cbc/cbc_decrypt.c | 2 +- src/modes/cbc/cbc_done.c | 2 +- src/modes/cbc/cbc_encrypt.c | 2 +- src/modes/cbc/cbc_getiv.c | 2 +- src/modes/cbc/cbc_setiv.c | 2 +- src/modes/cbc/cbc_start.c | 2 +- src/modes/cfb/cfb_decrypt.c | 2 +- src/modes/cfb/cfb_done.c | 2 +- src/modes/cfb/cfb_encrypt.c | 2 +- src/modes/cfb/cfb_getiv.c | 2 +- src/modes/cfb/cfb_setiv.c | 2 +- src/modes/cfb/cfb_start.c | 2 +- src/modes/ctr/ctr_decrypt.c | 2 +- src/modes/ctr/ctr_done.c | 2 +- src/modes/ctr/ctr_encrypt.c | 2 +- src/modes/ctr/ctr_getiv.c | 2 +- src/modes/ctr/ctr_setiv.c | 2 +- src/modes/ctr/ctr_start.c | 2 +- src/modes/ecb/ecb_decrypt.c | 2 +- src/modes/ecb/ecb_done.c | 2 +- src/modes/ecb/ecb_encrypt.c | 2 +- src/modes/ecb/ecb_start.c | 2 +- src/modes/lrw/lrw_decrypt.c | 2 +- src/modes/lrw/lrw_done.c | 2 +- src/modes/lrw/lrw_encrypt.c | 2 +- src/modes/lrw/lrw_getiv.c | 2 +- src/modes/lrw/lrw_process.c | 12 +- src/modes/lrw/lrw_setiv.c | 2 +- src/modes/lrw/lrw_start.c | 4 +- src/modes/lrw/lrw_test.c | 29 +- src/modes/ofb/ofb_decrypt.c | 2 +- src/modes/ofb/ofb_done.c | 2 +- src/modes/ofb/ofb_encrypt.c | 2 +- src/modes/ofb/ofb_getiv.c | 2 +- src/modes/ofb/ofb_setiv.c | 2 +- src/modes/ofb/ofb_start.c | 2 +- src/pk/asn1/der/bit/der_decode_bit_string.c | 2 +- src/pk/asn1/der/bit/der_encode_bit_string.c | 2 +- src/pk/asn1/der/bit/der_length_bit_string.c | 2 +- src/pk/asn1/der/choice/der_decode_choice.c | 2 +- src/pk/asn1/der/ia5/der_decode_ia5_string.c | 2 +- src/pk/asn1/der/ia5/der_encode_ia5_string.c | 2 +- src/pk/asn1/der/ia5/der_length_ia5_string.c | 2 +- src/pk/asn1/der/integer/der_decode_integer.c | 2 +- src/pk/asn1/der/integer/der_encode_integer.c | 3 +- src/pk/asn1/der/integer/der_length_integer.c | 2 +- .../der_decode_object_identifier.c | 2 +- .../der_encode_object_identifier.c | 2 +- .../der_length_object_identifier.c | 2 +- .../asn1/der/octet/der_decode_octet_string.c | 2 +- .../asn1/der/octet/der_encode_octet_string.c | 2 +- .../asn1/der/octet/der_length_octet_string.c | 2 +- .../der_decode_printable_string.c | 2 +- .../der_encode_printable_string.c | 2 +- .../der_length_printable_string.c | 2 +- .../der/sequence/der_decode_sequence_ex.c | 2 +- .../der/sequence/der_decode_sequence_flexi.c | 4 +- .../der/sequence/der_decode_sequence_multi.c | 2 +- .../der/sequence/der_encode_sequence_ex.c | 2 +- .../der/sequence/der_encode_sequence_multi.c | 2 +- .../asn1/der/sequence/der_length_sequence.c | 2 +- src/pk/asn1/der/sequence/der_sequence_free.c | 2 +- src/pk/asn1/der/set/der_encode_set.c | 2 +- src/pk/asn1/der/set/der_encode_setof.c | 2 +- .../short_integer/der_decode_short_integer.c | 2 +- .../short_integer/der_encode_short_integer.c | 2 +- .../short_integer/der_length_short_integer.c | 2 +- src/pk/asn1/der/utctime/der_decode_utctime.c | 2 +- src/pk/asn1/der/utctime/der_encode_utctime.c | 2 +- src/pk/asn1/der/utctime/der_length_utctime.c | 2 +- src/pk/dsa/dsa_decrypt_key.c | 2 +- src/pk/dsa/dsa_encrypt_key.c | 2 +- src/pk/dsa/dsa_export.c | 2 +- src/pk/dsa/dsa_free.c | 2 +- src/pk/dsa/dsa_import.c | 2 +- src/pk/dsa/dsa_make_key.c | 2 +- src/pk/dsa/dsa_shared_secret.c | 2 +- src/pk/dsa/dsa_sign_hash.c | 8 +- src/pk/dsa/dsa_verify_hash.c | 2 +- src/pk/dsa/dsa_verify_key.c | 2 +- src/pk/ecc/ecc.c | 128 ++--- src/pk/ecc/ecc_decrypt_key.c | 2 +- src/pk/ecc/ecc_encrypt_key.c | 2 +- src/pk/ecc/ecc_export.c | 2 +- src/pk/ecc/ecc_free.c | 2 +- src/pk/ecc/ecc_get_size.c | 2 +- src/pk/ecc/ecc_import.c | 6 +- src/pk/ecc/ecc_make_key.c | 8 +- src/pk/ecc/ecc_shared_secret.c | 4 +- src/pk/ecc/ecc_sign_hash.c | 8 +- src/pk/ecc/ecc_sizes.c | 2 +- src/pk/ecc/ecc_test.c | 10 +- src/pk/ecc/ecc_verify_hash.c | 10 +- src/pk/ecc/ltc_ecc_is_valid_idx.c | 2 +- src/pk/ecc/ltc_ecc_map.c | 2 +- src/pk/ecc/ltc_ecc_mulmod.c | 28 +- src/pk/ecc/ltc_ecc_mulmod_timing.c | 2 +- src/pk/ecc/ltc_ecc_points.c | 2 +- src/pk/ecc/ltc_ecc_projective_add_point.c | 4 +- src/pk/ecc/ltc_ecc_projective_dbl_point.c | 5 +- src/pk/katja/katja_decrypt_key.c | 2 +- src/pk/katja/katja_encrypt_key.c | 2 +- src/pk/katja/katja_export.c | 2 +- src/pk/katja/katja_exptmod.c | 2 +- src/pk/katja/katja_free.c | 2 +- src/pk/katja/katja_import.c | 2 +- src/pk/katja/katja_make_key.c | 2 +- src/pk/pkcs1/pkcs_1_i2osp.c | 2 +- src/pk/pkcs1/pkcs_1_mgf1.c | 2 +- src/pk/pkcs1/pkcs_1_oaep_decode.c | 2 +- src/pk/pkcs1/pkcs_1_oaep_encode.c | 2 +- src/pk/pkcs1/pkcs_1_os2ip.c | 2 +- src/pk/pkcs1/pkcs_1_pss_decode.c | 2 +- src/pk/pkcs1/pkcs_1_pss_encode.c | 2 +- src/pk/rsa/rsa_decrypt_key.c | 2 +- src/pk/rsa/rsa_encrypt_key.c | 2 +- src/pk/rsa/rsa_export.c | 2 +- src/pk/rsa/rsa_exptmod.c | 2 +- src/pk/rsa/rsa_free.c | 2 +- src/pk/rsa/rsa_import.c | 2 +- src/pk/rsa/rsa_make_key.c | 2 +- src/pk/rsa/rsa_sign_hash.c | 2 +- src/pk/rsa/rsa_verify_hash.c | 2 +- src/prngs/fortuna.c | 2 +- src/prngs/rc4.c | 2 +- src/prngs/rng_get_bytes.c | 2 +- src/prngs/rng_make_prng.c | 2 +- src/prngs/sober128.c | 2 +- src/prngs/sprng.c | 2 +- src/prngs/yarrow.c | 2 +- testprof/der_tests.c | 6 +- testprof/makefile.shared | 2 +- 281 files changed, 1434 insertions(+), 479 deletions(-) create mode 100644 notes/lrw_tv.txt create mode 100644 src/math/gmp_desc.c diff --git a/Doxyfile b/Doxyfile index 8c7731d0..818ddfac 100644 --- a/Doxyfile +++ b/Doxyfile @@ -23,7 +23,7 @@ PROJECT_NAME = LibTomCrypt # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 1.10 +PROJECT_NUMBER = 1.11 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/TODO b/TODO index e69de29b..68af0abb 100644 --- a/TODO +++ b/TODO @@ -0,0 +1,3 @@ +- ECC fixed point accelerator +- look into X9.63 support [in addition to the LTC style ecc_encrypt_key() not replacing] + diff --git a/build.sh b/build.sh index cb36b26c..a0486704 100644 --- a/build.sh +++ b/build.sh @@ -2,12 +2,12 @@ echo "$1 ($2, $3)..." make clean 1>/dev/null 2>/dev/null echo -n "building..." -CFLAGS="$2 $CFLAGS $4" EXTRALIBS="$5" make -j3 -f $3 test tv_gen 1>gcc_1.txt 2>gcc_2.txt || (echo "build $1 failed see gcc_2.txt for more information" && cat gcc_2.txt && exit 1) +CFLAGS="$2 $CFLAGS $4" EXTRALIBS="$5" make -j4 -f $3 test tv_gen 1>gcc_1.txt 2>gcc_2.txt || (echo "build $1 failed see gcc_2.txt for more information" && cat gcc_2.txt && exit 1) echo -n "testing..." if [ -a test ] && [ -f test ] && [ -x test ]; then ((./test >test_std.txt 2>test_err.txt && ./tv_gen > tv.txt) && echo "$1 test passed." && echo "y" > testok.txt) || (echo "$1 test failed" && cat test_err.txt && exit 1) if find *_tv.txt -type f 1>/dev/null 2>/dev/null ; then - for f in *_tv.txt; do if (diff $f notes/$f) then true; else (echo "tv_gen $f failed" && rm -f testok.txt && exit 1); fi; done + for f in *_tv.txt; do if (diff --ignore-case $f notes/$f) then true; else (echo "tv_gen $f failed" && rm -f testok.txt && exit 1); fi; done fi fi if [ -a testok.txt ] && [ -f testok.txt ]; then @@ -16,5 +16,5 @@ fi exit 1 # $Source: /cvs/libtom/libtomcrypt/build.sh,v $ -# $Revision: 1.7 $ -# $Date: 2005/07/23 14:18:31 $ +# $Revision: 1.9 $ +# $Date: 2006/03/18 14:10:55 $ diff --git a/changes b/changes index 0f07e94b..88c6f3a0 100644 --- a/changes +++ b/changes @@ -1,3 +1,26 @@ +April 4th, 2006 +v1.11 -- Removed printf's from lrw_test ... whoops + -- lrw_process now checks the return of the cipher ecb encrypt/decrypt calls + -- lrw_start was not using num_rounds ... + -- Adam Miller reported a bug in the flexi decoder with elements past the end of a sequence. Fixed. + -- Bruce Guenter suggested I use --tag=CC for libtool builds where the compiler may think it's C++. (I applied this to LTM and TFM) + -- Optimized the ECC for TFM a bit by removing the useless "if" statements (most TFM functions don't return error codes) + Actually shaved a good chunk of time off and made the code smaller. By default with TFM the stock LTC point add/dbl functions + will be totally omitted (ECC-256 make key times on a Prescott for old vs. new are 11.03M vs. 9.59M cycles) + -- added missing CVS tags to ltc_ecc_mulmod.c + -- corrected typo in tomcrypt_cfg.h about what the file has been called + -- corrected my address in the user manual. A "bit" out of date. + -- added lrw_gen to tv_gen + -- added GMP plugin, only tested on a AMD64 and x86_32 Gentoo Linux box so be aware + -- made testme.sh runs diff case insensitivityly [whatever...] cuz GMP outputs lowercase satan text + -- added LDFLAGS to the makefile to allow cross porting linking options + -- added lrw_test() to the header file ... whoops + -- changed libtomcrypt.org to libtomcrypt.com .... mumble mumble + -- Updates to detect __STRICT_ANSI__ which is defined in --std=c99 modes (note -ansi is not supported as it lacks long long) so you can + build LTC out of the box with c99 (note: it'll be slower as there is no asm in this case) + -- Updated pelican.c and aes_tab.c to undef tables not-required. The tables are static so both AES and Pelican MAC would have copies. Save a few KB in the final binary. + -- Added LTC_NO_FAST to the makefile.icc to compensate for the fact ICC v9 can't handle it (Pelican MAC fails for instance) + February 11th, 2006 v1.10 -- Free ecb/cbc/ctr/lrw structures in timing code by calling the "done" function -- fixed bug in lrw_process() which would always use the slow update ... @@ -1413,6 +1436,6 @@ v0.02 -- Changed RC5 to only allow 12 to 24 rounds v0.01 -- We will call this the first version. /* $Source: /cvs/libtom/libtomcrypt/changes,v $ */ -/* $Revision: 1.173 $ */ -/* $Date: 2006/02/11 09:18:11 $ */ +/* $Revision: 1.194 $ */ +/* $Date: 2006/04/05 02:51:41 $ */ diff --git a/crypt.tex b/crypt.tex index a8bf83ab..a3c61ac7 100644 --- a/crypt.tex +++ b/crypt.tex @@ -47,11 +47,11 @@ \def\gap{\vspace{0.5ex}} \makeindex \begin{document} -\title{LibTomCrypt \\ Version 1.10} +\title{LibTomCrypt \\ Version 1.11} \author{Tom St Denis \\ \\ tomstdenis@gmail.com \\ -http://libtomcrypt.org +http://libtomcrypt.com } \maketitle This text and source code library are both hereby placed in the public domain. This book has been @@ -65,15 +65,15 @@ formatted for A4 paper using the \LaTeX{} {\em book} macro package. Tom St Denis, -Phone: 1-613-836-3160 +Phone: (647)401-8220 -111 Banning Rd +3330 South Millway, Unit 20 -Kanata, Ontario +Mississauga, Ontario -K2L 1C3 +L5L 3H4 -Canada +Canada \end{flushright} \newpage \tableofcontents @@ -5056,6 +5056,15 @@ typedef struct { */ int (*ecc_ptadd)(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); + /** ECC GF(p) point double + @param P The first point + @param R The destination of 2P + @param modulus The modulus + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success + */ + int (*ecc_ptdbl)(ecc_point *P, ecc_point *R, void *modulus, void *mp); + /** ECC mapping from projective to affine, currently uses (x,y,z) => (x/z^2, y/z^3, 1) @param P The point to map @param modulus The modulus @@ -5181,5 +5190,5 @@ Since the function is given the entire RSA key (for private keys only) CRT is po \end{document} % $Source: /cvs/libtom/libtomcrypt/crypt.tex,v $ -% $Revision: 1.63 $ -% $Date: 2006/01/26 19:20:46 $ +% $Revision: 1.67 $ +% $Date: 2006/03/31 14:16:09 $ diff --git a/demos/test.c b/demos/test.c index d8d4e04a..a53271be 100644 --- a/demos/test.c +++ b/demos/test.c @@ -9,6 +9,8 @@ int main(void) ltc_mp = ltm_desc; #elif defined(USE_TFM) ltc_mp = tfm_desc; +#elif defined(USE_GMP) + ltc_mp = gmp_desc; #else extern ltc_math_descriptor EXT_MATH_LIB; ltc_mp = EXT_MATH_LIB; diff --git a/demos/timing.c b/demos/timing.c index dfedba1e..83133320 100644 --- a/demos/timing.c +++ b/demos/timing.c @@ -10,6 +10,8 @@ reg_algs(); ltc_mp = ltm_desc; #elif defined(USE_TFM) ltc_mp = tfm_desc; +#elif defined(USE_GMP) + ltc_mp = gmp_desc; #else extern ltc_math_descriptor EXT_MATH_LIB; ltc_mp = EXT_MATH_LIB; diff --git a/demos/tv_gen.c b/demos/tv_gen.c index 7b40aa74..eae48982 100644 --- a/demos/tv_gen.c +++ b/demos/tv_gen.c @@ -102,6 +102,8 @@ void reg_algs(void) ltc_mp = ltm_desc; #elif defined(USE_TFM) ltc_mp = tfm_desc; +#elif defined(USE_GMP) + ltc_mp = gmp_desc; #else extern ltc_math_descriptor EXT_MATH_LIB; ltc_mp = EXT_MATH_LIB; @@ -675,10 +677,10 @@ void ecc_gen(void) fprintf(out, "ECC-%d\n", ltc_ecc_sets[x].size*8); mp_set(k, 1); - mp_read_radix(order, (char *)ltc_ecc_sets[x].order, 64); - mp_read_radix(modulus, (char *)ltc_ecc_sets[x].prime, 64); - mp_read_radix(G->x, (char *)ltc_ecc_sets[x].Gx, 64); - mp_read_radix(G->y, (char *)ltc_ecc_sets[x].Gy, 64); + mp_read_radix(order, (char *)ltc_ecc_sets[x].order, 16); + mp_read_radix(modulus, (char *)ltc_ecc_sets[x].prime, 16); + mp_read_radix(G->x, (char *)ltc_ecc_sets[x].Gx, 16); + mp_read_radix(G->y, (char *)ltc_ecc_sets[x].Gy, 16); mp_set(G->z, 1); while (mp_cmp(k, order) == LTC_MP_LT) { @@ -695,6 +697,71 @@ void ecc_gen(void) fclose(out); } +void lrw_gen(void) +{ + FILE *out; + unsigned char tweak[16], key[16], iv[16], buf[1024]; + int x, y, err; + symmetric_LRW lrw; + + /* initialize default key and tweak */ + for (x = 0; x < 16; x++) { + tweak[x] = key[x] = iv[x] = x; + } + + out = fopen("lrw_tv.txt", "w"); + for (x = 16; x < (int)(sizeof(buf)); x += 16) { + if ((err = lrw_start(find_cipher("aes"), iv, key, 16, tweak, 0, &lrw)) != CRYPT_OK) { + fprintf(stderr, "Error starting LRW-AES: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } + + /* encrypt incremental */ + for (y = 0; y < x; y++) { + buf[y] = y & 255; + } + + if ((err = lrw_encrypt(buf, buf, x, &lrw)) != CRYPT_OK) { + fprintf(stderr, "Error encrypting with LRW-AES: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } + + /* display it */ + fprintf(out, "%d:", x); + for (y = 0; y < x; y++) { + fprintf(out, "%02x", buf[y]); + } + fprintf(out, "\n"); + + /* reset IV */ + if ((err = lrw_setiv(iv, 16, &lrw)) != CRYPT_OK) { + fprintf(stderr, "Error setting IV: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } + + /* copy new tweak, iv and key */ + for (y = 0; y < 16; y++) { + key[y] = buf[y]; + iv[y] = buf[(y+16)%x]; + tweak[y] = buf[(y+32)%x]; + } + + if ((err = lrw_decrypt(buf, buf, x, &lrw)) != CRYPT_OK) { + fprintf(stderr, "Error decrypting with LRW-AES: %s\n", error_to_string(err)); + exit(EXIT_FAILURE); + } + + /* display it */ + fprintf(out, "%d:", x); + for (y = 0; y < x; y++) { + fprintf(out, "%02x", buf[y]); + } + fprintf(out, "\n"); + lrw_done(&lrw); + } + fclose(out); +} + int main(void) { reg_algs(); @@ -710,6 +777,7 @@ int main(void) printf("Generating BASE64 vectors..."); fflush(stdout); base64_gen(); printf("done\n"); printf("Generating MATH vectors..."); fflush(stdout); math_gen(); printf("done\n"); printf("Generating ECC vectors..."); fflush(stdout); ecc_gen(); printf("done\n"); + printf("Generating LRW vectors..."); fflush(stdout); lrw_gen(); printf("done\n"); return 0; } diff --git a/doc/crypt.pdf b/doc/crypt.pdf index cdd7880a650c3685f55b69fa8583bf3338ca1a95..7ef9b285b421e6b408a90c74358def56b1aaf3fc 100644 GIT binary patch delta 43860 zcmZU)V{@Plv@9Ciwr$(CC$??t$;5Utv2EM7IkA(8CU)k&=iJ)o%l^<+UHt=k^;)&M zv4g6olPXaP2uPW9T@gVDzYUBQYO8LLl6RVldIHmjVPe9FU_hZ^6QR<-f39$tZ!wTn z6^do3F1`J?>UM@QVG@wOR~^vKKYw%Dm)#V<-L3xE+oZyJt8L~d{y6-$@0b?WGBs)?W4RfCsIs~Igdh`|vC41Qzd7f4vr z9}XxbAgARwiT+jC=lE`X#L$mY7}2OhqZe_A%ao!@)W|3?)*(LVPCAi=SeZe0$O$|R zy4e9R>xbDafuA!FYdEuRn5*RASu?$F=HZQPRM|_Hf+%aI$0Jd|E1t2uzet&zh^?)gxVvDHe5&IWg zRF}1}YrNldJr0oc)6B|#-a{L;hh>KiVBRd_a;692O*fCi*j(4u@NL#jK!`(6(26nJ zLDIV}`jrW%sagLHAB5$7;jFjjZMlW2U^{~l+@b-3~fN;PU+SVUmgyOTPDyH`0Yk;*V2!5<+ux;Xf;!&4yBn4&qVi z6rM-s>Pw7|2lLc`8|4$e?2H}r6>aLme`c7Uc2D1qd}hx}Mq1Jcm)w$sjZ)>xh4U5R z11mP1DiXy2yHM%(3oZJyz}Yd|Q2%eYRWZ$oe^})xo`L@YVd+?7<7fWL>QMfWKQ)kY zv3us}S^k+WAy7VA(JGs7hZ`WiK)4`V0qbQ-@v zwGfOYH6MT_Vi!EAwwRdu^1CrM(9l3aBevStNbA}dkmRhyqD2ql#Nsh;Z1k2ACPgd7 zk4j7`#T)zr$#6j_SNp*tSnoN@!bhxN`R=suxfUdceNCU?ifPzfzm5XwMq#JUtcMg+ zS;4qtzu(q;g= z_iow-AUZ*y;q}AO$yQ3pQJ^=wRa>y3p2soPzFv0bBz=7neknirEvLchK9+oJN2fZ8dXolbF+nV}00kn>a*?!n3Yds3JS-?L!j9{Cb%1*V;q z35#jU$S4T6#@xcJuLWXDkzGNFf%t}C>%!@=dDFyT47W2@F0CPiE6;R(x%FJRV63UR zY5`sq>L?L0dwBU#B+Ue=1L7f?}Pg37)~>Mf6!6A7^{>BQFRAwbIH*($N826 z(}M<82E2cwR*Zja>yU}ApUHrgQYJ^@(W~20H2y=X({@!tj?(zdXTqV5oMX5thl(`T z1)nOiJa>_Ky+FUL+SMw@5^(&%Tup#w3iG8ERPlsEz9rMX><(9-^pBko?(|fmCcKMS zQ?62{N{sJz_3c4(0{e>(TzuIz4xup@=)=*}SyyuSC@Ir?LHSrI_nc5neLG- zRrL33p8k{hLvMyg!M_FN@b7!hAC`7s?g^;W=>XMF{aq~kYSDE=!gfYD52JfhV9Z@H z%lYhr6qBu5moB|3X%lP{Nf|jCAEO;}^~3VQhL(C)siMvHecg9`E(xo+?kb|mm8;{; z)j*za>|xhd=$Zg)SUEm|`0fStnK}c}!qME#-POXx0q#HMWNHh?%08HqS&H;xS>Ei zOZ7yolNf41*<0K@z52Pgy`Q^OC>hoAIayTKQ(gXAjY%W?W*t8Nv#3j@QiDd3u>0e( zoSr{c8J4V68`6}eQ8&LfutwNX7o16#s;=Ko7wR&&x*u?WS-^9D(iIf8)x3QZ_X|j%?l*~>OV2(vY#{qmFjS4 zZCdhP;tc@T&+fF^*8!Uj323G7&c37Xtqhm?GIfDMx!?YL=Te7RU^qSqha6zRlea5f z5(|1$Z(j55Ub|y*ZOy?FeEUI)*r*n+PQJ_Pps2};mA18Me{s4Av76MXAco#Q;>+3s zDI0=aj-~x`?w+!fik|MwbALhZVLvnqP~RpK2c`UF!w1|_j8cj-sKfM`*^w>UGV&*L z5@~e5{Mi{f@>5|W6pnbqRKuLkDCeTHcsXK&k|(`V1TtxpyHUX7qYuwGrlON^!lXI` zL(*49(1S4t;0q$~oTJE~Zg{XPC|tMud2Wv6^kBp@NckoQ*Q=jG2oFZU&ISw6`eo_B z@aQYu7Xd2^XT!4=x$O01E-FzP?A)aXuV%gA-k!}|sPq0%Jf~1L%v5-lUJBpNTIBkX zHP+Ay3f5~Qh8LGoyQ6OQrknY~j&4wz8z6`1Fym}ibGBwD(JNIrPqp6#^ zu}dwhUoGl8b!sCf2m>8IP+v%kzLjBku)$K_6@WA^x_0-X=1X9Aq12wqoM+Zt z#+ap&c{8pnZR>ON%;J{WbzZh)kgb}z!NiYC^GS2%>`o2cvdzyORqYj}qacexFOcwz z3Yc9m@<~O-reUZQ$x}k@-+rB#O>Q=9ixXW9Qg1ShysMGso!EN%ZSq+It(L_n9V3YH zBga6$>dWoAO$I?{IdgmD(`X%foodoCj>m8baaC#&@oY1f1?$WSzoj$8(gW7HbE>~9 zjc-bl3QkI->mS@dyU)f9$MGsh)Q2#`7+_3@dk0eew)49sipU?Pi(fBPhx4#~P)Hf| zDia(B&}!)Xk$U#^oO@SVTJ<$a@rK-dj7|Z1xi_%h-Ba36Ua?Kr_aOB;==&7%`3=&u zANBWtSpg^e|FZ&C*8i~rPVWC-3<=?k2;l_%4`BZR{69ea2gvpiPAK|xU`KsR3I%vE zI+#pRpm(9ZpxAk&L{zlNq9Pp$IH$-(*bosI**BKS`q$@GzI?r7Yr#Lp!ouP+;ga9o z|7Cb7pHJB{|0w+N&-(Y)F7pTVLtf_f!?!#)-*v!+%LjCG_s4wr9}&$b3$mD&iI3qU zqV|tcg(?NjFE(`8>i1zA;5J|cx>2S|Zi->bBm+TP?X*&cTvb`KG%IF0nNs2Ye3L{e zg<;kks~2a4LDp?7EYcHNfVR}w=g~KjlGe(G=<8al9?GSRC>>Huyl(C|EjEx)!-A}- zB|7}QsOOLjeUaGLE{}!ii%X>hu53<#ctmnY`-kQtzlT8mBR~HWK$?DMZKP-^$rKY* zBIp+Vz+p$U;J0U8=52_X={2+Se*0G$k`$Rl1A}gj4)VzPN+l&Hh9=BJ6B(ZB3X|bh z>rcE`l=u#6xmt$&VT(eE3b@<4dKk*|>fT})5iFIY`|&B$&i0Rv`PjLYm`)kE(dGE; zZ7=C>7dJmg$MaJmplcDo{e8(WqkPfluUtAEtL5UhA{Z~Zo34$xAe-C3K#$hq}$4ho};PytF=HXOM0_5N){?~TU z@SUI~hYNT7^%%p`4e$1XAo)nq=37iXCT)AT>aS>g~L21H$BR|BwAQ@A>9>1!F!f;&Pko7YNK?#e@iqy1hiua$SZ4_6O-RRRYk?o&{ zYN?V#>hphv0Uw0Xp&nhIdjXLKTdq0*s>|uLem^nm3G{_TvtW;f9a?J`HpTgdCn@tR zYhtmzoPtEC3f^oQgi@tFiHayZ4vJ zM_@6c60srR90$t1-WD?G%c&Hy3VUn{SJkJ7UrLo=0aI>V{?kuhXkq8i{4E~6$Zyri z*tkVfslu%yP4QL6A8WMq3a!%pRGejE^KA)<$ceI%dLW$heuJl&gN)JVmN)FARq!k~ z_@HQl(zU_CxsWP6TMqi0RANd~=B0G8bBSi8f)v*I{Co)_@u_JBzW7_9!3{REj_0N8 z#y8Fuz-gk&>^Z*Z10)4?o)u2mg7zS<2$G;wE~`47+o2M(W7MwXLH1O$t& z4v2;(t0#x}0(eMRCoj&`nD#nWx~QWcBgPngF$>iM7=Ez^=!O6ZP991{I1weoDv?_e zrfZQ3`&y+Vb_6C0ySd;7&Es}317z+`7{N9dpmX9@^2DdtZy*axqajTTjX{>~8Rjwr zWk`$?7Y#J>#jkk3Z>BI1(xI0k4}4hoju%cXv}UJOmtB%ZtqcpRyZ$q4cfAuCPxGDttd0Jl z(e8h!a#Q(Gml75%_1D1{t+^Tffen4M69P-6#}IhR-rD;@8Y!k3d~t;8asJ) z2G}Hi)iFb-`qe*d)vcWVT&t(&Fsk2kd5S6G0%5Ev6iv+~@`roFU*HY&<*=n`#Cyx^RC2SP`f%;Rvy-E%Q z$jB9%OPg$9(@ufLM{0HL!GlYzC(x(K$Q@97{3U;5JZp4vx-=mJ5;$dTR4H-2WG@nc zE)w0SnmK|bcth@_QI7Mtk@9X1#Ojik^pB5>rFhskecm?$G-Kko9^s5f5B0*&z)}yJ ztyUY6JY+wo)&75=8nja^|0^4CadG}nIN;^^e|rKK7w`X7e^IPJu>&UrHckZXPu+oG z`^-C>J!X00NYNOI1mub-RF%bT)^4I}CY9-wqsdn^BLDn|c`5eD&t~h;9MG|U3TGU? z-NfX41!}pwYJ~z9|3b9*6Y@KEu(kLby|iuu)pVJ?`u39kn@g6rfep~`C3}Qjg<8Fv zJN&yzHhnEcZno<-TL5f-_lxaWb(nsg{n;1GdDu`HZuV|K^NZDn;(E8wx(y`$4dD=! zaytDYE^~|ir%fe4Wf)t`i?}=wH$$Ix-MbRZ?WZZSmC)#})pVL>*Taydc8~lSvf6LS zc70xIkX@5IpYyb`UxAie3F7Lwq_qa07PS1O5rbO2|ALqKE`YFg5b}MK(ndG_#3Ld4 zi~!gzJf|>RTJo^XCy^{78Hf@cSvx*6Ppv7B5W-KHBH0{_$?W4xVnl8lQi)Or(z z0P{ng{2sjJF1@R>;m`7&^ffQ_q7+Q;F-67ajd$Olvy>J(v((3vsu$f%0o(|zbLg-j z!PKP>IyPU;122*nTV^cpJuO0$_-iEunJ{F|qx(K8N&s&K?XpTW+FIIUF8oqgauYh= z<>fHjhl`ZJ@?sQe|bVYNDaxN=u4>g$6%lO#x`)m-sG{K8@bshGly=9?LkLV_OHw;nO89Q(T#v zFTfWvr|ZH;8@rS%|R7H|Dxq`^0 zPy-Eq+-Xt)qlQc=_Ms3@bHvziU$z=)MfYdEML_jfD~myTU#smERYrW2g4ig?I?$}* zYY>Wt?9VQ0)Se_)a?YU!TW#c8txRve{O2e<-h`8A`J|6#;`eLAVn$we&iSX@g-?j5 znJIOpcQH~9b*H%03`EkdrxJ3u>)l8Bh~n1)Qj(tj9n3?9-(XOnJr{C%SxVsq-ow6{ zL#dB*BUtrPC!IoB04#=VrkAQE7m$`Y2G^3_jg?fTtIlwFndNGuc(5y}7(VtlkL`F! zh$BN9vv!N_M5y^eHdFfCd0WLimPSXodrr0|k6azC>X4$t*(pIzoRtMpt2nZzL&7`E z4)0PlS%!G3S2d%j(@Yf-^s@<}KS4508AseXM*lk!SI9`dGu$dpiZvJ~1aNJe@TvEY zuHGd%W){1z@vs_;DG->^FwV+SBHvN}MZwVMDf2l$b(jzhV#Hb^R@;-897xamtS9Bd zI#IRVmOOymd}kT1&OB4DDib(>51$H-2JLb{%xlT6lhQ@3L@QnM&nC`;{noj~ zj9Ik|<^T%LX`8zE+wHuo6exmc9ajX?h>n1rP~0%*&%Cxq$w)8%At!pskylO$;t*h! zLTm6#NEaNYs37dRr`bbQ5LA}JGVRP^F&VTP0cTvvL1P3O;r^vthvHGp&P9FAnOkUL z85{$NiL#GzD{-P_`el%#GN9gZlr!KUh_QHM$zp|)1OXAeuE8-!9KbuEZmnv_sgiJ6 zfJVgs6Gao-Le`AwHKJ6+0uw{uhz$b-1-HIfk-xA<`|*1Cn0f3n8yv zIb+Zj8_#KacUd>2q{muAm}&4a!KHkKrR6{@cczavK;K*4Rw;0(prIsGozx<}O(MF^ zOCflxt1Q{P4AQL~8o1TGNUn9UFLjrl^2*Wk4Rsw$3uWcxkv19$YrsJ?NbDSmid(oIjE&kK6X z+Wzsx(=&-!0pFaOqmMCiL(_YTIi}Jyz z_>z}8zgx;2A(>SVFEJOspdAjc$v&09d^t@%e&c^1yPPZALr0f!PPJUQV%$~I(!%e8 z#&h(?j<9y)1-PH=V`)!oxZ{((f6AjIK5n0{5}@CpkR{RAAnM?RFU{n_R{ho-l0jNx z4_`X-Vgk*nEk(^Dk_$Br4OCj1Dh#sk$t23Sy);v53;TGd8k$Sa6u(1!)HN#F@ZC`S z+s=wH&eME0P3w~;J0yM8LM~I&yDgx9=mE^~)32-bC zp;Xna{`2Q~-}~RzJZTGhEIB>;7F7?vZOLoMJKg0amoA;=((t4m^3RIvFOa{#@CM0p zX$2e)h(dzdW(;E5U=;%16gfS6hOY+UFbcEyAov-P+6FOS!f&L(ZZx2oRCbd(Dv%;V zF_sXo6~J-zUL6&RS9ug)O#prw~;7HZi zDd*c+X2zMrcm5Ok49T8Qd4QDC|$)(IIMN z2b{D+$aPN^zdu4I-IjR7x%gmL^na%xq8dVe`TAS`tQGF<%sWw>?bIh`Uv8(NXocM^ zN5uGJ2Rf6e1d|EVoQ-|aY_VEa!fQ33g6Lpp-6}fperb=W2)9SOEVB!^ee+nYt-gb$qsq0Uq}T%@;i}PM!#rL}ScA++A^qf)R&N7%~vH z7*InVS$GL8Ii4_VHBsc|Ib#&-BAyuXx3M0tw>^Bh<-(-wA{Hxv#rQ(cII(Rz*cwqu zOVg)m{sPUDYavtlF`faofY!JW=T?6FV7(C%f0W*qQ6$KOTmawd@YH-(=ZYf)NTFrA zX!%1=X1*~&<~WaCdTU;3Z}qX8Gzv36idLd1>iFncIke8Bdp8l3sdCV5x0Q1DAa*tk zQUhUtw3G(xj>lra(9>qdwAj~t$&(>!tJq!Ot3bY z5TQGmeZhVVz%Y1GA^Ha)9QEta%i;~!rj}y_oK!*Sm8L%Fhf{jtA0~HE>R7P)7EoH% zX5WSCIgzsmFuXx7*^JnPadsT&BQkh2?VqZeq_8@PV?}` z?(H>$<(xYf4=T`05_m2AJrk6Qat{zBCML=tGzZ%eY#?*D^P7T0%MR$P(#q}Kb`p)W zYH%?fy_>K^m5cGnT`e!+KDUUUQDP3E7r{r_MKe*8Db-;8gheI{)7Hrk^$ul|SX}&8 z+ktD!cr<{?x4|^WmCRKE$g2;mDyK}MaH%Zm zq&kb?#L*IqVYTq9WT;g;AvJKo{wlh3hMLBG$g{Aq>O(rE>yl0DH1E$K|02OkEIJ_% z`9&U65sC`1ml}9i@#Pnnz=Z25Mq-xif$u0{Vx#GaEkSG4i}1pfOE*RbJ>HjRwop`A zFA*IkZFY&q-eUm?7cHs}5KHHMC5{j*Ma2EcFX?}_H`uprbqP;B1{9hD6H(6F77 zI!cBTO0HuU*68ZY3o5PS>_SK;Ovr!}n6n4MI-PW)4OuGpohkkVauCdtcOH?wP zbS@{RKO%5`FkO?jSV3*43 zF9#*|ZK*UzRWywJiJw4xx|HGW3vzw2J7;vT2Y`YIcFq67JBPxDVCUs#`Newm?9!yUsm8OgQoUUFHohAN_!gK{U3zZhf}3qlO9QftAA3S(3|2vY1ZCxB`?hH_b7- ztIuX=mdIcbv;_mYCQTcej0`q}uU1OD;QnR*3wS*|p8M+X`#h5E>|XBPd#Sdf7S1_; zL*^9j{WwH0Y_R!NPN3l2-F&P3_zC#WsWVK>j zCQ@Ql$O#FTN4)JweaRhDy!X?y?8g33I>?Y`YR;{jBqY6>6y z1D8w(0$!K$Q-8h!I&4CwO-L@X@6*@D+F<`~3Lh1<$PYHHzgPTodFD4RB+`b#7+OMW zxVtKHW3;<|31_0OcU2*Z;BmOk$>Om<#y(k%QTi+%rfmR)LHsDs-TQT7_1_Wc1-*eB zgmvtec!~e4#bExU*!_vT=NJe=7P{FZip^tV`i$Q7iR&Myh3W@fSWKF*!hxNr;dN?A zKaKJi7rBACTVzL9s;wU2hZI`_sRJREPEQL_XROoaWM{_Cw=C|;t9~GorK|IUXnxe% zTgUY8lfl2h32X1YPS(KdH)l*va+HWJK!g4kRzh7j}-UU0YSNr1oIn=lgsov_gB zGy?HzFcW%APwG@Wt4HXQ)Ji47K zXcwv&TuVgfEQZIN2XHgrZG!u}F#@uMn^A&xYjeIz6*ggGY%6vf1d##ptPEY(>9l}> zS87t?(s`Zi{kUA%u;>JjA9+{uGt8XW2H!GwBCC4M>^*Y?as~G^UdUO}xal2>%9UiM zfcA>XFI{0pu0~MXHY;$nv8Zb%Gy|lJ*|IGAktF*ASKwlh3#l+M*K!icRv-JAO$OZTI%UcSe_BOU*^pmb&5Qbpkwc+G zSh<7yXQgW)qC|(9wAxGPM@Sj@OdEU1U51_$TTI8+AYWfdbBzSkuKD0V3cp<$gzfz* zX&CJYPRC5Y7$CNix*T4>{zqob&{H%}Nx@%2?Ex3TmcX_D4Ih7#&6>M^>qXHt9p0!N zl<2gscn2Xw3h=V_qb6$3hdgEo1`P4fmm1fa%ZSFfIy9O z;H^6MN<#Ls(E$`OaJKmddygV)4@6^}`@~Uprzw;hL$w5jF?Wtj`;e2428>^n=wY@* z2bA6!Ta==A+%>mTjvNh|r7`Hy!S?#$gu5&&61$gm0rnohwxL8-3Z$bvNF*C&rA3!^ z%V8dN0bz4NND$xy0GC|E72yT3;kQ|!8Ce9GL@W>`c$#ibaZ(Q40M%BeoZuOS&&GiH z@f$Lqp#j<~gZU8eoj?HN?exLb%nW#X}(p^FVz){nwC4_yU5+(%MQ)H>WSzjh5_O=O0 zzZD$M954+R=I{_{V606kut9w7J)pP=HU#P^!;&rX4U4Kv;}1n({L`}Re_a)YG5_Ri z05QQyofK_#O3+aSje)_A%`!3I=REuoygS;mq2bOp-*=Kv5Pe>Go)yc7kO6wgmRg z<}I#n=>9QHLecw;Lk$*W$H0G5FgzaHjc-+AiuT9Em&7YhyqPe9F2CA+K9m@qKU<${5Ldk=Gpd3hMvm*5=5Kv*2=~r}3|nmj3TyTj zPegcs1PixypckMTZxftk+(wqF)W4zb7-aAmNgwlnB1 zii6))gn|S6YH<|3!1|0bjA>4_?;~DNM_nhk&qnB$2bmx0 zpv_B?^R*MSwv}N|k&ev|*eb9}V@h9+v}rCu(5ec`iQ_JpW8O*H?j;#mI&oSfhl^^I znp6#)h~iNmO*FYme7Vuj~Zb`gV05onNENpehUW39YR#SE2uO;=I z2sA4S=Sdyr4H#6XkaLiC^}#~*CJ^LjA&`)TP+HdAb@AbDr8SNK4Ta#TIP5bqJHAMW z{HZ5O#mF>mlrJYl@=!XqgG>tE%(9zkj-GzrVb@5|;nblx6q9!@jE||c*RJC4wdYb;3-^L75(Fc@=(VV!t+-R*s^b9+p{f}E-9CI@twbm z%`oGolh;jl4|sQKFLx;k5|ypj zb3{tBaw8rRy*eCLmzT4R8yD6GBnvXy@b2>blVK1&_@fxWgRqZ7|B>+qlEY#}>Y(BL z!4xdw4jTAx74!i^$YjR848=}Cm3eAN-5t~m1ZoN8xnMS%y1!`hgI;(j3@n7=6w)J4 ztg+X_A^R-`43wm#G61&g#BM6YYf-a6yUD>UGrKg#(7abKjy|?B()69RtQwc9oM7*d z8EzRAzEdWkNjF+o+L_mT3@&SOtl;U!AjDSmjrt41uiV=Z995(yYLeVCJqRX2v>^ zg|M0|S36~+B~@8sxr_}IoWP}Dk!ATjy+0WQyOcpL`8U@vu+wU7JBuFQE*Hn;B=vm% zYW@VYx#eWE`q8{8geO>9AWR`w_7y?Rg_O&ffF_+i2ZL6#&40z>5gjiib&u$7xqZvj zNzhe7YM3UQnB$z6!fJ;Y9!rZM#A#EnEtl}ejP!r8sWYQ)V?M^)f{yim&Jt`ORO~?NlH@ zMGV5;RJ1a0wnZDlh4%gy1~lz6%_!mFuISB4iRm_=%S77Y<$Zzp9uqXysgLEqOVnE= zoxijr-xU*y`N%vbAiPCXVYXUOjPybI75EFPLmoq*q`Us&{zq>t9XR~QjMgt{Rk?Pb!fSJJ2RQ)Vzn1Ae{oM5_hHP5Zz!bgS}))yq;Q~?VOm)wOWrWr zk7DyGtN&@2G(r94C>oSywfeCpprfRIGXzf50zqFJl=*(meZ(~5wHNKRw`edTWwFC| z4Jayqvdhj2$oga{x<+6Phkqz{ao9CZgrmDhFzqcG+e6U9r4vOtx!%F=So#Bg65vK? zds36Sk+ee75Xn&&@~SvQwNl#pY>-bLa#wx`?i7g`TNa_LrnHxZXH5i&6_%nB4IrmjIb2lppQ2iHC!oA!xGH!h)cHMM5B*(D*yg646<` zs`&LS7UWV-8B}mFv7#`SH9&g4c+bJpqCzjzzNf> z(@3QBBU1=Ttl&S&ta5yl;Ra_)pD1YPZyZps<;mnZ&gQ8!x!s$XV4VUM_innJC zMdiJv<6t3=&F+U6ZK293BBR=D_s78z~W|{n`y3MX0N7-?W zW3RZFfp2v`*ymeGtqQQ4GjCp)_~%EDeC2_M$b)O3EPfs>I;D}EO$~LHU4IAZMtf`K z)gZJ60i4r#7xhT$-7q*=CBkO_*YN})O)Ik0%^6i%b^S+b^sJN;PA95kL500Uv>^lE z{UNobP8_|#2~s-)+}Xt++}bXWK$uOvChbwC;2sWLwGP&J+HIf;Rv>qR&D5jY9ieAx zlYN9|7N$pAUvPs;PL3-nv70V`ew@p_OLT0rN`-`#@ve&b4x3;CJf2H0v(@v}!X)3y zhMpN3C;>l}6*R|lq5!invD~Ckn{fU6%MGb8M3BkQBlOPQQq6%H~w?fHCo?ZU=s7NA+AstESI?>JY%XueWiJC zdCx2#WsiABh&`oKXXaq1hbU;5&(uE3-F$rS8L*u;O!~}4D^@^kFC86nO#|+e#@z@~ zhszO+q%b)ifp$1XV?((8@k)hT8*)}tT?o4&fOJK?y=6a$hnA`^O$l^Z|H}!fZLUW#orgn1xHt=dWV3= zVjP9zu_2s~U^)RAb>i3ZuYFW?Dt-xa9Taxbtk?qS=+us!u^GmfDgVo4`$Q;j(w=nW zsZsm2j@6e5#D`oj!`FL)SbsD@6h1)V< z5k-_^O-CEXNH%D#LQx}9HLgdMcqCjeT6FTkWMEU9^7?BE^+7J>+S$8_`Cuk*N;l}*+vmhfNRQN|xv;c>8SlTgg@KaXTvw(C!%n<)0aA7}h1oIkK6`RljNM*2&LXLY9m3+3MOGJv0aT%sU&h0f?kv7D@kv_1%rRNNOjyXt%c zC6je0I+IBZO0L>oMXR2BqwEd;9-Yp7Iek4hnQNL})gJr5EpZC+-{FW_dX_7dTSHeC z1>7;RmS>6*OyE#0rTJ}U10NgVFxrMuDtPmbY)Z zAoUI;qu$l^0%)M9kObH8xNGcFg^NCy@v7ov)1a{9n5yi(B3k&U6vLM3VzOh)7^DE- z64#L=DefV|dS6dLv(2nMDFrJBTZ)D3II7^Rp(Bj;#J_cBEeUFNN!?3l1+#N&ZEv!_ zU=0nM=#Un>>*xW7LU1T-HzqGkSHS%Rr_kgER~#3Qzu!eKzYBIB4D#ZpJGoJ)6hbD5muHyLKIz|>^zxJs3P#iDa z5oOp@rE#Uzx#$1BJ4eUF5X$VgOnj*IH?_0ree)`BE0G?&7q{$7#JA(?{ObR9*NWR} zQ`)l@5r!+a{-;`OCE*O415nH?7oQ;}w0%n;!eV}`sb9Q~)oWXWUOQ@~ZcL7t8BD7& z$$o#UQy&Y095gu@F~56y!zv%ihBsAvI`SFrSEt!rYTC;LP3O*t(V@7>mZJNQafucO)1||Wk5l2^*tgbu@;!Fb^^h3{ zXH5PhWLvUgi(oH-Uk`?Xx&#SJpd3fH3$ojJ1c`2q)q8oL$g>`vng9EjiTnTjGC}{J z(gP#vXxC<$OyPp=tc95GN>_JrG>mzkaEw&V8Keadwc{RYxt!=$*v6r>d>`mk#U z-r*FGu)-{-qVVKzxvH`poJF{@3q?=DaGc8}6=^W?aJ*)q zXfyYCt)?&BkfvcUu>zhX?KMlB-Yw)`{D}Vj8V;p!%%*kcirB<8B!K9o#67k!`-}gI zYmy`wiU<%zqK`8u9%$>{rRatPpB+^Ay>E4oF{Rh*61(It%C?UA{3|^oJydGFb|xwnu_uGFS=f~77fZFD!#+d zM{^Gxq6AyDDI0J$jc&t%`7!W*sFBqaR-vq>@+Oy#2z=0hY)v}OO%ih3T7M;eA}I^% z%N%MxNwvh77`ji4o_b?Qbp<2^BCJ)gpu5J}-YpH6hy`yUFfCFz;ZK;JV1qcA;jc#B zOC3PBGIcffa$Lun6jA1f%`-h=&?YF<_a@Cxx*)<*kcu-O>mSB)*% zC2Kc&BC@SK1j2>Btg9>}GaxBWrT&WUn)k9;{1c|l7L0L=9$8oofg1uV9DW4x3WBa% zP#^Bzn(A+BSM)#M78rTL2<3qiBn`%|zfh5*lRlItZ6a28C?k{O#&nFXlkMY{tF)*9 z%i^?x=qTbjn{IUzdg}gYPqvRJEb&iO%>9)C6oKX?A{p6*F0YW%{D+*7B&hFFu~xGT z5ZXZzIQ<4NQINO%Ui7M*0wENTcw(U(F?#^iqjRh)0Kxa7q1?(K`R-{HuOMBX@W|hKs z(Ss;WBx>C|lB#%eG@tAENFelH5lAJ`HUhZ{3xz0cKU8=|nnqA6vgurOj7EWKEMClA zY7)RHRuYAZ_KQ;JrVtGbO6(b6pX?aVA58Q7KuN!83rnyTMLjA$J z2{)nV!T3O6jQPq{ZmkMZoYxZvCI&j|VWItjp@4%DFbw(5EcG+@kewCB_(8Ffkm?Df z{&1K4()EM{jo7{rSkb-Xk&SX^n8S(62k4AYTiz&7?I!SF-mm*XpB!R|UMSmEx~mN& zo|{)Lc$AAyW$62;GK>H$g?3p?B$im4ll`yCJ@O5qStOJhWjSiG>Afrbl{*ca1u%W1 z*UCSx>kbypZ}&pxg_P=++r<44hHS#q3RXW6nkm0$N#{Fh64cO2;uj}HXoB^AXZ@Ng zA6To-Ul3H7WTS0{D##ByNR|g$oYRi~YHwuDAsc#p)a}KecXdVUAqqew>7yWxM|v-TctO$qm3v4AqiIlgwH6BL;aNC$ZetRos+b#zN` zJ8YSbQ|F4IL7p+2G)6wCHsa`aI4yvMXWiN`>J6;8$AtsMt@%q=@!>`oJ1~=P0h-<_ zceUQH^oYX62iz^`F3&!j+L!V{n|ZZF$-Bsea#bcw;MaiuX1;#-cl*x)udMbPS{y#?wNu@oFjxaJ3#4oFUNktUV!iqeWTHw zF13!*RxY5d!V{t9fe2)L%1`RdmzPYxoKchWnaH+F`^WMR;@R?kM1$TJT)+1i8wIAx z#7Aw{w$+D>b{2wshHUf6f%r%R2D}qo+^|`pvXOgi)knm`BIJ3k;&Z`D8-r3w#r6m$ z42^S#C;dp>&bk>#;_QE3St+p=DB%IuDr zWf!26p7TVW9e`d~iWx=ry(FC@njxyR`l07vKc)n3Hf5LN7F`+e{0SG#>-65F_QUz5 zK*z}B@1SlBt<)ARJv=G6I;!7a|DgWi9j(IEd-~jr68ly;w9vdoBBoxP_PEDNY_sQG zt-f)(+0RVqi8FQ#kX6$b)$qE|`j(f~j6Yvqex#3M{VX1Pli0ZCtvt6#ZU%L% zDS`D|y55qg2I|$*na8@6EP7&Yz;ZWnz2>YG`uAW!DCcj$MU z-txb=JTMomV!PQdB;wI=oqAJuMw?fgIP{Wt`cQ2Q4Qw4#h9Tl)J?kWZ1u! z$yQvLb>_}1llty_viqp=23%RA^7qD24TpyT?>`Jy)vui$xI*Rp+%__2dp#$xaj@S% zX#K~dV?*-1MYl%8J=iWEQgl&`@oLw#+i@yPJ5rOhN*Z7&B-w(V=s9 zwzV1Q#{1XMXHvi7ennO_;268;#^lu`9z)}SgNhy1vs z-Sg*8m+W^N?V1kc40eZL*Oo)X)ZIeBZ3gd>PJ6>_%^Fun=BR->N^_?tP1+@+Hr7tmztqYlIZZD0B?g z&F*KL_fL81WSTzgD<4jGE0Q4;y)S6aVJ#W`-=h5w}V%^|Su zgxU~q`nO_h7Fmo>gg(L38?#7?nZJ#FkXoL0k;fezMtrVtqZC0{7r7}N4U_hsH zcg5Pyz~g03l&400W~YX>+)QGP6R4Ayl`pwA>@887Ug}@a{PxM>b?*Rt*s-~h3jdm( zj~6V~+1|ZJdH?mfN{ZiI+rd6<>18Fawvh3X{X7nGSNbrqE<&8L5jhc(`#Mbft4uD< z<;4ddTie)5jj6tvwaL}{_-RI|=&xFN%gb6-&$F;DT_+s%Kc!&C?*;YkQ|r+hGpT2H z7BiF?Ic2WnojKho%YH%7a3ajxA#0Q z+P4g5K3dI9X5n(r3TA=tR925Iw)gUHZ{PBu6~Aj#zleotJT3T%^3N}8xch^S_T(D;Y*P!Ger2_i>paCigT zj;M2&Z>TtKH{{}M5D7lhux?OzaDJV%m5S(Ku*v;n4Qhj>cZ_HH(PA|+ujQ7zIOC|1 zM#{$pvxOIV9$)owd{NOEZk@vK?v!VJ?8*ItrrslkZ%TfokS5-oPaUptnRw^6@=k0> zOhO{X$KuTB&1a)JnxjR9tdZnSt#gUyI*Ml{%AMkQnzfB2lPx^lny~B!UJpu&_|+b4jl#w9C&LE&=?tEgNfQ2c{h~*SZi0THXKU^K-kKkC z+*Eu1h7>xcbdeN z;*n*;C%(4^)%Ha4NSScRx9P;#sM}`H_1LPNvDVX+65`_1>H<7mr={ zFLj|d>TYc>=)Cw=k6B9*SGtvUGkS>1@w9!X=ra^sa6s{U?x>Mx#3pC-+O1561qH2N zhLeQOsh11gkbl4*oPpi`JcjkA;id{UiE~SNPaK)URi`!ml2I2VlLyvfWK=Um_K)l#>zK=Cja z-99JehZ%O*do}#lHpfS6?5R38cN^vgS|z2P&Ek8fz_V;PXh)EF$5{M?foGriaF?H* z8dIU@Q$dc6Rh%-Yb1B)_15AOF4>v#7JCGtoeX7?{>|EJqVS9kVC(d$s`N!HG9a|6o zDfSK7drsO)?Xh-oz|`)q{o#6{KjQFSq3nRF`}p0Y zOP#v=E{shXD@_KyiFob*U2w;ixr@WY@j(eaYg`LvY2y_vqSST60ox)*M!`Lsdb=V4 z`*-QMq-|2QS=qW?yp?IZgI)?-uNxKGO0+gL>^mM+$eXEuq2i65he>u$TvO$)q+~sV z=&^Q5l--)CR@~@MnXtDRhWw=hL2>)cQfTWcL`y#Qamio)D0KA#qYh@__(2h`cb{xu zZ))#ts6D8^XR)=8+B@RYo1QtV&fliKCw@C7Sl*}l}U?ZVS-s=S+$!v-r4CL1*ya~L%$=a) z8N4a!tMlh|Q?pScWu}+nx(8ahwI95?_2bAl>5!5Vxo;^UrS~bR98S87Yt=n=h~0?t z|8hk3O>3o_s34#6_SSFIdgh+MDSpM&%A^lB$xG_nE2Ng?nHTnsD5^|HGbLO>3*0s+ z^cD#FIl||eLtbCqbZ1Vvaog1(rqfF8rfB1s7P9Nk7jZ6F@}u<@#WC!S^6xZln3qm5 zA8c0OoOl1xD!%KIW@BNVlA?4{fmHt_FRJOf&1AnH(}@;^2=#-3C#lq#vm@!kOFiG; zYCk$C6KnD4;BBH#j{c|Iu%5l9FR*CtS_o&rpXQLSJyj6;U~!VmGefb2U5zrnji6PQuQ-}~{#hIT zjr}3rL3nv_sAX)eFz#oF*~qrBlP>Pwp#P89lZM zY0SN_NGb9?{Gv!#HT`K8YPZ#*_(Xd)l63?@^F|! zp+K#j+vd5`w?r8~`OjpW@EDbv8t2Y5xO3q7n%?kcDHO@HLy6TJeRgFB^>~}Y+-?!f zk1wxR7I>yovzGLt!Fgy(=3Rev=7d=%d+Eq4pLMyjCRdnz15a(!URI9{RP7VG8hL|1 zSCw;Ha)P#P>Q%|ZOi?23+VATZKjEIL9+!P~^vz3+T&}1EX8u?i&ATU>qZ&0@ct(GY z%-jwPaJrvD%EVxO*K*`T_Sg(a#t^R@JvljlJ#5^qJfen=T5NG4 zPCj8}co$2T@~+`n5iG?tJti-zVj8PkV(lf|_L7=2?dVJC_NZYCA95UC_!+`+;A`2a zoOAm(Gb;}P^Qg4N?RHWbD*-_dOJ-zN*0evIemcWYeteW8K3XAak%u8N_Wh|z!Q~*0 zy1e45M`mNn&uFQv?=U@D$AG<2Dr&DXVdoz_!w-RzHNo@N?j zPdne9@w5GonpNoy#~blzrxwgthm9|=`{kTjSGa!GUX9#wq{39|F-EAbR*a=Nk@mcX zMUwjXruG_&?9I*g+oY2gMFZ0%x7+zyk4>9cJj?1zvnBKed^#dLqQ#%wx_sOzjTNsUmojY=R;)a{rThBUa zwr0L~GpYHCs_eC5_v+_1Rtrz+xq6YLv90D0q&DqhZdNDznfFQge(3PCt=x57`|(RI zhs-n8%7p<(K7yAr%a_Lb>#vw=C0M(sL`^U#-#8x2w}1VVXvkrAyv(t(zKgMvexLdu z7mvzQohni@eG6({8EJe-*W_{v!sBF7hwd50g%WOlJ18-p-RarFkYl8$jixR1`%o1<6Fw;!LM?*?RIZIidF>%S`)@Na&-?e5< zSNL(RFbeEnD}SuZ@vNuLlG=tyD=h!V^B0pQoSr?$(0XO>D%_jcTvhqyd`Jc3fXZJrn z_-KxDe5NZABeA70r7d!QbA)ulW_jHlbE7VnSsR0kvJyMRPmR2MJ1RKZzX_lJfKZ@1 ze*5`nJ?RHRlXG^09?=`SN1S_vx*B5GN}dONd-z?{Lz$1JGqP=u*m)JFmPdwawEzRvyXmUuEo?&i1#=|cb#%`)$GfSG>YV_qjIzJHa0xt=NF6~dEX-_9AFhD ze&T!Qjn;1jZ|jcrKN&(@Ryw))&s%(Z{(*^^y;0$mef&3R5+8FjXQgmHy3hROo0XQQ zTaPXVe?QZ=JvFA_@NWHyZVh|Q1gTA@+PLlZp4;!ZSlJM6S%9^}Gf7QrA-Ev z8T;xOcV{Sh3{>%btu^)ko*&mbnx$;osegFAF|%Z}x;3}H{)UyA;C`i*50Ag)3-R<#W++MJR>tfqcpSg`DPRlLrIkF2W3q_;VHEYjX zz35R;(mkrbOH=zPRqg4X#|8Ngc@8&^3-IkZL$U}hC^0hD_%^!RanH%-pD*w2I24^} z^nC1UvYbhwS^UwYb(G<`kAXY++Pk(<50yBoJb%*e^~_N^Tjt7I0iuzQ7X@=)Pw`z! z-2J&y8=-}=#dJIKw}W@mZ!VA5&+)$O9CP$6P0&dG`ce0AY{@nn^{{c%D7Nn)A$I=B zzWquy*Silr3}!tWUHssy#}ARysLt^wk&>k=+m5s!`s(!cM!}Q5;k_z3_ad*cKMe`I zJDhhoUIKOR?DuM=`s?BWJHLJ}@eP*PRCVTK&%-wE6x}PYG)#ov?0#}jgxuZC~=XrZy-!RVu)9Q~>?)*-3R?#DYy+(Ms z&ulRyf`Ng^CyK}W-NqN!?)*%&*qTWwek8E*6`#R|7G{F*gGbj?Kh-4L%f3LV>VyLh*h9T%EA6|#!-ke1pb>KXK=kD>G zsyF99iUieEbsLZBrDfktC^7b{YkW6U={_0ID$FB<;!luxyz)ct6X~Tnv%L|m^ON2D zarAc$U#D4Pv$jiLqYZ8(w_8Mv{G{D(CtUaPQtGj|A4vGLp41XcyZ>c3qdcF_cik%$ zoi5 zZasS^{ADQ%)ALdNbKQYI!fr3Dbc(&o^VgF!cdP3fqFg+=16z8w`}1;Jg2A{4LzvAI zXTw`M8#ujB(O6|96_RY074oh1XN2?nj`r=~i`eS906rd-xx3bu=ok8SL7#eczfzW1 z&&wQb)TQ+~>BVGCS|Y2-C6;MYtXGP$dDQ(~mYMomw#Q$;Z>Z2TYdwr*?%lpCvtErv z^(ta22`*46JL&Q>itLXy=ZNPhV=wI!8$Rc-_oqhQkZ1o~T}<26;cd-sn~ytII}(nL z-|xAxU-aQul_&v*4N{kmTc<_uqM|zLhD?qq>fz$dHv~<-+bqavvJ$vbKZetbzO9x1 zA1h7Lq)>3DR*T`u>Dc2?iQb?{Ic^&IcG-9aVa`gOSHCgCZDLmMI<9zvZ;B4(MGW= zP3sAcm(%A2wtj3>`lRo=G`gE9!(K9vsD8yT;YO;)rkADOsxM_y%QqctVrqXMlv7@T z&SD22m}MG}@Eu(jOtQTAVxy;7KSnF|#5sb@TE}*)T)A}b**%6#47K@= zyYda@JgqS0_v-2*wJvuKve$5@-}1-2Y*gQO@@#|Hhm*H&8QFYs_ifuGVT*MWVis#I zQb9@NX=r4e$zrWBweB=KHc@>^^{6s)tyhNNyO7Q$VRdCgPX`A>Lk9;>LuF-8&$Wd8 zE#GcGndmhL)?yanV5ZHx(B608*B+{*>TkNNT5rc6x-#Z+oy;y@Xvucv$p=h-m7!np zIeigMJ$}c0j`JJ`2Y-$P$b`IdD7kR@Th>(ueB+BpXKL1MHDaDZN51mhXU;+880&oR z&7elBA8@nZ>$XS!{h`;vsj0zJV*A401mu1;G}{t)ap;a%X^IPy&2lSEN8ZVony~66X)ZTw&Qc? z${PjQtdL>u>kU+Khl+@KVE2c&mzVRZsT$1W^&7GB8sD;G?LP3&jNme?%M`t;`PxTD z4$m~^F_e4V)Baq#plPrm{59^pr(MpavZCWc{p_P>@XYeF&PU!c`Y%cO?|f*_)6UKF zS*zaQPJvSW(!Ty}#@<(N_FEX-ZXd}~Abua*vl6d<{+xaWZ_lET3$Ff3$F^>V8V9gyk%g^fj$f zpRnt=_}yW*gnx{$@ww;G9@1UzdM@3L%U`oP$`75MQ1hbu%=(V&1ry{IyaK1f`}yUy z>RZ?%Xk=-k9xi6^!L*(2n4`|nz_rVMdqSv9MrzNK9;Y#4Pp=g_B@{Ro#q7Omn z6SZB&>+G11{fm#WoCo%oEe`s2f7Cs+=c^rin(tkMD@VlyruTPb73I3x$0bR`Io)bL z_5J&ascFxBG>O0n@a5F2H8Md0^2-&WMVStH*3DcE)U|`*r)=q875wY_qe9>c4hi?` zvx5XOj_~WVgCrcDh8breloz+MwCtd68R1X0v^=GMNBzsq8-4tCf`UinM2}xcDxzjw;{hl_9D&DMwwd^s2?COOB>HaT}@IidBT+LU|Jf=K9^iBu|? zd~}pCe}}8*cs#D_2W8#UjQ8<&wYb1wv0kT_1GI#=orkY#NBUNM8Tl~qW9f6NT+eMa zn-I)V-H5c^-T`9b8vEqLd;@PciD?W|*yVb5N%#hmrLb~JV*Fetabk0mxj%IEo?}07 z#UIjf$UC@8oF%|Kac8)CxMuW1>mZJcIvkR27M-b^al*XN_4?C6!eJwhhKS&84JYeT z7bufBEB2ym=R#P-i5zAj;RpFR5A59)$DtUA;ykjz>D+K+kRQC-z+20a(y%#rE34LM zLK=&x$#YfzuUm#Z4#$XAzW*|GY$OUb$2A}FFoQAMWz?q9Jz>5Sb-Ve0_#4j^;}fd^xbLbj(hc$3UutO`FGJcY%D+$p@Kkll))IQ#Q*y>(J_F!WwE2 z`19GR_E&PB4ew^XAf&VDd0*QrzJo&%=2X`d!d-VI50&xqxcmy|3u0b-9|0=!SHQu~x6A$E%FXrEfGYt_-BUQe;}%wB-9Pa_uy0 z?8bhVt9>mgXSVq31^#>z7Qajm?yzffa>i17`wN!8G_c7z)kaLZFMOwdQ`*;3y|%*8 zfCu#S3)*|#;(uC7S{`67Acr4U+2g!1Mb2Xv>Yln?M3wcHj*sW}+BB2L__j`R?haAB z+N*rTy4Og4+sKbe9x>IfiSrjztj}<5IyER-r6`j`ys5x^Wq{+@sE~t#TWLD;(txX$ z8P##bnI({{b|G!XJX_XlkJtePhNHFvTTOKaFJ!Lo66chWFG}!cGn9$7jrhXKB+#WW zTlcQHWZY+a)?}tcyXR{eHgCfRec7{PPb{yk;CRs9;he_3QaBt}#;sQuwVDqSe5S`P zGMJH0eG(d#W8IoAQROpn@z}-rq-@#{>8l+z{c@_yPLc5RpfjA$2YTZr^cQq@^;>*- zbztXMt$ah8$@IfV!>1oG5=_V0E>oB@Ck(czxJIkLd)(zvlfZzB>A`z!*qFGP;YaPF zN+17I)Aic5Qv+8-xQ?S1xhvp`o{%LL}-SlAAK-Y3?MOlSp`2bbOyE|jIdKUMfW z_2YIbX96aW<+O^rNs+0MZpP4anp5N1W4dc1*mBe>t${&ZCrDA=mb= zxT@=n1%@RbRH*7uScxAkTx-eh>G@FVTB2jtV5yV>(JWLrv{P_&J%020boBBL(_kal zg~bAD!@*Ih2b7=aZl^nPPy8ioSZUTwq)m(U$Ed*ImZ=|2%mgoQi%oZEdk=Qr zD##BD9ExeHzW8)MUf{rqrW}HA*!J)^A`jkpZ<*6J`>)pz-(u%!%o7f2Shze!hdGo6m zSLQs2 z-8Vcn?RJxc-OR_PDeBGlv(5EpGnKO2?RF)cS(#y$Rv96B6~8hqujgV3+R=i^&0%l1 zxZD)lG$ylD6Y9ND7$0v@SQL(XC7W~iz{;kNPuxYRGNf=lH9dWk1Lc+tRfDq2hcnYx zboQLe%?+5pP!n>@V)Cicgz4yLv1>)W;9*Uhd5$OiTwZ$}@8~6t%gr<&F|-cQJ)fO_WUXl$ zdz#pldaC;!q21a0P|{_@;t#PFcU;J&r`HKw{5kbvboTnq{5q+9HMqN0LlSf6R1G-<l;@jH_{FqxqyxD$y5kQy)lC6jqX{o6k;3W z-tl?8tf}*Mk!$G`BB$x&r?!z<+k7(~9VznnU)~c|O7)nNeywiVNm%@J_|4XW;)iXo zH5Sz~t$OQ6!t-38w5cD$&8$iAj5v6cL#<|6tSg~ACLtw0Htu-(wKu3{tjmP($*#>KSk6h_|5dYdZC1p15`cCDYNx<7efU0YKI&wkWb$E%}Z13p&1 zZ10|aI+}X4hew3w6{NVk`lIH`hXF;xp|gc%TK4&44`x-%BG2jtUQyUpmGQzgElL_^ z`u*x`HHOBez{}OKnE9aPQ-I&@yNO|fYy}~A&o(smdtd9Lif)P;ojR1k`ZR>6ZCL)y zrViJlkk66Y2B;~9=mUXAPj$w9yp)tusuz+rV>NVZa9_Rh_POr^oF1&?2EF4tUXepz zx0Leb2t2vU^dR!8lDC21wz+ht!K^#l_czF0^lLx3W;$8Qp0t5IAI<+}pmq z_2XiXn7;>We4xof)5Aj7Ue#FsSK4s~#Kvvc{e01(_r{}C#NC3>s?P$`Z>Lwx-#O1W zdJQ!_*|Ra{&ee1KWGTD6WdjwJw4Gn=&y8#jpW%La<_6DQ&b*JOIMd7VZH;+9jk9;) z>GP^$?P^QJuVvNF1D8JC_eY?};9e4U8 z%iEgHvFarsieq?H^b*@&c4)O<{n7I<(6oi~rwQkTEN4edZvevvkGnZa)!JtF3j!Nc ze|DGKq+0O3`NEi4dHXEYQ?p;+Db99qJv)Vb?P}e=Ql1~77Zb%r8Y8HO-p!PJy&(M_ z6>gRyaEFcY$fGKacgI(Lc2As43V7u@6?49Her^3$w8oH{UwHpohF$A-uy@qo=U5=U zH?6N|+VgN!ZpYpunQqfjFFA}^KU=QN+s9&Pk##_&Zm2@)*c$NhzKTnM+xPo1i@(`2 zdC^WhTC(S3PI=B8FHg{cP&7L=putIV>sx0h-m{d5lC1YNkDg_0zI-|S_{vn2(;>@; zWo0$F=9XI0FD@Q$O?byoAu`R})%(d#8#fj#R%c;J`Vdtc{o;k-*Wj{g&VU5%W4!4F z66B^0A2iB%r@HqF$6xijo)M&?pQQC+kK^XSEZ=39+b7FX?^Q;8|8nvCzOw67FY8@z z3Y$1Daevs9*-`jS_?nAbLr@DwpA@84oBwdo3r9Skous*CLTGc2#`>k^u#fD%PjRX3 zRB)yKgbU7S_Tytm%jimTUlGnbd<7~c-~6hCA6~7V+*h@}y>?IMz5FnyY0vRA&Wf1> z@=kk$svV2S+VAn&U$-qz9amtuy^(rDalf5Bn@Wn^KGUF+nFL|u3B4){WjFN`%v)Wr zGOQnsb+bQs&IkYObh%$Zps~P@Vbgb$ZC{g*ne&b+VpI+r3a)UsPPl9!MqeUDehgCU z;}AyQVQd%T`}9>>4O6nn72J_$RC*8J^GaLYzsR^R=?&&mm#eJX#>&erPbV@)sGVQd zr!K#cus6sFRmM%q9ud8nBwfmTFDGa~e#vLzhxXIHA+FE;LFB$o*9$k+@o@EbEWGAR zOO+DIzTNQj>5|v%(5sG>@!-9m8yxmH-#wJwZ6#!&+@BTEZjmL6D!H#!qF+&Yjc~t` zv*Fzut^z&Mf7U7gehHlohanRG)G6eD>J;1WEG#Tk9l>6nD_$n)Z`PEZwkkV2l=p&v za4TWcUCA5w#f44fSZgoTs$asO(x+6lh1nVy!>*i-un{}1)S|?~vHdIyv5BcU=slNX zbAIB@@WivX@wn|y+z)0magWX0Z+RNkezlQ_Z<~qe_*o)bGV<29=DVzjx|$M8l-RAu z_RLm8mt3fcmz&ir^@6{V*OL{V@u_XT%)+)qtiZ*JYsb+^nNlz5(8XPf*KIT$w2Dow zU&O}72y8KnE|;|Onz&~4<*x3hCoz}1LrayEvvYEuiTdkH6~B0bjjiR&>@zdTCUfLH z+q3D;jFkD^oQ1Hv(cK0K0+%$h)bzIIdUUT-%=7IqzDw2Wx#QuZY%(`(pn@q{S9Gam z`}2?uJ3?E;bc6TqNF=Mt9d6*9Z1CR^Z+!S5*L5q|b(&Rbej2<{MoKAc6$j-N&qPhA z&qU>>pGhxJXTRBdv;0$*NTh6B2w}5Q)P9LaA}sUKqpwK2Ex9N*s@dM3Ije*v7`S&D zxXqoZaJ`mNNS*b2w6y$u$2i9pMR6O&vhdF56LU%_ejo73z3U|N40osZ%84q}sJ-_q zFZ?2r{P1SrM4DOg^<13cR!7|WQ{&&w|3JZoRik* zy3eZbBAsr`cKPJ5@kqPKc8AsQ7~>(c6YF2zQ*vslw|p5hLQP}!Xug`V-7JFr8m?LM zhbKWZT=j$gY};T%T^^0+>GV^D;B9PdBySgCo~L?so1d8#SA0|$ERPto&B7sZSqqqyJ?5MN2I?9|zy&n?kl-RFiY_)rsa$g{+DeKmXh^ zU;S}=o3JG6)sLvT(Y#6`G|vJRosV$b{xBUc98mY)V_3x*Jneg{IfGJ zHpFFCy}rt0Hi%|u<0k(k-Pv5BGw4fINk9Cm(C>gVj-hws5mcYtltISAdWBGTc5R;) z+36O~WF>*+o&8do9zJ>B@=glhcrYK=xobCI!@w@pdfWmf905jz^|zr2oDo{`=1@>+sTdDhPv>Z=Z|x6dCdX@(gp zJbOJc<5}ZYTxS-iUsGOc(y>!FG``@-3-6+K%#BN(7Fyu@tlT$EqLgpEQ3?nXia(&q zy~W2&ZFznpF~Ruo_s)}teH+iE%!*r}Z?&~utv(^!BlYlXL+^gOFStdAv_Q!hBCjiQ zr<#hdm)(Elz|_<>?dc{&RS~>fRqtGOw%_EC*Gge#bFR1fgEei*i-#Ykc3l-d^CVX* z<}B}7TUqK@K{|Z@T|^m(>^I> zHU+~pd}d6TRQQkW&3M1S=1)G4xEhWLpQw6VW80RYhrhy}8~auvELx4aPBj2uubtjZ zYx(ZJ<)vg^i(eCivSxLs&QP|<)W&l`#>*@nG4`J>=dW0KZBn)1yKS+%W#1+DBQ5JC zt7X z8}esjy*nD&yt^)tM}$9G=Eb#arcrmtki`YF-FthwiK8BGgA^yyd;`r1MZqo(9xo4P zq@r}}M8Dl}j4ZEd;~hDPKY51NZf(jC<$c=Rx~flPTwC6Tu3Jfx*Y28be7yetH?)|6 zhmb^&jpilU$l<2_61raMXB0_aHz#gBRWGLM*|2jwB{+DoCfJ3e;o%zZ_R&%{$<^&W zdUp^1tGkCGk+HwCCZ2YH6Eyd5?5qsZOln6p^i+&!GGx|cY-mwDg?`Z$PobreSw%s2 z5D)%@7A4_n*M(U5Xc4lkOteuls~tO?O81gY0ZA-hY z!YamYW$A`;v$V0dwsb7-R$;B=Tz|^a$;py-&4`s(17(YHwX?^d&Y(`BtX%*ZrGrvI zxuH&>j-pgi?kGEytF4>8iw#N_bqHl;>tTuVK-r_*9WCAMP@eyv3hFe<5oL)wTs~vO ziejL}9AM>PwDc&KF=5qU_@$CiQ`Reo6;a+OXOuPSq>HB;$^~VEvh+Z?0{I6~?)K;Y z6;2oYm(V}5^uPc|7iW|Y`0+z1{c>|NR*v5~ayMtaSuS*(^*jR$9*xIh2^c&r{RAub zpFdTdU=2_pp)sQ1hqa*5qRygh^#2nvcpUx1@AO~4Xm|>Sh=plH3K2)4owr~WrxGZ@ z4pu*aCE=k5h!`B1ZZCh2Bccg-3{1n|&=fK}4v)h@G&}`MqFWOhP5pbOSTgqi#J^}n z3W)+u20TT?U{?!4qk$D8CW9qlA;Cm6j!6F*TE7{q5fqkSPCAzfBUy!Fl!3^o!nJ4V0KtY)o3&x2WtlCl}vyH6VYVyYE1+E z6DVZx3lc)Xp%GRKXb4r4z&=3}qzfh?CP*P77YF7{g$Cj&IN(IkWJqW{9@H3rYXOa> z5Q%>q68$eRSg-@D$I+pg_|ECXbvF1?)Gxsep!q6%K@eki1%HbcTok zg9DR?#u3pZ0=%mP3JLQ|$S?g6(L@q%^`;5}pCtZA*1?egGGMR=3W7JBgdxH5(O^y# z*qd-5ML;wl9}8O~fkGf*pzr|_A^KNd`)!dxJ0v_}APxl5)k*{7(Db9vzpW1>KpZ?l zA{sastVj$NLs?CuqCwI@IVAu}(Xq0Q=* z0JA64-&p#4b%2IQY`~l-upOhpmcYIW@Cku{rYSmroraW)2T=jC7N9aLP|<4fbQbV> z0F6R|Er)`~!aEIQV1J>N-#ZP202@aLp+GwWvK9$TL{1v}%XEI3JrII}b1irj54o1$ z{~5xG8cm=_Y#Qb?P|#}EK?A;c*!t*G!mYL-kRpK|p$!MK2}ld8pT&cCiKkFk6X^^IkYA#S6aey8j{}n?|A$FXkS2k{A&?Ofc-F6lQ2)j0 zXcCT$&;kWS9auAfhQRZn@PYva;75T22T1z_45S4rz+VJ7%LDj@Cqr5Q<3Pe(tpzad zKaw|)fiP+U2KE7k84ya|Ke4T1{1 zClq?oy!v6#;y4paM|Qw3AP=HffN-k9U@#;&VuN{N5%UBzA}pQ+ydIuA;73Qlt9A>6 zAyVL!287^X7pK!;tbr#HK%iT_Mj!)}Fc1xkCjS*$*#ECdzz`1TB$A=Y02&F=WdQm{ zOd9Zmx(8HH(|~pgB$&<+X}U!6Uv~eGA_2sPvk09ZoYDYV05#+4#Q_;)G7d^#fJnh0 zA_qXP(2D5{f2r`7^Z&ov`{S6ub{d3uSTHC)e!0i5^o1t@AvN|AwiU)}b zfLdXX02YG?lAtz)R|kq`3f!*35LacTf6^CFKZy)kCZLfKaRI;^xHSbBBGVEPO?S-9>B(FhRK40YDxC>Vl#l5v0K4{_#4x{(l7!JcSIJjnE#0 zP7@4oKxzaTY4teJszm@l!0$hhBxu3@6)XO~|9GHjG!(h$3=vuY$PWqf06>H$0|fs^ zZAS+EG-%Rf3>5*gF=Vd zsqlBD_j?>jO)w6@04su%6VNjm?h=DZ11#~^;^_LP6XB2vR`Tx*|4fk1@DK3*2X}*p z0tPlhzz>;@0Sy6bfn8GJT8PdNVO$_Zz^em75G$tB;5ZLzNdy=KsQXv={?jW5g(x_1 z_)9haXodo3MIZ#30qN--dX~-)?vwy920Ckh%K-YvQz(eu6rBdgd3se0r%%8T5pJ;< zQ0M)<$Nygl1&eH!f@=3D9Hl@}0owwdA#T;IK|>ZCuOMOt=onzoG)q6$om9}cLM)zs zBJ-E)gK2?Y7D(Xm6eysf0EZz!LnL7kt$yQ}f71$`A0n+_0To#ffK7yU3`hV4@!z`x zHV2fhaDJrogEt2Yvg2PE$n0PA1%NhkbpSgcga8e%rqLO~DFlndfcQd7KmT8CClJpe z<$}2r;MN|U1-x!74pf6kU4S^adP+b)zt6jV<8~kf(aWYYgm(*z2b&66C4p`NP-vvn zU}FO^;Py5Z4H$ysmDMu@Z9_zh2{6RKT}MDeR8M%2gMM`#e}!5)Ke(?As&mlzfN(pV zA)E{V4IFr_o*)o{g_8lDA>5{*_g~=xgwF5x3Cb_rPA9?-10jDQ%zxrEV2JQnK!e+z zpiK_i+Q=;db;;_5P=OFo#jPgN8Nv`43tS2=N`VjpoKER9Sc5T<=dJq!?+Q!0d3OYZi6$6}w1dt)5Ndg)iH$&S>r~S6Ee`6{T zf`>~vzz=b9hXwl#wq(`D0Dj<51mP?gWIP7#U4*9rhHy&&oD5@O4T6&{M3)MHUeKTX zcQSvR1p}lYW{5>P5c0YN5Dbp0S3e6LgjEe32;d=T9FIu4xctsX~b_@`X| zCzt|50IjywiAJq+}W zh~I!Ai1e!;rqf{G20{>RYdSxKEdamyr}Yfh|Cjo~O&Np`L_Yyf2B%Pnl~8~quYMLB z;p31{0=j5)5U3jTW6_4aFb^>jm{8uJ8-4~esqCQ2@Pz*av4m>}*2(4T=J6{r;uc@gl#fy)`@p{zRqGy^Yp!@2{{ z;GxaMfx{hm`5>3#;PM-ktY8wW=L+QEVRh1Jz*qlo?Y}o1oVTE1N2d#hn+8DXz_}1Y zz;P~;_E%{8r_Q1m!M~OHZ?>T`ghLj%D2UiSFl$5|L8rmTm|!6|*x%^<;BGjM3N{&z zfpms{X82DQ0W@TT5u8pT92oF}OHeRn#6>(hKYHr>zyAOD8}LGC@4!mHZMxNJr89)9 zBw$d8gaL$rCd=w)321;1|G3e=EmbnODhTZ-V2HR~gCm244LJ{B2oB{CLI9*#O~aGH zRY7vr>a8MsW3j%zxFyaLzEdmXJ(+mXe2W-K$gw^w;)8MoX zWZ-@Q-rw~BogrKcfGcHMILq0%=M6zvEhpk_qU zV9y0Y5O9so5ANQAE33a({Kq`;prI~?5JH5r9iB`(<3&HN#De*+9uBTk6Od>O+)06~ z4=4zE%M#q1LgY8V4+dj+kUQv(4*3>1@C0b_Ku?d5;QUMi{dLh8P&#&}lHl2KoWFfPO3TpS%J1LD&skX95S&@ah0V zEE2VVGfK$Bz?~wnhp-S3(qWSYt!8BQ1Wi^vO)&~=0u&DcTLh}c0~Rna05{qY@fA!R z;Lg=kqSK%j0k9}=A@1Le{<8^yAsk@A>j=PS5ex}%8y5&czJ~yAgu;awogZWor$M{~ zmz5x;0fzrk5D|z-cLTLQY_fnKoI^nf1z?ZX84VN;83qtVg62e55O9*!>!!0ncn3%; zNVEhH8T2fW0aD~Y{Qf8$AY8Zt#RGSIMywQHw3^1MHqC`IUsDBh(p}I z1=B=aSf|rqTmqo}?*mn~-%}^j(&=w3(C_F#yAOCEvO1jxV`{(`afXT~f@?AGR?v^c zAsU?@U2{;H2DgKtlne%f>mRGF1Z?f^YsbIVL#M&91YC|l7UO{S7k>H&0uw-U7Vet^ z8pv#rU@Snua6|<(c((}P(Z7WJKZVh0Fwi1ksUWn#>IW?e1Ox_WOo-eGXt33TmMh|( zA_2U;guuBta56&oGrInNs}K<3LyNIdB~Z z&bR>GBHrEu7eawmLoxvEpR^9v|6Bc_e*sq5%!YQS?NH@FsBm5|LLyuY&rkvihwB@X8x}bpaeqAzpg| zG{n1!;3yNk*$8P192LWz3DD=j{M$eKbE|;f{D2!{^b87X23&zf+!6sa@Vd@w!Jt14 z4u@bG2r1Ckfy4*`DYVA`dx7I$_+b#0DYUXgR(ZvbaW>b&jvW&;y(qyuv~8AwS#md$ hWX`sKKbyOUrJKh&H`|kJ;93$ecs6ly6>U|v{{dY8ns5LB delta 43528 zcmZs>Q;;rN&?MTnZQHhO+t_W}{k3h|yKUR%Zrir4d*aSN^D^_05f$rkMO0;FW_5Q^ zG_+GBNC50oCY(`);lgeo(fqC|Owj0ioQu{F`a_vgVMmBzv7)ddK*PKFllb%OHB|(( zij`$|f7`Bj!-Wv8n|uu&!kZqiI9`VYF2{Qei}Q!Jg{D9mmT!)$AuEgFearXDLKhZcphf%iu>K#7$Ed>Nf+RcXYM z0z)XbZsmx7JWvR?*xTUm3Mpvibj?Ren3J8nf{a6)5hPfouTcF`U;uOJF;n`5;ng*b z^s4cqYzwn6<5MGf*JGPJT=Ug4%_p@9Dxiwi-lo8W8fel9u{XYGHQ$+MzHwOFWTi(( zjL+e47Doqjr!{Eyq3W3+kLg9tNwwh;h+wH9Nvpl^DVGPcv$U($q)Ep_B4OJDSeX+6 zqZ{8PD5}DBYO&x`;y3P*kq}--%1s_s3h5IVkGAtJ^P27g5b9~K?TfZ?{g>Tl3D)6c zzu5l=R2Ao)I#~z=2ZV(=Sr0@MARmv%j?^<(cV^m_;;yIubCf2;KnA6C5)k6Nw!MB; zR4*zZ6a<)a>FUzw-;5~Wju~U<`|z&gBjmLyZ#rfL>M1NPA z8jWS89R;G|DV)ygsxHw!AHgOCUdx_0EY0tdOd)wmyDjLwq<0{?^->{ z>iKj1EekbKAU7T0C@WXMXxY*)huL7>X^x)68>dgL&bamC?E%{8>}@`yFge88I9z^; zx=PER9W%5x^Y|G^d`szJ7agG*dGA+qBL`oKJQ8RYuaEj2hxL{-`^{_YaT%Sce5&ct z`qn4&8z?&vdRybCEeqfliYz*GcxkUX{He3k8F4Xiz2(o=9Rv-4TC#N_OQ4o%p(qA! zw8axDg>q*i6t;FHG9N+#Hl!1cy7=N_lug+DyAjJ`dg7)wD7Aibo#Ujs_e}535ZYv7 zbz!Y80<7ASln3qygB`V5xEyKchrQ!yBz!d=wfAyK@oJEDZe>*w+Ced@Qz1@sVC*!ER9F+JSVh*OL#l|P+WfJ)gg)y zxw+5r;2nJvfj>6M7uy@JvG89*LsD`Tm=|!km@W4b?k01j4A&IV^2w|m5^XXjRjl)g ziRb_bpwWvxWnS?|kpW6f5KN)~ASMc5{f z0@Ese>&gvimu;z%;7`P1`buA|ubv!PKj ze`{JDFt3A*s8f{dm-^@cMIoVLvLD^Ob?L{o@vqLEa?3*B=p5t$v8cNY%=D_}Ld|wfBf`BHEMl<_AF0RgI#&$6ORSqWB zFw7i8Oho^G!Nkti1O^#L11ODhyWt{xOe7nXB*T`JUV?IZ8ho-+AV*%D zNFQ&qj0YCjgM7Qs9&wrqteg3T`$LdhL%;{Ud_JXqT4Vcs{O7yVySH&j&>TyjUuOy| zNsqWb$||<$Dtv|aWnRe=?ufm3$7fpcT99?y3TpjW73%RxRw?Zcvgu4N|r|IZfeU( zQ7YC#OTh*aBs!YqZ2=cNXL8__#3jF|^Ax~x+H~G-IE6glk#P|oYbzneJQhF|fVj?$ zz?ZZh&?t{5AETC!2Do+D&SLS64>RxVN_RH)PHOESxaomlRZD-+B|=uB)c1(F~L z=86q4df;tgKz>Sd{#kvz&TVT*x~?WlMBp-76c@|f%HDZW6AJmGTB&10&Npg57J8Ke z9a#TUTU=3N2vco@_l`_x;rsn5HUHt+I6D;tz8)<;l44%dv*FtA3{8hlzX&Swfs?xzdsCe zI#7TDkf8y=p{;P82UwUn8k{!EWNRjIPzY0D<}N(0Ht7cSbg$<^ocW2wa*AZaOoEpi zp!965gln2yVu`3FWxOz^eYP*O+;3xRzncHp#N+==?&Gq4_W-bL!f0jBxcH$fGzdVmEnL;8Ok zocm3q{4%JQY2cVX+O;j3$w&Xs*|!CiT=G@Ik>wp+~qxQ_G!~uk30M` zn6M9;?sN0=(z6ooj~D50`?LNlxwvy;zayCST)EzRCKx#HbStX3CTP;t^=nj)I9_BZ zVV3sC3gEeh>JHGB2&IemXHZAO{N4vNztSKDD~XFMr?E&mVZk3zDWax=Rp!w-^JAWP z;f?%-B7hqtONvBe@#KR#q>?r*RIBGlQvQ#v;Pc@Bq(pE@2lp90xgyDYJ7z-jqkYKf zqzu#rlfC7e&K%qA;BPu$QPQ|{9{5G3(%nsfkDBW z^v)QWG(ax<7THa-aysK3EKyq~H%^lLyYL@xf8rE!EdwA=%}Wkcz#*ADfL#c`{g%(f z`Z6l17WwQ3ju`OXaZlWh?4bZI4#rP-8u@Fmi)38S28odv#c<|Kkw-C=i#oU$%Ix8A z(;KA03RF?$QimmkQCu|Q+ABu3{WmjV6iu5~(kAPKKkK;m-7pjgR`AD|X;Sp(tH9L` z{U2y23dT3X;T<^m12iB^W?;c0Z!lF3-|EgLe3-mjuigQoM@OiIyE%YNE{|}T?6!X- zB2ceJPo|)81+Qww&|6%sxMl}iO?{<45+Nhjr;4>2WP>;o^r!L?akx|#-M9RpuX&^= z7ZFr0knc@_D}1REBp%8FA)-{fpeGNREvWJ%OS@-OF~*1k#4w^_`c~XFD6jZQxFRoK zx)WPyk(-Npm3+}+2Uvg~-ta;t^*W3=zE`N~u-JHn%RC#?y%^e)d00RoIh$ zbsFap?eGGA(>X+m5uU;&dpN${>4@;5?$(tutj(M=G2S>{?Y#iB6rzv`qzso+ApfH` zSX;jA=%2v&nAmv%iQdfv4Zr0Xw-s%S6zgz*QS0&0Jb6rF%mNx>d*CI$Td?dhxHhsP zO_y72<=kQ?L)e5PZhLg}tKnb}+cqb&ODJw>J&ex5GdOOH1;4Nt?0;SX&PUZ(gX?Pu zNHOxb?tY9tATEGUSyssqomc@@wtQ3P1JAHT#8`AZpvGG!n9=EqY2=)|I)ePKre)}B zBkSH}dX#=kD_}?M5iHBmf^djv7gn~lmIiw|ITL#ya`R7#$63--cwo zdk=E-t3dtqNCj@iqUGY=DA!ZnQziL@l2!s&F>Ujl1y{9v^5>0-z=h)!n4L`6V*o8*ux6V zo(oXM_a|*mIWf){rTd~&mwd|s?D4bJ0Jj{WC2CNH{-AP(qDmKbPsb?D)BAvqQ>^BPSn!0;jO_JA3i|-So^lbg5+DHv8)ry?Z~$Rq3L&0CTz6i>0qi5NtQm6H5d1 z=d~Au2D7tT9oL5UE>fC9Y=c;cvonA~D_$b6QEWd;3I6*H!<}b?+9x8zwbL3sgFH#E zOil(whmvzqzY-^x?ZEBoSw3r;l#TglPgNZ9>BdL$Ng#^v8xc`}hezRj-lpbRQ6JtX z=>a2ew7MZ{?YV4a?q7iO;Q~_(fjt1R7nZ%KXquAVrB6U7unSYxMN%N2#CtkY-8p9_5O>!b@lk~d-tQQkr~dUD{Tiz+^1wyuwb&t}r1Ly8u|_rWtWo~q^? z0BI<_~Rf~^BKUDJf%eN4Lw{p ziI+d~T@X3@Z8+*zpfW#ad|rqD*tJx}MqHl2k2v=IHrQg&ep|N1IO&T zHIu$U2cv&h2{!}6D2b3Y574YF(r$g&v&i`V8(4iuXzl8py!Gc~r(bVjl+I&(Ere8R z6gMN8{d@vnmbWi{41Y6@OyaHXT-J`hw){^2IuJt0_xkk9UBZ^tQ-zl%Mz|q z-W*cAvwrdy_%iRx4s(JNz$2JXHdMMiyq>jW4Vg#R4w`$Mlj#^T?t1hG^Ew@>YfxX8 z4ox*C-2dBJ?0j<<571?|WSuLt`Xjk zjw-~CS`MYwq&kbRV(-3z*pw}*G7k{BogeH&WW1k@ZQ}J++1!D$vtVj*8!Caqh4^&|hM( z@Ukt=Y{z`Q=oawQ-!y=l%WcS%Ma;U<@A>F8(1+%?jLX)zy}#%Z?c7R}-I8TTXv#XB znb(Are0|TG|KY2$TWz_PP@48y!G(I%w)54i`_T~pE^Wn!j{fX4@Y9B{ZOKZhg;NEM zbkVcmwohH62HZr^8vjnttsvpm87xk|3Z=YcjdoO%Ec*9YE2lK5T5w~8ahGZ5F_c2s z>R_E<>$2lM{98z$~EkKL>Gcq>WzuC|U;<#$w7B=nec z&f=oukgebY#`4IF)Va2qn89JIn6x1Ix&~{sAipkFUd^|H&Kp~|tw;SERIXGst&LY< zse&sC042}>Jvzeby-sD9B}=3cKl*3?Wjc;m|DAJWpG7uNt7st(jy)luBNR=glh5b# z@R4|owoNOl&b7<#P!7kpZOp9)C%em;F8FFiFicsegt>+IZ3z^d&&JKp%DlB=aCygI zPS!;b@P0@X{zM5rVoonZtvzrb$MYD)(AKIA0H~ScBa`*36N?hwRHb;qm(Ss83O?Gy zP_9Nlfn@I9eZsZVGf3A)dsX)IW+PRU!;ZM$Ly}$p0_;;>S16QK)d%BUwS&&gv4Gnv zgATiE+-qt9gEeXRd-c3qR4s~GL89TxX$C=_2aa@%N=#E5cqFHd^<+V%ut<@QBp&=S zV8FEthqzJJp5bhuy`sGX|M|RI@|oQmCOGSx-iXGsT@fJ^?8~L+TY6mrG{xl{YG7WyUhkJGYv94P)_zlm`M*aPW2cnl<2HI2i61#`ST>iYd1CMUNh3mt6@IvxyQ z*O?bohVWsKdTfpBsb;6@#mqe)V@Uad-cR8T%VTJsxQcI)FXC)DLBqfe(Wl8BOyT}O zG2%|fMA;HxTP9=m&?=Vft6BJ~b=aP~Ku)_WZF~;AFGmBdYVD}dAXQWk7!G65(q+%2 z99$~vCLrDJrN4N}us&3jkC7W{G=`U%n5MA)!Wjo!EJq zSFSI+7@jo{VMgFZW-86uo?snJlg`VbbLuT9g(%_TZ*FxO{$}2lU>P27cn@zD&8onP`%R6?Ahf=M*&QtSs2&oWGz@IQ|gBIGvhr ze6KyD@)q~C`F$-vW8}@`)M=SY&f)R$F^q!7RbP%j{hYnJRz{E5it1+NdRwI6IwI?5 ztw>H683zLH30-12z^tCwsr+Alq}PQ{c%15}`h2IY1@G}7-`7jb(@Tq9lt&dwiRg>p z*sJ;m;?eI~#N$_`?myBpT&|LA8MAoaDtryya&NXxR|H3Frh6I?;XS~u z6DVw0yvNtaOm&~NWK*ra+uH{Xx2E^98L6p3H~QXX?%-svrWUsR(YUD2KZZHPVf z=dmp-+p<23H+mKE>&IPGbS(pCi>RS5S^+F2>2mV6OaHEvL9 z0R5W63T8N-GHGu%=)hmyct0Kj`kq~k&6Qoa!7j#7f+{cf(?V(G65I1s8tPxWw9YrO zA%p?IsfRnA!SLU)c#LXzYN3;O=GwdL(D^Lt735K`4D*>=!7)av(Sfd%J}oQ+r+{7R zGqfJ~Y4a;E#f^b1ClSarK~tdSR9Yh&rY?7$dM5)r<3F&mW}|!Bm}v4t7;)#_Y}@{* zbw&lAVs;WhOmJc@i^*(Umo7NC*H`K%%OMTxE9n|w|F{DOKITkLstG}pk`H<|tE<}^0!K6`53iw=#& zLMEWlzTj`V>shFnb22}cL&?qA5@17(R6jh@Hk!7%*0Z)z<@>xbTL*gsBFjI#3@TN}!{G$LWG1#bvTuyvwgydO7MVad5kH0CQV{2$$G|H)c+ zh&P~xqizCxIJ@O|-RjQxQU=J|K?7`9s`)B+rt<-j!$le#T|0@4D8_h9<~UVKNGRLk z@*b(sBB^tCrI#K#8A(R4Xe`LmPv@pE)pf0j(!i8tfEbv!m4swk084A%y9d>)DyR zb@rZ2peu|f@`9xA>>IO@Q>_53oEW123Y0x)Ej$*FCGf}G#-=Z4ptA*}8FBl-#Y4&r zlhOE&817;)PHN_G0+xywIb$TCp!*3XLDv5j{~CGyaqyE;5zVgoHEe^IK=Wqgv0PaG zvJj46*i;P8*S0QSnbw7dO%;-?nV)gY9zy!W#S))yn0yhgx8eSeF8hhmp&5QI!5454 zq?i-y!@zn}bmRW~*$Id(FK$w^ze+XtuaqfJr>KQO836jBp-9KWA^u_17Y>)sY+mC3rGL{q4t7+h@U{mv1b9r6F_@K@5 zNh@u!hIf?cZ8AvH-XF2`{@j_;fRqCDjL2NfUK*6`KVy$<7$W<+4(QKp9Q%RQVbH#+ z#SDvDn7~ajAh9+_^yOw+3@6|&{=MK@LTMVM!t?2$#tiTQKH-Gc?~%8vXQ)kUL_0Gnz~7)qNcgZ)o1Nv zV;R1R{hC9Spb@V5*Sbc6oqKlsqil?08~x^`1Udb&S20GH@6^&1Y;4-s1%B}`t4}zr zwczpy;$={M(Zd-@q2YeutlwBs6C%PZ-Z(%Pl6lQ?Jue0UzPefd2C^m(SJ*u?#p$R~ z$v;l69p4JXAr`Lz%=$T zQjHCKRl4_{gY1*XNs!Gmg11CT&k20og`SEcx&xj7jMbPn1=3CVnfeRCwl}L}iD&v5 z7_*K_u`McLo(7^dl#gsG%H68;&8D@du~)a5)~e!O90GA@(KhZAU-ijIh@H+fh#(=| ztzhOLM4C>kvup6QZcpTK6KiQ8&ESTDZRlm=mVCqgyLLltasnal9&kum+!^T2g8M!y zlQU`nd!y#S`*cXI3$S=C=A8uMG0|f(mTaglo39yi0^Z3CRnz6Sb)yIRM;Yey=_8f? zE~&nV^mM|Ih3?Y7_u&O+ey^rtP=Dfz;m_~)-WCZ|udNsq9gMCWEwWO$T1BSku3QT7 zHBPF9<*$Uuf$Zs**O5FPOJw>Ah1drcOmf@-pMEr2X#}T+V`b);1MWFizUKyR(NZFM zt@58g(#o@*%CKh?8nd=M70y54qYw#)ZlAjCMyCNIC5gwraw;JW96|v-`c5lkd$DTL ze5d|r`=-S@{UUL40rH{7m`t$V-MPz5#Pc7x8xv5(c!tT!Mv89;f(hpMdTharaR|Kt z{x{=bZlSN^4txWxFCF>t*sK%iUxIvm-;cAs{bE7;+TATaUeCAHSRT(e$gkb9U0(@(%tM=P~<#HKledo+i-8Fj3FFpl+C!N)tIQf5PpkLYZBR+;zv0onxMvJ zjF!=WoAp@oVdylA`D}Eg>BR~tHt!d)-9Hag3dKy;*P#C!c=LCmRRz{C)a1+Nj~c?w zNj>}x^+UaICGw>bQoFF>3A+*JdsczG6??qHJd|OxPGTcxvg#NotbK!JXQTk0>wzBHagV0=^!> zuhWt05$r$xg`BtH3lx$K=MjZ&G3LL}7VBe1p8|Wst34R3OE|Sw^vpbm z7}S3wLdA9vt(!XlIsNY7FIS0dwjg=^;*ETvJUQGCTRC z870R;Pw5R7Ym5Wp541|KIP?FNPjYZF5uyICy99P74(9)zP;#UXe1M~-*B(Mp0%r8= z;_*10XHVf1cA450StUxBeJP#Vff{GIFP%Laj^Q7O6+ooB8eJRRSCUpXRw z@P2%!hGTL{4m)aT%U;B!1XzCv{3Xsp;~Z!=j>%r+r2K7B@9M!dk(;ok=SS#rg3{pa zaXU7HyR#=8URQ|MqI* ztap5XAwZ95V74Q?F~Q22ck+osT`$jZ+GM;}<&Cla{KQYVkidEz0odP$JH-&&_XX~A z9Pq?X7R;Alqk39(%lDF=SMkYE+g*UXUH2W9ro`^l8{4h?3Vf5+E4k5u!5G^huX%c} zw5O#w>&nN6YEHx>l&!5Y`{0Ki?GYn>M_xawn?Al?S=E{1xjJrI+?7LOs&C{CnFi^1 z)cYagwX8t4_^rPM000P1O7*cG{awb*qYn8CUcKw*!Zr>Y={k@v596fX~EfX#(PiF+TiVK@Wbj4Be&^+wdX~N>E7qO4s=ml=zE{+1Hpw^3I06KfNU~pQ&xS)(DhaRt5lFEN%hu2vQv6w$;)*Hz+ynKR5ro_5yzr~Q35D?tnw1AM6c(OHZDmPIR)M>?169jCD_Zp3(D## zS?%f5OCz$#!8pR6_9rW^T8i;4wz#+6*7H7Y}$K5C|mdrDa5D zXh7(pI3{ha@c-@R+i4x7bYtkfP`5yPFZC@=tJcwu1W9uPiAp z=wFVg@}+r1HDYlA z2N$|P{>aL|5xPN5xa>ZWL_`50K7i>36pa0V=j@krYJZrZi&Y@BN9^!SZwn22G<*+d zWgy9@0)<+TxTX%l>zAtw8B5f0ebyrXX-CQPS#LIKY7S$ahV_sk1Tu76Rs2}W$&d)! zRkEYv6BPtchOi~1MZ$n|3EnE9<*PlwKsAptCy;;1(Pg

w>FnHXE9a=R%9aNMM+{Ki5afQ?Hw%G?`HU>P`j;S7CLbPY+ zM1Id8FTdKro!|V)J5T`?=~vG=8;%5D2WuRnXUe;+4WZiQsRTmsx*5CsJb~tMvo4SV zb_|hlJdo5QV$TyjsHp|XX`zOsSHkK3xxA08cbry98lHI3#faUOmLI*XGvV+4)yVfA4-S27WR-G_8#xy6&w?q`4=+47lifFidk&*&|FDVs^`T9%i`@1}6sXXjc($M8 zSE6LUr~REaaXkInP6A*}@o;97w9If-H?^l!=FcZ(1(^7NwP`x&@H!Zn$# z>Ga9_abPIrS}OjqYMThzOv)tw5`wGtas=+}Es(;L6-&8OP0<%UF8_@EaFbi! zSJ?M*#D=2kjXqh1qAI;eEQirNgP#RQX_#Lut~EK&qZ#(4HNvEM#ks;)+(Guu2o3Ac zA+`=x%mv(ZFh?ce&rrje5!QpThzI|!gFmn8;_)Wtb3_${n)Wq!+AhOWkzY3T>*lYG zLw1y0NbRN~pH4CSj4W|I{M_1Yaww`ahwmCB$kcg=OcxsL!m3Db?8-L=_4@L(JuJ2wEP;xgu*YC#3c5v9?7Q2VD9{suzk>Og zB*CgCA%h@*v(BOuU<6?!khAoKv)Wlxw|=otmUwP&X0=QU(T4@C_gU)7<}B@cD%r_; zrBe}^)`B9@ZbHweN7iEoZQ(QD$wlsIbQPG&I!I+^n8O^sBNCBmF6 zGZGD!5%&54Y5L&=iE@WD83PQJmIyCu=I$5^hB9G*%p+eW)w_y@X~#dcuMtpaD|*%E za$lyf+6Q;l)aE&54=1X@aGcP|P`eyqMtyx}lYB~2HOTIH*NTHpKJdemfEY+WE?}h_1D(66(bUB15{{}v6YBMH4 zlF)7APIC>2M%L_zctb}u*UXS5SOWqp2c;|kAFK)pr2?C42E9#bK>@f4bhmO26rUhG zIuj>^6b*E+9JF4%@9BTVTBEo|gO0Gf$`58yMQrf-W%C&{RI;=|ly&J7bmcm+UDDZz z{~@-LhRwPkMQ&wiGyvUTvzgEg_7gQg6_W&wVp#uly9DDSPk@xD2ox|+Jnw@U2EHr< z+9WWUu=-1}m{(yvr$fgt+1)T3e@@wY&aIiqD=^E`wqLQ1z(6+6%U46X5OkbN$$8VQ z7NrM&Xwax9`AS`>0;Pf7UgY@xTl?uOarD6a!4z=1#v^A#fz2HGt$d526nMdX_VI-D z9T%#^FL;3Sm{v$s^_-wJS>+{)W@Uf@1Xac!$mWMa{mh8GmtD>Lagmb`2ajJF zK8Cx*s-Py7E87iDNJ#zZWS$EP%>>SiAf}_w7wPvrtFZB=YQd@EWy3scn7Wpe)ISngO=2Nv_U~k3_n%?3GIALsrg}k z3wbTHZJiZLW7!aUG*j0q4fJIME>K%}eV_@+1^dge7kS&D`1I@hQuJ@pk^R2`iH=v_ z8s}JWB-FSyA^)ced=JLM#dnW3oS8QRLVY2t|Nh-V6B=`6T_akGFxiq|C$!Vj=d zB;eV2k}QOPUhJ}P7~g9EPcyAM9bJuG{_pv;9YYQ)La(iX<&L>SC&L}9Gif8aK$`iq zDN%oh8-0qXbmNSm{e-ggf}L~Ny2P}u>3l}*)2LUsfC}QFJO#E$4W2rUmI}Fk*Lrun ziE9bu&_f)5Ko*`pW)l(^kcqHsP--U0bxT*}{4?8h4l)stuZVj+ zGX{aIkQ3crxQ3XxKI{4yef{*~vwM4^aQnkJF2%#yt@#RL8 zfKF<$;gmVG#2&?t$rD^}!A-5Az~vh&kzMLO7`+HPUm<`-|4S#E?*YQE1Tw5&N7g_a zIp&@E_X#<1;qNLf@vBhaqrD%y&C32?-q2Ufhl;F)> z3dDaB&rWFPGYJg{t!1^h;mD(%Yg z#h+9B2ZHCuU)P26+F!QIuZ9>%JNKUNr&6>awaUqoF{hS5FLH&6KAF7{u=dPD_Y(e261Y{tb1Aj8`3JHL&y}psVWO`AC<);nv?Q=&cliB-wIwYmsHdj9-R3S#v?`eME zBvf(%9{MGy>n(LSYLYEUy+$CNRONN%Xz{xOK#IUz6P2cz$NxsiKi-25**9jbXVid5 zwK^k~I%WjS^y_fv7+(*1wyqjpud^I7&u`Lw;q@Q$puoO&k9^t*@(9vY*2|ac zyhmO~eR?QNPIGj>>Y)coOE^sub(`{y24sT))P#@ga+)7xI)pOD!e{`~g4V7rEhin> zS1FHJgBi>#oA)xXkbHZM!U-Uxs88!B~gR=xOaZLHJhRgw-vgya;_%?LkQE&HHm@I31|8Xy% zIycK`@`$cCk28L{@~f?$9)~f&^)McTekA`pK?f0oMa{q8v}M0#;&kaY3qVU+gRy>b zTO84wB26Xs#HIN8oobL`6LT7G5T5Fb_00td%j5;!BLCyPa}y>K-jA+}BM~=p%*VNz zU7e`?gXameT13_`R%!DM1j)R2|Ih`v^*lxdAWXg&_gN6@fR#3AwvYz6xj(a}8t%r}Nv8el+1>#&IP=!m z!Z*?AAD#bt1|TOGaJ@fbd-5xt0);X!2tzAN$mDbs0kXdg2B@WPuYi*Wd91#~;=zRRP09I;hiX%OP6>eHyu^r;FCU zoP=3_mf|@S86PG6STUot)Lyw|E5_?N%B1@Q-T`7hd$a!!3yuAM&iUE6*jWFMgT~37 ztSpI|KK}+m4w%u=bwTGu@%MO<%$e++R^k?UmAx0EQpqNlMd9i~#8siLQzSxrgW+;g zdB5GPNi5ZMF}JnFi+Tt)i(R_-`A{`9_w7s)sUiDG*@X=E@yHKZj^_07a{sFlKRRF4 zv&gUhlVJ9IF$Hg{wxBm@bJB+Us}q^1)V9a>1}wE{#CDj5K*>7g z_l6~Dk*j(-7EiXMH1%qvKYkFHpXw|9EX}359?~Z}LQCpo$BkhR%0>xV_WJLjm54Yt z{27!x7r<;g3Cw-#aK5pOXhnkZIzSE%FVij1ye3$RVFb9a>w6;#4LI&bfgtRN4k0&* zBr61I30%=?z)!27C1Rks#chC8=Pn?uon9P>+0DW7g&v+U%s2qN&g$i~2(czkv+HbcG^GxncE;SBf#EudFq z!h9Niz>EuH^8hlMm2XL}+i&!d74}=$@@nNSIus6$ThZQYAr6^a`**0%>Wv(}udqd~ z2>^L)WSSNkY3nN;LCF49&d?E4tD14!(!HAcuzLT=*wuze0>m57`~hf6e=(DNA9N`_ zao}|iNmG<;TEU;+Xam>3W|Vx*x#G#A$*^b}9_4NF_}=k6lcVZT*PC-k5|f?tFc~Cs z{Lu?e{CPt{9kPdda)&61y_aFk+bt!bOcm=X7n`o#y$bHqWCTt`s!c z=(iXwTlsxXw}a^`El0c$7My7<@VI)Lm#7SRX;UJxUJC)?3R}fG&ppGJ22n;Wi&~2P zjDdb1+WxgItW-cAR+hJ~W9iVF06N32EnFKLv5?sZde^6wus>7xZ|wwi>aSPp?ce_$ zT+f%Eol-$nwE>BH=lXKS30&qX34e^EgRr{+DKoHaS4!+OOpq>t{=ue5n)MH^V=7_K zvw8`-HZwYySCBl4;gH6PerIFtw}JQ+=&|F*g?k)e@x$u3ZQremAcz_V2iTQJ0ntL* zFo}pm%-^k*7ATor7c4KIwQMPXa>-{63Q?dyC#4`5=Q!K*1)Lx#*+x!C2i0V;B6VV{(ZXZtH$$y7sm8tibpEGX%G(jI zh*)BzM3`783ES*p5RSsb&Yy?vLgiV579*RKnCMwCfQ$dBdnS~49GY%8v$$keJ@ykQ z+)iuX5_iVt=#zPe@TQMi5)t?6NAEzzv=U0)1}=&3-{&shts(ZZ0HBwmv*bC@IF&4X zjO5_suoB~~#*wQ&iIuVvz=l(7z$dK}&sGhvnezII?c9PWHf%gt+p_);g&R+<7+{%# z_)KdtiO*xDd3DRqp5*rYUlu z`KQ)dpKQAkRF%?a0+_`1Iv>CjlVO9d6OQ$bN(N3;DGRfhR)^#FrCeBxv|<0s{G;=n z1D_@4q{Mb-g=K-EWj}m`?-m);wwE(DzC#ScFlrz&>RybN1SFY_Vc7&CGB6>a;M7TS zaCpq@&&v?myyb{qKf9yA@$ZTu!k0$J0`)c7wQnNC9G51Sp zI#>OFZCwXI&1)M++Jj1^w9rthvsYRoDGfBFh@zcRno1|q(ngLbO+rOUr7g5eBJE^^ zWHhxT-~0Dj=l$RA{l0tegnUS&@y7;^ z4%|+8{fMQ;T4%?}{`11MRVCkX^F|3c&*Y8;!OOe!wr`;Oi0pF_-`XF>*TtFF85!>v zbH*({KE!`fUMc8v5&w(T`$zN@48Lyd+<0&Aq0$dMd$bLOw>>iE6s`Ar$1-R@BR^*4QcmuM4NByCqL;HW60`*F~4qz3CrcvfRs}`t_S7;&0FT z+)?Ms==)lxY#&8;-ot8sXkEN8@w^~h;?mc-I_Oc?p>44%#hZ|$J zc5&bfkF4LV;~ZJsbK3aEm)g<3_~&xIODm{>gDU6dS|d{ecL%CAzSftoUq@pRQ=U0^ zi5OL-Jd@PaP&z#k{G~qml{hK>;#N~<+tqj9vT9_q> zq(Kj3Qy=r@X^pPWlL>;7ETT(u_Z(~5|MHl{CqYcr1x1fH;t~2v8}Np!HD4~%Dm>d; zzQf?AYJJBBl9%|CdU>lu2Am#`Z{RM)bf`@A8CIOf9Q(?apsGFDvY7BjZ^if6ddv$` zpE&gbzGqkNd25C_z451~Hcwcr;mE#?3lpx{Iw02=n3?w`vPe?qvs&j77Yjbsi=S~9 zt@Qmzw+L$FFR}$xUaok7W!s%xwT`ENZt8z}Ty3utt;0BcY~_7ry3~#hIz69~ZAIRG z!P$=`9(Fh>nITRI+3#vUF}N*d#kC`kzUh>31x-#2y|Nz-n4QzSrMB$ewR8Nof{b8R zb`BOij$9JO%C6zda6iGmrldcR{fZjna5TFx1Dn9Uo>6+2eJ!J)l%2xRy38(oA%~rZ z5nBdG|<3h)+8Fl(05MYk29h%`2~3c9z_V$Vt=ayEUpg{w{BnE_n1r&KHlt z0D1ZMT8~?PELM*$_Rd5`yn4uyu$_oshxh!DoPC=9m_uU&mj+R3HlG?vIZ@5fE9Q`* zpNWmzzJp;W_bG;9#20sw=Kq)*qoz5Rc)q*k^zikLMsWN*+kJk6!lLoSkhfDiXTk0s z!E*=njILCe&u;4+Dk|7pkVGrMZHWUgdTkf#?2Td#q9R)j4C9P17RsB86;TvrWzR@Q z)Z5)?zr23(nXUP@ta|%LdDa(8eOohf>9a*qS2=t18h15M?w)o%{-M_Y*n3S?AMwqu zvgZ7^`7tYvSN26bf293d?=`A>Q}Lq@vt;ins;3-a6rOMa`6Ml z4tj&j+S_raaSLY-Z&TM8=^w7cwZ)c_J8>#@{d?ZH$aR0|32L*N`BG)XO>G5VFCO1-HoF?hwVP(KP5?*esR&S!C_& zQ#r=sEh}DZ#4&>TT@U*wWbWLXrfj;4Ek$)N9rNt4T;;Y5~iTKv{{7H8GexvYbEE@QDH*Y4eH z!Jt$0Z5<|W=&Ot8WVLZ#pGUvxV(ciT<(uAv@tN_&5UXm{Alg+hS78|On z=@BH&O^W=W-zzxmrR=xQ$EPh(Z^n8qE-rPsj#t(EpcB?1RESSZET9x!JSa85lh>jltt=T> zv5YunX|!vp*}*qTaw5k!bPF|w_RnG-Ykvc+T8@xkI+xm-WRax@AY5w?}(YfmyT{buZ2rrIX5jy-4v}Pt}0UN9jSUdBIL>hL618x$X35l{bMa73r5-G2IM^9~tR(bZg&zIlTt@oYmEGE5}uFFiSZ zbBotYS6?gnc=z)aY0t&(=JHjmjo&R-`s{GZeMfT2+mkbfS+%Wmr~BmU2=UwHwJH?G zb?tjUSa&9}^xR*~wKq&kBVX=(8^?UdTP6A0lGIgaa~`A~3vTn2G$m>}rP2L4GHonb zFJ~7F(_?pKpD}sj678&M+F#@7m@n6n%Nn8+8O=h`J~Ag4!m@9P+>X*G{gVS*ebVSY zT3!o+9-3X%`)u*uraaAxt2!Rc-8?JdK4}|xPD$f(+e_{_k^G2=C!gY8d{FDyGB}?( zBZy5fl3kr2e}nhDqS<_J1}UnOp4TwAd?;B#{)tIt;&AEhCmZJb6Z`5l*d{I)PWt07 z)i`h2SYYaR-@>g%MOynDXV9S~tzuh^$4YZvy9HHjO*#1F)3V*MrI~eCJ4qbe8(;d0H#lNUbRpfEQdn~^@SkyUW}OeSL?W6Pcd-_+H4+N@{U?zyR%`eTU0QwSA0B*q9%b?)7RP{T>*X$*iWwzf40-1?6@NH!asOxno6Lky`^k^;Wz*b#^j(?z+p=-T%dkfVCcNp( zHtUq6XfGKb;JL>BWGb%td&U*xcB|AgA+KMqKf7kF(Bn-_3*T0DiFUqJJ#qQ2hyGfnE9j;lT z9H8{$hT+O<;RX#GH4l5<)mGRmd+fbkmVNz~ooW}0ewe=RnfAQ-Ay7!HzNcaQyWra3 zUYB-%gVr%CTQ9NwXVd1^Ix1%TI2Bf1KBf9&No)1DwuPl87_aRujZ(D>XO=YRj}^{} zEQIO1`f4UHZdY@NZLRxswdB*jt938mWuHFC7er+L$Tq^AcA_<7vGw|P+q)NCEt2wG z8wx%-^LF4h)Z93K;1?f6$FEZ=wKQtPiFen?tgg3W@ZRT8pf_h3FQaYBTHz$2oIEFe zI$dF{W8k3??!5<}WIs!@BT-L%Fc1rmDx8ltWj$VNn*FeqZw)qVNHLsvBTw@1aqRHn zZclb+`iR#97p@DTrc3L4nwAGA^U1GD9PY1|OrF%J{u-sw=IFLeh;ORM@06QEAq*)*6UFh%8r^&H>J!qd9_-r%eq9}j;Z_3SHp)-qRTAwkK{P4 zkn*89#kTreRURUDXh>Ri(9k_~`T3%gwKiU3HLe%$T9yeH#?}rE=c-fI?z8 zS?{js)0R&a;(PBX2?cC_6=~FRqusmyLs=%fYI$&l#YBctxcXL%U&Ge*a&sc?U1^+) z2e-rwcehs0hX}f#32Dw1m>SwUwZU?^BTM9!lvB+Y8|5cI1gac(R2>o4rWMygyu4rH zyoLZv)XuwTQAx8e4!);IF%Wl5NK?;l_DR&H{+y{y#Z;|0S~bJqN+k6e1Y1jL73M?Z~B z*ySl5-h1`RO(Bht$bP{w?&IdB<}E4J^JH zr>{E4y+Yv{HnS$(^iJ6_^+bZPVgO%5wzi6N-+sTau!GMGlQFF7=Zw~z@i^Ind0040 zxi5IE<}$U{jgzC_QOK%;hSV7hfN+DSK=CYcKuS z$n#-xp*v&l$@;6k-lUkF#^yrzj^THE`rP^)Q+4vnN3AzyR+G*{ZiFj65HnsxgouPBvE!6N=Uk!$=J`z`thcGmR< zmg&dNCzkF|IzO6{ZlmbxcnNR$`5QH-k)JxS?>&ZlHh;IoQQ1!eE1RS4m_K#C!RL^8 z;L;5)id<#!Vm867=cF5v?Qy*OR$pa{0%d>QttDluslL=N<3SOtURpfD0yX2?0 zC8Nhnql4tKgba&JgS~g+lZa$%o!YUs=!?o@7-P3^u6g_I%LlKu)d%-Kkqnr)Y`s*? z`ALq&w)9LN`O+PMDU}a)pVHN}vBGVd?kX0dT@tT6YwqxAsPWW5Q}pYt4Qop% z^-?vCSH8?{x@5OeV2@i>h`o#6b6Q}!&9SS#48f31LQ|ieB3+Dk)SWzVS?WyZTjf|W z#imgWSNC*@yvOFcIX60b+*FE8X?-5$^wW0HDj|kDP5f_vdA)vU&E6AJJ1h=T6w3RI zx_+cj3w(B4D7Z=QuIUKuc+naA^=7nT)9x&1?hp6IlDBv3KQ24(KVj=qGPrSNtP;O~ z(_rer7FCazt%Qs{Q6ouZOoKbY8N57sr~vif9p#$X2?!J3seJv_`wdp3ZmK zbZ5RYqwjH&Lsg0c(IJM`1v$@MZs8g2_82~YBfmpB50Bl_@;5Ot`Kkxav>9%;iiy!+y`+DW z7F8=>F&nVY*SaG9jxKBcj<9!n6Ld}E`52$B&ArduO|};WN#limc1R; z5&ZPxjbd{HpU(`we6pFpVRx40zwG+ZjfReUkRpAXRJw_P%aP~VjGAT7ckWHT*4%nJ zck}7F%T1e%b5-;#1gm!`X5%q#M_>0|%X=%E6!LN9xpteZ%hlx;A!d)dGAz#}SIfkv z8i;JI)BU_mnU9lpMJ%dX;G5t6;!3P6VZBp*L4Syd6~@Z&{H9x^YbzSu0}`^fEeUB# z>smehsF5C3IOZp8@}wjBh)9Ud!py@ktxnBXKl0~WI;jKXss>jiiNcX#{U?sBk~&+SU~cz8sJeaNgnU`P&J17Kw^Oa<b19-49*wb;I4wDu&iykdZ-1)L$|~krSAK`iB`46olCDYc+r0Z&e%aTG+8SDD zYt~+O6Njrfdc2;jR{zThHiFixgLz)0zKpO{JBK?))>S!6D-cz#+ic`1>bi%;koB`q zJ=4|2tu)+WQ>3SQ_vxc~Q_m;YS_w}(=PJCV@nlCfifQG;P}=_0&pfdl2YR;DKeQGk zZy#9M*A(kx6=~&$vy==NlV5#N);5g)0TB6>$l527;bNbr~i1 zUeHBiGQ#*yjc%n>31)s(KO2@i($SHd+tD$S8x}S)!sZ+p|H?3N@OIA16g~}UK9$iy zm6{eJi*A`IFJI`khmN9WevG&$+~ZfVjA*zvm&V|7)V>!`FiM1W~J*t*d_OMT2 z(M^&A>S0(oj7i-Fs`a>>KDL^9_V z0wd{F7fAiQJg4%Ob6}8mG~QKg`(93y(e9GrnfdFvs!A zbqimyTiPdt#5#Q&zufP2muY3o!5`7k{65|za^QQL!N|i*fg*5=Z#%6yDf)$RK9TLo z=!TjZ=szmoUpkge?T&NzC|7-Ke}7QGv_kgo; zs7%CTdP+)}wOEnA-ST*2_o~^TqSB6b{Y|~ghOJ$m+pLPLTj1|{)@^o=xZ|;4b1~QR zXsW@OUSiF$Jvzhgq}SgYZ1loDDQ4{ymj&X@M({Up8$S)sLr98?(d&f zZjKl~wmx=$7GnfiH@-qY4qy6?(LjV2NvJ3q48d1~za#=6*>1+fx4R{r4K9p=!^ zh;8AJT8b;V)xyECo^Ik$rWvmF_=atsx6y6O06qgNE7x5$1IPCV^Ir{KALYGyI$!jG zu(ULX4X2*<17WRV*W9J64)5BPenz-tcagVJrM0(er%G|>2S@kn!x~?vu52hSA*9g1 z9DA?lc_sNhZP2%B=DYG}oXn@s9A{-huLLc1`%+BjR>GXUFz0iDL0=x+oEx6Y%J*`^ z65VfC<_Hh3=-L%N=}dBLKXy7;hEiGCOi-Y0Bx#V1MyATLqt5k>Jl~i?mOHciP3Afo zqagmL)Lpix&sXzrVwKaWjmp{^l}tWUYqYdj$jNAF262~j*oOJ>9QAVo=bl~7FqN;) za@=+Ev^0mx4uQl~DM}Oi^q7J3!tyaI3|0u}%51ADbsQI<%hAH%h~hDGxFALV7R#l2ds0-t4x^ zRVU_8ziEyo5i;xpzvfQH4PD#*x<~5sr#60Sf7<2zq04&T>z74wmp#0DKx5ZU_Fe-$ z)6#sAth7^Fyvpf(IXADyv$87cL@t=^!?APkbn#F()&9_5EQ!sxSJWxuKCATz!;!DN znk6s8D0-jV=Xa-RAvd$In{f2KtGMo3Tw~!o-V|VY*n4k}sAuHx(UuQ|ArBe7)Wz+| ziAxIYs!ncwL_H%WVo{tfz*cpNF!GYc;%e9FnPHx@c6)d_f-LO_<+((kfqak&Eaik|o^V$98b)^;YW2Et}U9e9P8s%W_64KQXObMk_n-V^VgjemcJ8mHMLAp?Q+X z!Wy-2E+U619nNaKNb^`G@+6!_D<=C&YXd@gI`Bt=?5o|gtIAH*#|S|Y)7hn z4&L{QCwTFC#oX5!=FIEymA+iB?lSV$uUu4_Y_ZR9DAS{Zx>ifE;*$TeQ1+`kB%*_) z9JikEmBKj|e=NDUPwcf-#*m81#lp4oHg>yKQ*Y%ZB9r%kxD&q z>hrkQsNKg$XH`$g$sc)))2eU7%6+6Kyno{+V!g`3K2y9dYw362nwc>krG4{UL40j< z&Dt_r&%#&QN|LMH%2CoXVqqsXh+nzRg-%^~ zK>u-p)5J_-NJ;m4$fcWyKFvJn8{6FR^1@n-#gbhsulw+JUtC#0^1RAxgnz$qUQTlV z{Hw6wK@~=+=2)$~CGYj-o(E@7)W#d^xHP$jH>_;>@lfoT(AnBMw&pR*wbe%V$UIG_ zv7|iVliEx$UNC6dV%E2*)==DLYmLL=Vft3F_5QCECn|b1TV~jf*ce5yrwI?YVGhh? zRpz_9Q@S*dE>leFpEhaSvC6X{`~VsVwz{$wy0h(##i~ldda28Yns&W9xm;rdHX-b7N_KkFQjwanVPt? zjIO>q{l=Xe*RBLfJ6w3++p4=S*Fq82vz z%z6G>FV*A(DUf68$k3AJplXf7xS3pU^2K(JAD`E?FI?WxAd|nZU~vZd-q_XVfaR`p_;YlNitd#Wp|wF^>~q{r`%^OJaX=NVlWRx3#?8}ti6Sa z{b;0W>Q(X5ASmSy$%J9T;M4Q+8~Jk8%4g;~Ek(I~^Nli7GwWsgX_K21YG2Kn3U6>$ z)ZY<9H+0nzaugH$roAnlb9mG^W?;49u*&s!w&iCxmWXf9ow^=A>BShIeIJp#Po^{f zYN**xHZNt<;l+~Az2a|DX``MI6OBU8oTo%y38rhjd!9A^qy4!5waIB}TeP`oL--rV zD!t%NOJQt7PjpIxd)dyoT1#DB;lRDeoW*0tDYS{PMRl;of*?N zKgTXhGNH%lq@U+?v*Y}Pu@zkKJ<#td&GXK-Mr>w}FC|nW_Vw|M04|ND5e2n#RtEyL zdxdyTPKAB8&e8tv9QVbxBt^0Gn#T1`;fcqptbW6X?r+>dV!zq#nKzzaoK6|py^!ih zDXN|$-6@xr(AQ|F3D;jJ+Hur>*rDXULhC?nd%PI8c zCHNn>82U`y;KA`B>w&2L&GngiW}@e>`b%GxZ#7jLD$6eruqk=BRoTT zP$>J_?WJ}ft=v;6@%0+o32y`|mR1Dw@EF&EFQC5n<;grYZO=EhZ`-FzTa^tBl|u^R zACjbKH`XkfpQRia|gE+4{vfu;oG(J{RO%w$+6FW$orDj4{fOv8~3%fV&%7*(Rm*v;5zZ0 zp>yR&h&G*HS#rO&YS6vvuf7`sk7P6zNvwZs){4{BsZO3cl@{L-;b$b+GM4|1DzINB^l$AUl>OG&o#ViCnWu)GZ4T*7Nx$R&avZT`F!M>K^ zxC;$WP0oJ(kiuJJCY0#9cdx?vWqBv})%Gb^J)Ax&t6#*W@2C@+k#YRBYQ`1IhbJZ; zpIAB}Vc&bT&Q$LjkyK#T+3$w;$v4@O-!j{!#X@sVlFj$C*g{V_qxvK`?AEzG!e90X zf7+8jJ6Y|&VS4hWX=`hjaA#-Y^NtI~d97HB_o59ooLO%l?q502!crncIV8W%J>Zg0 z4SDSBqg?%o#BWRG4%#H@-rnCXLO_kK{FcLu{uf`$ zcPrm};dkr9MEQQ*x#e`K+;hxr?%<-Ayq9fGR8{lz%{9H2WM^GmqE^7xQt#(1yI&}6 z^TvnZi{a!hU#K9w6MDJDpMZ%Z9GS|BJ!AGx*{)W=ru?0T_>ktH)~2|-7cFn9jS+e8 z>ki+ZS($n?Y&89J-?Au-WpfsHVo&Jii4!`kOXC|>U^Hz4CPQcXEa|gpAHAkmsl9Bs zp5RQicN*Wag@@Fi*7&|-C#&8fy84-_9ZHuhJxE^s+?zpoHg>-1@U!!%|8CtIw60Hq~+a8qb=^Fa16tut%d(eJ1o{=4Abf znc}0*`*iVhYJS;Ymaf}L$GwQKKeXpl%z=70>T>rjljD|mGrwhQqlawD(&1BoqU920 zBW0!3^6F%Zf)_XaM5_FOHv1N7-=Uag2?Wbv^Ndo*5JB^D5lpX=x%ii%z*vGbi}x*4 z0pUvmoKtm2eECOp4*A}e(nzQ(jLK;$T)ue5HpG5_52u3=W9Z~H)3zhI|q zBaJ9{z$S3*xa-M+G(!y@si&0VQh`Br;(~+s$#wUQIKm}XDhgix65ATPY+hj?A@I!j zg`OYV{R8V4rR?Hu?%txvye?)tZ@T^wf6;mW-dQi7OW*ZF-Vnl^b?e8s)r&44*X-Kq zZpq+V;E(`!X(%Ns3mn@y=%%aQi`F@;?oL|rTtC@-4WV2;+%IoK-YR#60-4_Jt5)Ul zt}C&7m{NJlRZB$2#^J@@(gPQ~MT9Lv#6s37ZrjYWIkIz`Ro*m_e8iw{s}<(6URBRz zd#`)Qheq%h?R%!fViL{a#pw4d?@zptGGt}nMKsKL-E|~7mbaqS{7O1Kaqs4)LY|ji z^iWOQ@&}?ED}r2veaXw-8f?+Laweln4@az2T`Ozto_}e=(^L6U>G&kEz4=0|v$@a* z1OMI@+txCJ9k*_6c&4qvMQS{LZWeDph!kp3ux z;MDn{(EFP0nT&PT1;QWS@T$_!^_(sFkgcJpy1x9GMoxKi`=`_2`-7~$O`mPz%JE6_JDTh6 zb$yHU%-nnSt?3ya?JIP5PIF`~EU9c>F*+~7w?C=K+G_3g6=u}C_(u)aj=kk(F)Iqn zE{!a&Y4F)(bTUpY6~`C>9)*0w+9>p{d0nI7W-1OMrA2xZ_O{F!r(%Uca+|OquhrK+e3RGxgt=178=k53lW`g+OmM!~px)|JzB?vf zi0R$=%>VR|$%`GIzVWv_^6=xg4lX=OrdytVpDFU>LHV%gBl4EdUlj94FLan$5aiiR z?yH9%qKEdz3o2Jni>&etkTehI;9C=6c)uw4Vcr$5Rqo^Is~LB?4F{z*KW^s1zkENZ z7bnp3qD3%_|D~i_MTmWRgzU^ZL6eE1<6pgn!@u_pM`qkEa*x^F79yznEw1yqB#pY9 z-v2c!s(>p;AjACK;Zb_|_R446Utg|k`f$PPHAc}%7ZYSNE{X4TYN+e#JjHUURQIxG z-ObUu$8{#-C0|r#d012Da|>-S5dkvo=IhVr_M9(a#Y<=Q9ld#UwaWdzrIQub-t?`AlR-R zyxmjTY;AH>#xO{N+TuuYjR-RBE#Gs(DZAv_vtIkj3tD^(rxz8Ddan{Unb&+-UdnY( zQIFnxt1cne?83;$!=(jA*WH~*Z@GWLR@jNNepzgo8{}ET_sP{vM55_PgKK}s{8_;| zTIysPsmPV>2AwpT&iV-rb(` zveG>6YF3N0f(OIfU;T^9Qq54x*fyWL@Jn3Tp>=tg(JvYL?X#DRZ;p+3oT6)Vful_(LvU&evlFEFyU5D28id6$I zZT8IvymLQLexaj~wfMoj!2XKq&`TTqB*{%X_-a$4D~d9uj2@EO?hl0QanTI^C~j0o znO***vha=lTh>{Y=m*O8`pIABzF)tc`pEOq%e|e&yB0Zf>A^+$4=$LV`H*#|e@O<* z=f){EzT}a#c9%?^iP_Y5n`HgN<5Mn~CMfl$i^=Q~*nIlwmZP^8{lKwe>$@|>tJ59v znGP>o&P59s;MO$`uUaSnIJ7cv`{4BlqK3H`FBt<4-r|vmsh*_p@VL97^pK22RuPuGn4O2WjVtDelbiQ3%poVwL#}p5UBSNsvXhUEtDV~+I}Aej z`2d5ojZ=o()8??#A@Gi^jc3W>ZJcHN;{F&n%pr^g#t?HHphUDG9OQ#DK4Cz<7AO zd)Xbfb@g;|aP-31cwy|FeC$dZ_j2kl{jDxhE6#A%pG+CKR-EEXw=wFiI3;K9z z$yo3!m6-mJh9@GM_b-i%BT%q7h=wKM$*AY>G!pnA7t_07F*N91BH%%#AQvT(kg`nYZ6z~mBOiX~T$%ttq zKfhH;#$hR_6*Fu?I0co#f=FZt0-+%u^DhLEOe2#RuWUF4=`cDLOT?2<`ovM_gs1zd8Lf8Qu4MYz{0-_9f;ebDl0vRUQC@M1s!h!~DlbIKQrQ)EiLuf>p z227gpe}(^51_DTcl!3*8&4qRb0i;0!0vb>yBn$;hz(VgLc>lNl-?jz30LX&U8Ujd# zG)bfpusE1T!4hGOBY3de0UEFqNI-x`qN7v@gobGpEEx_i2p|yx#NvQOzyi_;IFx1p zjr2=f^xt*@mO-JR)KA6ZnQRAW3s1sQA+-X{;8B_ZG$Jev1?(|151@Y#d$5oPVewQ7 z0sNLJ5yQ9BLlyK{TQSGGCK8w zTmj($J0ihRoJgk;03T+li4+|9S9ttm{m7QkAV4H-!2$v%R4inK2o1&qJbs4ipZfp3 zPY59VAfVAueoQ0KaA+nV>!B7xqd+tSkNnqW=s(LR5Jd5?&jP7wG-yAGKomTr1@I~k z-gg8KHbStO1OjCJL>irlg(U<`Pyq>%4-TUUAS$Skh$PsJ0UjRBm;>CX#LL-9RL(xco-R}Qh2YAq_uyG-P@Jg^`8W#DjgAfxEtSzt*GTJ^s+WzD3 z|7VQg{ofVA`hTk*I4t#7iS~yE0RJNq5mCh`cnSvxE(8yyK?-Qk{#rlR&;18w8xi(n zP__{WaOA>*{0_Mjcn(WNYlaFNCRhmg$QGnQ3V}d}Lo1d-K_w1Q2~&PrE7Km6K*ECn zK}JQ@;uHe7H^clKg7-_9f9gMw^3m!i;n1ri;c<`_fcinZ0y6=`e=Pl{@z8J}-v0X> z*nc98M1adHghqxf7}-yVF%|&As>T9;M@L8C$B=-42a%=*r9~oz2pXk-B?NLK0R&Pt zmPREJ7&dN51rLP`fJ;J`kVKT}AQ13wf&Q2JA9!Rq+yEYwU%l<$9R#uysE{xSAl%}B z=!%2w9RQ-+1VBS2Q3{d79NG7P0v-Uuc?)EDRO1YofaZZ&xd;tz;J`wV_UI^3E*wpO z;J`Fs2v8P4dq$*zS_ZwhsLln!qd?DrLWcUw`2JBY$eO793TUW`0=O^SksyF@KMuMA zlzRZ7@ytU1>=ns)3Ipc>lmWXZf&oW89Oz%*+7aNQo&z*6oq!ZcA%WD(OhfQ~x%OXW zfZCCYPTOQ)yUZ^GCg=)@0^9@IEr17xZ_Mw4!3&ky?0?1zG6^ zz%)=Sqs@uTlp{a{06Zu-I^g{+L2n5wjq;~S`^P>3Alx$INF*GbDu^^thNH4KC}?3} zK>9^FHNayYQ2=MffdGeRqff2x+D3Ber6)2?xbM4;RTmr zptwSnZ~*o{YC_6?)PxkuFE{$Tg9sqp^@8^CKYW|=A1xd8KUy{l4bBk=9`hz3J4gj{ z1K8ofd=##Rh=2zB2ay8isE`jJcyMUNfhhk^L;ABH1$cM@9eNodqN-pDl>k?_2q5ej zIM8pvwIjeI5Ks<8CH$@v|Abqx5+dx)2q0X~AZPECPr! zE*c2nXsOX@7F3r+SQub$aB+(R<7Rj^1R6k~8`NkH%&8#j2dhJkUce~>7~M0+B|I1f zqnUv67Zq+m!TFo^do%}_P*6FV0>ant2Y-$5K#_$iEbvIB0)+>FM}y-bLi;ll{Dnsc zDXT+JcovbyKTS&m8tLm4@7(5f8ghLcMJx>zbpPfG$IYu zAMhRn8afYyJ%$8C@L(eZ(~5s4FZ+HC2|!3;4h%?;1VImG4B{3X0}wzs599G*L_lUd z4d7f)r_l&-90J>gg;OH(3Y;|Xpy5YlA*3vVOb>_(j#QY<5%Bn#;(u!RkAeXp91f6U zG`P?LfFyKG1U(FFW>hRl4a|%YJo4Y_@c+X%aOg;ecLFd$?HEEM{C)ZVfszVFyHK1& z@L;Wi!4|r5qJe@9)!)%*z(|>;2I>M`F*6MTgdGMLVivYs&5j+Xhc92>TK-f_c8mhFT;;{clgP;440K(o2XyC*TB{e8$&@>uqOTc&= z-V%TZ7ro%vk`87)C_vPx0jvZMs}KyaKx$xq7XX5^4$;6p1b90E9^wDbf%X4ZKOhoO ztvNV}hw~ojI8i5k;4qx}AKC)tF|#m$2bj40LqqfrRsvd_e~5sF05Uy@&_MKqeH#Fh zVWANk$~~z#w9o(#TmgU>15x0l2>`(`oB26}1{)j^3k06J z51#NqB3Pd!EEof!ds)VWFxCZuq0Emh(AnpH$W>6g+;6cREAr%s-;7}Rf z5&+0NS_N(n{)ST;03@L!0*-{vECjHU|7-P6C5!;VM{VE`9UQo$)K5nH5vWz5hyWIX z96};H@y8VqJSf>~V+lCm=}>F~D**?&%r7G}IHm$7WFi9>irDeL(FgDZ=kR#=b`OB~ zJ^lM56GHo~jNcIxz*6Dq4}u3zEJ4!`reHtC{A8^~(Dg7shXBHv zjerN$FZ3MXfn#3qPdf&c4`e#vd#C^0NBF%u00>6M5M$8d!&3;r1P`AKAv8ETA>VCH z0PAPoYCITCz}pY37%rs%AdryxU4#ZZ8eoF5ZQuZu-CaCTn0fYyqApQ{k!;Vm$0^kegDR4&z z#uRWPgaE>h2CiSAu0H`lP~S4G4p|(ky#ymAkl%kj_q(G5fZ$A!`DHM@M2!{^Ky<1C zSB)S$0!%RHIQF#-LYOoYWV+7}VXMlq`BL%OZxQ!s7y-NkPqx9S25R7h;K5M`(9mNy<^YP+0R%8VXMP#b zP+<%(`FZJ=X(0d)u9`sL0Q(5xsR2d9BNV^{H?0O3)?Yy<;JBZzLn@i+}fiKO_g&kC=ra z0>D3s^4A0sTsr_Q3iERS4^%n-(tcKTK;tkV(vCq12?0dSaKXiBcy)jYxTE?n6D0B> z8Jd{}?zB)SsO|&+!aW)|1_VlEei=FRgDo4Op$lzLdqeRW!TU}7Q`Lbo1r=WbAP$xq zp`orvftfID?Fb&~InYZ$8bqo(@PPo7x=5f9}U5Wyihqe>& z1@RMA)ghO#AjSZY*=Udm(fNK#TT|zGdCaBX2ga&u7U`xPF5lCCeH5w>>5Q$*ofz}q% zS}<2DfC;#U0|C;|){g+fNsb7@2fSi{hq@Gi(EhsTuWAL{pgML2ee|)h@;B_KqJ$k6@v%C=n!TM?vXM{jR*tE zVc0AH4dv2ch>nU^fc86V{K+*WaBCmc(ST1mpwcy%Km1Nqzbhdyr~~~5BsA#mQFx#k zhuUP2Yk;C*V@7DG!3?-U2bTmOkb{F=h%tB>)kz_Muz+9?g8H}yP%5}i4grGu^e7b~ zclqIMB7y&kxqg{tTg8k{siNJQl% z@Nq5BPs1w)X&sIw;2}Jm3_(N$B`~BdKtmZYIIKX;h5-%KuTZW5c8O|GK{`W4UU1p$ zPrCl|ffsbW3F03frB&pJ|4-!om21GwcJMh2cqJfK!21bK6XA>PpeQB5TLSKHqHf9q z8W^82^B_BcfgIdIg0TcNuLq-5V83uT251ymK#+Yv-3>888Xq!41N=fKO+noiK7&bu tdo(+hSigmvRVZvgQTB6bXmB0#vhnot^R%<)0y_r^L@rrb9pi0W{{ux{ZQuX^ diff --git a/doc/footer.html b/doc/footer.html index a1895ac8..26e16910 100644 --- a/doc/footer.html +++ b/doc/footer.html @@ -1,10 +1,10 @@


-Code by
Tom
+Code by Tom
Docs using doxygen diff --git a/makefile b/makefile index fed72b3d..50106a81 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ # Modified by Clay Culver # The version -VERSION=1.10 +VERSION=1.11 # Compiler and Linker Names #CC=gcc @@ -128,8 +128,8 @@ src/mac/omac/omac_memory_multi.o src/mac/omac/omac_process.o src/mac/omac/omac_t src/mac/pelican/pelican.o src/mac/pelican/pelican_memory.o src/mac/pelican/pelican_test.o \ src/mac/pmac/pmac_done.o src/mac/pmac/pmac_file.o src/mac/pmac/pmac_init.o src/mac/pmac/pmac_memory.o \ src/mac/pmac/pmac_memory_multi.o src/mac/pmac/pmac_ntz.o src/mac/pmac/pmac_process.o \ -src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/ltm_desc.o src/math/multi.o \ -src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ +src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/gmp_desc.o src/math/ltm_desc.o \ +src/math/multi.o src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ src/misc/base64/base64_encode.o src/misc/burn_stack.o src/misc/crypt/crypt.o \ src/misc/crypt/crypt_argchk.o src/misc/crypt/crypt_cipher_descriptor.o \ src/misc/crypt/crypt_cipher_is_valid.o src/misc/crypt/crypt_find_cipher.o \ @@ -257,16 +257,16 @@ small: library $(SMALLOBJECTS) $(CC) $(SMALLOBJECTS) $(LIBNAME) $(EXTRALIBS) -o $(SMALL) $(WARN) tv_gen: library $(TVS) - $(CC) $(TVS) $(LIBNAME) $(EXTRALIBS) -o $(TV) + $(CC) $(LDFLAGS) $(TVS) $(LIBNAME) $(EXTRALIBS) -o $(TV) multi: library $(MULTIS) $(CC) $(MULTIS) $(LIBNAME) $(EXTRALIBS) -o $(MULTI) timing: library testprof/$(LIBTEST) $(TIMINGS) - $(CC) $(TIMINGS) testprof/$(LIBTEST) $(LIBNAME) $(EXTRALIBS) -o $(TIMING) + $(CC) $(LDFLAGS) $(TIMINGS) testprof/$(LIBTEST) $(LIBNAME) $(EXTRALIBS) -o $(TIMING) test: library testprof/$(LIBTEST) $(TESTS) - $(CC) $(TESTS) testprof/$(LIBTEST) $(LIBNAME) $(EXTRALIBS) -o $(TEST) + $(CC) $(LDFLAGS) $(TESTS) testprof/$(LIBTEST) $(LIBNAME) $(EXTRALIBS) -o $(TEST) #This rule installs the library and the header files. This must be run #as root in order to have a high enough permission to write to the correct @@ -364,5 +364,5 @@ zipup: no_oops docs # $Source: /cvs/libtom/libtomcrypt/makefile,v $ -# $Revision: 1.116 $ -# $Date: 2006/01/29 15:53:38 $ +# $Revision: 1.119 $ +# $Date: 2006/03/22 20:48:57 $ diff --git a/makefile.icc b/makefile.icc index f8c415b4..54216039 100644 --- a/makefile.icc +++ b/makefile.icc @@ -24,6 +24,11 @@ CC=icc # Compilation flags. Note the += does not write over the user's CFLAGS! CFLAGS += -c -Isrc/headers/ -Itestprof/ -DINTEL_CC -DLTC_SOURCE +#ICC v9 doesn't support LTC_FAST for things like Pelican MAC +#Despite the fact I can't see what's wrong with my code +#Oh well +CFLAGS += -DLTC_NO_FAST + #The default rule for make builds the libtomcrypt library. default:library @@ -115,8 +120,8 @@ src/mac/omac/omac_memory_multi.o src/mac/omac/omac_process.o src/mac/omac/omac_t src/mac/pelican/pelican.o src/mac/pelican/pelican_memory.o src/mac/pelican/pelican_test.o \ src/mac/pmac/pmac_done.o src/mac/pmac/pmac_file.o src/mac/pmac/pmac_init.o src/mac/pmac/pmac_memory.o \ src/mac/pmac/pmac_memory_multi.o src/mac/pmac/pmac_ntz.o src/mac/pmac/pmac_process.o \ -src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/ltm_desc.o src/math/multi.o \ -src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ +src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/gmp_desc.o src/math/ltm_desc.o \ +src/math/multi.o src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ src/misc/base64/base64_encode.o src/misc/burn_stack.o src/misc/crypt/crypt.o \ src/misc/crypt/crypt_argchk.o src/misc/crypt/crypt_cipher_descriptor.o \ src/misc/crypt/crypt_cipher_is_valid.o src/misc/crypt/crypt_find_cipher.o \ @@ -269,6 +274,6 @@ install: library install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) # $Source: /cvs/libtom/libtomcrypt/makefile.icc,v $ -# $Revision: 1.50 $ -# $Date: 2006/01/29 15:53:38 $ +# $Revision: 1.53 $ +# $Date: 2006/04/02 13:23:20 $ diff --git a/makefile.msvc b/makefile.msvc index 0bfcc97d..0710b842 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -30,8 +30,8 @@ src/mac/omac/omac_memory_multi.obj src/mac/omac/omac_process.obj src/mac/omac/om src/mac/pelican/pelican.obj src/mac/pelican/pelican_memory.obj src/mac/pelican/pelican_test.obj \ src/mac/pmac/pmac_done.obj src/mac/pmac/pmac_file.obj src/mac/pmac/pmac_init.obj src/mac/pmac/pmac_memory.obj \ src/mac/pmac/pmac_memory_multi.obj src/mac/pmac/pmac_ntz.obj src/mac/pmac/pmac_process.obj \ -src/mac/pmac/pmac_shift_xor.obj src/mac/pmac/pmac_test.obj src/math/ltm_desc.obj src/math/multi.obj \ -src/math/rand_prime.obj src/math/tfm_desc.obj src/misc/base64/base64_decode.obj \ +src/mac/pmac/pmac_shift_xor.obj src/mac/pmac/pmac_test.obj src/math/gmp_desc.obj src/math/ltm_desc.obj \ +src/math/multi.obj src/math/rand_prime.obj src/math/tfm_desc.obj src/misc/base64/base64_decode.obj \ src/misc/base64/base64_encode.obj src/misc/burn_stack.obj src/misc/crypt/crypt.obj \ src/misc/crypt/crypt_argchk.obj src/misc/crypt/crypt_cipher_descriptor.obj \ src/misc/crypt/crypt_cipher_is_valid.obj src/misc/crypt/crypt_find_cipher.obj \ @@ -132,5 +132,5 @@ timing: demos/timing.c library cl $(CFLAGS) demos/timing.c testprof/tomcrypt_prof.lib tomcrypt.lib advapi32.lib $(EXTRALIBS) # $Source: /cvs/libtom/libtomcrypt/makefile.msvc,v $ -# $Revision: 1.30 $ -# $Date: 2006/01/29 15:53:38 $ +# $Revision: 1.31 $ +# $Date: 2006/03/18 03:48:32 $ diff --git a/makefile.shared b/makefile.shared index 0fb64d37..d80241d8 100644 --- a/makefile.shared +++ b/makefile.shared @@ -6,10 +6,10 @@ # Tom St Denis # The version -VERSION=0:110 +VERSION=0:111 # Compiler and Linker Names -CC=libtool --mode=compile gcc +CC=libtool --mode=compile --tag=CC gcc # ranlib tools ifndef RANLIB @@ -20,8 +20,11 @@ endif CFLAGS += -c -I./src/headers/ -Wall -Wsign-compare -W -Wshadow -DLTC_SOURCE # additional warnings (newer GCC 3.4 and higher) -#CFLAGS += -Wsystem-headers -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wmissing-prototypes \ -# -Wmissing-declarations -Wpointer-arith +ifdef GCC_34 +CFLAGS += -Wsystem-headers -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wmissing-prototypes \ + -Wmissing-declarations -Wpointer-arith +endif + ifndef IGNORE_SPEED @@ -122,8 +125,8 @@ src/mac/omac/omac_memory_multi.o src/mac/omac/omac_process.o src/mac/omac/omac_t src/mac/pelican/pelican.o src/mac/pelican/pelican_memory.o src/mac/pelican/pelican_test.o \ src/mac/pmac/pmac_done.o src/mac/pmac/pmac_file.o src/mac/pmac/pmac_init.o src/mac/pmac/pmac_memory.o \ src/mac/pmac/pmac_memory_multi.o src/mac/pmac/pmac_ntz.o src/mac/pmac/pmac_process.o \ -src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/ltm_desc.o src/math/multi.o \ -src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ +src/mac/pmac/pmac_shift_xor.o src/mac/pmac/pmac_test.o src/math/gmp_desc.o src/math/ltm_desc.o \ +src/math/multi.o src/math/rand_prime.o src/math/tfm_desc.o src/misc/base64/base64_decode.o \ src/misc/base64/base64_encode.o src/misc/burn_stack.o src/misc/crypt/crypt.o \ src/misc/crypt/crypt_argchk.o src/misc/crypt/crypt_cipher_descriptor.o \ src/misc/crypt/crypt_cipher_is_valid.o src/misc/crypt/crypt_find_cipher.o \ @@ -233,8 +236,9 @@ $(LIBNAME): $(OBJECTS) testprof/$(LIBTEST) libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]lo" | grep "src/" | xargs` $(EXTRALIBS) -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) install: $(LIBNAME) - cd testprof ; CFLAGS="$(CFLAGS)" GROUP=$(GROUP) USER=$(USER) VERSION=$(VERSION) LIBPATH=$(LIBPATH) LIBTEST=$(LIBTEST) LIBTEST_S=$(LIBTEST_S) make -f makefile.shared install - libtool --silent --mode=install install -c libtomcrypt.la $(LIBPATH)/libtomcrypt.la + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) + cd testprof ; CFLAGS="$(CFLAGS)" GROUP=$(GROUP) USER=$(USER) VERSION=$(VERSION) LIBPATH=$(LIBPATH) LIBTEST=$(LIBTEST) LIBTEST_S=$(LIBTEST_S) DESTDIR=$(DESTDIR) make -f makefile.shared install + libtool --silent --mode=install install -c libtomcrypt.la $(DESTDIR)$(LIBPATH)/libtomcrypt.la install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) @@ -258,5 +262,5 @@ timing: library testprof/$(LIBTEST) $(TIMINGS) gcc -o $(TIMING) $(TIMINGS) -ltomcrypt_prof -ltomcrypt $(EXTRALIBS) # $Source: /cvs/libtom/libtomcrypt/makefile.shared,v $ -# $Revision: 1.45 $ -# $Date: 2006/01/29 15:53:38 $ +# $Revision: 1.51 $ +# $Date: 2006/03/31 05:46:53 $ diff --git a/notes/lrw_tv.txt b/notes/lrw_tv.txt new file mode 100644 index 00000000..24532502 --- /dev/null +++ b/notes/lrw_tv.txt @@ -0,0 +1,126 @@ +16:931b40b97cd1d1338d4a4abdf96d1f45 +16:000102030405060708090a0b0c0d0e0f +32:85e82fe5e8b426cf04bd96d9aed318fb5dae89a1dfb854a09f556b61c5ac918b +32:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +48:dd7aad6c6d10176e25eb97e165ba612a2b6275d97667102f20af20ec2630c7ccb4f5772a3e009948f1ea91f3bbaf7e04 +48:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f +64:338509ed021eecd249cb15cdd440a84ff9d6704b99e8e52e9d057f152b742a5e3b9c314574026c76fc887fb404a12d669eea9460c1fa08e1867c2c0274408b9e +64:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +80:8a9cbff36874de7da3e20e9a26691eef944ff78a72341515ae20c2199688ff92f039a19dc6d517e017ef36647834debee90bf80ba20a7caf24964bcb0bb3a621f8203ce5428461d3ee72ead7aeb201a9 +80:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f +96:06eb66a88b9667296b8644cda3464a27e3e2d8b6b3d0a9ffbebfd48f3967952ce161d8867900b0a7a44638a6e41b9a9dc53bf183a85a4ee33bb6f6c2d64b8cb54bfbb8625ff5cd3965aa08b460737b575da0b8f4123751cf8f0ae801c5856712 +96:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f +112:7af5a2b1381a8bc5aa2bdd4370b88d680c34ba9332d1d9f6e203c4d9fdbf5ece39fe5afb5871490a180c4b102665823dabe1079656f24969bf84267d3264f92cbbc610f26203536d387333938d1a52f4076df1aa0a114f3b0182da12c3a5d87bdc8eff54f80b0d56f7044ba372ee6366 +112:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f +128:814fe82674b98d54671869e3fd705f76e353761bf61cfc635fbb23037d8a0e0dfc13c6c0e34f8c79d4444ac314d4918773265b3fb5866a997e270d5ea8891f0217ec6749df281d790dfbbec8adc504404cc0a6f11e91d0ee6c19abdc67b0c22ea4d9fa218320a694dca53cf522c761e426e0cd57e49b73a5d765cb4bc571e888 +128:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f +144:9fab9584b0dd87df42f07513edad3b5e3a35b8871323eed63a48ded1efe4308a9883579f3a7ab830277bda59b1f1c2614a2cabe11cdd87689c0bae80ebad02b76d9300703d0268e0eb052d9956c5648912843b16be988134cfaf65fa87013ab960b190afea879897f1fdd00b360b6bfc6cc3531285682894b707af5914d2d1a136407f869ae6672e096ad7e95f380d53 +144:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f +160:95aa16e637f1449d9012237f5fd95a57c5a9e203ca0a9393975e5991cc568f7ad2af3266ab605915af277f4395aa312586fb28a18f22d1644963233e1121472980229a3941c2f24758a51c48aa22b61fa4310ed2e6175a71bd4058cdb070f2b8289a46a39636dbe259eeff3c87f96fc8d46961aac54d7a8491b5d713e6cc0d6551b9e90911947d9fd15051badf67420188c450f9916c2edae245f1f6a67e4f5c +160:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f +176:5cb782dd9e2391ab54378121d0766afe6d35ecef7a2cbd85ab04ea82b06b56ddabd311917093ff16bc1857480f84049d89ec6694414617b1cf3a11778c1ccbf22b81be5f07ed6f978df5089e54561fec53de95205ffa7d573092688fce92cae228f342f77c50df87404d502a9b274bbf3cfcaf4e94a1e8401630e18b79d048a5f3901abe82493d911d385890405bcaf4d5981def670955e95c546da8939aa68aefda56b37abd3bdcd466605f9bcc5931 +176:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf +192:e9a7781c750910f265e72edf0659d76a0db2dab863f43ca313b9e67e8f9f97a1ad8ced641c6d8d889ed2d38caa7887ec2eb9242093b39d4633702731b96e11da52b1a9a584d2367e6a0e759baf902eb908b4432ffecd367ff1fde454d4af844e9a10cb260ae222446c179dcc82b5f767b941f75196e8c4b210315d01b006fa6b5f1faf931549044b17b33f567b729ddea115c7b11c90982e1480101e98aab23da6533b40777971b4afc3815d063ef175419dd72bddcdc6bb187b3512c3bff56e +192:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf +208:8fd33ac16f8d9bd2ab24d1d26b267f67222b9309d697502bd001bb48b8c3206bd5c98cc1cff788633cda4edb5aaed2055435c2c092a7c655455d1d01a6d7a449df870dd559e9bae1e0fb0d6e5a98679402c288b87cbda569c3503b4aa9403f80c835c995e3b47e33c1c5b8321e8db1b72955ccbdf640c78aac376ec449396b163b8d16b51b0749fab6ba71d0b563fef6e94702f35ff2ed180f0de1f86679d8f2a26b2b9d8adffc7ad11c5944118e30025c9be26431f130aa2bc238e4b0104ddf9f82630ab7eea590bd7eabb2da745ffa +208:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf +224:ac2daa6b330224b6f146ad67edebacd98cd2269d0cb313fde49d85ad60f9b21c9926d411fd435be8bd073d294e905acfccea2708f98e05cc9ded3c77e684b671bdc59deff3b43fb931381b12133ce386a0314a939d6c4855bbb7765adf955f4e587bebaf6d3b8cf547b2feda60c326e3409833665f61d91a2451ca2693bad6779094e010a3804993d6078c1ac3c2d26d589a8b3376dd06241b3139d2ae603ae5c4829c297f09a5c535c37998f571b0e96855e7a708d7b2ac42659050547c7bd447bbebad92e98b203ce6e83bab8e94f232417152ac6bfe8f9982012c8f83c674 +224:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf +240:5c4d34448cf5b5b385a8aa9e504d724e6e689a35ff36143c20fa16df16f74347df6b65ef354c094732fe1b31e454e319a7be20dc6df4b900dd6527feb5b7c81a7a40df73d513cd40a5e1acfda4ba9e4fed784bb26b2719899c60a54bd8c772f17c95e6100c6def216c9c612a10db62a576cf45392c68736466305f6cb86f218f57b033c3773d0cdd9827f822cd480b60f94d32b28f536e6f0464e63e84294f0c3ab088dbf0efcf95b020f4c2ddc72c5823c2182025cfda510e1a944ac9316f0ceaba7dbd116cef95e051ca9143eebd575ce53c26cab9aa897167d500fcbe229560a85c98e83385ca6befa90726e768b4 +240:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef +256:46d31a1a6fccbff0435e1811a4851746df2af5772dd0408fbca2b3603cc4f92f778dec8f14daaa6f081500de55d036b3680a8a9b6c50bc20eebf09e35036bdef9b3751167e807cd1aa70385ea9f4be42ef4de6211079eb0cd6c3810404a60f09dd4e98cccb09c356e6b4c4cc1da036bc82023b075011cad2d01bf95fc45829c7af484f92562c2579bd3b4dba3967d5c6bfdb3e2236c2b43655e6393cdce8a2cca0affb8e45e8545aaf04049c2789108ac5bc6bceba18bcb9d4944ed81a64ab43e28e28207268464b99dad7328db0059defa25a722cbfaf89e93a20768bbce91b64f395a379ba5580a2ca4ab2d978c6ed3aedc9f53896bdc28aa5f1300473a3df +256:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff +272:96a46190ac8c56cb272488d1db3a6153a4be7a298f200eecd42b0657e7110e879ddaf12a782d3f946a283f23fd5fd98ddce5874ea645e6581284d94c5437a4737921fd1504fded721d9a12c9bac8d8feda0b1a32a5a04e3602dd3befaebb161af6df1590d280ce09fd99e551ab39351dff8cd85dc084920a21f49e726bafdfc75e1cd2c42fc8789edf52adcb8b8f87b0b7c89c7e80fb8a14807c96912fa125395d71f631cc3181cccbf435da014e47c4dd25640cf7953787c3fa2e9de4a867d61cc398724a94b584ed336715ec92a562215bf36c193cf2356973e60b858d3f97a944d12a40173218f0bd2e565833581e51bee580e3b3430b3d41d6d6788b73ebb45a22a548456f393f24999c40136688 +272:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f +288:4ea9644990536525105792b735e1a9adaabf7542f8d30f41553f756b33fa90051352939fe2693be9e5e482f9a2fd0ea00ec85abb01a56780b61609ac1364b22b2a1f7b061317995c1d2a8bdd280a7735d1191aa6c546516713577093f17b5696c9f2a2b94b766b5a9d2551891a5c17530bf953aa1dbec6a9560054534163c26973399b128156af6a257e0c591b279ff376d0e2464b06a464bc5e5f3d4ca309ddb9fc96d8c59efe0027389e25aca9106b4a6c0e8e3726e26470f0aa59ecbb1022953312bf5a09db75728ce455f63bd328437622bc61dc5f703e7e0d49a27ccc1fa25439848a1349c7790d1920f465151318c3d27855bd953231981eb903bde19906667d26900e2c233330fa0b6c157db37d5b7c76fdfa7a7e1606045e9a18a0b9 +288:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +304:53ef1d7350ca9c52f3d53b1f3097919a4e49bc48d2e63c571abac2f19f16084b16308dd8cf96f374fafbd1ac7b3f9cf3b9c62af25563ff09f419c94f0530d43ddda8396d99010c861c92d59b3d03bb8423eea55044053b06be07fdab392cff5f85be8119ce3e3783cd03923d28bd6cbecd5620fc2465a9f2b1a0850e4a6f35c1893819b689387e5bd2449aaf8b1497a598a48595030a00b92ce357509f259690823c0d1b710edb36cae8b7653afc183f54b1955a56db65929df6b29880e99eb68581f1e41141ee697c1fa565f0d674a2b9f1e88c3f370d1d5c564547370e73e2f475f52eda167bccbcc19405e1cdd24c13ac25bcfa3f7dd65e233e059b18fb420bdb52969816548bca83ae9d392b8ba1eece0faea2a4d965e46e38c3acdb00466892c1be69ed0e73ad80beee0cbe6d2b +304:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f +320:577d305d82d993adb3fbf1e91bbfcd6d9fd9b7872420dc418825ff0bc791b12dcc5fb56f0a4396131f989cebb7b07b67f6365bf120b15cdf7c856e4ffdecff571bc8b04a10328811401ced98c14b92d667d89ef0f413d2472d039931c33570bef3db3485b4f018bdc771ecad8cdca1ace0ec948591e98ce1e037d33ce00326452fddfc70a340c73b0886b43dd0e9203c11c025af0aa2ef3e3538893d6716574f242657cf1bfdf6d8ca3fabb982866d04554d74a9495f178b5bb68d2c2d026b82a1d65a2a63a5527710c305d6b54e830baa18f692dc0f29815b7eeb717c08d49b696af80db2c05481aa077e52420cbd1ec47c99aa82a0bb730a85bff1a8000c1735af09ac45ad3d0088eaf52f5d42ba1337dfe3ae956d6d7899ac949028ec0f5884ae58d949099505dc9576d204702d9b25a172f81a041fea4e8744605ff0dcb5 +320:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +336:cf3c36fbf2b8d72b6e9e8e9ec871117b2d4dc814e3204a5aa223136f8fb8218245dcf03cd81de80a4d35fc5d0a4f8a31a2872d3c1acdab0846c89bbc8db6f31436741f6e3f21cc1f783bf4eeea9b29415eab9c1d6ed94dbd391a13ba98a851ee0646a378a8d1b25d56de83049fa5ffb33ed2c5f60c6588eaf8e6b374c43cf1aac153dd63951aab2ef10923889af3192bf2adf9eaad048eb8ee3f81916eb589974b5152226c5d1e6f516a82e8acfccbb46ab14d5b901a4b9ad23c3310b0a2d30f0d88d0852e67fd7391c64b9e57800d62d81695d9450e135c9d193fc0efcc8f774e0fab020dff5d0a28390dd4d629f5492a544fcf04811f2b0e3a64d33c5eabc43a22a97c698390d53789935aab90808b091211609a5834ee60da7af6cce5cfe9dcdb438b9e8bf60706696d0a95c5e6bfd25921dee98c47de5d7e4cf5101fc994b062fd2dd01a176358113bafa404bbc8 +336:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f +352:7dfc531b8d9b4f8a084ef0f6bca81ccedb88d13f899c64ddae54611d76a0f77ca27d3745860c79bc944eb854738a1c5a1d23491d19a20f7fef3ac6391798360eb210874cec1cedeef549726e533b223a3f3b14d4bdad059920910279ceb49e70c87a84f1901125327a9929f238f5361099425afa5d826c82253d94d83cd291947a7d54dde88aac734d1df8de1f125fa02b6b0983cd8674bf529c97929b56a5ba681c7279461575a7568c7b9518d95e6ea8faa6ab6b4dca7874dda2c8d2cc72577dd67744873da145bce25593511d0bc3d67bf5cb61f9ac53e04701a1a448e80d692fb46651e45b65dae90994c91b83ba4c1ec9f7945187b9e7c31e870401f5ec8322d0a686fc2f9559279de992171957719004de602a7da9ab63a902fad8313b60fd883781aeb1c8d5b99c73e417c821f75859bbaafad40ab85098dae356c996f4274b198536262b2d26b22216e79ff3fc707fd197e1f39bdfb9acb6214d9196 +352:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f +368:100e6e817ed865757039f75eb6d15c16c5478784eb9dc70f60e3b900f60fa925404e09e2cfc0450bc89bce115fef62de782a2d7725970e7fe8226122c1ff9ccf142275d4f37d011ca3aad5700e2e8a8d27c7553e59f8173c8117d813e4d237bf906e3499306fd5bee0fbae137a372807caae0619caee51039049a09066b62953fc5bf1213dac7da86b4418cf3bbfe046c1b9fedb6045ccbf25617ea52e2b6fe2cf9a52ed371f864197fbb3ccd27ff2d0e2e7285e29b21632111d2ebea0c8f1a216779aaef98346b84f54fafe46ee3128020434d0fb1291e07c53bdb236e3f476199647bd7366a72dcdb5484e2439257ddc5b2d77b3c033e068c32288d94a72f2c6562c7e1727e4f60fa41a75f5561c4c15d5997db99471ff68b085b39d5107003927dce0060b1926ed8e9144a6ba6d907ecf037f8006936ba536513fb8122b82214162b7735a16f72ffc4773c32c9d694827c3c2ecddf742766d2b742ffba674a04c3700ea52988f6e265925cdcf4ef5 +368:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f +384:0e2a132eca216076665bab6f3d1f222a9b502a4830e7a67be3330fb4a4cbc1f2ba2c3891ffd67cca8514739848cd90354e99e489235f380b3727e74467b5579ab2c3661054eac7f9413fe1f5f9b8b54f25b9eec5f693025d300bc70c607f074b640764d91230a6a9753bc403a17009e201cb96b57020b527d48943436e4fb717a5c5ab027e239cb508115244f1ba975861c0beebbfa6a7ff1e47ae135eb2cefdd8976c48ad71ff19549164d22df54044abb8cf86c7281035c00f471514762b6224b2c06cd496e149fe43262c554ba04735df40ae8946a59d87d7bfc4573e5a1cc4bee53a4d33d301503955e405c47cce974a8844ad1990c568dd07dcc1a240dd1dba5f4ce864321967870acf941535926e5d3b511a97924350c9019313a56816a1abc5c51aa96bbfdd2c7837a43320ba964d047fe5d2db2800471679663dbc8afd4fb8ca4d39c5735281b9a668b9dcc46c4f45881a2c9f841dc52f354d706cd32ef5dcb4a9f2cb5c1c7b4fc9e2b56e14fe10a8492f7137e580b6f117d1cae58c +384:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f +400:0195b4bd24e6a6295a3a6ea05ee7717ec07eb6eab50bbac751f66f6a79fc564f7aa1bce8b62b87dc25e7b45d52ff34f4f9d30afd0eb33eedac4eb19241fd80dc05ed8265974d1ed3df48c2e027b77866dbc235536b48ab50f628635a95c4430f8c237d647fd588e0318a5370ee6342eb802c6e584983ec6aace4f486aa05e4ae68da28307cd64f1b9572ba59c0c59ecd198dcae3d6d36e09c80d10c877a88b8779b934c6e39dfe0123c922be796a5d962586b54f6e9fbb467f72534be73c4374a7ec7c34cc1eb3e3934505d9edde91c210697b2e550569bf6a3e1adfc2db5d364336c19ac4dc17e3270601ac88f996a5efbcb2d241a1c7acc8ab4a354533f912c9e51ba898bd41f43486290fa32b36a760de5df0c25d5914f3d56004920c6dc2e1724a95eab88f61cfd154dd47fc8b62702e7780522938fb9c035b494a0ace5a21c09f0cd465a834a61c4c979b093a5d780141cca82324f3dde77f45efbe46d3772831cfa93869d144740bc4d0948bd60df373ea24e4be876b6dc8a338e1853cce36b9415ee9aa9077c4cf9b2d482f70 +400:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f +416:5c3985f375cf6cca081dfc118d4460208446d21d3f3d100e883222cabddda538115ccfc37f68739fb6a1649c55fd36412579ad1c66908b87f252cde8ab32386ef68c6205c8994bb7d0f9e0fa5e1e6d8aef7064b0432b1a03b3dd4fea645aea15216c03f58658df21ca8792fd2253a2a889d1b223efbd60e10890676291fedbdc91aff403cb98fcd96de1d1481bb8103f157780ca09ab5490c79fc9c60fe91d5325103441b986af5e9a0e323bdc98150e45a2e7cd20997c58a561c8698a64e7734ada60ad1669160f92c07e56360113adf699c25990d0172cf67fa8e0e4a3687ac23801badd498c7a1a411ffb1f96bdfa5de99d5a4d6faa8feff99f624c396029c5605927ae0b7315dda77d092d6e37ff885669e7e60a823fd06a457785be0a151786fb0a7a3a8b67a4cf47788ff8768e24b38df7338c87c2fe3919e74e923cc8a4a3ab7a21db18ff4672a25d3652be23b4ef02e958a77d7df0254d7d54f6ce0f3a4572ef675782d0a9083c6549304cb302a03b5692137a2fd65f0b5a21eeae19c6535836844445afbbe2a236ec3fe26b7d7615a4171a6900620376bf27db1479 +416:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f +432:de81559812d2938cba8075ee1cfb7313173305486f59e53abc00efa276653d6cf200828615a9f51a045ee94017723aa431e0d4252205f8b45afce15d3654fc638bc32744488e97f4f7b9958694d40403bec42a1ca97011cc166580737b6fdd71843b8e9e876793858d5b7a06da8cd7bcaad4ab2db8a5635f3643263c9881a9157e1ad82c2832e5894630dd36cb9c65dd7faf147b57e230b5b94417aa962a3f63bf1594a99adbbedb9c03bb9d1a728614032946ad9743c514948b3e01ba8099954dd5e3a0c157eee3e0038c8254fbedb10c685d89cb0555ea7d3f7bd5bce22431bb274ca8421af1fd9842cc9d8094f2289b6e0f4eaa183f316a203b1aa4e6f8008d8576b5936f715ccc584e4ccf1ae81ba5954ee4f5d78ed17135cb13af0484f3664a6f9639a7440ceffd5ea60cc5f391b7cd7201b0059e3391eab6cee0e9ae0ab7c4b7e6480ce7f315b84d8321ec4d1a33cce3ff8dfcf9b1299cbbfee9a5874ce5a1c1dd89710a3119c1d73bd9795d85ff3a01d88066a7b2377738a2247f3cc02072f0f3ea2e3adf463c157e9d662167422db3824df31c592891474fd4d0268e0c64ee9117f6fa02acbbec532d4f9801 +432:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf +448:957c2adc952b9187cc7da773714fcb6fe574a07684c3d5d1e2d633354cfe248406b95f0e9714f276f156d97014cfb35991c359e07464b55ebf67f745168b386bda72f0c2df5a7f830a5e4629303443181cd43cd8d30a415cbce0f503d10a0f63a34eaa3a7ae962111caff5fc33d012549eac997290ee78f4c9cf95c148138b60734cef0612983eb27a160bcf5434bb1e3e6a6c100dd55dff25b04d738bfcedb84ae2a168f3be9711bf74c0c61925b61b321f90bed4018f0798b6aeb99975d26244606e1b5632ad1c1019d0ed0f254273cb6a48494b92e516dd1c90b6e48b407179fb20426ee46a8a0771f1bd67b153bd7625e76ebe052d33137ed1cb8b0574eb7c93176d6ad88c5e4bc47c8c9ef4bd54a46fa8ff32ed284339982a1aafe3752648c55f01f5ea80c419aee39b0590de39f0e34f382e3463bad7b42aa17b5eeb2e5a4ca06e9dc3c254cceb5567acc56fd6848d5d6b259e79452423d1a541c6cbaff928039186f51bf1800d859ed932977df30fe28e00117c1e6e8e77a0bf7ca69e264fcc96c1f75ca677554e9aefd06ce97ce5f0edacd50ef8af9653ec3650dc78693a483cb9686015565ea96fd0c36c13d51af320fb8ca900802ae94fdbcd560e +448:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf +464:1b30a6f0f8275f186d7dc2686794411242cd55389a35c2a8f0d276138b9c1bbd2e12c152def0bcbdc323bd3e3b43fab29cbb67f5ffdf7450acbd8c4844e17b196d68f0ca6c0075bf06b1561432435687a998658d62d2f9945ab9d2a2b9cfd7d4f67bbf4c536ea589faa7a438e3cb0c006a2bbf2f90c139793c6cb41be18b4948841a2d31cff96b25ad0f1377563a4acb28f64efa006834c3335e604d94873e7b8eab583f87c5f4e096bb27f1c1af45eb906953acfd7558c978032624355fb2421a636ac6433e7459b61b0706dac2f4bbcaf18727dea1f6100d34eeed31d2ea2672f9dfc853e408736b1cc03a6485496b6cfccc6f3481b2cd05f5569bb36456970d0289aee8c0442cb85b0659efe9872d5e7eee0218d9da684ed0f11c489b49f5b974d1a397bb31e15a9556dc1447018a4cb40f1e13db643a8769e4be78e22f354390563a7a7334445adc5e70ad26623d248721a0e3b8354e526f573f8a292e7d568e63fa38b48e0a4ce7431e890ed19b3f824cedc84a050d4d2a7818ee26b8ea804700ac840eb4bd3a4c1cc9655380d13a86a69f03f642e7b2337d21116aa7510761704098bde0cd6136cf47858a26e4a11649920fc2cb21a51f2f9330095d9de06b5d72b93a67a59ae3fbaa4652b82c +464:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf +480:8140b529f455d70afc9ee6018a2e59a1ae060ccc18908f3b0ee9e8efcbd3f0124123252c5a62401b3c30ae2843f4565f19d6f4af186dc35ce11fc8d0d23bde67ac133dea138a5c27712381f148f1756228e0ae06a0795e8fa3e8437f87a6f34db3edd5a679d8b93442e9129ccb3bbd2e79d4e01d57caeeb085b5cf24200150bfa76047b850e96818faabd768ac5e2dfe210846008bd76d956352bcc5600fa77c044ec582c17b8bacbef9075e9f99a2f58fbf8f102825786b6785428f4ac15756c7190ba822ce5c0c571940bf77a22474f8eb6692469a3faf69694301d5c14d92d9995d20afe38b9e58aa6c0bb59dfabdb2aebb0e7b11bd2eba1cfa05ded46cf1dd1cb174dc76ff6784d06f6062fb58a7760284e051cc1ce1144643d902881f1a435130d3a5d7b2442fc03db9896d6d552afc14be38263c63b24659fff6e115b795aa1e1d6415e67637b0bc095de9dc4d464b9cc00dc47cbb55b3b73f3ac03a8ab933be81986e9739c79169e51bb90b1664320193df2368697afc9e02b9d9ca09d7e8710535f512c17ff24e3bfafec233f799999d8be0bc8f460fea79d8459ba17d4efef64cfd90624864fb5b220bc3b77d21a3db10fb626cd8539245398b008c93205254a60c73f9c19f0ed4f4152311ab1743762d859b29af7807fafa815fe9 +480:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf +496:569e7fa1c3fb86f2f88b26de0fbbe7332900ef284696d3b04800b0d81d09eaffece090063c472a180f237b2d4e51b2be3f29c361fad95789ef5f1fbb07059133ed74c3cc544032021d98894be3202af6c77e43f55755afe31ac5b9e5d73d1aa8ad059a4efb9fa10f76d88ad0bd792c96f804254566d4c86949027fff96a5d05c673eecb52436737d329298922ebd45d77789104c6b0885e742e45c4d2fd283768377c09a9925b3984828d1a4fc9bc2bc256b28a2aff31a1ead319897441fccc4b8f3f2c82e5c64cd82111de146cdf7652a8147076d828f1c50b67e2d060deecb9bd2b84a8ba13f0a65fea79a0f47af74d3f03207a191e3a5c9087994846cf176063c196b77271c7e8560ab28084fd1e394d9c43b07deab40c48c05eecfc5ba42ec6d36724eb30ffa5e9904318c1242b0b113cf0c7a168da9197abc2a083f371c526b4afdfe1f1424b290fb2bccf48a426c8f321663c767e3708f37fda56968f0b5e787b67d366828a3cc16266268d92c8afdced356463dcaff0ef568c87653a308c12b69649235f7b2eb391f6c54df1e96451419bf412d2ca0f6d34ec92e04b7bc618ccbff4433e687dd147c5b3fdcf4705078adf5d7e370ee992e021329bed281d0c086930a3661541d67d4af188d882ddd020cdb7bd0c65743ff41b6fc7fd75237e02e7d6dd8083afb544080620c41 +496:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef +512:9821b3449869f2cb0ef0a24ecbff9b33a73b3cd54bde63d343c426a36c68d1d166c13d02ca4d65cf78e953361a4d2a4035fcade9f3d35d0ae1cff5b85f1fe5c9f3a9db9dab6c10b8ee7542944c84815ca990bf4bcd7062a8013bf852ff3b781f60e29eb9196f31b0e9cd566b7c906b8d930c4d4f410793c1fdf7c8c8ed913469c2506ccfa1c029f383a9eee5a95f18ffeb1f25084c62d6c9fab1d67213efc1ff08f2a33a20eabb520d6997803ffe382ec2f1879465c8b166b045e8ef6fc27c8182d8969419291fa5641afb45ba1600f512a612e7dfca4f71cd63c5fae50a53fb305650e3805428bfb6689813e342425ac6d5d13c9575b629b9430cbb21bfc41c026fa3f8fcd9677bf9bb7cc14c447706a455e2d5fc90a80ee635fbaa589e2f50d35d1a1d5ded77bd970a1fe32f92fccae831c8e540c5cfbad2162dd0683160f0d614fef933207b4ecb51465ec0063ab31243c9a23a07cf0952b81eb02e628b9e53ed0c27d720f65be8f38b960c0286b8dc58aa11905f3d3c694d364ac0997e6b2e3886a1a11b357ef0b75cadbf77acf015b4cf6bce508f4c27f01048d2f4d811e39ee8501d4fb6d69fbb6159a6ba56629e54e798e872be33c191750168af7a47dfefd989c65f6b2ef8064aef83e2e902f68aa9e10a7d6ac4a2680dd0913aad62b5dbbe2f51b46bf64c950caee3b66f6e7857a64d9ccd4518d955f24a23819615 +512:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff +528:f02604963d9dc47382d2b835494b8591deeee437c38d4d23e643ef3d3d3d3d87a6ac3475667a749ee84cac055aa47b531eb22d58cfdcdb395fccd9e34e88ec8dd6d4bdff940e321899b700572badb5e44675f7b425a9c1c1969df684a25ee0974c8a9d5e801b5cd70976a6c5af27937c784f4f8d1c86ae1c265c5cb38ea1ee18bca93ff6019f1927ebe203514bf20548c7efc13cd91fc292e2c9ab9fc014d8371d85a2efae108b2afb8bbafab75e7361c99925a19d83f3d7fa51c0274a7a9796aee7451e783976e679db97baadc4aecbc9d120e01719592e007195dcb7b42439c5403ccdde0ed0ad21a7c5a2798919abe81ff72a2baa033002fe25070e14f3417e7076847e90d21ca9a7fa82b45f62d2340bc2aa729616c83bbbf2a6505f860ceca837c479eead3b18f50f88a63f9582e517b4bf51703e42c3f473f901702d3eb4dc25097169a2fa95729f295200e13d05567e5132268b3939250b8bec170a90bf842c8f2b680fb7dd6bb63bcc1ade151944030c0a58b278d700e3460e9d9a7453f0698de6fe4b3104f048d0d3c2bfd6d71c86d8460b95568df8a493f6e77e1d64b158329bec6ec126a24a1d3cec3beb2749c0d2f2d1c9d03708d0f0a4faf81ab0cc31e31dadba6e7f453f35978d49bd026c145188b042da98795d884256fb7b25f5d6e8ef42c927bb39c921d1e634bc94539076986afc5973e98bbd0e466b2b7e4cfc7831fb0d4da70ab31dd9e1584d +528:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f +544:ab5530701149690a9f3157b9718fb392d2d2c38e57b588c652a9af8580750ef2da9ac7f28442a1a3acc2ddc06e0cca15a6ad8c5a253c0cbb307e7d89ecd6a9d5e72c76f2589e11706713bd0cc4bf524fb5ef3c410eb88e52ec0e52d822f6fe14d744a09ec110171af24ce27a8f116688092d7a7123c2ae144fef01f277876e85bf0bf774350c92c7bfee5977d71f52a0d395003adecddcd92ce6e3a6c73b07786db829396479b10b92938c7b788b897695f74b61bec738526c02865b15ddb8d6a927840fabac0fc2ccbca815ab58689eb73adfb08d6148d9a98e8a5388aa6502458ebf02592178527681a12afacb0e0e1b861347dca374eb38f31d86761b5d933f182cfb3aa48cdcf17f08cb9563ab8928e6472fdf43143454f66b626d4e69b1ea0698a4571387e99fd4ee16faf826c3a5c1110522236345948c594c20e3a61e530dee291b79b7cd0e2b0fe7d0180ba1162bc4b3b1b3280dca81fd5a9ca8a227f77cef89896e5c664a75b787f45e9693147776ca8ec8ed99ced39920b813ae9e1e93214d8cfe5c168ec5f07fca092f6368fd952d0d48a49600fc0b3905486140be1fdbf142d0cc8da446d2ed4b1b42f09f09d3cccb95b50ebbfeff60a1f5bc44a9161ec3bebb94504b70fef1c36035a89a866fb96b12f122d2e5ee5fe85b371223f95664b7737784c0cecea980fa711cc263446be48c07e6da223c4ec856004f99b0b195180187aa73ad3318b7b23c9002590d6b42fc57e9b0891e70406387ed +544:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +560:dee4d7750f0870bcd16faff4d65a5593f5d86f32a6ad7a519d6b2333e522dccadfab7890d02a6499d6487302aeddf9c52c929486ffb44b9ea9409a940d4486a379b0ed04e00421f6e43e7393f75963e68422ebcb2b87eca211f671dd713d59a6034576a4feb356eff67f33081f7889c684f971a22be68adaceb35d24d1947d7f5a5c03f66f3152dc3bd70f59e172879f50da9038a115986ada1277014958b2b19d8a158c097c3212eab6c6c0e97948ae15f146a245bda2495a5a860da0dea32b7794f77aa4bc91268076649255fb138a4ed831e659a1ab9761e37bc13839d1f419d7cecbb12bfa67c53fde957ef5f5cdf43157517f8021e89eb46df4762cdb992a9285c36b6361561dc469c2e9b5bbf79fdc8779627971e6d6a74e40fb1961933f182a1b270910d7604a680d5bfc2e5f66b6e4098a0b13d4c9b923bb56713012bb63b7a5cd1f9f1a7b42a4e28278e5766a3e484da08a7538fb1b27a15f7eefdb5fe28cf6297d81ce7c464b6f7373783c7d344334beed713e325e1429bd7bfdd1610efa551f0c16a6eee5b787f973a0110754bb681de8d17830996e993a360e1585b12ea8720fdb3227f193a1963f0afa7d59e303c27c70d37392fcdaefd5b85d52c2bbb7f19b3146c2165e35bda3b6c23f16e469281e10bd351a533edc370388a07e63f02b07db8569b8760b7c091529907893133685aec1cabbb8e06752f90490ed49fe4cf5d580c0007ea7e902a71923029237fbcf965859abb2d14f6c89548017eeed6d0d5614d131b6512c74b407 +560:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f +576:a1d36653fed5f5d40d1dd0873a07b82e673c63f30f6d7c895ec6eec7fb1e9fce1f3ecc41032c94b3fefa4fe98f66baa353939c796be30cc1668d195eaf5c8556c1a00c4dc0d6ab65919a1d72950231c8969c5b02b7f22b70cc03fceaa39a5adca0c9ba1cfd9bfbbef5d4dbe74d3596659658cc5aa1709e4d60469600324514517e90d203aa7eb44612e58870e3acec3b8c969f47f90c2142128a2a47ac3d3247c67fcb051c82f3bcfc98dc5fdf5bef407e369d02f23d690f62cc5e41aeb2298bf2c971a66744bdaeb9832650edc25d09fbd1314a5d84477d7e552b81b3c5731b420eab4d679bb84e765ffc5bf9b4d19df96b22342ec09d808d509fe8c4d0d40c3ab9b1d40040b4443555d9ce9aa04e216567f05ee286c811c9daa6c1dab198bce81e03d171305f1423626132210f0143a514daa926edbfce9a234b3100590196c424fffe738d0137fba0532a7b9b4dc162b9b406fa06840e49b0b9cad3ef7d71aa767b8b2fbf9780f1369d6c5b34361f403a3516ceb2fa0a89bf1821574439dcf42fb1328415e363d9a306a3f720e23eb5041199edcfa10b865a9f5a32009906512202bb4ed532616b956d0308a0d713c6adf20dc03da7c9b29c9d409b2fbe3c7f30376bace8a3156fcb384a62b93c50561776fc6cf16ded8e968b27391af2b767ac890b57fdbb7d3a3fcdee5467badc7c0d8ce59a17129a3672c37259874b85202902b11a3261ce7a16b3f830d36a173a8dd3623db5f45c233c6456b8a2d0fdadb16356e5c37afeb7f473cb4a55f39b9ffb0e4fd96952b75edb5c7f4648250e +576:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +592:4231efb1fe07daf9ef1a69137769cce0731aac9aef27cfae5b60094e8e8550cc5b83c31efee907f5aa9fc51fbffe785d7d70ed0b93e918b4d771c7b22dd72b3d78e7eedaba9689eafd5d440897a339a2fd814651166f74636518affd53d96ce9b6b2727cf3b87c1a7e5ad7cf839b244bb2561fb3955d848131efa937cc8f61fa8820496b779498ecb3a3ea1cb573d55c11bcfe1f21ca95110012be5f35ee2d224cc284062b27b5ef85abe933f8bc5f1acb40b2f42b24db4dddaaae33b67653145a2c20ec0b308cb7f2e1a4110033776cdca32115a2022b3427d73d1e3895c9b6f337c6ba7efffc63bfde50b2c43cb6741650a4ec6a742019c65581a6d45f8d62f62d3da161211e414eb6af9894383615b4df3d1ac5d5d878ba72087ae03530013b21d56130782acfe0a9605466085a8c8b8db96827ea4039a77b1d7b95aca25167d37e6d6ca8880da08588ec7c613f06d24f69c3e8bc1f0b9b8bf589b7010671a9737f57eb59e76523b9df0a94edbb85a5ad91a7bc58ac0df86e6fa68b36eac485b497a170bfdd798e1032376906d0b77dfe9335fe47ae4142dfe9da9b3d946af220715dfa7adcb0c7789e4566fb9acad513c054d859ef309cec2a196a5407902ae929aab826cdd056f70a8957e7e001a63522e579986f542297fe07226c946e832554cb4d8a0f579891abd54b7ed12247ed880574eb62f823b42cca3418fd03b9efbd6e490e92dcca2409c1e5530b9a02529fef02114f96bc0ee7739507b22e48510221e218c0bad525dec6a2da81b834134ebf0bbad4638d6e3d781db3335883256d1964bcfd37391e84d128c5c7fd +592:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f +608:7cff31eeaa23800d7147e8746ad4e2b2e041a68804786f51539d19c040c4529d2c8f3a9eb917505eaf9fa09c8ae6e0d8d8f5c341e4f35f0b0f9b4ad99d7996c140abe8adcb81b6c96459f62b7e24e580614f6320b9d9a2f791b7c2aa9de02f0450819411e80cd62d67ab56f207441f823e8a40bb89f41fbbe95e26359f738ec2c7e418acd5c054c18631d573aec346915979d8eda7ef287b96053e6b9ad1ea683624fd02b3ae6ecf0db342a7e5c46b4b39f5fb16a52237689977c1f2d310fa7e940b9a7c6e20beb9e7a8c0727f0c7461dcb6fee73b4444822776345d7db060c7ff761e2246250b2d7a48e4ebd1f084fae6906c3120f59b740ac6bfda70ac6e1168d4572ca2912f6891d33a128e439bda816691e519bef01660a80df5d6e7108b7789950ee523b9b2ac8d998dcd276ad09c479265fc9679008174cac18ab8ba38f0ea3384f3e623daf1fa7081d042203a4777e5a245540bfb1cda88445f056d4668256e719352a4cd9d02cc3f0a3bf24153aeca33ed0df4ba73d5453a40e79a4a1ff462b6c9b3f3a129be2d27f1ee31b5675ad4d9c1a4567c57d039badc19676a6a029881c6c30616a8d32b6af83c6a3fa412a6a383af1f6cd38366c1475670dc15a9406a22e33ca2e149bb7141b8e39f1e437a13cb0ea27a9f73f7f01a02ceb8ef6a70de8a33e68c6f5495058a0b5af933bbcda9451e93f6e8877938ec67728d48fce408e803351928ea05f2d0d53ead088eaa84c2ec158ac9c036ba602399d542b687e8e0c80f7ea642b09abb61798e54c54886c88eeca627a8012254bdecd763c906e4dc7c31249830278dc4ac6a08cb22eb2aca2cc1bd54da06376e741149 +608:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f +624:d49acd3a39ebf5002de6a7e435cddbc5df1ee700d41c4f8ae145882f005aa149edbb81506056755bc660208b79ce20927d17f8246689174e22c9e5dc225d86924de4ab1073d6f9762931ecf002c9149d05c715b05d7b56dd0c2d715aef361084073d55b126a9e34390f49cf66fa1deabe9c1191478659be5509462b2bf5c0c6490c4a97aa9343403b5056de209afe24ad277e68bfe19c11e4b99d70bd7f1f0abcdd80ec552392b4e5b385c25e9703c992a340927fe1271dcae11fc44a1060b77bbb42fe8fbe92cee73fb6231e0c66747c5dcd0e407958707745d7a969605c5308ca858641863c8546039bbf78e54178dc3445285f6c4cfa1264ec44e76946b16c7d1fb40370bb7681cc5bd08f1f325517c076b83a0fbc9dd82cc6b4a5fe145df1d206934333f04940bf403f6a0ae6bf2dacd9d240f73d20ae6aa24bf6b8ae918bdaff2615eb6fe2de197420e085ded829a2bcd194043d2c7f4da31acb04a84123ee75cdb611618667b6adcc3677f0c5203cfb9b18d6994e1a3b05b01f97471c374facd2a380c8770f1baeb09a0d9b45ab4e32ded8ae5292c307a8f83352757dbb797c8a7dbac6d2f2c54bf86055e08cc59db82c083d2a4ee16c57127d335dc07a895ceeccc8a8c268873cad5b3b3f9318e5e1b46f1e603596abed2332e79cc8d9835e0d67b9bc9c3192671a812bb80d3d09a95110dd4191bbf76c0eb6665326c753dfa9047dedfb91bf6258e575c0305a46b8f27847f74020fd5cb6306b32f526286d2f69d3c1f7c77071ce622b809ff9706eec156ac3c6b31dc3fc112c6fbfee7e40a86a1bb634dd2f62cf3e7b9885fe6a24db8204e1424bcb996f53ca5a5fb823263e564cc08d0194ef39500c81568 +624:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f +640:34aa7620dd642155a71ef5f64dbb6e226780c86774d9892d7cfc2f11876d05a4e51cf71d01479119ee35ba690debba287a0a8a2a5f984eacf6623db41cc5f8f8028cabbb1377d010effcb8cdfad1a9f583e2b8357760ebe68e4d8727844ff55277713d27e1c98290b4d83cdf71a577de138daec9dbe03fa7637e5a42c39fce6540f921c2248c28cea6787f23fc8046fb6efd9b3a1ffc3fc335f130bc0b4cca337dcd8ba050d8d87bc8da7c0e286503526e46385c85a6c8bd36ea803f3bff5d37dc29dd39429a84c6f35e83a3192db15a3bece1fa7648002ebf8feb5a158859831f10946c94a834ebe3922a71bb424e681a18fbd7feb27cbf889443f6ad1a94a0e48ef3ce6378f123acd41abf79621663a75e5f14dacd0e590fd9cb9f50daff9f9f109959474c9841d9fbfc538947dc98221df050732084f672daf8ae517fc9b59617c5667c946f3837a21a1c60707c8f086d27e856df624bd7972aa9149d2d588dcf4cdb66b78b257387d28985e9e518631aa1b4c9e272eec70ee9b2b58e98983aa14461bb6a468c6976620ff76855570ac7a7894199de1240ebabc8d5dd6aa261bfe09d8bf711f2175977d241e5a32bb99f4486a7e023e5c587eb952ae908bf48125a74ed8a675e801151bef8b226d10cd1cb0981697b67fda8064385b3867232071123128619c05f64fdab86fa6903c2651674fc225855317f7bc47a0018db70dad91b08164bef0a2de82e62d6592b42d8e303aea2974ddacec20efa9cebf99ed23a93582388bb75ea7bb93d2447079b8968644747ab32b3ac10f6445d585eb3011e1dc12fa65863e616c0e44fb36a978852a10e913aba4239ce369ea1358f32130aac17be13af5ccb31e404fbb916a2ca902b6c84c2b7b369747454db4844 +640:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f +656:f7ed0e6e0ef7d5fa1d23f895db539ad14e024902f30d899dd592a64a4a044b191f545c72734b2ecc70a1a752d7e55acb2f28503e3e9e06569faeb1bec2b6e7f4b9064aeaef41bcfa097ba3cc416505dee7e2840128cb1abef3e4106be9add513c3d22646211de6dd6fa7c7e2a40a2ac70b3724d1e5875c59ad004d82c2d3fda06d9f5dada4345d2f945f0a7c3036ba290b4dfed691688140b9af1b82274ba844a3d03b86556b67babd856e6c812a4c2521ce629596f28267e7d3cb7fe30bd1d693927b4c85fd50445a1c4753ecce75035996f38684685211e5b43ea5d32e54c5db286a70c573681d386480a499488502be1f51bf205ab3ffbc61a86765835d748e6e2a81410389ec98eeeb2bcb2c16cd9d3514e542021ed1bd9a41b3775cee0af410c6e3a29db39ab9a8913d7b72ceedee6f06bcd17178974d93a037ff303ac8a58b50787067ace9ed15d12417964230712cf154d881968ace0cec64721370864714739670441fc421185c2fa57a2a0bf9bc43a1e4cb78c0964ae06789af36cca8f7f85364c6d4be28fd7f275050b0e3b88b3a46739cb5ab2bd6d301c03dfae838b3137d085ff8bcdc593b8f790d6c3b56c8c4901ab23e5fe4f5fbe9b6cceb4beb06e8bdf1d6e8df98b6e4b3c96f2555431f1e634e8b7cd7919d489188c792b89b538e4fd8334fa28bd45bfcfa9dd9796ce0849f99b4c1c915f73ec0e0d59859f3100892f9c9f5793e5d0e908546eaaeb8bf4a8629386b1b28eb94d4b03dedff7b101a22f219a989285cd657fcfd3b5eeea8151e31ab11e38bad33bc40e519a8450b5929779aa90fb0c28ffd45df929c962faa2a342c5d6c7170af7213019e92d84758e41a4545dced705a21b6c857e4a2aa6176e21933626f363ac758b566278016e7088741cb3776ebe0530e26fda6 +656:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f +672:c324cc370a3ac69bcd8312a091b00dea07de0b5f3d4335ef68b596926fad005df403820803a80934f87d0ae02bc5ef9c25caf162d5b0638d0ce61b79bc0e0105d3c2df29015dee30fa123be4c5ca9e4ed4f9388bab22e2b7602a7a76206a311d5bb1f609ef60b777227326efe17a648f3b6febe3c64e8160070d5b8f5f81a5820af7b69486051e65779481e7edd4a0326b72d9292bfa5c553384f66c18ac573e848e1e69d9288cb52ab7bba98cadc6be8a71f5cb6ef23baafca64e91e0b451f2fb32479653a4f54e790dd7ba625713a2d3fc8d0c54d2dada99bd4e78e819ea0dab2586fad553dc4d87e8f45c85d1efb0f9d7a8da57184a2daaaad2d174c912e79997269f5e5a1a9c10f644e2280956f4836e8feea9b39557f7a928bbc6641fc61b613afefe04d35feb60fe33d03ed772fda778fa8c6fbc568a3ce516d1d7a731bb4cd3428caaeb2fb72fbd3e320b868dffc0794a0749c7ff42699c07dbc576d6e52105ceb16478683818e6207bbd02b268c45496e7841df2bb49faca2e45aa6cc5f50e8c845fe19faf6e4d79ca84d1437529be69ab32ee97c21e0002426098b9ab6c043f3fca03379d3d047701c43127ffc5d49543435c3c21fc9bcf798dde20b764040061f89293d9f2cf793e6e2afe443b423168a8fa9bc0484bdec7949e6a4be68a7f1afe8e6256b55a49827f18054a3c09dd3bc8c7676e86b1786e04d279ee61faa805d9e574e17d8a0d366f127784cad553fd038e237f6c5e8fb2c94817bb76cf954eb5195ede1ff597690239be6e0f6ceac8107ac4b5c843e4c2edadc7754a55ec64a59c7d88122a8a353bf8b75c56ed1aecb6d3454bc352088ce570bd066afd2402e8da33d4ec1d670a06030165fbd1f25407eee55b554848d0923f77b9a263af75f83b5bf702dc733686d9cdcd977da36d321844ec1e5fbd38c3db11 +672:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f +688:d4f095f98c6f6d5e536668ef67014b1cfaae8410377f67505c1fbac8f1d5a9b08e117348803c9dc1a06faa05527d6c9962611aa80a027ba9ab90f4bda65f4ca70dfc0008b18229b4c7e5b8970feac4f5f0b2012f7acde2dd835dcc94175ed97ca691f66ba1e86e86db2e1b546d24b44166061327e5e872829e1693671c42fead9921bfc9a10eb16dac02ab725ed48b34c153716c897ba91e1d55d53e6954bdcb2653f49a5bdd6f25b2ba109ee0f9ccffdde38e7bb5b6bb23ee4aa062e3148ff5e11fca8a484be29849aafc41dd8d23c6d051f58a998717a96c32aef897f80f5143a8d9140965544926540f6a9f33762a97ace2a127839c193aa643d9e7277854f362e4149b39688af16767f20cb3340df8a61a1c850d1c79d5408762985341fa62f2863ff650cbf1676f6e247987e317691dc8b77647db6d26e9ddd53923508343f1404e16e2e13da4dc1bf51c9c2ad2e604d6843f2a506ab32dc893c9f6e392917d04b4b3f18e7cd0e60d170987a2a479570bdfc4a933579a19daea628e3966df59285775da8ed1ef1c60888c7f65f8ccaa21fe4196d638ff5ab9e0948b2b7d6ecbe98f38a22bf9cfac14d5a277c16b6c4b43999c092d0fcd0b6f4d4bd0b7cbe05d03ddac0e2e8cc70d8627a97e2ffe0f7d7d5e82a1a59fa190bf798531de3c130a92cfe737f3d41ae67ff9040ea86bae64f0035765577326e595d08fa90b6490a8960cf636be26f21cf15f9628554e0c55132274a7acf6cb738ad535e872e591daa602b17c64f296950b2f6978f5edb11063d5d838418e6aa960fd09f713426ac4d522fc3ebe1a440c04de7398e9d787a5209d5720e17946543a0251921d1e61cd51a1b71d83cd40a4b190ff58668a90d264576ee675110e17aadb765d4e8bdea5d6f8bb87d558ceaec33f81facfe0b2cc78b37335b91aa6cb7f4d749302df73ee9e01a936c78b2b1a8a3d2e949b48 +688:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf +704:52aa88885c8189072ed6fba7972b92b32544c1ffae641cd7704987d5661338d5a86f45540abd8fa9b36df2a74ac0e7fde18a9b863e689ac6c50ec81cdea4ff74ebba9b4a5bf401479e3c7b4c444616f1b385e0b335c26b9ec89ef10fa2f5e6e7b13c7c4ef9b88bb9ba10a8715886d6b0e598dd5a2e8b5ab98f6f5a6855bda241beeb0fbf53869254a39c250395b75ee8c6cde6e911f9d110c19759ee93e90f741b4620b008c9c54cbaf10d9cd39855f6493a612e9fdaf8709552c4f36eae6831edba0bbdec5cde5193e0ca24c7afdcd66ec6d3d94ff2fb1d0a9b71da4f0d6638fa924f780b3cd6c271685d23d6018bd7e87a565ac9cfda02c5d0fda60b2c076ffae6aa94f73a58526c6b7e1c08384cb0aa660c6a8b939f7d7ac7ca57b7c18b9be7e496fa0b94771a8918a57a3fa5dc03ca5b3f47b8cd99ce97d9d01c27cd97050602238ec7fac872c1e9b280dd551ae59734ee935f4c1257e067f5de2b6f2ff532cb5f45e228a6a961d2107835874aa307d7d9e495eefc7cc1039745a478a61eff60083689828f225304bc3a22524a6ff3849ef260c84458884c9b011b5660988de0e8ef47ced9cb5ce31b684c22156ca0ec1c60c2b09d487e5672e5a7ba98a1a4c8d0390420190bf2a3d4d5191f164b248297bec98e656742770849e9abc22156a8a214c464ebcdcc0db0a6b77ad29987b6ffa23cf1281a5316c2db1e8a712ace87d6023f1252ccdda51722dbd47b758dd12c44c4c356cd005d42e1a7f1bbfa5b4b57a0fedbbdce6e0ce0fc69d92417aecb8e7d7c593a1d1e74e58273072da7e4bce4f4bd94a03f1dd87d3a7089079ae6caa80a835109d984b19aa30f3e50db4fc91ea93182418ab500a44f521f8ebf7e202388da49472e7442fa407bc6604b8c0954a40f9c543a55a436a2eac98dd454755137602021130a9e13cc5107a9f23fbf9d1d1448a60d09fbaeb7472ff3d227df70964cbbf9bb0a35780cf7917e54 +704:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf +720:17d8ac181eb03a99368dc6cb4a8e3b6ed3b8ebfa2ac6e0f988243b96066031261827c3964295c33a20e45ec4529509e8dfb754c69e5988e7b67a737365980184e935fc8fe51b8e5b9514e2b61283872320e75a43aaf92bb9ac44dc0774068d3be4a1497616d5867321e03ad9e440545b82a48bf5a185701f9683ce291757e398e9f4dec98182493d977dbf57529c88e6c88ba9c92cd6c5af668d9d37c99d85cd11e58dcd6b159dcd1c699c302df95fc9e60b651bed0e571ee6db8e711d0bc7c69e52706be5a181fe213b28c70d2ec92d45056e29ff2314367c1695737e73e75b7be408cb3287cdca8b592f83fb03870ea88343331c3b02f0d91552d673d41c2957be143bd9dae64eed6c71ac8d4a8f627112720b1c5b95c2555bcc4fe8727fdb650f3db80a9c18bb8fdf885efa2cfeb4b56a1f1e78bc670c44fbcf49f84daaa1b9b1c943de2068364674b51a389dced863c8b4950bbf1e706b9d5132319697da0f5714e0380d8d7411e650df78f2e875c2178105f86dd0b7ff49f98bc61115e6231f01954c3c73957d8f26469b9b12232aeec1a592fb1fee638e02c1ac8c795a986734e896e79ebb510d9956e6fdc2421dd304c7fa11db82dc05f053d7fb0b9b77c368379245c2ebc3ff9573548985eead364f65d7737c84444b020b6875b0c845caf9e521500143f732cf13dd493a7fcad33299cec6ef50a088a1ba6aa42b9fa1bcbae6068debf5a0751785ff646bf79454242f784b70b6b36f8c7fa12469faea65dcf2fb8ab7548893c725c139514c0a317dcc6aa76241cb76230e9daeba2853d3aeebd02901038c53c08769abf5d3738750c6f2854071713ea513838d4efdea23f13ce194ab3e3adcb5e66504714ca084198c4fac1ed59e0e112030142aae46f89772a2440555990d659bac5c05c4bd6f7be52de389cb581f7a381759749e103fc184ef880bf6d170beeb5c931ac02ecfa92321013da446d89d6ab564da6d7865cda50677ce5d352ca93bdf702736 +720:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf +736:7d25eb22236666c1574748f0fd631c8694d573df66e16bde87491efaba83b36d389ff10fedf3a8fe4689d57826f47c5e0eb47119f8f6e61c589602762a6c3a7c3be980b9a271f721483ada30887e5dd6d75d906511b6cf422d41aa7adf1d1254fe299aa5faa1be4b95e63f235e26fe10dcb60a189ae415016c5484989a7d32f51494d9ac28c81822eb2760ea734da2320f083d3c2a708b4a68569073b11e634977b2aaa053b08c4ef1c11bf92d4cd9dac7ecd913bdc4ce70a5c9f0d559cfd98cca12c43c8102a9c89349702c173defef8222b486c2fb63e2b0ea9b1a103550cad8719883f349c9b21c135df1cb84d3f5ece4f153dbb661abaed30574c53eb7922a72737a92d4baba008bdf983a56bd58789242f4176e3c65031dc2a418b32a7ff53f4557cda34583b70710c6feec420938087728f9692c21edf00c6a8cb6487d8f51dede758835cb716b383dbe90fdd90478687b1da45905f0ce5f0cc2765c0737da9810c7ebc698bd2f00d0e905fd86bdf9bac5ac7ce4af90cf87242356fdbf3ba0cf19e82daf21d2261363e8b30187edd9b1339f8f48afc8880f71c06bd59ff7906e2847c5129ac20d2e68622b34eb29657fe949ab4953232efac5eb83efc010aada059a5073d8dad10037fd586ac93dc5417c916073765d7e1eacb3dd076f22809d06dd6b0c90bd776015a8d769ee82e9963c6153030a845131c9ce8f8642dee4fc878c7d727ab3982c8c3394482124a32ff12684991fb2114f7256eb3421273129905abc87de9b27a34009440f8d4537c8e6df11209b7289b84ace6f5d63677fda318c8f55f6535c270bc0a39b9a1d05f459db316415021cd90a476e10a342499b88181c2e5985902f761654380c59cafa90c0ca056c058daada2de18fe6860a4a5bd860bb50b348418f668266d73551d38c771266edf1466dd52989f3551f45e3075d9bbb8c95d8c8bd0f062534bca370c0ddafeb08c51781126b785a176e9410b054f66b584c4da0777970a141598adb1826d6f5038da6f25f013fbfa7 +736:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf +752:0c2ace6d4227b0314c8c9b39c2090541759f40f9d5d0523b25f081436b9982bd8b2fd7db50b6e6e8cf5ed828854f549c6d6f7b768372e73dbf7c834759b0f01d3a1ecfbb6d19b3ace85cb643e7d69a9af7d591608f266cb347298eb3756da5b92188c6d9e1dab31cee666b5dd06b3077a21bbd14479a35701bb5a21f80417a49cf36333b4da1a7a1871424cf6c3b90a0530c9746d75977b585d6a621d08161a3695e56b569184f8bc7b26519505422f220a4f2e20d5b5dafbe24a0811b675d0d5c85e2180ba194490f9ac758006f23886abce9e06d42b8b7519eb2c77f2a0545fd7b36ff0f15544b15ce100ac7a96ccda5b0a9d7b657f93407c86a9c58e08aa9ad13fec40601d9f7c79225ef8b8b4029f4d470d606b3e30acd463dcdb45c50a8b1dca6063d56fdbd05326a75e6a16e8b6fb41c3030b8b0e613694e8b877662a3361c95f0534599fbfc9a623fae8a119e98cb8068a911cca7c4edc105d65b5395d9ec3b75cf73fa4b371e3319f241f060b84c9760403395913abdd74bb75fbe4693232a853ace148248f218e5e0c175ba82196fd26f4c478014ec08e5bc47b599b6f42483668925d7e45eeb59026a2589d76dd2a6bdc23c292162355938f4f7440ff5eba65c946adb900f1dde05a85b0d82a84a2ae9585695cbcce85a88d99c5f4fff8e153d947b973766c9120b5d1fe2d6e3ea9fad4cd732e3aa869d0a721c188fdead76d98d37a4696bd968e23f069506c525f46362acd222e845cf4c0665e6369c4ca0822eb89d3711b070172485d8447d203f80cc82a174945c094f5e9659fc7e3069c8848efebef09dd3495b06d10a659abbb363b78a79bd8bc2de1beecee979d2b3b504a054c66a98393ab0549311337fc121f3728e6e8821be49820755ff578b3763643dd7f3b54b4ba694609017849c0bda642a49e4a85b8eed67cd9daff10c980869d8e1edf95476e79c5475110d16cad3c271b42d4809c658c2a0cbbc5394fc83dc416d255f814301b8711b91605e73b744db9edcb87fc6b14cca8ffe14d00719b00c4f8f53b4e825acd6b9 +752:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef +768:a96c69c3bf2a4bfe67bc553c6028bb5f42ee4178f87aee7535aada824b72716a40af3bb5bf039f6cee5e4524c424b15dccd1ae02981ab382a6070fc739d8fd5666e097ddf40b0142a9ffcf069445cf50db8c08087d5a78421f526922e7e79bc2a149e585075720c51be341d083e9dcd51aaa6aeb69fb08346e58269cd895ac0bc2fb3291f74a6d71155150b5bbcee52ada0d08fe6e4afd2d7e5bc7c4e18846edf2be939bc46815b68ced4532136bffdd890a83393f75653bd983f1ce52ab699b75d0b7c3293e398c38048e778f42aa988b51fba10b6aa379cc1abd12291eb11a910f927d13b7a74b725c27db8c9f4499f3d3b0d25f2d8738280b73ebb29790ada6e95ff7933a189e34532e3124027e9fccabf23ec6469b425c62ba4e0cd68177c555af0e49bc3d48f4b8c43328b57bdd47cc2c1a87df7764e25d49395c6f353a66b42f41e3bd1bc9f6ba84724990d1978b34d740e0bb84a8dd46edb245259cea37aa1f46cb8fe54802b65c98986fe9dc61a03aec493ecc2b263682d585cbf4162d6a9a7da7660fbe37a2e89cf1d4dac38211cf3cdc0554676e18c1a43e93e90c969da7c1e5265238d55c9cbb1563b07a77535ae14b895c5b020f3bdd7cbea272f79e5a42e23025cb25aef30a7e0cd43d01d93f6dae36c5ccc52d16e9abbbb65928e0eb97d83c184a8e181c9d8430f3d198dc024d757ebca4dd2f011863af893d4b25a434e304f6db5b5d46e193fd83404bd97216c314b9cdf59b68eb3272789472f0e0f077e98fcf53a9979fd08ae339598d57a0e59c0bfb7c6898c042634ee7e32f889eb07f5b17b568c007ba55d05cb33f554bec6f7dfdf165f49b659d3e3af859fcb3024f6610b5db6b176f250e838fe4ba8c21cc5ea2472851853702cba5ba99b17df0a47ae3fa0ecb36099c22df6782f8d45d910ebb2aa701c60af0d55da51659da3bd6054afe5413036532741aeb808932d10a4e5af32ee9b28b6c39a5c91371a58de8c4220f8c65b0458e764dea847b07be78c41610e02588f604733701255b26a5e9ca572c16f32bb92115c078bd76cf270aca1a56b283fb9a67f2f8 +768:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff +784:21278770ac93e98b0d7a4a5a2fc7014e8cebba97b575c45dc3beb9edd7e8a07448639bc285c9e7a98014d2b40c2cd33ac6f14d18ad1ffa5d12dae454527ca8d4a832e27e0c94d6b870f77e3c11cf54bcd8a8e49a2edc6ce8e19bea61c7bb5ef4f75342d3f2dc5e694df575ca778c0246da3669553eb58c7da006e4faa9f58d530da166a051cc4bb1ca70092bc58a07fc0cf668558e28471f6f83bb2667e6b131a4ec76c291a027b7a563dcb373ae1de152c17865e254699f5a88662621cbbfae892309cc2f06eca8c2a6275c7a65277b63266b36a8eaeb31a3b76e0cac01b155eb0e7998c30f3c7cb9556cdf1496108fbc6592c2ef7a3bd57a559ce9d9f8dd30e39e223a8090919c302a6d703600ec053f505178e83af97259a5eff1b222ceacc74ba6ac3e46097bb62cdf8ced6b027c68e60f76c222a6957284912ebcbbdb74585c03e8867bea69de6bdd68566873e743eae0857448b03b191890e791529e4e2149f88130ab912bbeba27ecd75ae44d6554e33bcca80e9161b285329694dd246d0b146d8a8918ef68ba5dd49aea22adea00b4dd0167b9a4a4b5f18fa684bec7c7f628ea7832ee6fea16b20ac303fec7a8df1bb39dd8448d192c19e686f90fbc7493898a801f0f231603592caa5fc5e562b737f82b89de49ee5f2cf7ec5be61ad8b145da0f9dd2fa0e6bc6a0dc17613c48f5e1ca260d35fb9c807e244dda3372d61f0f5988b4f2cdf703fe507cd932ea0d0833481d2bca2dfdbad4ab50efd08e2e63a29eaf1e4155d6bc80f1a665c4237cf40d331ac1d52f29667c9581d5a66b7b6c629956553aed47dde70ef3492be6b4a9728f57469db1d3e830a6719533d757f69b6f400c7f6636ee699f0dc06273d70b40335792aabdf8101952f9eaccd40ded5cb911bd3e55d698b7ae4937a619dbb67c7b02fdf67a97253d0e0e3ab0a9e24bde2046ba82a69b7e1bf32bab2fbbbc2b02680e1c2b08c1099b661f5bdb2ebc58fd39e82c5d4ba199efcd73f8a1843fea9c84c083aee456aa811c9d6072aac9868d61f3bccc40c7b1a3aa470296c4ee7525ff29854484a05485c327186394dcab0a9b6fea8a00bdfc5ad667b85c66 +784:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f +800:09a0113a78cf09a4a7e8ca519b63004d62f50d84c9570e7431e4a9dc1e7f9b2943374fc3a83961efd9b43c6967d9d3655dad2a1edc70b948c3ff10621aa60d6739da0bb75d434f46e251963be90121c802eb02b78560a0fa57eb0f8b7592caf2a91928c874573da9b859c85c3b82b93bd427a2e1a98ea8fd5337da73f456041a01f824bc3d1042f3dcf73f9c8809aedfabcc982087efa1953bc95d3b33a4627695839badb2ef5b70353e1ec2992b07089c747dd4614de1b1f273e8a22a5002b87d7dd2b92f7c9c5fa3b2c33e4e027e6bd93ca5072de8f918bd49ef3a8191030e83f104ddbdcc0e4f98783397c4e1d2c6fe009c4f2b0042e1c16dbdbb35f689dff9e793496ac33f6c96f70740a2bdb18688fd9b9b2865cbd4344c2a54ddc033a83ef3d134d5c8ee785f9697dbe28de6fa034caff78919b32af62e7cae90cb5b709e07a6ca844959fd5e015daed3d8cee560c1dc95dd5a4e1b30c03569fe3d9262078cbc48c294ac0603325bde7cbb9def6a4d828eaaf68059eaa27b50edfe83545fc7d2e008c046b912719fc7d72622fd73b0744ea4e023206f54797e7b36bee14a4f669226349d6cc2b5550f4543bbbe76e43b1746f52cec2cd735723538a34c9ab54db2edd22e6b163a4c5dbe7cea900b6f1cdb8be7ff25d3f18f2eec7929a4dd3d475d6e526c8644430106d02ffeb300d4dbb19f1f806c750f1838663ba70def27ed20f16515308ce942fa1ad2e8516f5df37751339f6a9a5835e8e848c257d25f806c5d5e0562ef2c96a541a8cda5950d107c23fbfd6947d68256fcba0098591b6b57418919c23d0ba37b2368669fe2701c4d58b629be2661b5f27d2b3de75fbd274c2d626350ee6da7861e5d033fd1905da0c1c72ddfebe92af2e6a6c7881f6a98c4b62057478d4173c6ac8d31a50ef01fed21177bea97cbf382bfd0ad1e5fb5b4a931f62dd2948c3a2b94ea5b4ff55e80187ad453c5b8c430494651f09acb764b8c44d47305ee22dc1289377481cdfd2a8664cc764b0982ac2923a485db4e8f7ad35cd08820f5bf854dc5089a077aa92a2f175c3f1771b14102c52bb2720619ffa98ebd94ff15ed62b8d24f9e02dd8b8f454e0d8c74f133df512cdbbae7 +800:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +816:3563439e39e10a74a84b204c7e3aa88695514c2c2b4575058999b0b2acf7221ebc0efafca23fee6dfec9640a6711d1c5fc903c99df596f43c8ddb919116c3a301a8f526d87b94b41c674093527db68aeb63d1705015d4c5f14099e258791ceea5bbd1369ae632cfa42f5c6d85520a5b8e3bf9691ac41bbb7569d44ab7af84eff60f633fc2be1601778ddb4f8481f940ddd8432d1aa898d2841aeea92dd4ae3b83a2e736454a8e779ee7b27778fc80b35a2c23d87e4b9e3db21cd549fb46fd8d37a883d4d210cc4336dd2aba0501db3c7ec53c5fce208b67b236ce3a446c036872ffe4251d455a444c00c62672b100de3e40118115b82ad2c516c30e49ebf2c3e8b16e1ed575e1c6c200c95a1482d89f769f14a2ad11877cadb3cd8d8ac0e26de638295a4d19d900d0ec6f24d97035e61dc8f4a5026269e205ba1b3bde1c431d56de4dfe0dcb979018ebb0e075fc712bf0114e3788a7cdc7ba93ade53a0e08dee265ae8ed1d6345cc2d5fa931c53e14dfcf3bc61c4803b3e86b702cda53efe0f6f0c9c2e1dc6e754736a276dabd46217b98ba1063a7b041d8d2685d9b36fdb441d3a23c60af648ad504e8c00301eda5b65696cde206d549fcd9822745aab3079d116905652052993e28b89e01a53db7ad3ab4756b33a024930a2b8e4fd39dfff919e8a3ff69d1f09453e0e9662b9a86e9956b65cc1e0ad33ebfddf19d13cc9e2aaf8e6d2c416975ab56f6b2e38c3bc00b31643e9062dd18a39888ebacc284ae73b6b9aac6e6b41e4fc4aa2f0a3c8a5c89e40278ec0649187e8a27b6240f8b68b67c84dc085cbdeaaa0e98b18c97785e8924d6b15899496c1079368dfce78b4e1321cb5b223ebf963231dda79a9c3b2c6f4c84c8b8f6420f474eeac754eaddd8c2b403b5ec2ba9bf133da6319e2a9a33813b94db2d4dadce0c2843a32ea06f75fa9e73752c179d8014def50b102e2018f3e46d00373660a2beb7abbc1c73d352d8e163a0f6cfdbbbeb82634bea3992efc2bc402a8383df91f7fb2ff0b7e5b87ba90ae76f920c7028cbd77fbfbcb6feb1cbb8656e0271223034edcc711a37a5e3d0ea3fb4383a5c2654bac15ce4fd97caa0552673a7b7409ed209ea47e13995467573dd8da2245a5d53223cbf3a1645a0de +816:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f +832:5d06971e1b3999c61b8c2ad2f6c69cdc1c07f5dc736daa78838c68127564bc8925ba600e892c04045667448c9be6101dbcc99b28d8fd809d31c2c0f2a0ce9ee430754588703eb7ed65dfd24f316710267885dd6cbace7d6636d3ac7e4d654b7fba954f2b4dc5164f21e6ccc3cffb9f430e3b673a7c64088adc8e841ee3d1d83b475808992588660e8756f438065f9a93b3de2e3ee0a5229df17c830d4c1a1e3d72e829eb8d77fca6b4cabdf16d0dd00862a08d899062b9e201b38dc0f755f08658a85ad83cd5dcfb289cd2ed3e2c5e4f2fc1097d5748e6e5be88df37f58696d69673408b21b8ee1fabbc63332053c206e54209aeff02bf2c7aa39634791c5d44b9ef2fe117dc9835dd0fef1e18dddfb03ba8f1819983fc7bbd9176e663bfe291c0b655b64d6d520901806a44c670e16bdb551bde314212ea306f440cc3c1ae5fe18dff4d58c595fbcf2abee582344f334eaf7c0d06faa39c6ff9219677675c857254644060f3117cdc9e9574c4af13d2b91103f92fe8aa66874680be0e31f52f7df722523068e5120c6061b50a84599c29fa33403c1853e393b7f971cd94633b9808e9b2b487d2f818dab80399d74dc40d6a5a9f9f0ae86e6b3a404010755b6d91b283bf96eddaac4f6cd918d37e13813b1b9d5fc56d9f6c6b704e845e443f2c7ff15197bf3ad8780a53a45dfd434cec61d6fdb148d3001f6d4d1da11b2440cda7cfc4ecb8a4dda37647b638eed69d15292d4af489bc7207fc562627a2bc47f30a1723a19b956a6747bbe5fef13fb83980730599adf1c8c79f3eb8f8bd16f8872e3d011d24967d5b4df53058bf6d850ea352823cad19a0b1e60c0c2430b899530a593d02721b1015cd334356291ac48bb34b840c8eb2eaa8490e31f0fbb40c405cad0a4a7abb1969a4781d45b39ddf470719909cf853ce0854e4ea742bee2434c49c82cbec4f4ffd6d417751acf04c7aa3cf806a33dbfdbd4b622945eb65eaa698e2ed6e648e068bb6ee917d72f7e1f0c50a96b9f139925ecacf07d5823772f79ef5a0bbe3ea5030b48a6d45a96cce9112ca45632c58629dc7765402d180b7ad3b88e72e59398e0256ed406b5ae58fb91d7263064b78667e37f1bae38d4565d90005d29c2dda4d8421f46671a83e6d457f4843b1c3a40468fb92271f1b085629 +832:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +848:7425c506e34c1f7f41351e6a836d712e308fee8e9b07b0ea43fe7c91aff8b9d2ff367a0e7427d06ca131e396ad7d8bee4d92849deb3fbed9d3b4c69553a85b537b10f671fb5bb18e2c0b81cf3d8c42511db6f70cf8339462d19e0f17872ba0264ebf4ca34e87ab2e633e63f88f8fc69be8bed9638f5e8a33b4ff4b50408c5b640505069e862d3f43ef3ed5fc691b9e2076c378c32a3d92668d169aa44be6ad4259601528fbcea5fa5d48fba49f830f6084481b920e9b9c60bfb1d36c92f8bfba1cd03f75d77c1e20af32457d64a148bd0509fc25b9e50739183346a1e7012d9dec8e9f7f83a48a745e483889c20fc88974cb2cfea5a271a3a48155e23d2f27ff0b9cf92df0bfe67af2e0948355206f2a28b6e984a211d6e2d9d4b4dc1dbecceb26cfb8d61bdd439fa7908c8377e75e3ef38caae86b49978d287463d139459da625f80e5f90b4b210095b29ef9eb54744f9c0e1b409d3105b5583c0774af8a1a496559527b0d6181fb539a1ea5799e5e7b36264024983803fa1c22d5f9fb69ddaabe3b86b67f1a1e28ac4f54bce5095c62c34cf44eb9b4c7dace34efbf79bc064fae5cac01a3f2ff0f175aa44b0207b29e4404f058b633f994d6fa2d87302b0454deed9305b9c6a5dca4413deed61b3d0c13c23b69c291a5197842dce0b787361440b9b8f687284cc923fd3c50c1be290927386b757f9aaeb318a878296c95a243affecf5387b6d2bcf7f68f407dcb2b775262acc0460e516d84f3a46fac4f3a2b6f413d57a9e865a01d9cfb1395742d05cd9932169de4ca1d242e6a1cf5c6b230031ceb0a1bfc09fd3520528f11109bed15ff9fb011b13d956b34c06e7ce5f28693f8a4ab93df6f11e6945b56d32bea6ab4754be8c951abf74833c91e362b50efd26a0787b09c5ccd9386d79c7c2c6eb2da20e873108c16a7658f8b765fcdb6480071a0b8624fb0ca5ee081bc2407586aa6bf5b285da6c10070a068e1daed4502fade3ee5aef733fff590d906cb0aee09061fc8033dfbb6f8e52d98223320c17ae6ac86e1ebfac3beb758b80d0818a02d335544c372f70fb7a602668ab163ec0b9ec5d00cf637ed1aa4e6d8e76668d7ca75a418a71f57c90679af483758cbf5940272a901eaf1ca9aa7335c6ccc1399c8d7f829eb7bc9011c9bc71920d5d80efbea91a2f8d94b3389478a81293e7193b +848:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f +864:764b92fd61e99249b6fb085b02c3b204dca2858aac1b419d9ae16dc7e927aa5ba4971a1a4ebbc54236a86f4372043162ddc4b9c35f4ee43a1cba3f090470e80f5dd1aaad578c518da3fa5fec78d464e74b2acde84e5641b1074868356cf1afed14271eaf705ebdb94234e4c9b00b4f88fcb409b2066ec82f954def23a153b95231d03bb4a1c8fde19187b997555026e19542427f757fd7283716bc0e8d0a4e78c8861e7f49733e89d28179508bb5bf1d03d8ccec34225fe5bf26803456f5210b4a009570d5683a83c0f8ff480b4a4f454edcc2cce8abc112fda27595eba8f3a101597dd2c2d53b073816aff654c35de769b6396429bb9a1b4395d08229968e57666832356f43d61b9132d752e9839659d286dd75667eb320e90b0e6352e0834fb7b18c658ca5472ac0909e018f7f4953affd3529154ad883d2e91d56c41ef85ab7a49a49aac116d0051d8e0f4e091ad6f5ac4273e5e56d8dcb3ee0e6e759eb2a7f54d71f20b7d0250056c6eb02b8a05d812f449cf47ed191196156b2e061098205a9eab3fe510c3691b439835dbb62705553f0edd6fe643fb54a273ab3b7bcb37b9a46a6d5b508f0a42679cf11ed4057c87928018d72222b14a38a1d1e1744eb79ba7d7271403b1fe3ee39d76d94665a313f5932795cf66fa08a5b0e61cd6b32648c628ec0ef0079ca74cb84ba96627e349892636f0783976d16e1aeaa21bd20b8b0c642fc73caa1e5d92fa1b412f94ed3e08e21755d608f5e62e38726785daf73306c082a5ac13690a82465babdf8f154f0096736780136856c86c5c63d95172dbac86476275387658e28f612acbf0ac9d44dbb015d339cc05517f5a0c0bc7c7e7748b91df87b6f8d48b8a8921a7d8737da324767390846b70ef4f5aa81a1df8e16c1effbfd8610fd5f815ae42aae521181b716f42a24e601ebb9b95358a77a80ed2e7da8b54ab9359f9f15c9628eec00b38cc2134a671f11ae7bc96da59da73ef278338716dd85a67bbb507b0600f26186dec8c6ab4e5a68b31c0d0501c69a4964644dc0e4f611b603b4accc295c7be7d6372871a5bcc5be78e6f53689c50a20f0cc1b4cade5c3c3f465337fe7ca320eab9f2e6b4fb81897f2fbdd79f2af5641c41f8efb1c6bd7829c2959946a7671ad4e62916378ee220c9356d54205d88d0f32f128bb80824f2f88506c590eb4faf8fcc9cf28afbd391ecce6bc538a5b66 +864:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f +880:29c2f3b2c6bdd1209c76fb6b483a0fea5b269ddce36ca90008cf2cc52cc1e3b382f3fe445523997c1318f50014ce000de365dbaab930c4a8ad0743ba4f8c9fb4540c5ba1296cff579a64b964efd3f62e481944a5c475af35c51394383c80fd5cf37eb969e97f53afcdb4a2914473523a61e8239fd8e441cbb028c23b9a837fd05824972fd9e2cf92876d2dc93641e3500f52be33ca5f646c8013c04a256a71bbb4ca3e4c8ffba6113e34ff2423ee5c623902b47f2a1d8f51bf5f0b33d3c8d948859c9a0787101e126dc8e5e2b5bab6f125605f7b1a3ed85e1484bb6380bb01b44d3b18db78d904fb9f239222926893314d85591c5970f2c287dc78827c3895385c306a6dfe05000f7f01bcabc0e7ea14edf019f20c01f3732e4bebef395834d069582f685157f93e7924fcb0fa4898662fd67144f5b5bd07f8ae60d820a4305151a29e9306762914b579a52ea1b8d6b06e50e039a6b2148dd063c3781db0ce2c0e46f054f41329b57c07e5f571356a29587905be947cea7cb38a1a190a2cdf443514e09fb429a5e8c56a8774ec2344edfebc4aa4088725e7083b9d0908f5b0fbb71876dfd8fa69a0c1ea5cac706c6063c7ec9a2ce986e8ebe5f3cfab9a7bc636666b627d5338d48bae45016c6c98748f852554fff47b0b46f4d2951df9422f839ada5b10aa5c471f359ae1e462a839bad79af26322893533ba119fe5fad16d2cabbbc07210d2cb6eab815a4a74e8aa60332da45a8eeb37916365cf4435aa5b5df3686b299c846bd33412b7f8535e470074a9440702d9f98bf9dfcbaec7c356d8c61077235dfdb66e3493724e93be78c5c114c9e7996733f1c6c618d960b779263c1473b7c0eb6831bdbccccae88a287ab9096f5003a28f9d9026366554177954ab34ac940e33d14e2c61c74628fd617dbb4bd037c5763edfc5243f1c7cd98bed9718e8560c1ede47c5b3201fc47a2ed5507697633fe34bfcb9e40827989378a85f3e4c476f2b1c210cd0940703637ab728614e98f603a46cf5e830ac644c848a5e233349c5d5178c67f51261d1d7ca4aa36e293ef771b61bb81303b4546f1d6c7b84d9e1d47121990c3a7b819d53195b7ece7bc6bb517948cc44778200a7a53b083b1de133e8fbf1e51da9cf49cfbd04773654149bdbd679ed72acab26f301d895b1bd8c045fec96768ba49021fe380ec68ad1d143f26b8d2e873fc8295bba799c953d8b9e0857df2fea790f0d753432 +880:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f +896:b3807844dbb30365e6f40f56e7b1f075d50762f12c64d7a7afdaa7da9b9eb80e90bd263a5977f9ce2fc761627fe447780f59fd6f452c0688f5ace451c9d583111523558b007e17db611961a6956e7d778c74384f427eb54ac2321041e1baa70119c81978a751392b4f49704f14c9fdd7f423b7c0c9b6f8e89c25999d7ef008f5397968e26a769bc172b50974f6988d6d92cf783634c79cf804d59c8e9225a17e7c6fe42179f52239ccb1b865c8d4ed5ec8bd7bd63f8cc1a05d6d652f26841937f794b2c0c8c4903e0b8935b1868363798da983541807debf9996bb6cd5f61974e06953c3b72ec70c6b5c69181e2745033b3d7aabf40d84845aa6a33bdedcd6383f7a19506e65ca18a38777768b1e229a13da5c054a585d1ed83d7a7839b780db663b634132d90fd1c3941f095282c760b21889438acb47ae02b9c2f3058f13186b16cf9c374545c804807ce2ddf590e038633619b50bf2b78a55f6c08483563d267ae84924f8b1b6a94572e782c4f86605446d0650556ec5ffcdcb92b33a9c983b2e4360f9887db8312ff2eface3fd92a2b8bf034bc720ec832252a5eb9d81732ca31a926955ba01e2f28699913a4961a26aceee382e3ca742f1b9fe3f53f71ff12f3bf12d9ee7e0f0de6ee089568da0511562813edaef60f429beb76626814d40854dc91fdf6c27831407113074c1661feed01c7a222c2c468c6f4207f625d0a09e5a4ad07f12388cfce72c4b05ba1d6c07c3c60c7c744509777b7e6feb085a33bad2df5538b4683976d3208be57c217eb5de4a5b5844e4ee877381ebf08f975b47ed1d17ba2c541146802658a14641376c13459764e018d7e6320f52c6cd2c7804d78d1b74e860e134b36628b423bc0ab8e45b7db1cd1f4609ab93878c05ea070cf2d5998cdbb8dbd87f1226b24029b53471f68439601e04b658f4269ffe58b070251b2864298adfc6be0a3df6d1c94ad25ac27aefa0cedd1473e9a3808877e1fa65f6411f82c67f42c94c655f3e2e9215ccb082d171feccc6ea0688d29051d6a80ebd36382131933d5d9f9538c35a489446fc8bb2748dfaf232d51bd4986c3dd5df2427696fde8761c695c12d0d291099e38c7abf0cf2e25fd9523f8dd0ef226d23cf69f23db15e46bbc30cc652ab7140f3ed4caf39d26df35d6628cd39bfd4493d535533a61bfe210dc929e8a6f50db5f0222355ed2ba3f6e945ec86c740648bcef4c9576c327f9cb3ca52612c5b72d8f4b152805e6cbf83593153ea0f0b +896:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f +912:b690948e6fbb6d5065e1f143bd8413a18f1762ae4301c9467f31bb75fc73cad9ef44a6f5d22d9813d068b555bb4949faa007568c86f63663a14df9d36c40e329435ac5baa656796e9b92ba26247a266a9d6cef4618ec1fafb730fdb5e417503a1bd061ccda2f93bcab6c8d0b1e11d9f29781c2ae361774b82b0b097be4a6c0494dfdee31d97591c22422a09418082d1c3689fd8b72828ea1730531665ca7264e75aed3b4f22845cb813bc525d877dfe616278e2041505c8bcc0b3d52bc8ef7335ef655733f263413f5493cd65d233c3f0e276881dcb13b27760b2694375502d9de447501dcbdb380e8fb3d554fa2cc771a38ef927cfd4cc3879e497e86006f4aa3b0e9ba3de6844cbdb0e63e04d83bb124ccbeb91aabb4c6df567ff4c4302a9e8ed13c5932e1c8ab03d3d0d6c6e4715a641e82d15f08de55a818b82c437ac039616499da2c3afc9c50e85e7af23801516961d2f4460ff425b10228c42594e78e05a68f238be3957d15e2ba3a227499ff30564f7c2a11ba00fe05505d0664462e301738f37b59bbb43bf44e3afc41e789211b97005898f8edb18231afc26ef98965df9e38a2306c14b82bd995184bcc1078b36cdcba476980a50252447a4f2a5925e311a2f21067b80b35031d677bf3560d5d5435c1131d0eb9863eedc06095c0ae8a4e6b13e9fefad3a9c9b35bd6adbc4db04ada77e3af55181cb17aff5aef861bd05d7ead1f42554a5bac36cd5b2b89cc10cf2b09072d13e517411235ff0a348894df3dc8d37a1828a5ff5dd31c9d04205ba0cb98a51394359e202dbdfda332185ccced81f451e7a7b79576be0bd5ab571c82c5763fca0ca66527dd9f524c85dd06f522d85de846c111ece570d1072dece75853d72d8d2b76677b53877b9586473795ce9d7b59e612023fd08a163d2897b35480b4f3e2d4daa092daf321031878e5432197133ae6a763e336e570f6e0428ea6a2501aee160b3b9ea2e0caa101927b93edc6dcf92cc38c4688989ede312fba3ae35ccb8056eef57668dd46f2f0ed9ba2d35ad450caa945baf34b8f254a3e0afbc3bdd37869f13745622f30c35f380d62990bb5c40a0dcbf6e13ec0cfb569c2581ee68e16d1cdcadf77a15d166c59b7f154aaaea4bd4287c31f2683013facb53bfc69998d5d35a58c4cd90a3aa3a049e06cc63a6d7181a2c38817be9c4721e346667557bd8d076c1224392d039ae243724dc495fe2ec3f2be06107bb91475f23bdd70b91f86c5f42711509222f29783ff066ea43cfb2933ff327ba83918 +912:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f +928:bc5df364add8c8b84b3cd442f0cc09d2ac092ab25a81c6c57a5a13f62d9fea43c0fbf314d71e05c4eb01158aea19309efb4a5f32de5f311db43f568b6ec9d54383738ce402eb66a16129c4ab14f01ba81bba99ceae83b1e126f89125dbca89be178c23a5a1a8cdb287369321b95986aeec02c74a63fc32d7364e2e49382d440156be2428a3082c14dd482374a8ede2b3756a49725ae7e3148e8cdff15e8f2c8287d3fd7933e88b1c2439c6b8a0147d14c4bcf39a718ce38f2d42108282fe6ff236957fe5396362eb0e0dfd53e25d7b38e14de45ff451f1b56ec05e5d1a74d3aef5f2c0acd4662b5010af266fd653f3d99ea6e0a538655f1709e221392a7c450cdda6adebbd0f13fd3eb85520a7b8b5ed07926a09b763c6075fe6343d2fda48805d9345a3bff442b607e7d1417ef044d82f32e4fc2f8370fc36eee84854c63d4b4869a5b14874f03bad28b1fd9228f2eb648ae562763582dfe198d1a817ba42e2d9e7785cd54cc934045ac9985c9ae3d5b54dc61ffe99646a7f041a5a424ef909d68b1d8c042952f70533d8ae85e677d20554566dff1097d70780da80f5e6061ca27cfed9365c51a2db775be2e145fef14b2cf9bf671110be653f0781ee8d2b77f40e7d52f6928aa6e3f6dbb4462b0707afb354b2d88f1f6e0a9a687c63e2b0275e9309930956e310e37935c8b142af786bfaef99ef4786b0347c2238d8c468a77724b963b9bd04b85766bf358b44835a765ef105a4f71352f00d53aead6b98799c36dba4f73f6ffff880ffeabbb4c7bc97b61d3c8cdb757459f70a800e68980f120c1c5e9c4fd87d6b8d797bf3474744e42d5075a903d7ec24841b6d317d0e266e96b7fe40c1c65e90b65ae6476fbf4db5afa20d930ea00a5ff117766f300497b64edff10fbfcdb2a5b389c6ad4f1a4dc7338b6aab66f3b1c914b64c980572fb858eeb2364001271f7b3d9230faef634455753123766f14bcd0567905a121009dfdd6648b37a4012c5c534fa097f9e5e043a4dc18e924131cba32cbe91beeee1dbe8be95a91e3dbcb3eacdac1c6ae914cf50df6913f8dec3b17b6536df1fcf276b241f8e3ca34ee37f9182ec7beb3965f809780226c19da869a42aeb0ca0f75d6c8e61cc5241b48d1d0896db21ff6dc242604ecb003d6dfd3d04ff9b3ef1262c5c8a39ee525e642577019d69c5c2d0be5872b85fdab68769bc55658a553d1448918124284ee1a32961f0c6e4ef97ad1c19a5f7e75e254f837560b3c25c31c774248d1e48a5f7effcf96abf9774dcec13e732bfbe0a812ce2a4a9b4a08bf80fc0 +928:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f +944:62e7a2ef1ec0ee486b1de8c2d10232ebc0615252f48dc33b7700b64c262849098660a89d87747d7970a029c15fbfc980dc2f780ccf1f3c35283ecdc690412debb3466da444dcc5658b025bbc34fdee1bdd6058064b42ae92fa228f576337e2cb01bd062e5f8a353b027881e5b95aa153128a3a3092a4dcaa6395c59cadfcfc44fcb368c1809cd8f18817c8920e02f18ca7bdd9bd441f4d7a5ba3e3801ca1ab16b16742a77d459055b7fc755e74e525e8d21a1bdc6105c726d5aec9595cbc3b2ec95643739c49678e177165c15a5f7252020e48225bd5b61c0a3021e4811ee6d14a5a3cba357f429d5593a55a58e6b13cb105c9434049b1e86432926efddecfca063e1502ecf33915e00e7e4a03dddfd64ddeec5aeb18a4c6dd054495fe05e0bf83d4d8fddbaf11799fff54fdafd5562d0f0abf1f3bfd67813425b9568c05cb70bae4c1bbd888d3d5d79322127deae89003f857b66d2e623eaa7ca28e75012c669d28a438f1b47d71dc03539f273969017f033cb4037bed293e227fc3d745b26727bffdb313713ad08de751bd9135e8f2e463a1d8b8b8b2ffdb023cc5af4497b0e8dfd19ecb29684a15e5167d9bbc0bcf674a0c9bb454c6e31c81605776af4b640ff35d7a011ed5658df6b7157acd8f87fa505195b5524f3283f4c4e8bffeb7af66cdc233f1af1d9b81c63601eb5863de6d2d7ca892207c20ae6078dd347f9c1464d92f39f55b7a62caa2913bea8e8893f76e92fc1408b4f76412ff5baf04d62766282c23588eae49908c856ed4eece4ede57dca9e745cf4838fd3c7aef6a857a9d9826db5b571928ca1d614467225deb510f4aa24955a00755c64e49d3183715a34f7ab2069e6fa864e5cefcc706633d4543d448ec7a18779cda8e6116bdd4120c0a1f653161adba4c1abca388ae6f40c96d853793e5aef469ca3c57f57f19c09f2eecad6ac0bb687fbb0c71a932fdd80483b85759ba661d3a9747c5131cdfcd7c1b46ab719a0fd2f0a7c1b41fa043177d5187f1cfe9f870a36d7e71f080a286aec0a2c6771e629944551f3692fe91beb59c3fff95470dc42ad077260f0f20912c394e2e04baac2363d3e056d589d763b5963642decd3ff5e345377574e24b87405ca7179e2d6a278089cf89dfe726a3639e4820ba48cf264717343dfa7e0b82a3928fcca98f3e1129837f2bfbd732664583354e71ac115009f3e8a9499694af02edef9d25c95291f206bd931a5d43227e1d0fa1de8ce06f88fc33e70ecbe1b17c5b43a716211f6a26b1fb28a431f3c2ed6b106ada51add23e4eb690a23a91d2db355c880c441390d06a9de6022e499c +944:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf +960:b8616d0a83c9aae9f1ac8ba538c43eae3f5861843787aec8b1189d7c32e072d79fe1f08fe0291740ef058d53e52c08f41cfca7b8d8eed4404a24dab6816003828c083f57152cbcefa411d213211e828efef1669cbec96fbff2f691ae78aebb5ddccf87684cf08d1c243ea7b3c6bac1b11ebe02ff7e1c342e825670ae7b88bcf31c3850f94dc540e6bb9be4ed8fd08113799c539eb97c1342a23448cea9d81a188974d47b6bca7c37dd19b413746f7feb2e49e1f7a61a3e6516b4bd49a2b02a73c27bbcd95b262e57986905eea78a7579b0a01a98269264a5fd2f1297cff5d109c4014c07bb3a98de6ba4490dbaf81ed8c62a6942d7295815f97fac618b3533e8c3d1ffb7f047004ad18cf0278d3d0cc046f67e64914eae29589381ab9b14781c4cf801579d01c5d5472816a6826982d5a626ca4d4404a10bb882b34083b4d2a1be756ded346c2300705c27d517cd2bb607a7e2c2f1b209a3c0ae4dffff1de98f7e64848ad865354919ec5efa517cab15b5f109d2264fe98b019b01665d5e4a73e98afa189699cece78b2ec97925ce99e2a2e195858f7487a199d55eb8ff9a69b11cf958b5d522a23c0bd30e6092e191ca4ae702d21ca3fb0823c57de653a93d7942c7731ae7a530c74fcc18f064f53fa507cc13608625d723ce39bf937a969c68f20c4b8aaba3869e12dfe4fe887d7cdec7d0c6efa9bfa11a949ceea5e16c353ea4f3c834161d3cf991a73d750e32ea75cbf15674a488028c4967569534cf17f587b5cde13d0e39614c46150d48572522fbd1dc4f4e7671b40b9a9c2bffa40084791211dd9e4fda25aa547ca27d6f68569e1cee1333b6fa3ebf7937aa6765a3421a3bfafbb605f95eb5bac77df9530a6a75f87c8463ef1733167316b4339ab8e41d3fd7dd518ae7c28c043fa802924b854ad01e6b2e7166e3f1966bd352943a794b6f4752beb8122103913a0f1a88d2f3cd8a210a54a81b991b3f566b912fc03d133c4fc55537bd0c9095678f7558b400500060f01c179bb9e998361a6c4c140be88070bdad79d40984579cf663db9e5de3d29274f1897d4d576ac3b593343e6d618e0747664429e7c087ce1eeac4e5aab827e24f21ec8a1bea9c0da9c41859ad2b09e9cfbdb88f426c66bb5dcfac33aae44976b8c567fecd0ec0549612d74f1932a571649198c736a602abf02bdf48bdd1fb7677e9aba0dab07b8afa973e1bd50eb9977f6d4779c24ae085ece616dcac3a0c8d6923aed9dc256e48a08dd33369e6bb9d619a3410ca5766b6cacb1cce1fe5dd2119beca4af02889721b0e28b3ce2c14a746a84155cd66408bcdc9d62fc7999eed86d1138aa4bdb5e8639ac2492 +960:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf +976:fe8a924f6b473e4252e8306238646b383cb6cc6adeb6c472314b1c21b0d651e2864e875d4f5c47b9c8b74493b153f6795fd0265e9022f93ed363e9e4439e233f4298d859620eb269663a3094ef87a65b8568e8f646bb7a94a9bfb666c416486492bc14783cc1d32a6def86aacd4fb3e808785f796cdb3c67333d14dc611b043ad8d5dbd9ebad1b18f3f243bc67d4578077872de81f660d01a9a0d289d24d224ee33852ba898da68b74612f7140d3151f6d1dcc4304b1677a46f623589d3a1ccf61434dfc23d0fc2e31cb118ba4d02550b0057a261e736d8cdfac1f33373d2ee932bb6c07d3420f5c1791faab4e61ae17f857d716b93ff583883a834e6d878db98fb9f2abd0b1641a8f3904406d536c480f1c6be78083b745f1d8cb103700911a4c8d5b9b8f5a1dc5dcf5cbb021ed9f035ffba62f2bb1ea524e4fd999aa226980633853ff20b4b7094f3e8fe5913b7bd36259bb531ec1a4a41336a855cd8d8712480b380af3e66f8eae13b964fca9b1e1593ecb904cd6b8e1daff2296c268954bb6baf1211e35280c3d0115374055e0dda8a48486f45d1236c04d3e3d24f4aed948bd5467df2468929840ba0af1487e96f8883846fb02a6a20cdb3ffdd280a534c0f4d88743694b8abd71b24ad4dcb7ca7563f01971815b785b4d29c91994776b8a4fac9da0f9fc76488d8016bcb77d927125bd86f2127b85dbae52b0712358908a75f545c83ef81ce34a5f931504ab75b0d1aa12814f176ecec759e9cc8e21b2e92a3e2e6fcca56f8e0c6423e1a93e4c856316d7a6a2cb9ac4400538cecaa9ac7868ce99de9a50dc7b5bb7707c959ab0291708e83395bd142225261ea222b9ef58614f5208848dee2c97baa86ab3e390658803e0483968d6f2a067fbaeba311983066b9032f99cdbfb4d767729bf7d9148345724462fb868297e6b325f289f00bc151110f89d5ea758e9484eb26ba3eaeab7156308740ac499414b5d75d07fdec78843ba261a8c58d03609668fbf55d4ad2eed5b0ea4eca805d633541bcd6e93020003c6ad2cf360b03c71c32673cb34130f7634f8eaa459fa8bcb56f4476738b49aa9c7569672f0a7e58874e8d2b78373150faea04648c08873afd27530b04f9882f9921306fddea77a186605390f40de81efe5cdb48d6a25efbac6f6badfe7e2a7eea7d204151febdad5687c228f22ca4fed8b456cd5a7eeadb750ff29cff75016d8e5a439b735aa9586244300f6f78164b10f27cf311e46ce86e4a387ccf72e277ec6eff71ea62e783bbdf20a4f234d54c0e3d8c24d1fc3c9f27bb5c160d92cfd4b5e789a0f54335f7b16b7226877ff142e7a396f087422c41ea1424c7b89f7b05ac5f16b15ebf37ae8718b511b72 +976:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf +992:af755a7fd216598bcfec0d1398921f87ad8f9a4aa4418a5bfccf00bc9a710a0669ea2cb17cae99ad9a87b731236847bd642a3598c7e590e0135d0aae144d288fa1426ab6c50bbe70a27b72c793dcfddd118373e22ae8f680b0e8b10a3cda8a334a0faa389f56b7807c05d6cefa9560b0467c1ad10d29f83a5c07d6c69e8917a4aa4520cf42c7156ccf114781ee80bf2f1558fd9efdc9f9ef369b219ca8106408d24b6bbf851816e8e0c989615fb2d4c0854072ab3758ffa22c69185d5ff6920cb62fbf786b054353940081a55fd81979b73f5808a9cd29b8d3e4c75a622561375e95d50c2ffd61bc967b1295c70d8c8163c80cea6d6982f9a72db09495414a99247b24bbb64511ddaddb8fae455816d7c12880442001e8d0588180ed69a9a84e975b93659389c986653e8bbee4332b748ee40d8e1b556d05da8a3aa1348972036fb2657f29d044ca0ed4d8ea4030a1b23d0e973958806d8dc806430deabb64d5bd75dbcf2641a6d2ce92f297a8598c7aab436c1485074f244b609aca470151e8f3d54102f0d4290ba5b7722758a363c873fbc88e43afb2437f79ebd38990f72238bb865261bd434f9da58c0a54048494f0746b9690a69510361a02d934b14ff0589353828d375741236f1b45497d8afc1b479779e4f724edae20e2609764fb9613305d370f16afe452be289f595941981b451b4180c7b4b65843c2d99a75e4332f1ab83f8ef22827f94c6ecff6b3ec136033d4839e3518e1f76d734910556bccc0394bf619e209d92275862ebcc19d8be4a68ba52b6ef05db9ce497853bdb31764a351d2d6b91e0f1680b84d154e7f3404b97a0e9643188e27268e73f0740e9ac3c4461c9be061970a7b4a77db5bab38450b4fd0af274fa8c4283b2e95776c63d023991c8b02da1aff122eb9e661bcb1239d67e516500ce626e2000ef9767e75843c5e90679beee9aac3328defc89dcc5da2b7dbb76ab1dd6d84ac22f7e05d9e515b827824482c115d7180cc1b9378fe0eafbe34b545fa52b3fb9a9bdce1e41a80b2f911747f6bdb279b140cf12507fd33ef9eadcafc7ea5dc107a3ff6745a30c12d8ded824580aaa274e49495f017435979940c3a0035be77f29e099f44e1ee82b00a13729b2b90addc549d6799c388630ce7c42691b888380ccdf5cf7a701ccdc3f3422a677dc7f7891140c7fbb5093626349066a7720a4c696ec590fb74a5ca7f6b6774811af33eed78198d5b8de2371a9aa768b789cc0ca1c381cf4b70104204fba70b140a87e6093f15b02625c7b90ac215c3b318c2efc85c5e9baa06b52e426e2d3207b638f28af2814d8bc6dd29204e1d45823e6bca114acc39bae9293bb4b292bdddc457502b6dca9a7a80ba45f528a2234a166924d62b09cbbab14f +992:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf +1008:425b0a3543b047574d63f3513c2fc330437067ea9e14c24487e0fed0a5e5ca8c1e92d8c5015e4d25fb6bb9e7a16b6f0fd54782f84499ea944ef01b05053c004c730c5e229523bd7e017dabb49487f4aa6d93e580d7d5d6f05316f39a2f3fbaed95b615a83b39a4106dbf127e9d1a134cd65780cd9507723e876ff82a63d96c16a50ec0412f977b038e0efae2fcc1203da3ea4feb029a5be2bfd502e58d1f753fefd49bd3c67ed0d79d99618efbafadef0b47327803ea099247f8fb17f7ac8cc7ca37a32f5d1ee27f637db36d3c171af5549f554b4b9422f8bfad644ef9dbd47fc868ce4ba9342888ebc8c69728902565f1b520528fc73dc2bcd7d516d0a4ff9eee95069f487c810efc38bda54933f41ef69b3a39f28a19afaf758a5abf173f7544dea90596ac9eaf6194f26f444ad6f0feaf9c6cf1827a35eab9e4a44f7bcfa085dafd83f5a2ff66b73f58e7415d906312749427ac5625bc70f7b58dc78f2b0153c83f2d2503d670b9da82df1ae7ff567f80464f1a7a7ffc2e69ccbd507fdce91714691582800a07694969536d86f1acaa4bf4517fcfb631f08732a9234e17154ad807d0308aca397fdb648dc49164cfaec222f6a911c4deefa790738aaa7a5c94f1668441c20bfbf7e1a72f9f45b7e62e87214194c9b4e9a4e68702f91d797076c9268dff2fb1bd84b4bfab3af92bc7fbf21610be8819bdee42cb40515676c4d82561a41d930b34790a6f744d05c599256bbc94adeca9be462ee24fce633eac239ff0d1423a51c475f4a51ca51c570293988113c64b921b7496e5a9f0013578bb206819574ee4fc80067ce33df536a8a7fb6b54b16b719c547257cfabeed00c18eb120e019c09e7d275feae4076a1957035e05f9649dd93bec3e56a9aabdaebbe9bc53af637004f35f029e75b44a40989885c7913574fbe040ba059524044f00da3f29d0f6eab71b8508c5693a8401fd0bd0d4312d018b9b26cd2633ee477585affb5a2be73f156285bd93905a227f6794138e18ecc0fedc9814ba806c0bb2087653e02295aa13807908d968d6966c7ec21c936c877b8ba6a76f2dc367dd1b538c0045d211ea81d286a8afa147eabea42802fe01891012a1766551abcdbffdab8191b630c6a98ba91cd9dee647091838cf31454fa7c877418fb10b19ef905408c47ba1115394fbd5af5ce362b1f888124043a5fd3fc78a041fd7240396d61d2fe3fceea37488065b23d9b7745cc46b1769aad936ded16a4fb73b982d24959ea0ec38f6d0673b1e4272f0da01512cca7d2e14bf2481c5fcb37cbae35a95fa417b18b1173413a0d6ca1e548bcdc09b070656b98b0d6a05fac98c986ccad9c6bbd17881412adcef7d041550c753f26320a6e296ac0059ba1b91015bce4a73a7749a3dc02efab9668503d20f492d78be481 +1008:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef diff --git a/src/ciphers/aes/aes.c b/src/ciphers/aes/aes.c index d8084c12..32bcd697 100644 --- a/src/ciphers/aes/aes.c +++ b/src/ciphers/aes/aes.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* AES implementation by Tom St Denis diff --git a/src/ciphers/aes/aes_tab.c b/src/ciphers/aes/aes_tab.c index ee639d89..5f106ef7 100644 --- a/src/ciphers/aes/aes_tab.c +++ b/src/ciphers/aes/aes_tab.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* The precomputed tables for AES */ /* @@ -94,6 +94,7 @@ static const ulong32 TE0[256] = { 0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL, }; +#ifndef PELI_TAB static const ulong32 Te4[256] = { 0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL, 0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL, @@ -160,6 +161,7 @@ static const ulong32 Te4[256] = { 0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL, 0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL, }; +#endif #ifndef ENCRYPT_ONLY @@ -528,6 +530,7 @@ static const ulong32 TE3[256] = { 0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL, }; +#ifndef PELI_TAB static const ulong32 Te4_0[] = { 0x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, 0x0000006bUL, 0x0000006fUL, 0x000000c5UL, 0x00000030UL, 0x00000001UL, 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, 0x00000076UL, @@ -667,6 +670,7 @@ static const ulong32 Te4_3[] = { 0x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, 0xe6000000UL, 0x42000000UL, 0x68000000UL, 0x41000000UL, 0x99000000UL, 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, 0x16000000UL }; +#endif /* pelimac */ #ifndef ENCRYPT_ONLY diff --git a/src/ciphers/anubis.c b/src/ciphers/anubis.c index 75440e65..c23ad661 100644 --- a/src/ciphers/anubis.c +++ b/src/ciphers/anubis.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/blowfish.c b/src/ciphers/blowfish.c index 5df23647..158bba4d 100644 --- a/src/ciphers/blowfish.c +++ b/src/ciphers/blowfish.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** @file blowfish.c diff --git a/src/ciphers/cast5.c b/src/ciphers/cast5.c index c7a81281..3daaa4ab 100644 --- a/src/ciphers/cast5.c +++ b/src/ciphers/cast5.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/des.c b/src/ciphers/des.c index 91f128fe..8c9ea12f 100644 --- a/src/ciphers/des.c +++ b/src/ciphers/des.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/ciphers/khazad.c b/src/ciphers/khazad.c index 5c3ebcb8..6eab31f1 100644 --- a/src/ciphers/khazad.c +++ b/src/ciphers/khazad.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/ciphers/noekeon.c b/src/ciphers/noekeon.c index b5a3b2ea..ec28bfa4 100644 --- a/src/ciphers/noekeon.c +++ b/src/ciphers/noekeon.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** @file noekeon.c diff --git a/src/ciphers/rc2.c b/src/ciphers/rc2.c index 2eb19229..7c307bdb 100644 --- a/src/ciphers/rc2.c +++ b/src/ciphers/rc2.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /**********************************************************************\ * To commemorate the 1996 RSA Data Security Conference, the following * diff --git a/src/ciphers/rc5.c b/src/ciphers/rc5.c index 1fce2f67..1006873f 100644 --- a/src/ciphers/rc5.c +++ b/src/ciphers/rc5.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/rc6.c b/src/ciphers/rc6.c index 9599417f..1e5f1761 100644 --- a/src/ciphers/rc6.c +++ b/src/ciphers/rc6.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/safer/safer.c b/src/ciphers/safer/safer.c index f736efce..ed99b40e 100644 --- a/src/ciphers/safer/safer.c +++ b/src/ciphers/safer/safer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /******************************************************************************* diff --git a/src/ciphers/safer/safer_tab.c b/src/ciphers/safer/safer_tab.c index 6c9abe9b..f50a7178 100644 --- a/src/ciphers/safer/safer_tab.c +++ b/src/ciphers/safer/safer_tab.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/safer/saferp.c b/src/ciphers/safer/saferp.c index 70551473..4a2e71df 100644 --- a/src/ciphers/safer/saferp.c +++ b/src/ciphers/safer/saferp.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/skipjack.c b/src/ciphers/skipjack.c index 84435d90..a37f1674 100644 --- a/src/ciphers/skipjack.c +++ b/src/ciphers/skipjack.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/twofish/twofish.c b/src/ciphers/twofish/twofish.c index b5f4f704..9c019987 100644 --- a/src/ciphers/twofish/twofish.c +++ b/src/ciphers/twofish/twofish.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/twofish/twofish_tab.c b/src/ciphers/twofish/twofish_tab.c index b3d0272a..cdd628b8 100644 --- a/src/ciphers/twofish/twofish_tab.c +++ b/src/ciphers/twofish/twofish_tab.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/ciphers/xtea.c b/src/ciphers/xtea.c index d6471bc2..382555ba 100644 --- a/src/ciphers/xtea.c +++ b/src/ciphers/xtea.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ccm/ccm_memory.c b/src/encauth/ccm/ccm_memory.c index 339d5703..57dafb7d 100644 --- a/src/encauth/ccm/ccm_memory.c +++ b/src/encauth/ccm/ccm_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/encauth/ccm/ccm_test.c b/src/encauth/ccm/ccm_test.c index e45c7818..f3d3a8eb 100644 --- a/src/encauth/ccm/ccm_test.c +++ b/src/encauth/ccm/ccm_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/encauth/eax/eax_addheader.c b/src/encauth/eax/eax_addheader.c index 8323258a..2389cfd4 100644 --- a/src/encauth/eax/eax_addheader.c +++ b/src/encauth/eax/eax_addheader.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** @file eax_addheader.c diff --git a/src/encauth/eax/eax_decrypt.c b/src/encauth/eax/eax_decrypt.c index c7af001e..59a01c10 100644 --- a/src/encauth/eax/eax_decrypt.c +++ b/src/encauth/eax/eax_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_decrypt_verify_memory.c b/src/encauth/eax/eax_decrypt_verify_memory.c index 34fba822..acf4bf51 100644 --- a/src/encauth/eax/eax_decrypt_verify_memory.c +++ b/src/encauth/eax/eax_decrypt_verify_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_done.c b/src/encauth/eax/eax_done.c index 50b0957f..91ee22ae 100644 --- a/src/encauth/eax/eax_done.c +++ b/src/encauth/eax/eax_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_encrypt.c b/src/encauth/eax/eax_encrypt.c index 19014e3b..501a0c33 100644 --- a/src/encauth/eax/eax_encrypt.c +++ b/src/encauth/eax/eax_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_encrypt_authenticate_memory.c b/src/encauth/eax/eax_encrypt_authenticate_memory.c index 67c1ee28..520d37c4 100644 --- a/src/encauth/eax/eax_encrypt_authenticate_memory.c +++ b/src/encauth/eax/eax_encrypt_authenticate_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_init.c b/src/encauth/eax/eax_init.c index 517f2397..a73a2b6e 100644 --- a/src/encauth/eax/eax_init.c +++ b/src/encauth/eax/eax_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/eax/eax_test.c b/src/encauth/eax/eax_test.c index 879d43e8..df9ad4d3 100644 --- a/src/encauth/eax/eax_test.c +++ b/src/encauth/eax/eax_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_add_aad.c b/src/encauth/gcm/gcm_add_aad.c index 585dd87d..07b1ef10 100644 --- a/src/encauth/gcm/gcm_add_aad.c +++ b/src/encauth/gcm/gcm_add_aad.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_add_iv.c b/src/encauth/gcm/gcm_add_iv.c index 7b7633f1..27324b2d 100644 --- a/src/encauth/gcm/gcm_add_iv.c +++ b/src/encauth/gcm/gcm_add_iv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_done.c b/src/encauth/gcm/gcm_done.c index 3ade7671..3acfb751 100644 --- a/src/encauth/gcm/gcm_done.c +++ b/src/encauth/gcm/gcm_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_gf_mult.c b/src/encauth/gcm/gcm_gf_mult.c index a81a632b..3acf40fe 100644 --- a/src/encauth/gcm/gcm_gf_mult.c +++ b/src/encauth/gcm/gcm_gf_mult.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_init.c b/src/encauth/gcm/gcm_init.c index 3e525cab..b5d57dbd 100644 --- a/src/encauth/gcm/gcm_init.c +++ b/src/encauth/gcm/gcm_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_memory.c b/src/encauth/gcm/gcm_memory.c index 972a28cd..8e02fa8a 100644 --- a/src/encauth/gcm/gcm_memory.c +++ b/src/encauth/gcm/gcm_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_mult_h.c b/src/encauth/gcm/gcm_mult_h.c index 039f1a24..2bee3d96 100644 --- a/src/encauth/gcm/gcm_mult_h.c +++ b/src/encauth/gcm/gcm_mult_h.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_process.c b/src/encauth/gcm/gcm_process.c index de6f71c5..417a9412 100644 --- a/src/encauth/gcm/gcm_process.c +++ b/src/encauth/gcm/gcm_process.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_reset.c b/src/encauth/gcm/gcm_reset.c index affdc1b2..6dd73c90 100644 --- a/src/encauth/gcm/gcm_reset.c +++ b/src/encauth/gcm/gcm_reset.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/gcm/gcm_test.c b/src/encauth/gcm/gcm_test.c index 3e45705d..309ab51f 100644 --- a/src/encauth/gcm/gcm_test.c +++ b/src/encauth/gcm/gcm_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_decrypt.c b/src/encauth/ocb/ocb_decrypt.c index fa3937d5..e77a8bed 100644 --- a/src/encauth/ocb/ocb_decrypt.c +++ b/src/encauth/ocb/ocb_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_decrypt_verify_memory.c b/src/encauth/ocb/ocb_decrypt_verify_memory.c index d33550ab..fca6adcd 100644 --- a/src/encauth/ocb/ocb_decrypt_verify_memory.c +++ b/src/encauth/ocb/ocb_decrypt_verify_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_done_decrypt.c b/src/encauth/ocb/ocb_done_decrypt.c index a28909c1..f416ca5b 100644 --- a/src/encauth/ocb/ocb_done_decrypt.c +++ b/src/encauth/ocb/ocb_done_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_done_encrypt.c b/src/encauth/ocb/ocb_done_encrypt.c index 10062fe6..837991c9 100644 --- a/src/encauth/ocb/ocb_done_encrypt.c +++ b/src/encauth/ocb/ocb_done_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_encrypt.c b/src/encauth/ocb/ocb_encrypt.c index 4b26c29c..097e0b3a 100644 --- a/src/encauth/ocb/ocb_encrypt.c +++ b/src/encauth/ocb/ocb_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_encrypt_authenticate_memory.c b/src/encauth/ocb/ocb_encrypt_authenticate_memory.c index e963267d..d42fda80 100644 --- a/src/encauth/ocb/ocb_encrypt_authenticate_memory.c +++ b/src/encauth/ocb/ocb_encrypt_authenticate_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_init.c b/src/encauth/ocb/ocb_init.c index a1e3e2cc..fc00b228 100644 --- a/src/encauth/ocb/ocb_init.c +++ b/src/encauth/ocb/ocb_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_ntz.c b/src/encauth/ocb/ocb_ntz.c index 3862579b..f472553c 100644 --- a/src/encauth/ocb/ocb_ntz.c +++ b/src/encauth/ocb/ocb_ntz.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_shift_xor.c b/src/encauth/ocb/ocb_shift_xor.c index 2b9364be..934fca2c 100644 --- a/src/encauth/ocb/ocb_shift_xor.c +++ b/src/encauth/ocb/ocb_shift_xor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/ocb_test.c b/src/encauth/ocb/ocb_test.c index a6ac51b3..c74ba0e3 100644 --- a/src/encauth/ocb/ocb_test.c +++ b/src/encauth/ocb/ocb_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/encauth/ocb/s_ocb_done.c b/src/encauth/ocb/s_ocb_done.c index 8fe64f42..98cf92e1 100644 --- a/src/encauth/ocb/s_ocb_done.c +++ b/src/encauth/ocb/s_ocb_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/hashes/chc/chc.c b/src/hashes/chc/chc.c index 76a30f31..1ccae03b 100644 --- a/src/hashes/chc/chc.c +++ b/src/hashes/chc/chc.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/helper/hash_file.c b/src/hashes/helper/hash_file.c index 8354d8df..a030f99f 100644 --- a/src/hashes/helper/hash_file.c +++ b/src/hashes/helper/hash_file.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/helper/hash_filehandle.c b/src/hashes/helper/hash_filehandle.c index db850634..0582449c 100644 --- a/src/hashes/helper/hash_filehandle.c +++ b/src/hashes/helper/hash_filehandle.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/helper/hash_memory.c b/src/hashes/helper/hash_memory.c index 37eaf19c..96875b13 100644 --- a/src/hashes/helper/hash_memory.c +++ b/src/hashes/helper/hash_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/helper/hash_memory_multi.c b/src/hashes/helper/hash_memory_multi.c index bd23d610..6523c7e6 100644 --- a/src/hashes/helper/hash_memory_multi.c +++ b/src/hashes/helper/hash_memory_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/hashes/md2.c b/src/hashes/md2.c index ee623437..9f33db2a 100644 --- a/src/hashes/md2.c +++ b/src/hashes/md2.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/md4.c b/src/hashes/md4.c index d8d54fa7..c451ec85 100644 --- a/src/hashes/md4.c +++ b/src/hashes/md4.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/md5.c b/src/hashes/md5.c index 9b1d9382..48617609 100644 --- a/src/hashes/md5.c +++ b/src/hashes/md5.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/rmd128.c b/src/hashes/rmd128.c index 2ab7fef4..40d88a6f 100644 --- a/src/hashes/rmd128.c +++ b/src/hashes/rmd128.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/rmd160.c b/src/hashes/rmd160.c index 97a22aa6..06b1b428 100644 --- a/src/hashes/rmd160.c +++ b/src/hashes/rmd160.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/sha1.c b/src/hashes/sha1.c index 9b16cbf1..86cd3fd0 100644 --- a/src/hashes/sha1.c +++ b/src/hashes/sha1.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/sha2/sha224.c b/src/hashes/sha2/sha224.c index 3edc97b7..804a8813 100644 --- a/src/hashes/sha2/sha224.c +++ b/src/hashes/sha2/sha224.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** @param sha224.c diff --git a/src/hashes/sha2/sha256.c b/src/hashes/sha2/sha256.c index 3f1f09dc..e3d07dcd 100644 --- a/src/hashes/sha2/sha256.c +++ b/src/hashes/sha2/sha256.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/sha2/sha384.c b/src/hashes/sha2/sha384.c index b7ece118..75a42042 100644 --- a/src/hashes/sha2/sha384.c +++ b/src/hashes/sha2/sha384.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** @param sha384.c diff --git a/src/hashes/sha2/sha512.c b/src/hashes/sha2/sha512.c index 3d01a708..4ba0ce86 100644 --- a/src/hashes/sha2/sha512.c +++ b/src/hashes/sha2/sha512.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/tiger.c b/src/hashes/tiger.c index 98c87798..f282cc23 100644 --- a/src/hashes/tiger.c +++ b/src/hashes/tiger.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/hashes/whirl/whirl.c b/src/hashes/whirl/whirl.c index 1b59d7c6..19739632 100644 --- a/src/hashes/whirl/whirl.c +++ b/src/hashes/whirl/whirl.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /** diff --git a/src/headers/tomcrypt.h b/src/headers/tomcrypt.h index 58755f8b..e05fc7df 100644 --- a/src/headers/tomcrypt.h +++ b/src/headers/tomcrypt.h @@ -16,8 +16,8 @@ extern "C" { #endif /* version */ -#define CRYPT 0x0110 -#define SCRYPT "1.10" +#define CRYPT 0x0111 +#define SCRYPT "1.11" /* max size of either a cipher/hash block or symmetric key [largest of the two] */ #define MAXBLOCKSIZE 128 diff --git a/src/headers/tomcrypt_cfg.h b/src/headers/tomcrypt_cfg.h index f3d5d8a9..f592cf26 100644 --- a/src/headers/tomcrypt_cfg.h +++ b/src/headers/tomcrypt_cfg.h @@ -37,7 +37,7 @@ void *XMEMSET(void *s, int c, size_t n); */ /* detect x86-32 machines somewhat */ -#if defined(INTEL_CC) || (defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__))) +#if !defined(__STRICT_ANSI__) && (defined(INTEL_CC) || (defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__)))) #define ENDIAN_LITTLE #define ENDIAN_32BITWORD #define LTC_FAST @@ -51,7 +51,7 @@ void *XMEMSET(void *s, int c, size_t n); #endif /* detect amd64 */ -#if defined(__x86_64__) +#if !defined(__STRICT_ANSI__) && defined(__x86_64__) #define ENDIAN_LITTLE #define ENDIAN_64BITWORD #define LTC_FAST @@ -59,7 +59,7 @@ void *XMEMSET(void *s, int c, size_t n); #endif /* detect PPC32 */ -#if defined(LTC_PPC32) +#if !defined(__STRICT_ANSI__) && defined(LTC_PPC32) #define ENDIAN_BIG #define ENDIAN_32BITWORD #define LTC_FAST @@ -102,7 +102,7 @@ void *XMEMSET(void *s, int c, size_t n); /* #define ENDIAN_64BITWORD */ #if (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD)) - #error You must specify a word size as well as endianess in mycrypt_cfg.h + #error You must specify a word size as well as endianess in tomcrypt_cfg.h #endif #if !(defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) diff --git a/src/headers/tomcrypt_cipher.h b/src/headers/tomcrypt_cipher.h index 601653d1..8a8a5889 100644 --- a/src/headers/tomcrypt_cipher.h +++ b/src/headers/tomcrypt_cipher.h @@ -702,6 +702,7 @@ int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw); int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw); int lrw_done(symmetric_LRW *lrw); +int lrw_test(void); /* don't call */ int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw); diff --git a/src/headers/tomcrypt_custom.h b/src/headers/tomcrypt_custom.h index 95c48d9f..00ca3c22 100644 --- a/src/headers/tomcrypt_custom.h +++ b/src/headers/tomcrypt_custom.h @@ -257,7 +257,7 @@ #define MRSA /* Include Katja (a Rabin variant like RSA) */ -// #define MKAT +/* #define MKAT */ /* Digital Signature Algorithm */ #define MDSA @@ -265,6 +265,10 @@ /* ECC */ #define MECC +#if defined(TFM_DESC) && defined(MECC) + #define MECC_ACCEL +#endif + /* Timing Resistant? */ /* #define LTC_ECC_TIMING_RESISTANT */ diff --git a/src/headers/tomcrypt_macros.h b/src/headers/tomcrypt_macros.h index cef694bd..02c01879 100644 --- a/src/headers/tomcrypt_macros.h +++ b/src/headers/tomcrypt_macros.h @@ -242,7 +242,7 @@ asm __volatile__ ( \ #define RORc(x,n) _lrotr(x,n) #define ROLc(x,n) _lrotl(x,n) -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM) +#elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM) static inline unsigned ROL(unsigned word, int i) { @@ -285,7 +285,7 @@ static inline unsigned RORc(unsigned word, const int i) #endif -#elif defined(LTC_PPC32) +#elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32) static inline unsigned ROL(unsigned word, int i) { @@ -341,7 +341,7 @@ static inline unsigned RORc(unsigned word, const int i) /* 64-bit Rotates */ -#if defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM) +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM) static inline unsigned long ROL64(unsigned long word, int i) { diff --git a/src/headers/tomcrypt_math.h b/src/headers/tomcrypt_math.h index 0397073a..630c9611 100644 --- a/src/headers/tomcrypt_math.h +++ b/src/headers/tomcrypt_math.h @@ -339,12 +339,22 @@ typedef struct { */ int (*ecc_ptadd)(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); + /** ECC GF(p) point double + @param P The first point + @param R The destination of 2P + @param modulus The modulus + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success + */ + int (*ecc_ptdbl)(ecc_point *P, ecc_point *R, void *modulus, void *mp); + /** ECC mapping from projective to affine, currently uses (x,y,z) => (x/z^2, y/z^3, 1) @param P The point to map @param modulus The modulus @param mp The "b" value from montgomery_setup() @return CRYPT_OK on success - @remark The mapping can be different but keep in mind a ecc_point only has three integers (x,y,z) so if you use a different mapping you have to make it fit. + @remark The mapping can be different but keep in mind a ecc_point only has three + integers (x,y,z) so if you use a different mapping you have to make it fit. */ int (*ecc_map)(ecc_point *P, void *modulus, void *mp); @@ -388,6 +398,10 @@ extern const ltc_math_descriptor ltm_desc; extern const ltc_math_descriptor tfm_desc; #endif +#ifdef GMP_DESC +extern const ltc_math_descriptor gmp_desc; +#endif + #if !defined(DESC_DEF_ONLY) && defined(LTC_SOURCE) #define MP_DIGIT_BIT ltc_mp.bits_per_digit diff --git a/src/headers/tomcrypt_pk.h b/src/headers/tomcrypt_pk.h index c27a9337..8e401afd 100644 --- a/src/headers/tomcrypt_pk.h +++ b/src/headers/tomcrypt_pk.h @@ -228,11 +228,13 @@ int ltc_ecc_is_valid_idx(int n); /* point ops (mp == montgomery digit) */ +#ifndef MECC_ACCEL /* R = 2P */ int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp); /* R = P + Q */ int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); +#endif /* R = kG */ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); diff --git a/src/mac/hmac/hmac_done.c b/src/mac/hmac/hmac_done.c index 3803ab45..0c52f116 100644 --- a/src/mac/hmac/hmac_done.c +++ b/src/mac/hmac/hmac_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/hmac/hmac_file.c b/src/mac/hmac/hmac_file.c index b7b39143..05999629 100644 --- a/src/mac/hmac/hmac_file.c +++ b/src/mac/hmac/hmac_file.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/hmac/hmac_init.c b/src/mac/hmac/hmac_init.c index e5d7f904..ee78504b 100644 --- a/src/mac/hmac/hmac_init.c +++ b/src/mac/hmac/hmac_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/hmac/hmac_memory.c b/src/mac/hmac/hmac_memory.c index 714236d4..d868a324 100644 --- a/src/mac/hmac/hmac_memory.c +++ b/src/mac/hmac/hmac_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/hmac/hmac_memory_multi.c b/src/mac/hmac/hmac_memory_multi.c index 13f0e43b..06c03980 100644 --- a/src/mac/hmac/hmac_memory_multi.c +++ b/src/mac/hmac/hmac_memory_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/mac/hmac/hmac_process.c b/src/mac/hmac/hmac_process.c index dd4a3b21..7c552559 100644 --- a/src/mac/hmac/hmac_process.c +++ b/src/mac/hmac/hmac_process.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/hmac/hmac_test.c b/src/mac/hmac/hmac_test.c index 44c61563..36cda288 100644 --- a/src/mac/hmac/hmac_test.c +++ b/src/mac/hmac/hmac_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_done.c b/src/mac/omac/omac_done.c index e2c1578b..c6e3c511 100644 --- a/src/mac/omac/omac_done.c +++ b/src/mac/omac/omac_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_file.c b/src/mac/omac/omac_file.c index 4f0cdc01..59888da5 100644 --- a/src/mac/omac/omac_file.c +++ b/src/mac/omac/omac_file.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_init.c b/src/mac/omac/omac_init.c index 86450428..79c8f3f4 100644 --- a/src/mac/omac/omac_init.c +++ b/src/mac/omac/omac_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_memory.c b/src/mac/omac/omac_memory.c index ff3315ae..1d0697ff 100644 --- a/src/mac/omac/omac_memory.c +++ b/src/mac/omac/omac_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_memory_multi.c b/src/mac/omac/omac_memory_multi.c index 5278fe80..b7440153 100644 --- a/src/mac/omac/omac_memory_multi.c +++ b/src/mac/omac/omac_memory_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/mac/omac/omac_process.c b/src/mac/omac/omac_process.c index 53985abc..02a42400 100644 --- a/src/mac/omac/omac_process.c +++ b/src/mac/omac/omac_process.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/omac/omac_test.c b/src/mac/omac/omac_test.c index da9a2de6..b6a60d44 100644 --- a/src/mac/omac/omac_test.c +++ b/src/mac/omac/omac_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pelican/pelican.c b/src/mac/pelican/pelican.c index 45ed7e8e..518fc132 100644 --- a/src/mac/pelican/pelican.c +++ b/src/mac/pelican/pelican.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -18,9 +18,9 @@ #ifdef PELICAN #define ENCRYPT_ONLY +#define PELI_TAB #include "../../ciphers/aes/aes_tab.c" - /** Initialize a Pelican state @param pelmac The Pelican state to initialize diff --git a/src/mac/pelican/pelican_memory.c b/src/mac/pelican/pelican_memory.c index 19240315..3bef6ac5 100644 --- a/src/mac/pelican/pelican_memory.c +++ b/src/mac/pelican/pelican_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pelican/pelican_test.c b/src/mac/pelican/pelican_test.c index 90248039..fde4fc0d 100644 --- a/src/mac/pelican/pelican_test.c +++ b/src/mac/pelican/pelican_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_done.c b/src/mac/pmac/pmac_done.c index 8ec3cbd3..308897b2 100644 --- a/src/mac/pmac/pmac_done.c +++ b/src/mac/pmac/pmac_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_file.c b/src/mac/pmac/pmac_file.c index 79cc2e22..c641b37b 100644 --- a/src/mac/pmac/pmac_file.c +++ b/src/mac/pmac/pmac_file.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_init.c b/src/mac/pmac/pmac_init.c index 5dfc0fb5..7fda1b6f 100644 --- a/src/mac/pmac/pmac_init.c +++ b/src/mac/pmac/pmac_init.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_memory.c b/src/mac/pmac/pmac_memory.c index 88036ec6..b920631a 100644 --- a/src/mac/pmac/pmac_memory.c +++ b/src/mac/pmac/pmac_memory.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_memory_multi.c b/src/mac/pmac/pmac_memory_multi.c index bc42b8c0..cbd94b94 100644 --- a/src/mac/pmac/pmac_memory_multi.c +++ b/src/mac/pmac/pmac_memory_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/mac/pmac/pmac_ntz.c b/src/mac/pmac/pmac_ntz.c index 2c166481..84cde691 100644 --- a/src/mac/pmac/pmac_ntz.c +++ b/src/mac/pmac/pmac_ntz.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_process.c b/src/mac/pmac/pmac_process.c index 40749a22..0b98d2d6 100644 --- a/src/mac/pmac/pmac_process.c +++ b/src/mac/pmac/pmac_process.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_shift_xor.c b/src/mac/pmac/pmac_shift_xor.c index f0c367e7..e5622cf5 100644 --- a/src/mac/pmac/pmac_shift_xor.c +++ b/src/mac/pmac/pmac_shift_xor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/mac/pmac/pmac_test.c b/src/mac/pmac/pmac_test.c index 30f606c3..8d091272 100644 --- a/src/mac/pmac/pmac_test.c +++ b/src/mac/pmac/pmac_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/math/gmp_desc.c b/src/math/gmp_desc.c new file mode 100644 index 00000000..f24b19d3 --- /dev/null +++ b/src/math/gmp_desc.c @@ -0,0 +1,473 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com + */ + +#define DESC_DEF_ONLY +#include "tomcrypt.h" + +#ifdef GMP_DESC + +#include +#include + +static const struct { + int gmp_code, ltc_code; +} gmp_to_ltc_codes[] = { + { GMP_ERROR_NONE, CRYPT_OK}, + { GMP_ERROR_ALLOCATE, CRYPT_MEM}, + { GMP_ERROR_DIVISION_BY_ZERO, CRYPT_INVALID_ARG}, + { GMP_ERROR_UNSUPPORTED_ARGUMENT, CRYPT_INVALID_ARG}, +}; + +/** + Convert a GMP error to a LTC error (Possibly the most powerful function ever! Oh wait... no) + @param err The error to convert + @return The equivalent LTC error code or CRYPT_ERROR if none found +*/ +static int gmp_to_ltc_error(int err) +{ + int x; + + for (x = 0; x < (int)(sizeof(gmp_to_ltc_codes)/sizeof(gmp_to_ltc_codes[0])); x++) { + if (err == gmp_to_ltc_codes[x].gmp_code) { + return gmp_to_ltc_codes[x].ltc_code; + } + } + return CRYPT_ERROR; +} + +static int init(void **a) +{ + LTC_ARGCHK(a != NULL); + + *a = XCALLOC(1, sizeof(__mpz_struct)); + if (*a == NULL) { + return CRYPT_MEM; + } + mpz_init(((__mpz_struct *)*a)); + return CRYPT_OK; +} + +static void deinit(void *a) +{ + LTC_ARGCHK(a != NULL); + mpz_clear(a); + XFREE(a); +} + +static int neg(void *a, void *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_neg(b, a); + return CRYPT_OK; +} + +static int copy(void *a, void *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_set(b, a); + return CRYPT_OK; +} + +static int init_copy(void **a, void *b) +{ + if (init(a) != CRYPT_OK) { + return CRYPT_MEM; + } + return copy(b, *a); +} + +/* ---- trivial ---- */ +static int set_int(void *a, unsigned long b) +{ + LTC_ARGCHK(a != NULL); + mpz_set_ui(((__mpz_struct *)a), b); + return CRYPT_OK; +} + +static unsigned long get_int(void *a) +{ + LTC_ARGCHK(a != NULL); + return mpz_get_ui(a); +} + +static unsigned long get_digit(void *a, int n) +{ + LTC_ARGCHK(a != NULL); + return mpz_getlimbn(a, n); +} + +static int get_digit_count(void *a) +{ + LTC_ARGCHK(a != NULL); + return mpz_size(a); +} + +static int compare(void *a, void *b) +{ + int ret; + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + ret = mpz_cmp(a, b); + if (ret < 0) { + return LTC_MP_LT; + } else if (ret > 0) { + return LTC_MP_GT; + } else { + return LTC_MP_EQ; + } +} + +static int compare_d(void *a, unsigned long b) +{ + int ret; + LTC_ARGCHK(a != NULL); + ret = mpz_cmp_ui(((__mpz_struct *)a), b); + if (ret < 0) { + return LTC_MP_LT; + } else if (ret > 0) { + return LTC_MP_GT; + } else { + return LTC_MP_EQ; + } +} + +static int count_bits(void *a) +{ + LTC_ARGCHK(a != NULL); + return mpz_sizeinbase(a, 2); +} + +static int twoexpt(void *a, int n) +{ + LTC_ARGCHK(a != NULL); + mpz_set_ui(a, 0); + mpz_setbit(a, n); + return CRYPT_OK; +} + +/* ---- conversions ---- */ + +/* read ascii string */ +static int read_radix(void *a, const char *b, int radix) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_set_str(a, b, radix); + return CRYPT_OK; +} + +/* write one */ +static int write_radix(void *a, char *b, int radix) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_get_str(b, radix, a); + return CRYPT_OK; +} + +/* get size as unsigned char string */ +static unsigned long unsigned_size(void *a) +{ + unsigned long t; + LTC_ARGCHK(a != NULL); + t = mpz_sizeinbase(a, 2); + if (mpz_cmp_ui(((__mpz_struct *)a), 0) == 0) return 0; + return (t>>3) + ((t&7)?1:0); +} + +/* store */ +static int unsigned_write(void *a, unsigned char *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_export(b, NULL, 1, 1, 1, 0, ((__mpz_struct*)a)); + return CRYPT_OK; +} + +/* read */ +static int unsigned_read(void *a, unsigned char *b, unsigned long len) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_import(a, len, 1, 1, 1, 0, b); + return CRYPT_OK; +} + +/* add */ +static int add(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_add(c, a, b); + return CRYPT_OK; +} + +static int addi(void *a, unsigned long b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(c != NULL); + mpz_add_ui(c, a, b); + return CRYPT_OK; +} + +/* sub */ +static int sub(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_sub(c, a, b); + return CRYPT_OK; +} + +static int subi(void *a, unsigned long b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(c != NULL); + mpz_sub_ui(c, a, b); + return CRYPT_OK; +} + +/* mul */ +static int mul(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_mul(c, a, b); + return CRYPT_OK; +} + +static int muli(void *a, unsigned long b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(c != NULL); + mpz_mul_ui(c, a, b); + return CRYPT_OK; +} + +/* sqr */ +static int sqr(void *a, void *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_mul(b, a, a); + return CRYPT_OK; +} + +/* div */ +static int divide(void *a, void *b, void *c, void *d) +{ + mpz_t tmp; + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + if (c != NULL) { + mpz_init(tmp); + mpz_divexact(tmp, a, b); + } + if (d != NULL) { + mpz_mod(d, a, b); + } + if (c != NULL) { + mpz_set(c, tmp); + mpz_clear(tmp); + } + return CRYPT_OK; +} + +static int div_2(void *a, void *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_divexact_ui(b, a, 2); + return CRYPT_OK; +} + +/* modi */ +static int modi(void *a, unsigned long b, unsigned long *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(c != NULL); + + *c = mpz_fdiv_ui(a, b); + return CRYPT_OK; +} + +/* gcd */ +static int gcd(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_gcd(c, a, b); + return CRYPT_OK; +} + +/* lcm */ +static int lcm(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_lcm(c, a, b); + return CRYPT_OK; +} + +static int mulmod(void *a, void *b, void *c, void *d) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + LTC_ARGCHK(d != NULL); + mpz_mul(d, a, b); + mpz_mod(d, d, c); + return CRYPT_OK; +} + +/* invmod */ +static int invmod(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_invert(c, a, b); + return CRYPT_OK; +} + +/* setup */ +static int montgomery_setup(void *a, void **b) +{ + int err; + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + *b = 1; + return CRYPT_OK; +} + +/* get normalization value */ +static int montgomery_normalization(void *a, void *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + mpz_set_ui(a, 1); + return CRYPT_OK; +} + +/* reduce */ +static int montgomery_reduce(void *a, void *b, void *c) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + mpz_mod(a, a, b); + return CRYPT_OK; +} + +/* clean up */ +static void montgomery_deinit(void *a) +{ +} + +static int exptmod(void *a, void *b, void *c, void *d) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + LTC_ARGCHK(c != NULL); + LTC_ARGCHK(d != NULL); + mpz_powm(d, a, b, c); + return CRYPT_OK; +} + +static int isprime(void *a, int *b) +{ + LTC_ARGCHK(a != NULL); + LTC_ARGCHK(b != NULL); + *b = mpz_probab_prime_p(a, 8) > 0 ? LTC_MP_YES : LTC_MP_NO; + return CRYPT_OK; +} + +const ltc_math_descriptor gmp_desc = { + "GNU MP", + sizeof(mp_limb_t) * CHAR_BIT - GMP_NAIL_BITS, + + &init, + &init_copy, + &deinit, + + &neg, + ©, + + &set_int, + &get_int, + &get_digit, + &get_digit_count, + &compare, + &compare_d, + &count_bits, + &twoexpt, + + &read_radix, + &write_radix, + &unsigned_size, + &unsigned_write, + &unsigned_read, + + &add, + &addi, + &sub, + &subi, + &mul, + &muli, + &sqr, + ÷, + &div_2, + &modi, + &gcd, + &lcm, + + &mulmod, + &invmod, + + &montgomery_setup, + &montgomery_normalization, + &montgomery_reduce, + &montgomery_deinit, + + &exptmod, + &isprime, + +#ifdef MECC + <c_ecc_mulmod, + <c_ecc_projective_add_point, + <c_ecc_projective_dbl_point, + <c_ecc_map, +#else + NULL, NULL, NULL, NULL, +#endif + +#ifdef MRSA + &rsa_make_key, + &rsa_exptmod, +#else + NULL, NULL +#endif + +}; + + +#endif + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/src/math/ltm_desc.c b/src/math/ltm_desc.c index 23b7e642..5508e1d7 100644 --- a/src/math/ltm_desc.c +++ b/src/math/ltm_desc.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #define DESC_DEF_ONLY @@ -431,9 +431,10 @@ const ltc_math_descriptor ltm_desc = { #ifdef MECC <c_ecc_mulmod, <c_ecc_projective_add_point, + <c_ecc_projective_dbl_point, <c_ecc_map, #else - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, #endif #ifdef MRSA diff --git a/src/math/multi.c b/src/math/multi.c index a3dea3ff..7d27f878 100644 --- a/src/math/multi.c +++ b/src/math/multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/math/rand_prime.c b/src/math/rand_prime.c index cf5129a9..ad25cf5e 100644 --- a/src/math/rand_prime.c +++ b/src/math/rand_prime.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/math/tfm_desc.c b/src/math/tfm_desc.c index a194e52e..8900b7b5 100644 --- a/src/math/tfm_desc.c +++ b/src/math/tfm_desc.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #define DESC_DEF_ONLY @@ -387,7 +387,280 @@ static int isprime(void *a, int *b) LTC_ARGCHK(b != NULL); *b = (fp_isprime(a) == FP_YES) ? LTC_MP_YES : LTC_MP_NO; return CRYPT_OK; -} +} + +#if defined(MECC) && defined(MECC_ACCEL) + +static int tfm_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *Mp) +{ + fp_int t1, t2; + fp_digit mp; + + LTC_ARGCHK(P != NULL); + LTC_ARGCHK(R != NULL); + LTC_ARGCHK(modulus != NULL); + LTC_ARGCHK(Mp != NULL); + + mp = *((fp_digit*)Mp); + + fp_init(&t1); + fp_init(&t2); + + if (P != R) { + fp_copy(P->x, R->x); + fp_copy(P->y, R->y); + fp_copy(P->z, R->z); + } + + /* t1 = Z * Z */ + fp_sqr(R->z, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* Z = Y * Z */ + fp_mul(R->z, R->y, R->z); + fp_montgomery_reduce(R->z, modulus, mp); + /* Z = 2Z */ + fp_add(R->z, R->z, R->z); + if (fp_cmp(R->z, modulus) != FP_LT) { + fp_sub(R->z, modulus, R->z); + } + + /* &t2 = X - T1 */ + fp_sub(R->x, &t1, &t2); + if (fp_cmp_d(&t2, 0) == FP_LT) { + fp_add(&t2, modulus, &t2); + } + /* T1 = X + T1 */ + fp_add(&t1, R->x, &t1); + if (fp_cmp(&t1, modulus) != FP_LT) { + fp_sub(&t1, modulus, &t1); + } + /* T2 = T1 * T2 */ + fp_mul(&t1, &t2, &t2); + fp_montgomery_reduce(&t2, modulus, mp); + /* T1 = 2T2 */ + fp_add(&t2, &t2, &t1); + if (fp_cmp(&t1, modulus) != FP_LT) { + fp_sub(&t1, modulus, &t1); + } + /* T1 = T1 + T2 */ + fp_add(&t1, &t2, &t1); + if (fp_cmp(&t1, modulus) != FP_LT) { + fp_sub(&t1, modulus, &t1); + } + + /* Y = 2Y */ + fp_add(R->y, R->y, R->y); + if (fp_cmp(R->y, modulus) != FP_LT) { + fp_sub(R->y, modulus, R->y); + } + /* Y = Y * Y */ + fp_sqr(R->y, R->y); + fp_montgomery_reduce(R->y, modulus, mp); + /* T2 = Y * Y */ + fp_sqr(R->y, &t2); + fp_montgomery_reduce(&t2, modulus, mp); + /* T2 = T2/2 */ + if (fp_isodd(&t2)) { + fp_add(&t2, modulus, &t2); + } + fp_div_2(&t2, &t2); + /* Y = Y * X */ + fp_mul(R->y, R->x, R->y); + fp_montgomery_reduce(R->y, modulus, mp); + + /* X = T1 * T1 */ + fp_sqr(&t1, R->x); + fp_montgomery_reduce(R->x, modulus, mp); + /* X = X - Y */ + fp_sub(R->x, R->y, R->x); + if (fp_cmp_d(R->x, 0) == FP_LT) { + fp_add(R->x, modulus, R->x); + } + /* X = X - Y */ + fp_sub(R->x, R->y, R->x); + if (fp_cmp_d(R->x, 0) == FP_LT) { + fp_add(R->x, modulus, R->x); + } + + /* Y = Y - X */ + fp_sub(R->y, R->x, R->y); + if (fp_cmp_d(R->y, 0) == FP_LT) { + fp_add(R->y, modulus, R->y); + } + /* Y = Y * T1 */ + fp_mul(R->y, &t1, R->y); + fp_montgomery_reduce(R->y, modulus, mp); + /* Y = Y - T2 */ + fp_sub(R->y, &t2, R->y); + if (fp_cmp_d(R->y, 0) == FP_LT) { + fp_add(R->y, modulus, R->y); + } + + return CRYPT_OK; +} + +/** + Add two ECC points + @param P The point to add + @param Q The point to add + @param R [out] The destination of the double + @param modulus The modulus of the field the ECC curve is in + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success +*/ +static int tfm_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *Mp) +{ + fp_int t1, t2, x, y, z; + fp_digit mp; + + LTC_ARGCHK(P != NULL); + LTC_ARGCHK(Q != NULL); + LTC_ARGCHK(R != NULL); + LTC_ARGCHK(modulus != NULL); + LTC_ARGCHK(Mp != NULL); + + mp = *((fp_digit*)Mp); + + fp_init(&t1); + fp_init(&t2); + fp_init(&x); + fp_init(&y); + fp_init(&z); + + /* should we dbl instead? */ + fp_sub(modulus, Q->y, &t1); + if ( (fp_cmp(P->x, Q->x) == FP_EQ) && + (fp_cmp(P->z, Q->z) == FP_EQ) && + (fp_cmp(P->y, Q->y) == FP_EQ || fp_cmp(P->y, &t1) == FP_EQ)) { + return tfm_ecc_projective_dbl_point(P, R, modulus, Mp); + } + + fp_copy(P->x, &x); + fp_copy(P->y, &y); + fp_copy(P->z, &z); + + /* if Z is one then these are no-operations */ + /* T1 = Z' * Z' */ + fp_sqr(Q->z, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* X = X * T1 */ + fp_mul(&t1, &x, &x); + fp_montgomery_reduce(&x, modulus, mp); + /* T1 = Z' * T1 */ + fp_mul(Q->z, &t1, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* Y = Y * T1 */ + fp_mul(&t1, &y, &y); + fp_montgomery_reduce(&y, modulus, mp); + + /* T1 = Z*Z */ + fp_sqr(&z, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* T2 = X' * T1 */ + fp_mul(Q->x, &t1, &t2); + fp_montgomery_reduce(&t2, modulus, mp); + /* T1 = Z * T1 */ + fp_mul(&z, &t1, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* T1 = Y' * T1 */ + fp_mul(Q->y, &t1, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + + /* Y = Y - T1 */ + fp_sub(&y, &t1, &y); + if (fp_cmp_d(&y, 0) == FP_LT) { + fp_add(&y, modulus, &y); + } + /* T1 = 2T1 */ + fp_add(&t1, &t1, &t1); + if (fp_cmp(&t1, modulus) != FP_LT) { + fp_sub(&t1, modulus, &t1); + } + /* T1 = Y + T1 */ + fp_add(&t1, &y, &t1); + if (fp_cmp(&t1, modulus) != FP_LT) { + fp_sub(&t1, modulus, &t1); + } + /* X = X - T2 */ + fp_sub(&x, &t2, &x); + if (fp_cmp_d(&x, 0) == FP_LT) { + fp_add(&x, modulus, &x); + } + /* T2 = 2T2 */ + fp_add(&t2, &t2, &t2); + if (fp_cmp(&t2, modulus) != FP_LT) { + fp_sub(&t2, modulus, &t2); + } + /* T2 = X + T2 */ + fp_add(&t2, &x, &t2); + if (fp_cmp(&t2, modulus) != FP_LT) { + fp_sub(&t2, modulus, &t2); + } + + /* if Z' != 1 */ + /* Z = Z * Z' */ + fp_mul(&z, Q->z, &z); + fp_montgomery_reduce(&z, modulus, mp); + + /* Z = Z * X */ + fp_mul(&z, &x, &z); + fp_montgomery_reduce(&z, modulus, mp); + + /* T1 = T1 * X */ + fp_mul(&t1, &x, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + /* X = X * X */ + fp_sqr(&x, &x); + fp_montgomery_reduce(&x, modulus, mp); + /* T2 = T2 * x */ + fp_mul(&t2, &x, &t2); + fp_montgomery_reduce(&t2, modulus, mp); + /* T1 = T1 * X */ + fp_mul(&t1, &x, &t1); + fp_montgomery_reduce(&t1, modulus, mp); + + /* X = Y*Y */ + fp_sqr(&y, &x); + fp_montgomery_reduce(&x, modulus, mp); + /* X = X - T2 */ + fp_sub(&x, &t2, &x); + if (fp_cmp_d(&x, 0) == FP_LT) { + fp_add(&x, modulus, &x); + } + + /* T2 = T2 - X */ + fp_sub(&t2, &x, &t2); + if (fp_cmp_d(&t2, 0) == FP_LT) { + fp_add(&t2, modulus, &t2); + } + /* T2 = T2 - X */ + fp_sub(&t2, &x, &t2); + if (fp_cmp_d(&t2, 0) == FP_LT) { + fp_add(&t2, modulus, &t2); + } + /* T2 = T2 * Y */ + fp_mul(&t2, &y, &t2); + fp_montgomery_reduce(&t2, modulus, mp); + /* Y = T2 - T1 */ + fp_sub(&t2, &t1, &y); + if (fp_cmp_d(&y, 0) == FP_LT) { + fp_add(&y, modulus, &y); + } + /* Y = Y/2 */ + if (fp_isodd(&y)) { + fp_add(&y, modulus, &y); + } + fp_div_2(&y, &y); + + fp_copy(&x, R->x); + fp_copy(&y, R->y); + fp_copy(&z, R->z); + + return CRYPT_OK; +} + + +#endif const ltc_math_descriptor tfm_desc = { @@ -442,10 +715,16 @@ const ltc_math_descriptor tfm_desc = { #ifdef MECC <c_ecc_mulmod, +#ifdef MECC_ACCEL + &tfm_ecc_projective_add_point, + &tfm_ecc_projective_dbl_point, +#else <c_ecc_projective_add_point, + <c_ecc_projective_dbl_point, +#endif <c_ecc_map, #else - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, #endif #ifdef MRSA diff --git a/src/misc/base64/base64_decode.c b/src/misc/base64/base64_decode.c index 320f201c..60aedcfb 100644 --- a/src/misc/base64/base64_decode.c +++ b/src/misc/base64/base64_decode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/base64/base64_encode.c b/src/misc/base64/base64_encode.c index 6173cb90..b7c3f896 100644 --- a/src/misc/base64/base64_encode.c +++ b/src/misc/base64/base64_encode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/burn_stack.c b/src/misc/burn_stack.c index c7edc037..0f51a186 100644 --- a/src/misc/burn_stack.c +++ b/src/misc/burn_stack.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt.c b/src/misc/crypt/crypt.c index a3f6f09a..d2f0c096 100644 --- a/src/misc/crypt/crypt.c +++ b/src/misc/crypt/crypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -321,6 +321,12 @@ const char *crypt_build_settings = #if defined(TFM_DESC) " TFM_DESC " #endif +#if defined(MECC_ACCEL) + " MECC_ACCEL " +#endif +#if defined(GMP_DESC) + " GMP_DESC " +#endif #if defined(LTC_EASY) " (easy) " #endif diff --git a/src/misc/crypt/crypt_argchk.c b/src/misc/crypt/crypt_argchk.c index 2ba8a859..1ad27145 100644 --- a/src/misc/crypt/crypt_argchk.c +++ b/src/misc/crypt/crypt_argchk.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/misc/crypt/crypt_cipher_descriptor.c b/src/misc/crypt/crypt_cipher_descriptor.c index 7dff97f9..9f34480a 100644 --- a/src/misc/crypt/crypt_cipher_descriptor.c +++ b/src/misc/crypt/crypt_cipher_descriptor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_cipher_is_valid.c b/src/misc/crypt/crypt_cipher_is_valid.c index f56dd80e..983186b1 100644 --- a/src/misc/crypt/crypt_cipher_is_valid.c +++ b/src/misc/crypt/crypt_cipher_is_valid.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_cipher.c b/src/misc/crypt/crypt_find_cipher.c index 04d40da4..e1e5449a 100644 --- a/src/misc/crypt/crypt_find_cipher.c +++ b/src/misc/crypt/crypt_find_cipher.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_cipher_any.c b/src/misc/crypt/crypt_find_cipher_any.c index ab9dae94..e3eefc28 100644 --- a/src/misc/crypt/crypt_find_cipher_any.c +++ b/src/misc/crypt/crypt_find_cipher_any.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_cipher_id.c b/src/misc/crypt/crypt_find_cipher_id.c index e0171e38..145f44be 100644 --- a/src/misc/crypt/crypt_find_cipher_id.c +++ b/src/misc/crypt/crypt_find_cipher_id.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_hash.c b/src/misc/crypt/crypt_find_hash.c index 1b526c9c..9882dfb6 100644 --- a/src/misc/crypt/crypt_find_hash.c +++ b/src/misc/crypt/crypt_find_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_hash_any.c b/src/misc/crypt/crypt_find_hash_any.c index 113c96b9..3063e844 100644 --- a/src/misc/crypt/crypt_find_hash_any.c +++ b/src/misc/crypt/crypt_find_hash_any.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_hash_id.c b/src/misc/crypt/crypt_find_hash_id.c index 527c768e..951fca03 100644 --- a/src/misc/crypt/crypt_find_hash_id.c +++ b/src/misc/crypt/crypt_find_hash_id.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_hash_oid.c b/src/misc/crypt/crypt_find_hash_oid.c index d5e32a75..9c7c6022 100644 --- a/src/misc/crypt/crypt_find_hash_oid.c +++ b/src/misc/crypt/crypt_find_hash_oid.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_find_prng.c b/src/misc/crypt/crypt_find_prng.c index d803722b..faca9466 100644 --- a/src/misc/crypt/crypt_find_prng.c +++ b/src/misc/crypt/crypt_find_prng.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_hash_descriptor.c b/src/misc/crypt/crypt_hash_descriptor.c index e577bd81..619cdf37 100644 --- a/src/misc/crypt/crypt_hash_descriptor.c +++ b/src/misc/crypt/crypt_hash_descriptor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_hash_is_valid.c b/src/misc/crypt/crypt_hash_is_valid.c index 725af483..5ef3bd54 100644 --- a/src/misc/crypt/crypt_hash_is_valid.c +++ b/src/misc/crypt/crypt_hash_is_valid.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_ltc_mp_descriptor.c b/src/misc/crypt/crypt_ltc_mp_descriptor.c index f842447d..907862f9 100644 --- a/src/misc/crypt/crypt_ltc_mp_descriptor.c +++ b/src/misc/crypt/crypt_ltc_mp_descriptor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_prng_descriptor.c b/src/misc/crypt/crypt_prng_descriptor.c index 1868f38f..3c6d2086 100644 --- a/src/misc/crypt/crypt_prng_descriptor.c +++ b/src/misc/crypt/crypt_prng_descriptor.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_prng_is_valid.c b/src/misc/crypt/crypt_prng_is_valid.c index 815b03aa..dac9847d 100644 --- a/src/misc/crypt/crypt_prng_is_valid.c +++ b/src/misc/crypt/crypt_prng_is_valid.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_register_cipher.c b/src/misc/crypt/crypt_register_cipher.c index 7701d3ca..c5e8c551 100644 --- a/src/misc/crypt/crypt_register_cipher.c +++ b/src/misc/crypt/crypt_register_cipher.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_register_hash.c b/src/misc/crypt/crypt_register_hash.c index 4e24dd10..c96bae79 100644 --- a/src/misc/crypt/crypt_register_hash.c +++ b/src/misc/crypt/crypt_register_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_register_prng.c b/src/misc/crypt/crypt_register_prng.c index 4689be3f..cee4512a 100644 --- a/src/misc/crypt/crypt_register_prng.c +++ b/src/misc/crypt/crypt_register_prng.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_unregister_cipher.c b/src/misc/crypt/crypt_unregister_cipher.c index 5d09175f..242f5cb0 100644 --- a/src/misc/crypt/crypt_unregister_cipher.c +++ b/src/misc/crypt/crypt_unregister_cipher.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_unregister_hash.c b/src/misc/crypt/crypt_unregister_hash.c index 6fa12b7b..59362159 100644 --- a/src/misc/crypt/crypt_unregister_hash.c +++ b/src/misc/crypt/crypt_unregister_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/crypt/crypt_unregister_prng.c b/src/misc/crypt/crypt_unregister_prng.c index 331a90aa..ef43d61e 100644 --- a/src/misc/crypt/crypt_unregister_prng.c +++ b/src/misc/crypt/crypt_unregister_prng.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/error_to_string.c b/src/misc/error_to_string.c index 4958b5df..a6ddb3e4 100644 --- a/src/misc/error_to_string.c +++ b/src/misc/error_to_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/misc/pkcs5/pkcs_5_1.c b/src/misc/pkcs5/pkcs_5_1.c index fd1a80f8..20ae9e13 100644 --- a/src/misc/pkcs5/pkcs_5_1.c +++ b/src/misc/pkcs5/pkcs_5_1.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include diff --git a/src/misc/pkcs5/pkcs_5_2.c b/src/misc/pkcs5/pkcs_5_2.c index aad0ae34..34fef2b9 100644 --- a/src/misc/pkcs5/pkcs_5_2.c +++ b/src/misc/pkcs5/pkcs_5_2.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include diff --git a/src/misc/zeromem.c b/src/misc/zeromem.c index 9145f822..995a4982 100644 --- a/src/misc/zeromem.c +++ b/src/misc/zeromem.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_decrypt.c b/src/modes/cbc/cbc_decrypt.c index 7a4ae6dc..cef9cc3b 100644 --- a/src/modes/cbc/cbc_decrypt.c +++ b/src/modes/cbc/cbc_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_done.c b/src/modes/cbc/cbc_done.c index 8efe10a7..ed2b2ab2 100644 --- a/src/modes/cbc/cbc_done.c +++ b/src/modes/cbc/cbc_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_encrypt.c b/src/modes/cbc/cbc_encrypt.c index b0b7c572..6129f2bf 100644 --- a/src/modes/cbc/cbc_encrypt.c +++ b/src/modes/cbc/cbc_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_getiv.c b/src/modes/cbc/cbc_getiv.c index 952a75e1..91174232 100644 --- a/src/modes/cbc/cbc_getiv.c +++ b/src/modes/cbc/cbc_getiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_setiv.c b/src/modes/cbc/cbc_setiv.c index 7dcae1f8..18ec82d4 100644 --- a/src/modes/cbc/cbc_setiv.c +++ b/src/modes/cbc/cbc_setiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cbc/cbc_start.c b/src/modes/cbc/cbc_start.c index 79c75552..0d9bab0e 100644 --- a/src/modes/cbc/cbc_start.c +++ b/src/modes/cbc/cbc_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_decrypt.c b/src/modes/cfb/cfb_decrypt.c index ac5ccd9f..bf80e8a8 100644 --- a/src/modes/cfb/cfb_decrypt.c +++ b/src/modes/cfb/cfb_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_done.c b/src/modes/cfb/cfb_done.c index 804a7be5..f2bbdc32 100644 --- a/src/modes/cfb/cfb_done.c +++ b/src/modes/cfb/cfb_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_encrypt.c b/src/modes/cfb/cfb_encrypt.c index e09793ff..15068783 100644 --- a/src/modes/cfb/cfb_encrypt.c +++ b/src/modes/cfb/cfb_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_getiv.c b/src/modes/cfb/cfb_getiv.c index 73d1a824..a27f6a66 100644 --- a/src/modes/cfb/cfb_getiv.c +++ b/src/modes/cfb/cfb_getiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_setiv.c b/src/modes/cfb/cfb_setiv.c index 2bf425a3..ac6961ae 100644 --- a/src/modes/cfb/cfb_setiv.c +++ b/src/modes/cfb/cfb_setiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/cfb/cfb_start.c b/src/modes/cfb/cfb_start.c index 8c99fb95..aa9e65fc 100644 --- a/src/modes/cfb/cfb_start.c +++ b/src/modes/cfb/cfb_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_decrypt.c b/src/modes/ctr/ctr_decrypt.c index 8e5c6f70..f6a64f0d 100644 --- a/src/modes/ctr/ctr_decrypt.c +++ b/src/modes/ctr/ctr_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_done.c b/src/modes/ctr/ctr_done.c index b87baadc..f5efec9d 100644 --- a/src/modes/ctr/ctr_done.c +++ b/src/modes/ctr/ctr_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_encrypt.c b/src/modes/ctr/ctr_encrypt.c index 70fd1363..48e4d39f 100644 --- a/src/modes/ctr/ctr_encrypt.c +++ b/src/modes/ctr/ctr_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_getiv.c b/src/modes/ctr/ctr_getiv.c index 10cdf8e2..8bf4ecb3 100644 --- a/src/modes/ctr/ctr_getiv.c +++ b/src/modes/ctr/ctr_getiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_setiv.c b/src/modes/ctr/ctr_setiv.c index 9b7572f9..9a8103a5 100644 --- a/src/modes/ctr/ctr_setiv.c +++ b/src/modes/ctr/ctr_setiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ctr/ctr_start.c b/src/modes/ctr/ctr_start.c index bc2c1473..318e43c8 100644 --- a/src/modes/ctr/ctr_start.c +++ b/src/modes/ctr/ctr_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ecb/ecb_decrypt.c b/src/modes/ecb/ecb_decrypt.c index 4db22bc3..52a7f5cb 100644 --- a/src/modes/ecb/ecb_decrypt.c +++ b/src/modes/ecb/ecb_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ecb/ecb_done.c b/src/modes/ecb/ecb_done.c index a52be38e..7adfcf81 100644 --- a/src/modes/ecb/ecb_done.c +++ b/src/modes/ecb/ecb_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ecb/ecb_encrypt.c b/src/modes/ecb/ecb_encrypt.c index 11fdcf5e..1835ed94 100644 --- a/src/modes/ecb/ecb_encrypt.c +++ b/src/modes/ecb/ecb_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ecb/ecb_start.c b/src/modes/ecb/ecb_start.c index 0bae3fe7..df975706 100644 --- a/src/modes/ecb/ecb_start.c +++ b/src/modes/ecb/ecb_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_decrypt.c b/src/modes/lrw/lrw_decrypt.c index e7c4afc2..73eebeb5 100644 --- a/src/modes/lrw/lrw_decrypt.c +++ b/src/modes/lrw/lrw_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_done.c b/src/modes/lrw/lrw_done.c index fd3f6e7f..39798c46 100644 --- a/src/modes/lrw/lrw_done.c +++ b/src/modes/lrw/lrw_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_encrypt.c b/src/modes/lrw/lrw_encrypt.c index e03f554b..12fb8af7 100644 --- a/src/modes/lrw/lrw_encrypt.c +++ b/src/modes/lrw/lrw_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_getiv.c b/src/modes/lrw/lrw_getiv.c index e8ac41cd..f183169c 100644 --- a/src/modes/lrw/lrw_getiv.c +++ b/src/modes/lrw/lrw_getiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_process.c b/src/modes/lrw/lrw_process.c index f3bb29ec..2a084bfb 100644 --- a/src/modes/lrw/lrw_process.c +++ b/src/modes/lrw/lrw_process.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -29,7 +29,7 @@ int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw) { unsigned char prod[16]; - int x; + int x, err; #ifdef LRW_TABLES int y; #endif @@ -85,9 +85,13 @@ int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, i /* send through cipher */ if (mode == LRW_ENCRYPT) { - cipher_descriptor[lrw->cipher].ecb_encrypt(ct, ct, &lrw->key); + if ((err = cipher_descriptor[lrw->cipher].ecb_encrypt(ct, ct, &lrw->key)) != CRYPT_OK) { + return err; + } } else { - cipher_descriptor[lrw->cipher].ecb_decrypt(ct, ct, &lrw->key); + if ((err = cipher_descriptor[lrw->cipher].ecb_decrypt(ct, ct, &lrw->key)) != CRYPT_OK) { + return err; + } } /* xor prod */ diff --git a/src/modes/lrw/lrw_setiv.c b/src/modes/lrw/lrw_setiv.c index f6bd21ba..7b524f44 100644 --- a/src/modes/lrw/lrw_setiv.c +++ b/src/modes/lrw/lrw_setiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/lrw/lrw_start.c b/src/modes/lrw/lrw_start.c index c9721449..0f2c00f1 100644 --- a/src/modes/lrw/lrw_start.c +++ b/src/modes/lrw/lrw_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -61,7 +61,7 @@ int lrw_start( int cipher, } /* schedule key */ - if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &lrw->key)) != CRYPT_OK) { + if ((err = cipher_descriptor[cipher].setup(key, keylen, num_rounds, &lrw->key)) != CRYPT_OK) { return err; } lrw->cipher = cipher; diff --git a/src/modes/lrw/lrw_test.c b/src/modes/lrw/lrw_test.c index 5ca7b40a..99e787c0 100644 --- a/src/modes/lrw/lrw_test.c +++ b/src/modes/lrw/lrw_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -81,68 +81,47 @@ int lrw_test(void) } } -#define PRINT - for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) { /* schedule it */ if ((err = lrw_start(idx, tests[x].IV, tests[x].key, 16, tests[x].tweak, 0, &lrw)) != CRYPT_OK) { -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return err; } /* check pad against expected tweak */ if (XMEMCMP(tests[x].expected_tweak, lrw.pad, 16)) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return CRYPT_FAIL_TESTVECTOR; } /* process block */ if ((err = lrw_encrypt(tests[x].P, buf[0], 16, &lrw)) != CRYPT_OK) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return err; } if (XMEMCMP(buf[0], tests[x].C, 16)) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return CRYPT_FAIL_TESTVECTOR; } /* process block */ if ((err = lrw_setiv(tests[x].IV, 16, &lrw)) != CRYPT_OK) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return err; } if ((err = lrw_decrypt(buf[0], buf[1], 16, &lrw)) != CRYPT_OK) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return err; } if (XMEMCMP(buf[1], tests[x].P, 16)) { lrw_done(&lrw); -#ifdef PRINT - printf("\n\nERR at %d\n", __LINE__); -#endif return CRYPT_FAIL_TESTVECTOR; } - lrw_done(&lrw); + if ((err = lrw_done(&lrw)) != CRYPT_OK) { + return err; + } } return CRYPT_OK; #endif diff --git a/src/modes/ofb/ofb_decrypt.c b/src/modes/ofb/ofb_decrypt.c index c69caba8..e7429538 100644 --- a/src/modes/ofb/ofb_decrypt.c +++ b/src/modes/ofb/ofb_decrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ofb/ofb_done.c b/src/modes/ofb/ofb_done.c index 169832fc..e770b211 100644 --- a/src/modes/ofb/ofb_done.c +++ b/src/modes/ofb/ofb_done.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ofb/ofb_encrypt.c b/src/modes/ofb/ofb_encrypt.c index c7066828..c46966d5 100644 --- a/src/modes/ofb/ofb_encrypt.c +++ b/src/modes/ofb/ofb_encrypt.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ofb/ofb_getiv.c b/src/modes/ofb/ofb_getiv.c index 4cb75fd2..f32028ce 100644 --- a/src/modes/ofb/ofb_getiv.c +++ b/src/modes/ofb/ofb_getiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ofb/ofb_setiv.c b/src/modes/ofb/ofb_setiv.c index 9de9235f..df2223db 100644 --- a/src/modes/ofb/ofb_setiv.c +++ b/src/modes/ofb/ofb_setiv.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/modes/ofb/ofb_start.c b/src/modes/ofb/ofb_start.c index 9a40a44b..80e33466 100644 --- a/src/modes/ofb/ofb_start.c +++ b/src/modes/ofb/ofb_start.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/bit/der_decode_bit_string.c b/src/pk/asn1/der/bit/der_decode_bit_string.c index 30d83816..488386cc 100644 --- a/src/pk/asn1/der/bit/der_decode_bit_string.c +++ b/src/pk/asn1/der/bit/der_decode_bit_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/bit/der_encode_bit_string.c b/src/pk/asn1/der/bit/der_encode_bit_string.c index 497b317d..f1e3cca1 100644 --- a/src/pk/asn1/der/bit/der_encode_bit_string.c +++ b/src/pk/asn1/der/bit/der_encode_bit_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/bit/der_length_bit_string.c b/src/pk/asn1/der/bit/der_length_bit_string.c index bf3a614a..8e5a7751 100644 --- a/src/pk/asn1/der/bit/der_length_bit_string.c +++ b/src/pk/asn1/der/bit/der_length_bit_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/choice/der_decode_choice.c b/src/pk/asn1/der/choice/der_decode_choice.c index 71a4f6f9..7f6155c2 100644 --- a/src/pk/asn1/der/choice/der_decode_choice.c +++ b/src/pk/asn1/der/choice/der_decode_choice.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/ia5/der_decode_ia5_string.c b/src/pk/asn1/der/ia5/der_decode_ia5_string.c index 3f9870dd..7d3bf94a 100644 --- a/src/pk/asn1/der/ia5/der_decode_ia5_string.c +++ b/src/pk/asn1/der/ia5/der_decode_ia5_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/ia5/der_encode_ia5_string.c b/src/pk/asn1/der/ia5/der_encode_ia5_string.c index bf25b20b..385b4d67 100644 --- a/src/pk/asn1/der/ia5/der_encode_ia5_string.c +++ b/src/pk/asn1/der/ia5/der_encode_ia5_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/ia5/der_length_ia5_string.c b/src/pk/asn1/der/ia5/der_length_ia5_string.c index 40e6b97b..9ea17d23 100644 --- a/src/pk/asn1/der/ia5/der_length_ia5_string.c +++ b/src/pk/asn1/der/ia5/der_length_ia5_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/integer/der_decode_integer.c b/src/pk/asn1/der/integer/der_decode_integer.c index 383cb622..cab54f1a 100644 --- a/src/pk/asn1/der/integer/der_decode_integer.c +++ b/src/pk/asn1/der/integer/der_decode_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/integer/der_encode_integer.c b/src/pk/asn1/der/integer/der_encode_integer.c index afbe9ab6..56c9e1ab 100644 --- a/src/pk/asn1/der/integer/der_encode_integer.c +++ b/src/pk/asn1/der/integer/der_encode_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -96,6 +96,7 @@ int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen) } } else if (mp_iszero(num) != LTC_MP_YES) { void *tmp; + /* negative */ if (mp_init(&tmp) != CRYPT_OK) { return CRYPT_MEM; diff --git a/src/pk/asn1/der/integer/der_length_integer.c b/src/pk/asn1/der/integer/der_length_integer.c index 6582f7aa..74cc2d3e 100644 --- a/src/pk/asn1/der/integer/der_length_integer.c +++ b/src/pk/asn1/der/integer/der_length_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c b/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c index 7c6db26b..2afc2b6c 100644 --- a/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c +++ b/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c b/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c index 4247d78e..89ce9a5c 100644 --- a/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c +++ b/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/object_identifier/der_length_object_identifier.c b/src/pk/asn1/der/object_identifier/der_length_object_identifier.c index 5c07bc22..b7d933aa 100644 --- a/src/pk/asn1/der/object_identifier/der_length_object_identifier.c +++ b/src/pk/asn1/der/object_identifier/der_length_object_identifier.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/octet/der_decode_octet_string.c b/src/pk/asn1/der/octet/der_decode_octet_string.c index 185e6deb..b0577dae 100644 --- a/src/pk/asn1/der/octet/der_decode_octet_string.c +++ b/src/pk/asn1/der/octet/der_decode_octet_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/octet/der_encode_octet_string.c b/src/pk/asn1/der/octet/der_encode_octet_string.c index bd882b68..4cd1eb21 100644 --- a/src/pk/asn1/der/octet/der_encode_octet_string.c +++ b/src/pk/asn1/der/octet/der_encode_octet_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/octet/der_length_octet_string.c b/src/pk/asn1/der/octet/der_length_octet_string.c index 72874544..6cf1ad0e 100644 --- a/src/pk/asn1/der/octet/der_length_octet_string.c +++ b/src/pk/asn1/der/octet/der_length_octet_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/printable_string/der_decode_printable_string.c b/src/pk/asn1/der/printable_string/der_decode_printable_string.c index e967740d..aa13cdb1 100644 --- a/src/pk/asn1/der/printable_string/der_decode_printable_string.c +++ b/src/pk/asn1/der/printable_string/der_decode_printable_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/printable_string/der_encode_printable_string.c b/src/pk/asn1/der/printable_string/der_encode_printable_string.c index 82bab8e5..ce9ce944 100644 --- a/src/pk/asn1/der/printable_string/der_encode_printable_string.c +++ b/src/pk/asn1/der/printable_string/der_encode_printable_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/printable_string/der_length_printable_string.c b/src/pk/asn1/der/printable_string/der_length_printable_string.c index b8aaab3b..80bf7902 100644 --- a/src/pk/asn1/der/printable_string/der_length_printable_string.c +++ b/src/pk/asn1/der/printable_string/der_length_printable_string.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/sequence/der_decode_sequence_ex.c b/src/pk/asn1/der/sequence/der_decode_sequence_ex.c index 4a6ab80a..0eefea98 100644 --- a/src/pk/asn1/der/sequence/der_decode_sequence_ex.c +++ b/src/pk/asn1/der/sequence/der_decode_sequence_ex.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/pk/asn1/der/sequence/der_decode_sequence_flexi.c b/src/pk/asn1/der/sequence/der_decode_sequence_flexi.c index d1c4fc7b..8bbd8290 100644 --- a/src/pk/asn1/der/sequence/der_decode_sequence_flexi.c +++ b/src/pk/asn1/der/sequence/der_decode_sequence_flexi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -295,7 +295,7 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc } /* Sequence elements go as child */ - len = *inlen; + len = len - y; if ((err = der_decode_sequence_flexi(in, &len, &(l->child))) != CRYPT_OK) { goto error; } diff --git a/src/pk/asn1/der/sequence/der_decode_sequence_multi.c b/src/pk/asn1/der/sequence/der_decode_sequence_multi.c index 7c4da1e6..c239ab76 100644 --- a/src/pk/asn1/der/sequence/der_decode_sequence_multi.c +++ b/src/pk/asn1/der/sequence/der_decode_sequence_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/pk/asn1/der/sequence/der_encode_sequence_ex.c b/src/pk/asn1/der/sequence/der_encode_sequence_ex.c index d1d20099..8efbbb1d 100644 --- a/src/pk/asn1/der/sequence/der_encode_sequence_ex.c +++ b/src/pk/asn1/der/sequence/der_encode_sequence_ex.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/pk/asn1/der/sequence/der_encode_sequence_multi.c b/src/pk/asn1/der/sequence/der_encode_sequence_multi.c index e7d89ac2..d905910d 100644 --- a/src/pk/asn1/der/sequence/der_encode_sequence_multi.c +++ b/src/pk/asn1/der/sequence/der_encode_sequence_multi.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" #include diff --git a/src/pk/asn1/der/sequence/der_length_sequence.c b/src/pk/asn1/der/sequence/der_length_sequence.c index 90acb97c..46c53e51 100644 --- a/src/pk/asn1/der/sequence/der_length_sequence.c +++ b/src/pk/asn1/der/sequence/der_length_sequence.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/sequence/der_sequence_free.c b/src/pk/asn1/der/sequence/der_sequence_free.c index 77cfe388..5658661d 100644 --- a/src/pk/asn1/der/sequence/der_sequence_free.c +++ b/src/pk/asn1/der/sequence/der_sequence_free.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/set/der_encode_set.c b/src/pk/asn1/der/set/der_encode_set.c index 12a8bef7..e9444e9e 100644 --- a/src/pk/asn1/der/set/der_encode_set.c +++ b/src/pk/asn1/der/set/der_encode_set.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/set/der_encode_setof.c b/src/pk/asn1/der/set/der_encode_setof.c index 45cbdd80..e06df911 100644 --- a/src/pk/asn1/der/set/der_encode_setof.c +++ b/src/pk/asn1/der/set/der_encode_setof.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/short_integer/der_decode_short_integer.c b/src/pk/asn1/der/short_integer/der_decode_short_integer.c index b6328cd2..67ba02bc 100644 --- a/src/pk/asn1/der/short_integer/der_decode_short_integer.c +++ b/src/pk/asn1/der/short_integer/der_decode_short_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/short_integer/der_encode_short_integer.c b/src/pk/asn1/der/short_integer/der_encode_short_integer.c index 4199d00e..5f3e06f5 100644 --- a/src/pk/asn1/der/short_integer/der_encode_short_integer.c +++ b/src/pk/asn1/der/short_integer/der_encode_short_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/short_integer/der_length_short_integer.c b/src/pk/asn1/der/short_integer/der_length_short_integer.c index 1b0381ac..8adeb1aa 100644 --- a/src/pk/asn1/der/short_integer/der_length_short_integer.c +++ b/src/pk/asn1/der/short_integer/der_length_short_integer.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/utctime/der_decode_utctime.c b/src/pk/asn1/der/utctime/der_decode_utctime.c index 80e7a030..fa9f3c2a 100644 --- a/src/pk/asn1/der/utctime/der_decode_utctime.c +++ b/src/pk/asn1/der/utctime/der_decode_utctime.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/utctime/der_encode_utctime.c b/src/pk/asn1/der/utctime/der_encode_utctime.c index d179e6c9..021a38a5 100644 --- a/src/pk/asn1/der/utctime/der_encode_utctime.c +++ b/src/pk/asn1/der/utctime/der_encode_utctime.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/asn1/der/utctime/der_length_utctime.c b/src/pk/asn1/der/utctime/der_length_utctime.c index cc07a299..ec465199 100644 --- a/src/pk/asn1/der/utctime/der_length_utctime.c +++ b/src/pk/asn1/der/utctime/der_length_utctime.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_decrypt_key.c b/src/pk/dsa/dsa_decrypt_key.c index 428a2cc1..ab4b3e4a 100644 --- a/src/pk/dsa/dsa_decrypt_key.c +++ b/src/pk/dsa/dsa_decrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_encrypt_key.c b/src/pk/dsa/dsa_encrypt_key.c index 4223849f..a8801f5e 100644 --- a/src/pk/dsa/dsa_encrypt_key.c +++ b/src/pk/dsa/dsa_encrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_export.c b/src/pk/dsa/dsa_export.c index ffa06aaa..793eecc4 100644 --- a/src/pk/dsa/dsa_export.c +++ b/src/pk/dsa/dsa_export.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_free.c b/src/pk/dsa/dsa_free.c index 11028075..102230f7 100644 --- a/src/pk/dsa/dsa_free.c +++ b/src/pk/dsa/dsa_free.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_import.c b/src/pk/dsa/dsa_import.c index 034b62aa..81cccd11 100644 --- a/src/pk/dsa/dsa_import.c +++ b/src/pk/dsa/dsa_import.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_make_key.c b/src/pk/dsa/dsa_make_key.c index 54a7b1d5..f75736cd 100644 --- a/src/pk/dsa/dsa_make_key.c +++ b/src/pk/dsa/dsa_make_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_shared_secret.c b/src/pk/dsa/dsa_shared_secret.c index 069634ed..564fe8ed 100644 --- a/src/pk/dsa/dsa_shared_secret.c +++ b/src/pk/dsa/dsa_shared_secret.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_sign_hash.c b/src/pk/dsa/dsa_sign_hash.c index ca38ed04..cd66505d 100644 --- a/src/pk/dsa/dsa_sign_hash.c +++ b/src/pk/dsa/dsa_sign_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" @@ -74,7 +74,7 @@ retry: if ((err = mp_read_unsigned_bin(k, buf, key->qord)) != CRYPT_OK) { goto error; } /* k > 1 ? */ - if (mp_cmp_d(k, 1) != LTC_MP_GT) { goto retry; } + if (mp_cmp_d(k, 1) != LTC_MP_GT) { goto retry; } /* test gcd */ if ((err = mp_gcd(k, key->q, tmp)) != CRYPT_OK) { goto error; } @@ -87,7 +87,7 @@ retry: if ((err = mp_exptmod(key->g, k, key->p, r)) != CRYPT_OK) { goto error; } if ((err = mp_mod(r, key->q, r)) != CRYPT_OK) { goto error; } - if (mp_iszero(r) == LTC_MP_YES) { goto retry; } + if (mp_iszero(r) == LTC_MP_YES) { goto retry; } /* now find s = (in + xr)/k mod q */ if ((err = mp_read_unsigned_bin(tmp, (unsigned char *)in, inlen)) != CRYPT_OK) { goto error; } @@ -95,7 +95,7 @@ retry: if ((err = mp_add(s, tmp, s)) != CRYPT_OK) { goto error; } if ((err = mp_mulmod(s, kinv, key->q, s)) != CRYPT_OK) { goto error; } - if (mp_iszero(s) == LTC_MP_YES) { goto retry; } + if (mp_iszero(s) == LTC_MP_YES) { goto retry; } err = CRYPT_OK; goto LBL_ERR; diff --git a/src/pk/dsa/dsa_verify_hash.c b/src/pk/dsa/dsa_verify_hash.c index f901f490..b87edbb6 100644 --- a/src/pk/dsa/dsa_verify_hash.c +++ b/src/pk/dsa/dsa_verify_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/dsa/dsa_verify_key.c b/src/pk/dsa/dsa_verify_key.c index 66b32964..22a8325e 100644 --- a/src/pk/dsa/dsa_verify_key.c +++ b/src/pk/dsa/dsa_verify_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/ecc/ecc.c b/src/pk/ecc/ecc.c index ab1ea6de..c6ccefcc 100644 --- a/src/pk/ecc/ecc.c +++ b/src/pk/ecc/ecc.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -25,115 +25,59 @@ /* This holds the key settings. ***MUST*** be organized by size from smallest to largest. */ const ltc_ecc_set_type ltc_ecc_sets[] = { - #ifdef ECC192 { - 24, - "ECC-192", - /* prime */ - "/////////////////////l//////////", - - /* B */ - "P2456UMSWESFf+chSYGmIVwutkp1Hhcn", - - /* order */ - "////////////////cTxuDXHhoR6qqYWn", - - /* Gx */ - "68se3h0maFPylo3hGw680FJ/2ls2/n0I", - - /* Gy */ - "1nahbV/8sdXZ417jQoJDrNFvTw4UUKWH" + 24, + "ECC-192", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", + "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", + "7192B95FFC8DA78631011ED6B24CDD573F977A11E794811", }, #endif #ifdef ECC224 { - 28, - "ECC-224", - - /* prime */ - "3/////////////////////0000000000000001", - - /* B */ - "2q1Gg530Ipg/L1CbPGHB2trx/OkYSBEKCZLV+q", - - /* order */ - "3//////////////////nQYuBZmFXFTAKLSN2ez", - - /* Gx */ - "2t3WozQxI/Vp8JaBbA0y7JLi8H8ZGoWDOHN1qX", - - - /* Gy */ - "2zDsE8jVSZ+qmYt+RDGtMWMWT7P4JLWPc507uq", + 28, + "ECC-224", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", + "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", }, #endif #ifdef ECC256 { - 32, - "ECC-256", - /* Prime */ - "F////y000010000000000000000////////////////", - - /* B */ - "5h6DTYgEfFdi+kzLNQOXhnb7GQmp5EmzZlEF3udqc1B", - - /* Order */ - "F////y00000//////////+yvlgjfnUUXFEvoiByOoLH", - - /* Gx */ - "6iNqVBXB497+BpcvMEaGF9t0ts1BUipeFIXEKNOcCAM", - - /* Gy */ - "4/ZGkB+6d+RZkVhIdmFdXOhpZDNQp5UpiksG6Wtlr7r" + 32, + "ECC-256", + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", + "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", + "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", }, #endif #ifdef ECC384 { - 48, - "ECC-384", - /* prime */ - "//////////////////////////////////////////x/////00000000003/" - "////", - - /* B */ - "ip4lf+8+v+IOZWLhu/Wj6HWTd6x+WK4I0nG8Zr0JXrh6LZcDYYxHdIg5oEtJ" - "x2hl", - - /* Order */ - "////////////////////////////////nsDDWVGtBTzO6WsoIB2dUkpi6MhC" - "nIbp", - - /* Gx and Gy */ - "geVA8hwB1JUEiSSUyo2jT6uTEsABfvkOMVT1u89KAZXL0l9TlrKfR3fKNZXo" - "TWgt", - - "DXVUIfOcB6zTdfY/afBSAVZq7RqecXHywTen4xNmkC0AOB7E7Nw1dNf37NoG" - "wWvV" + 48, + "ECC-384", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", + "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", }, #endif #ifdef ECC521 { - 65, - "ECC-521", - /* prime */ - "V///////////////////////////////////////////////////////////" - "///////////////////////////", - - /* B */ - "56LFhbXZXoQ7vAQ8Q2sXK3kejfoMvcp5VEuj8cHZl49uLOPEL7iVfDx5bB0l" - "JknlmSrSz+8FImqyUz57zHhK3y0", - - /* Order */ - "V//////////////////////////////////////////+b66XuE/BvPhVym1I" - "FS9fT0xjScuYPn7hhjljnwHE6G9", - - /* Gx and Gy */ - "CQ5ZWQt10JfpPu+osOZbRH2d6I1EGK/jI7uAAzWQqqzkg5BNdVlvrae/Xt19" - "wB/gDupIBF1XMf2c/b+VZ72vRrc", - - "HWvAMfucZl015oANxGiVHlPcFL4ILURH6WNhxqN9pvcB9VkSfbUz2P0nL2v0" - "J+j1s4rF726edB2G8Y+b7QVqMPG", + 65, + "ECC-521", + "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", + "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", + "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", + "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", }, #endif { diff --git a/src/pk/ecc/ecc_decrypt_key.c b/src/pk/ecc/ecc_decrypt_key.c index a479c51a..6d2aea94 100644 --- a/src/pk/ecc/ecc_decrypt_key.c +++ b/src/pk/ecc/ecc_decrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_encrypt_key.c b/src/pk/ecc/ecc_encrypt_key.c index f2ae375b..c2f3364e 100644 --- a/src/pk/ecc/ecc_encrypt_key.c +++ b/src/pk/ecc/ecc_encrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_export.c b/src/pk/ecc/ecc_export.c index b8c38a28..188932cc 100644 --- a/src/pk/ecc/ecc_export.c +++ b/src/pk/ecc/ecc_export.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_free.c b/src/pk/ecc/ecc_free.c index ffb89d02..f5f92f36 100644 --- a/src/pk/ecc/ecc_free.c +++ b/src/pk/ecc/ecc_free.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_get_size.c b/src/pk/ecc/ecc_get_size.c index d0e93ce8..595b3779 100644 --- a/src/pk/ecc/ecc_get_size.c +++ b/src/pk/ecc/ecc_get_size.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_import.c b/src/pk/ecc/ecc_import.c index 7c854a18..7250e645 100644 --- a/src/pk/ecc/ecc_import.c +++ b/src/pk/ecc/ecc_import.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -33,8 +33,8 @@ static int is_point(ecc_key *key) } /* load prime and b */ - if ((err = mp_read_radix(prime, ltc_ecc_sets[key->idx].prime, 64)) != CRYPT_OK) { goto error; } - if ((err = mp_read_radix(b, ltc_ecc_sets[key->idx].B, 64)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(prime, ltc_ecc_sets[key->idx].prime, 16)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(b, ltc_ecc_sets[key->idx].B, 16)) != CRYPT_OK) { goto error; } /* compute y^2 */ if ((err = mp_sqr(key->pubkey.y, t1)) != CRYPT_OK) { goto error; } diff --git a/src/pk/ecc/ecc_make_key.c b/src/pk/ecc/ecc_make_key.c index b1824843..35c52558 100644 --- a/src/pk/ecc/ecc_make_key.c +++ b/src/pk/ecc/ecc_make_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -80,9 +80,9 @@ int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key) } /* read in the specs for this key */ - if ((err = mp_read_radix(prime, (char *)ltc_ecc_sets[key->idx].prime, 64)) != CRYPT_OK) { goto done; } - if ((err = mp_read_radix(base->x, (char *)ltc_ecc_sets[key->idx].Gx, 64)) != CRYPT_OK) { goto done; } - if ((err = mp_read_radix(base->y, (char *)ltc_ecc_sets[key->idx].Gy, 64)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(prime, (char *)ltc_ecc_sets[key->idx].prime, 16)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(base->x, (char *)ltc_ecc_sets[key->idx].Gx, 16)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(base->y, (char *)ltc_ecc_sets[key->idx].Gy, 16)) != CRYPT_OK) { goto done; } mp_set(base->z, 1); if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)buf, keysize)) != CRYPT_OK) { goto done; } diff --git a/src/pk/ecc/ecc_shared_secret.c b/src/pk/ecc/ecc_shared_secret.c index 13f925d0..4f135a40 100644 --- a/src/pk/ecc/ecc_shared_secret.c +++ b/src/pk/ecc/ecc_shared_secret.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -68,7 +68,7 @@ int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, return err; } - if ((err = mp_read_radix(prime, (char *)ltc_ecc_sets[private_key->idx].prime, 64)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(prime, (char *)ltc_ecc_sets[private_key->idx].prime, 16)) != CRYPT_OK) { goto done; } if ((err = ltc_mp.ecc_ptmul(private_key->k, &public_key->pubkey, result, prime, 1)) != CRYPT_OK) { goto done; } x = (unsigned long)mp_unsigned_bin_size(prime); diff --git a/src/pk/ecc/ecc_sign_hash.c b/src/pk/ecc/ecc_sign_hash.c index c63eeb3a..bf641b49 100644 --- a/src/pk/ecc/ecc_sign_hash.c +++ b/src/pk/ecc/ecc_sign_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -67,8 +67,8 @@ int ecc_sign_hash(const unsigned char *in, unsigned long inlen, ecc_free(&pubkey); goto LBL_ERR; } - if ((err = mp_read_radix(p, (char *)ltc_ecc_sets[key->idx].order, 64)) != CRYPT_OK) { goto error; } - if ((err = mp_read_unsigned_bin(e, (unsigned char *)in, (int)inlen)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(p, (char *)ltc_ecc_sets[key->idx].order, 16)) != CRYPT_OK) { goto error; } + if ((err = mp_read_unsigned_bin(e, (unsigned char *)in, (int)inlen)) != CRYPT_OK) { goto error; } /* make up a key and export the public copy */ for (;;) { @@ -77,7 +77,7 @@ int ecc_sign_hash(const unsigned char *in, unsigned long inlen, } /* find r = x1 mod n */ - if ((err = mp_mod(pubkey.pubkey.x, p, r)) != CRYPT_OK) { goto error; } + if ((err = mp_mod(pubkey.pubkey.x, p, r)) != CRYPT_OK) { goto error; } if (mp_iszero(r)) { ecc_free(&pubkey); diff --git a/src/pk/ecc/ecc_sizes.c b/src/pk/ecc/ecc_sizes.c index 06aac142..41da86f0 100644 --- a/src/pk/ecc/ecc_sizes.c +++ b/src/pk/ecc/ecc_sizes.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ecc_test.c b/src/pk/ecc/ecc_test.c index 367cbbc2..545fb100 100644 --- a/src/pk/ecc/ecc_test.c +++ b/src/pk/ecc/ecc_test.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -50,8 +50,8 @@ int ecc_test(void) #if 0 printf("Testing %d\n", ltc_ecc_sets[i].size); #endif - if ((err = mp_read_radix(modulus, (char *)ltc_ecc_sets[i].prime, 64)) != CRYPT_OK) { goto done; } - if ((err = mp_read_radix(order, (char *)ltc_ecc_sets[i].order, 64)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(modulus, (char *)ltc_ecc_sets[i].prime, 16)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(order, (char *)ltc_ecc_sets[i].order, 16)) != CRYPT_OK) { goto done; } /* is prime actually prime? */ if ((err = mp_prime_is_prime(modulus, 8, &primality)) != CRYPT_OK) { goto done; } @@ -67,8 +67,8 @@ int ecc_test(void) goto done; } - if ((err = mp_read_radix(G->x, (char *)ltc_ecc_sets[i].Gx, 64)) != CRYPT_OK) { goto done; } - if ((err = mp_read_radix(G->y, (char *)ltc_ecc_sets[i].Gy, 64)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(G->x, (char *)ltc_ecc_sets[i].Gx, 16)) != CRYPT_OK) { goto done; } + if ((err = mp_read_radix(G->y, (char *)ltc_ecc_sets[i].Gy, 16)) != CRYPT_OK) { goto done; } mp_set(G->z, 1); /* then we should have G == (order + 1)G */ diff --git a/src/pk/ecc/ecc_verify_hash.c b/src/pk/ecc/ecc_verify_hash.c index 8b0c6d8c..5b2ea9ff 100644 --- a/src/pk/ecc/ecc_verify_hash.c +++ b/src/pk/ecc/ecc_verify_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -88,10 +88,10 @@ int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, } /* get the order */ - if ((err = mp_read_radix(p, (char *)ltc_ecc_sets[key->idx].order, 64)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(p, (char *)ltc_ecc_sets[key->idx].order, 16)) != CRYPT_OK) { goto error; } /* get the modulus */ - if ((err = mp_read_radix(m, (char *)ltc_ecc_sets[key->idx].prime, 64)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(m, (char *)ltc_ecc_sets[key->idx].prime, 16)) != CRYPT_OK) { goto error; } /* check for zero */ if (mp_iszero(r) || mp_iszero(s) || mp_cmp(r, p) != LTC_MP_LT || mp_cmp(s, p) != LTC_MP_LT) { @@ -112,8 +112,8 @@ int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, if ((err = mp_mulmod(r, w, p, u2)) != CRYPT_OK) { goto error; } /* find mG = u1*G */ - if ((err = mp_read_radix(mG->x, (char *)ltc_ecc_sets[key->idx].Gx, 64)) != CRYPT_OK) { goto error; } - if ((err = mp_read_radix(mG->y, (char *)ltc_ecc_sets[key->idx].Gy, 64)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(mG->x, (char *)ltc_ecc_sets[key->idx].Gx, 16)) != CRYPT_OK) { goto error; } + if ((err = mp_read_radix(mG->y, (char *)ltc_ecc_sets[key->idx].Gy, 16)) != CRYPT_OK) { goto error; } mp_set(mG->z, 1); if ((err = ltc_mp.ecc_ptmul(u1, mG, mG, m, 0)) != CRYPT_OK) { goto done; } diff --git a/src/pk/ecc/ltc_ecc_is_valid_idx.c b/src/pk/ecc/ltc_ecc_is_valid_idx.c index b67b4e8c..de4c818f 100644 --- a/src/pk/ecc/ltc_ecc_is_valid_idx.c +++ b/src/pk/ecc/ltc_ecc_is_valid_idx.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ltc_ecc_map.c b/src/pk/ecc/ltc_ecc_map.c index 39f4f4ad..a1cacc72 100644 --- a/src/pk/ecc/ltc_ecc_map.c +++ b/src/pk/ecc/ltc_ecc_map.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ltc_ecc_mulmod.c b/src/pk/ecc/ltc_ecc_mulmod.c index fc68446b..9d36addd 100644 --- a/src/pk/ecc/ltc_ecc_mulmod.c +++ b/src/pk/ecc/ltc_ecc_mulmod.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -93,13 +93,13 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) /* calc the M tab, which holds kG for k==8..15 */ /* M[0] == 8G */ - if ((err = ltc_ecc_projective_dbl_point(tG, M[0], modulus, mp)) != CRYPT_OK) { goto done; } - if ((err = ltc_ecc_projective_dbl_point(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } - if ((err = ltc_ecc_projective_dbl_point(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(tG, M[0], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } /* now find (8+k)G for k=1..7 */ for (j = 9; j < 16; j++) { - if ((err = ltc_ecc_projective_add_point(M[j-9], tG, M[j-8], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptadd(M[j-9], tG, M[j-8], modulus, mp)) != CRYPT_OK) { goto done; } } /* setup sliding window */ @@ -118,12 +118,12 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) break; } buf = mp_get_digit(k, digidx); - bitcnt = (int) MP_DIGIT_BIT; + bitcnt = (int) ltc_mp.bits_per_digit; --digidx; } /* grab the next msb from the ltiplicand */ - i = (buf >> (MP_DIGIT_BIT - 1)) & 1; + i = (buf >> (ltc_mp.bits_per_digit - 1)) & 1; buf <<= 1; /* skip leading zero bits */ @@ -133,7 +133,7 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) /* if the bit is zero and mode == 1 then we double */ if (mode == 1 && i == 0) { - if ((err = ltc_ecc_projective_dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(R, R, modulus, mp)) != CRYPT_OK) { goto done; } continue; } @@ -154,11 +154,11 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) /* ok window is filled so double as required and add */ /* double first */ for (j = 0; j < WINSIZE; j++) { - if ((err = ltc_ecc_projective_dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(R, R, modulus, mp)) != CRYPT_OK) { goto done; } } /* then add, bitbuf will be 8..15 [8..2^WINSIZE] guaranteed */ - if ((err = ltc_ecc_projective_add_point(R, M[bitbuf-8], R, modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptadd(R, M[bitbuf-8], R, modulus, mp)) != CRYPT_OK) { goto done; } } /* empty window and reset */ bitcpy = bitbuf = 0; @@ -172,7 +172,7 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) for (j = 0; j < bitcpy; j++) { /* only double if we have had at least one add first */ if (first == 0) { - if ((err = ltc_ecc_projective_dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptdbl(R, R, modulus, mp)) != CRYPT_OK) { goto done; } } bitbuf <<= 1; @@ -185,7 +185,7 @@ int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) first = 0; } else { /* then add */ - if ((err = ltc_ecc_projective_add_point(R, tG, R, modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = ltc_mp.ecc_ptadd(R, tG, R, modulus, mp)) != CRYPT_OK) { goto done; } } } } @@ -211,3 +211,7 @@ done: #undef WINSIZE #endif + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/src/pk/ecc/ltc_ecc_mulmod_timing.c b/src/pk/ecc/ltc_ecc_mulmod_timing.c index 49ac20e0..648b9383 100644 --- a/src/pk/ecc/ltc_ecc_mulmod_timing.c +++ b/src/pk/ecc/ltc_ecc_mulmod_timing.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ltc_ecc_points.c b/src/pk/ecc/ltc_ecc_points.c index 21496b53..6b10d11f 100644 --- a/src/pk/ecc/ltc_ecc_points.c +++ b/src/pk/ecc/ltc_ecc_points.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b diff --git a/src/pk/ecc/ltc_ecc_projective_add_point.c b/src/pk/ecc/ltc_ecc_projective_add_point.c index 9521231e..218095cc 100644 --- a/src/pk/ecc/ltc_ecc_projective_add_point.c +++ b/src/pk/ecc/ltc_ecc_projective_add_point.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -21,7 +21,7 @@ ECC Crypto, Tom St Denis */ -#ifdef MECC +#if defined(MECC) && !defined(MECC_ACCEL) /** Add two ECC points diff --git a/src/pk/ecc/ltc_ecc_projective_dbl_point.c b/src/pk/ecc/ltc_ecc_projective_dbl_point.c index b015ee47..7996534e 100644 --- a/src/pk/ecc/ltc_ecc_projective_dbl_point.c +++ b/src/pk/ecc/ltc_ecc_projective_dbl_point.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b @@ -21,7 +21,8 @@ ECC Crypto, Tom St Denis */ -#ifdef MECC +#if defined(MECC) && !defined(MECC_ACCEL) + /** Double an ECC point @param P The point to double diff --git a/src/pk/katja/katja_decrypt_key.c b/src/pk/katja/katja_decrypt_key.c index 1b2aec43..266fece4 100644 --- a/src/pk/katja/katja_decrypt_key.c +++ b/src/pk/katja/katja_decrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_encrypt_key.c b/src/pk/katja/katja_encrypt_key.c index b423c505..e4f6f542 100644 --- a/src/pk/katja/katja_encrypt_key.c +++ b/src/pk/katja/katja_encrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_export.c b/src/pk/katja/katja_export.c index ccddb30d..62cf53f6 100644 --- a/src/pk/katja/katja_export.c +++ b/src/pk/katja/katja_export.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_exptmod.c b/src/pk/katja/katja_exptmod.c index e3cc7f1c..7e8d1ee6 100644 --- a/src/pk/katja/katja_exptmod.c +++ b/src/pk/katja/katja_exptmod.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_free.c b/src/pk/katja/katja_free.c index b56bdff3..d50e3d45 100644 --- a/src/pk/katja/katja_free.c +++ b/src/pk/katja/katja_free.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_import.c b/src/pk/katja/katja_import.c index c7fe0637..6db24a67 100644 --- a/src/pk/katja/katja_import.c +++ b/src/pk/katja/katja_import.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/katja/katja_make_key.c b/src/pk/katja/katja_make_key.c index 350dfe50..b508e013 100644 --- a/src/pk/katja/katja_make_key.c +++ b/src/pk/katja/katja_make_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_i2osp.c b/src/pk/pkcs1/pkcs_1_i2osp.c index c706eb75..4b457974 100644 --- a/src/pk/pkcs1/pkcs_1_i2osp.c +++ b/src/pk/pkcs1/pkcs_1_i2osp.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_mgf1.c b/src/pk/pkcs1/pkcs_1_mgf1.c index e0971458..b969a101 100644 --- a/src/pk/pkcs1/pkcs_1_mgf1.c +++ b/src/pk/pkcs1/pkcs_1_mgf1.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_oaep_decode.c b/src/pk/pkcs1/pkcs_1_oaep_decode.c index e3799b87..3b7c2dde 100644 --- a/src/pk/pkcs1/pkcs_1_oaep_decode.c +++ b/src/pk/pkcs1/pkcs_1_oaep_decode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_oaep_encode.c b/src/pk/pkcs1/pkcs_1_oaep_encode.c index 42eb44d7..bb34bd7b 100644 --- a/src/pk/pkcs1/pkcs_1_oaep_encode.c +++ b/src/pk/pkcs1/pkcs_1_oaep_encode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_os2ip.c b/src/pk/pkcs1/pkcs_1_os2ip.c index 88f9f836..cc29dd71 100644 --- a/src/pk/pkcs1/pkcs_1_os2ip.c +++ b/src/pk/pkcs1/pkcs_1_os2ip.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_pss_decode.c b/src/pk/pkcs1/pkcs_1_pss_decode.c index 294e121a..2f865511 100644 --- a/src/pk/pkcs1/pkcs_1_pss_decode.c +++ b/src/pk/pkcs1/pkcs_1_pss_decode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/pkcs1/pkcs_1_pss_encode.c b/src/pk/pkcs1/pkcs_1_pss_encode.c index 244b1651..8087c69d 100644 --- a/src/pk/pkcs1/pkcs_1_pss_encode.c +++ b/src/pk/pkcs1/pkcs_1_pss_encode.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_decrypt_key.c b/src/pk/rsa/rsa_decrypt_key.c index 1dcefb26..47e56cdb 100644 --- a/src/pk/rsa/rsa_decrypt_key.c +++ b/src/pk/rsa/rsa_decrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_encrypt_key.c b/src/pk/rsa/rsa_encrypt_key.c index beeba91c..c8c26860 100644 --- a/src/pk/rsa/rsa_encrypt_key.c +++ b/src/pk/rsa/rsa_encrypt_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_export.c b/src/pk/rsa/rsa_export.c index 26cf417e..cc5e9aa2 100644 --- a/src/pk/rsa/rsa_export.c +++ b/src/pk/rsa/rsa_export.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_exptmod.c b/src/pk/rsa/rsa_exptmod.c index 550c71a1..ce708354 100644 --- a/src/pk/rsa/rsa_exptmod.c +++ b/src/pk/rsa/rsa_exptmod.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_free.c b/src/pk/rsa/rsa_free.c index cb195ad7..972a8ea9 100644 --- a/src/pk/rsa/rsa_free.c +++ b/src/pk/rsa/rsa_free.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_import.c b/src/pk/rsa/rsa_import.c index 2b8b76a9..80df5125 100644 --- a/src/pk/rsa/rsa_import.c +++ b/src/pk/rsa/rsa_import.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_make_key.c b/src/pk/rsa/rsa_make_key.c index f7b4373c..879b34c4 100644 --- a/src/pk/rsa/rsa_make_key.c +++ b/src/pk/rsa/rsa_make_key.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_sign_hash.c b/src/pk/rsa/rsa_sign_hash.c index c5221610..bae8aa99 100644 --- a/src/pk/rsa/rsa_sign_hash.c +++ b/src/pk/rsa/rsa_sign_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/pk/rsa/rsa_verify_hash.c b/src/pk/rsa/rsa_verify_hash.c index 4843c829..aeb352b2 100644 --- a/src/pk/rsa/rsa_verify_hash.c +++ b/src/pk/rsa/rsa_verify_hash.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/fortuna.c b/src/prngs/fortuna.c index cd62a36b..1724ffcc 100644 --- a/src/prngs/fortuna.c +++ b/src/prngs/fortuna.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/rc4.c b/src/prngs/rc4.c index feddf1cb..5c78006e 100644 --- a/src/prngs/rc4.c +++ b/src/prngs/rc4.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/rng_get_bytes.c b/src/prngs/rng_get_bytes.c index bd0972c9..5bf1d61d 100644 --- a/src/prngs/rng_get_bytes.c +++ b/src/prngs/rng_get_bytes.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/rng_make_prng.c b/src/prngs/rng_make_prng.c index ce410e61..7f123606 100644 --- a/src/prngs/rng_make_prng.c +++ b/src/prngs/rng_make_prng.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/sober128.c b/src/prngs/sober128.c index f5094749..191a4d3a 100644 --- a/src/prngs/sober128.c +++ b/src/prngs/sober128.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/sprng.c b/src/prngs/sprng.c index dc826679..940af278 100644 --- a/src/prngs/sprng.c +++ b/src/prngs/sprng.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/src/prngs/yarrow.c b/src/prngs/yarrow.c index 50ab7d1e..dc7aec07 100644 --- a/src/prngs/yarrow.c +++ b/src/prngs/yarrow.c @@ -6,7 +6,7 @@ * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com */ #include "tomcrypt.h" diff --git a/testprof/der_tests.c b/testprof/der_tests.c index ad2bdd2d..2b34bd3e 100644 --- a/testprof/der_tests.c +++ b/testprof/der_tests.c @@ -1,4 +1,5 @@ #include +#include #ifndef LTC_DER @@ -550,11 +551,6 @@ int der_tests(void) DO(der_decode_integer(buf[0], y, b)); if (y != x || mp_cmp(a, b) != LTC_MP_EQ) { fprintf(stderr, "%lu: %lu vs %lu\n", z, x, y); -#ifdef BN_MP_TORADIX_C - mp_todecimal(a, buf[0]); - mp_todecimal(b, buf[1]); - fprintf(stderr, "a == %s\nb == %s\n", buf[0], buf[1]); -#endif mp_clear_multi(a, b, c, d, e, f, g, NULL); return 1; } diff --git a/testprof/makefile.shared b/testprof/makefile.shared index e07cfc07..f57968b5 100644 --- a/testprof/makefile.shared +++ b/testprof/makefile.shared @@ -21,4 +21,4 @@ $(LIBTEST): $(OBJECTS) libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]lo" | xargs` -o $@ -rpath $(LIBPATH) -version-info $(VERSION) install: $(LIBTEST) - libtool --silent --mode=install install -c $(LIBTEST) $(LIBPATH)/$(LIBTEST) + libtool --silent --mode=install install -c $(LIBTEST) $(DESTDIR)$(LIBPATH)/$(LIBTEST)