From: Jon Olav Hauglid Date: September 17 2010 8:48am Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3141) Bug#56422 Bug#56494 List-Archive: http://lists.mysql.com/commits/118442 X-Bug: 56422,56494 Message-Id: <201009170849.o8H8n6Tk007000@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4573184347399794817==" --===============4573184347399794817== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-runtime-bug56494/ based on revid:jon.hauglid@stripped 3141 Jon Olav Hauglid 2010-09-17 Bug #56494 Segfault in upgrade_shared_lock_to_exclusive() for REPAIR of merge table Bug #56422 CHECK TABLE run when the table is locked reports corruption along with timeout The crash happened if a table maintenance statement (ANALYZE TABLE, REPAIR TABLE, etc.) was executed on a MERGE table and opening and locking a child table failed. This could for example happen if a child table did not exist or if a lock timeout happened while waiting for a conflicting metadata lock to disappear. Since opening and locking the MERGE table and its children failed, the tables would be closed and the metadata locks released. However, TABLE_LIST::table for the MERGE table would still be set, with its value invalid since the tables had been closed. This caused the table maintenance statement to try to continue and upgrade the metadata lock on the MERGE table. But since the lock already had been released, this caused a segfault. This patch fixes the problem by setting TABLE_LIST::table to NULL if open_and_lock_tables() fails. This prevents the maintenance statement from continuing and trying to upgrade the metadata lock. The patch also fixes a problem where REPAIR TABLE ... USE_FRM would cause an assert for MERGE tables, even if child tables were opened successfully. Finally, the patch changes the error message from "Corrupt" to "Operation failed" for a number of issues not related to table corruption. For example "Lock wait timeout exceeded" and "Deadlock found trying to get lock". Test cases added to mdl_sync.test and check.test. modified: mysql-test/r/check.result mysql-test/r/log_tables_upgrade.result mysql-test/r/mdl_sync.result mysql-test/r/merge.result mysql-test/r/myisampack.result mysql-test/r/mysql_upgrade.result mysql-test/r/mysql_upgrade_ssl.result mysql-test/t/check.test mysql-test/t/mdl_sync.test sql/sql_admin.cc === modified file 'mysql-test/r/check.result' --- a/mysql-test/r/check.result 2009-02-09 21:00:15 +0000 +++ b/mysql-test/r/check.result 2010-09-17 08:48:32 +0000 @@ -23,3 +23,19 @@ REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK DROP TABLE t1; +# +# Bug#56422 CHECK TABLE run when the table is locked reports corruption +# along with timeout +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a INT); +LOCK TABLE t1 WRITE; +# Connection con1 +SET lock_wait_timeout= 1; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Error Lock wait timeout exceeded; try restarting transaction +test.t1 check status Operation failed +# Connection default +UNLOCK TABLES; +DROP TABLE t1; === modified file 'mysql-test/r/log_tables_upgrade.result' --- a/mysql-test/r/log_tables_upgrade.result 2010-02-26 12:22:48 +0000 +++ b/mysql-test/r/log_tables_upgrade.result 2010-09-17 08:48:32 +0000 @@ -19,7 +19,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -33,7 +33,7 @@ mysql.renamed_general_log mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -41,6 +41,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK DROP TABLE general_log; RENAME TABLE renamed_general_log TO general_log; SET GLOBAL general_log = @saved_general_log; === modified file 'mysql-test/r/mdl_sync.result' --- a/mysql-test/r/mdl_sync.result 2010-09-08 08:25:37 +0000 +++ b/mysql-test/r/mdl_sync.result 2010-09-17 08:48:32 +0000 @@ -2951,3 +2951,47 @@ SET DEBUG_SYNC= 'now SIGNAL continue'; # Connection default DROP TABLE m1, t1, t2; SET DEBUG_SYNC= 'RESET'; +# +# Bug#56494 Segfault in upgrade_shared_lock_to_exclusive() for +# REPAIR of merge table +# +DROP TABLE IF EXISTS t1, t2, t_not_exists; +CREATE TABLE t1(a INT); +ALTER TABLE t1 engine= MERGE UNION (t_not_exists); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze Error Table 'test.t_not_exists' doesn't exist +test.t1 analyze Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +test.t1 analyze status Operation failed +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check Error Table 'test.t_not_exists' doesn't exist +test.t1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +test.t1 check status Operation failed +CHECKSUM TABLE t1; +Table Checksum +test.t1 NULL +Warnings: +Error 1146 Table 'test.t_not_exists' doesn't exist +Error 1168 Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize Error Table 'test.t_not_exists' doesn't exist +test.t1 optimize Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +test.t1 optimize status Operation failed +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair Error Table 'test.t_not_exists' doesn't exist +test.t1 repair Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist +test.t1 repair status Operation failed +REPAIR TABLE t1 USE_FRM; +Table Op Msg_type Msg_text +test.t1 repair Warning Can't open table +test.t1 repair status Operation failed +DROP TABLE t1; +CREATE TABLE t1(a INT); +CREATE TABLE t2(a INT) engine= MERGE UNION (t1); +REPAIR TABLE t2 USE_FRM; +Table Op Msg_type Msg_text +test.t2 repair note The storage engine for the table doesn't support repair +DROP TABLE t1, t2; === modified file 'mysql-test/r/merge.result' --- a/mysql-test/r/merge.result 2010-09-16 14:06:46 +0000 +++ b/mysql-test/r/merge.result 2010-09-17 08:48:32 +0000 @@ -906,7 +906,7 @@ CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Error Table 'test.t1' doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist -test.tm1 check error Corrupt +test.tm1 check status Operation failed CREATE TABLE t1(a INT); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist @@ -914,7 +914,7 @@ CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Error Table 'test.t2' doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist -test.tm1 check error Corrupt +test.tm1 check status Operation failed CREATE TABLE t2(a BLOB); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist @@ -922,7 +922,7 @@ CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Warning Table 'test.t2' is differently defined or of non-MyISAM type or doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist -test.tm1 check error Corrupt +test.tm1 check status Operation failed ALTER TABLE t2 MODIFY a INT; SELECT * FROM tm1; a @@ -2677,7 +2677,7 @@ OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize Error Table 'test.t_not_exists' doesn't exist test.t1 optimize Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist -test.t1 optimize note The storage engine for the table doesn't support optimize +test.t1 optimize status Operation failed DROP TABLE t1; # # Bug#36171 - CREATE TEMPORARY TABLE and MERGE engine === modified file 'mysql-test/r/myisampack.result' --- a/mysql-test/r/myisampack.result 2009-11-26 12:47:55 +0000 +++ b/mysql-test/r/myisampack.result 2010-09-17 08:48:32 +0000 @@ -46,14 +46,12 @@ insert into t1 select * from t1; flush tables; optimize table t1; Table Op Msg_type Msg_text -test.t1 optimize error Table 'test.t1' is read only -Warnings: -Error 1036 Table 't1' is read only +test.t1 optimize Error Table 't1' is read only +test.t1 optimize status Operation failed repair table t1; Table Op Msg_type Msg_text -test.t1 repair error Table 'test.t1' is read only -Warnings: -Error 1036 Table 't1' is read only +test.t1 repair Error Table 't1' is read only +test.t1 repair status Operation failed drop table t1; # # BUG#41541 - Valgrind warnings on packed MyISAM table === modified file 'mysql-test/r/mysql_upgrade.result' --- a/mysql-test/r/mysql_upgrade.result 2010-07-05 10:22:13 +0000 +++ b/mysql-test/r/mysql_upgrade.result 2010-09-17 08:48:32 +0000 @@ -7,7 +7,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -20,7 +20,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -28,6 +28,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK Run it again - should say already completed This installation of MySQL is already upgraded to VERSION, use --force if you still need to run mysql_upgrade Force should run it regardless of wether it's been run before @@ -39,7 +43,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -52,7 +56,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -60,6 +64,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK CREATE USER mysqltest1@'%' IDENTIFIED by 'sakila'; GRANT ALL ON *.* TO mysqltest1@'%'; Run mysql_upgrade with password protected account @@ -71,7 +79,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -84,7 +92,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -92,6 +100,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK DROP USER mysqltest1@'%'; Run mysql_upgrade with a non existing server socket mysqlcheck: Got error: 2005: Unknown MySQL server host 'not_existing_host' (errno) when trying to connect @@ -105,7 +117,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -118,7 +130,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -126,6 +138,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK set GLOBAL sql_mode=default; # # Bug #41569 mysql_upgrade (ver 5.1) add 3 fields to mysql.proc table @@ -143,7 +159,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -156,7 +172,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -164,6 +180,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK CALL testproc(); DROP PROCEDURE testproc; WARNING: NULL values of the 'character_set_client' column ('mysql.proc' table) have been updated with a default value (latin1). Please verify if necessary. @@ -184,7 +204,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -197,7 +217,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -205,6 +225,10 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK SHOW GRANTS FOR 'user3'@'%'; Grants for user3@% GRANT USAGE ON *.* TO 'user3'@'%' === modified file 'mysql-test/r/mysql_upgrade_ssl.result' --- a/mysql-test/r/mysql_upgrade_ssl.result 2010-08-11 17:56:56 +0000 +++ b/mysql-test/r/mysql_upgrade_ssl.result 2010-09-17 08:48:32 +0000 @@ -9,7 +9,7 @@ mysql.event mysql.func OK mysql.general_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK @@ -22,7 +22,7 @@ mysql.procs_priv mysql.servers OK mysql.slow_log Error : You can't use locks with log tables. -status : OK +status : Operation failed mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK @@ -30,3 +30,7 @@ mysql.time_zone_name mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK + +Repairing tables +mysql.general_log OK +mysql.slow_log OK === modified file 'mysql-test/t/check.test' --- a/mysql-test/t/check.test 2009-02-09 21:00:15 +0000 +++ b/mysql-test/t/check.test 2010-09-17 08:48:32 +0000 @@ -53,5 +53,29 @@ REPAIR TABLE t1; DROP TABLE t1; +--echo # +--echo # Bug#56422 CHECK TABLE run when the table is locked reports corruption +--echo # along with timeout +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1(a INT); +LOCK TABLE t1 WRITE; + +--echo # Connection con1 +connect(con1, localhost, root); +SET lock_wait_timeout= 1; +CHECK TABLE t1; + +--echo # Connection default +connection default; +UNLOCK TABLES; +DROP TABLE t1; +disconnect con1; + + # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc === modified file 'mysql-test/t/mdl_sync.test' --- a/mysql-test/t/mdl_sync.test 2010-09-08 08:25:37 +0000 +++ b/mysql-test/t/mdl_sync.test 2010-09-17 08:48:32 +0000 @@ -4594,6 +4594,36 @@ disconnect con1; disconnect con2; +--echo # +--echo # Bug#56494 Segfault in upgrade_shared_lock_to_exclusive() for +--echo # REPAIR of merge table +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, t2, t_not_exists; +--enable_warnings + +CREATE TABLE t1(a INT); +ALTER TABLE t1 engine= MERGE UNION (t_not_exists); +# This caused the segfault +ANALYZE TABLE t1; +CHECK TABLE t1; +CHECKSUM TABLE t1; +OPTIMIZE TABLE t1; +REPAIR TABLE t1; + +# This caused an assert +REPAIR TABLE t1 USE_FRM; + +DROP TABLE t1; +CREATE TABLE t1(a INT); +CREATE TABLE t2(a INT) engine= MERGE UNION (t1); +# This caused an assert +REPAIR TABLE t2 USE_FRM; + +DROP TABLE t1, t2; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc === modified file 'sql/sql_admin.cc' --- a/sql/sql_admin.cc 2010-08-18 11:29:04 +0000 +++ b/sql/sql_admin.cc 2010-09-17 08:48:32 +0000 @@ -112,7 +112,8 @@ static int prepare_for_repair(THD *thd, } /* A MERGE table must not come here. */ - DBUG_ASSERT(table->file->ht->db_type != DB_TYPE_MRG_MYISAM); + if (table->file->ht->db_type == DB_TYPE_MRG_MYISAM) + goto end; /* REPAIR TABLE ... USE_FRM for temporary tables makes little sense. @@ -231,6 +232,27 @@ end: } +/** + Check if a given error is something that could occur during + open_and_lock_tables() that does not indicate table corruption. + + @param sql_errno Error number to check. + + @retval TRUE Error does not indicate table corruption. + @retval FALSE Error could indicate table corruption. +*/ + +static inline bool table_not_corrupt_error(uint sql_errno) +{ + return (sql_errno == ER_NO_SUCH_TABLE || + sql_errno == ER_FILE_NOT_FOUND || + sql_errno == ER_LOCK_WAIT_TIMEOUT || + sql_errno == ER_LOCK_DEADLOCK || + sql_errno == ER_CANT_LOCK_LOG_TABLE || + sql_errno == ER_WRONG_MRG_TABLE || + sql_errno == ER_OPEN_AS_READONLY); +} + /* RETURN VALUES @@ -320,6 +342,14 @@ static bool mysql_admin_table(THD* thd, table->next_global= save_next_global; table->next_local= save_next_local; thd->open_options&= ~extra_open_options; + + /* + If open_and_lock_tables() failed, close_thread_tables() will close + the table and table->table can therefore be invalid. + */ + if (open_error) + table->table= NULL; + /* Under locked tables, we know that the table can be opened, so any errors opening the table are logical errors. @@ -418,9 +448,7 @@ static bool mysql_admin_table(THD* thd, push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_VIEW_CHECKSUM, ER(ER_VIEW_CHECKSUM)); if (thd->stmt_da->is_error() && - (thd->stmt_da->sql_errno() == ER_NO_SUCH_TABLE || - thd->stmt_da->sql_errno() == ER_FILE_NOT_FOUND)) - /* A missing table is just issued as a failed command */ + table_not_corrupt_error(thd->stmt_da->sql_errno())) result_code= HA_ADMIN_FAILED; else /* Default failure code is corrupt table */ --===============4573184347399794817== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-runtime-bug56494/ # testament_sha1: d4c52415201fe55d8a6ee1d530bbd1c2c65fadc7 # timestamp: 2010-09-17 10:48:36 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: jon.hauglid@stripped\ # tg3u8bsp1v9p7r7g # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWanXZPsACv9/gF2wAAF49/// f//e8L////5gFZxbKAL6K7NLtTTVbTSzakI2EfXXMMPu6++93h8t7m4K9tOxoZCISAGihbNNYZU0 0mEPUT2k0eqepkAA2hABgjIMIBoNMEkgAkYQTJim1T09VP0NTU9I0GRpo00NAeoGg09QSojVPKfq aNIGJk9QyMJphDCZMaJgg0NGTABISEQJkZCap+gwSaZNT0nlPU9QPUeiNDaQHlPUZNBtURMRkQxM R5RoaYTTIAZDTQAAA0xASKBAEyZATTQamQTaqbym1CaPUAyANAPKbUyNAkf5P5fZ73Tjjjg0v8Jd MS/0CsdbCu2IukNiPE1YrMI4TUL5j8Xn4idA17HsGW7gGfFnj3fMbvJrjv5/eapDZFGOMbNzJId1 ROxGwI+VQIjQP4e31E5DDXVFRb4ks0AqknPPtPTq2jYXR1lUp66o1WYuMnFKV+S1rEypsDkwaMPL Nz6Yeh1VTPjLKq0ZpxNrvbW647S89O23CyovHJ9NwJySANYd692jt2YQhZ5VSFln6uQ6mb6quFt9 +ia8npvz1o53m6ZaRtS0ir6Qi0LSApLlCd39wHpArlHUAb/9bBc2uxfulNTOFl0a39fg724SWzpc BAbV7W2I8I2PsALAagBgKg62t9APdYRgiW7d8OH8Qmz1iPgI6hDTGANpsbE222gYwx5hHWwRpvpZ Zjaj/J0+Cq6pKZOtlVjqLXzhhmH11NUl8tNrfsMF6haanT0NaLSzM7RX0zLEVnVAZUpiF71T1SmE zmb1OW06cZvEzvbRdTTo02sy7w9DsyW5wDp5edKl0h24VUHGB9QV8sff0B8QMg1Rnl126PMAX4L7 vuD6FBjNQqJUqQ8tN0O1mROjzd3HwXIZA+XxDZt7c2b/J0VL/Kxv8efdUZaYTn4uHeppPqivF/eY RrsrdWnW9CSbXJ817UOiicZfpbbbbc3KHsbSyN5QrLGkTElVRsRXlFZ027ZnuxZ0a54SjeXXVXXd 7RQ3nQohloT3SjpLWqt7zFTfFZVVn6MaCIInRUm9uaZDs2MLooaXiwouRO4iBca7iWjnTWytEjLv VrNKlK1fEgzOmC94yGwbQrBTWN8iKKmrnmiUnyiBGRLEES4NlXGbMUwe6MU6Lo7libLyppC9ooab z8GcDqjUhz0FT4foJMjZDqYC6nXhZiQKgAl4GrEsu05v19QLsTCymveEUHri0nVb0EXw8+GNeECy 3u+4QXbvo3EEiBAY0222222n3DZmi00BSSiYJmkdCgr4gdTp4O406H1i82m1sIjMDr/4+f5m2fo8 e+eTn3tFg2HCVRLz66cIQg6x2CPQYPAZMfUaSXBfL7D8bQsrPLZA6ocz2D9wlUTep7iYq0Hz1mAv eUGbjLhT1p8TelPV6qQ9r8bSGHaPfy7d7eWWOfs52RdHJgSYCJJW1FlY4otdVQxjKKA4gSlNjHF2 Hl47BF2tohiOuWVBI72cWoxgCkw0YTfg1k0lk7MsxYy+Vii2EszBgaobGJiY2CTqGAiQoygVGZ0O hcEypqsOhMLXaSjF9RnT7WEfIwKzaXFLxhBxLTHyqJ1MZkYxZeSFAxHiFApFCCZcFRZESgwTKhUx gWpaJ+rUyOnNLqmksL81vuaDiPAiyCSIcTSwTqVcRFbD+gqMxlhygRARpdeUkFKSJdTy8eElmbTn PfdWdjQbzXkZ/Ywu5FPCa9nYWQaHmDe4ohXLbCbdZ4c659Z30sNcyojnAY9GM21E5bLATVBWG0Mt EXObk0Gd8bhpmVU3p4BW1VLWIxC8DIkSHk+2cQkSMvdoEMjCfIfd3BY20LQR5THG03iPEpsMjpER MgbjUXPgApLV4GKxRNKRm7ptzPbTs8UVSzMxhyHKAs9LxMIDgwEQCuJEoZuIxCJxrvoKZfWnPrJy TiBBmwZpugax1CEKbzI70p6mG3FLkiOBfG6wYIr0U1j5y7FR1IzqjaWqeZSh3SQt5ee+ZgXjLz8U rzU0OJyK53LYZYjpa4tN73u7h0pmgRIa4k2H1NZuAVZL7upEmUDhA43qxEqOHPsOcau+JjrJFJLK fjExKyF5eW8F0iVEi3gVlmW0yJ8D6nMwPAiuKTN4GzbObbv45irQtnZcxmYIzYZoVNd/eQWrjVyQ o66mmbCl0bIcpxXoxxHMWos4TVYhbMzL1pIBafcMaiph5ESr5AKJIeQ7SLFwoPKGxBySGcC05BmU M1Ul+ehLcYrMoWpfx3HI9MCLLaZWe8e0YPHwPJ/J/djvHWx7iRKxUiOuwdXmq1RbWXEVVPiSOA54 4n4C0rjeUuPXsArDMqpWSLjYbTaXnJKBAxPUicg1KJdx4mR1HTDOt7Mcr4ypsaf3UpOzos6S760N DgVGLlxgYkim1rwB0FtGfgVJmg9WLeDwsNiZlI3m87SyPSczIpmSzJm3qYzOe4FOhtyKF3EgqY9t xOjhqlKQ+BvPiNh6ixSpLfowiG1oQHv0WhEkw4jiaycSgCcRHxiOkZDJmEyJynMie9lWZuSv7VEC ssUSt3mM926hvkSlZkZmwqMdgLH06DORCsoMxPBSLPEqPIl5lZpvPgolfMiV2gKOnHTbi+Oc4Y1l g5QJxJBqYIM0tZNTiIZCEzgXDGksAukZajI1lV4VHnLvLYGQxqrN9B8LENcuFzUMVOizLazJ/oMC 4xAt0OpxNC2g2Bv2b3MPTC3uk8YwJ4EETIjgE45Dh5toTfit+ooPifFKegxwMCprGyJYWrAwTGBu M/B3E1kIWLcTCg0NZYkPO7vXY7ZgHOcuiC9Rq10Nya62TeTIC7KoFeAnZ2SM0LG4zlY+t+l0/Ycl vYbrxMI1D2jIMYsHVKy9SRvufqA76MqiUbTGDH9IjIobbTbSTGPJKPiQtffYiRTHwB8tqW7ICRQX OCydM9dRSSh7fh+OgDXcbE2MQz4pAvqtXXxoyaoX4XX4DBpjUQP6Zthz2QruKCJ7LfNGovzBj/EI oQNDRRu+1Byfeg73dZIwRBuSzNZAaIYes0SP2/3n9wNtSk7BBuY38REIsHLJOAmHBI+xH8Mj4BgR 2n2+jEAxQFF9CQLTQ6LYZHKAak9l145VkhQCzVAytUEvVGwKlXBicygEqVHjsQfkB+QFQX7GItyM udsLr0mkNjbY0GewRNIfFl6iMC3UCu5L8lRBxPQxQ8hHSaVQEAgXC1kb0RFh/A4YqlZVqB5ExCK0 xVAaDSW6y+ArfnlqA5kmnko28ufChlYLjRMIzoctsDVv3Rc2xt69nG8ZpSOq7h0bdvbcy8GeX7vQ vKoIZP2qIJ84QQ0g84rgfwAoLAHr9EEUmIaulBntWXvEXuWVJe7NZCsYD0geFDyVpShIXXHy2Mug hSRAowF5SLpDMA0Xhg9ziglD9h9ZvPpMCZrLuPfj8/UDchkmQHNDJJjYOSDdWf4BogCa3kjcUIVB wqEons9TwNpYUuGhfUdSKAHI1oB6N5ED9zj+OmPzHg6MFNhGmo4xMMHZzF0h5wgQUjTTWmtmQN4m ROFokjL2xgNLRGHVQm5pThTKyUQ8WoSUyAQNTUg2oACNJSBAimtzsKUqWJmiztGyafgl/u4WR0bI Y98QesadEkJYd5AK2kd6+MGOJMw60QkvMZIOptAVNlFxP16iOs9QEfixtI7T9UvpYebS1IneNcNy 6HMiZlw5kSZWMib8zFMXM4XHcTOWJ/rZ15aC6mIzmVfMibtDQzOCyRc1r9wD2YDZBHwETYGdjgxN uDGMIxQvQcZIAmGxaiQaRPozp3kD5jP0NU14h6ji1xDOafzPQQEvNzGVBWQ7OhwtKsWgFrR03Aaa 6urFLl74jOlxceMs+k+c7Dso3niV+BE2AsTsmbATI39thSJKdgIUFBT41du8zJhzzPtkGnkOkgmd 5xy5EROxOYD80ZFaD1H2e5CaLWrJtTSB4M+JS6g+IsROQuvO3BTQaD7iWo4WnwaDHYvRiymycGrs 7pAVqmi8VxjWNGhFBeiZJ6k0q5x5oXT6UzSUHBiA2ZLS2MoRmOJwueI7il0NhQceMW9vbdhXNxNL z5TB9jAl6Sjj3lq0DTmI3CN93kzkwIUEYoTC4W2AduJwC1c/7YdKjsImIM0vWQJXBGzKCPsnIxlG FFJPI1MieKkcvT4mA9XZqbNxK5VF5BF+P7U8sjmeZ2+GsW/jAtVRx4KVk+cIwmmg5lEesVxAsiiJ 3q0AtBgqRAgg/WA1yJ6+F2gFqEsfq+aLxbkt9ke0RmMnquiDq93mU2xgg+OKRc6Z/lZJIfvEFl0Q xcJLSUNGhQDJME0FYJexXglggfYmCCWSCmUxkURiYSYpIOUWMKGxYMNFAcoHAYG1AHCgwNU7XHnr KlzwEGiREZGn3CPLzEYiKIZqd+YDUUEmezxGWnkS8ehWdADsOBJgqeC9hEhY/sdCCsJcj7zWOB2F 3uZyV3oT/xAZ5bNqNDwtFEdKlwA9hh03/k9pQSsjH3czgudo5AdthYBXLKCRuI1Fg4JJdhA8zE2m wLagP2sB9bQmmiQOBRLsSEYlIcDobEt9n3naRA8Td2AE6T8YHf6nizD2J+9UIooT+GmhUzr7IRBJ LQlK7/TwFtmAWGAdhDaEWAB2rze5AVDsfZ8vY9aFFZ8EYIyx3YUeYvPNEQM5RJURdtrzR+yhM9vX CQkGbBgugC7yxAeYCyFaAxrA2JlEKMwRQOIOJx7y5b95IURHDyS8SAWmgv9j9iQxEN+08zEZ6CS8 h/yZ98UjPAkfYtPchUD6pe2ETccTUx3pEkwKBBCl3JVYaaRgCkoBXu+jtEzj6SeVC77QEEONIjSb XEgCCIxDAzIAG0o1NCK116wGklvhtOBQ7bP1FIeBe0cBNFGQAOvgVLaHED1I3u5AuKDlGpehE1S3 ALUkiR+g+CK1wLod/NtoQOtQ7d243q1SLD7b+Do4PdgIwUAJqXcQslAMIdT06HaQuNNh9fgbAvSG bZG7kegbdpX/HrALWOaEQcDhuWzki2rmiG0JNDajRS5FjrEXeBF7hAQTKCMgf2ohbJd4RSMdpY8i TwxjQaGRCxFSKWlnhYcqWIhmtoHYRBKCrkiKOxlkYTGj4UrPeNKQjvM0HikfhV4GdX1MsCjBSgjW 8kBFoTLhlbXwSt8/Hf5iGlBHFiJRDAhgUNvocK1xKz1yaP3jANkr0KaCQB0Gvw3UPkJBteq/OyCQ D1RBHJJJ3BpHkmpYIfpBrz6iyD1NTwi7SIXfEyyPXUpNEIvMgDoEq6muvZsQdqMLaGgBdXAOeQBQ 7zz9C1PDECq0D+vyEL6pe5dUkeCqN8lYgN/tIQwTUkjyQt5oIbbLkJO80+p4Hb3iXE+JefQvzT6h UUKZLOSWJUQWwTSiVrgXmvee4BYfQtKJckg9RglI+R4mz7zyLi0aaQ0NNiM2Lc0Zsg0/0nslKKyR eUQBeJMSkBP5bb5CSm7TbwHusU5LnFIihgviBJFSAfka8/0ySK0K/0Ia7t4EUTXdL22JfAR91Ops OGBjjKtCMQFiI/ckmNq0Q03fAK141CMi4neMZ8jMS6HOUC9BIAZiiSYsIwTTDRwk26oIgDHzoa3j LaKi8ywx3HmRDck6Z5eEIJsxHbjjVQeO/eJPiAogdzLihTLoVU8R5FlmB4MOoGxI+PG77xH2bbbb fuWVBBGf5h9WfzRrnRJWm5PNaJEBs3MEHEaRZ7m/UEwCF74oVaCG+pAefqEqamCXPBm+09CB+uIx jY223XY89biZ/0RurOFVAzlV85TjoOwqlQdetoRBhgYz34lcZAB3iRtFeMXQYkRYHzPmUKsjbjBn rmQQYCLkXl5alqCGaFwSA5Nc2cWhsVb/g56njEFAG1wC4QDtWOyCx2wCSPPMDJJHBDW5BelgCIea 9jcEjVgtWKt3GbrerHRum3SYpnccBXx6VoRHsyLIScFyCNywwRZiNaoSusy0YaNLKl0FUCrScQwS Z6tAFaNOHccjvWHrhz3zSn+8Xl6ZgB91nfwF7ExWIBjmfI4qIU1RHuIG8TTUytKYjnp09wwSmLcr i2MPnm7XzPlLHyfQvC3A1m422Tu3IfSCY0PqPxpcjbmUQup8z6nY4nUvNQPE0PAbB4HvnkeB9i8q SKNdjwOe85n9hSp9i23NKpLQ5cUvQfQnvKgFYEdnoICXacprMJTxvsdki0bgjgfnRY2ltpFFCCkb jRKRvQozQB8cSZWu4BZHRm7VtpmBRPEkUselLYcv/C5id/8XckU4UJCp12T7 --===============4573184347399794817==--