From: Andrei Elkin Date: March 29 2011 2:57pm Subject: bzr commit into mysql-trunk branch (andrei.elkin:3345) List-Archive: http://lists.mysql.com/commits/134174 Message-Id: <201103291457.p2TEvlVR013492@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1718334163==" --===============1718334163== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/MERGE/mysql-trunk/ based on revid:andrei.elkin@stripped 3345 Andrei Elkin 2011-03-29 [merge] merge from the main repo to local mysql-trunk prior to push removed: include/my_handler.h mysys/my_gethostbyname.c mysys/my_handler.c mysys/my_port.c added: include/my_compare.h mysys/my_compare.c modified: extra/perror.c extra/yassl/src/ssl.cpp extra/yassl/taocrypt/include/asn.hpp include/heap.h include/my_global.h include/my_net.h include/myisam.h mysys/CMakeLists.txt mysys/my_handler_errors.h sql/handler.h storage/innobase/row/row0sel.c storage/myisam/ft_stopwords.c storage/myisam/mi_check.c storage/myisam/mi_range.c === modified file 'extra/perror.c' --- a/extra/perror.c 2011-03-28 08:49:43 +0000 +++ b/extra/perror.c 2011-03-29 12:43:49 +0000 @@ -32,7 +32,7 @@ static my_bool verbose, print_all_codes; #include "../include/my_base.h" #include "../mysys/my_handler_errors.h" -#include "../include/my_handler.h" +// #include "../include/my_compare.h" #ifdef WITH_NDBCLUSTER_STORAGE_ENGINE static my_bool ndb_code; @@ -240,7 +240,39 @@ static my_bool print_win_error_msg(DWORD } #endif +/* + Register handler error messages for usage with my_error() + NOTES + This is safe to call multiple times as my_error_register() + will ignore calls to register already registered error numbers. +*/ + +static const char **get_handler_error_messages() +{ + return handler_error_messages; +} + +void my_handler_error_register(void) +{ + /* + If you got compilation error here about compile_time_assert array, check + that every HA_ERR_xxx constant has a corresponding error message in + handler_error_messages[] list (check mysys/ma_handler_errors.h and + include/my_base.h). + */ + compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) == + HA_ERR_LAST + 1); + my_error_register(get_handler_error_messages, HA_ERR_FIRST, + HA_ERR_FIRST+ array_elements(handler_error_messages)-1); +} + + +void my_handler_error_unregister(void) +{ + my_error_unregister(HA_ERR_FIRST, + HA_ERR_FIRST+ array_elements(handler_error_messages)-1); +} int main(int argc,char *argv[]) { === modified file 'extra/yassl/src/ssl.cpp' --- a/extra/yassl/src/ssl.cpp 2011-03-29 08:34:58 +0000 +++ b/extra/yassl/src/ssl.cpp 2011-03-29 12:52:02 +0000 @@ -29,7 +29,6 @@ /* see man pages for function descriptions */ -#include #include "runtime.hpp" #include "openssl/ssl.h" #include "handshake.hpp" === modified file 'extra/yassl/taocrypt/include/asn.hpp' --- a/extra/yassl/taocrypt/include/asn.hpp 2011-03-29 08:01:07 +0000 +++ b/extra/yassl/taocrypt/include/asn.hpp 2011-03-29 12:52:02 +0000 @@ -23,7 +23,7 @@ #ifndef TAO_CRYPT_ASN_HPP #define TAO_CRYPT_ASN_HPP - +#include #include "misc.hpp" #include "block.hpp" #include "error.hpp" @@ -33,9 +33,6 @@ #include "list.hpp" #endif -/* forward declaration for ASN1_TIME_extract */ -struct tm; - namespace STL = STL_NAMESPACE; @@ -375,7 +372,7 @@ int GetCert(Source&); int GetPKCS_Cert(const char* password, Source&); void ASN1_TIME_extract(const unsigned char* date, unsigned char format, - ::tm *parsed_time); + tm *parsed_time); } // namespace === modified file 'include/heap.h' --- a/include/heap.h 2011-03-28 08:51:35 +0000 +++ b/include/heap.h 2011-03-29 12:56:34 +0000 @@ -30,7 +30,7 @@ extern "C" { #include #include -#include "my_handler.h" +#include "my_compare.h" #include "my_tree.h" /* defines used by heap-funktions */ === added file 'include/my_compare.h' --- a/include/my_compare.h 1970-01-01 00:00:00 +0000 +++ b/include/my_compare.h 2011-03-29 12:56:34 +0000 @@ -0,0 +1,147 @@ +/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _my_compare_h +#define _my_compare_h + +#include "myisampack.h" +#ifdef __cplusplus +extern "C" { +#endif + +#include "m_ctype.h" /* CHARSET_INFO */ + +/* + There is a hard limit for the maximum number of keys as there are only + 8 bits in the index file header for the number of keys in a table. + This means that 0..255 keys can exist for a table. The idea of + HA_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on + a MyISAM table for which one has more keys than MyISAM is normally + compiled for. If you don't have this, you will get a core dump when + running myisamchk compiled for 128 keys on a table with 255 keys. +*/ + +#define HA_MAX_POSSIBLE_KEY 255 /* For myisamchk */ +/* + The following defines can be increased if necessary. + But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and HA_MAX_KEY_LENGTH. +*/ + +#define HA_MAX_KEY_LENGTH 1000 /* Max length in bytes */ +#define HA_MAX_KEY_SEG 16 /* Max segments for key */ + +#define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6) +#define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8) + +typedef struct st_HA_KEYSEG /* Key-portion */ +{ + const CHARSET_INFO *charset; + uint32 start; /* Start of key in record */ + uint32 null_pos; /* position to NULL indicator */ + uint16 bit_pos; /* Position to bit part */ + uint16 flag; + uint16 length; /* Keylength */ + uint16 language; + uint8 type; /* Type of key (for sort) */ + uint8 null_bit; /* bitmask to test for NULL */ + uint8 bit_start,bit_end; /* if bit field */ + uint8 bit_length; /* Length of bit part */ +} HA_KEYSEG; + +#define get_key_length(length,key) \ +{ if (*(uchar*) (key) != 255) \ + length= (uint) *(uchar*) ((key)++); \ + else \ + { length= mi_uint2korr((key)+1); (key)+=3; } \ +} + +#define get_key_length_rdonly(length,key) \ +{ if (*(uchar*) (key) != 255) \ + length= ((uint) *(uchar*) ((key))); \ + else \ + { length= mi_uint2korr((key)+1); } \ +} + +#define get_key_pack_length(length,length_pack,key) \ +{ if (*(uchar*) (key) != 255) \ + { length= (uint) *(uchar*) ((key)++); length_pack= 1; }\ + else \ + { length=mi_uint2korr((key)+1); (key)+= 3; length_pack= 3; } \ +} + +#define store_key_length_inc(key,length) \ +{ if ((length) < 255) \ + { *(key)++= (length); } \ + else \ + { *(key)=255; mi_int2store((key)+1,(length)); (key)+=3; } \ +} + +#define size_to_store_key_length(length) ((length) < 255 ? 1 : 3) + +#define get_rec_bits(bit_ptr, bit_ofs, bit_len) \ + (((((uint16) (bit_ptr)[1] << 8) | (uint16) (bit_ptr)[0]) >> (bit_ofs)) & \ + ((1 << (bit_len)) - 1)) + +#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \ +{ \ + (bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \ + ((bits) << (bit_ofs)); \ + if ((bit_ofs) + (bit_len) > 8) \ + (bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \ + ((bits) >> (8 - (bit_ofs))); \ +} + +#define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \ + set_rec_bits(0, bit_ptr, bit_ofs, bit_len) + +extern int ha_compare_text(const CHARSET_INFO *, uchar *, uint, uchar *, uint , + my_bool, my_bool); +extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos); + +/* + Inside an in-memory data record, memory pointers to pieces of the + record (like BLOBs) are stored in their native byte order and in + this amount of bytes. +*/ +#define portable_sizeof_char_ptr 8 + + +/** + Return values of index_cond_func_xxx functions. + + 0=ICP_NO_MATCH - index tuple doesn't satisfy the pushed index condition (the + engine should discard the tuple and go to the next one) + 1=ICP_MATCH - index tuple satisfies the pushed index condition (the engine + should fetch and return the record) + 2=ICP_OUT_OF_RANGE - index tuple is out range that we're scanning, e.g. this + if we're scanning "t.key BETWEEN 10 AND 20" and got a + "t.key=21" tuple (the engine should stop scanning and return + HA_ERR_END_OF_FILE right away). +*/ + +typedef enum icp_result { + ICP_NO_MATCH, + ICP_MATCH, + ICP_OUT_OF_RANGE +} ICP_RESULT; + + +#ifdef __cplusplus +} +#endif + +#endif /* _my_compare_h */ === modified file 'include/my_global.h' --- a/include/my_global.h 2011-03-28 08:51:35 +0000 +++ b/include/my_global.h 2011-03-29 12:56:34 +0000 @@ -280,7 +280,7 @@ C_MODE_END #define ulonglong2double(A) my_ulonglong2double(A) #define my_off_t2double(A) my_ulonglong2double(A) C_MODE_START -double my_ulonglong2double(unsigned long long A); +inline double my_ulonglong2double(unsigned long long A) { return (double A); } C_MODE_END #endif /* _AIX */ === removed file 'include/my_handler.h' --- a/include/my_handler.h 2011-03-09 20:54:55 +0000 +++ b/include/my_handler.h 1970-01-01 00:00:00 +0000 @@ -1,150 +0,0 @@ -/* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; version 2 - of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -#ifndef _my_handler_h -#define _my_handler_h - -#include "myisampack.h" -#ifdef __cplusplus -extern "C" { -#endif - -#include "m_ctype.h" /* CHARSET_INFO */ - -/* - There is a hard limit for the maximum number of keys as there are only - 8 bits in the index file header for the number of keys in a table. - This means that 0..255 keys can exist for a table. The idea of - HA_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on - a MyISAM table for which one has more keys than MyISAM is normally - compiled for. If you don't have this, you will get a core dump when - running myisamchk compiled for 128 keys on a table with 255 keys. -*/ - -#define HA_MAX_POSSIBLE_KEY 255 /* For myisamchk */ -/* - The following defines can be increased if necessary. - But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and HA_MAX_KEY_LENGTH. -*/ - -#define HA_MAX_KEY_LENGTH 1000 /* Max length in bytes */ -#define HA_MAX_KEY_SEG 16 /* Max segments for key */ - -#define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6) -#define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8) - -typedef struct st_HA_KEYSEG /* Key-portion */ -{ - const CHARSET_INFO *charset; - uint32 start; /* Start of key in record */ - uint32 null_pos; /* position to NULL indicator */ - uint16 bit_pos; /* Position to bit part */ - uint16 flag; - uint16 length; /* Keylength */ - uint16 language; - uint8 type; /* Type of key (for sort) */ - uint8 null_bit; /* bitmask to test for NULL */ - uint8 bit_start,bit_end; /* if bit field */ - uint8 bit_length; /* Length of bit part */ -} HA_KEYSEG; - -#define get_key_length(length,key) \ -{ if (*(uchar*) (key) != 255) \ - length= (uint) *(uchar*) ((key)++); \ - else \ - { length= mi_uint2korr((key)+1); (key)+=3; } \ -} - -#define get_key_length_rdonly(length,key) \ -{ if (*(uchar*) (key) != 255) \ - length= ((uint) *(uchar*) ((key))); \ - else \ - { length= mi_uint2korr((key)+1); } \ -} - -#define get_key_pack_length(length,length_pack,key) \ -{ if (*(uchar*) (key) != 255) \ - { length= (uint) *(uchar*) ((key)++); length_pack= 1; }\ - else \ - { length=mi_uint2korr((key)+1); (key)+= 3; length_pack= 3; } \ -} - -#define store_key_length_inc(key,length) \ -{ if ((length) < 255) \ - { *(key)++= (length); } \ - else \ - { *(key)=255; mi_int2store((key)+1,(length)); (key)+=3; } \ -} - -#define size_to_store_key_length(length) ((length) < 255 ? 1 : 3) - -#define get_rec_bits(bit_ptr, bit_ofs, bit_len) \ - (((((uint16) (bit_ptr)[1] << 8) | (uint16) (bit_ptr)[0]) >> (bit_ofs)) & \ - ((1 << (bit_len)) - 1)) - -#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \ -{ \ - (bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \ - ((bits) << (bit_ofs)); \ - if ((bit_ofs) + (bit_len) > 8) \ - (bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \ - ((bits) >> (8 - (bit_ofs))); \ -} - -#define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \ - set_rec_bits(0, bit_ptr, bit_ofs, bit_len) - -extern int ha_compare_text(const CHARSET_INFO *, uchar *, uint, uchar *, - uint, my_bool, my_bool); -extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos); - -extern HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a); -extern void my_handler_error_register(void); -extern void my_handler_error_unregister(void); -/* - Inside an in-memory data record, memory pointers to pieces of the - record (like BLOBs) are stored in their native byte order and in - this amount of bytes. -*/ -#define portable_sizeof_char_ptr 8 - -/** - Return values of index_cond_func_xxx functions. - - 0=ICP_NO_MATCH - index tuple doesn't satisfy the pushed index condition (the - engine should discard the tuple and go to the next one) - 1=ICP_MATCH - index tuple satisfies the pushed index condition (the engine - should fetch and return the record) - 2=ICP_OUT_OF_RANGE - index tuple is out range that we're scanning, e.g. this - if we're scanning "t.key BETWEEN 10 AND 20" and got a - "t.key=21" tuple (the engine should stop scanning and return - HA_ERR_END_OF_FILE right away). -*/ - -typedef enum icp_result { - ICP_NO_MATCH, - ICP_MATCH, - ICP_OUT_OF_RANGE -} ICP_RESULT; - -#ifdef __cplusplus -} -#endif - - -#endif /* _my_handler_h */ === modified file 'include/my_net.h' --- a/include/my_net.h 2010-07-23 20:14:35 +0000 +++ b/include/my_net.h 2011-03-29 12:43:49 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -73,38 +73,6 @@ C_MODE_START #define in_addr_t uint32 #endif -/* - Handling of gethostbyname_r() -*/ - -#if !defined(HAVE_GETHOSTBYNAME_R) -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop); -void my_gethostbyname_r_free(); -#elif defined(HAVE_PTHREAD_ATTR_CREATE) || defined(_AIX) || defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop); -#define my_gethostbyname_r_free() -#if !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) && !defined(HPUX10) -#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) -#endif /* !defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) */ - -#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT) -#define GETHOSTBYNAME_BUFF_SIZE sizeof(struct hostent_data) -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop); -#define my_gethostbyname_r_free() -#else -#define my_gethostbyname_r(A,B,C,D,E) gethostbyname_r((A),(B),(C),(D),(E)) -#define my_gethostbyname_r_free() -#endif /* !defined(HAVE_GETHOSTBYNAME_R) */ - -#ifndef GETHOSTBYNAME_BUFF_SIZE -#define GETHOSTBYNAME_BUFF_SIZE 2048 -#endif C_MODE_END #endif === modified file 'include/myisam.h' --- a/include/myisam.h 2011-03-28 08:51:35 +0000 +++ b/include/myisam.h 2011-03-29 12:56:34 +0000 @@ -1,4 +1,5 @@ -/* Copyright (C) 2000 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (C) 2000, 2011, Oracle and/or its affiliates. All rights + reserved This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +31,7 @@ extern "C" { #ifndef _keycache_h #include "keycache.h" #endif -#include "my_handler.h" +#include "my_compare.h" #include /* === modified file 'mysys/CMakeLists.txt' --- a/mysys/CMakeLists.txt 2011-03-28 08:51:35 +0000 +++ b/mysys/CMakeLists.txt 2011-03-29 12:56:34 +0000 @@ -23,8 +23,8 @@ SET(MYSYS_SOURCES array.c charset-def.c mf_tempfile.c mf_unixpath.c mf_wcomp.c mulalloc.c my_access.c my_aes.c my_alloc.c my_bit.c my_bitmap.c my_chsize.c my_compress.c my_copy.c my_create.c my_delete.c - my_div.c my_error.c my_file.c my_fopen.c my_fstream.c my_gethostbyname.c - my_gethwaddr.c my_getopt.c my_getsystime.c my_getwd.c my_handler.c my_init.c + my_div.c my_error.c my_file.c my_fopen.c my_fstream.c + my_gethwaddr.c my_getopt.c my_getsystime.c my_getwd.c my_compare.c my_init.c my_lib.c my_lock.c my_malloc.c my_mess.c my_mkdir.c my_mmap.c my_once.c my_open.c my_pread.c my_pthread.c my_quick.c my_read.c my_redel.c my_rename.c my_seek.c my_sleep.c @@ -64,11 +64,6 @@ IF(HAVE_MLOCK) SET(MYSYS_SOURCES ${MYSYS_SOURCES} my_lockmem.c) ENDIF() -IF(UNIX) - # some workarounds - SET(MYSYS_SOURCES ${MYSYS_SOURCES} my_port.c) -ENDIF() - ADD_CONVENIENCE_LIBRARY(mysys ${MYSYS_SOURCES}) TARGET_LINK_LIBRARIES(mysys dbug strings ${ZLIB_LIBRARY} ${LIBNSL} ${LIBM} ${LIBRT}) === added file 'mysys/my_compare.c' --- a/mysys/my_compare.c 1970-01-01 00:00:00 +0000 +++ b/mysys/my_compare.c 2011-03-29 12:56:34 +0000 @@ -0,0 +1,476 @@ +/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include +#include + +#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1) + +int ha_compare_text(const CHARSET_INFO *charset_info, uchar *a, uint a_length, + uchar *b, uint b_length, my_bool part_key, + my_bool skip_end_space) +{ + if (!part_key) + return charset_info->coll->strnncollsp(charset_info, a, a_length, + b, b_length, (my_bool)!skip_end_space); + return charset_info->coll->strnncoll(charset_info, a, a_length, + b, b_length, part_key); +} + + +static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, + my_bool part_key, my_bool skip_end_space) +{ + uint length= min(a_length,b_length); + uchar *end= a+ length; + int flag; + + while (a < end) + if ((flag= (int) *a++ - (int) *b++)) + return flag; + if (part_key && b_length < a_length) + return 0; + if (skip_end_space && a_length != b_length) + { + int swap= 1; + /* + We are using space compression. We have to check if longer key + has next character < ' ', in which case it's less than the shorter + key that has an implicite space afterwards. + + This code is identical to the one in + strings/ctype-simple.c:my_strnncollsp_simple + */ + if (a_length < b_length) + { + /* put shorter key in a */ + a_length= b_length; + a= b; + swap= -1; /* swap sign of result */ + } + for (end= a + a_length-length; a < end ; a++) + { + if (*a != ' ') + return (*a < ' ') ? -swap : swap; + } + return 0; + } + return (int) (a_length-b_length); +} + + +/* + Compare two keys + + SYNOPSIS + ha_key_cmp() + keyseg Array of key segments of key to compare + a First key to compare, in format from _mi_pack_key() + This is normally key specified by user + b Second key to compare. This is always from a row + key_length Length of key to compare. This can be shorter than + a to just compare sub keys + next_flag How keys should be compared + If bit SEARCH_FIND is not set the keys includes the row + position and this should also be compared + diff_pos OUT Number of first keypart where values differ, counting + from one. + diff_pos[1] OUT (b + diff_pos[1]) points to first value in tuple b + that is different from corresponding value in tuple a. + + EXAMPLES + Example1: if the function is called for tuples + ('aaa','bbb') and ('eee','fff'), then + diff_pos[0] = 1 (as 'aaa' != 'eee') + diff_pos[1] = 0 (offset from beggining of tuple b to 'eee' keypart). + + Example2: if the index function is called for tuples + ('aaa','bbb') and ('aaa','fff'), + diff_pos[0] = 2 (as 'aaa' != 'eee') + diff_pos[1] = 3 (offset from beggining of tuple b to 'fff' keypart, + here we assume that first key part is CHAR(3) NOT NULL) + + NOTES + Number-keys can't be splited + + RETURN VALUES + <0 If a < b + 0 If a == b + >0 If a > b +*/ + +#define FCMP(A,B) ((int) (A) - (int) (B)) + +int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos) +{ + int flag; + int16 s_1,s_2; + int32 l_1,l_2; + uint32 u_1,u_2; + float f_1,f_2; + double d_1,d_2; + uint next_key_length; + uchar *orig_b= b; + + *diff_pos=0; + for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) + { + uchar *end; + uint piks=! (keyseg->flag & HA_NO_SORT); + (*diff_pos)++; + diff_pos[1]= (uint)(b - orig_b); + + /* Handle NULL part */ + if (keyseg->null_bit) + { + key_length--; + if (*a != *b && piks) + { + flag = (int) *a - (int) *b; + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + } + b++; + if (!*a++) /* If key was NULL */ + { + if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) + nextflag=SEARCH_SAME; /* Allow duplicate keys */ + else if (nextflag & SEARCH_NULL_ARE_NOT_EQUAL) + { + /* + This is only used from mi_check() to calculate cardinality. + It can't be used when searching for a key as this would cause + compare of (a,b) and (b,a) to return the same value. + */ + return -1; + } + next_key_length=key_length; + continue; /* To next key part */ + } + } + end= a+ min(keyseg->length,key_length); + next_key_length=key_length-keyseg->length; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if (piks && + (flag=ha_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0), + (my_bool)!(nextflag & SEARCH_PREFIX)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=(uint) (end-a), a_length=length, b_length=length; + if (piks && + (flag= ha_compare_text(keyseg->charset, a, a_length, b, b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0), + (my_bool)!(nextflag & SEARCH_PREFIX)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a=end; + b+=length; + } + break; + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_BIT: + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if (piks && + (flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0),1))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=keyseg->length; + if (piks && + (flag=compare_bin(a,length,b,length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0),0))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=length; + b+=length; + } + break; + case HA_KEYTYPE_VARTEXT1: + case HA_KEYTYPE_VARTEXT2: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if (piks && + (flag= ha_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0), + (my_bool) ((nextflag & (SEARCH_FIND | + SEARCH_UPDATE)) == + SEARCH_FIND && + ! (keyseg->flag & + HA_END_SPACE_ARE_EQUAL))))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+= a_length; + b+= b_length; + break; + } + break; + case HA_KEYTYPE_VARBINARY1: + case HA_KEYTYPE_VARBINARY2: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if (piks && + (flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0), 0))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + } + break; + case HA_KEYTYPE_INT8: + { + int i_1= (int) *((signed char*) a); + int i_2= (int) *((signed char*) b); + if (piks && (flag = CMP_NUM(i_1,i_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b++; + break; + } + case HA_KEYTYPE_SHORT_INT: + s_1= mi_sint2korr(a); + s_2= mi_sint2korr(b); + if (piks && (flag = CMP_NUM(s_1,s_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 2; /* sizeof(short int); */ + break; + case HA_KEYTYPE_USHORT_INT: + { + uint16 us_1,us_2; + us_1= mi_sint2korr(a); + us_2= mi_sint2korr(b); + if (piks && (flag = CMP_NUM(us_1,us_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+=2; /* sizeof(short int); */ + break; + } + case HA_KEYTYPE_LONG_INT: + l_1= mi_sint4korr(a); + l_2= mi_sint4korr(b); + if (piks && (flag = CMP_NUM(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_ULONG_INT: + u_1= mi_sint4korr(a); + u_2= mi_sint4korr(b); + if (piks && (flag = CMP_NUM(u_1,u_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_INT24: + l_1=mi_sint3korr(a); + l_2=mi_sint3korr(b); + if (piks && (flag = CMP_NUM(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_UINT24: + l_1=mi_uint3korr(a); + l_2=mi_uint3korr(b); + if (piks && (flag = CMP_NUM(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_FLOAT: + mi_float4get(f_1,a); + mi_float4get(f_2,b); + /* + The following may give a compiler warning about floating point + comparison not being safe, but this is ok in this context as + we are bascily doing sorting + */ + if (piks && (flag = CMP_NUM(f_1,f_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(float); */ + break; + case HA_KEYTYPE_DOUBLE: + mi_float8get(d_1,a); + mi_float8get(d_2,b); + /* + The following may give a compiler warning about floating point + comparison not being safe, but this is ok in this context as + we are bascily doing sorting + */ + if (piks && (flag = CMP_NUM(d_1,d_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; /* sizeof(double); */ + break; + case HA_KEYTYPE_NUM: /* Numeric key */ + { + int swap_flag= 0; + int alength,blength; + + if (keyseg->flag & HA_REVERSE_SORT) + { + swap_variables(uchar*, a, b); + swap_flag=1; /* Remember swap of a & b */ + end= a+ (int) (end-b); + } + if (keyseg->flag & HA_SPACE_PACK) + { + alength= *a++; blength= *b++; + end=a+alength; + next_key_length=key_length-blength-1; + } + else + { + alength= (int) (end-a); + blength=keyseg->length; + /* remove pre space from keys */ + for ( ; alength && *a == ' ' ; a++, alength--) ; + for ( ; blength && *b == ' ' ; b++, blength--) ; + } + if (piks) + { + if (*a == '-') + { + if (*b != '-') + return -1; + a++; b++; + swap_variables(uchar*, a, b); + swap_variables(int, alength, blength); + swap_flag=1-swap_flag; + alength--; blength--; + end=a+alength; + } + else if (*b == '-') + return 1; + while (alength && (*a == '+' || *a == '0')) + { + a++; alength--; + } + while (blength && (*b == '+' || *b == '0')) + { + b++; blength--; + } + if (alength != blength) + return (alength < blength) ? -1 : 1; + while (a < end) + if (*a++ != *b++) + return ((int) a[-1] - (int) b[-1]); + } + else + { + b+=(end-a); + a=end; + } + + if (swap_flag) /* Restore pointers */ + swap_variables(uchar*, a, b); + break; + } +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + { + longlong ll_a,ll_b; + ll_a= mi_sint8korr(a); + ll_b= mi_sint8korr(b); + if (piks && (flag = CMP_NUM(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } + case HA_KEYTYPE_ULONGLONG: + { + ulonglong ll_a,ll_b; + ll_a= mi_uint8korr(a); + ll_b= mi_uint8korr(b); + if (piks && (flag = CMP_NUM(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } +#endif + case HA_KEYTYPE_END: /* Ready */ + goto end; /* diff_pos is incremented */ + } + } + (*diff_pos)++; +end: + if (!(nextflag & SEARCH_FIND)) + { + uint i; + if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ + return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; + flag=0; + for (i=keyseg->length ; i-- > 0 ; ) + { + if (*a++ != *b++) + { + flag= FCMP(a[-1],b[-1]); + break; + } + } + if (nextflag & SEARCH_SAME) + return (flag); /* read same */ + if (nextflag & SEARCH_BIGGER) + return (flag <= 0 ? -1 : 1); /* read next */ + return (flag < 0 ? -1 : 1); /* read previous */ + } + return 0; +} /* ha_key_cmp */ + + === removed file 'mysys/my_gethostbyname.c' --- a/mysys/my_gethostbyname.c 2011-01-11 09:09:21 +0000 +++ b/mysys/my_gethostbyname.c 1970-01-01 00:00:00 +0000 @@ -1,111 +0,0 @@ -/* Copyright (C) 2002, 2004 MySQL AB, 2008-2009 Sun Microsystems, Inc - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; version 2 - of the License. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA */ - -/* Thread safe version of gethostbyname_r() */ - -#include "mysys_priv.h" -#if !defined(__WIN__) -#include -#endif -#include - -/* This file is not needed if my_gethostbyname_r is a macro */ -#if !defined(my_gethostbyname_r) - -/* - Emulate SOLARIS style calls, not because it's better, but just to make the - usage of getbostbyname_r simpler. -*/ - -#if defined(HAVE_GETHOSTBYNAME_R) - -#if defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) - -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop) -{ - struct hostent *hp; - DBUG_ASSERT((size_t) buflen >= sizeof(*result)); - if (gethostbyname_r(name,result, buffer, (size_t) buflen, &hp, h_errnop)) - return 0; - return hp; -} - -#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT) - -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop) -{ - if (gethostbyname_r(name,result,(struct hostent_data *) buffer) == -1) - { - *h_errnop= errno; - return 0; - } - return result; -} - -#else - -/* gethostbyname_r with similar interface as gethostbyname() */ - -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *result, char *buffer, - int buflen, int *h_errnop) -{ - struct hostent *hp; - DBUG_ASSERT(buflen >= sizeof(struct hostent_data)); - hp= gethostbyname_r(name,result,(struct hostent_data *) buffer); - *h_errnop= errno; - return hp; -} -#endif /* GLIBC2_STYLE_GETHOSTBYNAME_R */ - -#else /* !HAVE_GETHOSTBYNAME_R */ - -extern mysql_mutex_t LOCK_gethostbyname_r; - -/* - No gethostbyname_r() function exists. - In this case we have to keep a mutex over the call to ensure that no - other thread is going to reuse the internal memory. - - The user is responsible to call my_gethostbyname_r_free() when he - is finished with the structure. -*/ - -struct hostent *my_gethostbyname_r(const char *name, - struct hostent *res __attribute__((unused)), - char *buffer __attribute__((unused)), - int buflen __attribute__((unused)), - int *h_errnop) -{ - struct hostent *hp; - mysql_mutex_lock(&LOCK_gethostbyname_r); - hp= gethostbyname(name); - *h_errnop= h_errno; - return hp; -} - -void my_gethostbyname_r_free() -{ - mysql_mutex_unlock(&LOCK_gethostbyname_r); -} - -#endif /* !HAVE_GETHOSTBYNAME_R */ -#endif /* !my_gethostbyname_r */ === removed file 'mysys/my_handler.c' --- a/mysys/my_handler.c 2011-03-09 20:54:55 +0000 +++ b/mysys/my_handler.c 1970-01-01 00:00:00 +0000 @@ -1,602 +0,0 @@ -/* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include -#include -#include -#include -#include - -#include "my_handler_errors.h" - -#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1) - -int ha_compare_text(const CHARSET_INFO *charset_info, uchar *a, uint a_length, - uchar *b, uint b_length, my_bool part_key, - my_bool skip_end_space) -{ - if (!part_key) - return charset_info->coll->strnncollsp(charset_info, a, a_length, - b, b_length, (my_bool)!skip_end_space); - return charset_info->coll->strnncoll(charset_info, a, a_length, - b, b_length, part_key); -} - - -static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, - my_bool part_key, my_bool skip_end_space) -{ - uint length= min(a_length,b_length); - uchar *end= a+ length; - int flag; - - while (a < end) - if ((flag= (int) *a++ - (int) *b++)) - return flag; - if (part_key && b_length < a_length) - return 0; - if (skip_end_space && a_length != b_length) - { - int swap= 1; - /* - We are using space compression. We have to check if longer key - has next character < ' ', in which case it's less than the shorter - key that has an implicite space afterwards. - - This code is identical to the one in - strings/ctype-simple.c:my_strnncollsp_simple - */ - if (a_length < b_length) - { - /* put shorter key in a */ - a_length= b_length; - a= b; - swap= -1; /* swap sign of result */ - } - for (end= a + a_length-length; a < end ; a++) - { - if (*a != ' ') - return (*a < ' ') ? -swap : swap; - } - return 0; - } - return (int) (a_length-b_length); -} - - -/* - Compare two keys - - SYNOPSIS - ha_key_cmp() - keyseg Array of key segments of key to compare - a First key to compare, in format from _mi_pack_key() - This is normally key specified by user - b Second key to compare. This is always from a row - key_length Length of key to compare. This can be shorter than - a to just compare sub keys - next_flag How keys should be compared - If bit SEARCH_FIND is not set the keys includes the row - position and this should also be compared - diff_pos OUT Number of first keypart where values differ, counting - from one. - diff_pos[1] OUT (b + diff_pos[1]) points to first value in tuple b - that is different from corresponding value in tuple a. - - EXAMPLES - Example1: if the function is called for tuples - ('aaa','bbb') and ('eee','fff'), then - diff_pos[0] = 1 (as 'aaa' != 'eee') - diff_pos[1] = 0 (offset from beggining of tuple b to 'eee' keypart). - - Example2: if the index function is called for tuples - ('aaa','bbb') and ('aaa','fff'), - diff_pos[0] = 2 (as 'aaa' != 'eee') - diff_pos[1] = 3 (offset from beggining of tuple b to 'fff' keypart, - here we assume that first key part is CHAR(3) NOT NULL) - - NOTES - Number-keys can't be splited - - RETURN VALUES - <0 If a < b - 0 If a == b - >0 If a > b -*/ - -#define FCMP(A,B) ((int) (A) - (int) (B)) - -int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos) -{ - int flag; - int16 s_1,s_2; - int32 l_1,l_2; - uint32 u_1,u_2; - float f_1,f_2; - double d_1,d_2; - uint next_key_length; - uchar *orig_b= b; - - *diff_pos=0; - for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) - { - uchar *end; - uint piks=! (keyseg->flag & HA_NO_SORT); - (*diff_pos)++; - diff_pos[1]= (uint)(b - orig_b); - - /* Handle NULL part */ - if (keyseg->null_bit) - { - key_length--; - if (*a != *b && piks) - { - flag = (int) *a - (int) *b; - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - } - b++; - if (!*a++) /* If key was NULL */ - { - if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) - nextflag=SEARCH_SAME; /* Allow duplicate keys */ - else if (nextflag & SEARCH_NULL_ARE_NOT_EQUAL) - { - /* - This is only used from mi_check() to calculate cardinality. - It can't be used when searching for a key as this would cause - compare of (a,b) and (b,a) to return the same value. - */ - return -1; - } - next_key_length=key_length; - continue; /* To next key part */ - } - } - end= a+ min(keyseg->length,key_length); - next_key_length=key_length-keyseg->length; - - switch ((enum ha_base_keytype) keyseg->type) { - case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=ha_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0), - (my_bool)!(nextflag & SEARCH_PREFIX)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=(uint) (end-a), a_length=length, b_length=length; - if (piks && - (flag= ha_compare_text(keyseg->charset, a, a_length, b, b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0), - (my_bool)!(nextflag & SEARCH_PREFIX)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a=end; - b+=length; - } - break; - case HA_KEYTYPE_BINARY: - case HA_KEYTYPE_BIT: - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0),1))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=keyseg->length; - if (piks && - (flag=compare_bin(a,length,b,length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0),0))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=length; - b+=length; - } - break; - case HA_KEYTYPE_VARTEXT1: - case HA_KEYTYPE_VARTEXT2: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag= ha_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0), - (my_bool) ((nextflag & (SEARCH_FIND | - SEARCH_UPDATE)) == - SEARCH_FIND && - ! (keyseg->flag & - HA_END_SPACE_ARE_EQUAL))))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+= a_length; - b+= b_length; - break; - } - break; - case HA_KEYTYPE_VARBINARY1: - case HA_KEYTYPE_VARBINARY2: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0), 0))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - } - break; - case HA_KEYTYPE_INT8: - { - int i_1= (int) *((signed char*) a); - int i_2= (int) *((signed char*) b); - if (piks && (flag = CMP_NUM(i_1,i_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b++; - break; - } - case HA_KEYTYPE_SHORT_INT: - s_1= mi_sint2korr(a); - s_2= mi_sint2korr(b); - if (piks && (flag = CMP_NUM(s_1,s_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 2; /* sizeof(short int); */ - break; - case HA_KEYTYPE_USHORT_INT: - { - uint16 us_1,us_2; - us_1= mi_sint2korr(a); - us_2= mi_sint2korr(b); - if (piks && (flag = CMP_NUM(us_1,us_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+=2; /* sizeof(short int); */ - break; - } - case HA_KEYTYPE_LONG_INT: - l_1= mi_sint4korr(a); - l_2= mi_sint4korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_ULONG_INT: - u_1= mi_sint4korr(a); - u_2= mi_sint4korr(b); - if (piks && (flag = CMP_NUM(u_1,u_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_INT24: - l_1=mi_sint3korr(a); - l_2=mi_sint3korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_UINT24: - l_1=mi_uint3korr(a); - l_2=mi_uint3korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_FLOAT: - mi_float4get(f_1,a); - mi_float4get(f_2,b); - /* - The following may give a compiler warning about floating point - comparison not being safe, but this is ok in this context as - we are bascily doing sorting - */ - if (piks && (flag = CMP_NUM(f_1,f_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(float); */ - break; - case HA_KEYTYPE_DOUBLE: - mi_float8get(d_1,a); - mi_float8get(d_2,b); - /* - The following may give a compiler warning about floating point - comparison not being safe, but this is ok in this context as - we are bascily doing sorting - */ - if (piks && (flag = CMP_NUM(d_1,d_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; /* sizeof(double); */ - break; - case HA_KEYTYPE_NUM: /* Numeric key */ - { - int swap_flag= 0; - int alength,blength; - - if (keyseg->flag & HA_REVERSE_SORT) - { - swap_variables(uchar*, a, b); - swap_flag=1; /* Remember swap of a & b */ - end= a+ (int) (end-b); - } - if (keyseg->flag & HA_SPACE_PACK) - { - alength= *a++; blength= *b++; - end=a+alength; - next_key_length=key_length-blength-1; - } - else - { - alength= (int) (end-a); - blength=keyseg->length; - /* remove pre space from keys */ - for ( ; alength && *a == ' ' ; a++, alength--) ; - for ( ; blength && *b == ' ' ; b++, blength--) ; - } - if (piks) - { - if (*a == '-') - { - if (*b != '-') - return -1; - a++; b++; - swap_variables(uchar*, a, b); - swap_variables(int, alength, blength); - swap_flag=1-swap_flag; - alength--; blength--; - end=a+alength; - } - else if (*b == '-') - return 1; - while (alength && (*a == '+' || *a == '0')) - { - a++; alength--; - } - while (blength && (*b == '+' || *b == '0')) - { - b++; blength--; - } - if (alength != blength) - return (alength < blength) ? -1 : 1; - while (a < end) - if (*a++ != *b++) - return ((int) a[-1] - (int) b[-1]); - } - else - { - b+=(end-a); - a=end; - } - - if (swap_flag) /* Restore pointers */ - swap_variables(uchar*, a, b); - break; - } -#ifdef HAVE_LONG_LONG - case HA_KEYTYPE_LONGLONG: - { - longlong ll_a,ll_b; - ll_a= mi_sint8korr(a); - ll_b= mi_sint8korr(b); - if (piks && (flag = CMP_NUM(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } - case HA_KEYTYPE_ULONGLONG: - { - ulonglong ll_a,ll_b; - ll_a= mi_uint8korr(a); - ll_b= mi_uint8korr(b); - if (piks && (flag = CMP_NUM(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } -#endif - case HA_KEYTYPE_END: /* Ready */ - goto end; /* diff_pos is incremented */ - } - } - (*diff_pos)++; -end: - if (!(nextflag & SEARCH_FIND)) - { - uint i; - if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ - return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; - flag=0; - for (i=keyseg->length ; i-- > 0 ; ) - { - if (*a++ != *b++) - { - flag= FCMP(a[-1],b[-1]); - break; - } - } - if (nextflag & SEARCH_SAME) - return (flag); /* read same */ - if (nextflag & SEARCH_BIGGER) - return (flag <= 0 ? -1 : 1); /* read next */ - return (flag < 0 ? -1 : 1); /* read previous */ - } - return 0; -} /* ha_key_cmp */ - - -/* - Find the first NULL value in index-suffix values tuple - - SYNOPSIS - ha_find_null() - keyseg Array of keyparts for key suffix - a Key suffix value tuple - - DESCRIPTION - Find the first NULL value in index-suffix values tuple. - - TODO - Consider optimizing this function or its use so we don't search for - NULL values in completely NOT NULL index suffixes. - - RETURN - First key part that has NULL as value in values tuple, or the last key - part (with keyseg->type==HA_TYPE_END) if values tuple doesn't contain - NULLs. -*/ - -HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a) -{ - for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++) - { - uchar *end; - if (keyseg->null_bit) - { - if (!*a++) - return keyseg; - } - end= a+ keyseg->length; - - switch ((enum ha_base_keytype) keyseg->type) { - case HA_KEYTYPE_TEXT: - case HA_KEYTYPE_BINARY: - case HA_KEYTYPE_BIT: - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length; - get_key_length(a_length, a); - a += a_length; - break; - } - else - a= end; - break; - case HA_KEYTYPE_VARTEXT1: - case HA_KEYTYPE_VARTEXT2: - case HA_KEYTYPE_VARBINARY1: - case HA_KEYTYPE_VARBINARY2: - { - int a_length; - get_key_length(a_length, a); - a+= a_length; - break; - } - case HA_KEYTYPE_NUM: - if (keyseg->flag & HA_SPACE_PACK) - { - int alength= *a++; - end= a+alength; - } - a= end; - break; - case HA_KEYTYPE_INT8: - case HA_KEYTYPE_SHORT_INT: - case HA_KEYTYPE_USHORT_INT: - case HA_KEYTYPE_LONG_INT: - case HA_KEYTYPE_ULONG_INT: - case HA_KEYTYPE_INT24: - case HA_KEYTYPE_UINT24: -#ifdef HAVE_LONG_LONG - case HA_KEYTYPE_LONGLONG: - case HA_KEYTYPE_ULONGLONG: -#endif - case HA_KEYTYPE_FLOAT: - case HA_KEYTYPE_DOUBLE: - a= end; - break; - case HA_KEYTYPE_END: /* purecov: inspected */ - /* keep compiler happy */ - DBUG_ASSERT(0); - break; - } - } - return keyseg; -} - - - -/* - Register handler error messages for usage with my_error() - - NOTES - This is safe to call multiple times as my_error_register() - will ignore calls to register already registered error numbers. -*/ - -static const char **get_handler_error_messages() -{ - return handler_error_messages; -} - -void my_handler_error_register(void) -{ - /* - If you got compilation error here about compile_time_assert array, check - that every HA_ERR_xxx constant has a corresponding error message in - handler_error_messages[] list (check mysys/my_handler_errors.h and - include/my_base.h). - */ - compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) == - HA_ERR_LAST + 1); - my_error_register(get_handler_error_messages, HA_ERR_FIRST, - HA_ERR_FIRST+ array_elements(handler_error_messages)-1); -} - - -void my_handler_error_unregister(void) -{ - my_error_unregister(HA_ERR_FIRST, - HA_ERR_FIRST+ array_elements(handler_error_messages)-1); -} === modified file 'mysys/my_handler_errors.h' --- a/mysys/my_handler_errors.h 2011-02-02 22:02:29 +0000 +++ b/mysys/my_handler_errors.h 2011-03-29 12:56:34 +0000 @@ -84,4 +84,8 @@ static const char *handler_error_message "Record not matching the given partition set" }; +extern void my_handler_error_register(void); +extern void my_handler_error_unregister(void); + + #endif /* MYSYS_MY_HANDLER_ERRORS_INCLUDED */ === removed file 'mysys/my_port.c' --- a/mysys/my_port.c 2006-12-31 00:02:27 +0000 +++ b/mysys/my_port.c 1970-01-01 00:00:00 +0000 @@ -1,40 +0,0 @@ -/* Copyright (C) 2002 MySQL AB - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; version 2 - of the License. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA */ - -/* - Small functions to make code portable -*/ - -#include "mysys_priv.h" - -#ifdef _AIX - -/* - On AIX, at least with gcc 3.1, the expression - '(double) (ulonglong) var' doesn't always work for big unsigned - integers like '18446744073709551615'. The end result is that the - high bit is simply dropped. (probably bug in gcc optimizations) - Handling the conversion in a sub function seems to work. -*/ - - - -double my_ulonglong2double(unsigned long long nr) -{ - return (double) nr; -} -#endif /* _AIX */ === modified file 'sql/handler.h' --- a/sql/handler.h 2011-03-28 08:51:35 +0000 +++ b/sql/handler.h 2011-03-29 12:56:34 +0000 @@ -26,7 +26,7 @@ #include "structs.h" /* SHOW_COMP_OPTION */ #include -#include +#include #include #include === modified file 'storage/innobase/row/row0sel.c' --- a/storage/innobase/row/row0sel.c 2011-03-02 23:09:09 +0000 +++ b/storage/innobase/row/row0sel.c 2011-03-29 12:56:34 +0000 @@ -58,7 +58,7 @@ Created 12/19/1997 Heikki Tuuri #include "buf0lru.h" #include "ha_prototypes.h" -#include "my_handler.h" /* enum icp_result */ +#include "my_compare.h" /* enum icp_result */ /* Maximum number of rows to prefetch; MySQL interface has another parameter */ #define SEL_MAX_N_PREFETCH 16 === modified file 'storage/myisam/ft_stopwords.c' --- a/storage/myisam/ft_stopwords.c 2011-03-28 08:51:35 +0000 +++ b/storage/myisam/ft_stopwords.c 2011-03-29 12:56:34 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2005 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ /* Written by Sergei A. Golubchik, who has a shared copyright to this code */ #include "ftdefs.h" -#include "my_handler.h" +#include "my_compare.h" static CHARSET_INFO *ft_stopword_cs= NULL; === modified file 'storage/myisam/mi_check.c' --- a/storage/myisam/mi_check.c 2011-03-28 08:51:35 +0000 +++ b/storage/myisam/mi_check.c 2011-03-29 12:56:34 +0000 @@ -80,6 +80,7 @@ static SORT_KEY_BLOCKS *alloc_key_blocks uint buffer_length); static ha_checksum mi_byte_checksum(const uchar *buf, uint length); static void set_data_file_type(SORT_INFO *sort_info, MYISAM_SHARE *share); +static HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a); void myisamchk_init(MI_CHECK *param) { @@ -4729,3 +4730,92 @@ set_data_file_type(SORT_INFO *sort_info, share->delete_record=tmp.delete_record; } } + +/* + Find the first NULL value in index-suffix values tuple + + SYNOPSIS + ha_find_null() + keyseg Array of keyparts for key suffix + a Key suffix value tuple + + DESCRIPTION + Find the first NULL value in index-suffix values tuple. + + TODO + Consider optimizing this function or its use so we don't search for + NULL values in completely NOT NULL index suffixes. + + RETURN + First key part that has NULL as value in values tuple, or the last key + part (with keyseg->type==HA_TYPE_END) if values tuple doesn't contain + NULLs. +*/ + +static HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a) +{ + for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++) + { + uchar *end; + if (keyseg->null_bit) + { + if (!*a++) + return keyseg; + } + end= a+ keyseg->length; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_BIT: + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length; + get_key_length(a_length, a); + a += a_length; + break; + } + else + a= end; + break; + case HA_KEYTYPE_VARTEXT1: + case HA_KEYTYPE_VARTEXT2: + case HA_KEYTYPE_VARBINARY1: + case HA_KEYTYPE_VARBINARY2: + { + int a_length; + get_key_length(a_length, a); + a+= a_length; + break; + } + case HA_KEYTYPE_NUM: + if (keyseg->flag & HA_SPACE_PACK) + { + int alength= *a++; + end= a+alength; + } + a= end; + break; + case HA_KEYTYPE_INT8: + case HA_KEYTYPE_SHORT_INT: + case HA_KEYTYPE_USHORT_INT: + case HA_KEYTYPE_LONG_INT: + case HA_KEYTYPE_ULONG_INT: + case HA_KEYTYPE_INT24: + case HA_KEYTYPE_UINT24: +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + case HA_KEYTYPE_ULONGLONG: +#endif + case HA_KEYTYPE_FLOAT: + case HA_KEYTYPE_DOUBLE: + a= end; + break; + case HA_KEYTYPE_END: /* purecov: inspected */ + /* keep compiler happy */ + DBUG_ASSERT(0); + break; + } + } + return keyseg; +} === modified file 'storage/myisam/mi_range.c' --- a/storage/myisam/mi_range.c 2011-03-22 12:56:15 +0000 +++ b/storage/myisam/mi_range.c 2011-03-29 12:56:34 +0000 @@ -1,4 +1,5 @@ -/* Copyright (C) 2000-2004, 2006 MySQL AB, 2008-2009 Sun Microsystems, Inc +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -139,8 +140,8 @@ static ha_rows _mi_record_pos(MI_INFO *i key_len=USE_WHOLE_KEY; /* - my_handler.c:ha_compare_text() has a flag 'skip_end_space'. - This is set in my_handler.c:ha_key_cmp() in dependence on the + my_compare.c:ha_compare_text() has a flag 'skip_end_space'. + This is set in my_compare.c:ha_key_cmp() in dependence on the compare flags 'nextflag' and the column type. TEXT columns are of type HA_KEYTYPE_VARTEXT. In this case the --===============1718334163== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/MERGE/mysql-\ # trunk/ # testament_sha1: 62df41a96bf8bc6fb7b982c12bc7bdfc69bc9a90 # timestamp: 2011-03-29 17:57:47 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/FIXES\ # /bug11765758-rpl_corruption/ # base_revision_id: andrei.elkin@stripped\ # asqy5hj1a1gzrlra # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWX/jPhgALjr/gH/3/F7///// ////7r////9gRl7zzlXuOydztfcD6599c9d5HqCsarbNpgd2+nnvbKrfOGvvHfO6Pnxvrd4959U+ 33m3YC9Pd6B72l3u562u7RTnVvvs999cCbDqqA993PT74Pve2T71svtxTrrl10AKb1bziF595vNe rd0Pez291eT3va+97eH3m+bx53bt77b77une3Rst496+2qvYOul9njGfdnV7KsfW9ek9dd3lmXaT C3193uUuznbZbD7p7tdRe88Nzt7ra7DubtR73jvWEkgQTE0yGjQmRqHpGjRD0xBNNQ2qeQ0QGnqN Bo9TRkeQj1HqCUIAE0E1NCamGpgjTRMSNqaeU9QAAAAAAAA9RhKaCCEmg1PRE2JqPUynqPUaNAaa AAAAABoAGjQAJNKIggmRk00IyZT01NhNNFPyiepp7QyoAaNqHqbUP0QgGmgNNBFEITTQJiTaAjBV PemknsoBGmmRM0Rp6aRo9TJo00AAAAVJETIAgNJgFPKeRGjQTVPNSfqn5U9RtNQaAAaAAAGmQ7D2 Z051IIdECwwoBJAoVlliB7YFkCsISJCGYegYKMQv0Jh/Ln7EhhGIskYfb6tnrzn45fuddL9xbt4U rAPPDkz8Pqf16Me1w/j/iwfG+J+2xgn/h4RKXXsqG/7Kh4IgHDmAp2nmu5DOnQOzJZuPyR7kV9TI YhGBHGV1ex/btx/KLfphQ9qX2WHw/W74FHP8FL6G+j6ZNLWpp3sYKlmZNbr2QxY/I+9/7tD3kVoc mYCDJJzB+bKW2Qj91eYmP4ayiAbD2z2zHll5/17m/1Kter2tk8HSIsXxmx3+PwLs63bdY4Qrm9xN C+bWbmn2vfzNs+3Q6Px/tb7PsOr+WuRVTCn+0G3MzOZdw/KQ7++IiEOkJkI8eYkSWhr0dEpKr59/ bgeH0Z+6sar1PhsknoayZhySerMqUNPdI+ogeeVVv2/dFEMcWuKwG0W2pasGF6m3Ku3TXVE0Axm6 L2Hh2TMmLVwbHGONrpnpFTXQsUxdJlJOjl9OOoIGxNwrJsSf+jUwWyF4pRfuxJUZaxDmaUE4yEPc 3uZNZ3mNlrO8l9Os9beBsWRSmZTr0sHiMIxE7yCkeVzLou5F7+2E2tWCugCmWRiXbv1tt1yCl+5X ORlRd9xzmpBXj1oiqoqLjcIimhF3i7fD34zB328Xl9hY1bHqZDmVlrXv7/Q+ECoG7xzbmdvxFHR6 tOmBeyYUtFY+C67naStej4s0YOYQjCDEI4fA5s28r2nXWT10tFbre1kTa06qNle3Ptyt5uHXHMn7 2uMHUfRyF7Hk2HCl+WyAc70baQ3o2hzOXLlk6zJXVqdbWzDlmjIOvPMbbrjNHlMEBPHJ3erV3ZGj sL9GmNBsiKZQRkFXtXGzHfC71lhMNWsYmNSmqqq5idR7GCImLY0rRmmr2nSzmhiIrXSsvsiyyrN9 XK0ETHzn4Pp6v+Pam193La6ncoe7z+Kie6PdKipxrDp7Egk8O7j+GeJqqIJNihCRSQLfzPzAkFml oSCgRQVSLIT8+2h6EBZAI5pBZICvu2SSHP/z3ePIG5nV+WhRBfgEPv4pT4scrmNzcQOrB8csoHsQ nIzEFeb9NxqqaY9Ljjc43essDIoMESLPIMR4cB3zFHZKPeKYA3kM0iJMRMtxVWDKXCST283ye0uO tPg/CPi4Sk7njV0d3nLVBM2f3f+Sh3DD96NJRSDLx4tT+02hJESbDjpyoodTyz5g9BqdrfnYcZep 12JAayZsHfawKs/efafXih3RmVXkqRVrfT+CeabfA40Zv61vJbaIF2cmfU81RBe/8eFn5woOSe1U ZP6TgCO+qHS0EPp73IQ8unX5c9XmDJYfiGV/wGCH04dcebRV0Rda0zaR3Taw8L+dT5cnJvrdkxy3 PPxvPbx0I6R2FM7RSoH4BcjBdonO90uvH49Ls7qSMuiHmeGT5Z/sRbeRekDEuHf8IduGJANvqkh4 DwjFkRkKSIxVBRFURYxBVIjILFAUgjBRYhgx8bePZ4UHj16Cks/hVH2QFbZJkJoZiSCREWLxaeby zppr6/n+Leevj1txPl9R3dNdCpy/e+fdnVul4dTLt8LaRReDScVyced1x5AzeXLG3seRjd4RxNiW mY31NXrblsqdIN5PvbjK6y2WUhsKq2Ue4TA4c6yupxmUn9Ly1VaMymMMeBYZzWcTVlJzbRbvuGtr cmmIwtVfL02qwtGjTSvWN1zKSS12eHTmqyn216YJ4G6/CSsvKwtZNYIw7rlTpjCLDvW9xKVenbKa ySMpqWbuLL7W8XR2eCxtZ92XaU0rZVmrzqUCJlyuZHcIPTrPqj8nrezbYdWE1DEYMMqU86o0N5Pr bN2MHsq1zCHZiCDT0JCFMR1u+rtyCGYu+0mo8kvOeE96X5TcfxPZR0jdRy9nooZ7R4pFcJgUkngP +82XGXQs55yb4F7ilWWejoH/iOKzInZiAhhv4i7jDV6Sk7pgK2EBpYpb3IFVyWEVP6i5XOLz2rIe QbJS1xkfvD1xNWTdQXeqWkUCoqNW2BIy9LY75zNsbR5aeI8yMbzy1K1L3nEoJ/ALcvJae0jyB7hv Ba3zDDCjx9Y/2jiOGQ9PeGvOW9wk7hzsbLsQJvkmZSGZJqBxLWUFR+YjcWFA85lcXu+Hj5J5ezJk OeH5r/Vv8mn0vPQ9qKaTPIT6DL6vAc9+HTWySz4GAwYGcJhob/boRRUPzIow6Wo5tUTRi8YK13as aS2oMzUYynzu/Glfx8WzTpZ9/TZE1IsMuitwik4PG+P3ucoQ48Y+b1Ochsuo6XuTbETlJOLB6OXm flLwpPCO3iLKYYUPsUbw/K20zEcnASHJoY1ZdcaEx4qfcM2rL1RhQ4sGmLzL249NrJlQjd9FfL9c 0shrIEtvuE+Sf33y0LrUOH6wrnAnmV2FO7zXNVHkzltlPjw4JY7ljBAyZ7TDqteW22nMt8XPG0Up APYfPGnHT7BBKl2b3Mtf0pNa3r6HUYJaeaxVPjXqZpoq79btMpudQbz8PCZvI7/BKh2naxrlZuO1 bVGYgp5nJUdryntBRwpO/RqHcX4rmoSN39qy8ImsZJFfswRSVWiqyHGr3KJqf/JFvYTHHQTrWbi4 gNKztJi+OISlW3ti7Sjn9eOY1EIcnY9TB4CuwCeuo4rguCiWXPDwsjYvNzfjIZPxV6YdbP6vG6FN 3krXRtPh5KLm8b5+Szpqjm3KFHt6DDMVg5k+OiECBRLpMTVX40lbAJpTLhv04OlAcJqC6FNNDN19 vnIFF+dEAnw/E7corhtRome/Mo19Bo9r/LxiS4k0nQaA+kHiljUZHrstPNOrm0Z0OYX9RV8vjlHl EA8NaiwWfUcdlW5OevzV5JW9DnetZ9WsA9irfkoVZLwPJzVz3E9jRpxcSivSpW4m0ov9CojW5EEP dyiZNNZ/DjoWimV8qtv6dpvrEZXC/KLNaYbkTIwZxzkeq6LjzxbeZnEjsWhvfT32OEefkB+kaDHZ KeWTk4vNa7beqN2idrtEgGvMGePq2PNd6czk5iAmzlXzx6p0LYYV7961SztqsJBppcl51ivqXEEp c9RSchlU+UlFfGBhBXyOM0/D8sNlK+mpPz+pdTCqy4771xYeMpsY9Hl1JgqUutClFSOY9H1J8rrW Cj19Z3UliBCjtGb3kNpwMlx5C74uw6r/VJpUpq9PXaSmpg7NpGg80G6lghywjvnVfFWPnKQBhYnT 56/nnGJkJndCXZ2Hw4nAdx/m4+6XdOShKiFDTPnHPg8nltjuOFAxuKRbiLg5DijyHz9sV/W45GhB 0SYttYjDn4vZyZbbbzldR5HgwjXNPwuMnWZs4238Y+/NKkzilx0inKUKpeNvW6d66jbEeBzxM+ug hDAjnMYyzX2LWfdzcEklry6bdOnNhRQMMkCZoAIMgoAD7X8aj4y1ERERRRjY2QiwjtnbLPBCKMYR JAVEgGIyVOj5T2kGgO0GBIeplFyZjh9LcmZnPDkm6xhWiGppfCTSyfUJR/Z9TjCw/v+2geib7ILz jdsOZvXm9ytjshOr2EWs5+VPDtZfUxQqqiiCP1MfAbjUDrnz6XffkJiyelNQHIbLFgou/jMChm25 nbkbZP40eVBgmlAzR+PQFeTbVnxdxhIpAS+iAlnxxaNRCE1wXuqp014VJsZEv9z/lIYQfZEjJKpt L7yxVKZ9I6nbdcHRfxBTjbd/t7bnH45DnS9cMu53rolRg52uqt1ZHhxyZ/+2ocHGAh7I0WVwId2b NLyT5H2Pf5fiyZ1V94v5blbySwVwygmEVfqoWLevkL4zRUYUZJ3Rod+mEzaxBudqW/Z7ikYafBV3 0mNkIb6vyM/csz7nmFtxrU7lYaMdsBHBgszaB+qOdzPoZewaBHxJT4O07/DHiy6gcQF25cj8emYL HRnC3emq6qbZROgRS5BEQ/F73syGZnsDxNZPNVcMtVcLMjXTkyaanG8rrz0Z/On8kO+iepUkKHGY IpjFiB8sSMTzoB9owDDPy7CqjEfMMlRGSIw3MDjE69p9Cdocz3DQhZ2VegbzlpUraVuRDx+BwE0m UmhtswYlgvwJo6UlXGJ0SmK2PDDN4zJRC7WPsCO71Q62btJH6xbqmqWdx5fRSKU5RcBENGdNpHMe XduIz18dHV5KOqal/w3cbkDgk44TgHDjB00obbhvg+GziwSNicy8PStBRjWiKclWNmOeFFDBOuH1 U+Z45g9msn3iQ9E6iqvAO2GJYYOU4+E2h5xFRSKKM5b+c8yx+s5ix+6xKkiMi5ZEjyPCH8Rr8o/f OE9i6crRND8E4x909J6KQZsbHR5zNNvuWl+VLbGByOmbuW7G4ZuIheFXeyBsOIPWq2QTtW5cEO/U YBcjgoX5hoMC3g3LmCAocS9eDIBoMVGIJXBa+lE4DI/QW39wF9XNgEzPOQt2cSm8OC5kQCq+62nn ePHg4y4wWTwRlsnoh1RUG6iFPOOIJcHZo2M9ZMkryktPqzv0Ds7+aCXCG98Llyrtxxx/Pp0aHTPM l7OPG1rXXXLlg0YrQSioQqRUYYSTagOUgpNevLq8vFjJMhYgKCwWGgqlqmmJJfQ03wRI0p29UKKR knxCXZznZ2HlF+39//T0pftm+6f7D9//H7o5PtqKPuaqn+Dh1TTOsy0VzD9uxz0UDh6uOZ5T3KUo zMszLw9PfMzfddcDMyk3e5be/A+u4VVUVUXdu36bPzdH59fweI/b9Pn81Pi82drrrt1OgCBrtpUr J8SElQ3oChMbbJsRcMMMrFMMDgTe7zfh12b8yPoNn86T6drG4dBoYEqM5vQmKhiNgAvAe0uBhwuI +t+bfhhIf0VGik2bLOXBVuaVMQUZAtjdYqRcpJEYNcuvWG2YqMNe4wbb06pzsE0Q0H6jxH2V8C7A mjgffSAgEFCoqJFypIh2MMNB1FM2UZtLWa5rFb2lglcGuUqAXBynckk3LopsSllphgcS3MqaHBwZ m/PJnKwLOGKU0y+vEoNElb2RYhaSbzQ00wwDPLOJfEx04gvpaGpuiSdhIlMBTOkv03Mwe9GW20sz UiqXvscQLjMHrwvwEhgmFjm/Jy6OB6kiUICdikhyYROUS2YGdWB87kP0EL2AF6n0fdD9K2yttzCa t3K54RHnPZh8Y6MLosYsVQ8EYcYMXmApOjERDNCK2njmqjBDQtmF2tqOg8+u9Y1wMZLmLpu7Qewj 6CYRNW/+QBxspYS6Z8caEY2G70Shx/vZEQIeSQ0twMlgAgQUkD6nK6wfPUoUCfoF7rLYsbGZKlGV wkJERiNUiGMAkDfuPnlRDXF1SXXYkwnjqF5FvKOHvNAwMjn69GSnRAQ3CV3Ig5UREc57xT1MYb29 m5H2d05+ueFpGe+9CCtfM2jCWnDIm5uMFw4Q4TYxSSJ1IxTBB16AtOgqJEgbpBpJwcDtSxKiyHCp JAEXWXAqIkBH1HOmrG67JMUGTNvmROxE66GIhsFjXkB9RH3DOIJlBUgO3ke2uxp9HlAeFUkZBTOc YiDaPO98d//E8hLtOiS6I4B3IXgPuHK+jNZFJDAjZB8tjU7vz3mhbsnKY1Ts8GrK9BmNoAYkRKgw sr/3PzmBeysStobHIqle3YU+fD1jwkFrPllUVKZSdbumqawwKTG0YJgymg2mwYvOgSDZxqMaRisr srI1m4cFgeJ4W2ACltudUrvwXm7haPCYhnqC7axWH7THN0Fu1EnFRBp1QSN0JmWjaxSLvl3s6HtU OVRUeKTgyrZFgW6v8qB7zDHem4qKVKlkRM0a6IIv7ZTaHRAGohAuCRrbZZcSqyIKTtwiELz4DvPT gsa8uKqsL+OBJmB6hh/kqbdX+D2WimdtZli0tVVqK97xlcfSxuP6IJdTSp9CIeYNLl90Q0QoTv0U 9vSR5kt1E7rGBwLfjj6oEHoCEQUGY17asewLenplLEbdbj3XVEHJ+ivCoeDwAhksUOy/Ugm2IWVe CE0QKGRz0EesJHvPgeHaQqpUkN0JDVLFi7+s22VDZETEAYQcal2I1qnuMGtm2JMM0iaFIJol2LlS 3TxfQh1ZRAuPETVa3ocxm+hvvRmtLzMazkK88aQSmKOjp7kOp84nAYCJE7ZD7hEHncfIlPimiF2h UqVBQRJbIeJ0TmHTVg8yBzitLEGf7AkdaXekHnsF5kLMjuFJB1BAMplZai7OzcB+6MOlxGbF0Yzy d2uFnB9HxWGi0gZTe3zVAlh8nmCweWSJo0RRxTtXNIAdHh0HOWUv0OMFHHOFqGN0mrY2KyNBoc8l EI0CxPEHL3MwMoSuxwNQkmUwKpkkIH8LZqhRLiaUCEbDJPQuc84BPFmLUknu07E1DznJs9AQ7Dgk aBa4q7D0SVlclQoUIntmxRhdN8FRaHS7VLpIeE/ddMhY5uTTyGfQitRucrU2us2GDQ8z5ze1b1U5 5ZlIUwnHeweZX9WH2k90OYPDWIzHyiZSSfGLTr3NkWhUMIGsKQg9ETQrwmMr3joktYxKR6AJLUoG RReDFtU0NbJ1x4nviPf0nXHhOZv+yJd9ijgstQpBUTgFb94tAvGgRTWsDUV7zbUZXDaZsZoebwdn VUwLLqCHtKh3m3Ll6uzM2A1yWNC2h5rxRS7nAiQ72QQ5IWNDE53dOGj3j2eKedJkoQZJUMsrkKBo KYzBImDC2L2nzSAeRN8UCH5i4NRjaCMsttB1QiGPRkN86T2UopcMcQ6kBDIU1Cjj4iZWO4XfEdoH D9Dg1wFSOBiXBwRIP1MteIScwXbOBcsQ4NUmLuLO00BC7x5vsM4FjyomkZi7nqLagmSkyTISVzrR CH0JSI9FNRgv5DcSBQNxgUsXCg47kwSlYTgtsQ4DRfgRAeTKJgOOOpcpiJTXcHgVN7hfZ0Lq3sZ5 x3u12R7JcwPYMXi/YZuLI9PIzO02jaZ+id86iwd57eHjo0ZeHS0X8jK88SfIO9wrGM3TpoeSY7Hj OritPDBQXGtDNgC178jaqqmpquWMTyZml83hzs/KS295m5jqOd4Frt0M0UJvJe8eoDhylmYk5gkT pUeMVbFzdKY0VNBKigWc4VEqPPBBxxBpyJtsxjYG9/ZyiaHWk8C7bby46tvcxjGWKAdruFVOu4Yr vYtpNu/ZtIXiN2wzFDaYtLufJ3tNFJVaYt439MTsNCQmmhMj0IlZB0S3aQMjx+mB5qHcS00qVTbB eoATtRJlwybuQYHGeqNUKFxQiaX0Q4F8GWG2k8jxM2DkNDKbTnutZ8Dx+YNdKjkU2ms2huWJ0nEg HJaQxXOFOc6iopWkuUS4d4e64c9+t4jt7UZO4gv3KrXHFT+GhYq4yIi5A/uiU/mkDwikDKqmVqgO IlecbjwDnKQYhEhI9KEH7paJF9fb63IJAwGaXuFBbjiJOxfBAOpBmKuItGIzIiI3ukFiktp3H6HJ R0KVGmPiOYFflKA4ME27ImlUVKMd7ZLe3Wy2OTYcXNPjTLhwWLjzWWV5UiihMsKWI2LlDUH6hycW HU2JUJFJGMjhRw8Wmqi2LjeKJPoIogg72CQNCxYxY9yDkNSpOGDNQxubGU4FJWCkpCRSdRkSkSDJ jppITlJgX2oZcfIF5AtKzQZ43CEQnDTgHSLpOonyIagvwztZc2p1smHj4DnlxS/RUc174aUGPSLJ wAuDhg93e7TdCcw4f2QDyGhQHPkeAjPLk+4cFk2Gdrn2ITKDzsTUsULCmpbMB25rOcPNYHkolRww oUKB5SCcGjyJiEC4NYIxWYp5AmiYYgYDFHEjUaLnuZzh5lB6qywLaEAdCJpLG8JkjJcecvCxyOWT fBLqX2tzY3bzc3NDBzmO7uysuyZlz4i4xEsS2HhAeDwcCqFzc0S0zKdUkFHsmZm2vUwtJCjzPM7d SaDCST6Ux3xsDTftMdB8BTl/LFAl751VOyrkrFZxge2URqokYX0309vVZVUVc7fjODCSYh7aL5Hu GMm/bba7BINpBo4SCKHndMieBj4JdFoSHamqlbaGMpREB9B55VFGM2VrBQNgUK9DQciBtdEzlMik ymJoItWAkF5ecV6JMR4okyeqmNQZhbvKukuVBgZhloZwQhQ1iHNrkSBEScJjI4444LEMndmi9I1T pDAo44BuQ4NiJyc9Ml1jWx9ByYMIk5ehE2TUua6mxsWKlg3ucI4hbow8rwF3pqRMVSA8kTNyGSZU HlLXHhEiDicJHkM+6Qy1PYq9SCU26sJ2u20xutcjFprdasldtodUxgxsMtQ5Ymqce2BBhKBLdvJm 3G7p6aYmTMNXLnBeiFNGWOdYtmWRLyJGFmRFC3JgNCSTGaNbj4lcExr9gSR44MIwQcukiICg7Kjk Y7DEjuO+ZqQADSZLBhGMSIOqTGuBQAFHJzIwWo3k2CJbcoKs9MNMjzcFODYMm8u5E9cVZEvIvcmM SFfsiiwYV5sWDvDIMYHaHR5A1PAjcH2xZ9xnXVw4oPIEQrZXF1gVieLx7AN3xjKm3+l5fcEYH1RP 7mmIpBexqut4hX+Qw4elciBCMfepyNIcVgU/ldOqhy5ng1r1MDYICyw9KxmtNxA1i9aL00A5St4g VhQLUG6qyIlsLrX2rK3IDCysWETIQYwvWF4Pdsw9dPf4V5Oj854VMKk81tUWX1YdH0WiNEdMY9Yu id+rwum4z+/LVTTFlN0RGO+sRO2gcCHKMF13TdhKvFij3M0g6MWqw3EuNAITCu/QkZ5FTxLQ8cz8 berw4cHNOXEGY86ocowqvXLkLr23bzrl8nZ35+TpBFUTwTY3cFoJlVeil8I8+vT3vKeE5TQ0U6u0 9agxZPWknqkAUzIG9g0/B2jEkkISD3YOIPvnCRa8b9ngoujIu+29mu5He9mw6aEM7MVL9Yyltu/f bWngMHIcYiY2bC29zQ78nQWMiiziLSKRYxRYigktpBOsYoWVixsYxlCKSrRSlKhSJKNmWvOn7OrG cImXDX58NOxmZdZGheqGrGF8zMncvzMxEKsB+I0vPD1gdclQiyJnPkhx4Rx426KqSUmNBLCGQKVc /EH+RuPCj5Ah7SeMYf6z+0P1B/oH6jZ+yZypB+zIwP5yCT9hS8NCp++ZFVqGkzj9DdmPLF0v+Z57 g0h8JpKKQKpmA+9+n9FP0cOYQ1BBHZEqEQEUAZAURBeWawT7jsBQsS2Df/AxGCtzAMmeX2uTN47M 61AUfQqqhYDDGoxzQER0lFSydRUHI2+hpitAw2JQqjvhm+YFSO1/m+Exh0czWXjbaxm7Wnu/apzP HpLy9SaLrTlipfSvJGJ1jt0RhU8sR5MEUqPJfo5ZqVMzu4S7gTc03HCQ1jw5GqyuTccRFwkGuVlQ 1OA/1Arr1iWgcQgMiaUYRezOQpDOdrsVaN032qRTmFlt8lFi60dUp2O20PhGOOS0lSqKpxJrJdcU NSccHAcCRApPe5OZU5bRSGTxfp736P16YtbnouokUp91En69Lx2GxeSMTprA5Mr0wzSGMUG4aQY+ JNAitQ2sHigK1KdcSQ8wUizSazRlGt+L6WtysXBpLD01jlKeFBEJzO9NYK0/shxP+zrmCDIJZCYj cXupPTCPqSWgXzUcwyXA6yuF5wCCzBEEUbY55p4UPZh1xkzSbmhqkmBaX4L0S/IpZSzNnY5JsZiY SgnUDcYJ6wN9UNiydksmwZRgowKTFpMow0GJsskyUpRpTINDTuYSiTrZWSk3LOlYZk1Kd+AZkWBO EAC4YE1z52pHeR8DrTCNzPVi37nbsZmiclSdJMWxMowdLjolIjimWpkTFzZtxoJUsTVHS0HFZYoW pxNLUwMFSRitmcw0/1mdlSGTSjfMqdEdBMl2hqFSVIb4qNhF0tLFk2jRDCYqm5WwbGliuYaWmeen 6qsqVSPOnT0aaSqv01MDcXGtvRNzNWJkc7BE0+en/61N5wK2Uozm05Gi42PDksk4dJyLLZDXNbYx swbLEZKo9FylKysbVWqX77NcN0qcN7LTKRtazJ2Gxdz1LNbXpKRTdMGDPnSqkFtWBjJmYcFNJYMf sGczMYNbuToMBIXQVF64grTSSBOC5yTRd2ztdDW1YtCXlhbmkOKzBMqj6+WzpGUMpFbFZOlKbkVI i48aQmb8/2q/b/QIIKZkP/EgfT84InttBT6vxRPX/SG4+sSERCHRMPVU9OqeKqB5RyeLypvfEB5m 4ONx6oxQPLrPcTWGhqH0slDfVVabYBHxKTXYaBcobu0FgY7J0WKKdwaD06IIY1CgNxOUhmMGWWtU Rq1ZR6TYPGaGeNk0qR73Kdj7xJ9MEQp7T1POtgq/oCwB0c6yK3gfZiYB0B4H0l4W/Kkn61ggiEIz NapiFTr/GSpwTUobElxmCREKQBAlP4sSZ2X+VDZBCbEgpGEIgaY8bYTQEbgwhRBFlpaIYBgYAxUj QwCWDHCYCa0lYrLnXwC9aOdvEoYuNk2DtukDNKNm6SkQGk2V1JZQK3AyoGOdMaaIH9WjWoRRsF4F 8OC20OIaAsd+/iPg2/YbSJ5YPP9ZL8ckn2yQkGSHKHdCfJDhiYv1J/FpTPnPq/JTGqVEpkwGMBmK Kjxk9WHBSM00FnvB0ae9D6zhlGMO362zLAzoBfWcHJAcikZP0p46ocUmQ5A73fPKwqPqU/1larNg nhYfWOvCw8tJgvCrJEaDk1MD3v33wXCRvMwGTsHmmp7g6FRKhLUsdmbazZb29sbWg2LnBqe70h40 V2qX7u1J3VF71FKUd5ViqeMozr3OWOzoWcrn5+k6v3w1DtH97gnNbG6VU3iBHXwcvKF6zT7lRXSd QHmGSRxoomaMn23BqKDb9VTI9kvGHeTHDhxhtt2J3m0e5Q3mtoGtdpBvBFiqH0VVGQOY/CdyJHYX TB9zFiiR0d0quy7y1H8btKo8OlB5M5gHjgPSXYrPebohPqfXMVO3jmviy5FE8hXhDohxJLGblgIy AZ55MeY8u/QtliVlgvWoL8VkHtfsO+f03h6jo+McnPr0XnsCfcTaGh3IkQiHJ/dAQh4mEwPAabkO CVGtYSyoPSpEjSb7P8mJrhTIw0yKk20UMhhsIEeYaSZmZ7MLbmFvMqQhhK3boDVwR04kQ8hG7o05 oPGJgDdFEov2t7a/XLBPEty1CYhMEEaDhO84LIgS5C8yiSoUQoy7Q8/iKlibGBwoCf83qnDvG3jg 63nX3nxcTuJzgTM8cPS52eD6Ux2jnOQdYDu39kQmmR1BtVZ6d+w+Q7Lj1Lo06aWieYiFAUDycJHy UC7rPOL0KwsrKnlRmiWlJEsPT72KmSRWRMMmrw1ID/pP5yH3wpjEzJyhE9YNMhynF1zBTjMhqacx ym/t90e1Zeyx7tqxm0HA8H+tmG1VWmIa16fQlMVCWYMSkm5zA2arJGnKsZEzzWEqsxuNbjLrUwdV 6RsK4ESgtgOLiY5Mfok+pMODapznA5dP4HxMYrqk8yjUVO+9wYikYJFEMBZ8AbPj5cKixGSe7pev qzT4XLeBR0DuDyNABc/aDlUO8619ihkluF0dnOXW9DI7A4IOgHogHpcugOZJLm6EKjpO84T9xUPO FUiECIALKUF7GE+JvfGMOwUQJCYDZBCIrIRWHSeQ0SDJw2BiGjJBxGAx7T4qm5Ame4JF6A4h7Lh8 2cC0Jz9JgySgKFD2aG2583r2KIb2qZHkLw9KJW7thIJFRxMIpyEB1POGKkGtqTRYMaBnTnVu6HDI WwG4AIZQ9IzihX7DRcccTE0I8GlBMtk+0ca9QaqyOzFmZm53JndKwdqjldOBqPHG5mYL8SWdenTd a29u8psV47d8l6eKBEZ479k8574mDcCYdJE7kMbdrrV9ZFnLZ3ldvokmCJgkZssAlASkEVPQvEiN nKSadRujyPcdZ2s51mnpU7oFT0rbsgM4p5sypB7CBeWFiHdWSD1nEJiCkkSAgsmswg1E/E6Sxub0 NxwdWA7FLCCCZvOD16qCeqU3YclQklRHxHiKida5/MOfNUy7+I4x1omVJnNEYsRRkwUpWRUxZBax LoSFFKBS7OIgdnuYweYkvkLuiDvQWT7bwu1G5u93XJraHdZtfJm+Sno9XmfS1fLN8ZStPwfAbXHX SWVmZ8pY19bSfLhNjpkRg+iMG0+tlu4wTYzbcza6GyTrNLBZzWYrmXIaNDKROWJClHZTmSpCe983 3WWKBbfurubGnOxeoeSpIFbgY4oMfCgjzp3Cmr9q3EAn0nQJYeJOQrKSbRJtOcuDMF85nF6UAzyh xjlfAdZFPSKVn0BhwJys6AmB+cKBeXJ6EfrL3r2RFnzZPmc2mRdDu0aHSsxPh6xOBz+o7G7qIQd2 pcR1d0l86tIdanVihgvQu3E+J51DzH3EMjnLBl4G7QToqla0JKETOanLqXvwG3i+M1ypGE+JLs0V kyqAprARBFUDysnlCnB5IJorE3jZAeMr5FjITTUTh8Z5MPsS+JsOZmJJZgExkexvabMa1DWEVXmY vpReM7ozsJWpcoCKp5S5sRF3fXfDIW9Nmio2c0Wz8ppe1nJJhRcDszPNl6yXJp6mhgxtN7kXCk1W l25d8nm9m+wQ5K0g84Quz1OeCT3CEduR5RSIo9Sjk1RRpchAoJ1dFQzQ2gL4pScwil6gYvEHiMeM dYbzRrAYmtldDTpycOjmzz53ThaA1WUzYraLYZMIh0JIyg8lQKlZ4bgYcjn+4MDqlOyma+D+ed1Q k3GU9nxtMKuiDgpSfnzaa5Te2Tmbcd5UlZikgZyqgvDynp5eBEjRTrpOYoNcS4vLA1Fo/ZSb+i6d lm7r6fLwecg7ZBjdEjWRppRnaQsQQWi9s1NA6gMZAE55wSQmDAoDFLGegvN+Q2Q1lBY3E9zt5qcC WZiIohmH7Cp4OFjfrV2uo9cGbQ5W9kazrxOUu9/n0Nkk5tyP13jcFYUPCnJ3zLLWawcMDPYrfycw QTGyHjpDou8o6fcow4uJqHJ4hDtmbFTkOGEUYNAxuo6ixm2XbTYVhQThIPUETceAwZLNl2dOXY/f XnJ49zfnenHlktGp73q6GKU5mLoYIaXa7YguDipcWBQNqKAeg1JSNkCK0hMtWu/02zzOSyzYNs36 pAPyzPdDvSeJcetWB2gepHWHzHDZqRjn2RaWakp+AuDw5Zkm4CLQePVkRHQQeYeG34SqPyq6fuen RuXWHAfhgw8wPsJyGz/hoQ/mGQhDwgn23mAzMIQzr2foQiCHIBXKR6Un1dvPSbGJ8590fshduxm2 jLu5LXtrs9phS17rFsFg7bpQFK2STxB5xUCfRQe/IvUq3OkBnDaYpkIeZbUTpNFJyUHzBYnsUWQr 8bjXL1QvukE0kMEtWQB5OloEd4xmFPYAVwbxUICCTHKKFKm6CDOWJYJGEV5Z0aZmpCGy7Djh1zpd YJOwcNcj78We5UoUFRIeyWkPfPjI/z0lUklcCyEtUkHLOaTxdTlbVOqVAsIGCqfyTC0wgYZgEwyU RMGT5Ot2T5MVOLQvaL2AC9J3mJMUHqMjjIu96MnELMpApHOOC5pY4Q6CSGLAoMahUuMRoPDASMmC n1RBqBBBRg29NCRvH5Dz/ay9aCJbejDH1n1nUPG3Am/QY7XMVJIgdxY4Tu4pqkTqeAUQeWDtNpQR MiMS4JdcNiMBcxiyIkw/M5YLzLzcXxj4sWe3y/hkFvr65BYhXCS86EMEuHMTND7/sOtL/veLCDAO HiIdp8kKVusIUoRAQ8uexBUB5+cvFA54wOoK7wcCWpNoLRUM6Ru4LQ5ZM4xuk/XX6OxHQdBtw97n OsvHtDSaVwzhqDac3ip4uGfakxKiEAp6VYi6l7RI/RhyJh1w/B8p9zzPuwfemRsbKYhHWTOGAbxk zI+sMaBdmiGBlhBeOm6KuOj6XzOpf8vH5kuopgdzV9Rzud4lpJwYzeb7gDF1mOwPwHqYJD1+Q9IK 7F0OTsDQa9AJIZdjHhRavfiFy8QFQIBPBuxG2pG8rDiWh1w+Rc+yfV0KT71rJLU99i0UpYjclpIt SBSSqJQvJR5tMjWnwPplNiIu7MgNMlRp3mZEdM76j9K+v2WthZnK83Wc3tKwytItsgVUio7c4m6E lzyfDQd8epkH40VUKlSqkTLfvbzOJyxotFe8wvmxlT5a/JfsNDu1DeHcN6o+WbGwbCQmQhDKlU+q Xncm48U+48WMktHK3Rp4rSWcD3TlDg5jXnBU1HADrGsrl6zu0UCPQGzQqw/CsFPTToi/NwxGNYj7 OeEerrjFN0+07W6EbNvx9V/xr75B9xylcnRJY+a66UvVvH9EtSpZtPkuYl2gapgfWihKC8diKrx7 c1xMxoZ8MOMN3jE8iFPptTGMEoYfRUmCC10sH8n9UvIk9vVe7bIchk0YNDfuOBFPbtX+nqOeREvJ UKPaNBreBpI1Vubp/BlY9P/Fl2AZhHJihc4zpAbjP1O+epahLeghu9dIf0LIIFgngupyDQwnDLNw pFJGkzDeDEZjeOWyO2SeQgmHmfqPCO5Q+eaZgYp3XGXNIQQtT2KjnSuF4WmQ0VbkYHTfFMIMZHQl pKk5Q4MYmEYIKu403heQ/FJ+CThkxNorCCkYCyMSEEnJ1uzDHP0cU8wdmdsZnlURN6UilUoUKFKV KUOn7ZJU1O5tEmT3aIRg9bhkfUwO759avWlp7lJZ4VdQPF0Pbkq8QilztRSbA4qiOVhkSyJIjob9 RrByBlqSET0dCTBV68F6F2BMLae/EKVeGAYkUEcrq+prZ7GOtNDlORKNRxieKe9+JUtJSxUsilip Y859Xf4Ob5Sd87lHMePuTcXfcnQHMdueGiJz926AGJYjASUJZ6TsBRBiZJqwbvJEtJCzp2mHIeHf tJgzNy9OrxwxoGDxIdhgeNhg8c/ajIVR0sPKk0QLRJd8q0ApCwJ5QN1pPlDMi3xS6hQoN73zk98L oT3RyKT3FB0T1Dk7J3fk+he9XWuvavo2HfHjDuiO5Slbe08iju74nIYz4DV4hmLxjQBORKwTKSp3 EU8VKkJ3sCNUwkuSezJOBjOKexZJ9aohsa5OJjNQL6X09r3hDeDrQgMYY/OcoIvThujijV9b4Dzw PhnRs6qTYw3d8NsyHgrz2V6ZGVMyAVaowRJbgkCFkApympoGZAGIj1R6mOCeADeJxGV976MmWTYw mjOmXptxKkwge6s4wQmHkuoAtKE6dwa8UTLEXdS4VCW40yfB48uabNMAyW0U3UvBxRAnKXUiEt8F cQ19SOvI7vMM65xzZwjremEFk3V47jB+AS11kRfVECpBsI/oSZymWhKsyHE1gxIJk5M2ZpBVZORH 8WtZUNwm5cg0w/A/AwMMS3RKORoW1rWcNrsPH3z4mfLj0zjI9ExYNKHuDKzUxBbC4DhvDobhtvej G2WBSrIadj0ntNGaEzRqTIJCYLi4JEFKgy/a8/jR81GTFo3GwyObBqk6/w3R2/gFMIlEskpaJRLG D60SO3RpOdz1EZMZSc5opge22bhkCQEri3OzOzAOZmTiCz3U4dAm1g2xm95K+El0nknT3yMelsPE vnhgufSpKpSijFJqg7BZA+IA4I4IWdGQwSgPRkOxloNTI/STt3UYDSE4oihwyVgvadUWyMjqKmTn v0h5odd5tQ7Tr683+PnPgJD0FxBWktIYILHY1UAk0m4KgIIB3c4zNmKKCGdUklRf0EDJOqCTPX+M 7nMdLs6cY1yEmYmEKXEbFFzcDkzWALhxhwUswJbO/m4oqUOJOIVQpmQkTRLoVrknr2Soa4DgzBPN KC1YpC/GAQr5ryj6vHlDoVblQziQuYhInZxkPtgiAQ4uwsfiPFQ4qbXGWewGShJ70yU0DixoCKhU yxGGcksDBAlhJmywyG6lMBLJlighoQnxoHvFgOUi0fFCSQNZKiKe97+zQqZ7N960HPmlmR5/j8v4 /9s+3R+cZV9IXf6fk5He3yHCgqKCCKh1wo8ksxLAAmPvya590pRpc/IO07UulHW7jFo1nkfh3G+G yYyR+psbKrm75QvrQ/sHp6ybT2PwaYpqm0hq26+Mj2voxnEEFQtIoApNECsy0RMhQksiEBkAqYMG DGI0SQxBFCEySdj901lkgKol2JwzoeL7A5vkOVWCYKQLEcsF8H44E6N1xePu8iJ5JfvDqKq6oYgV pRbH5daBdsM8eRvVeNe44CfhC8vMB0IZehPeAyN6aGEOABjSmx3sFtw5I0QVMw4SJ9iSE3dqHtlL JDQZe9TiE3iBl9UCRBnJKSGVEtNyjGOuTrSWmnA2FKKoKEmo5ED6wC2UX9XgrnjtHSRJMolCyJEB yvUY/lJe666z+K9jCm6i9Uh/AkIykiUIhLiLiYkWk9lIbepu2JESOdIJzIlcY4uTinDwyKSUAyns p+Q8HDF7on9TfXM/MH1j3YdfebJmICNvANlni4dWBBya7oQL04yQ9X8c0GaNWer1Wt3V01frYxLN 9LmCYEvJcwQj8D806M/kn7g8DA1zoio5WqxQ5vn3UP3m4oPWFRU/dW5QIQGTu+aq9T5fto0h9zoX gGZEYuKhdTgpZeOtnFv3ci0nrGszhHJ0M96FNo8jpOuR6m9sP2J3M6pUOylmCIh3cSwaTV1mOpO9 CLiL/V0gH11x2wQOjbpT8opVp7jYDQYW9L5p1sxaxInCZLkHsQTCkLkqHZk2ndFo3nZOP5mMOaHr OqaTOP1J+FobDqjsgnvkeU5Y2nbNgdcTjIdUYbHQ5uGBwHF19RRJzQWSN5miMYoMBUQO60MtWIxG ILHuRpQBhoTMhZCHmbG2GivzmsyoIVXDxlc0sD9K0FBYei0kTA0JvPamqTn3Te6kpPccXDw38hW+ PM0He0jNOcxg5BKFbH1HFg1dEdFsg3CKQshAGlx1CM8XKcugKrnwM5jpse0PIz+BV+n82XVBBFel D7muiatXLEiJMIDQtAcayZLtw+KBTzeyQ9knw5M8hW1GNujNvwycEl0R/C6vg4SWcC3SVwtbBZ8p Mx1r7M58GBrDyd+KpeEciZHrDpmEQhhIM6ZPkncq0QzFYHqR1nFRdArQ9Kefia1DE/IQGooRqQCV 2mg7VLgdaCXJvAokt5KTMsuqRpSSWVhmNimryCy71WOFoD3Cl6EFYdmw7s3qel6FLUbp54WMeswE mDqtnOAsQRBA6slLszszlhhwJKzQtMJa4uDak8brGa2W8hveYcsjRDOXGdpS6ObITYVt2aYiaW6C RMyBzdbwVS+PDFEiThNi+w3nybYJ+zugCwnJQrpFc/eJYmCtpbK1dDkoeXXoOTdzDOdnCdg1MZOw cHkvhX0FwtWKSc7vJa9adWY9+psW9HX0mOBwwAxAKCUQKIScdmPVE2xBMJi6OCg2PN6zO28OJaLt L/bGKkH1Ow1OfFYgCFSIkik5pAMnDMh2jaT6mb4EOqXJdutWl9QbkwXVCA7nUFlAwWNqZ+2p8nsH 5AD3fXOKWHvsWAosIKKLKI9onScM7QY4F76HVNlnX08hAPoUREREREVERFRFYxb1tIg9h7BxG2HD CTbKSkwOhyze1VlBKiFVi+8oUxmxLwKzjNbWGj7lSbKiZRrvKo+wvgzD3m7NlmnchNsT+OESkN2Q On6CUoC7hOVI1ILBvx1lUpLI3O9x2MMcA9JeGfC/suvSCQmbflL9wZ+xJ/YbYt7XOUwWFmNuw69b DDoktfJrR5i5n6mpfD3tbcYtBoaq5BgmdimZ0ru0XadUX1TWEmbKsXtZZKsjJrGulGmNLD5YtYi0 sbgptSwS7UjAJoJZiUAtHFhwiz3EUQTcKGwNytdmqUZ9/hvTe4mQqRUnWKh9rcsepq/Kfk0HnoMl C7Rkayy7ddWzxSYKBskcyVGVhCBsK3MtBQKcw1c2xH7oQYbnM57wafTKPlnLsWRiwbc9e8WGvMlT GvHK5jIolVSIRJRC6A5IjzKW5WtM2W9lJjzI6E4MnOMUgwk0yH4jlZBiiIyEIZh3mfkZPfQh5Eok A68IF5G/tTWtt0hq3rvCTZP1SY+sXovL9DmJZMPTAMsKUUWF57KHFNfx674BlgHB4Sbl65KTVRJN MR0mubpHHYU0RpoqUZV1bGD3YdF0XBghHFM0GJWGHAdFrWQHTctus+SaQxkR6HqeKXw4vBNbW4eM p0TK3e1F+tL5BI9Qwh/FG8NQuW0Oivz+0bhN1hYj6BUHo9OImePXBBBKHZpOdQOY6nelF7g7TYnz ph3Args/Lx6V1Q/f+GWmxJGk/m8WrBAQbH3jlDL1HSPb0A/kOC2XZn3BxgwffuSL5YipPGHPYK5k xTYc6lc7us2I5x1gGN+l7Buur1XqJxHRY1vBwdPeG8LBSb47Ty9B3OCFdabE4U78PIHgDz8g6T3a 9Ut9Ow1fqkwD4mX1qgqOZJxOw8jLs5C3bOVq3yuEqsxyXwWStrxiK3Ra1NBkG7g9htcsQyxQXkME bg9miI6QzjqUbggOxyy4XpBWC8wMoC6jFHEJw0C0ei9ZwNvs/DQd56yTo8jOmLFSdvVkY3Nx87RH K1ecOnqTEXmZifW8PNJVjzmbmZHdzHiQdIt44XynyheGmBNJ8Ycn0XeScxjyGsst7vbub6VdYvKV 5+R2983zthc2Gfcf3VtvUekdLkhjvnXtjkw6n3ntLQ9ZJOVaHWaE2KFFQklzmbXF6MTzHgOloDr2 czL7ogTNyktG4qS5TWvfESwnzAYznGHCQNjF3JmSp4mTo4B0Dvye7MmP65yiEpAjiwKyqEMJDI6z gHuj6A/Aq9XIHaGxDepeOdW9BOMMh4w07ZhQ7EoHH9cA4oJ6OC2XNCYDEEKDwDQoFIVrmE0mPU7T uOtkZTvkOhoDpPrPcykk3tIXOEMUksvAOsCZC6BJDTFyu8IeHPelIK8Nkwd86z2PGTifSfe8U+ML B8V6SpUVJ/OQtmjWFpEllhWtQoVghkD/8XckU4UJB/4z4YA= --===============1718334163==--