rtf/0000755000175100001440000000000013635630274011074 5ustar hornikusersrtf/NAMESPACE0000644000175100001440000000137713472631532012320 0ustar hornikusersimportFrom("R.methodsS3", "setMethodS3") importFrom("R.oo", "setConstructorS3", "extend", "Object") importFrom("grDevices", "dev.off", "png") importFrom("graphics", "abline", "arrows", "axTicks", "lines", "par", "plot", "points", "text") importFrom("utils", "sessionInfo") exportPattern("^[^\\.]") S3method(addHeader, RTF) S3method(addNewLine, RTF) S3method(addPageBreak, RTF) S3method(addParagraph, RTF) S3method(addPlot, RTF) S3method(addPng, RTF) S3method(addSessionInfo, RTF) S3method(addTOC, RTF) S3method(addTable, RTF) S3method(addText, RTF) S3method(addTrellisObject, RTF) S3method(decreaseIndent, RTF) S3method(done, RTF) S3method(endParagraph, RTF) S3method(increaseIndent, RTF) S3method(setFontSize, RTF) S3method(startParagraph, RTF) S3method(view, RTF) rtf/README.md0000644000175100001440000000050313472642273012352 0ustar hornikusers## rtf R Package An R package to produce RTF documents. ### Installation From CRAN: ``` install.packages("rtf") ``` or from github: ``` library(devtools) install_github("schaffman5/rtf") ``` ### Usage See the vignette for usage details: https://cran.r-project.org/web/packages/rtf/index.html ``` vignette("rtf") ``` rtf/man/0000755000175100001440000000000013277156474011656 5ustar hornikusersrtf/man/setFontSize.RTF.Rd0000644000175100001440000000140113277156533015044 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{setFontSize.RTF} \alias{setFontSize.RTF} \alias{RTF.setFontSize} \alias{setFontSize,RTF-method} \title{Set RTF document font size} \description{ Set RTF document font size. } \usage{ \method{setFontSize}{RTF}(this, font.size, ...) } \arguments{ \item{this}{An RTF object.} \item{font.size}{New default font size in points.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addHeader.RTF.Rd0000644000175100001440000000174313277156533014441 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addHeader.RTF} \alias{addHeader.RTF} \alias{RTF.addHeader} \alias{addHeader,RTF-method} \title{Insert a header into the RTF document} \description{ Insert a header into the RTF document. } \usage{ \method{addHeader}{RTF}(this, title, subtitle=NULL, font.size=NULL, TOC.level=NULL, ...) } \arguments{ \item{this}{An RTF object.} \item{title}{Header title text.} \item{subtitle}{Header subtitle text. \bold{optional}.} \item{font.size}{Font size in points. \bold{optional}.} \item{TOC.level}{Indent level for table of contents. \bold{optional}.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addPlot.RTF.Rd0000644000175100001440000000316113277156533014163 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addPlot.RTF} \alias{addPlot.RTF} \alias{RTF.addPlot} \alias{addPlot,RTF-method} \title{Insert a plot into the RTF document} \description{ Insert a plot into the RTF document. } \usage{ \method{addPlot}{RTF}(this, plot.fun=plot.fun, width=3, height=0.3, res=300, ...) } \arguments{ \item{this}{An RTF object.} \item{plot.fun}{Plot function.} \item{width}{Plot output width in inches.} \item{height}{Plot output height in inches.} \item{res}{Output resolution in dots per inch.} \item{...}{Arguments for \code{plot.fun}.} } \details{ Plots are added to the document as PNG objects. This function will work with all base graphics methods for plotting. For more sophisticated plots, you may need to wrap your plot code into a function, and then pass a reference to that function to this method. The parameters for the plot method would then get passed in as '...' above. To output a ggplot2 plot, simply assign the plot to a variable. Then use 'print' as the plot function and pass in the plot variable assigned above. } \examples{ rtf<-RTF("test_addPlot.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) done(rtf) } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/decreaseIndent.RTF.Rd0000644000175100001440000000132413277156533015510 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{decreaseIndent.RTF} \alias{decreaseIndent.RTF} \alias{RTF.decreaseIndent} \alias{decreaseIndent,RTF-method} \title{Decrease RTF document indent} \description{ Decrease RTF document indent. } \usage{ \method{decreaseIndent}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addParagraph.RTF.Rd0000644000175100001440000000141713277156533015154 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addParagraph.RTF} \alias{addParagraph.RTF} \alias{RTF.addParagraph} \alias{addParagraph,RTF-method} \title{Insert a paragraph into the RTF document} \description{ Insert a paragraph into the RTF document. } \usage{ \method{addParagraph}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{A character \code{\link[base]{vector}} of text to add.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addSessionInfo.RTF.Rd0000644000175100001440000000203313277156533015501 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addSessionInfo.RTF} \alias{addSessionInfo.RTF} \alias{RTF.addSessionInfo} \alias{addSessionInfo,RTF-method} \title{Insert session information into the RTF document} \description{ Insert session information into the RTF document. } \usage{ \method{addSessionInfo}{RTF}(this, locale=TRUE, ...) } \arguments{ \item{this}{An RTF object.} \item{locale}{Output the locale.} \item{...}{Not used.} } \details{ Exports session information to the RTF document in a similar } \examples{ rtf<-RTF("test_addSessionInfo.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addSessionInfo(rtf) done(rtf) } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}., \code{\link{sessionInfo}}. } \keyword{methods} rtf/man/addPageBreak.RTF.Rd0000644000175100001440000000234713277156533015073 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addPageBreak.RTF} \alias{addPageBreak.RTF} \alias{RTF.addPageBreak} \alias{addPageBreak,RTF-method} \title{Insert a page break into the RTF document optionally specifying new page settings} \description{ Insert a page break into the RTF document optionally specifying new page settings. } \usage{ \method{addPageBreak}{RTF}(this, width=8.5, height=11, omi=c(1, 1, 1, 1), ...) } \arguments{ \item{this}{An RTF object.} \item{width}{New page width in inches. \bold{optional}.} \item{height}{New page height in inches. \bold{optional}.} \item{omi}{A \code{\link[base]{vector}} of page margins (botton, left, top, right) \bold{optional}.} \item{...}{Not used.} } \examples{ rtf<-RTF("test_addPageBreak.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addPageBreak(rtf,width=11,height=8.5,omi=c(0.5,0.5,0.5,0.5)) done(rtf) } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addPng.RTF.Rd0000644000175100001440000000164713277156533014000 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addPng.RTF} \alias{addPng.RTF} \alias{RTF.addPng} \alias{addPng,RTF-method} \title{Insert an existing PNG image into the RTF document} \description{ Insert an existing PNG image into the RTF document. } \usage{ \method{addPng}{RTF}(this, file, width=3, height=0.3, ...) } \arguments{ \item{this}{An RTF object.} \item{file}{Image file path.} \item{width}{Plot output width in inches.} \item{height}{Plot output height in inches.} \item{...}{Not used.} } \details{ Add existing PNG file to RTF document. } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addTOC.RTF.Rd0000644000175100001440000000126013277156533013670 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addTOC.RTF} \alias{addTOC.RTF} \alias{RTF.addTOC} \alias{addTOC,RTF-method} \title{Insert table of contents field} \description{ Insert table of contents field. } \usage{ \method{addTOC}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/RTF.Rd0000644000175100001440000001047613635625151012577 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{RTF} \docType{class} \alias{RTF} \title{The RTF class} \description{ This is the class representing an RTF file output. Package: rtf \cr \bold{Class RTF}\cr \code{\link[R.oo]{Object}}\cr \code{~~|}\cr \code{~~+--}\code{RTF}\cr \bold{Directly known subclasses:}\cr \cr public static class \bold{RTF}\cr extends \link[R.oo]{Object}\cr } \usage{ RTF(file="", width=8.5, height=11, omi=c(1, 1, 1, 1), font.size=10) } \arguments{ \item{file}{The path of the output file.} \item{width}{The width of the output page.} \item{height}{The width of the output page.} \item{omi}{A \code{\link[base]{vector}} representing the outer margins in inches (bottom, left, top, right).} \item{font.size}{Default font size for the document in points.} } \section{Fields and Methods}{ \bold{Methods:}\cr \tabular{rll}{ \tab \code{\link[rtf:addHeader.RTF]{addHeader}} \tab Insert a header into the RTF document.\cr \tab \code{\link[rtf:addNewLine.RTF]{addNewLine}} \tab Insert a new line into the RTF document.\cr \tab \code{\link[rtf:addPageBreak.RTF]{addPageBreak}} \tab Insert a page break into the RTF document optionally specifying new page settings.\cr \tab \code{\link[rtf:addParagraph.RTF]{addParagraph}} \tab Insert a paragraph into the RTF document.\cr \tab \code{\link[rtf:addPlot.RTF]{addPlot}} \tab Insert a plot into the RTF document.\cr \tab \code{\link[rtf:addPng.RTF]{addPng}} \tab Insert an existing PNG image into the RTF document.\cr \tab \code{\link[rtf:addSessionInfo.RTF]{addSessionInfo}} \tab Insert session information into the RTF document.\cr \tab \code{\link[rtf:addTOC.RTF]{addTOC}} \tab Insert table of contents field.\cr \tab \code{\link[rtf:addTable.RTF]{addTable}} \tab Insert a table into the RTF document.\cr \tab \code{\link[rtf:addText.RTF]{addText}} \tab Insert text into the RTF document.\cr \tab \code{\link[rtf:addTrellisObject.RTF]{addTrellisObject}} \tab Insert a trellis plot object into the RTF document.\cr \tab \code{\link[rtf:decreaseIndent.RTF]{decreaseIndent}} \tab Decrease RTF document indent.\cr \tab \code{\link[rtf:done.RTF]{done}} \tab Write and close the RTF output.\cr \tab \code{\link[rtf:endParagraph.RTF]{endParagraph}} \tab End a paragraph in the RTF document.\cr \tab \code{\link[rtf:increaseIndent.RTF]{increaseIndent}} \tab Increase RTF document indent.\cr \tab \code{\link[rtf:setFontSize.RTF]{setFontSize}} \tab Set RTF document font size.\cr \tab \code{\link[rtf:startParagraph.RTF]{startParagraph}} \tab Start a new paragraph in the RTF document.\cr \tab \code{\link[rtf:view.RTF]{view}} \tab View encoded RTF.\cr } \bold{Methods inherited from Object}:\cr $, $<-, [[, [[<-, as.character, attach, attachLocally, clearCache, clearLookupCache, clone, detach, equals, extend, finalize, getEnvironment, getFieldModifier, getFieldModifiers, getFields, getInstantiationTime, getStaticInstance, hasField, hashCode, ll, load, names, objectSize, print, save } \examples{ \dontrun{ output<-"test_RTF-class.doc" png.res<-300 rtf<-RTF(output,width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addHeader(rtf,title="Test",subtitle="2011-08-15\n") addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) # Try trellis plots if(require(lattice) & require(grid)) { # single page trellis objects addPageBreak(rtf, width=11,height=8.5,omi=c(0.5,0.5,0.5,0.5)) p <- histogram( ~ height | voice.part, data = singer, xlab="Height") addTrellisObject(rtf,trellis.object=p,width=10,height=7.5,res=png.res) p <- densityplot( ~ height | voice.part, data = singer, xlab = "Height") addTrellisObject(rtf,trellis.object=p,width=10,height=7.5,res=png.res) # multipage trellis object p2<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) addTrellisObject(rtf,trellis.object=p2,width=6,height=6,res=png.res) } addPageBreak(rtf, width=6,height=10,omi=c(0.5,0.5,0.5,0.5)) addTable(rtf,as.data.frame(head(iris)),font.size=10,row.names=FALSE,NA.string="-") addSessionInfo(rtf) done(rtf) } } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{classes} rtf/man/rtf.forest.plot.Rd0000644000175100001440000000424013277156532015211 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % forest.plot.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{rtf.forest.plot} \alias{rtf.forest.plot} \title{Get an RTF encoded forest plot} \description{ Get an RTF encoded forest plot. } \usage{ rtf.forest.plot(x=1.25, min=0.5, max=2, xlim=c(0.1, 12), width=3, height=0.3, cex=1, lwd=0.75, res=300) } \arguments{ \item{x}{x (e.g. hazard ratio).} \item{min}{Minimum whisker (e.g. lower bound of 95\% hazard ratio CI).} \item{max}{Maximum whisker (e.g. upper bound of 95\% hazard ratio CI).} \item{xlim}{A \code{\link[base]{vector}} specifying the x limits.} \item{width}{Plot width in inches.} \item{height}{Plot height in inches.} \item{cex}{A numerical value giving the amount by which plotting text and symbols should be magnified relative to the default.} \item{lwd}{Line width.} \item{res}{Output resolution in dots per inch.} } \details{ Create a forest plot and convert PNG to RTF code. This is useful for embedding into a data frame of hazard ratios and then writing an RTF output file. See the example below for usage. } \examples{ \dontrun{ tab<-data.frame( Label=c("Test1","Test2","Test3"), HR=c(1,2,0.45), Lower.CI=c(0.5,1.1,0.25), Upper.CI=c(2,3.5,0.9), stringsAsFactors=FALSE, check.names=FALSE) # create forest plots by row forest.plot.args<-list(xlim=c(0.1,5),width=3.0,height=0.3,cex=1,lwd=0.75,res=300) tab$"HR Plot (log scale)"<-mapply(rtf.forest.plot,tab$HR,tab$Lower.CI,tab$Upper.CI, MoreArgs=forest.plot.args) # rbind the x-scale to the table in the plot column xscale<-rtf.forest.plot.xscale(xlim=c(0.1,5),width=3.0,height=0.3,cex=1, lwd=0.75,res=300) tab<-data.frame(lapply(tab, as.character), stringsAsFactors=FALSE, check.names=FALSE) tab<-rbind(tab,list("","","","",xscale)) # write the RTF output rtf<-RTF("test_rtf.forest.plot.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addTable(rtf,tab,col.widths=c(0.75,0.75,0.75,0.75,3)) done(rtf) } } rtf/man/view.RTF.Rd0000644000175100001440000000130613277156533013545 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{view.RTF} \alias{view.RTF} \alias{RTF.view} \alias{view,RTF-method} \title{View encoded RTF} \description{ View encoded RTF. } \usage{ \method{view}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \value{ Output the content of the object as RTF code. } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addText.RTF.Rd0000644000175100001440000000152513277156533014173 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addText.RTF} \alias{addText.RTF} \alias{RTF.addText} \alias{addText,RTF-method} \title{Insert text into the RTF document} \description{ Insert text into the RTF document. } \usage{ \method{addText}{RTF}(this, ..., bold=FALSE, italic=FALSE) } \arguments{ \item{this}{An RTF object.} \item{bold}{Bold text. \bold{optional}.} \item{italic}{Italic text. \bold{optional}.} \item{...}{Any number of character strings to concatenate.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/increaseIndent.RTF.Rd0000644000175100001440000000132413277156533015526 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{increaseIndent.RTF} \alias{increaseIndent.RTF} \alias{RTF.increaseIndent} \alias{increaseIndent,RTF-method} \title{Increase RTF document indent} \description{ Increase RTF document indent. } \usage{ \method{increaseIndent}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/rtf-package.Rd0000644000175100001440000000365113277156532014331 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % 999.package.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{rtf-package} \alias{rtf-package} \alias{rtf} \docType{package} \title{Package rtf} \encoding{latin1} \description{ A set of R functions to output Rich Text Format (RTF) files with high resolution tables and graphics that may be edited with a standard word processor such as Microsoft Word. This is useful for compiling R results into a document for further editing or to be merged with another document. While Sweave and odfWeave provide nicely formatted outputs, the syntax can be difficult for beginners to master. Moreover, Sweave compilation to a PDF is not editable. Other packages such as SWord and R2wd provide similar functionality but require the user to be running a Microsoft Windows OS. This package is written in pure R and does not require leaving the R environment to write files. R data frames and table objects are converted to nicely formatted RTF tables. One important limitation of the RTF specification is that vector graphics output is limited to Windows Meta File (WMF) and Enhanced Meta File (EMF) formats. Because these formats are not supported across platforms, this package currently only supports RTF embedding of PNG plots and images. To ensure high quality reports, the resolution may be specified when writing the RTF output. } \section{Requirements}{ This package depends on the \pkg{R.oo} package. } \section{Usage}{ For usage details \code{\link{RTF}}. } \author{Michael E. Schaffer} \references{ [1] \url{http://en.wikipedia.org/wiki/Rich_Text_Format}\cr [2] \url{http://latex2rtf.sourceforge.net/rtfspec_7.html#rtfspec_paraforprop}\cr } \keyword{ rtf } \keyword{package} rtf/man/addTable.RTF.Rd0000644000175100001440000000416613277156533014302 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addTable.RTF} \alias{addTable.RTF} \alias{RTF.addTable} \alias{addTable,RTF-method} \title{Insert a table into the RTF document} \description{ Insert a table into the RTF document. } \usage{ \method{addTable}{RTF}(this, dat, col.widths=NULL, col.justify=NULL, header.col.justify=NULL, font.size=NULL, row.names=FALSE, NA.string="-", space.before=NULL, space.after=NULL, ...) } \arguments{ \item{this}{An RTF object.} \item{dat}{A matrix, data frame, or table.} \item{col.widths}{A \code{\link[base]{vector}} of column widths in inches. \bold{optional}.} \item{col.justify}{A single value or \code{\link[base]{vector}} of column justifications ('L', 'R', 'C', or 'J' for Left, Right, Center, and Justify, respectively). \bold{optional}.} \item{header.col.justify}{A single value or \code{\link[base]{vector}} of table header column justifications ('L', 'R', 'C', or 'J' for Left, Right, Center, and Justify, respectively). \bold{optional}.} \item{font.size}{Font size in points. \bold{optional}.} \item{row.names}{Boolean argument to include row names in tables. \bold{optional}.} \item{NA.string}{A character string to replace NA values in the table.} \item{space.before}{Space before each row (in inches). \bold{optional}.} \item{space.after}{Space after each row (in inches). \bold{optional}.} \item{...}{Not used.} } \examples{ rtf<-RTF("test_addTable.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) addTable(rtf,as.data.frame(head(iris)),font.size=10,row.names=FALSE,NA.string="-", col.widths=rep(1,5)) tab<-table(iris$Species,floor(iris$Sepal.Length)) names(dimnames(tab))<-c("Species","Sepal Length") addTable(rtf,tab,font.size=10,row.names=TRUE,NA.string="-",col.widths=c(1,rep(0.5,4)) ) done(rtf) } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addTrellisObject.RTF.Rd0000644000175100001440000000366513277156533016023 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addTrellisObject.RTF} \alias{addTrellisObject.RTF} \alias{RTF.addTrellisObject} \alias{addTrellisObject,RTF-method} \title{Insert a trellis plot object into the RTF document} \description{ Insert a trellis plot object into the RTF document. } \usage{ \method{addTrellisObject}{RTF}(this, trellis.object, width=3, height=0.3, res=300, rotate=NULL, ...) } \arguments{ \item{this}{An RTF object.} \item{trellis.object}{The trellis plot object.} \item{width}{Plot output width in inches.} \item{height}{Plot output height in inches.} \item{res}{Output resolution in dots per inch.} \item{rotate}{Object rotation in degrees. \bold{optional}.} \item{...}{Not used.} } \details{ Plots are added to the document as PNG objects. Multi-page trellis objects are automatically split across multiple pages in the RTF output file. To rotate the object to landscape orientation within the RTF output, use rotate=90. When using rotation, width and height still refer to the unrotated plot dimensions and not the rotated output dimensions on the RTF page. An alternative to rotating the plot is to rotate the entire page using a call to addPageBreak with suitable page width and height dimensions. } \examples{ \dontrun{ rtf<-RTF("test_addTrellisObject.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) if(require(lattice) & require(grid)) { # multipage trellis object p2<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) addTrellisObject(rtf,trellis.object=p2,width=8,height=4,res=300, rotate=90) } done(rtf) } } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/startParagraph.RTF.Rd0000644000175100001440000000135613277156533015563 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{startParagraph.RTF} \alias{startParagraph.RTF} \alias{RTF.startParagraph} \alias{startParagraph,RTF-method} \title{Start a new paragraph in the RTF document} \description{ Start a new paragraph in the RTF document. } \usage{ \method{startParagraph}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/addNewLine.RTF.Rd0000644000175100001440000000143513277156533014610 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{addNewLine.RTF} \alias{addNewLine.RTF} \alias{RTF.addNewLine} \alias{addNewLine,RTF-method} \title{Insert a new line into the RTF document} \description{ Insert a new line into the RTF document. } \usage{ \method{addNewLine}{RTF}(this, n=1, ...) } \arguments{ \item{this}{An RTF object.} \item{n}{Number of lines to add. Default is 1. \bold{optional}} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/endParagraph.RTF.Rd0000644000175100001440000000133013277156533015164 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{endParagraph.RTF} \alias{endParagraph.RTF} \alias{RTF.endParagraph} \alias{endParagraph,RTF-method} \title{End a paragraph in the RTF document} \description{ End a paragraph in the RTF document. } \usage{ \method{endParagraph}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/man/Non-documented_objects.Rd0000644000175100001440000000236413277156532016535 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % 999.NonDocumentedObjects.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{Non-documented objects} \alias{Non-documented objects} \title{Non-documented objects} \alias{view} \alias{addTable} \alias{done} \alias{addPageBreak} \alias{startParagraph} \alias{endParagraph} \alias{addHeader} \alias{addParagraph} \alias{addText} \alias{addNewLine} \alias{decreaseIndent} \alias{increaseIndent} \alias{setFontSize} \alias{addPlot} \alias{addPng} \alias{addTrellisObject} \alias{addTOC} \alias{addSessionInfo} \alias{rtf.forest.plot.xscale} \description{ This page contains aliases for all "non-documented" objects that \code{R CMD check} detects in this package. Almost all of them are \emph{generic} functions that have a specific document for the corresponding method coupled to a specific class. Other functions are re-defined by \code{setMethodS3()} to \emph{default} methods. Neither of these two classes are non-documented in reality. } \author{Michael E. Schaffer} \keyword{documentation} \keyword{internal} rtf/man/done.RTF.Rd0000644000175100001440000000124513277156533013522 0ustar hornikusers%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % rtf.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{done.RTF} \alias{done.RTF} \alias{RTF.done} \alias{done,RTF-method} \title{Write and close the RTF output} \description{ Write and close the RTF output. } \usage{ \method{done}{RTF}(this, ...) } \arguments{ \item{this}{An RTF object.} \item{...}{Not used.} } \author{Michael E. Schaffer} \seealso{ For more information see \code{\link{RTF}}. } \keyword{methods} rtf/DESCRIPTION0000644000175100001440000000147313635630274012607 0ustar hornikusersPackage: rtf Version: 0.4-14.1 Depends: R (>= 2.10.1) Imports: R.oo, R.methodsS3 Suggests: ggplot2, lattice, grid, xtable, gsubfn Date: 2019-05-26 Title: Rich Text Format (RTF) Output Authors@R: c(person(c("Michael","E."), "Schaffer", role=c("aut", "cre", "cph"), email = "mschaff@gmail.com")) Description: A set of R functions to output Rich Text Format (RTF) files with high resolution tables and graphics that may be edited with a standard word processor such as Microsoft Word. License: GPL (>= 2) LazyLoad: TRUE Packaged: 2020-03-22 09:06:07 UTC; hornik NeedsCompilation: no Repository: CRAN URL: https://github.com/schaffman5/rtf BugReports: https://github.com/schaffman5/rtf/issues Author: Michael E. Schaffer [aut, cre, cph] Maintainer: Michael E. Schaffer Date/Publication: 2020-03-22 09:32:44 UTC rtf/build/0000755000175100001440000000000013635625177012201 5ustar hornikusersrtf/build/vignette.rds0000644000175100001440000000036113635625177014540 0ustar hornikusersuP 0 9@>= library(rtf) @ Now, we can use the \texttt{RTF} function to initialize an RTF object and return a reference for all subsequent methods. You may notice that the parameters for this method are similar to those used in \texttt{base} plots. We can define the RTF page width and height (in inches), the default font size (in points), and the outer page margins (in inches). <<>>= output<-"rtf_vignette.doc" # although this is RTF, we can use the # .doc extension so it opens in MS Word rtf<-RTF(output,width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # Other rtf commands here... done(rtf) # writes and closes the file @ \section{Text} \subsection{Basic Text} There are three ways to output text to an RTF document: \texttt{addHeader}, \texttt{addParagraph}, \texttt{startParagraph}/\texttt{addText}/\texttt{endParagraph}. These are very similar, but some differences are outlined below. First, we can create a new section with a title in bold followed by either a subtitle or the section text in normal text. <<>>= addHeader(rtf,title="Section Header", subtitle="This is the subheading or section text.") @ If a header is not necessary, a self-contained paragraph can be created with the \texttt{addParagraph} method. <<>>= addParagraph(rtf,"This is a new self-contained paragraph.\n") @ Alternatively, we may define a paragraph start and end. Text may be inserted between these methods using the \texttt{addText} function. <<>>= startParagraph(rtf) addText(rtf,"This text was added with the addText command. ") addText(rtf,"You can add styled text too. ",bold=TRUE,italic=TRUE) addText(rtf,"You must end the paragraph manually.") endParagraph(rtf) @ \subsection{New Lines} There are a couple ways to insert new lines within the text. First, you may use ``\texttt{\textbackslash n}'' within any string. Alternatively, you may insert a new line using the \texttt{addNewLine} function. <<>>= addNewLine(rtf) @ \subsection{Unicode and Greek Characters} Uppercase and lowercase Greek characters may be used in any string but must be encoded in a specific manner. The implementation mimics syntax used for encoding Unicode characters in HTML 4.0. For example, to export uppercase Alpha through Epsilon, we can use the follow code. <<>>= addParagraph(rtf,"Α Β Γ Δ Ε\n\n") @ For lowercase, we use the following. <<>>= addParagraph(rtf,"α β γ δ ε\n\n") @ Other Unicode characters are supported through specific HTML equivalents. These are defined at \url{http://www.w3.org/TR/html4/sgml/entities.html}. Unicode characters may be encoded directly using the Unicode decimal value. For example, to encode three heart shapes, we use the following combination of Unicode and RTF syntax. <<>>= addParagraph(rtf,"\\u9829\\3 \\u9829\\3 \\u9829\\3\n\n") @ \subsection{URLs} URLs are not currently supported, but will be in a future version. \subsection{Mathematical Formulae} Unfortunately, support for mathematical formulae is not part of the RTF specification. This package is not recommended for heavy use of formulae and cannot produce output on par with \texttt{Sweave}. \subsection{RTF Code} Native RTF may be used directly within any text block buy simply adding a backslash to the RTF commands. For example, the following demonstrates two ways to style bold text using native RTF commands, ``\texttt{\textbackslash b}'' and ``\texttt{\textbackslash b0}''. The full RTF specificaiton of RTF syntax is available at \url{http://www.microsoft.com/en-us/download/details.aspx?id=10725}. <<>>= addParagraph(rtf,"Normal, \\b this is bold\\b0, normal.\n") @ or alternatively, with curly brackets to contain the code, <<>>= addParagraph(rtf,"Normal, {\\b\\i bold-italic}, normal.\n") @ When incorporating native RTF code, it is important to pay attention to spacing in the RTF syntax. Improper spacing can cause MS Word parser errors that are difficult to debug. \section{Formatting} Currently, document formatting with the \texttt{rtf} package functions is limited. There are, however, a few useful methods. In addition, all of the native RTF syntax is available for more complex document formatting. Three functions that allow changes in text placement include: \texttt{increaseIndent} to indent text or figures, \texttt{decreaseIndent} to move the indentation to the left, and \texttt{addPageBreak} that allows changes in page orientation and margins in the middle of a document. \section{Tables} The \texttt{addTable} function may be used to add tabular data to an RTF report from a \texttt{data.frame} or any data that can be coerced to a \texttt{data.frame}. For tables with specific formatting requirements, it is recommended to format the table data before passing to the \texttt{addTable} function. This function will guess the best column widths to use, but also allows the user to specify column widths. For example we can insert a table based on the \texttt{iris} data below. <<>>= tab<-as.data.frame(head(iris)) # create a data.frame colnames(tab)<-gsub("\\."," ",colnames(tab)) # format column names @ <>= library(xtable) print(xtable(tab), table.placement = "!htbp") @ <<>>= addTable(rtf,tab,font.size=9,row.names=FALSE,NA.string="-") @ We may also want to output a table from the \texttt{table} command, such as the following. <<>>= tab<-table(iris$Species,floor(iris$Sepal.Length)) names(dimnames(tab))<-c("Species","Sepal Length") @ <>= print(xtable(tab), table.placement = "!htbp") @ Here we can specify the columns widths and a string to substitute for \texttt{NA} values. <<>>= addTable(rtf,tab,font.size=10,row.names=TRUE,NA.string="-", col.widths=c(1,0.5,0.5,0.5,0.5) ) @ \section{Figures} Figures and graphics may be inserted into the RTF document as easily as text. One limitation of the RTF specification is that vector-based image formats (e.g. EPS or PDF) are undefined except for Microsoft's proprietary WMF and EMF formats. For this reason the \texttt{rtf} package uses raster-based PNG files for inserting figures into RTF documents. The resolution for these images may be set to any value; however, for publication, it is recommended that users independently export figures as PDF. The basic approach for adding plots is the \texttt{addPlot} function. This command takes a plot function as a paramater, along with specific RTF parameters, and then any other parameters to be sent to the plot function. The syntax is as follows, where ``\texttt{...}'' represents all parameters to be passed to the \texttt{plot.fun} function. Notice how we define the plot width and height (in inches), along with the desired resolution (in dots per inch). <>= addPlot(RTF.object, plot.fun=plot.fun, width=4, height=5, res=300, ...) @ \subsection{\texttt{base} Plots} For \texttt{base} graphics plots, we can use the \texttt{addPlot} in two ways. First we can directly use the plot function in the \texttt{addPlot} function. Below, we simply use \texttt{R}'s \texttt{plot} function. <>= plot(iris[,1],iris[,2]) @ To add this plot to the document, we use the following. <<>>= addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) @ Alternatively, we can wrap a more complex plot that has several steps into a function that takes any number of parameters. <>= newPlot<-function() { par(pty="s",cex=0.7) # adjust plot style plot(iris[,1],iris[,2]) abline(h=2.5,v=6.0,lty=2) # add some lines } newPlot() @ Then we add this plot to the document with the following. Note in this case there are no extra \texttt{plot.fun} parameters to pass along, but the function may be rewritten to accept any parameters to promote reuse of plotting code. <<>>= addPlot(rtf,plot.fun=newPlot,width=6,height=6,res=300) @ \subsection{\texttt{lattice} Plots} The \texttt{lattice} package enables trellis plots for visualizing relationships between variables of complex data sets. To create the output for RTF, we just assign the \texttt{lattice} plot to a variable. The \texttt{print} function may then be used to visualize the plot. <>= library(lattice) p <- histogram( ~ height | voice.part, data = singer, xlab="Height") print(p) @ To include this plot in the RTF document we again call the \texttt{addPlot} method. However, for \texttt{lattice} plots, we pass \texttt{print} as the \texttt{plot.fun} function and use the \texttt{p} variable as a parameter for this function. Below is an example that specifies the plot width and height (in inches), along with the desired resolution (in dots per inch). <<>>= addPlot(rtf,plot.fun=print,width=5,height=5,res=300,p) @ Alternatively, we can use the \texttt{addTrellisObject} method with \texttt{lattice} plots. The \texttt{addTrellisObject} method is suited for multi-page trellis objects and will create an image for each page in the RTF document. It also works for single page images as well. <>= p2 <- densityplot( ~ height | voice.part, data = singer, xlab = "Height") print(p2) @ <<>>= addTrellisObject(rtf,trellis.object=p2,width=5,height=5,res=300) @ <>= p3<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) print(p3) # note this is a multipage lattice plot # but Sweave only shows the first plot @ <<>>= addTrellisObject(rtf,trellis.object=p3,width=6,height=6,res=300) @ \subsection{\texttt{ggplot2} Plots} The \texttt{ggplot2} package is an alternative to \texttt{base} and \texttt{lattice} graphics and is an implementation of Leland Wilkinson's Grammar of Graphics. Below is code that creates a simple \texttt{ggplot2} plot and stores a representation in a variable called, \texttt{mt}. The \texttt{print} function may then be used to visualize the plot. \begin{center} <>= # plot library(ggplot2) mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() print(mt) @ \end{center} To include this plot in the RTF document we again call the \texttt{addPlot} method. Just as with \texttt{lattice} trellis plots, we pass \texttt{print} as the \texttt{plot.fun} function and use the \texttt{mt} variable as a parameter for this function. <<>>= addPlot(rtf,plot.fun=print,width=5,height=4,res=300, mt) @ \subsection{External Figures} The \texttt{rtf} package also supports incorporation of existing PNG images generated by \texttt{R} or any other software. The code below demonstrates how to do this by pointing to the image file and specifying the desired output size. <>= addPng(rtf, "foo.png", width=5, height=5) @ \section{Table of Contents} The \texttt{rtf} package also supports creation of a Table of Contents. This uses the TOC.level attribute of headers throughout the RTF document. Note that some word processors, including Microsoft Word, will not automatically render the table of contents unless the field is updated. When opening the file for the first time in Microsoft Word, it may be necessary to force the field to update by right clicking on it and choosing 'Update Field'. <>= addHeader(rtf,"Table of Contents") addTOC(rtf) addHeader(rtf,"Section 3",TOC.level=1) addHeader(rtf,"Section 3A",TOC.level=2) addHeader(rtf,"Section 3B",TOC.level=2) @ \section{Output} When an RTF document is complete, you close and write the document with the \texttt{done} command. It may take some time to run depending on the document complexity and number of figures. It is also customary to include information about the \texttt{R} session in reports. For this we use the \texttt{addSessionInfo} method. For example, the following code creates a page break, adds nicely formatted session information, and writes the RTF document. <<>>= addPageBreak(rtf, width=8.5, height=11, omi=c(1,1,1,1)) addSessionInfo(rtf) done(rtf) @ \end{document}rtf/NEWS0000644000175100001440000000436713277152014011576 0ustar hornikusersCHANGES IN 0.4-13 (2014-08-07) ----------------------------- Added explicit imports and exports to resolve CRAN checks. CHANGES IN 0.4-12 (2014-08-07) ----------------------------- Added color table. CHANGES IN 0.4-11 (2013-11-12) ----------------------------- Changed to author to use Authors@R CHANGES IN 0.4-10 (2013-08-20) ----------------------------- Changed imports to include R.methodsS3. Changed license to GPL. Moved gsubfn to Suggests instead of Depends. Removed dependency that forced X-windows start when the library was loaded. Removed 'methods' dependency (thanks to Henrik Bengtsson for help). CHANGES IN 0.4-9 (2013-08-18) ----------------------------- Unreleased version. CHANGES IN 0.4-8 (2013-06-04) ----------------------------- Added support for etables. CHANGES IN 0.4-7 (2012-08-22) ----------------------------- Added table of contents support. Added page number support in footers. Added right justify for numeric values in tables. Added full Greek alphabet to .convert function. CHANGES IN 0.4-6 (2012-06-19) ----------------------------- Added xtable to suggests list. CHANGES IN 0.4-5 (2012-06-17) ----------------------------- Corrected an incorrect Greek symbol substitution and added support for full Greek alphabet. Fixed hidden method documentation with Rdoc annotation: @keyword -internal Added package vignette. CHANGES IN 0.4-4 (2012-04-11) ----------------------------- Added documentation to output ggplot2 plots. Added generic addPng method for inserting existing images. Fixed output of some UTF-8 symbols method that were not being escaped properly. Fixed a problem with the row.names parameter in addTable for data.frames. CHANGES IN 0.4-3 (2011-10-03) ----------------------------- Added NAMESPACE as required for packages in R-2.14.0. Added parameter to rotate lattice plots in RTF output. Added parameter for automatic column width detection in tables. Fixed output of data.frame row names in addTable method. CHANGES IN 0.4-2 (2011-09-05) ----------------------------- Updates to documentation. Added forest plot code. CHANGES IN 0.4-1 (2011-09-04) ----------------------------- Added license file and fixed an inappropriate is.nan call on a data frame. CHANGES IN 0.4-0 (2011-09-04) ----------------------------- Submission to CRAN. rtf/R/0000755000175100001440000000000013277152743011277 5ustar hornikusersrtf/R/999.package.R0000755000175100001440000000333111631223614013335 0ustar hornikusers#########################################################################/** # @RdocPackage rtf # # \encoding{latin1} # # \description{ # A set of R functions to output Rich Text Format (RTF) files with high # resolution tables and graphics that may be edited with a standard word # processor such as Microsoft Word. This is useful for compiling R # results into a document for further editing or to be merged with another # document. # # While Sweave and odfWeave provide nicely formatted outputs, the syntax # can be difficult for beginners to master. Moreover, Sweave compilation # to a PDF is not editable. Other packages such as SWord and R2wd provide # similar functionality but require the user to be running a Microsoft # Windows OS. # # This package is written in pure R and does not require leaving the R # environment to write files. R data frames and table objects are converted to # nicely formatted RTF tables. One important limitation of the RTF # specification is that vector graphics output is limited to Windows Meta File # (WMF) and Enhanced Meta File (EMF) formats. Because these formats are not # supported across platforms, this package currently only supports RTF # embedding of PNG plots and images. To ensure high quality reports, the # resolution may be specified when writing the RTF output. # } # # \section{Requirements}{ # This package depends on the \pkg{R.oo} package. # } # # \section{Usage}{ # For usage details @see "RTF". # } # # @author # # \references{ # [1] \url{http://en.wikipedia.org/wiki/Rich_Text_Format}\cr # # [2] \url{http://latex2rtf.sourceforge.net/rtfspec_7.html#rtfspec_paraforprop}\cr # } # # \keyword{ rtf } # #*/######################################################################### rtf/R/rtf.R0000644000175100001440000014623613472631707012230 0ustar hornikusers########################################################################################## ## RTF Output Functions for R # ## # ## Author: Michael E. Schaffer, Ph.D. # # ## # ## Description: # ## A set of R functions to output RTF files with high resolution graphics and tables. # ## This is useful for reporting R results to an Microsoft Word-compatible report. All # ## graphics must be in a format supported by Word. Currently the most compatible format # ## is PNG. # ## # ## For details about the RTF format (a Microsoft format), see: # ## http://latex2rtf.sourceforge.net/rtfspec_7.html#rtfspec_paraforprop # ## http://www.pindari.com/rtf2.html # ## # ## For use as source file include: library(R.oo) # ########################################################################################## #########################################################################/** # @RdocClass RTF # # @title "The RTF class" # # \description{ # This is the class representing an RTF file output. # # @classhierarchy # } # # @synopsis # # \arguments{ # \item{file}{The path of the output file.} # \item{width}{The width of the output page.} # \item{height}{The width of the output page.} # \item{omi}{A @vector representing the outer margins in inches (bottom, left, top, right).} # \item{font.size}{Default font size for the document in points.} # \item{...}{Not used.} # } # # \section{Fields and Methods}{ # @allmethods # } # # \examples{ # \dontrun{ # output<-"test_RTF-class.doc" # png.res<-300 # # rtf<-RTF(output,width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addHeader(rtf,title="Test",subtitle="2011-08-15\n") # addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) # # # Try trellis plots # if(require(lattice) & require(grid)) { # # single page trellis objects # addPageBreak(rtf, width=11,height=8.5,omi=c(0.5,0.5,0.5,0.5)) # # p <- histogram( ~ height | voice.part, data = singer, xlab="Height") # addTrellisObject(rtf,trellis.object=p,width=10,height=7.5,res=png.res) # # p <- densityplot( ~ height | voice.part, data = singer, xlab = "Height") # addTrellisObject(rtf,trellis.object=p,width=10,height=7.5,res=png.res) # # # multipage trellis object # p2<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) # addTrellisObject(rtf,trellis.object=p2,width=6,height=6,res=png.res) # } # # addPageBreak(rtf, width=6,height=10,omi=c(0.5,0.5,0.5,0.5)) # addTable(rtf,as.data.frame(head(iris)),font.size=10,row.names=FALSE,NA.string="-") # # addSessionInfo(rtf) # # done(rtf) # } # } # # @author # # \seealso{ # @seeclass # } # #*/######################################################################### setConstructorS3("RTF", function(file="",width=8.5,height=11,omi=c(1,1,1,1),font.size=10) { this <- extend(Object(), "RTF", .rtf = .start.rtf(width,height,omi), .file = file, .font.size = font.size, .indent = 0, .page.width = width, .page.height = height, .content.width = width - omi[2] - omi[4] ); this; }); ###########################################################################/** # @RdocMethod addTable # # @title "Insert a table into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{dat}{A matrix, data frame, or table.} # \item{col.widths}{A @vector of column widths in inches. \bold{optional}.} # \item{col.justify}{A single value or @vector of column justifications ('L', 'R', 'C', or 'J' for Left, Right, Center, and Justify, respectively). \bold{optional}.} # \item{header.col.justify}{A single value or @vector of table header column justifications ('L', 'R', 'C', or 'J' for Left, Right, Center, and Justify, respectively). \bold{optional}.} # \item{font.size}{Font size in points. \bold{optional}.} # \item{row.names}{Boolean argument to include row names in tables. \bold{optional}.} # \item{NA.string}{A character string to replace NA values in the table.} # \item{space.before}{Space before each row (in inches). \bold{optional}.} # \item{space.after}{Space after each row (in inches). \bold{optional}.} # \item{...}{Not used.} # } # # \examples{ # rtf<-RTF("test_addTable.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addTable(rtf,as.data.frame(head(iris)),font.size=10,row.names=FALSE,NA.string="-", # col.widths=rep(1,5)) # # tab<-table(iris$Species,floor(iris$Sepal.Length)) # names(dimnames(tab))<-c("Species","Sepal Length") # addTable(rtf,tab,font.size=10,row.names=TRUE,NA.string="-",col.widths=c(1,rep(0.5,4)) ) # # done(rtf) # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/########################################################################### setMethodS3("addTable", "RTF", function(this,dat,col.widths=NULL,col.justify=NULL,header.col.justify=NULL,font.size=NULL,row.names=FALSE,NA.string="-", space.before=NULL, space.after=NULL, ...) { if(is.null(font.size)) { font.size = this$.font.size # default } this$.rtf <- paste(this$.rtf, .add.table(dat,col.widths,col.justify,header.col.justify,font.size,row.names,indent=this$.indent,NA.string=NA.string,max.table.width=this$.content.width, space.before=space.before, space.after=space.after, ...),sep="") }) #########################################################################/** # @RdocMethod view # # @title "View encoded RTF" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # \value{ # Output the content of the object as RTF code. # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal #*/######################################################################### setMethodS3("view", "RTF", function(this, ...) { print(this$.rtf) print(this$.file) }) #########################################################################/** # @RdocMethod done # # @title "Write and close the RTF output" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal #*/######################################################################### setMethodS3("done", "RTF", function(this, ...) { #this$.rtf <- paste(this$.rtf,.end.rtf(),sep="") #write(this$.rtf,this$.file) # write the file, but don't close it out so that we can continue to # add to the object and write it out again. write(paste(this$.rtf,.end.rtf(),sep=""),this$.file) }) #########################################################################/** # @RdocMethod addTOC # # @title "Insert table of contents field" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addTOC", "RTF", function(this,...) { toc<-"{\\field\\flddirty\\fldedit{\\*\\fldinst TOC f h}{\\fldrslt Update Field (right-click in MS Word) to show Table of Contents}}\\line\\line" if(!is.null(this$.font.size)) { font.size = this$.font.size # default } this$.rtf <- paste(this$.rtf,.start.paragraph(indent=this$.indent,font.size=font.size),sep="") this$.rtf <- paste(this$.rtf,toc,sep="") this$.rtf <- paste(this$.rtf,.end.paragraph(),sep="") }) #########################################################################/** # @RdocMethod addHeader # # @title "Insert a header into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{title}{Header title text.} # \item{subtitle}{Header subtitle text. \bold{optional}.} # \item{font.size}{Font size in points. \bold{optional}.} # \item{TOC.level}{Indent level for table of contents. \bold{optional}.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addHeader", "RTF", function(this, title,subtitle=NULL,font.size=NULL,TOC.level=NULL,...) { if(is.null(font.size)) { font.size = this$.font.size # default } this$.rtf <- paste(this$.rtf,.add.header(title,subtitle=subtitle,indent=this$.indent,font.size=font.size,TOC.level=TOC.level),sep="") }) #########################################################################/** # @RdocMethod addText # # @title "Insert text into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{bold}{Bold text. \bold{optional}.} # \item{italic}{Italic text. \bold{optional}.} # \item{...}{Any number of character strings to concatenate.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addText", "RTF", function(this, ..., bold=FALSE, italic=FALSE) { text<-paste(... , sep="") if(bold) { text<-paste("\\b ",text,"\\b0",sep="") } if(italic){ text<-paste("\\i ",text,"\\i0",sep="") } this$.rtf <- paste(this$.rtf,.add.text(text),sep="") }) #########################################################################/** # @RdocMethod addParagraph # # @title "Insert a paragraph into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{A character @vector of text to add.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addParagraph", "RTF", function(this, ...) { text<-paste(... , sep="") if(!is.null(this$.font.size)) { font.size = this$.font.size # default } this$.rtf <- paste(this$.rtf,.start.paragraph(indent=this$.indent,font.size=font.size),sep="") this$.rtf <- paste(this$.rtf,.add.text(text),sep="") this$.rtf <- paste(this$.rtf,.end.paragraph(),sep="") }) #########################################################################/** # @RdocMethod startParagraph # # @title "Start a new paragraph in the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("startParagraph", "RTF", function(this, ...) { this$.rtf <- paste(this$.rtf,.start.paragraph(indent=this$.indent),sep="") }) #########################################################################/** # @RdocMethod endParagraph # # @title "End a paragraph in the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("endParagraph", "RTF", function(this, ...) { this$.rtf <- paste(this$.rtf,.end.paragraph(),sep="") }) ###########################################################################/** # @RdocMethod addPageBreak # # @title "Insert a page break into the RTF document optionally specifying new page settings" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{width}{New page width in inches. \bold{optional}.} # \item{height}{New page height in inches. \bold{optional}.} # \item{omi}{A @vector of page margins (botton, left, top, right) \bold{optional}.} # \item{...}{Not used.} # } # # \examples{ # rtf<-RTF("test_addPageBreak.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addPageBreak(rtf,width=11,height=8.5,omi=c(0.5,0.5,0.5,0.5)) # done(rtf) # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/########################################################################### setMethodS3("addPageBreak", "RTF", function(this, width=8.5,height=11,omi=c(1,1,1,1), ...) { this$.rtf <- paste(this$.rtf,.add.page.break(width=width,height=height,omi=omi),sep="") this$.page.width = width this$.page.height = height this$.content.width = width - omi[2] - omi[4] }) #########################################################################/** # @RdocMethod addNewLine # # @title "Insert a new line into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{n}{Number of lines to add. Default is 1. \bold{optional}} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addNewLine", "RTF", function(this, n=1, ...) { this$.rtf <- paste(this$.rtf,.add.newline(n=n,font.size=this$.font.size),sep="") }) #########################################################################/** # @RdocMethod increaseIndent # # @title "Increase RTF document indent" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("increaseIndent", "RTF", function(this, ...) { this$.indent <- this$.indent + 720 # 1/2" increments }) #########################################################################/** # @RdocMethod decreaseIndent # # @title "Decrease RTF document indent" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("decreaseIndent", "RTF", function(this, ...) { this$.indent <- max(0,this$.indent - 720) # 1/2" increments }) #########################################################################/** # @RdocMethod setFontSize # # @title "Set RTF document font size" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{font.size}{New default font size in points.} # \item{...}{Not used.} # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("setFontSize", "RTF", function(this, font.size, ...) { this$.font.size <- font.size }) #########################################################################/** # @RdocMethod addPlot # # @title "Insert a plot into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{plot.fun}{Plot function.} # \item{width}{Plot output width in inches.} # \item{height}{Plot output height in inches.} # \item{res}{Output resolution in dots per inch.} # \item{...}{Arguments for \code{plot.fun}.} # } # # \details{ # Plots are added to the document as PNG objects. This function will work with all # base graphics methods for plotting. For more sophisticated plots, you may need to # wrap your plot code into a function, and then pass a reference to that function to # this method. The parameters for the plot method would then get passed in as '...' # above. # # To output a ggplot2 plot, simply assign the plot to a variable. Then use 'print' # as the plot function and pass in the plot variable assigned above. # } # # \examples{ # rtf<-RTF("test_addPlot.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) # done(rtf) # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addPlot", "RTF", function(this,plot.fun=plot.fun,width=3.0,height=0.3,res=300, ...) { if(!is.null(this$.font.size)) { font.size = this$.font.size # default } tmp.file<-tempfile("temp_rtf_plot") this$.rtf <- paste(this$.rtf,.start.paragraph(indent=this$.indent,font.size=font.size),sep="") this$.rtf <- paste(this$.rtf,.rtf.plot(plot.fun=plot.fun,tmp.file=tmp.file,width=width,height=height,res=res, ...),sep="") this$.rtf <- paste(this$.rtf,.end.paragraph(),sep="") if(file.exists(tmp.file) ) { unlink(tmp.file) } }) #########################################################################/** # @RdocMethod addPng # # @title "Insert an existing PNG image into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{file}{Image file path.} # \item{width}{Plot output width in inches.} # \item{height}{Plot output height in inches.} # \item{...}{Not used.} # } # # \details{ # Add existing PNG file to RTF document. # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addPng", "RTF", function(this,file,width=3.0,height=0.3, ...) { if(!is.null(this$.font.size)) { font.size = this$.font.size # default } this$.rtf <- paste(this$.rtf,.start.paragraph(indent=this$.indent,font.size=font.size),sep="") this$.rtf <- paste(this$.rtf,.add.png(file,width=width,height=height,verbose=FALSE),sep="") this$.rtf <- paste(this$.rtf,.end.paragraph(),sep="") }) #########################################################################/** # @RdocMethod addTrellisObject # # @title "Insert a trellis plot object into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{trellis.object}{The trellis plot object.} # \item{width}{Plot output width in inches.} # \item{height}{Plot output height in inches.} # \item{res}{Output resolution in dots per inch.} # \item{rotate}{Object rotation in degrees. \bold{optional}.} # \item{...}{Not used.} # } # # \details{ # Plots are added to the document as PNG objects. Multi-page trellis objects are # automatically split across multiple pages in the RTF output file. To rotate the # object to landscape orientation within the RTF output, use rotate=90. When using # rotation, width and height still refer to the unrotated plot dimensions and not the # rotated output dimensions on the RTF page. An alternative to rotating the plot is # to rotate the entire page using a call to addPageBreak with suitable page width and # height dimensions. # } # # \examples{ # \dontrun{ # rtf<-RTF("test_addTrellisObject.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # if(require(lattice) & require(grid)) { # # multipage trellis object # p2<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) # addTrellisObject(rtf,trellis.object=p2,width=8,height=4,res=300, rotate=90) # } # done(rtf) # } # } # # @author # # \seealso{ # @seeclass # } # # @keyword -internal # #*/######################################################################### setMethodS3("addTrellisObject", "RTF", function(this,trellis.object,width=3.0,height=0.3,res=300, rotate=NULL, ...) { tmp.file<-tempfile("temp_rtf_trellis") this$.rtf <- paste(this$.rtf,.rtf.trellis.object(trellis.object=trellis.object,tmp.file=tmp.file,width=width,height=height,res=res,rotate=rotate),sep="") if(file.exists(tmp.file) ) { unlink(tmp.file) } }) #########################################################################/** # @RdocMethod addSessionInfo # # @title "Insert session information into the RTF document" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{this}{An RTF object.} # \item{locale}{Output the locale.} # \item{...}{Not used.} # } # # \details{ # Exports session information to the RTF document in a similar # } # # \examples{ # rtf<-RTF("test_addSessionInfo.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addSessionInfo(rtf) # done(rtf) # } # # @author # # \seealso{ # @seeclass, \code{\link{sessionInfo}}. # } # # @keyword -internal # #*/######################################################################### setMethodS3("addSessionInfo", "RTF", function(this, locale = TRUE, ...) { si<-sessionInfo() opkgver <- sapply(si$otherPkgs, function(x) x$Version) nspkgver <- sapply(si$loadedOnly, function(x) x$Version) startParagraph(this) addText(this,"\\s1 Session Information",bold=TRUE) endParagraph(this) startParagraph(this) addText(this,si$R.version$version.string,bold=TRUE,italic=TRUE) endParagraph(this) increaseIndent(this) startParagraph(this) addText(this,"Platform: ") addText(this,si$R.version$platform,italic=TRUE) if (locale) { addText(this,"\nLocale: ") addText(this,si$locale,italic=TRUE) } endParagraph(this) decreaseIndent(this) startParagraph(this) addText(this,"Packages",bold=TRUE,italic=TRUE) endParagraph(this) increaseIndent(this) startParagraph(this) addText(this,"Base: ") addText(this, paste(sort(si$basePkgs), collapse = ", "),italic=TRUE) if (length(opkgver)) { opkgver <- opkgver[sort(names(opkgver))] addText(this,"\nOther: ") vers<-paste("(v",opkgver,")",sep="") addText(this, paste(names(opkgver), vers, sep = " ", collapse = ", "),italic=TRUE) } if (length(nspkgver)) { nspkgver <- nspkgver[sort(names(nspkgver))] addText(this,"\nLoaded (not attached): ") vers<-paste("(v",nspkgver,")",sep="") addText(this, paste(names(nspkgver), vers, sep = " ", collapse = ", "),italic=TRUE) } endParagraph(this) decreaseIndent(this) startParagraph(this) addText(this,"Session Details",bold=TRUE,italic=TRUE) endParagraph(this) increaseIndent(this) startParagraph(this) addText(this,"Working directory: ") addText(this, getwd(),italic=TRUE) addText(this,"\nOutput file: ") addText(this, this$.file,italic=TRUE) endParagraph(this) decreaseIndent(this) }) ###################################################################################### .start.rtf<-function(width=8.5,height=11,omi=c(1,1,1,1)) { paste("{\\rtf1\\ansi\n\\deff",.add.font.table(),.add.color.table(),.add.paper.size(width=width,height=height),"\n",.add.page.margins(omi),"\n",.add.page.numbers(),"\n",sep="") } .add.font.table<-function() { fonts<-character() fonts[1]<-"{\\f1\\fswiss\\fcharset0 Helvetica;}" # default fonts[2]<-"{\\f2\\ffroman\\charset0\\fprg2 Times New Roman;}" fonts[3]<-"{\\f3\\ffswiss\\charset0\\fprg2 Arial;}" fonts[4]<-"{\\f4\\fftech\\charset0\\fprg2 Symbol;}" fonts[5]<-"{\\f4\\ffroman\\charset0\\fprg2 Cambria;}" paste("{\\fonttbl",paste(fonts,collapse="\n"),"}",sep="\n") } .add.color.table<-function() { colors<-character() colors[1]<-"{\\red0\\green0\\blue0;}" # default colors[2]<-"{\\red255\\green0\\blue0;}" colors[3]<-"{\\red0\\green255\\blue0;}" colors[4]<-"{\\red0\\green0\\blue255;}" paste("{\\colortbl",paste(colors,collapse="\n"),"}",sep="\n") } .add.page.numbers<-function() { paste("\\titlepg\\headery720\\footery720","{\\footer {\\pard\\qc\\fi0\\li0 \\f2\\fs20 \\field{\\fldinst{page}} \\par}}",sep="\n") } .add.paper.size<-function(width=8.5,height=11) { paste("\\paperw",round(width*1440,0),"\\paperh",round(height*1440,0),"\\widowctrl\\ftnbj\\fet0\\sectd",if(width>height){"\\lndscpsxn"} else {""},"\\linex0",sep="") } .add.page.margins<-function(margins=c(1,1,1,1)) { paste("\\margl",round(margins[2]*1440,0),"\\margr",round(margins[4]*1440,0),"\\margt",margins[3]*1440,"\\margb",margins[1]*1440,sep="") } .add.header<-function(title,subtitle=NULL,indent=0,font.size=10,TOC.level=NULL) { if(is.null(subtitle)) { paste("{\\pard\\fi0\\li",indent,"\\f2\\fs",font.size*2,"\\b",.get.TOC.level(TOC.level)," ",.convert(title),"\\b0\\line\\par}\n",sep="") } else { paste("{\\pard\\fi0\\li",indent,"\\f2\\fs",font.size*2,"\\b",.get.TOC.level(TOC.level)," ",.convert(title),"\\b0\\par}\n{\\pard\\fi0\\f2\\fs",font.size*2," ",.convert(subtitle),"\\line\\par}\n",sep="") } } .get.TOC.level<-function(section.level) { ret<-"" if(!is.null(section.level)) { ret<-paste("\\s",section.level,sep="") } ret } .start.paragraph<-function(indent=0,font.size=10) { paste("{\\pard\\fi0\\li",indent,"\\f2\\fs",font.size*2,"\n",sep="") } .add.text<-function(x) { paste(.convert(x),sep="") } .end.paragraph<-function() { paste("\\par}\n",sep="") } .end.rtf<-function() { paste("}",sep="") } .add.table.row<-function(col.data=c("c1","c2","c3"),col.widths=c(1.0,4.5,1.0),col.justify=NULL,font.size=10,last.row=FALSE,indent=0, border.top=FALSE, border.bottom=FALSE,space.before=NULL, space.after=NULL) { header<-paste("\\trowd\\trgaph100\\trleft",indent,sep="") # trqc for centered if(length(col.data) != length(col.widths)) { stop(paste("The number of data columns (",length(col.data),") doesn't match the column widths (",length(col.widths),")! Input data: ",col.data,sep="")) } justify<-vector() justify["L"]<-"\\ql" justify["R"]<-"\\qr" justify["C"]<-"\\qc" justify["J"]<-"\\qj" # Default: Left justify everything except numeric which are right justified justify.v<-rep(justify["L"],length(col.data)) numeric.cols<-which(!is.na(suppressWarnings(as.numeric(col.data)))) if(length(numeric.cols)>0) { justify.v[numeric.cols] <- justify["R"] } if(!is.null(col.justify)) { if(length(col.justify)==1) { if(col.justify %in% names(justify)) { justify.v<-rep(justify[col.justify],length(col.data)) } else { stop(paste("col.justify parameter not recognized: ",col.justify," (should be L, R, C, or J)",sep="")) } } else if(length(col.justify)==length(col.data)) { justify.v<-justify[col.justify] } else { stop(paste("The number of data columns (",length(col.data),") doesn't match the col.justify (",length(col.justify),") parameter! Input data: ",paste(col.data,sep="",collapse=", "),sep="")) } } # TODO: allow decimal alignment: RTF code: \tqdec\tx810 (where the tx part is the tabbed position) btop<-"" bbottom<-"" if(border.top == TRUE) btop <- "\\clbrdrt\\brdrs\\brdrw15" if(last.row==TRUE | border.bottom==TRUE) bbottom <- "\\clbrdrb\\brdrs\\brdrw15" # Top vertical alignment for rows (clvertalt) cols.prefix<-paste("\\clvertalt\\clshdrawnil\\clwWidth",round(col.widths*1440,0),"\\clftsWidth3\\clheight260\\clpadl100\\clpadr100\\gaph",btop,bbottom ,"\\cellx",c(1:length(col.widths)),"\n",sep="",collapse="") cols<-paste("\\pard",justify.v, .get.space.before.after(space.before, space.after),"\\widctlpar\\intbl\\fi0\\f2\\fs",font.size*2," ", .convert(col.data),"\\cell\n",sep="",collapse="") end.row<-"\\widctlpar\\intbl\\row\n" paste(header,cols.prefix,cols,end.row,sep="") } .get.space.before.after<-function(space.before=NULL,space.after=NULL) { ret<-"" # \sbN -- N twips of extra (vertical) space before this paragraph (default: 0) # \saN -- N twips of extra (vertical) space after this paragraph (default: 0) if(!is.null(space.before)) { ret<-paste(ret,"\\sb",(space.before*1440),sep="") } if(!is.null(space.after)) { ret<-paste(ret,"\\sa",(space.after*1440),sep="") } ret } .add.merged.table.row<-function(col.data=c("c1","c2","c3"),col.widths=c(1.0,4.5,1.0),justify="LEFT",font.size=10,last.row=FALSE,indent=0, border.top=FALSE, border.bottom=FALSE) { header<-paste("\\trowd\\trgaph100\\trleft",indent,sep="") # trqc for centered justify.q<-"\\ql" if(justify=="LEFT") justify.q<-"\\ql" if(justify=="RIGHT") justify.q<-"\\qr" if(justify=="CENTER") justify.q<-"\\qc" if(justify=="JUSTIFY") justify.q<-"\\qj" btop<-"" bbottom<-"" if(border.top == TRUE) btop <- "\\clbrdrt\\brdrs\\brdrw15" if(last.row==TRUE | border.bottom==TRUE) bbottom <- "\\clbrdrb\\brdrs\\brdrw15" merged<-c("","\\clmgf",rep("\\clmrg",length(col.data)-2)) cols.prefix<-paste("\\clvertalc \\clshdrawnil \\clwWidth",round(col.widths*1440,0),"\\clftsWidth3 \\clheight260 \\clpadl100 \\clpadr100 \\gaph",btop," ",bbottom ,merged,"\\cellx",c(1:length(col.widths)),"\n",sep="",collapse="") cols<-paste("\\pard",justify.q,"\\widctlpar\\intbl\\fi0\\f2\\fs",font.size*2," ",.convert(col.data),"\\cell\n",sep="",collapse="") end.row<-"\\widctlpar\\intbl \\row \n\n" paste(header,cols.prefix,cols,end.row,sep="") } .add.table.header.row<-function(col.data=c("c1","c2","c3"),col.widths=c(1.0,4.5,1.0),col.justify=NULL,font.size=10,repeat.header=FALSE,indent=0) { header<-paste("\\trowd\\trgaph100\\trleft",indent,sep="") # trqc for centered if(length(col.data) != length(col.widths)) { stop(paste("The number of data columns (",length(col.data),") doesn't match the column widths (",length(col.widths),")! Input data: ",col.data,sep="")) } justify<-vector() justify["L"]<-"\\ql" justify["R"]<-"\\qr" justify["C"]<-"\\qc" justify["J"]<-"\\qj" # Default: Left justify everything justify.v<-rep(justify["L"],length(col.data)) if(!is.null(col.justify)) { if(length(col.justify)==1) { if(col.justify %in% names(justify)) { justify.v<-rep(justify[col.justify],length(col.data)) } else { stop(paste("header.col.justify parameter not recognized: ",col.justify," (should be L, R, C, or J)",sep="")) } } else if(length(col.justify)==length(col.data)) { justify.v<-justify[col.justify] } else { stop(paste("The number of data columns (",length(col.data),") doesn't match the header.col.justify (",length(col.justify),") parameter! Input data: ",paste(col.data,sep="",collapse=", "),sep="")) } } if(repeat.header==TRUE) header<-paste(header,"\\trhdr") # Bottom vertical alignment for headers (clvertalb) cols.prefix<-paste("\\clvertalb\\clshdrawnil\\clwWidth",round(col.widths*1440,0),"\\clftsWidth3\\clheight260\\clpadl100\\clpadr100\\gaph\\clbrdrt\\brdrs\\brdrw15\\clbrdrb\\brdrs\\brdrw15\\cellx",c(1:length(col.widths)),"\n",sep="",collapse="") cols<-paste("\\pard",justify.v,"\\widctlpar\\intbl\\fi0\\f2\\fs",font.size*2,"\\b ",.convert(col.data),"\\b0\\cell\n",sep="",collapse="") end.row<-"\\widctlpar\\intbl\\row\n\n" paste(header,cols.prefix,cols,end.row,sep="") } .add.table<-function(dat,col.widths=NULL,col.justify=NULL,header.col.justify=NULL,font.size=10,row.names=FALSE,indent=0,NA.string="-",max.table.width=NULL, space.before=NULL, space.after=NULL) { ret<-"{\\pard\n" if("table" %in% class(dat)) { if(length(dim(dat))==1) { varnames<-names(dimnames(dat))[1] nc<-2 nr<-length(dimnames(dat)[[1]]) if(is.null(col.widths)){ col.widths<-rep(6.5/nc,nc)} ret<-paste(ret,.add.table.header.row(c(names(dimnames(dat))[1]," "),col.widths,header.col.justify,font.size=font.size,repeat.header=TRUE,indent=indent),sep="") if(nrow(dat)>1) { for(i in 1:(nrow(dat)-1) ) { rn<-rownames(dat)[i] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[i])),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") } } rn<-rownames(dat)[nrow(dat)] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[nrow(dat)])),col.widths,col.justify,font.size=font.size,indent=indent,border.bottom=TRUE, space.before=space.before, space.after=space.after),sep="") } else if(length(dim(dat))==2) { varnames<-names(dimnames(dat)) nc<-ncol(dat)+1 nr<-nrow(dat) if(is.null(col.widths)){ col.widths<-rep(6.5/nc,nc)} # ret<-paste(ret,.add.table.header.row(c(" ",colnames(dat)),col.widths,font.size=font.size,repeat.header=TRUE,indent=indent),sep="") ret<-paste(ret,.add.merged.table.row(c(" ",paste("\\b ",varnames[2]," \\b0",sep=""),rep(" ",nc-2)),col.widths,font.size=font.size,indent=indent,border.top=TRUE),sep="") ret<-paste(ret,.add.table.row(c(paste("\\b ",varnames[1]," \\b0",sep=""),colnames(dat)),col.widths,col.justify,font.size=font.size,indent=indent,border.bottom=TRUE),sep="") if(nrow(dat)>1) { for(i in 1:(nrow(dat)-1) ) { rn<-rownames(dat)[i] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[i,])),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") } } rn<-rownames(dat)[nrow(dat)] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[nrow(dat),])),col.widths,col.justify,font.size=font.size,indent=indent,border.bottom=TRUE, space.before=space.before, space.after=space.after),sep="") } else { stop("Table dimensions can't be written") } } else if("xtab" %in% class(dat)) { nc<-ncol(dat$counts)+2 nr<-nrow(dat$counts) if(is.null(col.widths)){ col.widths<-rep(6.5/nc,nc)} # ret<-paste(ret,.add.table.header.row(c(" ",colnames(dat)),col.widths,font.size=font.size,repeat.header=TRUE,indent=indent),sep="") ret<-paste(ret,.add.merged.table.row(c(" ",paste("\\b ",dat$varnames[2]," \\b0",sep=""),rep(" ",nc-2)),col.widths,font.size=font.size,indent=indent,border.top=TRUE),sep="") ret<-paste(ret,.add.table.row(c(paste("\\b ",dat$varnames[1]," \\b0",sep=""),colnames(dat$counts),"Total"),col.widths,col.justify,font.size=font.size,indent=indent,border.bottom=TRUE),sep="") grand.total<-sum(dat$col.margin) if(nrow(dat$counts)>1) { for(i in 1:(nrow(dat$counts)) ) { rn<-rownames(dat$counts)[i] ret<-paste(ret,.add.table.row(c(rn,as.character(dat$counts[i,]),paste( dat$row.margin[i]," (",sprintf("%0.1f",dat$row.margin[i]/grand.total*100),"%)" ,sep="")),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") ret<-paste(ret,.add.table.row(c(" ",paste("(",sprintf("%0.1f",dat$counts[i,]/dat$row.margin[i]*100),"% R)",sep="")," "),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") ret<-paste(ret,.add.table.row(c(" ",paste("(",sprintf("%0.1f",dat$counts[i,]/dat$col.margin*100),"% C)",sep="")," "),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") ret<-paste(ret,.add.table.row(rep(" ",nc),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") } } # Total rows ret<-paste(ret,.add.table.row(c("Total",paste(as.character(dat$col.margin),paste(" (",sprintf("%0.1f",dat$col.margin/grand.total*100),"%)",sep="")),as.character(grand.total)),col.widths,font.size=font.size,last.row=TRUE,indent=indent, space.before=space.before, space.after=space.after),sep="") # handle etables (etables are just matrices with a 'start cell' defined) } else if ("matrix" %in% class(dat) & !is.null(attributes(dat)$"start cell")) { start.row<-attributes(dat)$"start cell"[1] # convert matrix to data frame dat<-as.data.frame(dat,stringsAsFactors=FALSE) dat[is.na(dat)] <- NA.string dat[dat=="NA"] <- NA.string # if no column widths are specified, then calculate optimal sizes that fit the page if(is.null(col.widths) & !is.null(max.table.width)) { col.widths <- .optimize.col.widths(dat,include.row.names=row.names,max.table.width=max.table.width,font.size=font.size) } # render the header nc<-ncol(dat) if(is.null(col.widths)){ col.widths<-rep(6.5/nc,nc)} if(nrow(dat)>1) { for(i in 1:(nrow(dat)-1)) { if(i1) { for(i in 1:(nrow(dat)-1)) { if(row.names==TRUE){ rn<-rownames(dat)[i] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[i,])),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") } else { ret<-paste(ret,.add.table.row(as.character(dat[i,]),col.widths,col.justify,font.size=font.size,indent=indent, space.before=space.before, space.after=space.after),sep="") } } } if(row.names==TRUE){ rn<-rownames(dat)[nrow(dat)] ret<-paste(ret,.add.table.row(c(rn,as.character(dat[nrow(dat),])),col.widths,col.justify,font.size=font.size,last.row=TRUE,indent=indent, space.before=space.before, space.after=space.after),sep="") } else { ret<-paste(ret,.add.table.row(as.character(dat[nrow(dat),]),col.widths,col.justify,font.size=font.size,last.row=TRUE,indent=indent, space.before=space.before, space.after=space.after),sep="") } } else { warning("No suitable RTF converter for object class!") } ret<-paste(ret,"}\n\n",sep="") ret } .add.page.break<-function(width=8.5,height=11,omi=c(1,1,1,1)) { # "\\pard {\\f1 \\sect } \\sectd \\lndscpsxn\\pgwsxn16840\\pghsxn11907\\left\\widctlpar\\fi0\\f2\\fs18 \\par" # previous: "\\pard {\\f1 \\column }\\left\\widctlpar\\fi0\\f2\\fs18 \\par" paste("\\pard{\\f1\\sect}\\sectd",.add.paper.size(width=width,height=height),.add.page.margins(omi),"\\left\\widctlpar\\fi0\\f2\\fs18",sep="") } .convert<-function(x) { # http://www.ssec.wisc.edu/~tomw/java/unicode.html #x<-gsubfn("\\u(\\d+)", .hex2dec, x, engine="R") # format UTF-8 characters from hex to dec #x<-gsub("\\u(\\d+)","\\\\u\\1\\\\3",x) # format UTF-8 characters from hex to dec x<-gsub("\\n"," \\\\line ",x) # convert new line to RTF \line #x<-gsub("\\t"," \\\\tab ",x) # convert tab to RTF \tab x<-gsub("<=","\\\\u8804\\\\3",x) # convert <= to RTF symbol x<-gsub(">=","\\\\u8805\\\\3",x) # convert >= to RTF symbol # x<-gsub(":delta:","\\\\u0916\\\\3",x) # convert :delta: to uppercase Greek delta # # x<-gsub("α","\\\\u0945\\\\3",x) # convert α to lowercase Greek alpha # x<-gsub("β","\\\\u0946\\\\3",x) # convert β to lowercase Greek beta # x<-gsub("γ","\\\\u0947\\\\3",x) # convert γ to lowercase Greek gamma # x<-gsub("δ","\\\\u0948\\\\3",x) # convert δ to lowercase Greek delta # x<-gsub("ε","\\\\u0949\\\\3",x) # convert ε to lowercase Greek epsilon # x<-gsub("θ","\\\\u0952\\\\3",x) # convert θ to lowercase Greek theta # x<-gsub("κ","\\\\u0954\\\\3",x) # convert κ to lowercase Greek kappa # x<-gsub("λ","\\\\u0955\\\\3",x) # convert λ to lowercase Greek lambda # x<-gsub("μ","\\\\u0956\\\\3",x) # convert μ to lowercase Greek lambda # # x<-gsub("Α","\\\\u0913\\\\3",x) # convert Α to uppercase Greek alpha # x<-gsub("Β","\\\\u0914\\\\3",x) # convert Β to uppercase Greek beta # x<-gsub("Γ","\\\\u0915\\\\3",x) # convert Γ to uppercase Greek gamma # x<-gsub("Δ","\\\\u0916\\\\3",x) # convert Δ to uppercase Greek delta # x<-gsub("Ε","\\\\u0917\\\\3",x) # convert Ε to uppercase Greek epsilon # x<-gsub("Θ","\\\\u0920\\\\3",x) # convert Θ to uppercase Greek theta # x<-gsub("Κ","\\\\u0922\\\\3",x) # convert Κ to lowercase Greek kappa # x<-gsub("Λ","\\\\u0923\\\\3",x) # convert Λ to lowercase Greek lambda # x<-gsub("Μ","\\\\u0924\\\\3",x) # convert Μ to lowercase Greek lambda # convert HTML characters x<-gsub(">",">",x) x<-gsub("<","<",x) # convert uppercase and lowercase Greek letters x<-gsub("Α","\\\\u0913\\\\3",x) x<-gsub("Β","\\\\u0914\\\\3",x) x<-gsub("Γ","\\\\u0915\\\\3",x) x<-gsub("Δ","\\\\u0916\\\\3",x) x<-gsub("Ε","\\\\u0917\\\\3",x) x<-gsub("Ζ","\\\\u0918\\\\3",x) x<-gsub("Η","\\\\u0919\\\\3",x) x<-gsub("Θ","\\\\u0920\\\\3",x) x<-gsub("Ι","\\\\u0921\\\\3",x) x<-gsub("Κ","\\\\u0922\\\\3",x) x<-gsub("Λ","\\\\u0923\\\\3",x) x<-gsub("Μ","\\\\u0924\\\\3",x) x<-gsub("Ν","\\\\u0925\\\\3",x) x<-gsub("Ξ","\\\\u0926\\\\3",x) x<-gsub("Ο","\\\\u0927\\\\3",x) x<-gsub("Π","\\\\u0928\\\\3",x) x<-gsub("Ρ","\\\\u0929\\\\3",x) x<-gsub("Σ","\\\\u0931\\\\3",x) x<-gsub("Τ","\\\\u0932\\\\3",x) x<-gsub("Υ","\\\\u0933\\\\3",x) x<-gsub("Φ","\\\\u0934\\\\3",x) x<-gsub("Χ","\\\\u0935\\\\3",x) x<-gsub("Ψ","\\\\u0936\\\\3",x) x<-gsub("Ω","\\\\u0937\\\\3",x) x<-gsub("α","\\\\u0945\\\\3",x) x<-gsub("β","\\\\u0946\\\\3",x) x<-gsub("γ","\\\\u0947\\\\3",x) x<-gsub("δ","\\\\u0948\\\\3",x) x<-gsub("ε","\\\\u0949\\\\3",x) x<-gsub("ζ","\\\\u0950\\\\3",x) x<-gsub("η","\\\\u0951\\\\3",x) x<-gsub("θ","\\\\u0952\\\\3",x) x<-gsub("ι","\\\\u0953\\\\3",x) x<-gsub("κ","\\\\u0954\\\\3",x) x<-gsub("λ","\\\\u0955\\\\3",x) x<-gsub("μ","\\\\u0956\\\\3",x) x<-gsub("ν","\\\\u0957\\\\3",x) x<-gsub("ξ","\\\\u0958\\\\3",x) x<-gsub("ο","\\\\u0959\\\\3",x) x<-gsub("π","\\\\u0960\\\\3",x) x<-gsub("ρ","\\\\u0961\\\\3",x) x<-gsub("ς","\\\\u0962\\\\3",x) x<-gsub("σ","\\\\u0963\\\\3",x) x<-gsub("τ","\\\\u0964\\\\3",x) x<-gsub("υ","\\\\u0965\\\\3",x) x<-gsub("φ","\\\\u0966\\\\3",x) x<-gsub("χ","\\\\u0967\\\\3",x) x<-gsub("ψ","\\\\u0968\\\\3",x) x<-gsub("ω","\\\\u0969\\\\3",x) x<-gsub("TRUE","Yes",x) x<-gsub("FALSE","No",x) x } .add.newline<-function(n=NULL, font.size=10) { # return("\\line ") ret<-paste("{\\pard\\fi0\\f2\\fs",(font.size*2),sep="") if(is.null(n)) { if(n>=2) { ret<-paste(ret,paste(rep("\\line",n),"\n",collapse="",sep=""),sep="") } } paste(ret,"\\par}",sep="") } .chunk.vector<-function(tokens,n=10) { nlines<-as.integer(length(tokens)/n)+1 ntokens.line <- n #ceiling(length(tokens) / nlines) # tokens per line token.list <- split(tokens, rep( 1:ntokens.line, each=ntokens.line, len=length(tokens))) munged<-lapply(token.list,paste,collapse="") do.call(paste,list(munged,collapse="\n")) } # width and height are in inches .add.png<-function(file,width=3,height=3,verbose=FALSE) { # return a hexadecimal version of a file max.bytes<-50000000 # maximum file size in bytes (~50MB) dat<-readBin(file, what="raw", size=1, signed=TRUE, endian="little",n=max.bytes); if(verbose) { cat(paste(length(dat),"bytes read\n")) } paste("{\\rtf1\\ansi\\deff0{\\pict\\pngblip\\picwgoal",round(width*1440),"\\pichgoal",round(height*1440)," ",paste(dat,collapse=""),"}}",sep="") # paste("{\\rtf1\\ansi\\deff0{\\pict\\pngblip\\picwgoal",round(width*1440),"\\pichgoal",round(height*1440)," \n",.chunk.vector(dat),"}}",sep="") } .rtf.plot<-function(plot.fun,tmp.file="temp.png",width=3.0,height=0.3,res=300, ...) { width.px<-round(width*res) height.px<-round(height*res) #png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "white",res=res) png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "transparent",res=res) plot.fun(...) dev.off() .add.png(tmp.file,width=width,height=height) } .rtf.trellis.object<-function(trellis.object,tmp.file="temp.png",width=3.0,height=0.3,res=300,rotate=NULL, ...) { if(class(trellis.object) != "trellis") { stop("Not a trellis object!") } ret<-"" # if(is.null(trellis.object$layout)) { # # single page # width.px<-round(width*res) # height.px<-round(height*res) # png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "white",res=res) # print(trellis.object) # dev.off() # # if(!is.null(rotate)) { # system(paste("convert -rotate ",rotate," '",tmp.file,"' '",tmp.file,"'",sep="")) # ret<-.add.png(tmp.file,width=height,height=width) # swap width and height # } else { # ret<-.add.png(tmp.file,width=width,height=height) # } # # } else { # plot.cnt<-dim(trellis.object) # per.page<-trellis.object$layout[1]*trellis.object$layout[2] # pages<-floor((plot.cnt-1)/per.page)+1 # # for(pg in 1:pages) { # plot.start<-(pg-1)*per.page+1 # plot.end<-min(plot.cnt,pg*per.page) # # width.px<-round(width*res) # height.px<-round(height*res) # png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "white",res=res) # print(trellis.object[plot.start:plot.end]) # dev.off() # # if(!is.null(rotate)) { # system(paste("convert -rotate ",rotate," '",tmp.file,"' '",tmp.file,"'",sep="")) # ret<-paste(ret,.add.png(tmp.file,width=height,height=width),sep="\n") # swap width and height # } else { # ret<-paste(ret,.add.png(tmp.file,width=width,height=height),sep="\n") # } # } # } if(is.null(trellis.object$layout)) { # single page width.px<-round(width*res) height.px<-round(height*res) if(!is.null(rotate)) { png(tmp.file,width=height.px,height=width.px,units="px",pointsize=8,bg = "transparent",res=res) #grid::grid.newpage() grid::pushViewport(grid::viewport(width=grid::unit(width,"inches"),height=grid::unit(height,"inches"),angle = rotate)) print(trellis.object, newpage = FALSE) #grid::upViewport() dev.off() ret<-.add.png(tmp.file,width=height,height=width) # swap width and height } else { png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "transparent",res=res) print(trellis.object) dev.off() ret<-.add.png(tmp.file,width=width,height=height) } } else { plot.cnt<-dim(trellis.object) per.page<-trellis.object$layout[1]*trellis.object$layout[2] pages<-floor((plot.cnt-1)/per.page)+1 for(pg in 1:pages) { plot.start<-(pg-1)*per.page+1 plot.end<-min(plot.cnt,pg*per.page) width.px<-round(width*res) height.px<-round(height*res) if(!is.null(rotate)) { png(tmp.file,width=height.px,height=width.px,units="px",pointsize=8,bg = "transparent",res=res) #grid::grid.newpage() grid::pushViewport(grid::viewport(width=grid::unit(width,"inches"),height=grid::unit(height,"inches"),angle = rotate)) print(trellis.object[plot.start:plot.end], newpage = FALSE) #grid::upViewport() dev.off() ret<-paste(ret,.add.png(tmp.file,width=height,height=width),sep="\n") # swap width and height } else { png(tmp.file,width=width.px,height=height.px,units="px",pointsize=8,bg = "transparent",res=res) print(trellis.object[plot.start:plot.end]) dev.off() ret<-paste(ret,.add.png(tmp.file,width=width,height=height),sep="\n") } } } ret } .max.col.nchar<-function(x,include.row.names=FALSE,wrap.headers=TRUE) { # for each column, returns the maximum width (in characters) of either the # largest header word or largest entire column field. This allows # headers to be longer and have word wrapping while attempting # to keep each field of table data on a single line. contents<-apply(x,2,function(x){max(nchar(x))} ) col.nchar<-c() if(wrap.headers==TRUE) { # find maximum word width in each header (split on spaces) headers<-sapply(names(x), function(x){ max(nchar(strsplit(x," ")[[1]])) } ) col.nchar<-mapply(max,contents,headers) } else { headers<-nchar(names(x)) col.nchar<-mapply(max,contents,headers) } if(include.row.names==TRUE) { row.names.nchar<-max(sapply(rownames(x),nchar)) col.nchar<-c(row.names.nchar,col.nchar) } col.nchar } # TODO this code is not so great. Can we take advantage of R's strwidth function # and plug in the font faces and size in points to estimate the width. E.g. # # strwidth("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.?,;:'\"!@#$%^&*()-=+_[]{}|\\",units="inches",family="Times",ps=12) # # where face = (1=plain, 2=bold, 3=italic, 4=bold-italic) # see also : ps.options() .optimize.col.widths<-function(x,include.row.names=FALSE,max.table.width=6.5,font.size=9,col.padding=0.1) { letter.width<-font.size * 1/144 # font point size to width (roughly 1/144 inch) letter.width<-letter.width + 0.03 # fine tuning to account for all caps columns or bold max.nchars <- .max.col.nchar(x,include.row.names,wrap.headers=TRUE) col.widths <- max.nchars*letter.width+2*col.padding # This could also be tweaked with a more formal character width analysis: # http://stephensite.net/WordPressSS/2008/02/19/how-to-calculate-the-character-width-accross-fonts-and-points/ # If table is still too wide, resize each column proportionally to the content to # fit the maximum table width allowed if(sum(col.widths) > max.table.width) { col.widths<-col.widths/sum(col.widths) * max.table.width } col.widths } .hex2dec <- function(hexadecimal) { hexdigits <- c(0:9, LETTERS[1:6]) hexadecimal <- toupper(hexadecimal) # treat upper/lower case the same decimal <- rep(0, length(hexadecimal)) for (i in 1:length(hexadecimal)) { digits <- match(strsplit(hexadecimal[i],"")[[1]], hexdigits) - 1 decimal[i] <- sum(digits * 16^((length(digits)-1):0)) } return(decimal) } # Functions for pivoting data tables # this is especially useful for pivoting data frames created with ddply. # Additional options for including gaps between repeated categories # # # tab<-cast(stats, Marker + Visit + TRT ~ stat) # split.cols<-c("Marker","Visit") # # removedups<-function(x){ x[which(as.character(x) == c(tail(as.character(x),-1),NA))+1]<-NA; x } # removedups_previous<-function(x,y){ x[ setdiff(which(as.character(x) == c(tail(as.character(x),-1),NA))+1,which(!is.na(y))) ]<-NA; x } # # tab[,split.cols[1]]<-removedups(tab[,split.cols[1]]) # for(i in 2:length(split.cols)) { # tab[,split.cols[i]]<-removedups_previous(tab[,split.cols[i]],tab[,split.cols[i-1]]) # } # # # Insert section breaks # idx<-order( c( 1:nrow(tab), which(apply(!is.na(tab[,split.cols]), 1, any))-0.5 )) # break at previous row # idx[which(idx>nrow(tab))]<-NA # tab<-tab[idx,] # colnames(tab)<-c("Marker","Visit","Trt","N","Mean Change From Baseline","Diff. Estimate (95CI)","P") rtf/R/forest.plot.R0000644000175100001440000000711512204540247013672 0ustar hornikusers#########################################################################/** # @RdocFunction rtf.forest.plot # # @title "Get an RTF encoded forest plot" # # \description{ # @get "title". # } # # @synopsis # # \arguments{ # \item{x}{x (e.g. hazard ratio).} # \item{min}{Minimum whisker (e.g. lower bound of 95\% hazard ratio CI).} # \item{max}{Maximum whisker (e.g. upper bound of 95\% hazard ratio CI).} # \item{xlim}{A @vector specifying the x limits.} # \item{width}{Plot width in inches.} # \item{height}{Plot height in inches.} # \item{cex}{A numerical value giving the amount by which plotting text and symbols should be magnified relative to the default.} # \item{lwd}{Line width.} # \item{res}{Output resolution in dots per inch.} # } # # \details{ # Create a forest plot and convert PNG to RTF code. This is useful for # embedding into a data frame of hazard ratios and then writing an # RTF output file. See the example below for usage. # } # # \examples{ # \dontrun{ # tab<-data.frame( # Label=c("Test1","Test2","Test3"), # HR=c(1,2,0.45), # Lower.CI=c(0.5,1.1,0.25), # Upper.CI=c(2,3.5,0.9), # stringsAsFactors=FALSE, # check.names=FALSE) # # # create forest plots by row # forest.plot.args<-list(xlim=c(0.1,5),width=3.0,height=0.3,cex=1,lwd=0.75,res=300) # tab$"HR Plot (log scale)"<-mapply(rtf.forest.plot,tab$HR,tab$Lower.CI,tab$Upper.CI, # MoreArgs=forest.plot.args) # # # rbind the x-scale to the table in the plot column # xscale<-rtf.forest.plot.xscale(xlim=c(0.1,5),width=3.0,height=0.3,cex=1, # lwd=0.75,res=300) # # tab<-data.frame(lapply(tab, as.character), # stringsAsFactors=FALSE, # check.names=FALSE) # # tab<-rbind(tab,list("","","","",xscale)) # # # write the RTF output # rtf<-RTF("test_rtf.forest.plot.doc",width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # addTable(rtf,tab,col.widths=c(0.75,0.75,0.75,0.75,3)) # done(rtf) # } # } #*/######################################################################### rtf.forest.plot<-function(x=1.25,min=0.5,max=2,xlim=c(0.1,12), width=3.0,height=0.3,cex=1,lwd=0.75,res=300) { tmp.file<-tempfile("temp_forest_plot") ret<-.rtf.plot(.forest.plot,tmp.file=tmp.file,width=width,height=height,res=res,x=x,min=min,max=max,xlim=xlim,cex=cex,lwd=lwd) if(file.exists(tmp.file) ) { unlink(tmp.file) } ret } rtf.forest.plot.xscale<-function(xlim=c(0.1,12), width=3.0,height=0.3,cex=1,lwd=0.75,res=300) { tmp.file<-tempfile("temp_forest_xscale") ret<-.rtf.plot(.forest.plot.scale,tmp.file=tmp.file,width=width,height=height,res=res,xlim=xlim,cex=cex,lwd=lwd) if(file.exists(tmp.file) ) { unlink(tmp.file) } ret } ###################################################################################### .forest.plot<-function(x=1.25,min=0.5,max=2,xlim=c(0.1,12),cex=1,lwd=0.75) { par(oma=c(0,0,0,0),mar=c(0,0,0,0)) plot(c(1,1),type="n",axes=FALSE,xlab="",ylab="",xlim=xlim,ylim=c(1,1),log="x",xaxt="n",yaxt="n",bty="l") abline(v=1,lwd=0.5,col="black") # tick marks at '1' behind the plot glyphs if(!is.na(min)) { arrows(x,1,min,1,angle=90,lwd=lwd,length=0.05) } if(!is.na(max)) { arrows(x,1,max,1,angle=90,lwd=lwd,length=0.05) } if(!is.na(x)) { points(x,1,pch=21,bg="black",cex=cex) } } .forest.plot.scale<-function(xlim=c(0.1,12),cex=1,lwd=0.75,res=300) { par(oma=c(0,0,0,0),mar=c(0,0,0,0)) plot(c(1,1),type="n",axes=FALSE,xlab="",ylab="",xlim=xlim,ylim=c(0.95,1.05),log="x",xaxt="n",yaxt="n",bty="l") ticks<-axTicks(1) y.max=1.025 sapply(ticks,function(x,y.max){lines(x=c(x,x),y=c(1,y.max),lwd=lwd)},y.max=y.max) lines(c(ticks[1],ticks[length(ticks)]),c(y.max,y.max),lwd=lwd) text(ticks,1,ticks,pos=1,offset=0.25,xpd=NA,cex=cex) } rtf/R/999.NonDocumentedObjects.R0000755000175100001440000000241612016516717016030 0ustar hornikusers###########################################################################/** # @RdocDocumentation "Non-documented objects" # # @alias view # @alias addTable # @alias done # @alias addPageBreak # @alias startParagraph # @alias endParagraph # @alias addHeader # @alias addParagraph # @alias addText # @alias addNewLine # @alias decreaseIndent # @alias increaseIndent # @alias setFontSize # @alias addPlot # @alias addPng # @alias addTrellisObject # @alias addTOC # @alias addSessionInfo # # @alias rtf.forest.plot.xscale # # # \description{ # This page contains aliases for all "non-documented" objects that # \code{R CMD check} detects in this package. # # Almost all of them are \emph{generic} functions that have a specific # document for the corresponding method coupled to a specific class. # Other functions are re-defined by \code{setMethodS3()} to # \emph{default} methods. Neither of these two classes are non-documented # in reality. # } # # @author # # @keyword internal #*/########################################################################### ############################################################################ # HISTORY: # 2011-09-04 # o Created to please R CMD check. ############################################################################ rtf/R/000.R0000755000175100001440000000106412204536710011712 0ustar hornikusers############################################################################ # This code has to come first in a library. To do this make sure this file # is named "000.R" (zeros). ############################################################################ # Is autoload() allowed in R v2.0.0 and higher? According to the help one # should not use require(). autoload("appendVarArgs", package="R.oo") autoload("hasVarArgs", package="R.oo") autoload("setMethodS3", package="R.oo") autoload("setConstructorS3", package="R.oo") #autoload("gsubfn", package="gsubfn") rtf/MD50000644000175100001440000000363713635630274011415 0ustar hornikusers90dae651b41d0896951614ec3c9dea14 *DESCRIPTION 1b613e9cff59934637d5a40c3b7a37a1 *NAMESPACE 4bb517c9079f824be6a8ada45ffb4fa5 *NEWS c70b4f49da19d10a1caa5eea5a0b1646 *R/000.R 5b3829e46dfdaab40048f81006bc223f *R/999.NonDocumentedObjects.R e8a3d5d61e56d96501584618f59e23c0 *R/999.package.R 43df9ca89bfd981ea655b4e217c46fd9 *R/forest.plot.R 74b85c63555a533b4e8021b62bb7636c *R/rtf.R 6cb394c4a66129a110f35c289285cf5b *README.md 1d3a4e9d41a58c723f5303b17ddc9263 *build/vignette.rds 6e917732587d97373e4ad04888db419d *inst/doc/rtf.R cabe9cd967e1bb16eb2d3a06cf4402b2 *inst/doc/rtf.Rnw 45498d159b72b5f4f81eff15b86b71f2 *inst/doc/rtf.pdf 3dc27d9397bf3d389a60b73d012e527a *man/Non-documented_objects.Rd 3eeb2c495df090de5442397d703ddd41 *man/RTF.Rd bb6195f3c38920a8d13ab0d3767d8ffa *man/addHeader.RTF.Rd b263cbecb4eed4461f018f6faea8e3ec *man/addNewLine.RTF.Rd 7b4b105758c9c165f1a3e6a0be7bd86b *man/addPageBreak.RTF.Rd 617a00e0b7dd06a4c767862183bd66f8 *man/addParagraph.RTF.Rd e418b351739037a9b0b340c49852bb7b *man/addPlot.RTF.Rd 1aac57dc611a986b5d47294c8dfa6d67 *man/addPng.RTF.Rd 4915cd23f47330fa2bd95597e8142b78 *man/addSessionInfo.RTF.Rd b9d5cbd8b272d222d83fc75278b9e97d *man/addTOC.RTF.Rd 52321e6c6d2dbbc3bd18df8abed9b715 *man/addTable.RTF.Rd 6fee3cf84092ff04679757057662951c *man/addText.RTF.Rd 40a69565ff7504e8b0361b27cf7ec903 *man/addTrellisObject.RTF.Rd a17f83c1f2442559a40ff02b804b5346 *man/decreaseIndent.RTF.Rd ad492798a2c2cbad46781e52d6dcee5a *man/done.RTF.Rd 1db9200e377bc4973ac3dfe73c9bfeda *man/endParagraph.RTF.Rd b71c5f88c5bd2130adf6681e5ddadd60 *man/increaseIndent.RTF.Rd 465ff3fe0b9f807f932da69470458287 *man/rtf-package.Rd 97c50b2fa4a3c9a3adff35d52f6f1f8d *man/rtf.forest.plot.Rd d82b3c397c339f67c982b430523de204 *man/setFontSize.RTF.Rd 215f129af18f2b3cf6900dcd472ef046 *man/startParagraph.RTF.Rd dcb400c9b1de65af049cf18dd74dbe74 *man/view.RTF.Rd 7ac9ca73262f0f9ce21ea394fe19efa9 *tests/tests.R cabe9cd967e1bb16eb2d3a06cf4402b2 *vignettes/rtf.Rnw rtf/inst/0000755000175100001440000000000013472642526012053 5ustar hornikusersrtf/inst/doc/0000755000175100001440000000000013472642526012620 5ustar hornikusersrtf/inst/doc/rtf.pdf0000644000175100001440000051710713635625176014124 0ustar hornikusers%PDF-1.5 % 76 0 obj << /Length 642 >> stream concordance:rtf.tex:rtf.Rnw:1 35 1 1 2 4 0 1 2 3 1 1 2 1 0 1 2 1 0 1 4 5 0 1 2 8 1 1 3 5 0 1 2 2 1 1 2 4 0 1 2 3 1 1 2 1 0 4 1 3 0 1 2 4 1 1 2 4 0 1 2 8 1 1 2 4 0 1 2 2 1 1 2 4 0 1 2 3 1 1 2 4 0 1 2 17 1 1 2 4 0 1 2 1 1 1 2 4 0 1 2 16 1 1 2 1 0 1 1 3 0 1 2 1 3 15 0 2 2 4 0 1 2 3 1 1 2 1 0 1 1 3 0 2 2 12 0 1 2 1 1 1 3 5 0 1 2 7 1 1 2 4 0 1 2 4 1 1 2 5 0 1 2 2 1 1 2 4 0 1 2 2 1 1 6 5 0 1 2 4 0 1 2 2 1 1 2 4 0 1 2 5 1 1 2 1 0 2 1 4 0 1 2 2 1 1 2 4 0 1 2 3 1 1 2 1 0 1 1 4 0 2 2 4 0 1 2 1 1 1 2 1 0 1 1 5 0 1 3 1 2 4 0 1 2 5 1 1 3 2 0 2 1 4 0 1 2 5 1 1 2 4 0 1 2 4 1 1 2 4 0 1 2 4 1 1 2 1 0 1 1 1 2 2 1 3 0 1 2 4 1 1 2 1 0 1 2 1 1 3 0 1 2 3 1 endstream endobj 96 0 obj << /Length 1149 /Filter /FlateDecode >> stream xXKoFWHf$ AKeS= yIt6Fw3Γ//|RY|6gVCE[+C6_NLߦk'&d O;/25&(SfǜwFJtNl Ip4[_U8 uP^ $QvɻE d!T *&xkI!8!N 5s|}@HOs Cmϊ13^9Y(SZe {4_m7xb+߯UkfRu0aE}a2؀z$.sU^"&V58%vBHI%f0Ut=Tdo"g( @dْm=ej6< w Lg0 7 i _> stream xڝYF=m^8GDjJ=REUSU؄$511*9g/QXDE<.aLQ804-LDgI0w09o߶3.ƚ?9~e:x;5@,vl#o bXec" Y0 p<1iLBx3k(Mb`j_ +-V`  mZADBP0&NNK^tt [1@% @  nHeSIt]<ʼnTC2 %iy$IfQIEQ;^(W_\QpE|AplD@fժLJr;6) M0Ww #|"-y)b NB0k3nbf &YVpz!?b>87aBy95ʬiEII0}I=Z)^ Hd_8)¸fFCd I}qgh(_]eNpNx0 v}8爹°$CD$g#yᬎ>tjbᒊ+7xy"Uu#7!Tkg^33 KCj{ymS]p<"b&}ǖf{h`:.WLidZyy_.g(Q5*e86*RؐsQ}5+ ~QDe|Kbee+8I/0t)]. ~-uᔳ w/ cTWf:!)o.)ιy&"kWi$9>QEs㟧G iUv^A_nUaR ]c D$,!4Ydɯ^\RM*H %cPiMZPe%_$yFb& aju|'O^y1㋸IAk&SE g8~fVqC \l_*`&M%+p^B6P˺]*wZw>D6fT8UhIE1C5>LA1>Ga羝WJ&:vH\7\S4g㬢a"-rdv@5hб<ͼ6Ny@NԘ\MǦ4^STSv嶃U}pJ%B\xozUC<1L0x$oOoY̖뫮W[% endstream endobj 116 0 obj << /Length 1811 /Filter /FlateDecode >> stream xڽnFr(h IբNP8iʇ遦iI$$yr)Sv 9,ٙy_͟, ",,TjX^~9XyI0Jt]8%a:Wnx+:w, ](ks5;>W0:ԏn֭=UBr$'  xpGΈo#~`8@:R=X us$}%k!p%3[9uuhCHDA[UؔwOk4wq#kvNϓtEA$1:;Ћ 2V{toO|w*$"B'n@4a$ղ"JwΟAIiybk0DP|-6v$L2F|.־{f"\/^B iȊEVyg(,4u0Y "!r5!OАV@>'U! '"D=/^ldW&y\=RӶެ>sMoϋ*+FoG3zaapkqƂʃ\eF&߿-bо0ED#1Nel$uPD@tvN%y5q$EZJR*^!ݏ+ ܱZyԧS~4yj y͓5ylLΜATe'Z(GPe- C"#p=:X3N ׼f^Kí_T ~Li"8 }b|s% Fǫ/L­ǫ?1%<~%n?/[;ƈΦݒpWá#5ap$^iZ0x|J[™NR[i5"~$(2[]-命G2nWɼ[iNEHXQ~'fԾWη ,! '_TqF}ׁFe J': jV*ቊ(Ѷ&J\tӥI6R.U0!숶*{ ~^`{F jƔ|Z+#?,Yc#o nBE') W pWp9wdP@+^f|N:>+#J 9<C(]tϣMσs~@\8SɶM ܷUQxo =`1tLj~Z-xEzбqw[ϧtޖg';/ [|4;tYNXIPL^6OHu}lJ[oR7+Tؤ#Sdܻ!NٍKvsgIT(ʃ~e5 #Et% 霂熛:3"2]ΉwJ+$1!F"=TK|l7hCa a*7~;*_lLDXf7UcX5}TmR%8؏ȇ썌C> stream xY[۸~ϯ/20fDQע٢[t M41bKSKٴs([N,>hF"y}xmYk,Kw6.™8w#gV6WkqUFoWk~Nv?~dTqeU|Nb3zW@URbpѱ^O<s%;ò? l 2>#+_p{ ;;XpiGdm죞FOL2 #<~3MdYY35aD2:"t[ ɀxA,`0u&[Kb">>Ri?AJ$٤wp* ${u=лXBҧ?!@ThM!4,\Uc4d Il}.eoĚ4qph:,,8N׿al? ƩC#Bg4aoV,q^|":],9C2_ZpP޳IIV )ɻDG# (QTW'ҬT!!Ag!Nd&ʁn&9$ñV$#U0ӗ4.}(L5yD?PDLsp J5U,&nꎙnj4#'֤HbHNus4REsYk8 Bl(ey'ywj\']jdƩ mEtj{o% pNif07q5up$8us7N% -a@gJ r 첾?9îvbh?0m1` $5Keˣ\NN 0(X6/1Tm9* x{^A tL3%H6u"C ,SUBN-׷A7n*>4MlzKj `C=I,n: bn&2&m;Y;$XE]?8XZnޱMK$%%UebįT?|q)f*\iR|̢?ej`1^v`~C K-seHqQ"cQL |(gV\.=h. :",@R>. ^XWPp㤺G)sYk:TޗR*Qo' ) MvL*^?^[κ"Ӆ?g 0ɤ>`C>jxuz)FejЦb);.._*bXEw#᷸-|rF6_} ;0c[KG13,.ML7,F.z8R`M|%cXqJ$X=LjėXYz۴ iBH)_-UVw(El5^A8tD@p61-ftR}5Ot,= R'.wwZN0T'Ux f^!̼SCzY:a.dUD/I#M> 6l(MsDg^{to f ޒÞ=chMdn)PŞg2o(3Y8 )ܬz8YOp#Ķ xI-{6$|zWd-=7*3ITT,}c ^}?+ endstream endobj 125 0 obj << /Length 2333 /Filter /FlateDecode >> stream xڭYm~0 B;\.РA^-NjN/u|Q ZM/FH4a=_)H/G%JsBTWYQi1ϟ'I߽ =,Tw?Àc|kKxnE^5o]yRe`h;Q&6d 6tpm^GB\brdu0U9e4+\xќ&. &{B(,-|chϳBC&ʂ6!a) L 5y;ϔ0ۍl~&ʼnJ7+JhmdIoݍG)G_j~4֫z_(#Zxz0"~ K#V?; t8J-ֻP+ߏ.䩟vWD}I[3P_1dgܬyoa_Y7^Jb?BLAUzĪsW`\Zt9Z֍2e% CI [E+LdQ<ox^XO?iщ^ ;.HKGӀnA5baD2 Ik8,!CFx(u[!\,N "a+6 9c;Mf5%UչSU._\sc%be$rr执Ŗ&g KsSȽ)&ք=P7>/ b1u㇎sp{mn1u{<"m} L`ۿ`p%ʍd+g@B(cgvtV~=Pb_.F[D.AfEFI7^˞kb!p6&=|$DdKb] գ%X)U盖A0$*gbSG~!9_h^CزꉳJ11Mk$ k4UU(47}08Er#/xӲw@[z%")$pkO\4NNOGz(DpXq_8a*SbC~ 2 ѧ#m(r)BI9[k6:azpvT .C'IԾй@gڈiTgJ"1- t:mL#4;q~*PHDTǀν1`;L4^ l4 ,$ =ZNu3ɾ(I%Vt7Ө5ǩw1KYJ> XceoKwSDI,cd8c|0Kk -r0lݼD±C3rXUw r`W* JЖs q\bY"V&\<ޜN+{9|gpyub_ËqUS'A{ZD_u'>;lu/҃ޜ!ӠT/]E  ӕ{xF<UV.BU ܛW4sA&NHtBRգDKɇTB"7`i Nx1x+dŨ=wлԭNG7"c j&%ȸcVsPr]`~H ]/@_dEѓ该~!#W("h|6m}ŝ/nMnLU.\qbrTC?rBRUU?ez endstream endobj 131 0 obj << /Length 666 /Filter /FlateDecode >> stream xڵUKo@WXֻHT'r+=PwfvfǸ(z^;;oW }2yKw6sT0q^{ Vk}mK]]IQ[8 'M: EGr;"Z:bɞaJo3)x(VU$rZB1U3 5pW ؂&:]SYT-V%}{Q}w<; P[ 8lL( tLLElK8OޱN1!ض$^7nź{MNg>5PtAKlq##j-Ybĺ92D㣟E]a̼eQsEKBܫ{;٠nm-P-X6|G|WR2Xueͺ%,#Y>!$*7Clj/mMMm&F@I#Ma`Hp_^G}4fM߶01es7p50@Kmد> KxڑгTcO{;c-ْ=䗕ji~i3+݄ۨ?WsWcU|]i10&%!e@a-W'<.UXyEUlq P>U(knPv\ I?_#Z endstream endobj 127 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-019.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 133 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 134 0 R/F2 135 0 R>> /ExtGState << >>/ColorSpace << /sRGB 136 0 R >>>> /Length 1190 /Filter /FlateDecode >> stream xZKO$G #HIm]v#!%aM"-bWqM!6Y0]~|' ݭ_.ݽ݇*'3_޻WK!fr}sB~n8~]w;=^\;#r쩺Wwvw><,Kq |`G| w1ZāPaR|c@d_q#ްx>w[=A>Gynx$2)fliVXB;yͱ TB4ZǒNtpM`jHYX~|L!ކT15t*jF)asv:cдA=?75hj{+fq4ފOA2@~'f3"lQsNL; 2"x^$Pf<S ϩ}h5Hj9{lPQҥE|!CIGTǺ{S n[а $aϯ Z#U*a'NYh4h0~漵тUlG8mNF\ .HULmm-0zMZw4p*"H&:cke>.-Octc5vJQWXElc x%c asՃH֩8k^]>ڤg7.#p szGN[$zvlpn.D3g_8ג2H.# V{V&enagƆuֻ 㭑A+9{KwoDVzWǢGJlw{R2cF>2V;x 7$7>-Wr/yOIn|Tެ?cӯ䎿?7ѹ_qo;ؑW|t>Ku|m/<7#i6il}&}n> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 142 0 obj << /Length 1007 /Filter /FlateDecode >> stream xڝVɎ6)d`7vPomYZr-}-H:[J/]Z[u%eo e#?7ƃUNַ6NUHmg_9,3u4eޤa -{"jr-S@s=3doQZtY|8ܩeVuWVAȴUs"ΖOi{[͋x| (I]5!,1=$>ϕ7x8=zG:#&)aDqF*0%vϝG[LaRrXs[b6JY'~yQ`pQrr_a_/6x:߄ iX~@ H1;Нsxo$ A]uG|GBᏅp}K B_3>IT}SvћrQHu(: /|lx7ޏw39)ls⏓h)x*3DO1 endstream endobj 128 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-021.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 145 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 146 0 R/F2 147 0 R>> /ExtGState << >>/ColorSpace << /sRGB 148 0 R >>>> /Length 1233 /Filter /FlateDecode >> stream xZMo7 F Z=>- `п_jٙ gX-sGR;]=\(ebe}ݽΓm_o>*s J~wa߽)_e$P(u..^ݏ慎Nѻ# @-9Oa~X  0΍@ꅩG 8=eJ;^3B tq`S:R'Rpxz#jC*Y\PЩuT]AFdGFGTCTaUtZէF.:vuAk.fOBH(lP4anl ~~>OGͶukuFZ"PDJV2N<(pT"~XÆx~vE:'u1s| 2ΥRI1 Tȑ*MJ l k"9D>kbYXQz㗽 4d7o>Yro-'َ$ }V(|Uס$?g c^ȔK‚h5 ], h1V 4eyUeY!as U |Gh= Y{lIa qK6F@VS⮳aD* _:\lC[W>Z-G7"(䵱B/4QiDnkm@7gLnN82EhYD0tKV e5>lc:ՅVia=ڞje@g|p7/s$ \,b]n5(UΡRG.7⩷U>O_%v(%W\E#8^U,b]n=Q+|.W@| G.Wngov=zwR:^z|cS_Sna{(7[fkVZ,mDׄ|le!qB,2v?\~Xrý!ͫ1Vo/>?]w!Ϸ?pwyWg[D˾/O|o>X$ӕE7)r:,^7\a; endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 778 /Length 2040 /Filter /FlateDecode >> stream xYRH}WcuNAC\:h:vv,m=)CyOaGa)+ɬB13yfK,8$)|kҒëȔL+hL{#^$f'FfqLfDf5 KƉ9361g "[Rd.0o h'^ ac8= ÞhE. EkЈoaJBi+'!rz ,R^zflZ-axWi):A1aTh # YX D~4' 18IpVJQt=zf9Y 3+{o' Y)‚J8 1@ ?h "x$Ra0:G abB&5tgxC Byv>\b5#DSH<9LUWyML`,@,dk#S(}2r'&>g5G][]YW\o;.g{ ff)3HwWr2g[ȯe?Uю|ʼ,CS_udyW4cJcn1뮋E֕y6guXγbdCL ͺfEWpβWiZ>.gfNˬ-yݍɯ5'vSVn ";"7ڲQ+p^uEս0#3~^v7!z4$)ewAqMG쓉_!@p"N^6y'nxc1-;xB(h0QF sJ&z?~r0a0`a0 Z%ZҠ% ZҠ% ZҠbffj">-/7旉x_7Ӣ {q"U;v%.'5̣t*ur;`/7EaBgrG0ccфa]#" 04JnpqY8˯x<KbwEA:0p:еXv"Dp UnPqĥXD j+DkD͝7}t͹al 5 {q75]H`s{{k$8JF˩Ϳ}|h3 BX|]6X,"wh brPvڴ-\- i9Hjgsn`HW3/Fmx{*.ъsHxT_9hũKFHW2h~RuQ&teQ"V%AZӎ.u%tҬ~P-urXǦ?1d>-_TJe:qg?'`^D4Aq -61FQAtFJ-׶dlbsO?HtEgjV+~O }]w7B[f&Nu[seW-g{kے tcRuӸD+8* Mk1h% i'r)Dyh{UP-ʼy@4mيi}[l*Eg?Dm8?4h94: q$Ln4~z=6踠A3J~P_{,y1 h 4>Λ'>*^ˡQ9L)2+ػoDi4jFكzY}h2oU#5]ECoM_k֪޺uD )[;>krkvsuTVˬkX.'*Pbʹ89<$)23?j?^WW'ߜ3Ģt*b^\"ö-Ŭ~+D/Be/WNt|ZE$T˦ dygi%ڲ rZ\k0g,kyD=3dyFn6/?_2 ,uK1or1> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 155 0 obj << /Length 1101 /Filter /FlateDecode >> stream xڵWɎF+( ao\؀d`>GCș#ߞڸMI(V/UҒ"@Gi`D4ϕJ NDZҢ#76Y ~i6oͭGeQ.ƩƁV`?:a4 k)kW {xpCSgA"$vQ7h\$,"5G+]1XMiQBTO7q<=ɼJ طL4 9A)^/ƌ&>VOuoD/GC/\5%ȱU"na!;O17fshP"Li8E|ed ejf3/c<\abץfʌDVJמEd4V@R`cHq][> (g0e,Bo~iW1dVuyCA!*C3"Sg\M0z2>G>Ol1iΔ鸿D;#Pk2Pnk3JRs~6Fd{vIw>cxHW%a |DYL=HNW[%mjIY i)X*U pOy$ѲiU+9z}QEwDK3d}1F:d=s=[x"yz|J1]ĒtXC)@ye:zhlNLwrz⤤RX(^#ɹjyrƟ$WP_F)U\K8V&2>pk|!wL'zͯߧZUg2b{/^ Nrሙr_OНx`iUn)䇶(h|VdbvJt.fu#GXeTH렉v'&2VN~Xč/ Zuf۰ *OGOT-7crm,:rp mߛ4'" 1,n%'ɵBKIZkW~=XgYRh,x%I݉˨YT*S0J}1O „>ӕs͎&ұEHq|7 endstream endobj 139 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-023.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 157 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 158 0 R>> /ExtGState << >>/ColorSpace << /sRGB 159 0 R >>>> /Length 1863 /Filter /FlateDecode >> stream xZKo6W>c-zi;"V7)>o1`?{wo|*0c'r'7˞9ɝm{ɡʣfho 04֢'osi_޳hiA =70(F0-7.ɛA/a#&c0e[mX.llV\:0kCwu"P|1&莳&첳60sY2qA8##ߘRs̕(p U*Lpo{Ma4-2_Mh<\S\5xܟt0ecf$W/?>?3itz=`yCo2@p*1DF3Ȑ~,p$^f<nŰ͌/~zDŽ!c8A7x"cVK)T؁%؇A_JHXtXbv$nJ>DOZ6{nn'ř|#0,B96(dN,px4 ܙa+'<s8W  "˺P>PS Q޸Q>&أt# 7E#$FXEc.$5Wnmڔ=؝y$OG"Y~!آ6ӖӪ ȶ7bA1XS*g栂ZMJ. ,ՌJYPkPZhXO{MR_8y&Z}=/~7$ŭU endstream endobj 161 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 165 0 obj << /Length 405 /Filter /FlateDecode >> stream xuS]O0}W%QJa$?ySܔ}8۽-B5~]>r(f|ysX,5j#*t/6}T>,u(:,dY4}=^)vpC^焊Ka8'cߕ6F-!@M/#/|q>J}Ji^ Ck:[<' hMaJ`_ue^rfm[V{McAc2MJh 30m\0&t0ֵьDgGn͍7MmV/+_ v"tf+ZnyC7ҡ,~C[{\WǭM%tmUr8G;8֯HĂ2Fq\  endstream endobj 152 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-025.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 167 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 168 0 R/F2 169 0 R>> /ExtGState << >>/ColorSpace << /sRGB 170 0 R >>>> /Length 25163 /Filter /FlateDecode >> stream xĽK%Ir%_- 儿͗ u P4DWS& rǸy/Q?v|?}OWoѽC?Pеl[~K/Be}u5Ur// ]ח:_ ߮u¼=?Rh_jg7st/{.י"ŏK_QI$>֗JJ?z_o ߮e]'|]\ˊ3j~LJKh;^\e| fy8?LF6_8â~#y/LeSM.{wӭ|>S=\uiZRg/S^K{~ؓw3G{@՚&r|z>-$׃YA,#&Ż=jyKOzlNGVO]V.9S?!b{G3[>%#./T6&j|uhh g8P^ h hgg{D9V.Enځ*Q@oAtNG&ё@7aUܨ 7IDojegU46P}ej U-ߞGDos ]w0FFl. 0QfulUE4Co=̉}Dg|Ft~A Ã\%Qӝс7|-]/m$/jh ް €οTz*t{QϭA=ЬDONt$ Gyq~tAՕ3d{gLΩ㠩;L69o4Rg=%%xg3hW8#Qh°Hސ3|ܵ&<0G[ʠA=0<:6~фQ]+h wX$ygI2S M"xǩ<1KㄲֲZCxQ+//X4aצbﴽ, M{)aS05aoh晳 ;n$6K]Є'Ԅϒ&NX|lo!LMXP N4Ej:BVÆquifN`~vחɢ_0T(X?88؁y:.ί90,$4\&~A]4w40ARz˟6 3';FԄM/酠V^0%W?aK 4&Lsj='mP6L%q&K9,Zo5[i^Z0oqW7T2K, Lvz?.'&A cpw5. JElvm$x@',AJwQ{ _L_asVE6|>tqwgn&6qIvSr]eY.(gZt<. ˸v?KveƍόniukF#̰ 巿*I~c#n-֯Jzgdb~vxߦoI6㣌"Ǐk3=ązc%&:z5uy}Nvc]O؋(G/ɥ i5 ~4׻0j3z ,\~7y|S OvU@zHI{QSa<[wO'_L2sQ{w'_÷<}P3|w?aVf' ט'=5z2oX[cP~4n}M% }x5蹕l';{ߌ?(ɒ_ф|g) W9T)B/mB$֍ [같,R&qA:Au6 l;z,6B`4!&9مNTIJ0X$乺MA%a~M  7E&l[ T"䋪٫ qs?xMiVCP 7T֍4w2–AnHI,}&q>v?e.H~gEAӏ&ߓ\H 6Xa*AJ `r@CPK<]J(CX de V%M,n ؟s N7x7 -e>hg h $й;Q8+L "D7KϜտ5+ WY(& 6- F;c Ĺk~vӹ`=ywo=XMxX?bLD!.$.ARaH*ГQ= A!/{ fd4d4|Ѥ dR`Ԯ۵ɸbWN+rܜi&y*z2Xd_nt3dhG ب ZD >ez 'j .a78\E/+z2) imܺuH8͓H8EK@T!BOFh E߼wO۝.I>ᆻ =(@a'km]*y^ ĦgNn ][0-K }"D&LNXhP'!sd~0/2Uv} $v}5gV"_ UH*|bkS?ThK,q! }Fan/M Be"T9? eG -uI\4_ xà E[m*aqoV4N~X 8ЖvlUEkB[HA7 x斻N( XKKB9O 5 ѕKsw>58g~~}^_D58Kx}ܕ{p4^) 5|bV7us?88$wj.A6EbߡcT8_8-O P.5[ R kcdCX"(B}9b#2$[pNl[^ƥAJ0a\ -j[EܧBͣe>7SN 5J#[p y$po `}tɩHt 43p[Z\C.=9/i[2`^FnM?|&ГCa 'IpNkSeC]48CSƐ[1:rNAN^N\49 Ilv;t% +qgɳ?eϖ_=zBPel]HqS 諌K8P_|(ھNvo׹y=kAMoٽnAje@HD3ϱnEQo2_ ;F.Fyu nO47 &s2ˣ~/JʈhMm46/ ڰ]iH(%HU%{/ {7353\N>(tɖXD8A3'M7Ec4IlL _U*2H8lzRP[6=  _) eo 95 +z 8X7ӴLΙp蛣 i'K -M%ќm|Ą @^2AZ*3hLHN!Un5P?˰°<|saQ4*lkKYfQU T*8-q$( |.} v82a'Y1I5%Dl [F$V$k;e]BONmY)r…t,-gz?.mu(2d}}dsO$>kzﱂ;iyȏsy# bBw6$@KӄA! ?EsC!a_PF^aE)<|]ø$͍l ˖pAjt!&uᤃTkfB-9%|2NzU 2qS=ّ,Y.aۃ@'0@7eE2?XLn/j˴ɤS_aG?JX)Ӎ,%vKe#O(ǤD Nj!(Nj iS=oH`ijϯ\|==OzSװ|Io)4Zln K>Q<[Jz[q NU'ߜ 1e?I\(ڕ05.O.n/_hf׃n?Se-EI,ޏ4#gN:Z!ǓxU`}OY {W8qeȗ^H'n쟾/OOobxlIj Ǖa/U蒭a…Wp&8~8Wez>Mg{MG<7@m?7^_u?\HA6T??8^p)N%2Nᤧ2'=4/Ll$ԽGH_&%gkc!Aa-?t6! &\IO _o r6{\6}O@7t\ڒ>ţ#3a&ɾ_osy^L8@P.9 q;nѠnf{UYY$>9ѥH zQ29E٫Eu,E4Z!D.*:Ol`ypbp0As߼AHᆮcS7L _0zS2z:֥aZVd b7$FUWGT6 NԎ ;ri"a3Pp >7>9f{֙rJ7u-UdL6RAcͳ-7&)gBr|Okq|7xioұ4NnB[%,00 ҍtp]"!\`Q8>ypPceZvp?gh0hQCDerEb0K),}w!D)[E$GԙҘ5D.75|:ioPLP€N{åCπ@ XеWm,uckAM?0,7/&jSlF7owT_3s7}dry`nEAX-js<0y*"P׍* U@l5aX]: *.4qyf<͗ ƊTW3Gߚ L87g+n1ʼ^ݜ9QS_2'L8b¾n&WcjY] Vf2Qj:U-T%j'IX0^F$Ϛ  xӿIe1gn'M%A7 0!w1>``>Vf2Ȉ)W͙{ʵLg`?zak8r {%,\pY8v¡͓-Fj t˛0[^"M-p+a:JTlZ](? nBn52 @@42ke;ZzV-ÜCx3gS.Bm B@Uq=nǕnVLnFV,f\-/]M-ke$2kۼ{_lYoyɼ[.MOfEaˊԎq`wB-eXy%?![fʖʌW\IweUlYl@ZBXZejIȡklYu i-ˬ@| ΖU`$[fivV%B0a̒U:[H0snݩ.>-ˀt:9Ftu-+4%úcK7蒛4+f؏\C~e(be(5ϲ]-+0e (ϔ]-:`We:PJ\OLy EŖj_lY,5ę%W_lF$$nM@.lYIX-2!l"Ltof–+[;RBlyRmҧPv]ٲL ~u׋OY)BزHbdPM޽Inwg˪:ve; 0k-8%g}2Ozn p*ZVl'0ْKhɖ}Zi~l)=r˺_/׽܋-[*؋-Fnɪh9ز(9Vu`2 15qٲ=mEm6ʝe+^~l8e@ fA |eY(, Oa_l|ʰϒgyU{6ݙMcrp8#qq_ACb__y*LW@E+w9 zlte3v^on}}b$d1G{ ~uᴨ^Wl~uq$XY삻^:X{ xutjo_Gv߄k,l,6~ )o41wak}m o W5?`.}۟_\յ]|̿-5~k_}fo/U3ܮY:?y[Y'PsO?FZ2_g}.ش&nLXWm5b܀.cJѾě|bJ{4s]+U<ܾ~/VU\=>}pڊeo?UIl?U͚}ޅR=R}}z}j! eۿk/+|~/V-ܜΕL\ܾJW$.W]Ӹ(yewr.$V ֯ ԇ)on,ۅki%;oWJkSl z:~uwQ:ؾKWP]Ҿ_\y zF.Ar*1ڿ^mޯf4 (hډ5,ځ]֣l?<~e pB@CyB)qP4{4bJ_wޯlZ^6۟}tt틇\3_lKba޼_| J֭NpaV5 ]ҕhĕxl۫l ^Oayl+Q'=,}[c6t$ؾk-eNars:ۿ^ծg 4hP#}{8oj U'O/xmWD=|f|}j@8 _b'㞖m}xHeyЖW1`^[} ĚOLK_.ʹkF}vOwo?]>VĪ{"Wi^8ܷp=w_HP/HL\h[%'=]Rz~ fZݻ6D'O9W`΍fQq??wס?t nl{|7 bwdVsj:e|a6n_EjWHUYyڧ~s=T3U?S]Z*y;>3}}Uܖܾr_9j|ؾQ4;qWbxV[zf=a]~Yw߯v a}+KX.Xn}\nF .)}]^w-/`~Q 9p|^sS}n9Fu}+>4|42Q._0~ptؾ7ۧmt9/nOp=ܾ;)c}ȖoA}kyrxyzr'^'Nr#n *~vWyoX7+~T ԷXiԿN(1mZ6NJ9J[VfI+R2GEzdͲӒIΞ }:G>m>ףco_*yϺD6uX>3i哶>HÖ3v>RV:X?I=:a-2~FQSd@d&4h<46AýɍI#7$ܴ@X#ۦ:h7AĽ)C7A'ν7mN!!}[xȶ0&&n¾Q +AXoCxCV(CX0κt!FXZCP؄d0{$#it/i//2 R^Tލ=dSb0Jp"hHo?Lh>'-髰$N`UFL#8k\{\)$߿&`}UKL}Y''},>^S^ QoY֋I\ _~r4+I.Z 4)w-肸z&mA p ObςԈ޵Kcm'Q$j ^#|,룼Hϕۛ8r!BvMEoIEI}]Hڮ[:u}c"5㒱$-R&ӼNݴ-"c[n\or"_6|4G9ʌ8O&f2=IJ22*K1hwHR_A<8Dž$Ļ/Ìt b}_da xXbUxwD3ڄ741 U +N׮ [^d ױ,@!E8+17EHE&=&:oI,}yۤL}xaD{11*%Hwƿ5I<~071׷JHݶHv$jb}#N_ ײG& ^ U!y-yaȃYj|af*)[ I ߯" iˇWdEY8Ho9zD+1幒u/R7#*Ì-b'IhSxPؘD&ɳjeyEPp]X$oa? [l4 ?qFA A\$S^spR"E|A{Wɤ;= OM܈q'.ƒ/ Rt*v, {m}Ykp}@LIz:'7%?/ +IN\_NfhڏU&6<1W4k|d/Dm R Y&.ĔƠk_w?/5eoڮcϠ_oVnub&Ҡ;*m<` OSVHSxS$LkY7Yԓ&VoR̪K/d}*M}䳼4/WnWcj֜ik7WK-|=ԧYL$^V0n&Meǭv7`Rm%HmfAUA ?V26?Hp6~M۴ec_/G:#?EuD}eKN;^uǝ0QweLN;^9}&WDᴉ7ӥUrR?Gf=ԣCeT~FT-=_53/Zi 9|-ՋćL%I`qQvL1#nfo3m^7ͤCP:ȮsnNZvI?3m__6Ju3lGDwUqOGgTU3"9}L͓$e {kg^"*o3;Ox g x^As}[^ _8︿%XA Jјe A{{A&oA[w( i_RE%3S!{}::3>3tZc8h__%M,6]Amoa>9j{Eix7V.?1m?=) y=Xw:*, /e q>B'pZ͇/7*|EibL`aiOJ<_`h㕎8N*%!vs'-weVIJg޻eOU]h__ /&[#l&mY^0iF1F|A؛/A>8o^b-u+?)]7?vt.ջxɟ?8+sx%L<ٟrM ]ZW^Bҙ;10^.8y!pCx1lw{JBU׼kT᪤K1i(&|Nb׽] |$;jbڵhjV|6o^H >k啋Ia?I]^E~45]/1,O,Gy 'rqR & h ܖJnRşo mC]z()|T%l _J|(ߡU;J|˟ߊ4haUtoCuK]\Яt(5qwy"šp̃܅S7lLj9h~>F'ht<kKXp)$1{2VPf/XV'8]K984/0OJ כi/AW[VM\ i,w&EJ='_/;)^8qתּ~1k+yǸ>^!߮\ [QIe!o~VS߳VTY*t{h"̥w#eY4TimoW#7ow6ʷ/n`=Zjb?S+OIܟRr%d.Y$ܟ+ibb&|L]071dχMXs͇ySYV;._fBZ_>aGE!B&C_|Զ$p=nLRVxV|C"5,TTŕ[eR9C7YJ*kު&>ykw)rj'Y_ EItc \߻)?1>d))t⥤M8eL%e.,5}9}sm]mϕouVvZK\_odW;K?x 0Yi|/.Fyw>L˚eG8?uȷsoWWڣ[N3b5?:;IM{ƳQOI`KI~~,UYIqW9:o,'I$[}ě~q tEח?!P%^I{5?t[ąWo7:cϛx_By;UO{9/sOE/󅹾tC*u8NIWRby<ߨ b[~֙$Z 3._oM_ O.a4/f[crRXǸ\f\r=?ti|lpe^I9Fq(/ 8n[PR/M\ߒ&v!:/x quÉz;I -m,avb<ߴ(i;m0~7}⺿s2k@ [?Og?o_f25=gu~CNĤ@/0~낯Lt_|]/7;*~kJ`?|o넯0vo$a] ߮J*l*k?#qF~?W7~S]G OK_Oت(z>8ָeY a5b];m'ĻۃI^_}npF72ݨs:qd[ mp_>x%&OO"A QrO'ɽ xw@LSTS))eӍb܊caJJ!V`-”* τ52O[$B))U\@hgp6.& HYrmN&Ķ Ei tN9n BĴIR& _))UlgO=SRjO,M-{tfenae 6$jdeAR20@SS))U 6KTmkY>pTc7sCWG%TS섋gD DM+lIp*aJsoM߻A1Tl5AkmkY=!otJIюX``7Xȣ9QnNm +h()J%s%E>VDS2̙O4B@HNIQFOA8$+D ;,ey6ߠ*yPR%ſwPRT6yOJJ̙ia_eɏkeVGދ♳()"d{_,)8eI+E0 zVy,)ﰤp%gmJ6зFsl 4F6Y*wVz6$TXrt{MYZS8k &_c1•kK\X2Vᔖ҉g{-S'.,s%<.~rgr?b<aɩ 7UIS^඀…$ܺ]N) ~6D/A ni`Jo H6y,{KH&(17\3|:wg(Kg޾޸fI HVZxCdγDH!u.,atLiOpMgnO6߰gHe>"!p]X6Kq8iNܸ>7 c(ouRcmEY`&쟾'CCU!=]*ѵ}ھE7c[wQ}9۾Efmmw;^_.Ib0R(XȆIPzrDIA{@Tu0 ݣ߮_zo_QN_UB䵥)Sm辙Nڸ|Egͷh=#~`οx%MdgMyAmA=XM'{ʣlsLU#i{<)-RZeG?.~I}@qC W:#/{̽^6"ۙ}m$>/tqo6%meoÒM6FA˦fX,2\n9~,laG%,zsٌ#߮lP_6<͉6,M(G~f3~98T52:7a'm@QnM6-m]ޅǻM4 dz6Zbp>OmP8+mԴEͺwb`r&/JT{`c=4˅&8|[xYc@c2^<~"}\Q ڜ9#JdE|>dsJdW%9茫.|a=sZs!SXV 1wڰwx< XG{Gv%l_61 ^8/C&ԣ;džiѺBy_OG^r|(̹sȖ+1EiQ?:PvZAǴx@8W$>ga ϋ㵅 WyO)ە$joUr̉In*9pԏ$779o܏FEttWJL2*!q'zcRbCݍ߿imZ>2koCf9]0N}z_ѿ[$W?ܝd*8p%_5SGr /E >؃3<ޓ\LL(-sHϯ!%R?9U4n_ԧ_~•zܯf/~{~s=*b#.q-h~/ f nzYxi*+09pd0S>$@6- y k8dzmwƨ)- ݦ׏l]8dz)0qC(?{z?jQ.:|?t^F LMcE+aRMg) A`?:'׫6/+FxoUX6X+S1@J*PYEVrȱ“qcFWY=Tm /(r#[߷] %Ky)1 <f|?zG x:&jVle D%Cq7%L[u٪ă#_c&=%~&fٸ2#0_( Ma|e0FC8GUQيL<ޖWqmf̅R-laa٦-KB,>-,U%q'.C???WV }orbc oXp?Rc.=eĉߗ8?,y{S6=CV_ߊp9rl?qUn+T} UsE#% Mz{%+1wqT# )w Bb ^qg0}Ol1.'Q+/H]>;q횞Us&;' tY~rr=_Mx}$vgL k#. E,, S?;߁MS?!mij%^"OЧ%3ޕ_ioOH?\ONl5I> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 176 0 obj << /Length 872 /Filter /FlateDecode >> stream xڝVn0}߯h\_b'(!J<Bi6{f馭3cIZMm3cOE'@e3=cR*>ot}/g&8,K2d0\7Q H 9 XVm`~| ց}2.N Gv`pi݂ch~MgEcOA"1pzM ˵Hb3KGavsCG2)%[?La-%"\E;O "l8pvں3t8"&9#% 3⒢d^GڄŪDk:C-[!ۢ㸋dҲFHX$EއEItTT@wwPSDHU[lG!UM_uJC%ߢo9"Eɰ)P=n`c;Ճ[K6#aw\Zp;^-.n RjKkB qVPpz7GݡkƮ{ 54,m+/;%{aIa|[k\hrBI7=n,ī*B~RvH=3>E͂KOa/8gf6c endstream endobj 162 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-027.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 178 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 179 0 R/F2 180 0 R>> /ExtGState << >>/ColorSpace << /sRGB 181 0 R >>>> /Length 1144 /Filter /FlateDecode >> stream xXAo,5 ϯȱ=$ *Tw@q(mǙ8l;o'K;k;vbP ԽkfWe0;do P #2 yTw<]ffok`id?l[]|6XS6ho3:8/gZAxީOQw?C6=zTB=[᝘-d÷FXl~g2ׄѼ QcTf: 0%iCt60)ze%hlMzGxNG))DӡC+l!> dOd壉/dtOka:g=]MVGlU9F;Ҏ|/] ƼΛW759 <1yī? ^ǜ;fnVkWkǨ IGk0R|RlNdiuп8aik[ȗąC_|>ƯQvanH NZ:}FA'EmCȦɓ'N/dML6|^jWGP6XF3gD3E"QA:g!F A:b!utEPwP& @qj)$:M;=cxΟ&ͭbNxz&[OZ{ނ|TOZfXO6~(t#|`J]%ĀBM<3Y5|!=0xE)#kȚ,ndMnjֽȚ7.dM C kFyZ*4ahh'RNg;_.k)>W YЍDUBF"*!t8s ns [U5dƴF}Ճ ۪z!/<ٜ&d2L&M,e3Ebn"t"Qf}|d[[G]NI#k^uEnϺa.DbOC̃!>=RB=se ӄF=``݃!؁d0L̃a`B M~dR)ji_{frnث endstream endobj 183 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 186 0 obj << /Length 1135 /Filter /FlateDecode >> stream xڍWKsF Wprf5Eriiiѭ́T]$%JC{|I?:ѮP>e,'$1Җ=Y'6?'n͢/TȂNDKXZ%iif:e:=·ï ~ռp  }EvAڞh2E5T0^r+>{sʸ2{t&>WU1!@Zvk嵏g{wr]oQ %NQD{&m92#X&W1Fe'(ZG )Bu\W1J8 5GIƑ%')2E2o֘.U%vx U"e"Q2OGx{ȠoG[ba+q<=iU ;t捽):;$w;[:Id΋uem7{gYf#Nd~ p AZx}15e35y?~GP5Gn2L`6kBjbuLX/+ Bj7xU2IcDdeB'AfXƛ4nXbm0RɢAJB;hwA aՀݵI[Ô/̯w#Vڜ:[Gx^TCufJNF|JotD"ɿ#Xyyp.˜}M6Om]qJ?1F!7<2!Oړ;^RIq .c.8\G0!F/F}hހ;!T+%7y*vDz}|܍n)^ ,@nQ"۵K'AͶN x2z(,l'܇!%[9 PR*Jun>MX endstream endobj 173 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpRmHun4/Rbuild3c006f72981b8c/rtf/vignettes/rtf-029.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 188 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 189 0 R/F2 190 0 R>> /ExtGState << >>/ColorSpace << /sRGB 191 0 R >>>> /Length 1180 /Filter /FlateDecode >> stream xXKo6 W5A@h3@{(Ҧ@ٶmovfzpDQ$?Q?'{+u܁6(>}ogo}uC 1UgQ|=&3(K$eWYhtFTre _?6 ]!}g}cwo3ڦӍk0Em =x0T߻)A{,`-{8dQh  vidI02T1IUR4NĴ"1EL+-bYĴmR\:JJ5PI22!CIɐQS 1^Gl`0%iEߚj׽{TIv IyvM넔Y{٫K{SnxD͌8h>Jm?*etA TUo[4<M/yB5d)TH|VԆ Ē8_Os!L+cbrA)Ue5%n{*2ӝ92 t=> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 196 0 obj << /Length 1208 /Filter /FlateDecode >> stream xWIoVW,;)PATEIH-'bUahe73~}s beH#ؖ RǞ]2 S˳upeն[Ȝ;וNv7B '7 UqD bX. 2Eģ∤OL*ԋ3".x[GMi\s OlV;G|ߧ@L+XIH޻Ub/c6H t )~3\c4?/KT3w|(jP!F 3Q;^ ^oBCI^+_`x0cx}/[D^%H;q#s}6 B qMa Œ&m98W|X5騝6P ؑ>?T@4#?~cATeɋY"7 px<䪼`gqgo9*j.nЍ06"X^s7\63B T<El] PL>^Z5L."/ /ك=_gI7QL`MA8Cp8@lם q0)E 5}P0ZP2)zi/Th:Vp<Ѫӯ' ddX*$Zz劵 xGg o$y$Sslw]^Cڌ &K*^\:[|Q_YeibJˏ?[1d- SK4dMcpύ]TcHLyG-L} #crLܤ9yzJC7c.5CCi{ly̚b \V> stream xڍP[ 5.%{Npww$e/j}ZսfDIA(irf`adɋ0Y((,m#Ph,@2s9č@Y ?vq#WKS<#@tBp4p~O?j [ ol}hbdP3:{LLnnnFNv47Kg 4U0@Oe5 KvfnF@rzp2rE{ c  W KF&&vF K9PctvwL24q{7r512~7@RD`^s2qwvbtD¼wYd*fgk 9;!OhvNd0U=:(#w9:&LW[^=pvtx[ ` 4!.>{,^}{/S;ϗIM^UV?W'*jbd0r0Xs?0JF/_mƮ, R{Z ϐ2s0]M_Q߆t[MGmdkiuq~_y5_SM?K+jgcu2Fk 2o-$-݁J&?rvTsR003bX_N 7;c9:y ;xo)01]:ONN_I0Iq1$ `cA1 nA= `Rߧ0g03AL0{2s I1x/_\nb/N_;qw6mf S/d}{efYީ8;5?? 9͝/?1t}-;_g79W/Nd}7'oG }mMLjEv&f)v4Si;\Q`hgtIA]%A}#BuRښl2ӆ450Yx$ROO&o )KޭOʽXŽwOf#uK(qHah?΢L!GyioF?{W:ujBޠMSz'b/zGX Z ꋟK꫄T '+$FdR@IE\LQ*ePE6\jE`ᅌP53)]G7Qz'ӇI)+FJԤ9m5n5lu'ep*1igޜVMpeo-:zri`|;0!ijuݎM=N{w4$T y=b{*5(mBr8fRl2#K#Osw}҄p_r6%wk+1'w3 0)\(#[μBzWsZF:(G7Ryv׈$\^Ù*E(RC}Z:HYoRL|[ 40˅;瑛RJQ~ )ה-;drlيKyЪ0/x#Yx[5S!EBuJhS镬n-Lv/mLZ~~$| 9$SJ½8YRUb>k[Z_ 7ݲ/hZOÏZO%:  u]Ri"g$v.0%yb~N`9ّ?.̸A*F11@c^ǣ.AX hsNoL[dx^PB}4\t v>@OfX8N4T))HBqXbs9CS*-WdLf_Ujw3:ygNe'$/Vd\f-STNm"D<(hl:i%]HCzyⷐ˺peIMZ5'TЅ/]cgXv XNMמbL.t@a|>۝"tp "WJ6L}S 1u:Ո"*%!bXJF_KO~3*\P\ˬnrqfg+w&PH}і7_r7?q}r'50{{t88X`H,ym~zbtgg3lLym ‡ ";>tmK=h/Bgq϶[y[Ve{`#9Z1 { 'PSo ȻK^1܄![I٨pNMgxY= cc rxBP#TXQ37?6tz-}w D˿P3[ UH`̍arRLrͷ\E=s[e)򲾬(A5;H_]:i{|5 K8?sE1[}Wsk!8gz+TLIÏB0hcV^%c$ ~B>O-.ci{usCK9y6,0^Suܤ.`2PX%HܦذIsᵫ䜶+Cc[ld:㤲Wqɬ Օz1 X,@dwnG?>"LJd=9 i+k1e&C A)QfJX) ?Φ ]o3)MC(Rm;>EOrc1\a.%6T8ݺU'xD@2l z?dXsm  Ͳfgi K, S)qy,'> kߩ㕔|qHWB0 kkpdT؟p=wGZ ߬b@,4ZThD^YKsN3:@}2]6yWJO$9hUӬ7!{dj{L=P ̾ʋa SS=A؛2+=~~YDKUh*)2hfr3QH7iGƁ{'I !۬dPAu N8VM VR%,uA2Kvt_SmEDxn\;wߵNwnʼ/c&p{r⭭Rr»^C#įiz{olN$7`O;]lKkl;"yrU JF1Bf9GF^OǾ$?zeA{?L=yS* -X ֍iDz^$)[g>}w̄(Xj51|(ՉH;OL5"ޟc[9gUV>%~ӬrYEb9GϲFDN;}gYͳ09ٽP9hS[ Rٛv 0apg {O|s7__~|ߎDqyq3 ]~{,P}˘:|%Qqt~o:x*sN %UzkDڃW72Jq|-CoK xx˱*(HLGbK0(Fl({q܂CQR=DP1ec\Q8gAS RJt=g]XH@,Q ߳  F0$L>N,P̢ҙrqCߓ;LAULYee|TyGf?xת$` ƾ6$GObX'Ŋ}:|"a [ \m]OU|OC撼#lubro_&cC*^sx(5pbJ2lcܨoQhDdU 5?PC>"4_. ,<5I.zg' r̽HUo*0Z\bbCfY;V2/{_L.[>򪜑FqN>gsn ZYk=Z0P†ݚ$ץ ׯkyFvooi"5Oڌݠ*el^\IbZ 72cEXYZr9&|>@3sѣͦ1:@(fΫ59^ }ۍH~GP>x}LY򭫣 Yiz9Cb 0Ӕҏ&*,mf';":[{Bp+_EjADtk?"D~qL$}C[ fah`/JbQ$+MrŨIʇ蓁AQ!± ?]5o;t0<t 7:?ȿ+`{-[q4m-ֆ#J 5kML 159AUjtk}C1v ř&ZKKk*¦^|*cah\cw PC|Ou#7J1Y%\FK'I#l1ϫ()l)3潌&~X0 ? WJw0 ِ=6$.Rz;y!xcհB80KѰ,drj3#7!_gwY@*|VcSqw.!%u R[gedX&REx4 v]؏b)CiĜrHsE+-_x5\1&' WNHF0baΈC;%TM=r^4kO͒=YG2a@ؤ^e V7zԏ:j@,LSr'~שH'z~)e^!ʊT i!zd`VKI ,bB޷J܇pKtlIe咉̢Az?ĄZԂn\jEA7rY55Gh)p÷MCq % I&}N#č VȯBcuTѡsFԮԤ6htݥsnj;ZoԈ;ٷ I{ D>4 WZ"%N \yfv@%+@k%'-*vy(E4Pp NCYY28UkQ- ۿͶ4a!ǭ-#"*4 N|0EUKOKu􎬨}:1U0ӵ A-5}M26ZgI ČL.#M5֐'7ޙ*_GsJ'D.+;`9"R^? *Χ/|_'ſ1p GBN;A73ᏢnJ48E$(Y#lHoYPy~pѽA͜70|yȿ+_PHqLǷs$o{ky5R,yu)m&RVItAz;PS+0,azp:g)ۺaµn$s<'& eF'ZrAeYbK4U綞zA&jw[jAd,#|jK~ VQ1kעڟK`Vŗ\8.H,+ġQ}婲ꦮ3:ށk Hz|8H<0SCvuK>y@sB3,eu\RP\ Ӕmʅq8L7qh{H`5,WҧL@VBy i]l*,ye/]0,}0я8`ˀ]VnCua%KY7J$W^E4=7—Ѝ寺x2슌,rPF!;x"d H8HbGȰcOD'>4| X>ؒB ,|"Y`i O3_BؘȲ#%rqSذ\&o5akVJ{Yf -P7TLrnT F|lj>Y8%Fݵל,ʓ)ɞjUʫi,j?F$(?<)Sg<{▮Qgȗq SX4¢dUaDSs[XbEgs8I+][{9-垰^ۜ#F<0;ꥬp\ڣ;[-"wYW(:$:1~m_td{U__շXn~}iIǀӘՔb2S ;*8Jɛ_(8IWM-^UVȻ#%מk?y] $rL`h6ov;06/g?|k)5̓YaLC.^U縰OàɜixIem1ʍM& C\w)Y*%i4\*'F'ܭWMs b(,m-ECN(2P!A w<čr]О@f)@ -̟ލx#Ss1?kѸz kO54C`°|+M^./C !VoAcȡpHD@q.\2{qP WU-t] [*pFuDKܨM-tmD0vOWTA6Pr!1aIr8%Q[$CR?|rY9](8g߫@n=.^&3;O&UzBL[ x1s~-8jQi])Mɥ~QP^P=R#C##ڡoP=-1+D˓p} μ:].犵k!߷h&mYDBt@#R (1r\`C؋$"Y߄mP /G-L}>BkPVHr)peV޼_Xؔ <_iNM}Շ[\NxH>ǠbmbךkH){HvձXua!~ xAn9t5(mMuDN ʛfhH'XQq킯aen~aW> GG{gtNgGSρꥷv^R&TlӼT\^vƬݟiePab `O*-yڸ(㕨"# +'$ /MFhI3^HQ.1# | |?U3HʿV;LLŝ&'Ld~{Au~/Hf1?5HXW!I)Gُ_f @EBy-yzu;r >nNw^G^nl.6 u鉿2v=:JQRSG!aS`4 HSo -Q_ yQ 91ԩKwNU~}<kx萨Dmޗ.?-KZIת_zڳIP\w>ٵT^tvDI;ZiIzNk \ͩ Zd?/brXt9,V'A%:&Lo07Ƽo;"&`Qcqd*o"^abNJgﻛС|xEdvFo[jQA|^4E';B| ԇ'OZ8{/2~7zx']6Wm6g'_FqR'#Әd7l 4N&L͡$t"jh7^y?L1 FPO^ X.\ێi\-d &_͌w3(8d=y~ ݧDKFctGߚO9߱Rv/^NMK$X7cv0Ίw҄QF\ɣdR Sag<ճ.PhY[f~R)"+N"q0>xnQC \T,I/:{V0f2R{X]K^OR{ #K͸m 7 Pl0'aѠ7ȱ^'=Eǁ F_; @Yƃ+$ 5 YjءO(DbD_]}yiց9Ҽ5诹 &HPp3 V*_mFUM; ˾mom)DSw$!E<*@ &ݜz)I Q@L/dI ST$C]A4ԗv [y VCܪPhDjvK~e{ .)KV32CN'`E;r"XMR3msZdhcZS6d;= m ?as ׃h /OgYR4%j% wuJKIݍ=$/Bܸ`Xq*." orԲlUx{CP N>oτR1{5OBbmW2R45od7r5Xcp[(^6]HHƍC^0R#|gSܳ:VZ>.Z(p^ٺ|]Xf:ͻ$Z>tv\6|NNAuDߘi#j[X{8>6~!rivB{i6|jѪmMwoį}|UOCk A5qͪ90wuWu/n<ݘ>RBmllK-jsz#0ZLdh,>RɿH֌cЬ,hviIywZ{);q?7:TZ#dqHE2 Eύ!MVr1W"d:q2°ոѭz "bYXnFڛ|mbNk@_dDDqHiz>Y9KNN|׍ᏵMYAԢ?'*2q .֣V7jSEˉ#%Cѱ5\MEVWV^[ĥo5~_ ƦE9_>#"R+%4n&-y!C7=%";Q}:+7$AtXz@rG^;qqfKGWb]JFX !W!_00Fy.k^IxC/":#(SM,g6#kɁȩMȿ/bkӿj˔/xe+ǥv2ΠoIs&x =-KQ=Rdw lo"H)"OTķ7}E53pl .;g<̤Fѭx"C'+ O D^ˈ˼&[=ܘeo ~<>sV\VY2@]P*e[^:zGгJX~ iyUB?ǀJD7rWUWRU@ڀg|JϿp> stream xڌP\ݺ-Ӹ{pm, N hKNy*zOƧsDYA(io SPea03123QP[-:9[e 4vy)d]m,lN^.^ff+33;čݬ Y{;3{yPXxx:Y],MmjV@tqqebrwwg4ufw[XT@'7wEc[?1Q-ٛ;+S󻇫 &#Prc,=߽0޿lljjo`lieg0$]<\vf m݌lM 1@RD`^s6urpqft]"o.Kؙ\~'n4}o'?hgno`negf3W& ;+GWMEpd@333zZ2WtK[^9 pqrzo02u-;Yytw'2c2khhStovf+3q?7տWOm>4RZ ϒ1s0a^moے$]ml6Һc`MZʸ; Yhlbj϶#}lVhh~|:W_*vf+'}~̀Zb˻ <_rrD~A&? $q 3Ib0IA&? $d{t?=]?=OzSkiAxu{.&лǻ}#ag-{Lf~0w%c^nnd  oo_&wB?7hŻ쯀[ߛ/{l9]/{yw/{1d3;[_]ek/s&?}'wtw#[bC, tS3 s8S{m-"~/O ;n;_}Xnڬwo;_]^{g:꿮,SWa~O h `ob]UߝaB`b_+{٩ :&+hN$eemW iktx[J/OpKSXE" >/>[AR9r#)?Iy-p*aՈ 2Go=C @Cv= 7vj}"pgԍZ[$ Y2֥@_qKit-DzS̬ :Fps[xmkuM?-S竫"\K6 0Lx*:`\p9Vx'| y1Tbp^#O!fF{G Y4Qchphϝ]E汽U{pܶ:WH~7Հ.gt)h^XsuQ7xd-u_2T r>KŽ_"6u*=P dQdv7k^⫩?ym.ΌN{T}akqĤ|$Y ȸz5jpiX!͜n AAw1cNIʨ60rw[60~Vuio EhNLɝWψݳXH!Yg@-!1cz ?O1Tz&O[J:%$\W'&;"RBY G9;u: =tT6$hN*ɑ~ASh?q8~ȯ?&q)kcj#/d8La\#S,xñ~laH9G? ʍ-RRX$xˎӻ)Txm&qfӖ VL|(+K2ֻu*ۍ}R?uL: 3Sk,XQ[.b >v$7ŷ?cd}:'aNηz$? >=龽ͪo_޻ 6|Ev=mdAYJ5)ZJ"qp,c8Z#Ps#0DG=!Ra{O .f:o iXE9Dpvb'ܬ5VSTefBIdq ݗd7ۦBY5HSFMT逿\,Gp>ۆ{ m$T")L4HH}"jw:6ȫ!g-WO{ Goy.90J,L MlDd黦 SR:/ඕom^1Ph6=@%Mx-QCM5U+\/hX-Xŝ풱ٌG%84#PonUjՕ~=G^W-Z\Bbl`* ؜lxқn^㘆_s1t*XhcjM`Tذ45;#fѪr;+zB-rI%$M>} ^1]'i9*O~y4fWa:q,n2V Ht6x^liw@> W? >-4od.&P ~)F&ok쵲4 &mG@I~n?zz9sW To,'jqV{{>8m3ڥcP NeU5*zI6n^|4;:7)ԇY5.ms)vPt˒Fd+vᜂ3pNg6]~}&'x11holSF-Kfl;-P g43riLJy~h-6>~ GO}Mt^nۆu^#aBns0P`'7?{?p¥X/@]IlF?({Ha@kj["Z@F'eXu-G:[ :~nʡS %.r~dA}[恩B"[=$KJΣωAdYMcՈ6|lsU-ߧ*j@*jlԣ0oQ;CK *e4z\{r#3uQVr>Qũ8APނʇVr(/c.2EUCKvN(gvk=0ߔ~(B2#ڥF420 ]Hl5":u^*'q k^#'|d]S^E,MWXSccX>h5\*֟{.'R#|m*`qeթZrPr\]lX>8>9~Zs)ڋbS"(Tf#óUȦ*P_6Ul9@^Q>4KQҩU[:5쮱{oK04$)g' $s20srG5-gDϙc2jP,6TK1]0yrm ?5WOcTD,>D46Vt0G@45C'Aaqi]gL' TɏWl(SkW2&ИOIze56 ʘISAv$^@@%v5koDH<=;vyg0rLI = SL&^"}6S3OGKwIRQ?hiklnk5[$v$3<Glw^7ӎl[>R]2t9*P G: ak*l ʆtӨc{-PN _V촽W|lڨdl^jI~U9N.Ip0>2\ I ḰoJ}Ն@cBIoSPXG[} R}^9:znK] DS^8[;-Ml8N:l1dfB v'_>2f|q eDWo[EÕUsAѠFʕP*qم)fu+vl n=.Y\܂ǒT_Rh`UJ}bOR\$hSʵ2g}G 1;3"hbu@ *)Cy=Nqyp$7CD>u2{IMJ;`2ԩo(_eL}},?ykL$kuTN\Mg|h 5r}<#\X8j0XĿ`~62G+BҭB16&S yfLu`C8zsaԾoV$t]s\-7RNMtZ`!94P3 (bsPhޯHD̅REPՎo!9_4`;o,N,ƍ\${?}@"5=>$2toVE:!w7K6I=II`. /D (:2F6dAGvC6[nmzJ" Ip$_"Is#Ck+T enw~M#87)I>zER*t(ZEnsS]BK؇ojיk+i-;[%ś-Wh B}_#t[$0@okcU!^=swWl3zpMK.篯Fؒ~ݱ9>TC5P8eCk> Η0b6z/a\ix \If-T,HFQNS}e58ǻefMVZa 8_l*'.KZ2vP['?ߠU`^>oG2~J OӂnYR/,z,*Xg+8}F]YLd:FaVwMWɺhLHHȂKҠ"heUȔb\}MT'!4XxPoj*V*>8>wa(Ϧ'3ڟ~e\_q<*ᭂ_{ 9[?I46,pbø 5;7n!6rڜ%FQе{ Pcȧkd`hvr@,dJn0EL[lQ کhrhuhJϛJ d+DwTVe_W dꯇX-UIkv t&@aRU&D+ 9~N B:;Y)0o!ʼߐ /SM+z#NJnFIe[+}.<An\{`pK0zf2san+?e2&l2/ a%כ " Uאh˺n[|Glo8 1Vke I#)IR.wӕ72@;9A&rÓ.H Ppq#2_Lh7O2O,ĔUҔ[%0Le1w$ |=(*fُh(5%͑F:R?pDPim`Ʉh DkTT ru+,;LuW`Û֘)FTGYso# T=8S&:z"ߚTSѶTl R6bw^+O[S/2 Eae;ϋ͵NmH<*4o9 S@S NȽAXYnY1=ew 3#U5ZC+rz,@OLq~ [Ś[Z>d30 12E ln0<`%tpIP*qN=WNR hCh]cۅ,L$\EDHw*b%Gu P7O}˛.8B>ڮKR*$c:b%;oHϠ2N[6UxM*iQ]vj;S,Rr]=Mn7Ca9 Ug0)|QI|*Jq^1D|$HDvN(ӎV*lWE̻@7 wsX@gzȉ ~ KyEsS:Uʕ*$-WB!6IXuvK[(ׅwU Kysfhf r'ݺVU ܣfdte9vÆ'\Cu,Sc">A6 ex( ,]hD5hGy>+s* D;e&z.wt%VP}ֳ)fҙEx)AS5<,i+pG|Z#8,RW8Å״<8F*3,dvT! pMgp{ڝȾo梐΍G ϻJ [4 9,V97uzV&tp;WԺ--﹚g,**oo98D?$"KRn0<ݐn&30RqNQC9](Ժz~Q ŪQ`80j" q;\_3l6͎J f4γ~VRBYZ~6T4D& <)};t8z4@I5O'.ARPJ4BTZlL9GdpAF̃*%Ô hO`ع6gj'V{K*Si#h;|O.NH֜bgZXrq#Wln' JH.M5N^V0!s53:`R*bVcTq(%Nvܲ:ɝ|TaQaHF}O5 q.嬷ѳ1[X۫OF9~Ep͛sfSF?%J_Fp0~1ʟra1_V8͖6.Ӎ:0o"5& nj9a1']ČކƄ)m.?,osWޚ &B\tt} ؽ4$Ft4zzD.K/dvUӿ5VdH3W7jMgwհ3Sr_$;ԥFhp'bY \$TgzNZ(~!qә0X>pU6eWr*gfZ?A?Uf-Dv&BPg燗6bk֫Ϡ閥ɫlᦼ6sm[Gu'aT[|K*igeGj)f {<#=tDhΏD16'o$V:U V6XlZ2b>eh,Gyv'qۏf RȌzXtmSwa;*iK:cMlAhi8Ŕ/ !! 1~+]فN#&tTFb:-ZHPr!G95@U +"J%W QAB}l+337bi FPx[!J%WOQHREC&[!qu=zsѩ#Yi-ycQU#uYo2`~riS][AyƵ>ꇆ>@_ћՈ@4}wv\r&T`1 M\blլ~[B #u(3k#RLͶ<6vՕpP}*i[}cJSкeHV> ua.}kgFmB;.]-2q_Q :Yߣ0S&+L@i}[T4&IN}!Ps~cMN/S U~"3l$HΣ z} #the GEqyqݝY6heyڃ+g8RRaMͤ(0/7KZ]5 .\G_9O]ٿJu7DyQPbK4)7%#vL?$*lUM`Qڿ4uxffʱM6Y 50ŜkY y !CfۋcOm: }Ow;qn6 hBŌ};~qat+#7Z1O~m&~QX{雬aJ yz'Ӫ|28#jCEЭ-P)Ihn%pƼ#.0ϛw*ڷ.rQ0|ϦS6 5p\{H)DVoB~B=& gHHy^1@LQz>!<[?2܈mO=W:o]n_T{uoѾ71# ~vo3ph|1#&ڲcsTqmř)^ɬut(Gل2wbuLz(HpBn4@i RBwSiMlԈ!Z+hx|ϭő,KC-Pq}TpUXGx֌ӈ监AoC 'h;hRR#|b8O$ˉ}݌*WuҐRҎ~aڕlg$R/,hd ',rJ!=ȒwY: T/z0vnܷnFT^4t?$ Ɗ2yz4 )ܷO JW=+lҠ i߹V^ڝ@EfA tiDOLVkaJ;~,WGAqY6 rX(sC#qlHcg6u Gz68Ed 5Nmwځ+cU+5!{+Meqa@χqLD"8rw`Ϭ4gyڔr;ݦh\MMBAԮ8س]ôZ-=Ovnj n#rI)WOk : ӌm;]{~մ4K$S[|N:3?^,ͮ"apB HH;.S&S;ʉoي!9lf3FM#3#J;ΒtF~5 D_zuy,S ^΅׶CWh(ˌF, cCXV"qX8Zx,wLhLJ@^A['(Go2[4e=u]/lW`$k :گ >U;@m+f@"[MAT~%^e$o2؝BT?&r 6T57\QC4%XOQYp";%6;L-+hM=go<dP=WloPWnj_fX_P_rcB<7ŢOx}F͏R8 ~?QwYZ*ޤmlWZ*T&KqKQCXq>IPKݜArX-Co7p$ci rPaKL`%DUsPy\tJA4UuݜLSnxM-1BOGHkQ+>~EQ[)J2dJ??q줼v@`yjWWCK3a0@H vHm-KYͪ zq_@pG_W3o#P@WČjYW Q)G W%:մ*0m|⾲ky7_Mv 5?q?j(|QvdvCח~\FG8T15_0(S-pd51>nkZ4{MD.,rIZuNF};Wc[ߓ!zHKaiM\QrkC(oʣVJGbuiK1pD?쒓hc,ˈ7GMhkp xGUNNkhԽ<0YsMϝLv?2Bt{.Ltvϒtmp҉Y!j>B$D-3kZ`~RSȝa)A3'@GJE !ۜÄ:V1H.Plj+rOa46IJt@ ֿLcLmt|9%R&XV9u3\(U@)AvHHQk3Gb=h4=ēr@]&yQ40s|NJxP8Nq\Y/]tje[vlykXi`_"f*DYmRVZ.]t1 *+nZb,n3u?E]Ş2e&'!6 B ]Gndm2Zf cQ-A O7h< +N< >5hm[Oj:n5`_M@Ia=DԤ"h%螂 B]j/(ታ IE&M=L0ב_L2ȭש2\Ɔsa@†]8،[r9#o!~ѼbJ6P׿k9{9P֬/ gx>[~l5 x*W%F4J1s>'S Ywbql[}~NAiǵԾ{ߜ)uߪ&<(h[FXcdp'Q'xJ|$ڒC O8WL,I^P1V, D:\$x6$εmg2hTxeBAuUj(2l˝։)^][Ǜ€ J_̢Άّʈ[5oc  8DK($¹#+iƝFNz߄O/j/MYKb,Q %Iy3Ra[5;|ޖJv }>9lߵ,xaOr 1>H (JG5/ۙvz.P}Tq}6ς,5MT;R$w<[&b~9<!x* bt[s~r߷!ĬTdžDZ;FuL]O6]\a b# dL0VPzPVK0E?`s?emamk3͛/{] qHl#kEJd`2=IO~ Xҝ)hͷ;,EYSgº?^4>v tJ^C;/&YVDFU&]pЖhmGJNA=x-mIϰ*Mׯ2iWOPQo?z+-ӻR="Vve8%.9&L">,\cfŵ˽"aV+14Qkoܴ -ZF o%eچŠ9{O^DzК=mM]K#h-3 : ҕD$5:E}ҽgCH&s9-PPt?9ćYB>sb g; $+_R8}Q M(.Jc/Lr6ۀ !Fk{VneE2ח![}R#"Ĺ=sŵ c'fjhVў@=Z[ $kJb 0:P"VqYNՖQ]Fs1CQx(M?nݎ+0ϻFn(', .5O1A z"hd!e^knfɋl eʗnJ 6hS2KHOKpȻq].P*Q^HcV'"Հ{tT?}fЃZ[4$\,DŽn}EXgMۧ%*&(fk%^h iNhDkńG2~;siS?OR!ͳ ](ԈMoQEN#wnXLp1NxLsiTڛa۲$}D\ҟ#Gju*[f-(ڲ+rU,5V~=ѩ+CWm)qj|ۆL|摯x/tY':*)Re)kקK8yWH3hڕr*3ƺɃwtlh rH| tG5CVy#TjC#,u_NЧ fKE|hԔI!Z7pxn;1Xpĵ H^ iUn\!k| &` Ѡ@i/rKg:X2u9j(fQ,q)h n7w*C;?,Xo<pTsE]؞1F7p}@P\~Y"\tƆ6)Wtm6o:o2/  W|{&'0p$1U:O ~; K kq ]ԟVuY.VU'Kj .;KE]S4TjKE1GAz ݬtG,@pIn[ϴPz E/DPHRnNSlZ\/Mנ jeގub@#!C2sJ^r9,g 4 [Y՜jc‹/%V "”MGk2f]ݦIw ۶u]Zq)ÙFҠ¥@(Kkv,~ki#I؎޾*H['f 4IocRNE3jhO{I,08sӀV('^JrN5"ҐM.amyl ! Jzqyu{v/vn2E)=;WѝV9ON\[K`%ǭ jg FjwC _Mj @\@j~3k З^VХLzf7yR8+dPlԋlIshJ> _b󰸱m`޹+{J?&#DABS戟@zLC$^OlkʟQf%^]8Qw-n߄BKʞeܚEA T|aChm%g۝s蒦0 MDh>-3ȥ 9twz^ ހg w쮗ّ]4Pm?ǏO'45!lJ*)cOH&&l!ڥ|XuWUⱡj2>8 2-f1Y0:Bɥ^eL ΜwuSAK/IENNlbT3*!<7x$FݻbNqh9T6 N,sټa)<ydXrZ%cbwI5H[(g`:&M&;]wQy7,wT^e}?>9L7K5]V䍂_:9A^<^,(`,t$*6ϧ,JNsq)5Pa T "T?I6 Z?j$5 |eF@ p rJ;fIn2<y~D>d6>TT;,^ݎVokW n<) R7Kh*0W J$-i8h7H,mRMg.OZ \uJL?B{/<,S 9?Jbe9 FwP}l\"H޼_ V);e7㴪~5K<` edY!E3 sI8sI%m1\y_|P69an#EkaLaVi <;yڟTvBp0󎹦?S\Rx@ƈl)&a]ޖӮx$ᚌѽvVbAA0@pbm@ *_ˇ=PKRO(u¶ c*F+! vGUvאMRjqu(a S~X52>,j@k@)(fE#+&Y%}vAU*$' Mi'_p{|5 kV_Ed,5# vJ,21ٹ+s7D|zmT,^}PpӳRnJ$O]f%wb7;K2G\sTbKܼ͜gI\-QATQ&G$%QPgvۚ/yP#жl*{ro Kh4"`@6¥#6 cdB^X*.<=ҒVݣ+W)bpPR^d>"Dݒ'0qT>S:wȽ)=袰@"[trTr.oIԆwwnJ&F +ƪ茣nx `.AS]7Z.J:.'7D/lRtCe /eP2㴝f]FULPCճüljbJ\9k.,Bvf\7_7=:'O,%xlq ijM݅$[&n٤q|#yL 5jX?ϧ:Loe7N(8GUzh(CPOm4N\e;{*{6ƌq ΎGKi/ŒQd>)Ye&g7>z42:XЄ9z:ffs-O&n?];Q~۠6퀨>firJ;|JSpխٚKa3L'`"@c}r? b]tEwq9sp{)}&hkr-G1j]@xڅh`s#KT7ȹ/w 7; M4qʱep.\2'ڌm˙u98cN=f:O0YlvC[N!LEJg񏟊]5uR_EUփ^a>أ 6]_+k9ꎠt a@S]3CF:*cOZ%0̄5:Õqvڮ6(mC&Ǐtљo@Wn/h3`Nߐqēi9/cȧ&I023d8)U#VؼdVxUN)V KC(*J*\Gh5\ C|}~6?UQC&Rd&tMb-i1)r줆R)F9 N Ф'WҬ}~s<HEv Ici7EgPdRߡ f,.)ųw1B6`\>d/u6.6D7Ǻ)lN>=ͼڤTNT؞\B IڑlyvGfBv+fF%J*$IC Yq#o/Rgq59&@2maB8 p9)N7zp# 3= i4k&0 ?㑷43o Nkr: avqE8څ{HYcʜYG,0X-Љ ݴ)דyCJ=iW(=u(sra/ǯiQIv& mAg߃JaԎrTsuQ_1JaarZ8$0L3˰0)a D3]ku,7? 7i|iiixfP@ sHؤ/ ɄM%˳wȸࣨ>ATNɔJ|nj}1ca ؼ/CѠ[Tiah؏?G GB#  ]@D`n?!nV6@Ó'~y$1/aF{)@^ m:g¯NiC]zTn4=X%>/s]?ΛFvOh7<&-u^"د$22n$M-kGz& ' ~&* zpk|q}lpAcJwA[kg;Nۛ h<+kSgd,rLC?ҽZuD'b |D'?%|247؜}[!K6").#͗olE'OQ/d?Us! \U݋xBD> ӲJn *z ԽZT?\x9+ibGꢬY9#9s rvH3FP$!`c!Wt^>L 5k|bSrkɔc8!"}OvHcېtQKDJ>No/Ygx ()Q9RQ ^F%NQMͿ<1.L!L}@f0;uGiI[O^{_[8>*IPX\8\D#&~UHED#;J$jHQ)m\ ]ehkʬ:vȐo۴'oD=VGen,%CQBB7PY J,.QUgo/X6Yi7srwnKb/ endstream endobj 209 0 obj << /Length1 1620 /Length2 8934 /Length3 0 /Length 9998 /Filter /FlateDecode >> stream xڍ46בu-je0`N]"zх]tB]s=k}ߚf._&-.+G # ȩk@~n I2c3.Gؿ`&B<;P/?WHWX qtAn+:7@vfstCllej# C,A0:a vxh t-!``E xxݹA.܎pI6N;a n`+ qc3tm!.u 8`B,0Wx(QQh:a: k6^n޿;G0 l(ƍ@p@0ߎ C< ,89(zh\,' Eistp.ؿ'-akwVNL?vY 6p|-__J#O࿳4RtBY?4A;>l] : 20c(B,o*^H/o kM|,^{b {~p_KWz痳~=j r*SV>{G]_H*8\zQ,f(` h{O_\Nӫs`Dy\x})sd4E `MV%~_ I!]wx eо23RR𠒨ZmUNp(fH:^V]P9npLkBqDorv1YIk_iے&zhs mnW^ X~B,g@aYEahcPeDk2moJr|n߹3b@i([ݚ#A.R*iRfzn ΀I>[Fn[;Ux߷MR{\LB,eؘ&QW2u1u;3gΎL ܥ6:зFٚqjGSy1Ԧ=$wb[}+b{DKg8W):KvMS1!26Xf>!os'Y[c_6'ec40NjO{Lfv~۝"QE*3YJQ4[]!UË^bQya|6|&kocV_LdI&K $<dNn5c^ rA8>{Tu,j}]5؃ݐz1~J[ӯ^\N++uwJ3^{# 4/%{V6Udrز?baEHB< uz{ܬy8.%k-V8ir/>RΰlCJ쯃DSL[Po@.Z}|φXsw$DW8},яMHjn}FvɅr]o/D+t+\[H +\z[OMB7[Xmω7Zs;O߀k049ΕeI0&{-PxkG gȦ ۩ LKU"-f½OG"&@-0Jo=iT>67V,?C *IY^ZR],q]ψ頯S9S1ۤHC1exoF A3ʤX2~6@2o)Wat?œVZؒFD; \uR!`f{y4#[/ -zXL/TD(9$#fn&DzƒL?οlnϮZYb݃/$=eͪPq "f\0ntW:R1Po9^zͽt-1|4SEgs uGH,3<^}Bү !GLT'K;Q.AY_pL.~LwXݦȭ>MQ,]Hr%6̡ҿYE'Ĝx3NǓS'cը0sjnݭ$0]20,%pѮ'a>F }@s5߇ <,Tiϗ>owiڎ ׵KLySc8 *Ŭ4Ui{0Z1th Oo`?%ש쓷"J`?-5E$ W5*EMB,kEc: P oO=@HXÚُXT>x\x`R5,=_rM+x4(V/h_Pޫp ,⡃-$صbJ|(֙;-r/uu,/ k0Xcyx~EpT(0>l `(j<4~Rl!hE<%FO ԭSڌ zrI.#cY=k}QMyL0#ֿRDPe/!W5 0LJ)&fL '3 8f%M-WH)!`?&}]T 5DDV}?8c !M߭E^^5Hrt` [J^?]tvYMh"]b0OZknp69'OM8;"Z.`h{@'Q43{կ+▷ydƈn"7w4:IG$H_?6R*H:Q}O#5maaRVY@n@ K},đW[\ezd|jQNV|$,bb&.KMk'b|#|q^끷[]I' (9RxW$rK)iµ\ hUnhԅ0F}ƭzkf5fNc ZIqvQlr֑oSK[)Jx n|08NS cF+yoF׸=vMkM :(.}^q |6($B ֖F-0--KTx~2OVa/GNxB`i54dJ%Dm% L=FGX={誻"9*1oR#:ҋ;(PV"7*tu/( :hCı}Ȁ} t m:ԳHKfKzxR ,o& xƋQbnV/f*R?բމi¸=zLmf#E7~}ynW,1F9Ѵ>;D̘}x+paFaM\5Dۇ<Ƒ(4Ɖڮb[m1"/*;OUv_ޒi/V ;?>hsbF0,S!X{殽" Tuhn5]zLxe%9Hho$1MLtdޭ[ѯº'/$z!!7 i+\/9lՑ3]\MKh.-L !fG{QK@/RIiĊIOz fIT=#P >)}dAEM񒶤M몺Ik3{`3`FIhN4ЇdWΣ߱\ZC:5j$uU֗ Yxz(M>GĨ@COM5ag:ݝ=;Al {]c\M'qW{"xcu7Ur:g@uk*XA:0'_!Ⱥ0} e 6A,*v@ 嘞{=ZzBXD\%5,WWAεucS3A)*c|sJF̠6)NޡSfiiQIOSE^>#*UBI1G,V.dj qWodž_%ÅImZRfjCxo)?a AΥ{ݎ-k6f[H(Amn&.zJfVEMtxWKFfn)Gz'r∹QU2m#0~_!5㴦hvK nD >~,d$kJ4ҏZ vj*kL |VV'\[J+IԢC 'WiF# W Ye|>}R(Bmg<~.WY釬K-^;_] {*$;UEe `^rP`FL&=>r*$W[VLT*$~}]p/,(MkXvs[ ڄ)V۲In# Yom7kݼG/93 a 9ٟyCq|;,/7#sK]ztmuj`K{菼WwKg1g%Eg #>x⇅{INwƋS!Ns84z޴\Q'e#9QT΋i sT{TS=x|&յọתpK ؼ>ap-5:/cLPAg9έ^BIb_ғg+Y𩣀+oGV!K/=DZdvS`:DII0r=S2>} 8J,W5.NӼ #uJT%PMg\gF?OGsF\*fXܭuScg 5 Y|W.!9jvLZ̓C J$ )wh_K#m]/;dC nbD-_i>Qb}۷Qz!t}$i+&*'I?u3bsPrdZ"eC4be C=ɲ!d8'(n\g1@TQQ%\ jXf,ǚS['~L{> mf /^ք{lW6v2_Y<,dī6L'c8{fqTk+kxtjQ?H5^_ᆤ(p`|čyHC#PvWz[ Ҩz_%'p >_! h~O3.;ؐV9--aTRxb. m}u#]2J0UNkE!+9cDW"9ɠ_xe},wXkg?];lhV-Rtte³GJ/-W,R7T8Fto&%ܞ>xA&QK1e@J&M 7z3˸2hЮ?8xl;|"P;PdjN{ZV)ڌ"89uW 7ybz;pd M"СTUf%jSѧz[dꂔw-SQBByf͜k i}˄`jD{[C`sA,G88?P~I8ԫ9[I_؟ڳ,56,SjNh[NСuU{O7ŶRW֛͉,^9GWuxɩ>/v(aY?}DJ˗4SJeIԆa)\jxcyT|$9eBlTRSfvjY:k'>NKUW-vsA?ޏh*TwjCus{?7 eɥ{t, Ӣߏ(VE\ڬxt𽾎km\L\tϲ3$y+h-fXLspO9 [fStы)r[ 9v uȷ Zx1ŕ2:Öy2N{OvyRC+ 1F,skFP? B=/lb&H`.8jf}i_B?pO}N5b(p{wS#w$u!4|xW"[ Jq&/צmAw?J[{k5X2?J>ٗn}fv ~U2>ffNڅn mws'{Q/ 7p}Ki|bCO0N؇˸Eiwu;Spl7&tPv4Ii"r dNe.+/X~})UYiE{O`8\ k =N,4CJYo_iYq(?&DGdF~{o1l?`c@/[sNVs\ qDN;n[7>s,U3 cֹ2(?ǼO/Ÿ ٿZ/=1d ;*4ކAh_ZQhQ@mALogaо3t|M%{s0 w;^L>fW+%}e CRCU<Þ$G<;L*Nԁ+mMTW9}pC.Q&PRM3n?1hC-j#:ϓOgx[~~7NRdq,fњKFx p¬ڗqrDMx[IĎ[1ǬaٟGr`-Ƭ4WG]x#ix 6mcf|oZv[XuƦ6=űJ80~\ް^7;$E1Hoc_~Y*F'Ǥ]ӯ`TG#>W_qGR]ep{c,0),3b\\1+^y=F[ GDYWlF 'W3H]e!b6NxSoEvQ M-1;xnY]@DmcObOR:הȏnRs=1#Wt, ]%tAzBzI7^(B~SO6\q+B4(8ov1 Y&D ISH@}c6T#,@se 3H|6 Ýʺq[N÷$Rxpjh̤R҉f8GӚƖߦH"tsYwK6)Vu5Eσ8Ή?a~bPgn6V݆]YVVߛ3+"GojEnާ$?S@9MY@WdzxY=X0  }"Z: G{50sZ%gxGhɑUvLvzq(\ [=H05֪' v𮩎xWuc{~EHM*|WKKvQagsʧAC@PdK\&QuQw;n\3I™g3tG{y'z,zUDbjW˧_g؍ĺDL1:SrjIхAqSĊ7zsq4G%S=Gڀ J=70&|;vF 4 |Pl֫}6IC_<i X5*ܧڅ<5 wtwW 7OV$"dlAp y q^siڜc1*ڇ>BZYA'!^u#؋ڐ/s+kD?X4[#zFP~r63 7krx A.엓iwʕߐt"zw?#g\{{ѽ/?Yzc0{}XҭBY)T7&iK)ؙv|]B4t`tT=v^ zN}e{U໎ފqAjvEpfm2s htsW: endstream endobj 211 0 obj << /Length1 1554 /Length2 8371 /Length3 0 /Length 9392 /Filter /FlateDecode >> stream xڍP\[.LXphw;,8 Npww'GrܙzNU-_kkWPj0YBAP+3; ?@BIƁLC v-F9H8\efvJP@ `ggcpeuH-J,y(L#ur[۸>'΂2q9f 9=@jzW:AWWG~VV30=jPA @uƂLд%׀Zz9{94* _Ɗ0  lfaup4x!+="0X64w>̟ TnS=7w{.`GWYyR O x_'kz@|V`&,Y `'7&"ȬAn666^ 7yZذd-~zn=}\AWg7?` W9 AOg1/|`O3l= e`šfNN37 ;**< }&-@qYWX,ܜ/?}ٿ[Y /C-BlCZo*ň=wDžfhvuR}|%~se[Rt砩19I$A}jyq@ vlӋy'7>t<^Ϛaj{_xPJigP"2"1`zb^^`gO<'0"䣿{;ZIHMO@ {=:Gyј,#yFȋtƻ=> ]WQo@'W#{ucϘ4kLX5y,Hԁ0%BH:5bjƗՏ)Od2If6k0ʺM`q,/qPLdڮ1? /(^8v;;n3Ȉ4е.e~Dkˤ9pѸܮУޏ\WNL["]ŏЖ+Ǖ b@{HJܡNxe^-ᨱUíh_Ž̂7O݁>Q#6g/8%ssV"X{ZȖGLH./׆0 n"bDHʯ-/z⫼i9 XGBl$}6vX?!A)Le:ߕLVD%+0iizvɎZz>û!-l>C6z}Υ>7wj;X}aO J5-GںU/ݒ"]4l7B,W+Ppq'/K.㢅~7]e5 CgM eVh}2a7]z&GI ޅ~纟ngY()ϧU*:_N ed/aWMY2ȷeX9hh3dp3aߚ)AJ*Mk88,=zaT)Wx V=oB)F`d !?=/D&k-/ Y꒶ ޴yb>Ig7**nSv ²JG/d_'Bƍ P^ U_*phY TKz UM;"jvrbi? cjh0Uv&H7]~NҤ[0K'L1!WpU젣_(^,]/1g7 ah6ɲu#}-E)cT~ȃ3Ո6Jt웯D27FڕJp ݙȁ>M3#6j/1-B(q?S8]Yzi5qxn1*kGɻ6`HVȀ}saeU'9GAҙg1zYK Kn@gCF,7fu|{eľˢX>Al-Foj?$k-Գ\!TMnx厖.L7QKHܵm1-ϼ bVD9,^yT!57sGӍ[3nnF7ڕkՊ7 `19b8448͚֭f$-M)lo6c'CJ3{ǟ,_킾Vyo>@\]&2.̑(d3_YłfF5Г;rO/}DOv!Kt) ӳ2=MPjɅpHb½s)$4Z:/CѿN ɨhqZX InJ9STSsyS_rXWsW;} j&l9 ]|$ߴbj~HVnӫO#qIGδ|.˃14=փS>iӲy ؑɵ`kkDYx _ ='I"4GYo#a\wc XoWQ}"bQ+l 0=B@gPX4 !R״5N4RZP_)ao+ ۰NQvS_`TרC4F/29xɼjMLlJȑ#dXt uw./P:G-$Y"e+__j!qBkc`PS`2gbup^3Q]E)o~. GM`Y; GqɈ\,x1n{TƟiӦ+PkUb/F S~UfTLznwd!MCZKƎЇc3gSd<9< $N<~FkGD DPyyE_v2E:,NqOȭ B23*쾞Y`B@E} pK/g9ckr_v\NO&nzA8}aJZLl;}#/s߾S0<6)iZaUMkm ;QZXncq2 Ӈ3v@Vgs j$G֧&!3_ѽvE5Ч^hNh#˥yg/Nحm0̛ޘܕ#9UT:"a]1mjP \% "o=Od"v|-MrB$*"jE\W֒B80 V)yA)dVPsO1N#Uµ;c乱i0AuB+ Y#1ޫv8O_%Jͺ]M-/&W|v4Xւ7]FKPu:ͪ7Y UŅ pc=\%y%Y 27ҒQ(Lɷ`X$:S_\釽~obW#K! [X|\yKy[WX'ZpF*8(O2=bp2KbfhOIf,]FF ,0iF^l KC'̷͙u}{6GYb\+3tccn_UtGy(\| }x)pOyޕ* FqAҲTxeLڸ@6$ @#UόyeEa(}潡ۋ/;oJf5czc5&/WT9ǜJ,a+ ڑ[.1^M$Rz4OQhQk7 U^xl{\vԽN-"LUӾ46)\N_I{o.3pۮ]W:J]|?7`G+B^ݛ _(䍖$ʾv,*_v&_B##9Ca-GM"A(:}g}#htAzJ +SfTC Kfhi;-8hG_`~,ːCBc\M"͖d_3)MCִjd Cޤ av;f-貑_HoVR=vU*\J#;ZNv͜iF=A0uq䅰øI Bʉ FlN.ދv$`%ŮY yzc;Q: ~ عkNL(Ƭim"eOW{|)ΔF6$Q2x(;rLUDj[fz d.y 6t v½ܛ֋6wK>zχRO@:)J3]Ro0on-M ݮ)7V6Ykn%/>9([ϑUr Z@pu~fRnj˚Ni$@-!& p9*9po-Na%%aV. ƀ&}1sr$ޓwz `Po-Dliy0ZeiLj+t_:4v t2?h{&_%PlY4}+{;6Я!xk.*ju5hwu/wSHiMcyw>ǫY\x45h!Ǯ~@Ix ?);4W;8VWEaҬE&Q.xG++^1{Ax,gs39@&s{%H]_V:LK=Fx{S_mMb[tҌxYƯڧ@xZw266l|xٗj'ux/j^C ٣ta O㣤j_WH,~1 x22 gFgGMl?uTG*Gxh7N`BܦR u 1ZKpXPTԹ@p6lE'+iؔfC\iuY}-r1hGy׼@w~# -=/fao8T!|m3l۟P endstream endobj 213 0 obj << /Length1 2659 /Length2 17571 /Length3 0 /Length 19101 /Filter /FlateDecode >> stream xڌsX]ye[nd[2m{eX}ؾus^oI酌m 6N L<Yef&+ 93ֆ/&jH;[Y<̜99022X;2:S\͝J@G ;m51 TR5qr5p@+s##H(K6030ܿ2G`bnȋ089 l X9ڂ \ ̭ AoRrwFvN VdmTh1c[kk#DFʻ3Ŗ66TUm흁RLNv&&&.Pco'*v̿ɠp 2qeZ?uq6}*M tm i33(Q?l;sZo6tgAinyl"Y9IT2{g['_aQ+3(?*FV[WAFAO?f@t_ :S^IlM.APxm _1AS%ÿ"cj*?=Хmt!,Z~wgP{s&fCfñ,g˹JU1ԂtngE!wPQj/6'9PĽ_N_d ]9ӇAs^,^`L^[fvC?$QqRZ}E;|02lS!F 'OX'˓Y'.lk%8o|Xm瞄BQ1[(y;WY@y xW3ɳhLΒ!_I,NQ}],X9RBD'L%ZNpެbw9buq56Q}U? Eg?hzNR|ښWbM7c7y]W\7!;L2UC2/T/UHgr|w6rFXIi~Wnj$nRQ*PF{P+FZxk/a\L%LshwQK dX^+U9Xp( 8а{ݏTHݴi H( VBwQQQPx&\0#oE]FԦKEcm&q  |7TϷrjg]pGh# ǐhX|MRJȖ/ըKQgfvGxq@CJGG 9' Quma0={gV臘lxvqqFw>ɕ0E8M'`?y45)UuDdYP=a%@ɧ3ω)ujEl#e@ySНpDI5+'rWHKر FropIܟ` ,6 Siw% ?כ?H)׷}7S?}O\d^) SH`0ZwhqZTv-@ki7;\ah#YcIY،ڂ׵u*LQt4A v|˹p8t0&wWSwxM [Jx_YRO4nvj%0?G_K1>4uՄ[RRlAJj~Z1O Ua A@Uĝ/]w#ԕf nn. 3ّ;TH Uzղ\׍ն"7o٨F4*V` rQ;/ڔRȽܠʋR0%X~)f&-vR[ q-ZpO/7)_ l0/ܲ¹`6F‰?kiSj6P1&*ߦޭPK0^R4*)K&n2b甪h}G5U14 !`(̕ҝk+vjchgq$3@U]9w1iQفQP,X5ncAtXYyMQf8>{d m|e'Nm,Nަ`DsEM&llaۓbI*k0r_HՌu(XOZ ǕyuRTy3J>Cms^Akd7L~a=9&1o.,]sV G .-C'e䰿%{%z=(ӤN͠|#Ǭ6̟0x@YȊ\Eͥڴc#X:l#D|U>e-NJ_hwHoj rCVP=~hM #H0݇tJD3h GAZ`i_𲟶oNR^(+s'q>]u5]g& .`&Ug N؈FE'v=2]ЅY']{WƔ?p1-|Q~'MXǷk~҄ IQJCnUE1?.2K]ՃM }H[%6ij–Ķ堪ƛA| ?$[THg-9@ٌE(ĕvL3SB\l;j9GmkI5bԺ8W )DN#޺쀨/ IV.ؿ:)PZwnѩzĖ~weGGىθc1fe[$&tEtflKڶt!a>co6lq\ȗrmً6\;nW~,^tD'?[$JU4?hs X1`"n@O{bϐLTByD<:ϸEh9Bc+k3[q3z2Ӷ4,LjOYÏ`A A^v()SH5,Qb=(nΠg#\ [Bcfı/SyGizQQH 19R A5"twx*xOL,U-,afO_ ,qZvr$h#ڃ!*dcRf'M[>: ~FCwEN-H}AicxJďNV w-"?jGQCq4lO%|K܍@5Qx,<I,f F`Eg?]30 QxGZeVr@L($/#q.ƪY ) ]+{ђ:͞wM:Zx2sah78>FV Ԥa1X=!JGU|nB5̰ lXK+"qķ_3)ybtRHP ^vضTʟF؎"!=T o+>Tr^NP?A'X#+}K$wwlP@oIOÕiGFyu]qzKvkEL-ETƾpMSs$0M!#yB>Cbtp*.2h-Z[|ٓJ|';Kd|[W4l"ۼA<'nΫxu&LQί㼢 eϦoUP|QoY B2UN4oeyӠ}*$h[{2.63d?mU~h.A;2Ef-Q/5зvݔwMdlnC.AX7E0kW~#d*سV"%"A]L42STESkuJj6j/DoH>Rm -lVm$j 7w[O.Om9@D;bSmtBRx-ng{jӨ_r_(t="Z >i]F3OsQʏnAI?.'X=[]]>:X6;&{Q$^Z)8wlZ=O.>ж3v uk4؍)1x*'NdC37O#@);~>3Y9A4U^rrE7^/xJv 0usַLxr0? }NH w:qDM:4o6䕤)լ/h61ȵP+env]6d5M'rX+}LHj$WV\ReF!@@hlJa@mN +2;#V-8{ICX9m0 q.;0p~=/˱p']eK{\K4"IsqM8aP18PesRc*\AL0eޖ5G<(!y ' 2P@%=dbI'pXy1[.((,RzxZ a;F*oڌKe8 0НOuZa0} 9ef1*1.!A$.TQ;|q_@k㺩(.AEoxBuv;טRTjwH%&?C 1bdc9= Y##UNÉvr@eH8 O2qUpIo۞`:%hxJ}I^`L1< ϭ!_+ pŅAӲ)ƱxB|-SBp| D|jRqEtg@u^|@nȚ2!}L\,l{dz ۱{2$hog;HXJ%Uk8NL{'դ%_K)PR6SrՖAGxu [w,\.Aסﬡc2^rU>a%~5Wٯ9jOx1aTkդ>v@v҃?y)p|MH$|kN$V?h6Ëi7vA(wJ}0KVk6D,Dh96٪yG.WprΣ8ePfRR8&xKLy X!6.J w-.Ii8@uAHk&RȒ#F,MZOΉ(ͨJv u=5p)m'xg)u/涤M@E>7/Z=Ը]77Y !GLwc.yA~Obʕ) Cmreb}$ڑ\ymRwdh6L餋wc_E3xnZe=*R܇4 e-8𲏽ꂀ?vU*oaE7c)}>ZZyG@t7D1jt_@ V]AV!p(/L %BnUZ) >z)VEDǘQ\"2 pEGDܫɾBe#[ΧC\f ǘ2 m߷ 9|7 Zxq"Ԟ C\;?-%eNT!ONF?&z֋S6Kc0P]&[c򑫪q.lw4Bj^eRlKic~(tDTd—:ø#+\ǶZ2;A|[ Pv{7<_bt'e2)5[בJ5;7䚬Xa_#w~(L^>/!m^Z ۂϚ홮Sd [M]ۘcQܳys7]~4߾0ⵐ)|+(ۆ $|m>v"- KXy8XPu)-<-:]"mr Je(TǤCr'e,2g 5QH@ Ǵ EG!Ɉizmgm/ Ku&)CZfM vxiPö>5|$QM )H9ٷcHvO曏>l[K+z)t/D]GֻIrdA"#њv mF66׭@],R )W7҈ T2S~ki(䣩z'ij}\asT^b>mz;xFR˦A4lo aqdx+/%Lvni#wJpS@^ Y\;)k:sИ8A9\Zs>&G.p۵r"m2J皕R͝QOgi#b9T5om)meMRiMDO>qcIv>S9Txrp% &h6cE)rO uEd@W*zl)7l͸nFB7O* u/۹vZXq=$;y,f+! LV4Ĵ*-RrL 0i QIK#86 GȰ2JJmǶ+?͠-'BH|3p.@0;\E#(!J1TᮼOyz!9g"ԉ Lٷ'H1M prr-Ao3իRhko$4D5hxr3V/N&fi8N3x1' â]׎%BѧOb{<]&9+ 'eoEb݅0hY8)TUE&WU`M&|i{Ћۅw>4w؉cX]iNDɑ 7s)r(.f{]! @&tM:K~Ӿ&G>ax-[)B ړAg5{V3%1 R|i$ yqZ&&W_{8WɡxѿIH:鬔&d'd&Y=K̇S$- g~P='ŐWFE d~\1Tgn^ʮj)w+*ŗs)wF* "+̫>J!r c%uCDХ(G -ݕUsg n2|Z`#tsN"mmUj=Y>vZilBBWY %؃JN?.vRhF[Iup GQ1orbR:;UCeqB}Nz∪#簂…y*pq)eӜC 9n~L@@?uh+*O2qbX }y0HqO94XIF7#_9 wj kkp K ,KMZ'!kgjToH G_u[6o v' d#sRl5<Ӵ+Y;yV@WU6a) ^* Pͥ6.QNVi2<_j}u!X%ɠNFy)Ȭ`s\r13D\ <ӪTZQ/0b 8jGo9E5ҭ*QN5Y딈skx/h3#&Kנ3D7.|ׄ\$pA3^"XkTL Թ@̨a*/.{:;~*ᛝ$ /0ne<QwaP&9mk%gٮ^Y'Cβ_.%a&D$ GyD0,waڗa[#UX)QsBL\Iȹpϗ 52bֱ'O/$K@5G-πiqc00XO4"},mСۈUxdt[s{Jfn׳4%--?fu` =4a#Gp()UgB0͍ݰek_JG>ME{9 y){1_B&ipUNJ2)yp+{i]LAhHlX\Ӕ4с[^N뤔[DЧDJ MKpa܋;. `oq$+`V=X'RfǏ O6#i_,FT9W{uXpp5 (v"I$ ~wY:J42GRit W []caqop:O3Τ8kԖK*M K9ug13j˃DVr9T,}; a'$p;J2(.kcKNƕtПHF׈y UoxHuA7jy6nnMn"jB|#z ?Mg1..L"]pC_2(siq2gJE(2u̡# z{GbR+\;d">eApiɟp ęہ Y@jfA|wS?gUqM54[y-xլȲbPlcs"7^!B&Nfڜ8#sBTL Ps{._v^MD¨<>l#soYg&XFTMsϮYJGTRTH }F}(_aŴ2t c}b19]@(G: /.mv,##MO_"reGjd#kP>e`̑|^wFdp1RQ]h~4t|$YlP4@\-| ,B %4֯YX+>ߖwV-5V6M5`ZrTghR hK?Nf ݦaaq.4}e'dC٩Eᔯc<ٌ߶Օhf-B^ Օ W2~YǀS"A g,xa#\2m4 -L%Hvqۻ ?- ǃ,`5n8H޴]87`%:n;=_`=gwKT*a^0~m7W0w )w>M9{Sڜɲ~* 6M mz?YQ=6e20c$8  g~s>]|VLv؄p` dGZV~[=8.T}tL[%: %oRߢI=k?l0 %uK׎D b'EA4\> gBi^2bo(خ ={[Sl|xZʯ.َKx}ـ(ҏ`y~oYnI[}`K@ʕمiL.j튨V5gu7o̱_ĿI>m^[7|-}OʬxZ'ssR }LlݤPn﨩QN;Tg4,huo`B0l(oPV@7zrMɶvqdGgL7u Edo(6,OZde;QqEt"j=ʙg֯E٧LX-]NhBvQb/@^ ~ߠ26M3!|)p*WhXrCKI< "XEY!$*M(Ư=5)w[ѹIFf!\1$ъMw(w7l|ee)j£yO+w(gdY6ʂx4i:")Qu36G(#Zj8B#Qĩ\y׷=_s^2@?TIdTWʗ'3wyg4̡;*>@C% C<3o ,Ybg֌Z5~6LnH(Z,!\)cXMqs6B[5P l$i`=螇&h ?d֘;ߪHt@x-@wɦQe$2}cTCOMS2Fr}|[qAc=Rwy@iY'CYI-ldm2СӏVH>)STh## ٶjaV afCĊ8kˀEX9Ko#s'3n3<9߁/vW,!6~U#4L/Kn۰pT'K]T}*p.y R1ܬ I(]q9. C=o5'v>^Ad0I`ϲ$~!}V3jfkm:FǏ3Pj~d-2i 3Fld&zg.ӕ@FH&&G׵X&R>oz5jwGֈ) S0};;]:>1>MB7?LװrC܁dR6wLX|dTB<@=ϯ=봇W\]svO H@WmXu׉\BNUFpC9{U$pܱT˳LC }6d(t$DkEQOCx4*s.$WׅJw=:}͖wSv'9mDqAD*:m+*EkFzle6839ixWH~Vt|g`*z2j$*r۞%踶uO!haݭ?u#~4n2b#HWB>WH?9Ij3σ4 /g[j% A f3WwTB<>ҰQ&ZagZ(ἒ~/J.MvIgy6ffd@~KnsaoO)s-WK{/xCG5 QU@耝edT\WS@|G J?iڙrFF\</bX{6@: 5C Fq$xZLeyP#xx1nyƗz-̀HQF:SRSLw7c+znKStm~+D:Sa [K}qku*LF>e'EnPJPLǵ"96i}`zJJ8J ,hy9I]]eB&T0m%+\R+"vFCc,;ꬪc2l7.3]^P+oiԎu{] ss fQTT[ Io-`'&yTGi[qgQ|~a!nIubc>%ɤ&Gx_ʤDre.$nZQkxw;ՍM KTҍMQj׭O K&P($3:nMZ<]n`44Ii:SjŐPDI+Rl +F򇞟 Xx. =_G<.Rؗ*׊CN-_0?ܱ3 $*E^?Q9sf?4@掬FkQhKu2k4|&HI=I>d3zrV쨗{@h9|zOp3j;*2|IھNVE»Jtfj$< ToS0dN9p/.(L8d#~By0WgصݮOѽY".g?0 9KrbS 0'I=QqJ$} ^- D/rO$:o7iI/"?<)W-?&1#k <>Qz (ƁKyJξ@OZ鋛t 0޷Hsvֹ6/zX z9xDg-ןAʡW>%$YRt!1dpіC:Ż0ƽV|dn5ЧmQTD{W8-z1Y^n! ռ)%Ñq %k %&B֫_f=xp}b=%St:o鬷,$UxI_w }A)m(N2owzXf#.%CS[CDjmļzhNavV+%$-՟@2 ㎦_uYomOBͣi 0I6܏AdkhΈGQܶ9U!)hmTJ^/{ƃKU_qr E#X0A0>BdCQ4qaQM]: t֓(^t|Uj,1gp 5lU~RAlƠ. UxJ0AcR-V[DଧSaN"ȣT~%Lm@K8hVPj&޿Y|A e󈃾>"%3.kfj EAJ pn,(-:;9"^:浌>9h͢Xc~cx 4ͿӷMzS} Qh>dwpC\3!No%yHQe 4A`ǂ:cFһ$S$\՜"PO`#x4{<їmd@| `Ϣ9'7=<Լd@O]o!hᱺ@3#/_Lo,bn] 8zh[h)J2iKґx\3lmFSm_ y Sp 6!NE&X_F}^5M>Nvˈ6cT~F2$ƃ-5_v5C~t#//z0xA(f~g~i(V=Q$kmA;U_%.ߥG7᳙&ckjO]bx0N7#S]eJ&ECH&\ WD#ta\КÍV쩵+dEhWX‰Vl*pդ ^3zts#9ugɺjO\ @ɤfίoA5Q+ =>jJ endstream endobj 215 0 obj << /Length1 2118 /Length2 14486 /Length3 0 /Length 15769 /Filter /FlateDecode >> stream xڍtk lذĶmv&Icm46ɛs<[}׬53 )2P֙ ,```c``#%UpGGtt#C&ba(kg r02ٸٹL 1sZdRv@'8Ra;{G 3s< 00rr:Zd ́6 v@g AclEOFghDghGIpp6(@_r6S#[8Klgf|-N..&@GGv @h/c#@;zXؚL-y1:gwg_NvֆFnT~07?'cG {g':' 8͢&v66@[g'p݃߇kekfdjakb {zU[ ȿm>Dpdf@g+3@//{;{ )pvtxS`ba 0Y! ;@c McLl=}J*2"_;@ `efq|7ſ_~t?{(%g1@ş1a`e0xc<Ho=ſ 6[kM,\lVcmͬH '1 w߳/_{fma Tsf220r[}N# ;Q%cbe::z1|L++cM1`jב b^bKA~2^q|T>b*A1 ';`}D124r6t2#k_algH6? #!cObM-\xsqÇ??|4ϊ>d]h?VAʡGy?vOw>|܏NFQӟ~Aψ#*h g78|ph?1?O[O㿂8:~6?4[^3 jqݟ#WOZvpyBN tLE^X!x:mm4scpT~VE[ K4Q![{@xA54K,mjg̅^Z[L<+TIoQgȼ0J6y(@6ǺϹe$Q19I|5>f+Sٟ".aQɷ އ9RȺ@yxl/CjJMi{j5 :Bpt{XfzYNϹ+w ^ A$!!.Hob'̢[fC="Jpyr;!a8U$jL`iw^A]8R&]@, jR%0&v:!zxߣ_lBlF]t|w1=з9E7B-BU~eGn 7t GtP{l,'Zh!j* ʴ9LN2CedZL)M^7|"GyN!)lG{/aYk\OQ꨺!u2c 2 Dm >>q]}3t9+cz'n1#ssT6- U)h|gkt+bMDsWw{OM=+ BlHσdZ魑aFy7~{CJBsWIBv v5gy:oQ!Y>uYhK.CmBE۹v{ŎhcP.gn}YߙڵgGFW2o"Z2ߨHL "H 3¹r.K)z,=2ńz,,XZ(wY"'B( t<)2TkF,5p;C}au=@Fp~:Gmis}4?> ˀYO.[KMnIERFp0^5+'65)@|W1: x(țЀx'lZqܐ M ? !%dȾD.m˚[OPf A(*ȡlҞɑwQ2Ehd"řti/ahDa9Akd_=[/UOTVrBI|owUM7 Rw ukK0x?*("52׃#Yn+kC阈vߗc~w /D(dl=+Q횩(?T#5 ; >r#2ϊ%"&dǚhh݁&Y Ps1 +'g{/~ 2,(B 홞 nS<}} ?bst)0 po0\7p\E%s>E@<;BYiCG`T>Q6$6,譼Z₌JBхPB՝Rraif%`CG׳<.j,ޡ÷OӝfK/~X1cͮ96wxY"AeMuj $=H,f'kTAB{ $}DD}*{r6q4njK/~`:% 8aě7)E5r$ڟ2Tl(Kc{+buWzLC(nưm<=RK>r܏W,^ı4a4s ,xU@ bN œ'ӭcTtT'IVsr>C2$cnHhEXxI43GulgYJX~4,KIDyL ߗ\)!bSJ.iF fVZvvh{%9!_17{_~6Nd#TY肉r|nOi`&Go`Ut8sd^<KA/-\ kȶqB."qxiPrh /To^0~k Iv-G{/V!j5]~I ]y, ]\K^9OZ&ƸM(et:#V?QQsSh*tb@W=wqv/}< ֗@@(Y OKxd0#B>Do0Gb}Zɤ{ZAeڞ *I/M=*lG8 q/lh1yF("run24uDI Fd4 !U!3Md - dXi1Hc)9G\>t'E݆CIk*9m|g3n{3 ƅ9P!.|׬bBwjMNHzNDiC)>8+Þ@YYovt7DDn CxځC bǭb  GpWq}jc+[/E֫S4amlcf]hיgE^i9ާ;aѧsߤoiC5n˸~ga}c4?w*"@Dz!cE1q~Տǘ٣B񥠺qYKXxU;I٘ZZQn3KpFGm-(~i0NA?1e*"k.zR|%e6,Y%8aHW|\GM-R=#?͝QU(?z@VGu=IH1EJ^{goEň )sS=/xH<͈"!$~ Wy:/`HtOP'92ֱ-%~9ВŰtQ,,]E%KxX Rm*屁/PtR<3+`(5u)ͅ5^MA&eʑs$ꅁ ?ʱu<жY+#xRP’CM S0CN2rh5sd_D7z"AWw~[Q7.\׈*h!^!\AB&`GN"iC:wVfɘS>9Yz?lC3dU񩠣"=J#_V'᭪U<'g.Rg.Oc<ov#c" / FXkBo+)0+鷒;>(jɢ񯒜A4)(#-sɉ8#oۭpb*>mB43=Vx"2YZC*=,&=O#hc3>V:4B%{bE\GXV4Z@nd߿ɭQn[zvl08fD%$O^ȯZ/7aP+.?Xuw6͟+ս4ddF\{u!=1#wPk@D!"QSOY/>iϿ-781*8rߏnӁӄ+# fS^=,ӹ@A5/;&knQxR.t{C3F 9 oCHvG[7o]Gk~,ާ:k²Or, YB VeO<NP Ұ$|}±!9.hI I QF1"WFn$R)7dgc\2Ή~ o/2{P HzpaW|;p/{U^*HeOC ;Dz&U|xO՗:"C&V꽑 esc wsuQLEU?K껧-;H J/)b~n=$6ma%9d,YZ3]T|htb-*IdIP?푘-˽-wXzwlնM0M)~/Vø߲ 3)yxV};xGkFlu \[T}UiDSo?-eѨގ "ab ?r,-!@lO%U|uYS6Vm盡_7ϩԆ]AZ̜`>:!#F`tQUG%3 qAr( Lҷbix:Y?vJ˼rAW0KH+7_ذ`:a㚥RWҧĂ#ndMXUP#!y(G~!0<m{C|7˫;$O_}cEۈy19{ #_M:fw~~_H?ɻPc# !FH`>AiߺkYjeL^ A'K^;<@DJ;^{ š Ѳ-iIf$#X\Dwd$Yh V΂Eou_&vG^Z0W[Z &I]v ~̲7Wkp/fǨ9?Ջ ㅺ7*{ Ūm)m|=~s ZKblbwY?Db*t3 9>z;aixWH$5Z-Bsr WLf B=bjp׋3Ϗ|USl%Z {x(9>tojVAKPtQχI~[b>-NΩwZY_#UobԵ("gn-ĎtwG_*J{ W53Hqʮߖ뛿wkwm-}nn)%&Z89;\{jv-SۛާNvyoU[$48xW&x)w/$*x Vp+I_$G.ez#5Pu˞ݝ还vg6M;n c DAΐShD]ь \ךH}g;ܢOE\!n]Qꉼލ\̿t^). ND_T r)bx پ wDMntS@B?У*ŐⳍEVF zuWm̋\1a%!_#jU(l҃kWMQ4t *%XJ *pl_۠\ICS W 5&2{LFIJtVP,9!F Q` kE5Ϳ5c ˘f#.S5Q ٿܓGO;*mü|xu8gt>scЇV͒j~(s|/)){g3$+[Tp|y*|~ qǫ ࿒+;+V"64r ԥTXm?\}?bF$5=#7MDwW@ X P*Ѩ!FP&ܪS Lp&"񵂋c je{%6XF;,ϧ=('w:xȥҁv`c 3W0a)1ci:4 >U>?&. f0.;.%uj(\15~6-4ge6琷Y?ojY DyjӾm4ۃvmsq> ]WHekҞ&kݓn4)U(fm[Yx*뽎=iGF$5;&OUeZ~sr_m֒d]z)!A69W4%"Ezyƭfc\iClJ\6V~7DA"H5;<=0U;ٴ'UhOҿ.@.xfU`s (20mnFl @Bv83d\TZyز-9AǞygȭz\!wq9%wxuABAF;gWqOS x @ X skwd (Ҏm־qHέ[$X{) .܁9W J!MfK=Lb};wt8%Aጐ}=UQmGZ+X3@%6::H\:G}t]GIѺdWFL`LES ]| %mL8Yx<(~zc&UEmJG">1ᆽ8L- Q cf'. w8 \~Ap*h(޸FYD7"e^c aܥBxCw}rd0L_H3N7暳*uȺ+ӗA,]4AH[!({(m ?CP Q?+^|`rE82 MDտșqJL.9JO`=M ~FqX꟬)%*1a2wM Up̅`9vRL sŚIhfA{4ˆd d5ָnC1O$حa$t.V@ KDĽw3u@)*\YH'LS?QE e/1PSoXn* Y,?韣!A찣OlPJ;Ͽ+m3ȑ)ilAߗxE\$e>"QVo<[i+Y FYDS $.O_}-慟 Ticl/EQmAq W YD܉ʸ=̿L@Eo cl=(ŵ`KܴffS㸙T'Z++`('h;Ŋ+&7c@^#+/kUԢ`x]b ؗm;5 yǁ5<^p%<oc\2*~K>z[,%ð}[?fK U&c“/4fm}M_~%Afb_}/IZ) qnlf~IA p{!*ziG uб ր1 hqV$}}]<o7t- R ,*YVSؾxbek*H9򓪽-KM\awlX@-4֓W$KT1NSZ7[3==abN>%+J]1W_Y xtD_u*]eB*oYd] WF>\dg֬$4rijqD9"ϐ2.*** n^A>*He+΢:^Ut{8"QW/I[ q $ aY\SLx2sy=^pVqodVvo+F\΄ʂ#"zTeP} Q]vOa=C%LT*oQ\ILUCTߠ\~+*oJp~ 82< גfKm:NVCdS3o7,TgHhЅ>5h1a+g%M@x uG _[ l$z7wHaxuZYVJޒNqi]?ձ"iڵ] =l&FB~_p5#u1I7'7Ξ|TٳAI&/:CM7 Dzywך 5N]a5]ɝt Xc?$koHP5)*8T.ɋDҞU`Dׄ1_g TTݔ6@+-JӒþ 6dXϕ樤$NK;^\`~2F:E_/J @4;P/J6Y;gV51Fc!(@Ps endstream endobj 217 0 obj << /Length1 1562 /Length2 3192 /Length3 0 /Length 4178 /Filter /FlateDecode >> stream xڍT 8mFJ&E¯lC[YgMoik )l*&oEEDd)¨|C뚙;ha-&ţ1mD-{ nr&o;HpQyy<(6~DpÉX73z ŀH  7 n;a1?0IX_ ΐ~;Po\1f˿_ @+r "w $v H#<((1{o*߹o;(F,UHm?Ǐ6 R)0#06ocq@4o-; d}/RPa]3ZA1 x= In@}E@/$~8CIr@hwCLO0BFw@_\7@Go P!?`?<s*026F2R d"dF$u.cj?S M@.Z%#3\N|}݈e҂|vkWcKx>ViH=+bKmQ_@6ʍ8{>Y55;%JJ4P/+M,l` J*оH<|暠V9orC8&)z&@H޾h24F~fCS؏/@ &'1P)wQY7 ʇIrX@+d.v/hL;&@0 zcD*zXu/cYE[/__~}v9jlP} c;Ej[2V/}9$1degow\OiqtBjw]!ds+" ; ?ԿNH-[Z!,trHQ K'()Vȿ?R9lyNZAz,ǛOwU_)ᢛa/ K?xƛ\C-`1z57k^b8i&K&u(5AX0Sn.bnԃe=I}otrV_I!s"ȡj .'3j5%?:#VTֽ*dRL$+2jHmWt(l6vP&qc3jZ =VF!UZ9%Z 5DȺ \sb7u=L"u ] z#|st*Vk[gtq P r6yjdxSTi-E b`nA8[%+V}]ejŪM.L@ :G oئB\OV\_=?J +o=O@LB GC.4v n f' ႒Es l0#;-6 A9#YV1kJ#𦙙Zk/)'sڦ.7Uʺlh$&+/&,yO4~~UuuGQXKXVk)ڱ1. PDf+|@԰ 3JZl~eSvQLqfqv~&1U¼$ڼ:R$Y6)@CEPKd8+&)&B7SE9lUۭJҞJw|q{| c/2o=NoӊbgYv%%ZKSk -#Ql ʂєe* Iy>Ty0߉Yi4z|۶/FӋߣ~s_@H%HLbwk8*<-/HUuVS>;Q.dov\cne&$C4n#bUK[8CTaE9fM2+`bzSXiAn ,7RPOozص p|9E ,&<4(GuBrzȞ[^y[h\T p5tռZ} 2+W'X"Me[_dT$UxԎKew?eyhb@-u5C zal}}-dvجE?DM1pHH>_2m';ݣGXnEIx/9bV"uNrxMwӮWC+,quKnxk|+ƵuѺX,u^HYdn"60 ;;TT\9+3bضքPXpjݖ('bWnڴ<ӨWO|Ȉ*>}ׄ0N:A!8Uc+푮6VGc]JIiK&|ׯPG@EWEFCOeu6=38Ͷ-,Ey+׻3 =ڐdM!q!h* :;g{ O~ʾؽ%P=gj)Ψs'awO*WKׯi*0F^D endstream endobj 230 0 obj << /Producer (pdfTeX-1.40.20) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20200322100606+01'00') /ModDate (D:20200322100606+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) kpathsea version 6.3.1) >> endobj 150 0 obj << /Type /ObjStm /N 95 /First 847 /Length 3250 /Filter /FlateDecode >> stream x[mo6;d)cMZ6b'i䃬m5+G&i͐VjvM[&yyf%IK"¤#¥&Jn t#"%LI"o :b4uD4a0Ha:A~D8 `r9ad9X0AπLr ,3 #+%ᚃ'̂<<3NGs* !0KH 8%$l%4NVDhM!vO0*6aA6sH(" cDy#@!<D3 G$҄G0}7 Tp!  *@3KAS9'#9sT@NBj$0rg  c qp %(2LHB4` Nxc4 Id60e[Df dv`A44 ac X`f9YbxUA8Ӏc 9Q$p KL$3Y# r9lA /e:TfPY/M<Ћ?oSB-|-'YoÇUZ$-[HȖB?*WjeFcJdU4Ɋdig)]I/eL$]Vt2+tW&,xZ^j1Wͯe&1+o$}7!yˤ_C yVs\;1b*Qȓ'a _#28SJ4; zzGy/;+<izvxDE"!tgu:`@W:'eZㄋ'3y5V@M q|",_UJj* W4ֱ O$?MtUݮ=l"ו#iB=w&xc<}?Uē6_{忒w{f:+CWo&&/&!2ʯZlX@oTf=%PF~;r^r򱜷[yxgZ.xKqlپlVCvz@ r\ ٻ֐7l*6S;al>/Y_ pw RBN }'.Rh;oH?}/@ RTW+CDGaw)TS(a?.S,NL]M+5VKX Ջu3l/߰"HM@ALdѦF/ 1caI|B)>\`t=^Z8^WNVEE:xau4:N<SQBp \ B;\fȮ(ظ=@~ӄמea6>Dž3hehQfpZ|P+'9:mIP-k9,isG=6 Զn9ԉ׈;rmnͧ z~OJxqSy\B Dnp&', 3kľ\_D(g{[ XaD:Xz? cMІ1L& 1b0Wo27+8h:%aKQ%}Y(yRdav(,O=7V(p<,dpŵַ i-~{8^tN$20<pHx 1cē.p^o t#D3|Q,_^ğW5*TOdѧ>GG =g%hL/iBg4~*WDpD {: 9%i3ZВphfYZiJO9]O^p(#y8l;~uk@6dԠAO =: owX ⹇ 2pN"Ê??]o3G2[B|fstf" Vf='y?>a|##l(FF_'jkAN V1D(X`f1&~}s뤂-oo%~G]綜מgp};?VTptKz^bs"V]$CKz'C5\,? PD|V-a i}0)*Vk|T տ\-.zyv*ZB_-g!ɋtW3qxyq| c{ZȐ}+Q T{nVlVltViڻ֥u{'? ޲2n8!޾-/,. bP}'OQ=H~eEYIpT0sd_}[6d#=9΢qikaC|F=]_24@  S[2@aoDJ|'5}_z?g_U_7|xx?Dޤ}棞ۆ5n~}KT Bf0tUa-kHH1uZ߅}bk|MH?ט]T횩Z*m Z9',Fffg*1@M1ʴb1+fBQ1~fmMol;] ^X(k|L_ C&G-~3Ӌ##ZE}&/F-\1]XbX7Ef1kQeV.m\orQuW]FoqgBx K n;\5C(D@3`$@4Ƭ.[sjC=cŐ{8@ň:(cւbZ^(6B/b`p.W)MU;TMU8 ^>˫WUW調mJNx99p|̯'l}tu }䳔*ӆJALb/WtM#] *H endstream endobj 231 0 obj << /Type /XRef /Index [0 232] /Size 232 /W [1 3 1] /Root 229 0 R /Info 230 0 R /ID [ ] /Length 579 /Filter /FlateDecode >> stream xoQϹ:2RUJUKљ~FҢ(5=;[H؞DFl #c͢ a!D6O~{}{13̒MVt8C\$9H`iG͒rT] 5F 7CZ `9wT[ ~*IMȘ"m׊Ӥ \ǃR+L-Jm` %)xR\0m]8vI&(w.7+`7`s{^%P` a0# 1 4P&t0t TP!ngڢKkSn-i]n0WYWr ̻\WU[';}!UިD@ti==yo/rn %nf'sڂawӤccOOmvɡf*bb::F۷?ڂJ Yk!0,:{մi=߽]K#Je^ x4Ґ;aO>)!WKw1c0ƨEOus endstream endobj startxref 170756 %%EOF rtf/inst/doc/rtf.R0000644000175100001440000001717613635625176013555 0ustar hornikusers### R code from vignette source 'rtf.Rnw' ################################################### ### code chunk number 1: rtf.Rnw:37-38 ################################################### library(rtf) ################################################### ### code chunk number 2: rtf.Rnw:44-51 ################################################### output<-"rtf_vignette.doc" # although this is RTF, we can use the # .doc extension so it opens in MS Word rtf<-RTF(output,width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # Other rtf commands here... done(rtf) # writes and closes the file ################################################### ### code chunk number 3: rtf.Rnw:62-64 ################################################### addHeader(rtf,title="Section Header", subtitle="This is the subheading or section text.") ################################################### ### code chunk number 4: rtf.Rnw:69-70 ################################################### addParagraph(rtf,"This is a new self-contained paragraph.\n") ################################################### ### code chunk number 5: rtf.Rnw:76-81 ################################################### startParagraph(rtf) addText(rtf,"This text was added with the addText command. ") addText(rtf,"You can add styled text too. ",bold=TRUE,italic=TRUE) addText(rtf,"You must end the paragraph manually.") endParagraph(rtf) ################################################### ### code chunk number 6: rtf.Rnw:88-89 ################################################### addNewLine(rtf) ################################################### ### code chunk number 7: rtf.Rnw:100-101 ################################################### addParagraph(rtf,"Α Β Γ Δ Ε\n\n") ################################################### ### code chunk number 8: rtf.Rnw:106-107 ################################################### addParagraph(rtf,"α β γ δ ε\n\n") ################################################### ### code chunk number 9: rtf.Rnw:113-114 ################################################### addParagraph(rtf,"\\u9829\\3 \\u9829\\3 \\u9829\\3\n\n") ################################################### ### code chunk number 10: rtf.Rnw:134-135 ################################################### addParagraph(rtf,"Normal, \\b this is bold\\b0, normal.\n") ################################################### ### code chunk number 11: rtf.Rnw:139-140 ################################################### addParagraph(rtf,"Normal, {\\b\\i bold-italic}, normal.\n") ################################################### ### code chunk number 12: rtf.Rnw:159-161 ################################################### tab<-as.data.frame(head(iris)) # create a data.frame colnames(tab)<-gsub("\\."," ",colnames(tab)) # format column names ################################################### ### code chunk number 13: tab1 ################################################### library(xtable) print(xtable(tab), table.placement = "!htbp") ################################################### ### code chunk number 14: rtf.Rnw:169-170 ################################################### addTable(rtf,tab,font.size=9,row.names=FALSE,NA.string="-") ################################################### ### code chunk number 15: rtf.Rnw:176-178 ################################################### tab<-table(iris$Species,floor(iris$Sepal.Length)) names(dimnames(tab))<-c("Species","Sepal Length") ################################################### ### code chunk number 16: tab2 ################################################### print(xtable(tab), table.placement = "!htbp") ################################################### ### code chunk number 17: rtf.Rnw:186-188 ################################################### addTable(rtf,tab,font.size=10,row.names=TRUE,NA.string="-", col.widths=c(1,0.5,0.5,0.5,0.5) ) ################################################### ### code chunk number 18: rtf.Rnw:198-199 (eval = FALSE) ################################################### ## addPlot(RTF.object, plot.fun=plot.fun, width=4, height=5, res=300, ...) ################################################### ### code chunk number 19: rtf.Rnw:206-207 ################################################### plot(iris[,1],iris[,2]) ################################################### ### code chunk number 20: rtf.Rnw:212-213 ################################################### addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) ################################################### ### code chunk number 21: rtf.Rnw:218-225 ################################################### newPlot<-function() { par(pty="s",cex=0.7) # adjust plot style plot(iris[,1],iris[,2]) abline(h=2.5,v=6.0,lty=2) # add some lines } newPlot() ################################################### ### code chunk number 22: rtf.Rnw:230-231 ################################################### addPlot(rtf,plot.fun=newPlot,width=6,height=6,res=300) ################################################### ### code chunk number 23: rtf.Rnw:239-242 ################################################### library(lattice) p <- histogram( ~ height | voice.part, data = singer, xlab="Height") print(p) ################################################### ### code chunk number 24: rtf.Rnw:247-248 ################################################### addPlot(rtf,plot.fun=print,width=5,height=5,res=300,p) ################################################### ### code chunk number 25: rtf.Rnw:254-256 ################################################### p2 <- densityplot( ~ height | voice.part, data = singer, xlab = "Height") print(p2) ################################################### ### code chunk number 26: rtf.Rnw:259-260 ################################################### addTrellisObject(rtf,trellis.object=p2,width=5,height=5,res=300) ################################################### ### code chunk number 27: rtf.Rnw:264-267 ################################################### p3<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) print(p3) # note this is a multipage lattice plot # but Sweave only shows the first plot ################################################### ### code chunk number 28: rtf.Rnw:270-271 ################################################### addTrellisObject(rtf,trellis.object=p3,width=6,height=6,res=300) ################################################### ### code chunk number 29: rtf.Rnw:279-283 ################################################### # plot library(ggplot2) mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() print(mt) ################################################### ### code chunk number 30: rtf.Rnw:291-292 ################################################### addPlot(rtf,plot.fun=print,width=5,height=4,res=300, mt) ################################################### ### code chunk number 31: rtf.Rnw:299-300 (eval = FALSE) ################################################### ## addPng(rtf, "foo.png", width=5, height=5) ################################################### ### code chunk number 32: rtf.Rnw:307-313 (eval = FALSE) ################################################### ## addHeader(rtf,"Table of Contents") ## addTOC(rtf) ## ## addHeader(rtf,"Section 3",TOC.level=1) ## addHeader(rtf,"Section 3A",TOC.level=2) ## addHeader(rtf,"Section 3B",TOC.level=2) ################################################### ### code chunk number 33: rtf.Rnw:320-324 ################################################### addPageBreak(rtf, width=8.5, height=11, omi=c(1,1,1,1)) addSessionInfo(rtf) done(rtf) rtf/inst/doc/rtf.Rnw0000644000175100001440000003162612262535551014106 0ustar hornikusers%\VignetteIndexEntry{An R Package for RTF output} %\VignetteDepends{R.oo, gsubfn} %\VignetteSuggests{ggplot2, lattice, grid} %\VignetteImports{} %\VignettePackage{rtf} %\VignetteKeyword{RTF} %\VignetteKeyword{Microsoft Word} \documentclass[11pt,letterpaper]{article} \usepackage{Sweave} \usepackage[hidelinks]{hyperref} \usepackage{geometry} \geometry{hmargin = 1.5in, vmargin = 1.5in } \SweaveOpts{keep.source=TRUE} % Keeps comments in the R code. \pagestyle{plain} \begin{document} \SweaveOpts{concordance=TRUE} \title{Vignette for the \texttt{rtf} Package} \author{Michael E. Schaffer} \date{June 2012} \maketitle \tableofcontents \section{Introduction} \texttt{rtf} is a package for outputting Rich Text Format (RTF) files with high resolution tables and graphics that may be edited with standard word processors. This package is not meant as a substitute for \texttt{Sweave}, but as a simpler alternative that produces reports compatible with Microsoft Word and other popular word processors. This vignette demonstrates some of the functions in a larger context than the help file examples. \section{Usage} First, load the package. <<>>= library(rtf) @ Now, we can use the \texttt{RTF} function to initialize an RTF object and return a reference for all subsequent methods. You may notice that the parameters for this method are similar to those used in \texttt{base} plots. We can define the RTF page width and height (in inches), the default font size (in points), and the outer page margins (in inches). <<>>= output<-"rtf_vignette.doc" # although this is RTF, we can use the # .doc extension so it opens in MS Word rtf<-RTF(output,width=8.5,height=11,font.size=10,omi=c(1,1,1,1)) # Other rtf commands here... done(rtf) # writes and closes the file @ \section{Text} \subsection{Basic Text} There are three ways to output text to an RTF document: \texttt{addHeader}, \texttt{addParagraph}, \texttt{startParagraph}/\texttt{addText}/\texttt{endParagraph}. These are very similar, but some differences are outlined below. First, we can create a new section with a title in bold followed by either a subtitle or the section text in normal text. <<>>= addHeader(rtf,title="Section Header", subtitle="This is the subheading or section text.") @ If a header is not necessary, a self-contained paragraph can be created with the \texttt{addParagraph} method. <<>>= addParagraph(rtf,"This is a new self-contained paragraph.\n") @ Alternatively, we may define a paragraph start and end. Text may be inserted between these methods using the \texttt{addText} function. <<>>= startParagraph(rtf) addText(rtf,"This text was added with the addText command. ") addText(rtf,"You can add styled text too. ",bold=TRUE,italic=TRUE) addText(rtf,"You must end the paragraph manually.") endParagraph(rtf) @ \subsection{New Lines} There are a couple ways to insert new lines within the text. First, you may use ``\texttt{\textbackslash n}'' within any string. Alternatively, you may insert a new line using the \texttt{addNewLine} function. <<>>= addNewLine(rtf) @ \subsection{Unicode and Greek Characters} Uppercase and lowercase Greek characters may be used in any string but must be encoded in a specific manner. The implementation mimics syntax used for encoding Unicode characters in HTML 4.0. For example, to export uppercase Alpha through Epsilon, we can use the follow code. <<>>= addParagraph(rtf,"Α Β Γ Δ Ε\n\n") @ For lowercase, we use the following. <<>>= addParagraph(rtf,"α β γ δ ε\n\n") @ Other Unicode characters are supported through specific HTML equivalents. These are defined at \url{http://www.w3.org/TR/html4/sgml/entities.html}. Unicode characters may be encoded directly using the Unicode decimal value. For example, to encode three heart shapes, we use the following combination of Unicode and RTF syntax. <<>>= addParagraph(rtf,"\\u9829\\3 \\u9829\\3 \\u9829\\3\n\n") @ \subsection{URLs} URLs are not currently supported, but will be in a future version. \subsection{Mathematical Formulae} Unfortunately, support for mathematical formulae is not part of the RTF specification. This package is not recommended for heavy use of formulae and cannot produce output on par with \texttt{Sweave}. \subsection{RTF Code} Native RTF may be used directly within any text block buy simply adding a backslash to the RTF commands. For example, the following demonstrates two ways to style bold text using native RTF commands, ``\texttt{\textbackslash b}'' and ``\texttt{\textbackslash b0}''. The full RTF specificaiton of RTF syntax is available at \url{http://www.microsoft.com/en-us/download/details.aspx?id=10725}. <<>>= addParagraph(rtf,"Normal, \\b this is bold\\b0, normal.\n") @ or alternatively, with curly brackets to contain the code, <<>>= addParagraph(rtf,"Normal, {\\b\\i bold-italic}, normal.\n") @ When incorporating native RTF code, it is important to pay attention to spacing in the RTF syntax. Improper spacing can cause MS Word parser errors that are difficult to debug. \section{Formatting} Currently, document formatting with the \texttt{rtf} package functions is limited. There are, however, a few useful methods. In addition, all of the native RTF syntax is available for more complex document formatting. Three functions that allow changes in text placement include: \texttt{increaseIndent} to indent text or figures, \texttt{decreaseIndent} to move the indentation to the left, and \texttt{addPageBreak} that allows changes in page orientation and margins in the middle of a document. \section{Tables} The \texttt{addTable} function may be used to add tabular data to an RTF report from a \texttt{data.frame} or any data that can be coerced to a \texttt{data.frame}. For tables with specific formatting requirements, it is recommended to format the table data before passing to the \texttt{addTable} function. This function will guess the best column widths to use, but also allows the user to specify column widths. For example we can insert a table based on the \texttt{iris} data below. <<>>= tab<-as.data.frame(head(iris)) # create a data.frame colnames(tab)<-gsub("\\."," ",colnames(tab)) # format column names @ <>= library(xtable) print(xtable(tab), table.placement = "!htbp") @ <<>>= addTable(rtf,tab,font.size=9,row.names=FALSE,NA.string="-") @ We may also want to output a table from the \texttt{table} command, such as the following. <<>>= tab<-table(iris$Species,floor(iris$Sepal.Length)) names(dimnames(tab))<-c("Species","Sepal Length") @ <>= print(xtable(tab), table.placement = "!htbp") @ Here we can specify the columns widths and a string to substitute for \texttt{NA} values. <<>>= addTable(rtf,tab,font.size=10,row.names=TRUE,NA.string="-", col.widths=c(1,0.5,0.5,0.5,0.5) ) @ \section{Figures} Figures and graphics may be inserted into the RTF document as easily as text. One limitation of the RTF specification is that vector-based image formats (e.g. EPS or PDF) are undefined except for Microsoft's proprietary WMF and EMF formats. For this reason the \texttt{rtf} package uses raster-based PNG files for inserting figures into RTF documents. The resolution for these images may be set to any value; however, for publication, it is recommended that users independently export figures as PDF. The basic approach for adding plots is the \texttt{addPlot} function. This command takes a plot function as a paramater, along with specific RTF parameters, and then any other parameters to be sent to the plot function. The syntax is as follows, where ``\texttt{...}'' represents all parameters to be passed to the \texttt{plot.fun} function. Notice how we define the plot width and height (in inches), along with the desired resolution (in dots per inch). <>= addPlot(RTF.object, plot.fun=plot.fun, width=4, height=5, res=300, ...) @ \subsection{\texttt{base} Plots} For \texttt{base} graphics plots, we can use the \texttt{addPlot} in two ways. First we can directly use the plot function in the \texttt{addPlot} function. Below, we simply use \texttt{R}'s \texttt{plot} function. <>= plot(iris[,1],iris[,2]) @ To add this plot to the document, we use the following. <<>>= addPlot(rtf,plot.fun=plot,width=6,height=6,res=300, iris[,1],iris[,2]) @ Alternatively, we can wrap a more complex plot that has several steps into a function that takes any number of parameters. <>= newPlot<-function() { par(pty="s",cex=0.7) # adjust plot style plot(iris[,1],iris[,2]) abline(h=2.5,v=6.0,lty=2) # add some lines } newPlot() @ Then we add this plot to the document with the following. Note in this case there are no extra \texttt{plot.fun} parameters to pass along, but the function may be rewritten to accept any parameters to promote reuse of plotting code. <<>>= addPlot(rtf,plot.fun=newPlot,width=6,height=6,res=300) @ \subsection{\texttt{lattice} Plots} The \texttt{lattice} package enables trellis plots for visualizing relationships between variables of complex data sets. To create the output for RTF, we just assign the \texttt{lattice} plot to a variable. The \texttt{print} function may then be used to visualize the plot. <>= library(lattice) p <- histogram( ~ height | voice.part, data = singer, xlab="Height") print(p) @ To include this plot in the RTF document we again call the \texttt{addPlot} method. However, for \texttt{lattice} plots, we pass \texttt{print} as the \texttt{plot.fun} function and use the \texttt{p} variable as a parameter for this function. Below is an example that specifies the plot width and height (in inches), along with the desired resolution (in dots per inch). <<>>= addPlot(rtf,plot.fun=print,width=5,height=5,res=300,p) @ Alternatively, we can use the \texttt{addTrellisObject} method with \texttt{lattice} plots. The \texttt{addTrellisObject} method is suited for multi-page trellis objects and will create an image for each page in the RTF document. It also works for single page images as well. <>= p2 <- densityplot( ~ height | voice.part, data = singer, xlab = "Height") print(p2) @ <<>>= addTrellisObject(rtf,trellis.object=p2,width=5,height=5,res=300) @ <>= p3<-xyplot(uptake ~ conc | Plant, CO2, layout = c(2,2)) print(p3) # note this is a multipage lattice plot # but Sweave only shows the first plot @ <<>>= addTrellisObject(rtf,trellis.object=p3,width=6,height=6,res=300) @ \subsection{\texttt{ggplot2} Plots} The \texttt{ggplot2} package is an alternative to \texttt{base} and \texttt{lattice} graphics and is an implementation of Leland Wilkinson's Grammar of Graphics. Below is code that creates a simple \texttt{ggplot2} plot and stores a representation in a variable called, \texttt{mt}. The \texttt{print} function may then be used to visualize the plot. \begin{center} <>= # plot library(ggplot2) mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() print(mt) @ \end{center} To include this plot in the RTF document we again call the \texttt{addPlot} method. Just as with \texttt{lattice} trellis plots, we pass \texttt{print} as the \texttt{plot.fun} function and use the \texttt{mt} variable as a parameter for this function. <<>>= addPlot(rtf,plot.fun=print,width=5,height=4,res=300, mt) @ \subsection{External Figures} The \texttt{rtf} package also supports incorporation of existing PNG images generated by \texttt{R} or any other software. The code below demonstrates how to do this by pointing to the image file and specifying the desired output size. <>= addPng(rtf, "foo.png", width=5, height=5) @ \section{Table of Contents} The \texttt{rtf} package also supports creation of a Table of Contents. This uses the TOC.level attribute of headers throughout the RTF document. Note that some word processors, including Microsoft Word, will not automatically render the table of contents unless the field is updated. When opening the file for the first time in Microsoft Word, it may be necessary to force the field to update by right clicking on it and choosing 'Update Field'. <>= addHeader(rtf,"Table of Contents") addTOC(rtf) addHeader(rtf,"Section 3",TOC.level=1) addHeader(rtf,"Section 3A",TOC.level=2) addHeader(rtf,"Section 3B",TOC.level=2) @ \section{Output} When an RTF document is complete, you close and write the document with the \texttt{done} command. It may take some time to run depending on the document complexity and number of figures. It is also customary to include information about the \texttt{R} session in reports. For this we use the \texttt{addSessionInfo} method. For example, the following code creates a page break, adds nicely formatted session information, and writes the RTF document. <<>>= addPageBreak(rtf, width=8.5, height=11, omi=c(1,1,1,1)) addSessionInfo(rtf) done(rtf) @ \end{document}