From: Martin Zaun
Date: October 1 2010 9:03am
Subject: bzr push into mysql-5.1-telco-7.1 branch (martin.zaun:3855 to 3856)
List-Archive: http://lists.mysql.com/commits/119655
Message-Id: <201010010904.o918J0jM011925@acsinet15.oracle.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="===============2083098538=="
--===============2083098538==
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
3856 Martin Zaun 2010-10-01 [merge]
crund - minor cleanups
modified:
storage/ndb/test/crund/build.xml
storage/ndb/test/crund/src/crundndb/Driver.cpp
storage/ndb/test/crund/src/crundndb/Makefile
storage/ndb/test/crund/src/crundndb/Operations.cpp
storage/ndb/test/crund/src/crundndb/Operations.hpp
storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp
3855 Jonas Oreland 2010-10-01 [merge]
ndb - merge 70 to 71
added:
storage/ndb/src/ndbapi/trp_client.hpp
modified:
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
storage/ndb/src/mgmsrv/MgmtSrvr.hpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
storage/ndb/src/ndbapi/NdbImpl.hpp
storage/ndb/src/ndbapi/Ndbif.cpp
storage/ndb/src/ndbapi/SignalSender.cpp
storage/ndb/src/ndbapi/SignalSender.hpp
storage/ndb/src/ndbapi/TransporterFacade.cpp
storage/ndb/src/ndbapi/TransporterFacade.hpp
=== modified file 'storage/ndb/test/crund/build.xml'
--- a/storage/ndb/test/crund/build.xml 2010-03-01 19:10:54 +0000
+++ b/storage/ndb/test/crund/build.xml 2010-10-01 08:58:08 +0000
@@ -277,10 +277,6 @@
-
-
-
-
@@ -353,7 +349,7 @@
-
+
@@ -361,7 +357,6 @@
fork="true" failonerror="true" classpathref="classpath.ndbapi.run">
-
=== modified file 'storage/ndb/test/crund/src/crundndb/Driver.cpp'
--- a/storage/ndb/test/crund/src/crundndb/Driver.cpp 2010-10-01 04:10:21 +0000
+++ b/storage/ndb/test/crund/src/crundndb/Driver.cpp 2010-10-01 08:58:08 +0000
@@ -18,6 +18,9 @@
#include "hrt_utils.h"
#include "Operations.hpp"
+// global type aliases
+typedef const NdbDictionary::Table* NdbTable;
+
namespace crund_ndb {
//using namespace std;
@@ -31,18 +34,18 @@ using std::set;
using utils::Properties;
class Driver {
-
+
public:
/**
* Creates a Driver instance.
*/
Driver();
-
+
/**
* Parses the benchmark's command-line arguments.
*/
void parseArguments(int argc, const char* argv[]);
-
+
/**
* Runs the entire benchmark.
*/
@@ -87,7 +90,7 @@ protected:
*/
struct Op {
const string name;
-
+
virtual void run(int countA, int countB) const = 0;
//void (*run)(int countA, int countB);
@@ -129,7 +132,7 @@ protected:
* Reads and initializes the benchmark's properties from a file.
*/
void initProperties();
-
+
/**
* Prints the benchmark's properties.
*/
@@ -139,12 +142,12 @@ protected:
* Opens the benchmark's data log file.
*/
void openLogFile();
-
+
/**
* Closes the benchmark's data log file.
*/
void closeLogFile();
-
+
/**
* Initializes the benchmark's resources.
*/
@@ -169,7 +172,7 @@ protected:
* Runs a series of benchmark operations.
*/
void runOperations(int countA, int countB);
-
+
/**
* Runs a benchmark operation.
*/
@@ -179,7 +182,7 @@ protected:
* Begins a benchmarked transaction.
*/
void begin(const string& name);
-
+
/**
* Closes a benchmarked transaction.
*/
@@ -192,7 +195,7 @@ protected:
void closeConnection();
void initOperations();
-
+
template< bool feat > void initOperationsFeat();
void closeOperations();
@@ -208,27 +211,29 @@ protected:
template< bool, bool > struct B0InsOp;
- template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool),
- bool batch >
+ template< const char**,
+ void (crund_ndb::Operations::*)(NdbTable,int,int,bool),
+ bool >
struct AByPKOp;
- template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool),
- bool batch >
+ template< const char**,
+ void (crund_ndb::Operations::*)(NdbTable,int,int,bool),
+ bool >
struct B0ByPKOp;
- template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool,int),
- bool batch >
+ template< const char**,
+ void (crund_ndb::Operations::*)(NdbTable,int,int,bool,int),
+ bool >
struct LengthOp;
- template< const char** opName,
- void (crund_ndb::Operations::*OP)(int,int,bool),
- bool forceSend >
+ template< const char**,
+ void (crund_ndb::Operations::*)(NdbTable,int,int,bool,int),
+ bool >
+ struct ZeroLengthOp;
+
+ template< const char**,
+ void (crund_ndb::Operations::*)(int,int,bool),
+ bool >
struct RelOp;
};
@@ -268,7 +273,7 @@ Driver::run() {
for (int i = 0; i < warmupRuns; i++) {
runTests();
}
-
+
// truncate log file, reset log buffers
cout << endl
<< "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl
@@ -283,7 +288,7 @@ Driver::run() {
// hot runs
for (int i = 0; i < hotRuns; i++) {
runTests();
- }
+ }
// write log buffers
if (logRealTime) {
@@ -462,7 +467,7 @@ Driver::initProperties() {
const wstring& s = estr.substr(beg, len - beg);
exclude.insert(toString(s));
}
-
+
// string properties
mgmdConnect = toString(props[L"ndb.mgmdConnect"]);
catalog = toString(props[L"ndb.catalog"]);
@@ -483,11 +488,11 @@ Driver::initProperties() {
void
Driver::printProperties() {
- const ios_base::fmtflags f = cout.flags();
+ const ios_base::fmtflags f = cout.flags();
// no effect calling manipulator function, not sure why
//cout << ios_base::boolalpha;
cout.flags(ios_base::boolalpha);
-
+
cout << endl << "main settings:" << endl;
cout << "logRealTime: " << logRealTime << endl;
cout << "logCpuTime: " << logCpuTime << endl;
@@ -558,14 +563,14 @@ void
Driver::runOperations(int countA, int countB) {
cout << endl
<< "------------------------------------------------------------" << endl;
-
+
if (countA > countB) {
cout << "skipping operations ... "
<< "[A=" << countA << ", B=" << countB << "]" << endl;
return;
}
cout << "running operations ... "
- << "[A=" << countA << ", B=" << countB << "]" << endl;
+ << "[A=" << countA << ", B=" << countB << "]" << endl;
// log buffers
if (logRealTime) {
@@ -576,7 +581,7 @@ Driver::runOperations(int countA, int co
ctimes << "A=" << countA << ", B=" << countB;
cta = 0L;
}
-
+
// pre-run cleanup
if (renewConnection) {
closeOperations();
@@ -638,7 +643,7 @@ Driver::runOp(const Op& op, int countA,
commit(name);
}
}
-
+
void
Driver::begin(const string& name) {
cout << endl;
@@ -717,7 +722,7 @@ Driver::initOperations() {
const bool feat = true;
initOperationsFeat< !feat >();
- initOperationsFeat< feat >();
+ initOperationsFeat< feat >();
cout << " [Op: " << operations.size() << "]" << endl;
}
@@ -725,111 +730,121 @@ Driver::initOperations() {
// the operation invocation templates look a bit complex, but they help
// a lot to factorize code over the operations' parameter signatures
-template< bool batch >
+template< bool OB >
struct Driver::ADelAllOp : Op {
ADelAllOp() : Op(string("delAllA")
- + (batch ? "_batch" : "")) {
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
int count;
- ops->delByScan(ops->meta->table_A, count, batch);
+ ops->delByScan(ops->meta->table_A, count, OB);
assert (count == countA);
}
};
-template< bool batch >
+template< bool OB >
struct Driver::B0DelAllOp : Op {
B0DelAllOp() : Op(string("delAllB0")
- + (batch ? "_batch" : "")) {
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
int count;
- ops->delByScan(ops->meta->table_B0, count, batch);
+ ops->delByScan(ops->meta->table_B0, count, OB);
assert (count == countB);
}
};
-template< bool setAttrs, bool batch >
+template< bool OSA, bool OB >
struct Driver::AInsOp : Op {
AInsOp() : Op(string("insA")
- + (setAttrs ? "_attr" : "")
- + (batch ? "_batch" : "")) {
+ + (OSA ? "_attr" : "")
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
- ops->ins(ops->meta->table_A, 1, countA, setAttrs, batch);
+ ops->ins(ops->meta->table_A, 1, countA, OSA, OB);
}
};
-template< bool setAttrs, bool batch >
+template< bool OSA, bool OB >
struct Driver::B0InsOp : Op {
B0InsOp() : Op(string("insB0")
- + (setAttrs ? "_attr" : "")
- + (batch ? "_batch" : "")) {
+ + (OSA ? "_attr" : "")
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
- ops->ins(ops->meta->table_B0, 1, countB, setAttrs, batch);
+ ops->ins(ops->meta->table_B0, 1, countB, OSA, OB);
}
};
-template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool),
- bool batch >
+template< const char** ON,
+ void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool),
+ bool OB >
struct Driver::AByPKOp : Op {
- AByPKOp() : Op(string(*opName)
- + (batch ? "_batch" : "")) {
+ AByPKOp() : Op(string(*ON)
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
- (ops->*OP)(ops->meta->table_A, 1, countA, batch);
+ (ops->*OF)(ops->meta->table_A, 1, countA, OB);
}
};
-template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool),
- bool batch >
+template< const char** ON,
+ void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool),
+ bool OB >
struct Driver::B0ByPKOp : Op {
- B0ByPKOp() : Op(string(*opName)
- + (batch ? "_batch" : "")) {
+ B0ByPKOp() : Op(string(*ON)
+ + (OB ? "_batch" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
- (ops->*OP)(ops->meta->table_B0, 1, countB, batch);
+ (ops->*OF)(ops->meta->table_B0, 1, countB, OB);
}
};
-template< const char** opName,
- void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*,
- int,int,bool,int),
- bool batch >
+template< const char** ON,
+ void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool,int),
+ bool OB >
struct Driver::LengthOp : Op {
const int length;
- LengthOp(int length) : Op(string(*opName)
+ LengthOp(int length) : Op(string(*ON)
+ toString(length)
- + (batch ? "_batch" : "")),
+ + (OB ? "_batch" : "")),
length(length) {
}
-
+
+ virtual void run(int countA, int countB) const {
+ (ops->*OF)(ops->meta->table_B0, 1, countB, OB, length);
+ }
+};
+
+template< const char** ON,
+ void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool,int),
+ bool OB >
+struct Driver::ZeroLengthOp : LengthOp< ON, OF, OB > {
+ ZeroLengthOp(int length) : LengthOp< ON, OF, OB >(length) {
+ }
+
virtual void run(int countA, int countB) const {
- (ops->*OP)(ops->meta->table_B0, 1, countB, batch, length);
+ (ops->*OF)(ops->meta->table_B0, 1, countB, OB, 0);
}
};
-template< const char** opName,
- void (crund_ndb::Operations::*OP)(int x,int y,bool z),
- bool forceSend >
+template< const char** ON,
+ void (crund_ndb::Operations::*OF)(int,int,bool),
+ bool OFS >
struct Driver::RelOp : Op {
- RelOp() : Op(string(*opName) + (forceSend ? "_forceSend" : "")) {
+ RelOp() : Op(string(*ON)
+ + (OFS ? "_forceSend" : "")) {
}
-
+
virtual void run(int countA, int countB) const {
- (ops->*OP)(countA, countB, forceSend);
+ (ops->*OF)(countA, countB, OFS);
}
};
@@ -900,9 +915,9 @@ Driver::initOperationsFeat() {
new LengthOp< &getVarbinary_s, &crund_ndb::Operations::getVarbinary, feat >(length));
operations.push_back(
- new LengthOp< &clearVarbinary_s, &crund_ndb::Operations::setVarbinary, feat >(0));
+ new ZeroLengthOp< &clearVarbinary_s, &crund_ndb::Operations::setVarbinary, feat >(length));
}
-
+
for (int i = 1; i <= maxVarcharChars; i *= 10) {
const int length = i;
@@ -913,7 +928,7 @@ Driver::initOperationsFeat() {
new LengthOp< &getVarchar_s, &crund_ndb::Operations::getVarchar, feat >(length));
operations.push_back(
- new LengthOp< &clearVarchar_s, &crund_ndb::Operations::setVarchar, feat >(0));
+ new ZeroLengthOp< &clearVarchar_s, &crund_ndb::Operations::setVarchar, feat >(length));
}
operations.push_back(
@@ -1005,17 +1020,17 @@ Driver::parseArguments(int argc, const c
exitUsage();
}
}
-
+
if (logFileName.empty()) {
logFileName = "log_";
// format, destination strings (static size)
- const char format[] = "%Y%m%d_%H%M%S";
+ const char format[] = "%Y%m%d_%H%M%S";
const int size = sizeof("yyyymmdd_HHMMSS");
char dest[size];
-
+
// get time, convert to timeinfo (statically allocated) then to string
- const time_t now = time(0);
+ const time_t now = time(0);
const int nchars = strftime(dest, size, format, localtime(&now));
assert (nchars == size-1);
(void)nchars;
@@ -1030,7 +1045,7 @@ int
main(int argc, const char* argv[])
{
TRACE("main()");
-
+
Driver d;
d.parseArguments(argc, argv);
d.run();
=== modified file 'storage/ndb/test/crund/src/crundndb/Makefile'
--- a/storage/ndb/test/crund/src/crundndb/Makefile 2010-02-14 05:05:31 +0000
+++ b/storage/ndb/test/crund/src/crundndb/Makefile 2010-10-01 08:58:08 +0000
@@ -58,8 +58,13 @@ run.driver: Driver
LD_LIBRARY_PATH=${NDB_LIBDIR} ./Driver \
-p ../../crundRun.properties -p ../../crundNdbapi.properties
+# for JVM processes, try running valgrind with
+# --smc-check=all --trace-children=yes --leak-check=full --show-reachable=yes
valgrind.driver: Driver
- LD_LIBRARY_PATH=${NDB_LIBDIR} valgrind --leak-check=full --show-reachable=yes ./Driver -p ../../crund.properties
+ LD_LIBRARY_PATH=${NDB_LIBDIR} valgrind \
+ --leak-check=full --show-reachable=yes --trace-children=yes \
+ ./Driver \
+ -p ../../crundRun.properties -p ../../crundNdbapi.properties
Driver: libcrundndb.a
=== modified file 'storage/ndb/test/crund/src/crundndb/Operations.cpp'
--- a/storage/ndb/test/crund/src/crundndb/Operations.cpp 2010-10-01 04:10:21 +0000
+++ b/storage/ndb/test/crund/src/crundndb/Operations.cpp 2010-10-01 08:58:08 +0000
@@ -708,7 +708,7 @@ Operations::setVar(const NdbDictionary::
//CDBG << "!!! buf[1]=" << toString(buf[1]) << endl;
//CDBG << "!!! buf[" << toString(slen) << "]=" << toString(buf[slen]) << endl;
}
-
+
beginTransaction();
for (int i = from; i <= to; i++) {
// get an insert operation for the table
@@ -797,7 +797,7 @@ Operations::getVar(const NdbDictionary::
// move and 0-terminated string
memmove(s, s + 1, n);
s[n] = 0;
-
+
// check fetched values
VERIFY(strcmp(s, str) == 0);
}
=== modified file 'storage/ndb/test/crund/src/crundndb/Operations.hpp'
--- a/storage/ndb/test/crund/src/crundndb/Operations.hpp 2010-10-01 04:10:21 +0000
+++ b/storage/ndb/test/crund/src/crundndb/Operations.hpp 2010-10-01 08:58:08 +0000
@@ -110,34 +110,34 @@ public:
void setVarbinary(const NdbDictionary::Table* table,
int from, int to, bool batch, int length);
-
+
void getVarbinary(const NdbDictionary::Table* table,
int from, int to, bool batch, int length);
void setVarchar(const NdbDictionary::Table* table,
int from, int to, bool batch, int length);
-
+
void getVarchar(const NdbDictionary::Table* table,
int from, int to, bool batch, int length);
void setB0ToA(int count_A, int count_B,
bool batch);
-
+
void navB0ToA(int count_A, int count_B,
bool batch);
-
+
void navB0ToAalt(int count_A, int count_B,
bool batch);
-
+
void navAToB0(int count_A, int count_B,
bool forceSend);
-
+
void navAToB0alt(int count_A, int count_B,
bool forceSend);
-
+
void nullB0ToA(int count_A, int count_B,
bool batch);
-
+
protected:
// executes the operations in the current transaction
void executeOperations();
@@ -147,7 +147,7 @@ protected:
void setVar(const NdbDictionary::Table* table, int attr_cvar,
int from, int to, bool batch, const char* str);
-
+
void getVar(const NdbDictionary::Table* table, int attr_cvar,
int from, int to, bool batch, const char* str);
};
=== modified file 'storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp'
--- a/storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp 2010-10-01 04:10:21 +0000
+++ b/storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp 2010-10-01 08:58:08 +0000
@@ -34,7 +34,7 @@ Java_com_mysql_cluster_crund_NdbApiLoad_
// location of cluster management server (ndb_mgmd)
// get a native string from the Java string
const char* mgmd_cstr = env->GetStringUTFChars(mgmd_jstr, NULL);
-
+
// initialize the benchmark's resources
ops = new Operations();
ops->init(mgmd_cstr);
--===============2083098538==
MIME-Version: 1.0
Content-Type: text/bzr-bundle; charset="us-ascii";
name="bzr/martin.zaun@stripped"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: martin.zaun@stripped
# target_branch: file:///home/md/mysql/ndb-7.1/
# testament_sha1: 6c7c5b3f48220213e6bff74272dbd5c63d78976f
# timestamp: 2010-10-01 02:04:03 -0700
# source_branch: file:///home/md/mysql/ndb-7.1-opt32/
# base_revision_id: jonas@stripped
#
# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWZaI//gACmB/gEdz8BBff///
93/dPr////pgDl97kzYNbudB22FBooBQDHVtQqi2NACgO2qgMlJPTyjyp6nqbSaH6jU09QekeoGg
aGgNAAADINAJIgJkJkyCBNTTFDanlNBkNDaj1AANNDQaD1BwNGjEGjTJhBiAxGJo0aNAGmmgAAAC
U01NBEVPKbUNA2k9Q0AZAMgAGQaAABoHA0aMQaNMmEGIDEYmjRo0AaaaAAAAFSSIAmTQaBo0mCaB
qT9KYyanlT08qeptqnlPUBpoP1Rp+qaCRiPlPJtQ76iK+turyrdfb6ZlrHaqgsVjqUDQl+4iX/zb
bbbbbbbbbG+jy5qqSS/t6THLJvr+r+ZprP13MIjNk5nJXzUpUGTjJcBDDCNDBhmgvnhhbFiTMcG0
nPTe0+aOAIJMsGECsogeRIawtxDUWskpWtr1y278ylA0WWaqqqEqEYoY50bXM1Fy60ibRYeUZLnG
gvL3BuRwqRCXAdn2I8fGetF1mt9iP8UblM/83pqz/hnk/zTWlQqpJVJVFUiqlUkC39/oEkuvfz69
+kHhaEYd7Epd2AfTAoZZCtGKZqOZUK3BtyJcN5StacI6mZ41pxZYVIeJlZ4kXlVrDetbOnK1GllD
UWQlhDoLF8bbVGKxOkNS7Vo1V2jZFCMLFbaLaWVacM0oraVsZZbGWEprWpGtJ3kaLo0qUTZsumnU
6WyjFpJSzOldBi83vq9kolYc45CDl54Pd960cx9/6f5xmGT9rWcdUyLSX8V/02rfDGMBKq0dKy5g
NwvudXXP+2xsIxEFHIyDpFEoolEweU8BmbD2GY8v+fcY/mzqYpvh/KWF6ZVgL+DAVLOC0nbn6vpc
rTJ00UFzZXznWBn0hZBalAZsYDFrmRsNg5CKIU+NcF5/Hp87mkciK0k8uTz3F5KJPFVv+v8OnJ9P
+cJvzX0bTf2jCiqR6GJcuwz3Rdjw2lrYT/ZnU2dD9J4moh/cesIQhIMgMt0HmChJdGjRHUuYrm3g
9cdyLRY4Koyn8vz/u/k/P5/O+/SnFFRnjlb/ubxxcbiXzBMirVUw+iLV69dzBlxo5SkcY2z51HhP
xnj646k3GVkeWQf2McjEo1TRB9Bd7mN/Fh8TzN9cfg71uDhx/i5GKfeFPTIYnvfsyU9WzbWrHqb0
nLKhOfj2SmupyubHhlIN3S+/ekt7FNjk+mYneBL7+3czHY7vya4L5O9yDIB2VGVGCLJNEHh1IXUG
EUoughoMIjChKI+PMhnV6eN/ZFc0vkSY1Zl0tAtETKiypIvtPi2w5OSiDCQxcg0GDOKj1JmcQ6Ei
Agg9INBUZiwR8IVsTVSjwbGKQOkDc3Bta2ERRpQkRWRxLFCVyx3JB4r0LdJBjOMEkY2lxhjJINGR
Oroo9G0yjB452szye0IStc2xFVTuHOF+es3mZYF0qQqVVQKcNTCVFxVTPQl7wb+QwsUzY4pitCpr
Fac3MyldW6V4dJMcMKzIQLMLi559YmDDJBj6BE0RZjBdTUhcZZmVneMVBQ5wNj37K6qSKxMhjIXY
cCRQ2H5zNe6raHXWED/iw7NBadoPqyG1cRCePKsZ8ZzwaNLtWcagGE2jN5VO5CFbUlUowTpGCQMy
YJdpxALxpbrE5GjqhbNcg+I+BxvpGJjeTdavbxr0Lvha4nVySRYqV72aOJoYGWZx6GhkAYkwrwCN
3Qbz4UlZqOYTheUmpPUcVTseRWNcdJGHhUocZHAs94ZjKcmfY1OwKkVamY1ZKWr6yL1NRy48Du1k
WFhzGieaeHSvPFsc3wtIiI3N9VrZBy0GBQAJX1kf9MZclEekTDMkIKxLM1J8zXAylqZneYWZS2qp
gHgo55xMSPG1SBJsQuGgLgBnuacSPnxMLjapBUAtDEMeVM2yjYpNuM5tCJPStG1hFSlsM83U3hmY
1wJ1NAvZiw9DBL2rQ5WMyeSkRO5ELau46QO88nImZvE2ONzQgPyJm22F1MPcZ5tyfjOr4GmU3o83
aEp4ZhGxbIe+ZWBIxcrC+1Ya9y2hV6FWHo25puoE8TmbpG8U5Y1JjZDG+RNiQVDNUhVuMnTQd5og
sVQekHkbx4TBC0yUeRJbzg24FiLo2iAUckIeqaRx4SeEOYXiKRV1gdHDzq7sNVlRitYvA8WUMlue
bgI4Z8hy6ub64x3ZtOdh6wY14YNOOlaQjO+EEgndE2MPDjDIxSBx8ndgyMjG0TqO5WjlztHTkKac
EgqpSOtHIeYqbjczPzFjsOaivfSDoPfHkZpoY7SdiGsaPGNOnR5A1Gzna0+hOgz9RpF6ymR2UDmT
ieRqQrwvl4KVGxNR98+YTqYhbDgI3YWwj2ypQcXlEd4Lz4eETYsJUyNy5AjI2GxNkwKo5ADq9BhD
ERqEwKpFcBi/d2/ZOTCNhj8pgMKS069f60fr6BaMP7tuJc4FFKKrnVUlq9KUXHx8stfVbzwZiqhR
Sd0nipCyNswoM/wfJSylrT+u/9Pp5cH0gpUlRWKMO64oiFAiEoMG8Lt50sg3Y/qHHc2DDJONd+6A
hVUG/UFsYqF97//c2nwaZH88uP8RXdSLSUPkiparFSWUXHXw8JwCEMDADJR2xWr04JOQRJECsRrb
XIF+C2iUZdinB1xo6+rDXIDj4w+aR5mS7FwT1LiY9IyF6lgEx8uvJjJioXhhLvY978OP8Snutp4s
f1+56UaDQMBU/F8up7Cx+GAAeu5T2k9bH49y7dVdI7ip8/cZf7X5uv1/6+ROJqbjOy8f5VIuV9py
IbrdQWDMmPcvxlS6TUkszSH7n/zoQd/ajncjlzLm1uYHauuWdimOSK6VvJWgZnazs7fZF/I0N5YT
4R0H0in9EZ3ld/vrgOrISR5W0OfRod9b+wzNzb0HbE6nQ1qYdpgULxLn5DwHoVMqBwx+Dh4tcnY6
MbnkZHxjTfgWlgYH9Xkm//fP0iHT0vIr9DCPjd0vYyRRKxMpUhMRchFHI56aAwjZWstNXolNbt8X
U7MGxjDIzLnHhMEOpyr+lpbiMLq8zLnSXvbUTQ1LJH5SOyvM73dWj/dkxZHnHEzcgUlNmzdd+LBJ
i5bSN9SQ4Wpg8P2/o034SZufMUb5G42ksTxscup5dPWJa2FxFEVztGCbMzzcAEqJE+dk6QtTwVm4
lWaEdyjZAYwVkpBwic8JX5Hn6zmdGLjY/NZk1di4zP47EnK/f47E/QXj4JSMIWMfBcqQutNchr90
WO7zX2WqLWdU5qXKGYnI0mVJ6p55hX8HXxOVv9/K55tYHOwbzzvMuLWL4kbkAMlP0X5gegWC+wKg
tVy+LDpL4mCB3pHwWYI0JMHrjrXL0nhPrn5JKSlCukKkmWks0TdkI1NOKZy3TaVnfHpJut9JTGcw
+6eDmiL010Q6Gd6pGrRcfh2PU9rKp/AKpVFdLmZXKTQRi+6Q3/Sqiabtxpi84JkTk8ZJwyjtkMGm
cZ0vJPJ1KipzyN31zdNE2hhm9ZFMs6hvTzyFQxLhrqYJwOtJ5Z6AqHXCm8CktJKTgXHM2ytTgK7l
citqz7t5knt4hHs+/okstJSWKWt2KbE5f3+Bw7qVhb9neKWbXTNDExDoSc/afWdczcalMbItLkFh
jXILM6X2qpgXrmC3UF0i0icVyn7cAVJi62PcWFIS94+CFGLMUSAYRAojCskolqRuLJu+HdOSPZt9
Fzdmsm4iWRGWJgnMtIXB3ImLp6aqx3R8Chr1a2wHqkXSeeyd2jVpgx62AyvnkKhSds62bmD0MMdH
UpKR4B2hjHtYdSqVEo3pDyfPCk08E36Kdej1NLNBerg6HCm2dJg103XEqRoXom9VypV7BIjIvkL2
S+zK71kNx6m6MffzM59rIr2GdMUa8OOxcZyGDdYWZqAhUAUWmQRV4jggXObD2gBkYQRiFNdVMlM0
eLmrJmRgJy4JxVNGAaP2l3i+piGgKcczSOs1/b2L+yQ3ji36qRmKpvWliS/20g5aKqkJctCEBeYF
ACofCBYxohEzVDVHCHExTlJ6HXp2JMzZ5jE4yxDTgkMsRsLnkZkQixhWAjEqQI6bZrylzyUPKvFf
H4BiYGl77kF0JwhfqcUu4TJ9hTfYU4I5Gwm6YTXHxjG2GfEpkNhyyGHLyn3yHu8DHNkzHPheecYX
pNBYeJXyK+X8D7TrcCZJtzILNKVW2Qw3PbNcj6uc6tPO//F3JFOFCQloj/+A
--===============2083098538==--