AW: Dods: How to dynamically create db tables with DODS?
"Madl Alfred" <[email protected]> Sat, 29 Nov 2003 11:04:41 +0100
| Newsgroups | gmane.comp.java.enhydra.dods |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format. ------=_NextPart_000_0069_01C3B668.9690EC80 Content-Type: multipart/alternative; boundary="----=_NextPart_001_006A_01C3B668.9690EC80" ------=_NextPart_001_006A_01C3B668.9690EC80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi ! =20 Currently DODS does not support dynmic table creation. =20 BUT: DODS 5.1 now cleanly supports project specific generator templates ! =20 So I think it should be rather easy to adopt the new templates (we had to rewrite them completely for caching and because of MANY bugs in the old templates) for your needs. We (and you) should not need a new DODS release at all for doing that. Just specify the path of the extended templates during the generation step... =20 Yes, we will help you to migrate your templates... =20 Greetings. =20 Alfred -----Urspr=FCngliche Nachricht----- Von: Mathieu MANGEOT-NAGATA [mailto:[email protected]]=20 Bereitgestellt: Donnerstag, 27. November 2003 04:21 Bereitgestellt in: DODS Unterhaltung: Dods: How to dynamically create db tables with DODS? Betreff: Dods: How to dynamically create db tables with DODS? Dear list members,=20 We are working with DODS/Enhydra for about 3 years now.=20 Our website can be viewed at: http://www.papillon-dictionary.org=20 We began the project with Enhydra 3.1and DODS 3.1.=20 Then we moved to Enhydra 5.0, while keeping DODS 3.1.=20 Our next step would be t use enhydra 5.1 with DODS 5.1 but we have a small=20 adaptation problem:=20 When we started the project, we were not specialists of the jdbc and communication with databases=20 in general. Thus, we relied entirely on the DODS generated files for the data layer.=20 Then the project got complicated and I had to create dynamically database tables and query them.=20 I did not find a way to generate appropriate code with DODS so I hacked the DODS output in order=20 to generate dynamically these tables.=20 Our website is managing dictionaries. We create one table for each dictionary volume and we can dynamically=20 add a dictionary on the server.=20 First, I generated a template table (VolumeEntry) that I clone afterwards. I hacked the DO class code by using a variable=20 for the name of the table. Then, I must give the name of the table as an argument when I call the DO methods:=20 public class VolumeEntryDO extends com.lutris.dods.builder.generator.dataobject.GenericDO implements VolumeEntryDOI, java.io.Serializable {=20 /**=20 * I added a variable for the name of the table :=20 */=20 protected String dbtablename;=20 public String getTableName() {=20 return dbtablename;=20 }=20 public void setTableName(String name) {=20 dbtablename =3D name;=20 }=20 /**=20 * static final RDBColumn PrimaryKey for use with QueryBuilder.=20 * See example above.=20 * Then I give the name of the table as a parameter for the methods:=20 */=20 public static RDBColumn getPrimaryKey(String tablename) {=20 RDBTable table =3D new RDBTable(tablename);=20 return new RDBColumn( table,=20 getPrimaryKeyName() );=20 }=20 I hacked also the Query class code by giving the table name (tablename) as a parameter for the constructor:=20 public class VolumeEntryQuery implements Query {=20 private QueryBuilder builder;=20 private String dbtablename;=20 /**=20 * Public constructor.=20 */=20 public VolumeEntryQuery(String tablename) {=20 dbtablename =3D tablename;=20 builder =3D new QueryBuilder( tablename, tablename + ".*" );=20 builder.setDatabaseVendor( "PostgreSQL" );=20 builder.setStringMatchDetails( "LIKE", "%" );=20 reset();=20 }=20 Then I created code from the .sql generated files in order to dynamically create new tables:=20 try {=20 myDbConnection =3D Enhydra.getDatabaseManager().allocateConnection();=20 myDbConnection.execute("CREATE TABLE" + tablename + " (" +=20 "headword TEXT DEFAULT '\'''\'' ," +=20 "id VARCHAR(255) DEFAULT '\'''\'' ," +=20 "pos VARCHAR(255) DEFAULT '\'''\'' ," +=20 "pronunciation VARCHAR(255) DEFAULT '\'''\'' ," +=20 "reading VARCHAR(255) DEFAULT '\'''\'' ," +=20 "translation TEXT DEFAULT '\'''\'' ," +=20 "key1 VARCHAR(255) DEFAULT '\'''\'' ," +=20 "key2 VARCHAR(255) DEFAULT '\'''\'' ," +=20 "xmlCode TEXT DEFAULT '\'''\'' NOT NULL ," +=20 "ObjectId DECIMAL(19,0) NOT NULL PRIMARY KEY," +=20 "ObjectVersion INTEGER NOT NULL)";=20 } catch(SQLException se) {=20 se.printStackTrace();=20 }=20 So far, we had no problem with these code modifications and we were pleased with that.=20 But the problem comes from the modifications of DODS from the 3.1 version to the new 5.1 version.=20 The new features: DO LRU caching, Query LRU caching, cache initialization=20 complicate very much the code generated by DODS and now, it is almost impossible to hack the new DO and Query codes=20 in order to generate tables dynamically. Thus we are sticked with the old version of DODS.=20 Here are my questions then:=20 1) Is there an option in the new DODS that allows one to generate code for dynamically creating database tables?=20 I maybe did not read carefully the doc.=20 2) If not, is there anyone who developped his/her own solution for dynamically creating database tables?=20 3) Is the DODS team interested in such a feature for a next release in DODS? In this case, we may try to patch the existing=20 DODS with the help of DODS team and then integrate this patch as an option in DODS for dynamically creating dbtables.=20 4) If nothing is possible, is there a way to use the old DODS (3.1) with the new Enhydra (5.1)=20 Thank you for your answers,=20 Mathieu=20 ------=_NextPart_001_006A_01C3B668.9690EC80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>Nachricht</TITLE> <META http-equiv=3DContent-Type content=3D"text/html; = charset=3Diso-8859-1"> <META content=3D"MSHTML 6.00.2800.1264" name=3DGENERATOR></HEAD> <BODY> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN = class=3D280240010-29112003>Hi=20 !</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003>Currently DODS does not support dynmic table=20 creation.</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN = class=3D280240010-29112003>BUT:=20 DODS 5.1 now cleanly supports project specific generator templates=20 !</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN = class=3D280240010-29112003>So I=20 think it should be rather easy to adopt the new templates (we had to = rewrite=20 them completely for caching and because of MANY bugs in the old = templates) for=20 your needs. We (and you) should not need a new DODS release at all for = doing=20 that. Just specify the path of the extended templates during the = generation=20 step...</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN = class=3D280240010-29112003>Yes,=20 we will help you to migrate your templates...</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003>Greetings.</SPAN></FONT></DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003></SPAN></FONT> </DIV> <DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20 class=3D280240010-29112003>Alfred</SPAN></FONT></DIV> <DIV></DIV> <DIV><FONT face=3DTahoma size=3D2>-----Urspr=FCngliche = Nachricht-----<BR><B>Von:</B>=20 Mathieu MANGEOT-NAGATA [mailto:[email protected]] = <BR><B>Bereitgestellt:</B>=20 Donnerstag, 27. November 2003 04:21<BR><B>Bereitgestellt in:</B>=20 DODS<BR><B>Unterhaltung:</B> Dods: How to dynamically create db tables = with=20 DODS?<BR><B>Betreff:</B> Dods: How to dynamically create db tables with=20 DODS?<BR><BR></DIV></FONT> <BLOCKQUOTE style=3D"MARGIN-RIGHT: 0px"><!-- Converted from = text/enriched format --><BR><BR> <DIV>Dear list members, </DIV><BR> <DIV>We are working with DODS/Enhydra for about 3 years now. </DIV> <DIV>Our website can be viewed at: http://www.papillon-dictionary.org=20 </DIV><BR> <DIV>We began the project with Enhydra 3.1and DODS 3.1. </DIV> <DIV>Then we moved to Enhydra 5.0, while keeping DODS 3.1. </DIV><BR> <DIV>Our next step would be t use enhydra 5.1 with DODS 5.1 but we = have a=20 small </DIV> <DIV>adaptation problem: </DIV> <DIV>When we started the project, we were not specialists of the jdbc = and=20 communication with databases </DIV> <DIV>in general. Thus, we relied entirely on the DODS generated files = for the=20 data layer. </DIV> <DIV>Then the project got complicated and I had to create dynamically = database=20 tables and query them. </DIV> <DIV>I did not find a way to generate appropriate code with DODS so I = hacked=20 the DODS output in order </DIV> <DIV>to generate dynamically these tables. </DIV> <DIV>Our website is managing dictionaries. We create one table for = each=20 dictionary volume and we can dynamically </DIV> <DIV>add a dictionary on the server. </DIV><BR> <DIV>First, I generated a template table (VolumeEntry) that I clone=20 afterwards. I hacked the DO class code by using a variable </DIV> <DIV>for the name of the table. Then, I must give the name of the = table as an=20 argument when I call the DO methods: </DIV><BR> <DIV><TT><SMALL><FONT color=3D#760f50>public</FONT> <FONT=20 color=3D#760f50>class</FONT> VolumeEntryDO <FONT = color=3D#760f50>extends</FONT>=20 com.lutris.dods.builder.generator.dataobject.GenericDO <FONT=20 color=3D#760f50>implements</FONT> VolumeEntryDOI, java.io.Serializable = {=20 </DIV><BR> <DIV><FONT color=3D#236e25>/** </DIV> <DIV></FONT><FONT color=3D#236e25>*</FONT> I added a variable for the = name of=20 the table : <FONT color=3D#236e25></DIV> <DIV>*/</FONT> </DIV> <DIV><FONT color=3D#760f50>protected</FONT> String dbtablename; = </DIV><BR> <DIV><FONT color=3D#760f50>public</FONT> String getTableName() { = </DIV> <DIV><FONT color=3D#760f50>return</FONT> dbtablename; </DIV> <DIV>} </DIV><BR> <DIV><FONT color=3D#760f50>public</FONT> <FONT = color=3D#760f50>void</FONT>=20 setTableName(String name) { </DIV> <DIV>dbtablename =3D name; </DIV> <DIV>} </DIV> <DIV></DIV> <DIV></DIV> <DIV><FONT color=3D#236e25>/** </DIV> <DIV>* static final RDBColumn PrimaryKey for use with QueryBuilder. = </DIV> <DIV>* See example above. </DIV> <DIV></FONT><FONT color=3D#236e25>* Then I give the name of the table = as a=20 parameter for the methods:</FONT><FONT color=3D#236e25> </DIV> <DIV>*/</FONT> </DIV> <DIV><FONT color=3D#760f50>public</FONT> <FONT = color=3D#760f50>static</FONT>=20 RDBColumn getPrimaryKey(String tablename) { </DIV> <DIV>RDBTable table =3D <FONT color=3D#760f50>new</FONT> = RDBTable(tablename);=20 </DIV> <DIV><FONT color=3D#760f50>return</FONT> <FONT = color=3D#760f50>new</FONT>=20 RDBColumn( table, </DIV> <DIV>getPrimaryKeyName() ); </DIV><BR> <DIV>} </DIV> <DIV></SMALL></TT></DIV> <DIV>I hacked also the Query class code by giving the table name=20 (<TT><SMALL>tablename</SMALL></TT>) as a parameter for the = constructor:=20 </DIV><BR> <DIV><TT><FONT color=3D#760f50><SMALL>public</SMALL></FONT><SMALL> = <FONT=20 color=3D#760f50>class</FONT> VolumeEntryQuery <FONT=20 color=3D#760f50>implements</FONT> Query { </DIV><BR><BR> <DIV><FONT color=3D#760f50>private</FONT> QueryBuilder builder; </DIV> <DIV><FONT color=3D#760f50>private</FONT> String dbtablename; = </DIV><BR> <DIV><FONT color=3D#236e25>/** </DIV> <DIV>* Public constructor. </DIV> <DIV>*/</FONT> </DIV> <DIV><FONT color=3D#760f50>public</FONT> VolumeEntryQuery(String = tablename) {=20 </DIV> <DIV>dbtablename =3D tablename; </DIV> <DIV>builder =3D <FONT color=3D#760f50>new</FONT> QueryBuilder( = tablename,=20 tablename + <FONT color=3D#891315>".*"</FONT> ); </DIV> <DIV>builder.setDatabaseVendor( <FONT = color=3D#891315>"PostgreSQL"</FONT> );=20 </DIV> <DIV>builder.setStringMatchDetails( <FONT = color=3D#891315>"LIKE"</FONT>, <FONT=20 color=3D#891315>"%"</FONT> ); </DIV> <DIV>reset(); </DIV> <DIV>} </DIV><BR> <DIV></SMALL></TT>Then I created code from the .sql generated files in = order=20 to dynamically create new tables: </DIV> <DIV><TT><SMALL><FONT color=3D#760f50>try</FONT> {</SMALL></TT> </DIV> <DIV><TT><SMALL>myDbConnection =3D=20 Enhydra.getDatabaseManager().allocateConnection(); </DIV><BR> <DIV>myDbConnection.execute(<FONT color=3D#891315>"CREATE TABLE" = </FONT>+=20 tablename + <FONT color=3D#891315>" ("</FONT> + </DIV> <DIV><FONT color=3D#891315>"headword TEXT DEFAULT '\'''\'' ,"</FONT> + = </DIV> <DIV><FONT color=3D#891315>"id VARCHAR(255) DEFAULT '\'''\'' ,"</FONT> = + </DIV> <DIV><FONT color=3D#891315>"pos VARCHAR(255) DEFAULT '\'''\'' = ,"</FONT> + </DIV> <DIV><FONT color=3D#891315>"pronunciation VARCHAR(255) DEFAULT = '\'''\''=20 ,"</FONT> + </DIV> <DIV><FONT color=3D#891315>"reading VARCHAR(255) DEFAULT '\'''\'' = ,"</FONT> +=20 </DIV> <DIV><FONT color=3D#891315>"translation TEXT DEFAULT '\'''\'' = ,"</FONT> + </DIV> <DIV><FONT color=3D#891315>"key1 VARCHAR(255) DEFAULT '\'''\'' = ,"</FONT> +=20 </DIV> <DIV><FONT color=3D#891315>"key2 VARCHAR(255) DEFAULT '\'''\'' = ,"</FONT> +=20 </DIV> <DIV><FONT color=3D#891315>"xmlCode TEXT DEFAULT '\'''\'' NOT NULL = ,"</FONT> +=20 </DIV><BR> <DIV><FONT color=3D#891315>"ObjectId DECIMAL(19,0) NOT NULL PRIMARY = KEY,"</FONT>=20 + </DIV> <DIV><FONT color=3D#891315>"ObjectVersion INTEGER NOT NULL)"</FONT>; = </DIV> <DIV></DIV> <DIV>} <FONT color=3D#760f50>catch</FONT>(SQLException se) { </DIV> <DIV>se.printStackTrace(); </DIV> <DIV></SMALL></TT><TT><SMALL>} </DIV><BR> <DIV></SMALL></TT>So far, we had no problem with these code = modifications and=20 we were pleased with that. </DIV><BR> <DIV>But the problem comes from the modifications of DODS from the 3.1 = version=20 to the new 5.1 version. </DIV> <DIV>The new features: <FONT face=3DArial><SMALL>DO LRU caching, Query = LRU=20 caching, cache initialization </SMALL></FONT></DIV> <DIV>complicate very much the code generated by DODS and now, it is = almost=20 impossible to hack the new DO and Query codes </DIV> <DIV>in order to generate tables dynamically. Thus we are sticked with = the old=20 version of DODS. </DIV><BR> <DIV>Here are my questions then: </DIV><BR> <DIV>1) Is there an option in the new DODS that allows one to generate = code=20 for dynamically creating database tables? </DIV> <DIV>I maybe did not read carefully the doc. </DIV><BR> <DIV>2) If not, is there anyone who developped his/her own solution = for=20 dynamically creating database tables? </DIV><BR> <DIV>3) Is the DODS team interested in such a feature for a next = release in=20 DODS? In this case, we may try to patch the existing </DIV> <DIV>DODS with the help of DODS team and then integrate this patch as = an=20 option in DODS for dynamically creating dbtables. </DIV><BR> <DIV>4) If nothing is possible, is there a way to use the old DODS = (3.1) with=20 the new Enhydra (5.1) </DIV><BR> <DIV>Thank you for your answers, </DIV><BR> <DIV>Mathieu </DIV> <DIV></DIV><BR></BLOCKQUOTE></BODY></HTML> ------=_NextPart_001_006A_01C3B668.9690EC80-- ------=_NextPart_000_0069_01C3B668.9690EC80 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIII2jCCAmIw ggHLoAMCAQICAwsPZTANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVt YWlsIElzc3VpbmcgQ0EwHhcNMDMxMTAyMTcyODQyWhcNMDQxMTAxMTcyODQyWjBZMQ0wCwYDVQQE EwRNYWRsMQ8wDQYDVQQqEwZBbGZyZWQxFDASBgNVBAMTC0FsZnJlZCBNYWRsMSEwHwYJKoZIhvcN AQkBFhJBLk1hZGxAdG9nZXRoZXIuYXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMSUz0lI gbjM8T5YPR5N2zkqHZCEQnP6hHG2LfUAVkssM+ArKJWrxPrfpNJrggv1SWBII3qeHOaZZbHeHLTc Ji3xxEduLuM9dUcxEOgYc+4Q3mw4O2IVJN343rHuzEtFktOJWMpoSZihy8OHhsaukhOMFGDo/2Lp D0nLRQS5v4OlAgMBAAGjLzAtMB0GA1UdEQQWMBSBEkEuTWFkbEB0b2dldGhlci5hdDAMBgNVHRMB Af8EAjAAMA0GCSqGSIb3DQEBBAUAA4GBAKnq3350qe6y9F+qnEhU8wwmW7sFvYgbVJubU/lrdm/D 0SsUci6e7b3aOr0T60Ubl9J4BPAmfy0pBBBKfrKHvHzuUJCiNItLXe2xf3sFCakK9qUmH8897o9Q fseb+Gll7EOkWyh6cvq5+7J9q9dwLOQ5omDQXicZvXTSmsORjUdiMIIDLTCCApagAwIBAgIBADAN BgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAG A1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2Vy dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZy ZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tMB4X DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxX ZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1Ro YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1h aWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG2 6nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3EfQDim AKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqYx7Hao5iR/Xnb5VrEHLkC AwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk 8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBH H7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei gTCCAz8wggKooAMCAQICAQ0wDQYJKoZIhvcNAQEFBQAwgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQI EwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1 bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMT G1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJl ZW1haWxAdGhhd3RlLmNvbTAeFw0wMzA3MTcwMDAwMDBaFw0xMzA3MTYyMzU5NTlaMGIxCzAJBgNV BAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNU aGF3dGUgUGVyc29uYWwgRnJlZW1haWwgSXNzdWluZyBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAxKY8VXNV+065yplaHmjAdQRwnd/p/6Me7L3N9VvyGna9fww6YfK/Uc4B1OVQCjDXAmNa LIkVcI7dyfArhVqqP3FWy688Cwfn8R+RNiQqE88r1fOCdz0Dviv+uxg+B79AgAJk16emu59l0cUq VIUPSAR/p7bRPGEEQB5kGXJgt/sCAwEAAaOBlDCBkTASBgNVHRMBAf8ECDAGAQH/AgEAMEMGA1Ud HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVQZXJzb25hbEZyZWVtYWls Q0EuY3JsMAsGA1UdDwQEAwIBBjApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRUHJpdmF0ZUxhYmVs Mi0xMzgwDQYJKoZIhvcNAQEFBQADgYEASIzRUIPqCy7MDaNmrGcPf6+svsIXoUOWlJ1/TCG4+DYf qi2fNi/A9BxQIJNwPP2t4WFiw9k6GX6EsZkbAMUaC4J0niVQlGLH2ydxVyWN3amcOY6MIE9lX5Xa 9/eH1sYITq726jTlEBpbNU1341YheILcIRk13iSx0x1G/11fZU8xggMcMIIDGAIBATBpMGIxCzAJ BgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQD EyNUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgSXNzdWluZyBDQQIDCw9lMAkGBSsOAwIaBQCgggIJ MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAzMTEyOTEwMDQ0MVow IwYJKoZIhvcNAQkEMRYEFGp0Ot1d8D2rrRDoU5jygOri10gaMEsGCyqGSIb3DQEJEAIBMTwwOgQd AAAAABAAAABYl1WA50D6S4fN2EXduC+nAQAAAACAAQAwFjAUgRJBLk1hZGxAdG9nZXRoZXIuYXQw ZwYJKoZIhvcNAQkPMVowWDAKBggqhkiG9w0DBzAHBgUrDgMCGjAOBggqhkiG9w0DAgICAIAwDQYI KoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwCgYIKoZIhvcNAgUweAYJKwYBBAGC NxAEMWswaTBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg THRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIElzc3VpbmcgQ0ECAwsPZTB6 BgsqhkiG9w0BCRACCzFroGkwYjELMAkGA1UEBhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0 aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5n IENBAgMLD2UwDQYJKoZIhvcNAQEBBQAEgYBsA7uvWuVQ0pP41eJuyf3po5OWsFrKUVTcR7GcEXDg 2jafT2V+aY0ZrCrO38tLjVLpSLTCq6iVbTiyuGVJXj2knerTflBycR5NFk8r10BlB47spE8zwzR6 NbcJSREJVXZMPKHrV3XHCk9PcXiyY7hbYDHbBDJ7XYH50EzeWULUpgAAAAAAAA== ------=_NextPart_000_0069_01C3B668.9690EC80--