From 31403a6ce2b328666c499c03d746ffd61c4deee5 Mon Sep 17 00:00:00 2001 From: kylinsoong Date: Fri, 17 Apr 2015 17:10:26 +0800 Subject: [PATCH] TEIID-3412: add steup ucanaccess datasource docs --- .../ucanaccess/create-ucanaccess-ds.cli | 9 + .../modules/net/ucanaccess/main/module.xml | 17 ++ .../teiid/datasources/ucanaccess/readme.txt | 28 ++ .../datasources/ucanaccess/ucanaccess-ds.xml | 16 ++ .../datasources/ucanaccess/ucanaccess.xml | 21 ++ connectors/translator-jdbc/pom.xml | 17 +- .../UCanAccessExecutionFactory.java | 36 ++- .../ucanaccess/TestUCanAccessTranslator.java | 266 ++++-------------- .../resources/ucanaccess/ODBCTesting.accdb | Bin 446464 -> 0 bytes .../src/test/resources/ucanaccess/vdb.xml | 69 ----- 10 files changed, 170 insertions(+), 309 deletions(-) create mode 100644 build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/create-ucanaccess-ds.cli create mode 100644 build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/modules/net/ucanaccess/main/module.xml create mode 100644 build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/readme.txt create mode 100644 build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess-ds.xml create mode 100644 build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess.xml delete mode 100644 connectors/translator-jdbc/src/test/resources/ucanaccess/ODBCTesting.accdb delete mode 100644 connectors/translator-jdbc/src/test/resources/ucanaccess/vdb.xml diff --git a/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/create-ucanaccess-ds.cli b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/create-ucanaccess-ds.cli new file mode 100644 index 0000000000..e8f8438cb1 --- /dev/null +++ b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/create-ucanaccess-ds.cli @@ -0,0 +1,9 @@ +# The value of 'driver-module-name' match to the ucanaccess driver module added in JBoss server +/subsystem=datasources/jdbc-driver=ucanaccess:add(driver-name=ucanaccess,driver-module-name=net.ucanaccess,driver-class-name=net.ucanaccess.jdbc.UcanaccessDriver) + +/subsystem=datasources/data-source=ucanaccessDS:add(jndi-name=java:/ucanaccessDS, driver-name=ucanaccess, enabled=true,use-java-context=true, connection-url=jdbc:ucanaccess://{},user-name={user}, password={password}) + +/subsystem=datasources/data-source=ucanaccessDS:test-connection-in-pool() + +## If you are working in a clustered environment, prepend "/profile=ha" to all the above commands that start with "/subsystem=.." + diff --git a/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/modules/net/ucanaccess/main/module.xml b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/modules/net/ucanaccess/main/module.xml new file mode 100644 index 0000000000..a32f1bf37e --- /dev/null +++ b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/modules/net/ucanaccess/main/module.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/readme.txt b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/readme.txt new file mode 100644 index 0000000000..2aaa57156d --- /dev/null +++ b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/readme.txt @@ -0,0 +1,28 @@ +There are two parts to creating a datasource, depending upon whether this is the first time you are doing this, +you can skip the deploying JDBC driver for the database, if you have previously already done this. + +Note that all instances of [version] should be replaced by the appropriate ucanaccess and it's dependency version. + +Step 1: Installing the Driver Module + + 1) Download ucanaccess 2.0.9.4 or later(https://sourceforge.net/projects/ucanaccess/files/) + + 2) Overlay the "modules" directory on the "/modules" directory + + 3) Unzip 1) will get 5 jars(ucanaccess-[version].jar,hsqldb.jar,jackcess-[version].jar,commons-lang-[version].jar,commons-logging-[version].jar), copy all these jars into the "/modules/org/apache/phoenix/main" directory. + + 4) Start server + +Step 2: Creating the datasource + + Option 1: Edit the standalone-teiid.xml or domain-teiid.xml file and add contents of the "ucanaccess.xml" + file under the "datasources" subsystem. You may have to edit contents according to where your Access File + is located and credentials you need to use to access it. + + Option 2: Take a look at create-ucanaccess-ds.cli script, and modify and execute using JBoss CLI tool as below + + ./bin/jboss-cli.sh --connect --file=create-ucanaccess-ds.cli + + Option 3: Deploy ucanaccess-ds.xml file. You may have to edit contents according to where your Access File + is located and credentials you need to use to access it. + diff --git a/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess-ds.xml b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess-ds.xml new file mode 100644 index 0000000000..7386e625c3 --- /dev/null +++ b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess-ds.xml @@ -0,0 +1,16 @@ + + + + jdbc:ucanaccess://{} + ucanaccess + + {user} + {password} + + + + + net.ucanaccess.jdbc.UcanaccessDriver + + + diff --git a/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess.xml b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess.xml new file mode 100644 index 0000000000..f5c3f59bd0 --- /dev/null +++ b/build/kits/jboss-as7/docs/teiid/datasources/ucanaccess/ucanaccess.xml @@ -0,0 +1,21 @@ + + + + + + jdbc:ucanaccess://{} + ucanaccess + + {user} + {password} + + + + + net.ucanaccess.jdbc.UcanaccessDriver + + + + + + diff --git a/connectors/translator-jdbc/pom.xml b/connectors/translator-jdbc/pom.xml index 9349c617b5..db9a49a1b9 100644 --- a/connectors/translator-jdbc/pom.xml +++ b/connectors/translator-jdbc/pom.xml @@ -36,22 +36,7 @@ org.hibernate hibernate-core provided - - - org.jboss.teiid - teiid-runtime - test - - - org.jboss.teiid - teiid-client - test - - - org.codehaus.btm - btm - test - + diff --git a/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ucanaccess/UCanAccessExecutionFactory.java b/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ucanaccess/UCanAccessExecutionFactory.java index 991b02c77b..2cf7bbe8f0 100644 --- a/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ucanaccess/UCanAccessExecutionFactory.java +++ b/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ucanaccess/UCanAccessExecutionFactory.java @@ -1,3 +1,24 @@ +/* + * JBoss, Home of Professional Open Source. + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. Some portions may be licensed + * to Red Hat, Inc. under one or more contributor license agreements. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + */ package org.teiid.translator.jdbc.ucanaccess; @@ -21,6 +42,8 @@ @Translator(name="ucanaccess", description="A translator for read/write Microsoft Access Database") public class UCanAccessExecutionFactory extends HsqlExecutionFactory { + public static final String UCANACCESS = "ucanaccess"; //$NON-NLS-1$ + public UCanAccessExecutionFactory() { setSupportsOrderBy(true); setMaxInCriteriaSize(JDBCExecutionFactory.DEFAULT_MAX_IN_CRITERIA); @@ -31,7 +54,13 @@ public UCanAccessExecutionFactory() { public void start() throws TranslatorException { super.start(); - addPushDownFunction("ucanaccess", "DCount", TypeFacility.RUNTIME_NAMES.BIG_INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DCount", TypeFacility.RUNTIME_NAMES.BIG_INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DSum", TypeFacility.RUNTIME_NAMES.BIG_INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DMax", TypeFacility.RUNTIME_NAMES.INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DMin", TypeFacility.RUNTIME_NAMES.BIG_INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DAvg", TypeFacility.RUNTIME_NAMES.BIG_INTEGER, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DFirst", TypeFacility.RUNTIME_NAMES.OBJECT, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); + addPushDownFunction(UCANACCESS, "DLast", TypeFacility.RUNTIME_NAMES.OBJECT, TypeFacility.RUNTIME_NAMES.STRING, TypeFacility.RUNTIME_NAMES.STRING); } @Override @@ -83,11 +112,6 @@ public InputStream getInputStream() throws IOException { return super.retrieveValue(results, columnIndex, expectedType); } - - @Override - public String getHibernateDialectClassName() { - throw new IllegalStateException("UCanAccess Dialect not set"); //$NON-NLS-1$ - } @Override public boolean supportsDependentJoins() { diff --git a/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ucanaccess/TestUCanAccessTranslator.java b/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ucanaccess/TestUCanAccessTranslator.java index 38b801feba..79c94ed534 100644 --- a/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ucanaccess/TestUCanAccessTranslator.java +++ b/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ucanaccess/TestUCanAccessTranslator.java @@ -1,241 +1,71 @@ +/* + * JBoss, Home of Professional Open Source. + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. Some portions may be licensed + * to Red Hat, Inc. under one or more contributor license agreements. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + */ package org.teiid.translator.jdbc.ucanaccess; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashSet; -import java.util.Set; - -import javax.naming.Context; -import javax.transaction.TransactionManager; - -import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import org.teiid.core.util.SimpleMock; -import org.teiid.deployers.VirtualDatabaseException; -import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository.ConnectorManagerException; -import org.teiid.runtime.EmbeddedConfiguration; -import org.teiid.runtime.EmbeddedServer; import org.teiid.translator.TranslatorException; - -import bitronix.tm.resource.jdbc.PoolingDataSource; +import org.teiid.translator.jdbc.TranslationHelper; public class TestUCanAccessTranslator { - public static void main(String[] args) throws VirtualDatabaseException, TranslatorException, ConnectorManagerException, FileNotFoundException, IOException, SQLException { - init(); - executeQuery(conn, "SELECT * FROM DATATYPE_TEST"); - } - - static Connection conn = null; + private static UCanAccessExecutionFactory TRANSLATOR; @BeforeClass - public static void init() throws TranslatorException, VirtualDatabaseException, ConnectorManagerException, FileNotFoundException, IOException, SQLException { - - System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "bitronix.tm.jndi.BitronixInitialContextFactory"); - - EmbeddedServer server = new EmbeddedServer(); - - UCanAccessExecutionFactory executionFactory = new UCanAccessExecutionFactory(); - executionFactory.start(); - server.addTranslator("translator-ucanaccess", executionFactory); - - setupTestDataSource(); - - EmbeddedConfiguration config = new EmbeddedConfiguration(); - config.setTransactionManager(SimpleMock.createSimpleMock(TransactionManager.class)); - server.start(config); - server.deployVDB(new FileInputStream(new File("src/test/resources/ucanaccess/vdb.xml"))); - conn = server.getDriver().connect("jdbc:teiid:UCanAccessVDB", null); - } - - @Test - public void testInsert() throws SQLException { - executeUpdate(conn, "INSERT INTO T21 VALUES(100, 't')"); - executeQuery(conn, "SELECT * FROM T21"); - executeUpdate(conn, "DELETE FROM T21 WHERE ID = 100"); - } - - @Test - public void testMetadata() throws SQLException { - - Set nameSet = new HashSet(); - DatabaseMetaData databaseMetaData = conn.getMetaData(); - - ResultSet result = databaseMetaData.getTables("UCanAccessVDB", "TestData", null, null ); - while(result.next()) { - String tableName = result.getString(3); - nameSet.add(tableName); - } - - result = databaseMetaData.getTables("UCanAccessVDB", "TestUCanAccess", null, null ); - while(result.next()) { - String tableName = result.getString(3); - nameSet.add(tableName); - } - - close(result, null); - - assertEquals(6, nameSet.size()); - assertTrue(nameSet.contains("EmpDataView")); - assertTrue(nameSet.contains("EMPDATA")); - assertTrue(nameSet.contains("EMPDATA_TEST")); - assertTrue(nameSet.contains("T20")); - assertTrue(nameSet.contains("T21")); - assertTrue(nameSet.contains("T21View")); - -// assertTrue(nameSet.contains("")); - + public static void setup() throws TranslatorException { + TRANSLATOR = new UCanAccessExecutionFactory(); + TRANSLATOR.start(); } @Test - public void testSelect() throws SQLException { - executeQuery(conn, "SELECT * FROM EMPDATA"); - executeQuery(conn, "SELECT * FROM EMPDATA_TEST"); - executeQuery(conn, "SELECT * FROM EmpDataView"); + public void testPushDownFuctions() throws TranslatorException { - executeQuery(conn, "SELECT * FROM DATATYPE_TEST"); + String input = "SELECT ucanaccess.DCount('*','T20','id > 100') FROM BQT1.MediumA"; //$NON-NLS-1$ + String output = "SELECT DCount('*', 'T20', 'id > 100') FROM MediumA"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); - try { - JDBCUtil.printTableColumn(conn, "SELECT * FROM DATATYPE_TEST"); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + input = "SELECT ucanaccess.DSum('id','T20','id > 100')"; //$NON-NLS-1$ + output = "SELECT DSum('id', 'T20', 'id > 100')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); -// executeQuery(conn, ""); - } - - @Test - public void testFunctions() throws SQLException { - executeQuery(conn, "SELECT ASCII('A') FROM T20"); - executeQuery(conn, "SELECT CURDATE() FROM T20"); - executeQuery(conn, "SELECT CURTIME() FROM T20"); - - } - - @Test - public void testAccessLike() throws SQLException { - executeQuery(conn, "SELECT * FROM T21 ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21 WHERE DESCR = 'aba' ORDER BY ID DESC"); - executeQuery(conn, "select * from T21 WHERE DESCR like 'a*a' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21 WHERE DESCR like 'a*a' AND '1'='1' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21 WHERE DESCR like 'a%a' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21 WHERE DESCR like 'a%a' AND '1'='1' ORDER BY ID DESC"); - - executeQuery(conn, "SELECT * FROM T21View ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21View WHERE DESCR = 'aba' ORDER BY ID DESC"); - executeQuery(conn, "select * from T21View WHERE DESCR like 'a*a' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21View WHERE DESCR like 'a*a' AND '1'='1' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21View WHERE DESCR like 'a%a' ORDER BY ID DESC"); - executeQuery(conn, "SELECT * FROM T21View WHERE DESCR like 'a%a' AND '1'='1' ORDER BY ID DESC"); - - } - - @Test - public void testAggregateFunctions() throws SQLException { - - executeQuery(conn, "SELECT * FROM T20"); - executeQuery(conn, "SELECT COUNT(*) FROM T20"); - executeQuery(conn, "SELECT COUNT(ID) FROM T20"); - executeQuery(conn, "SELECT SUM(ID) FROM T20"); - executeQuery(conn, "SELECT AVG(ID) FROM T20"); - executeQuery(conn, "SELECT MIN(ID) FROM T20"); - executeQuery(conn, "SELECT MAX(ID) FROM T20"); + input = "SELECT ucanaccess.DMax('id', 'T20')"; //$NON-NLS-1$ + output = "SELECT DMax('id', 'T20')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); - } - - private static void setupTestDataSource() { + input = "SELECT ucanaccess.DMin('id', 'T20')"; //$NON-NLS-1$ + output = "SELECT DMin('id', 'T20')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); - PoolingDataSource pds = new PoolingDataSource(); - pds.setUniqueName("java:/UCanAccessDS"); - pds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource"); - pds.setMaxPoolSize(5); - pds.setAllowLocalTransactions(true); - pds.getDriverProperties().put("user", ""); - pds.getDriverProperties().put("password", ""); - pds.getDriverProperties().put("url", "jdbc:ucanaccess://src/test/resources/ucanaccess/ODBCTesting.accdb"); - pds.getDriverProperties().put("driverClassName", "net.ucanaccess.jdbc.UcanaccessDriver"); - pds.init(); + input = "SELECT ucanaccess.DAvg('id', 'T20')"; //$NON-NLS-1$ + output = "SELECT DAvg('id', 'T20')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); - } - - static void executeQuery(Connection conn, String sql) throws SQLException { + input = "SELECT ucanaccess.DFirst('descr', 'T20')"; //$NON-NLS-1$ + output = "SELECT DFirst('descr', 'T20')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); - System.out.println("Query: " + sql); - - Statement stmt = null; - ResultSet rs = null; - - try { - stmt = conn.createStatement(); - rs = stmt.executeQuery(sql); - ResultSetMetaData metadata = rs.getMetaData(); - int columns = metadata.getColumnCount(); - for (int row = 1; rs.next(); row++) { - System.out.print(row + ": "); - for (int i = 0; i < columns; i++) { - if (i > 0) { - System.out.print(", "); - } - System.out.print(rs.getObject(i + 1)); - } - System.out.println(); - } - } finally { - close(rs, stmt); - } - - System.out.println(); - - } - - static boolean executeUpdate(Connection conn, String sql) throws SQLException { - Statement stmt = null; - try { - stmt = conn.createStatement(); - stmt.executeUpdate(sql); - } finally { - close(null, stmt); - } - return true; - } - - static void close(ResultSet rs, Statement stmt) { - - if (null != rs) { - try { - rs.close(); - rs = null; - } catch (SQLException e) { - } - } - - if(null != stmt) { - try { - stmt.close(); - stmt = null; - } catch (SQLException e) { - } - } - } - - @AfterClass - public static void destory() throws SQLException{ - if(null != conn){ - conn.close(); - } + input = "SELECT ucanaccess.DLast('descr', 'T20')"; //$NON-NLS-1$ + output = "SELECT DLast('descr', 'T20')"; //$NON-NLS-1$ + TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR); } } diff --git a/connectors/translator-jdbc/src/test/resources/ucanaccess/ODBCTesting.accdb b/connectors/translator-jdbc/src/test/resources/ucanaccess/ODBCTesting.accdb deleted file mode 100644 index f73eda0ad27fdc2731edd36c1bef1ed22565522e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446464 zcmeI531A&Zeg9|Qd%B*a_aw)09LI-Z=Wt@nkz~skNzmm>kt|!Xl{hiBb=tDdNb;4- zB7stlk`w}gaD+m+uW&=i1q2G=${%Q;|IlzG@Ne4C256f?+vxxO&g{J1_uk5qWm!J* z+o#pe&OM)*ot@)1v&vDbX}G1Yy=AbysIq!pQB9Q!DW$&97jE5?^Y!h|eRS_&#Vggj zZ@cfV(bwKv`pqK`{I2A|UwrR9ZU6A>H||^i-*0$u^9#G5U$x|y@BZ`se_s6Cju~&* zv#{jmm3KV(i_bV)&Z+)N?q`-)ee=i-&lcWt`3HV^%R93dyyJhLd201PJb3?WI(NVA zzn*ygMX%latp%6X{ODhQ*zvp3tiN0TH-~5C{qDKq)}L(4RBFYt62wFfAs_^VfDjM@ zLO=)z0U;m+gn$s33IZ|bYDdZMWlO+u+T$1k&__spHGVKY6{Sl25CTF#2nYcoAOwVf z5D)@FKnMr{As_@!4gt*C|8n%WkC5|pF5@#NqSOw|xnJr=&W;JJUSD2aT)m>YsZiyr zLM<9V@c;#@4o)6dnoE*8kACH-Ff?=E^9*g+v0N!_kgfgk3|3;EKbtNh7>Y73&e1NS zD%%)jq!`SAL4+={5?&b>bKpmm22m*dfp6-2$D|hxoZ$Z^!x@ZaHnIX+4+#Dl9!wu2A-KnU>WQxwNts#H5oxxCb|(D z-8|-j&#MOB(W_jQkz}AsUvk1U2q(fYUNIYDs#^7{KKwdVn;KRHsz$Zo+M-%<4ncRO ztJ49SgSe-uUw6A2Q0=a6RIOJ%Q16AySy1)MQCwz&j26afsdJwL*z%Ap}2Y=}MEY*mxsP0pp za9M}553!h?qTi(U!DJ9Nv(+|r1R->&J5UNR92ip0=;-C6qiS^YX8pfJ|1ZP;0|8sGoOyPePP7|F(97G`mgn$qb z0zyCt2mv7=1cbm@Kp^CNG{$5!px?n>$IWhuxt&Jcw;Ap`CFG(S~ z_d4x%y4o>w{uwF40RM@8y`GiMgvb67gAB|{yHoqg23fGEC(*rmY$I3j=)sp9Z4gNa z0~mu{&mCjVUym`Q&c|mieaV@DF@|CMIIhr&X=pRu%}MG3J;^+T$?YyZp`4wV?oOS^ zjwU9mOEIEgr)J9nMkhFtJ%~{Xj$?4@83^s{^U~4L%+b;3Mn`vzj=JgynCHPx=F(ly zy_%MjG7Uo-W(dNaMqZdU7LuMa;D(=JoHBZ$fyzH2AOwVf5D)@FKnMr{As_^Vz}ZP4 zj%jOTOp{3&a7&>RKBmNz6OP4{d4O%Z%=FQT_*haj1)iKp1jOyji9pfh z6RRgjwe!h%5^)Nmo)4+9K+WJ__7yX>@Y})se~}u29jk*!qyo2`(AArpjZnc_QY$K~ zg8u6#65c^`1h@20>y6-wv%>0VIRWl8fIzfYFqdQU1diSbw?`Xlduwa!>$i4ych+v- z+RZE~oZ%VO)pom@j?rvt@7iN*ontiiv^Vtca_!7CT3uUr)%NaaZ|%NzN2jqHvId>) zUA;!@T%*-p-?gLD)tcpM9qfh=Iwt2Co!;6y8-${cqodt>uygB@aPQXcUfS)@5p<4j z-P6f5Y3COh%dVDZw{Wg8*wcNm+a$ibx4jGL*RJOI4c(MwczX5idpdV*Jy74itA9_c zNlSK`sfk-{Z*Oh=wR^U<>KGOlj$y4~YyFNrwI;>!G3;#b-@%PIRAFok3p=)M-P+LJ z4^Y}#{xPg|?`YlbTFV>5+OGE2?b@H*F)Vani=5OpqGQX;+e{1)S?X6oI z>JIjrIOlj4ckD?fJU`i}yK`&3LBGH=Xsx}mv$l2X_OAB+&idNkt=rqXcDUJB6l}|Q zabd7wZ+m;)4O{EovbiwLk}=)UU_4pmnfskZJnen`TNClg^t96-mMmk~yLP4Kdx^bW zt#2>lZRn^ew!3N%w)Y##vyDEBbVHrC88$lI{d@M*b{*W&+SIPK&o|or-CMgFwl?iR z259X$C|q&~0U;m+gn$qb0zyCtyo?D%oUi4ve;#y%BH0B+6(iUSeSAfbd(k`f1df_0 zptlbNx&VdeP=OpToJj@Naul9R1qNISXHkJ~2Na%11vYaioJ|E50u-K41%_`5=Nug| z&LdRNc?K19o=F9rXHkJA7=_tXoCie?73V_{rQ!l8a;caHMIIFkpvb49GeUIdt?c#iI~6atHw-AOwVf5D)@FKnMr{As__K z5CV=fFK(k6cIE%=yZ+ zil|lOT16feC`*lnR-uIssH24rsL(KpjTcb?!Gy+(Id6{`HqWw(^Q>Yv6%4(^DoUw9Sk32Kg_diej+QJySj}3p zfC?>HK!uhpfLudk8C_Aa+$vU30ZE6(daKxM6%ABC_MvfuRcy41O;lU}qZ+GNXBF$I zfP6$_rBzf}MKu)*V05)rywWNvsDKPb<14JHCOuCaK%b`%ApiHHyo0zyCt2mv7=1cZPP5CTF# z2nd0bM!<0v@vCY2xKw>1-X715e?GQ5RuKDY{`L8P%6m=Tyu2^xZpeKydSf&*`ZqZx zIX}*RL-tkKFJyfn>$M?DpRHEhr6%Ax{d5tjpyeI#oywj-zBO@ z<*LyNb#dW%&L?1A$S;Pu@!fRjT^pZx^RpH98ih%{YEnnkklL(T)Iqfc|NB%2+_b9w zxVEWbwMo^$e8++nN{!e6>l@3|9NdiH%XHVkUWXb`b*dlsTU3vlrLAS^|54>2m=L(U zLH}x%|F_YmwGi4in&+;%em$dUuVY7ZgBnDj2N3u+T>X)riU{AW_}iBBYxE+F@3*;J zZA9&LA`za72);(~SCjOs@*-H7h~N(%*rAF3{=dw1A`z@cRt_U$_k!%8>Vj%2qWpHn zUvtuLn-}G)6H$KGuZn-P|KVpU?3ML~EvuWLTBoi<$sItn+H}OORO!F9#$%-l`Gr3> zv#f_%>z3&Nf;_H9ntM>LdhswY)fHHSmHNBd^BkWTbUklf*cG^*Dz5cBQ3GcVsBad$?x@n01x?O|$=lx&&m*60FEVvIIhqq~eUG62y z|6AsHjPGTRfN?x`WcA%oRsZWf&s5keoo@%<4wSDN{O?35W98G1m{%%Q5pn}CI94nF zZ>1LizRY=y0Gf0*_5#iz>bXq_pcCYGEVvB;I1>v16`32rORw4bU^fco)z8Nt{k==y zpRIKW<_Nq$py^Mx!c-_VtS}eGkb6xA@?WT%@bhwxDw}&wA-`8T0*mpm`q{RhYsmIW z=ca~l1lk^?e3?rBEj2h<)*=b7KJcQ+FMBm!wdvYm04d~?;m>rdb~B%z;q#6oaE5qU zPwbVRF-8OWIhc@VC`HHctR5boj}Z-V|un;$EsI*v{a@4F86pL9d4{Fa(jhI z;;HnP624^l*iWEl!PijTr}DF-t-5BhSA1l4#MXzbu2=;y>4#Bpj_7)Ex2i-Y4I{8N zwGZYUDEq@nFEj7e#umpT%&?2o0{omC@I(UKrXw({HU|C@f$*!I;ExuRP0jHH!m6ST zRRy2v9<*D6euR+lwn- zRaJP}*i5=E@RtY_A8<|y)E0dhjPW2Rw?cxN2sOGI(hn})0B!(-dw;6m0QTw+z`O(4 zuf>*o32*;ehoyWRK01U#)&)p$M_ z$1?P;Qhz00U5q!x1iVY`CyX0M_*uXPOh{Rx8^4vkldU|MB(kmsPwtKdi$kg+%kA}< zmv!>H)_u=bm{(&Q9^lnzy|q_*d#sE~Z|Gi$)&PszD48;@V|#3yiLIzT+4Le+(+f@h zU*>t}9Mi*X@W@nJ^eQ>I<}T5=2st(Rh?)94qPW9!4|&ThOB|y(HfKO9gN+A$s&ilk z=R}UE=Wh;5EFU}i|B@4-K|}{d16Be`@6YGhZl|r0Cgqw!di7-a>7!Pxl+x2`JJ2vj zf=5TySbrfTcBTfQ)Eo7cZjj`$96&z|H|M%;-jHwu8pm)Gfg3X>pfCo&gPFlx*E!ED zr)Gpzj4|Vb%o9;hGo!XXJTvXhV!W!`(f(l`9Glo&*Jd!csB21wCU6^|T!nxT5CTF# z2nYcoAOwVf5D)@FU}6Mh|Nn_`5?ew*2nYcoAOwVf5D)@FKnMr{Auyc;DyAZ^qN(tt zU@AO04g82;|9>+he;Pzaq96o>fDjM@LO=)z0U;m+gn$qb0zyCtoD>4m|34{M#Zw_5 z1cZPP5CTF#2nYcoAOwVf5D)^V6#?o0pH|r+kr4tyKnMr{As_^VfDjM@LO=)z0U>Zw z2!x!saA!j7z#P2)pWOg)b7E^a6OGx}C=O>Rd2c^%56Hv8e#y;xUp#I-DLb|qD)L_l z2mv7=1cZPP5CTF#2nYcoAOwWKsUqMw?YjTZ@I&gW@q>xGQxzi#R|p6JAs_^VfDjM@ zLO=)z0U;m+gn$s3Y66p;|Hqf+9h~9d`Tvm2|4(&BiGM;s2nYcoAOwVf5D)@FKnMr{ zAs_@!fPl>Zp8z~@Dg=ap5D)@FKnMr{As_^VfDjM@Lf{M`FxmP4xtRaQ83~^MkI4N0 z8Iu1JO(7rzgn$qb0zyCt2mv7=1cZPPczFs^2=o6q3%vRN888gF7II|%-$NxTAs_^VfDjM@ zLO=)z0U;m+gn$qb0;imS%>SSAERYBY0U;m+gn$qb0zyCt2mv7=1cZPPIOzl?JO6(P z=KpanNB}}W2nYcoAOwVf5D)@FKnMr{As_^V zz%dBO{QoiFh>;Kw0zyCt2mv7=1cZPP5CTF#2nd0*gh0r-C&r|-U~RuQmygMPU;0LI zY|c~>mFa0Nh83K-bQ8u;DLwyRU~NQbkO4QwAgm3tajzu?%vJ(^7cV*4bP-8$p;WeU z5z>1LB)iD-BJ4N7t^{hm>Voh=hpK@P!Z6Mm37z%OZ&7>Ikk8g;==8$&oP@1ya8I2k z?YdVD_-t=eM{wVvVhP*ZRiml{gb0Xa;DjIq{)cgj=z}c~auotXKnMr{As_^VfDjM@ zLO=)zfm2GraW?AyKO>Q;z8XImFO5GR`*5r^p?gZBCxHtAAs_^VfDjM@LO=)z0U;m+ zgn$qb0#iUB4YFN>Y-nfu4RTzA9BTUwqOL&{+Bm&k5OQ6ETxjR|4f0%rJZR_n4f0)s zd}!zU4C>TNPDE{jG(!R83|b(&Fs!W1f{|<(OwyaF>LI_-jvr+ptj(xe2bqQe_|vXt z!mkdfTht)@qNGC~uCrAou6@|Ffm=5;>HoBG1Sz0I#IW{nhT5q5wVN$!A5?u>7NQ=u z`*7~X-5}ym$%#RzJ8;cb)!H@vF%lKS(9cxYLw7*kp-YN`a>l~O|B1iM(a{iYLnvv> zP-<8bU$0A#C;35by225O=%P7OZ9&MC-!O5%24NkcmvRUJAs_^VfDjM@LO=)z0U;m+ zUd{v@XI|WP*T&lO@6CHG_u1&o=;b->*>B2vAoJfdmS$WRxi|bk=-19mlMm`NbQx3U zB34a$vUmVf=$y>1($mJndTP7Jo#;NK)~FKqw@R&48&oNN<*rUO?6$y8K&9~AWp-G+d+iTqbJ}i zAq21-p|6IUa`l*cKz&iYU;QP11K5&aE%YzPZzd+#^VN%2#h`-x24d0y*GDip&MEmp zomT2_JA@6m8^o1iwBhPcZ8=OClKE9bh@fGNbd)5yTZwcnS1STjRfq6~U_x;N3Jg$8 zVF*G3m2kswNaV}vQ|e>tZgmq(w;}#D;J89v1Q7_PYxI>dbq>fSX2iz{KRz3Z#R%Rtm|O)zI_%!Q5kR z2IU=@AA-pa_&TV%k%k?K^p&Vbk!zpT`F4|PMXszz3RkLyYE~kBGu(WmFa}HJ2KYx| z3+7Z$N-Q=YZmZmsR3nF&MB5bswOC55j5V3EBA6146{z8qDuR`7{WcVM9JciuX%Dz zX*X$MsoIY6ACw;@2%`=uv9YU0d2K*!Su?PVQNI}GCau;MOA5;vQyP>8BS1uYUFtB> zaJ@^a4E}ydy<5FQy#aaEil@2;Wo)Hdtme8UjJd%jY7}Fl;E^q*m9WiiTe^`uEl`_h z$BWNO#FS6HEm`SLJ?*YST1?Hrd||Df{M?xG6KdD|I)D^ilgRrrJnbJ*e~UET zhBRFVepez*OOYb)iKi$Yx2$0~VvSgd9O*$Fas(;t&`(o4OxhB;P=Z*l*6FdOI6XZp zbXrY1m`5yaYw+J=VxO0lfq7J~OV}{#X(RMSaWKAtY=|q|n)>bP7R0hy=M>*Swk}{! z<>}|<0N#%jH5){X`M(`0rJx#Xgg#$RKHqzP+m8j!#q>Qn&_bFe&9z7WCFx6_`SsU##PL zbU7MCuGqSp&*I~F_dJNQ_-52}`+RSn*@^lgij=bM?!=Gj9Y&tlfLR-!t7|kn=AF$S zmO{1?>@!t@T8D2wQ(vz@Doi?PpXHCam7X3x^FcXAF~l~+!EDjQwot#XrNFT7N8Y_Z zt-hP@d#-Yj9#ZZ`yeJlE-lg=DrLb9-K#DS^=Na1weCwM!*`F?xT9!nUF1E*L&!b{X zVsPD8i?~?6<~>q`bWzCi2+Bo6qGYaiTMG91szuqn8sQZA-b>lKWYTS$Zgci&(aIjw zGi;ewp(aYLHI^e?wj{D{4=#(g4m7nN-?d~>9+1Z1yxRu8MzoY~sm-Xz&GW`L_!reD zPzLSW*1o0usiIscbB#|ITM7dx#k?NI*#TAu^j&go$aX_{q9pqBi_Z|tUzv^r-&G}e z!h_NhTo1A?=KG`%`QvZNtw5{ceRx;hh0?>PiEk=X|Ctsz>pzG&>w5hVY6p_of)w=W zr>PGqIfC3aZ}R={-zz_SQv9ul^tzobI;P1!W6Rw<_5849Ft{zmx2Nd~uz8T5l{i}89E>@hun8sihnK2J8k=K6XT5aLEX$F>}6^B(=yIs(-o-h8cYy|!1E z%np>vF4QZg=J2PLC5z9P$(v(6V=Rd*m*&bg7T?+FDGqK2nlc{L%iw$Qd+O`zVf3W# zR)2vK*Npdet^kskue&Y!L^Q&#`Jm=Dw*%{O$JC7RV)TO4!@zN8DMzGc|`$2K#gxhoG`O zc$=Q(ZhCA<^ry$9k?Ap|k7+UeDU)`#rcoVsC^s`!G^5gxcQd-lTP?*Qm|Y zTZxR}DxFT&+a}ij+%ml@<`&7Y&S0CvYbo0l^1U6DTjSM^D?re+4nL&cgnmjVQnUrn z!quqxZH*CAi*&x3e%BCe@D1OOdZiy@HK}bV#%QIRBAc7(IcJ|H+m>3ROI&)oRw2bf z=`xIh>OelPrr%{plGxJVb2ZzScMFlCYmjqX62oyo=GXz0M)o87QQz|&uwOH0o-j@2 zI!)u(?sn|Rt2azqEekKlf?H5ykHV|~SMw%&x4IoAZKrN|u#Y^)_l~|0DKmB70PL_- zvc52F;A*7upiY~A)PgZu;pUiaA^OYU8vQ=@_fI%>VoIc?!!{P#1m#um_zP>>;2LAT zubo?@^NAywreDI^hdoNRI=pu;Q?T64AJd*0`|ZotET1HklWgGzr-rTjpwtA9!m!LI zr{+qeFLi`$0a8Po&h62rQXBhjXg;P@@`mib`n1*V&Q z6Sg6fd&exl9Cr>%%~<0xE8xcTvg}h-hh9Z$FJwN_b3LA$Uc8UkY9H3m5!;tX@J?b5 zHR)$8xRxk&%UsY~*S6VhJD05^+Dm_mf?I{bV=`?0n_h^0f;b9mMwz{~`#fFdI6}p` z!Sw#OA(iauvln~>E|^+>4~uzJ;+8=B#u}@S#jzNZSLW@-ob&ffOn&pN72J=s{r%wa z8Mddr83K+pv;WAJ{6)Su@m!romOwK;!&I_8&mIre!{}|bAoXnNd(8QkH|5Zj!V==@cM@S`p@)7ym57wO}g;7a6W)7rr@$@^DB6KhHn;AtJ`rx`=rhHy|3mVWgCzd z_C?H$2gl})=yw=X$To)8FJ}BqtHOJurstIHf7rf0>v?}m(3V4%)}Wj^_Bajm-OT9t z`(5U3<&8_9uhYfcGUd+n_n98H*4b*}Y*BK`OzXny^QWhb>1P=s@E-zY&$WX>1`;^WhA$L$ErEk$TrqM5?<}1@)|0L9r9-!Q_aVnPhGWM?Q=dH35@9Zkl_IuQOdV?Yw_{ND-Bqqr@73&Hs)Bnj!8JSEV#zc6b}VWkddgOo zWJMx(_M$J=ij;7ckNq)@6|!&DgjNX0rTlrcN~g)z?8zgAw&!o+&(?>@HCwBDsR?c; zj#aC(Es)$7v+21AV;VL++?2)4RkA%{HUgoKhmi`VjdMZ+$Su>BvU#-9%_B2fF?O$+ z<3xO8*|sppJK3g6Ph0RCYrJtNmTS{%c^}5D534dZAbb0 zW2L$@GG+T9DPZLR22ln%f61PwzZ9-;bIrDy#%~*%F%PDa{mRr-v783g8e@+|u?1uL zW45K?jgWe+`x2yzc`YE1l9k<)zh$!c_4xz?i9m1X_ zbB6OsK`APApDUZ9vC5%0N@a4)z7tZ@#iuVQU1N<>@vUj{>b>eUi0LjZV`Eb0$=DR@ zykafExjW7wbF|7x*syeRM3JL#OsD@TV{PbvAE&>+Y|n(_BBsB|`qArWdifPxYXpx{ zaWo-#tYf}UqH8Hq#j!U&M`pBxC9W6sCfgP4Y58k>y*Y%Fwfc1^haGynjee)r5-e9HRrdXr zo=0}P*Ip@)6EuHE{h+cp)_By4G1?gOeeY!KVukTu&f76h%&ZXWKBkQCV@lp}oH044 zY#YPAt^DmkTSJ(dpLHI`I=pc!ufzqvhiy)cH5OIkmOMM^Yv02Du_*Q)DW%blnvXRF zM+^7q(Ke=}10|5}G1mIt)5KP-$thct`BUXdNt?GX(-f3PY=Z>l(XmION>NJ8^OTyZ zg}%JvSKOE?ma{(O59800$d(f&9?Tu{u?6n~%5AWnz};4X<$0fFKrxl}+xdPyD?5dU71PX(mdm&B-mxc-tj6KI}GajA|W#z~jz7-C3xsg5DWyqD@2UI2xTA!aR>>KI~*W~q)LW}uep z7-DK|sg7Y06gq|%LZM@bx!$EZhM2})s$+0 z|9{B!!Evv4Z*}bdpNsAuwY3rYF%C{zw@$LWP1(5%e%SRPTj_27jZ5G5_>qkp9^pQ|ETQ$&#wU3{r^$YIN8T7{9mt&l~>fLE&Km#DDqDT2mv7= z1cZPP5CTF#2nYcoa4Z6{|NpV*h?x)&0zyCt2mv7=1cZPP5CTF#2nYc!SAF6b?Ckjo z`80V?9A|ZmtJiph)ZBP2H&vEH2nYcoAOwVf5D)@FKnMr{As_^Vz?cMV$8lx_tc=`w zc}wNULtDA!0d_{=iuq%IBVa?oeo)i#Eda9GORzO%vg{wM1j0N=*WjSpa7ue-2MGv2vC+$ByQ+1_GpZ>{?a z&tcU*4ICYmXTYuKA~Xo;jRk0c8yuq<5tU1WunyI8k%4{J^z#3Rj*4fn6#EruuQIsv zoo}IiY!p`M758lS8!(KSdXHl6qFSxTtjxFIJ>BitZJK+l(nbWV+VQ^*dy!^ihez(X z+JQar%-){d9dcOP$i_~yN8qkQ-GLqVLdqE(jg5{j9UaZ!+Vy001X#JF{Ak9~m|5&j zHyPN4kWdxgn9n!Fcf|646D0W>n}K&rDmV86{A( z6iSMjAv80M2)WHp)3pS{D#XHt(?miCBmabe5D)@FKnMr{As_^VfDjM@Lf`}lIF4fl zH_*NRYW!flH2!?-!?D)byoCM$y1!OO_1#T5JcxFNk}hBv?s}4TxY%bMTv>Q23X{G z%?Gt`ADvyKiqzbckawgyTMvu7@d5iPEI8er5(i2N(j$IWds&J{J5xPc2aA>Z3)e&V zzP0g?-;W>0Nm0l#JjznP_|6aOiPBzcV7c5;6}kAzE01I@mdR>-47x-u^kF@k?o~CM zBis>sV~%9c{E)9!Ymrdql+C9A53Aryc1Ts^xN%DcZt`iII90-nIXS8#>UuFA{3^wm zjpJzrJjLgTM{v;xI~KNcFj1*IDqc8lQL{LheN?p1~_+&C9N_+9l9ac?R zqO{HDMZklT?!`=af%uHzk~ks-_3-WpysA;HS~m<8A1(_4-*eVQdJBYIHzLVN#in&- zGCh3i84nm&eYf)a&)VT7$kX|$oKhXqatXg3t*P*Fo;{uuTDFmFMeYnG*2H=MXo1_&xAt9lZMjU3+Dtpc)XFv2gLEfG2*>Gr+iBkjg`6f zHNzU&RISVb5)Y{4JzUlqEgNSh)Al3HZNSEQnVztEzkIx~Y1w!}C*y`~vx-H+K1}|a zqe(ydgKqt?8>OKdSz3uVXEh!ux?&KfFeSbEyyV&1gcc_f1Yge$2*Adl^KUr||Bee1&f=;oH*j;j_n)Kpb(>lhmD>e~ywjU7D$)%|_L z9fybMR|&M5I|hfk`unQ;dk0#EyIOlXmX}?%aQT|$Wo2b0CA3gozu~Hdl~t8%R+iPQ zDOpof<3C|uv!&{)h2<;DSFBlIwQ^l)b>-@s>MC=>bVD_QDJ@xEy}G)ldJWIzWzf!# z-mtNMXt-$I;o*+H_Kv}#O?{pHugZ^JvJrvuD81_D<*S#M)vR1mQe3@$O-XTSY4!Tz z)$3L)FD@ymEU8`t1|{W{x4xpeYTYXmu1d7e*Y*!~4-K@mb-=^#we+%D9nC?1gX@Bx zHH%qv{yFG3gw&t$9@vTI*v)8m@K=U&1zK0@u^Wrg;l3=Ms@he1de)5B6=+f4sutn8 z40nsLzGe|>_q7PYw8J;(8viy`3Y}_H&Gq;-VBL_>sYlC>?}P@t8;p*5{p@sKLo4Bm zI_nV1GBiW#@LL3(F1%F_;JwnLieSnXP#4~IMeaMd2=ABy{Cc!5`zKv^7x%%I|Cr%e z4l7`PJ$}`QeI-&+tjck>2ESs&y98$yRJ21*hC`*cS)!Ihw?v<-G>0`V2ePmn*ofMT zwgA^kF^*ksi)1HQFy1sD!r6(K7J)@4e$?+k>iu`6$Sb;OLfF;#ErV$t;!1kkyU@g8+y>DY_8$)hmXqb0k1YXSnJ7kljIO6=ZTZWIiNzw= zwS2Bc4EoT}>PN462jhn=m|X~(vmHnG!%(%tJyX99DXK(SFr5r9ul*^R zpU7!1MlAKEZeCK?#G1KXjHbS^mz>ipQU1yhUL{HaOFUyzimR6r)A9<=>1xEk7eAK6 z$kq=DiPS_lB)ny39OLI_(VNSD*9|WK4;JfV`uq=6bJp>aI=VRsi^(m~F z;!->htI}8*Y7@)#a-?AS6tD_PeUsX!OK%6r*?PlX{q@H>u-S%q9P61GyJqP`t_IbfYrFbNSAOj_SGl|_>u7-rN9tSJKKI!IES`nEm7iQxpmHO= zw%C`e3$XBbXt=$< z9GjYXe)8~GVS#ZdtZlL*Z=L`r^4Sqb4{JE8>U~jMaoKV-(26-Hi(u= zf9G&fWgA{N2Rp7Ss%gRKZ&5?*{toC26_qV3EvoDKW$R$e;E|Dy%DH1_kw_EohEb+r|tRvs*>92n^73boz7dq_90Ro_ro zYgbR#@XjMek1lw0$%u;I{$4OS=j+Zre_e2UM#R~gpIR5Qtn&y(vI~kTMzHccRbkBK z|LITQ=!kye%M}%u>3MAFymCNw-Z%z2mv7=1cZPP5CTF#2nYcoAOwWK z@e_zRPv?!*|F1y*4jagge>whO#l0Q6m=&#&(i9e;h7=>6-v z#1MeKON;~PyTo9CzDtY<=(|MUU*9DL0Q6mA6hMzicw-cddSZM+4^kwC3G_%sV#q?@ zCB_N#ogOTp2YM(YF{+^N57j@SBbU&+T#r>)t)V^I zS1q*=NkqkrSsYywhIdQCe%D&yA>(MnjxOy^i#-$`U8!%hEJY#BbgZyl=SWs2Mm}7b ziWx`icD2`On_S~1hY%0~LO=)z0U;m+gn$qb0zzPH0wL#hy5n#odhP!2zp+ck$H(d1u=$W2y{CcQQy^r%;AaLE{4PdRh%WF!xFi>} z=+FS`#*z#u?e2c_&l>Ow;dOlTPY0f<1N8!@*V@2*-Ow}O^5B_R;5dvQx9w=v3oE$| zOaT^9n2mnyXZ>dAg{&P|<JO-H~Q0o0pA*g zn=ss51)DK^Z}9cnjlUS^RYTOpiXa{)_w2nYcoAOwVf z5D)@FKnMr{As_@!3W1`j@RjoLXZR6uiehWe@H9yDg@6zc0zyCt2mv7=1cZPP5CTF# z2nc~=6OjJ@vH6Ip5D)@FKnMr{As_^VfDjM@LO=)zfwO@?$oV-x3aRE|CBA>*w_X3w z?@Q8rb3Ru8=VNibyY~B)xZ?C5QO~`91wXzZU{;N%uK9OY@Ox|i?PdUuS&tvqp?T}^ zx$}Sy13n_$-nTG+?@z=_^CYK-UW<| z_9~h%FdGhVZvq{wTzu;@*(=u|Ph}+;bil<7cWZ$TT)CY97tk+E=&i@50SBv9w=gJ3Y-q3>N7e85_usY1cZPP5CTF#2nYcoAOwVf5D)@FU_1gL=W4zG{{tAxpqM^o z@Oh?=Y;4YguzHr()<#vZg40@OFoE*_qoXf5T09=o{;=Z-?LW6VV&vv2i*F24MDW9j z5B1T4f_S~_6&$)QjKR{F>s3aI2tL30rvuMS5y2nLh~T4plyL8Xv^gc=qqysVtomMj z-Y>3WT>KDh5992Ie0&jP*C`v{q1v?jcGZB-1MYY4`4PYD#3%nKt$vK} z@8Mg1A%Ltwik9LVeB(>2o7h3rT@E221cZPP5CTF#2nYcoAOwVf5D)?rCLr?v6GkN# zg@6zc0zyCt2mv7=1cZPP5CTHrWlLa6J^+|K75FCWiQ}}yE8Pf$)l=~g#SbL*1DJ|< zi625h2nYcoAOwVf5D)@FKnMr{As_@^wgkBCyOEu*#&+&Q5Fzi!7Uz_ur(pYhH3z?0 z5J}I3;CKj9_q(znP2K_tb4r{K(Ji#isfG8UUZ|bTg0mSarX3y1!lvs+ke`zGJZThz zzn;&{5ho*N`~R?!bc7<49aTv3Ms7|afukcj>#G$NC^Xd$6)0-eX6?i&jG6>31cZPP z5CTF#2nYcoAOwVf5D)^>NFd~VD4)SKqC3d-|2a_eQ`8{<-w3GO zCtyUw9e;0uFx+f%-Mn7A@xIcCTZTm42nU`_31H6a-1p4%?Zmjqz62Vi{1XB~KnMr{ zAs_^VfDjM@LO=+db_5*fNh?Btp6yrT2jivj=My@oU34WvLO=)z0U;m+gn$qb0zyCt z2mv7=1dfw{owhzsXUW#}%xJRKao>#`w~GJ=ll8=Lu86I3{mW55#`^yw@w)he_#a~5 zjNKAzkdc4@)}kc@gn$qb0zyCt2mv7=1cZPP5CT}MPC;U>WT!N^l_2IlSG3#p=UmsG zrLaJq2MxK-+`kmwFFReNN)sNj&%RQXsb%VNy^!5_bkul6L#phe^-QS843(B?!8ql| z<;Jm03v|F^T+4(&OFXDPW;6)Eh+i8R$F$6N+d&7ak7?Ojggxyjz;eX-Vg5Rr2OL=c zUr9)Ot2XHVKgPH= z=>9)O#y05wKf3&;|BoTP4buNVyUUBDP6!AAAs_^VfDjM@LO=)zfwPxD$oZw-|8F*? zgt;>uKmNzlFFL@~r|$oE4Xog#TWghS`|ZFJ-v7^v9Jo6MhK)=Kx~r}X#-kAxWqe_d zV7)yCm&V+U0W-7!hG!5Pb-l{eUU&wh8So1G8TMeWzrFanLd>^sA9w1@#{PM2*#EB& zA#GCaxZez$z1S7-xOVjm*w2sRF{7~%FxDdtqZvzMBe*KXUH!t`32;m|VYt~0n{;zx zyZWW3)}&E(@zWV0|Ac@L5CTF#2nYcoAOwVf5D)@q5dqo%?<~qpNs15<0zyCt2mv7= z1cZPP5CTF#2m}zQ2+%ujt)k<05#XR8K<~JUdOeZ3rh_+c^%hs6qdH&o!tT*nM6Dv%D)Ou%-zwxY5@$kLkvIwgAs_^V zfDjM@LO=)z0U>a96OjJ@*`2?(2X6QOH~oK%9-00>2B%E_A0t(!|Brz%)Bnftnd$#y z(9QJ!F;r*z{}|w_)BS%83)boWKL!))bpIbikafEMk1l_m?*C)hvrhW|XLl)+)CmD0 zAOwVf5D)@FKnMr{A#f%T2sw?EOHm)f$^G;$awCno-lStQci^MYfqOvC!@)V`K7V?1 zK1WL(cw6l$b-Qs9(jp0d1McIOyt`hu+NO@E0qnCUyU|(dauotXKnMr{As_^VfDjM@ zLO=)z0U|rInE35y5`C{28B8QCypyfu`C3HfDjM@LO=)z0U;m+gn$qb0;ilnePfxr z3mv)EpYduQno_A#60*iC+)m z(+3~wa2*O9gitRBDFaCNT zM;u7Oza3KcP=`ZMH^XM0aw1`c(0v@GcaerUh8K1Y-BwVbFufu{wj7;EF60w{~z-o$2R~f@{9B5g;jqowd$4)cuHWM4gBKGjU$GAP+lDIx5R*WvUy#`KwiZzxu&1 zpC4%4`@);Py#Mai|MUC(FZ|=L|26xbeUZ6ueCV|cKKN4U+g{Q9f0w;t#xoZ_`?KfY z`RLoSs~&yJ$fmbHwf`Nz{^ZQtzWvYNSp28MpMQV+h4X%P%l32g|McG*KKhYe1y_vqI(Yj#7nEJ}hyT9+nol;}xa;7zmrv|&c*J}CVYqh31zBbt8 z_{Md4aGU%<4qIAl`Xd*2k~<%aNlN*}&hM#wt(K3k)tcrc*kFBpQ9q={*J}CVYqh31 zzBX82e31kQ%qMjLQR}59!D{)EV6~<>2{zb75*+6TjyM1RG?FOC*+by*hjsm=6Eqrd z&|n?L=mu1c9v5pldy;+}DM7ud@NSYr6Ce#aECHcmN$@H(godAhUoB-Lh{k+qVm3#; zgqBr@uXV+jF>iO_L?cok-*Kj8426|Kely$;`VrD{Qcqg zf5ZEotdPau<0n9=o{zxUnIP4(StoC*q+MR#DSsSI!V$9@=@)2w8qGAH9{V% z2U1AErrTh07!psjAYC=6rIq?{M;R#NIuG(gl>eek)F5QQXscbTDX}yo<-P&(S1~OG z)eAfI@Mi!%QxdEPvFL@VCwrBw@A*4B$^J&28iv>hpK5R&f;<^xI*=4cBTL43$Kamf z+7!&tl4k>2DvdE3g1p*n?NcZ2$Y$8(b^yK?s7Cz15&B&Sh4N$bA<@=@Uq9ryu7?g~ z;OcPggNztu$mYT?N}>(GP79bYwPZ+pJ=iaGJMOv==YGwNrW{YB-;}pAl(X@v+wF*F zjq1_eB=c0{C?^!66jlyq^)jfyE~~kjYJE8Rz1Vg>KDGb3A#>ixtE%qnFTVHhU+jJ_ z_3FO0?p13Zd8UGD9zo-G@v=96V`1yln_u(YNA~>7&d7F56Q=pa*qGy?2OqlUihFHpC9+ zzINdss^0a9kNx$6xv@6~xvhuWcKlerDdopfXO3SCKV4e>?#&e+z2T9+zw3+N$P99A z$Z%I#b3FJz1AqST!|he~fBc<4|LrB`bO*U%2^>I3gNQFfV@{i+=i|RWXTiUI`I{oMuoX9l^s9-$1t`X-!?{u(v+7Or7GJWSb0_PwdLvXOlJ@GL4+ z8&1wSs3K}suNt^9}p2BA*Zk}?-DWC#U zi{V1_`g`%plHePgSL&NKS`;{*|p0(sXx9E^(!uIZ-aDuE&F4Sx$PXWUu+g95po(B>L;uL1U;oQnzp<+3(?9jNeQ#>F4XXBL=T#-y|44hf>LLaMmq~UMo&3aLV=050W?o~un8|L>Pd-3i^ zZ~xuKyBqEvec&VS%Ji4;^one1!!G;mthpsOUcLTf_vXC#;Vb_7kB2pJ3KPe4W5%lp zr#9TT-c)$c4cnVHf6{rOwXtIDWe0V*lw8ZhYr?BYr#94uhq_*v*>F?cM}HgnX#QaJ zEv()hq*SSFG-CLgIWoo1)9Rmn?y}d__18Z9(-&%sAN$fh{_^BiXC7EM zyW;h?-|)JJuYN9z6~DuDVOHL}2&Oi?a~GH7tm`bSf8>_)%0K?LyN1{?S&Yy|RFQ64 zvYE){pm}N8B^73o#JRA?c=6y%hkp(|D1pWZ-V6SR&aAWG8=dWP+pgr>`iQF4UKo#1 zVW8vA_I(Xj8C1g$wmjK7W(yWCttd175Y%0&6((#Uz(JII@E76z6OGvZf3{j2S^Sv) zr-PaFKc;K|i98c}t7pp^l)vJ#IV1v!y<2Ng_yq!ed_njN$I(78p2S0lE#shcUQ2VC7KWzB^?scCCaud|)F(JP7P}98a-zuno zVD^sxeR}89KMry|R;R`I@MPO9KmO@wuV451eFq*xY+Tn$|oOueZi(X z{`RKxZ@J;Q_XN4{8qLPdKkdKgg^s`3Q2);5GcWyr`#Nt8a$`q7jEm&|Y!+K-1J49a z(NGqeq9KldWTVfW`mof)Zt6fvj`9Xl>^q7a~6pTHX zGM>j~z=R&3ix3>oV+K0QhJGFtVOm0(6jlc_0mm9fIT@jv?&YxuP)~pazW0%D~n}1*a;{0>--<$WwyqS4U-Wzfc<*MA@MGr>XqR;32L(aEy8gj18 zxh&_i+4p6?Df>uvDEr^CexCK6tj4TYW-ZM+KkNOOcbZ`eq(u%PAOwVf5D)@m5Qtz3 z+bo&4E7Y*Pi`AOWwQ{~-?W#SWmR$}Et+w>|TCHi0uMO50U#sPd@2>RtTCHi0uMO50 zU#sPdFBUnc?lfVvrhR`02Fsa3Uwk9!kuzG;9ytb^vJjOWeK!AnPZG6G!Oj?F$RTN! zYy)D#W16>YVzB>?)5nBb+>&6LOTPh-#H1E6;W5oj7;Fj?YMlZm20#*%bp(QAnwc=z z6eiR<1xyTpBqo&vf@7MQFxV6()H(%B41gpiS0g4bseJ!~ZMCNP!M4HrUK4B6BWJay zIdV4GMC2UjrfgdmU!;B!|8o5G@qO6;Z+855u`kAMjg`cHpa1#%?)-)MzsY-lUPs>C zyytQs&;4-jYjRt1D{{}t{io`jebD=4`{Be@|p1y>bWvAs_^VfDjM@ zLSUK*gdqp1AeGVtDaj$dX2g@~YJmLXe#oqFziP^V3~_2$m0|zoOw3G&RaRIFRt7uX z0P&fAEbSOT2f81DcwQNAu2ic%Z`f!b&l}@xDTGH8p|f2(p0nibsVU@SJi1z~^*mx5 z)Ouv(c&-DH0iAYZ{UTN5S!b&-)j9=E?V>K@WHA;yC8Emx39J+U{^Fb)qr|FNQ9`~+ zDZBz2$s#+uwJ^~T{?qb82pT2AxGc>wt<1)tM#2hOnj_mmfQwf+FWm`oD=vU(SGgk! zNu29hg{;I#6Ed*Zm4!NjGGKNrPqT^{s}X;qDE@Oq=l-zvHz}4G+FzD7t}N@(d!)>Q zgjXVt7@9%A-lDc4Z6zrgVOXK-0nLtko2~;edu+4m?dZj7wZcpLg%j|?F40R1pW7ObM`06+HGeg_n6#oC zbm#(|M1h+(Pt>C(U6S_(d&DiO$MdKTF`)!_T5`Dg_IQq)kePgp%~QDoBE*Se#QoRD zbIvu9T>H4!eHgixlrn>iOBG5+!ZQjB1bdcV|1861{RxM7>Jkpkb4P)Dv)Xb9k>?7q zfEt#=q&B>*s0>(dcy(w}eZeQtTCId!{W{mbIgqJOM1v!n)>8UAA;~}3EU;E<@cN+B zqY+yqmxu=!+qR7&aHU~6?rR7 zJliq4G03l&=;4MEJs7)C4?9GmlckP2&bxg5|Bp-m|8&YnaH3?8atOjgV2Rh0p>w1hoBsie9XRj1}kq z6aD}DeEt7VOaK4nSh6I|LO=)z0U;m+gn$qb0zyCt2mv8*x)I1ycBbE6HzJB$8|1|_ zx$l1ni*mT?fy)ip`(KGw1WEn>5BmE5Uy%O4$5B*5KnMr{As_^VfDjM@LO=)z0U;m+ zPA!4-QGiW|&~isr#9T>$TM2p5s(wZYb#25ehX?B|tQinPOJN&{yx_Ofhg>-0sH?olBng@E7 zQT~;vHRzC+pgQ8J;XIsyZvA?#o9VNW1@%u| z+u1(-s85{>wF5gL=fxO(c5t%;QOkvzC(ZoF<`A@ax<mJF;A5MCH-I zxXeL1I1*uwh|Z`eGRv0VJG3ijbX1M?7ec6eT=%cm*Q8)aaTrsbf|nRta`;A+YjbX%a6Rx+Y>s6^LQ_Hbif$IaNR8y=}rCN!kSZTpN0sOUi zzF?|0B_1?RL=)*&@MQ!SeYC)EmW=_$6tI=Rh%r)FXFrrU=Nn5IDWVMYPYxj<1cZPP z5CTF#2nYcoAOwVf5D)@F;Ort0au&szqQA$>}HoWf5sdnUE2nYcoAOwVf z5D)@FKnMr{As_^Vz!VWERQuo)gwErRdhsVe{qj%le73?~8AOe$RNM5q17CDsr*`9R zood4WAMQRsq$)!DPaq;26@OPI{nn}?Y&kGmp+X%e;PbJZ7OFNFnYyvH5_(M-?dVsB&N9Gdgw6dl&3Y$ z!d)g^@GA>EtwAmfvS@%meOiM!wi48v5Aw?nS!y;M*@X{fI2X%I#7qDdPZzU1W6AQyh;YP&WJe2IYuc}QMfk_*VZ(15w1b3#>XcZ*b= z*%Fc4Gng$J43d7vN_AmyC|?f#t{7CT@P#+9S%DkP_0_W_|k{_UhP8{+|1PO+MqXxUk6;bAxvYlO}jN=4uTD1 zIIIriH0plstBEOn>`labFZ^SwjPGV+M{e%er9%c#6t^(WJQczJ44ksjqb@1(PY4JB zAs_^VfDjM@LO=)z0UP!As_^VfDjM@ zLO=)zfis;zePfxLjYNz;MvbZN&iE%^l?6P8kAlq?gO zuy&aaa1QTys@)_P4e#s#L2h-dHts z?GL+02PWX}m{z{=>0jw@1|(Uy?T?vyb3L=Zxd>~KIZVct%zd;sVl87ZETQIRd_neq zq&}tIuik)l&Ji_wG?BgnB$Mg;{`Yvysrch(jHeg{Rp0*Z-+ubj--&H{+miRZ@~WbL zdWQ{eGS}Ds=Zrb;?Rcgl$?drad>ghB>_RGw-2dCubTkCQa0zyCt2mv7=1cZPP5CTF#2nYcoAOy|=0{ - - - The UCanAccess Translator Test VDB - - - - - - - - - - - - - 100') FROM T20; - - ]]> - -