From f5331baa9f955e3b8bc0ee03dd54932403b2d443 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Wed, 11 Jun 2003 21:10:22 +0000 Subject: [PATCH] added libtomcrypt-0.85 --- aes.c | 783 ++- aes_tab.c | 1523 +++--- changes | 5 + config.pl | 3 +- crypt.c | 3 - crypt.out | 76 + crypt.pdf | Bin 356268 -> 412170 bytes crypt.tex | 11 +- demos/test.c | 20 +- legal.txt | 29 +- makefile | 6 +- makefile.msvc | 7 +- makefile.out | 4 +- md4.c | 2 +- md5.c | 2 +- mpi.c | 12367 +++++++++++++++++++++++---------------------- mycrypt.h | 4 +- mycrypt_cipher.h | 35 +- mycrypt_custom.h | 8 +- mycrypt_hash.h | 1 - prime.c | 2 +- serpent.c | 702 --- sha1.c | 2 +- sha256.c | 2 +- sha512.c | 2 +- tdcal.pdf | Bin 0 -> 56674 bytes twofish.c | 4 +- yarrow.c | 2 - 28 files changed, 7513 insertions(+), 8092 deletions(-) create mode 100644 crypt.out delete mode 100644 serpent.c create mode 100644 tdcal.pdf diff --git a/aes.c b/aes.c index 4d63992..01b2447 100644 --- a/aes.c +++ b/aes.c @@ -1,19 +1,19 @@ -/* This is an independent implementation of the encryption algorithm: */ -/* */ -/* RIJNDAEL by Joan Daemen and Vincent Rijmen */ -/* */ -/* which is a candidate algorithm in the Advanced Encryption Standard */ -/* programme of the US National Institute of Standards and Technology. */ -/* */ -/* Copyright in this implementation is held by Dr B R Gladman but I */ -/* hereby give permission for its free direct or derivative use subject */ -/* to acknowledgment of its origin and compliance with any conditions */ -/* that the originators of the algorithm place on its exploitation. */ -/* */ -/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999 */ - - -/* This code has been modified by Tom St Denis for libtomcrypt.a */ +/* AES implementation by Tom St Denis + * + * Derived from the Public Domain source code by + +--- + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto +--- + */ #include "mycrypt.h" @@ -45,285 +45,517 @@ const struct _cipher_descriptor aes_desc = #include "aes_tab.c" -#define byte(x, y) (((x)>>(8*(y)))&255) - -#define f_rn(bo, bi, n, k) \ - bo[n] = ft_tab[0][byte(bi[n],0)] ^ \ - ft_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ - ft_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ - ft_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) - -#define i_rn(bo, bi, n, k) \ - bo[n] = it_tab[0][byte(bi[n],0)] ^ \ - it_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ - it_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ - it_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) - -#define ls_box(x) \ - ( fl_tab[0][byte(x, 0)] ^ \ - fl_tab[1][byte(x, 1)] ^ \ - fl_tab[2][byte(x, 2)] ^ \ - fl_tab[3][byte(x, 3)] ) - -#define f_rl(bo, bi, n, k) \ - bo[n] = fl_tab[0][byte(bi[n],0)] ^ \ - fl_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ - fl_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ - fl_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) - -#define i_rl(bo, bi, n, k) \ - bo[n] = il_tab[0][byte(bi[n],0)] ^ \ - il_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ - il_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ - il_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) - -#define star_x(x) (((x) & 0x7f7f7f7fUL) << 1) ^ ((((x) & 0x80808080UL) >> 7) * 0x1bUL) - -#define imix_col(y,x) \ - u = star_x(x); \ - v = star_x(u); \ - w = star_x(v); \ - t = w ^ (x); \ - (y) = u ^ v ^ w; \ - (y) ^= ROR(u ^ t, 8) ^ \ - ROR(v ^ t, 16) ^ \ - ROR(t,24) - -#ifdef CLEAN_STACK -static int _rijndael_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey) -#else -int rijndael_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey) -#endif +int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_key *skey) { - unsigned long t, u, v, w, in_key[8]; - int i, k_len; - - /* check arguments */ - _ARGCHK(key != NULL); + int i = 0, j; + unsigned long temp, *rk; + + _ARGCHK(key != NULL); _ARGCHK(skey != NULL); - - if (numrounds == 0) { - numrounds = 10 + (2 * ((keylen/8)-2)); - } - + if (keylen != 16 && keylen != 24 && keylen != 32) { return CRYPT_INVALID_KEYSIZE; } - - if (numrounds != (10 + (2 * ((keylen/8)-2)))) { + + if (rounds != 0 && rounds != (10 + ((keylen/8)-2)*2)) { return CRYPT_INVALID_ROUNDS; } - - k_len = keylen / 4; - for (i = 0; i < k_len; i++) { - LOAD32L(in_key[i], key+(4*i)); - } - - skey->rijndael.k_len = k_len; - skey->rijndael.eK[0] = in_key[0]; skey->rijndael.eK[1] = in_key[1]; - skey->rijndael.eK[2] = in_key[2]; skey->rijndael.eK[3] = in_key[3]; - - switch(k_len) { - case 4: t = skey->rijndael.eK[3]; - for(i = 0; i < 10; ++i) { - t = ls_box(ROR(t, 8)) ^ rco_tab[i]; - t ^= skey->rijndael.eK[4 * i]; skey->rijndael.eK[4 * i + 4] = t; - t ^= skey->rijndael.eK[4 * i + 1]; skey->rijndael.eK[4 * i + 5] = t; - t ^= skey->rijndael.eK[4 * i + 2]; skey->rijndael.eK[4 * i + 6] = t; - t ^= skey->rijndael.eK[4 * i + 3]; skey->rijndael.eK[4 * i + 7] = t; + + skey->rijndael.Nr = 10 + ((keylen/8)-2)*2; + + /* setup the forward key */ + rk = skey->rijndael.eK; + LOAD32H(rk[0], key ); + LOAD32H(rk[1], key + 4); + LOAD32H(rk[2], key + 8); + LOAD32H(rk[3], key + 12); + if (keylen == 16) { + for (;;) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + break; } - break; - case 6: skey->rijndael.eK[4] = in_key[4]; - t = skey->rijndael.eK[5] = in_key[5]; - for(i = 0; i < 8; ++i) { - t = ls_box(ROR(t, 8)) ^ rco_tab[i]; - t ^= skey->rijndael.eK[6 * i]; skey->rijndael.eK[6 * i + 6] = t; - t ^= skey->rijndael.eK[6 * i + 1]; skey->rijndael.eK[6 * i + 7] = t; - t ^= skey->rijndael.eK[6 * i + 2]; skey->rijndael.eK[6 * i + 8] = t; - t ^= skey->rijndael.eK[6 * i + 3]; skey->rijndael.eK[6 * i + 9] = t; - t ^= skey->rijndael.eK[6 * i + 4]; skey->rijndael.eK[6 * i + 10] = t; - t ^= skey->rijndael.eK[6 * i + 5]; skey->rijndael.eK[6 * i + 11] = t; + rk += 4; + } + } else if (keylen == 24) { + LOAD32H(rk[4], key + 16); + LOAD32H(rk[5], key + 20); + for (;;) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + break; } - break; - case 8: skey->rijndael.eK[4] = in_key[4]; - skey->rijndael.eK[5] = in_key[5]; - skey->rijndael.eK[6] = in_key[6]; - t = skey->rijndael.eK[7] = in_key[7]; - for(i = 0; i < 7; ++i) { - t = ls_box(ROR(t, 8)) ^ rco_tab[i]; - t ^= skey->rijndael.eK[8 * i]; skey->rijndael.eK[8 * i + 8] = t; - t ^= skey->rijndael.eK[8 * i + 1]; skey->rijndael.eK[8 * i + 9] = t; - t ^= skey->rijndael.eK[8 * i + 2]; skey->rijndael.eK[8 * i + 10] = t; - t ^= skey->rijndael.eK[8 * i + 3]; skey->rijndael.eK[8 * i + 11] = t; - - t = skey->rijndael.eK[8 * i + 4] ^ ls_box(t); skey->rijndael.eK[8 * i + 12] = t; - t ^= skey->rijndael.eK[8 * i + 5]; skey->rijndael.eK[8 * i + 13] = t; - t ^= skey->rijndael.eK[8 * i + 6]; skey->rijndael.eK[8 * i + 14] = t; - t ^= skey->rijndael.eK[8 * i + 7]; skey->rijndael.eK[8 * i + 15] = t; + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } else if (keylen == 32) { + LOAD32H(rk[4], key + 16); + LOAD32H(rk[5], key + 20); + LOAD32H(rk[6], key + 24); + LOAD32H(rk[7], key + 28); + for (;;) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + break; } - break; + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te4[(temp >> 24) ] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + rk += 8; + } } - - skey->rijndael.dK[0] = skey->rijndael.eK[0]; - skey->rijndael.dK[1] = skey->rijndael.eK[1]; - skey->rijndael.dK[2] = skey->rijndael.eK[2]; - skey->rijndael.dK[3] = skey->rijndael.eK[3]; - for(i = 4; i < 4 * k_len + 24; ++i) { - imix_col(skey->rijndael.dK[i], skey->rijndael.eK[i]); + + /* setup the inverse key now */ + memcpy(skey->rijndael.dK, skey->rijndael.eK, sizeof(skey->rijndael.eK)); + rk = skey->rijndael.dK; + + for (i = 0, j = 4*skey->rijndael.Nr; i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; } - return CRYPT_OK; -}; - -#ifdef CLEAN_STACK -int rijndael_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey) -{ - int x; - x = _rijndael_setup(key, keylen, numrounds, skey); - burn_stack(sizeof(unsigned long) * 12 + sizeof(int) * 2); - return x; + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < skey->rijndael.Nr; i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3] ) & 0xff] & 0xff]; + } + + return CRYPT_OK; } -#endif -/* encrypt a block of text */ - -#define f_nround(bo, bi, k) \ - f_rn(bo, bi, 0, k); \ - f_rn(bo, bi, 1, k); \ - f_rn(bo, bi, 2, k); \ - f_rn(bo, bi, 3, k); \ - k += 4 - -#define f_lround(bo, bi, k) \ - f_rl(bo, bi, 0, k); \ - f_rl(bo, bi, 1, k); \ - f_rl(bo, bi, 2, k); \ - f_rl(bo, bi, 3, k) +void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) +{ + unsigned long s0, s1, s2, s3, t0, t1, t2, t3, *rk; + int Nr; #ifdef SMALL_CODE - -static void _fnround(unsigned long *bo, unsigned long *bi, unsigned long *k) -{ - f_nround(bo, bi, k); -} - -static void _flround(unsigned long *bo, unsigned long *bi, unsigned long *k) -{ - f_lround(bo, bi, k); -} - -#undef f_nround -#define f_nround(bo, bi, k) { _fnround(bo, bi, k); k += 4; } - -#undef f_lround -#define f_lround(bo, bi, k) _flround(bo, bi, k) - -#endif - -void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) -{ - unsigned long b0[4], b1[4], *kp; + int r; +#endif _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(skey != NULL); - - LOAD32L(b0[0], &pt[0]); LOAD32L(b0[1], &pt[4]); - LOAD32L(b0[2], &pt[8]); LOAD32L(b0[3], &pt[12]); - b0[0] ^= skey->rijndael.eK[0]; b0[1] ^= skey->rijndael.eK[1]; - b0[2] ^= skey->rijndael.eK[2]; b0[3] ^= skey->rijndael.eK[3]; - kp = skey->rijndael.eK + 4; - - if (skey->rijndael.k_len > 6) { - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - } else if (skey->rijndael.k_len > 4) { - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - } - - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - f_nround(b1, b0, kp); f_nround(b0, b1, kp); - f_nround(b1, b0, kp); f_lround(b0, b1, kp); - - STORE32L(b0[0], &ct[0]); STORE32L(b0[1], &ct[4]); - STORE32L(b0[2], &ct[8]); STORE32L(b0[3], &ct[12]); -#ifdef CLEAN_STACK - zeromem(b0, sizeof(b0)); - zeromem(b1, sizeof(b1)); -#endif -}; - -/* decrypt a block of text */ -#define i_nround(bo, bi, k) \ - i_rn(bo, bi, 0, k); \ - i_rn(bo, bi, 1, k); \ - i_rn(bo, bi, 2, k); \ - i_rn(bo, bi, 3, k); \ - k -= 4 - -#define i_lround(bo, bi, k) \ - i_rl(bo, bi, 0, k); \ - i_rl(bo, bi, 1, k); \ - i_rl(bo, bi, 2, k); \ - i_rl(bo, bi, 3, k) -#ifdef SMALL_CODE + Nr = skey->rijndael.Nr; + rk = skey->rijndael.eK; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + LOAD32H(s0, pt ); s0 ^= rk[0]; + LOAD32H(s1, pt + 4); s1 ^= rk[1]; + LOAD32H(s2, pt + 8); s2 ^= rk[2]; + LOAD32H(s3, pt + 12); s3 ^= rk[3]; +#ifndef SMALL_CODE + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += Nr << 2; +#else /* SMALL_CODE */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; -static void _inround(unsigned long *bo, unsigned long *bi, unsigned long *k) -{ - i_nround(bo, bi, k); + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* SMALL_CODE */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te4[(t0 >> 24) ] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + STORE32H(s0, ct); + s1 = + (Te4[(t1 >> 24) ] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + STORE32H(s1, ct+4); + s2 = + (Te4[(t2 >> 24) ] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + STORE32H(s2, ct+8); + s3 = + (Te4[(t3 >> 24) ] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + STORE32H(s3, ct+12); } -static void _ilround(unsigned long *bo, unsigned long *bi, unsigned long *k) -{ - i_lround(bo, bi, k); -} - -#undef i_nround -#define i_nround(bo, bi, k) { _inround(bo, bi, k); k -= 4; } - -#undef i_lround -#define i_lround(bo, bi, k) _ilround(bo, bi, k) - -#endif - -void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) -{ - unsigned long b0[4], b1[4], *kp; +void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) { + unsigned long s0, s1, s2, s3, t0, t1, t2, t3, *rk; + int Nr; +#ifdef SMALL_CODE + int r; +#endif /* SMALL_CODE */ _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(skey != NULL); + + Nr = skey->rijndael.Nr; + rk = skey->rijndael.dK; - LOAD32L(b0[0], &ct[0]); LOAD32L(b0[1], &ct[4]); - LOAD32L(b0[2], &ct[8]); LOAD32L(b0[3], &ct[12]); - b0[0] ^= skey->rijndael.eK[4 * skey->rijndael.k_len + 24]; - b0[1] ^= skey->rijndael.eK[4 * skey->rijndael.k_len + 25]; - b0[2] ^= skey->rijndael.eK[4 * skey->rijndael.k_len + 26]; - b0[3] ^= skey->rijndael.eK[4 * skey->rijndael.k_len + 27]; - kp = skey->rijndael.dK + 4 * (skey->rijndael.k_len + 5); - - if(skey->rijndael.k_len > 6) { - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - } else if(skey->rijndael.k_len > 4) { - i_nround(b1, b0, kp); i_nround(b0, b1, kp); + /* + * map byte array block to cipher state + * and add initial round key: + */ + LOAD32H(s0, ct ); s0 ^= rk[0]; + LOAD32H(s1, ct + 4); s1 ^= rk[1]; + LOAD32H(s2, ct + 8); s2 ^= rk[2]; + LOAD32H(s3, ct + 12); s3 ^= rk[3]; +#ifndef SMALL_CODE + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } } + rk += Nr << 2; +#else /* SMALL_CODE */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - i_nround(b1, b0, kp); i_nround(b0, b1, kp); - i_nround(b1, b0, kp); i_lround(b0, b1, kp); + rk += 8; + if (--r == 0) { + break; + } - STORE32L(b0[0], &pt[0]); STORE32L(b0[1], &pt[4]); - STORE32L(b0[2], &pt[8]); STORE32L(b0[3], &pt[12]); -#ifdef CLEAN_STACK - zeromem(b0, sizeof(b0)); - zeromem(b1, sizeof(b1)); -#endif -}; + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* SMALL_CODE */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[0]; + STORE32H(s0, pt); + s1 = + (Td4[(t1 >> 24) ] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[1]; + STORE32H(s1, pt+4); + s2 = + (Td4[(t2 >> 24) ] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[2]; + STORE32H(s2, pt+8); + s3 = + (Td4[(t3 >> 24) ] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[3]; + STORE32H(s3, pt+12); +} int rijndael_test(void) { @@ -337,7 +569,7 @@ int rijndael_test(void) } tests[] = { { 16, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, @@ -369,14 +601,31 @@ int rijndael_test(void) int i; for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) { - if ((errno = rijndael_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) { + zeromem(&key, sizeof(key)); + if ((errno = rijndael_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) { return errno; } - + rijndael_ecb_encrypt(tests[i].pt, tmp[0], &key); rijndael_ecb_decrypt(tmp[0], tmp[1], &key); if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) { - return CRYPT_FAIL_TESTVECTOR; +#if 0 + printf("\n\nTest %d failed\n", i); + if (memcmp(tmp[0], tests[i].ct, 16)) { + printf("CT: "); + for (i = 0; i < 16; i++) { + printf("%02x ", tmp[0][i]); + } + printf("\n"); + } else { + printf("PT: "); + for (i = 0; i < 16; i++) { + printf("%02x ", tmp[1][i]); + } + printf("\n"); + } +#endif + return CRYPT_FAIL_TESTVECTOR; } } return CRYPT_OK; diff --git a/aes_tab.c b/aes_tab.c index 398bf84..98cf63b 100644 --- a/aes_tab.c +++ b/aes_tab.c @@ -1,851 +1,682 @@ /* The precomputed tables for AES */ +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; +Te4[x] = S [x].[01, 01, 01, 01]; -static const unsigned long ft_tab[4][256] = { -{0xa56363c6UL, 0x847c7cf8UL, 0x997777eeUL, 0x8d7b7bf6UL, 0x0df2f2ffUL, - 0xbd6b6bd6UL, 0xb16f6fdeUL, 0x54c5c591UL, 0x50303060UL, 0x03010102UL, - 0xa96767ceUL, 0x7d2b2b56UL, 0x19fefee7UL, 0x62d7d7b5UL, 0xe6abab4dUL, - 0x9a7676ecUL, 0x45caca8fUL, 0x9d82821fUL, 0x40c9c989UL, 0x877d7dfaUL, - 0x15fafaefUL, 0xeb5959b2UL, 0xc947478eUL, 0x0bf0f0fbUL, 0xecadad41UL, - 0x67d4d4b3UL, 0xfda2a25fUL, 0xeaafaf45UL, 0xbf9c9c23UL, 0xf7a4a453UL, - 0x967272e4UL, 0x5bc0c09bUL, 0xc2b7b775UL, 0x1cfdfde1UL, 0xae93933dUL, - 0x6a26264cUL, 0x5a36366cUL, 0x413f3f7eUL, 0x02f7f7f5UL, 0x4fcccc83UL, - 0x5c343468UL, 0xf4a5a551UL, 0x34e5e5d1UL, 0x08f1f1f9UL, 0x937171e2UL, - 0x73d8d8abUL, 0x53313162UL, 0x3f15152aUL, 0x0c040408UL, 0x52c7c795UL, - 0x65232346UL, 0x5ec3c39dUL, 0x28181830UL, 0xa1969637UL, 0x0f05050aUL, - 0xb59a9a2fUL, 0x0907070eUL, 0x36121224UL, 0x9b80801bUL, 0x3de2e2dfUL, - 0x26ebebcdUL, 0x6927274eUL, 0xcdb2b27fUL, 0x9f7575eaUL, 0x1b090912UL, - 0x9e83831dUL, 0x742c2c58UL, 0x2e1a1a34UL, 0x2d1b1b36UL, 0xb26e6edcUL, - 0xee5a5ab4UL, 0xfba0a05bUL, 0xf65252a4UL, 0x4d3b3b76UL, 0x61d6d6b7UL, - 0xceb3b37dUL, 0x7b292952UL, 0x3ee3e3ddUL, 0x712f2f5eUL, 0x97848413UL, - 0xf55353a6UL, 0x68d1d1b9UL, 0x00000000UL, 0x2cededc1UL, 0x60202040UL, - 0x1ffcfce3UL, 0xc8b1b179UL, 0xed5b5bb6UL, 0xbe6a6ad4UL, 0x46cbcb8dUL, - 0xd9bebe67UL, 0x4b393972UL, 0xde4a4a94UL, 0xd44c4c98UL, 0xe85858b0UL, - 0x4acfcf85UL, 0x6bd0d0bbUL, 0x2aefefc5UL, 0xe5aaaa4fUL, 0x16fbfbedUL, - 0xc5434386UL, 0xd74d4d9aUL, 0x55333366UL, 0x94858511UL, 0xcf45458aUL, - 0x10f9f9e9UL, 0x06020204UL, 0x817f7ffeUL, 0xf05050a0UL, 0x443c3c78UL, - 0xba9f9f25UL, 0xe3a8a84bUL, 0xf35151a2UL, 0xfea3a35dUL, 0xc0404080UL, - 0x8a8f8f05UL, 0xad92923fUL, 0xbc9d9d21UL, 0x48383870UL, 0x04f5f5f1UL, - 0xdfbcbc63UL, 0xc1b6b677UL, 0x75dadaafUL, 0x63212142UL, 0x30101020UL, - 0x1affffe5UL, 0x0ef3f3fdUL, 0x6dd2d2bfUL, 0x4ccdcd81UL, 0x140c0c18UL, - 0x35131326UL, 0x2fececc3UL, 0xe15f5fbeUL, 0xa2979735UL, 0xcc444488UL, - 0x3917172eUL, 0x57c4c493UL, 0xf2a7a755UL, 0x827e7efcUL, 0x473d3d7aUL, - 0xac6464c8UL, 0xe75d5dbaUL, 0x2b191932UL, 0x957373e6UL, 0xa06060c0UL, - 0x98818119UL, 0xd14f4f9eUL, 0x7fdcdca3UL, 0x66222244UL, 0x7e2a2a54UL, - 0xab90903bUL, 0x8388880bUL, 0xca46468cUL, 0x29eeeec7UL, 0xd3b8b86bUL, - 0x3c141428UL, 0x79dedea7UL, 0xe25e5ebcUL, 0x1d0b0b16UL, 0x76dbdbadUL, - 0x3be0e0dbUL, 0x56323264UL, 0x4e3a3a74UL, 0x1e0a0a14UL, 0xdb494992UL, - 0x0a06060cUL, 0x6c242448UL, 0xe45c5cb8UL, 0x5dc2c29fUL, 0x6ed3d3bdUL, - 0xefacac43UL, 0xa66262c4UL, 0xa8919139UL, 0xa4959531UL, 0x37e4e4d3UL, - 0x8b7979f2UL, 0x32e7e7d5UL, 0x43c8c88bUL, 0x5937376eUL, 0xb76d6ddaUL, - 0x8c8d8d01UL, 0x64d5d5b1UL, 0xd24e4e9cUL, 0xe0a9a949UL, 0xb46c6cd8UL, - 0xfa5656acUL, 0x07f4f4f3UL, 0x25eaeacfUL, 0xaf6565caUL, 0x8e7a7af4UL, - 0xe9aeae47UL, 0x18080810UL, 0xd5baba6fUL, 0x887878f0UL, 0x6f25254aUL, - 0x722e2e5cUL, 0x241c1c38UL, 0xf1a6a657UL, 0xc7b4b473UL, 0x51c6c697UL, - 0x23e8e8cbUL, 0x7cdddda1UL, 0x9c7474e8UL, 0x211f1f3eUL, 0xdd4b4b96UL, - 0xdcbdbd61UL, 0x868b8b0dUL, 0x858a8a0fUL, 0x907070e0UL, 0x423e3e7cUL, - 0xc4b5b571UL, 0xaa6666ccUL, 0xd8484890UL, 0x05030306UL, 0x01f6f6f7UL, - 0x120e0e1cUL, 0xa36161c2UL, 0x5f35356aUL, 0xf95757aeUL, 0xd0b9b969UL, - 0x91868617UL, 0x58c1c199UL, 0x271d1d3aUL, 0xb99e9e27UL, 0x38e1e1d9UL, - 0x13f8f8ebUL, 0xb398982bUL, 0x33111122UL, 0xbb6969d2UL, 0x70d9d9a9UL, - 0x898e8e07UL, 0xa7949433UL, 0xb69b9b2dUL, 0x221e1e3cUL, 0x92878715UL, - 0x20e9e9c9UL, 0x49cece87UL, 0xff5555aaUL, 0x78282850UL, 0x7adfdfa5UL, - 0x8f8c8c03UL, 0xf8a1a159UL, 0x80898909UL, 0x170d0d1aUL, 0xdabfbf65UL, - 0x31e6e6d7UL, 0xc6424284UL, 0xb86868d0UL, 0xc3414182UL, 0xb0999929UL, - 0x772d2d5aUL, 0x110f0f1eUL, 0xcbb0b07bUL, 0xfc5454a8UL, 0xd6bbbb6dUL, - 0x3a16162cUL}, -{0x6363c6a5UL, 0x7c7cf884UL, 0x7777ee99UL, 0x7b7bf68dUL, 0xf2f2ff0dUL, - 0x6b6bd6bdUL, 0x6f6fdeb1UL, 0xc5c59154UL, 0x30306050UL, 0x01010203UL, - 0x6767cea9UL, 0x2b2b567dUL, 0xfefee719UL, 0xd7d7b562UL, 0xabab4de6UL, - 0x7676ec9aUL, 0xcaca8f45UL, 0x82821f9dUL, 0xc9c98940UL, 0x7d7dfa87UL, - 0xfafaef15UL, 0x5959b2ebUL, 0x47478ec9UL, 0xf0f0fb0bUL, 0xadad41ecUL, - 0xd4d4b367UL, 0xa2a25ffdUL, 0xafaf45eaUL, 0x9c9c23bfUL, 0xa4a453f7UL, - 0x7272e496UL, 0xc0c09b5bUL, 0xb7b775c2UL, 0xfdfde11cUL, 0x93933daeUL, - 0x26264c6aUL, 0x36366c5aUL, 0x3f3f7e41UL, 0xf7f7f502UL, 0xcccc834fUL, - 0x3434685cUL, 0xa5a551f4UL, 0xe5e5d134UL, 0xf1f1f908UL, 0x7171e293UL, - 0xd8d8ab73UL, 0x31316253UL, 0x15152a3fUL, 0x0404080cUL, 0xc7c79552UL, - 0x23234665UL, 0xc3c39d5eUL, 0x18183028UL, 0x969637a1UL, 0x05050a0fUL, - 0x9a9a2fb5UL, 0x07070e09UL, 0x12122436UL, 0x80801b9bUL, 0xe2e2df3dUL, - 0xebebcd26UL, 0x27274e69UL, 0xb2b27fcdUL, 0x7575ea9fUL, 0x0909121bUL, - 0x83831d9eUL, 0x2c2c5874UL, 0x1a1a342eUL, 0x1b1b362dUL, 0x6e6edcb2UL, - 0x5a5ab4eeUL, 0xa0a05bfbUL, 0x5252a4f6UL, 0x3b3b764dUL, 0xd6d6b761UL, - 0xb3b37dceUL, 0x2929527bUL, 0xe3e3dd3eUL, 0x2f2f5e71UL, 0x84841397UL, - 0x5353a6f5UL, 0xd1d1b968UL, 0x00000000UL, 0xededc12cUL, 0x20204060UL, - 0xfcfce31fUL, 0xb1b179c8UL, 0x5b5bb6edUL, 0x6a6ad4beUL, 0xcbcb8d46UL, - 0xbebe67d9UL, 0x3939724bUL, 0x4a4a94deUL, 0x4c4c98d4UL, 0x5858b0e8UL, - 0xcfcf854aUL, 0xd0d0bb6bUL, 0xefefc52aUL, 0xaaaa4fe5UL, 0xfbfbed16UL, - 0x434386c5UL, 0x4d4d9ad7UL, 0x33336655UL, 0x85851194UL, 0x45458acfUL, - 0xf9f9e910UL, 0x02020406UL, 0x7f7ffe81UL, 0x5050a0f0UL, 0x3c3c7844UL, - 0x9f9f25baUL, 0xa8a84be3UL, 0x5151a2f3UL, 0xa3a35dfeUL, 0x404080c0UL, - 0x8f8f058aUL, 0x92923fadUL, 0x9d9d21bcUL, 0x38387048UL, 0xf5f5f104UL, - 0xbcbc63dfUL, 0xb6b677c1UL, 0xdadaaf75UL, 0x21214263UL, 0x10102030UL, - 0xffffe51aUL, 0xf3f3fd0eUL, 0xd2d2bf6dUL, 0xcdcd814cUL, 0x0c0c1814UL, - 0x13132635UL, 0xececc32fUL, 0x5f5fbee1UL, 0x979735a2UL, 0x444488ccUL, - 0x17172e39UL, 0xc4c49357UL, 0xa7a755f2UL, 0x7e7efc82UL, 0x3d3d7a47UL, - 0x6464c8acUL, 0x5d5dbae7UL, 0x1919322bUL, 0x7373e695UL, 0x6060c0a0UL, - 0x81811998UL, 0x4f4f9ed1UL, 0xdcdca37fUL, 0x22224466UL, 0x2a2a547eUL, - 0x90903babUL, 0x88880b83UL, 0x46468ccaUL, 0xeeeec729UL, 0xb8b86bd3UL, - 0x1414283cUL, 0xdedea779UL, 0x5e5ebce2UL, 0x0b0b161dUL, 0xdbdbad76UL, - 0xe0e0db3bUL, 0x32326456UL, 0x3a3a744eUL, 0x0a0a141eUL, 0x494992dbUL, - 0x06060c0aUL, 0x2424486cUL, 0x5c5cb8e4UL, 0xc2c29f5dUL, 0xd3d3bd6eUL, - 0xacac43efUL, 0x6262c4a6UL, 0x919139a8UL, 0x959531a4UL, 0xe4e4d337UL, - 0x7979f28bUL, 0xe7e7d532UL, 0xc8c88b43UL, 0x37376e59UL, 0x6d6ddab7UL, - 0x8d8d018cUL, 0xd5d5b164UL, 0x4e4e9cd2UL, 0xa9a949e0UL, 0x6c6cd8b4UL, - 0x5656acfaUL, 0xf4f4f307UL, 0xeaeacf25UL, 0x6565caafUL, 0x7a7af48eUL, - 0xaeae47e9UL, 0x08081018UL, 0xbaba6fd5UL, 0x7878f088UL, 0x25254a6fUL, - 0x2e2e5c72UL, 0x1c1c3824UL, 0xa6a657f1UL, 0xb4b473c7UL, 0xc6c69751UL, - 0xe8e8cb23UL, 0xdddda17cUL, 0x7474e89cUL, 0x1f1f3e21UL, 0x4b4b96ddUL, - 0xbdbd61dcUL, 0x8b8b0d86UL, 0x8a8a0f85UL, 0x7070e090UL, 0x3e3e7c42UL, - 0xb5b571c4UL, 0x6666ccaaUL, 0x484890d8UL, 0x03030605UL, 0xf6f6f701UL, - 0x0e0e1c12UL, 0x6161c2a3UL, 0x35356a5fUL, 0x5757aef9UL, 0xb9b969d0UL, - 0x86861791UL, 0xc1c19958UL, 0x1d1d3a27UL, 0x9e9e27b9UL, 0xe1e1d938UL, - 0xf8f8eb13UL, 0x98982bb3UL, 0x11112233UL, 0x6969d2bbUL, 0xd9d9a970UL, - 0x8e8e0789UL, 0x949433a7UL, 0x9b9b2db6UL, 0x1e1e3c22UL, 0x87871592UL, - 0xe9e9c920UL, 0xcece8749UL, 0x5555aaffUL, 0x28285078UL, 0xdfdfa57aUL, - 0x8c8c038fUL, 0xa1a159f8UL, 0x89890980UL, 0x0d0d1a17UL, 0xbfbf65daUL, - 0xe6e6d731UL, 0x424284c6UL, 0x6868d0b8UL, 0x414182c3UL, 0x999929b0UL, - 0x2d2d5a77UL, 0x0f0f1e11UL, 0xb0b07bcbUL, 0x5454a8fcUL, 0xbbbb6dd6UL, - 0x16162c3aUL}, -{0x63c6a563UL, 0x7cf8847cUL, 0x77ee9977UL, 0x7bf68d7bUL, 0xf2ff0df2UL, - 0x6bd6bd6bUL, 0x6fdeb16fUL, 0xc59154c5UL, 0x30605030UL, 0x01020301UL, - 0x67cea967UL, 0x2b567d2bUL, 0xfee719feUL, 0xd7b562d7UL, 0xab4de6abUL, - 0x76ec9a76UL, 0xca8f45caUL, 0x821f9d82UL, 0xc98940c9UL, 0x7dfa877dUL, - 0xfaef15faUL, 0x59b2eb59UL, 0x478ec947UL, 0xf0fb0bf0UL, 0xad41ecadUL, - 0xd4b367d4UL, 0xa25ffda2UL, 0xaf45eaafUL, 0x9c23bf9cUL, 0xa453f7a4UL, - 0x72e49672UL, 0xc09b5bc0UL, 0xb775c2b7UL, 0xfde11cfdUL, 0x933dae93UL, - 0x264c6a26UL, 0x366c5a36UL, 0x3f7e413fUL, 0xf7f502f7UL, 0xcc834fccUL, - 0x34685c34UL, 0xa551f4a5UL, 0xe5d134e5UL, 0xf1f908f1UL, 0x71e29371UL, - 0xd8ab73d8UL, 0x31625331UL, 0x152a3f15UL, 0x04080c04UL, 0xc79552c7UL, - 0x23466523UL, 0xc39d5ec3UL, 0x18302818UL, 0x9637a196UL, 0x050a0f05UL, - 0x9a2fb59aUL, 0x070e0907UL, 0x12243612UL, 0x801b9b80UL, 0xe2df3de2UL, - 0xebcd26ebUL, 0x274e6927UL, 0xb27fcdb2UL, 0x75ea9f75UL, 0x09121b09UL, - 0x831d9e83UL, 0x2c58742cUL, 0x1a342e1aUL, 0x1b362d1bUL, 0x6edcb26eUL, - 0x5ab4ee5aUL, 0xa05bfba0UL, 0x52a4f652UL, 0x3b764d3bUL, 0xd6b761d6UL, - 0xb37dceb3UL, 0x29527b29UL, 0xe3dd3ee3UL, 0x2f5e712fUL, 0x84139784UL, - 0x53a6f553UL, 0xd1b968d1UL, 0x00000000UL, 0xedc12cedUL, 0x20406020UL, - 0xfce31ffcUL, 0xb179c8b1UL, 0x5bb6ed5bUL, 0x6ad4be6aUL, 0xcb8d46cbUL, - 0xbe67d9beUL, 0x39724b39UL, 0x4a94de4aUL, 0x4c98d44cUL, 0x58b0e858UL, - 0xcf854acfUL, 0xd0bb6bd0UL, 0xefc52aefUL, 0xaa4fe5aaUL, 0xfbed16fbUL, - 0x4386c543UL, 0x4d9ad74dUL, 0x33665533UL, 0x85119485UL, 0x458acf45UL, - 0xf9e910f9UL, 0x02040602UL, 0x7ffe817fUL, 0x50a0f050UL, 0x3c78443cUL, - 0x9f25ba9fUL, 0xa84be3a8UL, 0x51a2f351UL, 0xa35dfea3UL, 0x4080c040UL, - 0x8f058a8fUL, 0x923fad92UL, 0x9d21bc9dUL, 0x38704838UL, 0xf5f104f5UL, - 0xbc63dfbcUL, 0xb677c1b6UL, 0xdaaf75daUL, 0x21426321UL, 0x10203010UL, - 0xffe51affUL, 0xf3fd0ef3UL, 0xd2bf6dd2UL, 0xcd814ccdUL, 0x0c18140cUL, - 0x13263513UL, 0xecc32fecUL, 0x5fbee15fUL, 0x9735a297UL, 0x4488cc44UL, - 0x172e3917UL, 0xc49357c4UL, 0xa755f2a7UL, 0x7efc827eUL, 0x3d7a473dUL, - 0x64c8ac64UL, 0x5dbae75dUL, 0x19322b19UL, 0x73e69573UL, 0x60c0a060UL, - 0x81199881UL, 0x4f9ed14fUL, 0xdca37fdcUL, 0x22446622UL, 0x2a547e2aUL, - 0x903bab90UL, 0x880b8388UL, 0x468cca46UL, 0xeec729eeUL, 0xb86bd3b8UL, - 0x14283c14UL, 0xdea779deUL, 0x5ebce25eUL, 0x0b161d0bUL, 0xdbad76dbUL, - 0xe0db3be0UL, 0x32645632UL, 0x3a744e3aUL, 0x0a141e0aUL, 0x4992db49UL, - 0x060c0a06UL, 0x24486c24UL, 0x5cb8e45cUL, 0xc29f5dc2UL, 0xd3bd6ed3UL, - 0xac43efacUL, 0x62c4a662UL, 0x9139a891UL, 0x9531a495UL, 0xe4d337e4UL, - 0x79f28b79UL, 0xe7d532e7UL, 0xc88b43c8UL, 0x376e5937UL, 0x6ddab76dUL, - 0x8d018c8dUL, 0xd5b164d5UL, 0x4e9cd24eUL, 0xa949e0a9UL, 0x6cd8b46cUL, - 0x56acfa56UL, 0xf4f307f4UL, 0xeacf25eaUL, 0x65caaf65UL, 0x7af48e7aUL, - 0xae47e9aeUL, 0x08101808UL, 0xba6fd5baUL, 0x78f08878UL, 0x254a6f25UL, - 0x2e5c722eUL, 0x1c38241cUL, 0xa657f1a6UL, 0xb473c7b4UL, 0xc69751c6UL, - 0xe8cb23e8UL, 0xdda17cddUL, 0x74e89c74UL, 0x1f3e211fUL, 0x4b96dd4bUL, - 0xbd61dcbdUL, 0x8b0d868bUL, 0x8a0f858aUL, 0x70e09070UL, 0x3e7c423eUL, - 0xb571c4b5UL, 0x66ccaa66UL, 0x4890d848UL, 0x03060503UL, 0xf6f701f6UL, - 0x0e1c120eUL, 0x61c2a361UL, 0x356a5f35UL, 0x57aef957UL, 0xb969d0b9UL, - 0x86179186UL, 0xc19958c1UL, 0x1d3a271dUL, 0x9e27b99eUL, 0xe1d938e1UL, - 0xf8eb13f8UL, 0x982bb398UL, 0x11223311UL, 0x69d2bb69UL, 0xd9a970d9UL, - 0x8e07898eUL, 0x9433a794UL, 0x9b2db69bUL, 0x1e3c221eUL, 0x87159287UL, - 0xe9c920e9UL, 0xce8749ceUL, 0x55aaff55UL, 0x28507828UL, 0xdfa57adfUL, - 0x8c038f8cUL, 0xa159f8a1UL, 0x89098089UL, 0x0d1a170dUL, 0xbf65dabfUL, - 0xe6d731e6UL, 0x4284c642UL, 0x68d0b868UL, 0x4182c341UL, 0x9929b099UL, - 0x2d5a772dUL, 0x0f1e110fUL, 0xb07bcbb0UL, 0x54a8fc54UL, 0xbb6dd6bbUL, - 0x162c3a16UL}, -{0xc6a56363UL, 0xf8847c7cUL, 0xee997777UL, 0xf68d7b7bUL, 0xff0df2f2UL, - 0xd6bd6b6bUL, 0xdeb16f6fUL, 0x9154c5c5UL, 0x60503030UL, 0x02030101UL, - 0xcea96767UL, 0x567d2b2bUL, 0xe719fefeUL, 0xb562d7d7UL, 0x4de6ababUL, - 0xec9a7676UL, 0x8f45cacaUL, 0x1f9d8282UL, 0x8940c9c9UL, 0xfa877d7dUL, - 0xef15fafaUL, 0xb2eb5959UL, 0x8ec94747UL, 0xfb0bf0f0UL, 0x41ecadadUL, - 0xb367d4d4UL, 0x5ffda2a2UL, 0x45eaafafUL, 0x23bf9c9cUL, 0x53f7a4a4UL, - 0xe4967272UL, 0x9b5bc0c0UL, 0x75c2b7b7UL, 0xe11cfdfdUL, 0x3dae9393UL, - 0x4c6a2626UL, 0x6c5a3636UL, 0x7e413f3fUL, 0xf502f7f7UL, 0x834fccccUL, - 0x685c3434UL, 0x51f4a5a5UL, 0xd134e5e5UL, 0xf908f1f1UL, 0xe2937171UL, - 0xab73d8d8UL, 0x62533131UL, 0x2a3f1515UL, 0x080c0404UL, 0x9552c7c7UL, - 0x46652323UL, 0x9d5ec3c3UL, 0x30281818UL, 0x37a19696UL, 0x0a0f0505UL, - 0x2fb59a9aUL, 0x0e090707UL, 0x24361212UL, 0x1b9b8080UL, 0xdf3de2e2UL, - 0xcd26ebebUL, 0x4e692727UL, 0x7fcdb2b2UL, 0xea9f7575UL, 0x121b0909UL, - 0x1d9e8383UL, 0x58742c2cUL, 0x342e1a1aUL, 0x362d1b1bUL, 0xdcb26e6eUL, - 0xb4ee5a5aUL, 0x5bfba0a0UL, 0xa4f65252UL, 0x764d3b3bUL, 0xb761d6d6UL, - 0x7dceb3b3UL, 0x527b2929UL, 0xdd3ee3e3UL, 0x5e712f2fUL, 0x13978484UL, - 0xa6f55353UL, 0xb968d1d1UL, 0x00000000UL, 0xc12cededUL, 0x40602020UL, - 0xe31ffcfcUL, 0x79c8b1b1UL, 0xb6ed5b5bUL, 0xd4be6a6aUL, 0x8d46cbcbUL, - 0x67d9bebeUL, 0x724b3939UL, 0x94de4a4aUL, 0x98d44c4cUL, 0xb0e85858UL, - 0x854acfcfUL, 0xbb6bd0d0UL, 0xc52aefefUL, 0x4fe5aaaaUL, 0xed16fbfbUL, - 0x86c54343UL, 0x9ad74d4dUL, 0x66553333UL, 0x11948585UL, 0x8acf4545UL, - 0xe910f9f9UL, 0x04060202UL, 0xfe817f7fUL, 0xa0f05050UL, 0x78443c3cUL, - 0x25ba9f9fUL, 0x4be3a8a8UL, 0xa2f35151UL, 0x5dfea3a3UL, 0x80c04040UL, - 0x058a8f8fUL, 0x3fad9292UL, 0x21bc9d9dUL, 0x70483838UL, 0xf104f5f5UL, - 0x63dfbcbcUL, 0x77c1b6b6UL, 0xaf75dadaUL, 0x42632121UL, 0x20301010UL, - 0xe51affffUL, 0xfd0ef3f3UL, 0xbf6dd2d2UL, 0x814ccdcdUL, 0x18140c0cUL, - 0x26351313UL, 0xc32fececUL, 0xbee15f5fUL, 0x35a29797UL, 0x88cc4444UL, - 0x2e391717UL, 0x9357c4c4UL, 0x55f2a7a7UL, 0xfc827e7eUL, 0x7a473d3dUL, - 0xc8ac6464UL, 0xbae75d5dUL, 0x322b1919UL, 0xe6957373UL, 0xc0a06060UL, - 0x19988181UL, 0x9ed14f4fUL, 0xa37fdcdcUL, 0x44662222UL, 0x547e2a2aUL, - 0x3bab9090UL, 0x0b838888UL, 0x8cca4646UL, 0xc729eeeeUL, 0x6bd3b8b8UL, - 0x283c1414UL, 0xa779dedeUL, 0xbce25e5eUL, 0x161d0b0bUL, 0xad76dbdbUL, - 0xdb3be0e0UL, 0x64563232UL, 0x744e3a3aUL, 0x141e0a0aUL, 0x92db4949UL, - 0x0c0a0606UL, 0x486c2424UL, 0xb8e45c5cUL, 0x9f5dc2c2UL, 0xbd6ed3d3UL, - 0x43efacacUL, 0xc4a66262UL, 0x39a89191UL, 0x31a49595UL, 0xd337e4e4UL, - 0xf28b7979UL, 0xd532e7e7UL, 0x8b43c8c8UL, 0x6e593737UL, 0xdab76d6dUL, - 0x018c8d8dUL, 0xb164d5d5UL, 0x9cd24e4eUL, 0x49e0a9a9UL, 0xd8b46c6cUL, - 0xacfa5656UL, 0xf307f4f4UL, 0xcf25eaeaUL, 0xcaaf6565UL, 0xf48e7a7aUL, - 0x47e9aeaeUL, 0x10180808UL, 0x6fd5babaUL, 0xf0887878UL, 0x4a6f2525UL, - 0x5c722e2eUL, 0x38241c1cUL, 0x57f1a6a6UL, 0x73c7b4b4UL, 0x9751c6c6UL, - 0xcb23e8e8UL, 0xa17cddddUL, 0xe89c7474UL, 0x3e211f1fUL, 0x96dd4b4bUL, - 0x61dcbdbdUL, 0x0d868b8bUL, 0x0f858a8aUL, 0xe0907070UL, 0x7c423e3eUL, - 0x71c4b5b5UL, 0xccaa6666UL, 0x90d84848UL, 0x06050303UL, 0xf701f6f6UL, - 0x1c120e0eUL, 0xc2a36161UL, 0x6a5f3535UL, 0xaef95757UL, 0x69d0b9b9UL, - 0x17918686UL, 0x9958c1c1UL, 0x3a271d1dUL, 0x27b99e9eUL, 0xd938e1e1UL, - 0xeb13f8f8UL, 0x2bb39898UL, 0x22331111UL, 0xd2bb6969UL, 0xa970d9d9UL, - 0x07898e8eUL, 0x33a79494UL, 0x2db69b9bUL, 0x3c221e1eUL, 0x15928787UL, - 0xc920e9e9UL, 0x8749ceceUL, 0xaaff5555UL, 0x50782828UL, 0xa57adfdfUL, - 0x038f8c8cUL, 0x59f8a1a1UL, 0x09808989UL, 0x1a170d0dUL, 0x65dabfbfUL, - 0xd731e6e6UL, 0x84c64242UL, 0xd0b86868UL, 0x82c34141UL, 0x29b09999UL, - 0x5a772d2dUL, 0x1e110f0fUL, 0x7bcbb0b0UL, 0xa8fc5454UL, 0x6dd6bbbbUL, - 0x2c3a1616UL} - }; +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01, 01, 01, 01]; +*/ -static const unsigned long it_tab[4][256] = { -{0x50a7f451UL, 0x5365417eUL, 0xc3a4171aUL, 0x965e273aUL, 0xcb6bab3bUL, - 0xf1459d1fUL, 0xab58faacUL, 0x9303e34bUL, 0x55fa3020UL, 0xf66d76adUL, - 0x9176cc88UL, 0x254c02f5UL, 0xfcd7e54fUL, 0xd7cb2ac5UL, 0x80443526UL, - 0x8fa362b5UL, 0x495ab1deUL, 0x671bba25UL, 0x980eea45UL, 0xe1c0fe5dUL, - 0x02752fc3UL, 0x12f04c81UL, 0xa397468dUL, 0xc6f9d36bUL, 0xe75f8f03UL, - 0x959c9215UL, 0xeb7a6dbfUL, 0xda595295UL, 0x2d83bed4UL, 0xd3217458UL, - 0x2969e049UL, 0x44c8c98eUL, 0x6a89c275UL, 0x78798ef4UL, 0x6b3e5899UL, - 0xdd71b927UL, 0xb64fe1beUL, 0x17ad88f0UL, 0x66ac20c9UL, 0xb43ace7dUL, - 0x184adf63UL, 0x82311ae5UL, 0x60335197UL, 0x457f5362UL, 0xe07764b1UL, - 0x84ae6bbbUL, 0x1ca081feUL, 0x942b08f9UL, 0x58684870UL, 0x19fd458fUL, - 0x876cde94UL, 0xb7f87b52UL, 0x23d373abUL, 0xe2024b72UL, 0x578f1fe3UL, - 0x2aab5566UL, 0x0728ebb2UL, 0x03c2b52fUL, 0x9a7bc586UL, 0xa50837d3UL, - 0xf2872830UL, 0xb2a5bf23UL, 0xba6a0302UL, 0x5c8216edUL, 0x2b1ccf8aUL, - 0x92b479a7UL, 0xf0f207f3UL, 0xa1e2694eUL, 0xcdf4da65UL, 0xd5be0506UL, - 0x1f6234d1UL, 0x8afea6c4UL, 0x9d532e34UL, 0xa055f3a2UL, 0x32e18a05UL, - 0x75ebf6a4UL, 0x39ec830bUL, 0xaaef6040UL, 0x069f715eUL, 0x51106ebdUL, - 0xf98a213eUL, 0x3d06dd96UL, 0xae053eddUL, 0x46bde64dUL, 0xb58d5491UL, - 0x055dc471UL, 0x6fd40604UL, 0xff155060UL, 0x24fb9819UL, 0x97e9bdd6UL, - 0xcc434089UL, 0x779ed967UL, 0xbd42e8b0UL, 0x888b8907UL, 0x385b19e7UL, - 0xdbeec879UL, 0x470a7ca1UL, 0xe90f427cUL, 0xc91e84f8UL, 0x00000000UL, - 0x83868009UL, 0x48ed2b32UL, 0xac70111eUL, 0x4e725a6cUL, 0xfbff0efdUL, - 0x5638850fUL, 0x1ed5ae3dUL, 0x27392d36UL, 0x64d90f0aUL, 0x21a65c68UL, - 0xd1545b9bUL, 0x3a2e3624UL, 0xb1670a0cUL, 0x0fe75793UL, 0xd296eeb4UL, - 0x9e919b1bUL, 0x4fc5c080UL, 0xa220dc61UL, 0x694b775aUL, 0x161a121cUL, - 0x0aba93e2UL, 0xe52aa0c0UL, 0x43e0223cUL, 0x1d171b12UL, 0x0b0d090eUL, - 0xadc78bf2UL, 0xb9a8b62dUL, 0xc8a91e14UL, 0x8519f157UL, 0x4c0775afUL, - 0xbbdd99eeUL, 0xfd607fa3UL, 0x9f2601f7UL, 0xbcf5725cUL, 0xc53b6644UL, - 0x347efb5bUL, 0x7629438bUL, 0xdcc623cbUL, 0x68fcedb6UL, 0x63f1e4b8UL, - 0xcadc31d7UL, 0x10856342UL, 0x40229713UL, 0x2011c684UL, 0x7d244a85UL, - 0xf83dbbd2UL, 0x1132f9aeUL, 0x6da129c7UL, 0x4b2f9e1dUL, 0xf330b2dcUL, - 0xec52860dUL, 0xd0e3c177UL, 0x6c16b32bUL, 0x99b970a9UL, 0xfa489411UL, - 0x2264e947UL, 0xc48cfca8UL, 0x1a3ff0a0UL, 0xd82c7d56UL, 0xef903322UL, - 0xc74e4987UL, 0xc1d138d9UL, 0xfea2ca8cUL, 0x360bd498UL, 0xcf81f5a6UL, - 0x28de7aa5UL, 0x268eb7daUL, 0xa4bfad3fUL, 0xe49d3a2cUL, 0x0d927850UL, - 0x9bcc5f6aUL, 0x62467e54UL, 0xc2138df6UL, 0xe8b8d890UL, 0x5ef7392eUL, - 0xf5afc382UL, 0xbe805d9fUL, 0x7c93d069UL, 0xa92dd56fUL, 0xb31225cfUL, - 0x3b99acc8UL, 0xa77d1810UL, 0x6e639ce8UL, 0x7bbb3bdbUL, 0x097826cdUL, - 0xf418596eUL, 0x01b79aecUL, 0xa89a4f83UL, 0x656e95e6UL, 0x7ee6ffaaUL, - 0x08cfbc21UL, 0xe6e815efUL, 0xd99be7baUL, 0xce366f4aUL, 0xd4099feaUL, - 0xd67cb029UL, 0xafb2a431UL, 0x31233f2aUL, 0x3094a5c6UL, 0xc066a235UL, - 0x37bc4e74UL, 0xa6ca82fcUL, 0xb0d090e0UL, 0x15d8a733UL, 0x4a9804f1UL, - 0xf7daec41UL, 0x0e50cd7fUL, 0x2ff69117UL, 0x8dd64d76UL, 0x4db0ef43UL, - 0x544daaccUL, 0xdf0496e4UL, 0xe3b5d19eUL, 0x1b886a4cUL, 0xb81f2cc1UL, - 0x7f516546UL, 0x04ea5e9dUL, 0x5d358c01UL, 0x737487faUL, 0x2e410bfbUL, - 0x5a1d67b3UL, 0x52d2db92UL, 0x335610e9UL, 0x1347d66dUL, 0x8c61d79aUL, - 0x7a0ca137UL, 0x8e14f859UL, 0x893c13ebUL, 0xee27a9ceUL, 0x35c961b7UL, - 0xede51ce1UL, 0x3cb1477aUL, 0x59dfd29cUL, 0x3f73f255UL, 0x79ce1418UL, - 0xbf37c773UL, 0xeacdf753UL, 0x5baafd5fUL, 0x146f3ddfUL, 0x86db4478UL, - 0x81f3afcaUL, 0x3ec468b9UL, 0x2c342438UL, 0x5f40a3c2UL, 0x72c31d16UL, - 0x0c25e2bcUL, 0x8b493c28UL, 0x41950dffUL, 0x7101a839UL, 0xdeb30c08UL, - 0x9ce4b4d8UL, 0x90c15664UL, 0x6184cb7bUL, 0x70b632d5UL, 0x745c6c48UL, - 0x4257b8d0UL}, -{0xa7f45150UL, 0x65417e53UL, 0xa4171ac3UL, 0x5e273a96UL, 0x6bab3bcbUL, - 0x459d1ff1UL, 0x58faacabUL, 0x03e34b93UL, 0xfa302055UL, 0x6d76adf6UL, - 0x76cc8891UL, 0x4c02f525UL, 0xd7e54ffcUL, 0xcb2ac5d7UL, 0x44352680UL, - 0xa362b58fUL, 0x5ab1de49UL, 0x1bba2567UL, 0x0eea4598UL, 0xc0fe5de1UL, - 0x752fc302UL, 0xf04c8112UL, 0x97468da3UL, 0xf9d36bc6UL, 0x5f8f03e7UL, - 0x9c921595UL, 0x7a6dbfebUL, 0x595295daUL, 0x83bed42dUL, 0x217458d3UL, - 0x69e04929UL, 0xc8c98e44UL, 0x89c2756aUL, 0x798ef478UL, 0x3e58996bUL, - 0x71b927ddUL, 0x4fe1beb6UL, 0xad88f017UL, 0xac20c966UL, 0x3ace7db4UL, - 0x4adf6318UL, 0x311ae582UL, 0x33519760UL, 0x7f536245UL, 0x7764b1e0UL, - 0xae6bbb84UL, 0xa081fe1cUL, 0x2b08f994UL, 0x68487058UL, 0xfd458f19UL, - 0x6cde9487UL, 0xf87b52b7UL, 0xd373ab23UL, 0x024b72e2UL, 0x8f1fe357UL, - 0xab55662aUL, 0x28ebb207UL, 0xc2b52f03UL, 0x7bc5869aUL, 0x0837d3a5UL, - 0x872830f2UL, 0xa5bf23b2UL, 0x6a0302baUL, 0x8216ed5cUL, 0x1ccf8a2bUL, - 0xb479a792UL, 0xf207f3f0UL, 0xe2694ea1UL, 0xf4da65cdUL, 0xbe0506d5UL, - 0x6234d11fUL, 0xfea6c48aUL, 0x532e349dUL, 0x55f3a2a0UL, 0xe18a0532UL, - 0xebf6a475UL, 0xec830b39UL, 0xef6040aaUL, 0x9f715e06UL, 0x106ebd51UL, - 0x8a213ef9UL, 0x06dd963dUL, 0x053eddaeUL, 0xbde64d46UL, 0x8d5491b5UL, - 0x5dc47105UL, 0xd406046fUL, 0x155060ffUL, 0xfb981924UL, 0xe9bdd697UL, - 0x434089ccUL, 0x9ed96777UL, 0x42e8b0bdUL, 0x8b890788UL, 0x5b19e738UL, - 0xeec879dbUL, 0x0a7ca147UL, 0x0f427ce9UL, 0x1e84f8c9UL, 0x00000000UL, - 0x86800983UL, 0xed2b3248UL, 0x70111eacUL, 0x725a6c4eUL, 0xff0efdfbUL, - 0x38850f56UL, 0xd5ae3d1eUL, 0x392d3627UL, 0xd90f0a64UL, 0xa65c6821UL, - 0x545b9bd1UL, 0x2e36243aUL, 0x670a0cb1UL, 0xe757930fUL, 0x96eeb4d2UL, - 0x919b1b9eUL, 0xc5c0804fUL, 0x20dc61a2UL, 0x4b775a69UL, 0x1a121c16UL, - 0xba93e20aUL, 0x2aa0c0e5UL, 0xe0223c43UL, 0x171b121dUL, 0x0d090e0bUL, - 0xc78bf2adUL, 0xa8b62db9UL, 0xa91e14c8UL, 0x19f15785UL, 0x0775af4cUL, - 0xdd99eebbUL, 0x607fa3fdUL, 0x2601f79fUL, 0xf5725cbcUL, 0x3b6644c5UL, - 0x7efb5b34UL, 0x29438b76UL, 0xc623cbdcUL, 0xfcedb668UL, 0xf1e4b863UL, - 0xdc31d7caUL, 0x85634210UL, 0x22971340UL, 0x11c68420UL, 0x244a857dUL, - 0x3dbbd2f8UL, 0x32f9ae11UL, 0xa129c76dUL, 0x2f9e1d4bUL, 0x30b2dcf3UL, - 0x52860decUL, 0xe3c177d0UL, 0x16b32b6cUL, 0xb970a999UL, 0x489411faUL, - 0x64e94722UL, 0x8cfca8c4UL, 0x3ff0a01aUL, 0x2c7d56d8UL, 0x903322efUL, - 0x4e4987c7UL, 0xd138d9c1UL, 0xa2ca8cfeUL, 0x0bd49836UL, 0x81f5a6cfUL, - 0xde7aa528UL, 0x8eb7da26UL, 0xbfad3fa4UL, 0x9d3a2ce4UL, 0x9278500dUL, - 0xcc5f6a9bUL, 0x467e5462UL, 0x138df6c2UL, 0xb8d890e8UL, 0xf7392e5eUL, - 0xafc382f5UL, 0x805d9fbeUL, 0x93d0697cUL, 0x2dd56fa9UL, 0x1225cfb3UL, - 0x99acc83bUL, 0x7d1810a7UL, 0x639ce86eUL, 0xbb3bdb7bUL, 0x7826cd09UL, - 0x18596ef4UL, 0xb79aec01UL, 0x9a4f83a8UL, 0x6e95e665UL, 0xe6ffaa7eUL, - 0xcfbc2108UL, 0xe815efe6UL, 0x9be7bad9UL, 0x366f4aceUL, 0x099fead4UL, - 0x7cb029d6UL, 0xb2a431afUL, 0x233f2a31UL, 0x94a5c630UL, 0x66a235c0UL, - 0xbc4e7437UL, 0xca82fca6UL, 0xd090e0b0UL, 0xd8a73315UL, 0x9804f14aUL, - 0xdaec41f7UL, 0x50cd7f0eUL, 0xf691172fUL, 0xd64d768dUL, 0xb0ef434dUL, - 0x4daacc54UL, 0x0496e4dfUL, 0xb5d19ee3UL, 0x886a4c1bUL, 0x1f2cc1b8UL, - 0x5165467fUL, 0xea5e9d04UL, 0x358c015dUL, 0x7487fa73UL, 0x410bfb2eUL, - 0x1d67b35aUL, 0xd2db9252UL, 0x5610e933UL, 0x47d66d13UL, 0x61d79a8cUL, - 0x0ca1377aUL, 0x14f8598eUL, 0x3c13eb89UL, 0x27a9ceeeUL, 0xc961b735UL, - 0xe51ce1edUL, 0xb1477a3cUL, 0xdfd29c59UL, 0x73f2553fUL, 0xce141879UL, - 0x37c773bfUL, 0xcdf753eaUL, 0xaafd5f5bUL, 0x6f3ddf14UL, 0xdb447886UL, - 0xf3afca81UL, 0xc468b93eUL, 0x3424382cUL, 0x40a3c25fUL, 0xc31d1672UL, - 0x25e2bc0cUL, 0x493c288bUL, 0x950dff41UL, 0x01a83971UL, 0xb30c08deUL, - 0xe4b4d89cUL, 0xc1566490UL, 0x84cb7b61UL, 0xb632d570UL, 0x5c6c4874UL, - 0x57b8d042UL}, -{0xf45150a7UL, 0x417e5365UL, 0x171ac3a4UL, 0x273a965eUL, 0xab3bcb6bUL, - 0x9d1ff145UL, 0xfaacab58UL, 0xe34b9303UL, 0x302055faUL, 0x76adf66dUL, - 0xcc889176UL, 0x02f5254cUL, 0xe54ffcd7UL, 0x2ac5d7cbUL, 0x35268044UL, - 0x62b58fa3UL, 0xb1de495aUL, 0xba25671bUL, 0xea45980eUL, 0xfe5de1c0UL, - 0x2fc30275UL, 0x4c8112f0UL, 0x468da397UL, 0xd36bc6f9UL, 0x8f03e75fUL, - 0x9215959cUL, 0x6dbfeb7aUL, 0x5295da59UL, 0xbed42d83UL, 0x7458d321UL, - 0xe0492969UL, 0xc98e44c8UL, 0xc2756a89UL, 0x8ef47879UL, 0x58996b3eUL, - 0xb927dd71UL, 0xe1beb64fUL, 0x88f017adUL, 0x20c966acUL, 0xce7db43aUL, - 0xdf63184aUL, 0x1ae58231UL, 0x51976033UL, 0x5362457fUL, 0x64b1e077UL, - 0x6bbb84aeUL, 0x81fe1ca0UL, 0x08f9942bUL, 0x48705868UL, 0x458f19fdUL, - 0xde94876cUL, 0x7b52b7f8UL, 0x73ab23d3UL, 0x4b72e202UL, 0x1fe3578fUL, - 0x55662aabUL, 0xebb20728UL, 0xb52f03c2UL, 0xc5869a7bUL, 0x37d3a508UL, - 0x2830f287UL, 0xbf23b2a5UL, 0x0302ba6aUL, 0x16ed5c82UL, 0xcf8a2b1cUL, - 0x79a792b4UL, 0x07f3f0f2UL, 0x694ea1e2UL, 0xda65cdf4UL, 0x0506d5beUL, - 0x34d11f62UL, 0xa6c48afeUL, 0x2e349d53UL, 0xf3a2a055UL, 0x8a0532e1UL, - 0xf6a475ebUL, 0x830b39ecUL, 0x6040aaefUL, 0x715e069fUL, 0x6ebd5110UL, - 0x213ef98aUL, 0xdd963d06UL, 0x3eddae05UL, 0xe64d46bdUL, 0x5491b58dUL, - 0xc471055dUL, 0x06046fd4UL, 0x5060ff15UL, 0x981924fbUL, 0xbdd697e9UL, - 0x4089cc43UL, 0xd967779eUL, 0xe8b0bd42UL, 0x8907888bUL, 0x19e7385bUL, - 0xc879dbeeUL, 0x7ca1470aUL, 0x427ce90fUL, 0x84f8c91eUL, 0x00000000UL, - 0x80098386UL, 0x2b3248edUL, 0x111eac70UL, 0x5a6c4e72UL, 0x0efdfbffUL, - 0x850f5638UL, 0xae3d1ed5UL, 0x2d362739UL, 0x0f0a64d9UL, 0x5c6821a6UL, - 0x5b9bd154UL, 0x36243a2eUL, 0x0a0cb167UL, 0x57930fe7UL, 0xeeb4d296UL, - 0x9b1b9e91UL, 0xc0804fc5UL, 0xdc61a220UL, 0x775a694bUL, 0x121c161aUL, - 0x93e20abaUL, 0xa0c0e52aUL, 0x223c43e0UL, 0x1b121d17UL, 0x090e0b0dUL, - 0x8bf2adc7UL, 0xb62db9a8UL, 0x1e14c8a9UL, 0xf1578519UL, 0x75af4c07UL, - 0x99eebbddUL, 0x7fa3fd60UL, 0x01f79f26UL, 0x725cbcf5UL, 0x6644c53bUL, - 0xfb5b347eUL, 0x438b7629UL, 0x23cbdcc6UL, 0xedb668fcUL, 0xe4b863f1UL, - 0x31d7cadcUL, 0x63421085UL, 0x97134022UL, 0xc6842011UL, 0x4a857d24UL, - 0xbbd2f83dUL, 0xf9ae1132UL, 0x29c76da1UL, 0x9e1d4b2fUL, 0xb2dcf330UL, - 0x860dec52UL, 0xc177d0e3UL, 0xb32b6c16UL, 0x70a999b9UL, 0x9411fa48UL, - 0xe9472264UL, 0xfca8c48cUL, 0xf0a01a3fUL, 0x7d56d82cUL, 0x3322ef90UL, - 0x4987c74eUL, 0x38d9c1d1UL, 0xca8cfea2UL, 0xd498360bUL, 0xf5a6cf81UL, - 0x7aa528deUL, 0xb7da268eUL, 0xad3fa4bfUL, 0x3a2ce49dUL, 0x78500d92UL, - 0x5f6a9bccUL, 0x7e546246UL, 0x8df6c213UL, 0xd890e8b8UL, 0x392e5ef7UL, - 0xc382f5afUL, 0x5d9fbe80UL, 0xd0697c93UL, 0xd56fa92dUL, 0x25cfb312UL, - 0xacc83b99UL, 0x1810a77dUL, 0x9ce86e63UL, 0x3bdb7bbbUL, 0x26cd0978UL, - 0x596ef418UL, 0x9aec01b7UL, 0x4f83a89aUL, 0x95e6656eUL, 0xffaa7ee6UL, - 0xbc2108cfUL, 0x15efe6e8UL, 0xe7bad99bUL, 0x6f4ace36UL, 0x9fead409UL, - 0xb029d67cUL, 0xa431afb2UL, 0x3f2a3123UL, 0xa5c63094UL, 0xa235c066UL, - 0x4e7437bcUL, 0x82fca6caUL, 0x90e0b0d0UL, 0xa73315d8UL, 0x04f14a98UL, - 0xec41f7daUL, 0xcd7f0e50UL, 0x91172ff6UL, 0x4d768dd6UL, 0xef434db0UL, - 0xaacc544dUL, 0x96e4df04UL, 0xd19ee3b5UL, 0x6a4c1b88UL, 0x2cc1b81fUL, - 0x65467f51UL, 0x5e9d04eaUL, 0x8c015d35UL, 0x87fa7374UL, 0x0bfb2e41UL, - 0x67b35a1dUL, 0xdb9252d2UL, 0x10e93356UL, 0xd66d1347UL, 0xd79a8c61UL, - 0xa1377a0cUL, 0xf8598e14UL, 0x13eb893cUL, 0xa9ceee27UL, 0x61b735c9UL, - 0x1ce1ede5UL, 0x477a3cb1UL, 0xd29c59dfUL, 0xf2553f73UL, 0x141879ceUL, - 0xc773bf37UL, 0xf753eacdUL, 0xfd5f5baaUL, 0x3ddf146fUL, 0x447886dbUL, - 0xafca81f3UL, 0x68b93ec4UL, 0x24382c34UL, 0xa3c25f40UL, 0x1d1672c3UL, - 0xe2bc0c25UL, 0x3c288b49UL, 0x0dff4195UL, 0xa8397101UL, 0x0c08deb3UL, - 0xb4d89ce4UL, 0x566490c1UL, 0xcb7b6184UL, 0x32d570b6UL, 0x6c48745cUL, - 0xb8d04257UL}, -{0x5150a7f4UL, 0x7e536541UL, 0x1ac3a417UL, 0x3a965e27UL, 0x3bcb6babUL, - 0x1ff1459dUL, 0xacab58faUL, 0x4b9303e3UL, 0x2055fa30UL, 0xadf66d76UL, - 0x889176ccUL, 0xf5254c02UL, 0x4ffcd7e5UL, 0xc5d7cb2aUL, 0x26804435UL, - 0xb58fa362UL, 0xde495ab1UL, 0x25671bbaUL, 0x45980eeaUL, 0x5de1c0feUL, - 0xc302752fUL, 0x8112f04cUL, 0x8da39746UL, 0x6bc6f9d3UL, 0x03e75f8fUL, - 0x15959c92UL, 0xbfeb7a6dUL, 0x95da5952UL, 0xd42d83beUL, 0x58d32174UL, - 0x492969e0UL, 0x8e44c8c9UL, 0x756a89c2UL, 0xf478798eUL, 0x996b3e58UL, - 0x27dd71b9UL, 0xbeb64fe1UL, 0xf017ad88UL, 0xc966ac20UL, 0x7db43aceUL, - 0x63184adfUL, 0xe582311aUL, 0x97603351UL, 0x62457f53UL, 0xb1e07764UL, - 0xbb84ae6bUL, 0xfe1ca081UL, 0xf9942b08UL, 0x70586848UL, 0x8f19fd45UL, - 0x94876cdeUL, 0x52b7f87bUL, 0xab23d373UL, 0x72e2024bUL, 0xe3578f1fUL, - 0x662aab55UL, 0xb20728ebUL, 0x2f03c2b5UL, 0x869a7bc5UL, 0xd3a50837UL, - 0x30f28728UL, 0x23b2a5bfUL, 0x02ba6a03UL, 0xed5c8216UL, 0x8a2b1ccfUL, - 0xa792b479UL, 0xf3f0f207UL, 0x4ea1e269UL, 0x65cdf4daUL, 0x06d5be05UL, - 0xd11f6234UL, 0xc48afea6UL, 0x349d532eUL, 0xa2a055f3UL, 0x0532e18aUL, - 0xa475ebf6UL, 0x0b39ec83UL, 0x40aaef60UL, 0x5e069f71UL, 0xbd51106eUL, - 0x3ef98a21UL, 0x963d06ddUL, 0xddae053eUL, 0x4d46bde6UL, 0x91b58d54UL, - 0x71055dc4UL, 0x046fd406UL, 0x60ff1550UL, 0x1924fb98UL, 0xd697e9bdUL, - 0x89cc4340UL, 0x67779ed9UL, 0xb0bd42e8UL, 0x07888b89UL, 0xe7385b19UL, - 0x79dbeec8UL, 0xa1470a7cUL, 0x7ce90f42UL, 0xf8c91e84UL, 0x00000000UL, - 0x09838680UL, 0x3248ed2bUL, 0x1eac7011UL, 0x6c4e725aUL, 0xfdfbff0eUL, - 0x0f563885UL, 0x3d1ed5aeUL, 0x3627392dUL, 0x0a64d90fUL, 0x6821a65cUL, - 0x9bd1545bUL, 0x243a2e36UL, 0x0cb1670aUL, 0x930fe757UL, 0xb4d296eeUL, - 0x1b9e919bUL, 0x804fc5c0UL, 0x61a220dcUL, 0x5a694b77UL, 0x1c161a12UL, - 0xe20aba93UL, 0xc0e52aa0UL, 0x3c43e022UL, 0x121d171bUL, 0x0e0b0d09UL, - 0xf2adc78bUL, 0x2db9a8b6UL, 0x14c8a91eUL, 0x578519f1UL, 0xaf4c0775UL, - 0xeebbdd99UL, 0xa3fd607fUL, 0xf79f2601UL, 0x5cbcf572UL, 0x44c53b66UL, - 0x5b347efbUL, 0x8b762943UL, 0xcbdcc623UL, 0xb668fcedUL, 0xb863f1e4UL, - 0xd7cadc31UL, 0x42108563UL, 0x13402297UL, 0x842011c6UL, 0x857d244aUL, - 0xd2f83dbbUL, 0xae1132f9UL, 0xc76da129UL, 0x1d4b2f9eUL, 0xdcf330b2UL, - 0x0dec5286UL, 0x77d0e3c1UL, 0x2b6c16b3UL, 0xa999b970UL, 0x11fa4894UL, - 0x472264e9UL, 0xa8c48cfcUL, 0xa01a3ff0UL, 0x56d82c7dUL, 0x22ef9033UL, - 0x87c74e49UL, 0xd9c1d138UL, 0x8cfea2caUL, 0x98360bd4UL, 0xa6cf81f5UL, - 0xa528de7aUL, 0xda268eb7UL, 0x3fa4bfadUL, 0x2ce49d3aUL, 0x500d9278UL, - 0x6a9bcc5fUL, 0x5462467eUL, 0xf6c2138dUL, 0x90e8b8d8UL, 0x2e5ef739UL, - 0x82f5afc3UL, 0x9fbe805dUL, 0x697c93d0UL, 0x6fa92dd5UL, 0xcfb31225UL, - 0xc83b99acUL, 0x10a77d18UL, 0xe86e639cUL, 0xdb7bbb3bUL, 0xcd097826UL, - 0x6ef41859UL, 0xec01b79aUL, 0x83a89a4fUL, 0xe6656e95UL, 0xaa7ee6ffUL, - 0x2108cfbcUL, 0xefe6e815UL, 0xbad99be7UL, 0x4ace366fUL, 0xead4099fUL, - 0x29d67cb0UL, 0x31afb2a4UL, 0x2a31233fUL, 0xc63094a5UL, 0x35c066a2UL, - 0x7437bc4eUL, 0xfca6ca82UL, 0xe0b0d090UL, 0x3315d8a7UL, 0xf14a9804UL, - 0x41f7daecUL, 0x7f0e50cdUL, 0x172ff691UL, 0x768dd64dUL, 0x434db0efUL, - 0xcc544daaUL, 0xe4df0496UL, 0x9ee3b5d1UL, 0x4c1b886aUL, 0xc1b81f2cUL, - 0x467f5165UL, 0x9d04ea5eUL, 0x015d358cUL, 0xfa737487UL, 0xfb2e410bUL, - 0xb35a1d67UL, 0x9252d2dbUL, 0xe9335610UL, 0x6d1347d6UL, 0x9a8c61d7UL, - 0x377a0ca1UL, 0x598e14f8UL, 0xeb893c13UL, 0xceee27a9UL, 0xb735c961UL, - 0xe1ede51cUL, 0x7a3cb147UL, 0x9c59dfd2UL, 0x553f73f2UL, 0x1879ce14UL, - 0x73bf37c7UL, 0x53eacdf7UL, 0x5f5baafdUL, 0xdf146f3dUL, 0x7886db44UL, - 0xca81f3afUL, 0xb93ec468UL, 0x382c3424UL, 0xc25f40a3UL, 0x1672c31dUL, - 0xbc0c25e2UL, 0x288b493cUL, 0xff41950dUL, 0x397101a8UL, 0x08deb30cUL, - 0xd89ce4b4UL, 0x6490c156UL, 0x7b6184cbUL, 0xd570b632UL, 0x48745c6cUL, - 0xd04257b8UL} - }; +static const unsigned long Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const unsigned long Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const unsigned long Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const unsigned long Te3[256] = { -static const unsigned long fl_tab[4][256] = { -{0x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, - 0x0000006bUL, 0x0000006fUL, 0x000000c5UL, 0x00000030UL, 0x00000001UL, - 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, - 0x00000076UL, 0x000000caUL, 0x00000082UL, 0x000000c9UL, 0x0000007dUL, - 0x000000faUL, 0x00000059UL, 0x00000047UL, 0x000000f0UL, 0x000000adUL, - 0x000000d4UL, 0x000000a2UL, 0x000000afUL, 0x0000009cUL, 0x000000a4UL, - 0x00000072UL, 0x000000c0UL, 0x000000b7UL, 0x000000fdUL, 0x00000093UL, - 0x00000026UL, 0x00000036UL, 0x0000003fUL, 0x000000f7UL, 0x000000ccUL, - 0x00000034UL, 0x000000a5UL, 0x000000e5UL, 0x000000f1UL, 0x00000071UL, - 0x000000d8UL, 0x00000031UL, 0x00000015UL, 0x00000004UL, 0x000000c7UL, - 0x00000023UL, 0x000000c3UL, 0x00000018UL, 0x00000096UL, 0x00000005UL, - 0x0000009aUL, 0x00000007UL, 0x00000012UL, 0x00000080UL, 0x000000e2UL, - 0x000000ebUL, 0x00000027UL, 0x000000b2UL, 0x00000075UL, 0x00000009UL, - 0x00000083UL, 0x0000002cUL, 0x0000001aUL, 0x0000001bUL, 0x0000006eUL, - 0x0000005aUL, 0x000000a0UL, 0x00000052UL, 0x0000003bUL, 0x000000d6UL, - 0x000000b3UL, 0x00000029UL, 0x000000e3UL, 0x0000002fUL, 0x00000084UL, - 0x00000053UL, 0x000000d1UL, 0x00000000UL, 0x000000edUL, 0x00000020UL, - 0x000000fcUL, 0x000000b1UL, 0x0000005bUL, 0x0000006aUL, 0x000000cbUL, - 0x000000beUL, 0x00000039UL, 0x0000004aUL, 0x0000004cUL, 0x00000058UL, - 0x000000cfUL, 0x000000d0UL, 0x000000efUL, 0x000000aaUL, 0x000000fbUL, - 0x00000043UL, 0x0000004dUL, 0x00000033UL, 0x00000085UL, 0x00000045UL, - 0x000000f9UL, 0x00000002UL, 0x0000007fUL, 0x00000050UL, 0x0000003cUL, - 0x0000009fUL, 0x000000a8UL, 0x00000051UL, 0x000000a3UL, 0x00000040UL, - 0x0000008fUL, 0x00000092UL, 0x0000009dUL, 0x00000038UL, 0x000000f5UL, - 0x000000bcUL, 0x000000b6UL, 0x000000daUL, 0x00000021UL, 0x00000010UL, - 0x000000ffUL, 0x000000f3UL, 0x000000d2UL, 0x000000cdUL, 0x0000000cUL, - 0x00000013UL, 0x000000ecUL, 0x0000005fUL, 0x00000097UL, 0x00000044UL, - 0x00000017UL, 0x000000c4UL, 0x000000a7UL, 0x0000007eUL, 0x0000003dUL, - 0x00000064UL, 0x0000005dUL, 0x00000019UL, 0x00000073UL, 0x00000060UL, - 0x00000081UL, 0x0000004fUL, 0x000000dcUL, 0x00000022UL, 0x0000002aUL, - 0x00000090UL, 0x00000088UL, 0x00000046UL, 0x000000eeUL, 0x000000b8UL, - 0x00000014UL, 0x000000deUL, 0x0000005eUL, 0x0000000bUL, 0x000000dbUL, - 0x000000e0UL, 0x00000032UL, 0x0000003aUL, 0x0000000aUL, 0x00000049UL, - 0x00000006UL, 0x00000024UL, 0x0000005cUL, 0x000000c2UL, 0x000000d3UL, - 0x000000acUL, 0x00000062UL, 0x00000091UL, 0x00000095UL, 0x000000e4UL, - 0x00000079UL, 0x000000e7UL, 0x000000c8UL, 0x00000037UL, 0x0000006dUL, - 0x0000008dUL, 0x000000d5UL, 0x0000004eUL, 0x000000a9UL, 0x0000006cUL, - 0x00000056UL, 0x000000f4UL, 0x000000eaUL, 0x00000065UL, 0x0000007aUL, - 0x000000aeUL, 0x00000008UL, 0x000000baUL, 0x00000078UL, 0x00000025UL, - 0x0000002eUL, 0x0000001cUL, 0x000000a6UL, 0x000000b4UL, 0x000000c6UL, - 0x000000e8UL, 0x000000ddUL, 0x00000074UL, 0x0000001fUL, 0x0000004bUL, - 0x000000bdUL, 0x0000008bUL, 0x0000008aUL, 0x00000070UL, 0x0000003eUL, - 0x000000b5UL, 0x00000066UL, 0x00000048UL, 0x00000003UL, 0x000000f6UL, - 0x0000000eUL, 0x00000061UL, 0x00000035UL, 0x00000057UL, 0x000000b9UL, - 0x00000086UL, 0x000000c1UL, 0x0000001dUL, 0x0000009eUL, 0x000000e1UL, - 0x000000f8UL, 0x00000098UL, 0x00000011UL, 0x00000069UL, 0x000000d9UL, - 0x0000008eUL, 0x00000094UL, 0x0000009bUL, 0x0000001eUL, 0x00000087UL, - 0x000000e9UL, 0x000000ceUL, 0x00000055UL, 0x00000028UL, 0x000000dfUL, - 0x0000008cUL, 0x000000a1UL, 0x00000089UL, 0x0000000dUL, 0x000000bfUL, - 0x000000e6UL, 0x00000042UL, 0x00000068UL, 0x00000041UL, 0x00000099UL, - 0x0000002dUL, 0x0000000fUL, 0x000000b0UL, 0x00000054UL, 0x000000bbUL, - 0x00000016UL}, -{0x00006300UL, 0x00007c00UL, 0x00007700UL, 0x00007b00UL, 0x0000f200UL, - 0x00006b00UL, 0x00006f00UL, 0x0000c500UL, 0x00003000UL, 0x00000100UL, - 0x00006700UL, 0x00002b00UL, 0x0000fe00UL, 0x0000d700UL, 0x0000ab00UL, - 0x00007600UL, 0x0000ca00UL, 0x00008200UL, 0x0000c900UL, 0x00007d00UL, - 0x0000fa00UL, 0x00005900UL, 0x00004700UL, 0x0000f000UL, 0x0000ad00UL, - 0x0000d400UL, 0x0000a200UL, 0x0000af00UL, 0x00009c00UL, 0x0000a400UL, - 0x00007200UL, 0x0000c000UL, 0x0000b700UL, 0x0000fd00UL, 0x00009300UL, - 0x00002600UL, 0x00003600UL, 0x00003f00UL, 0x0000f700UL, 0x0000cc00UL, - 0x00003400UL, 0x0000a500UL, 0x0000e500UL, 0x0000f100UL, 0x00007100UL, - 0x0000d800UL, 0x00003100UL, 0x00001500UL, 0x00000400UL, 0x0000c700UL, - 0x00002300UL, 0x0000c300UL, 0x00001800UL, 0x00009600UL, 0x00000500UL, - 0x00009a00UL, 0x00000700UL, 0x00001200UL, 0x00008000UL, 0x0000e200UL, - 0x0000eb00UL, 0x00002700UL, 0x0000b200UL, 0x00007500UL, 0x00000900UL, - 0x00008300UL, 0x00002c00UL, 0x00001a00UL, 0x00001b00UL, 0x00006e00UL, - 0x00005a00UL, 0x0000a000UL, 0x00005200UL, 0x00003b00UL, 0x0000d600UL, - 0x0000b300UL, 0x00002900UL, 0x0000e300UL, 0x00002f00UL, 0x00008400UL, - 0x00005300UL, 0x0000d100UL, 0x00000000UL, 0x0000ed00UL, 0x00002000UL, - 0x0000fc00UL, 0x0000b100UL, 0x00005b00UL, 0x00006a00UL, 0x0000cb00UL, - 0x0000be00UL, 0x00003900UL, 0x00004a00UL, 0x00004c00UL, 0x00005800UL, - 0x0000cf00UL, 0x0000d000UL, 0x0000ef00UL, 0x0000aa00UL, 0x0000fb00UL, - 0x00004300UL, 0x00004d00UL, 0x00003300UL, 0x00008500UL, 0x00004500UL, - 0x0000f900UL, 0x00000200UL, 0x00007f00UL, 0x00005000UL, 0x00003c00UL, - 0x00009f00UL, 0x0000a800UL, 0x00005100UL, 0x0000a300UL, 0x00004000UL, - 0x00008f00UL, 0x00009200UL, 0x00009d00UL, 0x00003800UL, 0x0000f500UL, - 0x0000bc00UL, 0x0000b600UL, 0x0000da00UL, 0x00002100UL, 0x00001000UL, - 0x0000ff00UL, 0x0000f300UL, 0x0000d200UL, 0x0000cd00UL, 0x00000c00UL, - 0x00001300UL, 0x0000ec00UL, 0x00005f00UL, 0x00009700UL, 0x00004400UL, - 0x00001700UL, 0x0000c400UL, 0x0000a700UL, 0x00007e00UL, 0x00003d00UL, - 0x00006400UL, 0x00005d00UL, 0x00001900UL, 0x00007300UL, 0x00006000UL, - 0x00008100UL, 0x00004f00UL, 0x0000dc00UL, 0x00002200UL, 0x00002a00UL, - 0x00009000UL, 0x00008800UL, 0x00004600UL, 0x0000ee00UL, 0x0000b800UL, - 0x00001400UL, 0x0000de00UL, 0x00005e00UL, 0x00000b00UL, 0x0000db00UL, - 0x0000e000UL, 0x00003200UL, 0x00003a00UL, 0x00000a00UL, 0x00004900UL, - 0x00000600UL, 0x00002400UL, 0x00005c00UL, 0x0000c200UL, 0x0000d300UL, - 0x0000ac00UL, 0x00006200UL, 0x00009100UL, 0x00009500UL, 0x0000e400UL, - 0x00007900UL, 0x0000e700UL, 0x0000c800UL, 0x00003700UL, 0x00006d00UL, - 0x00008d00UL, 0x0000d500UL, 0x00004e00UL, 0x0000a900UL, 0x00006c00UL, - 0x00005600UL, 0x0000f400UL, 0x0000ea00UL, 0x00006500UL, 0x00007a00UL, - 0x0000ae00UL, 0x00000800UL, 0x0000ba00UL, 0x00007800UL, 0x00002500UL, - 0x00002e00UL, 0x00001c00UL, 0x0000a600UL, 0x0000b400UL, 0x0000c600UL, - 0x0000e800UL, 0x0000dd00UL, 0x00007400UL, 0x00001f00UL, 0x00004b00UL, - 0x0000bd00UL, 0x00008b00UL, 0x00008a00UL, 0x00007000UL, 0x00003e00UL, - 0x0000b500UL, 0x00006600UL, 0x00004800UL, 0x00000300UL, 0x0000f600UL, - 0x00000e00UL, 0x00006100UL, 0x00003500UL, 0x00005700UL, 0x0000b900UL, - 0x00008600UL, 0x0000c100UL, 0x00001d00UL, 0x00009e00UL, 0x0000e100UL, - 0x0000f800UL, 0x00009800UL, 0x00001100UL, 0x00006900UL, 0x0000d900UL, - 0x00008e00UL, 0x00009400UL, 0x00009b00UL, 0x00001e00UL, 0x00008700UL, - 0x0000e900UL, 0x0000ce00UL, 0x00005500UL, 0x00002800UL, 0x0000df00UL, - 0x00008c00UL, 0x0000a100UL, 0x00008900UL, 0x00000d00UL, 0x0000bf00UL, - 0x0000e600UL, 0x00004200UL, 0x00006800UL, 0x00004100UL, 0x00009900UL, - 0x00002d00UL, 0x00000f00UL, 0x0000b000UL, 0x00005400UL, 0x0000bb00UL, - 0x00001600UL}, -{0x00630000UL, 0x007c0000UL, 0x00770000UL, 0x007b0000UL, 0x00f20000UL, - 0x006b0000UL, 0x006f0000UL, 0x00c50000UL, 0x00300000UL, 0x00010000UL, - 0x00670000UL, 0x002b0000UL, 0x00fe0000UL, 0x00d70000UL, 0x00ab0000UL, - 0x00760000UL, 0x00ca0000UL, 0x00820000UL, 0x00c90000UL, 0x007d0000UL, - 0x00fa0000UL, 0x00590000UL, 0x00470000UL, 0x00f00000UL, 0x00ad0000UL, - 0x00d40000UL, 0x00a20000UL, 0x00af0000UL, 0x009c0000UL, 0x00a40000UL, - 0x00720000UL, 0x00c00000UL, 0x00b70000UL, 0x00fd0000UL, 0x00930000UL, - 0x00260000UL, 0x00360000UL, 0x003f0000UL, 0x00f70000UL, 0x00cc0000UL, - 0x00340000UL, 0x00a50000UL, 0x00e50000UL, 0x00f10000UL, 0x00710000UL, - 0x00d80000UL, 0x00310000UL, 0x00150000UL, 0x00040000UL, 0x00c70000UL, - 0x00230000UL, 0x00c30000UL, 0x00180000UL, 0x00960000UL, 0x00050000UL, - 0x009a0000UL, 0x00070000UL, 0x00120000UL, 0x00800000UL, 0x00e20000UL, - 0x00eb0000UL, 0x00270000UL, 0x00b20000UL, 0x00750000UL, 0x00090000UL, - 0x00830000UL, 0x002c0000UL, 0x001a0000UL, 0x001b0000UL, 0x006e0000UL, - 0x005a0000UL, 0x00a00000UL, 0x00520000UL, 0x003b0000UL, 0x00d60000UL, - 0x00b30000UL, 0x00290000UL, 0x00e30000UL, 0x002f0000UL, 0x00840000UL, - 0x00530000UL, 0x00d10000UL, 0x00000000UL, 0x00ed0000UL, 0x00200000UL, - 0x00fc0000UL, 0x00b10000UL, 0x005b0000UL, 0x006a0000UL, 0x00cb0000UL, - 0x00be0000UL, 0x00390000UL, 0x004a0000UL, 0x004c0000UL, 0x00580000UL, - 0x00cf0000UL, 0x00d00000UL, 0x00ef0000UL, 0x00aa0000UL, 0x00fb0000UL, - 0x00430000UL, 0x004d0000UL, 0x00330000UL, 0x00850000UL, 0x00450000UL, - 0x00f90000UL, 0x00020000UL, 0x007f0000UL, 0x00500000UL, 0x003c0000UL, - 0x009f0000UL, 0x00a80000UL, 0x00510000UL, 0x00a30000UL, 0x00400000UL, - 0x008f0000UL, 0x00920000UL, 0x009d0000UL, 0x00380000UL, 0x00f50000UL, - 0x00bc0000UL, 0x00b60000UL, 0x00da0000UL, 0x00210000UL, 0x00100000UL, - 0x00ff0000UL, 0x00f30000UL, 0x00d20000UL, 0x00cd0000UL, 0x000c0000UL, - 0x00130000UL, 0x00ec0000UL, 0x005f0000UL, 0x00970000UL, 0x00440000UL, - 0x00170000UL, 0x00c40000UL, 0x00a70000UL, 0x007e0000UL, 0x003d0000UL, - 0x00640000UL, 0x005d0000UL, 0x00190000UL, 0x00730000UL, 0x00600000UL, - 0x00810000UL, 0x004f0000UL, 0x00dc0000UL, 0x00220000UL, 0x002a0000UL, - 0x00900000UL, 0x00880000UL, 0x00460000UL, 0x00ee0000UL, 0x00b80000UL, - 0x00140000UL, 0x00de0000UL, 0x005e0000UL, 0x000b0000UL, 0x00db0000UL, - 0x00e00000UL, 0x00320000UL, 0x003a0000UL, 0x000a0000UL, 0x00490000UL, - 0x00060000UL, 0x00240000UL, 0x005c0000UL, 0x00c20000UL, 0x00d30000UL, - 0x00ac0000UL, 0x00620000UL, 0x00910000UL, 0x00950000UL, 0x00e40000UL, - 0x00790000UL, 0x00e70000UL, 0x00c80000UL, 0x00370000UL, 0x006d0000UL, - 0x008d0000UL, 0x00d50000UL, 0x004e0000UL, 0x00a90000UL, 0x006c0000UL, - 0x00560000UL, 0x00f40000UL, 0x00ea0000UL, 0x00650000UL, 0x007a0000UL, - 0x00ae0000UL, 0x00080000UL, 0x00ba0000UL, 0x00780000UL, 0x00250000UL, - 0x002e0000UL, 0x001c0000UL, 0x00a60000UL, 0x00b40000UL, 0x00c60000UL, - 0x00e80000UL, 0x00dd0000UL, 0x00740000UL, 0x001f0000UL, 0x004b0000UL, - 0x00bd0000UL, 0x008b0000UL, 0x008a0000UL, 0x00700000UL, 0x003e0000UL, - 0x00b50000UL, 0x00660000UL, 0x00480000UL, 0x00030000UL, 0x00f60000UL, - 0x000e0000UL, 0x00610000UL, 0x00350000UL, 0x00570000UL, 0x00b90000UL, - 0x00860000UL, 0x00c10000UL, 0x001d0000UL, 0x009e0000UL, 0x00e10000UL, - 0x00f80000UL, 0x00980000UL, 0x00110000UL, 0x00690000UL, 0x00d90000UL, - 0x008e0000UL, 0x00940000UL, 0x009b0000UL, 0x001e0000UL, 0x00870000UL, - 0x00e90000UL, 0x00ce0000UL, 0x00550000UL, 0x00280000UL, 0x00df0000UL, - 0x008c0000UL, 0x00a10000UL, 0x00890000UL, 0x000d0000UL, 0x00bf0000UL, - 0x00e60000UL, 0x00420000UL, 0x00680000UL, 0x00410000UL, 0x00990000UL, - 0x002d0000UL, 0x000f0000UL, 0x00b00000UL, 0x00540000UL, 0x00bb0000UL, - 0x00160000UL}, -{0x63000000UL, 0x7c000000UL, 0x77000000UL, 0x7b000000UL, 0xf2000000UL, - 0x6b000000UL, 0x6f000000UL, 0xc5000000UL, 0x30000000UL, 0x01000000UL, - 0x67000000UL, 0x2b000000UL, 0xfe000000UL, 0xd7000000UL, 0xab000000UL, - 0x76000000UL, 0xca000000UL, 0x82000000UL, 0xc9000000UL, 0x7d000000UL, - 0xfa000000UL, 0x59000000UL, 0x47000000UL, 0xf0000000UL, 0xad000000UL, - 0xd4000000UL, 0xa2000000UL, 0xaf000000UL, 0x9c000000UL, 0xa4000000UL, - 0x72000000UL, 0xc0000000UL, 0xb7000000UL, 0xfd000000UL, 0x93000000UL, - 0x26000000UL, 0x36000000UL, 0x3f000000UL, 0xf7000000UL, 0xcc000000UL, - 0x34000000UL, 0xa5000000UL, 0xe5000000UL, 0xf1000000UL, 0x71000000UL, - 0xd8000000UL, 0x31000000UL, 0x15000000UL, 0x04000000UL, 0xc7000000UL, - 0x23000000UL, 0xc3000000UL, 0x18000000UL, 0x96000000UL, 0x05000000UL, - 0x9a000000UL, 0x07000000UL, 0x12000000UL, 0x80000000UL, 0xe2000000UL, - 0xeb000000UL, 0x27000000UL, 0xb2000000UL, 0x75000000UL, 0x09000000UL, - 0x83000000UL, 0x2c000000UL, 0x1a000000UL, 0x1b000000UL, 0x6e000000UL, - 0x5a000000UL, 0xa0000000UL, 0x52000000UL, 0x3b000000UL, 0xd6000000UL, - 0xb3000000UL, 0x29000000UL, 0xe3000000UL, 0x2f000000UL, 0x84000000UL, - 0x53000000UL, 0xd1000000UL, 0x00000000UL, 0xed000000UL, 0x20000000UL, - 0xfc000000UL, 0xb1000000UL, 0x5b000000UL, 0x6a000000UL, 0xcb000000UL, - 0xbe000000UL, 0x39000000UL, 0x4a000000UL, 0x4c000000UL, 0x58000000UL, - 0xcf000000UL, 0xd0000000UL, 0xef000000UL, 0xaa000000UL, 0xfb000000UL, - 0x43000000UL, 0x4d000000UL, 0x33000000UL, 0x85000000UL, 0x45000000UL, - 0xf9000000UL, 0x02000000UL, 0x7f000000UL, 0x50000000UL, 0x3c000000UL, - 0x9f000000UL, 0xa8000000UL, 0x51000000UL, 0xa3000000UL, 0x40000000UL, - 0x8f000000UL, 0x92000000UL, 0x9d000000UL, 0x38000000UL, 0xf5000000UL, - 0xbc000000UL, 0xb6000000UL, 0xda000000UL, 0x21000000UL, 0x10000000UL, - 0xff000000UL, 0xf3000000UL, 0xd2000000UL, 0xcd000000UL, 0x0c000000UL, - 0x13000000UL, 0xec000000UL, 0x5f000000UL, 0x97000000UL, 0x44000000UL, - 0x17000000UL, 0xc4000000UL, 0xa7000000UL, 0x7e000000UL, 0x3d000000UL, - 0x64000000UL, 0x5d000000UL, 0x19000000UL, 0x73000000UL, 0x60000000UL, - 0x81000000UL, 0x4f000000UL, 0xdc000000UL, 0x22000000UL, 0x2a000000UL, - 0x90000000UL, 0x88000000UL, 0x46000000UL, 0xee000000UL, 0xb8000000UL, - 0x14000000UL, 0xde000000UL, 0x5e000000UL, 0x0b000000UL, 0xdb000000UL, - 0xe0000000UL, 0x32000000UL, 0x3a000000UL, 0x0a000000UL, 0x49000000UL, - 0x06000000UL, 0x24000000UL, 0x5c000000UL, 0xc2000000UL, 0xd3000000UL, - 0xac000000UL, 0x62000000UL, 0x91000000UL, 0x95000000UL, 0xe4000000UL, - 0x79000000UL, 0xe7000000UL, 0xc8000000UL, 0x37000000UL, 0x6d000000UL, - 0x8d000000UL, 0xd5000000UL, 0x4e000000UL, 0xa9000000UL, 0x6c000000UL, - 0x56000000UL, 0xf4000000UL, 0xea000000UL, 0x65000000UL, 0x7a000000UL, - 0xae000000UL, 0x08000000UL, 0xba000000UL, 0x78000000UL, 0x25000000UL, - 0x2e000000UL, 0x1c000000UL, 0xa6000000UL, 0xb4000000UL, 0xc6000000UL, - 0xe8000000UL, 0xdd000000UL, 0x74000000UL, 0x1f000000UL, 0x4b000000UL, - 0xbd000000UL, 0x8b000000UL, 0x8a000000UL, 0x70000000UL, 0x3e000000UL, - 0xb5000000UL, 0x66000000UL, 0x48000000UL, 0x03000000UL, 0xf6000000UL, - 0x0e000000UL, 0x61000000UL, 0x35000000UL, 0x57000000UL, 0xb9000000UL, - 0x86000000UL, 0xc1000000UL, 0x1d000000UL, 0x9e000000UL, 0xe1000000UL, - 0xf8000000UL, 0x98000000UL, 0x11000000UL, 0x69000000UL, 0xd9000000UL, - 0x8e000000UL, 0x94000000UL, 0x9b000000UL, 0x1e000000UL, 0x87000000UL, - 0xe9000000UL, 0xce000000UL, 0x55000000UL, 0x28000000UL, 0xdf000000UL, - 0x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, - 0xe6000000UL, 0x42000000UL, 0x68000000UL, 0x41000000UL, 0x99000000UL, - 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, - 0x16000000UL} - }; - -static const unsigned long il_tab[4][256] = { -{0x00000052UL, 0x00000009UL, 0x0000006aUL, 0x000000d5UL, 0x00000030UL, - 0x00000036UL, 0x000000a5UL, 0x00000038UL, 0x000000bfUL, 0x00000040UL, - 0x000000a3UL, 0x0000009eUL, 0x00000081UL, 0x000000f3UL, 0x000000d7UL, - 0x000000fbUL, 0x0000007cUL, 0x000000e3UL, 0x00000039UL, 0x00000082UL, - 0x0000009bUL, 0x0000002fUL, 0x000000ffUL, 0x00000087UL, 0x00000034UL, - 0x0000008eUL, 0x00000043UL, 0x00000044UL, 0x000000c4UL, 0x000000deUL, - 0x000000e9UL, 0x000000cbUL, 0x00000054UL, 0x0000007bUL, 0x00000094UL, - 0x00000032UL, 0x000000a6UL, 0x000000c2UL, 0x00000023UL, 0x0000003dUL, - 0x000000eeUL, 0x0000004cUL, 0x00000095UL, 0x0000000bUL, 0x00000042UL, - 0x000000faUL, 0x000000c3UL, 0x0000004eUL, 0x00000008UL, 0x0000002eUL, - 0x000000a1UL, 0x00000066UL, 0x00000028UL, 0x000000d9UL, 0x00000024UL, - 0x000000b2UL, 0x00000076UL, 0x0000005bUL, 0x000000a2UL, 0x00000049UL, - 0x0000006dUL, 0x0000008bUL, 0x000000d1UL, 0x00000025UL, 0x00000072UL, - 0x000000f8UL, 0x000000f6UL, 0x00000064UL, 0x00000086UL, 0x00000068UL, - 0x00000098UL, 0x00000016UL, 0x000000d4UL, 0x000000a4UL, 0x0000005cUL, - 0x000000ccUL, 0x0000005dUL, 0x00000065UL, 0x000000b6UL, 0x00000092UL, - 0x0000006cUL, 0x00000070UL, 0x00000048UL, 0x00000050UL, 0x000000fdUL, - 0x000000edUL, 0x000000b9UL, 0x000000daUL, 0x0000005eUL, 0x00000015UL, - 0x00000046UL, 0x00000057UL, 0x000000a7UL, 0x0000008dUL, 0x0000009dUL, - 0x00000084UL, 0x00000090UL, 0x000000d8UL, 0x000000abUL, 0x00000000UL, - 0x0000008cUL, 0x000000bcUL, 0x000000d3UL, 0x0000000aUL, 0x000000f7UL, - 0x000000e4UL, 0x00000058UL, 0x00000005UL, 0x000000b8UL, 0x000000b3UL, - 0x00000045UL, 0x00000006UL, 0x000000d0UL, 0x0000002cUL, 0x0000001eUL, - 0x0000008fUL, 0x000000caUL, 0x0000003fUL, 0x0000000fUL, 0x00000002UL, - 0x000000c1UL, 0x000000afUL, 0x000000bdUL, 0x00000003UL, 0x00000001UL, - 0x00000013UL, 0x0000008aUL, 0x0000006bUL, 0x0000003aUL, 0x00000091UL, - 0x00000011UL, 0x00000041UL, 0x0000004fUL, 0x00000067UL, 0x000000dcUL, - 0x000000eaUL, 0x00000097UL, 0x000000f2UL, 0x000000cfUL, 0x000000ceUL, - 0x000000f0UL, 0x000000b4UL, 0x000000e6UL, 0x00000073UL, 0x00000096UL, - 0x000000acUL, 0x00000074UL, 0x00000022UL, 0x000000e7UL, 0x000000adUL, - 0x00000035UL, 0x00000085UL, 0x000000e2UL, 0x000000f9UL, 0x00000037UL, - 0x000000e8UL, 0x0000001cUL, 0x00000075UL, 0x000000dfUL, 0x0000006eUL, - 0x00000047UL, 0x000000f1UL, 0x0000001aUL, 0x00000071UL, 0x0000001dUL, - 0x00000029UL, 0x000000c5UL, 0x00000089UL, 0x0000006fUL, 0x000000b7UL, - 0x00000062UL, 0x0000000eUL, 0x000000aaUL, 0x00000018UL, 0x000000beUL, - 0x0000001bUL, 0x000000fcUL, 0x00000056UL, 0x0000003eUL, 0x0000004bUL, - 0x000000c6UL, 0x000000d2UL, 0x00000079UL, 0x00000020UL, 0x0000009aUL, - 0x000000dbUL, 0x000000c0UL, 0x000000feUL, 0x00000078UL, 0x000000cdUL, - 0x0000005aUL, 0x000000f4UL, 0x0000001fUL, 0x000000ddUL, 0x000000a8UL, - 0x00000033UL, 0x00000088UL, 0x00000007UL, 0x000000c7UL, 0x00000031UL, - 0x000000b1UL, 0x00000012UL, 0x00000010UL, 0x00000059UL, 0x00000027UL, - 0x00000080UL, 0x000000ecUL, 0x0000005fUL, 0x00000060UL, 0x00000051UL, - 0x0000007fUL, 0x000000a9UL, 0x00000019UL, 0x000000b5UL, 0x0000004aUL, - 0x0000000dUL, 0x0000002dUL, 0x000000e5UL, 0x0000007aUL, 0x0000009fUL, - 0x00000093UL, 0x000000c9UL, 0x0000009cUL, 0x000000efUL, 0x000000a0UL, - 0x000000e0UL, 0x0000003bUL, 0x0000004dUL, 0x000000aeUL, 0x0000002aUL, - 0x000000f5UL, 0x000000b0UL, 0x000000c8UL, 0x000000ebUL, 0x000000bbUL, - 0x0000003cUL, 0x00000083UL, 0x00000053UL, 0x00000099UL, 0x00000061UL, - 0x00000017UL, 0x0000002bUL, 0x00000004UL, 0x0000007eUL, 0x000000baUL, - 0x00000077UL, 0x000000d6UL, 0x00000026UL, 0x000000e1UL, 0x00000069UL, - 0x00000014UL, 0x00000063UL, 0x00000055UL, 0x00000021UL, 0x0000000cUL, - 0x0000007dUL}, -{0x00005200UL, 0x00000900UL, 0x00006a00UL, 0x0000d500UL, 0x00003000UL, - 0x00003600UL, 0x0000a500UL, 0x00003800UL, 0x0000bf00UL, 0x00004000UL, - 0x0000a300UL, 0x00009e00UL, 0x00008100UL, 0x0000f300UL, 0x0000d700UL, - 0x0000fb00UL, 0x00007c00UL, 0x0000e300UL, 0x00003900UL, 0x00008200UL, - 0x00009b00UL, 0x00002f00UL, 0x0000ff00UL, 0x00008700UL, 0x00003400UL, - 0x00008e00UL, 0x00004300UL, 0x00004400UL, 0x0000c400UL, 0x0000de00UL, - 0x0000e900UL, 0x0000cb00UL, 0x00005400UL, 0x00007b00UL, 0x00009400UL, - 0x00003200UL, 0x0000a600UL, 0x0000c200UL, 0x00002300UL, 0x00003d00UL, - 0x0000ee00UL, 0x00004c00UL, 0x00009500UL, 0x00000b00UL, 0x00004200UL, - 0x0000fa00UL, 0x0000c300UL, 0x00004e00UL, 0x00000800UL, 0x00002e00UL, - 0x0000a100UL, 0x00006600UL, 0x00002800UL, 0x0000d900UL, 0x00002400UL, - 0x0000b200UL, 0x00007600UL, 0x00005b00UL, 0x0000a200UL, 0x00004900UL, - 0x00006d00UL, 0x00008b00UL, 0x0000d100UL, 0x00002500UL, 0x00007200UL, - 0x0000f800UL, 0x0000f600UL, 0x00006400UL, 0x00008600UL, 0x00006800UL, - 0x00009800UL, 0x00001600UL, 0x0000d400UL, 0x0000a400UL, 0x00005c00UL, - 0x0000cc00UL, 0x00005d00UL, 0x00006500UL, 0x0000b600UL, 0x00009200UL, - 0x00006c00UL, 0x00007000UL, 0x00004800UL, 0x00005000UL, 0x0000fd00UL, - 0x0000ed00UL, 0x0000b900UL, 0x0000da00UL, 0x00005e00UL, 0x00001500UL, - 0x00004600UL, 0x00005700UL, 0x0000a700UL, 0x00008d00UL, 0x00009d00UL, - 0x00008400UL, 0x00009000UL, 0x0000d800UL, 0x0000ab00UL, 0x00000000UL, - 0x00008c00UL, 0x0000bc00UL, 0x0000d300UL, 0x00000a00UL, 0x0000f700UL, - 0x0000e400UL, 0x00005800UL, 0x00000500UL, 0x0000b800UL, 0x0000b300UL, - 0x00004500UL, 0x00000600UL, 0x0000d000UL, 0x00002c00UL, 0x00001e00UL, - 0x00008f00UL, 0x0000ca00UL, 0x00003f00UL, 0x00000f00UL, 0x00000200UL, - 0x0000c100UL, 0x0000af00UL, 0x0000bd00UL, 0x00000300UL, 0x00000100UL, - 0x00001300UL, 0x00008a00UL, 0x00006b00UL, 0x00003a00UL, 0x00009100UL, - 0x00001100UL, 0x00004100UL, 0x00004f00UL, 0x00006700UL, 0x0000dc00UL, - 0x0000ea00UL, 0x00009700UL, 0x0000f200UL, 0x0000cf00UL, 0x0000ce00UL, - 0x0000f000UL, 0x0000b400UL, 0x0000e600UL, 0x00007300UL, 0x00009600UL, - 0x0000ac00UL, 0x00007400UL, 0x00002200UL, 0x0000e700UL, 0x0000ad00UL, - 0x00003500UL, 0x00008500UL, 0x0000e200UL, 0x0000f900UL, 0x00003700UL, - 0x0000e800UL, 0x00001c00UL, 0x00007500UL, 0x0000df00UL, 0x00006e00UL, - 0x00004700UL, 0x0000f100UL, 0x00001a00UL, 0x00007100UL, 0x00001d00UL, - 0x00002900UL, 0x0000c500UL, 0x00008900UL, 0x00006f00UL, 0x0000b700UL, - 0x00006200UL, 0x00000e00UL, 0x0000aa00UL, 0x00001800UL, 0x0000be00UL, - 0x00001b00UL, 0x0000fc00UL, 0x00005600UL, 0x00003e00UL, 0x00004b00UL, - 0x0000c600UL, 0x0000d200UL, 0x00007900UL, 0x00002000UL, 0x00009a00UL, - 0x0000db00UL, 0x0000c000UL, 0x0000fe00UL, 0x00007800UL, 0x0000cd00UL, - 0x00005a00UL, 0x0000f400UL, 0x00001f00UL, 0x0000dd00UL, 0x0000a800UL, - 0x00003300UL, 0x00008800UL, 0x00000700UL, 0x0000c700UL, 0x00003100UL, - 0x0000b100UL, 0x00001200UL, 0x00001000UL, 0x00005900UL, 0x00002700UL, - 0x00008000UL, 0x0000ec00UL, 0x00005f00UL, 0x00006000UL, 0x00005100UL, - 0x00007f00UL, 0x0000a900UL, 0x00001900UL, 0x0000b500UL, 0x00004a00UL, - 0x00000d00UL, 0x00002d00UL, 0x0000e500UL, 0x00007a00UL, 0x00009f00UL, - 0x00009300UL, 0x0000c900UL, 0x00009c00UL, 0x0000ef00UL, 0x0000a000UL, - 0x0000e000UL, 0x00003b00UL, 0x00004d00UL, 0x0000ae00UL, 0x00002a00UL, - 0x0000f500UL, 0x0000b000UL, 0x0000c800UL, 0x0000eb00UL, 0x0000bb00UL, - 0x00003c00UL, 0x00008300UL, 0x00005300UL, 0x00009900UL, 0x00006100UL, - 0x00001700UL, 0x00002b00UL, 0x00000400UL, 0x00007e00UL, 0x0000ba00UL, - 0x00007700UL, 0x0000d600UL, 0x00002600UL, 0x0000e100UL, 0x00006900UL, - 0x00001400UL, 0x00006300UL, 0x00005500UL, 0x00002100UL, 0x00000c00UL, - 0x00007d00UL}, -{0x00520000UL, 0x00090000UL, 0x006a0000UL, 0x00d50000UL, 0x00300000UL, - 0x00360000UL, 0x00a50000UL, 0x00380000UL, 0x00bf0000UL, 0x00400000UL, - 0x00a30000UL, 0x009e0000UL, 0x00810000UL, 0x00f30000UL, 0x00d70000UL, - 0x00fb0000UL, 0x007c0000UL, 0x00e30000UL, 0x00390000UL, 0x00820000UL, - 0x009b0000UL, 0x002f0000UL, 0x00ff0000UL, 0x00870000UL, 0x00340000UL, - 0x008e0000UL, 0x00430000UL, 0x00440000UL, 0x00c40000UL, 0x00de0000UL, - 0x00e90000UL, 0x00cb0000UL, 0x00540000UL, 0x007b0000UL, 0x00940000UL, - 0x00320000UL, 0x00a60000UL, 0x00c20000UL, 0x00230000UL, 0x003d0000UL, - 0x00ee0000UL, 0x004c0000UL, 0x00950000UL, 0x000b0000UL, 0x00420000UL, - 0x00fa0000UL, 0x00c30000UL, 0x004e0000UL, 0x00080000UL, 0x002e0000UL, - 0x00a10000UL, 0x00660000UL, 0x00280000UL, 0x00d90000UL, 0x00240000UL, - 0x00b20000UL, 0x00760000UL, 0x005b0000UL, 0x00a20000UL, 0x00490000UL, - 0x006d0000UL, 0x008b0000UL, 0x00d10000UL, 0x00250000UL, 0x00720000UL, - 0x00f80000UL, 0x00f60000UL, 0x00640000UL, 0x00860000UL, 0x00680000UL, - 0x00980000UL, 0x00160000UL, 0x00d40000UL, 0x00a40000UL, 0x005c0000UL, - 0x00cc0000UL, 0x005d0000UL, 0x00650000UL, 0x00b60000UL, 0x00920000UL, - 0x006c0000UL, 0x00700000UL, 0x00480000UL, 0x00500000UL, 0x00fd0000UL, - 0x00ed0000UL, 0x00b90000UL, 0x00da0000UL, 0x005e0000UL, 0x00150000UL, - 0x00460000UL, 0x00570000UL, 0x00a70000UL, 0x008d0000UL, 0x009d0000UL, - 0x00840000UL, 0x00900000UL, 0x00d80000UL, 0x00ab0000UL, 0x00000000UL, - 0x008c0000UL, 0x00bc0000UL, 0x00d30000UL, 0x000a0000UL, 0x00f70000UL, - 0x00e40000UL, 0x00580000UL, 0x00050000UL, 0x00b80000UL, 0x00b30000UL, - 0x00450000UL, 0x00060000UL, 0x00d00000UL, 0x002c0000UL, 0x001e0000UL, - 0x008f0000UL, 0x00ca0000UL, 0x003f0000UL, 0x000f0000UL, 0x00020000UL, - 0x00c10000UL, 0x00af0000UL, 0x00bd0000UL, 0x00030000UL, 0x00010000UL, - 0x00130000UL, 0x008a0000UL, 0x006b0000UL, 0x003a0000UL, 0x00910000UL, - 0x00110000UL, 0x00410000UL, 0x004f0000UL, 0x00670000UL, 0x00dc0000UL, - 0x00ea0000UL, 0x00970000UL, 0x00f20000UL, 0x00cf0000UL, 0x00ce0000UL, - 0x00f00000UL, 0x00b40000UL, 0x00e60000UL, 0x00730000UL, 0x00960000UL, - 0x00ac0000UL, 0x00740000UL, 0x00220000UL, 0x00e70000UL, 0x00ad0000UL, - 0x00350000UL, 0x00850000UL, 0x00e20000UL, 0x00f90000UL, 0x00370000UL, - 0x00e80000UL, 0x001c0000UL, 0x00750000UL, 0x00df0000UL, 0x006e0000UL, - 0x00470000UL, 0x00f10000UL, 0x001a0000UL, 0x00710000UL, 0x001d0000UL, - 0x00290000UL, 0x00c50000UL, 0x00890000UL, 0x006f0000UL, 0x00b70000UL, - 0x00620000UL, 0x000e0000UL, 0x00aa0000UL, 0x00180000UL, 0x00be0000UL, - 0x001b0000UL, 0x00fc0000UL, 0x00560000UL, 0x003e0000UL, 0x004b0000UL, - 0x00c60000UL, 0x00d20000UL, 0x00790000UL, 0x00200000UL, 0x009a0000UL, - 0x00db0000UL, 0x00c00000UL, 0x00fe0000UL, 0x00780000UL, 0x00cd0000UL, - 0x005a0000UL, 0x00f40000UL, 0x001f0000UL, 0x00dd0000UL, 0x00a80000UL, - 0x00330000UL, 0x00880000UL, 0x00070000UL, 0x00c70000UL, 0x00310000UL, - 0x00b10000UL, 0x00120000UL, 0x00100000UL, 0x00590000UL, 0x00270000UL, - 0x00800000UL, 0x00ec0000UL, 0x005f0000UL, 0x00600000UL, 0x00510000UL, - 0x007f0000UL, 0x00a90000UL, 0x00190000UL, 0x00b50000UL, 0x004a0000UL, - 0x000d0000UL, 0x002d0000UL, 0x00e50000UL, 0x007a0000UL, 0x009f0000UL, - 0x00930000UL, 0x00c90000UL, 0x009c0000UL, 0x00ef0000UL, 0x00a00000UL, - 0x00e00000UL, 0x003b0000UL, 0x004d0000UL, 0x00ae0000UL, 0x002a0000UL, - 0x00f50000UL, 0x00b00000UL, 0x00c80000UL, 0x00eb0000UL, 0x00bb0000UL, - 0x003c0000UL, 0x00830000UL, 0x00530000UL, 0x00990000UL, 0x00610000UL, - 0x00170000UL, 0x002b0000UL, 0x00040000UL, 0x007e0000UL, 0x00ba0000UL, - 0x00770000UL, 0x00d60000UL, 0x00260000UL, 0x00e10000UL, 0x00690000UL, - 0x00140000UL, 0x00630000UL, 0x00550000UL, 0x00210000UL, 0x000c0000UL, - 0x007d0000UL}, -{0x52000000UL, 0x09000000UL, 0x6a000000UL, 0xd5000000UL, 0x30000000UL, - 0x36000000UL, 0xa5000000UL, 0x38000000UL, 0xbf000000UL, 0x40000000UL, - 0xa3000000UL, 0x9e000000UL, 0x81000000UL, 0xf3000000UL, 0xd7000000UL, - 0xfb000000UL, 0x7c000000UL, 0xe3000000UL, 0x39000000UL, 0x82000000UL, - 0x9b000000UL, 0x2f000000UL, 0xff000000UL, 0x87000000UL, 0x34000000UL, - 0x8e000000UL, 0x43000000UL, 0x44000000UL, 0xc4000000UL, 0xde000000UL, - 0xe9000000UL, 0xcb000000UL, 0x54000000UL, 0x7b000000UL, 0x94000000UL, - 0x32000000UL, 0xa6000000UL, 0xc2000000UL, 0x23000000UL, 0x3d000000UL, - 0xee000000UL, 0x4c000000UL, 0x95000000UL, 0x0b000000UL, 0x42000000UL, - 0xfa000000UL, 0xc3000000UL, 0x4e000000UL, 0x08000000UL, 0x2e000000UL, - 0xa1000000UL, 0x66000000UL, 0x28000000UL, 0xd9000000UL, 0x24000000UL, - 0xb2000000UL, 0x76000000UL, 0x5b000000UL, 0xa2000000UL, 0x49000000UL, - 0x6d000000UL, 0x8b000000UL, 0xd1000000UL, 0x25000000UL, 0x72000000UL, - 0xf8000000UL, 0xf6000000UL, 0x64000000UL, 0x86000000UL, 0x68000000UL, - 0x98000000UL, 0x16000000UL, 0xd4000000UL, 0xa4000000UL, 0x5c000000UL, - 0xcc000000UL, 0x5d000000UL, 0x65000000UL, 0xb6000000UL, 0x92000000UL, - 0x6c000000UL, 0x70000000UL, 0x48000000UL, 0x50000000UL, 0xfd000000UL, - 0xed000000UL, 0xb9000000UL, 0xda000000UL, 0x5e000000UL, 0x15000000UL, - 0x46000000UL, 0x57000000UL, 0xa7000000UL, 0x8d000000UL, 0x9d000000UL, - 0x84000000UL, 0x90000000UL, 0xd8000000UL, 0xab000000UL, 0x00000000UL, - 0x8c000000UL, 0xbc000000UL, 0xd3000000UL, 0x0a000000UL, 0xf7000000UL, - 0xe4000000UL, 0x58000000UL, 0x05000000UL, 0xb8000000UL, 0xb3000000UL, - 0x45000000UL, 0x06000000UL, 0xd0000000UL, 0x2c000000UL, 0x1e000000UL, - 0x8f000000UL, 0xca000000UL, 0x3f000000UL, 0x0f000000UL, 0x02000000UL, - 0xc1000000UL, 0xaf000000UL, 0xbd000000UL, 0x03000000UL, 0x01000000UL, - 0x13000000UL, 0x8a000000UL, 0x6b000000UL, 0x3a000000UL, 0x91000000UL, - 0x11000000UL, 0x41000000UL, 0x4f000000UL, 0x67000000UL, 0xdc000000UL, - 0xea000000UL, 0x97000000UL, 0xf2000000UL, 0xcf000000UL, 0xce000000UL, - 0xf0000000UL, 0xb4000000UL, 0xe6000000UL, 0x73000000UL, 0x96000000UL, - 0xac000000UL, 0x74000000UL, 0x22000000UL, 0xe7000000UL, 0xad000000UL, - 0x35000000UL, 0x85000000UL, 0xe2000000UL, 0xf9000000UL, 0x37000000UL, - 0xe8000000UL, 0x1c000000UL, 0x75000000UL, 0xdf000000UL, 0x6e000000UL, - 0x47000000UL, 0xf1000000UL, 0x1a000000UL, 0x71000000UL, 0x1d000000UL, - 0x29000000UL, 0xc5000000UL, 0x89000000UL, 0x6f000000UL, 0xb7000000UL, - 0x62000000UL, 0x0e000000UL, 0xaa000000UL, 0x18000000UL, 0xbe000000UL, - 0x1b000000UL, 0xfc000000UL, 0x56000000UL, 0x3e000000UL, 0x4b000000UL, - 0xc6000000UL, 0xd2000000UL, 0x79000000UL, 0x20000000UL, 0x9a000000UL, - 0xdb000000UL, 0xc0000000UL, 0xfe000000UL, 0x78000000UL, 0xcd000000UL, - 0x5a000000UL, 0xf4000000UL, 0x1f000000UL, 0xdd000000UL, 0xa8000000UL, - 0x33000000UL, 0x88000000UL, 0x07000000UL, 0xc7000000UL, 0x31000000UL, - 0xb1000000UL, 0x12000000UL, 0x10000000UL, 0x59000000UL, 0x27000000UL, - 0x80000000UL, 0xec000000UL, 0x5f000000UL, 0x60000000UL, 0x51000000UL, - 0x7f000000UL, 0xa9000000UL, 0x19000000UL, 0xb5000000UL, 0x4a000000UL, - 0x0d000000UL, 0x2d000000UL, 0xe5000000UL, 0x7a000000UL, 0x9f000000UL, - 0x93000000UL, 0xc9000000UL, 0x9c000000UL, 0xef000000UL, 0xa0000000UL, - 0xe0000000UL, 0x3b000000UL, 0x4d000000UL, 0xae000000UL, 0x2a000000UL, - 0xf5000000UL, 0xb0000000UL, 0xc8000000UL, 0xeb000000UL, 0xbb000000UL, - 0x3c000000UL, 0x83000000UL, 0x53000000UL, 0x99000000UL, 0x61000000UL, - 0x17000000UL, 0x2b000000UL, 0x04000000UL, 0x7e000000UL, 0xba000000UL, - 0x77000000UL, 0xd6000000UL, 0x26000000UL, 0xe1000000UL, 0x69000000UL, - 0x14000000UL, 0x63000000UL, 0x55000000UL, 0x21000000UL, 0x0c000000UL, - 0x7d000000UL} - }; - -static const unsigned long rco_tab[10] = { - 0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL, 0x00000010UL, - 0x00000020UL, 0x00000040UL, 0x00000080UL, 0x0000001bUL, 0x00000036UL - }; + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +static const unsigned long Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +static const unsigned long Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const unsigned long Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const unsigned long Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const unsigned long Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +static const unsigned long Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; +static const unsigned long rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; diff --git a/changes b/changes index e2cf92d..c2cbf35 100644 --- a/changes +++ b/changes @@ -1,3 +1,8 @@ +Jun 11th, 2003 +v0.85 -- Swapped in a new AES routine + -- Removed Serpent + -- Added TDCAL policy document + Jun 1st, 2003 v0.84 -- Removed a 4KB buffer from rsa_decrypt_key that wasn't being used no more -- Fixed another potential buffer problem. Not an overflow but could cause the diff --git a/config.pl b/config.pl index cee3453..c00fcb5 100644 --- a/config.pl +++ b/config.pl @@ -30,7 +30,6 @@ "RC2,Include RC2 block cipher,y", "RC5,Include RC5 block cipher,y", "RC6,Include RC6 block cipher,y", - "SERPENT,Include Serpent block cipher,y", "SAFERP,Include Safer+ block cipher,y", "SAFER,Include Safer-64 block ciphers,y", "RIJNDAEL,Include Rijndael (AES) block cipher,y", @@ -145,7 +144,7 @@ for (@settings) { # output objects print OUT "\ndefault: library\n\n"; -print OUT "OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o serpent.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o\n\n"; +print OUT "OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o \n\n"; # some depends print OUT "rsa.o: rsa_sys.c\ndh.o: dh_sys.c\necc.o: ecc_sys.c\n\n"; diff --git a/crypt.c b/crypt.c index 09d7797..f3f36dd 100644 --- a/crypt.c +++ b/crypt.c @@ -384,9 +384,6 @@ const char *crypt_build_settings = #if defined(RC6) " RC6\n" #endif -#if defined(SERPENT) - " Serpent\n" -#endif #if defined(SAFERP) " Safer+\n" #endif diff --git a/crypt.out b/crypt.out new file mode 100644 index 0000000..7471011 --- /dev/null +++ b/crypt.out @@ -0,0 +1,76 @@ +\BOOKMARK [0][-]{chapter.1}{Introduction}{} +\BOOKMARK [1][-]{section.1.1}{What is the LibTomCrypt?}{chapter.1} +\BOOKMARK [2][-]{subsection.1.1.1}{What the library IS for?}{section.1.1} +\BOOKMARK [2][-]{subsection.1.1.2}{What the library IS NOT for?}{section.1.1} +\BOOKMARK [1][-]{section.1.2}{Why did I write it?}{chapter.1} +\BOOKMARK [2][-]{subsection.1.2.1}{Modular}{section.1.2} +\BOOKMARK [1][-]{section.1.3}{License}{chapter.1} +\BOOKMARK [1][-]{section.1.4}{Patent Disclosure}{chapter.1} +\BOOKMARK [1][-]{section.1.5}{Building the library}{chapter.1} +\BOOKMARK [1][-]{section.1.6}{Building against the library}{chapter.1} +\BOOKMARK [1][-]{section.1.7}{Thanks}{chapter.1} +\BOOKMARK [0][-]{chapter.2}{The Application Programming Interface \(API\)}{} +\BOOKMARK [1][-]{section.2.1}{Introduction}{chapter.2} +\BOOKMARK [1][-]{section.2.2}{Macros}{chapter.2} +\BOOKMARK [1][-]{section.2.3}{Functions with Variable Length Output}{chapter.2} +\BOOKMARK [1][-]{section.2.4}{Functions that need a PRNG}{chapter.2} +\BOOKMARK [1][-]{section.2.5}{Functions that use Arrays of Octets}{chapter.2} +\BOOKMARK [0][-]{chapter.3}{Symmetric Block Ciphers}{} +\BOOKMARK [1][-]{section.3.1}{Core Functions}{chapter.3} +\BOOKMARK [1][-]{section.3.2}{Key Sizes and Number of Rounds}{chapter.3} +\BOOKMARK [1][-]{section.3.3}{The Cipher Descriptors}{chapter.3} +\BOOKMARK [2][-]{subsection.3.3.1}{Notes}{section.3.3} +\BOOKMARK [1][-]{section.3.4}{Symmetric Modes of Operations}{chapter.3} +\BOOKMARK [2][-]{subsection.3.4.1}{Background}{section.3.4} +\BOOKMARK [2][-]{subsection.3.4.2}{Choice of Mode}{section.3.4} +\BOOKMARK [2][-]{subsection.3.4.3}{Implementation}{section.3.4} +\BOOKMARK [0][-]{chapter.4}{One-Way Cryptographic Hash Functions}{} +\BOOKMARK [1][-]{section.4.1}{Core Functions}{chapter.4} +\BOOKMARK [1][-]{section.4.2}{Hash Descriptors}{chapter.4} +\BOOKMARK [2][-]{subsection.4.2.1}{Notice}{section.4.2} +\BOOKMARK [1][-]{section.4.3}{Hash based Message Authenication Codes}{chapter.4} +\BOOKMARK [0][-]{chapter.5}{Pseudo-Random Number Generators}{} +\BOOKMARK [1][-]{section.5.1}{Core Functions}{chapter.5} +\BOOKMARK [2][-]{subsection.5.1.1}{Remarks}{section.5.1} +\BOOKMARK [2][-]{subsection.5.1.2}{Example}{section.5.1} +\BOOKMARK [1][-]{section.5.2}{PRNG Descriptors}{chapter.5} +\BOOKMARK [1][-]{section.5.3}{The Secure RNG}{chapter.5} +\BOOKMARK [2][-]{subsection.5.3.1}{The Secure PRNG Interface}{section.5.3} +\BOOKMARK [0][-]{chapter.6}{RSA Routines}{} +\BOOKMARK [1][-]{section.6.1}{Background}{chapter.6} +\BOOKMARK [1][-]{section.6.2}{Core Functions}{chapter.6} +\BOOKMARK [1][-]{section.6.3}{Packet Routines}{chapter.6} +\BOOKMARK [1][-]{section.6.4}{Remarks}{chapter.6} +\BOOKMARK [0][-]{chapter.7}{Diffie-Hellman Key Exchange}{} +\BOOKMARK [1][-]{section.7.1}{Background}{chapter.7} +\BOOKMARK [1][-]{section.7.2}{Core Functions}{chapter.7} +\BOOKMARK [2][-]{subsection.7.2.1}{Remarks on Usage}{section.7.2} +\BOOKMARK [2][-]{subsection.7.2.2}{Remarks on The Snippet}{section.7.2} +\BOOKMARK [1][-]{section.7.3}{Other Diffie-Hellman Functions}{chapter.7} +\BOOKMARK [1][-]{section.7.4}{DH Packet}{chapter.7} +\BOOKMARK [0][-]{chapter.8}{Elliptic Curve Cryptography}{} +\BOOKMARK [1][-]{section.8.1}{Background}{chapter.8} +\BOOKMARK [1][-]{section.8.2}{Core Functions}{chapter.8} +\BOOKMARK [1][-]{section.8.3}{ECC Packet}{chapter.8} +\BOOKMARK [1][-]{section.8.4}{ECC Keysizes}{chapter.8} +\BOOKMARK [0][-]{chapter.9}{Public Keyrings}{} +\BOOKMARK [1][-]{section.9.1}{Introduction}{chapter.9} +\BOOKMARK [1][-]{section.9.2}{The Keyring API}{chapter.9} +\BOOKMARK [0][-]{chapter.10}{GF\(2w\) Math Routines}{} +\BOOKMARK [0][-]{chapter.11}{Miscellaneous}{} +\BOOKMARK [1][-]{section.11.1}{Base64 Encoding and Decoding}{chapter.11} +\BOOKMARK [1][-]{section.11.2}{The Multiple Precision Integer Library \(MPI\)}{chapter.11} +\BOOKMARK [2][-]{subsection.11.2.1}{Binary Forms of ``mp\137int'' Variables}{section.11.2} +\BOOKMARK [2][-]{subsection.11.2.2}{Primality Testing}{section.11.2} +\BOOKMARK [0][-]{chapter.12}{Programming Guidelines}{} +\BOOKMARK [1][-]{section.12.1}{Secure Pseudo Random Number Generators}{chapter.12} +\BOOKMARK [1][-]{section.12.2}{Preventing Trivial Errors}{chapter.12} +\BOOKMARK [1][-]{section.12.3}{Registering Your Algorithms}{chapter.12} +\BOOKMARK [1][-]{section.12.4}{Key Sizes}{chapter.12} +\BOOKMARK [2][-]{subsection.12.4.1}{Symmetric Ciphers}{section.12.4} +\BOOKMARK [2][-]{subsection.12.4.2}{Assymetric Ciphers}{section.12.4} +\BOOKMARK [1][-]{section.12.5}{Thread Safety}{chapter.12} +\BOOKMARK [0][-]{chapter.13}{Configuring the Library}{} +\BOOKMARK [1][-]{section.13.1}{Introduction}{chapter.13} +\BOOKMARK [1][-]{section.13.2}{mycrypt\137cfg.h}{chapter.13} +\BOOKMARK [1][-]{section.13.3}{The Configure Script}{chapter.13} diff --git a/crypt.pdf b/crypt.pdf index 0fe991a16c3ee45f2241fd38097fc5262dc520c1..9612855a8e197a45ad509d90778d156ba6e7a81d 100644 GIT binary patch delta 296090 zcmb?kcRZEv`_D{98b($QMP!|Qjub+&_sYl)Wo2tUDI}F_3YAJk$%u+lMp-FRDN#gP zMo1~6-~AltILG=lzP~>{uk(@f+|Tt~>waJF>$)FT-f&08^Fd+;YU(m5Su86Kfkb#Y z>}1`z5g})cklX5I;)Re?Lr6Hf+I#ys`^cgs5sHee&Yn*2mx$yqOK5uf`FJ_`JNmhK zc}h}#E5E=}zRslY$)c!>LGWrQG-Ww+S9?E%n=iu8)fu7V=3wIGq3RRt?WZ)oGzzoO z+WrnS%TsSaS|2}SeRy$qHwPbkpI`)}X^hz6ZA)EXNOyam zXVaEE?1~PHA_uS=6U1=fvP(pTw58ntv$waqo1?uS1mYH9 z;N#`uWAEVss{{nJv(FBDM`wh!#AX9cYsu-`;TAL^S>H1~ixoF*!+Dbgj$}S)o{U4$ z16p>*1K_9ar)%%%<3-g2{&xmL%g*pq{ItQ;{UJ|MO7cYny7{>x%>b=e?s4{X z0YB^e`+58OO=|!@!*ugl4lO&wi}BNzQ}?Ib#}CeMp3crr2z!Kqksh>_y81%qr0Qda zKNF@6I%{=*UtnJ!ANycmgx3y)zN4SBA5~d|nO20T?nm*O8M-1&8__t}!^7Fn$ITI; z;_l_R3!&=f?dt49v+(c25i=w4uo6k;gzYb(>gD5%n0|<9g%E#dSIkTYAx_&>+c_9v z?6$|*7h&(|gwXT%aB%j4bz$V?@99JpnTSI`^KW_-m1Aal4sqI`a12dp0HNmW>*(X= z?dL_K4B~>eq^4r9wk!&wjdb~Gi|Tp#IaB47pJ_9y$*5w^@H_c=j0TcBPzUS}-p)Su z@ODjFA0ln%@(bFIR$S~%1EP@A0jXl|xXZ-{R_?U%P{;+XN4qA3ooPc9a@vThu3lgp zfklR8r&)NxD5PB&JJWI~mn>&=km|KKYF7gQ9{Hl9Ueiz94bxI{W(C zyMP?$50IQEyoPgfrSTc8u z!_S0PC@L_Sx*@OmOL!kPcLLx8_QFGg|!_8Sn!`a>4!`>4C!-y?Gz>=OWH2(iv zSVEX(A}TJKYa$5T{&(?2m}Md=3R%cRe*!hBW(042w&R&o|jY@xuEKsw64;niSEmQzB1bg8Y zPe(5jwF4J^YR*$XP}MO9Wk3{~lL9lqEoP)H^h}(g>+kO82H+6jOq?Cvd|}`TqXHL@ zcK}~Wq7NhY5bb?uISdtusJMB;WTm>7j|ZuSv$ON?wgyB5`%CzBUEjo=QX^Ez- z{%%grApgx)VR3$0wxZ=!8R{{AH-&N7cap0x_Z!9 zc|o8<^8hnyRx}mrz}N;*BoJ+uTo~EVcn#pVX89=<-%vTC+3XN{0h9wFBxu=bc=4Ie zLj^mVeSL$;4Ak7!f0vAbu4j;EXfoCT_)o&b)yLW131Mu%!`Y8!-(3*tOuPAvS`|&j zII3QrJKS9SNyY<^gpwJk5k$o}(5!CDwB=@1B^WBoq1ipC8v#Vm+zXat?11`HM6z?%|96`+tJkz_P0lT5Z{ZjQ3T zpkQLj2!W7Ock@Ho&>&O{1==7sZe*1sleAbODsD5cWQ+y}gmcv55gWOV8(UODFNJqZ zvOj_yv}QP(n(;{F*MazCc3g2~$6<}1n-mXdWbK?Zu-EO7lo(>nN^9-qE&BAMrJ89w z;u5L@8T@N>o7?AdMk8*cMM4$38g1>^`5Ot@1vLe&>%Q2OS{zW$Yz$G)X+6t&m|?Av zxk2f~_S-U2#-E|{LR!)emoF2w?e0(JUy0r?y|h`P=}6~Ce%p0j)*Ecw;+0zWIdcQp=Oeg=A0R8*m zjT_axB;LDfpFCe>-4}Vyc*EtOmiwJzpUre`h;SUw@krINYgq^Bjr;ST?=bK3Y#B*I zvSSsmR)%njVw{g!f2?|5tZnABt0tdNYpIlEeQybVSM6KG(>>xTbjDiVH*I7CFTc-p zYx5d9o_BEY1zS;g>*KG&XRBYdC$`;^$rE+De))Fi;q`~BT+&Y6b{0K-)PeqjUvOZ% z!*SJKv2V_MpSj<@i*$BVI{O@DpE+^@p)~9~*t`0OVbw;}k<|0TjK`$bm@`J0e=j+c z;MBhTQYeqa$DNM}WwjAw#=TA{x4s@L$u&-r|NM6U*n1&sVH;P(mnW0o8zz{|v|bzr z42`cJh)@qodlC3Y97+JeGvy6Nta3)qz92<90)7*NLdE3|i$NF?f;3`PR78*o9t;Kd zl3Yg(G3{k?7TYWlC?sB%2sQ*f5!Bac0>abZ-Q8x!)#N?wzpusvC=OrELb*KY%W-<{ zxZ~`sD*;5tkYKVAaBCD1fk7ja%B|?7;_RZi;+Pq-lT_C-aK#ynaq?hDV0PwXq0#VT z8O`%p6l6Os7#b#v!A(eyg-6Qb@q~pR3!St~iEb4G22CUhlO&u?#}gOGcos5WDXx)` zUEAwm5R)K!<$T=BAHpxo#WP=Sc#r+upc|*(E|oa)YW&*EYnSLYHK`@F9k`3^!>D9< zzq$Cs1anGg&#-5le#6Lk>vi;vt6%$er0H+lCK03gCXqko{2^BnapRq>#u;8GlX=|A zExy^i@n7ECjCjATw8%VWMEloR?*#Pf+r!(*?;>4N61WvUJp7!JGg-aQG6B2hhl#6) zT!BQtt>ReWujk1h$6h}!3`tlPtKlKRmFlV&*u|LQ=F}aeE_?e`)JXd6bv@NvjM&2U zR3ce1;SaM`oQ~D1Iap7JIor0V zSUg}_!4Pdj^`qzaiPlAaiDY2MKl0FVA)L8)OU!#|?)Rj-rNv%$J%!DDci(-#CdhYk zV;9rOiy~3#5>+*Y5>?>p2yKq#V$Ro~i}fIYQKBjt9BH{3(&u511x3)(D(1 zfZStjxx-~MxW9B7F{or~)N&!>4|@M9DH@9!ey;vj^v;^5?0t0I_c+{qE-crQ^;xF{ zzFPynD<8LxwfvyA?Hsp7emZsT(1A?D6Y3J#HIPJhyqR*CHj{}pTZL0i z&3a{=)pMRFTQO3fBKIH3vGUfAb#e-gIS#ewERWTcK?Iwx&&>|aX1^xU^yFIh!xpn0 zvgf%TZ-4o&uMTmiIf{*>vR9vnTF*t~7+* z$$8&6bT&-d`t!OYJ7H^!z>&Kpq}QqAfJ^%J(HBx0 znhj7;^l1~ZV%u-{=9&+aFG|~^*gPUR%Hl0n?YsFLc_O0j^qwpc)BWa;6-x8pGW}Zp zy;iw=uQ-Qq-sWvllNs!)rwmxv8m7~&O{&ttE2Ev1uK9`;d>*;_mGF6*+2F{SMh4Vk3qMv6{Cm-53I_qEoB!4yAoHh zwRv9+5y+^DruQ5wyk+Aha(uhL=l)0A655X!r?5q22fz7hb+PW}$mY$N&F9qDaG7*( z6g1J2J_wauDB3kv6)(y?l3>$+LqC&{W7>sReE!|D68pXM%!D>%jk~efR(N9X;_{xI ze0midvUnsL{M3~`avkH`d;YNQ;@%1G{P*s@3MR#Pi+5}`a@$N-)CTYARa1ZQVu`qC zuU)mcCTf+!lB>(QuW*GPyC>%k9oW@j(0zR(GbHG03xs44<~!XYCD7oKyUab{dH=++ z#sPxo9%A5|X8n^Zz7loauqu*U&RnpNL`w2VbXqcqxt*6*eye(k?TFZ7S-Co|t=Ht1 z;d6<^fws(vONGN%mOVz_yv_FHDYF1q>j#b0Z7Pxo)v$`rC0#vNwHTc$J8PRR-O!2O zvwGya98sPQ+N%1i`8H69MfcW7?)X>-I=)<-8efh^1{ab|;FQLF|I9V?d}LcSE4!(d^tp|A@XhUGAq!qTvKE(VRjq5!c2*G<$gch4?Y98}m&Xy&{nt6Sz# z@qu|rAxPc3@B{QIC&Q}pA#-=q9=7{3jzg^n-nZ^>GqC>tQTScPqZjKkptlP8zp|uj zRTa)OF$*cZuHX=s{;n+<)^wOPtUc<4-;&3Lks`wwM~7fSVBQfq#Xt$$C(TS9Uf!zw zuUtcYjHGBazr?}V} zy|0SAwy?jX#oRc0CrBaZhGW_*_k;T^^RM!zM}E>1PHbpRJ6OWh(lhyec-cpSwk<03 zoQoSjNKI>omg%h#;h8*pu=ep1sQ{%Rp~Od*@lwgHKWc8sq@ZNQ?K*R^OQD7r8q0q2 zqBEa9o8GoA+aRzC*0eGKc}{5 z42cbae}>6J_!I68!JjaB4S&MS2K))bWblcb!o(OHNeJ*Wc|Dk1NHQ~GS^XYB9b7wqkfkkfJV+{G%l86cdQmCbY=Mk26CP%o+3fRXPngg_%@ zi2#-1kVsj1c_ISv53*QLoZ$dBLd4?#M2P7+h+Gr{F(^H)DVu`j#UG zB><1Z5{W=WGy+Wol`)_YvGVc&(*37o!sN+4+QNFeWeDU;QjBC2_zNXbBq88s@c?dO zkn*zfzy+{Gz>*WN|0&A+lE4){q(}>|Dcs;cX^Lz_EFLS1#mFPj7^Ex#1vE#%$)bsb z1>}Qf3^`J*IK@8D)D09;@}ESbs164>6CfE13narKuy~9t1O_A)5N)PpG}Oyhh#e+yeNKqXYEsF$v0Ez%i3Zfp1195@;Gt*M&1v0}=D;l{EH?L^W@A3mhG_*YM ze-N5zK*oV2ip3CR326C0Qr)y@QzRIzXv8Er7A9tBUeW$kGLX6O@>t++Kr)~+G+q{m z#r&0E5Sf&sm5fA-{A13b=nRRG#Q`1$jRz46=M3O?U~`x&8Z(>n{%pvODh?9*644|ITZxtod^S}ci8#C zwmJ1lM9N~(e-xyYooG(-pfnE_5Dfb7Es~-$AP}H>L8BA+nLOBj39@+NAIU{ACWSPo zRT;eJCw((uTKX3|0YxAzaCN}?!s!A@09*zROi>X3DqT>Rbs$lawIS2rY)2F!K-ggc zlEI+lWif#C0LV%fY)x~Wd|@A_%!R^2Joz^v;H(7i&IAkq3_utR=un~mDhW_#Mqwd@ zjs8g!NTMtf@Z=Z}N@z4t2vJrZGf%Ytmm;Rfao9hSJdK$C0mlJ?UzPw!el!jxivyG6 zfDQ+_=Z}1X5t5 zjWno*Az|wORWv*}cma4x(2S6k2dX2$8wn|}q2FO&N@P<=eHzIqJ-h{S&L5>52#p2J zWs_TR4_%FzNHopQ${5fM6gkl_UJOP{(WLZgW`pV1CRjF$OKTSp)nvRkbjj9FyzSw zptb2bf>fXVtFKYC20CDPP{5%9p2C583ylUC0rj6*g4!FWRU4)IM{8DEa{M3b9N3yz z7$ajr9SDL8gewH%^slW-=^xUHN1o65+klut2W0)BKph6R_|RbQLxXgJ0(BUelKcnx zXwn?n>lT3U(BIV2C{Vh}gO()*z)&J^Jun~#??`_lA0_|JM#&IB8UQ5xtK*UPX%qkl z1W?~m@-GUMX}CX993(->a`X8ddGh0LjY?bgfZ0E`#7*+fXZ=BPY*307sAf78axDMitv(C2lN4kGyw&7>ENd$_r*l~8CJ#(u;XigGlHYaJ=La?2Y7&Zc#StHG9 z0H%#JkpX{_nK~kwsUwYC!2eEW>WE~fj!0(eNK+H=@5$@QPpJ_j4>n*3rV~ly5AY{> zK~Tq%1OPB(>XW=6X;K0H9$7&7sRgm5aReh!y}>&={5d5c7P!LH&r|DRN%I5X_oT)> z{E2~&+`#`s{sN#wrhcBfA(q@D#e$N5>fgyXBuxy0>!upJ;FEkqa=UXzvzDaI1w9=4 z4KaxW1RDW`z~jIiFW4|KfUH3Rz2QMIjU-UB!+#_PNZy@A49UFk$i+WpEdo{+ z57dPRJ0uEZW|*wRBSCW)hXH)tpWz?4goeC4;er3z*oQJ2^iQJ66G)&Rj{!)TBpLu2 zfC0zDywYrF2F=gr(xff;IKo`{{uDdT2OTN$fm#s_!PN;~UKR_08XjDrMaeOMl?O=@04p%g1b7z|=&`{; zFkit0v+(nG_T~`1Fn*zCvVRK#ECCLJDW(bz0xTpCN5P+!nq;L>j`+~nlX7_G@AC!( zx}juyg7O0-4p5PhqW}vSR(Zl7RdJL61sllh{7;!=T|l(ou+Ze3iv@KYd_)0E-N}O1 zA82BMC|EeD%{bRe-8$i;L9@4Z2tz`j|LSiP`9SFe=Qe=fK`4OsB-k5}e}sw~Xpxt6?n0!sjM&X>^UHR4A`0weB|J7VH(+-;M@%u z6#&~hKpF(Nn*tg>_&=L3qL>o}O`X%D(b|l|5dSI}Xh8vLn?$>lBm@{2DL>y%urNv^ zpYx-Y?0<7LlBdCK9eCOZAX_vTY(qn!3yzfkqY$8^ThQ^FjWwotr+Xz@_)c^%sMFsOE_19{|^8JMFd#@OjUvt zRk8$_?*L;LC?whjbYuP)fS~3|_CF&K2s8meXx=GKazMb{C-|f+JR1m~8H2k|e-{t)Sd(%{e9GPa5r3cnI|>jRsSL#fbHeSX z`4ilNs10Zh01ybg{g5Wbk$C6@gY`EQGev8l{{&JTI7uxF&)lK_u#{hLlb;`dz{S|? zJVK(z|5Y?{n4;jm4wyZLH&J-}6orN0jp5JIFHIr=;>~qA5@-Ln0z#C*VTy#L4iqdQ zAXfm%Hr0XpTPhdU-<&*xA<*Ix_^cSf*3xi0;?GW15l~6XmFRfE=-pHk1N4=^SQ+WG zF5Fj|(PV-LRY^xC;opFRk62V(xqvi18XqUkdz!8*uA284yf`j^l zv?$xPr~8J3p|&TvE$3fc?W%}4$@O~cg}dtYye>mLhm*8!A{VXXV02^&4z;tnN^gN0 z?p)O*;gDb)`^0BNr`}oGM(sp%3}ePGfrGa`A~=IM4v!P;p4Qz>$wR5ksLoqnBDWP{j~8c&Re689(x@7b&v1yoO%oKoBU^O z?mohr8#{2AuT;cYYpUFHtW5CqO!oJ`_E6N)4}UHzO2RU=K3eixs%qlxO)*=4HH|Mm zqPi*CZKa&%1@Qpplv>ovbye4!qD5q`T=yOsazi^2M%lhZHFeBs$zjnra9~h`8%${e zBht3yuxRW81N>OB?XaY`V1mXIxf6+Zem!Ft7f&Ku0IC2x zB$#Rbo5s^L@S&V`rcGG?k>{a5oz{mNJn%_MFo`Qm1e(BOL3mG%Ed6P5j-pZ;Q(ZBj zS?GVLn8*!jJdAtbAu95eBnUpxnEpfb5A+Y-7^F}TgK+SXGw7`2wkv1%=Ha*uVP7RkO`4=;{L~8M1R96(UQdt3#CaQX z#d-1{+B{@0B87h6su0q?`}%?F&E3{s1NReGsLMcSBPGxKEPBJEt~bOc6aKuD?Q1GJ zYi^RjB<07`iEv}5h5=?|2~1qxu(;9O)3;cV*JnN@pcAN1`J2g0v*qa8IMNV zDBwqQjOrWzWOcK1Zn1}DI(v`Vl$L($u1wzBoJu|go;>tDGK~v|CXpsx$ z4KE~E1zQHx%v70YS!T9j<~;9w*HVr_gHzB+GTKaho(tUt3+iC_jgPbMLK+UB1l>Xx zgSlHUWQU(~F*dHVk#_}nDC$@TNyAhAf{n9}UKuATmQCkc_*85;J)Kx#&$^uqbbAU7 zrLviLjBYk4&DC)dT^*e$4|eLz)(p?Uk`87=*m=|p`#bG3kWYU75riO3Km6`uxa$f2 z0}6ms?_4wL=vax4l7x|5hW`kMhCVdc*!I2sfmNPvN-EC;YL<(xg1bb#%5_lD0* z5CEu}ZFnr{*xPTf2BjG&)2LUo0F!}>Sg}dF>*)B_FNC{jU1AD^!9Kx&#i5d#w$O3W z%Om4<^GiS{w!QM{!mrr>-8^eZttFSp=q38yZQbirPcNoA;R8%p$C}9KG_7dix*Yv9 zDD~PK#deO^k{2(15}2_3$`_i5`_s2Ees$py*O-uQ;B`y0NmqOmd1Tzy+& zl#9IM&u^2T+N&jOx(}RDKQ>lf7}no%ch7^9nv^W^&T?MSKWFVBvQ86G4q8DG2CSj|~J4q1w@i~S*fA~@&U;2yrK^jO7f}#E!Pp|Ije33wm@QAn=uf-dDYboa1CYF5n$o{aPZ-?0x z9nH3c+DnCcZO($M9tKa!AoH)dY!vbo_)%2Q=E6U@@50!}*oopzPt|NyZ7+srpbnf_ zyD!gQ^HmqJNen-#X z(N%TrXS%z0)@GidUq9l$ylln~fUQ-h~blWJeppT{@- zGEY|c^s2gGEG4ffZG7_hWx_{|jY^|7FZ>(J<^ZiSkkI~BbqNN&h%Z+aL5+DXb+jM zI13AbE#~`x@^8eBIA2-w%o}Reg$G@EQl?>FIk|@-kp$s-N#=CI`>(< z@=6bv$b8?V+#&s4@z;1)V5H2g)d^Wbl4oC68Y~%a#9a~}>Ssd6pD>fB%iPD9p_iDy zmzlWXxdEzT+0{nLwodKx!S4=E9+~v_^m^85{9xQtWG;aa+rS1@uNcw8-zp2-dz>H; z!F~U=?|rl8)p`54g0Hm7ut8;)PoG$}I4x?)A;IV?Qt>7oZZW8Yve7sRE8;svl}E_o zH5Gezt6@=9N~)iek%I^9O20fm(i-5>&vNA9c&H$&_?uy04ab4R@{Y+3$8IO~eGIp! zTXxbu>p4%*J^hv?FI&_zJ$}d-RX*P@b#-y#ZKr38?mwy7+ixLOnTmh-;wAK=0y|ii zm*FpmzHThmvHv;Gr}CAY4QoeK+lTxTdfV9Lw!eKdXtahdVD&ad$Flo9FHZY;e?09R zdV=r7M8uxO8ZTtqS9c(<+(#bUq|VYNqk8R3ahw=FJNneY#E$bxr|vRoE_$PJGW@jq z4Hs#Zt}54ew;7kM-7Y9#AyWEHz2p(}`Ymzo-7S6kQBgLpDtAatywTyhR=q}l*|!q~ z!j(K;*SWtmGFd2NLo-{}gdfUCuv_|IEM0-vXtP~KU zuWs%B>xrLx^DKIz>Lk3?<08Ld2_siBx(J@_K_u?p0E{F2xnm3;p!$5oEaiwr)buHSlwg|*}H zdeqf|y#UDDc;Jke1hyQh|YkZt8yuwZj|x^R_)xbU?lOrz&^%NiXp z)z5{>_i1YIh&63Xt>d(KzwO7%)}aef?w?9&tB<-+5E;4V zwU%EVkN9YS=kYItOdEZ~%Cesc`Rrj++SGwgF52{!eX01x%J?UCAukEfccni~IOgZD z#*^`Bd4Ex-1M_jM+%9InNQZ2L6r(lkH*@ko__!O|(ol<49At3B%4ZD+btY7QcFE}; z?c2eX|8m_?Mx&$8o+Nx9Zr|&+F+t9Svx+fY_-esRwsIAzLq5ueTsg^xf_FUItEyh} z>r{4cvr0GFF!XR>SL6LFR)unc56pgkbCoA0?L-5e(?B#?vcgG z?Pr|rDg~g>*MnO)O)!S)6jiI{LZ$eyAtuo_umB;rrxniT9XZZ^b(T-=A$h zaQ6|5vT|LZNL|O%IKev4;}w-yV(l>>P1V@ran@g-ZSg%9F}cyeFWuYSXCSxL)O~+( zj;-I(v`j8Yz~iDrAg$hxhIzClLW6Suci3GZ-n6^?!u_T-lP zCrvGx_nF-R%Y};5yeIBC81PL zZDHKiu*B^{GorBjd=_d;8cW9W3+-2&gQAawlp7j8ReY3u|Le!6Zqb5nCseCeow36% z5_^~*RuW(E^a7OLy6dRnBGuR}?qQ!FqsrWzU3qxTYrf&SmNOn!Fe*d!T==%iEw}pW z`v9XT?;Bw)Gs{m|Hl?{M@ZXWaoA-CAt@ecG z8a^6Pa`pN0?IU~HWlmK^3vKf52@DW)?&kf(;kd@5_;Z-~%8#KOIh_|aHSBn}=2&E$ zm$;tv(eKSVzYOjPZ6CRM+;juO*MMcM1_>o%yaFH09nF_AgtOs&qdLDbWA?ljmcJ2- z(OYry$XGdk%VoZ8ItrywW=z((wE+xt1D;{TmxAl~)MDHZqn`-m%D-kASu5kz`Y7SO zS@$ESM`D2tC3}*5iPGy*mpj(oJ~JNF_fSSj_Be7h)Tzq)=bE12ZPCf~!6hkfbc_tf zd{H&Z>pZ=MjvpxXsW!bScOhpvud-_ON7=a5KVJ5Q>T(CAcaQQG-Mb1UNazOYJTx5C zKfcprF`;KQ0$Db|l&k*ig?*@{L>0?E!m&yQ{^`zMHsvJoC2WO<_ms()+%qms5NYFCV3` zMD?A6UNVPp{zlI6ibnl{FAxz|=UcQlHoG(FwDwb*wC;F2J8Qm>lvO`Ox&o!b^VoIY zzSkI>%=V;ret+4dMt+}Gx5{2O%O7q%<*Q|5wOOo|(#6`D#a?)1(pELThH%{8zq0A! z#m3bqM($q~MH~;X)%_R~8+Citn~ENe9Ocah%T_iQCT#c;(!fRJUNykb2#MDfT+m?LRk!2isB@>_ky{#ccXNd8)LRaH z674wb74y)PtK!PKRZGm)G2X0uts7{*DlGH9%OmJb%>kE1@(k;}^IKZoi@rQw9>#OF z`iWphW#Jyz-mSZ{#Tp{c*eC0aG(sBM={E$oCp3g*hOJ+JSvxXoAmid1)P@6FqmfR= zS*TsynwsmrD8~=w9KYZY$@JhUrUrL}G2eg7lCozfbe;)hGfC=|^9<|l%tma|c0VX* zR401UPJH}U%&WukmrURFCk@|IzjspZia&3rc}X<^<8%I(zu9_TjtdrNt-Hnx2B2U5 z!;@w;Ty9aDkKE3JQWLIzU2~~c;-cQ0NlS&n)cveD`LL6ht+vR#^~*tymtrt$C!^)zZ6iwv30xzfyAD z|1z;?88No^;seEJPt$T*k2mROoyxXMMSSczTcrGY^RZ*tMO7BQy_ntyUZ~3FXWN$F zm(TSHMxBO;5{<@HU1dV&WJYf82w#2f(b^ulolEFj_j??x{lRA*ru}fViKnk{0IQUT zfnJ{pR)0|EeCXbNwZRD6@$?#-WlnrTK~<-Y2@RWG$^21|is;?_{D|akA+{GRbVS+v zyrQ`lFOHPN$5h-(T#mhfNQD4UdF@@Nl-Ggu+jr^kL1VkGIhmmX<%Zh|KL02cUS54J ziO_Vd%+;%BTjIq_A@a;Yzlz?cG#9z_JlPv5^0vm7@9U1kzZjYXT`lGoqd53=BqH2X zF9Mlaj846cWS(Ml#yMoTrX#;jWZ`oaG>id>Hl?k}=DQdNCfD$wQ81?%CGn=eyBZCe zyI{_ZTG3GoI?6jxr^$->?hSK(@EFrnHK|Qgj8fi%`k$Ahh@c5Ts-tI@(eMG0Rgw#k zP_)$~=of}T;*zfm&TLcY z8j{*BCLgr_oLZEc+?Kkv&dx)h4|6KV#fNvfo9@gp)5Y?iU~UvXxEktgQi3|G&j?i4 zif*sY6<&L+eejW0uiK~33bxzK5?yfiKYe_^-#7of<X#C_$&-Pm|GBlvp2#EZP`!V`^tFMXRzO7}jI9!zC3sogN)T7M?K zpG{)hN*TShKD0&}@2Ovx+d?Lyi>eap#~np{-#|F-<@F`5VUtbAZr>*2O}DK~6Dx+8 zwwjkPK_y!tL*87fHqUX{^c}oS4rjR?;=5Mi&Rh+LTukjCP@YxdiZjCc`RsQx-i^lYU zW0tPa7B?olNHMSco-LOM_5L+G-*#0R1=&n#a2PV~0d zXlhR9xje&%i-q)JnIA2w|A;m09k=Y=BcfuFreCBxkz>k|Z0LA;AJ<_dwAkaAGd3@)}&*C@_2g1%pcO3rFL%VFx*VZS}F;oYJA%Otm% z#-!;AHcHxUU3nzx#PStJhlQ{2PpK7+@p8Zj3N*ie#LsyCQRDgbC!KA(Rch;Vz4FiA zys(xNm3AR9$?xTM=T1N8JEsjH^EBTw%-#*xm((^1-l;y{p0G^}%Uz{DB%ft2j#^q- zQ_g%0bzLF{@{hm>6>NWgwWRFT2<&%5}~+9{PBIXdj7X?T8Yk}0lfm;AMp z%{)0rZT4`dUc7#EX-~i+8`-@o_9J6Yn9XJ4Wn@CG?K{#U6l(d+>4?3XKPh9}Lkc4oC?<`%Aj^g4r&3vWIhg&!F|wX!nA z{=>#i_2QSHXtjFy+4eSlYA9a!>f_HQkE)vf#inig@tYrTJX$W6 z!qCp1tfNJ9vFE9Dc<*T4xt#1nU3R| zjD|Ng(apq%t1^QMpR1o6!PHle8=l%#%a!cG?Xb^h(UC`(#jha49o(t8hkrFhWXCk# ziz5u>@b^AW-GJ?9dl#-bSbxO5Ro_c67LzXyX=*vM#V`FBnyUQq#%GL*r}?pBoYtYn zs;n3dvsEQcmQIEVJqqEWqno?OZ?Z3WyjQCD!8#Ky(f2XZD&|)Xsh0RkZN6Wz?j7&Z zrCHs`xY)`@nVMCrI3bSAL<^&{4cC%?HP#Pw-OL|3=(P1p?8C(9EeQ%Me@d!yi+-R( zqir8VR}WfUSLx^f(dR*LFDmRvSakW~b*DBqY(kD$bUF;RaMi@}?_T%RL+s#%k1m%cCG?M&Utab>`Iw|# zI=39J^u?3OCmtVNj`7&d1$`A-u|swxdolZpMH1<|Gfd2GC0u9}bnO=DwrJH%MOeK$ zq`|iFk&tMS{H~9JYj?`Bb8%lDNVQHdOaE8?f#B zx{qPRFOvIBkr?AQ>*TQ0H(Y(5SVa^2Wg<3Qy%BKxi^27@hnFD+t=RVRPtXO^5uIO{ zm2si|#~&Y0XN=@obn9RP+XTPi`IRbi&qPlweR+MY#lv;{Qgv0!GgSGJ`T#St zvYiN@#n(@NJXclca6Q@Jd_y>w??XsJ2vsEW?R})sW*Oz`jAM{-%1UY5q?PA%vNK$L z%0H-TVH{!>T`V_EZp)n*DXHTR+wF+=UF@^l^Hq|ni@yM47jrs4>*3pcxo0_!^s>^tfjCUffJRZi~;_Cvb9 zf`Oc9oAH2f`b^Efj1~Ib9WJt|QIW;NK}?NyCIV`9!q`S0mHv@4QsNd04EtQ}ZOhj; z5K&_|S!WOvzM){9e@jO9nIr12n#!JMe!88bvohRVS)E8Hc7JleZ(EUEfo{OBZ}-i{ z7Vmm`+r)M=(>{xRY|qO^By6AYo=T+u4qfcv)MECR+IDcyrLC_v2EI*3Oq^NzoBX2{`{(?3~{VA`}WI&snmpy%R>yurux|^FYhk&g-5^w>O>W z5zw_cQD5KrGJSakmUYMejL5Q&$DqL!A$~`tfU*mnN1*jthmhNMC_R}x%N(cBwY6(7 z0{Zo-wNbD|cH<$w&nSUI!6VYfLm$L3=1YA}3UzUeO`H+nydKb%@;bFh?A+lO!W*pm z);tPY$@=A?XmcYA-LB6`NyY<1+8pdba#!Lss^7muFvV^ZQ;v9RcTZoP|28&J!((fO zKh}7(3mfu&}%I*7Yf6dHHY6F5imkfi|c-aDC1qQc)DQn`wE}&(kI>nstXO zpN-XZyB#9tzCGU4eWDxpc+{skhlrKo`DCXX>{t0PI>c7^vkITiz`?9DxngDYo;Uea z*LNMcExNUO_>{c(VI7cmaGxso0YWn!TO{(2|uG@!Sn)#0eTRKXy;eb5+NH?5>t!`ti+gZqPu!jP@q z+kCHVr@>hZ+&6A5;XBoFQ77N*DEqoDr<%)U{6Lc4u?+0Kk*cs_Gds_;oB2zwjlI)s zUm@R?P@{@g%-}#3uU}J#J((<-o8sDYr{Nsl#^ctde5>Pkw(e`*qaNoXbh^!S%cVVE z#@56{@^cD7l|uwu)oN8f{Wp?dq@ol13`(o=n;zWL7QC9!s zAbi{)-ztbyc}#g8}9_ohRCoXxYN{WJhx?HX@;Eg74s$3hsXj4n|tce9a0SOk4cRg7;2z2H1?321CEz7M)tR zM8rZyATQr1>QIgnA+E?o%vhW+HOczH4z%p4=%3rX>yWt_oVgvrHdlz(Ov+vs9T~_x zHd^Oyx_ifZPnX+LW-6b@FK6i-*e7WB^SMoV<)p&){R4$t zT~zOf-EHR|vtVu#R3{?ZYU<>7#TQ&D^;AANd9X*NdoOk+`b|KT>%nEc2RZI2-7-u? zAG-VG2VrZ~aOtq{-6a3@TP070>SXe^OBaNlsH+UF)XMUX9xa&cH*+&1tncf=L7D`* z&$kZrf6KpH>DSx3`}32*3yZ#e>(DDM1MP#mmR3=54J?T~%>f&YPZ_GCnY4+gPHCt) zi)$dCM?TbfBI6|ft_QQS)W)gDqouWI=vH@uK=ImJi8{kOL-z5+bZJABN# zHu~W1fQhSHhJFctlkxr4^4$Vb7z!PMycVMwR`fgbSnggcis=wr6?YL6?URCz_GaUY zXxkpOKZxUow4OI~t4v$4+Uuz>*>o#Y$iT@0>I(M?oGd$?ln~h8RnNUVmD^9CH zmBFWpD-5ePA3{A{yZedEvdp%PyL-QtZ4#OoDidlw()j#w@hjt}jR^h=yjd>GHT%R? z9ZA1z?77mvLdIaL=d~!?9*&yYPH6q{dtsak>7H$`V$?b_95S}AAD0$22G3)nnu&Oa z&p>qY7%jVXry%RjJ3(vao)$szPPGE_$lXvn&kL6(vC>e9Za?ADW=Xfv_;$v#d2C-| z+TVo5j80~E8ovJ_^7R(|cZ^hNQu)?{Z{@gi619}vH1=eAzhTAhtJvj`d58XIumApg zC)!?YlJ7p@5y)_-F)ZZrj`SBX5fvOO>a_=6#|F?5o!=jIEX5tTIGR}YZOk;NbkkBL zO;^LK$rc~H3d7X`ShaNqT8*}^MD}q9xm-(W|8UpAT0lv$x1_1*?yIrzt=@zeBEJHQ zmMjszA^7-wx$T&x)|a`-5|1HKHDHKq_HYKCG&i6&U$&e*H$Z+n>w;8GT!#Q3Dc#Nc zMVeWR8KY{Xce_$D7M$eXO? zi}ue5;DFx1D>~+0J$sXxPw7~Bz=eScn7LQeo~oeU8@@F}{SyX2;b4k*z6YPZlg@i{ za2^B+PV3IS`G2}4L{>WRXK*xn9*3d)Wt(XXFz?Ob*E4|W!nrq}y^ydeOcX#V0W3^Y^OXL$$pA6g4 zmDI^59J3*cCI>Ac&%_X?_~NNo$;^Ok1QK6tJWmpu@iGh8)yOZTney`A&9xEaN%POk zX2YK;#6yH9_87oa5j<=YXKlQj?o;6-5EuPz^VaVyVgV`5TPDz&;17t3LsXbiHfCoByQRUYmwwKDK4M(pBohBai!i(_h zd{aAIo?AJtxw3m@YNVP`wZJM7FLA%npEq4B1&{i5cj>MQ-^$CdMO#5u3$Ni%UuJsP z(A2R2nO2v1 zE^p1w3Wplj4Dfn1gdH=KNVSMb4M<}WKA&M@Up=C zCmqixWKchiyHO^vz#BclJmS=giDq~k5gww1uv2dwqG>N+XS~^hB zszh|Gl02heh99lsP*U8>!5N|=l$L7#lP~vF!QfSK3Ad%_kfX^gMaH|&d|ND9gITtF z!zYN7D*{(>M$*q(x8tNhb>|!Jr;KqIUt&K~|mI@@}sriAupR%^gJZ@=Zs+t*vcxvWo~= zCXIjKhPR;$ds0p>ktknm8ZG@n-sWm_bIH?_(5->69r@3#bRO-tNy<}+Q43+~I=ARE zYQJ;{;_Oq8>*~c1?bQuFGy7LeB5azzFlogtuhduhXl$}qqxs=k7s6=pqu8y_;yVI@ zMecDFSm(C4++%u^YnaO9Z=D{Nn6wSOZpidj)T5mYnQzZ+sg^Q%e+l`}0jrvG+!(z& z@&nHYXopE1K3MG{#z|L7_qu1*zWFkOn?`g zRcV{nAyE_~9<(9w?V&4=iv`!Lt+wb^!|PvS3vF+C=hy4~e$TJZiZQA8jXYmUY7hGt zBSa@dAHG!irW7fu*sqmR{V@E{_|8M>g@#BvVSNm=6MDNW`d(?9!R?lB${!KR-!4U6 z@;YBCpLnmb>D`CiW-(R${hY&>yrS5uYTUCKr-wVQC-=49FLT#fA;OTP6ivuZcwhK+ z(A#ofijfK9B#{}@mmS#oE-v+9dXZ#9=f2#0%NI-=2C4{RG8oHm*U=BFzI_|z370Nl z=GVE;toh6L>mY;~I1%#o@tUP+h6DVqsYi+Z4JS<=@}1l=sHpJM`|HWmeEv%rLlG0iB$bhA&+E8%WVpY+se!32hU3}0=P{2X<~>2^l-0UcHCfz1Tz9ap+-J}iZn zwZHZB3$!ocZ`b8@RlVU-vN+VURJh$H*_*AsX}=m_v4`{R#qAvpf=KCd?qiH;2lU=_ z>U|m=&^jZUN)U@;+c!|{vq_)V!c(LD^w~|9g&hv`SJ>eWrPSY!dv2?+qAk8eX3dz9 z(ud=1M?bFLI3OJqx5iEyQVl6)?34PkXrp{HoUglSY_n)`B=bI*3xt9eV zYd^XKvh?Zyv=zm)I_Jb4p@-2Iua>=AG;zW%H?x=iAqSJ?@b%1l`VX7$E_!a0oEz@% z+xN<@?^OT$iq=U{i$ME|vAgf_%;Ig3j~S~`>e1v#_pa{oZ2h}oLgT7XGQpJB+mq$> z>6A_7!VaFW$Pp=0?aU63?H0Qin)X6$Hd)4%pLj}laigx@ zc=n^?6FOGv%E`v;^_Jz|8lO#e-+zU^fL_OvSI_pTHSdn%>oC2vOINciOe8Ig2cRe8 zXgRik<>xc=o@hwiHHp}{_0y9TV#n%uB62RIEa%o!xtoKljoVjZ%@rmKjoJ_1md!q# z)wrYB%5^cTm4UMQa?GdV4O|@SS)?N>;y$N^$DB**3_N&t{jQ}p$n&19#ODt!m^vbv z;tCq7RxHavh-xEF5Ivq}Ju05$6Vz!vQ^BEZR#EtNa^igA?bGM8U&KADx>xR5TeAI1 z-h(AAdCJhmjbHbkw$u@~U$bir>fMZ#cIi^82qc)-M=xnUaYAdmt^l3NdN*XhM9tB% z6L<@}%i&D@LB66ISGr8Iz{04G)=1&iYnFzqyx`_?XDp4+6Jqmzf;kv4u227NbLT{- zLDsFnkg)J8SM9!B+>f;TP@#q6=QrCKcGx9@e(B>g?Mz4Xo)>6uJh#%SZB07ldNU_S zuu|@U3?>I#uwK?z>{hl!?f#}C7aI1Ue0UiX+00+C*EX8&f2+&5>kuTW8LPWe+Vs+p z+sf2S$Fy$%rLFO15f90T*D>nCDf48FG8oGk?@-0{hHZ4ww&X~C3sH8yR?Xk~tM<F936r1Qqgr@Tproo}=MLYeZ1)eS`Pk~+O-x$UAtQOESS{z^ z{V@|c_D#8|3X_ zJaMMnpNsBc-!N?&?sNET`L6S{nnZ@*_MLmZ7u`D~&3;zr?V}anl1$2^0~}Ai8spd* z`+3jjZ65XM?G~#vmbW;2jJm4}sg~rc$Zhw40t{c;aB1&S7SG+R{(qF61yohr`u6FN zl155ex;G8djf6DP-5pY!?(QxLN$HmER=Pn_K)UnW=sEZ5(fhyma}0){%)RDbd#$B*bNVyg>6biuTuKrT*aS~-$cI5cnrS?DxD(=MRMN-%Nh1bHtl$H^I97b>Bq*ugV_IAEL#-x6=RShywm{&ipyk^W)$CPM7@us>DFB zbPiB3_^4dtc*M|xq~|Q(VZIN0NElL{w}Wj+XwYuS%JUsqyJNw z2?9d=WApx}(Ew1&{t;L8&&~V4P~VSOkH@&-PlK63@EVW^`k!L~-<9c{f1lIeMuPw( zoFH8<(<9Oj^!Go9vnJ|-{KP;Wm5=j(l>Ppq4*nh+{Lq$y{^yq_BM>F;FYYRXD5$9N zDBk(;0-!FbN6z41KRo&w{Z;w+M-1|_)|mFu=IHMi0G$mG4E(Pb0KGc^2s7~G)j;0> zm_cbwkWK~w5+#E=n_@|fW5Eq#YmE&c$Z)FgO=cm$D`L;hbbz#BJ-T0-va#24PfSlw z7?xb1Uw?8Y9YxaZdh1iOb*;v>6v6+%8mq~4&3Jvp2vAcWCuG7+buEI{-5K#IUkiL< z6^{|4KO58L-+c4XM^UX6M;EL)iU3ntVc<4T$}n?Vb3c*u&V0B>39$v*xUo6S+JUss z^Oe&pANtNxumWH&BmO!vb~#2&B9HaqeFSmbvwD7IEQ1qgDfm(ZE7(5Dcs<3VPj9w2 zeX3M!HFpDCIFu#DxoJJ#3Xsbyz{=`TZL^5tP?$wvKX(D*XU1U|5BSl+zm<4nC$i8I zMfkCU$UK!Hrk%1>YyMi~41$5W2v#|T4~g;9bLrhnlzadX6H$6&FvW-q01s)r%vh3= zMQn2AX!n-jM&UxL4N#VlXl|r zvhwTVoFXCwBMxjZGm_89<+vK(F$qPf3eO3-XZcGNncBPwL7vHKu^FwuUQS0x-p_); zwioJPaLn=p4v<>lWq?{AI#`w0R=i=!XpW-cPBfETMvw@vu$MJd1XZ^2$$S~BbioyC zeOp4Fy4eO&)lnvC@}$|rSvRHnr@o4Q-ED8$6cYG#idr}z)MI~ny=>+s$CdYO4Yk8~ zjZy2gf6dsN6lKiMJEgLXr(dlOO9UO?_dk~$)F(d?0gl?+6|ZOeZ|th`wdKCk6Q3}4 zn7rx?Q0EP!XFUp#V`K z8U4b3DPS-?)^ir6FDMt5`WDgv!QgRk0K>E3J29p>^valMNvW=skW3ql^SoSnhP7vq zpKQ1S1HhFf4lZK3bDv5Oi&OFG+`JWBKMGR^Ro8`aMHmYwRy3n=BOGD2Ws~~gtH0W{ zBhwH!BVZ6561Y0P(O$fRZpp!JdA^s%Z=6!b3=Tvx!8dNMUH=kDz<-ShEu%E3+9(96 zv~cdA*=N${Yq+xa#IQV4>8w_lT6V>fF4p92lA)XE+JZV$1b~#GuR0Zhc;^sqdjsKu zHEjfM`hFrxP@J!Lt|8#R+38Oj){!yk8GlVa)0IcPc|ugy%CASQfh)48dA` zx4!~&8E_`T7wZcFygsBAtUlX?ux@1)Qu>2r?K}Ggq54QSFy1)&zK1E=u8NpPh5N80 z_{28^AH{XSW~FANM&37K-vldmT;`T`S7o>^`mPANd_KT)k?BF|cbrciD5}1=Y?z-j zo|5)tit^(@di4}#JWw&JO~ZcWSwR2T);2af$*{6*{bVHDg-cxR%T^>x3rTIiypta?3!TC911Y%h}R+L5le$4&5trPH1aWUvsek@l% zC*gnb@{P4o`(6|N<8MADj+sER$A2!=|11^!c`!&w%?dIJ`{!WL^g(m_`x)_A6ON5S zg#QoCq`$1cKNkHTOYWohAZW?8wFw4x7u1ovZhWIB+krY%6W8ZqmlUs#7%$U!f`mfV zd5SqtggZ#}YE4OSkQe9DZS{8#ovbt!Pt(-R*mG0)-*)1Tjnk-t%I| zypod#Pw&zaJDsEwUds1}3}5%RRW1?8^CYMK@G)`5qA?L;{(vC-`YC;{`@jCfr}T?- z9`ulWw1xTpQ2Af1i2)$=`XfZ+&q-te%Xb;Cv|SQ-Ox1?n2qgHos%j@RD4d>`?U29E zp5?I)2fE09sIz~WKFePM-rv%afbTl+zdygn>4WHX|DOJTNlX5dAoAzI|4K`~`ZX>2 z3&8w89s1E3kQ1~G`0c_2y(JLWp5W)L1L*sI?Kb|Ee1rg<#UnM0*cP|<;Fnd#?h+8d zeNI(e!Y5YX6mJKrmOi>ULuXi^w(%vZ`EZ=AOWWF{SNiY5;F?mg3p%375$&;bDd10< zhQ>N(%O<@qh;s1zCTZW*oGc*OBKERXD~+oY`~!@4iYp(#3cqo?bu3Eeo+-r0#V`qrCxT9DyT*e5VS-D1Hu^_<0TV zY>Lc&<@1)-~x zeI8Ln(bRKTPaoeK5s_?xx%(cR)BNm1nW$=W7@m44*e=)9t7(02f4Hp&d#Eai&p_-^ zajj;Gr(OcM<}68J?{M|AZBEI$XwI^vO%3$1bjEj~AYLCvZy z&WjiON}+{y7r&HFr3j{?_Qh5bdzVP-Ve zV@qOj%w6W}9Qxsle5X6?+MF0qY@GNKcH=5#IR8h1XwOf2dR!@i{V~nb zy6KdnN&#GlVnPFQ^Q!_f;AUS>k@ISL1UX)&WFJgidFL)tx?GL%%tnASn1usL50r0@ zAvrM93h@M9BlzDW9!ebm4lJD_w80IO#`>EeTW;T@XzN^}w(P|=di9sNx9kw6@(g+4 zK`Qm|CZtj{lZ+?j;Xe&1pGVMW&LKCQ?C}$IXla^|u3wPmr^?swF)D#vMg+D1c3FVFK?qYQ^j`=!rpu zo|^-UM~y0(CqG&(modKxBEF=DwYurG@4gZyN6sY!M21Ft+DPJl4AOAd63=2(tsgKU zUT)(-!R6}ROys)E5@TGSI}$;S4{9m2w+vvo6+e5P-$Q3;yh4K`X{zoDEY#mS z8B+Sxc|%EpM~1G&e_2)l{xX{d{AD)#OBnbI_Tm3C4E#}&W&v3Zu+jtBKp-Ok z$d&{I9R;yzKy<$UiMjOeDDa;clOMDGd!hZWGXp+W;Q#F-%L-bE8A0nh+oNL&2uJ{O zngE4tAjS#^2mHU8p#6Jh|Ad(QIFJ9B8Sv5K_kVHbdGv$>!2v-Q4IpD95Ye9zbjCp7 zd{B*>^?$(K{Tw&{LihrLI0qnDI_M<)J+bc(h{vnw?+%FnQlAC6RQ_M1|BhZk@Olu6 z=(ooU5MBwqaV{kgJTs@ zO#` z0P!QQduR(E7Shw4(~og)^V@-VRdh^`}AbPS$3)GE`@PV)DuGe ziy5^*KqhI|-{uz*Vy{EZJr#g7Wkww+aorJkLdcVTq>EndiJ6ut0MoeY_IS zDua(xHJRM$)o@jDLlA#_U1?HW%}1$E%uc&iupl#ZpgJn5cZkETHL#9E$lA3x?b*eM z9}D){6ka9?I@B{H-J=B`$^d_zG z>f)UEBf*K8wGy-5bVUDrj`447cutgXeO(tEQy8W zXFg5kr52D*GedYd0k=RB67~DaMN?8u0>3dv!Xa2AV&p~dNhpYOG`H>j99_?AGvtg4 zPL*|MwCFs1WdW0K*W9=iWFf58`ZOAoV`MyZ;OhY)4P3S}0xG$V>dMff1l!n@lr|XV zLQ}r+R1gALCUW)%omaCOR@sJy;^HE5?bX?~?zfb;5KFoXv^zjne1ox_9OlzB8UFy1 z_^#|2al*==4$IVO`o;zufP#mqC-Y%Kp|sEkTir9)(HuwN#e= zRm*cQxM%<#94Qpj*n90!d!cTD!fqr_Yois4tQu<<{g-dGIGmIaed1ic#1{BOe*k0Y zh6T4nFr|FXkgv}kM(1!n8qI6_juDs6;k{Mv=^X?FJ7WtX@WH-053DIJK9W3sAPP`~Nbog^@aQ<*cG*8_5o;~2) z;NxAds)o1X7VkuOHJ#}93Ebr`O@4-54vban?Q*m?a_2W`0m@m^m&^Hqi_9Dc)%GBL zgdMek2<{Rcwp6({<3x`ViWJ68Gftm5Id>qlb4hb-y9N@Mh&S~6M~nlMgt9a-O*`w5 z_uxt6wx6k>B#Xz%e?PF-BSBgLz*BjWkl9mRQ=cm*8EE51U91r0ER<_rGF>OkENF@hw40aZ65P1 z9`>Y&z1?~mbiTT9IA*Dv>@*dUcC!+dv$@$ZqMieAz|bJ%#8u_6k!EsjK1#29J8RmW zT3ZLCLG!R6UjQPH5I53z^ON4fhnG+jA6;!PX*$2c=Ez?yi_3PR*{`8#rm>OIp&rs+ zAB>B5AGTOwR{ju-|Ll^`iZ5g~rUFVaRD^+7bN%JPXD0(ZY{pmd&%Po#V}Rq?OnsFM z2uJ?NPf}0MVICJlHswA($rN~s6r1X^Ht4Yej9At_3V(A%rLn?$M;;ggz?JxLsSbBq zvhM?5=BM2>tgYus0xg7`L60#llKRCEUF}vPb)4sL#BHZ!O@Iul5Na$=6 z3w#2J{f5u`7M6qJlFP~mNyx?nkzGx#%A2u6M#urbrwk%YM@?=+gwLs$G||4-9-iTN zj%yha?5Lb@m6#gW2pT2VcSSQV9BFAG;6y#9YS@<&PCuuJ-Soy`ofIVpj-GRl%*tTs zu;#2Ul=)-?W@z2F?RhJu1|gTb<;TJGQlM3Y8pVgL?Ic_t!4v|XXc(&`e7yjR_$Py= z$yUe4VuJcAY~7B*(S8=YPrSiv*+e*7`!DPp?-QoKNiJQmePxiwCXoyaD|WQGg!4uT zA&70}5yaA{vwx!JZW`O$N?H|)7N+bq4Og8$_rkEtNHQqub;0dZzecojk~C;oU&P-J2C9n#3AdCK&=%9`^E60E2bpF}p_Q%mIAR)^m zX72Z0GuvYms_~zt=)de|e<>OLLYMt{a}4S){&zbXsFd^_5b#)w`d4=78Q>S~y|kf~ zv4aVyZH=And!t%b6g04}qIda@O3^bX2CU}|_ynKnM<*x!0}A6j#hAH8E|KV{t|XEg zGRzMO@duub1zRu>IGlkeS$6UMgIPzJ8Oh71Uc#~IN{5l@Oq%iP)5eXT$k)zhzuYT1 zIw2I?Uxv(*_|v==_HSu%J=^rKpGqjjGFD-S*{nBd9b>2aZu)YyHA&Xb-k9k?Aa#6D-2#|? zlXIqWP}VG`)UPmMSxH|ultnKoN@A}01Uf+RH8WlK)a0g(R=K27Rpx5zvd2!wc`?wr ze0T(5gqjPnQkoOkJ-O#RXw^FBIQS4A;^`mLo?SFS7uZ^25zoB&aDsV7?NmssK{fhB zD<1JpP~N>0tn)U1uZ0+1rE*nfaunW7`tn-vK7cU3YBJ-VaGz^V)q34<-99SEKOPj z=Wu8F>6$a+_FVQ-R=E#}4v63<_51G^u$-*6IkrWjFD@Sd1nRSRC25m)_t9DUmf1y3 zSMATXP4smS&%Cx82?*w1@?qqMD1ER(=|P`g1h*p68BA(J@{65K(icfQCkkV!T6L|R zJ)+YET4XuBU-lm1WOycJ?z_=oTR=CD>g+7r(`IHbC8Dx5V_?K$RxI@V+hTrKqb<<~ z)6{yWxz|p!i$fKw(}Ca?8k&+O=1T13Dz~gN>KY;j7GU$Wba}0KJM)(EvqoQy(xzE2 zn&7+kN=o$o)7KAG6<<`fesxT%H%CbMc*x+?1pM~SRK^tvZJeWm8!nSSR6m#u~t%UVW|; z1_E;le6<9iaeDA!)z$ny<3_eZMr`v0v zu|jU0%|y;1@;Z}kOYQO0GH$^u9rrAcu;yp_M9fW~=V+v!To5P?5~d&EKX=3Y;s`%A zih*cC@3tEhU4tsj4`72+e9f!vJi|ak(PJ(Pi?Byfew|cl_(Vx3wASLQ{$7WxG;jw7 zAAT!U+0QY8%e*Z%rM_57tH$`ryTAZ>Yd^!TAXyH?bQpKkhO!In z>B&e~GxCdB{-#!fEKV4R;8iA0JuxZ%24fzMvM19V$BaX!Ohy*Of?&gXPViEK3Xuq6 zcoL3oRarbmfd-}Wae0Izs+EK>=D@1Wu-&6}VL;Yx@6~4QJDH}YSG9o@t8FrFI7&Y&0pb7|9=VjUU27?j4hi1j0 zjcy3zW)w}rDM=D-N&O;ZzytYQL7~BF0Cxvn>SIqJzNKV=7pBv=4R8`$S{VosMqZ1J ze_SyF#Jx5eMQucx6Or}N+XlV}qm;y<+ul+7?-iQoU&e|gY{^Pum24Aft%+44(hZ_b zvq_G|W#mX>rDrfxrH2T;nY|z!f9=peUc{t1mne?yp0B`;?%=(xq%Wo?m!zBnWbmR_ z*$Pi_Jdt=0mCBhFBiCoH3M`#!E;y{~464M+kLQ|L#|Yzi{HQ4r1p#k@x;rwu#gXfv z!^jpk8PSSUd&H5|z)9iN6lykgfwZAA`lNwnUg3W9q2a0tE3q?upFZP>h# z7W@Qey{J^n=DkWiNgFsX( zY8lPg5J4`0)*?&We2ZF`x+#LJ=8X+HUPt}DE)FtP>5h)-1kDf?Hey<+^vc_c|3$0_@XX|l+Or3M-?Dmh~e2~*-OgWIuJ$O5Ol zV*Ql69SVzU3*v1@c~3Z76wks2C3*}@_pw{6y#oU9GIaKgh@SGuX&lXN&? z_0hO^^-0p3{4)%~=n?{%+Goi0Nz_J}DFVkK^wD0S*H9({b$A^+;irWt0?WXX{pdl# z*fbD68DAaJ08L$U2u&jIATa!xOlrL4GD)Q4ee^ddS+8#VTXIJ=`0Kdc<1csI?g4i< z5@ArjoQyG1y|%)NGO|mao1A*m)Xi{DGCiRn1Eqn#}9Ggz#jLYQh%?Q%=_WN-a^k`|hw z=??buGPqmm6qzr19pEGeh34vlS{;{*pZ1OfK&Jz$m=h;grC_Y;fJ<)nb- zvFKID3*w$R(84CF)uPhELft?&~yU(xsZ1#HPhJw zEEgV0XsCjXCt|}O#)i)Z zCg6m3(<&cl7pI1VZH}2_nTYH{)%(Fu<=~FN0cY<+CuH8y2bOp>`q4%<#(}=@D^xZrTt=v|rtLmj=pzM-Y}8?c-9ZC!9ZV6~^rPV? zRzvlMu=$W24T^)p!n0m==J20Qc;Fu40dop16|rC)TjS^wvjaWxro7IHUt7X)s>n;G5{r}sAxio zH*6a%Ep*Rl<&7lyH2xC+Z#?|SQOsAlym1b(+K|2(xGjU(V^T+oTs(h*(}WOXdEk}> z`6T>dQwJQo!Ug`f%IcB=%_2kIZzPVf)q^C1& zXJ0OGZ#>UB(;YWiK)npBWj{IH1H+Q$D+v0e0q}Z1#uH+_#Z$lGrn~LHpqj((SNBg* zAJ6>}3aZGm?q~;T;4}menikML@=o7zJo2t;`^l;Jwq4}iO=HV#1rRIG`vrVnNN}Z< zh_)%fW&hY)~924w4DZjiaSqp+xb8#!_G zbo^DmJ?)Xs(vEn)g$94#Id*ygZY5}q6~!`ajsxr#x?=%2-Erh%4}sZYGP(5LDfo>L zW@wE(X0DC*2ovjaxN@;_X02sWPFY)$2>~8Q*&*j2IwJz8)df4vkdUMg$bqqNNOQ)GC1MB>{CX4hKHmyr0A4O16r%J5N^d?hD+`B9LIOlK-Ui+ zTIE93uBtL`e+cL&P+p)CpN2#UUfIC33w!iQw^!=g`!PBbZ`49YMaSwsK*0ICCI1+V(`CRe8Fa^WJX=% zkYII@N(ZMN2+*sp!%kG8j)HPNx>M*$B@^tBv1247P8P~lWoJ%kPC7s#J#cwn`KgA+ z8T6(VQ7yt(Ag>9^uzgC5zeaZ&gFlDQeCr8iJAT=hO?^n3ElFLEh5B5v@SRxdxU7!- zdqf_I_ljx2__WE20ftLYgN#~_Bc>c_Te(;*;YBmJ7$Ib@#oX);4(Y@KdnH_UqS;BqGW=kZ8@PjKsP9 z2JpQ{-;gE!!$5Titi`jP;8!WaO^0=vLE#Ekf~H}PjmHTC?qiokGPU7X0q+)X`Q@W# z&5e`30xx_KLQ0AR^2OErohaVTtqcQ9W)*0Vz{9DP<}(sVK0hv-z8KM$_^^7sDqZ69 zv`(@~x`$q8b&jUhvO~f1=*OI_c1oeN$LXbU?#RXWPXeTAfwSR*z4`33l;Nk4Mqvw9 z=e1@@bExd^vD1LV&C-(Yz*nzpeaV8TR=bht$rNgJHwy_=b zR_?KD3MS2qQ!$cB8St z#}$yHRzF^XM8R1TM&p@9X(l+b3Or^ z4;40!%BtdveBzQ;Z$q1DQ0rs}54bcWOkIlhsqmf!#aUGO2p|aP@Q^rRG|MSZ(T9yi zkrTMS9LqR%Jg+P;!xPa%Qz>JlVlqnFD9TvW;r;?+gw`#lOR-9qU`yF)$wSrB&iUmS zfC&r7^Ql2Bk#c&@Dj?Bb0=vP$!(jrrNwYM*boNfEda)$aqs! z-=rQSAkOcW*F3j{@W`T_xXC~q;0aGPTG3@n6{^EeCTczF7gG8r+`Lrc&jYCwt_$`R;|xSr5kg9 zpmnJa-QCAbZYdKTK82UXZR;=3pXfyHSDnlju8xIE5A?ePq&KBz-gK>>uz9{4L4?*nrjKh=FMX$ZQVhmOo%zPWdn$tv2EL6Pst*Xpr@W@O zQB8Y3rHDFUyQK2hA;tYzig^VJZHf69F0E7Pdyi{I@Q23?RouU+UxnPEq) zl5*X@T>k0)_P%M*x_9aT5U6hM&VD?RJMs98MT%9JHXKfB&Aei!xj*dh?v4B)akSMG zZ%SoS$z2pW%!QQJ2B@f}k$DERNImA{&g>hbjcSEJgrdaAPy;*X!U$)1Q4CS}B z5YU##Nq7hw%izv=L(8+(3|8D-w4c$PN)nVAe~{QTIg}~bbh}Bs-ve^*fGAbjR;Fs9EF(Nbe1EJ+3zpmr#< z7&*V$Lgbye&DU5g)aNd1t12WPzJ`%QYs5y2aB`10)IRcwU+iWv|6GT%Ve^(m+Qjx% zRc5ez2j){co-!0qBOl-mGIQ_qVX=wvhWxnufVMYvRUaR`Q|EF&^s4kOpb!y}XSKhN zZAyYGgZE-Te~RHUBTET|K*`dB0KQ&G6ldU*D4mvcvGBM`buM3f*#z6_s3NSt%z8y{u7&0h3{ zzGoypRSMMHE1r2LXUS~EVrfZ|N!v^{O&0ycq;c(ul)5{|A}w6KX@{gexQQ>8;_=<_ zH!^r?J~x-L9-ojY)mN52yQkoHIDP<|(P;bK(**Fyq}N=`AtU>@k-{7qm~eAOUWHBsAl>07z zm+0aggQtakn4UaIB_qx4_yPB>6s-MyV_{sv*lSfUMtx19>LoA`d#VWE9i4teulELW z<9FNcg=xP*787{NF&aR+`sO3SldbLz?)~cxw577lk4>)Jo+taRm$tXNv0Fukh-6l@ z=ue^5t|8z@=zEoUp1E4RkFes8JzZCU?LvvCA(1f81HirK*|OTEc_GxED0Ex!3O5YB zK+Rx573pqfmPjP_!%?*CX9@-c!jB?^Kn)gXQ5K^r!U!Gph6SuKl`@-XeD$vi9|*Lz zH*DMoP8c#z>>)J)BYmg*W!UCAI@#DRNZ+)@i?c$bpIV^>RC6a_vqK$!>FlGyXH}<6 z&-89U)O*n_wyyY$uIF`qC|hJWd_-J1Hnia9O&h(kXG1n(tPQIItBO1fbomSK6M^;L zt{^5SXzLalq-pln;mH(N!mv}`4i^npLtNtx+0vkENq?F2udtW0}PXe=_fI1WeH+u=@*q~+f6{Qez#5(E~I_hf-c-k00N ztxPm3le%A@>Rey?bTJ}~v8DEGtd&LrpH&`oGKlix`@ zI@%nx05sfAbCQW>wGC8WgjIhKxz&YKeuK$jc8C}WTG>`GflMommp9FghqUEvw=sE& zjz2@CCdynWZ7FU(mGSK!a^yjjZlV7RC_0zCq6M5t{`-0(ri#PGI@vH{GEk>7p>S^7 zK~Iopc_`7-E;L-78rUQS!IhvqE(_^>Kd>i7lKUGX!i0xk67rYy{lTe2VBax%uX0qB zgP~Kli3kfwUzWuj5lMsL%s|&N_3?sfphAT481_F0o9B3faxig->zH)55lV#IdmrIG z{QT_F@`~9u?^rg6t8*8GX&Q6B^B6}~+P+2f zYIX6?uzkB2ixxyq>w*TrH4>Y|aUslNovUGl+3D)1JnaLEKtEJk^h_@uFdO`aqP5)~ zm0wnWf}Z|S180}uHXH5@)r6^2pcTGg0#k=+zw`FF?H5t6(RWrKR^A)|(G;%plZz_I!~{IcW(yXI6#!puPSBIK&ZaDG~jX=E>Sy0fJ0}g z*Q$;$@JPF4;`mri1N3}-CVKLCkrc6eZxtCh2acE2#uvFS#$j6f?`SKTnFUrilnm5M z00?LF=Zd{=XHFDR;)=k~bPO=Ndl86IoF<5katA#dCdO<&B8?GTXR{23ejO&$_I;nk zE{#==gzMrrnd}gsJiid3Uhab3B+x~kw~VDIAfo?HO=!6RIGCuKjX=C@Y&uDh9Nm}| zeSFFDAkF!z{X;Wl9`}NPp#ss?XUiZnQQm?+J8ng^-OOxk4izL6l_-jAf{;c-ak-R& zaIFwnNnSL+&;7kh5>Ctu#MCAQxG6Rt6gJoI9IIh^~q2gS+s&DvaUQ|ahvsRn~0z{ML{PP%Oj{w6>d9dZI*KKX?d z0%7)X6C<(lYvT*oIK;f&&~;tHNn(n~klT^|V%~u4y+5_aqcjJ?fi#>)@2v1UzH z3*Fkt+Y7GC)WZl4O{0cRK@9Y9pXAs6R78m7IV>~@TZ@1%p+Xbb;`sAD8>s?MIw$UqOU+Y4wC_ThF z>#AqTCBT7m7rEf)cnwBp+x^6=Mm#|&EFcc+3`*VLu~ou!Xet#DIyuWs;v?&~g3L?K zozunQ4M*srB;xs#R_w3e6b1v~4y@07uzJXMMVzPiIm;ZxN7qmMqqhp_=P$Z1M@(~11`*RNYBaEF>F z4+0EVdy6lZBdnL2Zok5|m<)juFuO5~UN4 zvFQ^=TxlnIxL!;3**>WNVuLOkvOD-ixwRCK1*uqm(EQ~fA_k?JM3wr3DprqU*Hwno zr5mNFLS@Qx-&x`MlWvCevA6vd<@qdcBgW5O=vvIkMmoBw%Gy%yd6eNvfb}c2pHS9i zk_1FykRqR>wUtL7>kBSpV@qQR*agkLlo`_?Lv<)A3reaqBk@jZifyRAnUjE5z7%`` zd`dy*gl?Z|VJm|ai*|>EZmB&hpU#`)JoWiwvL6^g>cBf$IPh|5VPR}9?IY|+ExcMg ze)UrUHuS}oul{o1MxB^@!?g$_%XXg+ti{V_0^xYjKU1g$w6MU&wL<#e%Rp@-01^4Q z0<#dwc4fP1DS6+UY~Mt;qOI{ByP~%5w3x$?&XEkC(-&y ztGk5b%)>8`%@mp>*-0l?Td5`ob3HGxv}6tQc}j?{clIV>8CwO?6aOh?K_hBW-t`aNn?Bb9pm4*)#m%Ko09qfvJ6wuQ; zTWkf**i-PGIyzH;PpygQ@X)_NT-~xZVphcW| z&sT>BW0c_6oq3AZ!90^aSWDr-ewTN1*zFPYK}ba-vTZ)M@1BgV`9L`zcVlX_uAwUI z?mJzansvALV`X+ZOcjg;N*g8}9mrZwsa`C9QF>wvTVWhlHycwhb6G>p-IJHC$nv#I zv6F?|jQ~y^UmuO5B%b5+T`@n5742au%cV9e&y>#ZtrCD(RHi>MJ3)xF#~9%CA7X%i zGCKjkU^o9uqr~Iug1Qxi{@ktb%TE254gIfu4BtC;zaygnKOmXRjLeDcU653O+*J&}&whPzO67!L#e7 z&L*pu3LptrV5_1|)r+2HK>2pkuiq(5IkrBCX4xx^r3$D*slEdTQY5L)sbU-8ZYKKO z;7Ug`Gq%wXt9~HVt`g&Po28s%| z4o3?yN=L3U;68f){J8a&Py`IYl$cfzp36pdO+y zqkSMkNXGhr*pRPo#cfyT2C^qLNgYne9@_kCLN zc3aA&B+-5qsd@X63xvUxr?KpD&iWOXM{Rj|V^7sRa@lCMpz14zfmV?RzMqDBv{t&0 z-s6XGoW7>cs{&CNaulkHReSYF5eyeHx$)3a9XbzuJB8YB=V>dJ^fWsV8u{BPbErcV ziySY@Lwz9-WT4Cf_&Sy&wqQ_aLXSu_4P)BsOIi?p>53|KV!`dj1zcbkJDU+usDPc5 zSf4K>#0p3x-EjXu%JEOX%EHVBg4h1uTg3Sf8T}uR!wiBF zGX24@5oG)EkB%y{KOLKigPor7Pkl|lNi2UJ4RVqPfwvw#+d+QDzxPD3B|d!#j`P3i z=>KE;|NoIHcr@dF6q`J@MS+y^0JgvN`u}dE0(rv6a@vr90}_cHAa49iJzw4&d~0oOdgb<-C@*cejguAa8HUT*b*=qOPj<+7tQ1=G zQAlMlW_RJ|U~+wx#BEPpXloi5(e@mix7dQfHU-1a(iB6RTwW4vOae+LCq)ZwxQYI( z3@TZ)lD;?3Zrw0Y(`um#o8NRk*xj|=$sK}x3=}JrYx=G$QP*rP+ux;(%c(7&r+I{MFP(5KweA% zp*dqlNwD|oX?kmDFVpegilSeMiq5lb;kd|{6V_iGndxw=;lWy~6H?-N^2IIbD+@Qa zZppqoTZt7dw1a5@<|^SnyB8$E(jud_$Lhx4gI6uDd!i%s{OV)WIi&GkiZk28cANNL)CCLdYpmz#QQ11 zLv|q~FWL?%^Vyybod37Km_%D z>!YA`k_CE%mL5L(DlpPG)$ME{KHkPS7dQ7aILpzHc_B6^>&2j*XcI%7xU@J+@ewu zGC!E@TO=-cH@xf5v=LU1#Gyo690n@jQ7)-JCST69W$NE9S4|lviEO<@WD#7^_^7aKINZ|@uv>!H|q_z?9A5Jor7eq zP+gvGLh^7QdPfpkQfbw*T<1JTZOyN_l&5uE{EjPRA+;W)Qs%Sd-H4LzO zVqnwh;Pu9A;{*u|nu~jgW&bkI z7|v!x6`PGW%!mL zF-Rb9mi{tZH&NM79%Z2qwoD%_Lt{qXv^p`Qp%1mZ+z1g%*^ZgVoPtc8rF{17lLL_@ zUHIyZ`We$CdHz}csGz679##n99@Y-rV5TtU=Wk=C^tZ+%Hj?0oyUOhF=Vf#d6-e4X zu$o*ez?g9VH#g6t;N#r!p#SI!%ZUIN)R=VM3UjY!2eDGsXyAhSIN5P!(Ai`eLg@O7=W|_1ul#BRWikgwMtph$t!|KlxRiO^%VB#5FUY*9SZ;6X z=`I=Z^%JSKX3V2L^2BOiyZP-(6$bn7Iyu8x9tA3PPK#Uiuj<*dBf=oJd^06S#pi3k zOnFW!a78K!ztt`U0jvzYX83?nSO0YRwX+jlgejLtgTjKx+u+-Rr#Cc}WxV<5+?WtB z!!<|zCn8Dd?tqjl1!sJqX(HI=uKfq(uvdzRb}!)j__uMuk4SjID_+3$NfZn6zrs0# zA{+2xc6+t0o2m)a^Uq^x8a5v3J3hO^Nb?Z5?@KKGJMagT25F$(Cq~dIg}xDj*{p3C>?S zN6y5V6=Uv*H)z`!5pxqz(S_77ygs@E4>NBAtjlpyTUGBv@Vr+c}TC>>-`)xM1x%~hidLy03fcE<8@irBDga!&n@`~;-(lUKpZF|)Yl-( zQ!cf?t&VcmKxD4z-es8RSaFHpUH_Fb;H>V|R(Tkn(X)L0XY3eT!?hRb5&>hB1Pk9{ z!#*OE-3Mri2RysSZ%6d?oafNNxqlJ6I+w}KEGkbyZ{f@C5J{eJ4*?yVR!PCNH6RM~ z=T2Q0X*(?jPTVZNUwE0z>|%RZ|OZ_{qyER@YDukuYDs{u*i?dtNtlIpT=Yj34*HbcO}P1va4a2)cCe zTveRH{RMYk=;sOV5rH$5Qg^{G$&v$3JJ?7hOi)?S!09Px8VVfEM!%La%7jpdSFIo% z_BU`V#)Bi97BlKku0dbj*aGE`!oU_8nl#Y%$cb2lF1Kd6-C?uRFEz8cju3|VybzCC zh4`yruVylQ-1joQ+&|Che_VZTA8<2qz^K!qR#b3aSRu+8UfRC$0NyWFm-W-$6Yd9* z6~G=_0ZEJnVE@q!&!AvvZ|!KOZ)i^hU}ySIC7|E%1)#0pZ>{dX05*Q^vIhx+f9(oYTk!0*=OAlmu= zF?D8^$Ne*C6AMx~KT5-Y8vfVle{jivIca|%oSBK0o{i<7Qx^j1iGPze{5*GN7FK!| z5EGmUBw^+NIOsY8h5K**9Pa-xTK{qNi2kBS0Kv+B+F<`8Nce5H{i9090V-#9 zH-S^ce(RP2AFAT+xrT-W8}_Z@7_x%I{M=3p<28IKp?XDCPf{iLM5qA_9dYKZ#v_Q=I$)H~v!q`O|17AP9f|>%H{H;r~LI{G*TyLazM} zqghz!8UKVZ0a4t6|HE*Q)}Il?HTms={0>_F`!jhgLjP&%kNyIje{d%N{3v0AboPH^ z>Ha(%#zQHBcwN$x+?;eUymf63wfJ2qwz{f{6y5cJyiQ!cQbv39Ku?-e#| zSpErng0Z<9D{|*p<3~46g{jAK(WC+EIgh0-(8E*U!5aLqWLN6ML!>-3b?aSURldq} z>te)`j5beG*m+LS0J5X>fI!f$uZ|6qCFWF%{>`V>6a#T&+8uHEvP#koB*>SQN?B@C zYVr(X`rn|G)hr~2xqyS?PrSycO;aO!pdfRGM9dkMSi(HG9cn(g+OdQ{?jpl#$vnqf ziRsJ2ly1D^bvYS%Hqsw~4cUAC#pIITyjR(l=M75Vu$GBaar?KGi;w9YrVF~{-n;KN zV9LI^$d8WfYNMpRT7u(QHp!&xLRd$t#YGmc9IiYPpxUN=!LJN7uEK1|d*z==RpsYn6NCaG4&l+L`3jQ}i2 zEHp(jM3zAqzy6$^#^oi2cwY9Tqk_+52`*pk1T4Y0c{)&EDI+uTogqh|ii4ghRcBRD zK%AS`$Sx8gwgCSa#g06>1g3VuyYa{tmyH1qoF)6gK zM-Ox0_foP39A=QV)F-+==JI)e)<%dTXg%*`Bz=Bk**e+S z71FjgMWKzUG{r$MJSosq8dILcodU$fdJnXLOzUuYK$ni!?%ITxt&r`1$ef}9b|ICi z83GfGCU#dfUQ&p~O=<`i#?gFun-XC&cz^)vZ@mRPXtwJ=YN3e*=x|RoFIv&iY4x%U z;vw}v>gSukufNuYyrxAmpqH}BhxSD=x&2HCuWu|~^Pvd;yoEh?QM*kv!6eM)<2*2l zJ}zFkD9n^#YUcwpOKtf;pRh-fnE{P)lOa%#AE}YZLvfsPOGnJl-l{`=2yj?9C_|%2 zg`L{LA?jRBS+vY6usZkw7=On&}r7< z%qI&`(J$Epyuy~AQ*BegyU!aw*Y|Y(?m{*1G{?hba$@qp7(Z8Hq$C%4p3vRPU$k6N za_jQV1Gw47+j~GV`id4_N|>~|(QzAWRPP=69;PRRJZ0dWO%1|j+$3zAxRo}rdr56+ zw{EfUzk%pX!KwN$I;q*wiKnz_M8~G>NqdT8cN&ztdZsR zMbegt-rqJO(3S`QX6ASUMN%x#HtR>r>R)&1+<&BW{Bz0x{$8O$Z}MaGzZz2iLxJbu z{v)O1<^Qt8|2T|^uR^4U07;`jfgSOjtLor9@iD6cz(q-iq(WLvFQT_Bsw}aC<|?hx zdN$`??J}a;L`k7TQ|e3t6>AgWX(oVf9Jd4?ZyTlOAwAjDR-M;ad(xC!uRKS4n3Bo( zvol}GzuI(W8##Zh_dCO%%_aMqQa49;$9JM{CXJw**Jo7I*HDV>on})jYF_C0THO$j z(>T@LEP)k&jAlxxIR$FJW`%P8=o|S2w7{t?$5N+?3aJo)va(pg&}I4Yo+of zJMou^Zh1@6phtxvq3Le3j9(u{`a+l)$B(NqHv)*Ln%4`XeSF@Qzwx^AusZt;Hs^u_ zb_u&ul^n4^CKZ!v%8%`Z9TetMi|cc&1T@Ljs2|&o^#z>KSit*98`9Jo#*u?wf$;XX zAw-Up7$!th@rZB0;(QJ|mH-O&NCP2OOH7FR9^M+%GdqvnYLOA@OE-U+p;jyY!~6L;@!cqkGP?i!C9l zif(Q&HZX1VunR^^(!x^peVBU{g}5-x7>#A#z%Sy8Sw{DajsPBxc{L~4_4-SIm*^xI z+Hg8Ud0KbUVz2$L`OvZGRj040cwc}I7EcJ?fjLPGL+ST}+aV#Ao#Pf@LzUj6Wv_O!UJa~|a>j3!61?{0863+NDp!fjp2-*_MuL1fB#WTjs7?+9n? z4@VUmu?5?cm8CF424UWzCIFqRuB9xY!sWn`}`aqxeOK&gZJMkwc(w1P>VSM9*;y7zk;e zMwSmXiIzno^$C?zhE@E=5qg#p+_aUf1uNf**%PFR77eI#*Bh)rJMItnzGO)86-Ki$ z`wU+z=v4W3+7{bkgQDimYEmLF^mMiik(JY|H`qC(6qPeUPc}JNN}>ln)VL5Lf-b!} zt4<_jzqaw#+)!v0_54mKdc)|s$A+!R*NZJooH=t9zc>E$k{TxU+*!R=*6s1YX-^@8 zhWhgSaC*23~uPbK0pU+F5Kk!A)plbdmN ziv}@vtWZD)bt5$or-)~kDmjA`X4Di#p`_B&va)wQ2P6US&{r~!P{)>JS|8L+GfaOOJ z*^f|BuH;F4aN78+ZFg{#8vGpt2q4=+x(D?rW|6Ieue&cIN$#4qi`()>pI1pZqRY34 zGmn?2WxZV0&@QZ3BSC}Ig}i&7TAYd8kej|z`%O7fM|h`}=vD!)8(<|TT1-aA?zBX( zs3aSlP<1D?0=xt>NwbdYVo!^6h|ZHL`_@!KkBq>UJ*cluv@_z*n@R6>F@eyWr!Ypg zsg5*$;Qms)9c-8H9t=E5EPFJ*>BTz*oa67S+hOby&vvcB&$l zc#FpRhWzvqh5{QwtYMRlvb#WTl(mglM6y*&erNjYtS`8D_LT#BGRVKK)5r5rjSl0# z`nC{clnS+v9kT!Oy#-03`J@AZ5W#+iH7k43Hy5$Qq(l0>{5$(5sr1p3_c#K?%;n>s zO%#=v-CTUG^k6;=L_TELJAQXsrp$Nn4J0{y*^0E*$O8>aIlqpv<8`~ekevKbILv4&-|w9^(Xg(DU(%*lJ^Yg6`C73j*P za|+$|nkwKb+H&zfq}^8N0;?`kV31rJSZq|UW!htWVVU~BmMjgnrK_@JA z#a5L<;PMqr!ABP`+j);J*M6dD@}q_QWM~<6Ku91unqOK=64j1V|NX3v0NLW$NcmLX zE4;iI3{DtZ`P+(~J_~e+TP*t}Avwat#4Ch{8R<({Fi4CL0kYzaaUiN1dF|jrs(p_6 z04IG|7#~Gp+-n|rd~6sS^kwvjH1|}LvmC_^&u&tBMQZ*l6iz}xq{2Q{2=KG#k_GzG zuN_wH`rY_+$X;}j2OJBQ9@v;wvkRHbLsvM6tgL%-Nn0ufm1nFkKCh3DPIifrz3KZB zR1bMPIn^7JeHT-AI0K~EHawC*(s)^P@Ri_+&IO?zl#MZiZ`n1aCAFeA@9{Y>B`?1Vqz_Uo~CV8-?l z@j~6T6=h1%nMNomqv<@`oV3RJH&(lR4`EdO`I823?`5ZCia#^F`*;wf-AG)Q6^*kk zNoXha+*~y;eUu=jM8+QKV+Y3v0UllRig&0I%l%MHkVi(W7as!+E?oc6S7K5gIMwdokwJW7rrmD9FrV+4@ll8S3DsaSkvwBWv5R~e zWN&e(0(CDF$j2__R%q9cXM=aa75YhgF2}DlW@BdC(<%Qt zsf*tjE?U?9JL^kj=|;_VVn%JP`6}Fp$w``GUT??jxwLJg!R~RHq)a_cu)JzWy8BY$ z7L}pyz!{=q(ed=tPJUo^IW3gd@lqcuwzzQ@5{R^IC;}^L0}A6xMjI%R+wY@|skOaC zfPX9>dhV)82VnV$*EEjff&L2f4Ud!A zJgFymX#ovMW-ZQ@0z}c}oa44@7kB=h9qvw(MsuUXD9HkE*MN;*WnbBj>zxlF7A+W! z2M1329Oen{8CFAYArX2EM0at}dYHStSRid!9GJE;$(=V-jTv)iY)Asb=D$VnK(M}N zhB#*Lm_&+%!Sg!t__lzq02KYKfhtCpeXdtthMe70%B^@277I!h|eJ_1NlPLM5{;``*m>S0PsK zNSN(|b>O+zK~;iZF1%I|qSp_|5ESRL)z`syQ4B+^`3|v_xBe>6=Mso#F~FTVkPM*{ z4@VhF3ZPStp3Nc1@ zNToKK_dHxOfag!&V7enybBn{5-G|8{H^9zFK92+=U0x#JU2NOi5C;c(9*>{!AuAz- zBpwP$QClOH`{m~0^a8y@d*4gc&0a_f>uEGID&?^3qB#QCLkh&peXw(>bM=um1E(x{ zq|B)l>csq8tFzF+XdeQue98Q?#c7tWnHlN>8H{pD4b4A)vmdA3dNn818rBoPDr|;a z!yPPp6mg7ZYrUCN6YO};VWKlY-Y}dKClPsU?TEU@sW_TT1_d+=THn1sGflElZTkEm z#Iwz=9ZUPFjw=RX_?a=56x$>G+ZU6*)I$IaLgHXxS4MP_sr#P(;d_>>@QWnwv5N?b zl!9fei0|iLbhSSNZ>L9hh;gPr_WKOly`!pJzL?njNRQ&MWkX<7r@delA?)D&Ca+k1 zfF8#pP~3Q?ej^&F`El=^-7b3wDQ%=DZFI!Rrriw<=AsO&+##Qb_!s`WA==wc+zQ20 z*Qhx;#wm8Gbk_pSnDx8aiM~9QjBJD2W$XmyZRigY0UhQSTG)>t(P+IXl^l?zm}Wp<3+Xw^)WS0wI8lyW)fJekaaC9!jsk*}!iUz-O*0Q5q5 zMR=5}3)fk1lO=Z(am|uN+$2wtHQ4J=7{!D+WUc8S1*|O*g80X#$?c(HT8Q3Yg8QeIh3iMa8iwH&CbN3!Q$M3hmbBn_3f9tt?-Fe~J?AyA1-N12c-Gt3fUf8s`r zK{J=EQHFD(;92g5R?|MQp>Gx)DObl5hh!BNS>W>d3ZypU^KM0A*#fvciUdBDZ>3Sn z9k{HyYlg4dzX+~}{IZNZrsgaXf0N7$6XMrhJJkYZD?7i{b5x~Z+$qfIHF_r>;9B7k z`SPW^WRU%Z;^g%kZy1Zr9?@5v6P@J5!7<^K#%#+yEDENwTxJx#sc4pVhK71$&P8fs zN$u;69YD1ZvjuEahtUJ}Cha)En!dn^+z+B@THPP01uNRJN5w>X5U`voq&bCxGN+8$ z;9eT$)Wx1h2G2n)7wo8%JVJT8uwshiS}UpF#th=B>E+A^MH&?=Soy=m@R3K(9O1p} zkr^%RD8enl!^FHM>9@-by?f8Vb`p?(1pyb4;Q{pWCk->-Tg_p@{~+;gKjmYOyNkJi zJI9o+tPe>DzR%qY=z50BB(hwyA;8nkkOlb>jB8Ay`qvz{7zH*QUH=s?+`I}JD{;Py zE8>9yIsb@*b24oEIGc+)^?1mGg2gj7pZ3qjOT}jvxZ9nJZEUsmC>uLv$Dt@H=Fxap zmj1ZU5Gz?+g8wX1$yEv9AVD_EKVclp4;c3wdK>^cGyYqR`aj?zKr%@pNSg`*Yd;Uj ze+U}?%8vh1N&bf&2M4LHp|BtTTz|AgmaALXE{mf+R_Jw>m}nmp+b-?uS?1lswDwnERt=aWN>>{xZvw|O#;gU)nIwNe>My=;x5E(8Z$ zB0Hk3(OivZOUlkQQVYn3liM_ufjctM)!#{@1tGwk1E|hL&-O{m(}Uq~1l5HXKAoJX zxXYL0%Rj80K^J+-yec241FtoZnva4e93Kwa*^}aHPumrPdG%q9*5G_ZN@Z>oyTl@u zp0y9Fxjx~E$nH6uWhw58wR)RhX;&)s3h_Gt=63h%?J!0;KNDW0&jgIz4G;@ZYcSk7 z_zdI5#92liv|@*pUC6MSQt@)UCU(co_g1%&D3|cNBm6Z2n+D1I8Y-pMwD}vPQB&k} zyy$RCx6eSn-Ap4!S1{!@o8HIBJup#H2!AQr$I(ODT$_h6$mqoG4?MFeg z!dc@59=@1FcZ6D!mU8B7WUbB1uEV3Ooy64VyrSt4L^&QZC1{_tF{gNfszpUk0-5C1X95{$9kMgi|uq)vZ=Q~EAht->BL zz-|ye%(fY(+5d9-%_IgL5 z&I=#77epUb>(mcW;osm+!Pl2l)n?32tN21RTvO*9;v=O+0UT+MYklF3x3*Frr|?_NC^z1nB~t4%%^Ht|NdIBVumJ` zomZ$dG+!ihPm>xr`Q~)DoG5h7X9_EtS%-mSw6>0q)XPq+CHQqN`e?zIE-CE@YwBH_ zx!Ttp;3AU(a6|>X@CC-t-Z3FIzdLqTsx&E&VlEITiG*_?-*>(&N4z^-ZvB8+ z%D&aNci(#q6kTO}>G9P4x}Q*Ad*x&nTPkWa_Pls#`U>we`MugpcG4XiO1C==7sFIV zlS|j&IKI!<$-SJi#I4aMx`dB+7dyRY;lt-&-tuR6&m&OeC#(zGyLP}T1BR_E=k3G| zY_*hENr=8Vj3;nTvXuvw)-StONj}mYtqkZqtbH=H$oK? z4~m0qG4@)b0TWkLAr-Ewz3?^+Mj zOkA-kxnp{Tw`5Q8-Lt+Wt|`or{2kE4$>q|eoeqUDFvKAv>N{C3uB&}`(WSJiaA(z| zK4*Czz0#PCZ)O0t!Uw7v}XtS!s;(W!B=$7BM0H2BD~HW)z;x9{p9n8yvf|CV|(m z4Wc8F%<>J+nbhE4=E7s{W|%7*(6XS0-xtcnE3CgIRSvm-uk)p|G#lTC+(WY)NjVv+Wluhe&Z4Kx!1jOijkl9$;)LH1y8X>O!Dz8ZxK*f<^0 zXH44jePXp#(5oqNdHY$SWtDBazAqA|{GBloW)j0R@Vn)6rF5=O+JN^c9l$-;#jRUe z-)H-;`2*RGy?qnG5oD9| zp)uxFk~RK4M~JjZuacL4{Ogt#I@XRz%5D0AJJ?g*Q(IpZOi%MPT21lOJQR^L)Kz&Zjac@ z-07^UEj*Zy=)g=CSAf1j`a zE920yjWZb(!7P?TiEQ4P3p@!Ajj9^jtCfz=_}8Rx0bde;E#{wO9C_QnIFbR_Q_KNsEr;z2p$^9)zlVe7;&t|;Us2b)c0Fx$ z*=`o4oD&N_Lh*Qt5(`Jpk8lc=cvH)R?mgt*lXs%VK;Y}-<1eQ3bV={t3r1jMDrG~K zsC_rnd?c9+%uLcRia(E@OoG~}yaGdDsN<8=01CEjHPmD6C-25_6P(soJF-86i@@qf z`vm6!Kb7`;aew{h-s8iSNJ};XedlxY&1I>q~c$(C{z5n4trED&22ubuVj$-n#C_DmELloj5}&^Y%4sZ+!rV!gBV4 z^}+_AoU0KPkk#pJUX#p8`%*x?rD5oVCj`gyOSap3L^?{bds!!9bb|r$j#B*jxHTl0 zD0K`K!`U!o0>KeC*#iQc7J3Gf8{Q(h1Ol7}n4~C$^RbFyuN1P^$nomk;_K4yFi6vw z9xbS27b7CFTJIWo2h5h=_lt=n7LhEJyQwtVOK$`&dmT?Bv~UEz%D3yc_1xA%>7fz@ zD{*`7F(|&b=rGV@v@r1%ciZhW6zj^Ort4gR&(Zby!tr$O@iAgQ)K8Q3ne*u`zvvK> zRp~Cm1}~NXvS}j|Ib>|&b!iT771oecaKK_AhGC$vbxL;j;0mlMNzXX`CRX$olZnkO zL-IBjH3JXnRmr2J2idc=`-|EbLRfA7q`6bbRYj9fj^qMJaC)G55(5euY6#q<;e=W` zI40Dfnn6j=7`BTddY9a1x_UrSP9l6EKpN{o-*)-bJ%;?dFQ+ek+|mNPiM(k7O6ySH zidF*wg*TWq%o8m6$#5Y}=7Uh>TU>f-IVf%{sx^9QQR@0l!P7o`X@qbN)*gx4dTeDS znj%^oj9KqJ`i~8Et^b1fiv$%(UXsD2%DRhTv+T ziQbrYeMI0&DUV_6-4(X&M^?d9zanLOlg$1Gdl@zd_Tw2`?JI#O^R0tvVUfw@r9j8b zy$ba&iSKmET?^y0lDw%Z`&4nR$EQ)0_pnu^j3&1~WLtJZW<8=9lM?pd=o#+mY1>NPwx919AgtHQcS zo1T1?kyf8;FUQCcsI%{YhgRr7JyM_8;@{gByvSwNtN(hlxN0CTk;%sA=^Lijms>9t zqH+plpgh*Gxwy-{aHNL9x;5QU*(@=E?TvRR6#VV>#*C^*d*5m{P$Z}1b;Lte*GKLB z7`-kw>SfpL^?r%H2lF!JMOtzbih87zMx^csr55mQ%f_DSz_BI@04w5lEL-U|S?!xK zYF~*gO2iwZPIN}TSTrmQW(WEr$uTVAMK(h^0pd9eh21()h9i z@yecmn$1_h7<};bHpCPb&)kp!SWr`A}m_y8~n9Ze0n6;k&qw~I^N@VRj ziFHWAtFg7M4#G6RHyy!pxK_ObHx&;xAlj3S*rwL0e7z$Y{2N6*$qH@R4qL$lw2P?m zX+>ksu0kmC7Qd;0ZuH9lp{zLRtZRC)w(Gr$RaqOzI`y^bJ63O;bguo$YTwU}O^>2_!s3 zcqt!Jj{JbvYzaqlFWX*Q6_-H=CP}JkBneo>N;8zTgb_)2RN)yH_#Qu-ke1A{7U0%r zs%N_~voK;*7O12})`cM*>AhoTW8QA>t;iH zBl84rdFB`S3mAX_ZRinx^jd>jVL%(~ACiJ!&;aYtRv0nBA3?Hz(ZK_LiE;e_2S7ow z|9?S3yiY#fPf5Y=u4Lx~<-mbd+J9GWv-}Le{VVMF-DtKSO*6kqRRe&!2mVbDf+Pj; z(TE73R*!!LRQ$sB{d%JGSJlBE$4fsBk-!1Tv4!B6$^G!)W#Fz2jtJlo;NY1JE-%2v zV1XG(ikkt9aZ3XFUMXfQPy7X~*QHA2Q1-ir^yxH&H*e0rM1%0h&iszGi1^J@ShaA{ z7?FAF1=c6Ridtgy^pPty;!1D)2xAil0t0J`YfB;Yo8qW@Nc(OV0huE(a?vGoc^k3Y z9Cc!^UWl)Z$&Bshf!fhJ`#H6rnNxL4|wyNwzCS zsnbpSNS~uGJGo5GJiHs1(+8JsTP>&Cit%x+GS(In5Nx&sbnh45R1x+C_AqGQwZUdt z-W-W`9zSqcFX6nz8Kv%0a{Bf*?DdRyE(AVLj{umHB75*J50b6n549#M=TEifADODZ zK1e^aN0ff|ApNaB2=pd@d652tS`)zfNAMl(e}gOk{X60U*#3I9`L7TUE*92!Asm|I zc}#FLAczYmb<$~wVhJ;k@ljBrv`;seRa`{Y3A{O3_!JM&TA0vBFIl>=_axq1IfS7l zyz)gj;_7hX?X@Qai>yGW@E|nlte3ma4%nv@{{l{U>v4=Rt-!m^UAQ@Ji}$@-dKQ9e z;=-n(6xm}dr!c*+nCP+(5~-x$)3g}JnhUoEm}UQ#P5aW3M6h=|Phfk%#VieZ*8A;y zhS|OD8Z+{7i`Dml-|YhDZgH&p@Dr zEiB(}f{BNx$Wuf{2J;byZFskYW;88q1A7u)eVmLC_1xeNHMPSh1F?%(9o-^Nj>?2K z^WM_S2yC0XE6P?r_CbeeeP44C(7gi-6YE{0R%|fza3={qf@UI`yZ>|+heI=m19s62 z3({mAuIc$Z%$-8zs5253eS*^kyVhJ2e9&$-^jj_<0U5d1Xv|Y}rk<;=T(blTs990) z=#<3NT^&}rZP*rfw#Q0RErl*>PXHIFPB=SlaW<4zYitAe1)+@;LbYFAQJmaO-*xiv z*+A;dc9NQdDhxSvIt5#-&kR<@#Xbq8L_CIk->$G8`dSqK0C@ATmK8NdtQ`iWpqXeO zMUAo_h|5ndCWc+tbbOEa)}l`n_(9Ds(ExA5DDfMD8914!jA?cLgyx)}AR47hm_szd z)Pt;8SX9J>Lu%sfax{s*qb|)^JM}t1j|ex`Q>sCwZSw_u3$k&y!l12OjCrrRpHxyd zwH72;z4D_hN}xuV4Q<~O^N`jBT7qG+x=gNVPNU??C1jw(bEv`ee-*pFc*pfV0(fT z<-|g}UY@W42_Acq97GlT9oCIo0@2C3|lfzC=;VboL8z0D1V8Q3t&463$%uiTog zOyA=fUs_jeQCHQtgyVQlge>&BGDAUz+EL|_bKc{HY^6G@blN@9GN{e+5pi}7UwId* z*ukv5PSD5z0kpowHctA;3G;BoWpysRX&O2~RlhQ2fGfmS$=E~* z5GivEov?PN+P4>iBS|+sor-K@e-aX&hE>lbegfkdI#NXS~LR-)OT35d4{_x>#&j!2FCfuvP3l|=1G*BZf1cxj`8G>N+EDqK;%MYSyo@I-Z|^PerpeYtNfc}e@J z2g;?Ww(}Fxm8{PCBGOy?kD|#6oQ(ON#?qlHH-3f;uJe!#t`3lAVs_2L!Sg~U5J3NU zIQf2&%-O|{{9?LnRLRor1Ov3a_#&0`t}T1EtKggDn$(txwn)oe1v@gmLSx~@0*?MK zU0i8WoV1&Uka_njF2YVQ-g@n4@SZ~K<$k!NhOG4bEQD^o?+0D6C*pfF^NtvL*0NKh z==$r`$|Z+Wi?w`=VzF$MOoJAJ(jjoYe8yBw>FMlf`&#U+4DF0CBnx;AoJD9dzua2u zi;r~cRXFkT`#rM6`UD866w~*i=%LaN);w-}w_5}D85OsJc(E&B+X&RiO?emwd(%OR zrx}7Nc#;v*LcMKDXIQeaQ(_O&y`4NXum{qi^Kd&fq+j>OMG|u;yr%)^q^>}L?5}7# zF4gD0%z=iZEJ;xnJa`cW)H$0B6JL&xk3HbZY^qe9otio|x?Ljf1=jJC#+k^;pxk96 zIz7YW#WInKsYn=5phYF}yyj|o2uiYrs(Uzgp$VLf#f|7AjGVaG!0@HP($tkSI5Mt? zf|<#MJF1~C_?R?mOVl*@0CPY)F{8+_7D<@I1HOPguy_S0Wfs^66JGEs{|v%dBINIW zU`u*OzR?Xwq-iz{t&V~r$_#HqikH2*Yh))s!KLlrjzZzp;N|8mowb19lBW5|Pj(?} zflmixkbl9*ii%B{-kQc!N|ADR`}TNr$KkC~MR}rOa|m5p|4sOEYM>f;0e!b;)En$; z2?ksKbo>35p;Eu@tQWc5EWf6+sx)rCd_q*WM_jy#$gwfC;-;?SEEOs;&xTjC3Drq2 z1WrnFRg9h%R>qJRwm0ucjKVz@4Rw057k=YzcY(nBY7?T4;Q^3t~gy7q4N4{y2E`m1hsd)zOJe;1k5D# zb0367*ma1Jaz+nCvbm~1_r2!~KSX=9$~M|>Ot2RgADsV6jITtfmkq46;+OB^`_{o% zkTaMdWsCZ`wGH0{3Oy%}G0bojUa)JRxUBoViWDnK3bSXYeVih2k%`7)M#6+Jvv@ae zy;m;s~QN|>%qQkNpc(Eisr5Ec?YX*V6_6@U7UNk+;=J~)zlcGNNtNX zB++$2?TPnM*A!|7_*z;m*w&L}d_%&Dr)!-1v_qtVC^|!ZLH=z4n{eMGr(v+uDC|(* z0t;!t;&KaOhA2vme~!}23NNGLJR{nWeUyQR5IDMxV0`0pUjAB=krkUyl1uTCIoNTH zTb74D^(UuBVz@&X4iB4oB;^n`^3ik+zNftohsG1%DH%^nfGFW8T4B=B!n1&AZ>)7% z8<89e z$B*i4pDzZA@|L%^U-`(s8h=vA$4DhM5pTyaWH8L*VMu{^C&0P$+{jvgK|FgPF!q-s z1^Y)^IUqg;j|>}B8~yzR@duLq-RK{ZcP(?g zF+IM|1W{v*nYvxOln}i3X9qi5=V+B#S$ZUvj(`w8mNo(%@|v~V#zY=Fum143w%0d|rpgBQ*#s~DoSjLEhO+Mlb@d%6jLJcQ0x+>nWY8~ z5yJ|F^ZKP?NR3OOs>2Jb8<&1&X1vK=aN=*2eaw=E_6iz67>iCivWWW06f##i$&XB2 zs?p6*A^Iy6D&sBpN%zlor4(*x(7%bCnfKSDo5P*ZM9WKij&hV!t4-B3)-1 zN^=eH-T%Gn+Qkj2gdP|*hh9pDtYRIXajB1MK!&ds@s z;;v&QuwOZJF0<9%NI;CM?(3A((429aQ6`H+){LpDmID?0A2Lkk}ZNiy7kTiP5(bDD1qe#aue0K?+sdFZ?WC?o|is+jc0pJ~aFRg97-^xWRd^juk zO2~+|o0oNC7S7Tx6i8i*cEMK?V7g)BUu262yc^uVoW0roe!VK&FLw}?A((+T+Ozza7Jl*A%w>I*H*0gH(gh_LYS80s99CnGh!u5b7Xg7QM^Bh7jlkoPk4vRvM9 zpB4)SSX|_YS0=o|rn#cvxu-73ex<;Z4m3{#!>5qkyZ8hfndV}i>0XYO`#wbzDCD94 z-i6#A^d;Cn(o$LozaqQhfmioGoR5bw<9a7Ifg>6#F~XxWjw15P4?v$cA?0~w1iV^n zeSfcH?#|?1u|;VQgtWSe2*$2IqIngHQA6iG|5?CUb}|nCoB8TvsV^~=947TJ5|9Bl zDMv~vzE@)q_8}FXI4g9kuQN0H_8hkPE`p#&M%Jj()D(((G(tY6IO!N{7^4&Ay3XtC zebft!v&toJSWnyK23&kwkdu8o=S-Z!J2;q`WX04{ABPOlV>MqLI)0js@Q3(F+^xNU zwDQ~Uam;5M8(|q=2%+Sbw3lmw&}jJ2I>)~+WXbb>c~2G!ocyZ&1PM(OF#MO&@vq8} z3_b+@qjdZf_WeRCv4e<9P*%h5O2^-k060()Aw+ z4*xC*|J!g54rWFG$WQ3+1%-wE?~2CX{c~0pkZC0-z2e7cq`y`(K(hT1I39@J`qPy0 zm)`$h{3-sR!~Q6g|IW9C0M(*14a{UzS`c>IY=W05+f6>i5K1nM*2Nsq-*_dpsY4HR zZ8=R;T>H|l1$WY&z9YcM_=QP;o?oZU9=6Ovvi7l|MOLfH?o=7iD1#1Rul;jXAT zX-9Nf5~Vg#Dh8J&I*%RoQ(^Z|iPlYQL~B+TwP$L%s+!m=$K^M$afs{h_{x=Vjl|vK-5nH)Fs!)MIxA{r zN+Y9fILvl2`_)hqknQPKidskYMXGxSa1}04{JM;&OESnJ+lf6|1WzP(4C z4?J^iv`aA6(HrHE8MSYufekNZX5r)LQTLIaL@T$(lOQg*jeZamU7g~in|W{~0qF}T zDx6ZxR%H_{=9ohTAjKcg{gEuErKCcGa@H8&^PlD0u8x6 z4OZ)SzkI_Efesc4cpYNM7Y1uqJ{LrQu-78?h=%jS z@&sBDTib-PY7Af6TuUIz?)h2av+brDP%iSQn zkMgPxF|nUV<>**$wh4p3byL;Q&cJW5{fg8B2c}YrtC;50JBr+knq;*A2M)9hs3qu} z{61Du9Q*Y>d;nGw$;!5xd^Zoa@TZYf8*~GEwfNX8-jT9q1I8;ldg|=4hE^v> zWZ^Sr1zp&%*ZsL(nnr`K?e2%uHq(Piuyf$1Fa;^WGu|MlFNrdl>H<4FmsYKroO$!) zgq;O_Dy#V4Yt`_{dc2!IdO!S9;(`v!rMqYs!RCv5tJZO8vC;%h(#ACrR83GrD+9PI zB+!WaE%^S~>Gw_7iCuvtmA1voBenc?Ym}4<9lQI6HGvqxSUf%9dJPQ&XU~dZl`JBo zwdZD1iHYPQ@=ou(LjmoL^Fw&>y|y@=lX>FAhl@Lw$FRcUgG|U>7xEin|17f=Gwuh8 zh}KIrkKkbr%Xvr1ricQB5kVVCYS(*R`KxPd=3J&1K_=WU z5kGh=Y?SpX>+fGNBac1PF%MERzncV!jE<1hTS~o%>s|$Pdm#W>@5XsPz-E345XgDf zXys)r)rK|z0~Dv+JrlesB|*DkCwW4VcjD{)=lTyyH2+}%@y|eWz`p{`0ictg9|u?e z_ILvPJig3~0ovVr@6Zzl7xgKL66Ca182-+?1E#B+f2KtNFQCQopJYXEaF z137@Zr!0Y%)WU(qCr5AgF&F^ijp{=~XboZ>6o#Pby!LbMt z26|ZhuYJvkC#Dg>z1kNmGvU+g4;4D4F~m^G_(GK?8s<=SX%>UzkiNmQbjYYpz~h2h zF}gv(bw~l^G;Sd5SMG(?av=;0j+Ky;S2d< z*#QKQxakROJxBr(gk5Q;2^G5R+)3(|`8^AQN#3~j;%KWF@-8(L#_>^}oJfxf>wV(& zED~2}&7?UAgPG8uR;Xn&nLWj5A=ndN+~gu_|J>&BcEo;Dd&taEBxfLc^-Lj1-&K}d z&0H)X?^y7NYb4hskm#danqA^oQST0%Vzf<{FfeA}AhU7fKI&G{ z%xVM7%(%JFW>8^Zb5D3-NhJ2H5f@4``FkwHdWPfN`WM#q^LReSO}=HKc=_U2neSUE zzW{=L)cB4_Sb4@wXFc?6pdCC1Eyg$}QGHs+G$0ZP!#}zm&C(8q65P+SRUbLYX%xm8*&HCu!AjQ!t^=zhT_ttwD-H%sYc@N0W^?2FlC*-# zBsL24MqTBKGFYWX)*kn1EBHvApDx9kb9^J=U`Q5Zb_CW5cfq&XDU@LCs zgV5cJ?ltoQe!q)_#nqdq-98@VVWveJ9e>x)!6RafcMl|8_m(ADm$4$4(?h5Jj)bnK zk04oA1682fu)3eZy9DJoy)Mt%pf%)L!DgMkT?#El-S+|*B*&#Hwk9HaK!#))#)lIo z19wO8ni>fnH*Y_``sAsudc06&tho4mKrpGAA7}l}ffAl$+PVh?DmvmLo9yd)W-t_) za?jdvlb-7SxkY=)o`~u=rl{O5cY|W(+!iTUS+_Pxrb}8Gs~L|*wu8>)gZiJ6Q5JHDo8jRHss-imRvhihNSwCTfsXV# zho$`pkuUFq``uG>_1CKo-a{>skpDl*zA?Izb=^9)ZFFqgHaoU$d&Tb99ox2T+fF*_ zbkH4l@@4lv=iaSz@BRL+QSW$bRgJ28<}>Fr=VqR;9a~a~2ellcjekY(kkimN(z#b9 z2d$bRpz^g{&7j}{MyN^O2gr11kCPD?Uv0y5nY2VC$iU8a(I;j=K*NA_XoVvshc%Khwcg!w|B@t+7=(=cfx1S?^gf@NwB3c5NxI z&QKtHY|NKttv2NuJ>S!=$omzt7TfOGtkutLH^||B`%PCz&ttn&Lq?AH*oERDiI++! zvuSeI85Jd{0?{4-lAPY4N8?*|Az`=E9QLc%FcOiJY)?P?-ENM^(pTA|6?9Gt{7^WZ zo!cfLwlzv(dMZIVQCQ_7E09l9FBsCy;ZUSgktI%Ak{k0*25}{h7edd1MUSAcL-ndR zKieuL^9I{Lb|QJ|ob+Kq2}QaxQiQp)(&u1K+N7q9d-oOtbTmZ++1BZ9U4WpmxnMd` zHivLJY_FdX1gvez&YwJbMoZ@ro+*9%Ue$SZbK`O>$QaO(RO1xLF1YKF(s2lP122Z< zKEWu|x>5wCx^o<`I_q&jiVV4&#W9sm5D2K!A$ zl6tKO{@%+6fyH2d|H}RLMgD_d6Fb|#z}mk))_<_#_&tS>=ua@_*Khys{r&%1as1{2 z`0h;4@@^*hn}sI}6X!2e!QU)7-oYZ%|DP2H$6u{Deo52+eQLkKyLY|%e|H=I7w!ze z^ta;TpO&+|du6cxw-@VwS+TPJHH7fboBuCHhVS>_e~c0Q)4=9DA;iU;6#wp*;IW&U~^#2mJvbV0AOIT7Aaxi6c9{g#kGH6mDv*GvEQXh z?0@eY{~ppJ^$*40Uqf2h|4$(;iH^7EEWd8&KQxcuon7de-ktaUiq_eGk948>=UVR{ zuIKNg=)ZznQV+y{lY!M!J;i}#0VpOuQ{|Ua9?k}vUvN5-?Io~1+Rlkh?!{x)#K^*hz;8QITG^E z&-8DP^m{_bZ?*T|13K7$59m<-r_2A>-pe1eE13S5=Y#$C^osx8eU1ISOM#v$APJlS zNTxNx)2zTie73_(9F;7zyRLn{zxher(OA)>as0!oDpPlTi4gH^H-y_MVj$$&$W|0h zTS$iA$0sb;>@iO(;;4yk?~O|WPp(DnMA8y>xmc;vqv{io22f?3*&|D1!&m8uqc0#C zZ23eF%+WK2l-e^to|Z z3qTj$x_Wy=-4Av^BNq+NZdqy2Y}LQdl(~5J+ks&1nn{SBqqNh>+Ey%tkXIDj0GtUb z?%cQN$nqfQ=I}smMu6y4Y~~grnA%Ux4pnH zM0%|2VD9a!UWl?mq8Jkkg`}DR2O3#sLBtWgSOw0*HRId<%ud;ma)KZjJ4$PXyx^n< zG8neC(MePnA_ZXT{MbiC3F|7>4-gFFWZFGGYl9~OF39!nHBtMr$qD*c!eO=EzS%5_ zSCsOYN)!1CP#b1kfj*2vy?0*&%{gh}rzyoX7_!tq!F}To~JAo9T zTnOTV0EZ+Af=RSpt*GM>Nv{i`cdSR;XX6q{s)JHwB5_5V8j(+?l=(0g4G?pW{O~Cl zN>HC1ODBnQEpK%zp}mq1V6}{jW_Jk9)SY#CJWmN6HT>Y0a{+N7CCfRfz!C;NKxxx@ z`MuG)tIH5=97|fM&^Q(oCJ&kr*p)U*BH7p_p@0sZ z>=l?BYPGA%#0#?xDNcto3hi|zqJ`V@5(e!CI|;S;iuTzfQZV5ANyjFHLPDe;p9e~E zaj)CcBuNrA$o{9Jca>i&_gq2r0hQR5^xiCpd)AKR=xAA;TJ$|r9pI_iH*GQ&(!osd z3DjMaGaQ_J6(+l^3(r4bJO6R8uGt8IAV?$Y5>M~*=;&cbyk$EmRzE4x18(NvIu~`G z4fW$DzkxS=Q`ni*A&9wI$kiR2R4V3T0DKt8>{k)s6C}EFXU1+*^AOx@3W1Emt_7)s z_c-U|Ml6J+%@!3DEr6W~7V0;!@@b>nYLR<(ws3=9o~YCrEC-T65cU;1?l4e$@Ob%i zIvrXPItet|<_?~Oc>fSM2;%$9&sNPqk5Y?K<+gfN>y<#vN~PP(@iK=s>{gHd!7w&T z+jFVAp?x2k{3^e^SFpD@{t+wV4;GLRdM1qy@#vRa^45HA0RWNjXp9HI-ced%EJu?> zr+AE`pEw7Fmf@Yj2G=gDX*o6UH0~3OfvTKl)@|LTx^drT-kUbmV+y^2akusd9}q*IPT>tJCnG2gHzpRkdvQeiQVK(?dFC_| z+dV9gK-#p48an8e;AQqtvL&%^nJl{Ftr263YV&!sR>}Z#hz22X$gx-CUS(+9N?Y2t z5)k{a8wRC>c2^ifuQti@m@5IKmvmUXQuoq3} zbJ=G+aKJ_7A+ycKZOQsH*N_{&1VYdS{g|fTjxk{a7hzh1d~us2ck`;MBEFwymk>Z$ z(Qp+0M1yFURDqOKZS4N-OV_H=v-16^%lQZdllCS+qFW_?v?V}H0W)X*8Gg*;>QiVN zLaA74@ILb$t-fc~pssJ3xG)a5bZCRg@v$%v@_E2RPfnzONuPB5_l-QtXb~$qw5T56 zB73j3d;Xe;JA^k^Qe9?#X>&=)v{lP=N(lScmm;sUS7rAFCxDr|vk4bxecFZ;HIG7f zsv8aFf$`ws)NgX3c^m>8b7a7B#oHxYjfo z%7M|9A!Ckc*yci}*^|JXengYb{iFriM0A27a+SMT1DGPAC9CDS8=cOh>-wSjy!Z(~ z6G@R3mRLgd50DYP=Le%P=NT);6F-m3EJgZ|o-JOkCXPb~Nb1qnu1{w&l^m<$g`etS_1*n^ zp@?f6uA8<7wxGg1z0Q2RD_f}};4$(8y^#3xU<+9FmAeuIn@7s8XEUE@^aH=jK*3l8 zCeR2C`r)9L?6=|@NH#9hKS<-O(Ff<;68ck$Dni1b#qw<1pav=fK&jXE(~0rR0O*FFPpiP~NN8Hi`+&X07b8yCq*X%1?+K;rw^jM1bw!51#Lx9Ad zI^#a>!{edS$a&=(m#h>JrGiCz$q;k8NcUvh#gX$TmaZ};;VMvOLW>1&L}MAP(;IcY zoBZ_UW|Ud`^SKXLTuJbXG8TQW8$&kj{?MGv!Y%I-a_U47I z?`&)q_f z%;g2oIk^^nS4|>WFKE94dQ67`e8j^F{~-C0UB8=yRN98X8M>gkVP<&Zd~p3N7!6+U zY=mdOpP{Hf7PE&99Y)9_Ac?5O+d2U$&$u)7kjsYy2YX=RP=Zi>F*QA5T80wU7BTzN>Qh>*-dkpHc{P0|?tgsn#n;QSnjrTQC( z^aeZ)lb^!tA{#fYPvEYj{5`xU9W&dsO8{rpKo;XrAuXREpjYx3zlDc7L2wo)_Ia03 zzR0*HZOQgNUr2r23WC?vcNfUEb^p3r!Djub-L~v0u7GL9(S9`Lv?Zp*j`5YB#_7+&ng(g&lqve3(&jNvM5Pc+$O>_6se`Z2r ztc$Cy*&mODpHk0(+DLEv#w+BS>h&c0I8spKmfRd~5lFP}BpQSrXjw!P*5wRG#f!Si zI4ZBpA*}Ipd5`drnSxx0%>5cWIyTFL$LhYmlPV3=8XV-Gm6Pt1QUEg#O82umM zz^_((B9kWCy9>%M>h&Q{x>}S2i49WaX%B=ALTT^p|O8l{cq}3@vqeD zJL38?_4-fCS-F_#ng1arfSvuf#y!S=be#NiO2?mqIsO>g@e3aR3g%$vVE%1n9TkL` zF|pU18h~RRyU}|6{0d_%Fg7HOETt5C_c4KdrR)4?esBe(3lC%{Wu<>TK_TJb!O!=L z(0mf%1`srcM*P5@gXHvQj6|&0LD53Tq~bNwsRhYV8|IzO!9+-`r#*43q}lyog88Vm zsfLxu!th8HIkO2C?uH?Ip${cJGk!jIT15nU@c@YrQUQ!coi8J|Ee+})kvl(!N|OoU z$PLg=1iF9AArS=DG3#USzdFD0!-?F5|Ii~*&rxF*BZ5y6KORZJVd&Uxg^H6Vi)vK2 zQw6yzR@^tsuQECSL|a*opdp8X-C2{@A;ihPY-%3Y;l-cqd9`XR0DBy+#LoL*i33u) z9}m#gr)v!f*0!SuA`jf!+_hOT-I6s$h8yg|#KMK!GYxBC-=_YNf{jJxpqI-Qm(*u8PX1(ZszPfY*cd$@;!SDa0QgTrdPvDIVg2jRmmSZgyHGg*-V>NOW8S(5=E}yJXuR!(dIgJ^1KUYORkwj$C2iGP27&=b;)4!=0$Ym(MM;cYgqa zspUWU4RW8XZ~3pRsDpuQfNvhNv5 z1V5RH)K%5R#|6aurCCe@ zS=19IWL~KnmPC!}nuB5GyeFF=bCw%~hj|WXT9UlGkE zF&6Ooxs{5rA~tquPo(m|c7@mH0y5z=Qt36YmS_(=U@G$gA2&+I#9;&6q5uiVHgod zRqVe$=B$>Ach(h>D#eo)95|5!7-dc*>x$y!p8SN*eX%6vfCFfa$-AUZ&V|3*(q_-@ z)Gm=q)NW&I!(WLFU2ut*xCoa_^4819;Q9dI`$uk%LAi3rNI~au_$wH+o#bteWq(LA zYLNK{v{zubTj0;(?*r%0lnJS0-FcSp`9xUq10Yfh7iSgCsz+r-&fstX29KY?Ih5g- zgMBJtF0tQrLac-Y4^R-|d_<66r-|T)uboz&fJCkW(}K!KIX)i>$z_A$oJ5^L+NsOQ zSbs<-HU0*?OSe`!GabyC8o`NAaQY=92K4E(6Jx`KA>~*TZ$`3oXEZoseMv~@#>p}S z3}xp?9ve6eWBmx|xMqANfVgWHN2#FK{gRlvv~_G89G>M94~AnDO%f@|63DWokV%fQ zM+1Qz^D3^%5EP{@42W)YP}V%qit4Gu{s$!HmQhNPAPRa`SX1EZjFcXeqm4^xAVDX2 zVhoEqj0D}b8jsnksn$6~|6DOs)Z%3GIAc;;xlHa#2T18Jl`2=dfc+l|P0(E~7~xpy ziO`6NNxhh@@@+q$#f)~hvT$Vc_9c(|X+y=62iULPu;I`OY`ZNXogDjZJg&ISb~8F4 z6_SFMq*ZXx#cpgbw`XDajLa_y`cHJIS_qta>g1o2T6Ba}s=E>GLzfdfkGKPCZ3aKb zTcJU9g2G7c8?=#l1GpAVJ{ZHvuh2nrjC`lnayY|9m34y*GPer_kuWA;oM%sMl(6}N zj(ebPf0-E9)#T2kEvautLMQDsTH2hVh1VY$p{08C(>!%# zayF^*!2L$Qs0_{b@T~1m^Ok5LNG3{GNGa1Bs@p%27G{rDX8{)z8rf`OKfDJ`9=3UG zGPt-`6BI)2^JbAxzK@>zhKmITD&EsfuAp2|UTCApPK;)hd!Q)`cgCF3ik9EYhu$#{eu4s7dh6nRszGb>sQ&13D?Ac;HdM9;vk8R3`dyTaWFl$+&lf!%%|C zun-1)j8KHs=h>+?eGG#UEN=bE)HKeE7|MC4v5Sq2lo# z;QH+H;S#K(L~NA8ecrxNfgvEpqQ!xBa~rE*DybFjgei%fTZ(^Nfsw z&zZP5E?_wqtc)FZIQPiDQ+f136xSy74p9E+8 zhlsk3K||?Fx15NW<()8FbY}753WB8gIlcVRCIKP$7Gg-f^oTeN>eWDGw0ArRA=2f- zbmcL5EF-qwm0j3YbPV#MybTi77`q*G0LJcDJm+$@4))HMPEK85p``lWRAx1L*X2h0e6TV& zRdnZRFFCh%iN<>Ev~tkNVrP2}ZD}s6akFK%n&AeSpjLNfX}e{3y;hpRpVAxS+<*ktVmyem3I%)qp2ZvI6qC-qRxr`oM3TX@Z%i9p|lVt-?Jb z9Qvtm>-kLi-fKYMfh+mI+Jl4CO^;4;Rx|kQNR(Hx)#aal_l)B<*ni%RR*Vd(f%Z^`N~^gd4griu zyE>c4`@BzW)Y~nq8e8Q=YJNxX;GHPgxD4%}sUWl@Nhu)Erz)>Ldpwg4LHoLx{GsfC zElQTkr#b&gCcz<~L?Zcf!?kx_1DmvBh4F%*pPsB`@Cn=X^+QOWuYm~n6@Qh7e5={y(AN2p7J|uD^+KZxOU^|^Tk|p=TwvQTUJs^-N@D@|(EVBZ zVCXN=mDxY2)VUSNRB+gcBQq zH?Q2>{KI|3#fKBEP7q_bhj9fRWf`9C20N2N{dHb4(=MJwLLQ7{pv0R;#vL`CXU9XZ zl0;S0k>{9#P56w>ar@&hfQ@{OUpwjhPv+w}Sw!9b0PcuE$?|d!c)tGz@?7ZEa-8Y) z$}K~7n4Ah`#91^#%s|Q4C0);jmXbE2jgz)<597snBf=Zn+JBlXq3P?Bq{v1gFr$6Qp+nj>vg1!#lAQOUj@OV^xjN|uTppXOjY z%szwbe`F6!xfe~$; zzZ}fx@jWdftw9Pvjj_(5Zf+Mt@CI-PiQq9%&6nLDd6BJN!4cpwP65Z!?Z3n^D1d69+G8MTe%YT#1gL;K zcK3$i*!z&H}D4aZ|s-)4I3Dp`8TZiPsjh3A^1L3`ZwZ^gYg#?`k(xz|1n z>CbD)tBIOhcLDt^SwPO)!;|g2#U0#B*lbO%?WP-Tlwod9E1W#&xnR- z^yByz+B|__y1JEaj|n>%=au_&?n4MC`uHU4Nge31kz3>vW;L@2sAVMap#`b&W(|J;+Oe;$g~7sW^bqY^FhFa&iK4me{Uc2u)%DuR)8&@7~vUso6aRWH>}Z zh)&k3@|%}?QxK0JBk&16c5OCy9_B;H?nHb|O2BnMx)B6&DtXnd%(LheC!4!%RLx?E z438mjh%?cI=-4J=ldg)}dmkaj;?!vLy0gkzS2;YVYCP6f+dgc0rbfaE2D>4l;O2fZ zHUn2cAL4BVh@BI9nc+ohXx~$DGYF=?Z(z-h#yTN8AxX)`h|rb`Qe#L8v_9-z&J2xr z0HPH4b%Bv=T|DoN&2(r4)|tm|e=Zquw8&l=Tjz!%3$|#t_A`8}-J?o6*w^sHLyePR z-(h&;$OE@1?F;Sr^Mx?P)t{a?0a3PBf$iAbOjX_h=7yfVO^l}DwhZ48a&4|t>voz7 zqtrg=Bn_+hSuz3kW9Njm9g;-q!mT|dt22SQ7S0L3g! z8m~bLV`g7n~g^K;${zT2llmN;AB zC64&%YcFN)MCJUY)M-u3Z_xusoOONhqABoVlT+EBq8tJg`jM{8{6I7FC~~;*53`<$ z4nReq#!g7wrJ?A>&xmdztAnKrgf6~djS_PYAenvG2#k+F88;c9Djw7&9IH@^2{%Im z5XfX-RffX@lTVu^8++-;zk&QT2b(nQ1_LD}y6bGgwQ8DVdChmA#cAo|u2|t+KiCFK zT#AR~n;$d$79)`qNL=p47O*_!us)2PB11c_`?VB5+_^dwNkPIHYMb&R*j!KkqW+mIFJ9@*3pYU;`+JHQ;<#wf!Bg17~CdSKMz zt)1RcmW+X+ZfkBw4Qa?OG6f;^PWdEcq-Y}yz^Qf?z+C{6Q+E-P$J$6@0|Bcw%276z zC%VGh%Ivslpwgk*#l)Dc*(E#Zrc?+Ak+wp4#70RM{~>)^Z-ZP^{m{a${B$cUO2)|# z&e*iG@E^6(dK(T3!IWMS(&KIi8jj9DOy-Xmc6Z>xttEuOyUkb2*rWGVbc?e}4$@eF z@RVHBhJyf0K~aI_)**B}*xyTE$aD?0!6+nYdN*ZSrWwnW75%BVl30*@E-8uAd~I!y zkE7IZTBNqhb(>W0HM;b;v>f=N*T4u95xNt&lVy0u>9vJYVqdXZXAdJ=rcRQ>;UosQ zxPevS4Ha$LY?alf&R=ABj)%^hL7;;S$Ml@j6P5s-Y1cuYy67tSdfdsVqoB+r%R1tt z(6fSRf&v=vY*Q2PJ|tCpt+l5n24=~*y!=k2iz^F+@AKQLXc{F>d(=+d+Rm35Gswhrb0N>U_(3S2K4?Bk)vH#0 zweEWWDG8hxx$E@^_euUfnKB-A>G*0vO`wF{%?qEZOgfF_DGp8K$3dNvfri99r>WX| zfln3vl7dHIP1X;*rPhYEHEx|BO!!$w!U3j|&qoFy5+vuuNylq;-auVE!l+*unIoBm z!|D>BmNe*UH9sg&hfH;8P%x;C-*S~DrBEFLRFq24T$#6jdQlx=-j4Ad@G?7W#q?~S8n%R3 z@=Ah_FG0aLR(DN&5*>=i(zmu_?o3>q0i;RLsYCTa*F1{I1A~mKyWiLWAoBqFIn3xG zTBd>dUh*WCy~J}EjkAo{E2q@GbQ`OC)v+1Wp`dz2XOIulpF%$SYC6wcXZ%R}l;MqW zroLe((bqIl^5-oay_6Z2~HM=WI zR?Hm~%OH%9*ye*p^`=)PKpbk}&0q29Qkew-LPAr|O6mWK9bYW$xUJ)XQ*13Cq%9Zu9WCyE^ zG5cA|I|ZV#zOI)6A9y~tKs&X2lRLdY8w5?*-0#NA!7<#QOLE{AKz8~7bt?}V2 z*$PrAx6_Y;o5M53vJvDRXKN%4g;yR+RvjFA<%v~|lClG}Z*o1TtYA%EN}gumrSt$r zYam7Z1}`B`Bk){$CTl1a5ePbypa2<;veK`Q+8-gzkaB|qn>^FLOuDKF*l-e$g(Pyt zDw|=Ua=Y_?X&rGfsm_0Pv+6ny5cw*qG>@rGKvAb5`>gaRJa}vY{=%GVPi-FIaZxc- z#NT?W1_U##7O*(Kq`@hNZ|2A)BPR*4`5e~7t(6L1v`U);|IuNJpC5Oav&>XMs29j| z*04c=6fgiHm8!1Sdh51XFLlMpoZ!0FgM_@E)$HaLHs^_swOQez^JCYGP`$a7GOuHi z^ZUJu0Nlp|6`0z&4ef38MNw7{R00@zah^P$Y(xCqfd)ig8Lx06ZN#6hb^7gq>IrvP zRNI*OOpu1FiF&(<_%Gl4eGDDu`oFKJq$gRM&O$hk8;zyZM=~aZQ)7eP5f=;~jAxSk z@M(gDkP@)a6j;@{VzJzdv8t%rWvu)GjqSTi_^sRWT$3`dIy_m0&#~mi8K^si`^LJ3 z%7;$M)WLee%}eCsqr8GeS=>>rc`57R2hVwfDqHP#zLw4QK+sa1MH*_jKo4`MBY5Pb zp9W7ck(3f4;!u?``3cop#bIzxJv=;p%00%e-n!T z#+2_T`3_@Y-p}9{O2q#k=P7@Of1GT;!9P$AcFsgc9Lm%cH((pUiA|C6UZ&obz+KC# zEKJ4XncuVb%|SP(dy92?($rTi@6?A4flI(akod#oL7z)gv$BWn>8Qfeh)TOQXW*CR zZ~G@eK?BIIH1gr&Fa3=4&KvdH?7hyq84K0htCU<*IPYw>3zrZIa#Vt$p?q(WU*m9tiDHogvMG*?0uth6L`p{DONk%Xlz^uT>*xPc>D&r>isiSq% zZ7PHc^2uQlEbS>CSdbH9t*X5?0M>ZQPMcJt<1lqYHgOUc;sshv7$bnRdgmIN*J)4* z8H(oN%chDWMJa(zyL$R~*Q_#V)abfr@w{x|c9?Dw;&zV^+eMIp0x7YE#E`4VA4Nr&&;)Lh@eQd?Gj;^}zA zChj`sctBZb!lX^gOoYG;Lja*`u_}O1>I|r^+D4ZX>%MykRre;5 z7^r$g?sLMt#{7(hOMSCcE830e7gWJFXIrv`0%)*cz7b0t3y~|hb6YZJj_`m?aQ4u< zlHA?BP&q&aF5f12Wf!>EC4MYxmIxD?PInNTYkJH23||O7?URT@{Ise=c27Bkbs*S{ z`YaLph^|~IQlgWYe+#n9(pDcsq4Y$|w5vl-4gn?Di{9a%J0;=dITB%In4Fm4DpveoSB|&!=2!i191rK<#Qp;PkB7aU*-{u5*+D-FuMQ}L2@N%Q;*fv>u2_C3 z+X$uH_<$orec2Jej#}nb^x-I2jrfiWCEp{>uxO}g_*3G0HxBX}CNysN#uc+yoIT*! z3&k@T^s};{^y^z>XPP1B5jhtI8VUpq$yG5q+b#>!?7l_D;jT2HItP=uKn_nO31h+s z!EcO)n`%7e8|^Y5A)*HgWZ6u1(sK7iWWORcaaj-ur?b<~;}t3-ks&3+2djs}D55j# z6PX*6BPN_nxjd%DYlZ`}y`_}M-TDBIfr6c-J(+fjrWl5~`*Eo7_t3Oi32AqSkO4!w{pkOIh~8F~%;BCk5l0OVKv zgOE0^B|!g%oygL z^b~cI7%|EMl8Ehljk7nx#cWX>eIK`?Y3bzDuonE-Sg_I1cfY6S3d0EKT;V5t%&#`A zVfwaWTYl?z5|%rOTpUY+MbKvWNW;tkf8SOpS8i-U$ErIAD}i%de?mbflK6#OAaX+G zTyzykh&Lfj+qeKpjtqp(wKi!V?z|`;QFdq0pT&-}Pp*Vp5i?3DL-s;&O@)((ZYpdz z@dn5bIv#c5i-`8E#il%L}5v+%>)@m>*Eu7CmiA-gI}_<8nRY zT^Z{27%zr^5RXj(gMc&CQ45B!>LX~zphmt~^T_Nx7c_fIb4-4?=-HQ639jr_{Lm&q z@@9375e2meWj_>5DK11VmSLj4NXeGJYlmftZ#XNlA;Wt8(dhyK;ZcHED=$Ed_5s*B zsS1SrVtT7eAb3@4AYBxS+$n&5b&5AZq zDklOI3%uojHqP2PD^Hg$J}Ya{e!eOe2wb&d0Z5I}4z9(zz<=JtQ|325?Sr&_{iJW# z%pjiN{c0ovjtC_^WUnVTV*MRBC>qaPY^81vkbh>$D2TVvLTkWc1MiwDM-Zu$AqTN%L{j;?%7T~x6F{Dqj6){sK#!V#VFY3gRLk2u$w|* zFBR>(?gBG%HFEz#_hZzV`0GSYac3=)E8hESIY?(xV?@n3EH(V#E^v;+PeQ0vS0DTb zmGE2#4Hy)8p3Sf*4_s2+MZz$2Y{XAV?t&R61Mw2TzQ!HZ7UjLGc;T>;NME!j9>uKU zPGR?q1h@HjaYh}aUNs~2vsdi^Lw}iWj2rTrSMaC&t#BNuj>XY< zYE%MhhC=BnXVq4$ew?I=b$Fo>a>6UJyKVh*$`Ok_%E>g%-G_y;;u3T{J7mFGr6%2v z66%$JDFc%<aVhjtk^HS?!%S`RiC7=dXb5e=4#6%Eoa1 zn(6yjiT%In_XC2=krF%?&6!mctv2*@w6iobmnvjkC-|?lhbfB* zVj}DL+`f!#sB%;aR2OZMCYE5aby@yuR<>)xcG-5m zyOYmDOoRe}ysgGfykkY$UQfsvvcVhd42zNPYQ7w?$h2aky+{Xt}L{!QGGW zW#)cp%Vvq}N{2o>+i_bS6>x&0K@p+@<$NMZ*OPAhgxfE9T_1bG7?u)T{v{c zgj+9PBd`p#pAmJTDS0EW^J9?^W#gpv>`Un+lDbFK7^GJC1Bv@iPixm2;3T zXq}05THmI#C{Va%joT!Hp;R;S^k4jboZB1KK~Oy1Ne2`44}nIDQQrF0^+fjbPE1vH zKb@ZC6eMbD$;7UDl17MP6vsbjn(M4g9uHJ&5gUvw_yKi{01D1Iu`2g^AM#NLwII~o znK_xj>*WYAUK%WUtP>5c!RiZzCdov&S!Fi064V(|s9{55rUy41X1VLX7VIYp4>4hB zsNh#1Bn>g z-`qPd$yA9z0m5Ljgcm1J1?;91gZp&7Mhms7jy3!DbHmFarmKius@=cs=^Q;j-+Y(1 za6HNQ`s_!kh(Tuj0&l2)wQB2aKx9P}l@6`|i~wJHw?ue^d8vKx;g#mMkHcEI>l%iH7%CBBXq{$xyH4p{|v}T8GDo0+@e=032B~0d0IXfD>gZ$7h1a z^VW0j!{$)x1%?-~z@6m4)oT-JOhm?oR82nYi!xr(L_M}en~tj>fmi_bK@-;C&%70`daYuI1pstlsV^PT6jg)ysU)iak+k*=;UkAC zTev#*86tW_Hbv$S;@bp)GY^+h4S$j2Vt=p!K6ef5FwNpg?xBh6XS5>XA_wdzcKiISwXOw}!>Qxb;@2*_Axl?A@Dx$E(YjxG0jGG zlam@Kft=Im%;X9drLAg9NV+&!M=c~Mm100r{otjewJt6f+B0$ynhobh97^n$#|3Oh z4Ue-MjvNF=PloyEOMi2t63$xNWsHT_ENx<~P*DcPCh@E7tgdI%KTXMa(8GR;uvk&jA zn4vh)xCkoM^kXY(bLS3}gHr*m2v~RRnNk8!e_O`1&v<>S zc!srkZV1t~kb4DH&JU5zzQ=&TP#S+7CU9^1oiT&Hm4>!=^)5ui>%-l*5KpOPXmGFYixE7f(t#)pLFK zYS~)kV+yUo@bAgJd7XNqQ60pQeb;}^i}-!_vvi#Pma5nn7~tQ{uj(LrWJziQvp-+`g_|tZuu2 zNMcTZuz)Q7T5+tfT7zTcH;tj#3AiA?sALN3J;j?+3yidD*CT-gwlEtR&Ins^1^Z}< zd2xw-+v75Y@1d-|%o7ecn}(}Jxp>;&3@6$MrCPjY8r7$K)ci>$V||Lu^G#u>4CW)2 z78;u9X+Ov*G`Powe!L# zxTXUMWhYNTvf(k!9yli6Pa_^%xNf{&o&#*=!q3FA$|V>mfYjS(htJitGbkSF7c<6{_0Xv} zl~`70?3F|yqbA6vmXrrGjfNucXa0Guw*R4Y>wY?;a@BG33fdO2Ze4#G@pB*!T9>um z*)HaVqIP^c2N(t*wF&wo=eTSbj`XT#GMd1A^e}wHB!*JCNIH2A8Rc(R;WMALsb*UE zqVG2y#nsgi>fO0%%fdbG+#7`nn|GEveQKYGgmB&JYanOFho?)=4B!a;m@h{23qIZ0 z!^-iCob2cZ^)$oWK*VDj>W&-{w*CD5yD5R!YG3tBNF|38DEy z{f`(!*xu!+Kc6dF9D+G0b1+#{OKD}3yTZ_q*?>D~CWABC94RNV5t`8{gRB=Ba1Tf` z+FHUw31I+jG(7!rIw`8Rg?pAr$02QPeq;B1*~{s)!iC zkFgjy2(=74s66S^aGd8k{V4W@NmJFFTKp^PR>skux2BzzLw{-nb>Q_ITR67KXH4HEyL)uA)F`pfZ8nv%sbUA z#<>WiUoy+sBtKS^1XJi7;)6`%=rE%600z|DwtDkoOm9y3c~`E$Iep`n%+FVY1$1el zhcbMWn^v&V!=*%l9r}4|S1Rpw7gYZ^)eF0b)Vl*)%xZ2~b(4iWpnhVmD@ z#?JM-nojS3%Z$+gSNt)P6;QN7Hj%Xi;m%g>B0m6zeH-Hc%e;E{zX zP33lbx;63R>$5xIEyFp-jNL^6WbKU>Pk4m8>nH!E^B-J@w$gSNZ)W9L80lk0R;o^+Du)XSv-Sd*26B6?Vs8XLY_k5{gzZ+C!{VzBFNfn2GEoLw;P z>ldkHGEoSjj1%jvAF$WV&kmW+eZ!R27~Dv_S;WG6q*6jYPuoZH^^k(#vCD_%>+>8g z(EPcMU~26yR&QQFdDSL5FUzcb5EIma_r@-;m+JwT3v8i)_dNVD7_({r;{d zN!bMS(l5xn+CbWbFaFbJaIUe})>Gusnz(nCz%mWD>TC5nZ6~+vy=4%fIx6YO!9=el`Z#6q! z>p)MvDmewfcju!4NS1i0U371}sv6$a)K`io%n}f<8sw1om36%i*&MfGJ4;@JHK|-l z07J}nz9Wu*&LgQ820yKHxqm*~zs)1RG#$Wy^FDuZW8(f7&GFZ+Opaf_`!}2O|LDfV z!p+6N`D)3-&cV*W{F)ie%Jh@9dF4|$IT>EvkU0O}+?cq2cVpuIJ;~(NrRUc?qpqPz z%=}+yDj+lW?^ch09RBLY#QORX{y{Wx|Kx}MeO`VlkpDLNbrdr*3o$b*_v`mRjb=+V zG6Y~K{>`HIuSC_~X3D?OS%0-)`cJM)oJ=f2eaQemP~OQ@KnegC7?~Z%CTQ_V zDwB-_{m_yB$2T|M-h@G4_1=^ay0H|xA>p*8nWL&#W9XYNAN_+PGaf&ZmxxqPAM+$c zYQIlym!gm1>`XwAXu0A4)Y|&#(n%)>p?4=h!m@aTkXbr}LS8C7^rP-rEoNDkL#$pZSnJ$EM|h^>Og%#`~AzNH(okN*#v; z(y65?8=7gp=XW744p*mx>~}_Pi~5=}_e8)V9k{{0@`(_mgyN9p0=%O^Eca0r<&r#q9lawKs$WAD-wQ(}6bT}j3 z98CmU_17kQEwo4{`t(P&-lG`E2D+?A(2?T8$>E9#sgt$jZMt*l?|~l-!5c2fn$E>8 zSxtxP?-|PGeWH8{Z3+OIwQfx^VR$f-{^oL*&@1f+q{z(NxPqF67V($2 zr?ND=NPrngEpbZSJo8Ggg@ys@e-aQ<+fb)+e4XCbo616658wUv3#6x(J+OEZ!x~oLyuLuX8s*%5N;t+Hb~$g2thGHF z9<(=N^m&5thXzId$5hD4^b-x)B@UPnU@-jyR&g@@Pej!}U==6RZ?NiLJNkDB#eZ?L zdfo3Y{m6f_vjXE};z-?02M7Wc>@t~t%%+-ckWRl`a z3nDPZ6O(7(Y+CIWz`#j8aFGN}__*D!yWJS{r66(C$ekl2kEPmH zSPMy;<|(FeAVw>lG|m`tWzkRFTb@T{(ATF zn5xh5++P1w`o%zvMqJY**>K)a*$Lleu8V4+`z?)Q9*U|&cULrHPngj{0zZsexNcEN zp>9O`0L*N>MN5C99;g^8VmW!gWL|()(JB-YF1YcdViP}Gr>6f95DecB`Q|+e2Zc1C zPKR@pF4Ef};PjrMyv{6rIKr_U#34hXo=n+VE&O46lC-+o(`9N4!TT055d9En$-}#P z-J*>3pz#d3?$qpZIjm;lE4&6w=MWF%Vx|huEmpLsw5@v4;d`jGTd%?{ zRP9P71@i%zn2Z@kYqbev;}=^J%VS7HTc2@;n`brNc^=%HA?=y&Ibk`3v_aPGj>gB# z+fLrWzbvMX|KUbwPwX)v!C?BwJD-#3Uph`srr&j(oJ_yHL^)rr2mjYE(VzSMU*xcH zGBf`YNHKA9CH8nxC)y8y1I3Yj7psvk6=}ja*7h$gbJzN-oY-1`*DZ zqahC`yhE4B)XTQG;7qCYeap*sUEHeiMtCnHwb$0$9xqF9d?d*Ny4K=1?hr~{(S-`> z3p}$iGu8FeWA*y@5mQcs^(X$>%a`^0D~Z+hO^lQH)$?#7B%eUrfFI9~pY~?II+IpL zj?6hU?7x1!^*Q;TSzrIU@Ru!~;Tf8KyzR>M7Nj5Y4E+YY!s2?e$_G8cu*mVgLjW&n z{(9uR@U{EXC;O-K9+?H6KpCDM^>-+(XB!;rf|7Ex4Bb{1)DK{?lKYxi7Zd@DpgyhC zJxY379wBmz8I?x(K=%cc6u-}>^zGENRoG>S`5Yib(3H>?@dAq<@C$?*(9Fw8dHt=# zu13&7hEalfpN#h4ls{Y8j%@PynpgFkRQJk1j_`rFt^G}`y-dm|ZX4Kv}}iN6c7Z+%LMVUPee zSXao%XlXr%0cU5h8tG5wp|LK#Yw6AVe7-ecz6%xT=QTPe`PRUQ9wfWSOR)>u(rYG9 z(h`R|88m{9Y=s=MB7*keE6if(cYJbCoW`DmG_FTzqp-jLuw$3YffPbpA5X#($u=3| zfHP}UORG%!vY?MTgs>dsJql8h?LCuxCi~EP319p06o7zS2aR-;0b+RfFKM$F6%%k? zGp!qj&E2gn%;AXkS^Z*|MHOP(B9ZI%?gqr3hy%KGs&N=PL$)69tW9aU2{PJ*VKG#1 z&S!*w&Q4 zW!^%KIu(9sZDu7*iXed)NO1&Dpo$h>NE8d@73WuF9zA!>h2)qB?IXkWgoP3fB3vj7 z#`W6rB>QcAqG(wO^C1EJ>`#>zL)dC{F>Z*)K%`BTiGZWMAvdrvVyYU@3yK7*wJz&$ zY_5eYOR(9fX@duU%`t@;w3#Gh)e4nqQM^aI zYzW_<*)nyE6j6Cgqv|D9pybm7ey3Xxs@8kaX!G_m-?EI&1!1oI`uU@Mj3x~0h(&QX zSj>TiHengwO^v>}5|eJO6YGt|j-UVQ{FAVUfQZzjmmOgrPHUSXPA=SP9{WDPRfYtl zXJ8-ZeFRr@S#dlF;1I0}JPOv=j;s8wh&{G5)sn*ay#P7eM6}je#(Jb- zXq;N8=SKn?Gc+{_`Ftl|s`XER2Kq#6cI!fDsjsP1s~#CO@44!SK=Y?)7*QWwMSyh3 zL!fXg9VHOS3VgWoT$_wg4v_k5s%o4Uh;J+bI)VfK4HKir$paK$F|GKtBg)CZ_OYJo zs*?`FU}6N{MAu`1*Em}bmu?e|OGF>8!b-ol5ANLwyFZM+c%E&eubWrVKpBukf*4e( zw=%B?6<*Yo*!SEdHG)81-ztq~hXjVB!J5xMD#k$XgDjgo5e)N#S|#{!mVHnEQZSh7 zhGavuSU~l4KLj)0*ERa2CdeQ5Z7T;zbOv5%044}8d{!S}{04Ilbqr08-_)8tP{F>J z!h)0MOWRXMF3zFs-11(qM%qrLZjS<8mYlNrsdP!G37X=jg_PaFWs3dhO#+}_aYwU3 z%Ob-bmmnU&_!KcLX7+mDF@|upjwQ2{fUsKXeTW{jgUvm|Cw-|zp7Y>j5BT*@gT%}? zmTLB}_v3H+3k2SKy`ehq8W_nuijWSu|&tuhev)=si0h+)_s zuD}pk1*Pl5>|J}&gUq4IN%{+X=vAx7g1x&~3X1EewI|=hjmZK-J zR@ApVOxVTLNv@*;ijZ1OmCRamr(oFBuKi8(B#MXGDbxK`TZ-~}OPc#4(He(lc)JxL zgYd<2JRxo-7f4S!w$XIL!|Dk+i38G!(6BeslG!kqECB_N9!UX#Tr}CAvjBDxy)l=&ob*G4r@xJ>9ullAUtz}^$_2bmV`fMVPsNicG_ujk;`N`&+O znW6m)^~%Z2o|;$;$N*$CF_ZvsKrt0H+$R5dAyR9S0HheN8~@`%F#i-ADg5a={6;@> zzAAD4_W(4NI2nMA!a@9-3-eE1KH$}{3>-6+y$rw&3fNDzF9Q$(lY2GE8f!q&6K3fX z_i*3KKr;49^ii4<)}=Fsp?$VQWzh5Ky%%&Eh%w;4TJgbLN=YE$CrE3VBTU_&9}zfY|IKJwHgE)czZL@(P!Th zR?PiBKu;3%Gp^{F6R`xDl_M=+v3krzML$qKOuWc1%MBTMWmH1!lygru%B?b*3K`FPChLX z&muKZad|R}{EXIy@wtE-xg;hL`t zc-j3xgVvYReX|X7(FBTSW>}7Hy^)|s@2Zne@U%;iKj79(`pmHPc=oOu7ij3>VQiJs zC1;b!UDQ@)2)Bsh4-Vg;>PdvpK-(BHGGnkrTUgQPM+VU=E}wg09}Z}aoxAMK<=>eO zMa>YS;pAeo%lA?wEVbj0v6~x<%m7zO3eF;cN)&v%YHg}8_#l{WCXCr{3K-a(uw(AK3)-DB&h(RqAC9N) zE)MbfLWDL4LO(JQFu* zPOmSpf(<=|Rx_2P568+x>q=8)cuq71qy@%>hFioOpAtV8o9#7AAmQPJ-ZKgIgPo|o zh_B;Cs6Bk`z-!99JW0>bvl)ftgjdmh6aSqr;r!E~&i-NQh7Cw^w0*vbh^_tt(&iN&S$p(cK7vUq22UyENIGWq>!b)V z)Mdd)^}1G;J_Jiu!lGc<>cEL;AnKcw=iz0Mdoh*`jUS#vx!G#|iAhMi4Psh0NeaD! z%efg*F{MHnpM)OhdEB;I7MVG#Pnb9L3A5&+-VnAIsG?_7^Z6?*y7E;Ge>LqPV~Gc4 z=v?KlcejP7PEePPR^a|pIVrzTw68aQ5kj{!h8cD?7T~i>*I?f}7Zfl-2HaI%qVo4g zT`6wjh2_R@b6E~fB6P`bxP+>jHdu|J8A)Dj>Fi#KtG91LVl1h8+rqBbrXK}oqthh$ zq{|*Uy&?Ou5K2FaYkrJIX!QNwB#4A1!Fk;Z2hQp{dg(ZFWXZa87)+fy>qWQ-T@EC@ zGk(ZbNl8imH`r-G7_`uvQ()-_|SL%Ac~^Dzv3~nN6(@zB*FzHXZgS!#Le2Hp!wgDx4|5L=;*kn0$U-FbEAs z_AAD)<`h!-C#+N!$0ib`&54qK(fJ4zct{>R^wIK7G za5}s-KJK@)m^?>OHy-W0D9ZDE=Y;Z&D|;-+`STTwBBhs4pwPgBsz^4}^v=nzK+>C0 zRGJNsZ4?aYsE@SoDHpM-kU>WcL;du7Nr;Ktp$MOaEeF%Xk_bg)Gm5m(>purqSe1Ry zRB4mC4Yt!guov zxKqLRx*hC{fvzi8Sx~A3&mW{byH;u6>7>KzO`S3jV{qNzx#2OmERnE5NrdT3tcx-E zdO)+*`?EpX&(&efAVo0^MQT6&paiK*w2r_batdR+iRV)RE=U4&W`9VjaZk_F%&B~K zfsjUA91vAI%;`!LfVHJZzGn`ZObUC$dLofLGI*T-p-y3-kfDQiZ7xPjiAm65yLh;X zrJ0+u(0MH4yCF1@b)J_8C@kXvriGYJyiD}03hhZt z`aY#ye5d_b-y?=yFU*c>ZXrDoNv9ztK2SjA)+MALko*&9vkYSbu)_D59@Z5E##dKN z*v#S_(MS+W12an%c8AMJ@B4A;e3xBZ&((@_+S>p~1SW`gT_u7i&8$zsE*;k|4?VX< z^j=Ye1?xBN?`i}{jTTRv+thkG5(_UGgh3MSD8^QiLaHX$ui&=8joTV8l42R!6y#>~ z^GbIJ*{F6!^#YW0ULOJvw%B)DAmUyO%2d~!-K*L&KtL6Xk;Xs4%xmBa7zySpi1-H% zWMTg49xM7MH1j*8X8A?d|7X>CYJ}@+S?ecy{^OSa2H(G7Z2crs99f06|4 z;W=;-vV$OUd?ek5ipP6W1u3AhTKVefWqHT5WiBu}(S30NsYwS3OZ_HAqf=x>i!jtD zRyyc$;!+zO)j3WPU5W(*NwMt`>Cu%7o=Wzs8dnfvGH~Avr(=V3Hh&l$TPT7omF(IS z4E76GjBoOacXl~n-5vfUad96Y>na3i6cK0=w0NG$2RE7F^>WJj5gh1bmw68wROMe+ zeM5)wg&f|>w5w0)qB|$%EUmSX4*#f9CvXh=I>hI_lXmH0S=htzaxGYg^(icjc~>x7 zK9i|ow{6#|KZnL#!&@sVgH7Q>k87Kp!s!Hb_;-6^4c6;2`W1#u&EYDAQAB&TACmFX z)=tY0g`6{(PW##YAHsl*G-^&$mVHm<#WprgZ|d3KaQpP}-o@Xg)VAr3-qQXM95Lsr zRPsg47TqedODBcf7mr}@FQ<_rkU0#267o`)O)}mgI9}$Rwy8lou~6d@DoEK3KvHqK zeiNqa-3~6i_T?%HeL>)@#*p2y61I zl$5^VT0Ibn=HY4|Q{3je7v@y6nz^8=dd!cO?wFjIq34hT#cQKi_ZR98KQX`>1k=qn z=y@O!YI<7LAdk}mxq8nn-PIRtrw;+xMwjY#h-mfUXz`TwWbefYm2_X8cTzWZmT?`= zoYF6C{ zt!dD<=tJwlUQE#RWi{c2D9$$;nn3|wh z_5oe$!1h!Fn3$fA>|m{HR)=z>k?4{0MiA5u>H@b2%ult({PDlbJwMM)-6*AENQD;@j~@t@&b0PmaQ(5 z-eTUt#tmBx5n|XNcziez8m|6&C{4C1uVL$BXy8;S?to(WwYD&gn~2zfLi%Aei^Y(i zh&bkO7&tqn?dr3-tYYQ$nLaI4qO;9v%r1^Tz88hqgw!yO{qwMr+ve%F?vH&j7AU!` zN9mINj?aorIej0<8Vb`_&B4g9_Qze+$}Jfaj#=t7+V?-S!-1}Km~RXu$TfvRu}ikw6~cY{uxPXW zy{SGh&I$+KcvtAe%jWgX4eX_hpr{1H9^nodhrD+4U<;KBn_sDbi((dD*yj zbp~P@cne%;uAyP;eK*;y$d!5tVLp3!2qCVM#c+YZu@KuP-M9ZP3S*S?Xnf&}E*lJj zuujt(Q1D!bTuO~UbT#eUU+n8LPj`MC#I}$%?Nv>(ed`=lrNk}uvC~XuH*ciu-F04$ zqg#Z1E`x?+ARUw1-gK&mEf=t$8==MS(*f`c#kD?Oqag}h(VjzY@Pi;m{=~EGH@^hu z4(caPDYrLj{g+s(_+9E7zI`5I_DNMx<=yxGv6 z*k0+}bmCK;8hqUS$qG<9;U^&d)Z23yUFpgwsGsmw5d6%M%hvxx7WOWFSm6?ivwpNf z%>Aw>K-%S4`#+ z!#>J)?uN2pQMRCb>^()J9}<(s!a|E|82;M!9^VqHVWUYjL)XAgA=1#vzt1=ES4a? z;H*8b1|ExJKl{r*=^?AwPC=w89vGkWRsT@FZ=SmOT)o*=)qQ0Ha(!(tL7C2z&SRCQ zt4gQokB*ign#oHzQBF(=%cD#C25}qHBGv9+K8|UTX1SYdo{bzWopE{5@@z5^r#X2X zZ_>YVMpEEP1p_}o0fah&e?pqwCZrhu$~^xYYsT^`rr?i2^Ec@hC(B=B3jRQwrRF97 z%R%IiTmD3A?5uyGXaB*PFKDgETQVBHbSFo)CLbb(u{o1s@`l-NHH85Ss)b@B_zzj zn~ZMAcsMU99*u1$dsm`>>hW%9)|>sJ1Wx_IBOiR=6W1BYmy)rOu_lU)VqM(yFZ&aK zys>);$_r4tgF%O{?HidQdr_etp^?$n z%$7XFY|_c<2p&6ExAl3O+Q+?6-_9zbCRJn(7cGWk!_W2J>Fj(wj8@%1paXoV<|5o{ z%$*8I?E?g^VVU$%5lmL7qAqR-*+{|lVkY88T4ZQ@`40v7pUZ{A9^cft$#gVZwpGxA zBLPTls-G~22?H7HT|J_xaN(3uBdi&|zaeSuuw8L4nW(WOU#dUh{)XnIZAqNCIt7^ja;#c26?cMgq6nJ3)m9}`58>C8pU#E zcq9|l+wF6CI4}feztOA zlS|zeJT%IKbk_4GD#@NrGWTt1CNn3hW9Uo$58}3&lg`o` zou(y4vn+9-AnmnzYs}|W+xP&wLp(%=ZB(xG_0SI~uJN(ExSsD@^e4Z8>qx4KaqPu? zYS%W2Ubhy~sZId)V-*t`Hi4Fu%t6v}Od;($h0>lN+|YGP;Nw1~RxQV8GPsv&U8w~S z&6&d@X1z&=-)Ti*5lPUPhfT&So8m5qR#jg-jgt`^&@!$og&x$CiY{(X&spn%8| z_$({##7LEJp3?RkfC-IuDH|E2_-k@ z_QfHG;hg7MIGeAn8%YzYW^Wo4Nquup(4cpzPwqxS^-kiUp!x`^E$<>{mI!bc4hi$Y z3+%xk>;8g^bxDb*Cz!zD9-I=r!^|Yf4E62KT)9__sn57^_pwH$vhf=YRLFggF%JAPr9QYB&XEoY;=kGk@} z@B?0HeR#_0QaNLn{jz(f5DE!_I!96-DMj7isPAP&u1-?RkUd*rCz3QILcg|g) z4ts$nGHIT;WRJx$fZOlX%$BzmSQ0w{#!o2PGNM2S4qgxc-i$ua$_ZCDMg zh_Kw}OnjRz6Q+%x`l+@A!m_Ad%4gd*lTLE7CG*$O?6!T&mtv|Hr*1SXuRKewzB6~57T1P=M7!92zMN$m^2g# z2#iXhqz4*4dvh7l-*Ma1C!J|RzrAPl(ZMKB(PBH#m2`xsQ`#8q7ld9)aaZV5SWQj? z5}Py*h-WLV(}O*5BxnfZN@=`iaVzb0BtCkjDvlOA*_W6its&xk^6?8G4$ZI~!JeR} zM%~%Y-}0TyL{^*+#EMGs$G2iKZ!7+YrD_HuuLeivDfE1YvKbnzIGi`UKWgZ5!x7_HDKo`^WwU4QH=+v!RJNWsqw2fHvtwR~= zfK8q0(3KE2xopQ7c!YI*NJ8Iv5c;9u6QWP0`RZ}2YpuuSY*_2uuA;MPuOnZq0$2909m5c{twAxefq8mq^10+dlz ztKKEak2igEqLUF&scM~8#l$B0G0%$npt}RGW`P4h0A>z>z&}A0>uZVeRXE7{PjxKo zznYFXS$`E}|6%~i`HFb{Muc&`T5bQY>$WVvIJdv@V1F9@GrgJZm2k8Dz3GVa^{`%b zhyNja_iw=J|Ho3GoUExAuMcY~!U%u?C&qz0O8B>2^ zKIM-e^Ozh2R0&F#eC<+xU*x;}8c129=%|O`+xXEY2mzm9=pwWUTH;;#rSQhG9D~L; zyBwcR$Kg=1y5#T*V-G84)PvTjly$ftG(mEMM8{iHgmI1B-@-p*59&&8`CyP-N*!~- zfNYg`exWpopDYk)V9vvDr{Tu#eW&cUED*fro{j3uI?cDzojQ(c_y}v3SI9b{MZ)Ib)f4OoljlPES zk{}G3b}~kd(@bH7^;K7O< zyE2P?Y$;fk&&Rbs7&X*DEh6&9<95?eI^RsV%dMh-){aLOY65D7w2C(J0!ok znlWdxDwv$-q<15rF>vIl z>GSrgC>Es1BK0J}SbQkP1YyJ)XoYpPGE=c+bk{8~Q7fIYOb)t}Mqdm|Q6XXgbtt!- z;syB6jW0` z&8QH-BdW&2Tj7=tHGl`LYpCe`yYl9#c+p^vhVFwU zjQ-%yV4v1081iXG>Q(D;nAio!*m4b_iXL;BUN+2UqU>#*D2mubx0oik*QtRlr&b!} zZz={m4jY~7a&A7s2cVhp09@%ArFyl zPhEPcJ;GUp?6YE5`GI-MVJl3?`=VkCZ^g(4Swz^Zq)z*7+r^<|YVYQ{U^A{6gI>hi zrI#;n`IiUrX|8-GO-Yjm;ifot4a}`Q5#dZes#$z<`qtFwXr-k(lvcL(c{>uM+hJ{x zD4{mHhvFBrns((B&wR-j9u^ts(v(qGatId#(VBW`O#1yO7LP11%`Nom=AzqWulaNwp*phrB=v_7}QY=f`1si3{iIJmq0Zljp*% z6(ewy1_!k-dX;z|yDtjgvkb!R6EkW-34J>`v?=lS!^R($|8Q6qy_#dAYkbjUX&=NB zRqT?89z~hIHJtF381Y0p-Io$3!oq&VYz~uToPA{Sg}qd)LiM0|Hyh+-wK=~rz_w#+ zDfuPR>G+F4p)gm^KWAmOpTeBPeiK3rwtq^}Sbs^<#Qrcbv;8hf`?a5cH=O*bp)Iwi z6o5nhvjq0XO@A+erIM8YkAUn?o3n9oF|hxkXvO(@#II#1>i<-B`rG^VXYhSu4Lltf zC)+Pq)KtZ3z(*jD^|V;HJO^M<(&6UhL@x0v9$zpsQo3_L&smgSOs3`?UWe+(g<@@0X`B5QrBN7pjGMO`$xa!_*QYeVgX>~-} zteU>|*H}DBu|8gP=_?hE-A~^l zo5eL%;%t5Yp76s>!>x@?khRAsqbYE`gsE+da?bJeDZ4@1DjGW4_2uR6aY%>AvLI+4 znTrCQMsf=H7MT5XVaAl^&j{p&36kCE0gD17Ni?qEo9+eS7ND2qfA#LV_;ko_%lt;K ziG5};f{f*p;M~dcy_#wV2KuNl-JKwYt=R=gMX5{}xDh#+K|b;4dB&j+g2KKuE zAXf+}uXnBu92;TC%yG)0Zr|Okn4Gnrw^#+4#5NUhLI2g6va@%woUbVC$^R(}PKlyf z+^(>kTVR5@PSBPwwV6aZ~}pvr;X(>riY`f&;V-(Hb;j;J^WkI=+7dfW=(y z5V>f}Vd;lTyQ_)6LL%XEb*!Zic1J6hE%t8XM+eepYYJDFR7^)+L?{jx(m0z}1MaLh z1e^`P!c2CbEGM!GJmY8xx5-G_a}?^9biIjsdbuChv!*fc0uz3$9opiAbM4splDlmh z`33bM2*cTw?}fMT=s9!x?LngQ<5u;s(fBur_6ER|xkNIN^`R{q5y8eJc<08JJRYW55Kp`ju?u%reE z)a)|RWJDOs-C&g&F_b#7c%hFo9fiY2d|#Kox?ro{?;i#r0f9-bn~a1rWw*UJ4i>8r zqf6A(=A^S1;jC%G>^C^7Rx@$ib!m>ghS?!p82CA{wLv#YAL1Bl zA??fG-qZRnp_i|g*X4s3h-KMZvDZW8h$;mNNY$p~S=Bje2~X5MvJBH-5t)lNu|WK2 z{q#jgldGlNIlVUQL!Xa;OQZCaSRay8sT|wbs71UT6DachV;p~#TVS`X*1WMHumxYb z<%SnRK^&4T)uBQE1A}aO(n)v!)B{~XgZPLtc${mDeIlrzi3-6CHZROpwuA_F>b+zA z63cx+%#7tW+sfWD+f@lXUt1mX(gkEYxMZ`m4g;W4CF>pf(|OGRc2OT3VR0#?l$}Q$ z!vdnu`3OcW*Q5YL?*&K@MK>e>xMJPbNB3T5T1IY>u%cnUkIwFpU3z5udq9nAr_nN635_(U3ev2E;rek1dSQ*{(Zi z?SHrLC9BqSexY<$s??`T85wL+4tvI(>$!5!Y|gXRT2h(%af`v5NIR+(Vje69Q})PK zs#%x4_gtF(W1MMd^9d&R(@>u0dkIDG9<-B6%!?k+vDpumJT4e>+MM^6t_>Tlddc_n zI>Os%>SrkuSav6?@sDIyq0k=HdvP1u)aXoB17_!G>)6r#FzD$uZ%7`-UIMQPo zE1a&z*2)aii?%~X%LhvyN~SSWpR--(E9gzIe6M|Upxrsa7A~-y6piW9Ud3LoB8_xE zcm4AejCMVfp2Sx3YT*vN9)JsB9en4WL06 z+`;YJyOHeYqS62b)UK#MZnt8RL2?p2=m_?5*U=%YAP1p^wko3U*TN0`5Wp`ThD9qc z=~0NhBgXg0SieD{gXK8!pEgBYc?&D9|bAKDF{@O&6FWS8Zu+id6N-Q7FBmOxTZ@Nxe&eN(*X_gGP}#Z zE2mAADi{V(Fcn2&vb9{8e;2c0J(31YFqF|N;jL@_01-P=6}Dpkp7cMj6rZIko;vZufIcu&2c zAh@C}_yrR~Uj@B$7?Gg708cs3U#;K_vec&YZW0JgOwd4iPT0t1FY$5BsqSGU$$c_|5x=Ic7ySvc_%6&9sj%m-}TVk*x(Xv;K$ z7-9*h@$PJ{Db1jT_OSe%MFp|#C`^FzjExxZ2V2YC;sEf%==-WJxTrrg>B$KJ-^Ffm z_5d>wfTIJqqok?y^@32Hr7<)S^c|N0fIznw`*jaSX~aRq?{fA&*=h>%;N-r%RYu33 zNaS_HsSXqrl-cM=wpMd^(r`L--SByyZnc`T_cV|Y#?X9TRuI@GOnH#3aQ*puw1h= z->DVzu5rI+Yx|CIX1}>Ot>(Sb(ROFAn<`)Zbo#?FT}6z)gC|qFb-+Re-`r}ocl6q; zu_Wna%+hjXD99!1@FrsmhVk}!5zVF{jBLl(>H;W_uS)qlA_s%zWJ|400=#D0y^6Db z?-619*_t5wCp`XpYXaL}TND0NDBLIq;4=M!-?I9@ zuMe<9keYq}rWRS0G;=>$zWMU_aEkPFF`0|m>(Oyn^Kh~HZC40gx+VUdz7sks*)WsW zr(+C7|3k=&L>j!5@WBg+;J_t}y!;N`g>~0j<#^{-=caQb$|1)6_S+y(6}YPwJ-X-N zQkPHXXeD6zKzrOYTaU(a4N*;W_EC2>)Fy5u#7d1G4KR7T;hV8V zY7WEE{-@@TA`s>tnyuzcHGPWEoG_p~%Ms1V&Kq#03(paDY0Yw(4dZRPjQjO-^fhy# zq((Cms^O_q-Wvq!DusNOEII37d%5>A4>{#QX`wXEKp#e-k|%zz+n!9bt!^T-9NI+p z7ignN3@H{yv(C)^@Ov85u5n*Nd}|YWiQdm|>3qJF`EoW0uNKLeeb(kYAa*{E5#Zrt zLQKB8QN!-?*uCr@%@AoaUN2%4=8W6vAJ!j);PE3rKoIxXLtkLk84I!{Qv zJUt$6ZPMe3{@B#j=>aw?j59B~W$f-5rSw$OtAA%MXEg6GhE2~dE;qDE(ac5w(|KjN zj(;3-s2aSkIX6+(#3R+5CW37CQ8j!gG79!g>OFYF>A{8xP*AShgrYAABO%JLC%bOHWnHz zo13K3Q%Po$|42IC9%y`-esb>YVlqByD_9R$JJ7FZ6-3Fg-{s1IQrHVojA88wCL3%Y zLtzDoe<*IM*aB>U0|Zi|_W|zMMfL?Lzdy&XkMXZA88o(kcF82>?NTcK;UQ-Ky-9}c zuT3(4T2%j)9QHcej-0fhi8#Hae^ ze}0}-SkHRp9_Y`6v4J_22%TzGeTbPWBJ8(%=Ry8zWJOO8!on7CFVFA-P)D z`t$jBFZKM&VVxLSlcX)kkVWs?95H2nG-g@zCG~`UsPuPlzu?gOQJTyShv!R5onHh{ zBuAh_CP=}~QDce%DTFAEZJ$yElKTkXO6~%iXfbj_a9;?^a~4~GACVze5yPI5#be>8#x}AdMzw@bG%E=ueJk8klwTd1(tnv}8 zis*3Eum~|L>&}2Sd|rhN<-sk1rTluN1mbD>)-TbbK1gGP3Qf#bVGt(OG#(|L2h5|G z9Blzpfh8Qd*VtnbnA6>m$DiY2wFB7D@?8t1zCQ6!wHb3+|DYtot=z1aWUd2EOY$1Y zm2=5&Qg6i@R~GsVK*xi*%U%d$B+M~(w!bET?ihHxamkenc*)D=C48&*C`6;hjwg(1 z+)qfAA{<1YL=jLos+l|xaayMFL@fCLldtKAe~`5Rj(hWwJ#_@^W@ zL_-kl?166^`P;}~AY=$pk3CC#qxMy29_>V}o^RQFuLH)+JniRT=XjE~B z0-iWE*zEBCQTCPrb!6+(Fz)W|PH=aZ;O_1a+zF74ySoQ>hv4omL4!+hcMW`G=FB~F zCOO}|?+<eGYe1OO@Lj3BU-Xeb#om z8XfN}{7UFd&SI+aWd305NL8p7`9y5RCV{Z{iWm`F9@2S71uj61lI6v`hZ9!8FK>qA z)O~azNlSoVMs7wvU>T`BM_1^t%rCl;a}8>`kXRm~w|o+~WkGjcrSSYoXI}i+cS#;M zb7cXP)>E|KrtzSAdKUcx08m3Py6THRGU&#suwi1D`o21x4Ccrb0LiONOa+iIM;QK0p#x58uN(`{w8r zns$WfcE)VSq1URJBf&kl6=(LVA-chX2UcDKA>iSqQ^V30oZxbiHT#pCENIXX-7CMM zVCH>66$D1X?Vzy&cJgLA2FbXv7Xc=vZU`Pika^my)!A2(mOEs2)_JvdE7E zVmKo#euWD0Q3XF#Bfv183dFk!L2rQze6Am9+!!Gjd{zE|Gm-Qnlvk{Ch>p*D= z82*xy3I<$=jn)>cp6i~6TXfxDDt(7--2DVeG^ExM;1=`7GzmN=j^aBHck#OIn|c`h z9JwKSe1hwFw%9or>IYXVFz@QKVLi@~Lq+&H9?{2q-1FMa3Hz8zmXQWUN!$ZDfv9_6 zs&q%LC0gI{f6M~F8neyi0rwPqf*1*|kQPaE!=g3dz5vmw?I*{tYIfXJ5U1-h$yP>t zBYDT#D@_Wm9d=Q$JMizc(M(yNW@yH{?3@eQ>~@_ADN3wt7mI3cv+s;gx>LK*`Q8J4 z5KAjEPq>)%6y`{*_ZKKS!6HkyT20W+o)guy;l$U`c12}p>eEBIjPnno#gS#7OQ?;c z%){c`hu1u9+<$$z3`tPw;ljkO*wAu!1=n9`@V910EhLpZX=|K42POjnm}LOLs3)~v z991NQzd#gO!7^m?4&LbZSiumG$+dM~xieYzHnK&bKV$UP^o()5_l4(n3VqZgRu^;M zGh;&KJU4e;JlP5sRoScX>SG{MozXGXa{rd_)eCzj4O-t+OUSG{;?euc4W;7K`VUi= z10~(&Z(cbqRTLd;2$h`{a?!md51nTmX8S+E9hoIitqrz}3Ylb=q%cDL;0BqaV#}Hnb$P)CBZ~4GzT|E_sVPR5yW`)vHfG33=O%|aOR4Cu~HA?-f zA$#9f1%31n-@onE5L%cDM$As;CGOp1tBJ?T6lbX|B=+kCPEuMG87`!Cr?*caLc^Za z@oz+)tRWvateq|P)34N?1{gbIfdcpof_Ecmd%hg(WUH5yk7_Sp%IRLM03#Kjjm%Tlj>3AP5VSqAqf7CB6L>omn zGoumVBC%2%=&NVtGdb&84{DR*yNX3qpZJ9jLx@XOTV9_Jz&JmC+oN4 zER8i6AWAqT4*Kec8pzlX5wHLV>!ceP3>@c@(RLfRSxQw5sA69nE1y$!@Ru2Z!H?L( zbhYK&Y8v?<8n#HkIJ=z~7MEZ;xmD72L@fWFToMMn>4;iJ)vLqpglrdYSHQ4~YL&s@ zX=z+CqtPF{vS`G&mqOt#xO9>r{NM(4zX9N!F7eH3jf(e``J-f^9nOGT&1UN5|$=4j=@CJK17 zZbEo+&7j3RJ9lKI$U;kLDK%J;)kuliDQ$dV`!FU$jtuNl$7V8R<@Q}`%Rb}ehgZ;f z^%o$RepBzA`_(+~R{tk}uL8q*@EJ4J7gtF5((9Qot8g<1)qO65rkcdVtr3v~W!UE=<*6wN5ZG(Ix`7%2d=#W*jAu=u4{{l} zyCJL6@8om@0G<~aVOPyVotv}EN~;%_Hw`A~=B3fvp;q8WL}84p95RZn`&0p166D}j z2>9qw3hMh7v_(*+hZBzrSIoU|FSG&3hpB0K$ln5`lgvzA2y^7}ymU$`Q2DNy&_FJ% zzkKvAB3&%lsXnR(Y#4)UqB1gTm9H8qTcL7}qYDg6khUls0Am~Zgl43+bkNn}k5ZGX z2!0|v#`MJ&C`B0|F8i)?;Q<7O469L)R(LXt7{n7^7t@R|XM!DE~&G+?dQWxD)hepB(J!f!mN~_l5*hot3bN(qayx_*+D7iYM9d zDBF>=OMhW2l+ZQ*bVD5OJ@w!TYxziC2fW*g?N{o=rD{+uZFjbb6jI+$j)vc-9J^yL z>6g(64gx|+0pM89svBZjv0LhSsP3Bw31Jv^q}$7nV$9~6#+dbnDr(piEf7fLw^Rd~Hm0IO&pG3sDoV)K(<- zJ%7SS6@k=@y!_re+hdTY=zO##OMKI0xKa(dh=Oy3FC*>G*u4`(c?vl_vb~s6Ba85F zZ0>1JK+in5VHgyii-X zA!-F{04@`cA-rS!%ARZXaKjM)@N;eBD#?#h^GDSqXx2+2R-5UD?e5E{4y{;NFUOY- zgD>AK2n{0f+YLcak+qf?LFF|bO)w~Wb<%(g_9kL!phy^kB)#V(*$g|J@@skbKWK`y z^#H+89d(sg?^3yUi*cMYi$ORU$4V~H zyvXofZgiD4VNyc+=|9It=n&!aY(B;3Onf<{$XjhasrP~HnBb?ffs#CBBC+45Fm?f^ zd+4WWGo&A4$V2SB90LK9+D_s`!DK0%IQV?X1%SQgJecMaIH)oXeWKAO6eqTWkVWt= z2ILsIEh_N#bm1mvx1CprY->aLsKXm65Gji@x|DI(_wubR&8SMx5RX{hZ{W~qb)1Sq zrozvDe~QOM_?#k`Jb3H!&KiQD*%{GTkj7Y#TL`=>ZTTeWFmID2QJzpEi(6xTn+>bm zM4euhga;#1$nFqCK-Tb_e*@fJ=9CZ^#zJH4-j_~X03xM1dhNX|aDV~SnJ5_J!c5L1 zw`dCEdMH$qIRbK5-YX>uo(gz0iB`KkJQg7|VXBC&y z1AP(ns$V0#e@4&#bdO>G6&HJ}{oYgjt{~?4CouL`%GLkHKAHI!t;%ml|5Xsn|Fa33 z^_RusH>eyd7xSC`lk+!=#TzPziU0R%`tLRK|11c=9LdBkps2|PtH5B%GvFY_z){Iw z5FmoUnT_obARr)sP=wYSdgJX-Yjg!8Q`wtob>bH2WqvVRwVFyDW`3aXTQ9KVwFlLW zIf66@V2D+I7$C_-i<-LJYK~{7YSk@`j+y!T%b=I8BGehC`JFHUZc6_Lu z&B|Fyo-H^2w7yH95I8BG3Y90ER8Vkn+>r7o#>lNM<;?{Ees1EXXVO4AZfa+OrYSOgogVQ`a1)^#3=G!7N%e57|97DtPfl0+dBr@Mf7(PrjUp6 z4h1Pgy=MUT_Ox_Lxei=7VTxZ;z5km ztHFDqOlhuY?K*gf==w36&p@1F9;gv+k33jx{lv~XnhcZ9_Ly3FpgmI3?(%l=SR-z7 z`*cX|l|_q`ib2l3-E-tPMYtRKh!lYJ9xkP28rba!FkwuU25UehuFZZQ(JD!@;0g2@ zB7jXlMQxPC?YVj=eCzW_IppOnxZ!(U=Gbs3QGm#6o@+`*8eoD2Rgr1^g=_ZBlM;4zI-J~%-B`l%`E8FB?`?rEyKPGSg zIFnxwfbAE~CP029BxH)Cyi;M2mjTgZjx};>O>kQDQU?~&m@(0u)Kc0Rwi!$`=)!+Z zEKuTHN-RMBqP{B<`}4tF=0uA)G_CFs7H^xMKSKB9O$;JofRkKJD| z?g;&qB(deCxm$=0dp(*!jIP9Bws%`@+l&c_!iH1%svqU`VT$wf#o6Q7w41DY5Q7+J zvtU2rJow|o!LgV5QcGdJ-Zl*-t$ky&&30EXJHw~^$jPxrn|HiM+lYkx*?~{)KgM*3 z4#{t$E(IEg2T(-zz8MLEP3*kNUt&4jSVTW8-0Co1XqH?xJ7myCSYl@8ZTbPr>w!-I zaw@Hny46=zJ>S8g(7V=hrt^TBhDU!iAx|Iz3Yykzkf9L;c_Kv;FFi@gRn z%c5vGXX+MEH$QI)T~?$D$W)96%|s!MbXVmokBZ2oggiE^D(wj0=wan9_eu7}4TwPf zkz(=J8z{YUzPCmZ)GthGxQAI70Mk!cP2u5hta=UkM4Q6YRj|ve+IvdqJMGZ=*7v*4 zbF*Sx66CbCilP)HPCzPS4|C_n&$dD$#8qf6;Y-mSFvp?^%keIeE?S1lX)dFh<)eKc z9i4zaz6;ZJs{{M|K@R2pM_Z=N%u4UE)2?s%4R>tC@0#pSZIFgGXkWLMDgodz;*gjZ zgO-K1T3Qahx*a+^&obn2x+HvizU`VMC*~zK`I=D~UX2M)JVQ!7>B~x?8`GpR8z{}K z9_>`yCGCZUsE9XHtq+`rgGzO?Y+v3>j|3@Y4!R%rDjB3FdqN~CCj;CXsQAicO;O_u z1iD|v7@i1hLE^sp7CB#X3aTD5t%H$`I(-v36JXoDJ^=DQ$*%5R)pw~(osb&Q}NyvP7{zJ~kEP@1xW{_EC-<4@}mj$av-HzTz_tVe#u zhB*F7sc`%+lu9z=^uMe}etYC!%icd%y zOeg>h{r~Rj_vcRPXLl(G2ge^B5uhw@!74SKz|??toDWVb4HvDS`Xf89XCJY)gkr2I z2{WQHX+o9Nm5OHGGh;tS#bI4VnG;ObULLhF_~Z}8Z@(|h!^Q`q#|U5T?*RG|vMEoe za-2K11Do6|dEi{Lmen7weSdwEiV~9;tO@Va(Zc_x8>A&giQ`-UhFqeUM*R_qw1t3I&a!`od)mIqV1xlF{CV zpk4nSkNjJ_3{ngzq_%XEQ zmG1TcNtX%hvSDQlDBI`M7Xh++U7ZLS%n$Xx((ea(=3q3alQf<4H+mZQbu!sw- zN$w*&()Q`rbb}do5bf62Y$$9hu1wq`G-_d@68CZ>n&|gxaz~PTo$|!Im2*Jf0N+FQ zvROkBj$#w|Pg`w3TZck6sc^qvvE&N`q5796qxyrADH+sv!^dWAup_#-c)C??W^V`y zbMjxarV@G7A7Z_9_#2nRsF_-#nVa=_3pY#Ll9qB(*!1c53F`zm6ywy7 zMBDd;QtYEazIgYRLRgtOa`uqo1B{`*gB)P(_bOt*q+yWm7!ksJ$1X$lsm35ys&X9~ zu@DbkRHCYOC7?S*j9d|X#ll)3?o7welGuTO6N8Dut&utpl+C`JPuf>-&3=IjSmurh z@M9^JtG0Vzw@^Iq=2yOSdL(iE!;hAbTN9(i)30H30w1>8IIFyTd?RBB0WcO~zYQ(H zG-}RmGuVA#M#bel(6m!!y3F{lw%QWgM80$tue9=#9!AKuxI$v-Lfg+E-5f;`3^8y_ z{|C-Qqkfn1y2tJc#%dSrr^2~xI%MhN%Q+9TK=)oG!V9mMsMCw7gh>y}s`EvDqz%vS zp3U0IdsV2$sQ!S-TCq5?Sip2Il_7SNfWE#Ti*RRU5ay8tWD--#N_Ujjlw^d_P|v^0dkHzhq02(mLfI(A}T8|aKT#b z2St1Z#O?6Rr|YvILzlCG)FUcagLVTJ7>=h^Oz@q7NUI{5JzWV*O&yT>tPEB%Nh~>z zVzLL7wy6MvBKfKS(T|E|nXoJ3*k(n0$2+&nCCMu9LZ%32PqpxEe?!MOW92-f;T`)5 z&HWx7c4n^k#%az6%Z+($$b0eKV|+l>{;V5300Zx;CT+sk{sbem0g0!1eJ73Y=Nm_+ z7QRgdj^PnwSq_0#1qg59_paO~3$uB|MRY~qCIjTn1vraPSu6>MB`@oIT( z17#^qnrwDk$wBQ?K=wRp%|)k*iS!9bb!isSKW~hmC(irw%5olqazswX)=;u+&Z|^I z+`r2QGC3|hz0D9<$6SHBr79!Y-`-VEtp|;Xis0=AZuIFK3*di*c*S3_)I-X!g%Jt*@ra#N&ma1 zfj*}zZcTzr!+CK0_k6`Kk>5wLfIhrHKKb<>%WCJ?qPd6x;~s;&bqQBaI-T1F%jFhv zfe(?y?|5UBIsp_?V6fLeKH6I#xn#SoX1{h_@WqbD;-3=s$pC|UA1{tNx3Lgh*%B_( z70^*NnuU`_c`J8OeTSQQ{}nmlU4YM14B`SCB?LwTz?-IQaXW1egL4O(Z304=`X-3K zZ=9|1Hm-P8q4F*1$Rwul*3-oPvkR%5oW7weX|cUpH!+|Om_;+5USG9WG>p-?GZJhG zvf8V3ErHvs7$HNNY+}%TO73YNXDMOOFd#G&x2o-K#r(asG$D&AQkk*_W%#7FG>|~$?C!8pe<)_09Cz#CYhJ6EGWP8*A6;GWcdE2@Z|LeFO zgD=k=vHjvj2ohN#`OpPa#k;K8#fPas0{!EPCH4Tsp_TwQF#}SB_QU|xWzaZ7m}LuY z>kv3Ff83#yOH*VN>h!xMQL3TqC7pMyGN9uZaz=qr`o>k22aBN33gl+4pewvV83@qB zEJE<`acUwtQ_E7v)mSMRE=%93`-MTqjL53y%7t|%E+<$37K9Rh+zqjzOlV_YPDN%M z9;5+cG;FZ(*_P^`5lVp6OXU(fu@%*LWI`fR`ADfdi>2O(!H}9J1;tq{K|#873#R>gPOVcD>uZ;|zyvGMGxq z-Y5#)00rqzhj0YBneGr1(=3M3UlM)19ohznqjLFJQyUuxWk*79!!lLvZ1`^K^E17r zhe{d2g0W%XoD8AD;_zCWWHTBlQiv>}DIKT|yA+=2GIv-(MCP~&`4SKxeHi)t3rcF* zBN*c72Jzr~lJug4?WUP$=h%7vL?zo=Jq*qFBUq5wu61pTHQB>FXx`m}$>x3;{*~DP ziZ;^^O!Mfx!}r<^Hruotng}WfC8iwSfG*0X0E za5$9R&qUla3{D)i+hAiW`%wfku_79(dCo5uO|{J+yTNa$Dqj>l;`_zC!->lhP>a=} zQ92E2KN+4FJ7OTf zU2x&xSSf)QLy1{qHTMDSfj4&25jI`8G}A5%ANu==Vze(|oMdRfdQRK&wr0tyEcPLr zn95^dTAQp=r4QO8`{~UZ$ETWdg$Rn94n)k@+#g7Ke847qjmL(bT_`qjQ>7{eR7f7B zx%LVM4>}T~{m_;Dk^_PTgJ+Z}%uh7dn%(aC)@lDGu-c^MQD; zNlJ3MG2Kr0S~@c!H-WMIkvK5C`0@lNC&8LqKo?kH6&HAkN%K1}8Rng$Jg>l+$Ki)7_of23$61{dh6^6M_g2syb+=Mx2^xPN zEtthH4zWhJ2kw!p((y4S*Eq#*a6S^Pj|-}bTSy4fte0`wz9c}u)F%?$$#c*D(c zs=EbS9U;bFi@1ZKu)q7Df*=4IKeH#Hk>ak`Oee%OOkIP=_iR9(w2V5QV z9OmjnGbAT2=r&dyf7o30xxMy-h|sE$xG?nC2y^#iQL41BNs}3`m_aUFt`BACM3AVH zSpE%oI#&XYBb-92JD`}g_Xtu_0cCleU#1E{CBh97MR~jQ>WB)zKs-|QLz5hi>Ad$m zw~E?`=y;s9LW>0n4a=7|9=>aZk*UQ{{XSNukMO4S$ zU&xIputb-TDxKRw&)-LF z-7<&46_pKO@B8tUP}{rq$dX{TJz9OvKH27VCRV>E6;!;Tqot%tD8J;iSMV8(RBq5WBDAgu1Up%@ zyQ{&eu#1d1Dm9i_Pl^W7A*J<@UA)89KWuQ8#j2F!g|MA1s7z^#d$Sx}1I>F$vz1Eq zk(x41f*nwOt32`Xo$m!R`{JR1Rch}Fb4--CRjQ(7R|^Jx5-q)|q8UVl=o|&yOD#?`4GG5x(C?!Z&q( zuTu*zJj1+i_WgSP!TdABAZ&yVzpkGeMc`G1JZ}u(`m8H)f*R&Z)dHU(j!K^8)q=`R z5UoRWSi+Q%(e|8fhdD*6x?J|GprqP$5EH1eoR9*7HvDVV`O5%(ClCML0IYLO#?+L1 zUuV^hTkipdTV+0h7=xNgIgx+uCW47KwyIonL`~sQnTf}+2MYUoOyC`2X?2tG=kNU1 zD;j(>lRwbydpX(ekZB)Fde%0!Ux8ZS^^t!Aa{MWP;rLYm!||U2n181`a&Y{?4G{f@ z8uX8!{RJufKc+h}v9Qy#yx|ngTyHT2jI2aVtjzSBY+P?CkIeJ{R#w*kw{%CYf22Ed z{E^4@*QNcG)N}k!ar0m3WB~Ioa-ZJ~XJzA{XaAkcE9XDCk^dO|SGwbyo}c}V$oLhg z`Kk870{kCT!*6!5Z(5yy>3;sM=y}r{{oCX9EkW}yjjuSEUlr1Ioe4@{<+^VPQ0r68DOwkPCv?SnqVmKyFc(FU5Y+M7!09xOY&lsbaH$b6!#C1WKi?&2kp-P&@%!G zoQD`xC0TvG=qdPUR~@C~LJkbxnp+1T{w7T0);(`UkjlW>3Ak{vT}AIuf7rqRCq(F& zo1NqH&gQH1mY;m`mrZy)H6(%hq?p8tOT#H(FoXP)%+44&C+K$$(E6A$JNms4nU6OR7p%9&{$#Y)^;V%K_NEa!TWq2ja)kiY&4Rfb_iX zZlOU(tMT!s=rSLRQ%%wgOymW$J|vA2XfC3EKsyuvl0;acFi8x577!>IhG;OhT$>%G za{2KQ2g%$!cv%$2&XDr#i84D9BUFX)v-Jz4$2q+1ud@Z`pO7f$uaGF`ACRc>Z`2%| z|Aa(2{})K~KjszAKULr|AGH_qyL>h0>Z)h2T}>f#QA3Z;($Yy z3`PlJ4Ls54Knd~%9QYxbk`9Crkm-|30d)nnzVMmjOdv=P+U`Q1!zbTkm#+&?Z{Fkd z3ogFkz_5CqN8N+*jT)w2D>}=k@+xN*8aSC!bKm04vrb(i+BTEzcgV0H>^JyE{G!p1 zIQZ04oA2*E-EY}IOcn{p2m;;k;;C3UHI1o-gI0i2CYmBE5QJ{OCU0{G0fYwQ^tW-M ze1?83c>Jij_KSy+82OPF_a$>pifa7QJ$Pw$T&8Wz=~Qrql0G8PE47eGn_>8{5ms_2+b&e2f5s&GO$4WoBcgXZfAw;@jW)rn4mY`{em|X87MP6etJR zpT>&pKPShx_ep{QgaaVt6M}+>h&btHOGal-{5+gmpHt1A^{o%4Wb2!w6Y_-G)Xk|d zcU)kR=5@%6qtnHu4YRbE)y?tlOTgs#s-3UwZs+>*^JPT?A9q1O0t^;uf7xB~XWO+g zQ+qaj3mcGCLs_x6lcMUp-DlSo zJa<6xyvhRyyw$t^%@)hK!c}#;%c;FYlZ6jFs4g%}w3sCA*eq+`fJ2|k-K03o?%qy) zWs?#;fpr>F03V=ev)S)*mc};XKW^2TS;lG+COhFw=B5gKQCa$cIwV>j2w3Me0EMzQ z?ZR4$%6DK^eJCx)%@Tzi$AQ9sB|q2%R!>#Gfz_d`l$DAVPnvI-ICMc!K2T^-I${JH z12)BO%A(Xd&uWFy0~=n$_5Hfxq`$|zk6{wx5qekO^9%?{mGYInVP#&a5`n<276H9= zt)sVM=&4=Vp7rpqrWgoM1oKJ^wK(Jpd*5P#RIr-VO0dw6LcMUBxI=@?VXT2<`mQ$b zrCjI4fK>xt>J41=WA)LYjdS^yU~5!cVHIptxdMkRAZUdGflNn`raK2eWIL)e71#Bm zY;2&bwFpSjy^q7}9Ip$~F5kqbb6d~ZQ9WP_u}QL3WkjFa_%3&Ig9;eokZb)yct*+X z6JbJG&?W8aHVD7hvI^dv?{S zsoSLdIU_}{N0@g0&{Sph88QVq(n<=OC*x+rmLj0|9-qVV6Jr?Xy<-U1K{eI08}FN6X^o&|1renX-?$;_C3QWgQ)tzI3xYsg9rawG=BSiLrK&cG`t_tCl~ z33UMD%}mH86l46v7Cl-&^aHW%#gO+MRln;uv{t%hG8EOUecF#U(;c~y{p{{kclb5~ zUZ=dW?d4QoeFc!Yk#^6xs6Y}CWATqGnDGJ^76dt|rz0xJoO;cV)YWdr{T?BDWyk9) zT()7qe*fga$-F&C2?4Jqea&Qzw!8%S^3?-CCl%{`F%NQF+iG_;)H1bTQr3q4;4CCY zszWy=Ungjs0EIdyT|Gd)sDDX0k+IN}4XEqjA&6qz8`lV6=Gy>%%{O-bQQr*}!=YMZ z5>-V7Rmo+FXl_KEn=tdD%`9E7d(Ok$TQp8#w~c)P7G|1$dGCFer#Eq?IgU3{P9g>{ z9B|DKVA}Ec=#E}Dug#6$l&{m+A?WJ~?B^;ZbXUuCxptgU$Ay4ZkOu6 zo}_p40bvGssoCgMXsj#U-ojgwne5-eFQW=70h@*#(PhZ)uqCu>&WQ8Y<4?3M z9)0MKFTrpC(GCDZk`q15^&$1g_mwpER}t5!<_1m2P99?gA$?2A*aOw<{kU^o7#8@R zn?jM3tkk;b8$vl7xSiD?5AnNC@?@y{jHzP6AHGrNb+Y**Aon&%i?k(YD=)fux8I-K z*}Fn&*MDXZ&WT9l6Xpq!P0g^Oub(RMq-LmOcv(By;4Kr2#yr{hcv(MlAc{3X4>}Tf zf>CUW9L5><+Uf_$Bc#!gAO1c_1y2GVPc1=PU%w%Y5pS#w*8O_ zgPGGpP-O}$Mf z_UhrfCPJCIVNW!n1#cLU8eg8f$wvQT~(!Ay!Z;2AVLh3-qEYp;(2 zmqOL?YDdNy7CKNFO*_TWSk$HgHH+027mh38KF`d&+W zwQK4_QzFFjxx@1!6UDM*XkZm<*RMZ}cnS>hsCNXRDW=tAG&n*+l0alVv9&7iTf(I?9p%oyzW>R^nBvW0D<#r^nfpYbl+ z0xDuY1JFNhv3cvnv`z!pv&fVNGT>07h4o|v?fN2wR)lm6)PMbuQ*4wITqhh6*id*J zlkbrJEMaKPCF{FYtU(vTSA#;ueoPgHI&`xlLPHRPh*?7yrqCfeaN7G!^P zDBc8Zm|E0x*H^W$X-{sFm|B?*WgJ%v{hK}9FhLn~3@>SlL@h&#O7$7`&G7rT1E*Dm z+2Zr3HOYvnvE2xBd)@1ePX2aA_*PrKuuArDB)RiM zw%ulk&}-jveQgM^E88&M%))J(|29*Byn2ST;8LUI#({lZLf;@wDYPx-aEG}1Lni?9 zi~H~)0M3W>hm4D7qjpkWC%`lt_7nvG?6*%?{$`$c#T^|)(PTBKO7GQeobSeKJ z)3fVzn5<4?C`Ea=x1>M!hXe~WE*;%#SE?r2MsIeghgvuR19Of4jO{m9e)9aN*CDC) zoo2$O)oiN;J%595)Lqb{JU&jr!3{eI68r?~b?o14zOA;;J;|z}za*{broC+RUEbdz zFmrO%U3dCRKeT(4eM1|?G`I~PY|Qzs%0 zu75dd{#uT6{oJ4Zy`bj$S9{R^CC-oe7Y)mANB>oh1O6#Z`2}wI-EcN07J3%eU!^I` ze{2r_w@YW`;G$=H+xq>)O8|f0E;9eIbNF9}Gjh>$zFCz10=N8<#rgM3e>?YE5)U&G z3o9Ev+uQE)U!&pv-5AEj_(w;y<$u|${wET{M8x`MhWeWq!{70mw@@M0x3mANo9piw z4g1?8|Esg>&#mqspbRG?<4cz|=gWH0O2@YY}!akuo(ASJ@M^y&_HkZy$h z^yt!Mh}(hz#pI0F=ctFh7vB;Di7t$HNJVixgb z%w>x~B#K0J2+D~OmU5P|DHKC2^*F;Xo>w!IMm4~-XLh2+GbR^c#>gYAy4H3kIDkNk z#M9=M=JtoZYHIn)d^lxX*-H`<;5K*B+1rFf8Br*sDv}Sqob&C&5^8bT9W@suwU$s> zg337_>)Dy>)uFFh0zBHuox7aO-IRv?d@+f-up%B-T8Tr9vC~HNXJ_g?EUkrsQd^9& zHyYsp22|A9adV6xtIX3v4X1}ep8<-%;t>g;=}=%uH6k)!bf}SMqh%m4U}hF$hS4^y z$h(7sB#~>kXfAw2YCU@*qo2 zu=*P5G<37oOFjF3sZf2D%3wspH7}B4_2*%cGmba5c*EqX%m)Kp-#;EO%@sn_hPUsE zrw`dYJPUY6oEpH0#qai7*H*ncQRl^FOFs4CX zHf?rrchbOskSpTNC%jqdL@@nx0giRx_pbUo6`pwQmq5KOrTd9R07ppqD7*008Q{-^ zPIwKvn%j;%AFB+%PS(#|?YE<-0s4K{Ysm>7=K0J#i559-V06LFd?sd6_~~thEf!lyCT?eXyIK7i16ndhIxb`jd? zcRnI~f9lGOYB?t$5@A75zC#^v8lWmLQyO@Cy&?u^!5zxSmN`0~n7g|!qDWcdpKG8| z1+VNXpkB_hF&wZccS(v(aR#U}bT_hzNl=SnVaV~*>qpa10LWxCQT%lBO8XPO>HFa|n#0@`gND&ZPoIQ42mRcVaPrHd6$QU_KeR$M(?3?zu>SAU$ zgXBHV7YSx92QL2-%x0_J)V^vRFOXz2NYT8=4H}mSGqZlKh*TVR&0L6AG}m=_%sHrl zH!^D%grS}M)Khk3#Uqpx3^tiTZ6BeKt*6uGh*#P zyAR;m)pU>BiAsW6qO!i6kYkQa z=*bUkMy^>h8!J@HXTd=>JmxO~EW2#=s-b|$M_i$N>V|KRDy}8q8I0{+8w_HPvbCOi zWyp1PQec1%B9+ed&|})fC8D!=`Vs8&HC@HH6H@*_j|Qh`-B=f18p1^`xS4L7TUJ;i zrc8AsWJs_#E1f5L%<4g)EB6S#0U!er%tKS(v=D!I6Tyl}e|SY>!61>F?+kr3G8_Q= zFsfN+-id66sSI0ginF;bPIy)qH#ATt!W5`?f%|r;eXrg__IZVl+E=Do?Bh=uJVQAVzFuSzE`jP|(Yi=?zJ6nN~MMKlITRes;LeR#o;}JEu7Ss;X*l)*PbW z+eu=OvqaFuyg`zE5NinnAE68L+`rVn3`h821?OaBS)KfxzmV+^CJ(0rs*sK$VOztm`of%Xet_WoUq7mUHGKlHcpFC@zOU30I|SAOnP< zzciLm?pNfq=Tn}M%^i17^-A5Ake8gktMxhUTSO4ob>bD^se9TyhV8HN*uITQ_j~ZK z&67)By&`+V){`7iSY|T%6I(F=GSQKYSoM}#@P%8ix^?CuFUcNs7`rUKOwbJ7g=KF| z?-MjTmH-O$d4uA?%*N{2T0|4h7c#bWy;)UpBc`s`fU=(T*O{D>ba;6Zn%JYzDqrmF z`dnteBU_@qt)Ps?T|~%od6o@3bRpOa(z&6&+7&pE$JsNfMN~H6MSK7tbLiHYchp6E zv9S58cf#W3?a+;a>FKg~2We$AxWH)%<$e$%`JlcsO%?F--M1P#w>?6ueH23XmV3X5 zGV2qJ=8ps3@U z`^60os}>`jMs4THk~Y~mvG=T6&x9On%)P&<{^Mh@i80T&Dz*xV{Ie%+LjK9!CO9qz&Nd=@im*!1zvFMin zpmVSi{;+*ubmL^-IDYrTy3#Ke^TC2IwHO?Z zL5bg-VJHvz>L}cdB?iE(9HV-MM&=8ND=ZpmRBpB~43d8V&_iAJ@x4W4x@kC;BgjZ! z|Je@9v5N3#fyrHN=roZ@s%5jnnGLE86Q}oD^KAwo#1d-3C{_ENe)zDoK0M4fVHa0g zKJXc6?n;P)>7=G&^CIAhFm)+>4K$Ga-qJKA>m3?_U8ADiCoq7dfSF`jcz5o=bghlj zx_vSdq+BKruMSc+H7}km{LxRN5@H=0z@g=bTSHJMM3!to9+dSz*w3(^G}IDxVqU}M zudqa&OSHuZEUuFHjCJtPI-!ZRAYI?VE{6bxFmq0ZgA|6yVt7Fw1<~~ zXLlMD(5iL}5;n~`~oJh(+8{)K&EFeoC z?s}5ISp3k2Oy^kecP*BW?~AV}Mm(V0K z?OT}_>4#T<2pRX+D@ERS>~LG3t= z%b^Spz-m$CsVk2S9W8*7r?K{^>?`a%yrdMQ+{fM;C@95hnt87ILKq${v*Th)Md~~l zVSl9DJIVo8DEJ+OM#)z>6C_{U5Jb|k5TS3MzaY_DiMZf7(((}cY)xUyRV?3e3h}-B z^a!lErvKIn+yKfqNQKD)dU_0vlSdHO#){^l>FWF#X&- zw~UG_-MWRLaCdii5AN>n?gS@Da46i}3YS1|cL`2#cXv&25?n6b=Y8+()2F}joga)* z?6DWmt}6DP^O12y6`qPojH1*r4AJNDQ)UoBT?K$|gTVYtI?DS8Y8E?Tifg2c*PCCM?6B}nV!18m%|g!bQu|?> zcLVmW4wb#kY%Qxui(%;DPHsHdKhZ z+_j!w<$aAk@^e5>q1D8C-E1?Jbi;U;HZ*6?XB9qpwXQL4D5r#hOW@k?iZ7Cb%t==p zSB%-94bReISL%n$2#R4Qtdu()Q|vz5o~?N=C~A38DH&;ZLh_XBj-z}iP5*xMTKfG} zC1M#j9G!EutctmyI1Iv>vWw{;a-E^FZ|RR#M^ETEPuy{FhP8sO2*fvVxZPB|YYf~m zeHxI*qlUT%*8q8>P+-hxQ2hSxquj&IRiUBOW{+{GQHi(gn7ULy^?EG`hM4(I&2t4Z zAf`Y52ntr*jV#-P@X6tgE{cLDfTYbX94i2@E)y^|2I=)#l4V>%WI~t%oFPmPxfYrV z)7+>%9v%kSUH}rOqw^x+@Ux_N2qA{1RfnE+FT*i9BuM5P6R`CXF;K4Gn-}qyznY}` z)0}=?Y9yX<25`>*+|D1UHXe|6P5Nkn@WtDrFk}k@c6(r7on*1=*8Q6!Lb@s)iiv0& zT(@MbX8nLZ91=av(-muLS^puja!U)Yi$(`IjA8qQC7(F{RA>hB4QuG_xgMIq46Opo zT}>@j>-OsgH!!~Cg4x)G)k2q$%>mca_%X@+kGplOKq(xJ$5KR8H;))6y5tEp%aGlh z`YW?1GdJS>1u8>5xT7HpMUN>bE;dsDxaOr0E|^xlr;7~?0UmB?18@KtqGoCZ+!ry} z*V`(bJ08Uh($_V$gV)0;X9qJcrwwNe6Brc;&naLJL`!0u%B>X1OGU<75)>$CYqHT+ zm`(-4LN!rZ-uEZ&wk-6v*q_6Ns%R>9wwWg20}==XfyF2S^~92-PV3!S#&Gi$qBaW0 zm^|Xaese5{ay#$$O$V$T?vX*tW@V5z^{0X@2xAGcF><%U7P)v`QqQSS)RX-OaI5k*?Bma|LA7*_r-bs)I|UPJ~y`ach35Lng5~9^00FK zmwpbwyOZe;0;;15;0N}hLQYA?oB3q(G;3?Q)1;0-FsWjXVU}I$NWS?$fsx8-us0l3 zm7xVX<_9|dx&lu#$9Wy8Lo`GSo8gHOC+oESwjQ^B#Zc=gt%j13$u_r{uN*xyl;xQn zL8-C#-JA4d-Qz^$w~>oz65-9#TJFhY^7p3QF%(vLHM!VJ7$?T#H0ob{rRmu+q*V9E zsnt&e0DC)!=eMATjeaI%mC4;3PVVyyp^2KqWF6k_UGl=8p&L%yk7AM|Tjdsmz92bK zMvLRQFzp44A6~iYeT(I3YZa#z41PrxGAc@XO5Z@vY5-wi1cnV3AmNjg_%SK=;e=H@t08UkN;F1OYd;!%{=Odui`oTM74J6?0{Y`0ei z3h7HG_Qd6pM4b+Jp*H^Vz?H9n%JYai$XE7EQg($o zi$L+qsEIeNul`J#Gqj`jb9!Y#Fs-rD^+QUWyMWZQf9mMgmje`Pe7XSLiR98~vY0QQ z2qolz64yDZC6 zhKXiPzn*57ALVv8>~_pVUlk+}pB6vD72rrra`}m~6su1Y(3)^vnnkE?yD5%QXj6;* zu2qxI$0%=5n34s3UO2|n)oogV=O^+|d@+a^$5iK<^bkB6 zn|OZA%z8qS=2h5W{caUsO#fQ=`^xY#H|k+9Izg*gf1_^zI9b&I{en)JFr*@MB5zQ5 zlRCy#^T}!7FJYihBuLh^c)OO|E(-ykh*n%o;=XHlg!cTa%}rW8F7xh_lF>CR2caMc zh@0*F0mPmw0v(E+8l8r)BXF(C~Zd#!*!)4N2e!{HESI=Hpr&5pjs@2m$tg;2~jPVhgf}Yvy1c@OS_Q?uh?w+%gnp0D zm}}`f^pg~N*Fe7PQxweXrDIZ_F;D#F5fl^kl+-P19jenbXaog31L(lZg6H3Usz+#u zNYJdYgY-uGrVebT(Nu%cv{UR;pb{+r9Z;f!tY8v%m{dkz%_nPS;R_ZH;A}3CqNe7M9(W7sK|&e z2r{~zier{9D$$w5mWe}m9u(k`bRsg|u;(X-=foQA#1`lgq-cFVUVN`1QpX7$9)MB5 zb?PJQ0>e(P`?lewy6ha07jDIjA#1@u0nuQt{SvGHyg>?xrN{${@xEZutnbaD?Fxm< zDE#c>UQXht+bBX_=XHij`r0jhN-;Ar-QOC6&T{ZHtI_^RS)mWZ30gYn1(H4A0TZv~ zLP*H0e+lPSl)k5>%s&;l@~B8%F{3^k z6q&k0w_wHqDQ&&g3f4!Lfx7v@KPTf3vdEqPwb;%t)ig!qf;qWMe^rm48~EHw@xJTodh+jPTX|EYy3=P za5c3!=N!l&9%qGYfGd}!ifv#M5Z>QX+zgY4>{qO@@g=t`o%N|K7nTd;*W`PZJH!{N z_F$UVb9YX{yh>_tz~^<@!MPS~jIzq13FUymm*0-$a~sJ ze$n$0c`H8~Z-;HB6sVQpkuqItX(N0Ui=`E3{!R$uF(~;63;cCE@c6WD;*~j{3s1+; zjslZ=g+y7r9+7YD@OkXVw2vU=cy_9MM@{iqX0*1~)2FJG{ec8$ePIpLLnej3mwEe5bp?JmEDszA z6rdzO5$zayW)a4-^ZZXz%=SOB+6Rto_~yfcO39=yi1mUH!Se5{Wsy993Pn9Z3q9$EdOuPpXbkJtAFLC|FrlA zb}nX4o`130zmej#=3@K5wDvEH|9vy@PtojL@5Y69hxY%FV%h%}{$A+u z?|YGd3TNYCeP`tVIhFq1ng53xO8?)u9sXjM=6SCr`J=TWxB(zWn=gZJ2VF3y1}5mR zLOF0&ELu0c*oGD8!Hdwe*qepYZD`p2aVMXuh%8#J=>4hKhsA1~nuBQ65(7*(} z%sC%UPJxqMf%&M)ojQ%YdFsc7ZrG0w(7wUD2b=GA!`Z&$we(P*k=8OAmj+v8XoITq z_YPyxwk7MXECSZj*dY7vzCdvG@*ZOoiKpRWa=DGSFYl&B-7^Xr$?~MGz>mzPXDp5) zYhxXOcjA^!wbb7Orx&l9Zy4o*`;FD`mNj=?k=Auj@=GrXVDS7E^2rI91HP7eDOI9~ zECY8;KueZ&`>Ee=SrJ5!(W!u@tMxpN0o>A?Ne4?=Ze&RymKv3KQyfl`VkGNE;miaROohg(^(=b(OOaF!4?&bb}=u+T83Nfglp~* z79(z)DBXX0B$2;Qop$Rsthm=7wTInj2?C+0&`{Qv|~S5>zl?%hKaj_oyG{7AL@w{2?U96j->`yarC z{ufR-6(keXT#Xc7Tl`?-JN*>w zG18{qD%{%ExJ%=Ma%ad$65@NLu}<()i@qFPI*CB4*sSP4Fzl(lmx4oZCmHhwXc3Lw`UYmNUhszQ6`}g9scY3%f$#LB3B_y~>1|H=X0;L$);>w2d z$(OE5vqU^)`9XwGiwPxFDIW8#iwxRWT~Qew$8U}FA4An=KEz>=ks)=`>i_Y*EYI0v z$xdsQ-wIS$YQfa7IOZ26jRG~OW+`w^4=@aE1P&skAflFye1 zk5qGuhI*@xQ_=EW8Y3ZsS}iNaY8K+ZrD6O`gSb&i)LH<d6>!!Jk*-8`7uGC+pxtYI_Tfu`>ngAIb`B$#Uy#(eF-I^Vo+F z2tpnyBmss~q{6Q;`RDfVHKVG|8Sa?i?hb3^9Lt7Jk@V9cm3@PQZt>jR@*JffYf%`p z9u>PV+WYx-eM97xLZt1oEX+qR#_(|C;!>55*2*^v3zWY{Ty$JRZX<)0RHpHVK%%i$FYdVf#v*;K-R&ZhnaRJq^VZi$M#H>eyo z2bcrfs9Z8kQF#|w!_Y>DsoHg{(&}ujm>R~1QR8jIR_X0m)#&y0aRozjOiQxX&T03n zRqP2;`P^JL+^};d{gs}kTwnR7jO<>nI=i=?e7Ze4w>}oNj16TEii(p$N5M|eVPnGd ztR!1Ps4xy&(0oZuhWd!fAoP)5VZ3YG!+SDs*YrsMz3LGj23S=TDEHK~ zxVS_Rp#sp5F`-0MTaD!rAhC8Sz=&lTQKQTTLidVRA<}38Oqe)zNO-lF#8PiPn1tb` z(=>y5Z?hwCu~BR-#cE)#48Cb*ip7B2X0E!okzbM~fv{$?&R*;*jyH$j>Ggpjrl{lw z-*i1g@|U-7lZ62l{wG-=rm@iXmyL1r{n!9oMRAzHZn+8u|Al z2cFE$2H@%5$}O0FH{Iy(wv)~-<=fpD#!ZG*Yv4N!rw9&jC}e1Y*tGJA3h(<(^R=)j z>)`Cdcm>tHS;$W%z3#}xaMBa_Vtrm6`)h+juG3ro97^)l?P8rxzXME)Yl@q$z%96m zSe{8<#WOo|-b06p!cW(@;lsH}lFRqvTyE=B89!>}hgpvs9~$jEqu%P-CaV|Q_9)K! zGtJ%uN=~(rq1C6Q<~)d2AzaqVdx?yNo)jaU3{NH+@2auDH0M}q&|WSu(cCIk6WrTX zs`)ARP|5i1_-dxqY*~GT^I~{G^F`1r7%9U^ChR({dSi14`FQmAXXKBVkkOtEmJ~bZ zl_ZE8w(IkD-bO8U#ZS^>)o%A)tg^cDQ4?F0lso<+3atc1pMP$y8{(h%(?2@jEhOR= z|AKh5i>?z@y(3y-xBG z_f~%+c30TWo>=3-yeO>fRVMOP64?>fP&0SCHtw|6ILT}WeK_k;kiQX!O^L#-+T6iw z-L<^$`rxU$4UQk;#IP=0ewl)ehK={m-p5NtsE}8EGIH%oF0+RN$c#G|;S4LDTkA3P zQ3?@vy`l7FSs8yiwpJ6AbWKT; zP8HqedJ{eicDkX-7rdYA6vjX6E})b!s^Sc_#520qU`r};8CEEZPR0V6|v45{qOUnZ*#A8`>5KRo*i7H5$;%bl(@TGiSJ zil_E{82?EgXfu1*KEHiFjGp(}B~Etmkr-uyQJ9p-`fRT`D?X_?1(X?nZ}UvF0Ds!Z znUkU3{ngXxeJ0&l7N2&6ejE30a#`}AzZJ(1#@(K4Kj2dOcLPm72u;ZjW}2s}%zo|{ z`5N!&&(L^doy_hsAo@(l3)6Y!0QLTp6OXKXU8s*T8l4N4~3J#P%-6 z+=|Vb7`BG2n{(N)_|Q>PN`+%0z4tjRd*LvOlVNV}r{yS4 zqQ(zERRO1AZeS*Ni_=COtl?`$8a)Qvh0TiG%djJ8#Ur%QvfWQIW z+5-%*-s!~OqTW{meRKd2{kgWY58wl+!vR18cptVPA_9R4@{R={fuI}##t@ig@}Q57 z03sj-=dZ*308CL-8v}fQNoKKOy2nPsp$vco~oo34MmBXHFI~;iLwBdwl~u+KK-g7{WAy z#eINg`Ran-GDsm<3z9{l&!mCn zSoa&*a5BZ7>cCTc_Q-Qg^ti+KQgnKmMtZ=M!$zrSIz8=`m^9!%x-&KrXsRTG7)4?dts+U9KuCV{;%fQU z&+3OCsZ>0j4UQ>AM9PjU0fY^r2nF_;fMKKOPY>slfIT`B_G{X>QGZ0}k)?+H^o4_T zYZ5COY#Vw@ZVL@PAnz4NjGPm!^@8j93FgP~^otI?EvyJs=nkSp{yaD%G}^C=0oM;v zCEV7fFea!&wYEd^Efthb&=5szEkGtEPoNnMJdG3TF9=ywckUdw=O{bhlLg?Z$xC>* z&_>xlmFwG8>SE^Q?$eNFNqAheJNxJ=lW3bV`3`w?%E!JtA^d~B5v6pr5j6u74g?gG z3oILKOm#Wsft!iM;xpz?Ek#@lqGcnA$)_(E#Fo;BkNd(XPxGha+^+!xRx@t*0vpPQ4$4PE6LePG=ua@{_yA%3bk`9%f0dF{$DYOyp-{PeQE?u1oadgQ>td=i z?{g(LjzRt2>pKTOYb^>wltN3Tx;r3Z$zBD#>3nCbIO!&7Og`6QbnFA=K8>A|CpUB% z3I;xt7xEs3ST^|Sx#p^xSpnyYwZjusaHGE}=! zKF9ef72`Ny{pAC9y}v2&T;d}o(h z1gbBVipoNY_9(D!CjCB4667?vFeoUF)V7As&PVr*^AP^!VEX0_c@%GNr_Q;;suDF$15yZC2pJmB< zS@yJ+=*lT;hU1{4(`w7JN!a+MUOh%^x1*N#n?^hdpuLUY2y7~BRuMY;&}|!9-YKp9 zsjc#M;zd78wfXpFmRC4K(rnLV-cj%CO2#S%F%nm+%pUt?(X_%!@Q*K+&p4KvQWVi@ zgKSYJy8@=hg!FP3#g^;eC(fCSZa?%|A|`XeuPId${@~K6;2mivcn~UbsV0Y_tsUk#L{SL`{fM2lG}f6i1*kOD&rm)s(2{fy;<<) zmPg%Cyvo(F7!N#p zsm68$SNEO6QLMqT&uO8O@fcTH=&p&WNCUsnT=7s^wtj5kgY-iO3U#`@k%(IlTGhCQ#tOL0|j3}m0EF=JYQRY!eXY4ZmNpi_t| z4qWf60b`>TQITe)gDT0CrTl~1CGC@cc=oVjxP6F(iL)Um<%Q9~iV_nqRm}FM1{&P} z_fzj*+2x6t7pn2BgzWrcD^GF0%3iNxdh4wPiUJU(&6A00Ko6Hl&yu6^-+0_`O3bZCbbyXA6xybg6|;eX2aek(s0lwY=V$R)Za zmJN;Ue^irtxFA9iaWeA9Cw8B6*=Kj9JjCywQpnA*Nf@W8iXKWlTlNWxZHsuj41CY+ z0>uLMk>I1wUhy;Ea#{LyILYHc((NfED7s_Y|nr3qVKA!|`XS?_U|bvaYPM zn%FyoSCj>rc0giaalgCi{>I@sdH>+>LeT#@7i8xRaK+;0`d5+2UxZH%HqebXz~|59 z-buST#Csa>UpnCrAAlvW&~zNJe>>&LGR<_|M*BC%4S_#CM+{!Z1e0#01MWC^3w(!7 zGu1wiZi$&{mYeffJs$%(9X11cNAR4T@zAT+r18;b|0&_An-~AwsT+TxDU>SZ8;;K= zpZZL+k+VL^^`O}YV5G{CfuCT;OBc*28Q|`c5jJxS1UrEBuCAg3c`p0Gb73zn2*`WG zNU^|alo|t~L!>Xk21h&%EuaX$m@tclF9*P1k#EzM!4R2&3nLQ+dI1POnbZYbJjUs4 zBMkMe^P~rgqrnCQPJ59eB1_dN+?}>~$yfI?PYj-p%7DFD+HXIog>K_Z zKxow)*V`+KygU)UaXdpBGI4_=(GT_(?rE-gZ_X4O5j_wLRKDa9$R)*+8+y_`PHQk& zc0-0R4Tm5fK^HM#rWD!vswIIAmrV&4G7+!`PRIhq)nCUeaDq*WM2*JEYcT&lrG7LpM8yrr#nVrVTC~ES^#gxlw zZ!2-|#(zQrSQOd!NkBmw>DKkQ*(MPx_GCep84IO`_SN&y5V7;e>{6g+sFU5^_*9(5 z!pJRBoB#f+vm8}HomHvVdA_)c)5MhQ`!E~f<%&?F>(d)hvV}~Nl~mZF9zPt@aSvoS zw9yj5Pr(c?_CX0fCNu>d!hT+qfVuEv z<3<2`D{e0@M_#u}J)4-IJn+aZqoUvRY`cS3u{|Vv}Y|niG9sBhJa7JFPv>RY-h{!eA z?N*Qv;a_eaVi7P~FEvruO8|W^W`hBm3%Ahzya% znuM5hB`SsuJ)dp(pTzKjY*{GEsJJ}(-6L_VIBC4%n1ZhKo?sF|Vn$aiRCeFKv= zfTwq+p-i?ZzEyjv&-_rQs~F<9%^F{oDUsW^Y%!o6#=9K%4EKn0sB_+`WvyMbw!Yt^ z`-%7-Y$`d24vgD9AZpw0~VmrHN6OS66 zZTPE;-jWS=cyY~hlqYVtPE;`r?MD^gwcm0G$}z0 zVW-}+Jq}YWo-Db@F{fEhh6@QdejHN1*`?)6%VzgOUe9c1bdx&5?t2^&h&FEdk5ckd6&$k8X z^us$n@xWbA9>K>W%Sx?cgVamDE&qapl+jin*V-lRm*ZRGC5t<41iCMUz!_{|Erdhe zbMLQvlsZ`#!+7!9fP0sPHr|ekUqIy?r{Rmn+zdfOHorGEb7Sp$gbWy#YC#`{3#}w` zC)I2bV4C<`r)<@F4YuQw(ZGe(}5@_*?fyif05&5 z9mr9Uq~fl#2i-M>K%38D>NiHfjhTEuFYZpQ2GcM1Nb$7eW8Uqa9$g(Y&%jwpB3Wl4 z=$COC^oA$jyPp)ep=T>OZ#llSwX*6VDO2`{0V zUl#5h*JfMV76${ph*U^#TTa8&YK9TUl>}prZ=%v@AXyahFj1oB;q4NndEyUsR$s*F z4n)VNHxn8ezn-qBhie=Dng)Kbwa{5=>M62GG@JR@van0~6glq`1mU3DrA>51$Ksc& zpYddlt&yjJUW|2q*5y^V4);F1=bF72Y5p|%jwWdYRAr=x!nJa%tRH9KA#0q$=haCr ztSArlV$ph8!C|Ac*Wxt3^y+t1S09|L&e91XKr=BRorjUvx* z=p}jH+X(&v(|-};bi{OYv_=1fa!z=bKLk1nOILFjn@?^|E~H#Me@|4tANd2;g%SP| z2I}dBzypPa0F;>i@bLUQ5BS%T@8%=;_aaaB_lCUhSNX?pe_RuIC_oj0lZ*RbcyApF zpaW+Ikr6?#07J{g6@4*F1>E$QSux4>>)6Ny;L{*$MGJPwP*g|jeFB+A9M>s71d=zJ z5u!>|s8+y2p^<1ZAj4L{1Da>+l+fh$_;#mtX1-uC-D96X+ve;}-D;Qkyq(_VxK0V) z`7VtaqD>+7mm%WHCh9Twi3bHR@(D=-P;&zg4yX#rfaO%Q?1T$_qydo7Z{EPF@{H2@3pu`{gKuoVc9e{wBEEG@|pZ?2N6xrslEz*To$tutQ)FL|Vw_u{otJ{{s&&;~LGi5e&tz__ z$Td&lL4Jb8G{>x$ls!Sp3xk~2LYEv%pr{IgpXJBM663AXkETnN^v~^X-*XqAKoj;b zTdnbaf`{^tw`;%G_;?8(Ykm)m8aoBUjFvMYZKcjJ%p({cV5#l}gVX#V5QzOK&Etb< zWmF}9QI{?n9v9bEf75H;;N)tc2Itu2@l!XCw;x1&t@y%?`QvoV{P^+5S>L`iGd+&0VKSbJNw=$mWf?>Yi?5i_4W zF(>AL8ATuv9#&mJ5x&uP*G5fr`$TWy`ns$zC9&o;GN}K$k@I3zKu>E+$CQu;@{~VO^tpQdO+VZ6q1;Z z$8biw3(fHAN}qwNJBQi$1A9U4pN^~T#6ID_wt_F(v^1PYHzF<1U%NTm8R@-luFIs; z_STC5pDax1IxH1DI1Jqge_s-GrhNJF89~(ODT27PQrTMJWYT}x*@915ropbc@<&aH z@gWYA5Lr2clLC{VXUX?@18iVk%kDQc{cOFf``3}o$pPo&l`>H$8W-Zafv7l{CC711 z=4(USCuC!E|5MEirUe42A<4mzQlYI*8?Wz!HQz(#i&>QPl6&*a@lRp_Tq$Rs85Y+0 z^o>trNw`AvEAYdX}V{;?mu{8M6 z4Fvo$@;q`0_tC$JiL=%GtplwD^6k?6h2=62wI>DjYf}pRS63Y%7#+##>VG`{-+O2O z?_TZ$2tO4-2vUj$AiSf%zY;EgK><-k4KYczcN9?9<^B&8;QVvg^!Y)^#6bXPLO{L!0R20K7ii$d5j?HSbz`&Cnwv#9{%sy8G2A+D1ZSp z6$`)twvtNpQvoyqg)4zx#RWxs!^{-0O2If7;sQni2qMz1Bn~UBdge9& zGGTv|4;5pk%mf(^pLqDmguow=;F_rxVM=p#~~+q0#Hf8#!i?J3o0Y#r+*BOCST z6$^#U?+Tx`=AsujA;CNf2M4E&k;4828H|&qLepZ>J2|&76?b_OlSW26RyA4__PGFOM(xK&)@p>HLE@{j}Kd$Kw-VNiw9oqJBQ}SQrDd zU{Sphh@|XI=KT5!F%|J(pJ}B7L>S4&ol@XW$;se?;LyN{gTf}caXziW_?iZj5OlvO zYHQaqE{08lak&jm{Afd@hN#u~Me#Pd9$lcS7P1GOu0fyr-Hb8cw@jico@JfsGcb(A z4!m56P}Bl8@A6k&dN&o@^Z4(gU7ow=ICLg?q@`(slGfDEIY8aqX+J%2o#jJ3%N2bz zR##qWV5*#a)5*5J+OMn3{;s>_nmDN(HMdUn?}RD`gpYxktciO}BoQC{lUXZ0em)j1 zQ7FW2p!lpsHvqc3UHvP)?!TaXcK}Z1-*Q|hJ?5vEKe|R{>4KjU?riSY(2t*u_)AD? zIKxxudL^W%mX$r*i5Ym-D>Z3OwYEw)o2)&~7vFzn z(u01kE;!2M_{yIlHMIJ;PYnEC%6W?8PRK&fNIzG_oaVs!@a>gqWh>jQKFOVNv=f9K zvY_p59N)z41<~odVd4^fdVp0o9wxD}|6cPVHMUo|C>L?!|CxjJJ4ap`_WX}L9_L1u z1dY4=-6s+GmwQyfY@YPVSS+OgHDa$))|IzdxYmO}T()rP?J`#a$5;IGEa)>w8k4=)yZ(>fqd|fME)l>VluH$5BZ>pXOj$Vn%)N;cez3Pe)gd2k%?lz!ooX${>B?M=+(2- zF%DyGvj%tPM22a-Dt<%=HHfyKVd+?l3v}(keRG zzdA%cH&Z@vaAGO7s6PQEcLDReYGROs1$a#ODY|U5?io^a5N^u?M47tO)y{eSdnNxe zX`WiAaRafDm4H@r3e`w5_i(QaAZeF3GeDs!;xN(mY7jdLamV5vz7)Tqw5Da+Ks`3F zS?d}>W2UQjbjA-Hs11nJC*MAF)9OF^#T0UFBKW3^07X$&>zRehMmtEoHJ7cM9T1`D zgLf2{+^(~fq^$AGw|>5w?kK1$i`0%kL1*BncPIUzX67_>zHh+mTtQDZm;YwrVQ+V- zAd3Ht%KhXJOVY_$%NeW)Iz}D^6{Iie516wpYgsjZ~JdsI~T{AV;es?!>5tJ z+_I8Im+uik?3)gk9Eb45W_^7vxr*VoN1}kGJbS*>B-v(kiz#>xZKWSEpN$0l=uTsu zBfT)bt7L9fDoZFExb!gd<$5}=@s3iOv2%rX4%x1tpB19Oo(N~qh5t@xLi!o?bgpvi z^iln-Kl~CH_yz~wg&IiNsskxY4*LdHW!r!C2a2P*xmcPy{O?xjeICaD!Z_C-Fi!n0 z$^Hvp|AOH1VrmlFs_zIcsRK$pfxyJ%{JYf3$;k=|O9k*F{pD0PR?wf8ii1>u4cj{y z{|9RSvCf~Hw-4_#M*jHu%Lb0?UqD`w_O2Flva|mI zTJ3732tcMF03(oETgx1qGdMk$V|}d~^mOFhn>i|q$UOGGwWX~+j0&rJ zGvtbxT{?a+xGkzWLqY=#f(Rxebm{9J98CcIFx>tzJUh@_6dV98a`o?eo@8T9D2Y#HN^b4%?3*G?oDL5-cMqw?zSiWmuKJ^=S(Q89% z3IcAWwf$54^)&HId}Un~*76?kh^+aRd6HB*05E{KZ+(|1-X!v-rVf^&+qV4rQEPDp z*WQxe_9GA+8hrT`tKKE4-UTLuPMi zY;6S}jEfs2rk!>Lr(zDkK{c`b2<-wBuwKwr$p~~u{di0PW-advc8DsS0<@=wp$S;% zh1x}A=Kz1RE6G0rTJaR%sYg^*UFE@Y2P_b``=B-mlM#beU@R|>Tq}p*^!$Kx33-OQ z1lJ*R&j)hg5Ckl&oGIrbz*@>nPa9J#gI6A+;tUCcBU|^3{;ok&;ij<;ew|R^mV-?NRJ3_GpF6C}DmVx?hY@5evAAQa#`0#Uu~>f8T_ihuu;I}ggwc`S|TxC0x} z8NmcSM6mCHvF@%-dq?q#>MoWr>pAgP( z`$3wSMg(+`OCuLkJa7Klg$h8Lg0A>hG32?bBfYI0?D2_0rd0SvScI~#JEYp*72Ijz zju7=f_s6^ey7|!d?TEtW2U>l>ZCrc3hs8%{h4=i75}H(kX;b*jIdyH8!$?@kXKBVHq4yy#}F;%CDX6(~EH#J2|fg%y~d za$8>gb?bzoo=G$zP&8KJGv;)AAU0TTtE^c3sN3GRA0nO@b|JKxM9T=M$jIhT*Tm!$ zOQn~atNvBGcJq351xz?Xd3@QCLG~#Ova%m{%gMEQ@3Oz;gfp+uk~*}29gaeGF=vyH z3935en1W=Ip-^_Zi5xkBydzo0Nc;vniPDOY@8-2AFJeCcddePyj$e-d2^xEhEy!cG&} z`w~1x(iX1|6Qqd1`0%LIdrSF0Sak>20WCSB0+qIk)uzvIQ$)afYV}L@*)q4%X};EYCb-^|+AW#_gh7Va6UB(dgz^%)RnCQ(5~; zaPY}VoeS%J;&5Q*m^mNo;=zmhCJMV93+;WPRd_RK@o{h->}G@`BbjK@ejnq{_Izd5 zkeLY!PaAa9M?VzCSqujqZ;O!B4CWnSJ`mt}VcI%w01lT+Ga%k@N z=FF@y(#av%1?$L&cmr89Hl?N2KC}=vwJ2_!Snrt}u5$o?&jh%vzSNJVPlL?Emki_bbEm743Wu8=qo8gNsYlNH+u_7(&t&+^Kf{kfiJduq&U~}SLr(ma8#rK3nMWTv7C&oD< zAES*R?}LCe>Jr9+$f2!BLFZ%3SN0jbH|kD0w*9XCuVAW$o?Mrm8?t8j(lNmeof{A< zNd2wQ3x+@xonc*XR zAT?R^rS}ZTX)SgbVj(NIFqysL5iLLYDk;JVV|ZE~9?eDFQnXMp0?eXi9vE*Z1?iNe*ma zCmsHpy*F32#5<_=MO3mk-eBm*+nR?vKbba=)!Q)n+H4Iyvh&w3v9412MT62#fCy!e z2B6RPAu>KC^G|flsrw`uBH~Vf$yro{9xCgIdEh@r7&UniugSUR>k6YS_%6t9y z*3~w&)ev3E)o0eihx3g+@>!>{WCexi^1mi~s3e?b}sdoh|WW4%lG9Jr~lh>1}sY$8YY42*c~ zUYUVe%RjXSP~JE@pFWI>=a5Y;>_El=u5I{QDwCjMoR1`~NECx~pU|5swAexHTv|CV zu5eh0L%fxj3slh44b;`}72^Q9`MavRT3BZh;}~IxhRSVi9RlxXBX+dQ}|rDPLLJTA039EP)zNVoAByXXFsVUpj`b~ zS(0u{-j5>+x$JUyuyg(i#>}A(IC^TKLT8kuJ!D*BGL$NO1UoVbCJ*!#m z=j5TfacxFBz2C?u1}3476rQL^#M5J;PpTq`x(V5D%9363bCtc5~$aL9T{9vG4~qKIore9&?h6a zawpbKVzdrEDX3IeEZ8s*b8wHJqvB-;r)AQ)LnZ+^sb!iqrq(WN4ZPWw_buY+EQxQW z^Ni{-MydR!J~gHQcO&aY*os3sV!I$LjIT(ZSQ8GMp*g20<}YTuKPoe#u^2Jvv9N5Y zs3`W89DgglR4R1UjQqA6Qu+!FnO_7H>2+GCUS28D7WubOz9T+Wu1wp3*!g<9z@3{K zm_CP1_zlQJA`zusW)`H24gAWKd1?Ax7}!k2Xi}u3J(jx)@TG~E6g+Nxzw?iXrY;hQ zGPqh2Tb3xPxFWBcklCh}_p%hblrEldpOTb|x4#8#a9n3qD?V7f3o4L-iqv?nlo%xt z7&+Sa;TH=0Z2=Y-FtoSNL1|A%Pt;ac{*De@&K}tj}Pw95>g4V?Ix0 z*a_ea3>;Mfx&p34)#Q4HNcCY;Bn-DSt9kYI_g6bp`=RgQibj3mcPqlws*3{P$f$yM zo>iFXV^B~8+8bl>s!9+_AeQYpb#s@0c%2D$4h>cNsrxA< z#uc;R4HN~x7@kp)+~k_F8AD|EvZjK=8P_{`%ajTLZv1!(=#Cx*?(4Bymp=!jFmrV{ zrcD|A!dYcYROu%lwL7fC(LxP=V`=b71R7Z`2OvJ_mV9cOFHWo^@~#?OM7^oXN*i_o zyJX44pyel(-g|f9l}4;hVT%YyagsHV14W9YLlLJCjSa!P+l8~7IO09tSc_Gr{)|6r zIMWaSA4-n5fh}JoqBaOT~Mn_Tf8tt z%8SfxajNT)zAuQQirz#tsCJm0wnU;s9dmDu{T@9eA)6a#RdV7dfkexOs%G!>)kHGL zoJlezqU$$<8;GuCT4B977a}j42vJfJxownnwig1vO+0LJiys&zZ zE-Jqo;%uDt`m~SacCf1xsMASXuhQMsIdIjeuK{@jToBF8HRbx2b*1jV!A>%SVrAMu z*VuuPlxKe^Z9;}LBL zLLrF!nZFXW^J?$aLJnDuBMC<=*xI=Q(603gp-RXWsD2gH_D8H9DF?t`iOmxp50o5# zjFpVbCAn+kA8HN@eN*VAQ&~ZO-fZtsJ^ttQWDLvPO3fvao=LjTDjxL_?jL)b{ksfA zBUGc)){ZTfH~U=bh**iBRIN zr9q`C2DIevXiyS*hP^#)2}Wvm&axf!ELJ$updt}RWm_Wj@a7!^y<5Vy|E&m{lFVDz z81gL}i4GPI@uoxR-<+tJyG^U{+pvmyQuRrSh6Pz{w^96cYN`H{NoiwwP0yvwHl>!oyL)Xy6pSgR@6-|vwe?e96Q$D3Bdf>)BG+vTd$CuCI+4x&_ zgRy?HaY@OqRKCJ|?Lh0!iT$K>dD2)b%AiUL*x>FtW1Srx4&01nH@jD0>SvQ^CM!Z! z=1-Hi@u#9wXovne4kUKJ2_FtRX32hNi9~u1Cd)u*h~6yG;N#_W1FJ$Ex|Yj9HfYYE z)CK7NKt&j`$Uo8`@G#HHg)NCMacV@_4{L!|;IF*O5OB6X)zSiU=(VS-cM5UbRI1{y z8q*gx_@N%1WswIhkrILca*?iVnc({4W8}o&myhQqD){*YmWzIri|YK6bLjhX(e)(; zq!Y}lHRNmIEDevyk&8YLsF=DEe`pk(O9gT|D^W?g3cg^LoA;T+QYf;$&PayKVbsYd z*-rgf4FZdRF`I0)DK}LiepewbY&t_RlwaOA>JA{B(`mSI&Ke*=!+@L2md zk)=Eu(hh6OkNX1qB|VT=94czO(7KCDp3K5usXOBNHOg18tFVsWw%uk5%DT^nd%}lS zBA=H@VsWwf*;;)F(XRhkmdji`9#OkO2gR}=u&-&e;gQXaK5dPrNz{r}GKS$IkS%t; z<8Vn$KW(M-hrjV=U0)e}4OJ|>X8wHNHgOz7|Q3vH@q+SholU`bq=oE%ljkJZX za_dN9HVj)y5}Nq93s%mf-bZt>fPg&CB=d?e9Hc-VzLNuNga2jyr- ztDDvd4QGHWk@NhQ;oAPa+I85}kMqke>-l_1vdt1e(TnUC+R%|Eqts^;fgaQ%lV4P-TWV{S z>4N8g)uY?nKZ=8-zk2rhwx(ZC#rvL@>I892I`n=WNXt` zjItsFLpCe*7_6M#L~_C03iiiMv&=9afe+t~<}sSz#O#NjqCO7S$ok{9^ab;`qwL&% z6uvhh*umMAH5dO;tp970&Ik9547U^*KYl1s>U>6fp46v=j$MuN*Ohp7rvjt6f^T)v z7#v?i`bvXXkA%|Fj>!D(n|S`v`X{^=+z*i>p#HL;f(UhV%I$1v8L7pSr-KwdI=Khti?5sz{&BrA-CLf1*;2Bmhv0)a_3^ufv-rxCFpc>D445BE)=ukU@X;=g z0K+=#B7YWX9PL#o1_RD+Aks1UlYwDs&4}G{QER7&T@7kW%NW?~&BrW0vwQTaei^() zQtBcCNrK#O4QRAYk|T&;)0r2l5FxpcQ-I4BvWb>?QVj0 z^p_TPjx549L~|>j#h){-W`Abt43#la{iM1NnK7k+s+J1LlKk`VGOCal$Ocv~=I{nH zEZJjw^+#Wi635EW#GPJd*s<)hRKkW)e&g!TLvy|5uS8L?oThMbX|BZ=i-O0lMgS%I zaB$*U2gccm>u*u%j|XPPph5EH*^&-G);IlyBlX>|4P& zs`sB(Fs2jVdHJtM9d;ob=qh~*Zh=VKrRmRm+2xdGH{>VE|UUnyks|ei5JnIrsjW1xU!wiox~MxUg1z#tn^7-=>e=!{YK1F z+E+Zz)U;Y0v~6VXw@QT@o7QHb7&@RH8Rm=4w_BR_8orsbZ&WG#%#HK>O2d`#yP5BYSy%Yc{a8#R-9SOh*o#TKXk_Od*+~Q$3LQ?Qrc!z!jcS zccl>~1QXnDnwcs|DD^G0Z3AF;U`z?o!>KO`Q%q$p6(@?ii`GNpQd!cX%R-3#&|6%J zA1-CO2La9nQNoun`IUH;Ukj_2A;LaorcI&f_D4j;*&1N=Ys4sCu}8?E zp7V7tn6bY!#3&3z#op$=N;;*gRU17*=~Plaz=EPOO=R^7awSy-0O2#tWg8}iM&hXn zDN@h=CBPQ9Fw7g@I}Kx4jDkqK(S3cW=X0Uaw#5=G;%AxOD1n+q-(N;Bj0~G}d$;H_ zu%LnA{6e@ZrAd9*Y(N_)LnhSBhT{optjbVNp$uP8avx5Bx5y9IXnqA*?OSLopJ9~7 zVyf&x5NsT>O`=Rm-d`!*8rSvgfIH%~4ywn3sTq4V(axl{162vTEwD?z8hbPgl%LFc zqG*ndP)_6jsO<8nigJAQ=sWUcGtFI*IG;@(id(M-&<^>=10c?b%c_Qb*>_pehI;VM z(TjQAQ!@!71gsUucGS1PqtT!xhvd3p?K9bZNLtKBy{fJ7c@1CY0?bJ2uw`fc^)fvY zY4&W*_{<6w_cQ?o&lbfg4${3R+4k62lOPVE%x|YIJ8dx527AKQ2z){kYDK8ZZTY?i z@303-85T780_gZoc(fqOy56+sW95LBY7Gec+fby zrlcMb{>J*nby^f(#gpyR^oIwELniE-6ZLPM;ojb$UK;nFzWrW~L-te$)Ewv=-`X(W)6q`6Yj9rxB<6+E9^o8jFQ zw4yK3Wj$f8TuoqMpw2mC|EUc>B*}Hehe7+cH2yF#J{&n#V+?=Eqy9|_SK>}IKGT4; zUk?r(3U#PZU!}I(fhayM&K?ksiu7~8zx!x8o&z4+9TU8g15u>J88h$W?!eA z2euw-Q!FEJwHwQfFTZaPyl0`2C1*P+j?X2RSRG4J>7A!K79Npt5+p?N#V98#WLq0_ z_vFw2_LB~Ot7&Y9qtrlhhEiM>vaqB6hv-cy%AIB`{j`q-JJ>m<#l94(g`Jy)IQMMZ zy90DYa3{~`NsaNZI7LBRKS*@D^Hfm)vcI%jM6Bj_M9iH6vZ2S5 zUgEiBBCS}|*A2Rb7dO9g5g0s!=m^r1)UTf%rcK-7F=*{z{Pbc`alPGt4u+h?Km-CJ zN9u>Cm0=`sS2P~*(-GZ{1r(EH4!z^w+B%*Vfb3d(#=w_q8x7IKO!DVzuU8ik+k`Hm z8E`1;jrX^8h|AZZC$xkjX_Zs96$1q&Jw9Q;@8asAKb=!)>xD!|!JHy*NL42rAd3RCgSv2u*0HqjF?ALTOe=<%y6 zVTwT_k(vgBsUgl;_v&PTL*EiVxs4#^oush$)rzh-naFT}QTn}bd0&({uQyqhyKbw0 z=lP-l_`VCN^{dT3BWYS^$6&H2KEq(b@i|6%6Rj`IJDW~FYQw-Ot+-7`1+YV9de0vD zhDbt@Vt^g`w?bYjM!W(>E|E5;V-NjkDZ7vWFpDtdXZXa-#zgs(L~5loNx`(*_4Y@q zpOQHZpXp>I@o+Um3%H==H=8gVxF;^!=*>KMS-ZT>zl&s-!!q%1EsRPmwrgP*!HpX- z4|EM&;H!`btl+7R4~P6N1#l=Ub16vl&tay}eeyhR=JcH$67UEUnW-exjRoS!H`@G4 z|CyvQn&uHkScq1`^jx0+27uFCxVz=0=goKo9lJ3MP;FGlkMbbvL-!}+1bqueP$z`+ z{zLegw7ZWkuD+~6%21fxrg1XP$Gx^kJ$T)V4Ywr2Dab?gQS~ru12{amn(K04U@CC- z1z5>JyRL3u#blr2-4oH$L#rV(>CY4nRkhvPTt!OSXa;$0jdft8k9^6baCy5CRrUFR zlxxIB&LtO&uIwH;@hw;MMEkt8R+1;%{%p{e*rJJZ;@@e{&z$jCriG;IklXPD)Vlbm)AfthC%=x`mzD~M6Gz`gs*^1hlP zXszs(g{g_(w~emQ$|Y^bHIzC?l-s+tk^!oM1&Ta_-!pCn{8p%x$RGK{Y};F|-R~F2 zL1o!5D$1`k^Sra=i65k!{B)yc^=eGi1zN^{H(lp^DXey#da?No40g}- zE4o#+8R!y?dwLHOiehuGQ(fw1Yi#w#K7=W-I~IS|Rue)$jN2F0gBXVA?yn~jgKVl2C2Uo0rjUJ zlJ1c>$SsvXYUjbgaWq~m8*lv>w8aznYv2rzk6hLekE(^y9I3{85-ofIvx~AbJJ0NaeHYmJ0Ma(F1^bU*I(n8AW(Rw zzoNPaIeG_-j(is8i%s=nD{3#bIBq?!Yzz40y*0?+HXjuHcaHFqzajSU7h(Yq9TQacK>ldbBx%ZWD z4ILs7ah(|1&pEU*D~5@NI~#fH&roTu;aq!kNlufixX+lT^%OM6GENY1lP4ViW4zYI zk;PBe6r*M}HsVM4&eK!fiHF9x#R9*EKm3tN))Tes-!|?8%@t1)t;qS!r79b66i?oW z>ZY#XjyTnci*J?I$3$|1J}W(_jH^czEd{2)m-f&-zXl4stN<}%f4(tb@fbKeEaAob zLsc>QFtx<(I8?|1)DACTWryCU=#4C1O<<6cBV0r*8ES3~$>1Gqy`K;6v=QfOli|m9 zGsW9&3dj*^l_Z8F<7D{M2HXc%VcN;^{hK#eAW=~Q?@SbIbph@v4moj3QJDE+hdw>P z)E(qiqchklF}v-%y~~Y^qsyai(0z=tVPbk#!%!(0JXDQ(YVtKp7hPU0UnxJjEbN=W zOS?d`Y5sB$6g$|n^@$O)a6b$V8)B$*f|q*Fjj%ABp5A7OgQtLaQ(G!TtD=_0@*U>W zzAc{<%XlL;0DYTn(V-N@`HFIG5tkYG>q)b(eZwaJKl!iQ$sYj?s<1E8*kBQ$0@>je z>L|OyiI9?PdNkv(v1z;Td$qY!s&UH7h>A<1dQf*Y4Z$EGorgHoUpph4fA0Vy#194xkHovpoJUhO>k!ktS zN~B7Pu^D{cYH2XlL!E&4@Tjz3FQLx3Jg_+_dx$4n4JPwkk{js0@vPHsqGtCsI&%Pt zhH1Gx-AehQ88uHyK0>pW39)p*jqq4U%>j;>i@Rnk{Ii39-~9KFd5558DdD;Hn0d@# z=Gx4>stUS2-;*aTH@4ED_$z0{zf2nn2kRLJ;)g}{ogf1Ab@7Wi^2KSNj-}@SA z9|`ZAv91^;4HZ46uS_;tkkFARpN3&u);-AkWo*04uo@jEPQltGS`8fmOVfw?M8?>} zHBKm*?C;3$@;KkMovH>(PvdS1YIti)t6K$ z*5g6;H>N<^uDy+M89vq|QaAhn&K>Cp^WKRHZ}A)cAsD10;5J8=6*e4IE_-z=ip zrDe$Yl#M6_!LC+tMlD(bJnKj_1>&gb6fjV8s@qqhmU(wRQgOaDzk3AYEIFF5lTDEf9@&s!d8YPVryNwqymXTA?BAwnkS|>T|f(oY^g*i}+wjrx3)a7G3M_5tSZj zmV`_2zFtmp8w%@UYx-?6a>4G8g$Lwo`CO(3W-N^hn}sz={@LLLR9?k&R^o>#F`OMS zPH$w(!HnfGHPiRwJF%X?@Xb#pB#rrt<{xj(a`-W}Yk!$^4}0umTt*DWcy5S?^?=R} zmk3}mjaJN0Mc$`%sm+PZKRNv5o#*Tf^P15_L%}SKDJ)TsT=$`GI_WVw80p$4D0pGm zAKdhjn?+qoZ12RMjOqLI##c*wU* zU}ha(K4Vg@8zVFw?-*ygL;S}uC!u4Q=G(JL{6!^o5|eIFB$o|eR9dNv3KOF|!Q;uA zJbAmz?4G>pm=e5l-B@zoSi17H3vBBbuw_Nvz-lNIrMG26wT0NW&2j+24f7{K_JEQy zR634@^n=6&wGb6$0}O{Ap_!;bqF86y*+h&CVL%j+cA2O@O)zUAyItiAky2-bpn{}+ zgXn-oz|R&Eih*G)OHwHdVM2dPRVw>Ew~j!$4Z$KT0V5^SH*N7-jHC|4U^)k^*X8h5 zQ`px<=!^HqPv{Topx^MtZ0NP(xK4D$QBwJ$s)#~hABH?`E`a5C#q|Adlv537S&k$t z$=rz*S@Zi8T0eH9AZ`8IpA2PgP_g zpAu?0Ss838r`+05lb#qMQ~x_Ym^fbq5`wi~5Cj@jQ=Q(GjfV!#UHd}0LiFbH(}F*a z8t$+^&}7Z~bAdq6Hzg@_SOyH4sTjd41MLg{P#09l_-b%WXk=`7FlfpRIGR4N9gE*! zaXm~R@CksoQ@Ht#`AGTwXQj ztSfW9X3~jHcv}#3R8@@YIi+=5d3M`;1yAE}-I=%s8rK&+OF1Z84ch>r3W8tL2rX}1 zTgh`+g#fdwi{_2l;9M9=Wu%X{hKg{wq`c2-$XmY_q7HrL)_2dUuI{KVD!U0Gg-Zd9G4vHcXg&&Y35bM=v>E^tI zT{?J5*@Quno*(y`D(d^I_H)n^oJ|sq_g)L?9DJeEe^uw4VXPI_XYM^6?>4lc15MJ- z3%qVF+NP9#0eOrGi^7^j=x-vHnWn<{iwA68WenV&V^R;1FKt ze+J4#8V1WbqUf-}i~YIjX?;#gn(VxxO@~ho)%HY}s}!g1|TVZ?Do!b$?!P zP*|NOrn2kZprqb{C2S>r-|3F7ee2O>vjvE$=u=%X0|nE0j!4IvEoj3!8{(5`&HsIW zbq{qrLPpEmk2%mx=0~HHY{w1`vt28o|-&>P2=!hIr)s2>pL+H3ht+$3`B-BqK zVJeZ}FRfX)b)_1zSCmsTkxf2W{#-II-po`k9xkV=mGe12X-OY9uEDYU*>-#uca(C5>2P~`~Wz2p-u1qnEX8zB(+!d7G|D%A>3x=;roj3$=u?4ZV5l#{eViF!0?VI zV;oo+j};Lui2h{gQ9v7*_9pfkOo*1G2s^jokI+(CZPbWMr(CFW#HcmyoO#1e5m3PU zys>-tNDGfDYVEc5qzFgPu z?i+ct31rIKYNW5c9mM#jW#EQ>&X3@z&4MXT-8Mk7e)Og(FuplqQWnmRn(@cBrX(T* zb8QPtYdVqqA~Mm-?ws6m*GO&SPGo+PCSSxHK{XC!ww;nDHEzO36I_KOOI3dx* z_@1n~ls)aLVgCt5t~Hp6)!0 z0{?_aI-F@jKW!||aO6_-76%*d#`sjg>Y7QfZLqe3zHzdFhLA8sReK@o!?AMWw(z+* zC4-)wvwB9Fq6GY%YS^%8(jnOx=r&!4c37wz8E?~dWjP1sp$-6U{4+V!XrQR~(2dDy z4PJL{#Zh8-5xvuOiExdKF`G8??YqM&yA1t9QiM9eAEQ}{N6H`uI@5Yn#j__DG!(oV zHf^Skt4BiUq37I=v%`cBLz~Pg7W#~i9-i0D>2x^R_J9;r0k1;-;+DVS`@2-0_KT8( zR)_4T@kpiRhuv4mwz(0vLInY88%w66V6JvG()g^J%9$AvntCU`FYD5jo?)v$J+fbg zg7-Qn9J?_bjofudZ5==3cN}*?(xKjI}mRaVB_;nG>J$lIJ!M@*5ay>`$>P zuopaz79aAV&`y9+i*d32SKyAivbKzr?0D};eZ|CjxhwyLb4Qg-Kad1btgm8Cn-oCuVbUAf<0!A)8Gd-xo8Wy2LwRO0snP*rX(O{)%Xq`}4W?1`TFUY_ z`bQ51jzcfr%ojfa@+XdIQ9A8t$;`+Ru;1 z#GLg?28zC{<3F3t_+?e#mcCqSn;INlK$cNtwD7>rD?i&SV7IsIltDyQB*(t&Fx;o> znb?sVSeihPSw4A9tiD^Ff-xnsyD~A6xYRmBywkzgvb@_vZ#R65{objlOpVXwn&?is zGqA1mDpp4fujT-#J}Q8_?$nbkzXW6RQ<2hMsj0tzA1 zV+O}R*1h|M_y?6`nMa!!1pa|xGr%SgUOhVb6{u?av*4W?5Zent8JdICI(fu6qOu%o zffYP@^`yPyJB_c4#+RZT0{! z=$Ulazrp-}2LG8E-x~OqiM-+twwM4=8S)3YgCT0%Wc^-9+We-e_mcJdL3Qh!rox5& zF4&?9K(%f0aB&Ym4vP4-e4#6ZbN!OF0giTpaC$|xJQrbTeCR$_cY^>#2 za5An4U41=7mjvu&)}j1D2F~zE5#vXrA}nGhr8!Bwq)Zb7q7j0=t3-GVq)yiL6AN6h zRiRc_gPp6G=XlU)wD$r4`eF-$aya}>;hbmG7s<($gqRae9BEaThl@E z<)Qwv83Iu>0fCP8q18KLuO-sMgu~2X8UEn}?|i((V|I|3A9WrW8eh6s)S<-mv-;C6 zMEHIHhkG@iQ8N&lA$QkJo+IK+eUlz@{sb~X260S!Ti{Ugz*jHWT|}6uWsU}D3235L zr7!^!Za;s+w}=3U5hR&#X?03iu%hi7dKHE8m@s?H^C4SJCCTNrfv=6ngFLxvey;P2 z@M)pdVf0I@H_iaRfBEkHu5>8N_a+c*bpu0oS105`3x~J1eo_zb{b(Up zSLg$!PJWGaP8n^~h4Of#ZhL=fB{l`2v1?H)15a1{vJHSo?IotEX;qq_M=deB@E7SR ze(@>PJ}3355Nsis6O8B| z$Z@4mgbTopzFXLF8`8d7v`~`K%ZF5*;3*aEv=38G%H<*FPQu`ZEzFJU)1bpEi#w;C zTAKBthT6pYBkiOMe(0cY+}XDAM+tU`Pq(|0-VEq+d=kYUcvtr9`w z!towUW99Np_DCHVB5alzkAd^bdfJ@p@7-vcTpKAfPV4ColPO=LC@?ES?Sr+3z6Dqi zm??`#DFzPzpl}KI%vL9On&f83kriXR6=)$#f>AvREg|W5`^)(k)^2P9e|{qVFojwA zVRn^R-^&5!SHrr?jY7$NL#nResAU^UWZ*Diq?$^gTucO$)JHEp94MM08r(qlQ0=Z4 z%fs;mQrpWGWtMg z8XOu|~^9(hvtIf|@zdOfk{u1=pe^DrW%A)f$am7|4+KQXfq)&0ROBsMJu021pzqOy=Z96OtCmN>Vm0FY zr|)@n@9*x;Gy3Qtfv}(V`t!CjpqB@jo4))@65Bn zk&@cNt)ik-Zv5eS4kNHvhcz=fOgkL(J$0o+hEaVv2H$+B!B2_JZNXoJifc8-N}2xN z`B=s1H)V5sgren5Xj%LU+EQ=AH$k8vA#35s6HQBWn$x5)7dne2@1wv` zfL9V0Gy(0omLm#-_~8J!Xc!?O!|yoZ;$weh#p&K?Rr;G1aVa2lN>eBW1jfW|V#$!{ zCiRPeA#4>vX5B2SN+h?)@62ZiLIr=+Uai_N}KGnMU8Yv-et;#$W z<)MP}&*OCo+4Z(FMD3!SJx|F|+Ue4%Jl8dkE2=f$MHO_v(K!TpxU5obzuL<`kS6#} z`CQ??WUE&7OcQ`=R%biqp5PH~@9HBh1c`9W;c(>+cT8~(&J%opkR6kYcc3|={T+;< zK)6bB{Rk?B1%C>jtIDDavwB)yraoKeLMcdYWY_939gHsZ@vRSAYHX%mmJ~UPRNtGC zP+Fra>(_Fcd8hy zZtrb9(@jcJa?#dJR!VFM&iF=4P0OXdI>^Mhg84-OL3UkKlw@4y>UKrC3RR1{Yezc} zMLJ#Yf&r8?!xF{kKzv8+2oK)OQkAC6JNDk(MPv@Yq-f(R2%pwJcMwT4} zC{a*UzNTTIMqX+jUB*pI_I5DVY{dHLvn|f!$YVIZSrT{-ijt^$;Qiufv4|4y_2q{^ z4Pg*DR@nX07w7oJNSqL7%@De{?~q!fRY&el3;?;(`Nx@%z~V}T*{y((YIDgL4!34& zF8=Sb=X<<=T~tk`5Uwo6gS{Tp-KyPfciGzD3ifOB?Q&SP?(H-nJx9tjO`N7*PPiAk4ZO>LE&Vhf^?L+Ah||Wx z&&F>EMrKWlZHka%ywkE#Ot+Usl}fGI1L+UK*S z5nYQIWrahYRoS9pt%9Rbp*pJjxIT2}Eh6fp&%I&`$nDrZv#vH@u!<-N`~C~{b{qrC zBnhqLr*-`OXBYsEXQ2CSDg3(5S*q3F*ZKU~@7m!K3;T)OC-)Ni4Z&U&x5bgu)*b+R zO8eKjRlGO@dwG9p5ptR9)VH1G$s@2Td29h}Cx)>gzS`I1wh|&s2W3ciUrk18sHOwK zJMm|?ye#Q$gKk?cC7i-HW^kkT`hiu9Z>f4pKUzdx-Papr)&}j#siJUtE7p>AUnSoB zod-q0St5$I25O4u%)BsuL3SJPuJ{7zpN^@j;{}+)(|ENiN;cMeSKxlRB1Wv2c*D5%x z5?RWpo`m{sspb^tXKkG|{ThBcRoDZXKi2Yj=;2wM{qIXpt(yr_SA2@CS0li7nog6H z6}KF_s$Rt9trqXg=tRGFjwQ`<{FSAZVOR_L_{W-m%u-Ny6eqia(BTOi^-ckEeDrmk zyd{bMNdpyK9c7{GwIu%lLF}*A7{zUG*vyWpjACPw7(UtIyqg8`Bm@1oHYxHhonwDU zV+m#32YBI}9CH*_>23#{bsQk3$Dvj}cpi1Ff4AWCIEt{&(KjkU?epOolJnOU4KWX| z8k$K}M~kGp1++4lO{WY89e&<|cvEV%>>xq*Nn|^do>t}?4jbHNn@^Qb_RcxFS`2w%pu$fKFu~Va-yVoy;W+j%!bt%QJvhv-#(5{ThH?qV#@^Vzb04DQ8!sx=A zEpVEu1Kk)(U-7|w7ZiBWSF{pLf(}5o_k@H3&JVj}RrqRX@^7I8N7ACh3^&{R|oj$U)?7W^xf{*ucPti3sOnibS6Ql?#=^4mG8RryTZba` z#R?_{x%IWkvs)b_jUX;dc;~I_RpFMPAH8d>%a^!c*{fA-;;lWhVzx)r1e&D{B|pDg zQtgDjo!?w!;0NN~R?Q?vIOZ_A`Ncy)Jbx}_vXA`6`T)Z6^rW!uUwhILcSF{im&$D_rmakXLNK9;G87pbLH(#Kgr&O_R*EME@)R?CY&=u_x033jHn}x!$ zTFm^Z-$TG1-vnD*kS)B8!tqu);%0RGi`t6|KTR>-H7U1%bW2(B`Xsv9$y?akgHJb% zGYYYbTj*a|?TQAuRgyexYGS!Id5qqqd#j`n_0$eO1+l0kvj_6zz^D9j0j+V?q7LXV z@!Vq)&Hxh>qwC_#Vksd#!Cm$FP3aYa*5Yzbt~$}l z41B-M44Y!0M(j*q0FM%9HP6%+-s`wQ;qOxE`4G;*rXQK$T`Cbp?Dy)TlKDFNzDm`z zBLKmg$A)=|DsGHq4bfgP#v3URmkXyUIFZ2M)_}^-!)`Y0Wr=iZ)k3h3uP+S+TxC5aHHW(goo8CeqS*WnHbRLGIO)I zxWdmFPn)(CCbMHVY{=aQMji7T8Y%shAaM>^R@L$|9Ys=i5I@s`2>Y{Kg##`IVrBtX_9 z2I&up_8^zeFB_j!iu9o};)U)`c?e$EG#6@D3OHK=B({Qic$#Z$%T$ zWLx3^B}ikk7OKBqEv6fChFQZ+nE(p2boz}M$lofkF$_iINF&T1xL9<%N-eBPbo!T_ zGB@5ch07_B zbuP5`UTtCU-lmM|xyb3UCY8#K+HWonrYUck40JMGIY6oP!e}3Nbm3+sZg@;p*OK6F z=QNZS^6 z)HPLFNvN9M`c8zOcSmPBRVB*#hu6WQ1*xK^E{C{kzT{yDt^cu z?}>PavSkI^^p9^2<(}fXxcL}~gvj2Q-NDh)B z1L(@au6G)Hried1=Vmc1S^z1_6!;R@hm{6umKB{yNpuE({|<^;EME^$W}#7A4O}-( z5M}!+*ucrwsnoq(wsASo2icAoi<-x5`gEiQ?rQeyJ0 z_k^<7%yulNO>`@g2N}4ylLJJv2BDu+IQZq^uJn1e_3ts1?djKNSam=n%;qxPi zxxva4&W?BsU>mY*pBv;fxYCVY7Bu3mLXg2ZT=f^AxbjX@MhksMaHB?k1MH7eHlYZE zI(l6%d0}vj*c0@a;*}eVwaQ$m84d+FAW2f<$z2TN?Cj)~FIXGZ&N^{CX@;~QIfdY7 zrMDY}``cwbsE?IXNPwu}b38vob)JCwwJ!zY^$cXy`5qQ$DlusAP)ICvVU$)q*G(hQ zj}6r`E4l3y4f(t0qD10C3)Gs>Pj6F^5w9nzrv#bn8a221C6Lx@Vp5Qu@tfsz0)c8e zA;))B*&H%Yfn|+OADx)vK#T2udqKPVI!Mj;r1R6eJzk&Z?_TdGGe4$SmbwK`Mmrr- z>b2*(1S9p~L-*}rJlg|T>n`Xk4Y?!YJ`Sm6H>lc+t$Q2t={PL_>e3I#OBE;~m9#;w zMpht5*YnH5brBd{ol-lu6-05^#~_%z4_HLuL03aHTXd(7Wu3Daw20}4ey}_)k9C9M zYW=YD)lFjDDnMLyqU%%&k8z#OSHo=wM{S+NN?H@adbbhZO0g`P34Si_gVW0$BKp*R zXbV(TKv8qff5gxiT+g>J{ zx<#<_YqFAKZ3FqEODzJK=f0g+!26b*K~vUWV7NO=^$EvkkK+m7b;<~7Lv07XRgl6_ z7jCkPaI1J%_1XKzF!hZ*KWd=*^W3EZ-t0;JkkY49q0_@2Jer?HHN@gm@w<5m`G_63 z0%I4&1K=WS%z&yCH!T&3RP>S37LC`oh3B@?%O|ulI>1O+DD_kWt}&v4iFnf{E0uP7 z%@Y-jFb_6;1T{50*K{&cf_!}X64YtDq~8xY5+5|E*{ z>OF3OsGIStFcu)};v*vkYxR3mC=^iDYw!C#0C1Bb)-^D%e;??Ho@NOX^nDy_%r8ZC zBrv{dy?OPgxgrnbm-I63N9c|u~YOKh7(GPgxwLi?Suj3P2?-$?wrm~ z?MIR~cJ`=jIiTTM#{Xg(az2p6=z;nZ@TWnT8+dFcagnuywC%-TuARkxR|L^N;}J78 z1Ta1AP_7bw&9!^mIJ{#L~S`eNQXS3(wLF4^n zDl8qvN?IL7=_gx&L^-f%p$opyLrZ=~$&ey`H|*WkRmvnytl8c2?uAP&Y;Awr@Dajq z3(UoQ1?(MHNqK@q(mx1z=%RRcJ9kpW>44J7b4`oNAMR|(Ooo4D5c+O=oqAOkR@GhX zV&2dkTvR-FT{Q@HpEK8_aHJ@KMHe2CQk)o`3lr%VtvVEw5cC;Q$T(1G9c%I57Q51B z?)Z7`Y8KKmQ#q;v_V5(QtXMVSf-uUn591?7+$ON^V_94g4Xhp~qt1s9EIQpn`T<5- zusxIIVwx->O-?*Jng}Rq(; zR^_!8%bmh01-gdAoXf_RL9A)pI01>-HR6moeu49mhH>*$*&LjgDJ4ek5C(703cjZ^ z@Ic9o;rb)$R_&0+u-FYt%{G@X;toALpB{!Z2t~Z|PR(RdtE>l$xFyZnD=YN; zvJih9G1cZ;cX+s_AD$JRCys;mbYp>9%mmq#@ZlwTPo^t;Y+td&k-a=FjRADO#w98M zB}7IM)ee{HeCa*E_1V))!edLX}e5so$ZD|0GN#FofM)SKc$!D*(K}P>Wx5INAJg z-^9MbqbR{g+^dlwKVl-*8>RAKujmpvA0iZx@yID|Xh7 zmuS#ksIpa6F6RgYpT=>jSJJD~q6{uLq<6tq$~g@0_O6OGF4W(^zB=m@I7c;lQ`lhL zGlsDuk$744QLK8VIshyt2Jo11Yk$Q-hswe%MZ0gxa7;=z-}NK;TuB`PNlxmnSafb< zv!65UOEh2yXj7U-bYj#LglCDZ!nKroJ-FGwN|$aEyo1YU{iKHRbX)X}9*nF6L8t26 z8l@gb(c0-GA7&|lA3V@alLkY>*h_cyEZH+FZjER{22I2Sjs|GZ8PwH{vvmu_1@Wgf zF}C5a8P7v)j!WUGs2K)7$ZhY=DRJk0Z#pPQSJ=zzFQxUX1n=qcDWS`|%%1qHKU@%Z z$>Q7+2LpQ&tS0pQoy8P!IEO>45spD*$?L9`X!^FdNoCFX4p9)G;lX99cJz z)=0&fnh5HV{sSlwq%(_Bbi(Cbl4;_L_L6f+{(~x~{t|(Y*273RxiH2Uqm*;W>+#U# zh<216LDe0Cq)=qaV5w^0T?p*eU1WGM8+r3~o}t<=uPTSCIq8;%O#7ZBCzo%cv-)Rq zQ#*~&ab9V=6Gz~!S~YJ=P+PXZEP5gil?8+5?_h8jiyVMRhM&@a#+$>@p(R7{NMHbt z8~>n@K?Ndx1~1H(XNTAbzfq<>EC~xTZdJ{Q`c;<(XP7ays8*u^Rc>o8xo95?xpz{i z2wkOkb|>SEaNjqnVxL@^Un<`FZ(y&>g;ZNZriMUut&}}K8OFOCugYf8vuM&bNj6I+)CQ%`Qj$C1CuNu28Dze|%i1dU^ zeXU5RVofflwMhvMV(IzT4Fs^to)iitR(>In}W|;jL_fb^tE^JpseZ+q``_#H#I6}sMY_oBF`K$fT&^ERwRdk|K@Pv0QqhH{h2uRL zp-sCHpcK~2v5r`Ot=V;1gfEnK_$HCwF1-Ry>8lEFk?z(M0^SJ+-Mwrx*Sg|0X)7XG zVeRTB*2ynsk&Um-7W`Vg7zf2=#7kvkL+e$XiBCkQQ%tIjV^zNh3K?}DUEXdS6DOGavKL`lx1K|qlD(5eEbP~PZU)5`tGe4B;Eh(u*wkN~WAX|LNCK&cWTqOW* z)y4x@fBi^nNVviEm9K&TR%C6GsA8mX&;VKhf4pwbDW#|y&+jpwN7Dp2x;e*Jzn^6Y z{2i}5`^q2@jtCwedN5ZgOd{`fnH9>TNS!D6)|SjYV8;fftQkDeVn7G;#gNmIL}Cr> zKr$U<_Z%88yqwvU!2(l19&UsB9B=_pzHY8ex(3^EhUuiuL2Az*8jt=XD8!^JD3|Si zCPFb1ukNEjbGE+hWDOl2;r`dt_-Xy89TACa6}pt<7MAMrrjQBXw>|EvctQZ(FY0Vt z2_-U?N=pe+nyf)aA6;FOIG8PLUN0Vp`=Pr>A+4^mPOESLNP67OhEeIYLoXow%C(}8 zxP?*G)iF^PT; z2ZukPIoYs(l4TE`t%uZLv0`EcJoq9?iCeDKRVKsy7*<3wTd+CX=xkR0a`SP~e=)sl zaa3S+dmqk(+||-Ywf+drw5buK-MC}w%0HR3<%t!}?C;HJCJ=m65yki+k>B)X`i7$>j&B9A<&Q3U z8u)02cq$4+Nl0(wqI^XNxcR8m4<}wohg|QfwAB)IHF!J&tV1t52jx z-{0c~@@rzH(rnW~hUkBoy?A(sq&ato2vdC)^BfPQ_qDi8C*TIeS|@WRnE}Kvo2HEBFRxnD7MC zLy6g!eU!Iv*_nd!3SIV51Uou#TNgQBZ(xRX;ig_E1(e_xwlPUrg3z_3sOf8R^PeGd zYsNg@qNh#)qG4H(D2t%ed-~|!!Nh5dPp_zt6^e{=&cKH2TH;xnNN-d)*-y&) zVgXT-@2Ni)6twj-p06n#1^9(spv-Z0eE|J8NaJ+$AL#aCzq@x}$2~{R zIF7xN(@PG)!kOVKxbJ8+%}8aCstv9#)^_#hqSoX5^R*jG2V}__tl3HtGo_ z?we|_#?{62ySpBF%2|k1PvP?<2o|29TElhm*Fk~-ZKQ(+g?ZV5wl~sVxV)=B(Ip;7 zJ(=;86Dfju)`A$y7O={QE86r|wbJ&UB-}q`g?N58wGL!=d0Jw?_S7FNYaw?Xl=g|V zcrW>%#5tbgxg9H1a52JtE$7cLwALXTR7=B}?)C26*3b0(1h9iK0tz1h0#w9@zEz*?kUaTQ^n2`zOmz_j)|R$5SA`SMezJ zj3jmNR^0VISf&j)|Lhg_guu&(hap13>c=nwVB-03{J#lRxK=^;D4{ytpqgyblz1`) zm3(IE@Tij-keYz8v>C}qL;@7?WTGxwlPd$ulFbrr7`%ZhaNDrV6&W|&Uhy%F4J=ti z!}di*p2ue&uhB*$wf?q96$?|gM+3XNsg#4l6BUpu2J@=9=r^WIq%k&72HDY;rh8F< zAN~_%a1`e&1_a$?!cHjzZYVc1nbHy8|%pavXF{Pq(df{7s ztp$N*k zr^^W_O5iD2E!jHTTRdgtie0ls#rQLBIcBpyY9n6yr<9Xc3M4rAQjA-kyLZ*j3y*vB z+?l^UYnS*9Onq(MHRm*ugJwZN(EWttS9wtxwz?uWHVpUsI(ClrAR)Y_Kk##|k#bdu z(r*NqlZN9Xh|iV>sackY^K*HC%Md#|%wXzh@230oiTv=5nx+)#%gM^VmWw?rl;GZ|n%=bR=?-pBZ;g zu#BVetn7B9{24U9P=tb@Zzn-6lBpd6JQgsS?!m0%`$V#$vH-}hU;#KUl8suY#t5&v z-*PGL6d@5T{)Cbn6gScUR~kI=n-!!VccSyp0dZBujUf;^CCi3lu~TDEo?8hOE9R89 z65cc&U3 z+Os*w-U5(L^*5He;m6rUj^=?+mRWlzn%_RmKzW3FM;Hv}_v4zvTWCMhvw{(2W!d_0`k}P$5euBF{=PPn^Xs8)kLcBiLkicRe z4z#v+!&o>Qr&wZKkf*DT7_g$PCt1|T)50uk0?B48qlK%0N{V4UhoB2Ry%Q}%2TOvU z?d9f<|SnCXl}B>Y~w%kfFSsy~G4$(}=!;tUyeMM6 z6%gi{KcU|Mwt~TXMxUM^rc)B1`_76glIZj2!1$}CDV<8K(vY8&@VMJQa{hY4c%daE z+q_gs2C`12R9!dU7n3Ku+z}N+-ysYQHDkkM=k}&tg~`c-p+qd1(7Z?gXGq-BkEue!g{l z#aPt{L7Hz0tSu|6sdE=T)_XS0+g>)D+aWuW)4A@*Gg@5vsp3bOOn;RnD9lI0Wb)ZOj=*nShAM&knY`Dyl~qW_)kRAc;h38 zn{T}{yIomDySz+f5f(tH8#2?J%Kc)C)hFKqkcbbxM-SVhH0+pk@%t>wq7pD)P*qZK zSZ5cyOl$jbv2Zo1LRZz-{8HS{u(GEWmsl@J8TRtD+z>$3Ju9cjTd=(D2*gX>P6^x+ za)oTNfogZ!z-DGENe)}C7W`0-fr5csxXRv}P9AfJn&hA`+1 z&~FXBO=Y%ntpz^||6vutaL;T+P|l+PKgTGI(qmfg7ec6GTh$UXeRXJ0u&p1rPl;bv zzX4{+G%tW&abiYw@oH@Dy(y4VYEF1p2RyR#gju^o7@JJ* zs%6J{aYD;}yR_uOXr4b)B9Cm$6|z@LGAF#$Vp_Z8RNZU7w8&N|Z{LsU?j9LS@|Yx_ zd7cus-WC=g!_T2j;i~rp&1h<4;%KBB4&MP?`4Dc_H}P^Xlw-ug85+0~{-fXqK)V;r zaGsR!4bc;e6)hQNqPQh8T6r$2)Nb)6Od&ez57ZVCt-$(mEZ4~%D)%K-5)tZ{fE2b5 zT<|#C7XA*ch8P=LxFGlW-?{cZRlZY4K>ouU^9%F#={*zA5pR78m|uQ#?Xu=7E0 zu3pe9E)Q!8bZ}Sd8k=mDM?hWQ@yEs%363xUxkxerI(cx?s+m^TQ+{{f`Wo$@KW9ul zIo%>Po;ik&-x@{ce2-4v0eKFXa!{jOe>}(U(f1&RyM-Q}F6tFW0sI(vAWU^zs=REw z;7rNiV51}*l#4O$r-=QZ2HtWR(h5>Uw`;oRh|ZF`&E0W}AkKtxV#llA(3WNGe}YsnF=Rh&`BQ9G@iB0Rs}-lVRc1;C$^l;a!&YyDe%rcW z%~oZ;{K*pi&=qYG zal&}kz2Nc)rh$eUMiBI;ZOm_6z2~^X+cfJibB^p!M?Wg}uQn|KXy<;EUsx`s5KB|6>4`x$hDUvu&xtm+%js#mk-re+(vUn-W%LEFG>+7yDTUpQmNlABdf0I>e?;H9-6Vb)7M0oA?Ew@!f2ZbB;`w~MHVxJ}b)>sBxGXHLRz=`vIy`A;z`OAmm01DftjnO1OZq#N-NwW1w zGUw4AUWKgSuB601XrQ?RjMI6a>2qzxo}-hYtW%PmjT7@;%A=%a!(b+NU4d9~KMH2U zgt2XdnYL!6@d+fs%K*eVrbyX#sIZq0Ds2K9D3BQFDQ`v}%q94`S%Ko4a`{oR^A?LF z=8Oe_w$NHvfUJx4rE^!GmXU_Sfbn|hReTnCc|RyE2xlFVwIr-Z0%S^ywrw#R%BU=Y zvyYFU666eL6FSD(G+P%6^67))(2Q9#qRWvg6tNnfRF(9Ai5VR|+Con$XMC=jPR8Bv z!6fpz)+OiPT^;q!;GqF%NUB}sPPc!!eT0YY?z7F!0J}~D=!&eP_qru}56+j0ibJM~ zf<=Vy*YGLxjhyu8V3K3iY!?f&A@Z zK&CW^X%^DTCO6w?@x?V8_XWn!)Jzl%<^y`EhvLD(6mP#FA z2Ho{s0~GR!)hmaLsdwA6-WuW%yhj&o99vzOM!g^o>+t=+^po2vW`e8^^>EZj%R^J( zPKU@ugeR|=#LM2D<#a0XW9R6Yn$DlAUc|4`QzSCCNsDVYj@ z0L4IIV`BY(*6!F+ks!d)Qad3)X(0Y>*>V8^x(AHM#`JH6Mt*+6?-&0gm;2AN|50K} zb$|xNPE~*grA;+}21QK8hXJMj@3SBO`iT9n1NwiT{c{&Lbp{%g{$JN1QsrPkp}$xC znEzSzYl(pY#Q^z+IWYfQiLo8-`*D2(--jRYpzwg}8A{`9tnuY>W|2p_mEj2%IO7ne zko=JZGBVMGPNYo}I+yRc{}o{oQHih?8_jx|W0?oLlDnHM`6Kt7qj6{brH7u+CFiY{ z%Esuf1mK)q_zZ;+Rz^#1h7o zpb(_U22T$nj0TVpfhyc#>LG;jKsjLrz?*pp@oQuOTDQFw&tbUNS<) zAP6O3X&C&%1VB;_SdVxE*v&xPF9J;#>=cm!tTG=Kz-Xy3 z-$MdT-eZY0Y~Rp-4))ECuI#k_X|ePxu&EVcp7ck0E;&)ZXu*C_pFD+6#)N1kPC^1e zkxGwveLXvU?NGyEiT9z5R=O%I0oAHdrvMvXfLAC%62}3>M?v-jF-9e;i>Axu*Tn!; zrepy_p;GUkF)kqfk|IojNsuJ;e@uRjAqI%|AY937peR5?mL>H7(Fq0%L3~v%XxcT- z^mw?YAWWvhe9HQRs6Ztlp6dUih9w02{VG-fRSD1(_%g2oF8%d|EQ|+V8W-N9|8^D4 z!CDw3N|`_N3ppYgGF&7dsF8bjq6Y?VbRZ9LW+Dv@%U{siHy4~fXzbN|wMEt({vkF) z(4-0oD#V|2WCj*Sj$-Oc%hgAbl>AGRsf4#9UtYFcb)n!0zO$}|z9G@hJqHSqKv3ag zmSO@eT*6gSB-AnxI4!_yyJlODiI%*&RomxzHrqDH8YTDus9qn1*U z#)RKU^fP_3u(v7H2a&J(b4CUj>qjIq6<}_cwTDdfpF4<6l zR-}Ipr+oXY1koHwF}H38nKx74D;~asDR~2WQG8$wk(%2rH&pJ)54$eLs|oFC>fnfK z3^UzOrIko2kd0YjiP`XB6#H%u%VX>@m*_X~p(GAtBofK3Pn;zZrfdjEz8MeQPZ{4s ze>#(eHY4CcPBK?pA8=8i5ZZseoZEf!Xll42@O`5Z({S%+y$W*0{cOI3d~9nqO1EW4 z(9$98$nUW~T>v$I<^Rd6c(iH9%^=z28ziTIF1J@*vMxmCK7hx&@|h_4wO3`qX5X;( z+&0bY$+ymq%@=&im7M@6i(TB!Jd34eWC|Q!!fB-|&foM~tgGU>YPvA|vucP<9hMX+ zKOJ+M-X-epo^(4es~4Vr4cpRL`!uw0KmzaSIqM!7Vy<3j6E&rF3v~efcsKz=EilEc zwU9^P%U*(3ouUwSQ(A6%zh%!Tsb2ca(hQe9`GlKHh#Q7I%WE4TUZGGrf$Y}WF%3sH zDUQD8$WKIn3ng_Yby^;FAMG4FGu?EcllDgrxxmYK0~=Ik6&E4Bc*a+e2y!W8WHJNZ zlmgQAoWBe@=`hOp{Wb2KDa0yyv&e@GoO`pOUkh%@>F*R9g>B|;%lB{qN@I#|=WgV0 zvW@x)5>NHY2h(go0-`AnNM}J2H|L!{caO4)1@J|LSPf7?Az@e{d7LGV=ngh@xKERm zWrY0W{2Y`wiVALdYa>5(!Ew*M^VslahLDss!Tw7=d3!CEJM=2b@dbI%mUOPgS%MjF zymGL+OxZN5#AOOVE!Df+s{ak~(I)v|Hb=d@xIW)?qxcq}_R?~KBd8=}!bvo#ReSj> z*5b~hHy3=`U|jZPBFi`+x>*1;?47Fatmft#|}&DvWJN)X&Ed@dTd3Dw%slcGeE zyhy_^1aBAs$I#70gwzI1O>DI-^f36WdV_*?D(p{QNMexa!Doj12d>*U_Okb^+giuB z&vtS5oG;?`E6Mz3iNU~#zuKR&?nmcyEZEKFxu;uqok=u+x}plf4Shq0LlUXcRi+n1 zH-Ff=*{WNFSYm|KRN#j`#nO2WNl-Td#;vOezBNi?xK&qj#6ptyMd#~&J zI7|eKrTZ_U86qn(QM%87!?IDnR!b*cLeAX@(5VcXC{6*2agKr|mhnG~9W8n;?pf9* z%aweqDzs1-OMKZ$`{79#dvS)PiB3HMXu`U++;Ia35j?J7W6E~q#iaOHtur3&_+90JCBu_UYEJ@dcw4sQS3W_TO z>!YbP1RR+OE`%};gHqdDZD`oXcPzBK^G+lHP0r9Y|Kp2H_GvaOBp0QQ_nxm5`UqUW zTUtksz&#Q$*UL=^`1?yCL>h6eZa#PyPXxACR`!@DTe1~B6htkuV=Aa!}uS%sU{D4~Q4volR zyul^keKtiK9kx778taSmvKlQof#h4Y3||iDwO2RQ4IwAo^VDS1JbF45mzUpoth4Xn zJNf|4OoGsRucmZrcz54viDQQ_IytD1(OU`WX_c5hP<;aopu87rqiuITux0 zVR%*)=+??0c{6isO!+$@=9o0vxR@RcG!#ZhSf5Rs0qNiqwPII?kTcz6x2ECLHb1XK z%sl=&MdWM*6(6}yhgt0H;D$pz-3>w|H#*ySDhiQA+_l%Z-RSupjW4+Y-p3E^vTtsr zM)7V+vhV})HwQ@hBB$H9Iy%kc4}_3atJ--pUOG1!TPk4U!|xe3?2O9y`nc3qe5*cS zYk@pQRpM!BVYBl#$WpF?iLnnjPP4wmZ+8)OOvbbkmD8;<;@Q+1?8f< zoab!5B#Y7Dvdb||`@z@(*iTTMyneOJ@czj>5MMzvf<@A#5ueWW4T!Qz{g4e+Ysx9v z15FkQzpUC^FEzwBp5Bg_#aZ=p=KU<;33z=+#nO$+f@v(l*D`Hr>&GvfQ~ z>h_YXQ}Qjoq(re*#&}$^iP6rXeP3{SK@j7i!pAoOC|673q7r#d^YvOK*{{>M1`{9X zU@l>KxcvB4`+;dszLTeN^LIS=cAZ~`T{fg4B(JgG({Xv_*;Vmw#B%W5qF^zb%r4YF zUE~x({sBXEk8I!!z%jM68s1Xpy+&)nz%G8Nd(yrdfZTMfbIk9u6*&iOT#{v0I3F&# zKw-#tR@lxS#cHK3F-|6+&!!+j=w|{`X(#^56|oe zK48wZ*jnkAca6rZ|AuK7n|LD@PpUozN7GN+lE$m(PNSd3KNGz1I(BM^%K3qYR`5rt z;6v-=lV_-iI~|2Vt7{^Omf zWmYQpkcGS&z=_UMvII95kZ`K+)(t-*@JgEE=S@2To>It4X7L)Tm)C7H12 zxpYrVC{#TF-&7b+Z(5d?u+8o7TkV4=qB%C8lr(YboUZ5Gi2?j_6+H*OnHGaO|S}vHA@l^UL=(S@yAkQgt>d_J1Xe|IQcxH_VTfHI-2u z94|E!8x;0CY5aGp_dle3RaDh9R3uV+utCwkSuOuT@MHQn!4KlU%xG~y%fHS3gWJc- zmU@Z;F(@^me2#t^z5|RMIh*na$8xxif==3rMgh7^9 za1bcoBTNJzKny(%{5(TVC;UwoGANEMh$jWslNyQR6!RyHlKmwm2Re*O7&Rn0Vg=qS zoez{hglB~avk)g467(zd_b)<6^npH)gk9+9kiw)ah=hFhe8sNd1fqgN8UOSwN%3Ay zQVXekaImDipgvZ2^!==NoZ^tkH*3@g0~yOCj*xGS#3(As;710KDiuqOkza%vzu?%i z+Tnh9!UlkqDgF>IN)5mVrADIE#l}P5zG7uv_$d<-kBU>B+Jz753!r3{1TE?oj3OMt zb)f{&>1T{Hg4{w&-B{C-bMh2UgK^XwX2Z_SZ1Ng*Ur9dkGo^cz4cddmM&LWg^k%;m zd6i3;2@a1;T^?%i_LAy|wP)8LZ`K0ec5b;zH%{aLKN`BfIwaujc2xJ=SNC$P+Ad*~ zzG#nLqxjfiEfBYo0BC6`+t%-w376G!F1($_Jy@(u0zVHss`Nnf9TloIBmj z^3N)-4Zlc~vuO%hdbpYzXE+#WqTtJna8d_-7sM#fKNfej)reT*y1$~+W=EbGSh8E7p{r%-6n`Y-3jPTCG zhkBOm^|4OHW)>+fYaw; zz3tueZr4Ue`xKdm-5SVEWcD0Mh4bYWZE-!$>rj!|6aa6<&D%EH^Nn&>`qqdqz1jEW z6<5{7THn;(W)dnob!8khbJ}$JbmzwRnZ~cw_J&TAvHauLZxIqeldq#&lWA|DIu}N{ zl&?O5%;b$tg>RlM=(k&9K7 zi0mOx$R{Gx`y7lz)5jJtQ%AI0%nq{*nVqN7FrtWwuo*HVti+Iiqb2Aq2jR5m$0e~| zqPHw0ha?=M8-_MdZ(Mw~y)F4YW&!-BpWfbcuAFnO>X@Hy8b|`6P*x*)iFt6bkKjCJ zEOJN%T?dR5)zt7o!T?0Ogp9#N0a?Jf;rl>76o(*>9zbWuG6Os);gmGJpgYoFS+x#G zwWIxBIr~s?o^ikWje3EiiC{uKsNvBAVV{X;e~>2R0W+t5h}TwX0Tl{Yccax5q(Bh(;}Lev-|1Uw1x0-7M23~sL&Sm{d@ayAg0eiJ5GRt-av z!=nZe${hnDqyZ`Hb*%o$Wz4{NO9KV4+oQ;WMkNW711Z30?=$-t!I^k4jsl#}C>!@i zE_co(92^7+o$g()9IVHHT^x-YY*3IkX_x7bljNp*Id>6jj@G=ZV!xIJZAaYtro(f_ z1bCItVf|}--r=X*h>Ols?Ipk5N_k>|9vWtxEG}auIf2E>RVdfHNQw5$KR{2lx^ z@gq>n`V){{oZQKK68Fa@PT%;hc-pC6p!{cn(=g*y-HZdPt)%7EUb_1Y5+n}<>bP8B z3WMBlx1+7~cu?@p^XYaDwt9FfA=JUD*Zf<_F3n)Wxw*@*o|6%YlNZ(p{FM~>RgE*u zM+Q7f9lM}(;%nLy9szSYQ3%9Bv<*v%|^`Z0SK@OeEAdY=Iy*?`VCwGbuHe*Fo zzmMhgnA%YFM)%{KwV|v@3tVg~`L-@*Rl;29uknZk$34O*m zM#+Goqp`+AT+4c<&E^V;sVOSaoqoA;#rrxlKfR36IgW?X@#yt&WXnEoXBxHYE*)b> z$#gFVA#4jJ=48!X$(t{~I;RbL({bXxrNS$LkNqR89j7gn8+616KeM}D|2SeF%y$M%6bnQ5nE-V5*huQ%XV^m*cEzwf(w2!eQdnkaHPiBevH@8dPd&OULVd6IrSG_e!>e@?Hz8=Rg8{|BqUFD9)i_7^Yn3s0OlFn7EGdtH} z4>i6fdFh7DZH@8aKGCyqgEVBCSed7{o(_co3_IHRPOBMCqU+<2^wlCCr5;r%kIqx6 z$vZKGtHL4@415Uba)O#RH)_Db$vptQb=VUD4P$l9e2VpJo4?_&s&Gk1^U2yAE5YV0 zXUI}l82mk-$y-wnN2+Ul$(H3d+forJVpzZJCCktd_bt>3LylcZ2))wKN0AqSLy*mh z#1o3*yq=@Evz_;wNHSWPT0l_ILeiJy7vW>F((-S4Y2CyfRHl7-gqNRF1M+}l1<0EW z6me}GvEfaxNURp~$;o!H2o8HF2?LwEJ~c8+Z!?xxbL7!6;D>6_ZpbmYZh2=eHPz;Z zOjG$eop}^Z82lyv=~@Izb?;1$E`B1Ki~Povm3~)du zQ0D*#N|HAEkIq{su%d+&gDfgPC@Z-WFTe`)64<4Wn(N8ue{vf2%~%RlxF9 z`LrG&;n}CWlLQiBBbV;s^yry#kPxj_qe)cg@6pti}b(w_{*j6Sdy&eoFskIjS=kjAlObzN>`1(S%>a zf+>>fv9%>YIE03AQN@#tcy-zk|0H{WT)}K*cNC0buD|xA>;7R`F}NEE!*dRJ&iiDz z79i@~6@v4J+QDZ6Ln;LTP3v-d{(pj-|L!Mprs~lB(@*>l*t?v9oSL#sY7QMJ#&;z0 zAN@o|)_>sc5dUQcM-S@$ZT6qNM6T3SdeGGGfQ2)ai2>B&J68Fx=3g}fs2N}g^GsnS zfy{VXL*CeoF$&A9&!jj=0+z{*x;|N|UK*3CzObH@TC*ONT3afGWx><0XX@_Vb4vfn z^&7dj_2jDiboAO;eWn()%=1&$!Gxd_JY6L458Jjx@5CaiEl@8T>(7V?GgRIXF~YL}3pg7~}z<8tcfzuGff9*}o=$_@qILC{buD1~RRdMEhlpBu{9HVPf|edal2|{=D}XhiM1=z#@Ws&i3rxHX z`G>!b=`F!X^6z(l9ja3R!AO(LSMXO>dl?lM zFGzU-f?$(NtMM`ZZY{vpvhH zy&D4f1Tn(_5c&!Ki>-5v4lL-_bjKZc?4)Dcw$-t1+c@2^Z9D1Mwr$%^$JXTDnOSSr zeD`0~+NaK``gKAJ@4wL5V#*yB$+?eTxy)g^Mb<1{vK_*55dn%f^6a=)b7_RZTH z@G;K@Ix$>I2HMc^V=%_3ml9jXX_6yXm<)6T%3zRQXT_V6tgYo%-*Yi=2-;}N)y3B9 zI6*K?l93m(2I+NxV(HF*7HRDdyjbVBNe{ffB%{RD0A&l2zV4%uVntlXofV}Rhr z(CQt-3L!Ri5il3q^p^K_v_5Dr+tIk7SjFVMytJX=iu4rF&U7{AP+REpy&hg(kZP!L zEeJiUDg8cyTs0~yW(^_m#=mt1Zz7#rmVQt!T(_Rl!vj}3HdjJE~vs16OwoodNe6!1IfUI^80_lz7 z!%|j(xBt2C6?C-AMlzFw6PnB;I#83M-#CaLDRTiJSW&TzOe)5|%~0_Aj#pd4-dR5& zS3{gjUb&?8Hz%LCytsuIm~*aP03{pj%mRdEaay zJmFq2!u_){xIhl(br?aTxy=WKBHbFYr819f643|Y_)3I=2SZR`H+f`|a*i-4V6|3f zzSjioB}aJp;qomCXY0$i*TFP*Cag9iHreCS+^;Zfkx*3}y=Rzka|`9av4E~d8SmQ` z3NJp9M)%8skd>9$g~C`xc~k$T*QI&|#Yo!vU_hpsz)i7HPwJ&<$_TiG5AH--JK0_l zw^|!TE=94H|D8h+!DiO9YOD9V3&a2N_t+s&U?B#5x4AlSGt>}t%`N9FEA_b9*+*r& zY+!00uxzbyCm?&mHXV`>xD^6Xppe9s@{lr z>$`((weKdY%Lm+$6y@OunMG~^5#xhPb5{OfQZ!>(TW{*R(Ha{*e{1Gko9bMo&)k4q z0hX;{-{gDd3`7lObT5U9P5itv!qqCN_CNJ43|HhX57Scz+nf&%kPLNJ#1;LZ1= zGugZBq?L7j&O$_0og*z;VsH5`g?#;d%~$gGQcj@v znYLbcU49ECdBP+Qnk3rtv-2i(YssBx2CRKOk-;gZxn5L1K6&namW`ept>$jGGSWRG zv@SL?-D_Z=y-?4`B>g{Z9N+S)!CC)P9d=OU2b?dm0R*VI&WtX7y)Q7RE{Q8zY4hVf zr_{rx_WT-~+i>*9%H2q7(vQe_oQc2e>-}VD7q)t%PN{tr<{Aah{@GVqO{$Z)OtXg& z^ghh^!%M1wIBgqH)#+oyIQL>N#co;e>}*#7GCyIQMNAXlNn0Z(*PQ)+(=Ou7LxR;7 zV3fl{@OlpQTz<&|RSH}=XP7mho)w9EF(^l8p0-Kjmt-v0=APjI`7iM~4Yl|E&s0O9?xBETV%Y@p!ZG%BDqRe6_}EDb-*%BRnst21li5QQvbtam--2mwV{UlDP5u+bwi@uRExVzx!PMEkYQ zsd^_wwq!d}?VwF6#qD}ZAB~?IM0SA{8lQ<`w*9zGMS&~~dxm@-J=vrUa&pZGPgN%e z(The@qZ6TvKm+i$F7fZ(^&@-_@m3+W^MK0|OwH)$p3rkR;m!;=Z%3t7ZChv0&yl+^ zCKtL^xeHxkL>zFiks0W^QB3`XEDoY{L0TKrd5eAgK*Sep+;_|uXG5_-#Mqq$&6Jgy zStrUk_IVyV`S0YrzJtUn(QIODL50s z7nVJx3;H+@504gtB$J)kdE&#O(6Bm4wlG4YP`c1S6{6P5&${v`iuQw*Vy_&nCaY3u zA|o-SZ2tiW)EiXf*-j%aNCYHYx$evUsMw%LsWed31+~nGk}I$hX&Ky&^lj2Ies?2W zdOj_d@P~^2N>S?ROIGECY17y%5Q#z$okVLl2c#U234LmqtFA#rt(~<4|KMEE3(0b9 zn3}c|!g7pb;m`G*=9C8;E{=8u<80b_j+nI@S-=6cE*blKUyN->1vAYnk7(tP6$|#s zH}cW5G)>9L9*Yu#=H$0KDTAZ*KP2l++32(UcLpaL;=Ve%7hndvYV{|sseY~}#}iPh z^^pdJt7s{!nKakhIIIs^^wQv%;6$u2oycEK^5?Q^D0674k78x6<+Am+F8lFAUbvmQ z!SDd&I7+)E@nne|k4ubPCPF@`bPn3=xmUiM4X#DFZd%N-Z5He1G`+`?L$JT6cRg3v zqj)ayheCiL+D%{KXq4ma09faSnc>krC(laNd>Y?k8xf^%@@;FA_|=AxthLGOYyZ|J zYE=71U=3GG;K`kJ&+h&DMD8ZtJK9py-Uh(91WF(Q@TQWYq3}aIP%4=QtnphzT?hKk z@GPpo&_$f&2kfM-H`fy}oidWC*Z79jd)<5XIi1Nlpe-j=(i=*ZuGVcp<{ zFr{J}PD%ahP&A`TdDkaxMrp`YU@TT>cf(c_s{4}4+MRyTMXI9OMc|lB@G`87a!SIkI_>G886LLs`sc)KFvsd2Di zek{xo>a#5kG8XSSrjHwy?I6ZvNF`b4#s6y-Sl_N3aPlM);VkZB5|8Qsg zzcocxhU8^lFiKGl*8gBfNQlX)NyvSrz=hQRrxf^q)E624yS_-AT-pYX1NZ+f{@)0R zLOw9_uS?~B)EikDlL`63RKPgCw({Ru@CtsgI4~AY&Ze(Y;~WSi8EMg9I?*Owjo#g~f$cmBs&yiSeJuV&VM% zv-B*S$%4dRCC_LIa2nYEXX*cjpTR(XR$s0TEP1u)`w%Ex3i8 zv3lk&ealZtP261Ei8nk7YJ9htoOseT_qj^(8I{^2yzHMmIluWv3tqOW&av7Bp|6nB zP+0h()%!t@r*zhJ2!XSzb-b3|PO8t(9+P>m)eWIv-3a=gzS3O^AWYg_SnEqdp>R*@ z@pk))Ek?Q8fh$7`ZA%CRz+}A;I{@Ij*(xro(2G&_|)E7qY?2sk_+v(ny zs_^CytijnkekIrHYKY;F3Z`>?qnL{PkF}Q?|H#NsP8k8a*>ipJKkT5d-#d|(MUNx9 ziF)n8lYTt2JNzaGFnoxw#^5*yRycaQjjE1jAN(`pC;C37AReHVh_%r zir=4PWMb7xJ9U*F*`EAz^8k1`bzlzN$ zT(YZ^Vg38BarviEb>f8H_r}_H*dA3^V259R^=sz%^fin6deP_!J-8NU7a{X9FnaJc zZ21V(r*7)H>RN)kBRCuDAAi`oUK9G*vV#>Aw8C)XQvHU<{FHH^Zvbj%EH?FdUSw@z zdG;L{12S7KA|iuk{8Q>rlYL**_GEZusn?VHVgVkTR@;-fYa({beD#Zj{c5Y zY(^;2vV4r+;C(F90^VH3urDm25QF|K9M_n=SUQg%7GE>ts_(|f#qU%7IkQX1Pvv=P zgpBzQrjvFfrGbhmi^f|;Y(@x1Wo6)VDx0DpbU{BY#aN6{N?WHb*#u= z^G)m!G?uzu{R4Hy=to61AZ81?P=zhiq((Ht$iJ%@(fY0ZDU?lV%ageKD*3*0inNS~ z5u-PgN!%P8ADP#9#w{R*)~}Ra{eVX80!ra~RmvVT$E=e$+X`={R`R??Fsha{YIOf4 zSEo{Rb>W6LD$64(2ZQjn9)u$0;DI2<1+g{Uw1cUPFVPCKtfTBBKtvz$E|wjrdKh6I zu^bep!9v>8Y#x{{ZXA3!?9bSsi@cZ$5wl)5_b263$vks^)^Ez7uXQ;5HxX*X#VW1W zr^q2!M5BATubVpjl;~Lz3i`mSP0JOqUK2_~I=BoSvztt&a zt#;OZqwA9_3#QrZz29jBeFX(4&5$&b{_Sny)(^5t5rE4e+^23Ig zAX?)EV>|M7bLP#DvJtgi+AYURT3l>5p?IZrSFi&5@|$T=)MG+L6I199wZhVP8h0EMVN+NaD))^(7JtZ&$4CS)~V zmsYQ>z2A&1YDQW296vQW=DdMD5W zMR)gku1sq6S@2~q$Y1}(+GLvfi~L5z>5zLr=?i(6*8=A8)&mpYT{r!~N*Z!+rRmQ2 zky-=`z-lKFmQvkwBcTwzLvx*u{_bIh08WfIN*uhA6CO$tNAtmaK6-a3u|@VznyCb^ z)yV6o-mg}hYR*(iv->iUO5WEIfb1i@^JOOlkE{bOdaUAP@Kmi_VPRZpak6uYO!94U znqz`Q!_Sn8>nViKFEw)_iZj}}X15E6-MR=+Djad>z*~j(tFEY@@B!q;zd%)cznXx^ z`xLuwUUkU;aa7rN17ddNhqbWwc5d2Fv6cF3se6>BwBZouq=SLk9`*`@lV$(;tzg7N z+<_Mq@7K|^Kp%Uq$HF-|_MzRzx;#$y6Wd$sdK>r+uXUzqPIpLu+vK5 zQ2iCG9LE4n{ztb)N$qXAm1!#ax#5R!RQ3fWXP_{avk#uPGs&+G45EFwhagAJdg}fe zrhvuyGI{ME`Ni*ykxU1&iLlVf4y^k=kGK8Y0~{PSyj$<%@}uUEVa@!?BG`x+Ripxw zBb<{~-y0OA!J)8C5zB&kbGKZZI^QT%>iy8VdMFo z3oOT|`YvZT$>a*WZRIC=?7`b2Xx^h5DpnUQbzIbn|5PiewHe?`p zr|#Vn;Jj9+wm<&J=o_9@U&SD!H|~p>YzLdC73#CGMGJ3$>+G6N;Su+?e9K7Nh5l$V zja;0`R3~Yy)SYJhgPJNE7aI>AWvzJ?{%Jh**Y)gsA6LM0f z9?XZ#cu~73n=B@Q(dCNy;lmUd5m!%{ZY>yE>C0lR7`^2Ew;JJ6mH%cxi7Mf1ufHbV zbIE$TN~`izVyAb2nu*7d_JP{wMm~vl?c!1O#A-SfW*aUdd~)oV?RjJPiCqw2VTM|) zUHGKX*METeqIQx)7ZxKDg;6#j9gQ*8Q)%@0^@ca?UDnW_rD|bPfD-g zkD9CdwD*Mkj$O7~Wsv*s(ha^7B&Tn3WO<@_t!IVzyff14zOIEICjVtg2Xi#MSf z)+8X5hCv1f578?@KF1(-uDf%}Sl^4!SLbJY!*hL)qh9^m0`_bV?muTdtkNAxr_VAp z9w`QH%YScRquT#8BJhiW+nW8AZN|!Z_U-Z6P_;W7_z@3yezE9Kd#PyCJEwu>{_a!Z zgW58OT}PULSGf+EbkB}3j9(H)MRSmxRO!N#2(r!y=H#5}%LJOzvp<7}tWoLOcyH1I zZb?Ag1Pn%<82g?lZJFN~WOk=hR!#KJ4+EgE(s9CTdT%qCJ<&CR5Z__Ou_9KyPpmVu z^?;duQuI>CeOf3O&tvg8ydSc?eVG3D$EwG#sl#aJM!EN^7-i)h9tuyo^FK#mOcETR z_7r12QJKczwep>}gvcmI79|s5tgNs0<;gJQUSCnYabWBWXOB$SXGuwfWJ2{SK-7`d z@&6^&?cB~6k8M2y{$q8rkr50DcT)*XtjT}PjCOr-|5ni(#M=bvL6qTo#AyGx?hKf2 znr<%-bgb8K5X$)}UKRa_4&bn4gwoASzeFHHn?RAir7-;>o8z3@!Q)ly|G4;vXn5>6 za9cOk`^*MQx=P-w(4Q^sLFUNGW(>bhZ+f8Pu5y^cK3lH>j7m9)2jWmyT37g^N9Yyv zajcn7r+`c|A)6KM_*bXX8EG=jLPLHH$sgm=KZ4Z>AN19dW zNy1`C5byZ1ivx3|=wX_#0cntGSY~cQXxYo$Pl9teQ^!}D0dAMf0I~A6tKS2tu&#jrS7(C&f`U9EqH$sDE z{rtE6kk~J~)$Y4XlAP=wn=hRr5r`B6#KskyCS2eRP!oK0Gf({{<%o)EWQ0525&M*- z7d{y8+KVVyaDi7@6Mz17qrc~7t;pLsy5j@pw+Hdy9*=>x57Sm)>~* zVA6CQo=`WBNg=EjySEqT^Q0Q=LHMzXFYvKxboT9R3+hBbyP!9ypddIMaZuU}M|RH0 z=MH`!n4J_xUL90=ZFuMqdh4Pw8_%|qrt6?@^HDH(j45>&Vo-)fdZfb#uOcq)!q-y+ z=lSJhE&%KKS5DPeO;xc|ec#YjAZV2pK+9UX5XvqpqBjQRj$I6JJ{<9|9d{&IGwdQW ze$=1RY2U(s>4aCcEj40k;k3pK^^w2UiCTx}(=q)EVpu)>8#iC#);>)mrFbjV_kfb6 zJ$17&YTzMqW;S?v-z$s7?(zFeQTaYn79<=;tjJ^p9*8M4~1}#3)#G=DV^M8sxAv`ZCf8yBO%>@Nia}SZq z&1unRZzB0F8%hrH5jYprs7t7Y01wb3g(%EBdSuT;mBJh6MGbcK*0Wx%SU~1@?y*PXgdywNrT(lP`=q)U9{<@L=#N*(niz#kknd#7&D# z7boUBPn3=aOKC^VU9rLz+$k6%`*D6ORxDDiV_tZI&J-*zh@5o@)JI(^-bJF-D*j2e z$R*-x5mHi-5zjqawN?!s&(L1zCx9ZyVdbmK&*CQ*(9b&6tz&i}0qFUv{&L_qhO;#} zz8+kB8E&kiXyvy?H3Ws>Hy$#{WbgEvapIR3*{U3{25!%ZMysPK@7=Pqv#_KuAy1KwYzw_}Y^%xFx7H=F|N zdM6bA*~&yC%As1aw@bY>ji%BXi(a>-NJxM1tY4qxvXcdici`C|7^r~; zYnfq2{gr+t5*TKpbZY~B-^UUcQ;su}V65)*vm+(mWPrs1vbsPhn|<6>dJ z9_tskx3pE50F1Ro;icuypPsO)D!ho!L|)*sez&=|UhXTq%ADY#Umtv%pwa|6kUmU8 z5NC?w(I;N>cLA-vauzXCq(~ReQ66s#Z{vh>00kMSvK3h=@%rvnbr)oN=$5{K7r^S^ zr&KY>0Y0W?=fnEG1`2DtE~rS?5KN(Vtu%ndoNp?H1CVp12CTCvMI|FbUmc2X85xe* zei(~f1#Uhl#PjOx6fjENnO&a-@Jr8qWFT1o zk{qvwpMO{IohM^1)JpW5RyJMRz6PsBVIq}-C4wz0desO2w;2z?^w|JOj|Zu!?o@-D zJTP(C1}Hj^2A)+XfzFr05rI@ph#?I>2o7o3z-M?D|4G`~r<#sDo72 zQ;QLO#lFm;w;efr^tuyOo-t3`S4c9qNaZKb;-6syIa7^YfV^OFC~8sd9398?hzRp+ znE5xRBJg3(O4UHT7WHI z#7xe8t*j3htIlhA7dFbDzdRy9{*Z~s7YFdq6lLflfCAYE7D;*ea@?%*!KQ+PEF&rB-qA#_q zz*x{(yCR&{-#pBO0DNc06Rdp3i}LJ@de~gOr3UFC&Y5cRpU-eh-gjN(@4FNyo*;}qeXX=>g6Pz!qi05lUQD^)mK&fuNGD;k{U$0X08EIaI4{P;o>a(82@gPmk zn+1LvKYH}NKJ}oBeKui`2xm0sTsf0|_y}21rD9X8t^NulP^cu~Ffo0yVMA+K} z?qB?Dxe|a$Q}VVRGM%9pHK-cjYyan42Ia+GQTM>B*u~!VV0~o!}S;BC6G<;1Jp6n)uF_qZK`F*rK{W;TL zzFdvp%5{biCCtkYQZo)zeo6jhqEh(=mhgM2)^5h_)AXZ7r{x&^sewgt%TAo5Bk+A5 zf^N+yRs#RQzRBPb?YDUGV4=YiKsH9%T5HKSBppf)GH&lL8tVc6;pT9KWAg_EO(fdf z5OwcZ9NShWHEs4XUijztAj=0>4la*UJb6+R%4!S#zI`!?7GF3$m(=jLN{1Wkglw+e zF}y$AB=SgP+zi5#v}|{KK_n5h(XC?}of=(fzDsSkDm1cvQjuZQVphj0fV3pFe{b0U zo`wOpKFcwYuJ*3VMcEHz2p3to^SLwf)hlkVa}Yrrg*|1P@(g_!)RV-HZ1Ywls`ZH% zwsP{^tvkQE7HH!0_?y@%5+0r{M4F!FxUn3M$KrOj;|JXFaaSo@M+wH2oTFguZ+PE* z?lGhx#~Kclf^R@zS@K{qfTj{=L&bDDdAZ1mqG3l@(VC?i#P#yd!% z#54vvdIiiTPW8WQaEq??rPUHLnUxf#BY{)QhC@1!eFW=VTCCJ(C7l$d&EV9SIw?d_ zG3okCPongq-0LKO zY*Xp3r9f(CIqIr$k=Z(-Dc0zDB=zVmxEIe|&GmH6*e7STz|bh_L-#4pUklremQDVTu+s z<#7fUt!u0Y&A3DKuYF#F*IMHOL_uT-21g-tMeFw}O=H_?%|XC#57IN!eqWuUP~ux* zRAn8M4}q;W98W#WNc(^f*N-O_;3L>4^M+RTH0CB2C8%6+ar9;CF{E;6jt=(+kH5%w z8JUTZ%7SwOJe|8qjMz3`ZIbjLq4qV68D%Z$zrQc>Pw@->w(h@m&n=x$F_^asL-)X7 znwxUNp}&LM6wGoRBEDAqcB{OQK0U~sF1?)KvPV?EuAi!6_yk?BYIb7+fTj!IT1gVw z&3r$Kep9~L;0k04J+}k;NnVx8`Bs~P?0&%Hmp+Z%lQEk zb#unlQ2&CSB4NZ8v`-Ke-R*73GduV6GU5o1KyX_AKL3S@$ez=?$t^s>bj>c{M!Qe6qI`q}7|HnuU+Me1W(t zI^Y!0KIQ&IxcHDj*<(6EdDkqlX}AivvC;Q4(Xp^+UE`?})cf1;aFcq@$kWY^Gs5b? zwcJl%!Hkf=qC7>CNm>!12^x~?V~%hhE>7v#l=x`6JaVz;yn-DR4XeGifSO{WbLCTy zkdPv^V$Q@bV?`Cs?O*UB`|iW3O?!K-b7T#i3YE8?G72nk(XxV4-BnwiMZCI>Pj&We zfifaIJT~Nqon;TFXo`$Jzc=tu5U~&xIf={B7{8==5ixhiBQCBhl_<(^thV1G7J(Sy zxiYpkOmV^wikhUWZLG$FG9DJ>Fw($12|tOZK&oh6AZ!lRz3Odtc5C`YgxnjlUq1m= z8O~KRoTs`y#fb#`lr1yzy}?0XIoe8`3E+@HvWohmvgwRUdnRSZ5#FTEXkEFLQj>Pe zZ<2P?gcX+vG*b$*>v?rKAu;IJNEq62LASD0xrW{-RBU0Lxg+ntkUcV`4l*O*# zX0v>XQy-pY@utfR?G2YW(m!;EU)X?9LUe)>g=reZ$|=)l9<7~R!oY4=vgHcffrMik zq{lhOPa55>2pj{8xz7kdI9--GuO%mW%&+|&9HR12>Rh38YUj~^MrZI4 zOFKvgM^ObqCnLGsO0SrL9CHv?x~`iL%Mz#3%KN0mJT|&?_%wZdZM^{a5a79nnfg}( z<2|0^MrCgDsuUmg@GcVWy#%5B_VmITTZlvj0}$`ogf|u365w{_ThYv4^NHH#$Iup} z-p!3WXetfKKq+vZd1@-r_2RqPfY)RURJxA6zlBU)^RblVo`uvlOiFu0zA4HUU&b`2XCo0OCt8B#;7G^phQ`}SLBcpj#a2*K?z)I=C7ju?bS5#g6w-!1PEG6^XC z`TP(E#U+7For!>S8T}uq{_q_uov8va8DqMu{)n(#KHJA)rUBrnoi?ZZma{9I_cK7r zOh}JX74wOR?B!O*%qmP^At=YYC>qU?MAU*w{F2pc zbt7}NQJq)+nF)NhSo7M+3IoWNjG!|~tVWj}fxA-fpVGjJ zZj#pVPe)xXG+`^lld0PD)mq@^?LF^9Tu~mCEU_*^S&w|q)gju?taPwh2K8KDYhPNd zxm%`TJBxl+*eS$C$sdE)`IZ1I5^4R9gi-ZRnmd9Q+D~A)A1SMNxB_Aft}U%su&S!W z_BaWLd=ZM0A={Wht}FN6wf)s)<=;uCwgy+*NdMKzzfGr)(mcUD~=U<+RA0#-n2;pz7{%Z&^OvL+MO(7xvUr3-*E)Iq& z=8Bpn9#WuD!zX$gw>h>J;((6w-UQmr`7LwRyIxNN5#rhR?VO=PnM-QIMv;=`)^&Kd zxc?=k8^KUqxV}c8<{F)Ke=(P#75%mfWfu1NL1%0PZOrko$1*i+gLuWKrBEB2{3DBG zxk&(S?C&~?OVc+8v_oCQ^|Y+U^(aqx9JJ-snLq%^j*j0eVp?3HU+zU@xI=_#X}kjF zr7glO1l`)KfC=i6^dOf+Jx+MHow2I~^{PSt+T}f^HrL+Fr)DZ0S^pJ*r62}hmAR`2 z&&uN6u=v@tVw{S?RuBW5G@;B1Jhm<-fH)YGlbIajz@rs}w+WmYF1eVEbD+rAsnHpI z&J0i&H8}-sf~9&A{l>Crz2~Lb6GQpFnbOD%DnQ^~QoL*&u$3g;F-aky z7+0I{s2LDD-Gm(qbIv^UTwxE@PkiZp;w{Mc|Mq03*{vTijDew*^KG!N;IqowUdW=aUc5UrrgNIKl z@_lwV;mOAxtsev`F=u$j;YyAj@wcTsM$_McCY2P7V8e-{j?q~O=OX`J&Yt3LbJHec z3QbYYN7>Ca*WmVXLmN|qoLQ8j!y4);!7h5JVO);qcZ}b!)^21A;j=wocXT7Seiv4y8 zWPFW9ooF+5{0JtYRRV-QW|b1BbrhsUcRD^#vOrs|@9|a|{;q!q>8j4d-G;pk;a|*J zw(uMa6%J%6aBQGpAz%v&r{hBPtHps}+ii~nMo{sv4XX%Sw|unTMiZpNMim)o*p|?g zOwi7z0BDFR5DtT!c)p0&k8g#pt7)zR}ao81xf|yG`0WQX+52K_(kSsKbC!&Oq>S zv|5YMu(ipox^t-34)YZI1`p3pWRvZDC0ccSRD%5twJXI1H%?>5CO<}RNi*H z>)~rS*!Ix135q)AW=)I2P9HzNf>Bn;74#k-;hhMMRgKUu;`eS865~mf%?#OXpWKl_Z{4Gs?LsGm(Hm`Ta2a*k-fzaw*U zkTn^cFBruw&~}NHc>Qlryu>8a%_Aalnmdv%8oF9On)B^n$>(A8rj`p|qiqWPRWCJm z$c*8C%+JHLp0Q$k*ZJ8)+fIpIXn)Mb!6NI2)}wbd6H6L(LQ<9o*Kz?uGOFvb=soDz zrByh`TtnXPHB+4E=L0iXcYZRl_1T#(H+>_4od9%hG=|Ac(l0jRou8Wiv91RgD!eEA zP_YuvW1Xco^4{qDta&os7BTRs;$EGs1EwWz!S1HE(QoKU_7XkSBb!IpBH5Nwe~Qo? zr9O@g`M-da<0$Cj|44xS4!+t|qZ3+{R(!##P?`@N1A8SV7!QMDrwS!2AMD`l)iA1P zTK6*$uYq_R?&4^ILxX&qY?^vMMeMPC?-N8hb>BQzhgZ}!vYbq)tSIeo9c8#MD{Xy zy{arC)moKhTD2ag=-c_db&zS(qQ5e?}>YCQc`gDWv^c%btS|@hX0-HX_F2 z8ZXRe%lzZ^%AyjJ!ztsRjJf}3`T<4Rk_e6zMkl-&s;tUj7Hw5hjTni8%P}5DOh(2e zR&Fb&@C{L6;N^bX>zYrnRY-ty*WIAFTr@9`#<&^+q4!!WlVZ3yeyte7c8*MtOJjFI zEV^@MMxe9wg7u1*ZyYav@sOSqZcd{nYnSx)K`Qr>EPC1F$$!!#J?Fqlio}2L8K;6h zAc{0Bh@-eza?2WL-Cj@S%N8yJ--FG@(2BmS7_@-A4eQuJn3bO0NBqR(aYbK32piTH|36xBg#wib~ zuLt3hdwZh+gp7=r!ihYFvD|3wQ?3L%er4rxL6Qae=c6v z8s*5=-^fN+YLhBiKpKYt>cEK;o@T0CflR!x^I=92;!;YmkKe z>p^f`4A^Ru>Kb1~(w{0mao_#m1JAT73^|Ug{Hs=~6P9Nh=h>EKJsr4Ax$xvJsM{!D zYPSqs);Doa#JQ8S9f6}+OW;tB&m=ONMSzZOd0U1Ln_DiNI{UXw;@EEQ`a4-$-bVHt z4y0Ubfy(@#=2F19R5`XJ*dW=^wUcamzjDH5v9O|O9W8mkrTVLzx89b?SbQ$9XSiQw zGm_3$8qc=17F1sspPE!vyldr-#qR@LWN4jOIVSsMGTXntF~eHA!_A~?r1UEVYBmI$ z7diNqV`o}WnWdtJAHngJv%1xc9E#_@1t?atPg>*b8jJw$JyTG<;H%?Pmx{ zG=^8+fF;`WOxG{BU$@TU67a>s=H~9R@7^v?jJS)oF1RKMflDXfHRz(DVGZuhRU{{f zlf!EN{*0^>d+y}?lm6hsHg?_w95`TRE5h{id`II>I53xKRUCc735Mo9r=DeLacp26 z-+|poW3u0{@HARt7`gPGUQa8x`n(7EQ?tu=zT^v8aNDlX0Wz#9w06!jvY0+KtV+A- z2HN!YeJ=#fb@|3EVkoe?DgSv%GVgWfDP)mqd3!$k(9HYKiyo7HA6la*Pys{eIMiG~ z)=%Zt=s!l{!4Z+)NS8lmsYbE6dCt{nn1h(}!-mUzr4cv|V zFSP#tuH-_C-#AyipEaB&!%e?DbWxRP`MvQqjf>fDs&dwpRc0G>zC;e~Xv-RYG3UUw z4(b#nIs8~Dk%R~<$^Ez_z(B-hy~vMcX&E1jr^SroP!)E&Dy`X6Qt02}>JDYL6_{B3*38keB_pIQqlVqA+=XKi!0@pQ6*#%rWxKWJB zu&?VFioZ59L~O&TZX#b5FdVQi3f#B+l`8?Lz4unM?4aZHli+>(m&n9ex;rAckQ=9e%_NR zmW-(}nNk9Co~xC|09QVW&VDj)(z(jDl{>Kue1ZQFNl-Pnq6z%5!#jcPLRs)4>L9>3 zm3_@ZoCC~rlwsNL%=(kk;F!s3n_g}*xhN^-I%4? z5qFdOC&=N~4?`DxArhwL^Wn&`N79D!C#vp+F!$3QFDu zUuJHC9{0mAAnnR`o4Y;z#4*7HDu;fih|M~2zYF^ve__4{$7}x~jc#3DWK#?OXK#A1 zj`%a};mZC#Ff64AmMcdpp!3K{_9T}8g*a%vVsdLC_v?`H%T(`hWn?BJej~#af-4dC zaq7B9d}&=!3p$hdE=JG|1*E;Oyg$%~nN;UUWCGuriQaaZwXU#tdPjOx`_~w{W?%`W z##DC8qTUUR!5Nc0rVol*vu8zaWH_kNXNJ@~UI*mpvLbNF}p z+Fz-Cs#agFGW^$4+pF|m5Why7&0Dm1c|=H;0%&rgupdoD9^oksM__y>U{(%KqOpMb zt8+OH&_(?1dk+$zCLMKb%og-0`R!Jg#mmR&*?=F)d)(Q`i*$B*EkMI z5+RtPq&r~Y>4nlHRJA?Z5l_}n9+zF@?(lDL`ulnFwVQHA{K}K^x6kVKai1??$!{3?uH@-7(jQ5abrf7@&ivt$C?qr! zCndb~5vHY*j{#9nm{9nPYS!hsX@P+7TvO`qsw7#uS8bpaJf+!ekeXuDme=M}(&I~M z5o8lUzCa6GZM59U+N;F>z@(y`|I?!sh?u`4KRi$`2`hQZ>nXG$(NRP+(H;47HC=SO z4aE)$zlA0=W}j@tdiL;S(mdUulqieEZGG0N&u(Wy-T zXUZ9GTh}V%0Nr671BI{fL_>i{7PiYj^Er)(wKg5Cvw)lJN@wtF{Q=kMN2NS<>w_b#+F$TeHQ(n#vZ*fN-l_tj;lr18rwv3zVkiA5 z8B7_;@r9v5UMnMfGyo(%bz1OG)RhcPZBynsCCaQ?yO4 z$r668Z*;Mzrh6~hRqG37xw$KL;zN}?&G7OD1_Y4;ruCU^~tS?4Ny-0 z!f!aN)UXKXJM5NEBg0n!1|JUniLlv6bD+jsURxiEwA!%cv^(5)77KO-S2&DXG@LcJ z3+P`YRGS;c22mE--B^g2SOt+Ou3M*Hog(l0d+|2uVz(a#WX0wZ3)-rqtMcSJh31um z5a@$|6vAXdpK;7^LA2c(su~vFl4}=C)5=L5=VmntQe3voL|-o8f9NoXyF@%tTPFkO z_y_HrSnF4{8#_zBk5bl-PHUfzBkFpEy9z0(3t<%U(*wLkOLT{>rNsVCh$i;e^qHE5z zB$SS?#_a?)c&T%vDr_WO#4#t}v|DOlamRyIgQg}clLP||WrxrTe4>zRo)%kVw>8nA zGs8T^44A9d=d)FF0nblGd3$E9_(!MS5VmM`sMeI^II?fRg8-9;?DKng7i1aL`Ny2L z8PZ?9&J^X0ikkGU^aiwcyK5epKnQ1Am_Jq_5)_~|Dg;MDT5!sRkvSRg{q+(`c4z=^ z@wha+!T0GI@{1n>DnBoI`wdtqb^+JU?ATtlntf4VRebwec4T6-JFDF~G;CEasG z>w_@C1C-ON_BdEzTwZ6!?BeV5a-}JQDPkk*__wCOw&{|Jfk!?ed=MtcDoF`q?J^AZ zO4Aow$@Q9o&i>_1Go;IrAxvJnXnbch`x8-5B>@H}UhC#I*DvY*Ufb0xu3s2`yjDih zz?Yi3?AG{45&OvhBI_N41Bt$U?bx<$+qRR5C$?>OY)))jlVrk)F|j?-#J2tBf6qDf zp1SwTuCA`t-CtMly?)R0Dnm;w*3beSHO5%_h8Pu-QAKj}wGli_q^X_+h7O~*yvluA zADN;?dRaaJ*lFxtHaH@vF01FxgopT8VPNf{Y|x@sh^2(Z(BF#35%M-(ms*2FT(A(7 zMAPnS$@fQ&yYD{MZ)-D;VVfr|vnoN-Z&z27LHO(7j3fI?37u5T5*MGD(e-;i&cE)6 zWu16g?p^w-Y7HMp%T52vtPxD4hDWQb)$7txDdj!|w&#K}z3yZd?YDSB=MMza~)HEuO}84oPVSHYWzU+%Z);bdmJW;SJ}AIFAg?tEMxyP&7U*o2lbs32Qw z1cY&A>7{^64yBslx-HhY6wQn^^zt|Bol;BWv{ttS;rAX zDCaAH(>MAXg$gw!wH|6o#lh3cc~zIY=Hhzz-+2N^)=1x!|H*nr%xk;~4cd1E+(r9! zkNatO-3I1IWskLBD}yL-e06e!VH9H?7LKX5-L;B8%U5 z-jV&V2Dd$-I&6K1h8HHA<0x%@cE`;-OTXLOW?`(hYq<|CLouNH?%FVv()Z-h_p^HJ z+Hp8fiLcc`(>}Fl78Jnbm}3|1-#9d_W2zPnKjSnF$ocjsCLS*l4#n=`1mK;e+j-Rk zg-gQ&*VzV4c`x-&GHVKnK7;{*I78}78S|c2Y;6`#{g$uN91Nx4c=xt6_{6l)^Z8Y) zETY8NxvQEOo+&G+1gJPT;n>xgeQ&s?vj~NO0Yq)4B-5uMgH-cS$R&FVM&`O_KV=GX zC7DZeD{Qi8B)7bfQOiX?T7?5DJwJGW@i{9f3o@?2-+i>%6)|8VyE zzACvJPY281)Fbqf(&!9unwAEt2q1G0Z2-q%T7QeheXrzsK3t&PxJA&Gw|Dgc+ts!9W;E ztGz3Z9cVa7g84{OdOg8uf-NngtRF)xD7l*+8kN8;6g-#t(n~=|D?x}<*OjAG3k!U9IrtBf zP$xB-i8>VWMVTiQy@P#$XCvO6X$6oT+PTS#CL49{jgS)_7s%#qZ-Zx6?N z7te~tpW7#*d#=yWmB@S>U50?WCpp>=r?WJ<61vSpjKZ#yUo2n z^+Hm@U_#5*kP~KW?wd)Xh#Tqq4SnhWeNF4&1~>BTN58d1ZD=|^wj zRMpnr>b&?}js!ZFNqTELj^ErZ3h5_O3ezO#L3GVB3Nt)x8rggAFl@f#&pD{WtI3_; zWAYbr>cV}jJ)AzSPPL<4=Oe-GahpRld4@iXjE2MNr?0{x8zkTW^BDDboo>EXK3rQq z*QUojKBMvh^GSV)0yQS?BZ6d(<{vsAxaY=tl<96~8(6!I(dP{epLIMC@LUXxM%IC# z{8)2dYm?)58-eTN21b>{+V;k7VnT|?qB5}JBWJE*BYoCe6Nh!IX_I47S_)4ke1`Dh z>#Nh*zQxLu9=9%Fnx@T_n8|k`v3)TW-0nE8siSlpiWbZ*0sd)JrTN&f-87`2o%n22 zC6Sul-1uO7hqif6kRVc&(n2fWqu*USkI;pl@==X_m=OFiE{tF9+u%T6y-Xrk{u4d! zCviaH$0z8AFe}ImSc&6*tTm37@pk~o#Y>3Le?@GO%#H2gzApchVCCRt`=5+0$N#a` z5b<#SKLBD;Q5{Kn)vsi&x_Wxjmt_)@gO}z1%EW%%NpENX7ef4BwX7`vl@NA=f+T2V zZUp}UO86Co{l6akuh0FTFztUtHdyJ=|5^UWVMCNI1`E#jADa!qe=P;D;Be`aU!jh# zob7*ejK6#}g00=n;3Z!GigkXndM-Tud@5jB3oJc$U0%L#-urJ6 z3kx!8WwAz$-a`|%6Lhl@g|vd5(Qr5lAoZF$(Fh9iBseve-_?Ln`xQzi;E3JJ<22p__{B#l`}VkC^j4rt^6L>LH-1c50l0TVGV7)fmu z7+4#Njd=|Z$apvp*ruEZXAtzy!jYOb1*j2G9T>JA5{OVbqw7MIlDoqk+Q~;h_NS8#;XR;V=qaXpIU{d<)usHFO_v5Q&2%<{l`ONB= zrXO#<)Asi5{W7M(lty;e;ddYj+~5p5Gm3 zBLc$1peT*tBs37X72O6*11}Oz9_N+Svq(d^=BEw#0oYod7s)ofDgbdVG;6WdAiRT4 z(A$seer!(KS~*hvwFkBucJ4mzl;ldw_z4Vqx_a3TZJ&R33=O!qp=A`&@?(G7%qoPH z91w3Oc!8U+Dh+l4Kc;WP6^>HWQnB5=1Wkh4>m0%>^u=wiz>AVS=505OA z&g-ADGr`d-iCN9ODBM7gChorz zzBH85#t(}JUOkM~cB#kq>%m*U4!`B=pIk!XS0Ga)!(fO`>S_9`j6rA~f0=$mHkHbM zY->LV&x}0}ult>-j54_mQ;zQGGD9nG!E)wSGsaaQ;;h7&*HD@!jHj}^9IUf zHp0-A9!m0{r=sx&7>|-CA1G6=my~63VLOoAVVmR3*oA+W1PeAOtwF!NU+~FlXuW%E ziR8L;<(e(^{Hh2jKK}O7B}@kgHH64CFxTd{a2u8|N{W{LiQ|m#Iox-hsdV7XA86p9o*!(m@%0D>K55 zU?)}&Zx3i(T7=oUNNQQ0%;j`yd3K^;UvC}089|c7T1hR4%S~yN*~bTgyCz~t5~zc&pXjEEQJ|1huiPUx8NHqljq`fezW%xq!N>3~e4 zYVELO!O?R%+3>nUO+gFp6A~4{vc`UppKZO*SqtoMZdKm>lBTDct4j+I*HU#Tq3zuA zC5>@na)`58V8f;9FE|QOld}KbF87j))Mhohw%ha8DG_;8P4I0!OsK8%!0mxo75>(y zu<@;k*Q(&e(z{@uEhN}i2y3Lyd!krM9;@eKGGA40OP`3ivz{9VOo1Z;S*sw-Kg zn*3#)61a!TpDStU86Im=rn%t!*RKiXA5I!`?TVX9+0xTQ1fE_R%P%7GQqN8YE;H|1 zW~WG_O*{EDc0I$^=@AkH=CTl?&T(;;%+Nq*!v3mc3Hs7jb4DItjy6BUq3RGK@B4-G z)GmJxwos8DtM0ji1L)bVu83kB+iTUx8088it8KkX8es#1Hs_6(`q z!*bOTm-X+=mJ~5>y=eczdgR)RwnjCtA&WU3_O|D}zrs&}=j%GH!AC`%*)DOMumPIz z+YO2*d0NDW_rA&yWpXjuKNJCMWYcfHB?XiQk9+&JmwzW!nz@$q3pmHmO=u`q8_zZ2 z&`)3IVz^(R9Oo-^P=+?}NACaJB==L#`dwB{{r^DH|GVGg`M<&F96a3Vc`;x@@c*ke?F1Y@eYFp~ z2=l8C`+wRz?$(5UaLE7gQMmrYgJDRgiu(emF!zJQrvDoNF9hfK>gW2vATZN22Ei@h z#hqvi66t8x34_toVTZt3V7OH16TvWcrqV@+z_9^&PZkU^%VQ)oP#1XkTM$eU%`5mP zjvbI)!ViD8xPhIB)b^2h z5+fD-N=8?Ct;ci_u}{Q@Ie=~4261u)x9?rL5TQ>b!~y&FHZF^60uKrIL2tLaeX}K= zN0I^H>%ooOwNkO8Fj<3#@jQdri?o0!xzlvw!Cc$`;-|vN^jKR?P^I`ZO?7en3G$AU6SoSnMU zT`(}0clKAugO7-9#o(Z>pg($7Os)ge{XL)l<}buUd!$P$_$-4+BLmDJze4*M{6Vh7 zA*cfih`CV^8bH0lMK_&Hm5^W-2)iL*E)_s#u;9Son(NmEM3i)|3>$iq65vOUO<)0V z(HxPMi%*I6Px_a7#dl9_5TbBL`h|o1M3lsNY>1E#bQCBTG13BnUAQyw_p66NVsjYmH80He>2>EUN1sMp{YIp_T{__BktRufc_frylinN8z6T>V!eL!!Q zhoj#>_j48iBzgn;$f3(&??G1`4giT?>-tw&`0!WR)f@OWp1~&xa%bK2)|0SuM=Zj^ zT0*XFAoj=<_?CWK7>J6t2+uztzY-esw@+Zo{y*rz82L!)qsxkBXoLWuV*N8!IaQ0kQ67b_VJF{>M?j>s0(^ zUh$@rwUOY5q-Vp~YWNEv>z=NAMZRi`Ah$YkH}Ji{bY^CZV96K1W6~|q+9AdUPX@5$ zJw7}SBKrlxr?nt$^TS#6iAQ>=ndhP{@K%(EOAFEaB;-ku3cIQG`~)SCe?G})ibY!c zxU$RvKOww$%T?!gpoTBrNH)rrTc~uP4V0L+ZusSGTO<*j$n|D=D9!=<0tZFi@q$gzHFGa=mZkH~ddU zSP2f+f>Q70%yzIL&$)k^ll)r_V>)+C17&X}ZO(pes32Pl=hu}}XY%IEIVRo$?G_^v z4lp403YylgpbX*TH=2}xH>gbh-3Iffz)(UX^Om^$-4zpP3M3N3I{%3{@FRWn?_mc9 zBiG+%UNxJ}DQ&Y+*zcy8%+>u5LA(TASrEkbp)lVh6?GFaSl&~uPJl=DqYE_STKuL~ z{#fDps+yOdT>P>n_EAGs&_j;==DkbaLJU^<$0lvLf~yKh;CI46Om^a1_}&`hx!Y_Z+))2b$Qz-J9R=%MgGNtpB{#snPYo-! zy;bfK`zJYF$MzdP-_Cn-rkXPzcQJ#!Pr)CGp`xKXC{mm7?OLL}*wb3iE@9cIdl_I2 zlwA8_jVMI)E}du`93S|FquhDxK4Lqp9I-*{GfzS!rX&2kRm1u<680TCjFe>wyvRh2@_B*j@??UqzM zolZWLzY|^_hrF+tu;t}#z`hHZm#6)1V^weN-W3h)xALw@yw{-)dDh4-d@)+zFazaSbx5Qb*is{?YtnQu3@hgE*K5`4H)5iBZO+#+>} z-D`?YE%jrb-hos^6x6xdANAgwOq7}^=5 z*cK})&W*%2mrXoYK6?EyhPw9A{SJuWOKUrBxC}5u*){n6sLn~QiqaGdJ32%)YTh?l zq~}m3s3}Umw9dp=o;syB7F!R~7KT-gX3o6gji<^uBTd~3E!3e@)lZSNAf*E?VmIAD z-PcHEgu2SJ$w>6}OBG(v7R)I6{k}4oYVEK+VCVA3$kVq(?NPi`h*a6FQmVv&Rl!qH zc3A*2rjO5nz8?k82Zk+z&1@Raxgc_akN7gY-E-?Jjdq?_K9n=Gy)6~txhT2$-1I8KYX z#F@$<%$!|+c0?!=lWX({`ACD7ZX|r7RRVu{&Rn#_IaH*%lx@dx@qXb?yQ$}3{@_nI zK&-g;4k>df=Znb07qIzFOr%yxpeUJF!ZP#um8u0huo`}!5R5LcIE%*RPs8AX>M?3d2FqSQpV-#ebw4ce(e63a~y(wJx0t7z2f}!^a6Bo z(2^36#0^doZvNJ+N?A90&KG-G6(MFPJGAV7b!?2Yu@JNI7 ztv^4vx}l&@o^jHb%DkE==b%{LXBUqQ{cQ-HYtL)x@sEw^6)Ll=bz5@ZYc>_y&VI-{ zp0)bC6($N>>Au5y%<%Ab1?op&?i-MYfIZ!W@tV+0>Sv~{B)s?Q3deysJ@vInYd8d) zz~u7Dt%0)KIA@qxVKZfR^-Ndthl*R+k4rQuop{DrCSARef#sB^_x+F<%?BH*Pp=Td zM$s;Zk^LG`6H<-CkZRo_R1b>i%4$LoE#uYHuJx@bp-bpA~eqGm8l`Eg6Tl{g2_Sd5{!FgL8(% zce|RN2<3jA1=#?;Tdrr7k_e7+VV;cg?cyjt})j;lTpODn=p@s z!~cdg%dUg_>ZIZSC9Kath!TAb^qBCkW-x_^73C>wPF6veE}o7oV$lKmzZV$#o>9wc zLEKcwN>!321x}axZOZ(H?&?HtlWr-87muI^t)=D#15^;tg^_` z%mNNxbBlYt{zsydY`dav^ZA6`$2a-XPyr);v6J^rUX2?yx|_$qdPsbP9dCRBt}X(c z$mdz6DebVg6rM6;n>TtO=@(&tt8ZIi0?C5etM#Z2uJW$sF+s{`lf~HFWn*w03bl-? zR9ppg#IWq*$;z@6Ql6kq*)CFNXW%EI2U7d8WrfGcV}b~k*q@6t62k^PnX^Q!SM{PeabvLvmW ze?o!>N&nJL$KzJHsoTg2AlQAV^TDwdBSupQ#R3BGD3u~|;L z`&ENHsWjk!fphljIk*Xq-_Tx&dFGZ|qX^W{1X^3r^rs{6p>_@_$3I=ju(hNDPbI=V zV>kx-bGoc>nru+&hv+Tm=jn8@=nlDh^kR_U@b2VD3hfV0&5$>EJXZj1;3+s^-Qn`5 zmw{vYksctymlJ%3;%a+vFeqmA3FZC@-gHlPzu87ECIES4KPPyGv5+c z(7qFQquKym2Pzmp%4K2;XPZ61>Ep_jbz#Q>nB?Bb*lCvH$mM@JrU`0z1W&fA#aK;LST#5tf4;DlhYczWs|Zg%X`kF${FEd^=XMzjOOdNOGG7lT^aC?(-^^F*qT(Wd+71WS zb-4UswGC=d+#CLVdnp6q9$&%U*WQEF!r05J*N@7Kyyu@?m054I?Y#rdBs7j8g{*53 zN_DL8)xEq8SCK&TQ8m3qK+E|S<-nzleor@rkD{JWwUeU~?(fE385Gttm}fHSq-p;9 zUwSv;F1r@5-&*Foz>L?UoT7tpLFMUuu4_x{A2;8cBt9t#`F}$PEv#(85>6R6(-a)3 zMEjH9L_Jj_7A+q>nzUKZ+P$3RtBP5b_AEnUYV~GOZR!E!Y9?gf-#d^v5aq^&u$VW< zpd@V%2(miq&XyEe;EhvLq+bQhczL;#52dQ6VREod<$&3e9L*inMg%Y%ZVs76m# zPu!Yq$Es%) z|6~ScqjBY{Pxw!h?7|GkzxtRuVdowXo~r7&T`O)+*mFo5*1kR)g5ZuC^6qGE1R&|yk;H|I$3mi(zNMG;5n zz@b?5Z1i{x3CVfyA1g^^wdt%If0Rm=eZzkTPC!36l30^f1qcp0G8-n3N5Frwr4;kCz9c8H7^V*9Rb|(%9 zMTvrluT+<2ZrpxPMhUL;EM%`nE?v7U^{huT;72&D++%+cV*LJU80+rd>_0ayt|4^m>^dxgM$Hw~Uhypme@ZhzMcW8hL+#`+9+#gD+M^bA+7wNagcbIt-Zp;E-_ z|M3aaVljX+t~ttL>JQlJZAs@q+`qr^tfBy!36rNnM*e&Do|Yuy;TTWwLuz;b<^%SM z$oNaVal>%6Ovz>E+#DGQvT^O)zHJt3#^G7z1ypK9R1)1OY?>8DiaB=tLTr{GJqitR zZfnWgx@_IMMkw6ZHuvQEyZYPccn^;qw{|&$RrB<5hFz&f1*ERF=x$@`C(Vu2T##=U3%y&l6CWK7V%TIO6F~} z4@tQvuf-5P%U?7tUF0t~CXnAHd9Y{~s4u@I(2b+30HZNwOw@D+UHt5~b@q&%MsnT+s*orr6 zx5WcLMgZ$l6ZTV1arHQ?cP^uK>E;|y3^7;8a$jrg;C9~&q1^2JGO$-XeYz1G%hq@4 z)N2*f0VBW zOv5+F?SOXOuD;%z8-O}tgnX{VQ%1RTBcxzkUp|642Aa$!e1fP(9AYLtNAAai!;_)J zA_-B|#Vf8uP38pRw306EFrfy@H(%Nah~;4^W6>>(x|(4dO4BGA=H*u{6>t7}UcQx7 zIS)rNm-oW{)%dd|0+lx$p$*ZUgn+^@$F1eomGu$KnSNr-6M(?3tMQzDXbO*NA6J$Q zdFUsr58_RKQK^bPwic$TJ_4N^*WX5Zqdi>60AY2%Ux;qs8jN4F-N1LiVSgww#e0si zZT-zWWc^U#p}JFiT6IL2r-9Z~-e*P4 z*JBdGRh(+ECKF+s74jOB`{zPen6-@IPop|TH4pPTWF>MgMN)c6xh&c@%-p^a#ZfQa zMfSVvb{L>UWyF<#KAYl>s#^^a+4R@bxWn2{J&ce%MC2`cjFgTQz5NwZjq`AmER0c_ zio3}@)th4eYHT=g;evBw`?9bbfkn=+J~~tlYkC1#T#f(hRbQ6TW`T>{NR4S!;K1ui z(a_426<*9e`IECBE>mMWdkT4!oTlj3(+Bl**aYyh5Jkv3m`7GwnaW3}V%qQ&ANZ{? zd28yRe0@tMT)skTQryFMQPyB%n+~r!JF_u)nTdxC*d%ae>CXE=L`}F`9Q$2Z^qv@g zwteU-=jxRLh1&WDiG%X@JDlY2g<`Ne*OITTCJh?$`9!TnbZfk+;ZB8il%=UAXzS(+ zXTU27a#xEO7aInuhkwsT^-gIqjaxw{b@LBnYC46Q8Eqbymv?nvR5BFrGUZH=n}A> zpj2)0)JtX)CaYIk=)X&*RX!1A#9=PJQ~YgmeiNu_i!C8?B}YLbclvl zMu>F+1h3}wU!i7~wdxpXHOgOvZU+?_s%~N&8LO^ucx_zeghX?TK##LqT) z8OACPN6_Js3B#5)jS0S*;-iPo zWTqd?F6jr5=)5&pf9SK=gog~)^8>;~6ij`*u;06@2MqL3&S8imefZ}!MaV{(7p5sm z7E@PvI0wU#t$(c_Q?Rpbcw0bbM4wDL;j9?KBxI$}Vb}xC$Oe%Dxks4;?v-AK0n?^Eiq;3bEd2)lBFN7*39& z-?iyLRq}rP^Vf5hw3o z^05SFV?aV?R;}w53uU?~=oS71DlJT~V6+uqEn+Ld?SlwHQZ)~KegfDufZ2ZIUzwll zxbxsN0#kxP%)GY4Xr@}00ry!SloXDoXho=qy^9;A3ndtp|0zU-1TM;GJs9s9RHGq3 zH2RBS^s&j_-Pc3jTL`S$usxD(e|kl8POS9c^2t-K@VKNR;6&g^(%D~ne79PuE`u%U z68Fcb0*q!)D+GLkry<}gO|ySZ{8DAcYK!4%^0{OG=kSE?%X$4-w-qien_Kj}uBN8^ zc&nw|YRD&ff+g=h?kvEW?#?uI5fyd?VR3IH@Lt63<)S5!8P@K_Yb#rj&6yR5shI>6 zP0k1;V!u=tE75kPgWA(l*V$QL{a8iuo>90RZJlXG@jkKV4F@)@+?hAM#%ZXLqrW(h zfeL;Ssqjhmr>0xOl6}8Aed<-lz-o=m2HD~suN9DYW`!G5D<{nftEfz2g56o&o>a+7 zx6TEdEE?hK&2^glE@GPXbKnbpssfC~ljM(0(cAZQ=TnPK6MgsI3#s5$`RYB*_7LX# zi1F=f=xKsJmjH=&XXA^EOWfo(U95^A0sI8QiNYo}Q*6zXqw=@mG70xWKjHvI=V>?v zGAbzq((zyJVN?-W@!g|=!5#<}*d|WVc7|K4LQC$EOztlWD3;K6$^I9#u`Mp$Y!*1t zORT*K6Udn!bjjZ?@V_^_mADryQeiS4Hc1!K z61IIKN@+dIupN$eSZ!z(4@T8$5ktj|r<5yI;Z+ydfx9evxX}gW+-z{jK}?N?Gg78D#*v#tyUfrhx=i0=D%WB*U9T5>{{Pz zEP+&Zp&%vP=acW1XY_G!(U;=_LuW}1z8RzB7klU2OK(`BTZ9!hI63yycg+=om5iLy zLZ)m(%3$ucp2SwXxlD^~`equ$kGSEPTC(b?gK@{*ISngv77i#>&Yel1=Up=WZ{5Bq zahU8u4ZZ}5Vxq4(O3sEz#x_|sZxI}<#sIARZ;uLIrfs!K_6r625*)5Imi3<#NwRAX z)ohv}qzk2ZT6U3frR;9!UVG$U&g1iuG}}?WiEU|9!)UYPpHX$*8R>N}l65DKe#mVgu)U z6#Z>xEKz(QP}iDlBG949-5lnZTSjChOLOIf&1*d^ZXSA+nxCaq#rZhN6baE%4qD-t z&GG#2^XX88eHW!*oQa_41>#)eq?nZ81Gi|)(@3n`>@3&5g52iTyyt7P-M_1$1+F?@ z7tJoylY;`fk&BNuH_pu9cT&M$v;a2x2e*KOnYhtOJ2JhGNf>g7lrZwzOjNZxJgmvb zTU)wixOXu3E-%z3F3G4MJiNc@s@Pu1rPI$Lf4i*q3ciOy5|9hattlHc`q{fa8ek@& zrQMXx4@6q~jp`=rq!y&o71ng4x#K>*t~qbwv;=oW7`hrtl0(_*i~Svm$OTwkvOz|p zrTk7#*Y&AGaf4?aU8foAsZzYDJG%t(0~jG9@G^H__qgw<&&#IdNE^JJ>OUjhhbh+$;mq@K?i*P|miM8`aEe*) zP~Z1W>jy--1Pcca;WL7y{ej=}$J)Tpm_Hr3$LV=5IRy~=`;9J>c-tAeo66lD$d$S! z`+8+v281bhnp)C6^xCb#?Ka{0$cf~pRx(&x8*BnMR>2Fxtsf>J6pb_Ax31tmThlxvQxS4L|%_gZ#>HAb*$e1X&#P;!r!E-pGA_`0-^(D0a()+tYJj zH27EEq57n1YN9FlNSEASb5c;|@&o+r!zvuRz#D9_Xe`vld@NaxR!?O%ciaNT1@8j6 zKF#Amxx)KzrE)d9bq@i87GkIWO7j}wzoiKSwh@={t1ST*N8HtJa{_#94!&pxPvjcK z>u04H^~HcLBM`q>@jrmi#e7~IHXlowR%vX6XYJvr%xCx5Z89Cb^M|kfW+R#LpMjjE z8{~x9#dVqdbdxPfP0Nuvu4J?ZM(b!-Wh5Tl#y@Fui!N9EIfe2*J}2bvZk(Sh(&U6> z1LEY*8$+llxvW)u(Riv>=s|elnt}wWNo})|0`Zw^x-uyyvkFFKnw_Gn74>tERg*C~ zhrW=AaObefPE=A#x42|c1<-H8SJ??C*|=ZRG*22k>Vt=RpAp2ppUPLC5@5E}iIfwB zCw8!|5O2)MF+5)XJ&yFhrja-~|7Yf$=RaO2T3jB^|Ho`BC#oPOCY>I8432}z@!zs1 zAt93g8C&OMPZfm_hWxLh*JJRlucH53fBf~<){7Hx&i~9D@%;Zzrt~i-6Lvav4+LU* z!WsAj7zb;*hzK}Fde%9(24F3a;=eYWzFHq%EX?=Br|$Kn{UUw(_T*XM(7T(bXW01-7`}8R0G`Fu zxW=3~X3<@V*9V zfClWe09uv|6ohEkU?~af;pYQYbh=`t4T3t8Zyf-Mdo9_8tnS;p?O(ca_P@c*GI7&W z#%A3xgYZu#)z7Y)ijE;O1~#r}>Ru8+8zN1BUO~RJcI93N;+phAV+{Sg$Tvf5;%*k} z0I`Q$VD~y9*(JM4)Skg}5{vYwFokAvCcWXD$8zyoQT~*o(|+Op=Aly_vklkypB2W5 zGGXAO#YC)AHirfu#kIYg_7^wlEa&_BCFV5eWD40{P`YSVQ}B#xR*q($zFqF(Sw(Ki!;^Vx`YP!H#y@RxWxW}+qg>vwylN*97flJ z`%si!V|8^y{(Y8g@v5dZ4~51u?oo{+0$c!&Nmwk~_1aWwxMdN`bQL+?FM@Fn;^RUdw9d9q~`w9PB`zhoA2mEg*n4ysIvuNn!OqOgIaf-m- zC3ARzpEtNF8a5hAvF4{!_m(N>hH$^VI)zvLWJRgU|Kt&6Ne5s7_>=~^w9L%_lMx6l2Jj%8`qjJ;3`WA2w*qn zSaSJiL>*2I7R!TeyfA`a{hKV5F!(GIdN`!jp?FBpl}k}_-$uWEK7ibQxulJ0u+)v5 zAisK)y~nj=P9ZXf$e&l>A?wWLl{(j~(N=?)o_LDhTf!PCZ=fMKQ+v13#J~pL7U0Zv z0uCZRwT4CWkOq+O?r%nF_!Rd>IxLfu!6#`kdrk{l)ton26q&l(MA_YW&5E}*x9<=qAvan8ig%*4R??e1Q z6%Dr(Ic>8_JNy>|_p81IMQCY8tgh+o38gWyQ@khMjQ@798QkO#61;&6VJ~gMu+}BL zJfb6Jn`x_LSZAjF?ueWpcy!0@4hWhS@SB|t>^_69p;5+eudS-cZx8{#ykydxBV&Dk z6E;r8TRx^Hsz)0m>e?S-burp$6{_Y=d06Gdeg;b1mfm{y)^F)wa<{p5Gi#`=`h@Vb}(OcKbaY6Tem3*mu9w{=Q8@dW*$)Z>4# z?`DawukEpENguJRCS#ejg*aBDmFSNcmCV#<`3F^swkPSJ%h%ZU=;RDK-8lJ~DeyljUHL_m!dbF98KmN1PDSypl;!Qe%YekA(3*1tWKup&!`HxU`X z*$b*ELL$Dixmv(gWPChbmZz$8;awsR^t!fr&4GFgM6xEfHVn(cm@NLa!75;Ec`Ii1 z)-Ff9?3Y}rj?1IPR9Kv+#W2Cbm)BtOcj^>5LT+0Q8Dw~@?^>yOybHN9^FM#%^B4{L zhheg5S|mN!PYYB|IyNHL&W6BoJt0fMn0kc(3zGMk{2D;;E)UTVs-v0f<6D>6v6XN- z*}X!Zz2b6Th6Zuhc7Ju&h&cB3K@w7C!ULjt8mytcnHkMCLzgbCfn>y->7!R_)ds$= zcUV3g$@}=(JjLIVLBeQbr>WIyonUe^t?C?XOVo{3ys3xGUsaXE`|N6z=P$<40?86A)f^jCetKIY+%F*c-xUMttXCgB=#KE*Y(viGILo}RAQ*~x zruw}UOCC$_Ah~r}BkGi-AA?-gH7HLa;}?VeL~#NRV>VS0GC6n9k3@*H8sJKeXG(wC zY^57-pPdLr!wY6IAqKCuc~+0Cf+PTlyJosq%u(IyLK4ZRzj{Mq67S&M&x{J-o>g|O zAieIx^jO;-8a|knQyuQFs`_m%a0@hzV@DgR2Tv5Y*Bo-EyCVuSjU!x@8H5~2H|f;Mtkx`gD|l?s{eMBe_5?e=Z}S&p_-Dn`aw{EanO8(LqZJ)Hyt} z8utu_w>yi{VuAuerfSg_op^u!ECP-b(K7+1m>0S+q;JUJ@g(}^+l%=zjxf1$HaaQi zFD$>t%sTqQKV<|RoisJi;yfG;B)y^-J7+<3pwrX4DUSTUr`6lqyF0>&T4WxysF+S7 zvH3B%i!I_&Bai-5<;HeKrH%hlqoJ4VQh8_wPs7ia!^tuIp(C&p>pb3&_Oyp3H*X3w z(3PY(-7B1yLsgd^zg6djH(owGny%%%_Nd43t#WUYc8&}JKH23rUEen)Uvb@XZM{E* zOa|mgs(I8q4w|bw7S3y-`Xv@}-CkN} zwakt-y>0U|LI4LovDrb+rrR}v-I!q_wTD-wop#@JupI9WI_cvZx|VPF;{2CA$m7R3 za+lZ=6Qq!2re@A!(@JAp8f$mD#h~ztI7gLhiggiMxOA2%EBZb0PXNIlNdXuI{^i8^ zIof+4vYw?#G&*pI`Y5RgCi$eM0hDaFXq z-cKUWVElmRUE*epy9aSIR4L2fB#vb3;K8_bmB?C78IPfVuE0XP0=(NeDwT1mkmCO% z>m8%}ioSK>;FqMa8#QKQ+fHNKYHVZ2Zj#2fZQHhOr*Y%t?fIX3$9u;)-_}@r&b^+! z_P046_@q#e?zfohqG!77@jJ_i_4S#eR?$4xoUmvUy;7b9Hq9m?Hp9$sYgimy0|Bb5 z9K?t4p6jYkwHBn`)G`$H>EVPaoxW#71a-l8`}FIqUh1^0O!tond1`-Zo`_tQt0u$4 zwmAiiSHRyv>CvPLh!T@td4bH!G^#qbb=#-aldJP#Bl~^`+_Hl|J{M`SvY(*1nIC#* z;`!wHbo8U2F}9FV-PUVS7v%cw0xwIRHe1cfsvl0Gdyu2~Fw!#4q{}4;7kNNamo&?&joedZQ&MbtqutL+k#UB}D$`WAExZyX6cQAc z?dESpr=y95A-mFcLq(K!IB9IlCN*|lH6 zJ%kaJVgC|KVGm`3t`tL_dQZQ1S)~ir7OIYtyTK{95vFb1K}Kq#1s-8Oas4IoR+lzD z2+rnyDI4e~AQ5)mRfQs9>M#rEiOD|gFbU8R$SjEJzHuhcQNDk&k686ub*op3RGy=$ z>Xhcz`vI}8$RqG(mbcpY6UZl#4Xo8R8Ydx*D_(WN^q!YEN0yHr1Z`Iz9{KCB)Gp90 z$uOpQF%__qAv)dagZfWyF}%&RigKPU6Ke+_>{z(nNQXCVfnpvExLPEzg43ip zwC=*2a}TMPUwYB{mvqmF=<}kuKU2$N7znEtbWsq`Bk&T;m40NplKtq$sq7_fk#Wm* zL9AZ4z+XN^%S6O=x5z`O=5tqd^Vr_54uYh6;F4M*F>0m9kVKq{{hTa_H?#+4aGVVc!2k{@1C3ozmZ4X0lJxWgGRd$J{ z*T$RdGViNH-&&)U*VS7JAq#ak1gz(FrDQwx8;Wi_oFA!c+Vm9TZN?XJ1ophs`Jzr0 zQd((jFM#{enx`+R<&w>t2#=BklIfxDEz-UoRKJq6@W63;tmC$YDk->&2xz)1s26mY z=K)Ro^r%a7X`mi59|4~Cs>X@V>0b4 ztvDMgd1u}MtbvcK6H@Wt^wVHIkqM_hv7Q8o{rU`fB~3`S0uP3t8L~y-aQ^qaiHYg| z%$wL5lXd9+D;1snf2E?!N=T~6{FmlUR*D0TLEO&PS=7|Y*wMn?+0K!OmGOUOfdAV` zM(u{+NBDpHl6!g~aT5zcR+y|z|I;Ah-;v2=;Gil<&VL}77$BvR2_QiKRBwzN|D}54 z1LsK2ZHA<7{tgLp0tZaLEQ6y1lcVq(UeW0R$m=7JU=C3Y4A{j@MoK24 z<<+e>{7x%N7Z|)3WmNZ6Vmy40Es`tKtMq&F_17L-3p4Xa3BZE}%)qTC!2UyfXBYUI z6*Et8FX34QzV>-XuZINIPPel99CO_ff2c3=?oIo-jmK+sAl{<*Id3(;QpfYEi{Wy^<(DFspKR5DVuNcW5%g)iqNxa;hlpohUGOI z2Gd=SOz*!JXExUyu0K6{P}c7PrI&JP&=*R?mu>|ZvY{?k*gz_mx#O73Tmx%n%w z<5Z9T;XjSX^#R!mej)d-CHkF1BIOA-2 z&R(D1eeK5T3KjmQ+Y2`bMu6no)%?Z_lnbg;QUZ(%hgaLl#~df!s}Q$ubN;;q21G+| z$X+=LVJ<&JG{UoGdfmS>$FqoODUL`={M1cDS?`TN`DjqyPx<<^$k3s{YbA+ed;5D1 z%QY5i8rLE)Xxgut!t3PQRu8;zQHQha0{V`BE>oX@9KaE+t9I~*cQHwX^llX5@~})B z#t|sIm6z-Cp3A2yh+8G>o_@D}>#m+OE(-YB9M2TxsFfJsv*uM^yZs00@B;qgSO7T= zyGS36cPieML4J+4QxZLFN>M073f)8S*x7U3ZJ{lVF z?qTf{ir~d$609^gORPC3A*SdK_)f5C$3flnXWly>Vg@q>mgr6Kn-I@*@Qw2I5U|-H`>fZLi~G_L|btnARAr6|s%;YUq773Z~`oejELnBc;}~ z{zEMO5+eif-jDlJfw43y`huW;mYL4{pOxY$(_VJ&jI+<7wt6QO;UbN5eg8Pc7 z426WZu8gg+2Rr&6il z;&)1;D*4x7QRQs0Xl2@*IK|P=TSR4n%u)O2RCwEpHJ`5U>G4?_+U6V!ux+Xi=a)l^ zf2V>ZMrLjulo}-W=gqHTJ}AxWHxhnRUd zl|oW1(nHV5kklYPI4p)-$VsGG!#aBB;BG7UxW?7@rlWy#_fp*iyIZK-w0k(jCc7P! zq~Eqv@%py9+)!q+qj!tPLw>+O((S^1_3a-~HOfCakY7S#^12wBx>RcwJeX%>n8|DH zIo36j==$a9Tsxw^5X5JvwxFjdJP=+~kcsnfxb|}9??wy1waBQ<^uet-k%1t(OQR8msJ)m2DWX~ptrr>f})*%43(Bf`x zKdm38Y{OAjE(J_;rv~+>Uo@Qb>KuXKN>yqyJC(y@>bl9fxN|SH&~h%;C!Q@kL2@5m zQq2e5B8F}ME1yxeN(YdCGpnHmH6`q>O(!CAxA;(xWNWAz7HO$CtO6yK%@KMs*FFeg z;4^tobw(raHqy;SS&+XfrQVMS zSC&mdjP9SVP}58Bn?a??iMCU0IeFp~wU0bR-VOnXtiXe^Hs z-nyAVeOSjhu{cJ_IQNhyQrxw4aXZc!s)XtKXXd0cYu_xz(Z&zgl{%RwsmoVg{BL)^ zHplkfT+U)9c7AMx#s!Kh(Hh@4>WiCAP3H3^pC-8(MU8J2yQI>E96wPqd&Y0GpJT9< zyWlCG=#S6m6fXki87}G4D5)n`abhu8qx125mO_>J|_Q@ zExVo&WcH2)cG@$tTKRU}ZI&*r9%mguXjUd3yo;zgil7Lc68AwWUzYnmItp(<4_j4%li`D5rysM*$=?oJ^)Z{Wwd z?B<&5se9^>t*p4$kS##5-$<5wp4%KISt06`W@4Vh;7?Kf_aw&zc*i=QQex~TVLeg8Y*hoX_LUPc z^Qa3sGya8ryx9C&={KS|k!pf>(*nst0j#atqE7uZ2Om+s8&q*?R~abN?c>dK0ef2l z{6As1C}ZijBK}45E&FUqLndAMo2s|HQ2-~GsvUrCn66XHu+k<*Q-+2VU`c=ybV>{1 z8p#@z?=5kK<%-&PNZz~&hUIfo3EmsALEy}YsOJt(4sYGRtUr(dX%6k8(lpjbHL1PU zf@OER?H!_<6ei{yURLQ<7q^e$)`V5uT$SC_CCl#MZK06Uf~O!BzOYKiQmpU*={jv< z{2SmPxN9%g3rgF;s-hS@3}zNw2P+(lJ>ff32J=h;jUh?}T=x#Z8(wVNiwkHfD1LK| zAyXAOTeNwr!dy;D?uF?V8)Rf<-+1&`5J_Qns`P9^1Tphpg?<(7u*Y$|Jr?gn5Uat?qoEJ z+EN|pz%i<@{DL=2kz&yp<`Ap#8#{Fy^O?6Q_bxrz9zMzPpjaW5MuWCy>j<=2fq`+<{{uEOe^VnaJ%*-^5hfA}Ub9y&hrXXR8i`Rmr-IVBx3FN%!nxpCp-(0vrCXF1+|drop~E#0JrM6mNBkMIe(AgmsOGoD7FAD`WxBuNAsOJ$=bU0= zo#c(ueW!?mqr{ilu&>}o$9IBNrUNXNkd&EeG!J7ECsK%Cu7=($(jYwv3Pt4&9BhLr z^PRkB$EmBya__%c%e5epo!vC|>2y+a`8M>Jl*M48y;u`F5sh%F}iS7Pnd_`#v zA)Gz;D^)AP5cMQh>w8Z(s&O-0Qf{nG__BDO*n8q)WYsVx7?bVdo6ke)l?HggqkY+C zXKqa^P*g*FVxbqI#i*gzxJ7G88_6Q>Otj zRpf0vvdJN#7AWN#e58e!Vg+;w6ZwR)3OK{(tBA9>n~x!Alf(;)%UgW){hk#?KzB0= zZNAK|&MONm^|uIq9unr_g9`96OX(HAtb?7JbS}R+KD?^fjb`r>=1kAfnwEBK3DBxKYs&OiW=lLCnHsP^Zn~m|B)piUFfEpev zcXU@6fQn*dJI;dWksu3S^Gs?69RaaIwcld;^Js+BbZ)X1I1T3aYRa~ z?y>3Ak=gg}^=7F71N8}V<~?r7x)V9`z0T}}VKq|*r_2L$!pYHbY3Tb2A>~*rqN0s^ z%Fb2n%176TW&A3e_JCxn`~JM^#-fA@t3aROeV^K#)35fs)6SB&$U45(Fzs=&Vi|1m zOT-LY_spf(+e=IA8j>ui6*)l#Ph^#Y#a1a*7&-XEz$J|7R}2poEUPHIkh7xp~A z(CD1<(qMWN!p#POibEif{LP~w-ezTnP)tdVq}Kw@5LJxVZ~!8wAY1P=5f*nWTCNpk z(2@I>OK9EMM<%?L$sN+Ib{O`f*j7U?;?KT^_h&d=5y(#A2Uq?NmVvSv+)0x=(lJBX zo}-dC;S5rG+C7S0V!8Nac(b`uYJBcLKL*9k#C+t8Y6u@%R5yDRDA76Zm4X=7UyVce zinkLSvws!nNdgWk`3H@$3Gi10x4xpGKFpt}LIwE3K1THRzn)5}DQv*gO2Wxy{)Gb2 zzN&Q>5x^vEf1{6cc<+l9;^bld{mcZ&s*JUj!hJ39adHUdP;aYH2E<8vw)>(p{jM+^ z(0P~W3!XJkME_z0H}20}uvv3!?Iw(Onuo!hom%j%v;x4D>>8_*W20^OE37JvM+A@a_m#fZ-RMxN7c7WkpYF)GrZtw1#oS*wPFLYK zqKAC>?YEn2KON*RGW4A`W%<*6?IGVf;O^S#q@1iN{+Ljg7GnafAV+}MjxX%p*s z+-6t(YAd)hLcem4&}l}J$gXQdaYcfBCrGOn>6Aj{hcPJTVy#kjy`6?H^OCHgR{8zN zKfYCHgt?cEBHL2VHuDc(_TZwDyZYH%kCY1N3NYPnzQIYA$xM_}ev}kH0HIcnGE3Yf zDm+u}AzD1kmhUm6kJWc7zAjBZNQ>(RmeWHTwA1cf1|@e3-@CzWht~Wv=F!J1GA)zx z+V0k4S@UZATg6#>sAI*~xnv@YgFj7ubgzpJP7|FSNTLW)7`?4KF%@aq@Uw!>q~-Ek zAwU(f#6_B+SY+53^m(seZdw57s!rNTTt~a)JUlw)NXIk0BdbL9)+OOr6(MtmdQhR$ zr=w@5mSN--tYgYPPvE;apC^rxCi*s*M0;0W;aDuiY3}yMM2~ueM=+O7z2Uv;px`HLii`=Znw4oN7zLRa2VObgp=XqLM zQ_Ef}Zv9%UaJ-A4T4?ehb1yh8=lV&zw3?*trEce%Ay*`Ul%Dp0Fa=hDr6qRQ&)lNI zT3>=SDh)zS%4#t`s<#n!SBu9ng@XMQI%0)tWU!j)8A$R^HH{7E?-_Fya z{gJuhQ=eoGjGTaBo*n zWQofqMY(cywF4W;0oZiAzbo(xB-JR5ZW&PPQJc(P8!SXwF0sy%Ene*-&n)>Wwfl5J z2{jsbw>qwkr>>#v6^!~3oHp~)SR0rE}KI&^$^2$JR|*x zT-xlWE({#NCHN4r-Cv{+w9epFSQO7t2lHNXmi$=o_?p$vXWqXx=d+u{$9^(>C*2az zQ1Pt)8`#=^Xe~L}yr=#P(IdX_xVO8ry7|EHP<(0}x(f0NLx~BNS_wdRuu!jK9WlBH z9QLH*R>P?c{HGs6cuc{?CBc)Eomm|gbaa*nrDEEPE%VSlYW(21@*yhvg-GWzn>2Fw zeofjv&R)MPuF?A>+97ZN$6`8j33;PjX z%2A}FQZ)m4rxm3W<`xiyRIEj1mO>yA7T(uSkuI(Ag+Yo)MTN+5lJeYm>7xkk-pgcCxXyH zJ{2I}7uCG~%?TFrM2YwuW$YUv;JG98dxR;wJ0Kv^AR)qJ&K*G5nImt3zo?6ud8ezp z+!FU~DKv?AcDr!aH5_mkMv|m^rBXHx5QRT2T~%z+Cg;4k?PVNd6EI1{x?MR$aKr7M zkSSR5a{s$Kk4Q@~gZKN`_Lc@Ru1yNVV%F;W5#;8HN8MY1j_~pqjtlR#wY3lhSOhz$ z)v6Vj!TihX&?Dfo330I-WS2_P;2R@mIq0F8K)9Aa?^@yZlM|=rbeZeavP%S5{5>&g z;hT8MA!X=p#Ik7_!u6r)2GhKd6O^jQ6hHPy_3up)HkxVRlHo__i0yBVg?(bk`d5o@ zqvsb5&1u>JnY75o&@$p2v~+PJC5kdadb*)nloGRd1X|c5KbNoIeDngzK8(KK*t9D>t3f;T?e{y zmxFuko2$iF{hkFG2(f^6uqy>|K1lDlb-CfRiZD_BqENXdo;Ac-sP^PZzT@&idR7!s z?~wC{-1Ww0IaAf7ip%2C0pkVQyCLBWg(1Ie8^9-rN6udgb}-6V*D0 zWBRDRHGWt(v*X|?ks1lNQiO4Hl!+SePJjrVZqwsOfE^ULK7LhKxiu_j3LkgFRvSZ> zAd3UZx44l?1U@9%uMv4g2RjRR@WzP0-yQx^`@YH&SEWiNU-w09(2p)_(Qz5z59jNGL}ImAoY^tKsJrGEp!X_c_R*V~ngHeg zo1$1L<$&0$PYSs#E)b7>E;44|J;IjEIIdVWxf1)WefxwCC zb{Rj1IvwT+_6vO0<7Po}f@aiXusJcx8Qt?(E<1(P#tS<%iw&eH;zg-%2p}9)SevbI zxCekdmF*s+RMerH|OLJ^uS4rr_XmTuEiNZO~694xO}y4LfPe zF{jP3h9X2xIey~70cyVMZUBa7QTi+GtFBK}8g)_lHgVCo+Md%={29{dwe8aUGll1y z|4%JHt?iJO_zPN9@Sc;EL83J5jSDY&Wgj8{mEc3M;0LBF$$LY6b`#wn3)-m5GTLWo ztnckrg~BTHnWlW%8npU^jAKbsf+O5z&IYH7?UX`ZXH_il_$znap&4oeu6-=>bBxRC9yB~Y~UDZy*T4g1?Bt-9NU zMPmHuam&V{!BY5Zar%I!w?2Sai#4Oure8V_i->|uzfgw$nP>uEHU znQ0kk=7K=goN8RlRMv}Bw9p|+J~BNoF(s`|euHP*nX>Frdr_Np^U@FADet4rIb4=P z;MaegL|Q1841eAx-_~qHeC+`Dri%GRcyHoS_lRGimHh`htRX>zp%@pz!G>yC&^DD8 z`e`G=glSMs?+%#1fv{pGq>ibjFdM)bm(@S` z^>;AHtqwPGKm12V%~GV!Pp%C2MqXWdUR(t=B?UaCrdtsp5sV?vTa4O#;2|JF1L<%6 zuisQ}ece&Zi`5VNZbNBcZz~ULP|h;@@h}-+A$;%E-}M07@cp@@M>VR{X#mfsO$}t^ z{|D+9&tiLIwoUhk=+tjwk@mz|?exprik65U{xjO&)SmtjpQ6SpI9ryP_G;b^D`;-ODh4B+S2VeEff>k#^Ku?e2k6(CW3!gQ~k7}afs ze)J+2>b?YMSJ*DvwyJb6!htwm5KR;oA9?n$c9#bPC~A$&8E=?gZ3n`V()&^_HRhU; z&0)V~m`ghZrcVYi4Mdq|r*uX&+}<2H#@V$i=j#VxlHqHL8W1{Xgqsa;a7g#A&8-~c zrj&JP_}pjnm~(7`wD*mvpQ5$pAIR|vFZvL~HHLwwn&dSx{X1?pR=S3V&=985`zZ*V z_&1t@2 z1c?CCplBfBdCTz4>-0F6;d)*AyJB{oz2-i(9sXA_6uImJq@Du(n6`2=x_J#g6N`LK z$r6$u2H%Ls6Ce41B*)a}VrO4t3rsTfrcZY%NQgTasPU63hUwAJ2|1yb%ybr)z{^MR zmTOp6|MmP7-w>OF?{+9SvA;jXjqFe*BGmzG^j!W7!8G?OxaNJoQD)X zh(A>07%OWl-mzQoo<1@yGG^1}L;n>h+L+d<5wMZHfPYx~Cgfo@ zSay>x_!p@eUPdyLZZf)Ka`#ix8JOtp9i)_wJx_g<_=&&Uo>Wjk|3Qd1C#3$hcy z)s#iQSdem}|3i|dE*B8BvJc#y0gj3bMyUGtxXx zJ;yH(Kl<6TMx;L~ffVY$E#@G1#fi`tH(%Y|lszvuq^7B|N%_%3xe_n zRWxjZ{^nD#%#7|N>=CbrYAraApWs&?V`Mwn^DKsB73T12>l30(j%_`g@lF7+N+MWA zCXeA#bri=SzObPF!^R`7yv%*44ugnp^7tFWG|G9*LW!Q`%&7Qg=&yTzoDecD#x6WY z^ax@O`)o(g^ARRZQd!OTAT;qFMi0FbbbitxGhSCXOKEwf9RMBd3O;R<*R%;mN`OH7 zFQRg;9AT}9H=fElgAMC6;RG14ZqV(|v*Nv38kUgG5IT9wyg;kHW1?cIhr;PaY+Lf%94j^eC%(#0Zo z*LdoM1|GI+FiQTnxUNajd?JAlGu5wyZv5D-9&|{}m!IU$O?$Lc%roG?Gtc~(sv)66 z8tvMAC>GZ&U!suH7k#n>i1!1f+Gy9aQ$g$P#OMT5ruxC3K0GzsvDihS0$FNtI!s)1 z!Q;G0aYvd1NT(s6We=g8!Mw=Si zUhzr9=lyX)m+!Hlbp(wMNcgIAQmwvLod*lo^j25!*C{EUNLWs7)09m>FNjwQDI#J@ zRdCx4o{b9LMc?Ud)seRqs+j9>V$JUGDd{Ct-JOsvq%*z!4X*BIoJU*THdME8lN$J? zQ>^H(g^3<9^WBqV?;$^HqR0J9htu6=nDzxGU2H0qpl<-bEk5cw;D4XwR`D$@;+GJ$ zTl*>i68&$%#~$e!DUc*RbleVvTLc)&GZ|l znmYGCy$ji7*EWTf0$}wj2PXXby9J8B6i=O-IktGu%-^b9rii*b;IQ*FWhYK>f>5XU zwwYc%tLK-_uU7T3jyUozBC9l!^(pjOv*%CRo{R1dU+ z$9j;rT##5zzVlKhs4v6Q>)rUbjlbu-t~_U**7V! zw0Idlk>g~WEBJJ5%f0Bm2uX2sc^H|*Rj=TE%Que|*rD!4##G!~$6sB;U+Z@5r00}E zM)$~Z7NU9TfNq!SMmet5Q_S6;V+%n;G9Y)FiB}A@kr@cJz+mmuMJpMr&Xc@K1i6WY znbsdGLEvZcmeHn=1^L4Sy3lY3D_cf8q5+&iS+eic3nNSwv1V+tf??(49_lIt%SkMC zZZZ5oIDCW{LoX6x#A{4*^^N5uY^v*hcTv4#*;h_=peVkrJBX>eR^Q!>kL0q ztAn@EqMsdaeN|o7FQmi!p1LxNTTkfP!n=9gEnuKNi%wXz3v61cMdU7xeZ*w-^R|Cs zFd_-)qJhwaj|;LL%&_We&kgBhTfS_J&qbB%JRKDT-??6Q!3KYCk?IRls{Qt^CvwV{ zE23+r0#Z1!k%^y_Z~EJ3?#Ah6R_>{5VKXhi8*ZFmm5K2Z6pn=aP%^t{6m*ipjMa`J zvvE8FXY$tY`=<3N%7%Fy7r|Y4lQ)d&8E2VLf?k77j?2)8$D}^RVl7wt9&R+Jv!7}C zaqoUb7O6R1QWQ$yd6KyfHbwi0X?YM*n&>wl1KeZ}7x{!m1m5B)RX)7FfJpIE1?Ip= z3msxiJF`6asCWojxz=McBp`4?D$B)43o?a5g#=%Yj5w}`>p~nJXB_)f2syxz&iThL zwIhZ-SZ+oJ)cT{nqd)tRhdw!;fIhIF@a#^GwaqL}b-hpeOo}lV|1WFk%YR3sFmnE1 z+7R=9WNP@F>@5GWwPp}DbTa)fiVzWljEI<~sMdechLU4XAu%vn8QK4b^Yy=-|1gE1 z|GPA~mkKohuk3#sYX5t8bIErQ2RJxqvV$xXda@uR6lwEU8W00G1PA+noUxm=X+d4! z&>kL`uw1asg!G`lgjm)aywd+K^#34d`9~)Dg#2gs&CZ(4C;^3^>@5d^$KhmW`(Nl~ zl*FXPl5^xh*qAIF|NZ#?7uo&W`9H}2y9`+#bc@09KfmwaYm+e)Km-3d?VqtXYx0Z~ z6j?HBH%KQrMiFEJ$-=^wEF=ht*$k%y>I8>=(UaHGOKYA~28}ag+Yn^`{@?If8UOFa zv;XJf2{_sRmq)px#J@}$v40mYtnnX@ats!h|LHl-!jddR3W=T^Lj^)jE^7zjA^ty2 z|0kTLxi%Dp3Xb^?>B}c2TzXrFUN8TK}h6e#3&FA zI9oC}B!~)VR@Kk};;VkOOV5Dy;<~xHeffh@;oye&2dQ^+b2AXi&5csf97C6^^OG$=JaJympNFe)fGJSa6VH1QV@nu+KiAi6NM)j!)ev5^||BjF{R zOb*QuFDE~^HkU5EBe$Mw23ndZvnSN|JAiMggCSF(&xRCb5j&uZx^K?%y(?`YJqQkH13V(2{DR>)}R zIo~0Yb$)?p05lIC^ql<5Pnkuqk5DdDp7T#~(o5@~Hiop;R%VD~hA%O(!SO-CJTs!R zeXA=O0}C^2uus*TGfM}67TB*#eQ4~)MzI7Ff%%W)_qSy+F%fueb5-P5Ao-p0Re$0w zRA}Cz!Jcx~(8$2Z2%0>=_w$^g^OKmu*2>!4$Piu&_~MF$CL$prf()85^9#!yh)f;m zTLPWPK{&&3nVHlyIzjscfmqQ9(Uf^4f&g2}k+1osg95dmg6t?CgB3)s_O(vXY1o>d z!ygdM=r2ZyC#P`oi zeNOpVB!{c)gE+QrjS!-={PW*ph!En`;yt}Z^W$O}&?cLy51741_NT>rCsu&n7oZsj z-CEyb1&Bkx!GErXb)zfw9AWHQp>68bGAhyub_5S9}V`BBl$BAk+bduUG-r zEAPQXcz*$6$>ke{H*?re;hDFL|0+rDMltDsU;wS!zXs+!Lgc^df2rHO`Pbn70sr|( zDlIxNwHZm^Y;d9}2osr_nuyn+BE$d5r#QI;(eN~9lv6)4FaWEy3FHmYN9T}Uy;Zw` zP8^=}tu4Vl-68z{2pR_giDEp)TSVgtN3nI)dr|ca*@L~^}b|~aCatBkkP;4?RBX-DQEI45Ap_`+*Q9iafH4B8EI&zOP0C44+$07 z3A0N0V|^>a92+xT8$p{Sy4%BdTxlGtrNV^Vh-%ZbyOmnS0ttHCOusk0ODN~a zy3$W9orI7GFrz(8<}Pw!HczL2&PQ!1z3L4+G9^Qz1O~U=Mhu0$=UF>-bQTF0hI=Wq zt^7Nwa#9`>4_LXTu&YEO|1Nh{Re07VG4dP1EwSwLME?wbM~mH0m)Fd7I3?f7-{}lx zUcQA-4fjEzX>&ddmyJL?Z*;cfTi0UN-r>dPQ(trgK!2ojnLcEWn1-9w5S-w`?W960 z*B1JMja?XgJnP`Oa*HABF(K9NZL`qnV8H0w6^x>w3XLDl{XPdwIpG40>mez;Y8X&) z%A3dKExqyvg8y6%NuGDXNkvx_U&nC5ojzfoZNbg zY+cf(svXtZ`!w{G>1_s&7rfQA;l$fJPrnI(DaSr?qoxyLQz1|KI-ATG$S`Xx6)z?p_LQibd+_Moqt5vVsQ~Q)H9|Kp%OEf;AUY0 zM^4z|w>@6g4r>VJvbjYx2@qQKk?57 z4v5eApwfCUADiDw=o)O_yQ6%(qyw#4ELZswQlZSs&zTi-@ho%~y=vy38rej;5PrjL zVpEeIqNU7a%2&MO zAxl6~o#DKCBxGzp%V9#i*EHKF&*Nutlw)4pm9wk;^zQu>*R2LdQ|N7#jDNUbggQ#Q z;&f*53Gfs1*G*(hgg`cBc_&s-rRs}3<-Fd8Z1SxRcg9w6PZvR&69)}84s)@-o?HZ9 z3dok1za6qh4`i+(sY41fe`qBFeJ}Gv*6$O(xVWm3V#YHqx!!~7o--W)pFId0Wf3v; zZ+h~2{=s+x;s)hh>F?Svc^y642~hr_kjNBuxB+iVBh*v6MXo6toyP3dh|x1yVu$pc z)#Sg3uP<8X^Gpv?AzcX?m}OA0soOmx}+>*a}G1vuvB(U5P5*{J*cV;tt`3THG2mJnnQ7iP1j7macn z<~~b_9QYWz4NETgTDe`1`=@F#cfOy=ndj-Y9>|E)(HLEFY_l?~2jOQE_nb>V;N3Bb z^J>RlNA#236MAp*P%V4k8|@DqQLuWjRd8lpd3}ZO~$o?IN<>|HH&AYp4 zmikn>tFL3@roJ;C(b!8*kl`<;Df6zU@+#n@~%cg|&$Jc9m-iYN_K^-dO&4bI{x zh`Tyfa*5w6Rfuj=!TM9;mX>MmlD#Yj7|BcLWS+57*I#aPgOzhNi);J*5yR79m+AOl zq&3eRrbCJm{SWQ{J6UtKzv}$!@BZ(-UFC`h0%xfRMj>*vqj9(3k?kB)1}@>^eu9^? z_}cpR1ftm#KS>c5+egOtuisR@xnYKUH4wfv?_16@Sej{7Gz1B8{^DYjurrPx>!HJ2 zldeH4?>}xpohoGkM2Z8aUAy{EN@4>fB{J*l4Sb>5Sp&rY%&%t5_L|D{2@EOF!@PQ} z>m%9j%xQ`-FztGVJY@0)_^_GI4|#7@V#JJbH2jrJ$LtX@hNR+Gx^CbKuL3fu-1bQZ zB0;${CucP)0o5#I_!u%4AePLmyd~p4`o=i)X5pkG<&cUJ7F|nc*RSPQl7+rh%@&!`zL|cb1QD`y$=8-p2Zs_wR!QO^7BHS3$=kw?^>f@Yrd z6Gx0u8J8hNTyk6*h!g<7f9jvC?d!=l>XfvX=IH3qV5$H8JcHkQx5&?U8#OUoC=y?* z_CBY?mRTe3B`%#22IXn{I)%!^iJGPIuF$j9UdCIr{#)6Oj)z4oa*ne8@o-EKn>Q(h zLZx+>t;_c$7F()DKS;C5I=zpPryjB$`9<$R?t5VM&#L%4R3E_j(ofJIb(iFs!`U=n zhTD|q-lp*|ib=v5PAAUqVVnaWBxbgeLh%4W9Xpy5Ef`GQq)vYzykNXU- z3cC-#_NUD&!ja5Ba~OI~nuU6~zUIT36!(8q7+_mXsawrTOUjek?xVRCm(si|81co8 zBX~6-$vv}KzjVqm^5mqmpv~x9OVd>-O>-g)GS@Wm?ur7i{W8Sm2e7^FyVf?lZB@Rj zp9muK((*)&fzqmi3FTLdBNP(cEnmzP;1(O>39bVLDt{qM`_0-DJs?d+N$@;j+FTkd zm1l65ONC4jce7)5FTA#Sx4PkKbxlyTYs(V^7={GBNkyzLUxH*+kKoTWPsoKgC zryDwU9rpn84;5}Eyx^KnG(%^xq?_FQqq|Z?U8Px0c&8b*av~tT732Y%{7m)*5}Jx* z{kt_ogz}LcE4&JTjkEJ_AJY#WieYxvlKb?RyH!yKyjp2ud#St+?!-r?;;#?ihi7!- z3MnDI4(MWQ?b~R|bsWwbbOm#+Gu!%338V(K_=$na#;@~3*)ew_2o_R!P+y37e`kt@ zC$L^wtn>JAljhlTAw!qXf)13vD`i8${^)Lw&tdQP(y0*1l&n%J+#NWyhiQWM9E6-}y_O0-+&}mc_nyOu zqg8C$sMtf|dIqf?Q_q?ZPC-@fxVz^TQ|UV92$2^`15$3qNjtHeib(Ynq&5N{NcT2j z4t;l_Gj~9zEB;ucn3z>#Kn>!@uot*&dOLVD73Ss>e3keC4@+;o~?` zR{yjd?I5OG=k1YODPot9F`5oGyszWx$vx89keK%@N5Zqunl660eAdK76+kvqa6N@E z36pmwR`MZ1p9;4Yrd|~ow#;KpXMJbcZcC$0jHctHMmW45i5S1b%Qm4A9oQ?)Qhxxp zHFok3th6+~Le^O{l&GNG zGBl%Ohh$N|E3sRBm#% zIvh_G7Ij|{v~siV-Y?$C&9r=59?$%PEgnTwp80bIRFq+jjRram1G)CH>M{R6hLmBoweQ>13*SA!y+>hL8Bks?N>lI%DpTPPhqvU;evig^{oW^4Rp|q z3^|`?4}dmpC^{BXNysUVYp3_pd&1R;5V|%}Ge=Q(6-?_K7RNOVZ@*h-LQ z%eP9ZK(Dn3;XUV*yA>X1=z`LZfgSM~Xe*YsSP( znLvf4;xDf(GmhtDnoGL0-$1#UC)&=2EgfvVfq2vyNfZ;ft1uqpUK!ecY0ggb=Ul>R zqma2Wi9XiWhmg>#m|xzL$Q8^;PXW(798=6S1(3D@k=4FuPz-&le%Jvc_t)doi_c7d z1l>_F{~Yau6kF8G8gr}kN3ra07|XoBo|S>NnDCis04dqkXoSRSw6b%rymSynwaj~( zv06Ii>*|_F|JIIquT9p_$)Vm%OJ2f&Nh5sTwwkW!E9tuO#cI|vBT(*$s7m1H6Pji3 z3}{>#=#RTE>a3+3*B;*K@RM9_TI!>2VUorScXJwJG(HERZ~f4o; zI=%OaxN#%S+luwYi#jHW9lp z({4mBdN=fEe;#uEIqobZmn&(WKj$DE@Kp)NR*l**4a`@t@t9hJ#x^2|qGkP_UF!~c zV~X)0(98yJI{$RYU-3Jw9NuEV(R;b}xlB)VWqB&VO9J%JXO827SwCMTk8_nZE%!@{ zyEHgyf?ABA6-P{ztPaG9+Bv7<0Ds;oc0JruIc)SpC zPCiH)yjr#>s|mB_S|;X)_kBt+d^-Hg?F%uq}6YYkCTQY^_rsUCX@9mrFE`=RuA zX*`&I=F9IpIK_vnbwbp?7f+p-KdhwMIq|TilA!4*JhZUw_kvAWTy~rY`3XJ^4peYj z3(~&eyB8YTR@CeJRdegt6l}!}*rUu*g8MF5wxXZejYo0ukKYh{$#Le~Mvx<9) zQ1WQJj9>erb9RJ|+vuHM!Vtt$v589Ph_K-bIX*J@Bo;%nLu*a^o3^e8H?8Ur+IuK9 z+HEyZgl)ZZ&d*yHg8{<4?x^1XG&CDZwLM!|tvRJH8us9Bq69BH=}|RZXS&Rfe62Vu zPj>$Wo%Ty#^?_h6VPG3at}&|+W^q^Ct|+<4GNk1oPERE(0aF7mO7$rLV+Q~YfE_0k zLWg3XBMv^#-@>=Mtv{R<_juAOsQS6gLrVuBADeebnJbpijYlXj;dn40g!P#du};Tt zO061*M0V6lc+o{brS|V73!2#6hZC{#h1ld1Scgb*lp$9pUU35`zkB#%h zS@W<^Z|i?!6Gqey$U%;_%>N-$*IAkrtzBWyMSQ8Mxy!YtyWAU#j7dc zQK@4pr5HRhBOOFsiVYR6@Vd$)%$gJVih}wTZhyhus_fpGzc23@nqcrH0K+|5-%{xH zU11QhKGr>59s3>j4&yV3FkhjW8|KEj8yE4IVatM;Jct`WgTvp)HIy2kgtVzMF8;D) zi>Oys9(6Wo-kf(kJ$y8U@-iopz`&y*JgM5PaSlqRkCv)X&XIp08Vz*5R%o$#N)Qm0s4mvoYW3DK+Z$HTe zzpMT%wam9@9h*+BH#rmj6TZk#lT z9J@D(T-$N*jETmnW#AY%#(cP8byp?}6w~(V8QkvtGu%DK@73wIc4=50v@>ht@wwp= z^%*JHOwPCP`ZA}J%_BD1!u@k(k5_WOJvFVseohC_f~<}`OMJ`37n%w0p22UACfTLk zGui~+I&5FZCb?nqN;(P2E ztxW(@lNP*GP$8V9(TmC;SAO#$PYCHTySOlcn8EN$+ik?`UdoE9jrN#cWhoSzF`k~y z(UhxZBKU$|_*6XW+F4}{<*z8>dNj?+xPT??B2QK2YL+ZsUpf|9!;4hqc~m@B z4jL=C-+MFfp~S1E-7Kzuvy-p56f);X&l`g?&3e_1gM>$*=d5rOaL%bJ!@9D$;Z1nEsJ#7)9ITrQK!qSaO ztCqLM(>SBvt0gn8EI<4iwmvOtvSpi{pPHWi6y-@%Gg1oJfe$18`GhKd{6^X^ErjvA zjJ@f8Nk-AIgkd0)g?4jO2lqngwfBJO^S`>CRE`8MXHE?Rwbr|&j;eA2dtATN|k zCuf*}yBVx1D|Kgt4BcYViF28?*wnr}b07)K$3jfOb6q~6^QCORI#PO95$J+V?xKq^ zLzj=ltT3W_Km?i1f4!mTcxfgUQ2JFg+j4atgZ3A(q=i3Wwg-{wHF1R`kV()UR8w*B3@4Xfa#3=nX@?vQf#m*Xg2z%|AmxMp%I z$q{Ba8L5#I6HXBh=x6ZRXe-D=vnbxR8^=_HJ4$^-y;=k4QGBUik=Jl?#6J7pYrbJs zyhKY{Hb2`}oKO*F+&do*(_H!vaU8@2W)M#s_WFsLn(j%CW%V5&Z`SUT2( zkPDr76c&c5ME8#0aFf*_k|a4;6Z5xV;zqA86(<6aSpDH!OIeogTiIdfhHz1nNX*Vs zj0a61jIgMOgWqmTG=m!Hi4`p=6{}E+DQ($1dL%-7Ci`o)&>^l!Xk9|c5gr4_5aI5= zf>qw#KDh+{Wg|1NbqhrOV}O4aG5Fhg6o`dRFRlDUTK0F}{y~r{v@z0Up(-j^km^c= zIy;*}F2vf5pa{72Aou)Izl6B34^HBi7qnY3t~SH$&Rumig8-J*sM)n%Fj6oU2ZIzu zRFl&DZzmZ6#*)K=L@!KIW8?|^J@+slYf$G<6bA}m@6_^oFhVNvmcQz39I0d5uAAErbi*L!VL?@!MX=M5sd zr@IEh6}~pKUQqJt=L3C{ahCuI+8r}teyi~z_t0zKY%Y1Zf|(10gb*t&q<=B8S;r!p z{!sB7a2nCu_D6R40A<@^w=Nap?#16HyNuX*m|3k(ZY-F%T~lqsFDjy(6%oC%E66%t z`P2E}>jXH?XeW=f9fi4dT90OtjPV;1L&J zbm*!|G^Ij&aKY`o`ifiHy{l}eke7Z-`Xo(_W>oi!3y6(c0niYJqqSHh38n}x9&mko zQb!WtP#fZ>*-NyR7;l5%mSVktNd@R(GU#Gd-CtCfrh^Uaz+N{ygaRM6oSOQ7 zXc@m0S4>M+0muo27+$7?mEQ_kNZq;%5!a?670R;2uybc{ZTm(k8cd=lt1E?0q$5G)hZJG2tVZZVqrlZT(ZSmfg<^-d`)1u zRK8mSpT1s-@?2ccpeS|Rvd~B z2UK(dgxw?`>2}}vuarV~8EzEaRR-Gw>pv`E{FnVRFRt?)N=fR`x?U0xIo_VN>(dubOTRqKO*J$DQQ9xQ zj%d3d6z0g(F5OmRiFjrevUf!szV=!{fo!ZK=9~Q}2xyASI%mQYl*?!Cg*O3ejMOO; zv3FcFG?a&o$x9nq80<6_uyMW^ z^Fj1VFkjd?%pEwz3I~*2is{i<30;01)vU)Nn8}wDm9Sfszq_b8`us5XsHG`m75r=X za3p(8I1^>`%T~ENyQUr1*A|ip8_}mp(Jche`seo%j|u_!C!wG8%O>D}e8qvjx>)bU ztOAtyinqG)zJ;+vmx1oEyo5dE6l?WJIvhIQ2qlmced%W$y5b~pWAr_wzCx?uv)DgD z#0(b}3hOggEn~2%3$tbe%{)VvY?)ITNzw#wVYww8at5`nbk)L$p*KI-J(4TZ2Oe}x zg8OFE1qKQi?S!3d#OV|O+U02DB{e}&MUmyR4`YKn4nodw3kUVskz92d2TK-UT0CQ` zZqT$bh2Jkicz?|6VA#Wf-#$F?lQyYt^&xg9oW+U)@YZam8tga%KN0(Fa=S{Zi-l!0 zf!-EP0>Zn!28YwV_!c4y^v8o^WO8WanXV&qX>n$yb?q#2_n-VyD_X&@|NW>BwSsYx ziwI@x_*fyuUf*MLXWMfx)#2n?#S_DyA-6Ys%LJh9$Hi;hpc?L)D6G0EL&Pf=Ktjz@5k`@efGRDIVkI|&UpfAf}k=9)i) zriJ$1J($Qf# zX0fXA-h>r5^e_9a+!#&dx+7$Yin#%tXK$yCd z+WF5&U+nA%hUQvQiyn1n?E1;qH$jBLr|;XX)F4sN#i|y;wu5lo*qTFgW^SF9T-Xu+ zkp7kiqwzic&S+x-#&4;MxzDLgqv{Nf`<|^-I;~kI%tyQ-8?jCyqp4&~pp`f@6R)aj>(p#}iQis#=_!v#(m(@HcI@*4S}3We<#pTdGG|Y*<^W z$t|KrEUYiIZgx&CU2}JPcgJwBFETiepQdnUiGQlf1R0DC&A^aa8(m7wO!be6FyfU= zO^HoS^$k%%NGLEJz_7Tr*486%xIx{+(%aiL!iIrG`xyEV5qWSCd0_Fl>cg@D-JylS z>Fq2`$xu&x*_`3Q)<7{BBOxtAjv+J0K)8E&BOxn8)UG2KKxT*#hD26YhDQKVPGlO; zETEVgAXErWQ&U4!SR*q-62J6dI=lluNyUGN>`>MZLT20Ak6j{7-#j#>i1ZVKjHO{- zQFwNBGh{tKe(|*rSw~+<(^^l5X{>RD!QiH2jCswgE8E+K!`2ej>hbHT=x)AT|8WzaZDY&py>yKKMRM zv(eY^(REGep`qy2*F$>CYLQH@i?Npv1o69TkjvQ>&Bn3mPam`pViG z?nl_K;F#d~*pDy48m~{GFZ}WwtHA+>(%_` z^0_n{|MbfG8tS!jlyB1D8rTgW6t;KG>%k(VBln z3kD$4{_A0C#T5YI0HgwhKpz5FNeO()MF-;ia>D+C25H3oPEP|((>_H6Muq($(pQY< z1Dm3J5A_R1{s164fJ_p9hx(DD0HD;7#`(aU6W)dRvCsY$@oz%>nCt&3KK>PN{|bdy zLznK&U-=-Q?)mtzRL;#RGQ8eB5>nBh*#e=`d{msw@|OU-dy>cKNqd$PC*PCnpTE5O4+*6asP(R%fz|3z{`KiNy zv~KHX@XzH&FH)JoGbRYE$u}kl&C_c10GM*)C#=7$Du77-y!Ijt+WhIH!T>_IKB@&k zG&gb00H(SA^Y6x!UL^CQSIlpxsBgi%nJpY&6 zhu)pdzL&+HhH~&*8wj8_(5QV?jH@V*Ksu#Np-G=%7=SYWf*(v~^UyfQ*RWH>>7!}}N-vasn3R?~pFJDr*sb;8V%JRE!&)na z2Nbu!wfVP)*91ZZV=I?JPLT?0k`I@6LajJig(p<^H+IoYrInGMDI;WQiF-)1ruvv0 z%*yNpr3J##zO@0aEu{oB5-y8CPl^F!b(58vYc{?4Y%rro_zgE=8lb*xBwM&@f`=7r zA~c}XM8tq{?1?b2uvw2ed|DYV9PyW$LDFb(fa9EyRpW1m;YTxu`qJTnBW;G$4Q@8R z-gu`|+my?*#)b1tObG@|79Dc54HXfkKmG1Kgs7#wj+o99r0?-IZ+h+|6x=6bl^60> zLcXHbjikdX1QTPQ{($}QDCf-L5Sl|+F++y5$Ni&wG9k6G(jn*>L(HRf#kBWjwSFi9 z5BoH^J4#5N(r|fIQ+e#o_;|+S$>kRNC`h5Jl$e&k-bu_ATNhbb)M;*rTpJJ-_(6Ba zm`4ki$)@=ryMEn%q%V6Gu1dUA(*2)!oEh?93_{KFkmTQiIDj%{QV%9lYf81%z!=dC zxP}T@{|*NRxt$m0V3zA~Ox)$#T^>lM$2vusJetPDr7D2#K%9=baYi6(?ZXnpAS?o; zBA4UPEewwxf3(xm2u|e7es~n8Yy#80Z%LvCNVMx1L-MpZH>d=yFR=NRZF`>h5i{hK%DC9{T!rUvF}lJ?XX~a**Q&8X>W)VZy7vix~>!9o=uL%n-CjR^bQO3{XGBoIq%7R5iF{D>^_p5zNhq)1%qqeUSFKzUs03G?gF|Chl>X1B2ul4c`bgcGf?B z6{EB;r|DH;dF6WgBgAE{e7lL{fHs<1Py4#~Hm1q+W_=hOZ^|+03vK9f%h;S?*DfX0 z1Dj-V7Z9JlA%bhlC^bh01uJ%6y7dN*6JAvM60XBcXCflwmJ&}ODp*~S{|peQn}!$a zg^0=i)Q&M)3v?PLC@asn&4DnO3305fvsfn%Rf~v}skgs~hzRk$==jQ~qP{smy&>?) zy55GT!Wh+mmKdqDhxt~0Y6klgsNPo*ZfF}*2ACZ2f#jHv0ggsof5vF_8+b>MlgJZ0 zKY_s)H2j4}L78>g+7`maHjpT|Id=Ld!4ny$^1cD(#KF_&`zizY+3qcXeY?3CgN`~o z>`1S!^6f4b}D#}$=4yW}flf&->%3C(&dl2czX?dm$*XzwM z5r9z!fHgHe(lM%{aoM>!Gj*9KPBu2Wb7Ugc#xhk*%jZuqU*H4jgb${eS&p-nxcK$x z?X<0wX%ijto_n1@)-k&Lj3svqj)(dL`(Ik}Q=|PE{9|{FC(TIM{sL+moHU=yKxN2N zn4=%%8Tu^UnOCmYO0l0zvXd7d@Enigc>o&N7=(LFROD(Rt~nEbk2j0;1cN_Q=w??( zlj1QeU#I*SAykhottt6*C9%jXV^@#seF1M) zMS-M=4MaaMfB&%L7-ZhJ;DuF@>t%*qKzzu4=d&{Q@N2C2n0ES6ooJYN2ntEH$jtuD z18reJ1A`|w9$%Pznpy6wqmhoi?Qx`F49wzIp-+OLGtYotpF<_7lNfS4p3b* zQsDo3PO1#KT{v<-`e&ga_t zxuKJEuDR*T(!O+mvd*;@H6gBbUQdBz*S$o01m1JATVf+o^Z5W1^bM_m&eMh<%fP@5 zI4e-git@Y-?~DtJ4ON|bNi$gY^og*hLY(kk&Egi(xglfM7D_0 ze^)T*KFhX6*C0gcUTBFvjN@u(UalH)Qa} z7ry$gc)9-B0Ox6= z6+6JnY;)hh+cuzyD8C}OZ4rKdlpuf$7b9$P8shaiL4pk+c|FRWCpV^0@lgOdrRd{R z?Cze=*!fL!NnSt!AK7kyn1L{BD;GCKNO-{EY#^&W{EHn3lnc;!Rq7CdsYYHxeHwZd zL?`}$;reTdepge2@(^H|ydmNs!_5bRHcfduLR9C2BK{ZsK+?2wdLsU9J4_$TM@B!B zgOWl^nd?c^dFbCEzQ`XPXm9nkhUs7o2)qS9xs+BhtLPu>VLQK4#6rE{>G~EmZBVmXdl24Tj z%V^YcBHk75lwAN!=$_71;Ejh4_fG+F^Uq}yP>jvZi&8?ESl0^{wEMITZ>!ISPjucI zcTmi2>9Hf)0`@YMH`s0pJ5ZzUJHqDU5&y6+4`pS##k+K=;srUpC|3jei;zTg7|k~n zLBR~Nou6s*x5u>q3`Sw?-=m7i4Y4Ko2oO%?P^B74H&wv#qjOb>9)|NvY;G*f?d+eL zEN{nbA9zyJCXC2-MpaG;Pa%_zTOLW6CtLB4jy2UdFLM!sUFwh84sWBwEb}Eco#ONn z1l|EkOAkIfifZ+QU!4jzX}7zmYv)cR>wSD`=dnfJUOQh)ow#XDCN1I}ZZ?bMV}E6Qv^7Pv&?Jp%O{!|Iz0yk{1cCtL{S4%%juo|P~Zx8{N*v{dsp1J~A5>rk4r??W2q zS{DQUgu^}Dv*-GheL;at9!GyO-&Gu4N8t%h6fCE(tnlFp&)pczzZb^(?HrgLD!zwm z-;*~C>moZ6m>t~|k^A_*?qtCG5xT?mGLe}~+jqFi1?N#+m%g`n!nETDg}DM5x|Iy3 z_Kz?5jt@=V%J;EXsh)zy>b z=a;{~VD@a;Gn+Jus~6{-k<7a}C@tn7T`VzsPgMkZ%FI81(Yjuhv5AWY5n0EHbMX$K zzxK80kgvI{2(k|l=g8T-da0P=SD;MeIts}?c+c9lBUzUaAFzJWwPP0K!j7bHw*Nh- zBV^;vQ$>|7#LSC?byUJvwDkB+Ory#sc~m?xjetL+<6c-~@JF60@z9g)E{Ef8NgY9V z{Y(UpYyT2&%*tmt(9jv=&k)i>GT1y|R@bb@$A_1eX=zItNk?Bc-;!s)%ioG67r>Os zbRT!DP68R#c$(Dlw`g;(jc4i**vdzxK&k5j?x|t zM468uHc1~cie7OSQ2{foTxN==?t$!v+U~;QtWBKv-@J|xz4#{L{YViUgP|R2Y;&L1 z-c_PlQf0u?zud_^4DXfii57^et;fGxfbT@X>>kAlgWb^b+#hkgg1dN&ZXgp z59Jgtk`2*K?K3uyzV8R6@zzxH={DM}MT(1=hL4w>+x`^ZbcnJD7%=hMQ=5|c&s{tm zmEouxgqDV=vU@4vypm>`RYUOAm&-4!9SJVkJxxZeDoh*)wL@?>h7C-b?B0yZXe=Bi zgd}NXF)7iK92qZwf<}!dB}!e=7BmPoE>%gjv@TPX>Eg8Av#WqL3P#O|haW?|NX^PRuncn~YDui-K}o5+Mcg@9;JYEcY)f<+{98cUZj(r{{(d9Z}UdjAeDo z6-o{8UabHVY2I#?5uY6E#wzv7+`@6K;rNQS??;IW%)g8c4b^59oV~a^s<4Zv*3o3Z zGET~VB(Gn9R)2XUTpbssv`7c?Yq`<2)-Win1MM@Phk6!pWDHdR%+>q|41l1{MC~4ajH(sTfKR6dF6`cLt>u7I%<{4U11{mrB#o2N}gc7C2jDnKB5XY2~ zIGIO)Ueq4H!fIQvz%m%i*Iuy$Iw|Kqkn)9hpEOW0*t(C zvj2h)x9Se86dX1_MW}if?|O$N0Y~XT88GiYrn>8lI^8ElH)ONRR~*L=aEw6yO#B~! z(pO}+-u><Yp^FcXFe_7!=UZ8(C<)G&XG@PZ~@kFR`&a_00SCf z4hlzlwHm=DI0Tx;Eo3zIs8dS8WkOz9UH4Y6P5#oY z2n9sD#}WNI_q4`ztm=2aI_EF6_Jg<1x1jIeq>Tt z8F8Q}aGmR$ly6JXaBV|TSw(CYiP3pq<~vK*P5f5OA)$|KCPK(H+U<45WjQ`h+@nR9 zeKP`)RqZccP1T~qG9aSZ8Y8;^;8AS^?bIpANjPaful)(nz;t+Vn<$qSveWl%yfII= z6o{VbCD+%`ulT?&x6Q&!KU!yC9vJT#ePkq2I0j~h4>qV+T6smqv-TUg1xr`oagcBm z&Q2A@b%qPPu0Fs`FN=?FJVEC4N{TwHN7d*W#z3h^Tg-`=%@?@feJ5`Nq*9cBKvEz= zuw+(pK%Q1+OHI!?`qgZyexbHjeVeGcW-jtZ<2zbcZP%)+N5l{n=(V^gg4w8e|B8@Z zWHpEO#f$vTP+M9BB~W5)4eYm)4W;p3)j7j$^-^lWl8^9CCiNX5t%d_bx$ddE=rIhr0Be@@)W2k-DdfA@KHOeptoH{KLNu*MAoz zX4HS3vXahx!%6U7jf~hq;qy5rge9E?=Jb0~U>Q-s7T93Zz0Ju{)V@YP!CylWS=@%V zWt!WjZpLMJT~$hUX>Iw!=h-%|D`xm2^-57YO=i>5bJkoy6pN?viaH%B%VEb) z$Y`-8>{gxzs6cH}y+=-lZMr6d9hpW~rNvO_+5XBfto5;h_DSDAZ6F>MtKLZGAuChU zQv5St&+3ED<$1;=FXDf+Bpok7D`LEOz76|VPh&Ie>sgz)Vt~JVC=BkkeLE)1@ykHm zy>O?{GOzt!=S{qZ!p?J`W_isBW_A2%d2L(+dFD?C;0@@fy|R{A?$yh|IkV@(O!$al zyNpuhmmGvWBk2@uKAm2xP9k(tf7BwyvcvixdEU=iL%tb;vz=Tv?V03R561}e3a~JG z1so!hNx8x$X)BJyutc9Fa$B+vmqko%_|t;53|>e_n93QkTAshDd0wt~3``(KoDl0% z*8NmEfcP10_x&>aBZp8|9QSOO<-6|D&kb4-PM_9LA<&%^s5mdH04lO~GQIH6>W%l? zcQAPp`GE^uYclOm=v$QaTy(X508PKotCG9Wd#4+3|F$PWn+oKuCV@m$EI9 zE1Liy|NSoJWMWia&yVU*$TTif4lJHtaN6W)OrPu)D$jHaqIBhUhS$@30)G9CEM9O; z42F2Rv))lJxLRJtJPSAYqW) zTxZR2W_6pa6*@C0u17Jf9#jdCQPWCbP;7F)D~#j5588 zUDmj!?0Y%K;~JwpcB67&kB?)^5gXT6Eg+ucILlK+uaQ0LOJ6zY`;J2J?~G0Y#Ok)} zmp}`>VmuA)d})NJ&0#R%9R%Zw&T0zGF75ZF3rHt%&Bjcw?OVDLxo<8%rM&b5VDeJC zwmV!X&z?n=VCfHAxp_r0R<+d%^_I)$#5?_YntSKoU6vNUHG< zN`K^|oz(-^sl~blCW7?EM}Q`FG>66?1%;cTRZd-juVrOpo2Aeq=08U1VMF>TdCAqW zs*O%kk7lOS&G)v#%BKaIGk>p^0Ow5+Z&c_tPbFq8YtHq_mOF*WAlh7Dp0E2w>~fKO zpk)I_H3TWTn=iU@UWBE@?ANl_vfM}Y`ZY(&2{Ccd;EXy8oH}BGK{_)t*&2`nHZ%W{ zM=;z6{fJB`T#98~9&X4(dUBG&AaYnLUE*vbEYQbe{gD#5a)h1$imnx80BPY?8ZqRX zrQM(__BEyIgyh;l@VpeffE(mJ!8DYoXK#dH$pE!Gj>W^_=o)P#t8#Obchl)ekYyiU zEA}bjNErcl7)8l|Ds)#xH=ZrwR?tZ<1bX{o;eP&^h^P=?{i49O1r1-{7_;YFC!!Ln zc#;x)^Pl6cnDi({qe&EYKr6kfO-y8gzj;^37p$@wn}1m32@mtDl=&}Ubn9(3ZKeRp z*_?M>ge{iN$za?+7P8mGy_wMhK&MF-+P=S0M7KK`S0&{NxWMot_Vz&>UEMBgcxSvh z!w^*!xa`103+dNaiXHUUGC{TTF}x9vF%36mQ5#$kd-vdRB;{y80l>swj_J<{>PE6s z<3NJ*uyYn}BckEe29WW;H;nN|iKK)Sz55q`edBd}nfIdeb;JsnfMqeiGo!F6pZ`MZ zJPr0WZYJ)+a|`Rh0j0N z@yPApSVq<_ODpCt1muO<6V`zg!m_(bDU0{%VH-H2(AYA0y&69ueFE%8OCvsSi+S1c z3u;`7mL{l-W>tqRf>ta@B|9wWtg#$*8_xjeZ{92Ty24*P?Ow-PH*fZ>vvmci|;j=bmfRcGc;iZzr`-q0p_sfN# zm1B9qbidlLP5P9142e{~5JIUl5qCY;*R9M;ZiV|%U^>q@u$WcPZB~(eXb_Dde9bQ4 z!EL>TQ8BkRwP|rw_VV&Ytt!g4KMnmIib+guIO;0I@SyX8Et-7+*OklC22&K_GmY!Cv2gxY;uvLa02vzMopA+GnLTrdubk zX>%COVPKfO#zV*Iz>0lITqn*mnO+i{%I*rM{r)gBXi{}4RcPmE;XI1?Sd?K}5Vvk#O_ukOtTGIh%-*@vsKd#xGWGav$nkah0>BuAmrDn@6Mmuj5D~p=cpN$C z%J|4u8o*}~9hf|tUOevQ2?&;$-N}s2Cbst=vZ$d!qRr${9lm(W>q7}himnQ%NJBD( zEPcw&cR@SmPEU2kLO3A%%e=jbN~DcPna=zh;*EoWUT>UiMnq_eEk53Q*{h%)TXw6V z5%YoS0XPuBuw*30Oru>%1$LU$0Z;0QSV{RFnaSXM=v5D zW2_>r?CeIWMyz&86UMt;m@D0L@$s#R>kX`Y%VAp2#=nYn21wjUDI`Vu>V8e+KUyo8 z4_oy5p7dRd&r`Rds34k?!^c!&i)7G5!}~Je02ER7bzIuj9S0}8rX~XP!w@ORnFJ4* zDMcHYk`-VBkjVYGX1W-7lix=C+~JmUmymvg)_C*Q8(K0w3XP2hw-~x~L{B8V`e&$@ z3VTmb4zh;_x_ro%3Efeh!5!=+xg<*0+yv?HUf9;28z3c-{!N;NT#pICEi4i7J>IA?$3>Qf{;4c)Jh zmUj23i>8XKt4&Q_UUNsykeBBuUSsQO0ibiBW7S+LYL6o z!uQ0fE!2_4)dpCy+hp%~$03aekA@~?I#q-%2Hgw#3?nisRh}0Kvh3 z>)|QelHO?Xq;xGwXfUiX&+AOtf>Y-8C+?VAMtEr7b6|6XoyvPJG5kv2!L^!&E#lH1 z^4aKsYl(R5YR}pj?$5bUe84{1NccV`@3w19eHCeYs=(M zKHh)f_oGUy*=sUKH4{VWDNU2l11`Sk)eq$gGFrV_ye^1ZZO}^X6?2pCPlIQj)^R`LAo?~%3-y)ilU1$29<`L59SCpELn+g+4Q4kL- zWd}5~-s_YfjhXSg{cj+sa1qc#vg>a9V1mvADutwjmdq)-ucK?LFx7}t>y;X-sn>9t zu%aXcQ&XJbd%Rk-f)k|K0JdjGUbBlseITwlQoeO5mLf@K9h9&v?DJYBz7 z+jvs=bJXX-<2xsKqv;w-7tjSE}6A1tc(w8_EmL#!BVJ=YOP;v*vx zy7pHci|?^Bg@lu+KRC~t=31er%1nwkkEz-xDa$=+h)=<$AJ4Bx07O&&o4|Y1d9j{D zMu>iig?uOsi(Vfxb7bg78@!s-7N`UoN#ku;P9Oz0k3%MWf5``uaky+Tgp&#~YKt?sArAKB@1ivbn!w35r=29l`b~#-OC{1HzleL2`H5L)#MM*n@ ziPY_~3ySZGx7MLIzPRi25K6!Cp0Yor7VPZEZkzQ|vEY=?Ee<_fTXeaL3mYx=Qa5|M zU9mSlN@3_&9Y@#p!sq_tF@HfGmc@ovnxLgHY0w`W-RP7PByD|qoSWCN$S{XQiEi%b zbXI|N@=$#MaCCj*_2=`d+|-OQ-zc!_#Eoq5iQ?4E$C5JPsCuGa?~B%si~ zToSxXcoJ_+vUl&|*ViU=omxSaqK~Z`3)hN`x-@vL*cgefylA{VqseL%ZxQN~qc<8) zdZ0pA?ag%znxCD%aH2o6YQV;Yz0{Gs*ZkUrAsd_mKyK~MK6u12A+8@#fNv(laMAw7 zjm`4L2B?vBXbF@wFsec|2UVQWBiL69%e|dmp`>m|`eKW+IAz{rp1|%g4aBs38yf7( z5L2car!Ry5c!!*amRoFbc%v)%F;IEwn1&?jWebNN7iR|NIEh+kp>yN|mW zJFpo6);&Ip5kI5j#7FHz%}H6?jp@aZ%2P#XG-B*4pjtW6-~;%_xYD%VOdyL?R=o}JtDNoz0%wZs@gher}_Y2gv5y4W?vQcX62rsg+ zkq}p`BW0eN;2m(<*ap)-hU13k*8>B5xp86vrbh&zleji1u+>nk`*-~i+G@Y&sz99L zLzF6GM86-1!+_>hI8;z)YH?h;joI|9s< z5!l!_)DoAQ_kF4Bxi6_&rCVeadHe@RnCjI1r|j<;v-Aa2SWpHyUP5tGN@L?k$!O_- zC4Ff&TAJA5-r^ms!*~#8qJH`Wkc;QT>X@ArCkI5uK&$8;I(JsB%=*~lGL)Rx5;0je z7u%shsgYQ^`*d$F9x`YoX8t}MmTMMop2rHjjWZK5*D~|2ag2b2-<*^Hzg^P|D}Fj1 z(A5htp2SEt_g2*I@sgiAlb;DC-@nxW&z%}?Mr~0nA{@aHO^uk88^sXGoT?9RWEY5? zo6$SJ7DQ)eFmdjXa*J4zioYWTy6&ceCow340%sLvo-#_DTW9wLpO$cL?No+E3wQ3= z-0MdwqGAul0LvzN6u|}33~mSs!}@>0SC= zS$m!DHk7uqZRf_m$cTz+1i`$JmNFMxSmax^U*rlygonFqDn%60!n8^@dbgz*dHXGG zwz9gAJk&;9`&p=TUkVWU&+P<0a+9#?zY+h3uPXtks{8sP4O9pjiWHd&cfMCdh7ux` zibP}xk(tVHQc|fw6K|AEVwYzRds`0)r zUi>^%Y>spHStG&6HhYh2x|loNG-A{>XwHdpb(r;NZh$x6>{n%ZAC^Czm+$SFW1Qir zoy3qR5>#+d_jRzV`gmwx8mqJ`AdXzxkT{|WnV9-TE-T$#epIn4%0ssr##|$Kp=KKX>zIFIjwJL0y~b^*WVjam#<{pWiGZ zziR!)m47tv|4dg_o^2`D>7b2@ed{@ zjEFa9K?}4!9XifB&1`#JGkD6_eQc(IXsp+^g^Q$U4L$2Mt`Fq8WL%>rNDO(9LY~&H z(33Xw-=ZgDG($l=cgN?~=e*0(bN%8EpB|cBc<4uQu)~FiFW#K)m$G*$ePOTJoZTs8 zcDUu;wanA)t7FTW*7RK7K3B)#^~Wc@C*S;B5p$s=CeMWEkmE(=ak9}(_w(&MTbm;2d4LT394@K6= zn!H@rmm;?L%a$IKu~0slUft;3Vk!IRr5-0_w^e%<`ParGMx{OWN}u0y)>AD9k2)BWCd@Y-#| zJG0k^6;#bw)P1jHZNS^YU$U!@S|2~*m-}mHS=g1u+jI9{vK(FI7B185@>cn*&!+h~?pj=!voXczRItfLLsDKcb!qgmeu>Yy z#(uT8n$sHY_=(B~n+WEH(hBrH&!j@pQUe>4r+t@jzH@Hb8Q$H04qMBO3EKwq?4VvA zKRVFkHJ0OK@UCi_IZI^W%-P1>m9hMhe9xr6-yUfw1<;5*G3^tr8$?7+}WD_cza@O$pOwqo+C8Kj7yA)_f zmTixE%-2Wx(LPO|-aL0Isr+$|c13%;%=xDME4Kad8NSRX<7BpWtWo{!n&y+iF+*0% zRR!q-r>Py&HeP9bR(oMSt+mE9_;s&>x?$4w*p%SiCa$Y2_16DdwOV%mal5>wUtbr! z<9A4!=x^+*(_3pG>$IhDLsqiW`}$DB&+0d!@(*ED|Em%{QP;n0Ju}L)=;(L3lwXnM z{An4=ixxc!`LW{4mrXau+~S#{I&)p5t$#l14VczBM@>by%{s2q=5mke<@E}C?x#Ov zX*^J>Ozk9T&nk*LGBA2IbMwja!?CSD=Hf~*Xh^aW4tefRqB^z?M;u6-&H<-Xf}Z7a8Jt`CHty8I_;@}_uviAhsw1*^Vp z=VjO3_UT!_I@f<*dhKMcen|6UtATWuM4pV#y2M4!W=hOMZ*L5T2!5_yD!j9W@5qVA zSJhTO|8-+Sopn`Hz)|&MEnP1+_db`Yk52hg>Ep{Ap9EbPZGIooc`T(xY2Ga_iACFEEC6yXl$W#TsfBySA>&!PstP=C2 zyW9O5(W8z>vs`nauVg3s^wZ#VxxuAwHI}^N@HK3y+M^`R_2E3;Mg*QfhprzN&Ec%AI4rk>lQ zdp6us@8p;Bd#QIz=I(C!xy78$eEc-S}hIamiAN z%%2U}J>rk{-ET1_T{%s!gA|1Fy4E>lDpECT0+y-A)CuxF@_Z+4D!4T4_=k6nAsP|A zzT(g1Bp1y#v0>G|c1Z&b}E8r88tH}v_vyfc?S%s8DGpJz9(H+sj-OqC#V zV|845*KFvWV_r)2H|>;m_h}1{1=;ZSj!$eHFZ9t~TbLhVxW-5N&BDTKknPH}1nq&) z`VALk&6L^r{r<>Vgu<}a~Vr=2sucLR`c4wNG~XE z@hUHpYlEO>?U_F^mK*e@{aJZI&23W@Bl={`kk~4tfWqur->02YYrGudVlK)aOJ8-d zWIS+S7n8raJ7cuzh${kB9HxARCOU}GlxILS>N^KxyEWe`S+V2}`VYxZ$ zeJ9rX3;67O>$W)bc9mMG;ye%Dm6n&bXz5f+4Y#qZ7c5^HW~iUGokw1|@$!{o! zmB?RlrWwT+w_h{%h?TB5<&s!sK~A8Z{pPi)TE0>5=&zJdu|>^o))pP~c_kg92g+Ys zpP$k0bxh+``U(-rU&$fs551M}*q^O$vxA)DnqcdwHId%9cb!d)ai&at{#%Jhk9HdD z@r72|=J=|X+U4wa`PI7nK$2^v&b2L`=SX&Ona5XI7i>Ry^O>@momSiSMtk=V&4$fy zD|S;QU5>2Pycjy4r(3g7*EBGE-uH(>j>f9x;k8>kT2iaCBt8GGmOV0lmsKG^c8ofj zHum%6U}{8`@Ib>_r`6i>J0`yE`9u3F(fa0b`w2*}U9I4j9W*~nvO9e1tA%ba?rBcU zxnSrWe}*njj+1KIlB(ow()PkufRc6k08jank!3GW+&3b? z17;#u^#f-Y4xXF-I&`{}+Wh2SzsllE=_XcEEio$p^}jnU!T&UMK z(Ptw^ldeF|R~~B3UOj$fm$Z4>h1Ghsc3H0_jDIX(K2|7MGi4Vkli zg-4zH1}_<%tb6ywBF}~36#${oLdG{}yTzNHZR^EL*QI?P3ipDDW z{hD?et{2ST_HBAr_T|*Y5^w&DlS7Shq<3%o{RWz4B=5+s+;-i&82Xb@uijzaoA4^Z zT%mud)eK41yw}qfN#%r_YA&MD6897{r@6{(P#05@x^VLNh4;rspPBbOfAV~&IaO2s zwO4ta?6~JL>ZN<7<`WB3b%JjUm;K&n(pcz{L^`JEr&W?P{5jgQsAuS4NvB)zdY*4) ztG4_QxUpXBiThu>&ztXcK7-1#lP-pp$=~i*3~Q;Fm1H4SSq|}>c0MyWXsvVI!}my{ zA@9rR(U}6~hx9*q?30O6&%Q1Uok-tRPJXbX`KOu8;xngnjK^vYwImrP*x&eMJxzDl zcB{ML`_AOu`b{p1Jh`{{@|p`49Z}XKYrEeuBb}?G{Eu2Ke!Fr_eZ^SKMGa`atHM3C zUo@HDiythnK4qqs(cs2&`9ef##?ii&RX6rbJGW1z_taeNoal?+N%>z_S>KztGXI3f z&SF*m_oMvBg?8sL%=`>?g{^Z*Y;*2YsBc&dZ( ztS2QRV%z4&msL-D2qaLq82h*%ez0;3x~R2(WvTP#0uKZJc31NO0UuI#gKycNABG#! zUk~n2h<;dn>cs--7XAk{0e4!jtZoYTaxK|Y`$=F+*wNydd#Hl5H;&Gnw~cmX+x&A! zue7nMT2%&}XBkv#HC~%-zImPe>e|%DkJfd~zr4{+EsTde+^k$2cKdm-=Z%@WwbN(+ z*b2?2wMty2`#*hMs&Dl?#y?AQrNCn4=J;5%t=3sP&z7eO%;Ni<`}?>Ob5&Qs;X`}n z?5ra)>RdXWm5Tq=`E+ZQ-6Fry%l=vt({&0noR4-IHYiu^zHFl9a@J1ddWgJ^-2Ibo z6|p-?ZO@<9VVpm{GOBU!vs=a0Du;zS@*1qhJ|BVh9C=-ybj;PqCE7B<;)zFH?7r-E z_ji7cxch3F>+Y}ig$qR9W@*e-zaXBd^e)S=Qp!?(+x1`kr&raz@wyk^s>0gKqjqn% zgXA}%%#ZuCYi@r|?7z3+>~x`|bi2gVOMCQswyXXToYOKOqTi^n@kYzBrTb5o<=68p zvL(wGH3b>vKui4}hx)JX9cj5j6%8;{-14y@_&*)8GzC&0Q_B~>?T`_4R!uMbS?;5a zw>CKZ?!0$xkJCk?*0RKr)g{GUeRbw@d+EGaSxk4AmAXq_{XU~OXut1RLK*dLh5k&s ze$IaK$GJ|1{l&GXrGB@aDbz2q*8UJVMb?AklM5@w9}Oxo_56(jPsWXIdV*s^nlS?`{U`eY0?R zjYY|KrB$nxE0%iXYE{%9EBr0CNaKxd-c4FxW3@-nX+4(_Lr8#u<1M}TgebaQ^ zHOzMvzg*-@IU>DZ-tVuHme{w67FWrE;_qYHi?{bwi-}o{BnUP}cX~W`eZ`*?*yJ%H z(Eh`6W=O_h{pw>M`L-Qcs1JQ`OR3)YR$<#)X8)%YCyl3yee%Qc)AbV@n^^l~KP1H4 zDHcs%vGazU*+bRGHq}zOdmZZ@c$_sDj|y_wWn%VtexP3+GkWZO>xYYxBNo4mYYNA- zV;YC+T)lmqpD*?oG0IMU>gD|Qbja$Ox}Cd%Mt%EFsPdeXe%Y|?_FX5XP5RJ`S8@;d zUKbQa#Tv+H1CaPZ`eUn;;gH={f8{Ktt-A(F^4(s1>oX(|hBdE@im)ud)R`i*X!jze zgWL9!jz=th89ewf>+;M>qaByyG)ipUvx5S5bYtM2uNOwqE{?4^OiL~_W@jjzG$6@CUr|T=P=RMmP z{Lt?}(|z(vk*ZuV8RHkdx3&h?8b)bU*=vtN_CMV`uijYYe{tA)?&FJd7I<3j*6cAm z_nEJFW{|L0<%O!jrDskoyx7tFCcq@(So{oC2?ZOeW$mVSr8|!%EEZI5OgA?AxP3;s z&PeuW&CMQPZu)rE9irV?@wdI_ox?APboTJnqcfA@3-kvu1mMh z4DY!mf>6!#tUnLW#xG#~w_mPHu&3bUk-r1`Mw6oRCwx5IeYA|voVucEy60=of_(E1 zO{oKl-_8}~cF(fbX&;FhEVZRam%sVrwWL9r-)2Hv^4@XdAMalu2y_qDkC)?JkhM_E zjvAUO*>P-Nvc8pj^~l56?^Tzd)!Z0tJ-WTm1kyjmItlSb^e>?;2;Lhs*KBUY_@*`YbaK*`u!b==+ve^& zJ6xXJ=XcgWwQX(XlI+_Q35*D?@$Kk)#|$75@ts@lgpod4CL@d`ue7l4SG^kmSxb z`usQU@YLnY(^21tenUYYrK#HtMm=Vq8OeR*5^Qp`eO&o+_@L)PU)l9DL(V=c3%zF* zExkdh-0+v~K5d@$GkzyoLA%B-OC|XWaFCC< zbwR-2eT7Y}b&$h>ffR44AF571^yBP*C^& z#LJ^2!BHhMnLpmd96wOe7PfeQOI(7wYQWd}J*oC1Lls_Sb!Q%Vyw4+1jMNrr)|B>Hi;bnGBbCddp(^lpQ#~shG z4Sd(?@~1CGYwNYA5Bs0(?LS&9RW5k!GWbNPwK4qL zmh8=WEvJ?pa{g@7uuehy{Ls%&uih9a$(GLEv3+G*L3>xKZpMY&o8NL%FZv($c?eR% zH7InX?ylj}1)gV;2V2X3wk-a!bX+1(cjB7P`|%HXElY&vtS$AuGkz<~` zc34qc)ok(ewdb!)#4Nj|;nkxz^zOttHD~9=m48Owx#_)+Gu>#tXXocftd>11E(}X8 zON+M&YWg#-`{VcNWsk1f-OGI%YkEF#XWxs|%y52a(`VH?Sdi+tnMMFq`Bcu4ouMO(L zKdOS`9y7y?VqLGrzm1;xYUI$fim-w^RFh1H&E3ss-kLT2VkuSFJj=LxZQs{g&p7v| zYr7LHZ{5$=gFfsU%Q(q1_JcPx(Q)s?v`sd>?qtV;A-jpxyya#L^`~2IcxRZ^jHRz{ z4Bzmn>`Irj!e@`tq?OE?E4oF;f0#KZ>z#f5)|zf~$Z%|4W=zu?@SKq9-v)8fFb&9a z^^z~rbbBkw*p#?rE6Xz%&RfM-@bk#OYo9UsG8sVu@X>3Ry8xAf|Gp)Ylz5GwUqyz+ zBoluja*e*ViT+yfGmD#$Us)8VQi#9*2q^H|WOU|CHN}5h(SHU%cr%R596puA3xfP& zi9)mZ=Ku~|KYht07ii4lUp|eG!ek}d%;xvyV*!!CyJqMG`~v*@r%hudE}Fxq3Nu-e zxJ`g>Ufka4GYUQl@)u8=v39$!^ef+j>vQ>I7fW`0=To0lbV^VB=Omew#Beo4Pp;qb zw6ZWTw>CiZba*sfRE$dI`ZY=NQZ7nvTkO2ke)@Zh2d&FVM9H0{~u5M zv;Fp0zL!#Z@OrRvtYYlX;Q7CjB46|FoP8U4`J?>|Wrghm%5yEJbtE_P=*Fv~lm&Z#$E{dr#6pnLRZ(+lD0AC+2n&Q^}_l9O&1A{ps9{3(Sp z>>?-HDi+N+GIQx4Df(K2kS{$A>ozQwTs^EYTh^XOC{i!;i))a^!I?!$Jj13(mt6Ww z3%}5)AxMd=t5clOFdzE#E&H7K^k_q<@yO^O+o9b98Z-X5{PzFdT*$NA+RfTpPDkYL z#E3>c^z*IJ!z&lP6~dN?o#hdRpmnpv!>D~%XU*c{{jyGZg(Q#QtAz=t*Iuq3mFM}r zekqTvGIaAo{S7(6*#0AFUV> zr;+o0xu%e4Sd&wj4S!4Mg9)?MziH0)kla)G-$K**oP?i=9D}B}E$Urid-sj>UYp*t$r)!XNXerNCp6Jmk?O=tE z8p1BOk6yTQd&R8Vqox5uKTDcq#_P3CG*v=*GZ#H8BUzEkQ#;3~@sB#qdLOCHzQ1nb z?RS$+KKe3Mby^EfJ@JdV(UL%l&=J3q5%x7(dePG@ZRDE0v3vVIv)TmKeHSQ5BaMo+ z1VJ+&^*PFSG_19A)k=K%O?xmlVCSEf`<@Rg6UJW3tkEy~u+8!Qijq5*f`eZ+7H_?L zAn<&v#^|i^l*7s61751(i{=c3bc?nujA$G4=*SJbuW+O&k=c<)S!ZWnyyk$?rhMbu z-B%v+N0{MzpR>Q;Ozcukcxd~U|7)=G4&NcDwEOMrNBYjYPF22N;{9s#1Dbe^ zXl)1O;-X)5q&^eyR=O7@0r_KNV)fe?f!Fr>y4TKwMDBjv;#VKlo3k&p(=4L=wRMgV z?d#H6S{s+=ja~msm^J_^A+Gx6Yu` zC$!Fm*h?>jcI*i1E!=v_*(mdQPvYBp5qsxt3m3c$e{(Z`>!y~~PDTxv!ZMHhu*~~v z?vEeRQ8lA%QYmZP-=x2C;rUSQU2f&A(2d6DhH}mAht@?N6#4z~d{lbpOXizQ>pyuc z)x|q5t*&F)>sxEBt~*#EMfxyzzVLU4x5kY_b+Oh@K0MpB725X0KKE`zx%$fbKw(Jq zYxT}prhWIjd5OtOz8*YkTva7F*U3n2uHBW{2Qqc1HyiXkP|X|bnnzNKd~xDe`j#NM zl(${WZjUv;a519#jI5N{oG<5phSp5UKJnCHtm?<{)CCc9dfpa?rlelUys0af(fWOt z^2|1Bpu4;6v|R7_Jw|0&rBjU%6Sj)1YcGc^dH@+98 z+Z;N^*nc}>peUm+Q`X z+!lm%-0l74dyhY}o@dE}Z?lck8~3;c6kq8H+`4;lj9`~YfAY%_VAxE{bI?V!o2}HzSq1AZ3{X z%O_&JI(_%NVrx2d?dD|2EX$LPylS+wAj&h$!=p+$kGR;MnIev==gm^=NbR@(~2uJ1k7E8qV- zGUD@aL$BCyvXyeTnb)73YkS8nEYhCIZ}dL*c)3V`^`<a+PKn7iUaR4K*iV9Abz z&&l6EXk1onPv`rf{b5}nWYxXY)F|!ECgtNhO&$hr46;dXkZKk$zv}8ut;p)wm~QrQ zwvva`wVk{nyAy6*N>k}o6wCXs-^pF|MNS-V#JIg}{^HPOmWJ1v>X$E!ZeBC}S>$n2 z?y>I2J{#^rx1)R0mKxU<99kl{cdNQlQ^*6iZ|*fZ0zy`W-Lj8rRywOM&OA6^lNGC` zZshsmNtBWGvEcKNEQ8+&%FmL(a!E zF2!j0)CR-S)e9`gmmIzNXwFNIS+Cr4mj70EjFoxmJT|dI?O0IZIfWAI&zh&^v;Opn znHw5ze>P2WgF8K6bobQws8H8zT)H@Zbit#mM!IEhZkC(6 zrI}W=350Ci;j1~ZRbM&t?(x)sh=hm~)|X8?g)`>Ze2~%7?Re~4=y3O)^SAVUb-$0a zhPd)hWNqkDNN8$lv+}re#7>%(rRGrl>h;;Zp3>hO_80&Ud^MfyY)7ZpvP#Xo9*usy^{PefhGEf*z!HO;X0toDzKRyQjWzS8|9EfW@H<0o_t%08UNyUTbK5ry97^z0Pg1PXyDYC` z?snTvth6XJdy9kfF|VKb2O`G|p{2)7#bJa&%rTy*rarMTTV_lc#gi0n0<@z~oDsd2Tv+zl} zk)$T2Q&+H6CZ`nTZK9w*-TAP_UQLCbMGJW@9i+o4rdktHS8egxxn0e_~ZhUv4<}-UE zQDao)PrK&3 z^ao3gRQ(stluWzclXqJAqqp`x%YA#l-Qk5&XB$Y?9WYufdd9_3ia%su@46FePUqj7 z%$wW3ZKL)=Iq`Cf4JIFC+g9gu;{xhAETWhQ!|7X2a zmAAq1q&4rpKP)lb@LtPv`y*$)>-#kR#@1|nDjEH)uT9~$)V78(O+L@n{vP9=YS#Ul zZ&fFRE*-I5^=*&M^yQVjmsZPO5}@m)&c5T9Ix=sLH}qq}%5N!V4;~aSo#-EEjwhBJ z5^3qs*=w<6q3y8`k$fYc7|V^HF0R>eAl&{v!#P!?S~AtqBLfP}jauK6-1j+YUDJ-l z;49PB2IEwZ+_kD_sJ6#Gooh4yMFHQg#@8FdSx0+4Zw7gXJxpD*L9(pmI?KcTc$7M? zbTjy!k^X}pt)aMe8VS%X>%fH3o8NglDm|)R||tG`3a3`grv=--Qd9s}9F)Ni-{~H7f1d zGmrGS{V4gGEeIIB?| zzE{5tjY*O&sC;iVzGUblgQj-&diM{VTeZz2MMg1eTgI-<;GZLt`y`|FSB^nuU^`E~ z%PGS(JI)T}FVYy=Ht^?MpYV9|rDQDw9pj28mHpXYbqk&=Eg$L`k=f`y*XKz+v~m3c z){WbbBLquxZoa(|wj%`Ezi_E+Nom=Z-W0Xj`y~y$L_UWMU+p;=suR)qRm#&`A@1bR zy7x-+_g%YKZ6O$9I&ulBi>&^xe==U8f61n;f+^b941Bb|%wJY4E%8Bq@vy+SoY%~n zyVb2@6X9kjUH+WVs@nQ-1U%FPk zlvsR9VC()`1-~3e&uvFf%v2l@U!R@jc6G>3vGmoa8bvdYi1xelNL1&@3ahOwsBzA< zw?+jyr_WT3Y$bWPS9~58%;~lo^G^gNM=eRMAKOoRO1JH*scD*VSVL&P%$h5`{n@$c zwOb`p7C$X~@@L)t4Hm**{Vf(=_>`dV&GbRJBVS>8w8bvxSKn=VPwsdk7<69k?C>%3 zD(Nu#rFw~q3ld_PmRDccyD8^`ds53Pp+CHrHB3 zQ2-R{q-AB}|4!ELg-{P`Y0K=g=N`<$oh0LNOMfG+^K$c+4F@osjl|Mp<(k8-LsIP@NNm3JIOpT+PZb3>w=b^X-KlL?t^FgX zY`uNcs@jvz9q}cGHy!xDXFe&j&N}nt&PgA+(=TENc{LXX(B8)ftBgR;_rwQi>0G|8 z)iput+?ABu`fbN{SJ_*a<|kywkd+#0qI;vE(X{J_wqF+DZQzqC*|z+_;i&ETFLfP~ z1%Jh`Di62Lx_rgQW7z-W&UdG*PB9msOTA^jil#D=e=7Y-c66Jc-#yhIEyvrJeDpUE zRjBthUS*nf@BEe06D@X83Cq`4>=si}DtO|(@K4{@{eOlk#KWTQ1x00UJs`b3_?&Qn zyxVD+G3eI*>PrrvR=qZ;^gT{ZOsa^r89bcj*sCCrapjzp;$Bk=D=CwrMPn9GdNQ-L zEZfE9tx1pH_0FuWh!?-OeDgIQm71h15;@q(=4y_Q!5q`uwDPBdmkkwR9L7ehti9+f?84m&c_hzL>jOt)#cK=)nEFM?GDaht+nkCIz|&rH$V6 z`e|zJ_9E?#!>yQ*qQ?WaHfLx4P|07Y*rBm9{L_uu4SVh{m*xGOdUfo`sim{-o7K=; z&b+nnwH|+-lMLy7I&^xiCwL!}`oykvd%x67yKq%H(myx0!{OEDtJj0?o-DT6y=m;^ z&z^~Po=4lyK0Osd;!Qi5Xjo7*(erDz$64zmBNWGr^A3J}6=drn-E!<;-!b>&HO58OpYh>K1jXLPck+eFH$OgV z*P|WO`8>2pMK-2?Pj$B(j45?aqmdk6L`+}gl0d!rGt=;q?#@)vCn zmlZyuuN2u3rC4Gdnd9|a3%W2~)>d(h$4lEc@Mwd=n;n+x)kDs?+IOn0Gy6!HePG?_ zkm*Ri$k)?-7V5K(c{(YbZ5&>Iv4274^4QLOK+^p(W$mRkX`~bHJ~pPWdZm^ylaCE3b-BgemzCPYT5f)hYf#*)3%MKwST^QpH{E;tk^F3&YO3u#-V1q^BwtX zGtAQ_`hR~F3$o~W>O>a`F+aTN)IQ6quUVUgwgoW%T=AzzfMKm760Vf%uY z!Uv?c@pdh29`>3yPxg3vii<{7@9xiHF#(O#@>Q}ywUTj57uDa{bYR)$vb)u5roH+c zy25vbv83DnPV2x^6%s2SkC&cZ5#a?TJSKJTU(tVSKvDli+i38uYQE$bbZrjh0AI^(%#*#ay;#B zoZFx7n)4PGqGCrX5ZBa;WY(4 z(AMuI1%>35w;jZ~P4(rPG&?;Yn=cn1eI6avK4JDz{J!j;WJ%{9{@(3R|Ew_Z){*ai ztT?y(VTrcLfFGE+cft=C?E zLuWrnUpH@mFJCz-8ErpR2L=?lG)_(|Gvc2+1MQsn*@!=i&n?h7anCw_8YmtU>*-+F z#5?QwSMZbMXmriQmUaC1KpB~al#vswjro0NQ#D*be>plW(bR;$Cy~C0Pb|*j*YrdS zQ+`o1787NtVe01OCuc(?lVBy}s1&5+Ek~tde={ivokl@~mZPCBez#?-V$*2kM6w0H zGLa>Xij>CXXf%{1jgGPe(xNOG7@dXCIaq2^5tgO|DQPU^wexZ`O;j2>CKa86vZSN$ zu$QA#k+TDKmh{Aa3x2u8K68EnqM&pd(prvA$GBnw(lG()m<{OY=p0-@ZT?@n(=h=V zBvfYx2^E}ynVCVx|3+-Y&XPf)|C1$yf_j31o{PvasK_A<_&+K&gNoXKfts6xC4JIE z=$Q)UbOxq4gN}NFfho?w6lX9{!!XeE9uAh^1O`)_lO;MCbK}9!Zom-_Vu_P2Wv~BF<@W}u<&7`Gfs}l;%3N-J1vEZ z34)VTOcur!GayqFbu){E`iwy zGZ{#GD=I@k!@|MWd9S}5i-`<}_o7lzH-b5j&S6bd3OW`+bWK!e5XA8JoZL}q{vYlP zIu<0TsB$18kWrXu(vf2_&?&%VAwqF-M}h~{Re>NiFa)u#7>m9&n3L5YN8U|hgz@B6( zTjr!9zSEgx=H~C=EJsC^7SPZG9}z1~I%ATTg|BlU_!hB!;ujlUDaaD*i-aE97qR94 z=u1JPNI=8fd7nSvgi1WMBB9?C1w$qX%$%Z$sfa}h1;Vw&_#u+9X^KkD$&aFmtw1n8 zw8Lc7q1gin4=YMR(-CgnN!bzmqOuEa!VRoOO>A5_X%LDg5;2I(XwXa<1m}v5fyFtS z30Sa>1d&1EMCBkj2JZ-)E^(tLuV~_Rb>4ZH zM=7`^z=(Kaz>Q8&0Fwvt00qq!lO|(f_C-Sy(QL|M6m~};`5S0$hQ>D%Rumj7z(R0( zYSK5D6*1jVA*O7acyJ!?0$q&RluPhmr1`f-=<0*TCopxsXFCgbz`ODG#D>^M45e zuRaj0J*pz6Fq?`9f+KK8Q3+x(?1!1~ce@`$ddCET|!o(ED<;3`b&0++v%pOd?DY!r(zy(fEklEK6xk;yEjzB~L zA&O1~RQbvIO-p?4Ib{ZPD}zKP3gRctFgXO0LdY1#mCr@DvG67?dadw!ni6d(37);LkM`4CYWLhf{Ht4DTfgt2f<-@R>pMW3_@HqGzc-p|LHFT zGXN7n><*g(E@T35A!7?Ln-LKT!H81`hD<;(WL$34I?o7<*!J%SE0-8e{^} zAcPsd=3v(23^QCIbU*?&W8XxRad^TJW>fftOu#2(d|1@-T&pt~S^NlQn*twX0{9?L zGJxc;3)3ix$YE;o5nu>WAa)pnDhJkOYz4pZ1{(wDnJA~m zC+>*sFsC330kLq3hgAa*C2@^0S+RtN$ciHuOjL4Wv<4q;h$&n`fF&FwaiG^JiLoj7 z4}5}e<@MwU=mckrf*lNhOgS0(n$vVsAcKH0IHv=iq_Am)>5p0i7az3-I>n)Xt(pi< zAq+pcH6TC|d_W{pFhDY;$UhLs6aazohY}p>7zE^G#qL!mIqvbMMOe^IK@S4*;ONhR zLb&8YzU9<#3Yidq$s}6{E(GE$IAUN7hfL{~oQ$o8b z*g-%YoH2l{nh0M!(9j6Lg-0R)e}D#?5A?+IruZoTv`%K z_ftrNP!M77g)ibjy0}~gQKNrgj46mgKo}f+*q108^(<*R9v@Tif`BeKx??i~F%l-z zl<|>egwyy_h=Kqprns7dGBJD9V(?*#Eshe{qGJjpa6*Jct)tTy;{~%xtW8+=r-lxc z!x06l5XZd7Yc+`1@jvh^$iBIO(GR=Ukh2_Ra%tg04Cn>`T>?>OOlgWNyzH!;!Ov?? z?ies5;X6NeS4<)q7|6s)P8ZpNmKdhs00z;p&X@@ht#RX{vCg^nW4$n~DTz&L{1TXX zC#y(UL}8pK=M=&lpR5>fOk~8OIL60#GubT4LRJ&p4(1M?&fu6^+0e^TZL`0FFXXQR z4&o8#$|*epPPF9hlqh@EPQUDd5aqLtoOy%N0gQ}~0QiXD}qqd~}U z3>7&BcE-gf1QSrvJjl+11*quy&ra1;0q2QGoX9B~`#XEW8qiRy-~d}~(dMIb08V${9cpIP=4LjAu_yCP)*x?yQ0ou^8^E`|KG@(Q2 z5{@$hYS2-{fl*+2umf1M7X_$6M}Z681a_7tyY3X&Q7F{F+Q3R+$Fe9JSO?g)pdO1g zfpuV@XRK%wSOs*^!dk!@U}w2#3!nfEU5c?5Kzte#lf=>0!Q0>2R~7aI6+2s2#)vQt z9SWKv0mUfTRf#DgXh@+U>%QC+5vWJOjzFh~Kt+ls<|lj@*bbcHsDoy>H{n(g5K$c% zgNz-jPx1riAY*qwCTYMTWIB2jJ4pjZA>(evhXr<_kT6r?G+-JE`YfoNva?TsgTI^C zUUf2fi3!kwI9%BQCA9j9^QQ-K4HwsAnp<}^P zp(_K<2-usB?xt`Gur?iC(r^kqiO{tZr@(Uv#U>a9$V25&3zq0B{0u1_RI12xltLf`RVQ@istt26ih59f}J0FtGbU%H9y{W-3sFf#Mvz8&HFR z-EF|S!D`?M9UTl-gTv5NSPK;2;e22%ILr!$qT&+}uz{S_X|Ng`hNi)4;E4qpiw3KK z=Vg=vtAS@&lmctP5qC6L3y!#>!CK%85Znt=r@?A)c#HBjd(1OX~FggU(U~+hj4%A?Bc#IAPV@`Sub{HL~!NhYVqC6dF z!Ne0KN`bYYvBxGI)&kFmNE?O<1Rykf8wRWfojt}Guo`&QLwmt$;7bKcfwjQ16-t4% zVDq!HIs?`M&rxU_pasOlE=HkI#(>qp7eKTTtOmQs)EPhx7Fxc*oB=w~uv<$g8z#_# zgi^CaUa2iL@gRyDo7D!In&)E^q;$Ve?heN?H zI~5)h_y1H|WLN|;!fhd(1w1r%k&BHnup$eEqwI`e0{oy3 zbfMtjZ?ZK4A1K%zv?;}@>R?PNz7`>^AsB^FQQHypL! zOtcOYVN5g+6X8n?1}4mxLV_@0f*S|{ffVA5W5J9mL}RjG#uPSVBDQ29jEU1z6Bd|4 zoS&NN5X^Ye!~wf-Ilvr4RK!*yKhAGp58zXQ{TpnqVUvXI8?rk3)nqv1-$5Y!;V)q^ zCc_&45(en%NFY%rO-=X??l)=hsqa9X!s1U(O!jXOhPXQ*HqEGDELgM23Ch_E4pDqp z!PX1(K`b?C@u^-QfRV58WXIME{t6xonoN1@-4Nl)T*lg~4k8TU_z%V4uV9YoM6?B0 zDBL{V{Ml;_{wg4IO$~!|uuR0@Y9UaLTFXzcoaf;y@RE*m0XaUzpI=pxJl~^Mv?P&aNGlAQ2{66UQPjy&c4dt zPA;IC8t^G;mx_j|^Zp<&Unf6h6>vWV<^!^Yp@YA(oN}W2X8u_aINbs_#YrR;Hk0fF zj0H$QcZLA?2K`5dAv@SpxyVh?fEVC@95hfc@@HhKFWnS8p1?4m%{&W zVSs>C7)`O$07EJq$m}%m8M!S)q`?`Rg9hH%1n(748Z@af*C3z)@|X!nXF&T0Ll&Gl z+1mjDk!wQiH1L@Qr$r7L&>yM%a1f~s1n9BTV21EcfSm?D(_zd^q`^CI4jL6aDZwou z=nOXa91Q_Oc%l(#46Z?_nwmr!mBrG8k6nm;;e9-j2JaUz8iYnQU`RA8V2C^mK~e|8%9tO?hc zi8Q!I$Uy_!7Wk|Ou|FQ^fFbfg4o5@4kUP@BVKX;F_os2S?UQi zqzcYK1F=txbij}TAJTEO19=99cmx^^%>h7v-2Culf=|2I8v=%87(cMnfPlbxTr}>f zNT-pAt^@o?90H>D2iJW5!4R%`a12bRA@_mUX;cu@{}2!<1+ljSLNj0p&p`uqFNkOw zz>q~;4?t%ojJ`QK0~);XC!GQDy8!T+m0fVr(5(qe8fGhCqgTM@7 zsLM_ReKq03CnAk2SAd?JQx@1CFhmM~#LjRPpOZ!b$)7+242j7H@S}5Ei$a1y8G#=t zFcXR3u`BqrhP@$RNFzo%SnRl0O0WRJ$29DHNlX?}revo9epEayLsRAl^>40eLP4H> zVed?0Q8nRX8g?3Bh!oG+X+S_Kd>BQf5n>D2pG70V)id^nfFYSXF95?3wIflGQZ{>E z5(^YBxGhM65BoUUktm>g4KDl>iSVHc2ThYk!p((Si^^hX!pkQ|I}$J;!7{)K$kU4) z?KEk~)hmPsO+qdP^14cnhM+SsApwR+{g1sJfRV`4f$TIOAQP^;v(rFdq%g-$1NH}x z2od}aGlX|Q>evy(~b&q7iVX{ z5Fk`e8em9+FI#X51D?C$aue7HO!md_ADILOA(#s=gcR=~9d!XO}>aniuWFip6E zz}^n$Nd?r99pS_oEv`?A3>4F8d+ba;cz$&iH{q_WeffW!?@ zK{DeO5NN{14|#BtlOF_XqTB%jLX)#IkeWdZOmG8J6Fy_$WCͬv&CU~dQbF%cKT z_Q%Z+ZXY5S3fUV1jghJ?I}LPZ!ABWH8gbhN^CLz-%nyt>*%zIEB&sIY!U1S-VS;@S zaN^1Z$pJ%P8qRh=KuzMZ4fZ);$>MAW?%+Z+;-Ui>f^5Or5bn$cHo$I*Xlj6Bk^92z zLc{#vf*Csv-ie_z4Cs%W9}tm8bl4lh47oEG9qiq?7*gN^eD=P89~CYLvC{xQ3P<9C z?GGdb|8X{iJ9AG(@U8+vU;;dYl%3fJ0gW_?0|S0E?mR=Ifdd}SfdNA*d{{$Zh&-Fj zP6G^)<6t6wu}>#h0FVf|upST)1Oum4;l9BB+(fR$gr-R*E*yX% z6~1sp&{*>yKGr0zihvmv57tTi2N+V|yEdE*>0mR)O(Q}xaO;B3meY|fJ>Z8tuS4WV zm`!l})44XE;K35)VI=m>fFX%EFx;1W^9klV!A*c4a`MB;kE+RlANXV^0)`ZB9|N37 zoW~4MC?PB`R2Dpux%h$N3m1(BUlc&b#ql3VN31DSf)}NzV5`I3nLD-8=|oTh58V1GJ;8^eKjiV#i61Q(JB!3r3H&RhZ_XZq{|gE5%IDht@Xz^?*<{Xdn0 z0YgxB;9`iJOS88F41q43?EpjMZ5{0G06(zf=4=P|o!T*D_zw`drViNOGXLQcg6IaW*88z&lw8<_8QliAyTb7;LDx`*J5U z22%D#?2oU2Fhe4|f*BH_6cC2OjgY`S7Cfr4O$~T}k4)TlQCXnbl- ziEBO?Bo*Rx0t{K);DtfsF2jNS!PLM=k|MLf0SnPjfFW|hgCGo@m;-EoK10pa3rxgIe=L8I(JzxkxA!j?d??3#G++AT82Hq;N7ctQJ z2f!74dxx_jxV}R$7wAlbZxnI1V*)tDNux3~k-I5*Pw^ z!q=2I8G^S}5NU9AjY~ilC`EAg1&RQS1k-^2Q|1SdoNL+vRfvOtR~r%2GT09R&vOm} zs*cEel-Pv^Rfx&b3o&T<`We^9_C?py(ldj|uL%Own`kZ}zR3RMJb0N1n$l`k+Z zDCI!J$OI1~67xJLVE@Ak;2lR?1A~ja#3>6Nxg-`g;DR_l-6!!MAhIS=30{%~haOW) zC3XM_19~p)0J!B+1YBX_5)fQYJ{8HCH@=!Z>@u8%cNEqYDYnyAYi9~S7Wh=`2m#Fk()Mz zc3|0q`2qcL^8=)bJZ-?<5Y7(pqXV2Y5Q|(I1JFTe2cM5~VFZxBIG{dae;^-GYOsd> z!~FlK4Z?d%F3W)Rh)Y0FPH8Ph9}eh|4W#$BuH*LvC<1$+b@a?`Pt432c9G9g(YI z1>8y4I>YUdmkM%f2i(c!cTFG<(SjhU5wj$?3PL3oB&guceQbCgJFW+SfXEPp2iGbJ zp7`LJVxYFowSIsr8MrW03ljK2FJh#FV!0-AYz|b$X9--HSo@-1K}0!7UR!sBS8xXHO%gr=*SkxZ9tNxhU2`#XK@wibl9u zM#tC^V@^>9wS&y=3T_1?o~7k#g*=v!?b9nFgd;+ju9;2IkFGxQ(PR=cxH;YUsX4KZ zrAFxm5ajWL0L=|p+$jiLO$K)LuPHcSK_sLUf-H|~9>i{--k4aw3dOmG)ZTG{+^9<5 z>GxPubO$8ZoQhzjd(O#l`c(kymRx1MPNLeRmVV3qgU8K10fZ~F$uw1fa-z*r?DV@N zr%Ntg9^I>%Y$^xRcht|}q1N#KdUoUYPpZ$&q}u)>I3e#_!T z-z%n8TFJHz73_Z{zwP?sPMRSlwDx5+m3u#_osbA)t9;AY<-*f^W*_V59=)rD{(_)X zAOqnh;yrDNkZL<8$|-t<-p59~IbABd+`5Iy2v^S@&|66$zV4yy5j<$F4sm)FLKv;oEN)0D5;^pRC6keCns0V zs0(f7N^w6@&l_9DX$kj2WSKvJP&F#e%pJdqr*kJ3SoYoH)D?D9wsr2_$X=yx_y0gd zdF}%nmDs@~3*Xb0K(?{VjrTdRjr%1bB2$X~8cW0^7b<_Jt$aA;YK0NO{Yy$*^edN4Lh+ZI&^T1rTE(g&^!n<8{z~=vn)GGx{(_>lv@)7pXiYZz;%qr><*xnX%`xu z+{L2l(5wU0uK~@gH|F=TZwaZZ`>A1cAX3Zo0>{O0;gZylPN6F%wUCsVVz)dd6?L!6Vut=J`3zzflQPKiEhSV1(TwMqk~1ZGy_iq8(o!=?<_P5_RCL5n zCRY*SWGuL&`YpH2ANgqVq<1E?|Bd{r@{-+oiHo>fmC-SA`3Cx7ubku^dw{1i!ZH@z@iun#|1>V|-W+rQX-{ZQv>{_$ z6E|Z5BezLby8&ZNKDxmdmOJpriP@5Mh5O*PY_N%RS}DC&)ja%C)z66f68@jTrK_EY zQux@h@SsG@+g0gajRr3DZS1Zw*Mjs(fF@a=0pdjkQAoADW3UKajh#Zd+{jHCcgd&X z?7YcD9u#>575qfi!`;5SZ2R%6Ox4WTtSOSTTX<%%|C;=MKQ|u(!%9R?atHEBmskRe&%8f8Yv1t4u zn>79Ges!`0>>=RM|f7EICV?O zA5s7bRtprJQ!Iv*+)A7nz^rO8xDpcDT0Cj~(vCv#7PLnqCC0v#y46NHtL%XQ zw{$xG&6L{kbVj|}UQ?&=UGBvv!~YxiD|#u0(^gI<6;&d8rTkOROPVI4!mCbuApg4* z<{vpz+c`sU;Bo;_+F-XaRuxqSpObz}TOtNg(HQvOH0G+O5+kEtZRK7GbZFODj4N%) z{d13Lvw*Arr*ZjtkyS6xzgFUAPkeCT+)yf<{whw>2Ca^fljVF$ zf1Z|k$^uoHPnc&+Eb`xW{3f0%Yod9^tVr2l=&C?q@FIrMi`AEZ6MpE@SoMFI1r8X9kxa5Pdv%flhaHl{6_Mja~l2 z$aXTTwz{aSO=U>of8_n39+&Fpx+5UtDvfnKW7*nDy-iywp8+0s-{AMfIq9;*;aBhR`X8>IC(3{R`_F&;h1LA^`SXW=z2EzNdD6w# Q&X?y8A3y&1%TFKv2f0-&uK)l5 delta 240887 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

u%E%G_G<%P!}__RVcjT5_8o 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 -\newcommand{\emailaddr}[1]{\mbox{$<${#1}$>$}} \def\twiddle{\raisebox{0.3ex}{\mbox{\tiny $\sim$}}} \def\gap{\vspace{0.5ex}} \makeindex \begin{document} -\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.84} +\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.85} \author{Tom St Denis \\ Algonquin College \\ \\ @@ -162,14 +161,11 @@ All of the source code except for the following files have been written by the a under the TDCAL license: \begin{enumerate} - \item aes.c \item rc2.c - \item serpent.c \item safer.c \end{enumerate} -``aes.c'' and ``serpent.c'' were written by Brian Gladman (gladman@seven77.demon.co.uk). They are copyrighted works -but were both granted unrestricted usage in any project (commercial or otherwise). ``mpi.c'' was originally written +`mpi.c'' was originally written by Michael Fromberger (sting@linguist.dartmouth.edu) but has since been replaced with my LibTomMath library. ``rc2.c'' is based on publicly available code that is not attributed to a person from the given source. ``safer.c'' was written by Richard De Moliner (demoliner@isi.ee.ethz.ch) and is public domain. @@ -512,7 +508,6 @@ As of this release the current cipher\_descriptors elements are \hline Safer SK64 & safer\_sk64\_desc & 8 & 8 & 6 .. 13 \\ \hline Safer K128 & safer\_k128\_desc & 8 & 16 & 6 .. 13 \\ \hline Safer SK128 & safer\_sk128\_desc & 8 & 16 & 6 .. 13 \\ - \hline Serpent & serpent\_desc & 16 & 16 .. 32 & 32 \\ \hline AES & aes\_desc & 16 & 16, 24, 32 & 10, 12, 14 \\ \hline Twofish & twofish\_desc & 16 & 16, 24, 32 & 16 \\ \hline DES & des\_desc & 8 & 7 & 16 \\ diff --git a/demos/test.c b/demos/test.c index dcdceaf..cc66c10 100644 --- a/demos/test.c +++ b/demos/test.c @@ -506,7 +506,6 @@ pad_test (void) } printf ("passed.\n"); } - void rsa_test (void) { @@ -658,9 +657,6 @@ rsa_test (void) rsa_free (&key); } } - - - } #else void @@ -1296,6 +1292,9 @@ test_prime (void) void register_all_algs (void) { +#ifdef RIJNDAEL + register_cipher (&aes_desc); +#endif #ifdef BLOWFISH register_cipher (&blowfish_desc); #endif @@ -1311,12 +1310,6 @@ register_all_algs (void) #ifdef SAFERP register_cipher (&saferp_desc); #endif -#ifdef SERPENT - register_cipher (&serpent_desc); -#endif -#ifdef RIJNDAEL - register_cipher (&aes_desc); -#endif #ifdef TWOFISH register_cipher (&twofish_desc); #endif @@ -1375,6 +1368,7 @@ register_all_algs (void) #endif } +#ifdef KR void kr_display (pk_key * kr) { @@ -1664,8 +1658,8 @@ kr_test (void) } kr_clear (&kr); - } +#endif void test_errs (void) @@ -1715,7 +1709,7 @@ main (void) #endif register_all_algs (); - + if ((errnum = yarrow_start (&prng)) != CRYPT_OK) { printf ("yarrow_start: %s\n", error_to_string (errnum)); } @@ -1746,7 +1740,9 @@ main (void) rng_tests (); //test_prime(); +#ifdef KR kr_test (); +#endif rsa_test (); pad_test (); ecc_tests (); diff --git a/legal.txt b/legal.txt index 0603d4f..6ef478e 100644 --- a/legal.txt +++ b/legal.txt @@ -4,19 +4,6 @@ Tom St Denis The bulk of the code was written or donated under the TDCAL "Tom Doesn't Care About License" license. It entitles the developer to free-reign on the use and distribution of derived works, commercial or otherwise. Certain files are taken from public domain packages. -AES.C ------ -Author: Dr Brian Gladman -Email : gladman@seven77.demon.co.uk -Disclaimer (verbatim) ----- -/* Copyright in this implementation is held by Dr B R Gladman but I */ -/* hereby give permission for its free direct or derivative use subject */ -/* to acknowledgment of its origin and compliance with any conditions */ -/* that the originators of the algorithm place on its exploitation. */ ----- -Status: Public Domain, modified [not original] - DES.C ----- Author: Unknown, Submitted by Dobes Vandermeer @@ -63,18 +50,4 @@ Author: [copied verbatim] ---- Email: demoliner@isi.ee.ethz.ch Disclaimer: Appears to be Public Domain [not quite sure] -Status: Public Domain, modified [not original] - -SERPENT.C ---------- -Author: Dr. Brian Gladman -Email : gladman@seven77.demon.co.uk -Disclaimer (verbatim) ----- -/* Copyright in this implementation is held by Dr B R Gladman but I */ -/* hereby give permission for its free direct or derivative use subject */ -/* to acknowledgment of its origin and compliance with any conditions */ -/* that the originators of the algorithm place on its exploitation. */ ----- -Status: Public Domain, modified [not original] - +Status: Public Domain, modified [not original] \ No newline at end of file diff --git a/makefile b/makefile index f2255a9..136a43d 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ # a build. This is easy to remedy though, for those that have problems. # The version -VERSION=0.84 +VERSION=0.85 #ch1-01-1 # Compiler and Linker Names @@ -55,9 +55,9 @@ DATAPATH=/usr/share/doc/libtomcrypt/pdf #List of objects to compile. OBJECTS=keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o \ bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o \ -md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o serpent.o des.o \ +md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o \ safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o \ -mpi.o prime.o twofish.o packet.o hmac.o strings.o +mpi.o prime.o twofish.o packet.o hmac.o strings.o TESTOBJECTS=demos/test.o HASHOBJECTS=demos/hashsum.o diff --git a/makefile.msvc b/makefile.msvc index 381ebb8..34f0e63 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -2,16 +2,17 @@ # #Tom St Denis -CFLAGS = /I. /Ogiyb1s /Gs /DWIN32 /W3 +# note optimizations are turned off because it causes a bug in aes.c that cannot be rectified [right away] +CFLAGS = /I. /Od /G3 /DWIN32 /W3 default: library #List of objects to compile. OBJECTS=keyring.obj gf.obj mem.obj sprng.obj ecc.obj base64.obj dh.obj rsa.obj \ bits.obj yarrow.obj cfb.obj ofb.obj ecb.obj ctr.obj cbc.obj hash.obj tiger.obj sha1.obj \ -md5.obj md4.obj md2.obj sha256.obj sha512.obj xtea.obj aes.obj serpent.obj des.obj \ +md5.obj md4.obj md2.obj sha256.obj sha512.obj xtea.obj aes.obj des.obj \ safer_tab.obj safer.obj safer+.obj rc4.obj rc2.obj rc6.obj rc5.obj cast5.obj noekeon.obj \ -blowfish.obj crypt.obj mpi.obj prime.obj twofish.obj packet.obj hmac.obj strings.obj +blowfish.obj crypt.obj mpi.obj prime.obj twofish.obj packet.obj hmac.obj strings.obj library: $(OBJECTS) lib /out:tomcrypt.lib $(OBJECTS) diff --git a/makefile.out b/makefile.out index bb217ef..fd73e82 100644 --- a/makefile.out +++ b/makefile.out @@ -5,11 +5,11 @@ CC = gcc AR = ar LD = ld -CFLAGS += -O3 -Wall -Wsign-compare -W -Wno-unused -Werror -I./ +CFLAGS += -Os -Wall -Wsign-compare -W -Wno-unused -Werror -I./ default: library -OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o serpent.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o ampi.o mpi.o prime.o twofish.o packet.o hmac.o strings.o +OBJECTS = keyring.o gf.o mem.o sprng.o ecc.o base64.o dh.o rsa.o bits.o yarrow.o cfb.o ofb.o ecb.o ctr.o cbc.o hash.o tiger.o sha1.o md5.o md4.o md2.o sha256.o sha512.o xtea.o aes.o des.o safer_tab.o safer.o safer+.o rc4.o rc2.o rc6.o rc5.o cast5.o noekeon.o blowfish.o crypt.o mpi.o prime.o twofish.o packet.o hmac.o strings.o rsa.o: rsa_sys.c dh.o: dh_sys.c diff --git a/md4.c b/md4.c index 6c6003f..d7b8d5e 100644 --- a/md4.c +++ b/md4.c @@ -29,7 +29,7 @@ const struct _hash_descriptor md4_desc = #define S34 15 /* F, G and H are basic MD4 functions. */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define F(x, y, z) (z ^ (x & (y ^ z))) #define G(x, y, z) ((x & y) | (z & (x | y))) #define H(x, y, z) ((x) ^ (y) ^ (z)) diff --git a/md5.c b/md5.c index ef999c2..9b78fa3 100644 --- a/md5.c +++ b/md5.c @@ -14,7 +14,7 @@ const struct _hash_descriptor md5_desc = &md5_test }; -#define F(x,y,z) ((x&y)|((~x)&z)) +#define F(x,y,z) (z ^ (x & (y ^ z))) #define G(x,y,z) ((x&z)|(y&(~z))) #define H(x,y,z) (x^y^z) #define I(x,y,z) (y^(x|(~z))) diff --git a/mpi.c b/mpi.c index 383d198..4f97286 100644 --- a/mpi.c +++ b/mpi.c @@ -1,1610 +1,1610 @@ -/* Start: bn_fast_mp_invmod.c */ -#line 0 "bn_fast_mp_invmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ +/* Start: bn_fast_mp_invmod.c */ +#line 0 "bn_fast_mp_invmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ #include "mycrypt.h" -#include - -/* computes the modular inverse via binary extended euclidean algorithm, - * that is c = 1/a mod b - * - * Based on mp_invmod except this is optimized for the case where b is - * odd as per HAC Note 14.64 on pp. 610 - */ -int -fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int x, y, u, v, B, D; - int res, neg; - - /* init all our temps */ - if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { - return res; - } - - /* x == modulus, y == value to invert */ - if ((res = mp_copy (b, &x)) != MP_OKAY) { - goto __ERR; - } - - /* we need y = |a| */ - if ((res = mp_abs (a, &y)) != MP_OKAY) { - goto __ERR; - } - - /* 2. [modified] if x,y are both even then return an error! - * - * That is if gcd(x,y) = 2 * k then obviously there is no inverse. - */ - if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { - res = MP_VAL; - goto __ERR; - } - - /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ - if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; - } - mp_set (&D, 1); - -top: - /* 4. while u is even do */ - while (mp_iseven (&u) == 1) { - /* 4.1 u = u/2 */ - if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; - } - /* 4.2 if A or B is odd then */ - if (mp_iseven (&B) == 0) { - if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; - } - } - /* B = B/2 */ - if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; - } - } - - /* 5. while v is even do */ - while (mp_iseven (&v) == 1) { - /* 5.1 v = v/2 */ - if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; - } - /* 5.2 if C,D are even then */ - if (mp_iseven (&D) == 0) { - /* D = (D-x)/2 */ - if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; - } - } - /* D = D/2 */ - if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; - } - } - - /* 6. if u >= v then */ - if (mp_cmp (&u, &v) != MP_LT) { - /* u = u - v, B = B - D */ - if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; - } - } else { - /* v - v - u, D = D - B */ - if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; - } - } - - /* if not zero goto step 4 */ - if (mp_iszero (&u) == 0) { - goto top; - } - - /* now a = C, b = D, gcd == g*v */ - - /* if v != 1 then there is no inverse */ - if (mp_cmp_d (&v, 1) != MP_EQ) { - res = MP_VAL; - goto __ERR; - } - - /* b is now the inverse */ - neg = a->sign; - while (D.sign == MP_NEG) { - if ((res = mp_add (&D, b, &D)) != MP_OKAY) { - goto __ERR; - } - } - mp_exch (&D, c); - c->sign = neg; - res = MP_OKAY; - -__ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); - return res; -} - -/* End: bn_fast_mp_invmod.c */ - -/* Start: bn_fast_mp_montgomery_reduce.c */ -#line 0 "bn_fast_mp_montgomery_reduce.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes xR**-1 == x (mod N) via Montgomery Reduction - * - * This is an optimized implementation of mp_montgomery_reduce - * which uses the comba method to quickly calculate the columns of the - * reduction. - * - * Based on Algorithm 14.32 on pp.601 of HAC. -*/ -int -fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) -{ - int ix, res, olduse; - mp_word W[MP_WARRAY]; - - /* get old used count */ - olduse = x->used; - - /* grow a as required */ - if (x->alloc < n->used + 1) { - if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { - return res; - } - } - - { - register mp_word *_W; - register mp_digit *tmpx; - - _W = W; - tmpx = x->dp; - - /* copy the digits of a into W[0..a->used-1] */ - for (ix = 0; ix < x->used; ix++) { - *_W++ = *tmpx++; - } - - /* zero the high words of W[a->used..m->used*2] */ - for (; ix < n->used * 2 + 1; ix++) { - *_W++ = 0; - } - } - - for (ix = 0; ix < n->used; ix++) { - /* mu = ai * m' mod b - * - * We avoid a double precision multiplication (which isn't required) - * by casting the value down to a mp_digit. Note this requires - * that W[ix-1] have the carry cleared (see after the inner loop) - */ - register mp_digit mu; - mu = (((mp_digit) (W[ix] & MP_MASK)) * rho) & MP_MASK; - - /* a = a + mu * m * b**i - * - * This is computed in place and on the fly. The multiplication - * by b**i is handled by offseting which columns the results - * are added to. - * - * Note the comba method normally doesn't handle carries in the - * inner loop In this case we fix the carry from the previous - * column since the Montgomery reduction requires digits of the - * result (so far) [see above] to work. This is - * handled by fixing up one carry after the inner loop. The - * carry fixups are done in order so after these loops the - * first m->used words of W[] have the carries fixed - */ - { - register int iy; - register mp_digit *tmpn; - register mp_word *_W; - - /* alias for the digits of the modulus */ - tmpn = n->dp; - - /* Alias for the columns set by an offset of ix */ - _W = W + ix; - - /* inner loop */ - for (iy = 0; iy < n->used; iy++) { - *_W++ += ((mp_word) mu) * ((mp_word) * tmpn++); - } - } - - /* now fix carry for next digit, W[ix+1] */ - W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); - } - - - { - register mp_digit *tmpx; - register mp_word *_W, *_W1; - - /* nox fix rest of carries */ - _W1 = W + ix; - _W = W + ++ix; - - for (; ix <= n->used * 2 + 1; ix++) { - *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); - } - - /* copy out, A = A/b**n - * - * The result is A/b**n but instead of converting from an - * array of mp_word to mp_digit than calling mp_rshd - * we just copy them in the right order - */ - tmpx = x->dp; - _W = W + n->used; - - for (ix = 0; ix < n->used + 1; ix++) { - *tmpx++ = *_W++ & ((mp_word) MP_MASK); - } - - /* zero oldused digits, if the input a was larger than - * m->used+1 we'll have to clear the digits */ - for (; ix < olduse; ix++) { - *tmpx++ = 0; - } - } - - /* set the max used and clamp */ - x->used = n->used + 1; - mp_clamp (x); - - /* if A >= m then A = A - m */ - if (mp_cmp_mag (x, n) != MP_LT) { - return s_mp_sub (x, n, x); - } - return MP_OKAY; -} - -/* End: bn_fast_mp_montgomery_reduce.c */ - -/* Start: bn_fast_s_mp_mul_digs.c */ -#line 0 "bn_fast_s_mp_mul_digs.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Fast (comba) multiplier - * - * This is the fast column-array [comba] multiplier. It is - * designed to compute the columns of the product first - * then handle the carries afterwards. This has the effect - * of making the nested loops that compute the columns very - * simple and schedulable on super-scalar processors. - * - * This has been modified to produce a variable number of - * digits of output so if say only a half-product is required - * you don't have to compute the upper half (a feature - * required for fast Barrett reduction). - * - * Based on Algorithm 14.12 on pp.595 of HAC. - * - */ -int -fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) -{ - int olduse, res, pa, ix; - mp_word W[MP_WARRAY]; - - /* grow the destination as required */ - if (c->alloc < digs) { - if ((res = mp_grow (c, digs)) != MP_OKAY) { - return res; - } - } - - /* clear temp buf (the columns) */ - memset (W, 0, sizeof (mp_word) * digs); - - /* calculate the columns */ - pa = a->used; - for (ix = 0; ix < pa; ix++) { - /* this multiplier has been modified to allow you to - * control how many digits of output are produced. - * So at most we want to make upto "digs" digits of output. - * - * this adds products to distinct columns (at ix+iy) of W - * note that each step through the loop is not dependent on - * the previous which means the compiler can easily unroll - * the loop without scheduling problems - */ - { - register mp_digit tmpx, *tmpy; - register mp_word *_W; - register int iy, pb; - - /* alias for the the word on the left e.g. A[ix] * A[iy] */ - tmpx = a->dp[ix]; - - /* alias for the right side */ - tmpy = b->dp; - - /* alias for the columns, each step through the loop adds a new - term to each column - */ - _W = W + ix; - - /* the number of digits is limited by their placement. E.g. - we avoid multiplying digits that will end up above the # of - digits of precision requested - */ - pb = MIN (b->used, digs - ix); - - for (iy = 0; iy < pb; iy++) { - *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); - } - } - - } - - /* setup dest */ - olduse = c->used; - c->used = digs; - - { - register mp_digit *tmpc; - - /* At this point W[] contains the sums of each column. To get the - * correct result we must take the extra bits from each column and - * carry them down - * - * Note that while this adds extra code to the multiplier it - * saves time since the carry propagation is removed from the - * above nested loop.This has the effect of reducing the work - * from N*(N+N*c)==N**2 + c*N**2 to N**2 + N*c where c is the - * cost of the shifting. On very small numbers this is slower - * but on most cryptographic size numbers it is faster. - */ - tmpc = c->dp; - for (ix = 1; ix < digs; ix++) { - W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); - *tmpc++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); - } - *tmpc++ = (mp_digit) (W[digs - 1] & ((mp_word) MP_MASK)); - - /* clear unused */ - for (; ix < olduse; ix++) { - *tmpc++ = 0; - } - } - - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_fast_s_mp_mul_digs.c */ - -/* Start: bn_fast_s_mp_mul_high_digs.c */ -#line 0 "bn_fast_s_mp_mul_high_digs.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* this is a modified version of fast_s_mp_mul_digs that only produces - * output digits *above* digs. See the comments for fast_s_mp_mul_digs - * to see how it works. - * - * This is used in the Barrett reduction since for one of the multiplications - * only the higher digits were needed. This essentially halves the work. - * - * Based on Algorithm 14.12 on pp.595 of HAC. - */ -int -fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) -{ - int oldused, newused, res, pa, pb, ix; - mp_word W[MP_WARRAY]; - - /* calculate size of product and allocate more space if required */ - newused = a->used + b->used + 1; - if (c->alloc < newused) { - if ((res = mp_grow (c, newused)) != MP_OKAY) { - return res; - } - } - - /* like the other comba method we compute the columns first */ - pa = a->used; - pb = b->used; - memset (W + digs, 0, (pa + pb + 1 - digs) * sizeof (mp_word)); - for (ix = 0; ix < pa; ix++) { - { - register mp_digit tmpx, *tmpy; - register int iy; - register mp_word *_W; - - /* work todo, that is we only calculate digits that are at "digs" or above */ - iy = digs - ix; - - /* copy of word on the left of A[ix] * B[iy] */ - tmpx = a->dp[ix]; - - /* alias for right side */ - tmpy = b->dp + iy; - - /* alias for the columns of output. Offset to be equal to or above the - * smallest digit place requested - */ - _W = W + digs; - - /* skip cases below zero where ix > digs */ - if (iy < 0) { - iy = abs(iy); - tmpy += iy; - _W += iy; - iy = 0; - } - - /* compute column products for digits above the minimum */ - for (; iy < pb; iy++) { - *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); - } - } - } - - /* setup dest */ - oldused = c->used; - c->used = newused; - - /* now convert the array W downto what we need */ - for (ix = digs + 1; ix < newused; ix++) { - W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); - c->dp[ix - 1] = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); - } - c->dp[(pa + pb + 1) - 1] = (mp_digit) (W[(pa + pb + 1) - 1] & ((mp_word) MP_MASK)); - - for (; ix < oldused; ix++) { - c->dp[ix] = 0; - } - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_fast_s_mp_mul_high_digs.c */ - -/* Start: bn_fast_s_mp_sqr.c */ -#line 0 "bn_fast_s_mp_sqr.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* fast squaring - * - * This is the comba method where the columns of the product - * are computed first then the carries are computed. This - * has the effect of making a very simple inner loop that - * is executed the most - * - * W2 represents the outer products and W the inner. - * - * A further optimizations is made because the inner - * products are of the form "A * B * 2". The *2 part does - * not need to be computed until the end which is good - * because 64-bit shifts are slow! - * - * Based on Algorithm 14.16 on pp.597 of HAC. - * - */ -int -fast_s_mp_sqr (mp_int * a, mp_int * b) -{ - int olduse, newused, res, ix, pa; - mp_word W2[MP_WARRAY], W[MP_WARRAY]; - - /* calculate size of product and allocate as required */ - pa = a->used; - newused = pa + pa + 1; - if (b->alloc < newused) { - if ((res = mp_grow (b, newused)) != MP_OKAY) { - return res; - } - } - - /* zero temp buffer (columns) - * Note that there are two buffers. Since squaring requires - * a outter and inner product and the inner product requires - * computing a product and doubling it (a relatively expensive - * op to perform n**2 times if you don't have to) the inner and - * outer products are computed in different buffers. This way - * the inner product can be doubled using n doublings instead of - * n**2 - */ - memset (W, 0, newused * sizeof (mp_word)); - memset (W2, 0, newused * sizeof (mp_word)); - - /* This computes the inner product. To simplify the inner N**2 loop - * the multiplication by two is done afterwards in the N loop. - */ - for (ix = 0; ix < pa; ix++) { - /* compute the outer product - * - * Note that every outer product is computed - * for a particular column only once which means that - * there is no need todo a double precision addition - */ - W2[ix + ix] = ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); - - { - register mp_digit tmpx, *tmpy; - register mp_word *_W; - register int iy; - - /* copy of left side */ - tmpx = a->dp[ix]; - - /* alias for right side */ - tmpy = a->dp + (ix + 1); - - /* the column to store the result in */ - _W = W + (ix + ix + 1); - - /* inner products */ - for (iy = ix + 1; iy < pa; iy++) { - *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); - } - } - } - - /* setup dest */ - olduse = b->used; - b->used = newused; - - /* now compute digits */ - { - register mp_digit *tmpb; - - /* double first value, since the inner products are - * half of what they should be - */ - W[0] += W[0] + W2[0]; - - tmpb = b->dp; - for (ix = 1; ix < newused; ix++) { - /* double/add next digit */ - W[ix] += W[ix] + W2[ix]; - - W[ix] = W[ix] + (W[ix - 1] >> ((mp_word) DIGIT_BIT)); - *tmpb++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); - } - /* set the last value. Note even if the carry is zero - * this is required since the next step will not zero - * it if b originally had a value at b->dp[2*a.used] - */ - *tmpb++ = (mp_digit) (W[(newused) - 1] & ((mp_word) MP_MASK)); - - /* clear high digits */ - for (; ix < olduse; ix++) { - *tmpb++ = 0; - } - } - - mp_clamp (b); - return MP_OKAY; -} - -/* End: bn_fast_s_mp_sqr.c */ - -/* Start: bn_mp_2expt.c */ -#line 0 "bn_mp_2expt.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes a = 2**b - * - * Simple algorithm which zeroes the int, grows it then just sets one bit - * as required. - */ -int -mp_2expt (mp_int * a, int b) -{ - int res; - - mp_zero (a); - if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { - return res; - } - a->used = b / DIGIT_BIT + 1; - a->dp[b / DIGIT_BIT] = 1 << (b % DIGIT_BIT); - - return MP_OKAY; -} - -/* End: bn_mp_2expt.c */ - -/* Start: bn_mp_abs.c */ -#line 0 "bn_mp_abs.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* b = |a| - * - * Simple function copies the input and fixes the sign to positive - */ -int -mp_abs (mp_int * a, mp_int * b) -{ - int res; - if ((res = mp_copy (a, b)) != MP_OKAY) { - return res; - } - b->sign = MP_ZPOS; - return MP_OKAY; -} - -/* End: bn_mp_abs.c */ - -/* Start: bn_mp_add.c */ -#line 0 "bn_mp_add.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* high level addition (handles signs) */ -int -mp_add (mp_int * a, mp_int * b, mp_int * c) -{ - int sa, sb, res; - - /* get sign of both inputs */ - sa = a->sign; - sb = b->sign; - - /* handle two cases, not four */ - if (sa == sb) { - /* both positive or both negative */ - /* add their magnitudes, copy the sign */ - c->sign = sa; - res = s_mp_add (a, b, c); - } else { - /* one positive, the other negative */ - /* subtract the one with the greater magnitude from */ - /* the one of the lesser magnitude. The result gets */ - /* the sign of the one with the greater magnitude. */ - if (mp_cmp_mag (a, b) == MP_LT) { - c->sign = sb; - res = s_mp_sub (b, a, c); - } else { - c->sign = sa; - res = s_mp_sub (a, b, c); - } - } - return res; -} - - -/* End: bn_mp_add.c */ - -/* Start: bn_mp_add_d.c */ -#line 0 "bn_mp_add_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* single digit addition */ -int -mp_add_d (mp_int * a, mp_digit b, mp_int * c) -{ - mp_int t; - int res; - - if ((res = mp_init_size(&t, 1)) != MP_OKAY) { - return res; - } - mp_set (&t, b); - res = mp_add (a, &t, c); - - mp_clear (&t); - return res; -} - -/* End: bn_mp_add_d.c */ - -/* Start: bn_mp_addmod.c */ -#line 0 "bn_mp_addmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* d = a + b (mod c) */ -int -mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) -{ - int res; - mp_int t; - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_add (a, b, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - res = mp_mod (&t, c, d); - mp_clear (&t); - return res; -} - -/* End: bn_mp_addmod.c */ - -/* Start: bn_mp_and.c */ -#line 0 "bn_mp_and.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* AND two ints together */ -int -mp_and (mp_int * a, mp_int * b, mp_int * c) -{ - int res, ix, px; - mp_int t, *x; - - if (a->used > b->used) { - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - px = b->used; - x = b; - } else { - if ((res = mp_init_copy (&t, b)) != MP_OKAY) { - return res; - } - px = a->used; - x = a; - } - - for (ix = 0; ix < px; ix++) { - t.dp[ix] &= x->dp[ix]; - } - - /* zero digits above the last from the smallest mp_int */ - for (; ix < t.used; ix++) { - t.dp[ix] = 0; - } - - mp_clamp (&t); - mp_exch (c, &t); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_mp_and.c */ - -/* Start: bn_mp_clamp.c */ -#line 0 "bn_mp_clamp.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* trim unused digits - * - * This is used to ensure that leading zero digits are - * trimed and the leading "used" digit will be non-zero - * Typically very fast. Also fixes the sign if there - * are no more leading digits - */ -void -mp_clamp (mp_int * a) -{ - while (a->used > 0 && a->dp[a->used - 1] == 0) { - --(a->used); - } - if (a->used == 0) { - a->sign = MP_ZPOS; - } -} - -/* End: bn_mp_clamp.c */ - -/* Start: bn_mp_clear.c */ -#line 0 "bn_mp_clear.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* clear one (frees) */ -void -mp_clear (mp_int * a) -{ - if (a->dp != NULL) { - - /* first zero the digits */ - memset (a->dp, 0, sizeof (mp_digit) * a->used); - - /* free ram */ - free (a->dp); - - /* reset members to make debugging easier */ - a->dp = NULL; - a->alloc = a->used = 0; - } -} - -/* End: bn_mp_clear.c */ - -/* Start: bn_mp_cmp.c */ -#line 0 "bn_mp_cmp.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* compare two ints (signed)*/ -int -mp_cmp (mp_int * a, mp_int * b) -{ - /* compare based on sign */ - if (a->sign == MP_NEG && b->sign == MP_ZPOS) { - return MP_LT; - } - - if (a->sign == MP_ZPOS && b->sign == MP_NEG) { - return MP_GT; - } - - /* compare digits */ - if (a->sign == MP_NEG) { - /* if negative compare opposite direction */ - return mp_cmp_mag(b, a); - } else { - return mp_cmp_mag(a, b); - } -} - -/* End: bn_mp_cmp.c */ - -/* Start: bn_mp_cmp_d.c */ -#line 0 "bn_mp_cmp_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* compare a digit */ -int -mp_cmp_d (mp_int * a, mp_digit b) -{ - - if (a->sign == MP_NEG) { - return MP_LT; - } - - if (a->used > 1) { - return MP_GT; - } - - if (a->dp[0] > b) { - return MP_GT; - } else if (a->dp[0] < b) { - return MP_LT; - } else { - return MP_EQ; - } -} - -/* End: bn_mp_cmp_d.c */ - -/* Start: bn_mp_cmp_mag.c */ -#line 0 "bn_mp_cmp_mag.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* compare maginitude of two ints (unsigned) */ -int -mp_cmp_mag (mp_int * a, mp_int * b) -{ - int n; - - /* compare based on # of non-zero digits */ - if (a->used > b->used) { - return MP_GT; - } - - if (a->used < b->used) { - return MP_LT; - } - - /* compare based on digits */ - for (n = a->used - 1; n >= 0; n--) { - if (a->dp[n] > b->dp[n]) { - return MP_GT; - } - - if (a->dp[n] < b->dp[n]) { - return MP_LT; - } - } - return MP_EQ; -} - -/* End: bn_mp_cmp_mag.c */ - -/* Start: bn_mp_copy.c */ -#line 0 "bn_mp_copy.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* copy, b = a */ -int -mp_copy (mp_int * a, mp_int * b) -{ - int res, n; - - /* if dst == src do nothing */ - if (a == b) { - return MP_OKAY; - } - - /* grow dest */ - if ((res = mp_grow (b, a->used)) != MP_OKAY) { - return res; - } - - /* zero b and copy the parameters over */ - { - register mp_digit *tmpa, *tmpb; - - /* pointer aliases */ - tmpa = a->dp; - tmpb = b->dp; - - /* copy all the digits */ - for (n = 0; n < a->used; n++) { - *tmpb++ = *tmpa++; - } - - /* clear high digits */ - for (; n < b->used; n++) { - *tmpb++ = 0; - } - } - b->used = a->used; - b->sign = a->sign; - return MP_OKAY; -} - -/* End: bn_mp_copy.c */ - -/* Start: bn_mp_count_bits.c */ -#line 0 "bn_mp_count_bits.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* returns the number of bits in an int */ -int -mp_count_bits (mp_int * a) -{ - int r; - mp_digit q; - - /* shortcut */ - if (a->used == 0) { - return 0; - } - - /* get number of digits and add that */ - r = (a->used - 1) * DIGIT_BIT; - - /* take the last digit and count the bits in it */ - q = a->dp[a->used - 1]; - while (q > ((mp_digit) 0)) { - ++r; - q >>= ((mp_digit) 1); - } - return r; -} - -/* End: bn_mp_count_bits.c */ - -/* Start: bn_mp_div.c */ -#line 0 "bn_mp_div.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* integer signed division. c*b + d == a [e.g. a/b, c=quotient, d=remainder] - * HAC pp.598 Algorithm 14.20 - * - * Note that the description in HAC is horribly incomplete. For example, - * it doesn't consider the case where digits are removed from 'x' in the inner - * loop. It also doesn't consider the case that y has fewer than three digits, etc.. - * - * The overall algorithm is as described as 14.20 from HAC but fixed to treat these cases. -*/ -int -mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) -{ - mp_int q, x, y, t1, t2; - int res, n, t, i, norm, neg; - - - /* is divisor zero ? */ - if (mp_iszero (b) == 1) { - return MP_VAL; - } - - /* if a < b then q=0, r = a */ - if (mp_cmp_mag (a, b) == MP_LT) { - if (d != NULL) { - res = mp_copy (a, d); - } else { - res = MP_OKAY; - } - if (c != NULL) { - mp_zero (c); - } - return res; - } - - if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { - return res; - } - q.used = a->used + 2; - - if ((res = mp_init (&t1)) != MP_OKAY) { - goto __Q; - } - - if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; - } - - if ((res = mp_init_copy (&x, a)) != MP_OKAY) { - goto __T2; - } - - if ((res = mp_init_copy (&y, b)) != MP_OKAY) { - goto __X; - } - - /* fix the sign */ - neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; - x.sign = y.sign = MP_ZPOS; - - /* normalize both x and y, ensure that y >= b/2, [b == 2^DIGIT_BIT] */ - norm = mp_count_bits(&y) % DIGIT_BIT; - if (norm < (int)(DIGIT_BIT-1)) { - norm = (DIGIT_BIT-1) - norm; - if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { - goto __Y; - } - if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { - goto __Y; - } - } else { - norm = 0; - } - - /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ - n = x.used - 1; - t = y.used - 1; - - /* step 2. while (x >= y*b^n-t) do { q[n-t] += 1; x -= y*b^{n-t} } */ - if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b^{n-t} */ - goto __Y; - } - - while (mp_cmp (&x, &y) != MP_LT) { - ++(q.dp[n - t]); - if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { - goto __Y; - } - } - - /* reset y by shifting it back down */ - mp_rshd (&y, n - t); - - /* step 3. for i from n down to (t + 1) */ - for (i = n; i >= (t + 1); i--) { - if (i > x.used) - continue; - - /* step 3.1 if xi == yt then set q{i-t-1} to b-1, otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ - if (x.dp[i] == y.dp[t]) { - q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); - } else { - mp_word tmp; - tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); - tmp |= ((mp_word) x.dp[i - 1]); - tmp /= ((mp_word) y.dp[t]); - if (tmp > (mp_word) MP_MASK) - tmp = MP_MASK; - q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); - } - - /* step 3.2 while (q{i-t-1} * (yt * b + y{t-1})) > xi * b^2 + xi-1 * b + xi-2 do q{i-t-1} -= 1; */ - q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; - do { - q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; - - /* find left hand */ - mp_zero (&t1); - t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; - t1.dp[1] = y.dp[t]; - t1.used = 2; - if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; - } - - /* find right hand */ - t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; - t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; - t2.dp[2] = x.dp[i]; - t2.used = 3; - } while (mp_cmp_mag(&t1, &t2) == MP_GT); - - /* step 3.3 x = x - q{i-t-1} * y * b^{i-t-1} */ - if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; - } - - if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; - } - - if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { - goto __Y; - } - - /* step 3.4 if x < 0 then { x = x + y*b^{i-t-1}; q{i-t-1} -= 1; } */ - if (x.sign == MP_NEG) { - if ((res = mp_copy (&y, &t1)) != MP_OKAY) { - goto __Y; - } - if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; - } - if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { - goto __Y; - } - - q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; - } - } - - /* now q is the quotient and x is the remainder [which we have to normalize] */ - /* get sign before writing to c */ - x.sign = a->sign; - - if (c != NULL) { - mp_clamp (&q); - mp_exch (&q, c); - c->sign = neg; - } - - if (d != NULL) { - mp_div_2d (&x, norm, &x, NULL); - mp_exch (&x, d); - } - - res = MP_OKAY; - -__Y:mp_clear (&y); -__X:mp_clear (&x); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); -__Q:mp_clear (&q); - return res; -} - -/* End: bn_mp_div.c */ - -/* Start: bn_mp_div_2.c */ -#line 0 "bn_mp_div_2.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* b = a/2 */ -int -mp_div_2 (mp_int * a, mp_int * b) -{ - int x, res, oldused; - - /* copy */ - if (b->alloc < a->used) { - if ((res = mp_grow (b, a->used)) != MP_OKAY) { - return res; - } - } - - oldused = b->used; - b->used = a->used; - { - register mp_digit r, rr, *tmpa, *tmpb; - - /* source alias */ - tmpa = a->dp + b->used - 1; - - /* dest alias */ - tmpb = b->dp + b->used - 1; - - /* carry */ - r = 0; - for (x = b->used - 1; x >= 0; x--) { - /* get the carry for the next iteration */ - rr = *tmpa & 1; - - /* shift the current digit, add in carry and store */ - *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); - - /* forward carry to next iteration */ - r = rr; - } - - /* zero excess digits */ - tmpb = b->dp + b->used; - for (x = b->used; x < oldused; x++) { - *tmpb++ = 0; - } - } - b->sign = a->sign; - mp_clamp (b); - return MP_OKAY; -} - -/* End: bn_mp_div_2.c */ - -/* Start: bn_mp_div_2d.c */ -#line 0 "bn_mp_div_2d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* shift right by a certain bit count (store quotient in c, optional remainder in d) */ -int -mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) -{ - mp_digit D, r, rr; - int x, res; - mp_int t; - - - /* if the shift count is <= 0 then we do no work */ - if (b <= 0) { - res = mp_copy (a, c); - if (d != NULL) { - mp_zero (d); - } - return res; - } - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - /* get the remainder */ - if (d != NULL) { - if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - } - - /* copy */ - if ((res = mp_copy (a, c)) != MP_OKAY) { - mp_clear (&t); - return res; - } - - /* shift by as many digits in the bit count */ - if (b >= (int)DIGIT_BIT) { - mp_rshd (c, b / DIGIT_BIT); - } - - /* shift any bit count < DIGIT_BIT */ - D = (mp_digit) (b % DIGIT_BIT); - if (D != 0) { - register mp_digit *tmpc, mask; - - /* mask */ - mask = (((mp_digit)1) << D) - 1; - - /* alias */ - tmpc = c->dp + (c->used - 1); - - /* carry */ - r = 0; - for (x = c->used - 1; x >= 0; x--) { - /* get the lower bits of this word in a temp */ - rr = *tmpc & mask; - - /* shift the current word and mix in the carry bits from the previous word */ - *tmpc = (*tmpc >> D) | (r << (DIGIT_BIT - D)); - --tmpc; - - /* set the carry to the carry bits of the current word found above */ - r = rr; - } - } - mp_clamp (c); - if (d != NULL) { - mp_exch (&t, d); - } - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_mp_div_2d.c */ - -/* Start: bn_mp_div_3.c */ -#line 0 "bn_mp_div_3.c" +#include + +/* computes the modular inverse via binary extended euclidean algorithm, + * that is c = 1/a mod b + * + * Based on mp_invmod except this is optimized for the case where b is + * odd as per HAC Note 14.64 on pp. 610 + */ +int +fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, B, D; + int res, neg; + + /* init all our temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x == modulus, y == value to invert */ + if ((res = mp_copy (b, &x)) != MP_OKAY) { + goto __ERR; + } + + /* we need y = |a| */ + if ((res = mp_abs (a, &y)) != MP_OKAY) { + goto __ERR; + } + + /* 2. [modified] if x,y are both even then return an error! + * + * That is if gcd(x,y) = 2 * k then obviously there is no inverse. + */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto __ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto __ERR; + } + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __ERR; + } + /* 4.2 if A or B is odd then */ + if (mp_iseven (&B) == 0) { + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto __ERR; + } + } + /* B = B/2 */ + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto __ERR; + } + } + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __ERR; + } + /* 5.2 if C,D are even then */ + if (mp_iseven (&D) == 0) { + /* D = (D-x)/2 */ + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto __ERR; + } + } + /* D = D/2 */ + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto __ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto __ERR; + } + } else { + /* v - v - u, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto __ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) { + goto top; + } + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto __ERR; + } + + /* b is now the inverse */ + neg = a->sign; + while (D.sign == MP_NEG) { + if ((res = mp_add (&D, b, &D)) != MP_OKAY) { + goto __ERR; + } + } + mp_exch (&D, c); + c->sign = neg; + res = MP_OKAY; + +__ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); + return res; +} + +/* End: bn_fast_mp_invmod.c */ + +/* Start: bn_fast_mp_montgomery_reduce.c */ +#line 0 "bn_fast_mp_montgomery_reduce.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes xR**-1 == x (mod N) via Montgomery Reduction + * + * This is an optimized implementation of mp_montgomery_reduce + * which uses the comba method to quickly calculate the columns of the + * reduction. + * + * Based on Algorithm 14.32 on pp.601 of HAC. +*/ +int +fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, olduse; + mp_word W[MP_WARRAY]; + + /* get old used count */ + olduse = x->used; + + /* grow a as required */ + if (x->alloc < n->used + 1) { + if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { + return res; + } + } + + { + register mp_word *_W; + register mp_digit *tmpx; + + _W = W; + tmpx = x->dp; + + /* copy the digits of a into W[0..a->used-1] */ + for (ix = 0; ix < x->used; ix++) { + *_W++ = *tmpx++; + } + + /* zero the high words of W[a->used..m->used*2] */ + for (; ix < n->used * 2 + 1; ix++) { + *_W++ = 0; + } + } + + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * m' mod b + * + * We avoid a double precision multiplication (which isn't required) + * by casting the value down to a mp_digit. Note this requires + * that W[ix-1] have the carry cleared (see after the inner loop) + */ + register mp_digit mu; + mu = (((mp_digit) (W[ix] & MP_MASK)) * rho) & MP_MASK; + + /* a = a + mu * m * b**i + * + * This is computed in place and on the fly. The multiplication + * by b**i is handled by offseting which columns the results + * are added to. + * + * Note the comba method normally doesn't handle carries in the + * inner loop In this case we fix the carry from the previous + * column since the Montgomery reduction requires digits of the + * result (so far) [see above] to work. This is + * handled by fixing up one carry after the inner loop. The + * carry fixups are done in order so after these loops the + * first m->used words of W[] have the carries fixed + */ + { + register int iy; + register mp_digit *tmpn; + register mp_word *_W; + + /* alias for the digits of the modulus */ + tmpn = n->dp; + + /* Alias for the columns set by an offset of ix */ + _W = W + ix; + + /* inner loop */ + for (iy = 0; iy < n->used; iy++) { + *_W++ += ((mp_word) mu) * ((mp_word) * tmpn++); + } + } + + /* now fix carry for next digit, W[ix+1] */ + W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); + } + + + { + register mp_digit *tmpx; + register mp_word *_W, *_W1; + + /* nox fix rest of carries */ + _W1 = W + ix; + _W = W + ++ix; + + for (; ix <= n->used * 2 + 1; ix++) { + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); + } + + /* copy out, A = A/b**n + * + * The result is A/b**n but instead of converting from an + * array of mp_word to mp_digit than calling mp_rshd + * we just copy them in the right order + */ + tmpx = x->dp; + _W = W + n->used; + + for (ix = 0; ix < n->used + 1; ix++) { + *tmpx++ = *_W++ & ((mp_word) MP_MASK); + } + + /* zero oldused digits, if the input a was larger than + * m->used+1 we'll have to clear the digits */ + for (; ix < olduse; ix++) { + *tmpx++ = 0; + } + } + + /* set the max used and clamp */ + x->used = n->used + 1; + mp_clamp (x); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + return MP_OKAY; +} + +/* End: bn_fast_mp_montgomery_reduce.c */ + +/* Start: bn_fast_s_mp_mul_digs.c */ +#line 0 "bn_fast_s_mp_mul_digs.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Fast (comba) multiplier + * + * This is the fast column-array [comba] multiplier. It is + * designed to compute the columns of the product first + * then handle the carries afterwards. This has the effect + * of making the nested loops that compute the columns very + * simple and schedulable on super-scalar processors. + * + * This has been modified to produce a variable number of + * digits of output so if say only a half-product is required + * you don't have to compute the upper half (a feature + * required for fast Barrett reduction). + * + * Based on Algorithm 14.12 on pp.595 of HAC. + * + */ +int +fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix; + mp_word W[MP_WARRAY]; + + /* grow the destination as required */ + if (c->alloc < digs) { + if ((res = mp_grow (c, digs)) != MP_OKAY) { + return res; + } + } + + /* clear temp buf (the columns) */ + memset (W, 0, sizeof (mp_word) * digs); + + /* calculate the columns */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* this multiplier has been modified to allow you to + * control how many digits of output are produced. + * So at most we want to make upto "digs" digits of output. + * + * this adds products to distinct columns (at ix+iy) of W + * note that each step through the loop is not dependent on + * the previous which means the compiler can easily unroll + * the loop without scheduling problems + */ + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy, pb; + + /* alias for the the word on the left e.g. A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for the right side */ + tmpy = b->dp; + + /* alias for the columns, each step through the loop adds a new + term to each column + */ + _W = W + ix; + + /* the number of digits is limited by their placement. E.g. + we avoid multiplying digits that will end up above the # of + digits of precision requested + */ + pb = MIN (b->used, digs - ix); + + for (iy = 0; iy < pb; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + + } + + /* setup dest */ + olduse = c->used; + c->used = digs; + + { + register mp_digit *tmpc; + + /* At this point W[] contains the sums of each column. To get the + * correct result we must take the extra bits from each column and + * carry them down + * + * Note that while this adds extra code to the multiplier it + * saves time since the carry propagation is removed from the + * above nested loop.This has the effect of reducing the work + * from N*(N+N*c)==N**2 + c*N**2 to N**2 + N*c where c is the + * cost of the shifting. On very small numbers this is slower + * but on most cryptographic size numbers it is faster. + */ + tmpc = c->dp; + for (ix = 1; ix < digs; ix++) { + W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + *tmpc++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + *tmpc++ = (mp_digit) (W[digs - 1] & ((mp_word) MP_MASK)); + + /* clear unused */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_mul_digs.c */ + +/* Start: bn_fast_s_mp_mul_high_digs.c */ +#line 0 "bn_fast_s_mp_mul_high_digs.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* this is a modified version of fast_s_mp_mul_digs that only produces + * output digits *above* digs. See the comments for fast_s_mp_mul_digs + * to see how it works. + * + * This is used in the Barrett reduction since for one of the multiplications + * only the higher digits were needed. This essentially halves the work. + * + * Based on Algorithm 14.12 on pp.595 of HAC. + */ +int +fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int oldused, newused, res, pa, pb, ix; + mp_word W[MP_WARRAY]; + + /* calculate size of product and allocate more space if required */ + newused = a->used + b->used + 1; + if (c->alloc < newused) { + if ((res = mp_grow (c, newused)) != MP_OKAY) { + return res; + } + } + + /* like the other comba method we compute the columns first */ + pa = a->used; + pb = b->used; + memset (W + digs, 0, (pa + pb + 1 - digs) * sizeof (mp_word)); + for (ix = 0; ix < pa; ix++) { + { + register mp_digit tmpx, *tmpy; + register int iy; + register mp_word *_W; + + /* work todo, that is we only calculate digits that are at "digs" or above */ + iy = digs - ix; + + /* copy of word on the left of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = b->dp + iy; + + /* alias for the columns of output. Offset to be equal to or above the + * smallest digit place requested + */ + _W = W + digs; + + /* skip cases below zero where ix > digs */ + if (iy < 0) { + iy = abs(iy); + tmpy += iy; + _W += iy; + iy = 0; + } + + /* compute column products for digits above the minimum */ + for (; iy < pb; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + } + + /* setup dest */ + oldused = c->used; + c->used = newused; + + /* now convert the array W downto what we need */ + for (ix = digs + 1; ix < newused; ix++) { + W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + c->dp[ix - 1] = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + c->dp[(pa + pb + 1) - 1] = (mp_digit) (W[(pa + pb + 1) - 1] & ((mp_word) MP_MASK)); + + for (; ix < oldused; ix++) { + c->dp[ix] = 0; + } + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_mul_high_digs.c */ + +/* Start: bn_fast_s_mp_sqr.c */ +#line 0 "bn_fast_s_mp_sqr.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* fast squaring + * + * This is the comba method where the columns of the product + * are computed first then the carries are computed. This + * has the effect of making a very simple inner loop that + * is executed the most + * + * W2 represents the outer products and W the inner. + * + * A further optimizations is made because the inner + * products are of the form "A * B * 2". The *2 part does + * not need to be computed until the end which is good + * because 64-bit shifts are slow! + * + * Based on Algorithm 14.16 on pp.597 of HAC. + * + */ +int +fast_s_mp_sqr (mp_int * a, mp_int * b) +{ + int olduse, newused, res, ix, pa; + mp_word W2[MP_WARRAY], W[MP_WARRAY]; + + /* calculate size of product and allocate as required */ + pa = a->used; + newused = pa + pa + 1; + if (b->alloc < newused) { + if ((res = mp_grow (b, newused)) != MP_OKAY) { + return res; + } + } + + /* zero temp buffer (columns) + * Note that there are two buffers. Since squaring requires + * a outter and inner product and the inner product requires + * computing a product and doubling it (a relatively expensive + * op to perform n**2 times if you don't have to) the inner and + * outer products are computed in different buffers. This way + * the inner product can be doubled using n doublings instead of + * n**2 + */ + memset (W, 0, newused * sizeof (mp_word)); + memset (W2, 0, newused * sizeof (mp_word)); + + /* This computes the inner product. To simplify the inner N**2 loop + * the multiplication by two is done afterwards in the N loop. + */ + for (ix = 0; ix < pa; ix++) { + /* compute the outer product + * + * Note that every outer product is computed + * for a particular column only once which means that + * there is no need todo a double precision addition + */ + W2[ix + ix] = ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); + + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy; + + /* copy of left side */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = a->dp + (ix + 1); + + /* the column to store the result in */ + _W = W + (ix + ix + 1); + + /* inner products */ + for (iy = ix + 1; iy < pa; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + } + + /* setup dest */ + olduse = b->used; + b->used = newused; + + /* now compute digits */ + { + register mp_digit *tmpb; + + /* double first value, since the inner products are + * half of what they should be + */ + W[0] += W[0] + W2[0]; + + tmpb = b->dp; + for (ix = 1; ix < newused; ix++) { + /* double/add next digit */ + W[ix] += W[ix] + W2[ix]; + + W[ix] = W[ix] + (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + *tmpb++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + /* set the last value. Note even if the carry is zero + * this is required since the next step will not zero + * it if b originally had a value at b->dp[2*a.used] + */ + *tmpb++ = (mp_digit) (W[(newused) - 1] & ((mp_word) MP_MASK)); + + /* clear high digits */ + for (; ix < olduse; ix++) { + *tmpb++ = 0; + } + } + + mp_clamp (b); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_sqr.c */ + +/* Start: bn_mp_2expt.c */ +#line 0 "bn_mp_2expt.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes a = 2**b + * + * Simple algorithm which zeroes the int, grows it then just sets one bit + * as required. + */ +int +mp_2expt (mp_int * a, int b) +{ + int res; + + mp_zero (a); + if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + a->used = b / DIGIT_BIT + 1; + a->dp[b / DIGIT_BIT] = 1 << (b % DIGIT_BIT); + + return MP_OKAY; +} + +/* End: bn_mp_2expt.c */ + +/* Start: bn_mp_abs.c */ +#line 0 "bn_mp_abs.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = |a| + * + * Simple function copies the input and fixes the sign to positive + */ +int +mp_abs (mp_int * a, mp_int * b) +{ + int res; + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + b->sign = MP_ZPOS; + return MP_OKAY; +} + +/* End: bn_mp_abs.c */ + +/* Start: bn_mp_add.c */ +#line 0 "bn_mp_add.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level addition (handles signs) */ +int +mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + /* get sign of both inputs */ + sa = a->sign; + sb = b->sign; + + /* handle two cases, not four */ + if (sa == sb) { + /* both positive or both negative */ + /* add their magnitudes, copy the sign */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* one positive, the other negative */ + /* subtract the one with the greater magnitude from */ + /* the one of the lesser magnitude. The result gets */ + /* the sign of the one with the greater magnitude. */ + if (mp_cmp_mag (a, b) == MP_LT) { + c->sign = sb; + res = s_mp_sub (b, a, c); + } else { + c->sign = sa; + res = s_mp_sub (a, b, c); + } + } + return res; +} + + +/* End: bn_mp_add.c */ + +/* Start: bn_mp_add_d.c */ +#line 0 "bn_mp_add_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit addition */ +int +mp_add_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t; + int res; + + if ((res = mp_init_size(&t, 1)) != MP_OKAY) { + return res; + } + mp_set (&t, b); + res = mp_add (a, &t, c); + + mp_clear (&t); + return res; +} + +/* End: bn_mp_add_d.c */ + +/* Start: bn_mp_addmod.c */ +#line 0 "bn_mp_addmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a + b (mod c) */ +int +mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_add (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_addmod.c */ + +/* Start: bn_mp_and.c */ +#line 0 "bn_mp_and.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* AND two ints together */ +int +mp_and (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] &= x->dp[ix]; + } + + /* zero digits above the last from the smallest mp_int */ + for (; ix < t.used; ix++) { + t.dp[ix] = 0; + } + + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_and.c */ + +/* Start: bn_mp_clamp.c */ +#line 0 "bn_mp_clamp.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* trim unused digits + * + * This is used to ensure that leading zero digits are + * trimed and the leading "used" digit will be non-zero + * Typically very fast. Also fixes the sign if there + * are no more leading digits + */ +void +mp_clamp (mp_int * a) +{ + while (a->used > 0 && a->dp[a->used - 1] == 0) { + --(a->used); + } + if (a->used == 0) { + a->sign = MP_ZPOS; + } +} + +/* End: bn_mp_clamp.c */ + +/* Start: bn_mp_clear.c */ +#line 0 "bn_mp_clear.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* clear one (frees) */ +void +mp_clear (mp_int * a) +{ + if (a->dp != NULL) { + + /* first zero the digits */ + memset (a->dp, 0, sizeof (mp_digit) * a->used); + + /* free ram */ + free (a->dp); + + /* reset members to make debugging easier */ + a->dp = NULL; + a->alloc = a->used = 0; + } +} + +/* End: bn_mp_clear.c */ + +/* Start: bn_mp_cmp.c */ +#line 0 "bn_mp_cmp.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare two ints (signed)*/ +int +mp_cmp (mp_int * a, mp_int * b) +{ + /* compare based on sign */ + if (a->sign == MP_NEG && b->sign == MP_ZPOS) { + return MP_LT; + } + + if (a->sign == MP_ZPOS && b->sign == MP_NEG) { + return MP_GT; + } + + /* compare digits */ + if (a->sign == MP_NEG) { + /* if negative compare opposite direction */ + return mp_cmp_mag(b, a); + } else { + return mp_cmp_mag(a, b); + } +} + +/* End: bn_mp_cmp.c */ + +/* Start: bn_mp_cmp_d.c */ +#line 0 "bn_mp_cmp_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare a digit */ +int +mp_cmp_d (mp_int * a, mp_digit b) +{ + + if (a->sign == MP_NEG) { + return MP_LT; + } + + if (a->used > 1) { + return MP_GT; + } + + if (a->dp[0] > b) { + return MP_GT; + } else if (a->dp[0] < b) { + return MP_LT; + } else { + return MP_EQ; + } +} + +/* End: bn_mp_cmp_d.c */ + +/* Start: bn_mp_cmp_mag.c */ +#line 0 "bn_mp_cmp_mag.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare maginitude of two ints (unsigned) */ +int +mp_cmp_mag (mp_int * a, mp_int * b) +{ + int n; + + /* compare based on # of non-zero digits */ + if (a->used > b->used) { + return MP_GT; + } + + if (a->used < b->used) { + return MP_LT; + } + + /* compare based on digits */ + for (n = a->used - 1; n >= 0; n--) { + if (a->dp[n] > b->dp[n]) { + return MP_GT; + } + + if (a->dp[n] < b->dp[n]) { + return MP_LT; + } + } + return MP_EQ; +} + +/* End: bn_mp_cmp_mag.c */ + +/* Start: bn_mp_copy.c */ +#line 0 "bn_mp_copy.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* copy, b = a */ +int +mp_copy (mp_int * a, mp_int * b) +{ + int res, n; + + /* if dst == src do nothing */ + if (a == b) { + return MP_OKAY; + } + + /* grow dest */ + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + + /* zero b and copy the parameters over */ + { + register mp_digit *tmpa, *tmpb; + + /* pointer aliases */ + tmpa = a->dp; + tmpb = b->dp; + + /* copy all the digits */ + for (n = 0; n < a->used; n++) { + *tmpb++ = *tmpa++; + } + + /* clear high digits */ + for (; n < b->used; n++) { + *tmpb++ = 0; + } + } + b->used = a->used; + b->sign = a->sign; + return MP_OKAY; +} + +/* End: bn_mp_copy.c */ + +/* Start: bn_mp_count_bits.c */ +#line 0 "bn_mp_count_bits.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* returns the number of bits in an int */ +int +mp_count_bits (mp_int * a) +{ + int r; + mp_digit q; + + /* shortcut */ + if (a->used == 0) { + return 0; + } + + /* get number of digits and add that */ + r = (a->used - 1) * DIGIT_BIT; + + /* take the last digit and count the bits in it */ + q = a->dp[a->used - 1]; + while (q > ((mp_digit) 0)) { + ++r; + q >>= ((mp_digit) 1); + } + return r; +} + +/* End: bn_mp_count_bits.c */ + +/* Start: bn_mp_div.c */ +#line 0 "bn_mp_div.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* integer signed division. c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly incomplete. For example, + * it doesn't consider the case where digits are removed from 'x' in the inner + * loop. It also doesn't consider the case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as 14.20 from HAC but fixed to treat these cases. +*/ +int +mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int q, x, y, t1, t2; + int res, n, t, i, norm, neg; + + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { + return res; + } + q.used = a->used + 2; + + if ((res = mp_init (&t1)) != MP_OKAY) { + goto __Q; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto __T1; + } + + if ((res = mp_init_copy (&x, a)) != MP_OKAY) { + goto __T2; + } + + if ((res = mp_init_copy (&y, b)) != MP_OKAY) { + goto __X; + } + + /* fix the sign */ + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + x.sign = y.sign = MP_ZPOS; + + /* normalize both x and y, ensure that y >= b/2, [b == 2^DIGIT_BIT] */ + norm = mp_count_bits(&y) % DIGIT_BIT; + if (norm < (int)(DIGIT_BIT-1)) { + norm = (DIGIT_BIT-1) - norm; + if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { + goto __Y; + } + if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { + goto __Y; + } + } else { + norm = 0; + } + + /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ + n = x.used - 1; + t = y.used - 1; + + /* step 2. while (x >= y*b^n-t) do { q[n-t] += 1; x -= y*b^{n-t} } */ + if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b^{n-t} */ + goto __Y; + } + + while (mp_cmp (&x, &y) != MP_LT) { + ++(q.dp[n - t]); + if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { + goto __Y; + } + } + + /* reset y by shifting it back down */ + mp_rshd (&y, n - t); + + /* step 3. for i from n down to (t + 1) */ + for (i = n; i >= (t + 1); i--) { + if (i > x.used) + continue; + + /* step 3.1 if xi == yt then set q{i-t-1} to b-1, otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ + if (x.dp[i] == y.dp[t]) { + q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); + } else { + mp_word tmp; + tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); + tmp |= ((mp_word) x.dp[i - 1]); + tmp /= ((mp_word) y.dp[t]); + if (tmp > (mp_word) MP_MASK) + tmp = MP_MASK; + q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); + } + + /* step 3.2 while (q{i-t-1} * (yt * b + y{t-1})) > xi * b^2 + xi-1 * b + xi-2 do q{i-t-1} -= 1; */ + q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; + do { + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; + + /* find left hand */ + mp_zero (&t1); + t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; + t1.dp[1] = y.dp[t]; + t1.used = 2; + if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto __Y; + } + + /* find right hand */ + t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; + t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; + t2.dp[2] = x.dp[i]; + t2.used = 3; + } while (mp_cmp_mag(&t1, &t2) == MP_GT); + + /* step 3.3 x = x - q{i-t-1} * y * b^{i-t-1} */ + if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto __Y; + } + + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto __Y; + } + + if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { + goto __Y; + } + + /* step 3.4 if x < 0 then { x = x + y*b^{i-t-1}; q{i-t-1} -= 1; } */ + if (x.sign == MP_NEG) { + if ((res = mp_copy (&y, &t1)) != MP_OKAY) { + goto __Y; + } + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto __Y; + } + if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { + goto __Y; + } + + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; + } + } + + /* now q is the quotient and x is the remainder [which we have to normalize] */ + /* get sign before writing to c */ + x.sign = a->sign; + + if (c != NULL) { + mp_clamp (&q); + mp_exch (&q, c); + c->sign = neg; + } + + if (d != NULL) { + mp_div_2d (&x, norm, &x, NULL); + mp_exch (&x, d); + } + + res = MP_OKAY; + +__Y:mp_clear (&y); +__X:mp_clear (&x); +__T2:mp_clear (&t2); +__T1:mp_clear (&t1); +__Q:mp_clear (&q); + return res; +} + +/* End: bn_mp_div.c */ + +/* Start: bn_mp_div_2.c */ +#line 0 "bn_mp_div_2.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = a/2 */ +int +mp_div_2 (mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* copy */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* source alias */ + tmpa = a->dp + b->used - 1; + + /* dest alias */ + tmpb = b->dp + b->used - 1; + + /* carry */ + r = 0; + for (x = b->used - 1; x >= 0; x--) { + /* get the carry for the next iteration */ + rr = *tmpa & 1; + + /* shift the current digit, add in carry and store */ + *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); + + /* forward carry to next iteration */ + r = rr; + } + + /* zero excess digits */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + mp_clamp (b); + return MP_OKAY; +} + +/* End: bn_mp_div_2.c */ + +/* Start: bn_mp_div_2d.c */ +#line 0 "bn_mp_div_2d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift right by a certain bit count (store quotient in c, optional remainder in d) */ +int +mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) +{ + mp_digit D, r, rr; + int x, res; + mp_int t; + + + /* if the shift count is <= 0 then we do no work */ + if (b <= 0) { + res = mp_copy (a, c); + if (d != NULL) { + mp_zero (d); + } + return res; + } + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + /* get the remainder */ + if (d != NULL) { + if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + mp_rshd (c, b / DIGIT_BIT); + } + + /* shift any bit count < DIGIT_BIT */ + D = (mp_digit) (b % DIGIT_BIT); + if (D != 0) { + register mp_digit *tmpc, mask; + + /* mask */ + mask = (((mp_digit)1) << D) - 1; + + /* alias */ + tmpc = c->dp + (c->used - 1); + + /* carry */ + r = 0; + for (x = c->used - 1; x >= 0; x--) { + /* get the lower bits of this word in a temp */ + rr = *tmpc & mask; + + /* shift the current word and mix in the carry bits from the previous word */ + *tmpc = (*tmpc >> D) | (r << (DIGIT_BIT - D)); + --tmpc; + + /* set the carry to the carry bits of the current word found above */ + r = rr; + } + } + mp_clamp (c); + if (d != NULL) { + mp_exch (&t, d); + } + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_div_2d.c */ + +/* Start: bn_mp_div_3.c */ +#line 0 "bn_mp_div_3.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -1669,80 +1669,80 @@ mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) return res; } - -/* End: bn_mp_div_3.c */ - -/* Start: bn_mp_div_d.c */ -#line 0 "bn_mp_div_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* single digit division (based on routine from MPI) */ -int -mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) -{ - mp_int q; - mp_word w, t; - int res, ix; - - if (b == 0) { - return MP_VAL; - } - - if (b == 3) { - return mp_div_3(a, c, d); - } - - if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { - return res; - } - - q.used = a->used; - q.sign = a->sign; - w = 0; - for (ix = a->used - 1; ix >= 0; ix--) { - w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); - - if (w >= b) { - t = w / b; - w = w % b; - } else { - t = 0; - } - q.dp[ix] = t; - } - - if (d != NULL) { - *d = w; - } - - if (c != NULL) { - mp_clamp(&q); - mp_exch(&q, c); - } - mp_clear(&q); - - return res; -} - - -/* End: bn_mp_div_d.c */ - -/* Start: bn_mp_dr_is_modulus.c */ -#line 0 "bn_mp_dr_is_modulus.c" + +/* End: bn_mp_div_3.c */ + +/* Start: bn_mp_div_d.c */ +#line 0 "bn_mp_div_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit division (based on routine from MPI) */ +int +mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) +{ + mp_int q; + mp_word w, t; + int res, ix; + + if (b == 0) { + return MP_VAL; + } + + if (b == 3) { + return mp_div_3(a, c, d); + } + + if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { + return res; + } + + q.used = a->used; + q.sign = a->sign; + w = 0; + for (ix = a->used - 1; ix >= 0; ix--) { + w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); + + if (w >= b) { + t = w / b; + w = w % b; + } else { + t = 0; + } + q.dp[ix] = t; + } + + if (d != NULL) { + *d = w; + } + + if (c != NULL) { + mp_clamp(&q); + mp_exch(&q, c); + } + mp_clear(&q); + + return res; +} + + +/* End: bn_mp_div_d.c */ + +/* Start: bn_mp_dr_is_modulus.c */ +#line 0 "bn_mp_dr_is_modulus.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -1777,102 +1777,102 @@ int mp_dr_is_modulus(mp_int *a) return 1; } - -/* End: bn_mp_dr_is_modulus.c */ - -/* Start: bn_mp_dr_reduce.c */ -#line 0 "bn_mp_dr_reduce.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* reduce "x" in place modulo "n" using the Diminished Radix algorithm. - * - * Based on algorithm from the paper - * - * "Generating Efficient Primes for Discrete Log Cryptosystems" - * Chae Hoon Lim, Pil Loong Lee, - * POSTECH Information Research Laboratories - * - * The modulus must be of a special format [see manual] - * - * Has been modified to use algorithm 7.10 from the LTM book instead - */ -int -mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k) -{ - int err, i, m; - mp_word r; - mp_digit mu, *tmpx1, *tmpx2; - - /* m = digits in modulus */ - m = n->used; - - /* ensure that "x" has at least 2m digits */ - if (x->alloc < m + m) { - if ((err = mp_grow (x, m + m)) != MP_OKAY) { - return err; - } - } - -/* top of loop, this is where the code resumes if - * another reduction pass is required. - */ -top: - /* aliases for digits */ - /* alias for lower half of x */ - tmpx1 = x->dp; - - /* alias for upper half of x, or x/B**m */ - tmpx2 = x->dp + m; - - /* set carry to zero */ - mu = 0; - - /* compute (x mod B**m) + mp * [x/B**m] inline and inplace */ - for (i = 0; i < m; i++) { - r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; - *tmpx1++ = r & MP_MASK; - mu = r >> ((mp_word)DIGIT_BIT); - } - - /* set final carry */ - *tmpx1++ = mu; - - /* zero words above m */ - for (i = m + 1; i < x->used; i++) { - *tmpx1++ = 0; - } - - /* clamp, sub and return */ - mp_clamp (x); - - /* if x >= n then subtract and reduce again - * Each successive "recursion" makes the input smaller and smaller. - */ - if (mp_cmp_mag (x, n) != MP_LT) { - s_mp_sub(x, n, x); - goto top; - } - return MP_OKAY; -} - -/* End: bn_mp_dr_reduce.c */ - -/* Start: bn_mp_dr_setup.c */ -#line 0 "bn_mp_dr_setup.c" + +/* End: bn_mp_dr_is_modulus.c */ + +/* Start: bn_mp_dr_reduce.c */ +#line 0 "bn_mp_dr_reduce.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reduce "x" in place modulo "n" using the Diminished Radix algorithm. + * + * Based on algorithm from the paper + * + * "Generating Efficient Primes for Discrete Log Cryptosystems" + * Chae Hoon Lim, Pil Loong Lee, + * POSTECH Information Research Laboratories + * + * The modulus must be of a special format [see manual] + * + * Has been modified to use algorithm 7.10 from the LTM book instead + */ +int +mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k) +{ + int err, i, m; + mp_word r; + mp_digit mu, *tmpx1, *tmpx2; + + /* m = digits in modulus */ + m = n->used; + + /* ensure that "x" has at least 2m digits */ + if (x->alloc < m + m) { + if ((err = mp_grow (x, m + m)) != MP_OKAY) { + return err; + } + } + +/* top of loop, this is where the code resumes if + * another reduction pass is required. + */ +top: + /* aliases for digits */ + /* alias for lower half of x */ + tmpx1 = x->dp; + + /* alias for upper half of x, or x/B**m */ + tmpx2 = x->dp + m; + + /* set carry to zero */ + mu = 0; + + /* compute (x mod B**m) + mp * [x/B**m] inline and inplace */ + for (i = 0; i < m; i++) { + r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; + *tmpx1++ = r & MP_MASK; + mu = r >> ((mp_word)DIGIT_BIT); + } + + /* set final carry */ + *tmpx1++ = mu; + + /* zero words above m */ + for (i = m + 1; i < x->used; i++) { + *tmpx1++ = 0; + } + + /* clamp, sub and return */ + mp_clamp (x); + + /* if x >= n then subtract and reduce again + * Each successive "recursion" makes the input smaller and smaller. + */ + if (mp_cmp_mag (x, n) != MP_LT) { + s_mp_sub(x, n, x); + goto top; + } + return MP_OKAY; +} + +/* End: bn_mp_dr_reduce.c */ + +/* Start: bn_mp_dr_setup.c */ +#line 0 "bn_mp_dr_setup.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -1899,2940 +1899,2944 @@ void mp_dr_setup(mp_int *a, mp_digit *d) ((mp_word)a->dp[0])); } - -/* End: bn_mp_dr_setup.c */ - -/* Start: bn_mp_exch.c */ -#line 0 "bn_mp_exch.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* swap the elements of two integers, for cases where you can't simply swap the - * mp_int pointers around - */ -void -mp_exch (mp_int * a, mp_int * b) -{ - mp_int t; - - t = *a; - *a = *b; - *b = t; -} - -/* End: bn_mp_exch.c */ - -/* Start: bn_mp_expt_d.c */ -#line 0 "bn_mp_expt_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* calculate c = a**b using a square-multiply algorithm */ -int -mp_expt_d (mp_int * a, mp_digit b, mp_int * c) -{ - int res, x; - mp_int g; - - if ((res = mp_init_copy (&g, a)) != MP_OKAY) { - return res; - } - - /* set initial result */ - mp_set (c, 1); - - for (x = 0; x < (int) DIGIT_BIT; x++) { - /* square */ - if ((res = mp_sqr (c, c)) != MP_OKAY) { - mp_clear (&g); - return res; - } - - /* if the bit is set multiply */ - if ((b & (mp_digit) (((mp_digit)1) << (DIGIT_BIT - 1))) != 0) { - if ((res = mp_mul (c, &g, c)) != MP_OKAY) { - mp_clear (&g); - return res; - } - } - - /* shift to next bit */ - b <<= 1; - } - - mp_clear (&g); - return MP_OKAY; -} - -/* End: bn_mp_expt_d.c */ - -/* Start: bn_mp_exptmod.c */ -#line 0 "bn_mp_exptmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - - -/* this is a shell function that calls either the normal or Montgomery - * exptmod functions. Originally the call to the montgomery code was - * embedded in the normal function but that wasted alot of stack space - * for nothing (since 99% of the time the Montgomery code would be called) - */ -int -mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) -{ - int dr; - - /* modulus P must be positive */ - if (P->sign == MP_NEG) { - return MP_VAL; - } - - /* if exponent X is negative we have to recurse */ - if (X->sign == MP_NEG) { - mp_int tmpG, tmpX; - int err; - - /* first compute 1/G mod P */ - if ((err = mp_init(&tmpG)) != MP_OKAY) { - return err; - } - if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { - mp_clear(&tmpG); - return err; - } - - /* now get |X| */ - if ((err = mp_init(&tmpX)) != MP_OKAY) { - mp_clear(&tmpG); - return err; - } - if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { - mp_clear_multi(&tmpG, &tmpX, NULL); - return err; - } - - /* and now compute (1/G)**|X| instead of G**X [X < 0] */ - err = mp_exptmod(&tmpG, &tmpX, P, Y); - mp_clear_multi(&tmpG, &tmpX, NULL); - return err; - } - - dr = mp_dr_is_modulus(P); - if (dr == 0) { - dr = mp_reduce_is_2k(P) << 1; - } - - /* if the modulus is odd use the fast method */ - if ((mp_isodd (P) == 1 || dr != 0) && P->used > 4) { - return mp_exptmod_fast (G, X, P, Y, dr); - } else { - return s_mp_exptmod (G, X, P, Y); - } -} - - -/* End: bn_mp_exptmod.c */ - -/* Start: bn_mp_exptmod_fast.c */ -#line 0 "bn_mp_exptmod_fast.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes Y == G^X mod P, HAC pp.616, Algorithm 14.85 - * - * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. - * The value of k changes based on the size of the exponent. - * - * Uses Montgomery or Diminished Radix reduction [whichever appropriate] - */ -int -mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) -{ - mp_int M[256], res; - mp_digit buf, mp; - int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; - - /* use a pointer to the reduction algorithm. This allows us to use - * one of many reduction algorithms without modding the guts of - * the code with if statements everywhere. - */ - int (*redux)(mp_int*,mp_int*,mp_digit); - - /* find window size */ - x = mp_count_bits (X); - if (x <= 7) { - winsize = 2; - } else if (x <= 36) { - winsize = 3; - } else if (x <= 140) { - winsize = 4; - } else if (x <= 450) { - winsize = 5; - } else if (x <= 1303) { - winsize = 6; - } else if (x <= 3529) { - winsize = 7; - } else { - winsize = 8; - } - -#ifdef MP_LOW_MEM - if (winsize > 5) { - winsize = 5; - } -#endif - - - /* init G array */ - for (x = 0; x < (1 << winsize); x++) { - if ((err = mp_init (&M[x])) != MP_OKAY) { - for (y = 0; y < x; y++) { - mp_clear (&M[y]); - } - return err; - } - } - - /* determine and setup reduction code */ - if (redmode == 0) { - /* now setup montgomery */ - if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { - goto __M; - } - - /* automatically pick the comba one if available (saves quite a few calls/ifs) */ - if (((P->used * 2 + 1) < MP_WARRAY) && - P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { - redux = fast_mp_montgomery_reduce; - } else { - /* use slower baselien method */ - redux = mp_montgomery_reduce; - } - } else if (redmode == 1) { - /* setup DR reduction */ - mp_dr_setup(P, &mp); - redux = mp_dr_reduce; - } else { - /* setup 2k reduction */ - if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { - goto __M; - } - redux = mp_reduce_2k; - } - - /* setup result */ - if ((err = mp_init (&res)) != MP_OKAY) { - goto __RES; - } - - /* create M table - * - * The M table contains powers of the input base, e.g. M[x] = G^x mod P - * - * The first half of the table is not computed though accept for M[0] and M[1] - */ - - if (redmode == 0) { - /* now we need R mod m */ - if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { - goto __RES; - } - - /* now set M[1] to G * R mod m */ - if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { - goto __RES; - } - } else { - mp_set(&res, 1); - if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { - goto __RES; - } - } - - /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ - if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __RES; - } - - for (x = 0; x < (winsize - 1); x++) { - if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { - goto __RES; - } - } - - /* create upper table */ - for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { - if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&M[x], P, mp)) != MP_OKAY) { - goto __RES; - } - } - - /* set initial mode and bit cnt */ - mode = 0; - bitcnt = 1; - buf = 0; - digidx = X->used - 1; - bitcpy = 0; - bitbuf = 0; - - for (;;) { - /* grab next digit as required */ - if (--bitcnt == 0) { - if (digidx == -1) { - break; - } - buf = X->dp[digidx--]; - bitcnt = (int) DIGIT_BIT; - } - - /* grab the next msb from the exponent */ - y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; - buf <<= (mp_digit)1; - - /* if the bit is zero and mode == 0 then we ignore it - * These represent the leading zero bits before the first 1 bit - * in the exponent. Technically this opt is not required but it - * does lower the # of trivial squaring/reductions used - */ - if (mode == 0 && y == 0) { - continue; - } - - /* if the bit is zero and mode == 1 then we square */ - if (mode == 1 && y == 0) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - continue; - } - - /* else we add it to the window */ - bitbuf |= (y << (winsize - ++bitcpy)); - mode = 2; - - if (bitcpy == winsize) { - /* ok window is filled so square as required and multiply */ - /* square first */ - for (x = 0; x < winsize; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - } - - /* then multiply */ - if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - - /* empty window and reset */ - bitcpy = 0; - bitbuf = 0; - mode = 1; - } - } - - /* if bits remain then square/multiply */ - if (mode == 2 && bitcpy > 0) { - /* square then multiply if the bit is set */ - for (x = 0; x < bitcpy; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - - bitbuf <<= 1; - if ((bitbuf & (1 << winsize)) != 0) { - /* then multiply */ - if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; - } - if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - } - } - } - - if (redmode == 0) { - /* fixup result if Montgomery reduction is used */ - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { - goto __RES; - } - } - - mp_exch (&res, Y); - err = MP_OKAY; -__RES:mp_clear (&res); -__M: - for (x = 0; x < (1 << winsize); x++) { - mp_clear (&M[x]); - } - return err; -} - -/* End: bn_mp_exptmod_fast.c */ - -/* Start: bn_mp_gcd.c */ -#line 0 "bn_mp_gcd.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] - */ -int -mp_gcd (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int u, v, t; - int k, res, neg; - - /* either zero than gcd is the largest */ - if (mp_iszero (a) == 1 && mp_iszero (b) == 0) { - return mp_copy (b, c); - } - if (mp_iszero (a) == 0 && mp_iszero (b) == 1) { - return mp_copy (a, c); - } - if (mp_iszero (a) == 1 && mp_iszero (b) == 1) { - mp_set (c, 1); - return MP_OKAY; - } - - /* if both are negative they share (-1) as a common divisor */ - neg = (a->sign == b->sign) ? a->sign : MP_ZPOS; - - if ((res = mp_init_copy (&u, a)) != MP_OKAY) { - return res; - } - - if ((res = mp_init_copy (&v, b)) != MP_OKAY) { - goto __U; - } - - /* must be positive for the remainder of the algorithm */ - u.sign = v.sign = MP_ZPOS; - - if ((res = mp_init (&t)) != MP_OKAY) { - goto __V; - } - - /* B1. Find power of two */ - k = 0; - while (mp_iseven(&u) == 1 && mp_iseven(&v) == 1) { - ++k; - if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __T; - } - if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __T; - } - } - - /* B2. Initialize */ - if (mp_isodd(&u) == 1) { - /* t = -v */ - if ((res = mp_copy (&v, &t)) != MP_OKAY) { - goto __T; - } - t.sign = MP_NEG; - } else { - /* t = u */ - if ((res = mp_copy (&u, &t)) != MP_OKAY) { - goto __T; - } - } - - do { - /* B3 (and B4). Halve t, if even */ - while (t.used != 0 && mp_iseven(&t) == 1) { - if ((res = mp_div_2 (&t, &t)) != MP_OKAY) { - goto __T; - } - } - - /* B5. if t>0 then u=t otherwise v=-t */ - if (t.used != 0 && t.sign != MP_NEG) { - if ((res = mp_copy (&t, &u)) != MP_OKAY) { - goto __T; - } - } else { - if ((res = mp_copy (&t, &v)) != MP_OKAY) { - goto __T; - } - v.sign = (v.sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; - } - - /* B6. t = u - v, if t != 0 loop otherwise terminate */ - if ((res = mp_sub (&u, &v, &t)) != MP_OKAY) { - goto __T; - } - } while (mp_iszero(&t) == 0); - - /* multiply by 2^k which we divided out at the beginning */ - if ((res = mp_mul_2d (&u, k, &u)) != MP_OKAY) { - goto __T; - } - - mp_exch (&u, c); - c->sign = neg; - res = MP_OKAY; -__T:mp_clear (&t); -__V:mp_clear (&u); -__U:mp_clear (&v); - return res; -} - -/* End: bn_mp_gcd.c */ - -/* Start: bn_mp_grow.c */ -#line 0 "bn_mp_grow.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* grow as required */ -int -mp_grow (mp_int * a, int size) -{ - int i; - - /* if the alloc size is smaller alloc more ram */ - if (a->alloc < size) { - /* ensure there are always at least MP_PREC digits extra on top */ - size += (MP_PREC * 2) - (size & (MP_PREC - 1)); - - a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * size); - if (a->dp == NULL) { - return MP_MEM; - } - - /* zero excess digits */ - i = a->alloc; - a->alloc = size; - for (; i < a->alloc; i++) { - a->dp[i] = 0; - } - } - return MP_OKAY; -} - -/* End: bn_mp_grow.c */ - -/* Start: bn_mp_init.c */ -#line 0 "bn_mp_init.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* init a new bigint */ -int -mp_init (mp_int * a) -{ - /* allocate ram required and clear it */ - a->dp = OPT_CAST calloc (sizeof (mp_digit), MP_PREC); - if (a->dp == NULL) { - return MP_MEM; - } - - /* set the used to zero, allocated digits to the default precision - * and sign to positive */ - a->used = 0; - a->alloc = MP_PREC; - a->sign = MP_ZPOS; - - return MP_OKAY; -} - -/* End: bn_mp_init.c */ - -/* Start: bn_mp_init_copy.c */ -#line 0 "bn_mp_init_copy.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* creates "a" then copies b into it */ -int -mp_init_copy (mp_int * a, mp_int * b) -{ - int res; - - if ((res = mp_init (a)) != MP_OKAY) { - return res; - } - return mp_copy (b, a); -} - -/* End: bn_mp_init_copy.c */ - -/* Start: bn_mp_init_size.c */ -#line 0 "bn_mp_init_size.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* init a mp_init and grow it to a given size */ -int -mp_init_size (mp_int * a, int size) -{ - - /* pad size so there are always extra digits */ - size += (MP_PREC * 2) - (size & (MP_PREC - 1)); - - /* alloc mem */ - a->dp = OPT_CAST calloc (sizeof (mp_digit), size); - if (a->dp == NULL) { - return MP_MEM; - } - a->used = 0; - a->alloc = size; - a->sign = MP_ZPOS; - - return MP_OKAY; -} - -/* End: bn_mp_init_size.c */ - -/* Start: bn_mp_invmod.c */ -#line 0 "bn_mp_invmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -int -mp_invmod (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int x, y, u, v, A, B, C, D; - int res; - - /* b cannot be negative */ - if (b->sign == MP_NEG) { - return MP_VAL; - } - - /* if the modulus is odd we can use a faster routine instead */ - if (mp_iseven (b) == 0) { - return fast_mp_invmod (a, b, c); - } - - /* init temps */ - if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { - return res; - } - - /* x = a, y = b */ - if ((res = mp_copy (a, &x)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_copy (b, &y)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_abs (&x, &x)) != MP_OKAY) { - goto __ERR; - } - - /* 2. [modified] if x,y are both even then return an error! */ - if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { - res = MP_VAL; - goto __ERR; - } - - /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ - if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; - } - mp_set (&A, 1); - mp_set (&D, 1); - - -top: - /* 4. while u is even do */ - while (mp_iseven (&u) == 1) { - /* 4.1 u = u/2 */ - if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; - } - /* 4.2 if A or B is odd then */ - if (mp_iseven (&A) == 0 || mp_iseven (&B) == 0) { - /* A = (A+y)/2, B = (B-x)/2 */ - if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; - } - } - /* A = A/2, B = B/2 */ - if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; - } - } - - - /* 5. while v is even do */ - while (mp_iseven (&v) == 1) { - /* 5.1 v = v/2 */ - if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; - } - /* 5.2 if C,D are even then */ - if (mp_iseven (&C) == 0 || mp_iseven (&D) == 0) { - /* C = (C+y)/2, D = (D-x)/2 */ - if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; - } - } - /* C = C/2, D = D/2 */ - if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { - goto __ERR; - } - if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; - } - } - - /* 6. if u >= v then */ - if (mp_cmp (&u, &v) != MP_LT) { - /* u = u - v, A = A - C, B = B - D */ - if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; - } - } else { - /* v - v - u, C = C - A, D = D - B */ - if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { - goto __ERR; - } - - if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; - } - } - - /* if not zero goto step 4 */ - if (mp_iszero (&u) == 0) - goto top; - - /* now a = C, b = D, gcd == g*v */ - - /* if v != 1 then there is no inverse */ - if (mp_cmp_d (&v, 1) != MP_EQ) { - res = MP_VAL; - goto __ERR; - } - - /* a is now the inverse */ - mp_exch (&C, c); - res = MP_OKAY; - -__ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); - return res; -} - -/* End: bn_mp_invmod.c */ - -/* Start: bn_mp_jacobi.c */ -#line 0 "bn_mp_jacobi.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes the jacobi c = (a | n) (or Legendre if n is prime) - * HAC pp. 73 Algorithm 2.149 - */ -int -mp_jacobi (mp_int * a, mp_int * n, int *c) -{ - mp_int a1, n1, e; - int s, r, res; - mp_digit residue; - - /* step 1. if a == 0, return 0 */ - if (mp_iszero (a) == 1) { - *c = 0; - return MP_OKAY; - } - - /* step 2. if a == 1, return 1 */ - if (mp_cmp_d (a, 1) == MP_EQ) { - *c = 1; - return MP_OKAY; - } - - /* default */ - s = 0; - - /* step 3. write a = a1 * 2^e */ - if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { - return res; - } - - if ((res = mp_init (&n1)) != MP_OKAY) { - goto __A1; - } - - if ((res = mp_init (&e)) != MP_OKAY) { - goto __N1; - } - - while (mp_iseven (&a1) == 1) { - if ((res = mp_add_d (&e, 1, &e)) != MP_OKAY) { - goto __E; - } - - if ((res = mp_div_2 (&a1, &a1)) != MP_OKAY) { - goto __E; - } - } - - /* step 4. if e is even set s=1 */ - if (mp_iseven (&e) == 1) { - s = 1; - } else { - /* else set s=1 if n = 1/7 (mod 8) or s=-1 if n = 3/5 (mod 8) */ - if ((res = mp_mod_d (n, 8, &residue)) != MP_OKAY) { - goto __E; - } - - if (residue == 1 || residue == 7) { - s = 1; - } else if (residue == 3 || residue == 5) { - s = -1; - } - } - - /* step 5. if n == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ - if ((res = mp_mod_d (n, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - if ((res = mp_mod_d (&a1, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - s = -s; - } - } - - /* if a1 == 1 we're done */ - if (mp_cmp_d (&a1, 1) == MP_EQ) { - *c = s; - } else { - /* n1 = n mod a1 */ - if ((res = mp_mod (n, &a1, &n1)) != MP_OKAY) { - goto __E; - } - if ((res = mp_jacobi (&n1, &a1, &r)) != MP_OKAY) { - goto __E; - } - *c = s * r; - } - - /* done */ - res = MP_OKAY; -__E:mp_clear (&e); -__N1:mp_clear (&n1); -__A1:mp_clear (&a1); - return res; -} - -/* End: bn_mp_jacobi.c */ - -/* Start: bn_mp_karatsuba_mul.c */ -#line 0 "bn_mp_karatsuba_mul.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* c = |a| * |b| using Karatsuba Multiplication using - * three half size multiplications - * - * Let B represent the radix [e.g. 2**DIGIT_BIT] and - * let n represent half of the number of digits in - * the min(a,b) - * - * a = a1 * B**n + a0 - * b = b1 * B**n + b0 - * - * Then, a * b => - a1b1 * B**2n + ((a1 - a0)(b1 - b0) + a0b0 + a1b1) * B + a0b0 - * - * Note that a1b1 and a0b0 are used twice and only need to be - * computed once. So in total three half size (half # of - * digit) multiplications are performed, a0b0, a1b1 and - * (a1-b1)(a0-b0) - * - * Note that a multiplication of half the digits requires - * 1/4th the number of single precision multiplications so in - * total after one call 25% of the single precision multiplications - * are saved. Note also that the call to mp_mul can end up back - * in this function if the a0, a1, b0, or b1 are above the threshold. - * This is known as divide-and-conquer and leads to the famous - * O(N**lg(3)) or O(N**1.584) work which is asymptopically lower than - * the standard O(N**2) that the baseline/comba methods use. - * Generally though the overhead of this method doesn't pay off - * until a certain size (N ~ 80) is reached. - */ -int -mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int x0, x1, y0, y1, t1, x0y0, x1y1; - int B, err; - - err = MP_MEM; - - /* min # of digits */ - B = MIN (a->used, b->used); - - /* now divide in two */ - B = B / 2; - - /* init copy all the temps */ - if (mp_init_size (&x0, B) != MP_OKAY) - goto ERR; - if (mp_init_size (&x1, a->used - B) != MP_OKAY) - goto X0; - if (mp_init_size (&y0, B) != MP_OKAY) - goto X1; - if (mp_init_size (&y1, b->used - B) != MP_OKAY) - goto Y0; - - /* init temps */ - if (mp_init_size (&t1, B * 2) != MP_OKAY) - goto Y1; - if (mp_init_size (&x0y0, B * 2) != MP_OKAY) - goto T1; - if (mp_init_size (&x1y1, B * 2) != MP_OKAY) - goto X0Y0; - - /* now shift the digits */ - x0.sign = x1.sign = a->sign; - y0.sign = y1.sign = b->sign; - - x0.used = y0.used = B; - x1.used = a->used - B; - y1.used = b->used - B; - - { - register int x; - register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; - - /* we copy the digits directly instead of using higher level functions - * since we also need to shift the digits - */ - tmpa = a->dp; - tmpb = b->dp; - - tmpx = x0.dp; - tmpy = y0.dp; - for (x = 0; x < B; x++) { - *tmpx++ = *tmpa++; - *tmpy++ = *tmpb++; - } - - tmpx = x1.dp; - for (x = B; x < a->used; x++) { - *tmpx++ = *tmpa++; - } - - tmpy = y1.dp; - for (x = B; x < b->used; x++) { - *tmpy++ = *tmpb++; - } - } - - /* only need to clamp the lower words since by definition the - * upper words x1/y1 must have a known number of digits - */ - mp_clamp (&x0); - mp_clamp (&y0); - - /* now calc the products x0y0 and x1y1 */ - /* after this x0 is no longer required, free temp [x0==t2]! */ - if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) - goto X1Y1; /* x0y0 = x0*y0 */ - if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) - goto X1Y1; /* x1y1 = x1*y1 */ - - /* now calc x1-x0 and y1-y0 */ - if (mp_sub (&x1, &x0, &t1) != MP_OKAY) - goto X1Y1; /* t1 = x1 - x0 */ - if (mp_sub (&y1, &y0, &x0) != MP_OKAY) - goto X1Y1; /* t2 = y1 - y0 */ - if (mp_mul (&t1, &x0, &t1) != MP_OKAY) - goto X1Y1; /* t1 = (x1 - x0) * (y1 - y0) */ - - /* add x0y0 */ - if (mp_add (&x0y0, &x1y1, &x0) != MP_OKAY) - goto X1Y1; /* t2 = x0y0 + x1y1 */ - if (mp_sub (&x0, &t1, &t1) != MP_OKAY) - goto X1Y1; /* t1 = x0y0 + x1y1 - (x1-x0)*(y1-y0) */ - - /* shift by B */ - if (mp_lshd (&t1, B) != MP_OKAY) - goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< - -/* Karatsuba squaring, computes b = a*a using three - * half size squarings - * - * See comments of mp_karatsuba_mul for details. It - * is essentially the same algorithm but merely - * tuned to perform recursive squarings. - */ -int -mp_karatsuba_sqr (mp_int * a, mp_int * b) -{ - mp_int x0, x1, t1, t2, x0x0, x1x1; - int B, err; - - err = MP_MEM; - - /* min # of digits */ - B = a->used; - - /* now divide in two */ - B = B / 2; - - /* init copy all the temps */ - if (mp_init_size (&x0, B) != MP_OKAY) - goto ERR; - if (mp_init_size (&x1, a->used - B) != MP_OKAY) - goto X0; - - /* init temps */ - if (mp_init_size (&t1, a->used * 2) != MP_OKAY) - goto X1; - if (mp_init_size (&t2, a->used * 2) != MP_OKAY) - goto T1; - if (mp_init_size (&x0x0, B * 2) != MP_OKAY) - goto T2; - if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) - goto X0X0; - - { - register int x; - register mp_digit *dst, *src; - - src = a->dp; - - /* now shift the digits */ - dst = x0.dp; - for (x = 0; x < B; x++) { - *dst++ = *src++; - } - - dst = x1.dp; - for (x = B; x < a->used; x++) { - *dst++ = *src++; - } - } - - x0.used = B; - x1.used = a->used - B; - - mp_clamp (&x0); - - /* now calc the products x0*x0 and x1*x1 */ - if (mp_sqr (&x0, &x0x0) != MP_OKAY) - goto X1X1; /* x0x0 = x0*x0 */ - if (mp_sqr (&x1, &x1x1) != MP_OKAY) - goto X1X1; /* x1x1 = x1*x1 */ - - /* now calc (x1-x0)**2 */ - if (mp_sub (&x1, &x0, &t1) != MP_OKAY) - goto X1X1; /* t1 = x1 - x0 */ - if (mp_sqr (&t1, &t1) != MP_OKAY) - goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ - - /* add x0y0 */ - if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) - goto X1X1; /* t2 = x0x0 + x1x1 */ - if (mp_sub (&t2, &t1, &t1) != MP_OKAY) - goto X1X1; /* t1 = x0x0 + x1x1 - (x1-x0)*(x1-x0) */ - - /* shift by B */ - if (mp_lshd (&t1, B) != MP_OKAY) - goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))< - -/* computes least common multiple as a*b/(a, b) */ -int -mp_lcm (mp_int * a, mp_int * b, mp_int * c) -{ - int res; - mp_int t; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_mul (a, b, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - - if ((res = mp_gcd (a, b, c)) != MP_OKAY) { - mp_clear (&t); - return res; - } - - res = mp_div (&t, c, c, NULL); - mp_clear (&t); - return res; -} - -/* End: bn_mp_lcm.c */ - -/* Start: bn_mp_lshd.c */ -#line 0 "bn_mp_lshd.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* shift left a certain amount of digits */ -int -mp_lshd (mp_int * a, int b) -{ - int x, res; - - /* if its less than zero return */ - if (b <= 0) { - return MP_OKAY; - } - - /* grow to fit the new digits */ - if (a->alloc < a->used + b) { - if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { - return res; - } - } - - { - register mp_digit *top, *bottom; - - /* increment the used by the shift amount then copy upwards */ - a->used += b; - - /* top */ - top = a->dp + a->used - 1; - - /* base */ - bottom = a->dp + a->used - 1 - b; - - /* much like mp_rshd this is implemented using a sliding window - * except the window goes the otherway around. Copying from - * the bottom to the top. see bn_mp_rshd.c for more info. - */ - for (x = a->used - 1; x >= b; x--) { - *top-- = *bottom--; - } - - /* zero the lower digits */ - top = a->dp; - for (x = 0; x < b; x++) { - *top++ = 0; - } - } - return MP_OKAY; -} - -/* End: bn_mp_lshd.c */ - -/* Start: bn_mp_mod.c */ -#line 0 "bn_mp_mod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* c = a mod b, 0 <= c < b */ -int -mp_mod (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int t; - int res; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - - if (t.sign == MP_NEG) { - res = mp_add (b, &t, c); - } else { - res = MP_OKAY; - mp_exch (&t, c); - } - - mp_clear (&t); - return res; -} - -/* End: bn_mp_mod.c */ - -/* Start: bn_mp_mod_2d.c */ -#line 0 "bn_mp_mod_2d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* calc a value mod 2^b */ -int -mp_mod_2d (mp_int * a, int b, mp_int * c) -{ - int x, res; - - - /* if b is <= 0 then zero the int */ - if (b <= 0) { - mp_zero (c); - return MP_OKAY; - } - - /* if the modulus is larger than the value than return */ - if (b > (int) (a->used * DIGIT_BIT)) { - res = mp_copy (a, c); - return res; - } - - /* copy */ - if ((res = mp_copy (a, c)) != MP_OKAY) { - return res; - } - - /* zero digits above the last digit of the modulus */ - for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { - c->dp[x] = 0; - } - /* clear the digit that is not completely outside/inside the modulus */ - c->dp[b / DIGIT_BIT] &= - (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_mp_mod_2d.c */ - -/* Start: bn_mp_mod_d.c */ -#line 0 "bn_mp_mod_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -int -mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) -{ - return mp_div_d(a, b, NULL, c); -} - -/* End: bn_mp_mod_d.c */ - -/* Start: bn_mp_montgomery_calc_normalization.c */ -#line 0 "bn_mp_montgomery_calc_normalization.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* calculates a = B^n mod b for Montgomery reduction - * Where B is the base [e.g. 2^DIGIT_BIT]. - * B^n mod b is computed by first computing - * A = B^(n-1) which doesn't require a reduction but a simple OR. - * then C = A * B = B^n is computed by performing upto DIGIT_BIT - * shifts with subtractions when the result is greater than b. - * - * The method is slightly modified to shift B unconditionally upto just under - * the leading bit of b. This saves alot of multiple precision shifting. - */ -int -mp_montgomery_calc_normalization (mp_int * a, mp_int * b) -{ - int x, bits, res; - - /* how many bits of last digit does b use */ - bits = mp_count_bits (b) % DIGIT_BIT; - - /* compute A = B^(n-1) * 2^(bits-1) */ - if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { - return res; - } - - /* now compute C = A * B mod b */ - for (x = bits - 1; x < (int)DIGIT_BIT; x++) { - if ((res = mp_mul_2 (a, a)) != MP_OKAY) { - return res; - } - if (mp_cmp_mag (a, b) != MP_LT) { - if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { - return res; - } - } - } - - return MP_OKAY; -} - -/* End: bn_mp_montgomery_calc_normalization.c */ - -/* Start: bn_mp_montgomery_reduce.c */ -#line 0 "bn_mp_montgomery_reduce.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes xR**-1 == x (mod N) via Montgomery Reduction */ -int -mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) -{ - int ix, res, digs; - mp_digit mu; - - /* can the fast reduction [comba] method be used? - * - * Note that unlike in mp_mul you're safely allowed *less* - * than the available columns [255 per default] since carries - * are fixed up in the inner loop. - */ - digs = n->used * 2 + 1; - if ((digs < MP_WARRAY) && - n->used < - (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { - return fast_mp_montgomery_reduce (x, n, rho); - } - - /* grow the input as required */ - if (x->alloc < digs) { - if ((res = mp_grow (x, digs)) != MP_OKAY) { - return res; - } - } - x->used = digs; - - for (ix = 0; ix < n->used; ix++) { - /* mu = ai * m' mod b */ - mu = (x->dp[ix] * rho) & MP_MASK; - - /* a = a + mu * m * b**i */ - { - register int iy; - register mp_digit *tmpn, *tmpx, u; - register mp_word r; - - /* aliases */ - tmpn = n->dp; - tmpx = x->dp + ix; - - /* set the carry to zero */ - u = 0; - - /* Multiply and add in place */ - for (iy = 0; iy < n->used; iy++) { - r = ((mp_word) mu) * ((mp_word) * tmpn++) + - ((mp_word) u) + ((mp_word) * tmpx); - u = (r >> ((mp_word) DIGIT_BIT)); - *tmpx++ = (r & ((mp_word) MP_MASK)); - } - /* propagate carries */ - while (u) { - *tmpx += u; - u = *tmpx >> DIGIT_BIT; - *tmpx++ &= MP_MASK; - } - } - } - - /* x = x/b**n.used */ - mp_rshd (x, n->used); - - /* if A >= m then A = A - m */ - if (mp_cmp_mag (x, n) != MP_LT) { - return s_mp_sub (x, n, x); - } - - return MP_OKAY; -} - -/* End: bn_mp_montgomery_reduce.c */ - -/* Start: bn_mp_montgomery_setup.c */ -#line 0 "bn_mp_montgomery_setup.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* setups the montgomery reduction stuff */ -int -mp_montgomery_setup (mp_int * n, mp_digit * rho) -{ - mp_digit x, b; - -/* fast inversion mod 2**k - * - * Based on the fact that - * - * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) - * => 2*X*A - X*X*A*A = 1 - * => 2*(1) - (1) = 1 - */ - b = n->dp[0]; - - if ((b & 1) == 0) { - return MP_VAL; - } - - x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ - x *= 2 - b * x; /* here x*a==1 mod 2**8 */ -#if !defined(MP_8BIT) - x *= 2 - b * x; /* here x*a==1 mod 2**16 */ -#endif -#if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) - x *= 2 - b * x; /* here x*a==1 mod 2**32 */ -#endif -#ifdef MP_64BIT - x *= 2 - b * x; /* here x*a==1 mod 2**64 */ -#endif - - /* rho = -1/m mod b */ - *rho = (((mp_digit) 1 << ((mp_digit) DIGIT_BIT)) - x) & MP_MASK; - - return MP_OKAY; -} - -/* End: bn_mp_montgomery_setup.c */ - -/* Start: bn_mp_mul.c */ -#line 0 "bn_mp_mul.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* high level multiplication (handles sign) */ -int -mp_mul (mp_int * a, mp_int * b, mp_int * c) -{ - int res, neg; - neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; - - if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { - res = mp_toom_mul(a, b, c); - } else if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { - res = mp_karatsuba_mul (a, b, c); - } else { - - /* can we use the fast multiplier? - * - * The fast multiplier can be used if the output will - * have less than MP_WARRAY digits and the number of - * digits won't affect carry propagation - */ - int digs = a->used + b->used + 1; - - if ((digs < MP_WARRAY) && - MIN(a->used, b->used) <= - (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { - res = fast_s_mp_mul_digs (a, b, c, digs); - } else { - res = s_mp_mul (a, b, c); - } - - } - c->sign = neg; - return res; -} - -/* End: bn_mp_mul.c */ - -/* Start: bn_mp_mul_2.c */ -#line 0 "bn_mp_mul_2.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* b = a*2 */ -int -mp_mul_2 (mp_int * a, mp_int * b) -{ - int x, res, oldused; - - /* grow to accomodate result */ - if (b->alloc < a->used + 1) { - if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { - return res; - } - } - - oldused = b->used; - b->used = a->used; - - { - register mp_digit r, rr, *tmpa, *tmpb; - - /* alias for source */ - tmpa = a->dp; - - /* alias for dest */ - tmpb = b->dp; - - /* carry */ - r = 0; - for (x = 0; x < a->used; x++) { - - /* get what will be the *next* carry bit from the - * MSB of the current digit - */ - rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); - - /* now shift up this digit, add in the carry [from the previous] */ - *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; - - /* copy the carry that would be from the source - * digit into the next iteration - */ - r = rr; - } - - /* new leading digit? */ - if (r != 0) { - /* add a MSB which is always 1 at this point */ - *tmpb = 1; - ++b->used; - } - - /* now zero any excess digits on the destination - * that we didn't write to - */ - tmpb = b->dp + b->used; - for (x = b->used; x < oldused; x++) { - *tmpb++ = 0; - } - } - b->sign = a->sign; - return MP_OKAY; -} - -/* End: bn_mp_mul_2.c */ - -/* Start: bn_mp_mul_2d.c */ -#line 0 "bn_mp_mul_2d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* NOTE: This routine requires updating. For instance the c->used = c->alloc bit - is wrong. We should just shift c->used digits then set the carry as c->dp[c->used] = carry - - To be fixed for LTM 0.18 - */ - -/* shift left by a certain bit count */ -int -mp_mul_2d (mp_int * a, int b, mp_int * c) -{ - mp_digit d; - int res; - - /* copy */ - if (a != c) { - if ((res = mp_copy (a, c)) != MP_OKAY) { - return res; - } - } - - if (c->alloc < (int)(c->used + b/DIGIT_BIT + 2)) { - if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 2)) != MP_OKAY) { - return res; - } - } - - /* shift by as many digits in the bit count */ - if (b >= (int)DIGIT_BIT) { - if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { - return res; - } - } - c->used = c->alloc; - - /* shift any bit count < DIGIT_BIT */ - d = (mp_digit) (b % DIGIT_BIT); - if (d != 0) { - register mp_digit *tmpc, mask, r, rr; - register int x; - - /* bitmask for carries */ - mask = (((mp_digit)1) << d) - 1; - - /* alias */ - tmpc = c->dp; - - /* carry */ - r = 0; - for (x = 0; x < c->used; x++) { - /* get the higher bits of the current word */ - rr = (*tmpc >> (DIGIT_BIT - d)) & mask; - - /* shift the current word and OR in the carry */ - *tmpc = ((*tmpc << d) | r) & MP_MASK; - ++tmpc; - - /* set the carry to the carry bits of the current word */ - r = rr; - } - } - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_mp_mul_2d.c */ - -/* Start: bn_mp_mul_d.c */ -#line 0 "bn_mp_mul_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* multiply by a digit */ -int -mp_mul_d (mp_int * a, mp_digit b, mp_int * c) -{ - int res, pa, olduse; - - /* make sure c is big enough to hold a*b */ - pa = a->used; - if (c->alloc < pa + 1) { - if ((res = mp_grow (c, pa + 1)) != MP_OKAY) { - return res; - } - } - - /* get the original destinations used count */ - olduse = c->used; - - /* set the new temporary used count */ - c->used = pa + 1; - - { - register mp_digit u, *tmpa, *tmpc; - register mp_word r; - register int ix; - - /* alias for a->dp [source] */ - tmpa = a->dp; - - /* alias for c->dp [dest] */ - tmpc = c->dp; - - /* zero carry */ - u = 0; - for (ix = 0; ix < pa; ix++) { - /* compute product and carry sum for this term */ - r = ((mp_word) u) + ((mp_word) * tmpa++) * ((mp_word) b); - - /* mask off higher bits to get a single digit */ - *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); - - /* send carry into next iteration */ - u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); - } - /* store final carry [if any] */ - *tmpc++ = u; - - /* now zero digits above the top */ - for (; pa < olduse; pa++) { - *tmpc++ = 0; - } - } - - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_mp_mul_d.c */ - -/* Start: bn_mp_mulmod.c */ -#line 0 "bn_mp_mulmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* d = a * b (mod c) */ -int -mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) -{ - int res; - mp_int t; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_mul (a, b, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - res = mp_mod (&t, c, d); - mp_clear (&t); - return res; -} - -/* End: bn_mp_mulmod.c */ - -/* Start: bn_mp_multi.c */ -#line 0 "bn_mp_multi.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include -#include - -int mp_init_multi(mp_int *mp, ...) -{ - mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ - int n = 0; /* Number of ok inits */ - mp_int* cur_arg = mp; - va_list args; - - va_start(args, mp); /* init args to next argument from caller */ - while (cur_arg != NULL) { - if (mp_init(cur_arg) != MP_OKAY) { - /* Oops - error! Back-track and mp_clear what we already - succeeded in init-ing, then return error. - */ - va_list clean_args; - - /* end the current list */ - va_end(args); - - /* now start cleaning up */ - cur_arg = mp; - va_start(clean_args, mp); - while (n--) { - mp_clear(cur_arg); - cur_arg = va_arg(clean_args, mp_int*); - } - va_end(clean_args); - res = MP_MEM; - break; - } - n++; - cur_arg = va_arg(args, mp_int*); - } - va_end(args); - return res; /* Assumed ok, if error flagged above. */ -} - -void mp_clear_multi(mp_int *mp, ...) -{ - mp_int* next_mp = mp; - va_list args; - va_start(args, mp); - while (next_mp != NULL) { - mp_clear(next_mp); - next_mp = va_arg(args, mp_int*); - } - va_end(args); -} - -/* End: bn_mp_multi.c */ - -/* Start: bn_mp_n_root.c */ -#line 0 "bn_mp_n_root.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* find the n'th root of an integer - * - * Result found such that (c)^b <= a and (c+1)^b > a - * - * This algorithm uses Newton's approximation x[i+1] = x[i] - f(x[i])/f'(x[i]) - * which will find the root in log(N) time where each step involves a fair bit. This - * is not meant to find huge roots [square and cube at most]. - */ -int -mp_n_root (mp_int * a, mp_digit b, mp_int * c) -{ - mp_int t1, t2, t3; - int res, neg; - - /* input must be positive if b is even */ - if ((b & 1) == 0 && a->sign == MP_NEG) { - return MP_VAL; - } - - if ((res = mp_init (&t1)) != MP_OKAY) { - return res; - } - - if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; - } - - if ((res = mp_init (&t3)) != MP_OKAY) { - goto __T2; - } - - /* if a is negative fudge the sign but keep track */ - neg = a->sign; - a->sign = MP_ZPOS; - - /* t2 = 2 */ - mp_set (&t2, 2); - - do { - /* t1 = t2 */ - if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { - goto __T3; - } - - /* t2 = t1 - ((t1^b - a) / (b * t1^(b-1))) */ - if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) */ - goto __T3; - } - - /* numerator */ - if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { /* t2 = t1^b */ - goto __T3; - } - - if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { /* t2 = t1^b - a */ - goto __T3; - } - - if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) * b */ - goto __T3; - } - - if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { /* t3 = (t1^b - a)/(b * t1^(b-1)) */ - goto __T3; - } - - if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { - goto __T3; - } - } - while (mp_cmp (&t1, &t2) != MP_EQ); - - /* result can be off by a few so check */ - for (;;) { - if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { - goto __T3; - } - - if (mp_cmp (&t2, a) == MP_GT) { - if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { - goto __T3; - } - } else { - break; - } - } - - /* reset the sign of a first */ - a->sign = neg; - - /* set the result */ - mp_exch (&t1, c); - - /* set the sign of the result */ - c->sign = neg; - - res = MP_OKAY; - -__T3:mp_clear (&t3); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); - return res; -} - -/* End: bn_mp_n_root.c */ - -/* Start: bn_mp_neg.c */ -#line 0 "bn_mp_neg.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* b = -a */ -int -mp_neg (mp_int * a, mp_int * b) -{ - int res; - if ((res = mp_copy (a, b)) != MP_OKAY) { - return res; - } - b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; - return MP_OKAY; -} - -/* End: bn_mp_neg.c */ - -/* Start: bn_mp_or.c */ -#line 0 "bn_mp_or.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* OR two ints together */ -int -mp_or (mp_int * a, mp_int * b, mp_int * c) -{ - int res, ix, px; - mp_int t, *x; - - if (a->used > b->used) { - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - px = b->used; - x = b; - } else { - if ((res = mp_init_copy (&t, b)) != MP_OKAY) { - return res; - } - px = a->used; - x = a; - } - - for (ix = 0; ix < px; ix++) { - t.dp[ix] |= x->dp[ix]; - } - mp_clamp (&t); - mp_exch (c, &t); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_mp_or.c */ - -/* Start: bn_mp_prime_fermat.c */ -#line 0 "bn_mp_prime_fermat.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* performs one Fermat test. - * - * If "a" were prime then b^a == b (mod a) since the order of - * the multiplicative sub-group would be phi(a) = a-1. That means - * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). - * - * Sets result to 1 if the congruence holds, or zero otherwise. - */ -int -mp_prime_fermat (mp_int * a, mp_int * b, int *result) -{ - mp_int t; - int err; - - /* default to fail */ - *result = 0; - - /* init t */ - if ((err = mp_init (&t)) != MP_OKAY) { - return err; - } - - /* compute t = b^a mod a */ - if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { - goto __T; - } - - /* is it equal to b? */ - if (mp_cmp (&t, b) == MP_EQ) { - *result = 1; - } - - err = MP_OKAY; -__T:mp_clear (&t); - return err; -} - -/* End: bn_mp_prime_fermat.c */ - -/* Start: bn_mp_prime_is_divisible.c */ -#line 0 "bn_mp_prime_is_divisible.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* determines if an integers is divisible by one of the first 256 primes or not - * - * sets result to 0 if not, 1 if yes - */ -int -mp_prime_is_divisible (mp_int * a, int *result) -{ - int err, ix; - mp_digit res; - - /* default to not */ - *result = 0; - - for (ix = 0; ix < PRIME_SIZE; ix++) { - /* is it equal to the prime? */ - if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { - *result = 1; - return MP_OKAY; - } - - /* what is a mod __prime_tab[ix] */ - if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { - return err; - } - - /* is the residue zero? */ - if (res == 0) { - *result = 1; - return MP_OKAY; - } - } - - return MP_OKAY; -} - -/* End: bn_mp_prime_is_divisible.c */ - -/* Start: bn_mp_prime_is_prime.c */ -#line 0 "bn_mp_prime_is_prime.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* performs a variable number of rounds of Miller-Rabin - * - * Probability of error after t rounds is no more than - * (1/4)^t when 1 <= t <= 256 - * - * Sets result to 1 if probably prime, 0 otherwise - */ -int -mp_prime_is_prime (mp_int * a, int t, int *result) -{ - mp_int b; - int ix, err, res; - - /* default to no */ - *result = 0; - - /* valid value of t? */ - if (t < 1 || t > PRIME_SIZE) { - return MP_VAL; - } - - /* is the input equal to one of the primes in the table? */ - for (ix = 0; ix < PRIME_SIZE; ix++) { - if (mp_cmp_d(a, __prime_tab[ix]) == MP_EQ) { - *result = 1; - return MP_OKAY; - } - } - - /* first perform trial division */ - if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { - return err; - } - if (res == 1) { - return MP_OKAY; - } - - /* now perform the miller-rabin rounds */ - if ((err = mp_init (&b)) != MP_OKAY) { - return err; - } - - for (ix = 0; ix < t; ix++) { - /* set the prime */ - mp_set (&b, __prime_tab[ix]); - - if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { - goto __B; - } - - if (res == 0) { - goto __B; - } - } - - /* passed the test */ - *result = 1; -__B:mp_clear (&b); - return err; -} - -/* End: bn_mp_prime_is_prime.c */ - -/* Start: bn_mp_prime_miller_rabin.c */ -#line 0 "bn_mp_prime_miller_rabin.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Miller-Rabin test of "a" to the base of "b" as described in - * HAC pp. 139 Algorithm 4.24 - * - * Sets result to 0 if definitely composite or 1 if probably prime. - * Randomly the chance of error is no more than 1/4 and often - * very much lower. - */ -int -mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) -{ - mp_int n1, y, r; - int s, j, err; - - /* default */ - *result = 0; - - /* get n1 = a - 1 */ - if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { - return err; - } - if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { - goto __N1; - } - - /* set 2^s * r = n1 */ - if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { - goto __N1; - } - s = 0; - while (mp_iseven (&r) == 1) { - ++s; - if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { - goto __R; - } - } - - /* compute y = b^r mod a */ - if ((err = mp_init (&y)) != MP_OKAY) { - goto __R; - } - if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { - goto __Y; - } - - /* if y != 1 and y != n1 do */ - if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { - j = 1; - /* while j <= s-1 and y != n1 */ - while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { - if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { - goto __Y; - } - - /* if y == 1 then composite */ - if (mp_cmp_d (&y, 1) == MP_EQ) { - goto __Y; - } - - ++j; - } - - /* if y != n1 then composite */ - if (mp_cmp (&y, &n1) != MP_EQ) { - goto __Y; - } - } - - /* probably prime now */ - *result = 1; -__Y:mp_clear (&y); -__R:mp_clear (&r); -__N1:mp_clear (&n1); - return err; -} - -/* End: bn_mp_prime_miller_rabin.c */ - -/* Start: bn_mp_prime_next_prime.c */ -#line 0 "bn_mp_prime_next_prime.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* finds the next prime after the number "a" using "t" trials - * of Miller-Rabin. - */ -int mp_prime_next_prime(mp_int *a, int t) -{ - int err, res; - - if (mp_iseven(a) == 1) { - /* force odd */ - if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { - return err; - } - } else { - /* force to next odd number */ - if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { - return err; - } - } - - for (;;) { - /* is this prime? */ - if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { - return err; - } - - if (res == 1) { - break; - } - - /* add two, next candidate */ - if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { - return err; - } - } - - return MP_OKAY; -} - - -/* End: bn_mp_prime_next_prime.c */ - -/* Start: bn_mp_rand.c */ -#line 0 "bn_mp_rand.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* makes a pseudo-random int of a given size */ -int -mp_rand (mp_int * a, int digits) -{ - int res; - mp_digit d; - - mp_zero (a); - if (digits <= 0) { - return MP_OKAY; - } - - /* first place a random non-zero digit */ - do { - d = ((mp_digit) abs (rand ())); - } while (d == 0); - - if ((res = mp_add_d (a, d, a)) != MP_OKAY) { - return res; - } - - while (digits-- > 0) { - if ((res = mp_lshd (a, 1)) != MP_OKAY) { - return res; - } - - if ((res = mp_add_d (a, ((mp_digit) abs (rand ())), a)) != MP_OKAY) { - return res; - } - } - - return MP_OKAY; -} - -/* End: bn_mp_rand.c */ - -/* Start: bn_mp_read_signed_bin.c */ -#line 0 "bn_mp_read_signed_bin.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* read signed bin, big endian, first byte is 0==positive or 1==negative */ -int -mp_read_signed_bin (mp_int * a, unsigned char *b, int c) -{ - int res; - - if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { - return res; - } - a->sign = ((b[0] == (unsigned char) 0) ? MP_ZPOS : MP_NEG); - return MP_OKAY; -} - -/* End: bn_mp_read_signed_bin.c */ - -/* Start: bn_mp_read_unsigned_bin.c */ -#line 0 "bn_mp_read_unsigned_bin.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* reads a unsigned char array, assumes the msb is stored first [big endian] */ -int -mp_read_unsigned_bin (mp_int * a, unsigned char *b, int c) -{ - int res; - mp_zero (a); - while (c-- > 0) { - if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { - return res; - } - - if (DIGIT_BIT != 7) { - a->dp[0] |= *b++; - a->used += 1; - } else { - a->dp[0] = (*b & MP_MASK); - a->dp[1] |= ((*b++ >> 7U) & 1); - a->used += 2; - } - } - mp_clamp (a); - return MP_OKAY; -} - -/* End: bn_mp_read_unsigned_bin.c */ - -/* Start: bn_mp_reduce.c */ -#line 0 "bn_mp_reduce.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* reduces x mod m, assumes 0 < x < m**2, mu is - * precomputed via mp_reduce_setup. - * From HAC pp.604 Algorithm 14.42 - */ -int -mp_reduce (mp_int * x, mp_int * m, mp_int * mu) -{ - mp_int q; - int res, um = m->used; - - /* q = x */ - if ((res = mp_init_copy (&q, x)) != MP_OKAY) { - return res; - } - - /* q1 = x / b**(k-1) */ - mp_rshd (&q, um - 1); - - /* according to HAC this is optimization is ok */ - if (((unsigned long) m->used) > (((mp_digit)1) << (DIGIT_BIT - 1))) { - if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { - goto CLEANUP; - } - } else { - if ((res = s_mp_mul_high_digs (&q, mu, &q, um - 1)) != MP_OKAY) { - goto CLEANUP; - } - } - - /* q3 = q2 / b**(k+1) */ - mp_rshd (&q, um + 1); - - /* x = x mod b**(k+1), quick (no division) */ - if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { - goto CLEANUP; - } - - /* q = q * m mod b**(k+1), quick (no division) */ - if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { - goto CLEANUP; - } - - /* x = x - q */ - if ((res = mp_sub (x, &q, x)) != MP_OKAY) { - goto CLEANUP; - } - - /* If x < 0, add b**(k+1) to it */ - if (mp_cmp_d (x, 0) == MP_LT) { - mp_set (&q, 1); - if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) - goto CLEANUP; - if ((res = mp_add (x, &q, x)) != MP_OKAY) - goto CLEANUP; - } - - /* Back off if it's too big */ - while (mp_cmp (x, m) != MP_LT) { - if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { - break; - } - } - -CLEANUP: - mp_clear (&q); - - return res; -} - -/* End: bn_mp_reduce.c */ - -/* Start: bn_mp_reduce_2k.c */ -#line 0 "bn_mp_reduce_2k.c" + +/* End: bn_mp_dr_setup.c */ + +/* Start: bn_mp_exch.c */ +#line 0 "bn_mp_exch.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* swap the elements of two integers, for cases where you can't simply swap the + * mp_int pointers around + */ +void +mp_exch (mp_int * a, mp_int * b) +{ + mp_int t; + + t = *a; + *a = *b; + *b = t; +} + +/* End: bn_mp_exch.c */ + +/* Start: bn_mp_expt_d.c */ +#line 0 "bn_mp_expt_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* calculate c = a**b using a square-multiply algorithm */ +int +mp_expt_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, x; + mp_int g; + + if ((res = mp_init_copy (&g, a)) != MP_OKAY) { + return res; + } + + /* set initial result */ + mp_set (c, 1); + + for (x = 0; x < (int) DIGIT_BIT; x++) { + /* square */ + if ((res = mp_sqr (c, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + + /* if the bit is set multiply */ + if ((b & (mp_digit) (((mp_digit)1) << (DIGIT_BIT - 1))) != 0) { + if ((res = mp_mul (c, &g, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + } + + /* shift to next bit */ + b <<= 1; + } + + mp_clear (&g); + return MP_OKAY; +} + +/* End: bn_mp_expt_d.c */ + +/* Start: bn_mp_exptmod.c */ +#line 0 "bn_mp_exptmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + + +/* this is a shell function that calls either the normal or Montgomery + * exptmod functions. Originally the call to the montgomery code was + * embedded in the normal function but that wasted alot of stack space + * for nothing (since 99% of the time the Montgomery code would be called) + */ +int +mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + int dr; + + /* modulus P must be positive */ + if (P->sign == MP_NEG) { + return MP_VAL; + } + + /* if exponent X is negative we have to recurse */ + if (X->sign == MP_NEG) { + mp_int tmpG, tmpX; + int err; + + /* first compute 1/G mod P */ + if ((err = mp_init(&tmpG)) != MP_OKAY) { + return err; + } + if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + + /* now get |X| */ + if ((err = mp_init(&tmpX)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; + } + + /* and now compute (1/G)**|X| instead of G**X [X < 0] */ + err = mp_exptmod(&tmpG, &tmpX, P, Y); + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; + } + + dr = mp_dr_is_modulus(P); + if (dr == 0) { + dr = mp_reduce_is_2k(P) << 1; + } + + /* if the modulus is odd or dr != 0 use the fast method */ + if (mp_isodd (P) == 1 || dr != 0) { + return mp_exptmod_fast (G, X, P, Y, dr); + } else { + return s_mp_exptmod (G, X, P, Y); + } +} + + +/* End: bn_mp_exptmod.c */ + +/* Start: bn_mp_exptmod_fast.c */ +#line 0 "bn_mp_exptmod_fast.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes Y == G^X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + * + * Uses Montgomery or Diminished Radix reduction [whichever appropriate] + */ +int +mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[256], res; + mp_digit buf, mp; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* use a pointer to the reduction algorithm. This allows us to use + * one of many reduction algorithms without modding the guts of + * the code with if statements everywhere. + */ + int (*redux)(mp_int*,mp_int*,mp_digit); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + + /* init G array */ + for (x = 0; x < (1 << winsize); x++) { + if ((err = mp_init (&M[x])) != MP_OKAY) { + for (y = 0; y < x; y++) { + mp_clear (&M[y]); + } + return err; + } + } + + /* determine and setup reduction code */ + if (redmode == 0) { + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto __M; + } + + /* automatically pick the comba one if available (saves quite a few calls/ifs) */ + if (((P->used * 2 + 1) < MP_WARRAY) && + P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + redux = fast_mp_montgomery_reduce; + + } else { + /* use slower baselien method */ + redux = mp_montgomery_reduce; + } + } else if (redmode == 1) { + /* setup DR reduction */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; + } else { + /* setup 2k reduction */ + if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { + goto __M; + } + redux = mp_reduce_2k; + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto __RES; + } + + /* create M table + * + * The M table contains powers of the input base, e.g. M[x] = G^x mod P + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + + if (redmode == 0) { + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto __RES; + } + + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto __RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto __RES; + } + } + + /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __RES; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + goto __RES; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { + goto __RES; + } + } + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + if (digidx == -1) { + break; + } + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + } + } + + if (redmode == 0) { + /* fixup result if Montgomery reduction is used */ + if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +__RES:mp_clear (&res); +__M: + for (x = 0; x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} + +/* End: bn_mp_exptmod_fast.c */ + +/* Start: bn_mp_gcd.c */ +#line 0 "bn_mp_gcd.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] + */ +int +mp_gcd (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int u, v, t; + int k, res, neg; + + /* either zero than gcd is the largest */ + if (mp_iszero (a) == 1 && mp_iszero (b) == 0) { + return mp_copy (b, c); + } + if (mp_iszero (a) == 0 && mp_iszero (b) == 1) { + return mp_copy (a, c); + } + if (mp_iszero (a) == 1 && mp_iszero (b) == 1) { + mp_set (c, 1); + return MP_OKAY; + } + + /* if both are negative they share (-1) as a common divisor */ + neg = (a->sign == b->sign) ? a->sign : MP_ZPOS; + + if ((res = mp_init_copy (&u, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init_copy (&v, b)) != MP_OKAY) { + goto __U; + } + + /* must be positive for the remainder of the algorithm */ + u.sign = v.sign = MP_ZPOS; + + if ((res = mp_init (&t)) != MP_OKAY) { + goto __V; + } + + /* B1. Find power of two */ + k = 0; + while (mp_iseven(&u) == 1 && mp_iseven(&v) == 1) { + ++k; + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __T; + } + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __T; + } + } + + /* B2. Initialize */ + if (mp_isodd(&u) == 1) { + /* t = -v */ + if ((res = mp_copy (&v, &t)) != MP_OKAY) { + goto __T; + } + t.sign = MP_NEG; + } else { + /* t = u */ + if ((res = mp_copy (&u, &t)) != MP_OKAY) { + goto __T; + } + } + + do { + /* B3 (and B4). Halve t, if even */ + while (t.used != 0 && mp_iseven(&t) == 1) { + if ((res = mp_div_2 (&t, &t)) != MP_OKAY) { + goto __T; + } + } + + /* B5. if t>0 then u=t otherwise v=-t */ + if (t.used != 0 && t.sign != MP_NEG) { + if ((res = mp_copy (&t, &u)) != MP_OKAY) { + goto __T; + } + } else { + if ((res = mp_copy (&t, &v)) != MP_OKAY) { + goto __T; + } + v.sign = (v.sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; + } + + /* B6. t = u - v, if t != 0 loop otherwise terminate */ + if ((res = mp_sub (&u, &v, &t)) != MP_OKAY) { + goto __T; + } + } while (mp_iszero(&t) == 0); + + /* multiply by 2^k which we divided out at the beginning */ + if ((res = mp_mul_2d (&u, k, &u)) != MP_OKAY) { + goto __T; + } + + mp_exch (&u, c); + c->sign = neg; + res = MP_OKAY; +__T:mp_clear (&t); +__V:mp_clear (&u); +__U:mp_clear (&v); + return res; +} + +/* End: bn_mp_gcd.c */ + +/* Start: bn_mp_grow.c */ +#line 0 "bn_mp_grow.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* grow as required */ +int +mp_grow (mp_int * a, int size) +{ + int i; + + /* if the alloc size is smaller alloc more ram */ + if (a->alloc < size) { + /* ensure there are always at least MP_PREC digits extra on top */ + size += (MP_PREC * 2) - (size & (MP_PREC - 1)); + + a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * size); + if (a->dp == NULL) { + return MP_MEM; + } + + /* zero excess digits */ + i = a->alloc; + a->alloc = size; + for (; i < a->alloc; i++) { + a->dp[i] = 0; + } + } + return MP_OKAY; +} + +/* End: bn_mp_grow.c */ + +/* Start: bn_mp_init.c */ +#line 0 "bn_mp_init.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* init a new bigint */ +int +mp_init (mp_int * a) +{ + /* allocate ram required and clear it */ + a->dp = OPT_CAST calloc (sizeof (mp_digit), MP_PREC); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the used to zero, allocated digits to the default precision + * and sign to positive */ + a->used = 0; + a->alloc = MP_PREC; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + +/* End: bn_mp_init.c */ + +/* Start: bn_mp_init_copy.c */ +#line 0 "bn_mp_init_copy.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* creates "a" then copies b into it */ +int +mp_init_copy (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_init (a)) != MP_OKAY) { + return res; + } + return mp_copy (b, a); +} + +/* End: bn_mp_init_copy.c */ + +/* Start: bn_mp_init_size.c */ +#line 0 "bn_mp_init_size.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* init a mp_init and grow it to a given size */ +int +mp_init_size (mp_int * a, int size) +{ + + /* pad size so there are always extra digits */ + size += (MP_PREC * 2) - (size & (MP_PREC - 1)); + + /* alloc mem */ + a->dp = OPT_CAST calloc (sizeof (mp_digit), size); + if (a->dp == NULL) { + return MP_MEM; + } + a->used = 0; + a->alloc = size; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + +/* End: bn_mp_init_size.c */ + +/* Start: bn_mp_invmod.c */ +#line 0 "bn_mp_invmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int +mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == MP_NEG) { + return MP_VAL; + } + + /* if the modulus is odd we can use a faster routine instead */ + if (mp_iseven (b) == 0) { + return fast_mp_invmod (a, b, c); + } + + /* init temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x = a, y = b */ + if ((res = mp_copy (a, &x)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_copy (b, &y)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_abs (&x, &x)) != MP_OKAY) { + goto __ERR; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto __ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto __ERR; + } + mp_set (&A, 1); + mp_set (&D, 1); + + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __ERR; + } + /* 4.2 if A or B is odd then */ + if (mp_iseven (&A) == 0 || mp_iseven (&B) == 0) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto __ERR; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto __ERR; + } + } + + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __ERR; + } + /* 5.2 if C,D are even then */ + if (mp_iseven (&C) == 0 || mp_iseven (&D) == 0) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto __ERR; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { + goto __ERR; + } + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto __ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto __ERR; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto __ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto __ERR; + } + + /* a is now the inverse */ + mp_exch (&C, c); + res = MP_OKAY; + +__ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); + return res; +} + +/* End: bn_mp_invmod.c */ + +/* Start: bn_mp_jacobi.c */ +#line 0 "bn_mp_jacobi.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes the jacobi c = (a | n) (or Legendre if n is prime) + * HAC pp. 73 Algorithm 2.149 + */ +int +mp_jacobi (mp_int * a, mp_int * n, int *c) +{ + mp_int a1, n1, e; + int s, r, res; + mp_digit residue; + + /* step 1. if a == 0, return 0 */ + if (mp_iszero (a) == 1) { + *c = 0; + return MP_OKAY; + } + + /* step 2. if a == 1, return 1 */ + if (mp_cmp_d (a, 1) == MP_EQ) { + *c = 1; + return MP_OKAY; + } + + /* default */ + s = 0; + + /* step 3. write a = a1 * 2^e */ + if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&n1)) != MP_OKAY) { + goto __A1; + } + + if ((res = mp_init (&e)) != MP_OKAY) { + goto __N1; + } + + while (mp_iseven (&a1) == 1) { + if ((res = mp_add_d (&e, 1, &e)) != MP_OKAY) { + goto __E; + } + + if ((res = mp_div_2 (&a1, &a1)) != MP_OKAY) { + goto __E; + } + } + + /* step 4. if e is even set s=1 */ + if (mp_iseven (&e) == 1) { + s = 1; + } else { + /* else set s=1 if n = 1/7 (mod 8) or s=-1 if n = 3/5 (mod 8) */ + if ((res = mp_mod_d (n, 8, &residue)) != MP_OKAY) { + goto __E; + } + + if (residue == 1 || residue == 7) { + s = 1; + } else if (residue == 3 || residue == 5) { + s = -1; + } + } + + /* step 5. if n == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ + if ((res = mp_mod_d (n, 4, &residue)) != MP_OKAY) { + goto __E; + } + if (residue == 3) { + if ((res = mp_mod_d (&a1, 4, &residue)) != MP_OKAY) { + goto __E; + } + if (residue == 3) { + s = -s; + } + } + + /* if a1 == 1 we're done */ + if (mp_cmp_d (&a1, 1) == MP_EQ) { + *c = s; + } else { + /* n1 = n mod a1 */ + if ((res = mp_mod (n, &a1, &n1)) != MP_OKAY) { + goto __E; + } + if ((res = mp_jacobi (&n1, &a1, &r)) != MP_OKAY) { + goto __E; + } + *c = s * r; + } + + /* done */ + res = MP_OKAY; +__E:mp_clear (&e); +__N1:mp_clear (&n1); +__A1:mp_clear (&a1); + return res; +} + +/* End: bn_mp_jacobi.c */ + +/* Start: bn_mp_karatsuba_mul.c */ +#line 0 "bn_mp_karatsuba_mul.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = |a| * |b| using Karatsuba Multiplication using + * three half size multiplications + * + * Let B represent the radix [e.g. 2**DIGIT_BIT] and + * let n represent half of the number of digits in + * the min(a,b) + * + * a = a1 * B**n + a0 + * b = b1 * B**n + b0 + * + * Then, a * b => + a1b1 * B**2n + ((a1 - a0)(b1 - b0) + a0b0 + a1b1) * B + a0b0 + * + * Note that a1b1 and a0b0 are used twice and only need to be + * computed once. So in total three half size (half # of + * digit) multiplications are performed, a0b0, a1b1 and + * (a1-b1)(a0-b0) + * + * Note that a multiplication of half the digits requires + * 1/4th the number of single precision multiplications so in + * total after one call 25% of the single precision multiplications + * are saved. Note also that the call to mp_mul can end up back + * in this function if the a0, a1, b0, or b1 are above the threshold. + * This is known as divide-and-conquer and leads to the famous + * O(N**lg(3)) or O(N**1.584) work which is asymptopically lower than + * the standard O(N**2) that the baseline/comba methods use. + * Generally though the overhead of this method doesn't pay off + * until a certain size (N ~ 80) is reached. + */ +int +mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x0, x1, y0, y1, t1, x0y0, x1y1; + int B, err; + + /* default the return code to an error */ + err = MP_MEM; + + /* min # of digits */ + B = MIN (a->used, b->used); + + /* now divide in two */ + B = B / 2; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + if (mp_init_size (&y0, B) != MP_OKAY) + goto X1; + if (mp_init_size (&y1, b->used - B) != MP_OKAY) + goto Y0; + + /* init temps */ + if (mp_init_size (&t1, B * 2) != MP_OKAY) + goto Y1; + if (mp_init_size (&x0y0, B * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x1y1, B * 2) != MP_OKAY) + goto X0Y0; + + /* now shift the digits */ + x0.sign = x1.sign = a->sign; + y0.sign = y1.sign = b->sign; + + x0.used = y0.used = B; + x1.used = a->used - B; + y1.used = b->used - B; + + { + register int x; + register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; + + /* we copy the digits directly instead of using higher level functions + * since we also need to shift the digits + */ + tmpa = a->dp; + tmpb = b->dp; + + tmpx = x0.dp; + tmpy = y0.dp; + for (x = 0; x < B; x++) { + *tmpx++ = *tmpa++; + *tmpy++ = *tmpb++; + } + + tmpx = x1.dp; + for (x = B; x < a->used; x++) { + *tmpx++ = *tmpa++; + } + + tmpy = y1.dp; + for (x = B; x < b->used; x++) { + *tmpy++ = *tmpb++; + } + } + + /* only need to clamp the lower words since by definition the + * upper words x1/y1 must have a known number of digits + */ + mp_clamp (&x0); + mp_clamp (&y0); + + /* now calc the products x0y0 and x1y1 */ + /* after this x0 is no longer required, free temp [x0==t2]! */ + if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) + goto X1Y1; /* x0y0 = x0*y0 */ + if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) + goto X1Y1; /* x1y1 = x1*y1 */ + + /* now calc x1-x0 and y1-y0 */ + if (mp_sub (&x1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = x1 - x0 */ + if (mp_sub (&y1, &y0, &x0) != MP_OKAY) + goto X1Y1; /* t2 = y1 - y0 */ + if (mp_mul (&t1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = (x1 - x0) * (y1 - y0) */ + + /* add x0y0 */ + if (mp_add (&x0y0, &x1y1, &x0) != MP_OKAY) + goto X1Y1; /* t2 = x0y0 + x1y1 */ + if (mp_sub (&x0, &t1, &t1) != MP_OKAY) + goto X1Y1; /* t1 = x0y0 + x1y1 - (x1-x0)*(y1-y0) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< + +/* Karatsuba squaring, computes b = a*a using three + * half size squarings + * + * See comments of mp_karatsuba_mul for details. It + * is essentially the same algorithm but merely + * tuned to perform recursive squarings. + */ +int +mp_karatsuba_sqr (mp_int * a, mp_int * b) +{ + mp_int x0, x1, t1, t2, x0x0, x1x1; + int B, err; + + err = MP_MEM; + + /* min # of digits */ + B = a->used; + + /* now divide in two */ + B = B / 2; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + + /* init temps */ + if (mp_init_size (&t1, a->used * 2) != MP_OKAY) + goto X1; + if (mp_init_size (&t2, a->used * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x0x0, B * 2) != MP_OKAY) + goto T2; + if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) + goto X0X0; + + { + register int x; + register mp_digit *dst, *src; + + src = a->dp; + + /* now shift the digits */ + dst = x0.dp; + for (x = 0; x < B; x++) { + *dst++ = *src++; + } + + dst = x1.dp; + for (x = B; x < a->used; x++) { + *dst++ = *src++; + } + } + + x0.used = B; + x1.used = a->used - B; + + mp_clamp (&x0); + + /* now calc the products x0*x0 and x1*x1 */ + if (mp_sqr (&x0, &x0x0) != MP_OKAY) + goto X1X1; /* x0x0 = x0*x0 */ + if (mp_sqr (&x1, &x1x1) != MP_OKAY) + goto X1X1; /* x1x1 = x1*x1 */ + + /* now calc (x1-x0)**2 */ + if (mp_sub (&x1, &x0, &t1) != MP_OKAY) + goto X1X1; /* t1 = x1 - x0 */ + if (mp_sqr (&t1, &t1) != MP_OKAY) + goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ + + /* add x0y0 */ + if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) + goto X1X1; /* t2 = x0x0 + x1x1 */ + if (mp_sub (&t2, &t1, &t1) != MP_OKAY) + goto X1X1; /* t1 = x0x0 + x1x1 - (x1-x0)*(x1-x0) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))< + +/* computes least common multiple as a*b/(a, b) */ +int +mp_lcm (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if ((res = mp_gcd (a, b, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + res = mp_div (&t, c, c, NULL); + mp_clear (&t); + return res; +} + +/* End: bn_mp_lcm.c */ + +/* Start: bn_mp_lshd.c */ +#line 0 "bn_mp_lshd.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift left a certain amount of digits */ +int +mp_lshd (mp_int * a, int b) +{ + int x, res; + + /* if its less than zero return */ + if (b <= 0) { + return MP_OKAY; + } + + /* grow to fit the new digits */ + if (a->alloc < a->used + b) { + if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { + return res; + } + } + + { + register mp_digit *top, *bottom; + + /* increment the used by the shift amount then copy upwards */ + a->used += b; + + /* top */ + top = a->dp + a->used - 1; + + /* base */ + bottom = a->dp + a->used - 1 - b; + + /* much like mp_rshd this is implemented using a sliding window + * except the window goes the otherway around. Copying from + * the bottom to the top. see bn_mp_rshd.c for more info. + */ + for (x = a->used - 1; x >= b; x--) { + *top-- = *bottom--; + } + + /* zero the lower digits */ + top = a->dp; + for (x = 0; x < b; x++) { + *top++ = 0; + } + } + return MP_OKAY; +} + +/* End: bn_mp_lshd.c */ + +/* Start: bn_mp_mod.c */ +#line 0 "bn_mp_mod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = a mod b, 0 <= c < b */ +int +mp_mod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int t; + int res; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if (t.sign == MP_NEG) { + res = mp_add (b, &t, c); + } else { + res = MP_OKAY; + mp_exch (&t, c); + } + + mp_clear (&t); + return res; +} + +/* End: bn_mp_mod.c */ + +/* Start: bn_mp_mod_2d.c */ +#line 0 "bn_mp_mod_2d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* calc a value mod 2^b */ +int +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b > (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mod_2d.c */ + +/* Start: bn_mp_mod_d.c */ +#line 0 "bn_mp_mod_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int +mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) +{ + return mp_div_d(a, b, NULL, c); +} + +/* End: bn_mp_mod_d.c */ + +/* Start: bn_mp_montgomery_calc_normalization.c */ +#line 0 "bn_mp_montgomery_calc_normalization.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* calculates a = B^n mod b for Montgomery reduction + * Where B is the base [e.g. 2^DIGIT_BIT]. + * B^n mod b is computed by first computing + * A = B^(n-1) which doesn't require a reduction but a simple OR. + * then C = A * B = B^n is computed by performing upto DIGIT_BIT + * shifts with subtractions when the result is greater than b. + * + * The method is slightly modified to shift B unconditionally upto just under + * the leading bit of b. This saves alot of multiple precision shifting. + */ +int +mp_montgomery_calc_normalization (mp_int * a, mp_int * b) +{ + int x, bits, res; + + /* how many bits of last digit does b use */ + bits = mp_count_bits (b) % DIGIT_BIT; + + /* compute A = B^(n-1) * 2^(bits-1) */ + if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { + return res; + } + + /* now compute C = A * B mod b */ + for (x = bits - 1; x < (int)DIGIT_BIT; x++) { + if ((res = mp_mul_2 (a, a)) != MP_OKAY) { + return res; + } + if (mp_cmp_mag (a, b) != MP_LT) { + if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { + return res; + } + } + } + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_calc_normalization.c */ + +/* Start: bn_mp_montgomery_reduce.c */ +#line 0 "bn_mp_montgomery_reduce.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes xR**-1 == x (mod N) via Montgomery Reduction */ +int +mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, digs; + mp_digit mu; + + /* can the fast reduction [comba] method be used? + * + * Note that unlike in mp_mul you're safely allowed *less* + * than the available columns [255 per default] since carries + * are fixed up in the inner loop. + */ + digs = n->used * 2 + 1; + if ((digs < MP_WARRAY) && + n->used < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_mp_montgomery_reduce (x, n, rho); + } + + /* grow the input as required */ + if (x->alloc < digs) { + if ((res = mp_grow (x, digs)) != MP_OKAY) { + return res; + } + } + x->used = digs; + + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * m' mod b */ + mu = (x->dp[ix] * rho) & MP_MASK; + + /* a = a + mu * m * b**i */ + { + register int iy; + register mp_digit *tmpn, *tmpx, u; + register mp_word r; + + /* aliases */ + tmpn = n->dp; + tmpx = x->dp + ix; + + /* set the carry to zero */ + u = 0; + + /* Multiply and add in place */ + for (iy = 0; iy < n->used; iy++) { + r = ((mp_word) mu) * ((mp_word) * tmpn++) + + ((mp_word) u) + ((mp_word) * tmpx); + u = (r >> ((mp_word) DIGIT_BIT)); + *tmpx++ = (r & ((mp_word) MP_MASK)); + } + /* propagate carries */ + while (u) { + *tmpx += u; + u = *tmpx >> DIGIT_BIT; + *tmpx++ &= MP_MASK; + } + } + } + + /* x = x/b**n.used */ + mp_clamp(x); + mp_rshd (x, n->used); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_reduce.c */ + +/* Start: bn_mp_montgomery_setup.c */ +#line 0 "bn_mp_montgomery_setup.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* setups the montgomery reduction stuff */ +int +mp_montgomery_setup (mp_int * n, mp_digit * rho) +{ + mp_digit x, b; + +/* fast inversion mod 2**k + * + * Based on the fact that + * + * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) + * => 2*X*A - X*X*A*A = 1 + * => 2*(1) - (1) = 1 + */ + b = n->dp[0]; + + if ((b & 1) == 0) { + return MP_VAL; + } + + x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ + x *= 2 - b * x; /* here x*a==1 mod 2**8 */ +#if !defined(MP_8BIT) + x *= 2 - b * x; /* here x*a==1 mod 2**16 */ +#endif +#if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) + x *= 2 - b * x; /* here x*a==1 mod 2**32 */ +#endif +#ifdef MP_64BIT + x *= 2 - b * x; /* here x*a==1 mod 2**64 */ +#endif + + /* rho = -1/m mod b */ + *rho = (((mp_digit) 1 << ((mp_digit) DIGIT_BIT)) - x) & MP_MASK; + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_setup.c */ + +/* Start: bn_mp_mul.c */ +#line 0 "bn_mp_mul.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level multiplication (handles sign) */ +int +mp_mul (mp_int * a, mp_int * b, mp_int * c) +{ + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + + if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { + res = mp_toom_mul(a, b, c); + } else if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { + res = mp_karatsuba_mul (a, b, c); + } else { + + /* can we use the fast multiplier? + * + * The fast multiplier can be used if the output will + * have less than MP_WARRAY digits and the number of + * digits won't affect carry propagation + */ + int digs = a->used + b->used + 1; + + if ((digs < MP_WARRAY) && + MIN(a->used, b->used) <= + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + res = fast_s_mp_mul_digs (a, b, c, digs); + } else { + res = s_mp_mul (a, b, c); + } + + } + c->sign = neg; + return res; +} + +/* End: bn_mp_mul.c */ + +/* Start: bn_mp_mul_2.c */ +#line 0 "bn_mp_mul_2.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = a*2 */ +int +mp_mul_2 (mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* grow to accomodate result */ + if (b->alloc < a->used + 1) { + if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* alias for source */ + tmpa = a->dp; + + /* alias for dest */ + tmpb = b->dp; + + /* carry */ + r = 0; + for (x = 0; x < a->used; x++) { + + /* get what will be the *next* carry bit from the + * MSB of the current digit + */ + rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); + + /* now shift up this digit, add in the carry [from the previous] */ + *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; + + /* copy the carry that would be from the source + * digit into the next iteration + */ + r = rr; + } + + /* new leading digit? */ + if (r != 0) { + /* add a MSB which is always 1 at this point */ + *tmpb = 1; + ++b->used; + } + + /* now zero any excess digits on the destination + * that we didn't write to + */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + return MP_OKAY; +} + +/* End: bn_mp_mul_2.c */ + +/* Start: bn_mp_mul_2d.c */ +#line 0 "bn_mp_mul_2d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* NOTE: This routine requires updating. For instance the c->used = c->alloc bit + is wrong. We should just shift c->used digits then set the carry as c->dp[c->used] = carry + + To be fixed for LTM 0.18 + */ + +/* shift left by a certain bit count */ +int +mp_mul_2d (mp_int * a, int b, mp_int * c) +{ + mp_digit d; + int res; + + /* copy */ + if (a != c) { + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + } + + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 2)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 2)) != MP_OKAY) { + return res; + } + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } + c->used = c->alloc; + + /* shift any bit count < DIGIT_BIT */ + d = (mp_digit) (b % DIGIT_BIT); + if (d != 0) { + register mp_digit *tmpc, mask, r, rr; + register int x; + + /* bitmask for carries */ + mask = (((mp_digit)1) << d) - 1; + + /* alias */ + tmpc = c->dp; + + /* carry */ + r = 0; + for (x = 0; x < c->used; x++) { + /* get the higher bits of the current word */ + rr = (*tmpc >> (DIGIT_BIT - d)) & mask; + + /* shift the current word and OR in the carry */ + *tmpc = ((*tmpc << d) | r) & MP_MASK; + ++tmpc; + + /* set the carry to the carry bits of the current word */ + r = rr; + } + } + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mul_2d.c */ + +/* Start: bn_mp_mul_d.c */ +#line 0 "bn_mp_mul_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiply by a digit */ +int +mp_mul_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, pa, olduse; + + /* make sure c is big enough to hold a*b */ + pa = a->used; + if (c->alloc < pa + 1) { + if ((res = mp_grow (c, pa + 1)) != MP_OKAY) { + return res; + } + } + + /* get the original destinations used count */ + olduse = c->used; + + /* set the new temporary used count */ + c->used = pa + 1; + + { + register mp_digit u, *tmpa, *tmpc; + register mp_word r; + register int ix; + + /* alias for a->dp [source] */ + tmpa = a->dp; + + /* alias for c->dp [dest] */ + tmpc = c->dp; + + /* zero carry */ + u = 0; + for (ix = 0; ix < pa; ix++) { + /* compute product and carry sum for this term */ + r = ((mp_word) u) + ((mp_word) * tmpa++) * ((mp_word) b); + + /* mask off higher bits to get a single digit */ + *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* send carry into next iteration */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + /* store final carry [if any] */ + *tmpc++ = u; + + /* now zero digits above the top */ + for (; pa < olduse; pa++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mul_d.c */ + +/* Start: bn_mp_mulmod.c */ +#line 0 "bn_mp_mulmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a * b (mod c) */ +int +mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_mulmod.c */ + +/* Start: bn_mp_multi.c */ +#line 0 "bn_mp_multi.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include +#include + +int mp_init_multi(mp_int *mp, ...) +{ + mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ + int n = 0; /* Number of ok inits */ + mp_int* cur_arg = mp; + va_list args; + + va_start(args, mp); /* init args to next argument from caller */ + while (cur_arg != NULL) { + if (mp_init(cur_arg) != MP_OKAY) { + /* Oops - error! Back-track and mp_clear what we already + succeeded in init-ing, then return error. + */ + va_list clean_args; + + /* end the current list */ + va_end(args); + + /* now start cleaning up */ + cur_arg = mp; + va_start(clean_args, mp); + while (n--) { + mp_clear(cur_arg); + cur_arg = va_arg(clean_args, mp_int*); + } + va_end(clean_args); + res = MP_MEM; + break; + } + n++; + cur_arg = va_arg(args, mp_int*); + } + va_end(args); + return res; /* Assumed ok, if error flagged above. */ +} + +void mp_clear_multi(mp_int *mp, ...) +{ + mp_int* next_mp = mp; + va_list args; + va_start(args, mp); + while (next_mp != NULL) { + mp_clear(next_mp); + next_mp = va_arg(args, mp_int*); + } + va_end(args); +} + +/* End: bn_mp_multi.c */ + +/* Start: bn_mp_n_root.c */ +#line 0 "bn_mp_n_root.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* find the n'th root of an integer + * + * Result found such that (c)^b <= a and (c+1)^b > a + * + * This algorithm uses Newton's approximation x[i+1] = x[i] - f(x[i])/f'(x[i]) + * which will find the root in log(N) time where each step involves a fair bit. This + * is not meant to find huge roots [square and cube at most]. + */ +int +mp_n_root (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t1, t2, t3; + int res, neg; + + /* input must be positive if b is even */ + if ((b & 1) == 0 && a->sign == MP_NEG) { + return MP_VAL; + } + + if ((res = mp_init (&t1)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto __T1; + } + + if ((res = mp_init (&t3)) != MP_OKAY) { + goto __T2; + } + + /* if a is negative fudge the sign but keep track */ + neg = a->sign; + a->sign = MP_ZPOS; + + /* t2 = 2 */ + mp_set (&t2, 2); + + do { + /* t1 = t2 */ + if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { + goto __T3; + } + + /* t2 = t1 - ((t1^b - a) / (b * t1^(b-1))) */ + if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) */ + goto __T3; + } + + /* numerator */ + if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { /* t2 = t1^b */ + goto __T3; + } + + if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { /* t2 = t1^b - a */ + goto __T3; + } + + if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) * b */ + goto __T3; + } + + if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { /* t3 = (t1^b - a)/(b * t1^(b-1)) */ + goto __T3; + } + + if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { + goto __T3; + } + } + while (mp_cmp (&t1, &t2) != MP_EQ); + + /* result can be off by a few so check */ + for (;;) { + if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { + goto __T3; + } + + if (mp_cmp (&t2, a) == MP_GT) { + if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { + goto __T3; + } + } else { + break; + } + } + + /* reset the sign of a first */ + a->sign = neg; + + /* set the result */ + mp_exch (&t1, c); + + /* set the sign of the result */ + c->sign = neg; + + res = MP_OKAY; + +__T3:mp_clear (&t3); +__T2:mp_clear (&t2); +__T1:mp_clear (&t1); + return res; +} + +/* End: bn_mp_n_root.c */ + +/* Start: bn_mp_neg.c */ +#line 0 "bn_mp_neg.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = -a */ +int +mp_neg (mp_int * a, mp_int * b) +{ + int res; + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; + return MP_OKAY; +} + +/* End: bn_mp_neg.c */ + +/* Start: bn_mp_or.c */ +#line 0 "bn_mp_or.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* OR two ints together */ +int +mp_or (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] |= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_or.c */ + +/* Start: bn_mp_prime_fermat.c */ +#line 0 "bn_mp_prime_fermat.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs one Fermat test. + * + * If "a" were prime then b^a == b (mod a) since the order of + * the multiplicative sub-group would be phi(a) = a-1. That means + * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). + * + * Sets result to 1 if the congruence holds, or zero otherwise. + */ +int +mp_prime_fermat (mp_int * a, mp_int * b, int *result) +{ + mp_int t; + int err; + + /* default to fail */ + *result = 0; + + /* init t */ + if ((err = mp_init (&t)) != MP_OKAY) { + return err; + } + + /* compute t = b^a mod a */ + if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { + goto __T; + } + + /* is it equal to b? */ + if (mp_cmp (&t, b) == MP_EQ) { + *result = 1; + } + + err = MP_OKAY; +__T:mp_clear (&t); + return err; +} + +/* End: bn_mp_prime_fermat.c */ + +/* Start: bn_mp_prime_is_divisible.c */ +#line 0 "bn_mp_prime_is_divisible.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* determines if an integers is divisible by one of the first 256 primes or not + * + * sets result to 0 if not, 1 if yes + */ +int +mp_prime_is_divisible (mp_int * a, int *result) +{ + int err, ix; + mp_digit res; + + /* default to not */ + *result = 0; + + for (ix = 0; ix < PRIME_SIZE; ix++) { + /* is it equal to the prime? */ + if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { + *result = 1; + return MP_OKAY; + } + + /* what is a mod __prime_tab[ix] */ + if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { + return err; + } + + /* is the residue zero? */ + if (res == 0) { + *result = 1; + return MP_OKAY; + } + } + + return MP_OKAY; +} + +/* End: bn_mp_prime_is_divisible.c */ + +/* Start: bn_mp_prime_is_prime.c */ +#line 0 "bn_mp_prime_is_prime.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs a variable number of rounds of Miller-Rabin + * + * Probability of error after t rounds is no more than + * (1/4)^t when 1 <= t <= 256 + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int +mp_prime_is_prime (mp_int * a, int t, int *result) +{ + mp_int b; + int ix, err, res; + + /* default to no */ + *result = 0; + + /* valid value of t? */ + if (t < 1 || t > PRIME_SIZE) { + return MP_VAL; + } + + /* is the input equal to one of the primes in the table? */ + for (ix = 0; ix < PRIME_SIZE; ix++) { + if (mp_cmp_d(a, __prime_tab[ix]) == MP_EQ) { + *result = 1; + return MP_OKAY; + } + } + + /* first perform trial division */ + if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { + return err; + } + if (res == 1) { + return MP_OKAY; + } + + /* now perform the miller-rabin rounds */ + if ((err = mp_init (&b)) != MP_OKAY) { + return err; + } + + for (ix = 0; ix < t; ix++) { + /* set the prime */ + mp_set (&b, __prime_tab[ix]); + + if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { + goto __B; + } + + if (res == 0) { + goto __B; + } + } + + /* passed the test */ + *result = 1; +__B:mp_clear (&b); + return err; +} + +/* End: bn_mp_prime_is_prime.c */ + +/* Start: bn_mp_prime_miller_rabin.c */ +#line 0 "bn_mp_prime_miller_rabin.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Miller-Rabin test of "a" to the base of "b" as described in + * HAC pp. 139 Algorithm 4.24 + * + * Sets result to 0 if definitely composite or 1 if probably prime. + * Randomly the chance of error is no more than 1/4 and often + * very much lower. + */ +int +mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) +{ + mp_int n1, y, r; + int s, j, err; + + /* default */ + *result = 0; + + /* get n1 = a - 1 */ + if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { + return err; + } + if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { + goto __N1; + } + + /* set 2^s * r = n1 */ + if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { + goto __N1; + } + s = 0; + while (mp_iseven (&r) == 1) { + ++s; + if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { + goto __R; + } + } + + /* compute y = b^r mod a */ + if ((err = mp_init (&y)) != MP_OKAY) { + goto __R; + } + if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { + goto __Y; + } + + /* if y != 1 and y != n1 do */ + if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { + j = 1; + /* while j <= s-1 and y != n1 */ + while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { + if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { + goto __Y; + } + + /* if y == 1 then composite */ + if (mp_cmp_d (&y, 1) == MP_EQ) { + goto __Y; + } + + ++j; + } + + /* if y != n1 then composite */ + if (mp_cmp (&y, &n1) != MP_EQ) { + goto __Y; + } + } + + /* probably prime now */ + *result = 1; +__Y:mp_clear (&y); +__R:mp_clear (&r); +__N1:mp_clear (&n1); + return err; +} + +/* End: bn_mp_prime_miller_rabin.c */ + +/* Start: bn_mp_prime_next_prime.c */ +#line 0 "bn_mp_prime_next_prime.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + */ +int mp_prime_next_prime(mp_int *a, int t) +{ + int err, res; + + if (mp_iseven(a) == 1) { + /* force odd */ + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { + return err; + } + } else { + /* force to next odd number */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + for (;;) { + /* is this prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { + return err; + } + + if (res == 1) { + break; + } + + /* add two, next candidate */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + return MP_OKAY; +} + + +/* End: bn_mp_prime_next_prime.c */ + +/* Start: bn_mp_rand.c */ +#line 0 "bn_mp_rand.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* makes a pseudo-random int of a given size */ +int +mp_rand (mp_int * a, int digits) +{ + int res; + mp_digit d; + + mp_zero (a); + if (digits <= 0) { + return MP_OKAY; + } + + /* first place a random non-zero digit */ + do { + d = ((mp_digit) abs (rand ())); + } while (d == 0); + + if ((res = mp_add_d (a, d, a)) != MP_OKAY) { + return res; + } + + while (digits-- > 0) { + if ((res = mp_lshd (a, 1)) != MP_OKAY) { + return res; + } + + if ((res = mp_add_d (a, ((mp_digit) abs (rand ())), a)) != MP_OKAY) { + return res; + } + } + + return MP_OKAY; +} + +/* End: bn_mp_rand.c */ + +/* Start: bn_mp_read_signed_bin.c */ +#line 0 "bn_mp_read_signed_bin.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read signed bin, big endian, first byte is 0==positive or 1==negative */ +int +mp_read_signed_bin (mp_int * a, unsigned char *b, int c) +{ + int res; + + if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { + return res; + } + a->sign = ((b[0] == (unsigned char) 0) ? MP_ZPOS : MP_NEG); + return MP_OKAY; +} + +/* End: bn_mp_read_signed_bin.c */ + +/* Start: bn_mp_read_unsigned_bin.c */ +#line 0 "bn_mp_read_unsigned_bin.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reads a unsigned char array, assumes the msb is stored first [big endian] */ +int +mp_read_unsigned_bin (mp_int * a, unsigned char *b, int c) +{ + int res; + mp_zero (a); + while (c-- > 0) { + if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { + return res; + } + + if (DIGIT_BIT != 7) { + a->dp[0] |= *b++; + a->used += 1; + } else { + a->dp[0] = (*b & MP_MASK); + a->dp[1] |= ((*b++ >> 7U) & 1); + a->used += 2; + } + } + mp_clamp (a); + return MP_OKAY; +} + +/* End: bn_mp_read_unsigned_bin.c */ + +/* Start: bn_mp_reduce.c */ +#line 0 "bn_mp_reduce.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reduces x mod m, assumes 0 < x < m**2, mu is + * precomputed via mp_reduce_setup. + * From HAC pp.604 Algorithm 14.42 + */ +int +mp_reduce (mp_int * x, mp_int * m, mp_int * mu) +{ + mp_int q; + int res, um = m->used; + + /* q = x */ + if ((res = mp_init_copy (&q, x)) != MP_OKAY) { + return res; + } + + /* q1 = x / b**(k-1) */ + mp_rshd (&q, um - 1); + + /* according to HAC this is optimization is ok */ + if (((unsigned long) m->used) > (((mp_digit)1) << (DIGIT_BIT - 1))) { + if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { + goto CLEANUP; + } + } else { + if ((res = s_mp_mul_high_digs (&q, mu, &q, um - 1)) != MP_OKAY) { + goto CLEANUP; + } + } + + /* q3 = q2 / b**(k+1) */ + mp_rshd (&q, um + 1); + + /* x = x mod b**(k+1), quick (no division) */ + if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } + + /* q = q * m mod b**(k+1), quick (no division) */ + if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + + /* x = x - q */ + if ((res = mp_sub (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + + /* If x < 0, add b**(k+1) to it */ + if (mp_cmp_d (x, 0) == MP_LT) { + mp_set (&q, 1); + if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) + goto CLEANUP; + if ((res = mp_add (x, &q, x)) != MP_OKAY) + goto CLEANUP; + } + + /* Back off if it's too big */ + while (mp_cmp (x, m) != MP_LT) { + if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { + break; + } + } + +CLEANUP: + mp_clear (&q); + + return res; +} + +/* End: bn_mp_reduce.c */ + +/* Start: bn_mp_reduce_2k.c */ +#line 0 "bn_mp_reduce_2k.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -4889,11 +4893,11 @@ ERR: return res; } - -/* End: bn_mp_reduce_2k.c */ - -/* Start: bn_mp_reduce_2k_setup.c */ -#line 0 "bn_mp_reduce_2k_setup.c" + +/* End: bn_mp_reduce_2k.c */ + +/* Start: bn_mp_reduce_2k_setup.c */ +#line 0 "bn_mp_reduce_2k_setup.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -4936,11 +4940,11 @@ mp_reduce_2k_setup(mp_int *a, mp_digit *d) mp_clear(&tmp); return MP_OKAY; } - -/* End: bn_mp_reduce_2k_setup.c */ - -/* Start: bn_mp_reduce_is_2k.c */ -#line 0 "bn_mp_reduce_is_2k.c" + +/* End: bn_mp_reduce_2k_setup.c */ + +/* Start: bn_mp_reduce_is_2k.c */ +#line 0 "bn_mp_reduce_is_2k.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -4970,7 +4974,8 @@ mp_reduce_is_2k(mp_int *a) } else if (a->used > 1) { iy = mp_count_bits(a); for (ix = DIGIT_BIT; ix < iy; ix++) { - if ((a->dp[ix/DIGIT_BIT] & ((mp_digit)1 << (mp_digit)(ix % DIGIT_BIT))) == 0) { + if ((a->dp[ix/DIGIT_BIT] & + ((mp_digit)1 << (mp_digit)(ix % DIGIT_BIT))) == 0) { return 0; } } @@ -4978,11 +4983,11 @@ mp_reduce_is_2k(mp_int *a) return 1; } - -/* End: bn_mp_reduce_is_2k.c */ - -/* Start: bn_mp_reduce_setup.c */ -#line 0 "bn_mp_reduce_setup.c" + +/* End: bn_mp_reduce_is_2k.c */ + +/* Start: bn_mp_reduce_setup.c */ +#line 0 "bn_mp_reduce_setup.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -5012,11 +5017,522 @@ mp_reduce_setup (mp_int * a, mp_int * b) } return mp_div (a, b, a, NULL); } - -/* End: bn_mp_reduce_setup.c */ - -/* Start: bn_mp_rshd.c */ -#line 0 "bn_mp_rshd.c" + +/* End: bn_mp_reduce_setup.c */ + +/* Start: bn_mp_rshd.c */ +#line 0 "bn_mp_rshd.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift right a certain amount of digits */ +void +mp_rshd (mp_int * a, int b) +{ + int x; + + /* if b <= 0 then ignore it */ + if (b <= 0) { + return; + } + + /* if b > used then simply zero it and return */ + if (a->used <= b) { + mp_zero (a); + return; + } + + { + register mp_digit *bottom, *top; + + /* shift the digits down */ + + /* bottom */ + bottom = a->dp; + + /* top [offset into digits] */ + top = a->dp + b; + + /* this is implemented as a sliding window where + * the window is b-digits long and digits from + * the top of the window are copied to the bottom + * + * e.g. + + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> + /\ | ----> + \-------------------/ ----> + */ + for (x = 0; x < (a->used - b); x++) { + *bottom++ = *top++; + } + + /* zero the top digits */ + for (; x < a->used; x++) { + *bottom++ = 0; + } + } + + /* remove excess digits */ + a->used -= b; +} + +/* End: bn_mp_rshd.c */ + +/* Start: bn_mp_set.c */ +#line 0 "bn_mp_set.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set to a digit */ +void +mp_set (mp_int * a, mp_digit b) +{ + mp_zero (a); + a->dp[0] = b & MP_MASK; + a->used = (a->dp[0] != 0) ? 1 : 0; +} + +/* End: bn_mp_set.c */ + +/* Start: bn_mp_set_int.c */ +#line 0 "bn_mp_set_int.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set a 32-bit const */ +int +mp_set_int (mp_int * a, unsigned int b) +{ + int x, res; + + mp_zero (a); + /* set four bits at a time */ + for (x = 0; x < 8; x++) { + /* shift the number up four bits */ + if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { + return res; + } + + /* OR in the top four bits of the source */ + a->dp[0] |= (b >> 28) & 15; + + /* shift the source up to the next four bits */ + b <<= 4; + + /* ensure that digits are not clamped off */ + a->used += 1; + } + mp_clamp (a); + return MP_OKAY; +} + +/* End: bn_mp_set_int.c */ + +/* Start: bn_mp_shrink.c */ +#line 0 "bn_mp_shrink.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shrink a bignum */ +int +mp_shrink (mp_int * a) +{ + if (a->alloc != a->used) { + if ((a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * a->used)) == NULL) { + return MP_MEM; + } + a->alloc = a->used; + } + return MP_OKAY; +} + +/* End: bn_mp_shrink.c */ + +/* Start: bn_mp_signed_bin_size.c */ +#line 0 "bn_mp_signed_bin_size.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the size for an signed equivalent */ +int +mp_signed_bin_size (mp_int * a) +{ + return 1 + mp_unsigned_bin_size (a); +} + +/* End: bn_mp_signed_bin_size.c */ + +/* Start: bn_mp_sqr.c */ +#line 0 "bn_mp_sqr.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes b = a*a */ +int +mp_sqr (mp_int * a, mp_int * b) +{ + int res; + if (a->used >= TOOM_SQR_CUTOFF) { + res = mp_toom_sqr(a, b); + } else if (a->used >= KARATSUBA_SQR_CUTOFF) { + res = mp_karatsuba_sqr (a, b); + } else { + + /* can we use the fast multiplier? */ + if ((a->used * 2 + 1) < MP_WARRAY && + a->used < + (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { + res = fast_s_mp_sqr (a, b); + } else { + res = s_mp_sqr (a, b); + } + } + b->sign = MP_ZPOS; + return res; +} + +/* End: bn_mp_sqr.c */ + +/* Start: bn_mp_sqrmod.c */ +#line 0 "bn_mp_sqrmod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = a * a (mod b) */ +int +mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sqr (a, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, b, c); + mp_clear (&t); + return res; +} + +/* End: bn_mp_sqrmod.c */ + +/* Start: bn_mp_sub.c */ +#line 0 "bn_mp_sub.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level subtraction (handles signs) */ +int +mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + sa = a->sign; + sb = b->sign; + + if (sa != sb) { + /* subtract a negative from a positive, OR */ + /* subtract a positive from a negative. */ + /* In either case, ADD their magnitudes, */ + /* and use the sign of the first number. */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* subtract a positive from a positive, OR */ + /* subtract a negative from a negative. */ + /* First, take the difference between their */ + /* magnitudes, then... */ + if (mp_cmp_mag (a, b) != MP_LT) { + /* Copy the sign from the first */ + c->sign = sa; + /* The first has a larger or equal magnitude */ + res = s_mp_sub (a, b, c); + } else { + /* The result has the *opposite* sign from */ + /* the first number. */ + c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; + /* The second has a larger magnitude */ + res = s_mp_sub (b, a, c); + } + } + return res; +} + + +/* End: bn_mp_sub.c */ + +/* Start: bn_mp_sub_d.c */ +#line 0 "bn_mp_sub_d.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit subtraction */ +int +mp_sub_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t; + int res; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + mp_set (&t, b); + res = mp_sub (a, &t, c); + + mp_clear (&t); + return res; +} + +/* End: bn_mp_sub_d.c */ + +/* Start: bn_mp_submod.c */ +#line 0 "bn_mp_submod.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a - b (mod c) */ +int +mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sub (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_submod.c */ + +/* Start: bn_mp_to_signed_bin.c */ +#line 0 "bn_mp_to_signed_bin.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* store in signed [big endian] format */ +int +mp_to_signed_bin (mp_int * a, unsigned char *b) +{ + int res; + + if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { + return res; + } + b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); + return MP_OKAY; +} + +/* End: bn_mp_to_signed_bin.c */ + +/* Start: bn_mp_to_unsigned_bin.c */ +#line 0 "bn_mp_to_unsigned_bin.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* store in unsigned [big endian] format */ +int +mp_to_unsigned_bin (mp_int * a, unsigned char *b) +{ + int x, res; + mp_int t; + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + x = 0; + while (mp_iszero (&t) == 0) { + if (DIGIT_BIT != 7) { + b[x++] = (unsigned char) (t.dp[0] & 255); + } else { + b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); + } + if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + bn_reverse (b, x); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_to_unsigned_bin.c */ + +/* Start: bn_mp_toom_mul.c */ +#line 0 "bn_mp_toom_mul.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -5033,518 +5549,7 @@ mp_reduce_setup (mp_int * a, mp_int * b) */ #include -/* shift right a certain amount of digits */ -void -mp_rshd (mp_int * a, int b) -{ - int x; - - /* if b <= 0 then ignore it */ - if (b <= 0) { - return; - } - - /* if b > used then simply zero it and return */ - if (a->used <= b) { - mp_zero (a); - return; - } - - { - register mp_digit *bottom, *top; - - /* shift the digits down */ - - /* bottom */ - bottom = a->dp; - - /* top [offset into digits] */ - top = a->dp + b; - - /* this is implemented as a sliding window where - * the window is b-digits long and digits from - * the top of the window are copied to the bottom - * - * e.g. - - b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> - /\ | ----> - \-------------------/ ----> - */ - for (x = 0; x < (a->used - b); x++) { - *bottom++ = *top++; - } - - /* zero the top digits */ - for (; x < a->used; x++) { - *bottom++ = 0; - } - } - - /* remove excess digits */ - a->used -= b; -} - -/* End: bn_mp_rshd.c */ - -/* Start: bn_mp_set.c */ -#line 0 "bn_mp_set.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* set to a digit */ -void -mp_set (mp_int * a, mp_digit b) -{ - mp_zero (a); - a->dp[0] = b & MP_MASK; - a->used = (a->dp[0] != 0) ? 1 : 0; -} - -/* End: bn_mp_set.c */ - -/* Start: bn_mp_set_int.c */ -#line 0 "bn_mp_set_int.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* set a 32-bit const */ -int -mp_set_int (mp_int * a, unsigned int b) -{ - int x, res; - - mp_zero (a); - /* set four bits at a time */ - for (x = 0; x < 8; x++) { - /* shift the number up four bits */ - if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { - return res; - } - - /* OR in the top four bits of the source */ - a->dp[0] |= (b >> 28) & 15; - - /* shift the source up to the next four bits */ - b <<= 4; - - /* ensure that digits are not clamped off */ - a->used += 1; - } - mp_clamp (a); - return MP_OKAY; -} - -/* End: bn_mp_set_int.c */ - -/* Start: bn_mp_shrink.c */ -#line 0 "bn_mp_shrink.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* shrink a bignum */ -int -mp_shrink (mp_int * a) -{ - if (a->alloc != a->used) { - if ((a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * a->used)) == NULL) { - return MP_MEM; - } - a->alloc = a->used; - } - return MP_OKAY; -} - -/* End: bn_mp_shrink.c */ - -/* Start: bn_mp_signed_bin_size.c */ -#line 0 "bn_mp_signed_bin_size.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* get the size for an signed equivalent */ -int -mp_signed_bin_size (mp_int * a) -{ - return 1 + mp_unsigned_bin_size (a); -} - -/* End: bn_mp_signed_bin_size.c */ - -/* Start: bn_mp_sqr.c */ -#line 0 "bn_mp_sqr.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* computes b = a*a */ -int -mp_sqr (mp_int * a, mp_int * b) -{ - int res; - if (a->used >= TOOM_SQR_CUTOFF) { - res = mp_toom_sqr(a, b); - } else if (a->used >= KARATSUBA_SQR_CUTOFF) { - res = mp_karatsuba_sqr (a, b); - } else { - - /* can we use the fast multiplier? */ - if ((a->used * 2 + 1) < MP_WARRAY && - a->used < - (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { - res = fast_s_mp_sqr (a, b); - } else { - res = s_mp_sqr (a, b); - } - } - b->sign = MP_ZPOS; - return res; -} - -/* End: bn_mp_sqr.c */ - -/* Start: bn_mp_sqrmod.c */ -#line 0 "bn_mp_sqrmod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* c = a * a (mod b) */ -int -mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) -{ - int res; - mp_int t; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_sqr (a, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - res = mp_mod (&t, b, c); - mp_clear (&t); - return res; -} - -/* End: bn_mp_sqrmod.c */ - -/* Start: bn_mp_sub.c */ -#line 0 "bn_mp_sub.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* high level subtraction (handles signs) */ -int -mp_sub (mp_int * a, mp_int * b, mp_int * c) -{ - int sa, sb, res; - - sa = a->sign; - sb = b->sign; - - if (sa != sb) { - /* subtract a negative from a positive, OR */ - /* subtract a positive from a negative. */ - /* In either case, ADD their magnitudes, */ - /* and use the sign of the first number. */ - c->sign = sa; - res = s_mp_add (a, b, c); - } else { - /* subtract a positive from a positive, OR */ - /* subtract a negative from a negative. */ - /* First, take the difference between their */ - /* magnitudes, then... */ - if (mp_cmp_mag (a, b) != MP_LT) { - /* Copy the sign from the first */ - c->sign = sa; - /* The first has a larger or equal magnitude */ - res = s_mp_sub (a, b, c); - } else { - /* The result has the *opposite* sign from */ - /* the first number. */ - c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; - /* The second has a larger magnitude */ - res = s_mp_sub (b, a, c); - } - } - return res; -} - - -/* End: bn_mp_sub.c */ - -/* Start: bn_mp_sub_d.c */ -#line 0 "bn_mp_sub_d.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* single digit subtraction */ -int -mp_sub_d (mp_int * a, mp_digit b, mp_int * c) -{ - mp_int t; - int res; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - mp_set (&t, b); - res = mp_sub (a, &t, c); - - mp_clear (&t); - return res; -} - -/* End: bn_mp_sub_d.c */ - -/* Start: bn_mp_submod.c */ -#line 0 "bn_mp_submod.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* d = a - b (mod c) */ -int -mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) -{ - int res; - mp_int t; - - - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } - - if ((res = mp_sub (a, b, &t)) != MP_OKAY) { - mp_clear (&t); - return res; - } - res = mp_mod (&t, c, d); - mp_clear (&t); - return res; -} - -/* End: bn_mp_submod.c */ - -/* Start: bn_mp_to_signed_bin.c */ -#line 0 "bn_mp_to_signed_bin.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* store in signed [big endian] format */ -int -mp_to_signed_bin (mp_int * a, unsigned char *b) -{ - int res; - - if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { - return res; - } - b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); - return MP_OKAY; -} - -/* End: bn_mp_to_signed_bin.c */ - -/* Start: bn_mp_to_unsigned_bin.c */ -#line 0 "bn_mp_to_unsigned_bin.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* store in unsigned [big endian] format */ -int -mp_to_unsigned_bin (mp_int * a, unsigned char *b) -{ - int x, res; - mp_int t; - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - - x = 0; - while (mp_iszero (&t) == 0) { - if (DIGIT_BIT != 7) { - b[x++] = (unsigned char) (t.dp[0] & 255); - } else { - b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); - } - if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { - mp_clear (&t); - return res; - } - } - bn_reverse (b, x); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_mp_to_unsigned_bin.c */ - -/* Start: bn_mp_toom_mul.c */ -#line 0 "bn_mp_toom_mul.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* multiplication using Toom-Cook 3-way algorithm */ +/* multiplication using the Toom-Cook 3-way algorithm */ int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) { @@ -5552,14 +5557,16 @@ mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) int res, B; /* init temps */ - if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { + if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, + &a0, &a1, &a2, &b0, &b1, + &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { return res; } /* B */ B = MIN(a->used, b->used) / 3; - /* a = a2 * B^2 + a1 * B + a0 */ + /* a = a2 * B**2 + a1 * B + a0 */ if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { goto ERR; } @@ -5575,7 +5582,7 @@ mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) } mp_rshd(&a2, B*2); - /* b = b2 * B^2 + b1 * B + b0 */ + /* b = b2 * B**2 + b1 * B + b0 */ if ((res = mp_mod_2d(b, DIGIT_BIT * B, &b0)) != MP_OKAY) { goto ERR; } @@ -5689,7 +5696,8 @@ mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) 16 8 4 2 1 1 0 0 0 0 - using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication + using 12 subtractions, 4 shifts, + 2 small divisions and 1 small multiplication */ /* r1 - r4 */ @@ -5792,15 +5800,17 @@ mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) } ERR: - mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL); + mp_clear_multi(&w0, &w1, &w2, &w3, &w4, + &a0, &a1, &a2, &b0, &b1, + &b2, &tmp1, &tmp2, NULL); return res; } - -/* End: bn_mp_toom_mul.c */ - -/* Start: bn_mp_toom_sqr.c */ -#line 0 "bn_mp_toom_sqr.c" + +/* End: bn_mp_toom_mul.c */ + +/* Start: bn_mp_toom_sqr.c */ +#line 0 "bn_mp_toom_sqr.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -6021,543 +6031,551 @@ ERR: return res; } - -/* End: bn_mp_toom_sqr.c */ - -/* Start: bn_mp_unsigned_bin_size.c */ -#line 0 "bn_mp_unsigned_bin_size.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* get the size for an unsigned equivalent */ -int -mp_unsigned_bin_size (mp_int * a) -{ - int size = mp_count_bits (a); - return (size / 8 + ((size & 7) != 0 ? 1 : 0)); -} - -/* End: bn_mp_unsigned_bin_size.c */ - -/* Start: bn_mp_xor.c */ -#line 0 "bn_mp_xor.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* XOR two ints together */ -int -mp_xor (mp_int * a, mp_int * b, mp_int * c) -{ - int res, ix, px; - mp_int t, *x; - - if (a->used > b->used) { - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - px = b->used; - x = b; - } else { - if ((res = mp_init_copy (&t, b)) != MP_OKAY) { - return res; - } - px = a->used; - x = a; - } - - for (ix = 0; ix < px; ix++) { - t.dp[ix] ^= x->dp[ix]; - } - mp_clamp (&t); - mp_exch (c, &t); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_mp_xor.c */ - -/* Start: bn_mp_zero.c */ -#line 0 "bn_mp_zero.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* set to zero */ -void -mp_zero (mp_int * a) -{ - a->sign = MP_ZPOS; - a->used = 0; - memset (a->dp, 0, sizeof (mp_digit) * a->alloc); -} - -/* End: bn_mp_zero.c */ - -/* Start: bn_prime_tab.c */ -#line 0 "bn_prime_tab.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include -const mp_digit __prime_tab[] = { - 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, - 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, - 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, - 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, -#ifndef MP_8BIT - 0x0083, - 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, - 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, - 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, - 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, - - 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, - 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, - 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, - 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, - 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, - 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, - 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, - 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, - - 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, - 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, - 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, - 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, - 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, - 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, - 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, - 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, - - 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, - 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, - 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, - 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, - 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, - 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, - 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, - 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 -#endif -}; - -/* End: bn_prime_tab.c */ - -/* Start: bn_radix.c */ -#line 0 "bn_radix.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* chars used in radix conversions */ -static const char *s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; - -/* read a string [ASCII] in a given radix */ -int -mp_read_radix (mp_int * a, char *str, int radix) -{ - int y, res, neg; - char ch; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - if (*str == '-') { - ++str; - neg = MP_NEG; - } else { - neg = MP_ZPOS; - } - - mp_zero (a); - while (*str) { - ch = (char) ((radix < 36) ? toupper (*str) : *str); - for (y = 0; y < 64; y++) { - if (ch == s_rmap[y]) { - break; - } - } - - if (y < radix) { - if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { - return res; - } - if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { - return res; - } - } else { - break; - } - ++str; - } - a->sign = neg; - return MP_OKAY; -} - -/* stores a bignum as a ASCII string in a given radix (2..64) */ -int -mp_toradix (mp_int * a, char *str, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - char *_s = str; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - - if (t.sign == MP_NEG) { - ++_s; - *str++ = '-'; - t.sign = MP_ZPOS; - } - - digs = 0; - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return res; - } - *str++ = s_rmap[d]; - ++digs; - } - bn_reverse ((unsigned char *)_s, digs); - *str++ = '\0'; - mp_clear (&t); - return MP_OKAY; -} - -/* returns size of ASCII reprensentation */ -int -mp_radix_size (mp_int * a, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - - /* special case for binary */ - if (radix == 2) { - return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; - } - - if (radix < 2 || radix > 64) { - return 0; - } - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return 0; - } - - digs = 0; - if (t.sign == MP_NEG) { - ++digs; - t.sign = MP_ZPOS; - } - - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return 0; - } - ++digs; - } - mp_clear (&t); - return digs + 1; -} - -/* read a bigint from a file stream in ASCII */ -int mp_fread(mp_int *a, int radix, FILE *stream) -{ - int err, ch, neg, y; - - /* clear a */ - mp_zero(a); - - /* if first digit is - then set negative */ - ch = fgetc(stream); - if (ch == '-') { - neg = MP_NEG; - ch = fgetc(stream); - } else { - neg = MP_ZPOS; - } - - for (;;) { - /* find y in the radix map */ - for (y = 0; y < radix; y++) { - if (s_rmap[y] == ch) { - break; - } - } - if (y == radix) { - break; - } - - /* shift up and add */ - if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { - return err; - } - if ((err = mp_add_d(a, y, a)) != MP_OKAY) { - return err; - } - - ch = fgetc(stream); - } - if (mp_cmp_d(a, 0) != MP_EQ) { - a->sign = neg; - } - - return MP_OKAY; -} - -int mp_fwrite(mp_int *a, int radix, FILE *stream) -{ - char *buf; - int err, len, x; - - len = mp_radix_size(a, radix); - if (len == 0) { - return MP_VAL; - } - - buf = malloc(len); - if (buf == NULL) { - return MP_MEM; - } - - if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { - free(buf); - return err; - } - - for (x = 0; x < len; x++) { - if (fputc(buf[x], stream) == EOF) { - free(buf); - return MP_VAL; - } - } - - free(buf); - return MP_OKAY; -} - - -/* End: bn_radix.c */ - -/* Start: bn_reverse.c */ -#line 0 "bn_reverse.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* reverse an array, used for radix code */ -void -bn_reverse (unsigned char *s, int len) -{ - int ix, iy; - unsigned char t; - - ix = 0; - iy = len - 1; - while (ix < iy) { - t = s[ix]; - s[ix] = s[iy]; - s[iy] = t; - ++ix; - --iy; - } -} - -/* End: bn_reverse.c */ - -/* Start: bn_s_mp_add.c */ -#line 0 "bn_s_mp_add.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* low level addition, based on HAC pp.594, Algorithm 14.7 */ -int -s_mp_add (mp_int * a, mp_int * b, mp_int * c) -{ - mp_int *x; - int olduse, res, min, max; - - /* find sizes, we let |a| <= |b| which means we have to sort - * them. "x" will point to the input with the most digits - */ - if (a->used > b->used) { - min = b->used; - max = a->used; - x = a; - } else { - min = a->used; - max = b->used; - x = b; - } - - /* init result */ - if (c->alloc < max + 1) { - if ((res = mp_grow (c, max + 1)) != MP_OKAY) { - return res; - } - } - - /* get old used digit count and set new one */ - olduse = c->used; - c->used = max + 1; - - { - register mp_digit u, *tmpa, *tmpb, *tmpc; - register int i; - - /* alias for digit pointers */ - - /* first input */ - tmpa = a->dp; - - /* second input */ - tmpb = b->dp; - - /* destination */ - tmpc = c->dp; - - /* zero the carry */ - u = 0; - for (i = 0; i < min; i++) { - /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ - *tmpc = *tmpa++ + *tmpb++ + u; - - /* U = carry bit of T[i] */ - u = *tmpc >> ((mp_digit)DIGIT_BIT); - - /* take away carry bit from T[i] */ - *tmpc++ &= MP_MASK; - } - - /* now copy higher words if any, that is in A+B - * if A or B has more digits add those in - */ - if (min != max) { - for (; i < max; i++) { - /* T[i] = X[i] + U */ - *tmpc = x->dp[i] + u; - - /* U = carry bit of T[i] */ - u = *tmpc >> ((mp_digit)DIGIT_BIT); - - /* take away carry bit from T[i] */ - *tmpc++ &= MP_MASK; - } - } - - /* add carry */ - *tmpc++ = u; - - /* clear digits above oldused */ - for (i = c->used; i < olduse; i++) { - *tmpc++ = 0; - } - } - - mp_clamp (c); - return MP_OKAY; -} - -/* End: bn_s_mp_add.c */ - -/* Start: bn_s_mp_exptmod.c */ -#line 0 "bn_s_mp_exptmod.c" + +/* End: bn_mp_toom_sqr.c */ + +/* Start: bn_mp_unsigned_bin_size.c */ +#line 0 "bn_mp_unsigned_bin_size.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the size for an unsigned equivalent */ +int +mp_unsigned_bin_size (mp_int * a) +{ + int size = mp_count_bits (a); + return (size / 8 + ((size & 7) != 0 ? 1 : 0)); +} + +/* End: bn_mp_unsigned_bin_size.c */ + +/* Start: bn_mp_xor.c */ +#line 0 "bn_mp_xor.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* XOR two ints together */ +int +mp_xor (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] ^= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_xor.c */ + +/* Start: bn_mp_zero.c */ +#line 0 "bn_mp_zero.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set to zero */ +void +mp_zero (mp_int * a) +{ + a->sign = MP_ZPOS; + a->used = 0; + memset (a->dp, 0, sizeof (mp_digit) * a->alloc); +} + +/* End: bn_mp_zero.c */ + +/* Start: bn_prime_tab.c */ +#line 0 "bn_prime_tab.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include +const mp_digit __prime_tab[] = { + 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, + 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, + 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, + 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, +#ifndef MP_8BIT + 0x0083, + 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, + 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, + 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, + 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, + + 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, + 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, + 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, + 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, + 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, + 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, + 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, + 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, + + 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, + 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, + 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, + 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, + 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, + 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, + 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, + 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, + + 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, + 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, + 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, + 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, + 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, + 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, + 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, + 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 +#endif +}; + +/* End: bn_prime_tab.c */ + +/* Start: bn_radix.c */ +#line 0 "bn_radix.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* chars used in radix conversions */ +static const char *s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + +/* read a string [ASCII] in a given radix */ +int +mp_read_radix (mp_int * a, char *str, int radix) +{ + int y, res, neg; + char ch; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + if (*str == '-') { + ++str; + neg = MP_NEG; + } else { + neg = MP_ZPOS; + } + + mp_zero (a); + while (*str) { + ch = (char) ((radix < 36) ? toupper (*str) : *str); + for (y = 0; y < 64; y++) { + if (ch == s_rmap[y]) { + break; + } + } + + if (y < radix) { + if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + return res; + } + if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + return res; + } + } else { + break; + } + ++str; + } + a->sign = neg; + return MP_OKAY; +} + +/* stores a bignum as a ASCII string in a given radix (2..64) */ +int +mp_toradix (mp_int * a, char *str, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + if (t.sign == MP_NEG) { + ++_s; + *str++ = '-'; + t.sign = MP_ZPOS; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = s_rmap[d]; + ++digs; + } + bn_reverse ((unsigned char *)_s, digs); + *str++ = '\0'; + mp_clear (&t); + return MP_OKAY; +} + +/* returns size of ASCII reprensentation */ +int +mp_radix_size (mp_int * a, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + + /* special case for binary */ + if (radix == 2) { + return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; + } + + if (radix < 2 || radix > 64) { + return 0; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return 0; + } + + digs = 0; + if (t.sign == MP_NEG) { + ++digs; + t.sign = MP_ZPOS; + } + + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return 0; + } + ++digs; + } + mp_clear (&t); + return digs + 1; +} + +/* read a bigint from a file stream in ASCII */ +int mp_fread(mp_int *a, int radix, FILE *stream) +{ + int err, ch, neg, y; + + /* clear a */ + mp_zero(a); + + /* if first digit is - then set negative */ + ch = fgetc(stream); + if (ch == '-') { + neg = MP_NEG; + ch = fgetc(stream); + } else { + neg = MP_ZPOS; + } + + for (;;) { + /* find y in the radix map */ + for (y = 0; y < radix; y++) { + if (s_rmap[y] == ch) { + break; + } + } + if (y == radix) { + break; + } + + /* shift up and add */ + if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { + return err; + } + if ((err = mp_add_d(a, y, a)) != MP_OKAY) { + return err; + } + + ch = fgetc(stream); + } + if (mp_cmp_d(a, 0) != MP_EQ) { + a->sign = neg; + } + + return MP_OKAY; +} + +int mp_fwrite(mp_int *a, int radix, FILE *stream) +{ + char *buf; + int err, len, x; + + len = mp_radix_size(a, radix); + if (len == 0) { + return MP_VAL; + } + + buf = malloc(len); + if (buf == NULL) { + return MP_MEM; + } + + if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { + free(buf); + return err; + } + + for (x = 0; x < len; x++) { + if (fputc(buf[x], stream) == EOF) { + free(buf); + return MP_VAL; + } + } + + free(buf); + return MP_OKAY; +} + + +/* End: bn_radix.c */ + +/* Start: bn_reverse.c */ +#line 0 "bn_reverse.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reverse an array, used for radix code */ +void +bn_reverse (unsigned char *s, int len) +{ + int ix, iy; + unsigned char t; + + ix = 0; + iy = len - 1; + while (ix < iy) { + t = s[ix]; + s[ix] = s[iy]; + s[iy] = t; + ++ix; + --iy; + } +} + +/* End: bn_reverse.c */ + +/* Start: bn_s_mp_add.c */ +#line 0 "bn_s_mp_add.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ +int +s_mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int *x; + int olduse, res, min, max; + + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else { + min = a->used; + max = b->used; + x = b; + } + + /* init result */ + if (c->alloc < max + 1) { + if ((res = mp_grow (c, max + 1)) != MP_OKAY) { + return res; + } + } + + /* get old used digit count and set new one */ + olduse = c->used; + c->used = max + 1; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + + /* first input */ + tmpa = a->dp; + + /* second input */ + tmpb = b->dp; + + /* destination */ + tmpc = c->dp; + + /* zero the carry */ + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in + */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + } + + /* add carry */ + *tmpc++ = u; + + /* clear digits above oldused */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_s_mp_add.c */ + +/* Start: bn_s_mp_exptmod.c */ +#line 0 "bn_s_mp_exptmod.c" /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is library that provides for multiple-precision @@ -6625,21 +6643,26 @@ s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* create M table * - * The M table contains powers of the input base, e.g. M[x] = G**x mod P + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P * - * The first half of the table is not computed though accept for M[0] and M[1] + * The first half of the table is not + * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { goto __MU; } - /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { goto __MU; } for (x = 0; x < (winsize - 1); x++) { - if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { goto __MU; } if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { @@ -6769,381 +6792,381 @@ __M: } return err; } - -/* End: bn_s_mp_exptmod.c */ - -/* Start: bn_s_mp_mul_digs.c */ -#line 0 "bn_s_mp_mul_digs.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* multiplies |a| * |b| and only computes upto digs digits of result - * HAC pp. 595, Algorithm 14.12 Modified so you can control how - * many digits of output are created. - */ -int -s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) -{ - mp_int t; - int res, pa, pb, ix, iy; - mp_digit u; - mp_word r; - mp_digit tmpx, *tmpt, *tmpy; - - /* can we use the fast multiplier? */ - if (((digs) < MP_WARRAY) && - MIN (a->used, b->used) < - (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { - return fast_s_mp_mul_digs (a, b, c, digs); - } - - if ((res = mp_init_size (&t, digs)) != MP_OKAY) { - return res; - } - t.used = digs; - - /* compute the digits of the product directly */ - pa = a->used; - for (ix = 0; ix < pa; ix++) { - /* set the carry to zero */ - u = 0; - - /* limit ourselves to making digs digits of output */ - pb = MIN (b->used, digs - ix); - - /* setup some aliases */ - /* copy of the digit from a used within the nested loop */ - tmpx = a->dp[ix]; - - /* an alias for the destination shifted ix places */ - tmpt = t.dp + ix; - - /* an alias for the digits of b */ - tmpy = b->dp; - - /* compute the columns of the output and propagate the carry */ - for (iy = 0; iy < pb; iy++) { - /* compute the column as a mp_word */ - r = ((mp_word) *tmpt) + - ((mp_word) tmpx) * ((mp_word) * tmpy++) + - ((mp_word) u); - - /* the new column is the lower part of the result */ - *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); - - /* get the carry word from the result */ - u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); - } - /* set carry if it is placed below digs */ - if (ix + iy < digs) { - *tmpt = u; - } - } - - mp_clamp (&t); - mp_exch (&t, c); - - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_s_mp_mul_digs.c */ - -/* Start: bn_s_mp_mul_high_digs.c */ -#line 0 "bn_s_mp_mul_high_digs.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* multiplies |a| * |b| and does not compute the lower digs digits - * [meant to get the higher part of the product] - */ -int -s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) -{ - mp_int t; - int res, pa, pb, ix, iy; - mp_digit u; - mp_word r; - mp_digit tmpx, *tmpt, *tmpy; - - - /* can we use the fast multiplier? */ - if (((a->used + b->used + 1) < MP_WARRAY) - && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { - return fast_s_mp_mul_high_digs (a, b, c, digs); - } - - if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { - return res; - } - t.used = a->used + b->used + 1; - - pa = a->used; - pb = b->used; - for (ix = 0; ix < pa; ix++) { - /* clear the carry */ - u = 0; - - /* left hand side of A[ix] * B[iy] */ - tmpx = a->dp[ix]; - - /* alias to the address of where the digits will be stored */ - tmpt = &(t.dp[digs]); - - /* alias for where to read the right hand side from */ - tmpy = b->dp + (digs - ix); - - for (iy = digs - ix; iy < pb; iy++) { - /* calculate the double precision result */ - r = ((mp_word) * tmpt) + ((mp_word) tmpx) * ((mp_word) * tmpy++) + ((mp_word) u); - - /* get the lower part */ - *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); - - /* carry the carry */ - u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); - } - *tmpt = u; - } - mp_clamp (&t); - mp_exch (&t, c); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_s_mp_mul_high_digs.c */ - -/* Start: bn_s_mp_sqr.c */ -#line 0 "bn_s_mp_sqr.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ -int -s_mp_sqr (mp_int * a, mp_int * b) -{ - mp_int t; - int res, ix, iy, pa; - mp_word r; - mp_digit u, tmpx, *tmpt; - - pa = a->used; - if ((res = mp_init_size (&t, pa + pa + 1)) != MP_OKAY) { - return res; - } - t.used = pa + pa + 1; - - for (ix = 0; ix < pa; ix++) { - /* first calculate the digit at 2*ix */ - /* calculate double precision result */ - r = ((mp_word) t.dp[ix + ix]) + - ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); - - /* store lower part in result */ - t.dp[ix + ix] = (mp_digit) (r & ((mp_word) MP_MASK)); - - /* get the carry */ - u = (r >> ((mp_word) DIGIT_BIT)); - - /* left hand side of A[ix] * A[iy] */ - tmpx = a->dp[ix]; - - /* alias for where to store the results */ - tmpt = t.dp + (ix + ix + 1); - - for (iy = ix + 1; iy < pa; iy++) { - /* first calculate the product */ - r = ((mp_word) tmpx) * ((mp_word) a->dp[iy]); - - /* now calculate the double precision result, note we use - * addition instead of *2 since its easier to optimize - */ - r = ((mp_word) * tmpt) + r + r + ((mp_word) u); - - /* store lower part */ - *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); - - /* get carry */ - u = (r >> ((mp_word) DIGIT_BIT)); - } - /* propagate upwards */ - while (u != ((mp_digit) 0)) { - r = ((mp_word) * tmpt) + ((mp_word) u); - *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); - u = (r >> ((mp_word) DIGIT_BIT)); - } - } - - mp_clamp (&t); - mp_exch (&t, b); - mp_clear (&t); - return MP_OKAY; -} - -/* End: bn_s_mp_sqr.c */ - -/* Start: bn_s_mp_sub.c */ -#line 0 "bn_s_mp_sub.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ -int -s_mp_sub (mp_int * a, mp_int * b, mp_int * c) -{ - int olduse, res, min, max; - - /* find sizes */ - min = b->used; - max = a->used; - - /* init result */ - if (c->alloc < max) { - if ((res = mp_grow (c, max)) != MP_OKAY) { - return res; - } - } - olduse = c->used; - c->used = max; - - { - register mp_digit u, *tmpa, *tmpb, *tmpc; - register int i; - - /* alias for digit pointers */ - tmpa = a->dp; - tmpb = b->dp; - tmpc = c->dp; - - /* set carry to zero */ - u = 0; - for (i = 0; i < min; i++) { - /* T[i] = A[i] - B[i] - U */ - *tmpc = *tmpa++ - *tmpb++ - u; - - /* U = carry bit of T[i] - * Note this saves performing an AND operation since - * if a carry does occur it will propagate all the way to the - * MSB. As a result a single shift is enough to get the carry - */ - u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); - - /* Clear carry from T[i] */ - *tmpc++ &= MP_MASK; - } - - /* now copy higher words if any, e.g. if A has more digits than B */ - for (; i < max; i++) { - /* T[i] = A[i] - U */ - *tmpc = *tmpa++ - u; - - /* U = carry bit of T[i] */ - u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); - - /* Clear carry from T[i] */ - *tmpc++ &= MP_MASK; - } - - /* clear digits above used (since we may not have grown result above) */ - for (i = c->used; i < olduse; i++) { - *tmpc++ = 0; - } - } - - mp_clamp (c); - return MP_OKAY; -} - - -/* End: bn_s_mp_sub.c */ - -/* Start: bncore.c */ -#line 0 "bncore.c" -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Known optimal configurations - - CPU /Compiler /MUL CUTOFF/SQR CUTOFF -------------------------------------------------------------- - Intel P4 /GCC v3.2 / 70/ 108 - AMD Athlon XP /GCC v3.2 / 109/ 127 - -*/ - -/* configured for a AMD XP Thoroughbred core with etc/tune.c */ -int KARATSUBA_MUL_CUTOFF = 109, /* Min. number of digits before Karatsuba multiplication is used. */ - KARATSUBA_SQR_CUTOFF = 127, /* Min. number of digits before Karatsuba squaring is used. */ - - TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ - TOOM_SQR_CUTOFF = 400; - -/* End: bncore.c */ - - -/* EOF */ + +/* End: bn_s_mp_exptmod.c */ + +/* Start: bn_s_mp_mul_digs.c */ +#line 0 "bn_s_mp_mul_digs.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiplies |a| * |b| and only computes upto digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how + * many digits of output are created. + */ +int +s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ + if (((digs) < MP_WARRAY) && + MIN (a->used, b->used) < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, digs)) != MP_OKAY) { + return res; + } + t.used = digs; + + /* compute the digits of the product directly */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* set the carry to zero */ + u = 0; + + /* limit ourselves to making digs digits of output */ + pb = MIN (b->used, digs - ix); + + /* setup some aliases */ + /* copy of the digit from a used within the nested loop */ + tmpx = a->dp[ix]; + + /* an alias for the destination shifted ix places */ + tmpt = t.dp + ix; + + /* an alias for the digits of b */ + tmpy = b->dp; + + /* compute the columns of the output and propagate the carry */ + for (iy = 0; iy < pb; iy++) { + /* compute the column as a mp_word */ + r = ((mp_word) *tmpt) + + ((mp_word) tmpx) * ((mp_word) * tmpy++) + + ((mp_word) u); + + /* the new column is the lower part of the result */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry word from the result */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + /* set carry if it is placed below digs */ + if (ix + iy < digs) { + *tmpt = u; + } + } + + mp_clamp (&t); + mp_exch (&t, c); + + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_mul_digs.c */ + +/* Start: bn_s_mp_mul_high_digs.c */ +#line 0 "bn_s_mp_mul_high_digs.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiplies |a| * |b| and does not compute the lower digs digits + * [meant to get the higher part of the product] + */ +int +s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + + /* can we use the fast multiplier? */ + if (((a->used + b->used + 1) < MP_WARRAY) + && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_high_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { + return res; + } + t.used = a->used + b->used + 1; + + pa = a->used; + pb = b->used; + for (ix = 0; ix < pa; ix++) { + /* clear the carry */ + u = 0; + + /* left hand side of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ + tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ + tmpy = b->dp + (digs - ix); + + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ + r = ((mp_word) * tmpt) + ((mp_word) tmpx) * ((mp_word) * tmpy++) + ((mp_word) u); + + /* get the lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* carry the carry */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpt = u; + } + mp_clamp (&t); + mp_exch (&t, c); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_mul_high_digs.c */ + +/* Start: bn_s_mp_sqr.c */ +#line 0 "bn_s_mp_sqr.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ +int +s_mp_sqr (mp_int * a, mp_int * b) +{ + mp_int t; + int res, ix, iy, pa; + mp_word r; + mp_digit u, tmpx, *tmpt; + + pa = a->used; + if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { + return res; + } + t.used = 2*pa + 1; + + for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ + r = ((mp_word) t.dp[2*ix]) + + ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); + + /* store lower part in result */ + t.dp[2*ix] = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry */ + u = (r >> ((mp_word) DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for where to store the results */ + tmpt = t.dp + (2*ix + 1); + + for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ + r = ((mp_word) tmpx) * ((mp_word) a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since it's easier to optimize + */ + r = ((mp_word) * tmpt) + r + r + ((mp_word) u); + + /* store lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get carry */ + u = (r >> ((mp_word) DIGIT_BIT)); + } + /* propagate upwards */ + while (u != ((mp_digit) 0)) { + r = ((mp_word) * tmpt) + ((mp_word) u); + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (r >> ((mp_word) DIGIT_BIT)); + } + } + + mp_clamp (&t); + mp_exch (&t, b); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_sqr.c */ + +/* Start: bn_s_mp_sub.c */ +#line 0 "bn_s_mp_sub.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ +int +s_mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int olduse, res, min, max; + + /* find sizes */ + min = b->used; + max = a->used; + + /* init result */ + if (c->alloc < max) { + if ((res = mp_grow (c, max)) != MP_OKAY) { + return res; + } + } + olduse = c->used; + c->used = max; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + tmpa = a->dp; + tmpb = b->dp; + tmpc = c->dp; + + /* set carry to zero */ + u = 0; + for (i = 0; i < min; i++) { + /* T[i] = A[i] - B[i] - U */ + *tmpc = *tmpa++ - *tmpb++ - u; + + /* U = carry bit of T[i] + * Note this saves performing an AND operation since + * if a carry does occur it will propagate all the way to the + * MSB. As a result a single shift is enough to get the carry + */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, e.g. if A has more digits than B */ + for (; i < max; i++) { + /* T[i] = A[i] - U */ + *tmpc = *tmpa++ - u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + + +/* End: bn_s_mp_sub.c */ + +/* Start: bncore.c */ +#line 0 "bncore.c" +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Known optimal configurations + + CPU /Compiler /MUL CUTOFF/SQR CUTOFF +------------------------------------------------------------- + Intel P4 /GCC v3.2 / 70/ 108 + AMD Athlon XP /GCC v3.2 / 109/ 127 + +*/ + +/* configured for a AMD XP Thoroughbred core with etc/tune.c */ +int KARATSUBA_MUL_CUTOFF = 109, /* Min. number of digits before Karatsuba multiplication is used. */ + KARATSUBA_SQR_CUTOFF = 127, /* Min. number of digits before Karatsuba squaring is used. */ + + TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ + TOOM_SQR_CUTOFF = 400; + +/* End: bncore.c */ + + +/* EOF */ diff --git a/mycrypt.h b/mycrypt.h index 3a09a73..68f7144 100644 --- a/mycrypt.h +++ b/mycrypt.h @@ -16,8 +16,8 @@ extern "C" { #endif /* version */ -#define CRYPT 0x0084 -#define SCRYPT "0.84" +#define CRYPT 0x0085 +#define SCRYPT "0.85" /* max size of either a cipher/hash block or symmetric key [largest of the two] */ #define MAXBLOCKSIZE 128 diff --git a/mycrypt_cipher.h b/mycrypt_cipher.h index 800b702..f7a3419 100644 --- a/mycrypt_cipher.h +++ b/mycrypt_cipher.h @@ -30,15 +30,10 @@ struct saferp_key { }; #endif -#ifdef SERPENT -struct serpent_key { - unsigned long K[132]; -}; -#endif - #ifdef RIJNDAEL struct rijndael_key { - unsigned long eK[64], dK[64], k_len; + unsigned long eK[64], dK[64]; + int Nr; }; #endif @@ -96,7 +91,7 @@ struct cast5_key { #ifdef NOEKEON struct noekeon_key { - unsigned long K[4], dK[4]; + unsigned long K[4], dK[4]; }; #endif @@ -126,9 +121,6 @@ typedef union Symmetric_key { #ifdef SAFERP struct saferp_key saferp; #endif -#ifdef SERPENT - struct serpent_key serpent; -#endif #ifdef RIJNDAEL struct rijndael_key rijndael; #endif @@ -251,23 +243,14 @@ extern int safer_128_keysize(int *desired_keysize); extern const struct _cipher_descriptor safer_k64_desc, safer_k128_desc, safer_sk64_desc, safer_sk128_desc; #endif -#ifdef SERPENT -extern int serpent_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); -extern void serpent_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key); -extern void serpent_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key); -extern int serpent_test(void); -extern int serpent_keysize(int *desired_keysize); -extern const struct _cipher_descriptor serpent_desc; -#endif - #ifdef RIJNDAEL /* make aes an alias */ -#define aes_setup rijndael_setup -#define aes_ecb_encrypt rijndael_ecb_encrypt -#define aes_ecb_decrypt rijndael_ecb_decrypt -#define aes_test rijndael_test -#define aes_keysize rijndael_keysize +#define aes_setup rijndael_setup +#define aes_ecb_encrypt rijndael_ecb_encrypt +#define aes_ecb_decrypt rijndael_ecb_decrypt +#define aes_test rijndael_test +#define aes_keysize rijndael_keysize extern int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); extern void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key); @@ -363,7 +346,7 @@ extern int ctr_start(int cipher, const unsigned char *IV, const unsigned char *k extern int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr); extern int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr); #endif - + extern int find_cipher(const char *name); extern int find_cipher_any(const char *name, int blocklen, int keylen); extern int find_cipher_id(unsigned char ID); diff --git a/mycrypt_custom.h b/mycrypt_custom.h index ad6081f..6e59e92 100644 --- a/mycrypt_custom.h +++ b/mycrypt_custom.h @@ -1,16 +1,14 @@ /* This header is meant to be included before mycrypt.h in projects where - * you don't want to throw all the defines in a makefile. + * you don't want to throw all the defines in a makefile. */ #ifndef MYCRYPT_CUSTOM_H_ #define MYCRYPT_CUSTOM_H_ #ifdef CRYPT - #error mycrypt_custom.h should be included before mycrypt.h + #error mycrypt_custom.h should be included before mycrypt.h #endif -#define LTC_TEST - #define XMALLOC malloc #define XREALLOC realloc #define XCALLOC calloc @@ -18,11 +16,11 @@ #define XCLOCK clock #define XCLOCKS_PER_SEC CLOCKS_PER_SEC #define SMALL_CODE +#define LTC_TEST #define BLOWFISH #define RC2 #define RC5 #define RC6 -#define SERPENT #define SAFERP #define SAFER #define RIJNDAEL diff --git a/mycrypt_hash.h b/mycrypt_hash.h index 2b277a7..854b7e9 100644 --- a/mycrypt_hash.h +++ b/mycrypt_hash.h @@ -183,4 +183,3 @@ extern int hmac_file(int hash, const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *dst, unsigned long *dstlen); #endif - diff --git a/prime.c b/prime.c index b50baf2..20571d6 100644 --- a/prime.c +++ b/prime.c @@ -45,7 +45,7 @@ loop: dist += step; x = -1; } } - + /* recalc the total distance from where we started */ total_dist += dist; diff --git a/serpent.c b/serpent.c deleted file mode 100644 index 8ea4a9c..0000000 --- a/serpent.c +++ /dev/null @@ -1,702 +0,0 @@ -#include "mycrypt.h" - -#ifdef SERPENT - -const struct _cipher_descriptor serpent_desc = -{ - "serpent", - 5, - 16, 32, 16, 32, - &serpent_setup, - &serpent_ecb_encrypt, - &serpent_ecb_decrypt, - &serpent_test, - &serpent_keysize -}; - -/* These defines are derived from Brian Gladman's work. Contact him at gladman@seven77.demon.co.uk - * - * Available on the web at http://fp.gladman.plus.com/cryptography_technology/aes/index.htm - */ -#define sb0(a,b,c,d,e,f,g,h) \ - t1 = a ^ d; \ - t2 = a & d; \ - t3 = c ^ t1; \ - t6 = b & t1; \ - t4 = b ^ t3; \ - t10 = ~t3; \ - h = t2 ^ t4; \ - t7 = a ^ t6; \ - t14 = ~t7; \ - t8 = c | t7; \ - t11 = t3 ^ t7; \ - g = t4 ^ t8; \ - t12 = h & t11; \ - f = t10 ^ t12; \ - e = t12 ^ t14 - -/* 15 terms */ - -#define ib0(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = a ^ b; \ - t3 = t1 | t2; \ - t4 = d ^ t3; \ - t7 = d & t2; \ - t5 = c ^ t4; \ - t8 = t1 ^ t7; \ - g = t2 ^ t5; \ - t11 = a & t4; \ - t9 = g & t8; \ - t14 = t5 ^ t8; \ - f = t4 ^ t9; \ - t12 = t5 | f; \ - h = t11 ^ t12; \ - e = h ^ t14 - -/* 14 terms! */ - -#define sb1(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = b ^ t1; \ - t3 = a | t2; \ - t4 = d | t2; \ - t5 = c ^ t3; \ - g = d ^ t5; \ - t7 = b ^ t4; \ - t8 = t2 ^ g; \ - t9 = t5 & t7; \ - h = t8 ^ t9; \ - t11 = t5 ^ t7; \ - f = h ^ t11; \ - t13 = t8 & t11; \ - e = t5 ^ t13 - -/* 17 terms */ - -#define ib1(a,b,c,d,e,f,g,h) \ - t1 = a ^ d; \ - t2 = a & b; \ - t3 = b ^ c; \ - t4 = a ^ t3; \ - t5 = b | d; \ - t7 = c | t1; \ - h = t4 ^ t5; \ - t8 = b ^ t7; \ - t11 = ~t2; \ - t9 = t4 & t8; \ - f = t1 ^ t9; \ - t13 = t9 ^ t11; \ - t12 = h & f; \ - g = t12 ^ t13; \ - t15 = a & d; \ - t16 = c ^ t13; \ - e = t15 ^ t16 - -/* 16 terms */ - -#define sb2(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = b ^ d; \ - t3 = c & t1; \ - t13 = d | t1; \ - e = t2 ^ t3; \ - t5 = c ^ t1; \ - t6 = c ^ e; \ - t7 = b & t6; \ - t10 = e | t5; \ - h = t5 ^ t7; \ - t9 = d | t7; \ - t11 = t9 & t10; \ - t14 = t2 ^ h; \ - g = a ^ t11; \ - t15 = g ^ t13; \ - f = t14 ^ t15 - -/* 16 terms */ - -#define ib2(a,b,c,d,e,f,g,h) \ - t1 = b ^ d; \ - t2 = ~t1; \ - t3 = a ^ c; \ - t4 = c ^ t1; \ - t7 = a | t2; \ - t5 = b & t4; \ - t8 = d ^ t7; \ - t11 = ~t4; \ - e = t3 ^ t5; \ - t9 = t3 | t8; \ - t14 = d & t11; \ - h = t1 ^ t9; \ - t12 = e | h; \ - f = t11 ^ t12; \ - t15 = t3 ^ t12; \ - g = t14 ^ t15 - -/* 17 terms */ - -#define sb3(a,b,c,d,e,f,g,h) \ - t1 = a ^ c; \ - t2 = d ^ t1; \ - t3 = a & t2; \ - t4 = d ^ t3; \ - t5 = b & t4; \ - g = t2 ^ t5; \ - t7 = a | g; \ - t8 = b | d; \ - t11 = a | d; \ - t9 = t4 & t7; \ - f = t8 ^ t9; \ - t12 = b ^ t11; \ - t13 = g ^ t9; \ - t15 = t3 ^ t8; \ - h = t12 ^ t13; \ - t16 = c & t15; \ - e = t12 ^ t16 - -/* 16 term solution that performs less well than 17 term one - in my environment (PPro/PII) - -#define sb3(a,b,c,d,e,f,g,h) \ - t1 = a ^ b; \ - t2 = a & c; \ - t3 = a | d; \ - t4 = c ^ d; \ - t5 = t1 & t3; \ - t6 = t2 | t5; \ - g = t4 ^ t6; \ - t8 = b ^ t3; \ - t9 = t6 ^ t8; \ - t10 = t4 & t9; \ - e = t1 ^ t10; \ - t12 = g & e; \ - f = t9 ^ t12; \ - t14 = b | d; \ - t15 = t4 ^ t12; \ - h = t14 ^ t15 -*/ - -/* 17 terms */ - -#define ib3(a,b,c,d,e,f,g,h) \ - t1 = b ^ c; \ - t2 = b | c; \ - t3 = a ^ c; \ - t7 = a ^ d; \ - t4 = t2 ^ t3; \ - t5 = d | t4; \ - t9 = t2 ^ t7; \ - e = t1 ^ t5; \ - t8 = t1 | t5; \ - t11 = a & t4; \ - g = t8 ^ t9; \ - t12 = e | t9; \ - f = t11 ^ t12; \ - t14 = a & g; \ - t15 = t2 ^ t14; \ - t16 = e & t15; \ - h = t4 ^ t16 - -/* 15 terms */ - -#define sb4(a,b,c,d,e,f,g,h) \ - t1 = a ^ d; \ - t2 = d & t1; \ - t3 = c ^ t2; \ - t4 = b | t3; \ - h = t1 ^ t4; \ - t6 = ~b; \ - t7 = t1 | t6; \ - e = t3 ^ t7; \ - t9 = a & e; \ - t10 = t1 ^ t6; \ - t11 = t4 & t10; \ - g = t9 ^ t11; \ - t13 = a ^ t3; \ - t14 = t10 & g; \ - f = t13 ^ t14 - -/* 17 terms */ - -#define ib4(a,b,c,d,e,f,g,h) \ - t1 = c ^ d; \ - t2 = c | d; \ - t3 = b ^ t2; \ - t4 = a & t3; \ - f = t1 ^ t4; \ - t6 = a ^ d; \ - t7 = b | d; \ - t8 = t6 & t7; \ - h = t3 ^ t8; \ - t10 = ~a; \ - t11 = c ^ h; \ - t12 = t10 | t11;\ - e = t3 ^ t12; \ - t14 = c | t4; \ - t15 = t7 ^ t14; \ - t16 = h | t10; \ - g = t15 ^ t16 - -/* 16 terms */ - -#define sb5(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = a ^ b; \ - t3 = a ^ d; \ - t4 = c ^ t1; \ - t5 = t2 | t3; \ - e = t4 ^ t5; \ - t7 = d & e; \ - t8 = t2 ^ e; \ - t10 = t1 | e; \ - f = t7 ^ t8; \ - t11 = t2 | t7; \ - t12 = t3 ^ t10; \ - t14 = b ^ t7; \ - g = t11 ^ t12; \ - t15 = f & t12; \ - h = t14 ^ t15 - -/* 16 terms */ - -#define ib5(a,b,c,d,e,f,g,h) \ - t1 = ~c; \ - t2 = b & t1; \ - t3 = d ^ t2; \ - t4 = a & t3; \ - t5 = b ^ t1; \ - h = t4 ^ t5; \ - t7 = b | h; \ - t8 = a & t7; \ - f = t3 ^ t8; \ - t10 = a | d; \ - t11 = t1 ^ t7; \ - e = t10 ^ t11; \ - t13 = a ^ c; \ - t14 = b & t10; \ - t15 = t4 | t13; \ - g = t14 ^ t15 - -/* 15 terms */ - -#define sb6(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = a ^ d; \ - t3 = b ^ t2; \ - t4 = t1 | t2; \ - t5 = c ^ t4; \ - f = b ^ t5; \ - t13 = ~t5; \ - t7 = t2 | f; \ - t8 = d ^ t7; \ - t9 = t5 & t8; \ - g = t3 ^ t9; \ - t11 = t5 ^ t8; \ - e = g ^ t11; \ - t14 = t3 & t11; \ - h = t13 ^ t14 - -/* 15 terms */ - -#define ib6(a,b,c,d,e,f,g,h) \ - t1 = ~a; \ - t2 = a ^ b; \ - t3 = c ^ t2; \ - t4 = c | t1; \ - t5 = d ^ t4; \ - t13 = d & t1; \ - f = t3 ^ t5; \ - t7 = t3 & t5; \ - t8 = t2 ^ t7; \ - t9 = b | t8; \ - h = t5 ^ t9; \ - t11 = b | h; \ - e = t8 ^ t11; \ - t14 = t3 ^ t11; \ - g = t13 ^ t14 - -/* 17 terms */ - -#define sb7(a,b,c,d,e,f,g,h) \ - t1 = ~c; \ - t2 = b ^ c; \ - t3 = b | t1; \ - t4 = d ^ t3; \ - t5 = a & t4; \ - t7 = a ^ d; \ - h = t2 ^ t5; \ - t8 = b ^ t5; \ - t9 = t2 | t8; \ - t11 = d & t3; \ - f = t7 ^ t9; \ - t12 = t5 ^ f; \ - t15 = t1 | t4; \ - t13 = h & t12; \ - g = t11 ^ t13; \ - t16 = t12 ^ g; \ - e = t15 ^ t16 - -/* 17 terms */ - -#define ib7(a,b,c,d,e,f,g,h) \ - t1 = a & b; \ - t2 = a | b; \ - t3 = c | t1; \ - t4 = d & t2; \ - h = t3 ^ t4; \ - t6 = ~d; \ - t7 = b ^ t4; \ - t8 = h ^ t6; \ - t11 = c ^ t7; \ - t9 = t7 | t8; \ - f = a ^ t9; \ - t12 = d | f; \ - e = t11 ^ t12; \ - t14 = a & h; \ - t15 = t3 ^ f; \ - t16 = e ^ t14; \ - g = t15 ^ t16 - -#define k_xor(r,a,b,c,d) \ - a ^= skey->serpent.K[4 * (r) + 0]; \ - b ^= skey->serpent.K[4 * (r) + 1]; \ - c ^= skey->serpent.K[4 * (r) + 2]; \ - d ^= skey->serpent.K[4 * (r) + 3] - -#define k_set(r,a,b,c,d) \ - a = lkey[4 * (r) + 8]; \ - b = lkey[4 * (r) + 9]; \ - c = lkey[4 * (r) + 10]; \ - d = lkey[4 * (r) + 11] - -#define k_get(r,a,b,c,d) \ - skey->serpent.K[4 * (r) + 0] = a; \ - skey->serpent.K[4 * (r) + 1] = b; \ - skey->serpent.K[4 * (r) + 2] = c; \ - skey->serpent.K[4 * (r) + 3] = d - -/* the linear transformation and its inverse */ - -#define rot(a,b,c,d) \ - a = ROL(a, 13); \ - c = ROL(c, 3); \ - d ^= c ^ (a << 3); \ - b ^= a ^ c; \ - d = ROL(d, 7); \ - b = ROL(b, 1); \ - a ^= b ^ d; \ - c ^= d ^ (b << 7); \ - a = ROL(a, 5); \ - c = ROL(c, 22) - -#define irot(a,b,c,d) \ - c = ROR(c, 22); \ - a = ROR(a, 5); \ - c ^= d ^ (b << 7); \ - a ^= b ^ d; \ - d = ROR(d, 7); \ - b = ROR(b, 1); \ - d ^= c ^ (a << 3); \ - b ^= a ^ c; \ - c = ROR(c, 3); \ - a = ROR(a, 13) - -#ifdef CLEAN_STACK -static int _serpent_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) -#else -int serpent_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) -#endif -{ - unsigned long lkey[140], t, a, b, c, d, e, f, g, h, x; - unsigned long t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; - unsigned char buf[32]; - - _ARGCHK(key != NULL); - _ARGCHK(skey != NULL); - - /* check rounds */ - if (num_rounds != 0 && num_rounds != 32) { - return CRYPT_INVALID_ROUNDS; - } - - /* check keylen */ - if (keylen < 16 || keylen > 32) { - return CRYPT_INVALID_KEYSIZE; - } - - /* copy key and expand to 32bytes as required */ - for (x = 0; x < (unsigned long)keylen; x++) { - buf[x] = key[x]; - } - - if (x < 32) { - buf[x++] = (unsigned char)0x01; - while (x < 32) { - buf[x++] = (unsigned char)0; - } - } - - /* copy key into 32-bit words */ - for (x = 0; x < 8; x++) { - LOAD32L(lkey[x], &buf[x*4]); - } - - /* expand using the LFSR to 140 words */ - for (x = 0; x < 132; x++) { - t = lkey[x] ^ lkey[x+3] ^ lkey[x+5] ^ lkey[x+7] ^ x ^ 0x9E3779B9UL; - lkey[x + 8] = ROL(t, 11); - } - - /* perform the substituions */ - for (x = 0; x < 32; ) { - k_set( x,a,b,c,d);sb3(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb2(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb1(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb0(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb7(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb6(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb5(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - k_set( x,a,b,c,d);sb4(a,b,c,d,e,f,g,h);k_get( x,e,f,g,h); ++x; - } - k_set(32,a,b,c,d);sb3(a,b,c,d,e,f,g,h);k_get(32,e,f,g,h); - return CRYPT_OK; -} - -#ifdef CLEAN_STACK -int serpent_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) -{ - int x; - x = _serpent_setup(key, keylen, num_rounds, skey); - burn_stack(sizeof(unsigned long)*166 + sizeof(unsigned char)*32); - return x; -} -#endif - -#ifdef CLEAN_STACK -static void _serpent_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) -#else -void serpent_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) -#endif -{ - unsigned long a,b,c,d,e,f,g,h; - unsigned long t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; - - _ARGCHK(pt != NULL); - _ARGCHK(ct != NULL); - _ARGCHK(skey != NULL); - - LOAD32L(a, &pt[0]);LOAD32L(b, &pt[4]);LOAD32L(c, &pt[8]);LOAD32L(d, &pt[12]); - k_xor( 0,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor( 1,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor( 2,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor( 3,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor( 4,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor( 5,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor( 6,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor( 7,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor( 8,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor( 9,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(10,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(11,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(12,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(13,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(14,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(15,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(16,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(17,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(18,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(19,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(20,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(21,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(22,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(23,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(24,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(25,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(26,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(27,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(28,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(29,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); - k_xor(30,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); - k_xor(31,e,f,g,h); sb7(e,f,g,h,a,b,c,d); k_xor(32,a,b,c,d); - STORE32L(a, &ct[0]);STORE32L(b, &ct[4]);STORE32L(c, &ct[8]);STORE32L(d, &ct[12]); -} - -#ifdef CLEAN_STACK -void serpent_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) -{ - _serpent_ecb_encrypt(pt, ct, skey); - burn_stack(sizeof(unsigned long)*24); -} -#endif - -#ifdef CLEAN_STACK -static void _serpent_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) -#else -void serpent_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) -#endif -{ - unsigned long a,b,c,d,e,f,g,h; - unsigned long t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; - - _ARGCHK(pt != NULL); - _ARGCHK(ct != NULL); - _ARGCHK(skey != NULL); - - LOAD32L(a, &ct[0]);LOAD32L(b, &ct[4]);LOAD32L(c, &ct[8]);LOAD32L(d, &ct[12]); - k_xor(32,a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(31,e,f,g,h); - irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(30,a,b,c,d); - irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(29,e,f,g,h); - irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(28,a,b,c,d); - irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(27,e,f,g,h); - irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(26,a,b,c,d); - irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(25,e,f,g,h); - irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(24,a,b,c,d); - irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(23,e,f,g,h); - irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(22,a,b,c,d); - irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(21,e,f,g,h); - irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(20,a,b,c,d); - irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(19,e,f,g,h); - irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(18,a,b,c,d); - irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(17,e,f,g,h); - irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(16,a,b,c,d); - irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(15,e,f,g,h); - irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(14,a,b,c,d); - irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(13,e,f,g,h); - irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(12,a,b,c,d); - irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(11,e,f,g,h); - irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(10,a,b,c,d); - irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 9,e,f,g,h); - irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 8,a,b,c,d); - irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor( 7,e,f,g,h); - irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor( 6,a,b,c,d); - irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor( 5,e,f,g,h); - irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor( 4,a,b,c,d); - irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor( 3,e,f,g,h); - irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor( 2,a,b,c,d); - irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 1,e,f,g,h); - irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 0,a,b,c,d); - STORE32L(a, &pt[0]);STORE32L(b, &pt[4]);STORE32L(c, &pt[8]);STORE32L(d, &pt[12]); -} - -#ifdef CLEAN_STACK -void serpent_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) -{ - _serpent_ecb_decrypt(ct, pt, skey); - burn_stack(sizeof(unsigned long)*24); -} -#endif - -int serpent_test(void) -{ - #ifndef LTC_TEST - return CRYPT_NOP; - #else - static const struct { - int keylen; - unsigned char key[32], pt[16], ct[16]; - } tests[] = { - { - 16, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c, - 0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49 } - }, - { - 16, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }, - { 0x4a, 0xe9, 0xa2, 0x0b, 0x2b, 0x14, 0xa1, 0x02, - 0x90, 0xcb, 0xb8, 0x20, 0xb7, 0xff, 0xb5, 0x10 } - }, - { - 24, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 }, - { 0xe1, 0x1b, 0x01, 0x52, 0x4e, 0xa1, 0xf4, 0x65, - 0xa2, 0xa2, 0x00, 0x43, 0xeb, 0x9f, 0x7e, 0x8a } - }, - { - 32, - { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0xe0, 0x88, 0x5d, 0x44, 0x60, 0x37, 0x34, 0x69, - 0xd1, 0xfa, 0x6c, 0x36, 0xa6, 0xe1, 0xc5, 0x2f } - }, - { - 32, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x17, 0xc6, 0x25, 0x8e, 0x60, 0x09, 0xe2, 0x82, - 0x66, 0x18, 0x69, 0xd5, 0x25, 0xf7, 0xd2, 0x04 } - }, - { - 32, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x9f, 0xe1, 0x43, 0x25, 0x0d, 0x00, 0xe2, 0x56, - 0x96, 0xb0, 0x1e, 0x0a, 0x2e, 0xd0, 0x5d, 0xb3 } - } - }; - - unsigned char buf[2][16]; - int x, err; - symmetric_key key; - - for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) { - /* setup key */ - if ((err = serpent_setup(tests[x].key, tests[x].keylen, 0, &key))!= CRYPT_OK) { - return err; - } - - /* encrypt and decrypt */ - serpent_ecb_encrypt(tests[x].pt, buf[0], &key); - serpent_ecb_decrypt(buf[0], buf[1], &key); - - /* compare */ - if (memcmp(buf[0], tests[x].ct, 16) != 0 || memcmp(buf[1], tests[x].pt, 16) != 0) { - return CRYPT_FAIL_TESTVECTOR; - } - } - return CRYPT_OK; - #endif -} - -int serpent_keysize(int *desired_keysize) -{ - _ARGCHK(desired_keysize != NULL); - - if (*desired_keysize < 16) - return CRYPT_INVALID_KEYSIZE; - if (*desired_keysize > 32) - *desired_keysize = 32; - return CRYPT_OK; -} - -#endif - - diff --git a/sha1.c b/sha1.c index b273165..f0e5818 100644 --- a/sha1.c +++ b/sha1.c @@ -14,7 +14,7 @@ const struct _hash_descriptor sha1_desc = &sha1_test }; -#define F0(x,y,z) ( (x&y) | ((~x)&z) ) +#define F0(x,y,z) (z ^ (x & (y ^ z))) #define F1(x,y,z) (x ^ y ^ z) #define F2(x,y,z) ((x & y) | (z & (x | y))) #define F3(x,y,z) (x ^ y ^ z) diff --git a/sha256.c b/sha256.c index 33fd96f..f14e72f 100644 --- a/sha256.c +++ b/sha256.c @@ -32,7 +32,7 @@ static const unsigned long K[64] = { }; /* Various logical functions */ -#define Ch(x,y,z) ((x & y) | (~x & z)) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) #define Maj(x,y,z) (((x | y) & z) | (x & y)) #define S(x, n) ROR((x),(n)) #define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) diff --git a/sha512.c b/sha512.c index 88317e4..53b33ac 100644 --- a/sha512.c +++ b/sha512.c @@ -59,7 +59,7 @@ CONST64(0x5fcb6fab3ad6faec), CONST64(0x6c44198c4a475817) }; /* Various logical functions */ -#define Ch(x,y,z) ((x & y) | (~x & z)) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) #define Maj(x,y,z) (((x | y) & z) | (x & y)) #define S(x, n) ROR64((x),(n)) #define R(x, n) (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)n)) diff --git a/tdcal.pdf b/tdcal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4f4b35d72b373c6d41963aa62da5856b0c0d3a2 GIT binary patch literal 56674 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 literal 0 HcmV?d00001 diff --git a/twofish.c b/twofish.c index 2d09589..bfc77fc 100644 --- a/twofish.c +++ b/twofish.c @@ -397,9 +397,9 @@ static unsigned long g_func(unsigned long x, symmetric_key *key) burn_stack(sizeof(unsigned char) * 4 + sizeof(unsigned long)); return y; } -#endif +#endif /* CLEAN_STACK */ -#endif +#endif /* TWOFISH_SMALL */ #ifdef CLEAN_STACK static int _twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) diff --git a/yarrow.c b/yarrow.c index 6261edc..ee53a5c 100644 --- a/yarrow.c +++ b/yarrow.c @@ -28,8 +28,6 @@ int yarrow_start(prng_state *prng) prng->yarrow.cipher = register_cipher(&twofish_desc); #elif defined(CAST5) prng->yarrow.cipher = register_cipher(&cast5_desc); -#elif defined(SERPENT) - prng->yarrow.cipher = register_cipher(&serpent_desc); #elif defined(SAFER) prng->yarrow.cipher = register_cipher(&saferp_desc); #elif defined(RC5)

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 z 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