From: Alexander Nozdrin Date: June 10 2011 4:51pm Subject: bzr commit into mysql-trunk branch (alexander.nozdrin:3191) List-Archive: http://lists.mysql.com/commits/139096 Message-Id: <201106101651.p5AGpJ0Y028533@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6207667120270682385==" --===============6207667120270682385== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug55843/mysql-trunk-bug55843-02/ based on revid:alexander.nozdrin@stripped 3191 Alexander Nozdrin 2011-06-10 Draft patch. Make Warning_info interface more const-oriented. Provide constant iterator for elements of Warning-info-area. modified: sql/event_scheduler.cc sql/log_event.cc sql/rpl_slave.cc sql/sp_head.cc sql/sql_admin.cc sql/sql_class.h sql/sql_error.cc sql/sql_error.h sql/sql_list.h sql/sql_prepare.h sql/sql_show.cc sql/sql_table.cc === modified file 'sql/event_scheduler.cc' --- a/sql/event_scheduler.cc 2011-06-10 15:57:57 +0000 +++ b/sql/event_scheduler.cc 2011-06-10 16:51:09 +0000 @@ -75,7 +75,6 @@ struct scheduler_param { void Event_worker_thread::print_warnings(THD *thd, Event_job_data *et) { - MYSQL_ERROR *err; DBUG_ENTER("evex_print_warnings"); if (thd->get_stmt_wi()->is_empty()) DBUG_VOID_RETURN; @@ -93,7 +92,8 @@ Event_worker_thread::print_warnings(THD prefix.append(et->name.str, et->name.length, system_charset_info); prefix.append("] ", 2); - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { String err_msg(msg_buf, sizeof(msg_buf), system_charset_info); === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2011-06-10 15:57:57 +0000 +++ b/sql/log_event.cc 2011-06-10 16:51:09 +0000 @@ -208,8 +208,8 @@ static void inline slave_rows_error_repo char buff[MAX_SLAVE_ERRMSG], *slider; const char *buff_end= buff + sizeof(buff); uint len; - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; buff[0]= 0; for (err= it++, slider= buff; err && slider < buff_end - 1; === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-06-10 15:57:57 +0000 +++ b/sql/rpl_slave.cc 2011-06-10 16:51:09 +0000 @@ -3747,8 +3747,8 @@ log '%s' at position %s, relay log '%s' } /* Print any warnings issued */ - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; /* Added controlled slave thread cancel for replication of user-defined variables. === modified file 'sql/sp_head.cc' --- a/sql/sp_head.cc 2011-06-10 15:57:57 +0000 +++ b/sql/sp_head.cc 2011-06-10 16:51:09 +0000 @@ -1148,8 +1148,8 @@ find_handler_after_execution(THD *thd, s } else if (thd->get_stmt_wi()->statement_warn_count()) { - List_iterator it(thd->get_stmt_wi()->warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { if (err->get_level() != MYSQL_ERROR::WARN_LEVEL_WARN && === modified file 'sql/sql_admin.cc' --- a/sql/sql_admin.cc 2011-06-10 15:57:57 +0000 +++ b/sql/sql_admin.cc 2011-06-10 16:51:09 +0000 @@ -639,8 +639,8 @@ send_result: lex->cleanup_after_one_table_open(); thd->clear_error(); // these errors shouldn't get client { - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { protocol->prepare_for_resend(); === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2011-06-10 15:57:57 +0000 +++ b/sql/sql_class.h 2011-06-10 16:51:09 +0000 @@ -2836,6 +2836,10 @@ public: Warning_info *get_stmt_wi() { return get_stmt_da()->get_warning_info(); } + /// Returns Warning-information-area for the current diagnostics area. + const Warning_info *get_stmt_wi() const + { return get_stmt_da()->get_warning_info(); } + /// Returns Diagnostics-area for the current statement. Diagnostics_area *get_stmt_da() { return m_stmt_da; } === modified file 'sql/sql_error.cc' --- a/sql/sql_error.cc 2011-06-10 15:57:57 +0000 +++ b/sql/sql_error.cc 2011-06-10 16:51:09 +0000 @@ -510,7 +510,7 @@ void Warning_info::clear_warning_info(ul Append warnings only if the original contents of the routine warning info was replaced. */ -void Warning_info::merge_with_routine_info(THD *thd, Warning_info *source) +void Warning_info::merge_with_routine_info(THD *thd, const Warning_info *source) { /* If a routine body is empty or if a routine did not @@ -692,7 +692,6 @@ bool mysqld_show_warnings(THD *thd, ulon Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(TRUE); - MYSQL_ERROR *err; SELECT_LEX *sel= &thd->lex->select_lex; SELECT_LEX_UNIT *unit= &thd->lex->unit; ulonglong idx= 0; @@ -700,7 +699,8 @@ bool mysqld_show_warnings(THD *thd, ulon unit->set_limit(sel); - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { /* Skip levels that the user is not interested in */ === modified file 'sql/sql_error.h' --- a/sql/sql_error.h 2011-06-10 07:49:17 +0000 +++ b/sql/sql_error.h 2011-06-10 16:51:09 +0000 @@ -244,8 +244,8 @@ class Warning_info private: Warning_info(const Warning_info &rhs); /* Not implemented */ Warning_info& operator=(const Warning_info &rhs); /* Not implemented */ -public: +public: Warning_info(ulonglong warn_id_arg, bool allow_unlimited_warnings); ~Warning_info(); @@ -255,6 +255,7 @@ public: to point to the first row. */ void clear_warning_info(ulonglong warn_id_arg); + /** Only clear warning info if haven't yet done that already for the current query. Allows to be issued at any time @@ -271,19 +272,17 @@ public: clear_warning_info(query_id); } - void append_warning_info(THD *thd, Warning_info *source) - { - append_warnings(thd, & source->warn_list()); - } + void append_warning_info(THD *thd, const Warning_info *source) + { append_warnings(thd, & source->warn_list()); } /** Concatenate the list of warnings. It's considered tolerable to lose a warning. */ - void append_warnings(THD *thd, List *src) + void append_warnings(THD *thd, const List *src) { - MYSQL_ERROR *err; - List_iterator_fast it(*src); + const MYSQL_ERROR *err; + List_const_iterator_fast it(*src); /* Don't use ::push_warning() to avoid invocation of condition handlers or escalation of warnings to errors. @@ -295,14 +294,15 @@ public: /** Conditional merge of related warning information areas. */ - void merge_with_routine_info(THD *thd, Warning_info *source); + void merge_with_routine_info(THD *thd, const Warning_info *source); /** Reset between two COM_ commands. Warnings are preserved between commands, but statement_warn_count indicates the number of warnings of this particular statement only. */ - void reset_for_next_command() { m_statement_warn_count= 0; } + void reset_for_next_command() + { m_statement_warn_count= 0; } /** Used for @@warning_count system variable, which prints @@ -320,34 +320,40 @@ public: } /** - This is for iteration purposes. We return a non-constant reference - since List doesn't have constant iterators. + Iterator over warning objects. */ - List &warn_list() { return m_warn_list; } + const List &warn_list() const + { return m_warn_list; } /** The number of errors, or number of rows returned by SHOW ERRORS, also the value of session variable @@error_count. */ ulong error_count() const - { - return m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR]; - } + { return m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR]; } /** Id of the warning information area. */ - ulonglong warn_id() const { return m_warn_id; } + ulonglong warn_id() const + { return m_warn_id; } /** Do we have any errors and warnings that we can *show*? */ - bool is_empty() const { return m_warn_list.elements == 0; } + bool is_empty() const + { return m_warn_list.elements == 0; } /** Increment the current row counter to point at the next row. */ - void inc_current_row_for_warning() { m_current_row_for_warning++; } + void inc_current_row_for_warning() + { m_current_row_for_warning++; } + /** Reset the current row counter. Start counting from the first row. */ - void reset_current_row_for_warning() { m_current_row_for_warning= 1; } + void reset_current_row_for_warning() + { m_current_row_for_warning= 1; } + /** Return the current counter value. */ - ulong current_row_for_warning() const { return m_current_row_for_warning; } + ulong current_row_for_warning() const + { return m_current_row_for_warning; } - ulong statement_warn_count() const { return m_statement_warn_count; } + ulong statement_warn_count() const + { return m_statement_warn_count; } /** Add a new condition to the current list. */ MYSQL_ERROR *push_warning(THD *thd, === modified file 'sql/sql_list.h' --- a/sql/sql_list.h 2011-05-26 15:20:09 +0000 +++ b/sql/sql_list.h 2011-06-10 16:51:09 +0000 @@ -295,7 +295,9 @@ public: inline void **head_ref() { return first != &end_of_list ? &first->info : 0; } inline bool is_empty() { return first == &end_of_list ; } inline list_node *last_ref() { return &end_of_list; } + inline const list_node *last_ref() const { return &end_of_list; } friend class base_list_iterator; + friend class base_list_const_iterator; friend class error_list; friend class error_list_iterator; @@ -448,6 +450,53 @@ public: friend class error_list_iterator; }; +class base_list_const_iterator +{ +protected: + const base_list *list; + list_node * const * el; + const list_node *current; + +public: + base_list_const_iterator() + :list(), el(0), current(0) + { } + + base_list_const_iterator(const base_list &list_par) + { init(list_par); } + + void init(const base_list &list_par) + { + list= &list_par; + el= &list_par.first; + current= 0; + } + + const void *next(void) + { + current= *el; + el= ¤t->next; + return current->info; + } + + const void *next_fast(void) + { + list_node *tmp; + tmp= *el; + el= &tmp->next; + return tmp->info; + } + + void rewind(void) + { el= &list->first; } + + void * const * ref(void) // Get reference pointer + { return ¤t->info; } + + bool is_last(void) const + { return el == &list->last_ref()->next; } +}; + template class List :public base_list { public: @@ -516,6 +565,24 @@ public: }; +template +class List_const_iterator_fast :public base_list_const_iterator +{ +public: + List_const_iterator_fast(const List &a) : base_list_const_iterator(a) {} + List_const_iterator_fast() : base_list_const_iterator() {} + + void init(const List &a) + { base_list_const_iterator::init(a); } + + const T* operator++ (int) + { return (const T*) base_list_const_iterator::next_fast(); } + + void rewind(void) + { base_list_const_iterator::rewind(); } +}; + + /* A simple intrusive list which automaticly removes element from list on delete (for THD element) === modified file 'sql/sql_prepare.h' --- a/sql/sql_prepare.h 2011-06-10 07:49:17 +0000 +++ b/sql/sql_prepare.h 2011-06-10 16:51:09 +0000 @@ -261,7 +261,7 @@ public: The second is a numeric code. The third is warning text. */ - List *get_warn_list() + const List *get_warn_list() const { return &m_diagnostics_area.get_warning_info()->warn_list(); } /** === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2011-06-10 08:33:15 +0000 +++ b/sql/sql_show.cc 2011-06-10 16:51:09 +0000 @@ -6831,8 +6831,8 @@ static bool do_fill_table(THD *thd, // correspond to the errors which were filtered out in fill_table(). - List_iterator_fast it(wi_tmp.warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(wi_tmp.warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2011-06-10 15:57:57 +0000 +++ b/sql/sql_table.cc 2011-06-10 16:51:09 +0000 @@ -2940,10 +2940,11 @@ const CHARSET_INFO* get_sql_field_charse } +// TODO: move this function to the Warning_info class. bool check_duplicate_warning(THD *thd, char *msg, ulong length) { - List_iterator_fast it(thd->get_stmt_wi()->warn_list()); - MYSQL_ERROR *err; + List_const_iterator_fast it(thd->get_stmt_wi()->warn_list()); + const MYSQL_ERROR *err; while ((err= it++)) { if (strncmp(msg, err->get_message_text(), length) == 0) --===============6207667120270682385== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # itpq7qc5npy0qvcl # target_branch: file:///home/alik/MySQL/bzr/00/bug55843/mysql-trunk-\ # bug55843-02/ # testament_sha1: 06880185fc2337a0bbf2c0631577cfcd75f7e4c5 # timestamp: 2011-06-10 20:51:15 +0400 # base_revision_id: alexander.nozdrin@stripped\ # zr9khzipkbz023pj # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWYz+nYAACkbfgFQwUX///3bn /aq////6YBD8PoF1u2qvrzhVABpWg2snOhdkHLkNADoAVREYJoIgoyjQxAaDRtIADIAAAAyAAlJP IE0yQaU2ppkNNDRoaPUaAyANPUBoDjJk0YhpoYCaGJo0yYgZGE0aaYQZMJEJAhNGJpkKeTQjPUam mmgB6QNMmjI00ESUU8RMim9NU9pij2lTT9RPUD0j0aR6RoPUA0PTUCSIJoEwgCaME0TTI0goGjIN qAA9SwWYBjcSujUfFQxG3nra9++S3PXXiZH95tE1vdMcMJGTFQrkh+z2cXp9Xr4593717vX6jbt4 uPRGdv4wDGobdtfCkPZDd9yJ5bTJRFlLnxyREyZJHve4LmovUiu3QLf0ZeTTFuSZibZaTiAKYhNn S0i13SU0q2C22VtHteV0icIqZCudPrMk8ZlHkmoVE3xUYax2l8hrOsElZJCPHxnV2tm0ameGXs71 5F53IPBjVrilXoC2jgC6wW4E22202mxsbQmxsbbTaFxZ17UI3cu7fg993JWvpv6cixJMZR02nNk7 Z5QE2eWcxycstUYuXmcO9qrQr3DJtBgTlN2EF9RZ4ssyzplO95ssqq90y+bTTueLiIjGputF+MyX tssOzwdOHDhzRHUaOLV27fMkPrSdBVylAk/d4BQ8F0jFNus8xpWtKBV4yA5BjgciORxRw1yLm+1b ljTNEEdt+/9wxvxCbY5HCgYRYlUzMwVX59QWd2WREFZVF6FiRJCc/KuAC0445zQGQxF9oBSxGw8i zskabSPB2fIobSENnQi5LNNMnJpuunAFBISKuACq2ADBnEuuqoaMBFYEQoySFrEt/ApwNEHh0e6b iO0KkvGNTFuyKpFWtEEU0v5xgwGPj1fVOLnRBNK7Z0TdXfm9gU0FzEV18wISseDaF+zMwkOyPtLW 9qKjnuPUvOIMLaMIGMZ7khG4FsySyj3tOANfUdmbrNHOWJV5kASxGNx8fYoRWmnOIZAmBZzCh3Qu Z42YZ79M6+dv4aZGMgkoZIJDxtGVRKkgkaQmrqfVOvFHNpwB5gebXcA1HRBWoyKks3nArvcwKQ3D C5DUm+JfOMyBSChIRQ4AQ7ZAkQGHD/8iGti89chQSBM41xKlCBOJgMPCJEodI8YQQmKSKWHkC9aE CIzyQ0SshnWCUk85sCoVoLkkyKlimOJ5Ei4rIjDhEtJDTlImTLD42AlpLTC2EEghk9rXRYfQwVMn zZnpjonYxX85EBv5OC/OCSDMuIgrtDMIRWRBLeXbD71KiEjRJ8NZKwxca+BVbdAvHFjcz1WcHrx2 o8bVdBihpxgYRFxoNImW1iIyaXHEueem4I3OY6UjMvLp5yBKraRCOogZx1jVQdH1NM1Gg7TXxOqC RMCsihAkoJLXaYWJjjUCtNRPZEEVKw35VmOhAW4OEZQeLs9Hed4wDsbMnQkNOhQgMV4YOTJEyA5l XImaio3XFKWkDew9C6y76b7EiSs2TVGUMKqyJUTLaoqBeXQLZOlvGSN1k0lM1lxYMSLjxGMyoeg+ 0oYHqUP3IGw8jTUCzzMd+DvKGVmGPCWbwaMHs3jEhpAupAqoPIgMXF5bO2bVFWsd1UWlpBVDKI9T NAyG20e2RAkXFdGyomJE6iduRbA3Wl5e5mNiMOOCxI5n0N1gYDm49S4F7HY5AmLUjdzMDQt+coOT fW48TBASxIBM3DbmsaZCsoSajUINWWWGgqKyirnF7XkRtJO0B3lPdkOCjRrfLboGI4FtDghVlpsI HQ3kDKWkwgf/At5kGOF+nHVDTDgpas45ImijAozglgrrRY4ydbTeAYjsVkJEcTmC2GjjVQvehakV QqNB53XpGokkOeXW4tLKVRM95ZAFqLLInvrJEzMYwMyBvMTZE1DglzFjvhJdftepzEzrzxoex7Yq m3hj3ubEvMTmMjIzEtcQgCRXXZXsaBWWQ1mkyIj4kJGavNWk0giSJ685c19ylipkYQfoFR46g+wp eWMshEpkWF5mFh4jlZ1KyoyMjZlvJAtJdtpnfpdmIY6pvbphSbSnOpVJEgTmwrHImopVK84Y35Fw 5qMwVLTAuoYuVmZgkYmd5MtIVzLyKs0jHuQnaOOFjlg5eWEQkbbBKcjUMX2QImsxLRjiczyJncyT nQ6AlI3GrHTrSNEX24TeEYjPC1necGbaC2XhrrlzB1XYFG8ZOarmZiloWJvJmRkZyR5aRXcDuzwr PdkVKG7eZje3tBvk9SusaNLYOVlaGcGCTGxXYGwgoweCguOTFXMvRfMkVdRREFmQLLWZjAoWlicF aWjlxFOXBN3LjMvzMi0uoFCdxzSOVVCWJ/thhgB/CzgxvnsmIMdbrbc7Zd0a6Qtc30JPTlU4IWZJ ZZnl3Gg87bF2OI3y4PBSUzm1FejTM2adn8OaeFWaS1nnQsx9zpvQyy+sUzwkSJuBzUljQpFkJlPi 6wex3A9n1AOUFO/dozJIQZEgyfr+4cOK3v8FT3eLEOJukRCjwGOj6qiJtBMcl20VEQb+CIZxEPwy pmVLMPAUjlO4K4tNId4pjk0qnv4BaqbQ9NbmfjxDwfoLZIhO4elyNgO8G5ZJKFKVwjaDg9tWA5Lg +SJcwv+9pEsYDMxSFJ+FNhIXjV7AMGvcaiw+3tKDsO09hyC8xynMKCRGHPHHOPNw2DebgqbwcpYo c8ipiS6JkzYiJsMjUeMzPcCRC9RH2F5HRi/53lpmYmF/kivj3HkOU4dAvrNiMBrp8pkwMgOyHHZ+ wKW9Lq2gY2SlHzAP2EIMJC8xR84GKSIMWlT2qBcgW4iqjofzP8dJ4HM7nUdOdzj4eRzNQ5M6HUSs PQiZFllxxQvIrKjuFha4YGw5DjF5rP46yKPIirzocjEzidFkfzSP38P1QI/sZAWwj4gceg4laQkc NZsPfhQ48l+wJcDgRJnkULTyMzGRgVh+wkMaRpaQ44xI+lnkfC2k4/6FqQt/u3M8yvBItxgkT2WQ voOuD8u6FLpgxpXCQ2G03mnYdLdy9B7cjEprrPN48hZZQBNa7U0xdoLkCqkvjV6nUjvbxb4KEzyL joeZ3Jn0HKyXgVZiWckWETCRMgoo+IgjB1Jj7FxAiYlwKcRtPEFNJgCIU8Jkdbh2IJ5CGypM3zEr EEQoXWzJyH1Kg+Ofzd8yjeCofGThCCYSRNMC/1PSd2J9eJ2OBIWkYu1v5lDidjzLzA6EByQXFgLi CklwZHBn1At5rSXRCgObVrOBUXbTPScFraZT09IGuwz3cX1HE7kHIGgvWHWJo0TOFzX6kMcgT/g4 eZw10ez3weUu8rZqjasR8OuDi+bt4KReJNCGvCrQoJQE+0bE4JHeKCjAHFqFuKC8U7riZ/7UeiRF C/hRcv1IiDEEjgloQLaXWGXu3pJdgR9D2H5B9CfuFrlBiQ4L2PArKzucffDVA2iXmXkChbQ9yKFc XBfO8pj4oXkCwP0BfILzBd/XucjMFyPqcRwChvSY+IUPmNZlOH2PEoI5FRuPjUSJpkiogeZUWgEC z66UmbccDItrHK/IFE7mB+DAFWSMTYfJwBeZA/BeUCOs+BCccS8FwgsyN5NVGk4Go+p4n4SOYJFg L9QG5N0OhH164GhPjTgJa2FQwgIWmyFCqCF5EMwQRNB1jqZIQ9q0pLCo06BF7dE+QI3WB+fTwNcY +c7eJebkl9knymo8vGbVdID7EikBiFmgIB8JICajWCW+8FVabNhvHIn0EYs4Vh2GLCo1TMHoQSLJ gvukYJLqfcoW+32MDsSO/MdCf1QnBOGz1GEqoJEkgyZEwNHv5yotxsMAWxVgkOAnHtJL+W1IReTL DcYEiKtwEu36Dhkx+rCOSeJ6sVqw3nienIc0/nIc926lOB8nycgSMkGZ9y/cF+QLijbRvI7aBzrZ oMgXE0mRA9iQK491gxoQsMgTYFpkfYqQVc6LMYRhBiDSMjOAK6SQioUGQtxgCkXm06GRXJ6icIRE Dg4JEyCr5+a4ZQ4E0BNmGQH5DubDsbcwREMLx5G4vDL8JCPA+gJQBex9y5C4GIklt24vgQCoQiDQ dZTUANpvLHOchiRd0DOTh5GAKwiHLaFVZDZedloPkEddZ7iSIoDbMICreceWaDkhIlMjACl94KUr 4t1oZ7XocjTXjeHMIFt790wtx/dWkImFQARGHGTlWxHgu8ATCTTQsVeeALskbjekYVVF5W/NYHPY CVQLFYe2iOgjEoCWoYFaCWkEtxuORkiHGXnQYA3B0gvVzmvWSPPKgUyowlRoVMDWZzk5lLnWyDhS q90VxyoOg2BbcOk1m0vypxRgMGC6W1OqATZssRqF/KdBxIK3PRpQkSMxyAVAskLBJBtBP6FLMsxM 5+7C+2CCgkwuB6PopeWwXq+8x4uWRl7EYMrjWUKiUsFfaXIWjdEYO7IJpLAsSTgrBLY8zSdgeI7V 07QXpbbbbbbbbbfkHgYDBfLJA2NjY7MgbIi81Acms5QOQY6gEnAJgyGHQ20SgaBSJDQQWnRxl7Qb ADwnMksGArxm7GESwWUMhoOEESQxsbTDeaNpVXDCIhJQsXMiRhaSKBUgBoJAUEDpiIFyJImTvq3x XWC4Xr92BEMwFw5kT8tgMlJfIK2/DTtORlOn5arvWxBkTqQWMARS2vKC7zzlmMM/LQt2wXhcc56f pLzSDwLz5iPpkYbzhj+oxNdtqyNAxCXENrByEtolWQMgX3GO4JQyT7hXqPc9hi41EZpLJebCNQrT xLTWcCtXjC6BWx1/RH6MoEWEWn4HAvyMVA1lx8HgSBIciQPU+T+o9y88CsAOJy5MdQSkeh1NB6QI nA7HIuMj4geZ2SMrjEsBI/HshdiSR5l8IaFMhzG98xFXwgMhR/4u5IpwoSEZ/TsA --===============6207667120270682385==--