DBI/0000755000175100001440000000000012142672717010677 5ustar hornikusersDBI/MD50000644000175100001440000000300012142672717011200 0ustar hornikusers3bca877cf52647b8221330f0aa86525d *DESCRIPTION f0c336b7e23bf19ae9ce1cf79bad79a3 *NAMESPACE 3dc2a00ac59e22e06614af00cadeb183 *R/DBI.R f5b2fb5ef2aa0ab237bc08b0288872d3 *R/Util.R 807773b767201e73f9aaaf5114831ac1 *R/zzz.R a6cdd130fd6a39b59d69913fc9764e24 *inst/NEWS 1bf1f66f982e2809aeb67f8c48ec71eb *inst/TODO 4d7e4e45aa0c67165a76849c98eb32b5 *inst/doc/DBI.R 6ea5a2220f6e1680c6f7b8b7d911392d *inst/doc/DBI.Rnw 6e0dbaf13420e604044e4bff71aed186 *inst/doc/DBI.pdf 1c73d69eca009d56f6fe4ffe1401c13c *inst/doc/biblio.bib 42726a6f197ca8e2256828c2535cbc2d *inst/doc/figure1.pdf f2eef96e8e9a0ce20fcba2ae548bcf5c *man/DBI-internal.Rd fa34bb4cd3e758be72ffe5d171fba028 *man/DBIConnection-class.Rd b607090137148606195ece23e0500caa *man/DBIDriver-class.Rd 6dfd542dd524a8a6bfce7c910f433a36 *man/DBIObject-class.Rd c6a7af100befd0dfd9f7c180138dba5b *man/DBIResult-class.Rd 55168caf5845842721f7aa110715ebd6 *man/dbCallProc.Rd f69746c2a3bdb4b1b776e5b74484bcd5 *man/dbCommit.Rd 6e31210a5176e0fc9dfe41f16b885a86 *man/dbConnect.Rd 5aa4e30163c0ed0eb4d1295d04598c9c *man/dbDataType.Rd e63a20c58adfd08452b158bff30856a1 *man/dbDriver.Rd 83dd7a74122ac0578739264e0866d1a9 *man/dbGetInfo.Rd f3cacab14d001ad46a65ed36f1484d45 *man/dbListTables.Rd 180d6159df9b3ee5a39dd0106bc04108 *man/dbReadTable.Rd 924206604e6dbf827fdd9b73905947ab *man/dbSendQuery.Rd 0028527a8962e37c73111bf1294f9eb8 *man/dbSetDataMappings.Rd 1da0ce75b07b07867c41f340478fa656 *man/fetch.Rd d56daa962819a19a7f1338fabc4cea9c *man/make.db.names.Rd 4cf73543ff477ae3b7ad62405d163140 *man/print.list.pairs.Rd DBI/man/0000755000175100001440000000000012134704761011446 5ustar hornikusersDBI/man/print.list.pairs.Rd0000644000175100001440000000155412134704460015161 0ustar hornikusers\name{print.list.pairs} \alias{print.list.pairs} \alias{print} \alias{summary} \alias{format} \title{Support functions} \description{ Some of these functions are conditionally elevated to generic functions (e.g., \code{print}, \code{summary}). Others are low-level support functions. } \usage{ \method{print}{list.pairs}(x, ...) } \arguments{ \item{x}{a list of key, value pairs} \item{\dots}{additional arguments to be passed to \code{cat}} } \value{ the (invisible) value of x. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{print.default}}, \code{\link{summary.default}}, \code{\link{cat}}. } \examples{\dontrun{ print.list.pairs(list(a = 1, b = 2)) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/make.db.names.Rd0000644000175100001440000001017311305301462014330 0ustar hornikusers% $Id$ \name{make.db.names} \alias{make.db.names} \alias{make.db.names,DBIObject,character-method} \alias{SQLKeywords} \alias{SQLKeywords,DBIObject-method} \alias{SQLKeywords,missing-method} \alias{isSQLKeyword} \alias{isSQLKeyword,DBIObject,character-method} \title{ Make R/Splus identifiers into legal SQL identifiers } \description{ Produce legal SQL identifiers from a character vector. } \usage{ make.db.names(dbObj, snames, keywords, unique=TRUE, allow.keywords=TRUE, ...) SQLKeywords(dbObj, ...) isSQLKeyword(dbObj, name, keywords=.SQL92Keywords, case=c("lower", "upper", "any")[3], ...) } \arguments{ \item{dbObj}{ any DBI object (e.g., \code{DBIDriver}). } \item{snames}{ a character vector of R/Splus identifiers (symbols) from which we need to make SQL identifiers. } \item{name}{ a character vector with database identifier candidates we need to determine whether they are legal SQL identifiers or not. } \item{unique}{ logical describing whether the resulting set of SQL names should be unique. Its default is \code{TRUE}. Following the SQL 92 standard, uniqueness of SQL identifiers is determined regardless of whether letters are upper or lower case. } \item{allow.keywords }{ logical describing whether SQL keywords should be allowed in the resulting set of SQL names. Its default is \code{TRUE} } \item{keywords}{ a character vector with SQL keywords, by default it's \code{.SQL92Keywords} defined by the DBI. } \item{case}{ a character string specifying whether to make the comparison as lower case, upper case, or any of the two. it defaults to \code{any}. } \item{\dots}{ any other argument are passed to the driver implementation. } } \value{ \code{make.db.names} returns a character vector of legal SQL identifiers corresponding to its \code{snames} argument. \code{SQLKeywords} returns a character vector of all known keywords for the database-engine associated with \code{dbObj}. \code{isSQLKeyword} returns a logical vector parallel to \code{name}. } \details{ The algorithm in \code{make.db.names} first invokes \code{make.names} and then replaces each occurrence of a dot ``.'' by an underscore ``\_''. If \code{allow.keywords} is \code{FALSE} and identifiers collide with SQL keywords, a small integer is appended to the identifier in the form of \code{"_n"}. The set of SQL keywords is stored in the character vector \code{.SQL92Keywords} and reflects the SQL ANSI/ISO standard as documented in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily override or update this vector. } \section{Bugs}{ The current mapping is not guaranteed to be fully reversible: some SQL identifiers that get mapped into S identifiers with \code{make.names} and then back to SQL with \code{\link{make.db.names}} will not be equal to the original SQL identifiers (e.g., compound SQL identifiers of the form \code{username.tablename} will loose the dot ``.''). } \references{ The set of SQL keywords is stored in the character vector \code{.SQL92Keywords} and reflects the SQL ANSI/ISO standard as documented in "X/Open SQL and RDA", 1994, ISBN 1-872630-68-8. Users can easily override or update this vector. See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbReadTable}}, \code{\link{dbWriteTable}}, \code{\link{dbExistsTable}}, \code{\link{dbRemoveTable}}, \code{\link{dbListTables}}. } \examples{\dontrun{ # This example shows how we could export a bunch of data.frames # into tables on a remote database. con <- dbConnect("Oracle", user="iptraffic", pass = pwd) export <- c("trantime.email", "trantime.print", "round.trip.time.email") tabs <- make.db.names(export, unique = T, allow.keywords = T) for(i in seq(along = export) ) dbWriteTable(con, name = tabs[i], get(export[i])) # Oracle's extensions to SQL keywords oracle.keywords <- c("CLUSTER", "COLUMN", "MINUS", "DBNAME") isSQLKeyword(nam, c(.SQL92Keywords, oracle.keywords)) [1] T T T F } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/fetch.Rd0000644000175100001440000000427610613702436013034 0ustar hornikusers% $Id$ \name{fetch} \alias{fetch} \title{ Fetch records from a previously executed query } \description{ Fetch records from a previously executed query. } \usage{ fetch(res, n, ...) } \arguments{ \item{res}{ a result set object (one whose class extends \code{DBIResult}). This object needs to be the result of a statement that produces output, such as SQL's \code{SELECT} or \code{SELECT}-like statement, this object \code{res} is typically produced by a call to or \code{dbSendQuery}. } \item{n}{ maximum number of records to retrieve per fetch. Use \code{n = -1} to retrieve all pending records. Some implementations may recognize other special values. } \item{\dots }{ any other database-engine specific arguments. } } \value{ a data.frame with as many rows as records were fetched and as many columns as fields in the result set. } \section{Side Effects}{ As the R/Splus client fetches records the remote database server updates its cursor accordingly. } \details{ See the notes for the various database server implementations. } \note{ Make sure you close the result set with \code{\link{dbClearResult}} as soon as you finish retrieving the records you want. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbConnect}}, \code{\link{dbSendQuery}}, \code{\link{dbGetQuery}}, \code{\link{dbClearResult}}, \code{\link{dbCommit}}, \code{\link{dbGetInfo}}, \code{\link{dbReadTable}}. } \examples{\dontrun{ # Run an SQL statement by creating first a resultSet object drv <- dbDriver("ODBC") con <- dbConnect(drv, ...) res <- dbSendQuery(con, statement = paste( "SELECT w.laser_id, w.wavelength, p.cut_off", "FROM WL w, PURGE P", "WHERE w.laser_id = p.laser_id", "ORDER BY w.laser_id")) # we now fetch the first 100 records from the resultSet into a data.frame data1 <- fetch(res, n = 100) dim(data1) dbHasCompleted(res) # let's get all remaining records data2 <- fetch(res, n = -1) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbSetDataMappings.Rd0000644000175100001440000000324710613702436015272 0ustar hornikusers% $Id$ \name{dbSetDataMappings} \alias{dbSetDataMappings} \title{ Set data mappings between an DBMS and R/Splus } \description{ Sets one or more conversion functions to handle the translation of DBMS data types to R/Splus objects. This is only needed for non-primitive data, since all DBI drivers handle the common base types (integers, numeric, strings, etc.) } \usage{ dbSetDataMappings(res, flds, ...) } \arguments{ \item{res}{ a \code{DBIResult} object as returned by \code{dbSendQuery}. } \item{flds}{ a field description object as returned by \code{dbColumnInfo}. } \item{\dots }{ any additional arguments are passed to the implementing method. } } \value{ a logical specifying whether the conversion functions were successfully installed or not. } \section{Side Effects}{ Conversion functions are set up to be invoked for each element of the corresponding fields in the result set. } \details{ The details on conversion functions (e.g., arguments, whether they can invoke initializers and/or destructors) have not been specified. } \note{ No driver has yet implemented this functionality. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbSendQuery}}, \code{\link{fetch}}, \code{\link{dbColumnInfo}}. } \examples{\dontrun{ makeImage <- function(x) { .C("make_Image", as.integer(x), length(x)) } res <- dbSendQuery(con, statement) flds <- dbColumnInfo(res) flds[3, "Sclass"] <- makeImage dbSetDataMappings(rs, flds) im <- fetch(rs, n = -1) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbSendQuery.Rd0000644000175100001440000000616110613702436014163 0ustar hornikusers% $Id$ \name{dbSendQuery} \alias{dbSendQuery} \alias{dbGetQuery} \alias{dbClearResult} \alias{dbGetException} \title{ Execute a statement on a given database connection } \description{ Submits and executes an arbitrary SQL statement on a specific connection. Also, clears (closes) a result set. } \usage{ dbSendQuery(conn, statement, ...) dbGetQuery(conn, statement, ...) dbClearResult(res, ...) dbGetException(conn, ...) } \arguments{ \item{conn}{ a connection object. } \item{statement}{ a character vector of length 1 with the SQL statement. } \item{res}{ a result set object (i.e., the value of \code{dbSendQuery}). } \item{\dots }{ database-specific parameters may be specified. } } \value{ \code{dbSendQuery} returns a result set object, i.e., an object that inherits from \code{DBIResult}; if the statement generates output (e.g., a \code{SELECT} statement) the result set can be used with \code{\link{fetch}} to extract records. \code{dbGetQuery} returns a data.frame with the output (if any) of the query. \code{dbClearResult} returns a logical indicating whether clearing the result set was successful or not. \code{dbGetException} returns a list with elements \code{errNum} (an integer error number) and \code{errMsg} (a character string) describing the last error in the connection \code{conn}. } \section{Side Effects}{ The statement is submitted for synchronous execution to the server connected through the \code{conn} object. The DBMS executes the statement, possibly generating vast amounts of data. Where these data reside is driver-specific: some drivers may choose to leave the output on the server and transfer them piecemeal to R/Splus, others may transfer all the data to the client -- but not necessarily to the memory that R/Splus manages. See the individual drivers' \code{\link{dbSendQuery}} method for implementation details. } \details{ The function \code{dbSendQuery} only submits and synchronously executes the SQL statement to the database engine. It does \emph{not} extracts any records --- for that you need to use the function \code{\link{fetch}} (make sure you invoke \code{dbClearResult} when you finish fetching the records you need). The function \code{dbGetQuery} does all these in one operation (submits the statement, fetches all output records, and clears the result set). \code{dbClearResult} frees all resources (local and remote) associated with a result set. It some cases (e.g., very large result sets) this can be a critical step to avoid exhausting resources (memory, file descriptors, etc.) } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbDriver}} \code{\link{dbConnect}} \code{\link{fetch}} \code{\link{dbCommit}} \code{\link{dbGetInfo}} \code{\link{dbReadTable}} } \examples{\dontrun{ drv <- dbDriver("MySQL") con <- dbConnect(drv) res <- dbSendQuery(con, "SELECT * from liv25") data <- fetch(res, n = -1) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbReadTable.Rd0000644000175100001440000000711112134704346014065 0ustar hornikusers% $Id$ \name{dbReadTable} \alias{dbReadTable} \alias{dbWriteTable} \alias{dbExistsTable} \alias{dbRemoveTable} \title{ Convenience functions for Importing/Exporting DBMS tables } \description{ These functions mimic their R/Splus counterpart \code{get}, \code{assign}, \code{exists}, \code{remove}, and \code{objects}, except that they generate code that gets remotely executed in a database engine. } \usage{ dbReadTable(conn, name, ...) dbWriteTable(conn, name, value, ...) dbExistsTable(conn, name, ...) dbRemoveTable(conn, name, ...) } \arguments{ \item{conn}{ a database connection object. } \item{name}{ a character string specifying a DBMS table name. } \item{value}{ a data.frame (or coercible to data.frame). } \item{\dots }{ any optional arguments that the underlying database driver supports, e.g. \describe{ \item{row.names}{ in the case of \code{dbReadTable}, this argument can be a string or an index specifying the column in the DBMS table to be used as \code{row.names} in the output data.frame (a \code{NULL}, \code{""}, or 0 specifies that no column should be used as \code{row.names} in the output). In the case of \code{dbWriteTable}, this argument should be a logical specifying whether the \code{row.names} should be output to the output DBMS table; if \code{TRUE}, the extra field name will be whatever the S identifier \code{"row.names"} maps to the DBMS (see \code{\link{make.db.names}}). } \item{overwrite}{ a logical specifying whether to overwrite an existing table or not. Its default is \code{FALSE}. } \item{append}{ a logical specifying whether to append to an existing table in the DBMS. Its default is \code{FALSE}. } } } } \value{ \code{dbReadTable} returns a data.frame; all other functions return \code{TRUE} or \code{FALSE} denoting whether the operation was successful or not. } \section{Side Effects}{ A DBMS statement is generated and remotely executed on a database engine; the result set it produces is fetched in its entirety. These operations may failed if the underlying database driver runs out of available connections and/or result sets, or the operation violates DBMS integrity constraints (e.g., attempting to write duplicate values on a field that's defined as a primary key). The semantics of \code{assign} are slightly extended to allow overwriting or appending to an existing table. } \note{The translation of identifiers between R/Splus and SQL is done through calls to \code{\link{make.names}} and \code{\link{make.db.names}}, but we cannot guarantee that the conversion is reversible. For details see \code{\link{make.db.names}}. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbDriver}}, \code{\link{dbConnect}}, \code{\link{dbSendQuery}}, \code{\link{dbGetQuery}}, \code{\link{fetch}}, \code{\link{dbCommit}}, \code{\link{dbGetInfo}}, \code{\link{dbListTables}}, \code{\link{dbReadTable}}. } \examples{\dontrun{ conn <- dbConnect("MySQL", group = "vitalAnalysis") con2 <- dbConnect("ODBC", "dsn", "user", "pwd") if(dbExistsTable(con2, "fuel_frame")){ fuel.frame <- dbReadTable(con2, "fuel_frame") dbRemoveTable(conn, "fuel_frame") dbWriteTable(conn, "fuel_frame", fuel.frame) } if(dbExistsTable(conn, "RESULTS")){ dbWriteTable(conn, "RESULTS", results2000, append = T) else dbWriteTable(conn, "RESULTS", results2000) } } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbListTables.Rd0000644000175100001440000000353510613702436014314 0ustar hornikusers% $Id$ \name{dbListTables} \alias{dbListTables} \alias{dbListFields} \alias{dbListConnections} \alias{dbListResults} \title{ List items from a remote DBMS and from objects that implement the database interface DBI. } \description{ List remote tables, fields of a remote table, opened connections and pending statements in a connection. } \usage{ dbListTables(conn, ...) dbListFields(conn, name, ...) dbListConnections(drv, ...) dbListResults(conn, ...) } \arguments{ \item{drv}{a driver object (e.g., \code{ODBC}, \code{Oracle})} \item{conn}{a connection object} \item{name}{a character string with the name of the remote table.} \item{\dots}{optional arguments for the actual driver implementation.} } \value{ \code{dbListTables} returns a character vector with the names of the tables in the remote database associated with the connection in \code{conn} object. \code{dbListFields} returns a character vector with the names of the fields of the \code{res} result object (it must be a query statement). \code{dbListConnections} returns a list of all currently open connections on driver \code{drv}. Drivers that implement single connections would return the one single connection object. \code{dbListResults} returns a list of objects for all pending results (statements) on the \code{conn} connection. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbGetInfo}}, \code{\link{dbColumnInfo}}, \code{\link{dbDriver}}, \code{\link{dbConnect}}, \code{\link{dbSendQuery}} } \examples{\dontrun{ odbc <- dbDriver("ODBC") # after working awhile... for(con in dbListConnections(odbc)){ dbGetStatement(dbListResults(con)) } } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbGetInfo.Rd0000644000175100001440000000702511313735505013600 0ustar hornikusers% $Id$ \name{dbGetInfo} \alias{dbGetInfo} \alias{dbGetDBIVersion} \alias{dbGetStatement} \alias{dbGetRowCount} \alias{dbGetRowsAffected} \alias{dbColumnInfo} \alias{dbHasCompleted} \title{ Database interface meta-data } \description{ Extract meta-data associated with various objects } \usage{ dbGetInfo(dbObj, ...) # meta-data for any DBIObject dbGetDBIVersion() # DBI version dbGetStatement(res, ...) # statement that produced result "res" dbGetRowCount(res, ...) # number of rows fetched so far dbGetRowsAffected(res, ...) # number of affected rows (e.g., DELETE) dbColumnInfo(res, ...) # result set data types dbHasCompleted(res, ...) # are there more rows to fetch on "res"? } \arguments{ \item{dbObj}{ any object that implements some functionality in the R/Splus interface to databases (a driver, a connection or a result set). } \item{res}{ refers to a \code{DBIResult} object. } \item{\dots}{ any driver-specific arguments. } } \value{ \code{dbGetDBIVersion} returns a character string with the version of the database interface API. \code{dbGetInfo} produces either a character vector or a named list of (name, value) pairs. \code{dbGetStatement} returns a character string with the statement associated with the result set \code{res}. \code{dbGetRowCount} returns the number of rows fetched so far. \code{dbGetRowsAffected} returns the number of affected rows (e.g., how many rows were deleted, inserted). Some drivers may set this to the total number of rows a query produces. \code{dbColumnInfo} returns a data.frame with one row per output field in \code{res}. The columns should report field name, field data type, scale and precision (as understood by the DBMS engine), whether the field can store \code{NULL} values, and possibly other DBMS-specific information. \code{dbHasCompleted} a logical describing whether the operations has been completed by the DBMS or not. } \details{ These functions implement a minimal set of meta-data describing the most important aspects of the R/Splus to DBMS interface. The \code{dbGetInfo} works very similarly to the function \code{options} in that it attempts to extract what the user may request, possibly NULL if it can't locate the specific piece of meta-data. } \section{Note}{ Meta-data associated with a driver should include the version of the package, plus the version of the underlying client library. Connection objects should report the version of the DBMS engine, database name, user, possibly password, etc. Results should include the statement being executed, how many rows have been fetched so far (in the case of queries), how many rows were affected (deleted, inserted, changed, or total number of records to be fetched). } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbDriver}}, \code{\link{dbConnect}}, \code{\link{dbSendQuery}}, \code{\link{dbGetQuery}}, \code{\link{fetch}}, \code{\link{dbCommit}}, \code{\link{dbGetInfo}}, \code{\link{dbListTables}}, \code{\link{dbReadTable}}. } \examples{\dontrun{ drv <- dbDriver("SQLite") con <- dbConnect(drv) dbListTables(con) rs <- dbSendQuery(con, query.sql) dbGetStatement(rs) dbHasCompleted(rs) info <- dbGetInfo(rs) names(dbGetInfo(drv)) # DBIConnection info names(dbGetInfo(con)) # DBIResult info names(dbGetInfo(rs)) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbDriver.Rd0000644000175100001440000000576510710114446013504 0ustar hornikusers% $Id$ \name{dbDriver} \alias{dbDriver} \alias{dbDriver,character-method} \alias{dbUnloadDriver} \title{ Database Interface (DBI) Classes and drivers } \description{ These \emph{virtual} classes and their methods define the interface to database management systems (DBMS). They are extended by packages or drivers that implement the methods in the context of specific DBMS (e.g., Berkeley DB, MySQL, Oracle, ODBC, PostgreSQL, SQLite). } \usage{ dbDriver(drvName, ...) dbUnloadDriver(drv, ...) ## free up all resources } \arguments{ \item{drvName}{ character name of the driver to instantiate. } \item{drv}{ an object that inherits from \code{DBIDriver} as created by \code{dbDriver}. } \item{...}{ any other arguments are passed to the driver \code{drvName}. } } \value{ In the case of \code{dbDriver}, an driver object whose class extends \code{DBIDriver}. This object may be used to create connections to the actual DBMS engine. In the case of \code{dbUnloadDriver}, a logical indicating whether the operation succeeded or not. } \section{Side Effects}{ The client part of the database communication is initialized (typically dynamically loading C code, etc.) but note that connecting to the database engine itself needs to be done through calls to \code{dbConnect}. } \details{ The virtual class \code{DBIDriver} defines the operations for creating connections and defining data type mappings. Actual driver classes, for instance \code{RPgSQL}, \code{RMySQL}, etc. implement these operations in a DBMS-specific manner. More generally, the DBI defines a very small set of classes and methods that allows users and applications access DBMS with a common interface. The virtual classes are \code{DBIDriver} that individual drivers extend, \code{DBIConnection} that represent instances of DBMS connections, and \code{DBIResult} that represent the result of a DBMS statement. These three classes extend the basic class of \code{DBIObject}, which serves as the root or parent of the class hierarchy. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbConnect}}, \code{\link{dbSendQuery}}, \code{\link{dbGetQuery}}, \code{\link{fetch}}, \code{\link{dbCommit}}, \code{\link{dbGetInfo}}, \code{\link{dbListTables}}, \code{\link{dbReadTable}}. } \examples{\dontrun{ # create a MySQL instance for capacity of up to 25 simultaneous # connections. m <- dbDriver("MySQL", max.con = 25) p <- dbDriver("PgSQL") # open the connection using user, password, etc., as con <- dbConnect(m, user="ip", password = "traffic", dbname="iptraffic") rs <- dbSubmitQuery(con, "select * from HTTP_ACCESS where IP_ADDRESS = '127.0.0.1'") df <- fetch(rs, n = 50) df2 <- fetch(rs, n = -1) dbClearResult(rs) pcon <- dbConnect(p, "user", "password", "dbname") dbListTables(pcon) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbDataType.Rd0000644000175100001440000000236310613702436013757 0ustar hornikusers% $Id$ \name{dbDataType} \alias{dbDataType} \alias{dbDataType,DBIObject-method} \alias{dbDataType.default} \title{ Determine the SQL Data Type of an S object } \description{ Determine an (approximately) appropriate SQL data type for an S object. } \usage{ dbDataType(dbObj, obj, ...) } \arguments{ \item{dbObj}{ a \code{DBIDriver} object, e.g., \code{ODBCDriver}, \code{OracleDriver}. } \item{obj}{ R/Splus object whose SQL type we want to determine. } \item{\dots }{ any other parameters that individual methods may need. } } \value{ A character string specifying the SQL data type for \code{obj}. } \details{ This is a generic function. The default method determines the SQL type of an R/Splus object according to the SQL 92 specification, which may serve as a starting point for driver implementations. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{isSQLKeyword}} \code{\link{make.db.names}} } \examples{\dontrun{ ora <- dbDriver("Oracle") sql.type <- dbDataType(ora, x) } } \keyword{interface} \keyword{database} % docclass is function % Converted by Sd2Rd version 1.15.2.1. % vim: syntax=tex DBI/man/dbConnect.Rd0000644000175100001440000000557210613702436013642 0ustar hornikusers% $Id$ \name{dbConnect} \alias{dbDisconnect} \alias{dbConnect} \title{ Create a connection to a DBMS } \description{ Connect to a DBMS going through the appropriate authorization procedure. } \usage{ dbConnect(drv, ...) dbDisconnect(conn, ...) } \arguments{ \item{drv}{ an object that inherits from \code{DBIDriver}, a character string specifying the DBMS driver, e.g., "RPgSQL", "ROracle", "Informix", or possibly another \code{dbConnect} object. } \item{conn}{ a connection object as produced by \code{dbConnect}. } \item{\dots }{ authorization arguments needed by the DBMS instance; these typically include \code{user}, \code{password}, \code{dbname}, \code{host}, \code{port}, etc. For details see the appropriate \code{DBIDriver}. } } \value{ An object that extends \code{DBIConnection} in a database-specific manner. For instance \code{dbConnect("MySQL")} produces an object of class \code{MySQLConnection}. This object is used to direct commands to the database engine. \code{dbDisconnect} returns a logical value indicating whether the operation succeeded or not. } \section{Side Effects}{ A connection between R/Splus and the database server is established, and the R/Splus program becomes a client of the database engine. Typically the connections is through the TCP/IP protocol, but this will depend on vendor-specific details. } \details{ Some implementations may allow you to have multiple connections open, so you may invoke this function repeatedly assigning its output to different objects. The authorization mechanism is left unspecified, so check the documentation of individual drivers for details. } \section{notes}{ Make sure you close the connection using \code{dbDisconnect(conn)} when it is not longer needed. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbConnect}} \code{\link{dbSendQuery}} \code{\link{dbGetQuery}} \code{\link{fetch}} \code{\link{dbCommit}} \code{\link{dbGetInfo}} \code{\link{dbReadTable}} } \examples{\dontrun{ # create an RODBC instance and create one connection. m <- dbDriver("RODBC") # open the connection using user, passsword, etc., as # specified in the file \file{\$HOME/.my.cnf} con <- dbConnect(m, dsn="data.source", uid="user", pwd="password")) # Run an SQL statement by creating first a resultSet object rs <- dbSendQuery(con, statement = paste( "SELECT w.laser_id, w.wavelength, p.cut_off", "FROM WL w, PURGE P", "WHERE w.laser_id = p.laser_id", "SORT BY w.laser_id") # we now fetch records from the resultSet into a data.frame data <- fetch(rs, n = -1) # extract all rows dim(data) } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbCommit.Rd0000644000175100001440000000250710613702436013474 0ustar hornikusers% $Id$ \name{dbCommit} \alias{dbCommit} \alias{dbRollback} \title{ DBMS Transaction Management } \description{ Commit/rollback SQL transactions } \usage{ dbCommit(conn, ...) dbRollback(conn, ...) } \arguments{ \item{conn}{ a \code{DBIConnection} object, as produced by the function \code{dbConnect}. } \item{\dots }{ any database-specific arguments. } } \value{ a logical indicating whether the operation succeeded or not. } \section{Side Effects}{ The current transaction on the connections \code{con} is committed or rolled back. } \details{ Not all database engines implement transaction management, older versions of MySQL, for instance. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \seealso{ \code{\link{dbConnect}} \code{\link{dbSendQuery}} \code{\link{dbGetQuery}} \code{\link{fetch}} \code{\link{dbCommit}} \code{\link{dbGetInfo}} \code{\link{dbReadTable}} } \examples{\dontrun{ ora <- dbDriver("Oracle") con <- dbConnect(ora) rs <- dbSendQuery(con, "delete * from PURGE as p where p.wavelength<0.03") if(dbGetInfo(rs, what = "rowsAffected") > 250){ warning("dubious deletion -- rolling back transaction") dbRollback(con) } } } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/dbCallProc.Rd0000644000175100001440000000110210613702436013731 0ustar hornikusers% $Id$ \name{dbCallProc} \alias{dbCallProc} \title{ Call an SQL stored procedure } \description{ Calls a stored procedure on a remote RDBMS } \usage{ dbCallProc(conn, ...) } \arguments{ \item{conn}{ a \code{DBIConnection} object. } \item{\dots }{ additional arguments are passed to the implementing method. } } \details{ Not yet implemented. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/DBIResult-class.Rd0000644000175100001440000000421110613702436014630 0ustar hornikusers% $Id$ \name{DBIResult-class} \docType{class} \alias{DBIResult-class} \title{Class DBIResult} \description{ Base class for all DBMS-specific result objects. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Extends}{ Class \code{"DBIObject"}, directly. } \section{Generator}{ The main generator is \code{\link{dbSendQuery}}. } \section{Methods}{ \describe{ Fetching methods: \item{\link{fetch}}{\code{signature(res = "DBIResult", n = "numeric")}: ... } \item{\link{fetch}}{\code{signature(res = "DBIResult", n = "missing")}: ... } Close result set: \item{\link{dbClearResult}}{\code{signature(res = "DBIResult")}: ... } Meta-data: \item{\link{dbColumnInfo}}{\code{signature(res = "DBIResult")}: ... } \item{\link{dbGetException}}{\code{signature(conn = "DBIResult")}: ... } \item{\link{dbGetInfo}}{\code{signature(dbObj = "DBIResult")}: ... } \item{\link{dbGetRowCount}}{\code{signature(res = "DBIResult")}: ... } \item{\link{dbGetRowsAffected}}{\code{signature(res = "DBIResult")}: ... } \item{\link{dbGetStatement}}{\code{signature(res = "DBIResult")}: ... } \item{\link{dbHasCompleted}}{\code{signature(res = "DBIResult")}: ... } \item{\link{dbListFields}}{\code{signature(conn = "DBIResult", name = "missing")}: ... } \item{summary}{\code{signature(object = "DBIResult")}: ... } \item{\link{coerce}}{\code{signature(from = "DBIConnection", to = "DBIResult")}: ... } } } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \author{R-SIG-DB} \seealso{ DBI classes: \code{\link{DBIObject-class}} \code{\link{DBIDriver-class}} \code{\link{DBIConnection-class}} \code{\link{DBIResult-class}} } \examples{\dontrun{ drv <- dbDriver("Oracle") con <- dbConnect(drv, "user/password@dbname") res <- dbSendQuery(con, "select * from LASERS where prdata > '2002-05-01'") summary(res) while(dbHasCompleted(res)){ chunk <- fetch(res, n = 1000) process(chunk) } } } \keyword{classes} \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/DBIObject-class.Rd0000644000175100001440000000263610613702436014571 0ustar hornikusers% $Id$ \name{DBIObject-class} \docType{class} \alias{DBIObject-class} \title{Class DBIObject} \description{ Base class for all other DBI classes (e.g., drivers, connections). } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Methods}{ Methods defined for classes that extend \code{DBIObject}: \describe{ \item{\link{dbDataType}}{\code{signature(dbObj = "DBIObject")}: ... } \item{\link{isSQLKeyword}}{\code{signature(dbObj = "DBIObject")}: ... } \item{\link{make.db.names}}{\code{signature(dbObj = "DBIObject")}: ... } \item{\link{SQLKeywords}}{\code{signature(dbObj = "DBIObject")}: ... } \item{\link{summary}}{\code{signature(object = "DBIObject")}: ... } } Plus many other specific to the other DBI classes. } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \author{R-SIG-DB} \seealso{ DBI classes: \code{\link{DBIObject-class}} \code{\link{DBIDriver-class}} \code{\link{DBIConnection-class}} \code{\link{DBIResult-class}} } \examples{\dontrun{ drv <- dbDriver("MySQL") con <- dbConnect(drv, group = "rs-dbi") res <- dbSendQuery(con, "select * from vitalSuite") is(drv, "DBIObject") ## True is(con, "DBIObject") ## True is(res, "DBIObject") } } \keyword{classes} \keyword{interface} \keyword{database} % vim: syntax=tex DBI/man/DBIDriver-class.Rd0000644000175100001440000000306010613702436014606 0ustar hornikusers% $Id$ \name{DBIDriver-class} \docType{class} \alias{DBIDriver-class} \alias{summary,DBIObject-method} \title{Class DBIDriver} \description{ Base class for all DBMS drivers (e.g., ODBC, Oracle, MySQL, PostgreSQL). } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Extends}{ Class \code{"DBIObject"}, directly. } \section{Generator}{ The generator for classes that extend \code{DBIDriver} is \code{\link{dbDriver}}. } \section{Methods}{ The following methods are defined for classes that extend \code{DBIDriver}: \describe{ \item{\link{dbUnloadDriver}}{\code{signature(drv = "DBIDriver")}: ... } \item{\link{dbConnect}}{\code{signature(drv = "DBIDriver")}: ... } \item{\link{dbGetInfo}}{\code{signature(dbObj = "DBIDriver")}: ... } \item{\link{dbListConnections}}{\code{signature(drv = "DBIDriver")}: ... } \item{\link{summary}}{\code{signature(object = "DBIDriver")}: ... } } } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \author{R-SIG-DB} \seealso{ DBI classes: \code{\link{DBIObject-class}} \code{\link{DBIDriver-class}} \code{\link{DBIConnection-class}} \code{\link{DBIResult-class}} The function \code{\link{dbConnect}} is the main generator. In addition see the help of the methods above. } \examples{\dontrun{ drv <- dbDriver("ODBC") summary(drv) dbListConnections(drv) } } \keyword{classes} \keyword{database} \keyword{interface} % vim: syntax=tex DBI/man/DBIConnection-class.Rd0000644000175100001440000000545010613702436015457 0ustar hornikusers% $Id$ \name{DBIConnection-class} \docType{class} \alias{DBIConnection-class} \title{Class DBIConnection} \description{ Base class for all DBMS connection classes. Individual drivers (ODBC, Oracle, PostgreSQL, MySQL, etc.) extend this class in a database-specific manner. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Extends}{ Class \code{"DBIObject"}, directly. } \section{Generator}{ The main generator is \code{\link{dbConnect}}. } \section{Methods}{ The following methods take objects from classes derived from \code{DBIConnection}: \describe{ Create and close connections: \item{\link{dbConnect}}{\code{signature(drv = "DBIConnection")}: ... } \item{\link{dbDisconnect}}{\code{signature(conn = "DBIConnection")}: ... } Execute SQL commands: \item{\link{dbSendQuery}}{\code{signature(conn = "DBIConnection", statement = "character")}: ... } \item{\link{dbGetQuery}}{\code{signature(conn = "DBIConnection", statement = "character")}: ... } \item{\link{dbCallProc}}{\code{signature(conn = "DBIConnection")}: ... } Transaction management: \item{\link{dbCommit}}{\code{signature(conn = "DBIConnection")}: ... } \item{\link{dbRollback}}{\code{signature(conn = "DBIConnection")}: ... } Meta-data: \item{\link{dbListResults}}{\code{signature(conn = "DBIConnection")}: ... } \item{\link{dbGetInfo}}{\code{signature(dbObj = "DBIConnection")}: ... } \item{\link{summary}}{\code{signature(object = "DBIConnection")}: ... } Exceptions: \item{\link{dbGetException}}{\code{signature(conn = "DBIConnection")}: ... } \item{\link{dbListFields}}{\code{signature(conn = "DBIConnection", name = "character")}: ... } Convenience functions: \item{\link{dbListTables}}{\code{signature(conn = "DBIConnection")}: ... } \item{\link{dbReadTable}}{\code{signature(conn = "DBIConnection", name = "character")}: ... } \item{\link{dbExistsTable}}{\code{signature(conn = "DBIConnection", name = "character")}: ... } \item{\link{dbRemoveTable}}{\code{signature(conn = "DBIConnection", name = "character")}: ... } \item{\link{dbWriteTable}}{\code{signature(conn = "DBIConnection", name = "character", value = "data.frame")}: ... } } } \references{ See the Database Interface definition document \code{DBI.pdf} in the base directory of this package or \url{http://developer.r-project.org/db}. } \author{R-SIG-DB} \seealso{ DBI classes: \code{\link{DBIObject-class}} \code{\link{DBIDriver-class}} \code{\link{DBIConnection-class}} \code{\link{DBIResult-class}} } \examples{\dontrun{ ora <- dbDriver("Oracle") con <- dbConnect(ora, "user/password@dbname") pg <- dbDriver("PostgreSQL") con <- dbConnect(pg, "user", "password") } } \keyword{classes} \keyword{database} \keyword{interface} % vim: syntax=tex DBI/man/DBI-internal.Rd0000644000175100001440000000237310613702436014147 0ustar hornikusers\name{DBI-internal} %\alias{dbDataType.default} \alias{make.db.names.default} \alias{isSQLKeyword.default} \alias{.SQL92Keywords} %\alias{.__C__DBIDriver} %\alias{.__C__DBIConnection} %\alias{.__C__DBIDriver} %\alias{.__C__DBIObject} %\alias{.__C__DBIResult} %\alias{.__M__dbCallProc} %\alias{.__M__dbClearResult} %\alias{.__M__dbColumnInfo} %\alias{.__M__dbCommit} %\alias{.__M__dbConnect} %\alias{.__M__dbDataType} %\alias{.__M__dbDisconnect} %\alias{.__M__dbExistsTable} %\alias{.__M__dbGetConnection} %\alias{.__M__dbGetException} %\alias{.__M__dbGetInfo} %\alias{.__M__dbGetQuery} %\alias{.__M__dbGetStatement} %\alias{.__M__dbHasCompleted} %\alias{.__M__dbListConnections} %\alias{.__M__dbListFields} %\alias{.__M__dbListResults} %\alias{.__M__dbListTables} %\alias{.__M__dbReadTable} %\alias{.__M__dbRemoveTable} %\alias{.__M__dbRollback} %\alias{.__M__dbSendQuery} %\alias{.__M__dbSetDataMappings} %\alias{.__M__dbUnloadDriver} %\alias{.__M__dbWriteTable} %\alias{.__M__fetch} %\alias{.__M__format} %\alias{.__M__isSQLKeyword} %\alias{.__M__make.db.names} %\alias{.__M__print} %\alias{.__M__SQLKeywords} %\alias{.__M__summary} \title{Version 4 meta-objects} \description{ Helper functions and version 4 meta objects (many!). } \keyword{internal} % vim: syntax=tex DBI/inst/0000755000175100001440000000000012142561030011635 5ustar hornikusersDBI/inst/doc/0000755000175100001440000000000012142561531012410 5ustar hornikusersDBI/inst/doc/figure1.pdf0000644000175100001440000002644110613702436014456 0ustar hornikusers%PDF-1.3 % 2 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x+TT(c}\C|@1 endstream endobj 4 0 obj 23 endobj 1 0 obj << /Type /Page /Parent 7 0 R /Resources 3 0 R /Contents 2 0 R /MediaBox [0 0 650 326] >> endobj 3 0 obj << /ProcSet [ /PDF ] /XObject << /Fm1 5 0 R >> >> endobj 5 0 obj << /Length 8 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [0 0 650 326] /Resources 6 0 R /Filter /FlateDecode >> stream xڥXn7 +l~lmE dÍ8ߗ4<Ǔi"(JoRH?.I$ˍ0nm_g~qnab0qGḒ\EER%@$>pxRhБperO~@H S5 `/I詌N+C@pĴ>.8 .BId,b%B,.O\iiJz~槿ח^?}G~:k#GjU*rW 2ۀ2NK !w/>,bbbBK ˫@Bxr7AKm X%"JюyBlTMؔ2)B \CAeBg*UdXycIu)GayG25ZJ ի$8KD5kڮi6Ij-B]1nlzhi1s|Co5Cԯn J~J7"@c+q^h;/<`0dd_ٶ~w[Kh?9X7Xq9iօB`qs$ѿM0aO?AJk$&0_(3ݬ) &=#ve%= x5|њſe9_ mY MۍI(tDz[DqdeRLAVnE~LvkP|\+~)=J3XxSz<zb,Ɔ&h)q7?>6y=[gU)> S__^#` ߫QaYɸxƶ-dׯ%3]t8Bt/y9wװ{ٞ ?UG%2u+iz jؖ1v^1U4!n53o|e endstream endobj 8 0 obj 1396 endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 9 0 R >> /ExtGState << /Gs1 11 0 R /Gs2 12 0 R >> /Font << /F1.0 10 0 R >> >> endobj 11 0 obj << /Type /ExtGState /SM 0.02 >> endobj 12 0 obj << /Type /ExtGState /OPM 1 >> endobj 13 0 obj << /Length 14 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 14 0 obj 706 endobj 9 0 obj [ /ICCBased 13 0 R ] endobj 7 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 1 0 R ] >> endobj 15 0 obj << /Type /Catalog /Pages 7 0 R >> endobj 16 0 obj << /Length 17 0 R /Length1 10820 /Filter /FlateDecode >> stream xzk`Tյye8d&$5<&3y$d$@!7A!"<R˫zm*RER/k hBMK)Yj*ƨ|`ɷ Ro}sk㬵z@2]#Nޓ7et`ۗ5/d}lX[`nϹm#݂ぅZwb߹p=VW{xs; ~pi 9|}]s,xs A컖-!*bXF38Αu## wc? 4$ )Sa0Ki` dQ/K s&d!óL+pi-`vcc;pJ+ >YBT,5I8v4bЏmcX U&wkvq Bn b hμC+> R#.U8;lq1P`X=<Wz6RXecuVq:l3l>ep?8Q `A7n6J I,D>15N/q.K;]1/)9Oױ6qZp ϲ[NS-%aExuS ZF)IpN:S1*#vwYww>)W$7(5WWs?qZn p9.9 ٰ耧rZ}'@jr9 ~(a ap RO5(;UKPf61S浣*Jey kB )]y)Z7O/;0:%YU /H4xS6+ҜضeN3"uaf?}zmRj'ڰQjU T;s c*3 apJ0rhMz u CVQZ(/M"װU 68lt.,h.pRێ#f짣HƝПx i"I_3pRV\Y Hmm; !=/]XȀ<, LF&# Do&1Sb&;lޮLW&6>7cnvdӚzViKZ:y5 sX5ҞaT#'E _m2f"k gyU%'RꑳW,xj箧(+~UR9FޙWFZ*M{w~Xյdfz>5&t!uaZ"ў΃Lk5]ΗܤLYg*pɕV'ԢR:!'s/YE;22IIDf3MF?G7M#'^m^~˦;l ,#t_dM/+٫kp|+<F^R1?j74֯MY%997K+H6<̀wd"bc^,7X s#M5G-ws(L _ˬH+#^o$#A@:QORteiSfdH ^]8ۀ3<8= {FR0/U~deC!=H%iVctpsHHw|?:\t LI}V1cD]TQUYc1ƣu68j=ɪTkjÞ@cLA4ХڡR1yHS;l*2W(313fՉFm=Ke\k Åfa/ӣ͑P@PPM@N}T|u#r&0"r i7 }@Zf?#=jv37$">oT7Nu:'M?l12ʪj̩r,^,3[)\BLdcfQ6_ϡл~unpS|au_~_gOl.1-3YlGgb!eK9BzZN+fU*5%{,D>S[;JuҰH Gs 5+~k>߾{WYvT+yRlPG!h0[&S>8$yK ZkF]vzUZ`voWeK1Ǎ./CcSi+yacYg!fpr=gݞ4靊Mv^jɎġ;Y*{{Xo$oQv))\Y,0/x:@dSTL3`MˬI*%Қt|fCs}+?b:kzWS%-C,s2K|Oyan8 hÃG aF@*G\kBAqݒ+X0!ΒğHyMsE86Ԭ(h~H#;>.mg!%E uF:Ӭ\f'v_'5~PǚЃ7,s /Xa,ĤRhѺ8O8$, ) J#g]k*,òsøFČq90ЃEw1|8Y{ 14l^PA\fq&%CVC򇉃Jn1t1CC͛ݕ$]OJs"r"hʜ¢C* TbKw֑_~4ks\2,I]Ђ[{ϵc,}]W?VNUoX͕u-w'x ='m»e=oR>}hhd 2p"GwqAэU<2 _7 Jf:=(,a w]xc{l{5'MMF3CbO:l;S| ExIq2jM|w~ԫ$6 1c">ԥpUxW|⾾w= .*oY׊& t;Ov9 gOCf6jZNůJmM4R%e6v"=B@t<#SE(P~5peNBʯVkf^oߦ;Ӵ: m9Ind3}ŭq&iU4U=;.46St:: M܍ +|'sVEV!~UO|+V<7ZgE| Q_ 'niuK6{ ႥZy4vA4ɔeVU trC1$n߱x˿E= Xs57v7YsZ2zK!W9u[޺II38OόE_,ٰP +^.cĈX\1+ 6XX#˰^(FqiLœo^}0by¸+߿ UDիFklc, q+o;fH#1 (vwױqc1=ck@ĕVaZیs}{jxTa/q1E_Ο{xTƚPnZYY3%W{ʔe^\i%hL#35uu5+L7 {?w 1NJL(asPVa}KbK< ēW~%aĆK+L|8cYQ>۷{͡`PccH8 ;g6O^/ۘɀ{-`KG?VlE#syF;GL. Soͅ }2J rRdlLj׀NnO)h/L/,>+7:yBcݐҁ׸0`!k%mvuփV[sǴ;`ܵEA_mXGTYӃ=h+J7ez}i_Ii+wX@\9I' uәs<4%f!Zo3C=!d z5 MO$([ Я`{8ٔ<؜;=I%CpCtD=Ƙ/e#YW2SC6^.* @@0r!>9Ț C Ga&j'S'HkZ')O(G~V8biRa,n8jq²T}Ach{|Oo{"|)QU-Or5Exf=N1Ro fl!j3 n޼pa&šS=ljQ! }$U4^YIw [A2]Nz迋w")ȋNK+!|8k>x[Ծ,5$u Uۙmn4r3NiJ4MN&(G5頑 N8(~R[ $6ǵx(JB"lv˵N6G-,LC)2]38N~WDjDvJYEo ꥓ЦN'iN!W$)Qr-i<(J n$H # > endobj 19 0 obj [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VXZIXD+Courier-Bold /FontDescriptor 18 0 R /Widths 19 0 R /FirstChar 66 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 20 0 obj << /CreationDate (D:20061125081638-08'00') /ModDate (D:20061125081638-08'00') /Producer (Mac OS X 10.4.8 Quartz PDFContext) >> endobj xref 0 21 0000000000 00000 n 0000000137 00000 n 0000000022 00000 n 0000000241 00000 n 0000000119 00000 n 0000000306 00000 n 0000001875 00000 n 0000002974 00000 n 0000001855 00000 n 0000002938 00000 n 0000010653 00000 n 0000002015 00000 n 0000002063 00000 n 0000002109 00000 n 0000002918 00000 n 0000003057 00000 n 0000003107 00000 n 0000010161 00000 n 0000010182 00000 n 0000010409 00000 n 0000010831 00000 n trailer << /Size 21 /Root 15 0 R /Info 20 0 R /ID [ <8f966f95a817355633d289bf3eab007a> <8f966f95a817355633d289bf3eab007a> ] >> startxref 10974 %%EOF DBI/inst/doc/biblio.bib0000644000175100001440000000753210613702436014337 0ustar hornikusers@manual{r-data-imp:2001, author = {R Development Core Team}, title = {R Data Import/Export}, year = {2001}, address = {\url{http://www.r-project.org}} } @manual{mysql:2000, author = "Axmark, David and Widenius, Michael and Cole, Jeremy and DuBois, Paul", title = {MySQL Reference Manual}, year = {2001}, address = {\url{http://www.mysql.com/documentation/mysql}} } @manual{jdbc:2000, author = "Ellis, Jon and Ho, Linda and Fisher, Maydene", title = {JDBC 3.0 Specification}, organization = {Sun Microsystems, Inc}, year = {2000}, address = {\url{http://java.sun.com/Download4}} } @article{using-data:2001, author = "Ripley, Brian D.", title = {Using Databases with {R}}, journal = {R {N}ews}, year = {2001}, month = {January}, volume = {1}, number = {1}, pages = {18--20}, address = {\url{http://www.r-project.org/doc/Rnews/}} } @Manual{odbc:2001, title = {Microsoft {ODBC}}, organization = {Microsoft Inc}, address = {\url{http://www.microsoft.com/data/odbc/}}, year = 2001 } @Book{PerlDBI:2000, author = "Descartes, Alligator and Bunce, Tim", title = {Programming the {P}erl {DBI}}, publisher = {O'Reilly}, year = 2000 } @Book{Reese:2000, author = "Reese, George", title = {Database Programming with {JDBC} and {J}ava}, publisher = {O'Reilly}, year = 2000, edition = {second} } @book{Xopen-sql, author = {X/Open Company Ltd.}, title = {X/Open SQL and RDA Specification}, publisher = {X/Open Company Ltd.}, year = 1994 } @book{mysql-dubois, author = "DuBois, Paul", title = {MySQL}, publisher = {New Riders}, year = 2000 } @techreport{data-management:1991, author = "Chambers, John M.", title = {Data Management in {S}}, institution = {Bell Labs, Lucent Technologies}, address = {\url{http://stat.bell-labs.com/stat/doc}}, year = 1991 } @techreport{database-classes:1999, author = "Chambers, John M.", title = {Database Classes}, institution = {Bell Labs, Lucent Technologies}, address = {\url{http://stat.bell-labs.com/stat/Sbook}}, year = 1998 } @inproceedings{R-dcom, author = "Neuwirth, Erich and Baier, Thomas", title = {Embedding {R} in Standard Software, and the other way around}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{R-tcltk, author = "Dalgaard, Peter", title = {The {R}-{T}cl/{T}k Interface}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{duncan-dsc2001, author = "Temple Lang, Duncan", title = {Embedding {S} in Other Languages and Environments}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{BDR-RMR, author = "Ripley, B. D. and Ripley, R. M.", title = {Applications of {R} Clients and Servers}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } @inproceedings{rsdbi-dsc2001, author = "Hothorn, Torsten and James, David A. and Ripley, Brian D.", title = {{R}/{S} Interfaces to Databases}, organization = {Vienna University of Technology}, year = 2001, booktitle = {Proceedings of the Distributed Statistical Computing 2001 Workshop}, address = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC-2001}} } DBI/inst/doc/DBI.pdf0000644000175100001440000045464712142561531013525 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4544 /Filter /FlateDecode /N 77 /First 617 >> stream x[Yw8~oc߉>sNvl'qg:DH#R~|."rOBBUI b2RL3%#f )cb&"T e5 #qLXz8J&5LjMA# ,RcX0)XdE#BzWL z'e0?iR6d cB'!SpLG&bQ1L3*f蜙41`iHf%ƅOmC05d Čei0pØA$Z2/1gb˴b.]|ƀYܭcڲXlYlnBÐD#yI %75^!҂t6_k>c>S>9/܅Ӓ ^^fz#j]!R8*KH&OG?ڻaG+!"|$cr5n)QZb)Ih$,wltSd3XmR5@bZhBD=/eoG:'ţ;;`;y]Wyv vDlefM`ɢ\+2]N)C7NE465JgؚФ)^E?wY rtL7PT,wQ/Ox 7[@]puN> B.¾*gD2Wѓpؐ 6*%\/V`yHQ2"ǩiVƇcur\*+*r?LZe^ZivNFy[⯡7jQ_Βփ/UEDԫKP|md,/NvVj!oqjpjxt0 ^hLq&زъ͈&، lC l[?N&|rMף ,ZmZ X4yuF@SlfPCKFkA ],&څK9;!Y"Y":z;Nې>ji iH1kY{S6)xa!5b2ԓPH- r|j(:B#cRS3Ɋ+$\c(.\ >a z̓p+ f ~Lre+ + '">\WٜߌyPrIRe׹Ygv9R?m(U>C|%=*2Ox"Y$.\H)sA),Z1qg~De%pZ'#r'1m`)DX9F/7!佢%P,A`RfMX;??}CnᲯj~wÿDJ1?R2xּfYJHcڜ|ڈ(?23h-sgPYN_ bߝ>y!wEt]T:vizuvùbXK1H,K' EbV)vH,Pb@){Kq8\kT,l`&M r?Hn! 5y.%j6xo2aDpBf5vx64! )Rs CSCB0 q j1}읣ώwdVb͏bw1q6;I~NT^(^-UjzKRbbDp5@T~tvD`䈉 ~txqOQ:eA B:&tQYxguv]ζ3~W+~k<(jOŪtXd%KVK&(ye'AciIba%ԛ0 <>H ޓU6UFUV״ /QrQij]'?w:"(ā:|(G~jJ9s-:1($,vtg\5׌h5f ͘ ^y[, Lc;i5!|d4eנddlxjoYoMijEw}K:jkʴe%|IKKៜӾD$A˲7z|;Jɇ?!"MS2]OLVtAi8bm,[QtёU5k4gvJ_+F~The`(*EhFզžܨeN-kmRRn o6o|M{-B$Gf.0"o7Ue"lon3}e\k&'[Yfy_|Iivf]jM-,.}{WvsGPzhEt\i1Œ %U{bEmZ'xRt+|OW'G|J6*mVmZݼczMXuƨt\ڧÖM];>ݩݶrREi bIL'& ޡeB!~[~A=ZFl+>$٭_ >=B4Tһ,vQ%ʣ؟oBˈiq;`ݨj/ڦ͖+FeYJZ)]Q0goSڈo"n/g=|_LjԑaXV;j("anVQO&oORsʿv[at 7z4% =_zP4T._Y"鄗@)ejRbж*X\&`> r?X ژ:2Ɔk2' "۵. cU1 ze6ʩ.\kNV~nUz~@MS,\Z@,30)mP%~ ]~'+nҫ?h(¿Ӧ:ntqgMflwPnn():^Ͳ _]'bکyzk4Ͱ4 h&=AL; #i:}3B$v}0k#._;X+h0(endstream endobj 79 0 obj << /Filter /FlateDecode /Length 1814 >> stream xYKs6WViD~ܚGN{145x夛u[pE,<{J>c$<6W3M\]7}wK70wyQSZ vǑ5{jKDZϓ/[BX`:Bz_:A9DUdOh⾰R[_ŷn§Cӌ+L:Z:igFKf$C$,o gɜ{"6b?OIMH x{OwUXW_&=$>r>գ36j[YǢK{֋ۅjjk]W;\K}DxUGtgEUĢ `` |yZy˄=1 Ml@Qayp SHd1PVbHdj NhlxS &IaR^ Y6/1z9_\o1:|8 t<۞C ;=eZJƹ9ɪ,_n0m\"8P`i ƖƅqPDzAc,ƨCƵ{ aLBfH#r\`J}झd:x1 T+5p2D tL;.&TcN>LJiJLKHB3GL$RF *7Aq:2v|wT 8F j*xƃ$LRz 5rl$j?-\<.GRlHNHD{}L$(;5HLCUp'ZFG0"If.fg'*H9p2DʏrjͶd9= j&'rV ]/) W*<@f]S+&ϱ"mSnXH.20KPM{JkZ<bfYN{f_,p!z &jhk@ HH΀gHbw#o;MSc׷_D~/ǨN+Uߖ! :K Apzh̓A,L؊ @n5!`+z yNBGp/NtbStUcqR)F46A㛯\o#%&XxuV=WJY皞G7DQqΗq7Q͆zOh5b -k-(mK5wфH1+q&ۻ5.nɐ;9m~he8%Zea\T*9>?r/N?R7^q Mp&yVgGRùj1m4j̥B-/93/}Z޺|"z._|n/3N/4 ^eIe!zAt^ߧVy8C"{me{mqοatw%@ ZO;\}3bf֝ V\AT;*vY?(endstream endobj 80 0 obj << /Type /ObjStm /Length 3161 /Filter /FlateDecode /N 77 /First 676 >> stream x[isFb>&%}R_I(PCB_ IQNT2F_8H&XPLj˂fy ǢA3) z Cd^Y%^,j\]LF9,S`31} LYL9B0="$SQc-'C05(,&Pz<^A8H$4XJf)"3oR3c"2XUZfL0ZtԳd@Z4L\_3U,50-\SSI?ݴ1kŦIӵݘn\)۴7bycVp![E^\]O{z >M0քC~ď {y/ OW_2~דH8 6]M5?:*?B`~`]Hg0g䉵>w&g?>UoXGW,?ᮌܨamGiL0Ƿ~9(FW mdZݤǤW儈% ׌pgէ1;ǿ4Au=MnP#ٯ?瓢?IQΫWד<#<'9yOi5/k\o!3 3}"d/OϏOȜB&!?G2 df2pvm s];u%5K寇G?5%j[;i` x%"x??;<o)+d|ZNSU6HlMKo@uRSYZCХEJjBFfO ~+DɅI:h-C\"DV`=Zgu}1(G4v2Q9ě/`µOd\@4Q:s(6.ަq&wVihL jWx}xSmW@C+bIOZXBpCchf/Ga(3FLhIy\:Ag;T_MUxgҹ:ʵ<>D\AN Eb 9m jـ[gc1z3vKl~)pucJETZ~3 @fv{qYZҴ -ꈒh]3pWBVgRźlҳ=NQa^_]smyYGRk÷c$ڬHq 5?]_\W+iyYe'_MEA1n_nX4ZHESR/d,zۤ~]Q1xsrtt{!1 ,=O5Ȼ\)oӏ(`H\m(\x=)O+dH.,!~όC€(ؒvͧK9h.DeLȂD)*~tSț]w1MPi鍇@B:BAE7ҟ]_b]CkvX (!^EV(3FAe~rv|\(PDJ  xZ e–5ׄ2 -} י7.efS/, iUU,ގ;waŲמ>g[XrEn; %@=M[,t dc'yCI+dQMO4SS6dcfUme͢[ʢZ5ˢnQxRGরj[:Qa)thi$c̉qA}`-$P1 3>sH3@I UiHUE\dRM]&},.e_w MmX%:0Zt(AUp(v*Nq2OuQ[<3?| yff i#Ig6k  xLY)FnOQl\omCmǞ2ITaA~>`T ~ЂNzp gt mwY/}~y:鳌Oϝn0L}s2mQw!܄)㷌H'gߵ}L-RW4?~.u}wa|Hhϻtμ9Bۦ'S)a9PA,_1o;x5aE[䢗PAƹ^.|@/1h+M|r~6:vH]< Qt[#Ta?3R;S.x$OԤ1檩okhk6 ]QktmཱུK9$0PSQ0u ovd3 A1DNlRn@DZNn2:&oB( {M:F_Z K`xg ub:@$/P~N'Nw>Knrd鷉'> stream xe\]FRI!f`[K@C;$NA3[I b˚@Dρ)WK/($/ "(wtYZXeJHA``s8@ b0'7@g&0 5ˑ"jWKn'g)+$in @qxT푵 H'7L_w`aoq[@9i{*bn K-m!`r0:l:CCiٶ ihr}nh{:#W 8<Fܼ@d"?(-`p@ ̝=q$A7[@<cn r  8 Bve eꄅg$Ls,[q'LN|2kıtfJ|Stgf1kvtѦMqqYkJAlF˴Y@#i NWM^a=x)NA]| xJA%H,}})O4< 3~ k&K~mGt:]kph'!:v(jpʂtg!qxGY]SM3lQM P*SRPeEb,HzF#`K% f6{ 4>W:ƌz. ܋u,x@k0<%RAUn5.cX\ q?J% fd7j!rΰdP r@mf9ssTͺ2Io})syq&M)1O -2c^WUʁwyC-"Ls +N%|TlO5<LSp# @z[c+#qA7eZ'n LugNuqeuerp|wb!)o =vjp$ a`sIi-8b_o9&;KgȋQqlr4变XLV7ȳ9kV.+Dbxkf=YC\24GYZ mq]@dD F2 }]=aTд37KcP3 `O2ݶo(oYLVʕ.CY(M̈́BдHBӧ?>AX_ic.I .;~wr) um -zAm;$X$%Po>a@^aQ4݆Vg(s[,zѭ ]ץ`dB}aϔ@dgK ,Ez0Ev aJ:H78I99|4a$fcze/|⍉{Ywu$yVldJ axf!*˟Z'2DLWr0}A3]84ץsu0^K-S~JL>%'oQ[Au"1x[d>qDR^2j ҭ'Jھ0ݍ Sf?Z8o<̖Bq;JbY\ $8Sˏ"[QdE4&yNNO/:61U»0I^?ٍotUD Io|iٮ~UCM@yHi~D4v.:\Ȗ7~.ņZJ/'^~0нe5c\~]p 1ݠHt4rK';0%/$&V*@;_ ]L闧zsf%nu],=i{|kqNÕ01uRŖ[.T悈vd,51vH|rfP ܯ|[/ip;k-B6_m*J?f ~[zɭRXCI:zYe l] DH_?ߋ\%jUX{5Q;/ȇb13 $u9 .c3FFt1b\ ٸ-o{ҋ$Eı-PKdIf=u8SKI̾X.ҲIR(2s_V{Fhfcc`lԆd(At3~6ZeULn9y76Oh|]M+8ȟ \igei)5r(^jm%}kgUZ7[qo4^ &[% I6@L{Jԃ-kĚ|)?;;Fv p In5 AKgGlb|gD#?ApD.Z؋wGBTΒ _a_-ǡzFcX5y*|aEОqzkdFif(!{Ȓk׼Nb~yfH.Z W4aSg+ 9/щm;I"CuXʟ.K_&*R?Hc-Ο.ZYC14UZ)HO#QgDq┺ meH 8u ̦ށ8{9 =+ y]VXI^v_H]-ol*סf"zdC$Kٰ~L`GZ$gQ㋏v -- F%gcI d~~[Q8c"_#|?b$b:26&n_zm|=Hou'7⌯"di4=&WB:dڻ"I㚜KҊ '5)2ݸgjkâsNBr-qv-jq]՜Z9+> m}3[RH|ZW_̙]Ddt%Z<[)oy*O*OAV+mBRuR.~BC8"QڞK)wxhX؉\AxIEBobH2ZxF3]fe5ҏ,8iG/S##rvSGB;T1^+)"(ɼI(N3(xl1k_Kr 8vI{.YE(bdoC ޷Jv^`7(`7=lT_;#:d;,Rpd Ҥ-52gIҨsEW7[I]8^9 2}Y<}@ 꼹s XlV 'X{QJX\QgE\CY]0Ըa'(AFMu&=EEvX,_4).O3 鯻0C$@n> )ZC2*LSK>Vܴ훱HyQkI'pϿ MN5QÓ7^ˎ+b>`gv/I_KHP3:Fyоj \H̭rOXڥR1 = mB)L]gC1rukZqk[7yl&YTh=T_#UJ~SԇW2Fl3*VE.1Dvl.5m?@߆`Qs/3Zvs{78oMv1%)=^24l)ٷ,|w]\#ڷx.l˲7%AQJ÷W*9Q4VYXih'^,Yv6_f_evA?>9ǚ8U15YM@&LX%w PREjR rcѸc;% L?E zBY8pnh1%zjQ 8W_GɋAE81Yg6=&b2vSMnoDp3 Mb8b<\`dC HQԇp5`6ϩ\ę(#"pPȠʁX,>ㄘ{̓%͸7_5*WcJ-q# -3h4tj%!ۅ_;RoD?]:)9Sjp;ʼ~օf@6`a!b$/!=&j'Aj.3!7fکaaJTPhiGN_V$ևm;قP2w\s;TdCI}~SSIzfT.2ye.ޱl7֞m$}]o ^kVHg&km2FmÖ YBnd ˠrSxcU.NN +CcÌ{V,aopɉ^b~vҏKK),U8:[= wwŅ,Fg" 0Z`*! r٠!//U )]#J!٧ص% j*W R^@hu-6u$U3k3ڸ"7cV = Ṵ_åؖ79sC6yq=dr~; ʕrt>azF.R*VP6ϊZwK" |m#kJ ZJ;Z_ʟvj*v>+TP[3uhixZxQ`>}'siT5P 36;%#pA3Р:59n Lje ܪPeOq^x>)~%31),isգ4Y 獅#ŠC!'ԱH&H Fe RJB  ˟X53b֔ bNYih–lv)T3UjWw>+ ?0"1gIP8 I])N~jgǺyw41)dڌ6aS9vyوn5E}̈>V fXxr_[E݁C1ОzcU.rLŀcWDTk T9o碳:4`mɏ1exCg_(4 ߯$ytzչ ͣL[<֟O)e2Gwqv >MtK!vsŒ \yC߉9H?E[Vi @\@1oA[|?"U'Vd S]NXNrRR=WTaRպ&4j 2ϲ.goĀ'>_V='E \wGSU3&R]vwi k՚uv<2VK5\Ovf%P# |`1f-]?ZPYTy.[< ]6E <ϫZ׮e>>A)8*YȐD`!5#-&ȹD^O@V@Aa_03}d&αA:".,n7tyB-w<%k8-~X߬-̅f::+8b%xUHOm!N.vN68 `JVendstream endobj 159 0 obj << /Filter /FlateDecode /Length1 1501 /Length2 9670 /Length3 532 /Length 10558 >> stream xe\\q  $;C]=Ns=ǙOa?VULAQd:12Dd5XYL,,HTT"@C' 'C' / 4,\HTF$n  kd06(-NL!kk_3J@G Є `ba0Y"1IW?C.@G)6i`& [kw YV߰Ŝ m*wǸ3@6vN@,`ߩYI'Ck c![3k _! G1 79whkAC ['w7fpw,,tKLdbak`:8#0qG4Rج!Ngr|#|I|ч7t$sBFY<&ݴVWYN}qY u'17צ:O+C|#qj3/#xU[&m `O`tPF>v"l,UIZy2nLǖ &Տ?;DAۍfޕ' a/W%6KlrY4L4~Brʽ9HG΍ rljoDc0 b#)d.L06QU|kh!SNdkk50mh}y!Hr4{KD";ޡWX&6d}WJ혘p&r4,|9 \9yW"rzX|@ԦeZDhڢެ.s}Wr/3/lyq}nCF=bkrF6axղDx.^%,5 ƽ~@>] 2$* IY}+G9Yx<3jk($} O2keCDbDXG,#wN*C%K$'"%8) oFd/DKŠ{KT4Kls4.>o*#ZvʾڈT{/piIl;(0A|'%?dKO'`uZs9>[Ya 9z"g+C1@V,`owȋ;8WG[ ?x /X/F ~hSQ-%| BE: z)Qs(c9Yuņ=/6u!\ڮd%7lׂb%'N{{@eScavїRwviFTT'RSn s*ks]R[ @nT%pHs2fD%tif@Eq)CgS6d (|LVob Y]vnM y )F'i& u; y'dIFit_}Sbݴ`A΃\99APQ=J[<䥏BO.珼zOcg"e9hlXZv[Z.E#i|O 7(gTޣ5qߖLJmHne+Dw8CoC Λge) *ڇd7njFONL=NF}qtjjynKPqW,!./l~u}J3Ϭ=U5>?:CFQ\&fH~ &)gˋɃ #w]g8YsDP64J %UjZbi:-l~{ex[u؞פ~#&Ҽ=JA6PWݕa6p8ɲMu'||Ŭ^ڌRp&c/ShbS34j t!,؀|bdzq\"f}7P;82y_#8hT,0'|YC;y,gUo4]G :Z[mkSr_ŐҔ_֚)4UuԈi?$6G~ձO#49NIcoDS1[QiLaE'҂8!N INYi؃aHA: ԣXSڨ'Y/ѷFЃu{/kOc BXݥb:M59[AqMSIW4&VD?W.\vjdu5Eu.Ofv־Q&beu|y"3SӅ\gxi36B|DbEKfQ_3ֲ Jl2.> 3֜(d/G (0:=J.t2=\=͸SdI#P;,03g%[EuCMޜMw>bݚƪv?1t7og,UnuY8u7|Ik8zMV]ڼ?M+C XQ&u{avD*:N,>p"f׮C&a'} ix7a1",%hv)ܸntSVgٖ$POѸũC3шs3K龍ԘcTYytKϣ'xFŤ!,NGE;^lٗ$yydZ4~t-*]@O:bSy/M+JNP7wLosc0V],Ĩ{*N$,Lyfbi=<abXm)ڝJ Vm=>1I‘KR=݃S8"g7x\ R\hm{oVB$QOx_h++B/2q>8 r)J 2J~o߹p"ewZ,\}x[ 9dVIӜWVgfq/\FVYD{̄_ gF77)]^.h7@_ RP'VHTp6TW!Wӈ:Js8kGuNrin> ?}Yת!n@Nu=E_q{/\yaBZoϮҨD8ݢbL+^T_Nп`V7k/Z^nKTAnDqVRyd(T4O/,s4jD+x;٪N -jv#N625iqt7hsҽ@Ϝ Y4L('<79^ew.qVlm']~:=Tu"m7f0a|Z_SZ3oA[Lax{׺O܈ l(͈M=kܾ2w!'dsfq8mBfIF"*LY9D>(5U3TR:D$tF>~8,9S1vZ/\ۏ!1Բɣ*:~tTk L.H7Ь|c*_MW$cB]zAG7b7emR9"VCw;O}<xX\]r&ZTEH+eHLNE~6 ʪ/^#5yv;twRўilH[{#LE θ\; ӎLCD ":lXq,-g~9FĄ̂mвɅ3o %b5!Ai,9wgCT0jٚgolzWّئI?}8Lx\j2? zH/grbTRg=Kp㓪5:+f&E~Ozus¼0=mOܹ<oMN vꋥmt ')HAW/u: 1z^㮹mw3=dg7CTvhﮇy7y!7ӽ`N%%_ˠ_-r$@ASW#RxpfyA?ݧ6jwQ_x_8s$}~nג ?8\~.rIl-/'-|}zI(4ͮr˝48A%4AؓvF:-ҚF!žP%oŬ6s7R;#óu\?*>n[I _tʁj^!~*RH&?_N 8{H $WC.)lʇMYsɛ>17׏((I);C[Aڟ!0+'Ͽc5("k^!}+ cFKIlN.d+ԾKJ hP%8996\NdkQ[Y%zj_FN3gX\Gܬg#t!$4ӛ> Dl^ZN8r!Ԣn#X@h -Vl;_í-E\ogRk&/<\0a{V p);.4UuW/t$ 2(FR բn J}̿CpO}T /%Zfew9!Ӛ1)gea1ʐ֍[TgK$Hnf9H^V8ڀ^=1Ht-g1mtW+,8E>TRЊFX_ixΜxLe#XP& VV$eU?OEHoӉ(;; 8;"ed m ~Hl97{?~S?#J@8.S0‰9]_AXa^)vwϞR\lI6zov@J#;x-+?SBtCx(t#m6mݧʍXe##MQNf,Acj͚SɺQ:0)$EY-Z(|<ϡ/I?~{*nP%Y>~oh^5liE9JYsv>Z={=k{9Km|q~VU*D7mkNk]e1E`+.34'e)_y7".l%"gƯȓb sw ĘyO md"8{V]TV׻a#:NleYnđ]sGADbo b|"Qo.n.~AroKJy|E|FF$8C5KJRm_֩}Δ9^ߕT4Eh BW :G9l[酬Ӳ#)|[Dt< i*2)*A@;Ԛ+>Z$A2 Drɟr%+@*ǺV @3?n8;U5#my_G&-ztCi-jv^3A'10p6K~N~ wt’ZFJ W}<^C@0d6 ̘vRG?FХG8.J[{m 6}i\ڒШTeǡz+HD]-I `hb>4s>YP) UsdEXxWUT.LӖD,z3azmTBhb;0,\{ >w"i0gN(}ti L@/T%MbRl1/d\ fYfy6۟dt4(qۥi"քu#nTfaK:딼Q$Ϫof:Yw|87*\n;ba-pZp"p U&+wcS-lSgMGb"4^48CQ'"=ɨXkzԂ;W=gi0Qx*yeݧ)$QSάiÎ-7>>c`5w :T.C`C"eqiq,*68AiC6z?O!4w3< 3}UW(V SY Hꀧ톈7[\ Zd>pt,ӑ\Z\Y"Nh>=LŒϫ/flBxAx̬o %KԽkL (G-2Ul,=k:=sQkZWiQܤ]cl~쒁S*9T:6F-傆|}HMPv f_9KVz7Y&I~gԻcHB%',q^ioW77u{b&Q>s˰i ~GJqHz}&8ET܅I'Yi4 ~|_˵Uī/#=K}nbAO3Hy[*xTt 8v|ۤEߺB޳\4#L7w.Cpbʩ#4+=4ຼx6k:Jd$t(/>IȒFmDٱc*U_P<7Ӡ5;ޥQ۶HwdL˘6K/9ep+ͪTmXa[["kKAs3Znfo< *j؟.:F(+Eͺ7?ZB+\.;nAR~c5o,G8P?h3gxV#)qX0FƎ32)Yn_Ѐʩ{cJ!_"Ċs@^>ZO$Jm m*yE63nlŔ^xE.oӹL^9֘5A5 dc`,3>gendstream endobj 160 0 obj << /Filter /FlateDecode /Length1 1974 /Length2 14264 /Length3 532 /Length 15341 >> stream xeTͶҸo܃%Kpw _kr:4=z5kVwͪg6$j "f&@I{;F^* 3YB hbio'n$&/7/;/+<@ Z$.-`bajlP7x2DllpNn@3Fx K2v :ϐd @/4I3{;OIy^\F)5llki .@'j˛ʸX}+d,i4St18ڙo8Ɣ-\=?b? @T^P"}_Zvfvc''cOx`ig=@]@S9PЙ3+_ B?B#;hfb_0;3 hg4+ ZOd`؛ qm-DL^@'?={;࿙8ȑ a'O),uҿdWЁ0c vg6Mg[rS_?O(@j$@2$!oB*!@UC 2?RC u?RWC u7H]UH]H]*@^4ȋy7LM.qCA]?=?//1< ?ڱgesBm￞VfƭB'd/d\ W?/r yB+/r AjG W!ȕ_r\t'{x3v?'LSW'PkrOhasK4_^7 Jm+(M .1^k!x+M#zSy>> sdʸEc|۾~W3u} Jk)hYNaI2Un=N.m J6U4Dz/kI Pk~VMt+WmOoLۈTi1UNK QQ~ U g>9gcUgyIN_bOH|Qpon&y^kFghQ(T|P`_Cv HyoK' AItɋԧх&Aj"ȜbA'O *IķrJOo_(;H^Oۉ(VjK4֓zS_Wy6ZMeFA§} t]XRA$/p70#d_P^6kA.wA*my7L.^NcMrfر( -3»aVULdmܤ@P/qmP‡Z$)WZ yHʤ?jv@w%R;>u^ElqqL㚺I Gn<*rL%lJuͫFNޱ>$5۰(!"-{S]K"v_R469&=#oiw1Z?H d~)P lAubb| ə"HfŒ#i} ο5Ҧ68C`*/E%mJGL?glOi~tI?՗Ε(u/b7jӻb9Nu 쯿;ڞgNQs7p4P5 f5nԗ9P_>,W!_ fx]+ t7/Cːh݅edbUn7>7ZqQe*Х4p*ݖFĽ1~TdF>Cnn7Qdp^dfHrkr mҺcXJʠO*{oJthْ>|liO}f"W7XMߊo6'8wv|XTPrVD*HRP4e)]ˉlcVн)k AփijE֙n^$ZHQrٯ;2Ys 3dYL䖩fAUC8x(K^0}q}u%_M3*In^[U7*%׉;jg}DME.hQ2#kϡ|& Q|7t]*. <\:z܌%TP9zCme (ID_S _t)싮yFz[w}^'*́TE04!]K@SaߊNO0tR9aU61:80: pWz~0%\41wJPW8) -= GTzt~cYƵ&Wb{UT`"栗̌o(|/yZ{gQW_\"v,?X!N˗H͟ƾӹ؄,5[t Ggq0N!OToCMH~$%;cR*Bnc܎G S&}㏈h(r7. !ܔ/_P ~H)w $F5:;C0Uy٘C)u|e0V}d}o2LB]|^AXhhcqUGXarriXdz3%eX.)=++pQ.T þpsbckXZl:ʵVђq0*:t 0G?[;@"cO~NT}EΏZnj~tͽ<5+" {B OiX ߰s#OnXxgʑb}r?2S>VF i%#}.J|,F ͬlIUy|vNBbrfLNq2?l*kwKuٽ'=v'ie RȠ h8HN7ٮr +dU5Njo}J*EbWe[R4"g~dXpzuT(]}M/T\cώ;ʼ-˱y|Wv1FG9 )߇nt?qes*7ʢ7U_ @XWnS$/"z3|E< 6pZ24z' #L<1 ?"}vVh?mN4M}5ZOIel;f8Rula[Q -C׷&]c7_3b:F2ai*&#_bLʼnH ZJ ! 郕U37!?V/*Qe}b/j] opk9xBk\rEB|2rݤP26}婿rcpl*$\It+u$g;\e#Ez3|CT=o7=F'JK0jmU8ؾ+|@<_}eOhٶC9TO+ dF ܧ+3`DZ#1nGo7w9[v-x<FyJ:nXQ?:fTn}DdPxKbUaBz˽}fhc&)=´ȳ=n?=mmdAႢ%T&F8ke&Tq$ʻ=?p 1%2AsӾOU6i0LN&MOhc|sR=)<' ]d]K HdMiӌL%) +0bg \ǧ7ҫ#ֳI9m?>~%mS-|iǑ,kEjMgdVբHh]|8?ꦃF4eӧjpkcq'ϤLn% }+1+6 M8]W%}owF^wȪQo~OD$߿MBkB#IK:`wj]|8<),c?|)O8jEЙ⏘#ias{,>@K(qQ"|a.G0L+!oh(/QtVe'oZC>Wr[9 ?s-0Mo̚,."bv yÓDu9uO={GګI)J8BT&_6M!vm?WOo6X ؞V/ϢT-}l/;:<^AL#.qf4og03̣? Kj#7oQj}DR%j,*::Vo4g uɗcOa;YIɶņ2\#ժTHKX$Wb֓+Cna1U{`6eznBNr:Q@|+4kEnE,m#:$JҦk45J&~YqC`v@ )<]) x}c2~n_2(<^9׆ zh)&(ܬ:h@`ٜB.P Zd4{_>dCp]s6pU!X 9ԁ@fiqҧ5սNV7dԭ<9c#7hOUܞ>y0Fꐾ![z:n1cAicim_0o"~'h#ĽLo&j@ܶ""Cl4 ^V")]cRQ'Mw2)5HWl%+קw-HjMFq ۩{n7}`O=zZPk -ǟL# !0Zy {z1ӻ5m䏟Jo#f\[v=|5 eТqr[ψw {s$/7AɊ<_*Ahb 3߃9`R!fq xnF `|h?ieajY()^! gYE< h.>&hC-xlfop GWyNoͭ*'69je)8. 8u@w f9wM%J@Rc8+Zj{#À8@>ِpImӀ#մD[Cm Ӟ֔HtAY7Raނﱘ7ht`e0vgy$ahV֮V+~'{9*UrQ(R!^?/{8s^?Jݰv'u NCpul] ŲZ0vsvݺ\QߥޟҜ̯\{ilji8u #%}-T.W+](g ޡ#ėy{"q'?3sc5̺VXK85H"hA4n›!)*r4΅+ˬ>K!3De k\3Z;\QY8 7a[za=!1 cmŁu^023I]>\K7MjAOS˸Dw,t%g+A"tR0B)J @(gc)oԇ!29"QlRk~QR)%}~);`9vɨ{B{Ҙ &زVzrZI;a}taiap8*ҷ/.{ a="Fa{gp!^fuE$Nu<ɏIy?#T,Ew&sU8~WA8TD>K]ah` 2JΖ췫c3 YFѽARO6Z;@-gGu 2k#UÀc ;AR ;eX;W9I8|YEj3Ɯn\ioFk{;ɋtr:n9Cb4`" . I{ub [`$_ Zhf?P24݉<۞H*-˯.vͰTVw}_MY2jY0T10|*4 3pL(mG҇7r:i!eǏM,I'2QW ߦjݟ5s&NK~.[(O&zgkjMa x5쿾waY~<'WX t i_#H]ݭmT>ѱ\:eih֙S^iJc!Leb`f~nPOi _ԢniN ІK;KL-kKm\R'!bXւ8T!idퟓc!LY0Wز.K[)%g/yԷD!ˣ8dXiA.-@L.Q+_&+g9=5Q6E]8߻TEg{wa(aGlg->I칔ǜC 1o ;_`X}*DZ <ݻ@s{cü8~ 00$G}6La6'q$YPS358;_st'5u~ ĹCrxq#Y 5ywv1FY)x 4y1Nu})33)^BzpθQ'xnD@D{aux5ˋpj2W|NOhRYLޏ*ם4$zA-tA5WyyUVuLs]rbP)6Fgrͫ'^%jY(%th|Db0Nl:>1#]O%*RNߋGG:Ğ &6Pl,ljZo 1mO8)uQqч<Ռ$㟾nśtw> ѵż~޹"q }=kR*<7-]k縊l\hIQ)sB/s 0<&I,MP@%yE9O0,Gs,gvv(x}$R GMR3'M$3976ަ**,#pQ-n7l0iit5T=hI +x5Zp|Bڳ&V Hٳ9fGE^xE1s^'bl _P.#o@ і$`ů9ٽTx㙂zE8|\Ӏ_bs,CJTK&,5?zq/!Yţ|&ƒkFdZG 4+["nea\|n_Ԉqvc=]؟&P## oPqj\m΂<'Zx2ԩ]D3,OgG$}KG(mԹXAu՘LGP; Et%d> |j,m]JM7!}?7 B2@'nvoz8 b39]4 zt" ǰWؐPw5:Ic] 53B-? Jy-F9Ͳv{#if0)꥜i88|ZPxWJ! /a@T\0ۦcjnJH~~>[i81a )"2ާԳy6nc92b[Ԁ{CeG.zVna1~%F8 6Χv27Uj|xosjQ`ꪻr#{@8LDy^wG!e΋)3%}FbuS==۽1Ŋ"2*!u?}{B.)QourF>m -m?D7k/SX-d8k4hY z #1GoGCR2Ou!s8GUɯAOzᆌbx7H?F̨<^t]b.ΓaC%^M 'CЋ$p/6H {g/밾]d5trl`^=π%6zAI+k;À/c@^ꔺg-~R/#q*,BwdXDܟ0Pݔ9.1lfkÌ1w6Z5BWPCbqQgwË@p\Tb';>:}pʠ&t\Ql5B5 0'snTwt=dnc*Fh5տ{ۉDo)/幣n8!ƪU-Y*"PCK82 ɼszݬĎ_ vIv -QP0W~4 Js+%B;0YaMp.i)D-"!;l#1}aQ\pArwp[nS+My ֥8$ljx9̣,|6'K\Cav'3769w԰/bQVQ,spDID ,?~ݸN\@hj̰g`ن.$ڣ^a?9nuuB:/$B}g\16]H<{xH1P'P>y6~H5LBb >~s\;%V飮E6A0F(0ZJCm3:a ) PLđYi@ÜJ˩yd2*pWq>;LL9ۄ(rX>o,"f|S뭻) ꬾpEv&gwK̳H"ILqF:4,:;Fݫ*lj[q%9 3ϲhfcM-Coo3g?c|hm.KaF]R `^O I]:p+/o&s!>dwBbΉasLo*cRُNrS'N|d/CQ.ZYaT3D9\ZP(H%=`Z@(=\:hG۫%gmZWI k6s'8(,-QՉj>`b?q.$RPP*Cܝu'keM:اqYTō`eت=v^} V  cj|Tr}aQ ?&Hjxڱ2&{2As&Q\Љ.ie5%0;pdb{ʴLspv$KcnK-}wVm zy-dD$DM2.w'dD?Aя ~Bd.QY~ugwy$t*Ph*TR_QK:U>c[تD6K:m!uzxq̉-4|j >Ю!nF{N"]xLIs<<҇/fZHvQtaL2T5mLCh++Tkn c`qsE?ʥirf=*,alz|^NO=mBEM{L$-LhQQ .tL + f,"AZiگqEa& L5kEq"fn; F홟*"?#w/TꁕO)+_s)KЙ?P Zs&LjW_y݈JAQd''p W~E0:Vs0h\^I%Xp^[><í%85f4sC}e""2T m6vw-c~32# ʆ,d%b+և`آג'fĩߌh(pܚ&E@"So6]ұ 9?j]1Mz<"HsKEvS#ZzLp`&nB7+5xwAq]e*5$W~! $vKDC+yr p)8G !NFsEn_-p/d5w{kkɽE$YF!@L1*NU14F" y,?sQr"ux0# 9NZt(00&> stream xU\Ͼwwn];k %{ɜ|߫Lw_wUoJRe5F3{ #++@LA]"HI)4vۉl' C;x:,,]4bt@vcK- @tdT P:܀fL3 hCd'=߲74I 4n@p?b⒮66ƶJƶ aot(؛gW-)@Ud*bga[9Kfg+p|704E\Z7Jk\'Q4U K)j;ۅiSMΑncU&&3sdw@=7L6O dwhs'J3C9 i߭B5epq̴ b'UEOw[sGONY o_t}Xb` &2i%Ɉdz'nh(a4ɪ˨k[[Tk 1`BoD*IUc>jtkg/ҡ,le8YJ@`4F W"M͡8SݠsF?CDҥx y=!dZ랣Wɴ '};W4ǔ;Oؽ~49$־"GV!kj)%Е𛣌a jN5=#IvVbgQY=y6:{7K] qpRHT 㹐GQ"NPK}.1wJ S=3l䦄ewc[ ߨjX*~]_ЁL:efm_#},YǑ=x,R¨n;~kHݵlhmsRZ@}@UD`jS&%g]ZRb|E'[bhR<^?Px}~0aeضko>;[p?gGKbiV;~seOؗ3zk׏# QIVZE$$1jQVӼm1P&%|MlaCe CRmCl (n'\|Z 8'Ic R h(PC=(ua)6cwTk8IZFevpBO҂x̸;]#{Vn5*|RM旴u-SElmfUl5)xRpǬE?K?t 7W7z0*Zn WmֳF}:( &,9c:**-"H!%n4妖O1V7/'O Vw#Il˺njF3q1gVEW [eLP&^fWK)o]Ψg?z')օ oBSq#(s6y yiPB2 )YKc/`< (E$ak@+_v!nMdҙawGZN /z3߆j$K?KZ3JlM˰G]B4Y2#AGO8W/, yڔy:ð}\ԖǙ,!ﵭ,r0KAڅtYjM6|EXgW"1377/ f#X[vwMFVD[̯Up7Tq.M? :fF67ɭjbյ'dXC] I|)w b,Te7P<+RJe:#nhJ_C~M7 ke}uo0}idwJgY=!;P9+CUL0JcU"8EhŞ]OyS[r_^b>W/ǭrD<&#@:<@  wGXkW0n'<Б>wvSKȽ*NcR'X'&1OvH3-ukfe[ =vUExOQ.F$ EsYDҮsk?i|Z4h2!|B A2+޾Za2YS³yoiL{5crщ^A)8F7L!uFO?;rds&Z%΢DY KdD=009͟4(5QW/XE}5VH/F?bq kw*XUUX3F(.//)y 2mwIcrw[BU,5#Gnk"[Am"Cծ ŧ!KZPd&h~/Fh9Jŝ9!S"=X< õuVhBvf=X0M"3WSP‘3}ZIHsJ֋q9+[F瀅:*Fc2g"$O9"ȝw(xcf/SǖSSA/X1B%$ ע> nZ.,y;)bpfԩSm[Ea/ԶgСr;Xw\>Iέ Uf]R$.7`j͢9$j]h8hH%⛤>8.irV$jv{8@utb?.Y̒u5k+J!0`e-cOk.B(.^YZCݖJrT3dVd?lqzOq-5]D*_9.گ^ XMM,Ì:~`4k|\fd㷀'&5ʮ p)h%+PJ"+[^Ԋ{Y:&U%hI(moBS4bYN}2OL"h>jm&{! <ؖ ȹ]'3Ρ)U<Sk߷KkH4 0cXH8JjX߶E"[F!:TF ?kQE !,m*ñvtP5`7N:)0ތ,_CD3]zY#rmTWq YA뵙zN6aZ^1EQP t\ᜟ+:9KQIY3AF[3otޱ`8eV#Lv-{GgQ`[4)< \r8_Lܐ@h1^NXm RPBzn=$~HVc=/hZUo1X,rJ[اVl~.ɏp_DY, 7}wSu)(GEg/}1zByaVa_5#>4&FU9 PmXw2sF|lZlT:b!7^"Nќ)%AHB:w5]tT8:5^RfM{փ/9% k" B'OnVO d N.ʣ;+X>.Zc ES˖1?Z(CԎ̌%բ6U+n#;SD?jTwdu/.Kh6ph*Si(z?=,i,cFsLXֹ*({0-qn! D_f"\^FjZƨfo?[?y݌̏c#Q˰y[r!_ߟ쬄Ĭg:W2b>zٓZ:WeZ; }cT&q >?м"(>a6dϬm9,Dl5B1IwQIFf/J40:Y6HDBgj5Z:q"uB6DJ[LlJe8^aH%X';3Z&8v^5{us^$hx^ +6;6|F+^7i`<Ȕ@*LqYv&Tz05Znǚܱ6(loD<KdZF̯*^%-eUj YWS`{?:[Ƨ?N&إR,rK$"Ĩ"բ|,B1ȝ,jS; GrM7_,(JA~>"N%6\i#2 #!Q,kXY {T#ߓڈJ>3";_,4;{'EAMY_!?R!vwtS8Ϫ}覉7XS:MuyVRW*$YhigΚLt&]R~E Y.Y R4l_5ڸwU[N1;nG3Ҹ)B&v$Оgd_ o fu4 m5u5\ܶIZw2GSڿ #Eq.S9 ;Rפ}iL.ؓ_? )9A"7Hkݹx'B`M&y0JM뻻224Ae) '+MRY~XKUynw@ *껄Dl&T T V?+ΟISLH9F=BR- hIA`ZdM3\jsY(` &o&t{by)iz(P8>BVmPt k\bt8 CqkYA&qYNa@N_jHv S~I^%CT,' /t,GiM@D}B bTtp3Afe͑ccEY~Ws%U!\[ބcC<=6{b 1A.|$zMj(P%j+z}Z.:TRhC\g;>jT<}!>^V"߷s5&hQw֪%Ƭ*2i\Χ,]?4{+"]ͪO`h{HtFzuJIW%y`)1Z#zG CId)^ (GTquG?Z_Zl\ U#qb68WPaDdtRʽbP5kuz\A&Fg(XfCvYMF# U{^r0IP5(#iSc,pheA@26 c*Ir켓{ҐY3P^|cSr!h\;ЫpzG (w8y@䪏0i1Ch ~`,(}H\!'ZCfuep9{ǹ#ϯ Vf`e@Vv,eޭ]:K,?k3KtrFNPm_9/|k2 eIG^dGkN r`k+Cd^,64B󫳪۞9j?!vČWxFA4SY#ɻDZR6 %[˦cumԖ;QɊL3C]d0)d=3 aIyaUPVRdb"%9q4(,L&K%vgS IT}c`:aXǢk5C/<=H4[_,UFԦ ld {bvYod= .,<񫮑w#:Ƨҍt^R5)%yR Hf;";֜S)'1I5wzA{^x9F)[yk6b;B+>=6Qpy=oCC/C.#~):%]D oo,GX[sĐ[7+ h{49e ,q'Efb45?QOBKkހ8>V:G9j$“L_eжّ4E'*.\$\Ft(b(p('5'!u/@@3j=™Gi'vn;Im0$[e.hەπS{ '_;|X\12zr\Gs@&i &뷲r G}R: !nVH%8i;KM_,Zpv_ulqZ!F|r}AwA-J6YqW82䃈yZ!&D8--Ug|(v~UiDZ0Hib ؓND=F~Nβ8VOHyԸD4UQIVL7!v\ſgzp]Iz F+t4%$m")] c{ GRW w9FVX届VS_d9P랲o}vr`jrp7sXI [@wW(59C\Rr\ǻei}&O3 p茎kJt 5\jMʽUv%,w%k`Գ゚g_:No M\9y?ۢ1.yڳh ΋#jjһf]) ti]CEWa%'rf8|‍+jPU7_\mPl) 7 ˗WE{ Tc9?%V:6GX^PRgih8_.)LzeIR>_dYtEOpܙ(λQKOaVy^YЙ/rarbὟɱDJsPlǦ'¢QMLaAM:.h&8A'[k?R+܅6h> & [zCKA ]秬#G VPSA0Ҝs~9E%v2 )'~5Ai\zL0mH[ٺjL42PmGHG؆d\DWt oCO 8u+ڑjK^Cha*2crK\xn\d5Э^\o.B` =d"cg_X%aL+DjE.1L;Q0z`KFBg0Q 訂u?(h2s$Z0?hGھ@NC5}_I#Ph$%{YW]iE':EWq3$}Ņ6O 0aN6 'JVWɑͮ뮁] }Fhg&zX ٛ疽UQ\nU!9UuޢᏯZ?]]tp" 1W'D:l웄#LaG(~XTI) ڿ{w5Eb1~XI2}l;smQ&E*u02YlxEq 2ⱌ `|֯USΜ:+qTil%~Rk%:^ᴢ5X Oue#ZR sdT\IM7GyXg)=U 󏿒5)H} _z nV` Gy8v4j/c`g7|+,nh,eZښ{3q1'WJfp;n5@ztZG?Qg (=zأ#62BC v~ŁKXOW"ZXO+4{Dlu46n,+lb~l>w뻋9d;Hi&)2՚P:NUS*6sCg$Whc @d=$"nG(2@iӉ-Lw3\҈7H}-mΩdOL"tq^ #hi~6ˑDɂj^ʊ^TzHT11T[%ޟ>. \2EECX5gPt j R3Q_PF+ES5endstream endobj 162 0 obj << /Filter /FlateDecode /Length 1925 >> stream xڽYmo6_&*R۰~hӤЮ/q1 P(̲x#u"-ǻ^I]$b"$ʳBMRF"V٤^ē^|v (QH*#$L*5*JT&'K&,#d6#PgS|&"جizs~9i1)2'QQolq0׏.ૣ+d-嚖iOə=Al:CLf!{=Q~7 +q[;TO^Җ 0 E$XTD}h @jk<8Tp v]DӰe,%)VWVUԾ3lJrP?zCmO |zLy"B19A2/0vslɫ!\>qQA)c`!ERWcU5(vy͹z?/Pw{u2!dS%MjIА H"Z;K Nb\88xf·[1ZH@4 q PQIBh!TZ v{E1 n&S .+=U ۵+^_c1=6aO@rp2sY"ʋ\L4,^w!':f2 ၎BǤXK( KLg1jKc\BseLQW䨹UfLIC[.,/;wDgCyA>Zak!1a2WiLN蜩vdvtG--ai!b1mk̃77^[{o#|$/D+KZ,{0+R˲E5LE!1+sDZgUĹ:dT^xX5|ҍfݰt$-l %ױc}jf=0z@)(] S8nDA٬@e B-̷lEm'+mq"ZNY!3@!㇠_Rq׏( romǴ@j(SdP8pf.ȫ |Ohiͮ#}9zвi\ ԔC`o:E~!ޭ Ԓ]>_tX# llS|C>l(tnz@jYDI5ѐx4D`3oI|%RʶcE"Ծ_:KZ~C'@ّbZw2/|Kj,Yްm6=&HzOK&RHt(w>cqֽD~Ee+b> stream xڝZ[s~I`KߒlL6ۼ$-ѶRrD9} (޺,8>;W镶VyVye\= J u@56GF7qT RENXOW7ߖJUWVyUyS"էOk_?*lJW2 T L}y~u\;z]mr~i@9^oLz-d?g>G4[#幬JŃ?|H'.G6SY9jZ9X y P0i߈)\_S3E#54x0B+WQA Ƕũyp,]5rp<ۼpޱKk<㿿 X 3&!"ʭvq)l*zg 0,3+Մ.)N.4g֔|_O 3igK%Tsefv].e%y"'9AshMI- gBigytSt#"l#~Y y"F9D{'y-r& &TseDgv^G4eK67y.GK*@O*VB5V [km%qRwC}DCԛ]Z\v4zo7ޭFxZ(QUe ΁lYΗ|qNF ^|S%+]E]`@Q(>ҍ 6x1Z$ReleD/`+H $ܠ=#  !p.;6ġ8ֿ$}Nݿ0'Sǖ&qm NuN^MDvI];7佳L*A3־kxe9&>!r,BMg[ ky1ۚg*f-bw v+kbtcjc{v8K~߉\Hght5[\,Q :vxH1x dDo=E%"*gQ Gv&d3qz$~c^A J%INf$9PQ;#ɳL;Ie$9.k;uxs5X*R[;L i, WNY.R-,Ʋ/SE)ȁ|7LGi16@W{C˵fxxдzt48Bî)hp[&//Y;IVŘ}<^8sB n $uHR4v1xJ6m#Yi+>4Zyb{<Pt%mryS%R)6܂o$ x,@ȶ!I)ǻ).1IBļpi ኆŁIATBF,)w_[X!k,Eq];4"D:-<. N1(:MVr,L`D=?w0Tѕ|Qryx&cbmvm6!ɻk`C;zi$4ɾd ۸7y S@?cFz틹p Lp8F81`u+7cf꽣/;e/10` &3b$f;|อV'wZXvkifd57٪/l8z)\tY\b3_k#3B&C#s@g|y'}O3?<Կ9QWqj[y|چ}<8꟒Aʆh =h.cK@A<Ԧuh '!N˛b z,C4a/ Ç7;AڹF2 ]Hm>V}P5~wZRO׻aјGL{~ֹAtvy`T+W.)J+{O%^or,(jc(AX8s$#B`AqȰ6aP`cX̰:-Cڤds>N"g Hѧ$SҪfKTm͖b?FMH"d4H|a|\$wWT-mZͅ =^3H 3YSVy" P}~S+e'nL谊ns=zlfʨDOd|w)[2+ Yb]{>^0VCB]A xTA&ʣXŋJBhWi!Q%hN}fȍN%(H֏>UWi7E<@z:7A7r@ͭG.C:Tǧxpw- /o׻=~K!f._ʁ|HTJPCDf@4SW_%Kendstream endobj 164 0 obj << /Filter /FlateDecode /Length1 1671 /Length2 13022 /Length3 532 /Length 13981 >> stream xUX\ݺnKpRxpwwU8<!Kp [`3Z{k_suSU}.cg5FQ $wadeb+˲XXXĝ@&.V`{  2}xqrr!RNV.O 9YM\,AvcfV O&-@_w8TA '7 2s,$kopW@NRO֤K Y zwC.jkdbRW9` v"hj?[e]LlD-lAFV&[9KYy\,&ΠAi~`SWWwg+{uOo3_~_$'+*w|+&ioZ[8&NN&8ެ+{ x7ffx__9 _`6W`v0qۂ]VY_2 lgg `t-q`7or-0绗vw#K'?zk"`Wقpۉw1$K2!w+̲}}{_zSKyJ=O?/O\/t5{_zO':ـ\Cy ޟnG}0ӿ>+\(?_[|VYߝlRw+h2߭w+ໆ?]|pk5"ۻ?]]ތ\FG] 4suzd] Io6z@ 3ĕEuJShd2Zg4~ ~yiuzU9Z|%3Мs Ig[9d}67] Xr${]f C3*[L!+witk?ɭT dDv$fӉ48R8~sf%["B  $"w,^dLnӖPшga0cNNFܙ W 07$Aw.žlte':;`{A7/9CuNkԳ=sD Z,<^]6N`"%'1itvdBK)z r?"3iLys1 X̒Eo1=9/i ¡Uw"Ճ!7JDie⇸zN~E7f82VhlN "84:4pnuMG*Զ18 ^7c|qN5hW:^FZn1SN]t b7hB!kR?B=%=z%FJCEGJŞym{/Īӟk}׹$LU*iC[ DJțOuI!6luQ. `$6'ժ=y0_F#?HKZpǣݮli<&5+bt]S`Աp'!S_QfUZEl_)}wCR mXi~/b¤k?i_y4MvXItQi+Ln%i`0R#[W?Qъo̬8ДZ{UHQt=qн '˼7$JlZuJQ CfpČD~R@ @tĮB?\ڮ%\*Q3IU+PRaGk(f kpirԖa ;Э u/Qmn|7EZ*2s^eJ0|X"0/x.sH9臙!RØUpgbDl s!>9Ͱ|a 2#8fp*&N[jGw MhSqԫu3L2{3e.q{Rc3o*g+o;2BIl_M}\: mk&1ʳ$[,яx6%;Xb-9Zu>QBSe8`WP{NglIn6<T!!Ƌ5R, ) I$$䴎ɲyY)no^_?K裩 (?o +x|D=R;6R !ON rt[ C3۩B!{DE5`t046!ʞQTp vBRrZiW,3P/Ut m:dvRHu,qwaXzpv5Vv%iUǾY6>.42ث^PcXu@pd gݺ&q1ILIiA.'7"IBȷ8<RH1! LNbܵ8DNKSS|:M#;6UGF«]^ݵbU ʗ}%:Er3(fݾR(LЌxGNRCNӜ9-e2qx"sӏd3SAԓmc{JE$oF6[ޱi&0S/x7E.'B陉Eh9iYAÂA/%}_'gkGt43cO7UiES mGd.:A*U^W0s[-ơMz4_$0TA:Q 7B|a={?,bƆ&>4>u!>W70 P-`]x>ͣnƝ_Јʑ&`qe4PB%*=dp*C@< }l/z#K|̶o^~MҺEj_؊~oӳ(]k%h /`b:{wFǜ^ ~M͂dFr\¨.%(@q% n9-Jܴ6̬=*Ĉ.7K"׋8lٖ-)x|{e6;PӀ,TȍVc#k % .?甕"RկX}*~A/*z-1~ +lbeq2x)KZzdWWv[_b5g+QI2co9! #wp$n$}7-٬Mtoz>N[8$'xqHюF]n-m+Eŧ<[ȑDTY&qj-~9rnHj1bfG+nL_$J 3{,Vo8~n&RÔc̫:usI )ywTr1!HI,' :4m>L0o!^g\Hv St+X VF1h0G;?)RVAxe#b ]b?qX"n>ud& 2W`s"fl9 tk<%sA)M!j\ 3Q0?q@z&g"ΝpYcn9tTk3ȝBH9塚eV=#Cʩ"qj%C} 8bX}\erCsWU\=0vq=L2pikuyjfݪfRxGLj^laJcG ֥G6(̖auZciA{hiT TC*}a 64~@}03|dQ.>^@Ky0c7K#a)%"s#Jv۸Kek rK{ktN⊈\Jh-Wܚ Ӧ8{dŬtvUuH(5pd'}#Fν@r4ϲb eO4ӳ?qT~^ "7Ev꽥"|zӟ 1N}6rMfhX,jO}6ƍ6lM{o,0DT.]PQy)Y5Traq &C9鄃`rd~WLj=/v%q0X]Nş†zù^ @] 6bZl_}2M(XV'FA4ݕ̓"*D} F @GBHXn_Nhz?=l8DгtA %o]#Ge1je]7~>e!}jVe&9KtFI62((*+}l $Jlȫd[a{lJ`i+ }1S2 8ߤAgv\h1mUBiP|#EJ 1PXk82tN^G`pͤ?ErDR+o0zۈ"1DP. |w?mVNrw{U_[Qa %YJAPz‡\`viǾ{aTXsuMIPbd;[/3k֏O M+w3NǤesMҽ=6ILe}esHVB| ŭ*^5D^N>~4Dㆈ.X& yFUD8x+6!a!..wS |hϱw,蕲%-@ctꆔ8LE /`'0&"(#?.v|TešU $**gKgx@[n=:1#{dRGP12AP\ӷc֚\2KV`fJȨNfٗIDr 2Ӈ tA%&ffj$V[O3I'ğzW2~MjQ_ q$3j "| l׌+a[䮮+s}6_%|%QB=Z)Rݼ(8#QS*Ӆ$)9a~}@cCj 4ZJn3- ߎڍYg5p"tEb+n9АDԔhmTϞ}1'OT R$o*n+~+QBč|pZmv~`G}S-v׹Z!>|."@$ȕptNe' 62YL->k(K͸uZE{X[/C|X)bb'N44iަ6>C'H|k=1K,G)n}Ɛ[b7BŢkd&R,ꔓ)? ?ؚ%c_e|Sk#6"駁C՛0o|L#奃ܔaFr{gԋ&A[ !*Dc+m? QwJ6:>rWuIǝnX@6'T1gDH~a^&bEa[$<iIP$_eK+1&¬AFs7TuEhUS&I٘dy\00 0wԏ)pڥi!lf*A- sD;Yb %Wg+7\ !"H_w39Tf!C'zY1DOC";"Pů1hmy4.'6LK90<~W{ÙH -4h'=l(?Q`nP(85~I;nXf)f >\=g=T-̞w;1ec?ozlqsoo3w_;9.&_U5]'ANKkV~b0|JbFnXP~/js*OL\_:uS"^12[wOH!+=syԉOjuE ]GRXR/vf$f1 !m:.'](:FU|#>ԾጿN=J?"!Uc75d?/H&,2ˆSKx,BtU)Ax(5i)(-,əUĐLfZ%WiExN5#(kt[s0̿H^Լl쥞5hmT3+q{co)8(rbP7p}E MAa_iod n ϋ'_a {^Liw(qmrqTsm%; A coٳq8bD M0؝ >7~ZFKc mza%cnX~4g*DC`^KYQjo: (qr(6N(`VPC.>u&X٤fe#9Zcq5+&M7~l 6Ѕ}PHKp6BOç3m$%82M-8}{Gx, &c 'dGp" ڼ'i{DrǨW 8q*MJטp`;|*/8L@waZ;ҋ,ך|UY MtuS8u[5GΝseV31eʬ`n0n+źbݤ+SE%)#嶺np5|vaoGٲ<6\6FsT3MӬjPͿ^+X|7NV a^$w[yΦ.sNu6la|RԀl_|VdfZ$,4,Z<0|F!ѕv(F+<4g;hIIw{< E)I\t \bx/K`v_ "a;`HϾ)|$G%" Ѱcq tswsf0l2V,\jч`Bֹ7RDL:)R~phm!r=ͦ dL,$Ðk7aRu 2?=MF02piOrEPo]kp(C bb*(1 Xec k*pR@iulŒ׍?c5AӟO}GyA eO;T1e!6dHa_xP%b˘𹦛V tHRAHN?%?ۜhk !\yS6N4DO d80`~jYzt~Bn@ڕ<1$6gM1=hzoC1 n &m>{) ֥O̞k 5*<3V.O{/P^FU)s>pMv]: Yzqr븼(JM$~9dT-ߞ8+|:Kڊ2' 0nߦd^xWpA@W-Ïig`if8W$"5\̝P)BsDž&@VWB֗uts|KG& Ay'o*b%UEhVX;?| 39a`MJ~]X* x"*&l 0Bk 9L\c*\;Y; 8ܤ1m~|x^?ڼYt*E 3Te 0'M=r?d[4N8Qc6TG\?=I;مk(`O!FԘSj+>9`&Vl ևyqm 9/ <FPq/TVp\o:# ¢npeA(;7I6˞D {uCcq>ڨ[1S/cʛ҅9"o/V]}o]ݬr^^joKV* -is c<&%txǥށZKwx]J!(d ?9Dtvj[u}Ij;$X-qY5%ZI9 %Rez~vf7|C.zRQVcjWmt/+eIHUF/iic8h=&1in+w$ l̪>cޓ : قU%.;_ 5D8r/2UQt=Sj'!&&{ қ_+7mVQ*=plݲ#Tg ioW8Y]5<0!lwf?e?+ 9T.ղpwq(m6 yCܿp|}`Q)TvyHGKC+  Tsw+dSveab(E֠&RbMp-($ h*/G?r!iȔ4.Q#Lr" W31Vdo}jMv9tFFRR /-!׏6ʉ-[emrَx$@&+Ng2R~ΑIǵ~‰'t?Qmǖv&P|L_&8 |r$>{!~'3"&<9?('%1͞TL m#[lP;4$Cɤۤy*,#q4Dw DSZhP:Ut[Fȼ%E]||\x!pQM^0͗G2g|1,j[ե;zExv4uGt.=El-ǖ*OnՅiĹx df)*m pq?* -7&w3yQKGPbY2|g obD2g|Vx -$/H3d當?ʚ֓?B§cEv7m=-8<\bUf1fr4-wkŖG"H$vVg6V>!FUQP9]9f^d6#g,~85_Xw)6L5+pm(vɉg66!`ثQa㳇 k ^!k1B-[t:\;4݀C3O{b-( ƭ~mZL./f B˒2[*:]F Q,-'}gH!AW@OȔNgqu::0ZRDck5]KG6uCNҝF3^ڬ]?ve2x)2P'BM =/aך19 Z5c{W5w|rTXT9 F!9w/?Dig|W-2_4pSJ 7Ã/VQզf-y9uWIH@v؇ǎCbXgûSdz\nSsTͱơ7 鶶KۓNGޞPWT?PgTM"^n4LhgJz9 rXF8h\g*GWxiyr0^+7.LlZUu1<$Q/= 0aCx1z]jZ1m՗A_ 9Yr>ɚﵬC~SZqOE9.}H' '\Ɋ3 : *RjXEb°w2cB^@sGACܛ<׃9(_L X!F>ϽR3~3p~~냡#l @ p[1a[Q8VqM&NkryX!A=R230%q>{D5}q6ev6|fD) l1]Cc" '-t;pNɛKj` %hGt@ {`I$9m_g? Gz|.NY2qPmh3m0YK-B"7+ nK5DXx|r[rY*Z'5'ٝۊASmnXO&B lӆWHσ0>3je7i?,`aЌSUO.vWi_= LBV,` y9T2AHhU̵P2MNT~Zl6'#ϙt'g0E>q<'c0mQjS%B¾u3Y)B1a@U JaC>6M, cBn5z4:1a s@IyE3&ܘRw5DnAw*TGF[Gv뿱\Êv Rߑyf`2Ma工n=d}H^n}vR^ɣ4>IT U657oz1vvoHqeپZLnpJނ}[n=%`ȑ:J F?5y~=o6HG4tZ/ ʅ薼eS 9;^kWr([la*BPP$?aDldD XS?OO %` bըswW#ܶ w$CeBhs9OϪɜrdUTqParOTr"Ԍ``EB\GTe:^Q 9Gsp2-WLɚ ̤?fj;TǾjy'^*Aݓt\*<|~F\*A3r^BSGa~P=qW# ҅ڮҺoϕ[ɝ ?By47ЂQ qw wYQH0 W^*֡F35yj=8#8{"Ɲӗ0ZN ׬ YaU1Bק`' 2NEf jR ;lT#*z峪9VY]g !jArn_^za3M :,ajt-ytއQ3i\y=妀߿9R^zeȺ-jȌ%0,fN4{_ᯥؠ\Mj:Heq2qde>z+K\֤ݣJ߭!=@69x#`}7/Cc!xm܃0ō,q47UJڈiJʉ<ˁ(aW8ܭRh\xXg?Az0`w 08iuY)f`B&tWq +PEɯ G#8ŗu,#%3~ q'f$m9- FdS' nf,nV؆It4PWrA,`M) 9#acAEVO `f 2qrۙ8 /,>endstream endobj 165 0 obj << /Filter /FlateDecode /Length1 751 /Length2 1203 /Length3 532 /Length 1758 >> stream xRiXSWQ#j"! RIDeR $1Ʌp BHnU8h"(˴PPYDxTp)8}Jgs{{2 x']Gi7 x[P|B! (Bsv8k$Jp| lHTɇ0%,4cl#lB%xだ J)#f 89?>8P?9ďHI;Y p8aN3D<?'e.$#D /05_ >(=<>d,80Nq,^24_&-8o tV $cFv@ bDjUtl(.%$8l.0D;p 1Ę_'A#$!Bc]"BNh*2O^^x:#aD"DT !DH(`|q0#!6]&N^A?Q^+|kݪe}$Tϔ+FZήL{eW`+EVR^hJ̨"퇕 _D1hw F7|4v:mOԨߞR[BB g(x!9_Wu 28TKO5(<=;srEd4sFauK/&U&c1a#Uy)uz';x-7nӛς; 7^<әvUʕk`z ΘYKW޾G5GնfF Mҧ~fv֢r=O3[eY׈Be^;|Mz]EK!.Ӥ}dn.et]"lpi+6ϿVp wӔJ{^,?-x1MD;p'_gzBnt'Lڨʬ ^YxgV) ۋ 5YEMvzT%IWQPf7kV-&<HrVo`C|߲*#A΍<a û۳#!y) $Ѫ Uz݂ސ+ѹDM:B-v쁫d{%O}4P68q$7u2>F^e؜F=+؛{BbK8G?Ѻ_"9,qbqɼߗ M)>hvpRrIbS5ӱY5m}LԺVfr:q׌W[E^.ܛww}ir<}4cdh],jB|8-ٍSQK'dő/*j9j1vfl+o7(;2N;_*CSsnDת) _Y=18sYWWIIAziwʔ(U~GaGO1ݣevJWbذMyL]r³[QB,~yu+P%B%&OY{w-Sy`|rǴCZ֌,Mr"{qvwSw?=),S 4bBwjܺ^|Z^E=f/>ī1xѝ`߽W7bjX`(dz~C{S<.'<%D>K՛endstream endobj 166 0 obj << /Filter /FlateDecode /Length1 751 /Length2 1212 /Length3 532 /Length 1769 >> stream xR{<_9ig)93nms!6͘yge}bFȢl-1>K%EID֭U -vE}t?k?<|}~{,l, vP @f2q@Gr5@4GG5`Bp`bHt,FXLx1q, 4XL>؃Y:OH,Q0ے Apsl`])|ߊ0%L"C29d+o &?L-w󽙂Ey"t/W#qX 06,FSyl$R3r0+!wD /0^nmɂ.WKk.Le.r0Ld#F`ŒB"_vJb1SF&@Tpʆ~,Q '"8ǴuV /0hl 1A b, "9;*%HFq!y9# Kac9%gW)w+j+'mQqVzwi*҇-ʊ\?6DIN.:5?:sC/\/BÙ1͛US?RU|{2'2L]W>}Q%sGWl=LWU]ym?-)'wn8YEލ9%Վ6*9h6yv(ak;7ƭ[=q|닐MgmoT[3G7Q}:%t1ՊevKr)\u /[Kԝ_ 0;c?yg2G⸞1z>+k NK\V]2P㙗ԥ OTyá%eo3,m垟Ӽ59gZqR4޷TG曓ovpJgSĨJ^^tQb<o5~2Ԥ> stream xUX\벮qMpҸ[p\5H7n]Hpww !X{uLڗ\goUU__4% @Y- RpspaK͡ X p q$l/k _ oNm#//htN[XcEI&XopJC<N`!A.oz MsZl8+qsX ,Sg.A p0?&d8. pa2@%7VR`W{\>.+g5@K`Ԇe2S,6q*]AK#,n+2#z{5[}\49.mw/3=wh~b6]ά%g8WcE]6t Гp C\')im2.u w[ht?#nH5o _]pt5c奊*lni`Kωd%4&̏lyer΅eۦip 1ʕJ(Er&/LbE,̦NwN*8ZJ`buzvp .ꤼ#j_3-(x&ɺ[ID1JD-17&tѨ.Y &ZR CF5|\،+$j--]k*!|d\,{7Qfa:BmԫN]>[SO꠶)?,l, /4[RDoL#)jfթ1{ r$\_ .NNz S젂b'l*zsuOAw +yZ*E>mg 5],c8Hka?%ZgxRI{‹-"/3i8 /M-5c3b8_S ⿯PZߠ][[Ώo!9C.9{`9dXSV 3R)!h!+B9q)2+MR.l*6gd=)˒zБXR?j΁wvOTue@pW7鞤kcs![&>vKAׄ $1nP2;#OnI$zl*1'ԭ\ !9_Gv1SOb2*~k5$KOQj=!ފacv:{i;%1rR;H[i+òsJ(6.bl#Q3)!Kq?|]M>Tf<_x nNOɿ j֓ژ)!].ܙ 8&=S;؞ZLϋzUQ  v1{g"`lD#T]_) I^{2w-FGC1&bdMnK?M*l5<3YhVZ3sqVSCJ|lPvtF<>DӕEϭoۇ]LS6BqV/. R2ܣ0daB.FJh $. ;S%֜GV Bق2 e['r4r(6bo@* ]sAO ~5}ڞgIeAl=DKrFM&%iVX9?IUL14zF5Z=s A_oY{EYܼ%JJcsPԭbpoo-n[07u$$ǿt4?kY>ۣWnIj |MD. }ťzM*!h zc.y2?g))=j'Ac\&+JbUh>Q-Og{}'j$UeTwܿ sGW~gxM^/@[w4 IdJ%Hܗ 0Nx;|m ŤAvpsUP47*7FL3RS` wZEʕ`ş~ă)?{'k \7sK;t{HMw7g#.Z]RX,Fc|bR/̀޵ӂr*&MH^xL6n9;FOo֏l$"bs1(hxԶ U7)sۢ4^ڝ-k083PR&]`jUٷtҕeEI F/g=\A4ID~:S Hk@Ǻ Vm{`IPiԃF`๮"Qh)Go:IOj/bN6<][+#~R_GUC,t|>c>ÃtMvp1ɓT&6X͛ ivEdO!se5q뒣p"M4T;`dϩM5.{w91bMd&D3{R>TpcBZĽF eգt"D"&>-5O_}M X%J#r3u'W%/jZ=^ħ +Ѓ(>̪GD5#6I"2D+[?f $o|){'gc 2ϱG(s(9S%$ݕ_ƹaUEƥ H?Lv>91oaoh+A)uI@z8K/srba/v3G.?iF+ *R#\t-k{ߺ8.Ѭ4o:{xB"[Ц{\On01"а7N*^ezK{ZX*: &DfdeP'#Gx)w#qYd K٤g& ;f9"CifWWB~ND3vb¦YŝQVz7o@2W׿󾎭%,ttoE|Cdn˛0~d381Dz_;).10 #6܅B'5<:b`g1Ūh|UB /J"'ű6Zͳ8SNe~NF88i]4tˢ $R k‰|PBM`*PP쿪K+kE hf󠷛rh]KyT](#Gvmŧ8x| ow˅sa#iÓmJ 7DO4MHrK Vcዼs O0i`?z22=wA N䕮T&sZ"YX$|>Ue^nܳѵp$AϒkOql;5s V~':WbW KkP%%hfd{UUk"֣h'DVd^Pr[:҉-k:B7rix /.E%O/䭿 vmvޑ'DeeZ}L4,BY+bG.\nWNq$[xQ+ɋO+]bM|Ԝc(|!4CzPy23M#b?C;Q 4%|jiLwqc8CUCt5hvYK^F[5؎r_[cGISWVE8[ џd7BWjEى8waҕO}fr1by b*\? V{T7)"IXw2eFYH<_}PLζBems+j2:eHv)WJZ\jJ-Ŕή<Ի:#8嘛o8uS_cAIyx%%"S|t_ܮ}^Q 5o>n޴Γcx$a%Hl؟?uK\""oo']9H$&n)$QNGO}"O7]S-{f8ʣT7F0vژį2WWecċ;W?GѪ&>|url #~|&>yސLu;lgN9L!XkbzJ\q%ĕk9\|Ƀ|Z;jp&֝>^i\s+]1}Oּ~ןz}:RӰ>rS|+P10ַX){t|b=튳5:@)?=kЂ̎& LV,s?b&)>W`զ=}a5m w#G1*/2b K%և>VnkKvw5[ƹP..``1k/~ԤQڮ.A]4.c]Txn>,G|aXr0}-pBpNwj^ץ{0>+!j>b5zFw}51P|Ƭ&21-8:ci Pg3oznGΠ)r9slGĪDbIE`y?y7{ HaJ<]U73Jq9iG~"nK-޴g 1/aٻH4 ;٬/VS.K~ 2S6VgDUxFc'ј'ʸrQ/ ENFReyUm!Ήg@-yW?=KK|4Xd۲^.Xi 8#"'1"+w}i:S/ƣ)-gM;3f_|knM]SI+N6#L5ek&+ׄwđ)=Ӗ^+Z# sx-/Q;vP?[uX>Aw5ǻQMMrO1QxH!Ö9ck/Lltߤp?>DK hb_"endstream endobj 168 0 obj << /BBox [ 0.00000000 0.00000000 650.00000000 326.00000000 ] /Filter /FlateDecode /FormType 1 /Matrix [ 1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000 ] /PTEX.FileName (./figure1.pdf) /PTEX.InfoDict 45 0 R /PTEX.PageNumber 1 /Resources << /ProcSet [ /PDF ] /XObject << /Fm1 266 0 R >> >> /Subtype /Form /Type /XObject /Length 23 >> stream x+TT(c}\C|@1endstream endobj 169 0 obj << /Filter /FlateDecode /Length 2121 >> stream xڥYYs7~ׯ*q}sgԮU^<ɑĘ,Yo7`l9 1bO,RYLpm _<7"!qbtWRI|N2U ËO Ό>0^݋NpV~k<iݼz5F x_/6V3{_\ic+ztoEk$1=<>3?&z onY{!)^E8 Iw}?Dvw n6F$2$Gh|,"[dyچ OHxnGڠjҰ=<-(%^N9҃)3;`uoI[k|:,E`o/Pv7_L̏Jնg>>5l'?nBڕk]t⺐=6كD(C} ZCp"YeHv]έ.gc\*3^(Փ4BzCjP$۩,MdjHm/$ z낓r 9Rډjv[g/9T^T>?B'Jc2zGs0$'@My rr:Jq&5iA"5u6cg;QZVw]H&D@O49!)F$iK9KDdPY+3!SY)pRdxBobH[fE iXQ Q,3Z4}Je9Ad=\-\Morމ#Bb\i%:ICO eSW0%JɷcȂ5E6:їErD3g$( TTB`i|ՊAQ%x[[8(ds˗Ȇ+ډ 5X`yQ.T] ʫ b ix)?6v_;^zER)>P@jXy j7iQ})8~TU-hd`E)_Y#/Pr`o{ e:_9M)D:fq)ݏ1H-qmX&%MSO4 f"ۤ&|d{ )|5>.m 訚z$mk;ԧݲlX~-S6M@hq(Zn[R5:d$xڹ4c,LM>0#W.MR1̈́ЦF~Pp :U*AkOrSʛ=]vidP*j<Xv unN}g]~mLN db$YTXW[Cb0kEWcli&v kŨ0?Fѻ}/t?:ghRǝ;*`{ A( IEGu&k;蔟 ys͠6k_"6sȕlY%%*`/J*]F\3RO[NBd==0bC7;I :lY*wU/v$'Y2%!%y-)@ ~ V2!LaFrJ8#$L6(a&grO{A_ {٬2Y06q=񌯺s)B] d*D#'lA28;YԒig>9tPr}=ek I6slqp̣zͽ/Phg TcC{lSx/W><9Pv8st9͵~NwA`-te&{ADQ39So_P0TǏZ S^.s&R#4Et4b4X a;]zIj*R⠎m:8 C7>> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱhendstream endobj 171 0 obj << /Filter /FlateDecode /Length1 10820 /Length 6963 >> stream xzk`Tյye8d&$5<&3y$d$@!7A!"<R˫zm*RER/k hBMK)Yj*ƨ|`ɷ Ro}sk㬵z@2]#Nޓ7et`ۗ5/d}lX[`nϹm#݂ぅZwb߹p=VW{xs; ~pi 9|}]s,xs A컖-!*bXF38Αu## wc? 4$ )Sa0Ki` dQ/K s&d!óL+pi-`vcc;pJ+ >YBT,5I8v4bЏmcX U&wkvq Bn b hμC+> R#.U8;lq1P`X=<Wz6RXecuVq:l3l>ep?8Q `A7n6J I,D>15N/q.K;]1/)9Oױ6qZp ϲ[NS-%aExuS ZF)IpN:S1*#vwYww>)W$7(5WWs?qZn p9.9 ٰ耧rZ}'@jr9 ~(a ap RO5(;UKPf61S浣*Jey kB )]y)Z7O/;0:%YU /H4xS6+ҜضeN3"uaf?}zmRj'ڰQjU T;s c*3 apJ0rhMz u CVQZ(/M"װU 68lt.,h.pRێ#f짣HƝПx i"I_3pRV\Y Hmm; !=/]XȀ<, LF&# Do&1Sb&;lޮLW&6>7cnvdӚzViKZ:y5 sX5ҞaT#'E _m2f"k gyU%'RꑳW,xj箧(+~UR9FޙWFZ*M{w~Xյdfz>5&t!uaZ"ў΃Lk5]ΗܤLYg*pɕV'ԢR:!'s/YE;22IIDf3MF?G7M#'^m^~˦;l ,#t_dM/+٫kp|+<F^R1?j74֯MY%997K+H6<̀wd"bc^,7X s#M5G-ws(L _ˬH+#^o$#A@:QORteiSfdH ^]8ۀ3<8= {FR0/U~deC!=H%iVctpsHHw|?:\t LI}V1cD]TQUYc1ƣu68j=ɪTkjÞ@cLA4ХڡR1yHS;l*2W(313fՉFm=Ke\k Åfa/ӣ͑P@PPM@N}T|u#r&0"r i7 }@Zf?#=jv37$">oT7Nu:'M?l12ʪj̩r,^,3[)\BLdcfQ6_ϡл~unpS|au_~_gOl.1-3YlGgb!eK9BzZN+fU*5%{,D>S[;JuҰH Gs 5+~k>߾{WYvT+yRlPG!h0[&S>8$yK ZkF]vzUZ`voWeK1Ǎ./CcSi+yacYg!fpr=gݞ4靊Mv^jɎġ;Y*{{Xo$oQv))\Y,0/x:@dSTL3`MˬI*%Қt|fCs}+?b:kzWS%-C,s2K|Oyan8 hÃG aF@*G\kBAqݒ+X0!ΒğHyMsE86Ԭ(h~H#;>.mg!%E uF:Ӭ\f'v_'5~PǚЃ7,s /Xa,ĤRhѺ8O8$, ) J#g]k*,òsøFČq90ЃEw1|8Y{ 14l^PA\fq&%CVC򇉃Jn1t1CC͛ݕ$]OJs"r"hʜ¢C* TbKw֑_~4ks\2,I]Ђ[{ϵc,}]W?VNUoX͕u-w'x ='m»e=oR>}hhd 2p"GwqAэU<2 _7 Jf:=(,a w]xc{l{5'MMF3CbO:l;S| ExIq2jM|w~ԫ$6 1c">ԥpUxW|⾾w= .*oY׊& t;Ov9 gOCf6jZNůJmM4R%e6v"=B@t<#SE(P~5peNBʯVkf^oߦ;Ӵ: m9Ind3}ŭq&iU4U=;.46St:: M܍ +|'sVEV!~UO|+V<7ZgE| Q_ 'niuK6{ ႥZy4vA4ɔeVU trC1$n߱x˿E= Xs57v7YsZ2zK!W9u[޺II38OόE_,ٰP +^.cĈX\1+ 6XX#˰^(FqiLœo^}0by¸+߿ UDիFklc, q+o;fH#1 (vwױqc1=ck@ĕVaZیs}{jxTa/q1E_Ο{xTƚPnZYY3%W{ʔe^\i%hL#35uu5+L7 {?w 1NJL(asPVa}KbK< ēW~%aĆK+L|8cYQ>۷{͡`PccH8 ;g6O^/ۘɀ{-`KG?VlE#syF;GL. Soͅ }2J rRdlLj׀NnO)h/L/,>+7:yBcݐҁ׸0`!k%mvuփV[sǴ;`ܵEA_mXGTYӃ=h+J7ez}i_Ii+wX@\9I' uәs<4%f!Zo3C=!d z5 MO$([ Я`{8ٔ<؜;=I%CpCtD=Ƙ/e#YW2SC6^.* @@0r!>9Ț C Ga&j'S'HkZ')O(G~V8biRa,n8jq²T}Ach{|Oo{"|)QU-Or5Exf=N1Ro fl!j3 n޼pa&šS=ljQ! }$U4^YIw [A2]Nz迋w")ȋNK+!|8k>x[Ծ,5$u Uۙmn4r3NiJ4MN&(G5頑 N8(~R[ $6ǵx(JB"lv˵N6G-,LC)2]38N~WDjDvJYEo ꥓ЦN'iN!W$)Qr-i<(J n$H # > stream x313P0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.ʛuiendstream endobj 173 0 obj << /Filter /FlateDecode /Length 105 >> stream x3135S0P04W0#S#CB.K)T&9ɓK?\K(̥PRTʥ`ȥm``P73`v(PՓ+ J'endstream endobj 174 0 obj << /Type /ObjStm /Length 1120 /Filter /FlateDecode /N 77 /First 666 >> stream xێ6L.J3<Av)HA-pB•oA%@ˤ̙7+l qxUD-Aвb ;i-tRTE>)-ڬlT- YIEvhYEض٩[ d6Gc0&e" ̐uؑ/2/tIP%یp@IG\!{8.>0:t`98Laa9ڄ,G' @a 4CG\c+-ba9Od%RD,s8X3: M^b<>M&G hlE/V$Ć <%yt6vS6eTrɝ >{4Y7Munږ4=YA 1懪ݮQNҹ٠@D;i-0?=)eT>UnhG~&dpryOJNivkUsWꮮƘL:meiyyQwm}޷R8qߘwf\crAcb3Svb.!rAւBqoC*nw W;m(]VNWeFa@+f+sq mܟo3 .iN2`)꿬`CrǘP(^_f9kTke\>õ6r*6vxqJ mt;&endstream endobj 252 0 obj << /Filter /FlateDecode /Length1 998 /Length2 3618 /Length3 532 /Length 4291 >> stream xypo BB-oo?C#H4 @HwC (4#|r"dQ(Y@Cҍl! IV!>?hҿ>(`||pH,`A !j3E"P>(W-74QH ڑh?Ey鳀8߿e~1;XT0@dȁ'KAPPX,<dRd d`i4G>{a?)p,tps|/RڿH "e7)``/"G^E*o! F7$Br)ߐ|`oH.7$6&8LJNU* Js #!_"/tB<3VD ߣvoN1}pew3?񹺋{9l 4 A_$d.,䄶cWpMc_W(G+K{7>YZ/rlʍSTmdU$gXn鉧mxMt^:\XDQJ3N_zF:E&Tޡ:]6IUtP5oC97PzM7Qmfo{R32m P/iMiܫOcq&U#gge4k)a`QʗwLbj,7oZV6BE as2(ݖU(\sq=LdbL:=+}{܈ kHXjܸm!CӰ#Bi?DxHIH1vҪ:M\fKoO|_1nEIFIzң0 7:=PTQ4t#37\+5'%o {YG63O^Ye|TR.kwz *hWDe!5$մ^21!&i˒P&. '>5vEz`'Bvc:,$X-zJY9,3Hg;F4g;M`L%o[caĭ-gP\ 6DJr}vpÉv\EbE]V*JPUN2}'Z5!GWJ>H-zjmq]'^0H$(ld磖!}Y wZ2fIڠ,ҁMFXHY;]߄Ott n b.M; S)0,w!5;[٥+3^ wY3jpQ o38(V'uNE|Z&jor`C)u\c(6} ʣn aexv󪔷jWzBr]f8u}gBB䈏>S<јamHߠ|gg'|?N ˋ L 3kGGt!'' pikMp%h:wF!靖.//(~}ʦ̖ Ho+xL#+ n c󚟙=~ڤ}6OXQ{BzfK>Hboժ02w3ïU`WQ9l#Jh螡w=SgOu7o; ^?6h.֊r2Z2Ǐף4lDDS/Nv  H Bcg?^ձ6V{knվmK}7Z͒Za٥^b B9aV}DX|P|b(؉q6_ݢ6_RUml2 j/KN{_MmX4cX[vəpQ+_T^L"(pC)25xfʣ[lʎ72<yIp~Η_ iڛa`uԾ=됃eET. p_U Z}w&:F.m`_ 3}Hst4E_ 煰]NеLRFֱw/0Aӯ2 .)ԁus1{9Zzdžym1u90rUPjgY ^'3fiv* CX Wgl\lT;ڔr&:s^dArvʚ%-Tݭ&[ׯ.VSt S23{gN`sSX70Rr̋is<}aaCqVlL0N V߉6xh&.AK9-.wч<},겿CgԝI,択74MuWoQrZTG㏔٠1pwW.(o]݀ݪ.40$wDXڜa5ޔfqEK|Būl['IGE7(XȈ&|Λ[(}`QT*L}%-q:_5kq+5LUs엇Aʟ^%iϜbxLtHJ[{Vrs.tz;HD@_@+K=#-itKF .S'imDr唔JIO/)-]| -LF6 DVrV<-qr , uTaoڏ/QS W]bpڷjB #gL)Ѓ]zݔ"Ϩ-r,4Xs6\%x*6dłFfM;d}3.$ ( ;aO"A:o.L]"H> fRQLt2_Z4[9Tj&]b:"2/?B'߆J?R[ʶ7ՀP1o3 קR> stream xe\miIiPrD!nTFADKy羟>~ڿ=ekkǹy #'6%8 O ⳰# BB|bb|Yw;?',. *g]vH<_E"Yg 4AH{37@ @Ax@lx6`$9!U- 򯰍˿SehA6[|^-8J r6WrB@kH- rvzW A46?K! qpwϬ*u_!7%/lA !04xU Ͽs: 埮|5 Q-EnC]!ayn/02#QP3Su! 0(W_Qk}.0S(x0?,Dz Ԑ^7(!!Pz o&THP `../7&u6?D@?%t J7` J JDNQ|~^/(&* _u`w!@)f[{xA pDcJCxbx96']cVmT;A|:xPݕsm:--F[Z6_ ԙ_[϶}iM57].B~6L kO %daW0voGs"&JPÈVGz$e˞$B#pmdo~Y~|jN9#l uڃ^Ep 2Ff4^Wdʌ 4Ƨ¦2߀\ ^*r[ze5ょhVbvAw w‰]wNU Lbɶ2>b5YDJ\NöxE>32{]gva<{ϕ̦?Lb&j!v h_z֊ݝvbqAU͚wx~wi2/| E˦P噸|Ւ7l96M>6 &>O>|o' */x"~@P>CsDr36DŝRO{~ҋY9 *>I4FR]V&*UD\ޑG:xR=uzhKNiZgE|ٷc?6QB`S9~Ƽ0bܩ#-JEӋe^e|įJ'%)x_dLNBDfy-^Y/_t19?"񷆥SJ)hCGm--]\&Y1O5;%q1sR|y00yCv ν9lvOCL;x P٨u /pØkztB}!Vo"؅RBϐՍoV}̥2鎥0~plLSdE<-&Dz~7 (UoԊcv:z2l͒\P;;@j#j徯),,⚄pPMֳb W!]aT'B67cɼ}x׈sS^3Cdn*j )ݗo[3eAAa/W ^ȓZT4zW7tdMÖiKfM_SOk;H'2%=k~sTAސ2ʽD{عe4.~y$3e[E&Ma[駙7ldjU~ֺP.('@1I"=*"Z]Bd-\CƔYp: )Dwo+9חΊiڽm[V[Zrtf,|D^ ] op})~}g;Kc1KrO0ձh_+'Q=OGMK#1CNE`Z6Eky>,K­>1mLv抴N,\g'AVo\%}w\pN?ᡜ)T IVR0zCWڽl{,b0[GjȲgOKk.xPo=ކGՈTfMn: haŹ$dRjX1܊De=dc`9yK?NHae z2ę-W7hNE9 `yvK዗-2[ؙp"9 ʑK3 dK@ݷ<4!6 QSU{y豤8kb mUfj.:t1F k/RT!uXe@{ՅW!𦱾b7*B~I)2k H}̷ 92wt;wayf \Q"~JG&x,*nvRL[ yU48w44?:<R.p\ űp",ZaT7I,jw&63gț ht.c s}q@cCL@=9%.iV^wyW3_S1L qRf[5Wը_| tT=b+!-'X,ЀJ3uzP'"I B7Qu{L0~ˁ֨!p-bի3¢иZ-h L3vHL\)H+# hCfQf_s7y<-XB^°jI0zVDP/7ˆ_jC4>nĺR?8q]JgoJSRK?ݟxK[4Ee2)l[o|樚y`p6Ԛ ~JޓyMU5yU4v;͕!iUZAo(!=:n5@ ]\.)KWFٚ)y¶FbMdj> b?XLKX}TJ\e i|RAf2if f*T٪]B@d&52[?/xE/%^֊ZDФ<*3UxHF`>KE*] g^zkF&7rr^{R`nM3 TF>Q_UmNblJQd[$h(,/|Sլ)´~cqaU+U[qRy,A4T DO5|<{sgC5hEJyUyi&De .=mk!3|5$iq@DㅹtAK΍Ҳ7~Of)NR6t;bdvszf|G lh,.q!F"⩺>V*>/F29zECmF\1=8? I M s: ,9x"hsh95lk*1,~s;z|&(PW4t/_Tn=k[bEO|Gνm>͂s2ݭk՚ g[V9~+&$1rJԜX1{} Q\7{;ѻݷc]A>4 R"s"n{\u/xMGہ\ r+LtylFà5]w/U1+Z-`T,==k_"fBuAFۑnjצhC4M4 0ay;AM *u!#"=)v3=O}lTmxE}f,S.>it ć@m&*3̛.`m''Iif,YB+6-wSشngb"0i_g=f0.ڴS+N?x4F/ohO;e=XEu|iX}0!Z n}y*qL)']$KJZ^ZQ\ pȱSV;bٹA&/FQ~b%Ԯ[rwsŌr6K;V'FkTHrxwr*H"$cGR:BE0 Ū2=NP:nFYK&.QnvO 7?~dN(T6V26L1k"VupWw?@42Is侷kͺ d<ޝ1n-)3lOhҙ)`йcdΊNءҽM'0*]4U?΢#6܂5|$;,T4C^&eOw#_TQh2] [ꘌ]J/04v1?`#(U邹uISt m;[Ylv5 cQlE:I J9\X:j*q'{ɇ̛g怼WL]j:/|o/1{zwD3w[!ӭr$r!2g.!^da\Z*BD"4|oNZϠ}1ͅ=l$v@pe/د'?92@y8O)0T,;?#Y\5՛ UWw-$!^~e#D}~)3K6z;V;/%hWaG|gdjT?L>Zdq쵥Xp_qu>ڳ^_|T>-^ESR:nI:T<,нjM#Qt&yw1eɣ`Zr~&Wz׃&Ύ7Gft:-fH.zvekd.Ըi!_aX38q2U{mvckZg:1ogW+|/{8>]z,%}.Ž1c<Ӄ$ԍr,L: j 9.X AƬ1D]4Zw)Ik# 8vƾNMӶXwCx -3`RTB􄧬9B[Ӵ[n)^nn7R{c)69~6HG[СWYםG ې`5yhAuL4@MЧ XbEߨ_meiUf"Xήƺe#u - 䘟rqO;"W:"St`DPe&J9ļ)fOY7;ODe*̀yӔ-_ .7RjEdtkqAENB1Q zas#-S(m xrٛj3?fy)#F;ۗݧlK$+cΜ(||]Q13e*?NԮCVqO!.3̡ĕ+b:/u%0&d^m9ςR_m4NH:an[T"<-J +ILouZ.| zJ ZRvr43#(T=gF#30#Du4|XZt1'Ư9:I ^+*R6IRme؆mvp=͏VI0׌H_"kP*A A]::t0) ̲?t gY>'Trp)]{\6!֯UWˢo%u-P61ssS<.,[*?Xܵ_z?&E{9'-7ZTW\RQn,"ƃK*mK=c^ l_$%ۺFOFp44+ $Z1Tl fiw㻱8f%jPQ6o]n'a tؚugivJXIK`anm.<}`@8t,<(̎}bL54Dh2߂ %.dDFrSJˆF/|WO`)T?q Hlb$+ #w~y\+>w] Q=(*ץʍnjXÀ,`;JOW V`g۩R])Ȋx}"ulǕߠqp>w̆&~XG*hh]Zݣ O*[T›N~Bb}mhCF)>a%̪;`]tY3~у<ܖIDڏ,\Cl}gt51Pqu'j^AfŬӭMvo52L`<87E"Xsc#G5k,Ya_gx9z6];[m? !pg ;qendstream endobj 254 0 obj << /Filter /FlateDecode /Length1 821 /Length2 1985 /Length3 532 /Length 2576 >> stream xRy<5Qd /DcfQ%ˠ/F0%KvcWŚ,e([dl![sn{y=|rҖP=;hH&Ѡ``o T99 ɤcX 45 Pd ˛("zDaI Y8,& -H#T C@x p$lː1ɓ /{}A e Pd<,zI ɬY tKܒ om,OL@ `F)wodߦӰŖy3~f~.8a/i] ^ܲpj]<iʍQWK Tz&jt>·T5\偷1%s;朕p~u䅣>;2ߟe\ Fg>gb'K=44u\kRw\<5Q҈v}^kq<1{2ث^TJzF̠zEf~1lB$)'r] Oܪ|@tfza$/nD5]I-Ĩ쓮0ތON2VO3m'SM{W1€@Le^ ŁBs:*]&0oݔnoI,~.%=_(rN[~^ZY 1Ry*1=lo枇ZyƛUƔ{<t%]2[^T ]wq[Uz{M̥͘e˷ =AB+P_gpkAI)+o,6zJIsnԈcRw&Qt%&qŸ"E.No qVwhzVI|-itE~}U#`SojҌվF@( 4P6S=2aջ^2ޱNeQ;f41D&fÉgRvJKe-SLYY-̌O}(j GXގвzGcB!"]_k2i|o_<)ygcjc\kŮI5a δoY/Ƽ?kMO'("+YUAEgFхq8Duy!'8ov,N,v:*j(뛅=mSN Mu櫣*q/O00YAVzxaӄ`&Ӷ6>Q9)wct?nݡ.wE#1Ϛ:^27=cuh3L!|=q)}ν@ړBnGg O]bqWSBO] ^fus'ػ8b:w!eC}޴Wדsȣ-m͇Z"8mu6V'\ g9uSQ8!-kHME)JֶbPN{uְhIQaH@I1eԋUlyf+Lɮ$e#Փ꟎E9m4{أ4Ö/ yxTW b)42K9'GDKendstream endobj 255 0 obj << /Filter /FlateDecode /Length1 1338 /Length2 7087 /Length3 532 /Length 7905 >> stream xeXIABaTNnAA@K;K<t?ǽ?c]Zyku0ѩsBP3' ,RRLLRPg3T!.@n X@WX_B{8,Rl% !p#dl#kf0bk TkP uts`9h @@+lb!Wi hC- eR tԿ˸**5l={wq:PGjC˚- bgi rW$sœͬ&NпP;@o m ӿw!U?EG;PLDf/)i;39y&&@? ٙC݁Pw_9lk3<@+ 9 =5 qA&P;[QG!p~ j;$TA@fA~2A7 ARIz Ar .~ru*rQ ߄55!!^0ҋoB*C`nl RDZ@ԅF0RD"@rBN r@]@ ?i7 u=y=$%^>[#t9A^ y%Pw`na&hP\F:kUҲ6Jm/`66_}B(`s)Ր̱CTvg=Yǖ=Uƚɋ~T偂i'_3UY_h`/ҡV $jU0ҩ&:,~X xcStB|{opEIdD˫N ?;aR#psG_.Ipi' t1G}rS#l,DILjNi=&  N_,M@ >vB-9'ӫ!j!<*)t Du9qe ,긕K3Q/rF=LӈԒ^ zcᝲgV3 A1iyZ4̈p t1 HvHI8 F#~BO+9=N&GyywEc2HI |U"#D%[$ kW/\ Y琯G?o{.*Oa)x`TL[Ş* U֢+t(&Q>]Jc*AQa bH|SP6 C몺z/ȈurbTtσ0.ϭ7ac^y[4eR}Zf݄^ .tK%6g 5BHߘ+A<~^0lbiP!io-E 1-fEPO=x1~F"ktޚ2grs0Y݁dC!S6/z;߱,–$i_p'f1djrM~9_z~i]zNRT 7t찐; ";g<nK85 rh$i2[ZUКij,7Y;|4^D.N%Y~Dz ;'\`}MI䷮zMVҵߣE &<9|5EIˣZLCԞ1yDd~sj6_wHk :1^$3I.ƂE[u %é ܒkÚІJƪRvD2)aBaA +l{{+ j*to5lɲC#[}zUֈ )y ۶sFT3" YTk<+"[\Ckvq.ʶ ToAYݔ (ˁ{ZcrN$aQe Kkv%:Le)ѯoI >&*NѥV< PU'Q`!6|6zXOwYw'TUr*l5X=CZ,֪x,_v4+V3y'HjSc: z|ʕR-^iz2x88W.*t4 K,[`kqp -^Ĭ]̾㘡%0D&[nu(N-/uq~ihE):‹+5 QE3V%sB>fXvX$,Ǎ&z(w׾`tocLcḣR eE? r4ZP{K1)QX\,bE6DvI$r}Ɏ?2e $WxIj3Hujb]6Ñ:*VIYWnq}#;U)mƭ.b؛:Yڕ0mZ>D+oV{d$@)1r[GzeURȠTkuGݏJ'0 ^UϽWU1aSvd :{!PsK@0|H+|78Yþ&0SW+*9{#KGU>{M9U):[ UM\k$N(w4aIsB↍8e#̓Zv:DC(U[SzI L2ݨ*CvBқ-9g3罢P4i>g:zu? ;o5Y*Rϲ'us|O}e 9ڽ!- LժgS0OE +ܔ s,=y؉{ C/U|,1332T%(|">Ph3Jy0d儿PRCnl*ؙ͛\px3: ޶ 5#a_KjUMG#\f/MUWS뜬ZoI5:歵vdI SI%6DVׯqMƋ50sfpU5\ 0"be. }RԺ˜#Jn*;Syw-z%DAA v7җ+TɎ=AEӦic SEy-Z;%t&4.{ڨ9l5od,|=f( kmLҏhcG4 #Jb Se * vCJ ZJݨN}W/6>7{Qh}3l0~A-!yL 7s9I?z ~ BST}Ƙ|nq̩{xŴ3:vvvL̲CRVJm\7I@"Б,ߥ3b/h/vhoex?Ufׁ 26tJE<~>9sބ4Uɇ>ĉzB|Iwv!@k Ot{+阛13;} ;Hd[լak|ᠩ tyZeV jxpo~nnے3u- (!!^]lN &h)d do[P*\f-L9P]hEL=A'IySx"Y,xm5 \]-hϔ`D r<bq:'Kؠ3':Snf EkxwZ;{՞ O> W}s'MG;䁶C ml1Yyŏj(8?ʌy_!w|7_J#\5Ig<(#ծwO zF.k,ߑLG@?אR 5H.AINbW8<)f=}R~6o;rcVGF${e#zYwT:ٴ1API_μ$LÞIXA%Λ:KZ B$vewlE?bunt%i//& w(;VY f(i|sMw(ǡd^.f7Z?a̅kө}Oq㏶bW`u1~8:P+0QKnӶByh64ύMPٯڤd6Ͻ)qML"NW\ٿW'2lLKdSPF\oo;K"SGy&&.Um_9HnTnvCge "a8Ly+d$M9C ܠawuv/A9g *:p!+^|A;|LjU?WMl¨k?d~z+~G ?ޯc&-[&;L.p"V=EHC(sףr2\uoIC;i,4x,JV;5bɽ_=u;SH-U& 1'bV9T<ݕ_il iiY‰0Myn ς_M=wea8ajB-Q}ZnLg<>0UL5ans$}994 k'H3F+ 8;n ,ƚKfUЇ%Ww@ @ؖ>Ûg-Fe[,qdm~h{Ibd1N EG~\uMPCh0F໘\.ZrY,,(aǕ- pㆣ+:17ʡ z%}ID j.p%'TU*'ɹOyP mu v_g1?g`H9Du?}j/ Shץ3˩VVAbr^%&E .Jl\(n_+sr3_M8t[ղ4hmה)383Pgϖy0_tL,cYb" v- 棹!Lk@e3*vMd*eEQ꾷Q3֠c9Y2c)?Ử((smkuO,$+eXvR ˹8یq/7jĴ.1  w؅..hɶV6t4gHpW|6xJ䟇EӑBL4 0Txuթ§#P&FWGnpM:5 mSBd'qkDAk4nw?z8YXl̵x xٺl vsKղDVcwfl&s`HaLF qY hc b4.]j}|֔Qޑ%.ߜ%,'ojz+1ker?C쌤\N݆`=15vJjUC8RL"G_#'AM0uN, 30hO|sQ*;YT_(L"J?|l& %nendstream endobj 256 0 obj << /Filter /FlateDecode /Length 2996 >> stream xr6P4ځ'gx+G>h4P|v  ATT9D g3.%MΌWʜmϪ+' sY]K0\kEꦆ'k&Vų9a.._9_;:z -\pw+7t/\;_k!W ?|Jt2#uBgte5?K6bBs}&p|B.G--D&;h :z~OڬsznfvٵcS&%+eM7$($Si@8ZLÇnQSpZVg# ^=8#1ֿo&W7Į=\oȃF^xpGSN6Q[ݷ-LOst ="kϩ@p(tA% /)WGÍ~N&&]S)(-& +;%X켒#rpd@vDL:1e"bJ+OZrMw_hQz|D[r/ݾ#!"= n(Кա<НQR茚-#8ͥ%:I m U{D@H#?͎|σwQrFh@J4TtJ'jJO GB\9K#)8lh[?F¦=\ϳ`jXÍnhVkkdžUX7I[fd_7v~ Ⱥ6S5T@3hH;t&{/T?, LνZRc flOn}G^=h 44S8,ؕ:__aU1n2 q.MKI,MH"SbW.5M w1!%V_}@k4F7(k.8Dk%:BVـ wC2qL̨0 ͔t7$4Q263X'7qI! |(!Դfuj&%.d^oQÙ 9̤.Sȁ+R'm,P^sQ(SB>)e̪LtX :ԔGě4DP耑2*M^_ū}ܯ'L G!Jr0Z&J%ZL|9ȏ>q~UF{?'8t躨P =/g ,SP QfjEB(m*!7ՙx8N?8鴈.E:āEkN&#>phcTN0Y[\QC:PT;VR] Cߴ~0w dseF6ڜl B\ P^ /Ho^T =?U9wW_ϫ'U#[PT>˴*TKV5lO62%jJIYT<$ Tys9$ "wr ^A,e9 2Qz1A jzpu؀A}[ۺNSh f2n`x3cpqE _xՁj29; ؂(LO2P+wxǔ7Y)ϺS 9wYyZ7q+>_)D ̝.2;X(J^ؒuI2sS)}(/KQOⱢfEwu2&q[Vl^#. 0Yz}X&BMσhj͈3k}8C[ncPĹҽ;$5>n SX<; E)[n0X`r^Co|"G> stream xyҽԗKu@}n%Zй^ch ?"6jz jN)pΕ7 K͑ ;M|xK_mT7h730ѨޘȢ_oyGyhjέ.m (Y^3o+MLr>N T[Ekgqkv~&e#tV5g8s[@^_ +.fH 5)xr`]N8Z޵o%!L_^:# ß/k[|p|*C_5,Yxcr%LWYHw5{;iU C8XJ`< GS>78ʙE}2eYG'Ɔ^B8͛wZjZ>eH kkҕ%nPkl32T!Dͧug8f('*tO~r w.219 DYvXR& ;FO3߬B/zoP'z9З`5H/g?SZPR{@YL{DzeR~)*oXld}fZ?0){]Ƨt%S-Xj q`8423=]o;zs6"v0xo4y˘JJq{#=#E"ci:76Wy躪d Usc~]`O8Ue0E+=՗;1T!bsޑx1ގ#Uvx^m~ .Lpuf f.Ql&oZPjb`i 3i=b۷1`VMXy91LjzaDW N?Q\b tK9k9˧)w̒tgi{XîL>tKl6Oe ś^4,6g&WOAclOM<7cf_K6kݺ9xE14! 8yceU a4n/`s~]Ӈ=•LMXs.^F#5-yb}~eZg?ŁF3aP[/r!7wG?5Y-MhTle3>[+X!l۔:]'^aluHDez@R_?hٯ鹞p̢"FH-blޮnkj!+v#ʠ +|6$Cګڰ[ue U^'4I5*؍-M?qR$:vZN ָat6C9 wml&Us ڂq*^>v.\̙B嘞`}C%\#`bP. 'E_j|>3L~&ݡ)k 6л TOcT bBmӜ1UiWP{jm~^tTAέRyDњ׫焸<({MvN*_IBBF}d=J5ޓc@(rQb%Z`] '`g.pP^4C%Qнa|sԅ}9mP5[*Sy:K:Gˊ,5˻1#G V֊c8Y;;R$Av7$σ.,K-tԯX/kH%j7xrx [|DQYgLEzfW3}Pe]xHGg ӫy7=pFЉˆ[>.܊O-dE&x=k4٧ćk>4Iw{Z#ҊhVec%{ v M<,yWto|oIbG c0T[6>̎^<0oj&!5eg 87mwO}sa(A==,k^$I-e#ɸޥʹ; j6n9ٛtwi6%?-H1QmqpTX>ί *}ɖ`ȸ2穆nRU֬bν|ҹsTj ޴J7Ql1ߊw),=0]锧N,{m4G`JՈI.C`\Jɤ).k^dh<_roy2b$ :؏g^c#AvfJud`zu>TDք$ ZdlPT-{#_TܦCiTݩlt9'Ve3WdKN_dmM *M5m (}HnhCD}\s=[ݶ`U{SlN^n*wGQZr0%!O]AG(:yBF7CְG~omv7Tj}7wGR9R6{gU ΰ'/ }3v? 0X$U)7 M% @"Ap/endstream endobj 258 0 obj << /Filter /FlateDecode /Length 3227 >> stream x[Ys~_1Q&.+TlSшʖ4dt7 @oU-jx4>>ɍZtmo6SB6^5[W")ugN.W_|gFJU˛d0 \^sI܎to_|i hcbo+^5\G:]{8Zb;p'{QoxSVn 5=>L9Ї;lT Loizx8L}O4k{jZ \'l|h~t{P]u20b`.rVjh >wRo\N0~! _qN=I.cX8>?К|Ͽ4a D4S3IlB{K#(fO5*DrXֺ׏J5emP =" ,85O^4 RۇwɌfK ÉO}O>"vi:H-v`Z#I?>2^R^N? Pͽqפ4҄^! >ɔH^MūMk>PtR;gdAo25Nn,v֐4RR2B|H#N G:J6{{Jo܆,`\2sg>kT|#U |l2ZO wLG9b Q]6B"ՙΘ+l[VM"$;Dg[A!BQ6$ўM68 ޢ f@ zQI=Q*|r<>+u6TaԳGҥn4m7#K$*(adPp(3p`nf)1`T02P)1oG^O̠ʐV ՘0O=B鉹qR8-9^zl.t{cUECT?a8Eɀӻ՝r`GU!pG~ -B,Ȧ}0Ӎ"s C_ȟo!&ce;t>%z0 zzѪ$ k:,S1AtZB5k t'i:}&JVH]Ĵ/L6'AThZg0`v#[_t*Ea-hTfR8SR9<ݒc43В(rxDr<~Gl[po P]5I…ѡ׀=@~`(l)F[ma4?[ʲ)tM\rX!ŒgD!5)ҀmKxK9d&t-E#+ywΐ5C d!a K)wMI(>:pnM7fu0Mɗ<0-$1OM~;F/ t?6yͳz`VXv4 x^4H :3_(F>d3HeZp&4gbڤ1x|u#dͧ?c 4*%9J. 1b 8DuxBI'Ah>(<:38;_k@!V3bߥ ;(Ź`%kt:7漳$tFGG]9EL[Еe)Mʧgu3ݛp@i헞9JBN%eD$G!F4]zu5͌mFeF^;.P+G}D89xЍ h^>` XPGb+^f _,)tUAnz'r՘yZLTVxJ Yt2+jpՕZ B8py$/@92 7|ۏO! ~Y~H8v aSd[=I"EN$po $J~ c\9p훆 1_Em :%>"8YVCRJɡ%mf[7,moR3TUs( @fZ΄3;m4$n6pWSC'd tzcAMSs5zJ w6SX ry6mƨ7U qHED5XRS<,ǐ{й) M%@Ô'xHvH_?m5Nn˴bHU.6W+l8j湌Ϛ3P >R:X?f1Ͱ ;iSFz$s=+EuL⥋5^خRNC}xيl??Ita{,:_P\:&҆ #,B,Zb?9Y7̀{+zUy?trkD8tkM}u! 5M,MBgh ME+ Txvv,2s*/OlA~*;k4P3͏Bڶg: Az")B2u9'd+T)[o(vj}摪yAf>crc:?qsiW=`??ƺ4Xdty #% F͊lu+:=6![mBeSA$!r}!v U9̘ Id[1K0Ux:@{`A:y .-??~u3TlJFwB,.T]tA`+D[lP?endstream endobj 259 0 obj << /Filter /FlateDecode /Length 3267 >> stream xZY~ׯ#J7<|)qJv%ҺaDrv~} +YLF_7  .JƸY~&H _+_WZ`<`*ZbJ[d_?{ںE)8XHvQ7?/䲅ߎ~_ⵉAKxyYj`-ҙp)`.avg/i+mոi^K %< ׿XS)B5/CꭂYwg*,ệb.#}IbcI{6 ]K[h^h'p:9Ǟ])u4;/(=ޥ*J2=oz> EV-;T˅kTLUW&Å#l$%Ѧ{~gyY3 1R+GmB*+TQ8q ՜Q8ݘDa\uDp6H^@5?(a8m4>}2@aJHX,)ܲ-:t0#})q6e 43-koAՈgbq2!,  7Լ6/wĺ2| \im[| I~Gh]OٯaE&"ɅH[~3KR>B8B>(yS[\O]oäoY];UE"^vN!u=[f0OͱI RUBԽdYq>_3{ȾMsgkG lAݣT9:7BC3liKh1YU>o>߸-7gQtTѾ"`<]O=^h3H T'XO :c9 WT;WFWf WxA).g.^sFNF,+||Nj~^iV X!yhktudsK,$Y^v9nXcj-Ms c9|۫hX^D{O=1`ΔD'*}Vj2>jj\6YHZȎe| {_.cmD=L9cmxL3;Xt@G1i3[[J;iM,lwZ%@$vu2T}o86RJ"t52KLJg- D;%Vwh!c (ѧJ7CcFɆFk-7;1';hA ķGŐRmEQ4Ԩ #";ZcSH^Tr6mlҨɃê {PDRIt=?B)~[.+G22,Zw F'MZ5U]:[`KpϞ@A5.GtQLv_Y}M>4ѷ5ao\;GG3j,{@BHG'@~fA,,@ZҙCw\h!b焇5]P@C=Gu3W;D9|=wkӟNI2^$wx}큊xkNVW>vSU:øp_QFE䩚]&t)@XSW fI_>$L 鳛NRۃ>wp$;\ȺJV0ac3Oarac^r0kL1'Hp/dg|3H>!/6Oq4,# \L=>8 |zu;+)psCKb#M(*eO txIDC~6>4WĵYX*~\Q'2 3c\,=8%'^ kr T1p' /qk,M壘\I=^|-ycv6mXʓ^Y]?}#|DEqYl貾sab_% '9D4GQU 4r.6]biPZNZZ QO71mpm0?[͡#;e?'7x&FZy3޲*->cJjcUc(TuU4Z`D'oz$ KqXB @U=F4b/#A0#='cĀ옹ecޕ)?bjJUR׭j.iŢKP9WT r.~sitaimSAVܕIcPmThƣ9dh SӨF6 aX0]_ Fs*Q8s9幾}v1`\2VxȰX"o72\3Mezhw@'cWe^N䪌 !2v t*WX K7Mv<~H=ۻM#/ |O-4ٺ!`/ ՙJ[G1$ߕ րS/{xItyC#~Ք9h1 00-Cy;W1`q ՜3nD7fOL,1<'QvG^]3;̵c3@c`NߺP'`՘eD)Z!(2XL&,ACWԍhLICb1:$>pmRʼn¥t2ye *9fՀj^"=2..x/6+endstream endobj 260 0 obj << /Filter /FlateDecode /Length 2711 >> stream xڭZݓ۶_q'iƂMҝNI46m˓ZG.Ύb ]lw<<XV e|m/|_lȋ0DR8310❨nJZTuwUBg'^:шkq8dWoVWkz+pZp[$?"ٞf%6^@ֿ\KFx]W4Bpn-~ӟ|Ψ/'"QMQg)EHW9 j덭jCGZ׫X-N->=q2=nHCF9wJ4 tzq[b "w{F kU%g'\6pfqf=EHy?z=BZ@v `$y0hkW͑ 3ZAHJ7u)Ev]i45"Sμ24M5fd1[_l筱G⡀x0J ]/2^J>"D5[&oG-F_4_#ԫ>7Ihۀ$--,mďv hhp?)dp`a^;kgFX DG6.̦n'0R%c~ڶ_gl#Q E4V@R뉦M"|2E Тr2K תw h Ջ^фMiV}MXO'Vf=F㪚ع D:Eaݑg,{>2_2Erg;)`Tz7+`g lkept|w`v՗l l@o EkV Zz<2HV0n{ .y;rEh)$C >!mq؋2'7+|͚?Df=TBxs!*0f.R65$*W@iR+5L"N)ޘ_uT PBgb 2vyqDwgfc\Yc&3H6n2*Z>Ǽ[<HEK!}T9D5=t|@T<38mGpz(`ayEt&ىu;Z$ !Bw j^$ۡYS\܅B#?xL2Uʸc2Ӣd]W(/2?0߰PC YpfBHͲ&c:'[D3]Y#Mqt!_kgO1f:=|f޵绽LA7@fYQ^=ꌚh(sIC=kp_n/Xe,c!%8;Wee5Ӧ:=; 'MnGN2m<) :U@83~IW t)qy6=ۛрmpl7ygf Xlԍ0~rDj?"&- ۪qs5uendstream endobj 261 0 obj << /Filter /FlateDecode /Length 2880 >> stream xڭZYsF~` a̅yVC(`,owO`8.D3 Ejʢ֙mX- L1@~][e0]V(UVV%̴qɾ~+uVX\E +;Z =\~;#w9|iV.RW^╭c:Ip΢ڹE|UvEVjK:=vVFe?ys4Ƒ{O7iv$ϕ.gGޛְX@*Cj٪xwpUY0jy-0!)1Ň JW~!Eg>z# Y8Ix%N=_#Iȕ9945ocyWڡnsir0i=~>sb͈Xs5a鱕W0nj4ĝ>cn9񧦛TvdCF-N]4y\Vy~"A_z-E!::Ӝa8Q7 z܈BMJ4\e.&Pb P_ vZ|l$ys݌I3 14w

f4nʬ@'4h\bL()\LҍȒP'mD;/@5CbCeT츈tafB/CgP{Q6vA/]; >:fcȁ$3<҇IO.˭Sd&H)E}?ױNƓy?cy Me2ˈl, r`l章)PqL!Ef@581 U.˔GJ^ٲQ-THyqpXZ}NacE6(ŀ05sI']H .5wW rkoHT%, F(NO&Ӥ_bi+ո{ffj@o9Y%qj}͟Gz߬̚!LRIZk>쁿.2񬌄h(p DYg̈6ZJ։u&бBaH,>ql0h')B\ >T%@EMuo x~!qB%oZl *`AvbQA@sOۅys~OAk"sv{ڸdHЕ`߯1-^yAS@\iڡ֤.jH3eEe~m_0{ոK$.LPkW3;N)@Trcq^a=Yh̙nls%Մv$8. %P U@T&'Ac괊C:N.4N͋jRڰG"*2uI+o(uVj|HοiYzGtG#u\KPPJʷV9uMTs&TSMwQD,K?ɺuYtRՉpL[&D'3y? SAAJܔiG0)ΣZ` #ըk+k_2B oD24c"7QS0:Z` _z.Ukd3b{޳>DeKY~ pd'ᛂI G9zMtfb0r+A 䝯qM#|Ϊ+yz:Lk{f&^ G!ϑI{*eds~!d4Gr(vyY7/ #Y:Ŕ?`3' M\lP ۚ0X7Bgmw2]`S75 Lp,vJ 圑`9k:xa;jrjVyHHKֹ:ǭ/]5I>~roFٖS^*)Ѻ>/> stream xڝk۶ M>I3LH_:qN/tL;z\E)}).}$X. YLj-ҙYY+! SVbvH Ifj;[H<{fKUn?$[J(mv|-o/H?,޵/cGaT$A{=x:F󩧀 h$" ψq+60 D4k~'yu~m6i3Gw8;qDBW{Ռ:!ڎ|B<Ȋ8H4* ϙL ^PZ3<2Ա Znά߼1D:.'^HM|aKQ h^gh}(iDmH#N1kMs{ ]Bt6 Z]Z3Ty}癢3(? o| a&sPB{_V(F2T Z!  <|ϻ P mm~XJ8},&n]>FVYC|GoLѣy#Tp$66Z {KL0y򦕝wg8E{j ; ǦhdzΉoYQR@x 9Az㾀SՠQ'HҁAg2#V5'L[%鮁5]?Ӱ[kY1}F|;RRפwrܑ)M~Px3`4@>/x$iBCDvNVIZ<)SFTM90b#ږ{N^.D)20%l揞FD)#Ӳ*^0Ò<ƑՁοF1 kɞ~'>}6CHu١+N1ҚPCjqa;X R Y] <]RODejYsY3kB7Mm>*a"x3e;ە3z+OzcciRTZ:i٫JLVL#@> L'<^;EIYZ\f9mX[r)b*)\8ٰ-cAQSFˀwfɟ28F.~ea APM,1xë/: 1`GK>W2d)Q!K3\D'{֛)%/CʉUrG$L*** -:3x^$vᔂw}*'tštĎV( WىPcv2#W5n )^p c8O%]JWLSA4 W1 [p){ p*PtO:cbĴH> 5-` M[qna& r?kĆӪSUUy]j,Luru.IթVU_8,NC!1 Ȋ5ԑ?B ,DDK>b)#T1xԓQAށw'{8>H:/n[ʌ &^?:4XVv gr*dSW'JQՐA;- Eޱ(7Z֊{ǽYU^.kcԑID:p2& 臞 0pgҫm$m;zHN]L:/$׫ ].NZz,Х`W\\Cwޥ}L$~Lb()'nbp}TSO5$%arINKt r(1b1\QIJr0R})K*Vԏy ZM䧃7Ajuy 8BWsHNBռ(w9d8J_BSc]3(C|=ņ ,ؽu#Ԙ鼼a2y*}0r=36>_qa;/{i0e'B¤i/O"'dػB/FZ }Br ϵGUxJ8+ZA U[˨2ӹ,Ңp6 =R Ү4J܆q1ӄ4l>I+䷀5$-:.dGUGTgʊ u]q;,n Tq3#R6Z#B呷^\!7xLMYAlTl| ]Ov[ncC]J]ien>\W F"twBo95{6k_ 4pⱐW4aBSN{Ea?(`ƈk7pVWR>[Ff@BR8/#^+roak Uv~OF_b~؞AdԶGk@!e[lOtѭSotS3m0NK-|{wo>%64kH>kaJc;'oŀd1O?0񿆰V|G%nं@~݊0d> stream xڍZKﯘ%RՊKE2>vLqT8c%+i"j~HI[S@h4~@] ]emQ݅Uz{?: *|]Y0S,Uenjx .?ykڢ &=<%)柋=|V?ÿaCdT5lR6Sij*M *S˕qa'~%qvp¶!NyP;6=~x .T,MQiw+ #UUZܟaf?q8Kۑr]'/@-HȮYhVϳQ7EYW0J5&7[梐 |4Vlyr_sx׆;1OK\;"Q'q6`L#U?ƗUpC2{4I۵_ʩҗ&چLH Zn+#OG:F}Cbe#AU(D=}]gZOۨzߩ~c2*h҆!5KXC[X]H#pꃍ|^gœ* j*P'm(\i\hZpLT"[b\Ϯ_y&٫'񰭜zxQ(NG֦Gѽp!ub4uQmÊp7f# eh:Ozvrg8wzGD&頻a:J?R&}"8E@>U\+h WFbn=9vމ0G?#"ӒOܨJa3DXNHɟKq dKcFT!@L HyTBF)pV5 @ψq]*$dEP7 KMh1N5nW>1pU;T؂_4$ӄ"4*"t)$@ +; '6t+}xOϰNwb nG=l !$)ڦ Y`&=F;$ E2^ ` ip@CeT};QD]S1ɎNnGe b̄glX<$Dו5ZUƦq*מdf0bX+J:'(#QQ C%mS27"Jt\4 9UKbeDYC.UjL[,zGD0/3ҥJzd C M,ωVuؙZoC06&&߲:5K{VfN^7eRV :@݁IAjJ,]PffO[-r&(`c!9jd T&Ȃ^/ ڐ9.#K *L:+"\}Lr1"s D8| _A7k` GiFc c |zOYħƱ()?#]1*%vz d+`Թ"/ӢΜx(4f},m>$ω\05PM.]K=mHȮ9%CKQwVPb4ڢ.Wʕy6M.Vzi]4sŊ^IǠ Ic}dȏq_`Ϫ#s{.rb|Оkhbz88Taqj[*t%;ƺIKwI;,N ٗBlAVZQ7i nZ2=p3vn{x{@zI$Iba qZ4xc|YX:jZ^={YH᧱91t̒C5f.q07?b=NaI*ƫ(n:o0r>w;'>-HQh#:I%!tpfAYӪR|.q=f77r3;{S1gs>KmlS47 ;%ّ lj@[7-V j*VːK xd]vӳ&)P~c3my\uJSAJvm'궚mGQ5" \cCaץTS)8B~'ɘVM^6Ib0=惽P:o BiDE?0e+6Zf ] M'q uR,߫]Uߦsl틦jbNćD"Yr-\e '.Lf7̨tߡ95 {q0XpJucvB9*Pms]9m !] DS#Wƒ5BCS]" һO?SFކOÿ.fE-!' !Iˤ~ήh^^4s?1fnL#e⯇H ~;&h~MaBT0Ɨe# /ʺ4@@SOe+ ԜX(|] I4VmCfzX%97o|L?F9+n5MKfwnR5{ sQzJKzV݋x)0v֜_P|.)zb$&N%œΑTi!ۼ5%Z%TIJeYJz&pu83endstream endobj 264 0 obj << /Filter /FlateDecode /Length 2936 >> stream xZms۸_onBx%~H\/iҤ2swadZ} J:nbwg?q)Yi*53`Pf\?+f+xg"vm.t#*`S%\KfjYrK&VHjGmf50Ռq\dγ2_zn[sjt-{ ϱ=\\kC/vp5p}֑=:.ݫ??/ɖxz[bz zw-*ڨL_hV~2W ծ\T>píʾWK|;I}R(dˊ67-mjs;ҶYkw]y[wZ s%9/+J{oV [?v,UgUo߀Ě~7_y^i}$usG\Հ _qel!nMw\呺h8 taR-_c݀w"q@r6=>YXWL*# i F V #sJ <,hD W+4`,Ƒ,۸vO͒9[o}nHOmq[GvƗc6"[k5;h/0O+i;v]! XVk^pS^.<{rzR!G@gcH˲inX%t{yGO&SY;XFGZ_ ]C-UQ0#h98մf)3n*``+.Dho-vg{@k>CHm`H56dWCל.0(qy<%q8ݐ&څNοݯd.*Vhi}Sf)7C[8h_E'6.vxv>zZxdX9\ݸ!aQ0'Wؚ&ьSFs9#.dfc̞hRՈAyLР>*K~_CVŒ<8e˹46_a[H}5Mk"_xo]&@2XP[)aL=pcDcHYr `U3 ~D:"X+( >۟־g).E[< AֻqOnig(K#B JҸ˒W6[ޒuKi]C*@/\uYOC\*Ԁ`t\BަYDs;Z@ _ (Ly< 3xJZaQk ;:^غ]Ũ{JPLyt$[i6Qez~2U 9 Ϣ eBxDuߞ[ԀIܱT\wM}!H\#GlVqidlcdZm:R'A_ԲtaWSz5X[Ս-'xT$]J0Y8<2DŽ19I{M ~SR惢Ζm&A PW}pt4jAa ۣ C)#PK8]МigA2 #,UYr$̨."SܤX+dʵДfЂ`|au&l2Pd%`60Dsi\n IuB=e{;QNzq]욝gs;`=0SB&/uw濢 Rғ( ntQlu,.G3wH|v{t\2Aa6Q|-i%3! t$B-L!g0̔x!,fIlކD CӉӼRp%*U1p|҇մp6ӭ Wemr!52,n܇N)D7Xi YUYqifMRip;ﭻSޤC2/C%l?}y{6Ny6\|p ]U =لSx*f)&bRppXp!;s#6>]3yd%硏s}w:bX-" 3x*or f ~K sŵC7EIK /:z>#07ُQCeo_ ye&=)εxʝ;"#I.P dE.~X>ϒ{Jx?BRbvFO9 ~ et8?, -h%JPႇoO.dȬlOa*Bf# z*j0 T!|!ԅDd%Ĩo񒹿7-PA!)g '%'`y++X?i=^`Fmo+Gt @^9rZNT@ŁlacW _W(+*k 8h'ь`3B*6ಀoI|*=be9_UɄu(c2PxYӂCeO?OQdqSSBd$1i O]/WFTE/l_?K F (-բDQ'Mvf3"){"TeɠcMendstream endobj 265 0 obj << /Filter /FlateDecode /Length 1769 >> stream xYKs6WVj&7[4mN4Fe7丞%P(gi$x~rN2b,#j2_44*؈D*|UF-\errn\*o#9>.uUM⸢+pqYc طQPfwC9Ȟ{THd'3>ãIfJl=h3%3L,2p!5>hy)S:R2ey)}ZM(io+ oM‘v"5(UbEtQJlQ (Qa%ZJ}cٱK.vTFq-'hg,F6@N-1x4o㇠?b"D6T3(": ص7 T]t OVjfMhxz 1tOB6LsLlTr9w0j99BnR|_F~ U=]߆Xj*2&_^Տ!Arj8/5)sgyX (;/yS6Mv3gyv3LG SCusLS({5C@3B)4HhEƘg"HJ)dg-zcnn@_ޝ 79 ^ DWi"sg%Z:MBKLz.bcbd[$h'@#d2q*%y&s1FQI=K0F瓂itWQ\ޕx,擪,mr)cĻ ԣ΅b͵!endstream endobj 266 0 obj << /BBox [ 0 0 650 326 ] /Filter /FlateDecode /FormType 1 /Resources 46 0 R /Subtype /Form /Type /XObject /Length 1396 >> stream xڥXn7 +l~lmE dÍ8ߗ4<Ǔi"(JoRH?.I$ˍ0nm_g~qnab0qGḒ\EER%@$>pxRhБperO~@H S5 `/I詌N+C@pĴ>.8 .BId,b%B,.O\iiJz~槿ח^?}G~:k#GjU*rW 2ۀ2NK !w/>,bbbBK ˫@Bxr7AKm X%"JюyBlTMؔ2)B \CAeBg*UdXycIu)GayG25ZJ ի$8KD5kڮi6Ij-B]1nlzhi1s|Co5Cԯn J~J7"@c+q^h;/<`0dd_ٶ~w[Kh?9X7Xq9iօB`qs$ѿM0aO?AJk$&0_(3ݬ) &=#ve%= x5|њſe9_ mY MۍI(tDz[DqdeRLAVnE~LvkP|\+~)=J3XxSz<zb,Ɔ&h)q7?>6y=[gU)> S__^#` ߫QaYɸxƶ-dׯ%3]t8Bt/y9wװ{ٞ ?UG%2u+iz jؖ1v^1U4!n53o|eendstream endobj 267 0 obj << /Type /XRef /Length 178 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 78 0 R /Root 77 0 R /Size 268 /ID [<24a1f8712099399187525a9a291914db><2709e0f0c91cdeca8548642002ee5b38>] >> stream xcb&F~0 $8Jy? =wp!3bV&Z@M4^"9΃H h.bţAtd "Y= y4 ?c(T Dr5Hpj"@i) ".r60yA$S endstream endobj startxref 153568 %%EOF DBI/inst/doc/DBI.Rnw0000644000175100001440000006623010613702436013507 0ustar hornikusers% % NOTE -- ONLY EDIT THE .Rnw FILE!!! The .tex file is % likely to be overwritten. % %\VignetteIndexEntry{A Common Database Interface (DBI)} %\VignetteDepends{} %\VignetteKeywords{Databases, Relational DBMS, MySQL, SQLite, Oracle, PostgreSQL} %\VignettePackage{DBI} \documentclass{article} % $Id$ \usepackage{graphicx,times} \usepackage[% bookmarks=true, colorlinks=true, backref=true, hyperfigures=true, pdfpagemode=UseOutlines, pdfauthor={R-Databases Special Interest Group (R-SIG-DB)}, pdftitle={A Common Database Interface (DBI)}, pdfkeywords={Databases, Relational DBMS, R, S-Plus, PostgreSQL, MySQL, mSQL, Microsoft SQL Server, Oracle, SQLite, Inter-system communications, Distributed computing} ]{hyperref} % R/S related commands \newcommand{\sfun}[1]{\mbox{\tt #1()}} % print arg as an R/S fun() \newcommand{\sobj}[1]{\mbox{\tt #1}} % print arg as an R/S object \newcommand{\sexp}[1]{\mbox{\tt #1}} % print arg as an R/S expression \newcommand{\sclass}[1]{\mbox{\tt #1}} % print arg as an R/S class \newcommand{\smethod}[1]{\mbox{\tt #1}} % print arg as an R/S method \begin{document} \title{A Common Database Interface (DBI)} \author{ R-Databases Special Interest Group\\ \href{mailto:r-sig-db@stat.math.ethz.ch}{r-sig-db@stat.math.ethz.ch} } \date{26 August 2002 (Updated 16 June 2003)} \maketitle \tableofcontents \begin{abstract} This document describes a common interface between the S language (in its R and S-Plus implementations) and database management systems (DBMS). The interface defines a small set of classes and methods similar in spirit to Perl's DBI, Java's JDBC, Python's DB-API, and Microsoft's ODBC. \end{abstract} \section{Version}\label{sec:version} This document describes version 0.1-6 of the database interface API (application programming interface). \section{Introduction}\label{sec:intro} The database interface (DBI) separates the connectivity to the DBMS into a ``front-end'' and a ``back-end''. Applications use only the exposed ``front-end'' API. The facilities that communicate with specific DBMS (Oracle, PostgreSQL, etc.) are provided by ``device drivers'' that get invoked automatically by the S language evaluator. The following example illustrates some of the DBI capabilities: \begin{verbatim} ## Choose the proper DBMS driver and connect to the server drv <- dbDriver("ODBC") con <- dbConnect(drv, "dsn", "usr", "pwd") ## The interface can work at a higher level importing tables ## as data.frames and exporting data.frames as DBMS tables. dbListTables(con) dbListFields(con, "quakes") if(dbExistsTable(con, "new_results")) dbRemoveTable(con, "new_results") dbWriteTable(con, "new_results", new.output) ## The interface allows lower-level interface to the DBMS res <- dbSendQuery(con, paste( "SELECT g.id, g.mirror, g.diam, e.voltage", "FROM geom_table as g, elec_measures as e", "WHERE g.id = e.id and g.mirrortype = 'inside'", "ORDER BY g.diam")) out <- NULL while(!dbHasCompleted(res)){ chunk <- fetch(res, n = 10000) out <- c(out, doit(chunk)) } ## Free up resources dbClearResult(res) dbDisconnect(con) dbUnloadDriver(drv) \end{verbatim} (only the first 2 expressions are DBMS-specific -- all others are independent of the database engine itself). Individual DBI drivers need not implement all the features we list below (we indicate those that are optional). Furthermore, drivers may extend the core DBI facilities, but we suggest to have these extensions clearly indicated and documented. The following are the elements of the DBI: \begin{enumerate} \item A set of classes and methods (Section~\ref{sec:DBIClasses}) that defines what operations are possible and how they are defined, e.g.: \begin{itemize} \item connect/disconnect to the DBMS \item create and execute statements in the DBMS \item extract results/output from statements \item error/exception handling \item information (meta-data) from database objects \item transaction management (optional) \end{itemize} Some things are left explicitly unspecified, e.g., authentication and even the query language, although it is hard to avoid references to SQL and relational database management systems (RDBMS). \item Drivers Drivers are collection of functions that implement the functionality defined above in the context of specific DBMS, e.g., mSQL, Informix. \item Data type mappings (Section~\ref{sec:data-mappings}.) Mappings and conversions between DBMS data types and R/S objects. All drivers should implement the ``basic'' primitives (see below), but may chose to add user-defined conversion function to handle more generic objects (e.g., factors, ordered factors, time series, arrays, images). \item Utilities (Section~\ref{sec:utilities}.) These facilities help with details such as mapping of identifiers between S and DBMS (e.g., \texttt{"\_"} is illegal in R/S names, and \texttt{"."} is used for constructing compound SQL identifiers), etc. \end{enumerate} \section{DBI Classes and Methods}\label{sec:DBIClasses} The following are the main DBI classes. They need to be extended by individual database back-ends (Sybase, Oracle, etc.) Individual drivers need to provide methods for the generic functions listed here (those methods that are optional are so indicated). \emph{Note: Although R releases prior to 1.4 do not have a formal concept of classes, we will use the syntax of the S Version 4 classes and methods (available in R releases 1.4 and later as library \sobj{methods}) to convey precisely the DBI class hierarchy, its methods, and intended behavior. } The DBI classes are \sclass{DBIObject}, \sclass{DBIDriver}, \sclass{DBIConnection} and \sclass{DBIResult}. All these are \emph{virtual} classes. Drivers define new classes that extend these, e.g., \sclass{PgSQLDriver}, \sclass{PgSQLConnection}, and so on. \begin{figure} \includegraphics[width=\textwidth]{figure1} \caption{Class hierarchy for the DBI. The top two layers are comprised of virtual classes and each lower layer represents a set of driver-specific implementation classes that provide the functionality defined by the virtual classes above.} \end{figure} \begin{description} \item[\sclass{DBIObject}:] Virtual class\footnote{A virtual class allows us to group classes that share some common characteristics, even if their implementations are radically different.} that groups all other DBI classes. \item[\sclass{DBIDriver}:] Virtual class that groups all DBMS drivers. Each DBMS driver extends this class. Typically generator functions instantiate the actual driver objects, e.g., \sfun{PgSQL}, \sfun{HDF5}, \sfun{BerkeleyDB}. \item[\sclass{DBIConnection}:] Virtual class that encapsulates connections to DBMS. \item[\sclass{DBIResult}:] Virtual class that describes the result of a DBMS query or statement. [Q: Should we distinguish between a simple result of DBMS statements e.g., as \texttt{delete} from DBMS queries (i.e., those that generate data).] \end{description} The methods \smethod{format}, \smethod{print}, \smethod{show}, \smethod{dbGetInfo}, and \smethod{summary} are defined (and \emph{implemented} in the \sobj{DBI} package) for the \sclass{DBIObject} base class, thus available to all implementations; individual drivers, however, are free to override them as they see fit. \begin{description} \item[\smethod{format(x, ...)}:] produces a concise character representation (label) for the \sclass{DBIObject} \sobj{x}. \item[\smethod{print(x, ...)}/\smethod{show(x)}:] prints a one-line identification of the object \sobj{x}. \item[\smethod{summary(object, ...)}:] produces a concise description of the object. The default method for \sclass{DBIObject} simply invokes \sexp{dbGetInfo(dbObj)} and prints the name-value pairs one per line. Individual implementations may tailor this appropriately. \item[\smethod{dbGetInfo(dbObj, ...)}:] extracts information (meta-data) relevant for the \sclass{DBIObject} \sobj{dbObj}. It may return a list of key/value pairs, individual meta-data if supplied in the call, or \sobj{NULL} if the requested meta-data is not available. \emph{Hint:} Driver implementations may choose to allow an argument \sobj{what} to specify individual meta-data, e.g., \sexp{dbGetInfo(drv, what = "max.connections")}. \end{description} In the next few sub-sections we describe in detail each of these classes and their methods. \subsection{Class \sclass{DBIObject}}\label{sec:DBIObject} This class simply groups all DBI classes, and thus all extend it. \subsection{Class \sclass{DBIDriver}}\label{sec:DBIDriver} This class identifies the database management system. It needs to be extended by individual back-ends (Oracle, PostgreSQL, etc.) The DBI provides the generator \sexp{dbDriver("driverName")} which simply invokes the function \sfun{driverName}, which in turn instantiates the corresponding driver object. The \sclass{DBIDriver} class defines the following methods: \begin{description} \item[\sfun{driverName}:]\label{meth:driverName} initializes the driver code. The name \sobj{driverName} refers to the actual generator function for the DBMS, e.g., \sfun{RPgSQL}, \sfun{RODBC}, \sfun{HDF5}. The driver instance object is used with \smethod{dbConnect} (see page~\pageref{meth:dbConnect}) for opening one or possibly more connections to one or more DBMS. \item[\smethod{dbListConnections(drv, ...)}:] list of current connections being handled by the \sobj{drv} driver. May be \sobj{NULL} if there are no open connections. Drivers that do not support multiple connections may return the one open connection. \item[\smethod{dbGetInfo(dbObj, ...)}:] returns a list of name-value pairs of information about the driver. \emph{Hint:} Useful entries could include \begin{description} \item[\sobj{name}:] the driver name (e.g., \sexp{"RODBC"}, \sexp{"RPgSQL"}); \item[\sobj{driver.version}:] version of the driver; \item[\sobj{DBI.version}:] the version of the DBI that the driver implements, e.g., \sexp{"0.1-2"}; \item[\sobj{client.version}:] of the client DBMS libraries (e.g., version of the \texttt{libpq} library in the case of \sobj{RPgSQL}); \item[\sobj{max.connections}:] maximum number of simultaneous connections; \end{description} plus any other relevant information about the implementation, for instance, how the driver handles upper/lower case in identifiers. \item[\smethod{dbUnloadDriver("driverName")} (optional):] frees all resources (local and remote) used by the driver. Returns a logical to indicate if it succeeded or not. \end{description} \subsection{Class \sclass{DBIConnection}}\label{sec:DBIConnection} This virtual class encapsulates the connection to a DBMS, and it provides access to dynamic queries, result sets, DBMS session management (transactions), etc. \emph{Note:} Individual drivers are free to implement single or multiple simultaneous connections. The methods defined by the \sclass{DBIConnection} class include: \begin{description} \item[\smethod{dbConnect(drv, ...)}:]\label{meth:dbConnect} creates and opens a connection to the database implemented by the driver \sobj{drv} (see Section~\ref{sec:DBIDriver}). Each driver will define what other arguments are required, e.g., \sobj{"dbname"} or \sobj{"dsn"} for the database name, \sobj{"user"}, and \sobj{"password"}. It returns an object that extends \sclass{DBIConnection} in a driver-specific manner (e.g., the MySQL implementation could create an object of class \sclass{MySQLConnection} that extends \sclass{DBIConnection}). \item[\smethod{dbDisconnect(conn, ...)}:] closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). Returns a logical indicating whether it succeeded or not. \item[\smethod{dbSendQuery(conn, statement, ...)}:] submits one statement to the DBMS. It returns a \sclass{DBIResult} object. This object is needed for fetching data in case the statement generates output (see \smethod{fetch} on page~\pageref{meth:fetch}), and it may be used for querying the state of the operation; see \smethod{dbGetInfo} and other meta-data methods on page~\pageref{meth:res-others}. \item[\smethod{dbGetQuery(conn, statement, ...)}:] submit, execute, and extract output in one operation. The resulting object may be a \sclass{data.frame} if the \sobj{statement} generates output. Otherwise the return value should be a logical indicating whether the query succeeded or not. \item[\smethod{dbGetException(conn, ...)}:] returns a list with elements \sobj{errNum} and \sobj{errMsg} with the status of the last DBMS statement sent on a given connection (this information may also be provided by the \sfun{dbGetInfo} meta-data function on the \sobj{conn} object. \emph{Hint:} The ANSI SQL-92 defines both a status code and an status message that could be return as members of the list. \item[\smethod{dbGetInfo(dbObj, ...)}:] returns a list of name-value pairs describing the state of the connection; it may return one or more meta-data, the actual driver method allows to specify individual pieces of meta-data (e.g., maximum number of open results/cursors). \emph{Hint:} Useful entries could include \begin{description} \item[\sobj{dbname}:] the name of the database in use; \item[\sobj{db.version}:] the DBMS server version (e.g., "Oracle 8.1.7 on Solaris"; \item[\sobj{host}:] host where the database server resides; \item[\sobj{user}:] user name; \item[\sobj{password}:] password (is this safe?); \end{description} plus any other arguments related to the connection (e.g., thread id, socket or TCP connection type). \item[\smethod{dbListResults(conn, ...)}:] list of \sobj{DBIResult} objects currently active on the connection \sobj{conn}. May be \sobj{NULL} if no result set is active on \sobj{conn}. Drivers that implement only one result set per connection could return that one object (no need to wrap it in a list). \end{description} \emph{Note: The following are convenience methods that simplify the import/export of (mainly) data.frames. The first five methods implement the core methods needed to \sfun{attach} remote DBMS to the S search path. (For details, see \cite{data-management:1991,database-classes:1999}.) } \emph{Hint:} For relational DBMS these methods may be easily implemented using the core DBI methods \smethod{dbConnect}, \smethod{dbSendQuery}, and \smethod{fetch}, due to SQL reflectance (i.e., one easily gets this meta-data by querying the appropriate tables on the RDBMS). \begin{description} \item[\smethod{dbListTables(conn, ...)}:] returns a character vector (possibly of zero-length) of object (table) names available on the \sobj{conn} connection. \item[\smethod{dbReadTable(conn, name, ...)}:] imports the data stored remotely in the table \sobj{name} on connection \sobj{conn}. Use the field \sobj{row.names} as the \sexp{row.names} attribute of the output data.frame. Returns a \sclass{data.frame}. [Q: should we spell out how row.names should be created? E.g., use a field (with unique values) as row.names? Also, should \smethod{dbReadTable} reproduce a data.frame exported with \smethod{dbWriteTable}?] \item[\smethod{dbWriteTable(conn, name, value, ...)}:] write the object \sobj{value} (perhaps after coercing it to data.frame) into the remote object \sobj{name} in connection \sobj{conn}. Returns a logical indicating whether the operation succeeded or not. \item[\smethod{dbExistsTable(conn, name, ...)}:] does remote object \sobj{name} exist on \sobj{conn}? Returns a logical. \item[\smethod{dbRemoveTable(conn, name, ...)}:] removes remote object \sobj{name} on connection \sobj{conn}. Returns a logical indicating whether the operation succeeded or not. \item[\smethod{dbListFields(conn, name, ...)}:] returns a character vector listing the field names of the remote table \sobj{name} on connection \sobj{conn} (see \smethod{dbColumnInfo()} for extracting data type on a table). \end{description} \emph{Note: The following methods deal with transactions and stored procedures. All these functions are optional. } \begin{description} \item[\smethod{dbCommit(conn, ...)}(optional):] commits pending transaction on the connection and returns \sobj{TRUE} or \sobj{FALSE} depending on whether the operation succeeded or not. \item[\smethod{dbRollback(conn, ...)}(optional):] undoes current transaction on the connection and returns \sobj{TRUE} or \sobj{FALSE} depending on whether the operation succeeded or not. \item[\smethod{dbCallProc(conn, storedProc, ...)}(optional):] invokes a stored procedure in the DBMS and returns a \sclass{DBIResult} object. [Stored procedures are \emph{not} part of the ANSI SQL-92 standard and vary substantially from one RDBMS to another.] \end{description} \subsection{Class \sclass{DBIResult}}\label{sec:DBIResult} This virtual class describes the result and state of execution of a DBMS statement (any statement, query or non-query). The result set \sobj{res} keeps track of whether the statement produces output for R/S, how many rows were affected by the operation, how many rows have been fetched (if statement is a query), whether there are more rows to fetch, etc. \emph{Note: Individual drivers are free to allow single or multiple active results per connection. } [Q: Should we distinguish between results that return no data from those that return data?] The class \sclass{DBIResult} defines the following methods: \begin{description} \item[\smethod{fetch(res, n, ...)}:]\label{meth:fetch} fetches the next \sobj{n} elements (rows) from the result set \sobj{res} and return them as a data.frame. A value of \sexp{n=-1} is interpreted as ``return all elements/rows''. \item[\smethod{dbClearResult(res, ...)}:] flushes any pending data and frees all resources (local and remote) used by the object \sobj{res} on both sides of the connection. Returns a logical indicating success or not. \item[\smethod{dbGetInfo(dbObj, ...)}:] returns a name-value list with the state of the result set. \emph{Hint:} Useful entries could include \begin{description} \item[\sobj{statement}:] a character string representation of the statement being executed; \item[\sobj{rows.affected}:] number of affected records (changed, deleted, inserted, or extracted); \item[\sobj{row.count}:] number of rows fetched so far; \item[\sobj{has.completed}:] has the statement (query) finished? \item[\sobj{is.select}:] a logical describing whether or not the statement generates output; \end{description} plus any other relevant driver-specific meta-data. \item[\smethod{dbColumnInfo(res, ...)}:] produces a data.frame that describes the output of a query. The data.frame should have as many rows as there are output fields in the result set, and each column in the data.frame should describe an aspect of the result set field (field name, type, etc.) \emph{Hint:} The data.frame columns could include \begin{description} \item[\sobj{field.name}:] DBMS field label; \item[\sobj{field.type}:] DBMS field type (implementation-specific); \item[\sobj{data.type}:] corresponding R/S data type, e.g., \sexp{"integer"}; \item[\sobj{precision}/\sobj{scale}:] (as in ODBC terminology), display width and number of decimal digits, respectively; \item[\sobj{nullable}:] whether the corresponding field may contain (DBMS) \texttt{NULL} values; \end{description} plus other driver-specific information. \item[\smethod{dbSetDataMappings(flds, ...)}(optional):] defines a conversion between internal DBMS data types and R/S classes. We expect the default mappings (see Section~\ref{sec:data-mappings}) to be by far the most common ones, but users that need more control may specify a class generator for individual fields in the result set. [This topic needs further discussion.] \end{description} \emph{Note: The following are convenience methods that extract information from the result object (they may be implemented by invoking \sfun{dbGetInfo} with appropriate arguments). } \begin{description}\label{meth:res-others} \item[\smethod{dbGetStatement(res, ...)}(optional):] returns the DBMS statement (as a character string) associated with the result \sobj{res}. \item[\smethod{dbGetRowsAffected(res, ...)}(optional):] returns the number of rows affected by the executed statement (number of records deleted, modified, extracted, etc.) \item[\smethod{dbHasCompleted(res, ...)}(optional):] returns a logical that indicates whether the operation has been completed (e.g., are there more records to be fetched?). \item[\smethod{dbGetRowCount(res, ...)}(optional):] returns the number of rows fetched so far. \end{description} \section{Data Type Mappings}\label{sec:data-mappings} The data types supported by databases are different than the data types in R and S, but the mapping between the ``primitive'' types is straightforward: Any of the many fixed and varying length character types are mapped to R/S \sobj{"character"}. Fixed-precision (non-IEEE) numbers are mapped into either doubles (\sobj{"numeric"}) or long (\sobj{"integer"}). Notice that many DBMS do not follow the so-called IEEE arithmetic, so there are potential problems with under/overflows and loss of precision, but given the R/S primitive types we cannot do too much but identify these situations and warn the application (how?). By default dates and date-time objects are mapped to character using the appropriate \texttt{TO\_CHAR} function in the DBMS (which should take care of any locale information). Some RDBMS support the type \texttt{CURRENCY} or \texttt{MONEY} which should be mapped to \sobj{"numeric"} (again with potential round off errors). Large objects (character, binary, file, etc.) also need to be mapped. User-defined functions may be specified to do the actual conversion (as has been done in other inter-systems packages \footnote{ Duncan Temple Lang has volunteered to port the data conversion code found in R-Jave, R-Perl, and R-Python packages to the DBI}). Specifying user-defined conversion functions still needs to be defined. \section{Utilities}\label{sec:utilities} The core DBI implementation should make available to all drivers some common basic utilities. For instance: \begin{description} \item[\smethod{dbGetDBIVersion}:] returns the version of the currently attached DBI as a string. \item[\smethod{dbDataType(dbObj, obj, ...)}:] returns a string with the (approximately) appropriate data type for the R/S object \sobj{obj}. The DBI can implement this following the ANSI-92 standard, but individual drivers may want/need to extend it to make use of DBMS-specific types. \item[\smethod{make.db.names(dbObj, snames, ...)}:] maps R/S names (identifiers) to SQL identifiers replacing illegal characters (as \sobj{"."}) by the legal SQL \sobj{"\_"}. \item[\sobj{SQLKeywords(dbObj, ...)}:] returns a character vector of SQL keywords (reserved words). The default method returns the list of \sobj{.SQL92Keywords}, but drivers should update this vector with the DBMS-specific additional reserved words. \item[\smethod{isSQLKeyword(dbObj, name, ...)}:] for each element in the character vector \sobj{name} determine whether or not it is an SQL keyword, as reported by the generic function \smethod{SQLKeywords}. Returns a logical vector parallel to the input object \sobj{name}. \end{description} \section{Open Issues and Limitations}\label{sec:open-issues} There are a number of issues and limitations that the current DBI conscientiously does not address on the interest of simplicity. We do list here the most important ones. \begin{description} \item[Non-SQL:] Is it realistic to attempt to encompass non-relational databases, like HDF5, Berkeley DB, etc.? \item[Security:] allowing users to specify their passwords on R/S scripts may be unacceptable for some applications. We need to consider alternatives where users could store authentication on files (perhaps similar to ODBC's \texttt{odbc.ini}) with more stringent permissions. \item[Exceptions:] the exception mechanism is a bit too simple, and it does not provide for information when problems stem from the DBMS interface itself. For instance, under/overflow or loss of precision as we move numeric data from DBMS to the more limited primitives in R/S. \item[Asynchronous communication:] most DBMS support both synchronous and asynchronous communications, allowing applications to submit a query and proceed while the database server process the query. The application is then notified (or it may need to poll the server) when the query has completed. For large computations, this could be very useful, but the DBI would need to specify how to interrupt the server (if necessary) plus other details. Also, some DBMS require applications to use threads to implement asynchronous communication, something that neither R nor S-Plus currently addresses. \item[SQL scripts:] the DBI only defines how to execute one SQL statement at a time, forcing users to split SQL scripts into individual statements. We need a mechanism by which users can submit SQL scripts that could possibly generate multiple result sets; in this case we may need to introduce new methods to loop over multiple results (similar to Python's \texttt{nextResultSet}). \item[BLOBS/CLOBS:] large objects (both character and binary) present some challenges both to R and S-Plus. It is becoming more common to store images, sounds, and other data types as binary objects in DBMS, some of which can be in principle quite large. The SQL-92 ANSI standard allows up to 2 gigabytes for some of these objects. We need to carefully plan how to deal with binary objects. \item[Transactions:] transaction management is not fully described. \item[Additional methods:] Do we need any additional methods? (e.g., \sexp{dbListDatabases(conn)}, \sexp{dbListTableIndices(conn, name)}, how do we list all available drivers?) \item[Bind variables:] the interface is heavily biased towards queries, as opposed to general purpose database development. In particular we made no attempt to define ``bind variables''; this is a mechanism by which the contents of R/S objects are implicitly moved to the database during SQL execution. For instance, the following embedded SQL statement \begin{verbatim} /* SQL */ SELECT * from emp_table where emp_id = :sampleEmployee \end{verbatim} would take the vector \sobj{sampleEmployee} and iterate over each of its elements to get the result. Perhaps the DBI could at some point in the future implement this feature. \end{description} \section{Resources}\label{sec:resources} The idea of a common interface to databases has been successfully implemented in various environments, for instance: Java's Database Connectivity (JDBC) (\href{http://www.javasoft.com/products/jdbc/index.html}{www.javasoft.com}). In C through the Open Database Connectivity (ODBC) (\href{http://www.genix.net/unixODBC}{www.genix.net/unixODBC}). Python's Database Application Programming Interface (\href{http://www.python.org/topics/database}{www.python.org}). Perl's Database Interface (\href{http://dbi.perl.org}{dbi.perl.org}). \nocite{*} \bibliography{biblio} \bibliographystyle{plain} \end{document} DBI/inst/doc/DBI.R0000644000175100001440000000005312142561531013127 0ustar hornikusers### R code from vignette source 'DBI.Rnw' DBI/inst/TODO0000644000175100001440000000674110613702436012345 0ustar hornikusersIssues that R-SIG-DB hasn't addressed. 1. Should we define separate classes for SQL queries that return data from those that don't return data? E.g., the "DBIResult" could represent the result of non-data queries (INSERT, DELETE, CREATE, etc.) while "DBIResultSet" (or perhaps "DBICursor") could extend "DBIResult" to represent results of queries that generate data (primarily SELECT). 2. (See ROracle version 0.5-3 for an initial implementation.) Prepare statements need to be defined and methods for executing them with S bindings. A mechanism to hook data in SQL statements and, say, fields in data.frames needs to be defined. Some databases' API explicitly defined these as placeholders, e.g., ODBC identifies these as "?var" in dynamic SQL, Oracle as ":var" --- in both of these cases "var" refers to a C variable, possibly an array. An obvious R/S-Plus implementation would be to interpret "?var" in SQL statements as variable "var" in some data.frame. E.g., say, ps <- dbPrepare(connection =con, statement = "select * from big_table where id = ?sample", data = signature(sample = "numeric")) rs <- dbExecStatement(ps, data = mySampleIds1) # copy data to DBMS data1 <- fetch(rs, n = -1) rs <- dbExecStatement(ps, data = mySampleIds2) # copy more data data2 <- fetch(rs, n = -1) rs <- dbExecStatement(ps, data = mySampleIds3) # copy more data data3 <- fetch(rs, n = -1) .... 3. Data conversion. We need a general method for specifying data conversion. The data conversion mechanism used in other inter system packages (e.g., RSPython, RSPerl) does not seem to be suitable without modification. Those mechanism seem to be geared for converting in one operation whole objects, while in the R/S-Plus DBMS case we need to be able to allocate containers as columns of the R/S-Plus result list/data.frame, and then transfer individual objects (dates, BLOBS, CLOBS, numbers, strings) one at a time from the DBMS into the container class inside the C fetching looping. 4. Do we need more metadata? (e.g., table indices, privileges). 5. (See ROracle version 0.5-3 for an initial implementation.) Transaction management needs to be fully described. 6. How do we run SQL scripts (not just single statements) and stored procedures. 7. Asynchronous operations (not only queries). Given current limitations in both R and S-Plus implementations of S (e.g., lack of threads), we probably should be thinking of some kind of polling mechanism with which users specify whether an operation should be asynchronous (say, through a flag to dbConnect, dbSendQuery, etc.) and then define one of more methods, say, dbHasCompleted, to poll the DBMS or driver for the status of the operation. Another possibility could be to register S callbacks for certain events, but it may be more complicated to code events in the various drivers than simply poll [not if the event identification and callback dispatching is centralized in the RS_DBI level, above the actual R/C drivers code]. 8. Additional helper functions. * dbBuildTableDefinition(con, name, obj, field.types, ....) Then we could have methods for obj="data.frame", obj="array", etc. By default the DBI method con=DBIObject would construct the definition acording to the SQL92 or SQL99 standard(s), but individual implementations could overwrite the methods. DBI/inst/NEWS0000644000175100001440000000345212142266456012356 0ustar hornikusersVersion 0.2-7 * Trivial changes (updated package fields, daj) Version 0.2-6 * Removed deprecated \synopsis in some Rd files (thanks to Prof. Ripley) Version 0.2-5 * Code cleanups contributed by Matthias Burger: avoid partial argument name matching and use TRUE/FALSE, not T/F. * Change behavior of make.db.names.default to quote SQL keywords if allow.keywords is FALSE. Previously, SQL keywords would be name mangled with underscores and a digit. Now they are quoted using '"'. Version 0.2-4 * Changed license from GPL to LPGL * Fixed a trivial typo in documentation Version 0.1-10 * Fixed documentation typos. Version 0.1-9 * Trivial changes. Version 0.1-8 * A trivial change due to package.description() being deprecated in 1.9.0. Version 0.1-7 * Had to do a substantial re-formatting of the documentation due to incompatibilities introduced in 1.8.0 S4 method documentation. The contents were not changed (modulo fixing a few typos). Thanks to Kurt Hornik and John Chambers for their help. Version 0.1-6 * Trivial documentation changes (for R CMD check's sake) Version 0.1-5 * Removed duplicated setGeneric("dbSetDataMappings") Version 0.1-4 * Removed the "valueClass" from some generic functions, namely, dbListConnections, dbListResults, dbGetException, dbGetQuery, and dbGetInfo. The reason is that methods for these generics could potentially return different classes of objects (e.g., the call dbGetInfo(res) could return a list of name-value pairs, while dbGetInfo(res, "statement") could be a character vector). * Added 00Index to inst/doc * Added dbGetDBIVersion() (simple wrapper to package.description). Version 0.1-3 * ??? Minor changes? Version 0.1-2 * An implementation based on version 4 classes and methods. * Incorporated (mostly Tim Keitt's) comments. DBI/R/0000755000175100001440000000000012134704761011074 5ustar hornikusersDBI/R/zzz.R0000644000175100001440000000002612134703561012047 0ustar hornikusers.conflicts.OK <- TRUE DBI/R/Util.R0000644000175100001440000001607712134703706012145 0ustar hornikusers## ## $Id$ ## ## Utilities. These actually have been implemented by the DBI, ## but individual driver could overload them; for instance, the ## set of SQL keywords should be extended by the various packages. ## "dbGetDBIVersion" <- function() { ## packageDescription("DBI", fields = "Version") packageVersion("DBI") } "print.list.pairs" <- function(x, ...) { for(key in names(x)){ value <- format(x[[key]]) if(value=="") next cat(key, "=", value, "\n") } invisible(x) } ## return a string indicating the "closest" SQL type for an R/S object setGeneric("dbDataType", def = function(dbObj, obj, ...) standardGeneric("dbDataType"), valueClass = "character" ) ## by defualt use the SQL92 data types -- individual drivers may need to ## overload this setMethod("dbDataType", signature(dbObj="DBIObject", obj="ANY"), definition = function(dbObj, obj, ...) dbDataType.default(obj, ...), valueClass = "character" ) "dbDataType.default" <- function(obj, ...) ## find a suitable SQL data type for the R/S object obj ## (this method most likely should be overriden by each driver) ## TODO: Lots and lots!! (this is a very rough first draft) { rs.class <- data.class(obj) rs.mode <- storage.mode(obj) if(rs.class=="numeric" || rs.class=="integer"){ sql.type <- if(rs.mode=="integer") "int" else "double precision" } else { varchar <- function(x, width=0){ nc <- ifelse(width>0, width, max(nchar(as.character(x)))) paste("varchar(", nc, ")", sep="") } sql.type <- switch(rs.class, logical = "smallint", factor = , character = , ordered = , varchar(obj)) } sql.type } ## map R/S identifiers into SQL identifiers (careful with keywords) setGeneric("make.db.names", signature=c("dbObj", "snames"), def = function(dbObj, snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE, ...) standardGeneric("make.db.names"), valueClass = "character" ) setMethod("make.db.names", signature(dbObj="DBIObject", snames="character"), definition = function(dbObj, snames, keywords, unique, allow.keywords, ...) { make.db.names.default(snames, keywords, unique, allow.keywords) }, valueClass = "character" ) "make.db.names.default" <- function(snames, keywords = .SQL92Keywords, unique = TRUE, allow.keywords = TRUE) ## produce legal SQL identifiers from strings in a character vector ## unique, in this function, means unique regardless of lower/upper case { "makeUnique" <- function(x, sep="_"){ if(length(x)==0) return(x) out <- x lc <- make.names(tolower(x), unique=FALSE) i <- duplicated(lc) lc <- make.names(lc, unique = TRUE) out[i] <- paste(out[i], substring(lc[i], first=nchar(out[i])+1), sep=sep) out } ## Note: SQL identifiers *can* be enclosed in double or single quotes ## when they are equal to reserverd keywords. fc <- substring(snames, 1, 1) lc <- substring(snames, nchar(snames)) i <- match(fc, c("'", '"'), 0)>0 & match(lc, c("'", '"'), 0)>0 snames[!i] <- make.names(snames[!i], unique=FALSE) if(unique) snames[!i] <- makeUnique(snames[!i]) if(!allow.keywords){ kwi <- match(keywords, toupper(snames), nomatch = 0L) snames[kwi] <- paste('"', snames[kwi], '"', sep='') } gsub("\\.", "_", snames) } setGeneric("isSQLKeyword", signature = c("dbObj", "name"), def = function(dbObj, name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3], ...) { standardGeneric("isSQLKeyword") }, valueClass = "logical" ) setMethod("isSQLKeyword", signature(dbObj="DBIObject", name="character"), definition = function(dbObj, name, keywords, case, ...) isSQLKeyword.default(name, keywords, case), valueClass = "logical" ) "isSQLKeyword.default" <- function(name, keywords = .SQL92Keywords, case = c("lower", "upper", "any")[3]) { n <- pmatch(case, c("lower", "upper", "any"), nomatch=0) if(n==0) stop('case must be one of "lower", "upper", or "any"') kw <- switch(c("lower", "upper", "any")[n], lower = tolower(keywords), upper = toupper(keywords), any = toupper(keywords)) if(n==3) name <- toupper(name) match(name, keywords, nomatch=0) > 0 } ## SQL ANSI 92 (plus ISO's) keywords --- all 220 of them! ## (See pp. 22 and 23 in X/Open SQL and RDA, 1994, isbn 1-872630-68-8) setGeneric("SQLKeywords", def = function(dbObj, ...) standardGeneric("SQLKeywords"), valueClass = "character" ) setMethod("SQLKeywords", "DBIObject", definition = function(dbObj, ...) .SQL92Keywords, valueClass = "character" ) setMethod("SQLKeywords", "missing", definition = function(dbObj, ...) .SQL92Keywords, valueClass = "character" ) ".SQL92Keywords" <- c("ABSOLUTE", "ADD", "ALL", "ALLOCATE", "ALTER", "AND", "ANY", "ARE", "AS", "ASC", "ASSERTION", "AT", "AUTHORIZATION", "AVG", "BEGIN", "BETWEEN", "BIT", "BIT_LENGTH", "BY", "CASCADE", "CASCADED", "CASE", "CAST", "CATALOG", "CHAR", "CHARACTER", "CHARACTER_LENGTH", "CHAR_LENGTH", "CHECK", "CLOSE", "COALESCE", "COLLATE", "COLLATION", "COLUMN", "COMMIT", "CONNECT", "CONNECTION", "CONSTRAINT", "CONSTRAINTS", "CONTINUE", "CONVERT", "CORRESPONDING", "COUNT", "CREATE", "CURRENT", "CURRENT_DATE", "CURRENT_TIMESTAMP", "CURRENT_TYPE", "CURSOR", "DATE", "DAY", "DEALLOCATE", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DESC", "DESCRIBE", "DESCRIPTOR", "DIAGNOSTICS", "DICONNECT", "DICTIONATRY", "DISPLACEMENT", "DISTINCT", "DOMAIN", "DOUBLE", "DROP", "ELSE", "END", "END-EXEC", "ESCAPE", "EXCEPT", "EXCEPTION", "EXEC", "EXECUTE", "EXISTS", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIRST", "FLOAT", "FOR", "FOREIGN", "FOUND", "FROM", "FULL", "GET", "GLOBAL", "GO", "GOTO", "GRANT", "GROUP", "HAVING", "HOUR", "IDENTITY", "IGNORE", "IMMEDIATE", "IN", "INCLUDE", "INDEX", "INDICATOR", "INITIALLY", "INNER", "INPUT", "INSENSITIVE", "INSERT", "INT", "INTEGER", "INTERSECT", "INTERVAL", "INTO", "IS", "ISOLATION", "JOIN", "KEY", "LANGUAGE", "LAST", "LEFT", "LEVEL", "LIKE", "LOCAL", "LOWER", "MATCH", "MAX", "MIN", "MINUTE", "MODULE", "MONTH", "NAMES", "NATIONAL", "NCHAR", "NEXT", "NOT", "NULL", "NULLIF", "NUMERIC", "OCTECT_LENGTH", "OF", "OFF", "ONLY", "OPEN", "OPTION", "OR", "ORDER", "OUTER", "OUTPUT", "OVERLAPS", "PARTIAL", "POSITION", "PRECISION", "PREPARE", "PRESERVE", "PRIMARY", "PRIOR", "PRIVILEGES", "PROCEDURE", "PUBLIC", "READ", "REAL", "REFERENCES", "RESTRICT", "REVOKE", "RIGHT", "ROLLBACK", "ROWS", "SCHEMA", "SCROLL", "SECOND", "SECTION", "SELECT", "SET", "SIZE", "SMALLINT", "SOME", "SQL", "SQLCA", "SQLCODE", "SQLERROR", "SQLSTATE", "SQLWARNING", "SUBSTRING", "SUM", "SYSTEM", "TABLE", "TEMPORARY", "THEN", "TIME", "TIMESTAMP", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TO", "TRANSACTION", "TRANSLATE", "TRANSLATION", "TRUE", "UNION", "UNIQUE", "UNKNOWN", "UPDATE", "UPPER", "USAGE", "USER", "USING", "VALUE", "VALUES", "VARCHAR", "VARYING", "VIEW", "WHEN", "WHENEVER", "WHERE", "WITH", "WORK", "WRITE", "YEAR", "ZONE" ) DBI/R/DBI.R0000644000175100001440000001525311274357076011632 0ustar hornikusers## $Id$ ## ## ## Database Interface Definition ## ## Define all the classes and methods to be used by an implementation ## of the Database Interface (DBI). All these classes are virtual and ## each driver should extend them to provide the actual implementation. ## See the files DBI.RODBC, DBI.PgSQL, and DBI.RMySQL for concrete ## implementations. ## ## Class hierarchy: (the "*" prefix indicates a virtual class.) ## ## *DBIObject ## | ## |- *DBIDriver ## | |- ODBCDriver ## | |- PgSQLDriver ## | |- MySQLDriver ## | |- ... ## |- *DBIConnection ## | |- ODBCConnection ## | |- PgSQLDConnection ## | |- MySQLDConnection ## | |- .... ## |- *DBIResult ## | |- ODBCResult ## | |- PgSQLResult ## | |- MySQLResult ## | |- ... ## |- *DBIResultSet (NOTE: this has not been agreed upon) ## |- ODBCResultSet ## |- PgSQLResultSet ## |- MySQLResultSet ## |- ... ## ## ## DBIObject and its methods (generics, to be more precise). This is ## the base class for all objects that implement R/S DBMS connectivity ## setClass("DBIObject", "VIRTUAL") ## this is the main meta-data function; each DBI class should have ## this method return version info, and whatever other info is ## relevant (e.g., user, password(?), dbname for connections) setGeneric("dbGetInfo", def = function(dbObj, ...) standardGeneric("dbGetInfo") ) ## implementations may overload this method for all or some of its classes setMethod("summary", "DBIObject", definition = function(object, ...){ info <- dbGetInfo(dbObj = object, ...) cat(class(object),"\n") print.list.pairs(info) invisible(info) } ) ## ## DBIDriver class and its methods. ## ## Should we define methods for querying the interface API to find what ## drivers are available on the current R/Splus instance? Perhaps something ## reminescent of library()? DBIDriver() and DBIDriver(help = "RODBC"), say? ## (JDBC driver manager's class idea would be cleaner.) ## setClass("DBIDriver", representation("DBIObject", "VIRTUAL")) ## The following function "loads" the specific "driver" or package, e.g., ## drv <- dbDriver("MySQL") ## Typically, drivers are expected to have a function of the same name ## that does the actual initialization, e.g., Oracle(), MySQL(), ODBC(), ## SQLite(), .... setGeneric("dbDriver", def = function(drvName, ...) standardGeneric("dbDriver"), valueClass = "DBIDriver") setMethod("dbDriver", "character", definition = function(drvName, ...) { do.call(as.character(drvName), list(...)) } ) setGeneric("dbListConnections", def = function(drv, ...) standardGeneric("dbListConnections") ) setGeneric("dbUnloadDriver", def = function(drv, ...) standardGeneric("dbUnloadDriver"), valueClass = "logical" ) ## ## DBIConnection class and methods ## setClass("DBIConnection", representation("DBIObject", "VIRTUAL")) ## create a connection to the DBMS and return its handle object setGeneric("dbConnect", def = function(drv, ...) standardGeneric("dbConnect"), valueClass = "DBIConnection" ) setGeneric("dbDisconnect", def = function(conn, ...) standardGeneric("dbDisconnect"), valueClass = "logical" ) ## submit a statement to the DBMS, return the handle of the result object setGeneric("dbSendQuery", def = function(conn, statement, ...) standardGeneric("dbSendQuery"), valueClass = "DBIResult" ) ## submit, execute, and fetch a statement (all in one operation) setGeneric("dbGetQuery", def = function(conn, statement, ...) standardGeneric("dbGetQuery") ) setGeneric("dbGetException", def = function(conn, ...) standardGeneric("dbGetException") ) ## return a container with all result objects open in a connection ## (some implementation may only allow one open result set per connection) setGeneric("dbListResults", def = function(conn, ...) standardGeneric("dbListResults") ) ## Convenience DBIConnection functions, most return a logical ## to indicate whether the operation succeeded or not. ## These mimic objects(), get(), exists(), remove(), and assign(), ## and names() setGeneric("dbListTables", def = function(conn, ...) standardGeneric("dbListTables"), valueClass = "character" ) setGeneric("dbReadTable", def = function(conn, name, ...) standardGeneric("dbReadTable"), valueClass = "data.frame" ) setGeneric("dbWriteTable", def = function(conn, name, value, ...) standardGeneric("dbWriteTable"), valueClass = "logical" ) setGeneric("dbExistsTable", def = function(conn, name, ...) standardGeneric("dbExistsTable"), valueClass = "logical" ) setGeneric("dbRemoveTable", def = function(conn, name, ...) standardGeneric("dbRemoveTable"), valueClass = "logical" ) ## this is equivalent to names() on a remote table "name" setGeneric("dbListFields", def = function(conn, name, ...) standardGeneric("dbListFields"), valueClass = "character" ) ## ## data conversion ## setGeneric("dbSetDataMappings", def = function(res, flds, ...) standardGeneric("dbSetDataMappings"), valueClass = "logical" ) ## ## Transaction management ## setGeneric("dbCommit", def = function(conn, ...) standardGeneric("dbCommit"), valueClass = "logical" ) setGeneric("dbRollback", def = function(conn, ...) standardGeneric("dbRollback"), valueClass = "logical" ) ## ## Stored procedures (untested) ## setGeneric("dbCallProc", def = function(conn, ...) standardGeneric("dbCallProc"), valueClass = "logical" ) ## ## Class: dbResult ## This is a base class for arbitrary results from the DBMS ## Shoud we also define dbResultSets/dbCursors? ## setClass("DBIResult", representation("DBIObject", "VIRTUAL")) setGeneric("fetch", def = function(res, n = -1, ...) standardGeneric("fetch"), valueClass = "data.frame" ) ## close remote result and free resource on both sides of the connection setGeneric("dbClearResult", def = function(res, ...) standardGeneric("dbClearResult"), valueClass = "logical" ) ## return a data.frame with columns describing the fields in the ## result (one row per result field). setGeneric("dbColumnInfo", def = function(res, ...) standardGeneric("dbColumnInfo"), valueClass = "data.frame" ) setGeneric("dbGetStatement", def = function(res, ...) standardGeneric("dbGetStatement"), valueClass = "character" ) setGeneric("dbHasCompleted", def = function(res, ...) standardGeneric("dbHasCompleted"), valueClass = "logical" ) setGeneric("dbGetRowsAffected", def = function(res, ...) standardGeneric("dbGetRowsAffected"), valueClass = "numeric" ) setGeneric("dbGetRowCount", def = function(res, ...) standardGeneric("dbGetRowCount"), valueClass = "numeric" ) DBI/NAMESPACE0000644000175100001440000000151310614764334012115 0ustar hornikusersimport(methods) ## regular functions: export( .SQL92Keywords, dbDataType.default, dbGetDBIVersion, isSQLKeyword.default, make.db.names.default, print.list.pairs ) ## Classes exportClasses( DBIConnection, DBIDriver, DBIObject, DBIResult ) ## Methods/Generics exportMethods( dbCallProc, dbClearResult, dbColumnInfo, dbCommit, dbConnect, dbDataType, dbDisconnect, dbDriver, dbExistsTable, dbGetException, dbGetInfo, dbGetQuery, dbGetRowCount, dbGetRowsAffected, dbGetStatement, dbHasCompleted, dbListConnections, dbListFields, dbListResults, dbListTables, dbReadTable, dbRemoveTable, dbRollback, dbSendQuery, dbSetDataMappings, dbUnloadDriver, dbWriteTable, fetch, isSQLKeyword, make.db.names, SQLKeywords, summary ) DBI/DESCRIPTION0000644000175100001440000000120512142672717012403 0ustar hornikusersPackage: DBI Version: 0.2-7 Date: 2013-05-08 Title: R Database Interface Author: R Special Interest Group on Databases (R-SIG-DB) Maintainer: David A. James Depends: R (>= 2.15.0), methods Imports: methods Description: A database interface (DBI) definition for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations. License: LGPL (>= 2) Collate: DBI.R Util.R zzz.R NeedsCompilation: no Packaged: 2013-05-08 23:44:25 UTC; jamesda4 Repository: CRAN Date/Publication: 2013-05-09 12:09:19 DBI/.Rinstignore0000644000175100001440000000002512134704612013167 0ustar hornikusersinst/doc/figure1.pdf