Rdpack/0000755000176200001440000000000013575267043011472 5ustar liggesusersRdpack/NAMESPACE0000644000176200001440000000460613501141722012677 0ustar liggesusersimport(methods) importFrom(utils, bibentry, browseURL, capture.output, cite, file.edit, getAnywhere, getS3method, head, help, packageDescription, packageVersion, person, prompt, vignette) importFrom(tools, parse_Rd, toRd, checkRd, Rd2txt, bibstyle, latexToUtf8, parseLatex, deparseLatex) importFrom(grDevices, dev.off, png) importFrom(gbRd, Rd_help2txt) importFrom(bibtex, read.bib) S3method(as.character, f_usage) S3method(print, f_usage) S3method(print, bibentryRd) export( append_to_Rd_list , as.character.f_usage , bibentry_key , c_Rd , char2Rdpiece , compare_usage1 , deparse_usage , deparse_usage1 , format_funusage , get_bibentries , get_sig_text , get_usage , get_usage_text , insert_ref , inspect_args , inspect_clmethods , inspect_Rd , inspect_Rdbib , inspect_Rdclass , inspect_Rdfun , inspect_Rdmethods , inspect_signatures , inspect_slots , inspect_usage , is_Rdsecname , list_Rd , pairlist2f_usage1 , parse_1usage_text , parse_pairlist , parse_Rdname , parse_Rdpiece , parse_Rdtext # , parse_text , parse_usage_text , promptPackageSexpr , promptUsage , rattr , Rd_combo , Rdapply , Rdo_append_argument , Rdo_collect_aliases , Rdo_comment , Rdo_drop_empty , Rdo_empty_sections , Rdo_flatinsert , Rdo_flatremove , Rdo_get_argument_names , Rdo_get_insert_pos , Rdo_get_item_labels , Rdo_insert , Rdo_insert_element , Rdo_is_newline , Rdo_item , Rdo_locate , Rdo_locate_core_section , Rdo_locate_leaves # , Rdo_locate_leaves2 # , Rdo_locate_predefined_section , Rdo_macro , Rdo_macro1 , Rdo_macro2 , Rdo_modify , Rdo_modify_simple , Rdo_newline , Rdo_piece_types , Rdo_piecetag , Rdo_predefined_sections , Rdo_Rcode , Rdo_remove_srcref , Rdo_reparse , Rdo_replace_section , Rdo_sections , Rdo_sectype , Rdo_set_section , Rdo_show , Rdo_sigitem , Rdo_tag , Rdo_tags , Rdo_text , rdo_text_restore , rdo_top_tags , Rdo_verb , Rdo_which , Rdo_which_tag_eq , Rdo_which_tag_in , Rdo2Rdf , Rdreplace_section , Rdtagapply , rebib , reprompt , RStudio_reprompt , S4formals # , toolsdotdotdot.Rd_drop_nodes_with_tags # , toolsdotdotdot.Rd_get_metadata # , toolsdotdotdotfetchRdDB # , toolsdotdotdotRdTags , update_aliases_tmp # , utilsdotdotdot.getHelpFile , viewRd , makeVignetteReference , vigbib , ereprompt , insert_citeOnly , insert_all_ref , Rdpack_bibstyles , set_Rdpack_bibstyle # , run_examples - commenting out until completed # , insert_fig - commenting out until completed , Rdo_fetch ) Rdpack/README.md0000644000176200001440000005157113516304252012747 0ustar liggesusers[![CRANStatusBadge](http://www.r-pkg.org/badges/version/Rdpack)](https://cran.r-project.org/package=Rdpack) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/Rdpack)](https://www.r-pkg.org/pkg/Rdpack) Rdpack provides functions for manipulation of R documentation objects, including functions `reprompt()` and `ereprompt()` for updating existing Rd documentation for functions, methods and classes; Rd macros for citations and import of references from `bibtex` files for use in `Rd` files and `roxygen2` comments (`\insertRef`, `\insertCite`, `\insertAllCited`); Rd macros for evaluating and inserting snippets of R code and the results of its evaluation (`\printExample`) or creating graphics on the fly (`\insertFig`); and many functions for manipulation of references and Rd files. # Table of Contents 1. [Installing Rdpack](#org72231b7) 2. [Inserting Bibtex references and citations](#org2f46fa3) 1. [Preparation](#org90969ce) 2. [Inserting references](#orgcd52e01) 3. [Inserting citations](#org61f6af2) 4. [Changing the style of references](#orgec97bb8) 5. [Troubleshooting](#org509e868) 1. [A puzzling message in devtools development mode](#orga85843f) 2. [Typical errors](#org72d25a0) 6. [Latex markup in BibTeX entries](#org9113c8b) 7. [Encoding of file REFERENCES.bib](#org8a4fbe1) 3. [Viewing Rd files](#org44a5291) 4. [Using Rdpack::reprompt()](#org53a201e) 1. [What it does](#orgdc92cb0) 2. [Reprompt and open in an editor](#org8a77552) 5. [Inserting evaluated examples](#orgdd8791f) 1. [Evaluating the examples in section Examples](#orge939faa) 6. [Inserting figures/graphs/plots](#org6f3fd95) 7. [Versions of Rdpack](#org649c176) # Installing Rdpack Install the [latest stable version](https://cran.r-project.org/package=Rdpack) from CRAN: install.packages("Rdpack") You can also install the [development version](https://github.com/GeoBosh/Rdpack) of `Rdpack` from Github: library(devtools) install_github("GeoBosh/Rdpack") # Inserting Bibtex references and citations The simplest way to insert Bibtex references is with the Rd macro `\insertRef`. Just put `\insertRef{key}{package}` in the documentation to insert item with key `key` from file `REFERENCES.bib` in your package `package`. Alternatively, use one or more `\insertCite{key}{package}` commands to cite works from `REFERENCES.bib`, then issue a single `\insertAllCited{}` directive to produce a list of all cited references. For this to work the `DESCRIPTION` file of the package needs to be amended, see below the full details. ## Preparation To prepare a package for importing BibTeX references it is necessary to tell the package management tools that package Rdpack and its Rd macros are needed. The references should be put in file `inst/REFERENCES.bib`. These steps are enumerated below in somewhat more detail, see also the vignette [`Inserting_bibtex_references`](https://cran.r-project.org/package=Rdpack). 1. Add the following lines to file "DESCRIPTION": Imports: Rdpack RdMacros: Rdpack Make sure the capitalisation of `RdMacros:` is as shown. If the field `RdMacros:` is already present, add "Rdpack" to the list on that line. Similarly for field "Imports:". 2. Add the following line to file "NAMESPACE": importFrom(Rdpack,reprompt) The equivalent line for `roxygen2` is #' @importFrom Rdpack reprompt 3. Create file `REFERENCES.bib` in subdirectory `inst/` of your package and put the BibTeX references in it. ## Inserting references Once the steps outlined above are done, references can be inserted in the documentation as \insertRef{key}{package} where `key` is the bibtex key of the reference and `package` is your package. This works in `Rd` files and in `roxygen` documentation chunks. Usually references are put in section `references`. In an `Rd` file this might look something like: \references{ \insertRef{Rdpack:bibtex}{Rdpack} \insertRef{R}{bibtex} } The equivalent `roxygen2` documentation chunk would be: #' @references #' \insertRef{Rpack:bibtex}{Rdpack} #' #' \insertRef{R}{bibtex} The first line above inserts the reference with key `Rpack:bibtex` in Rdpack's REFERENCES.bib. The second line inserts the reference labeled `R` in file REFERENCES.bib from package `bibtex`. The example above demonstrates that references from other packages can be inserted (in this case `bibtex`), as well. This is strongly discouraged for released versions but is convenient during development. One relatively safe use is when the other package is also yours - this allows authors of multiple packages to not copy the same refences to each of their own packages. For further details see the vignette [`Inserting_bibtex_references`](https://cran.r-project.org/package=Rdpack) or open it from `R`: vignette("Inserting_bibtex_references", package = "Rdpack") (The latest version of the vignette is at [`Inserting_bibtex_references (development version on github)`](https://github.com/GeoBosh/Rdpack/blob/master/vignettes/Inserting_bibtex_references.pdf).) ## Inserting citations From version 0.6-1 of "Rdpack", additional Rd macros are available for citations. They can be used in both Rd and roxygen2 documentation. `\insertCite{key}{package}` cites `key` and records it for use by `\insertAllCited`, see below. `key` can contain more keys separated by commas. `\insertCite{parseRd,Rpack:bibtex}{Rdpack}` produces (Murdoch 2010; Francois 2014) and `\insertCite{Rpack:bibtex}{Rdpack}` gives (Francois 2014). By default the citations are parenthesised: `\insertCite{parseRd}{Rdpack}` produces (Murdoch 2010). To get textual citations, like Murdoch (2010), put the string `;textual` at the end of the key. The references in the last two sentences would be produced with `\insertCite{parseRd}{Rdpack}` and `\insertCite{parseRd;textual}{Rdpack}`, respectively. This also works with several citations, e.g. `\insertCite{parseRd,Rpack:bibtex;textual}{Rdpack}` produces: Murdoch (2010); Francois (2014). The macro `\insertNoCite{key}{package}` records one or more references for `\insertAllCited` but does not cite it. Setting `key` to `*` will include all references from the specified package. For example, `\insertNoCite{R}{bibtex}` and `\insertNoCite{*}{utils}` record the specified references for inclusion by `\insertAllCited`. `\insertAllCited` inserts all references cited with `\insertCite` or `\insertNoCite`. Putting this macro in the references section will keep it up to date automatically. The Rd section may look something like: \insertAllCited{} or, in roxygen2, the references chunk might look like this: #' @references #' \insertAllCited{} To mix the citations with other text, such as \`\`see also'' and \`\`chapter 3'', write the list of keys as a free text, starting it with the symbol `@` and prefixing each key with it. The `@` symbol will not appear in the output. For example, the following code \insertCite{@see also @parseRd and @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd; @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} produces: (see also Murdoch 2010 and Francois 2014) (see also Murdoch 2010; Francois 2014) see also Murdoch (2010) and Francois (2014) — `\insertCiteOnly{key}{package}` is as `\insertCite` but does not include the key in the list of references for `\insertAllCited`. ## Changing the style of references Bibliography styles for lists of references are supported from Rdpack (>= 0.8). Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested. To cause all lists of references produced by `\insertAllCited` in a package to appear with full names, add `.onLoad()` function to your package. If you don't have `.onLoad()`, just copy the following definition: .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } If you already have `.onLoad()`, add the line containing the `Rdpack::Rdpack_bibstyles` call to it. After installling/reloading your package the lists of references should appear with long author names. "Rdpack" itself now uses this style. ## Troubleshooting ### A puzzling message in devtools development mode The described procedure works transparently in `roxygen2` chunks and with Hadley Wickham's package `devtools`. Packages are built and installed properly with the `devtools` commands and the references are processed as expected. Currently (2017-08-04) if you run help commands `?xxx` for functions from the package you are working on *in developement mode* and their help pages contain references, you may encounter some puzzling warning messages, something like: 1: In tools::parse_Rd(path) : ~/mypackage/man/abcde.Rd: 67: unknown macro '\insertRef' These warnings are harmless and can be ignored — the help pages are built properly and no warnings appear outside *developer's mode*, e.g. in a separate R session1. Even better, use the function `viewRd()` described below to view the required help file. ### Typical errors The functions underlying the processing of references and citations intercept errors, such as missing BibTeX labels or badly formed items in REFERENCES.bib, and issue informative warnings during the building and installation of the package, so that the developer is alerted but the package can still be built and installed. In these cases the functions usually insert a suitable text in the documentation, as well. If you encounter a situation contradicting this description, it is probably a bug — please report it (but check first for the typical errors listed below). A non-decipherable error message is probably caused by one of the following typical errors: - misspelled `RdMacros:` field in file DESCRIPTION. The safest way to avoid this is to copy it from the DESCRIPTION file of a working package. - omitted second argument of a reference or citation macro. Most of these macros have the package name as a second argument. These errors occur during parsing of the Rd files, before the control is passed to the `Rdpack`'s macros. ## Latex markup in BibTeX entries In principle, BibTeX entries may contain arbitrary Latex markup, while the Rd format supports only a subset. As a consequence, some BibTeX entries may need some editing when included in REFERENCES.bib2. Only do this for entries that do not render properly or cause errors, since most of the time this should not be necessary. If mathematics doesn't render properly replace the Latex dollar syntax with Rd's `\eqn`, e.g. `$x^2$` with `\eqn{x^2}`. This should not be needed for versions of Rdpack 0.8-4 or later. Some Latex macros may have to be removed or replaced with suitable Rd markup. Again, do this only if they cause problems, since some are supported, e.g. `\doi`. See also the overview help page, `help("Rdpack-package")`, of package `"Rdpack"`. Among other things, it contains some dummy references which illustrate the above. ## Encoding of file REFERENCES.bib If a package has a declared encoding (in file `DESCRIPTION`), `REFERENCES.bib` is read-in with that encoding3. Otherwise, the encoding of `REFERENCES.bib` is assumed to be UTF-8 (which includes ASCII as a subset). Note that BibTeX entries downloaded from online databases and similar sources may contain unexpected characters in other encodings, e.g. 'latin1'. In such cases the check tools in R-devel (since about 2018-10-01) may give warnings like: prepare_Rd: input string 1 is invalid in this locale To resolve this, convert the file to the declared encoding or UTF-8. Alternatively, replace the offending symbols with their classic TeX/LaTeX equivalents (which are ASCII). Non-ASCII symbols in BibTeX entries obtained from online databases are often in fields like "Abstract", which are normally not included in lists of references and can be deleted from REFERENCES.bib. One way to check for non-ASCII symbols in a file is `tools::showNonASCIIfile()`. Internally, LaTeX sequences standing for accented Latin characters, such as `\'e` and `\"o`, are converted to UTF-8. So, even if the file REFERENCES.bib is pure ASCII, it may implicitly give raise to non-ASCII characters. This may cause R's checking tools to complain about non-ASCII characters even after it has been verified that there are none. If this happens, add the encoding declaration to file DESCRIPTION4: Encoding: UTF-8 Needless to say, make sure that there are really no characters from encodings like 'latin1'. # Viewing Rd files A function, `viewRd()`, to view Rd files in the source directory of a package was introduced in version 0.4-23 of `Rdpack`. A typical user call would look something like: Rdpack::viewRd("./man/filename.Rd") By default the requested help page is shown in text format. To open the page in a browser, set argument 'type' to "html": Rdpack::viewRd("./man/filename.Rd", type = "html") `viewRd()` renders references and citations correctly, since it understands Rd macros. Users of 'devtools' can use `viewRd` in place of `help()` to view rendered Rd sources in development mode. This should work also in development mode on any platform (e.g. RStudio, Emacs/ESS, Rgui). # Using Rdpack::reprompt() ## What it does `Rdpack::reprompt()` updates `Rd` documentation. In the most common case when it is called on an `Rd` file, it updates the documentation of all functions, methods and classes documented in the file. For functions this includes updating the usage section, adding missing aliases and `\item`'s for arguments not described yet. For methods and classes entries for new methods and slots are updated in a similar way. See the documentation for details. `Rdpack::reprompt()` can also be invoked on an object or the name of an object, just as `utils::prompt`. In that case it checks for installed documentation for the object and works on it if found. Otherwise it creates an `Rd` file with initial content similar to the one generated by `utils::prompt` but modified so that the package can be built. If a new function, say `newfun` is to be documented in an existing Rd file, just add `newfun()` to the usage section in the file and call `Rdpack::reprompt()` to insert the correct usage statement, add an alias, and add items for any new arguments. Put quotes around the function name if it is non-syntactic. For replacement functions (functions with names ending in `<-`) `reprompt()` will insert the proper usage statement. For example, if the signature of `xxx<-` is `(x, ..., value)`, then both, `"xxx<-"()` and `xxx() <- value` will be replaced by `xxx(x, ...) <- value`. `Rdpack::reprompt()` **does not remove** anything that has become obsolete but it alerts the user to remove aliases, methods, and descriptions of arguments that have been removed. ## Reprompt and open in an editor To open the `reprompt()`-ed file, argument `edit` can be used. For this to work, `options("editor")` needs to be set suitably but it usually is. If `edit = TRUE`, then `Rdpack::reprompt()` will open the Rd file in an editor. For more convenient access to this feature, use `Rdpack::ereprompt()` (edit reprompt), which calls `Rdpack::reprompt()` with `edit = TRUE` and sets the output filename to be the same as the input filename. In RStudio, `reprompt()` can be invoked on the `Rd` file being edited or the selected name of an object in a source code file using RStudio add-in `Repropmpt` (contributed by Duncan Murdoch). Obviously, this makes sense only for Rd files not generated by `roxygen2`. In Emacs/ESS there are various ways to use `Rdpack::reprompt()` and `Rdpack::ereprompt()`. If `options("editor")` is set to `emacsclient`, `Rdpack::ereprompt` is one option. It can also be assigned to a key (wrapped in Elisp code), for example to be invoked on the currently edited file. Such a function and example key binding can be found at [georgisemacs](https://github.com/GeoBosh/georgisemacs). # Inserting evaluated examples `Rdpack` provides a macro that takes a chunk of R code, evaluates it, and includes both the code and the results in the rendered documentation. The layout is similar to that in the R console but the code is not prefixed with anything and the output is prefixed with comment symbols. For example, \printExample{2+2; a <- 2*3; a} gives 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 The help page of `?Rdpack::promptUsage` contains a number of examples created with `\printExample`. The corresponding Rd file can be obtained from the package tarball or from . Vignette [`Inserting_figures_and_evaluated_examples`](https://github.com/GeoBosh/Rdpack/blob/master/vignettes/Inserting_figures_and_evaluated_examples.pdf) gives further details. ## Evaluating the examples in section Examples The macro `\runExamples` can be used as a replacement of section `examples`. For example, if the following code is put at the top level in an Rd file (i.e. not in a section): \runExamples{2+2; a <- 2*3; a} then it will be evaluated and replaced by a normal section examples: \examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 } This generated examples section is processed by the standard R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files5. A small example package using this feature is at [runExamplesCheck](https://github.com/GeoBosh/reprexes/tree/master/runExamplesCheck). # Inserting figures/graphs/plots Figures can be inserted with the help of the standard Rd markup command `\figure`. To generate figures on the fly, package `"Rdpack"` provides the Rd macro `\insertFig` which takes a snipped of R code, evaluates it and inserts the plot produced by it (using `\figure`). `\insertFig` takes three arguments: a filename, the package name and the code to evaluate to produce the figure. For example, \insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)} will evaluate the code, save the graph in file `"man/figures/cars.png"` subdirectory of package `"mypackage"`, and include the figure using `\figure`. See vignette [`Inserting_figures_and_evaluated_examples`](https://github.com/GeoBosh/Rdpack/blob/master/vignettes/Inserting_figures_and_evaluated_examples.pdf) for more details. # Versions of Rdpack Versions of `Rdpack` on Github are almost always fully functional (at least passing `R CMD check --as-cran`), and so use a three-part version number. If a version is really unstable, I would use the conventional fourth part `.9000`. For release on CRAN, the version is incremented to `x.x.0`6. Note that if `Rdpack (>= x.x.0)` is required, it can be abbreviated to `Rdpack (>= x.x)`. # Footnotes 1 If you care, here is what happens. These warnings appear because `devtools` reroutes the help command to process the developer's Rd sources (rather than the documentation in the installed directory) but doesn't tell `parse_Rd` where to look for additional macros. Indeed, the message above shows that the error is in processing a source Rd file in the development directory of the package and that the call to `parse_Rd` specifies only the file. 2 Thanks to Michael Dewey for suggesting the discussion of this. 3 From `Rdpack (>=0.9-1)` The issue of not handling the encoding was raised by Professor Brian Ripley. 4 Admittedly, this is not ideal since the user should not need to care how things are processed internally but I haven't pinpointed the exact cause for this. 5 In versions of `R` before `3.6.0` the macro `\runExamples` may cause `R CMD check` to give a warning warning about unknown `\Sexpr` section at top level. 6 I adopted this versionning scheme from `Rdpack 0.7.0`. Rdpack/man/0000755000176200001440000000000013521262240012226 5ustar liggesusersRdpack/man/Rdo_insert.Rd0000644000176200001440000000245513501141722014632 0ustar liggesusers\name{Rdo_insert} \alias{Rdo_insert} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Insert a new element in an Rd object possibly surrounding it with new lines } \description{ Insert a new element in an Rd object possibly surrounding it with new lines. } \usage{ Rdo_insert(rdo, val, newline = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} \item{val}{the content to insert, an Rd object.} \item{newline}{a logical value, controls the insertion of new lines before and after \code{val}, see `Details'. } } \details{ Argument \code{val} is inserted in \code{rdo} at an appropriate position, see \code{\link{Rdo_get_insert_pos}} for detailed explanation. If \code{newline} is TRUE, newline elements are inserted before and after \code{val} but only if they are not already there. Typically, \code{val} is a section of an Rd object and \code{rdo} is an Rd object which is being constructed or modified. } \value{ an Rd object } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/Rd_combo.Rd0000644000176200001440000000246413501141722014246 0ustar liggesusers\name{Rd_combo} \alias{Rd_combo} %- Also NEED an '\alias' for EACH other topic documented here. \title{Manipulate a number of Rd files} \description{Manipulate a number of Rd files.} \usage{ Rd_combo(rd, f, ..., .MORE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rd}{names of Rd files, a character vector.} \item{f}{function to apply, see Details.} \item{\dots}{further arguments to pass on to \code{f}.} \item{.MORE}{another function to be applied for each file to the result of \code{f}.} } \details{ \code{Rd_combo} parses each file in \code{rd}, applies \code{f} to the Rd object, and applies the function \code{.MORE} (if supplied) on the results of \code{f}. A typical value for \code{.MORE} is \code{reprompt} or another function that saves the resulting Rd object. todo: \code{Rd_combo} is already useful but needs further work. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ \dontrun{ rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) Rd_combo(rdnames, reprompt) for(nam in rdnames) try(reprompt(nam)) for(nam in rdnames) try(reprompt(nam, sec_copy=FALSE)) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Rd} %\keyword{Rdprocessing} Rdpack/man/Rdo_fetch.Rd0000644000176200001440000000633013501141722014413 0ustar liggesusers\name{Rdo_fetch} \alias{Rdo_fetch} %- Also NEED an '\alias' for EACH other topic documented here. \title{Get help pages as Rd objects} \description{ Get a help page as an Rd object from an installed or source package. } \usage{ Rdo_fetch(Rd_name = character(0), package, dir = ".", installed = TRUE) } \arguments{ \item{Rd_name}{ names of one or more Rd help pages. \code{name} here is the name of an Rd file stripped from the extension. } \item{package}{ the package from which to get the Rd object, a character string. } \item{dir}{ a character string giving the root directory of a source package. Used only if \code{package} is missing. } \item{installed}{ if \code{TRUE}, the default, the Rd object is taken unconditionally from the installed \code{package}. If \code{FALSE}, the help page may be taken from a source tree, if appropriate (typically if \code{package} is in `developer's mode under devtools, see Details). } } \details{ If \code{Rd_name} is a character string (typical use case), the corresponding help page is returned as an object from class \code{"Rd"}. If the length of \code{Rd_name} is greater than one, the result is a Rd_named list containing the corresponding \code{"Rd"} objects. The default \code{Rd_name = character(0)} requests all Rd pages in the package. Note that \code{Rd_name} does not contain the extention \code{".Rd"} but the names in the returned list do. Argument \code{package} names the package from which to fetch the documentation object. With the default \code{installed = TRUE} the object is taken unconditionally from the installed package. To get it from the source tree of a package, use argument \code{"dir"} instead. The default, \code{""}, for \code{dir} is suitable for workflows where the working directory is the root of the desired package. Argument \code{installed} concerns primarily development under package \code{"devtools"}. \code{"devtools"} intercepts and modifies several base \R commands, concerning access to system files and getting help, with the aim of rerouting them to the source trees of packages under developer's mode. If argument \code{installed} is \code{TRUE}, the default, the requested pages are taken from the installed package, even if it is in development mode. If argument \code{installed} is \code{FALSE}, the Rd objects are taken from the corresponding source tree, if the specified package is under developer's mode, and from the installed package otherwise. Argument \code{Rd_name} is the name used in the \code{\\name} section of Rd files. When working off the source tree of a package, \code{Rdo_fetch} processes the Rd files, so \code{roxygen2} users need to update them if necessary. } \value{ if \code{length(Rd_name) = 1}, an object of class \code{"Rd"}, otherwise a list of \code{"Rd"} objects. } \author{Georgi N. Boshnakov} %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ ## get a single help page rdo <- Rdo_fetch("viewRd", package = "Rdpack") Rdo_show(rdo) ## get a list of help pages rdo <- Rdo_fetch(c("viewRd", "reprompt"), package = "Rdpack") names(rdo) } \keyword{documentation} % use one of RShowDoc("KEYWORDS") Rdpack/man/reprompt.Rd0000644000176200001440000003452613501141722014376 0ustar liggesusers\name{reprompt} \alias{reprompt} \title{Update the documentation of a topic} \description{Examine the documentation of functions, methods or classes and update it with additional arguments, methods or slots, as appropriate. This is an extention of the promptXXX() family of functions. } \usage{ reprompt(object, infile = NULL, Rdtext = NULL, final = TRUE, type = NULL, package = NULL, methods = NULL, verbose = TRUE, filename = NULL, sec_copy = TRUE, edit = FALSE, \dots) } \arguments{ \item{object}{the object whose documentation is to be updated, such as a string, a function, a help topic, a parsed Rd object, see `Details'.} \item{infile}{a file name containing Rd documentation, see `Details'.} \item{Rdtext}{a character string with Rd formatted text, see `Details'.} \item{final}{logical, if \code{TRUE} modifies the output of \code{prompt} so that the package can be built.} \item{type}{type of topic, such as \code{"methods"} or \code{"class"}, see `Details'.} \item{package}{package name; document only objects defined in this package, especially useful for methods, see `Details'.} \item{methods}{ used for documentation of S4 methods only, rarely needed even for them. This argument is passed on to \code{\link[methods]{promptMethods}}, see its documentation for details. } \item{verbose}{if \code{TRUE} print messages on the screen.} \item{filename}{name of the file for the generated Rd content; if \code{NULL}, a suitable file name is generated, if \code{TRUE} it will be set to \code{infile}, if \code{FALSE} the Rd text is returned, see `Details'.} \item{\dots}{currently not used.} \item{sec_copy}{if \code{TRUE} copy Rd contents of unchanged sections in the result, see Details.} \item{edit}{if \code{TRUE} call \code{file.edit} just before returning. This argument is ignored if \code{filename} is \code{FALSE}.} } \details{ The typical use of \code{reprompt} is with one argument, as in \preformatted{ reprompt(infile = "./Rdpack/man/reprompt.Rd") reprompt(reprompt) reprompt("reprompt") } \code{reprompt} updates the requested documentation and writes the new Rd file in the current working directory. When argument \code{infile} is used, the descriptions of all objects described in the input file are updated. When an object or its name is given, \code{reprompt} looks first for installed documentation and processes it in the same way as in the case of \code{infile}. If there is no documentation for the object, \code{reprompt} creates a skeleton Rd file similar to the one produced by the base R functions from the \code{prompt} family (if \code{final = TRUE}, the default, it modifies the output of \code{prompt()}, so that the package can be built). To document a function, say \code{myfun}, in an existing Rd file, just add \code{myfun()} to the usage section in the file and call \code{reprompt()} on that file. Put quotes around the function name if it is non-syntactic. For replacement functions (functions with names ending in \code{<-}) \code{reprompt()} will insert the proper usage statement. For example, if the signature of \code{xxx<-} is \code{(x, ..., value)} then both, \code{"xxx<-"()} and \code{xxx() <- value} will be replaced by \code{xxx(x, ...) <- value}. For S4 methods and classes the argument "package" is often needed to restrict the output to methods defined in the package of interest. \preformatted{ reprompt("myfun-methods") reprompt("[<--methods", package = "mypackage") reprompt("[<-", type = "methods", package = "mypackage") # same reprompt("myclass", type = "class", package = "mypackage") reprompt("myclass-class", package = "mypackage") # same } Without the "package" argument the reprompt for \code{"[<-"} would give all methods defined by loaded packages at the time of the call. Currently \code{reprompt} functionality is not implemented for topic "package" but if \code{object} has the form "name-package" (or the equivalent with argument \code{topic}) and there is no documentation for \code{package?name}, \code{reprompt} calls \code{\link{promptPackageSexpr}} to create the required shell. Note that the shell produced by \code{promptPackageSexpr} does not need `reprompting' since the automatically generated information is included by \verb{\Sexpr}'s, not literal strings. Below are the details. Typically, only one of \code{object}, \code{infile}, and \code{Rdtext} is supplied. Warning messages are issued if this is not the case. The object must have been made available by the time when \code{reprompt()} is issued. If the object is in a package this is typically achieved by a \code{library()} command. \code{object} may be a function or a name, as accepted by the \code{?} operator. If it has the form "name-class" and "name-methods" a documentation shell for class "name" or the methods for generic function "name" will be examined/created. Alternatively, argument \code{type} may be set to "class" or "methods" to achieve the same effect. \code{infile} specifies a documentation file to be updated. If it contains the documentation for one or more functions, \code{reprompt} examines their usage statements and updates them if they have changed. It also adds arguments to the "arguments" section if not all arguments in the usage statements have entries there. If \code{infile} describes the methods of a function or a class, the checks made are as appropriate for them. For example, new methods and/or slots are added to the corresponding sections. It is all too easy in interactive use to forget to name the \code{infile} argument, compare\cr \code{reprompt("./man/reprompt.Rd")} vs. \code{reprompt(infile = "./man/reprompt.Rd")}).\cr A convenience feature is that if \code{infile} is missing and \code{object} is a character string ending in ".Rd" and containing a forward slash (i.e. it looks like Rd file in a directory), then it is taken to be \code{infile}. \code{Rdtext} is similar to \code{infile} but the Rd content is taken from a character vector. If Rd content is supplied by \code{infile} or \code{Rdtext}, \code{reprompt} uses it as a basis for comparison. Otherwise it tries to find installed documentation for the object or topic requested. If that fails, it resorts to one of the \code{promptXXX} functions to generate a documentation shell. If that also fails, the requested object or topic does not exist. If the above succeeds, the function examines the current definition of the requested object(s), methods, or class and amends the documentation with any additional items it finds. For Rd objects describing one or more functions, the usage expressions are checked and replaced, if they have changed. Arguments appearing in one or more usage expressions and missing from section "Arguments" are amended to it with content "Describe ..." and a message is printed. Arguments no longer in the usage statements are NOT removed but a message is issued to alert the user. Alias sections are inserted for any functions with "usage" but without "alias" section. If \code{filename} is a character string, it is used as is, so any path should be included in the string. Argument \code{filename} usuallly is omitted since the automatically generated file name is suitable in most cases. Exceptions are functions with non-standard names (such as replacement functions whose names end in \code{"<-"}) for which the generated file names may not be acceptable on some operating systems. If \code{filename} is missing or \code{NULL}, a suitable name is generated as follows. If \code{infile} is supplied, \code{filename} is set to a file with the same name in the current working directory (i.e. any path information in \code{infile} is dropped). Otherwise, \code{filename} is obtained by appending the name tag of the Rd object with \code{".Rd"}. If \code{filename} is \code{TRUE}, it is set to \code{infile} or, if \code{infile} is missing or \code{NULL}, a suitable name is generated as above. This can be used to change \code{infile} in place. If \code{filename} is \code{FALSE}, the Rd text is returned as a character vector and not written to a file. If \code{edit} is \code{TRUE}, the reprompted file is opened in an editor, see also \code{\link{ereprompt}} (`e' for `edit') which is like \code{reprompt} but has as default \code{edit = TRUE} and some other related settings. \code{file.edit()} is used to call the editor. Which editor is opened depends on the OS and on the user configuration. RStudio users will probably prefer the 'Reprompt' add-in or the underlying function \code{\link{RStudio_reprompt}}. Emacs users would normally have set up \code{emacsclient} as their editor and this is automatically done by EMACS/ESS (even on Windows). If argument \code{sec_copy} is \code{TRUE} (the default), \code{reprompt} will, effectively, copy the contents of (some) unchanged sections, thus ensuring that they are exactly the same as in the original. This needs additional work, since parsing an Rd file and then exporting the created Rd object to an Rd file does not necessarilly produce an identical Rd file (some escape sequences may be changed in the process, for example). Even though the new version should be functionally equivalent to the original, such changes are usually not desirable. For example, if such changes creep into the Details section (which \code{reprompt} never changes) the user may be annoyed or worried. } \value{ if \code{filename} is a character string or \code{NULL}, the name of the file to which the updated shell was written. Otherwise, the Rd text is returned as a character vector. } \author{Georgi N. Boshnakov} \note{ The arguments of \code{reprompt} are similar to prompt, with some additions. As in \code{prompt}, \code{filename} specifies the output file. In \code{reprompt} a new argument, \code{infile}, specifies the input file containing the Rd source. When \code{reprompt} is used to update sources of Rd documentation for a package, it is best to supply the original Rd file in argument \code{infile}. Otherwise, if the original Rd file contains \verb{\Sexpr} commands, \code{reprompt} may not be able to recover the original Rd content from the installed documentation. Also, the fields (e.g. the keywords) in the installed documentation may not be were you expect them to be. (This may be addressed in a future revision.) While \code{reprompt} adds new items to the documentation, it never removes existing content. It only issues a suggestion to remove an item, if it does not seem necessary any more (e.g. a removed argument from a function definition). \code{reprompt} handles usage statements for S3 and S4 methods introduced with any of the macros \verb{\method}, \verb{\S3method} and \verb{\S4method}, as in \verb{\method{fun}{class}(args...)}. Usage statements for functions are split over two or more lines if necessary. The user may edit them afterwards if the automatic splitting is not appropriate, see below. The usage section of Rd objects describing functions is left intact if the usage has not changed. To force \code{reprompt} to recreate the usage section (e.g. to reformat long lines), invalidate the usage of one of the described functions by removing an argument from its usage expression. Currently the usage section is recreated completely if the usage of any of the described functions has changed. Manual formatting may be lost in such cases. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{ereprompt}} which by default calls the editor on the original file } \examples{ ## note: usage of reprompt() is simple. the examples below are bulky ## because they simulate various usage scenarios with commands, ## while in normal usage they would be due to editing. ## change to a temporary directory to avoid clogging up user's cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## as for prompt() the default is to save in current dir as "seq.Rd". ## the argument here is a function, reprompt finds its doc and ## updates all objects described along with `seq'. ## (In this case there is nothing to update, we have not changed `seq'.) fnseq <- reprompt(seq) ## let's parse the saved Rd file (the filename is returned by reprompt) rdoseq <- tools::parse_Rd(fnseq) # parse fnseq to see the result. Rdo_show(rdoseq) ## we replace usage statements with wrong ones for illustration. ## (note there is an S3 method along with the functions) dummy_usage <- char2Rdpiece(paste("seq()", "\\\\method{seq}{default}()", "seq.int()", "seq_along()", "seq_len()", sep="\n"), "usage") rdoseq_dummy <- Rdo_replace_section(rdoseq, dummy_usage) Rdo_show(rdoseq_dummy) # usage statements are wrong reprompt(rdoseq_dummy, file = "seqA.Rd") Rdo_show(tools::parse_Rd("seqA.Rd")) # usage ok after reprompt ## define function myseq() myseq <- function(from, to, x){ if(to < 0) { seq(from = from, to = length(x) + to) } else seq(from, to) } ## we wish to describe myseq() along with seq(); ## it is sufficient to put myseq() in the usage section ## and let reprompt() do the rest rdo2 <- Rdo_modify_simple(rdoseq, "myseq()", "usage") reprompt(rdo2, file = "seqB.Rd") # updates usage of myseq ## show the rendered result: Rdo_show(tools::parse_Rd("seqB.Rd")) ## Run this if you wish to see the Rd file: ## file.show("seqB.Rd") reprompt(infile = "seq.Rd", filename = "seq2.Rd") reprompt(infile = "seq2.Rd", filename = "seq3.Rd") ## Rd objects for installed help may need some tidying for human editing. #hseq_inst <- help("seq") #rdo <- utils:::.getHelpFile(hseq_inst) rdo <- Rdo_fetch("seq", "base") rdo rdo <- Rdpack:::.Rd_tidy(rdo) # tidy up (e.g. insert new lines # for human readers) reprompt(rdo) # rdo and rdoseq are equivalent all.equal(reprompt(rdo), reprompt(rdoseq)) # TRUE ## clean up unlink("seq.Rd") # remove temporary files unlink("seq2.Rd") unlink("seq3.Rd") unlink("seqA.Rd") unlink("seqB.Rd") setwd(cur_wd) # restore user's working directory unlink(tmpdir) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Rd} Rdpack/man/insert_ref.Rd0000644000176200001440000001464013501141722014661 0ustar liggesusers\name{insert_ref} \alias{insert_ref} \alias{insertRef} \alias{insert_citeOnly} \title{Insert bibtex references in Rd and roxygen2 documentation} \description{ Package Rdpack provides Rd macros for inserting references and citations from bibtex files into R documentation. Function insert_ref() is the workhorse behind this mechanism. The description given in this page should be sufficient, for more details see the vignette. } \usage{ insert_ref(key, package = NULL, ...) } \arguments{ \item{key}{the bibtex key of the reference, a character string.} \item{package}{the package in which to look for the the bibtex file.} \item{\dots}{further arguments to pass on to \code{bibtex::read.bib}} } \details{ \code{insert_ref} extracts a reference from a bibtex file, converts it to Rd format and returns a single string with embedded newline characters. It is the workhorse in the provided mechanism but most users do not even need to know about \code{insert_ref}. The documentation of a package using the mechanism provided here relies on the Rd macro \verb{\\insertRef}. The description below assumes that \pkg{Rdpack} has been added to file DESCRIPTION, as described in \code{\link{Rdpack-package}} and the vignettes. References can be inserted in documentation using the syntax \verb{\\insertRef{key}{package}}, where \verb{key} is the bibtex key of the reference and \verb{package} is an R package containing file \code{"REFERENCES.bib"} from which the reference should be taken. This works in manually written Rd files and in `roxygen2' documentation chunks. The references will appear in the place where the macro is put, usually in a dedicated references section (\verb{\\references} in Rd files, \verb{@references} in roxygen chunks). Argument 'package' can be any installed R package, not necessarily the one of the documentation object. This works for packages that have \code{"REFERENCES.bib"} in their installation directory and for the default packages. For example, the references in the references section of this help page are generated by the following lines in the Rd file: \preformatted{ \\insertRef{Rpack:bibtex}{Rdpack} \\insertRef{R}{bibtex} } A roxygen2 documentation chunk might look like this: \preformatted{ #' @references #' \\insertRef{Rpack:bibtex}{Rdpack} #' #' \\insertRef{R}{bibtex} } The first reference has label \verb{Rpack:bibtex} and is taken from file \code{"REFERENCES.bib"} in package \pkg{Rdpack}. The second reference is from the file with the same name in package \pkg{bibtex}. For more details see vignette: \code{vignette("Inserting_bibtex_references", package = "Rdpack")} The references are processed when the package is built. From version 0.6-1 of \pkg{Rdpack}, additional Rd macros are available for citations. They can be used in Rd and roxygen2 documentation. \code{\\insertCite{key}{package}} cites the key and records it for use by \code{\\insertAllCited}, see below. \code{key} can contain more keys separated by commas. \tabular{ll}{ \code{\\insertCite{parseRd,Rpack:bibtex}{Rdpack}} \tab \insertCite{parseRd,Rpack:bibtex}{Rdpack} \cr \code{\\insertCite{Rpack:bibtex}{Rdpack}} \tab \insertCite{Rpack:bibtex}{Rdpack} } By default the citations are parenthesised \insertCite{parseRd}{Rdpack}. To get textual citations, like \insertCite{parseRd;textual}{Rdpack}, put the string \code{;textual} at the end of the key. The references in the last two sentences were produced with \code{\\insertCite{parseRd}{Rdpack}} and \code{\\insertCite{parseRd;textual}{Rdpack}}, respectively. This also works with several citations, e.g. \cr \code{\\insertCite{parseRd,Rpack:bibtex;textual}{Rdpack}} produces: \insertCite{parseRd,Rpack:bibtex;textual}{Rdpack}. The macro \code{\\insertNoCite{key}{package}} records one or more references for \code{\\insertAllCited} but does not cite it. Setting \code{key} to \code{*} will include all references from the specified package. For example, \code{\\insertNoCite{R}{bibtex}} and \code{\\insertNoCite{*}{utils}} record the specified references for inclusion by \code{\\insertAllCited}. \code{\\insertAllCited} inserts all references cited with \code{\\insertCite} or \code{\\insertNoCite}. Putting this macro in the references section will keep it up to date automatically. The Rd section may look something like: \preformatted{ \\insertAllCited{} } or in roxygen2, the references chunk might look like this: \preformatted{ #' @references #' \\insertAllCited{} } To mix the citations with other text, such as \sQuote{see also} and \sQuote{chapter 3}, write the list of keys as a free text, starting it with the symbol \code{@} and prefixing each key with it. The \code{@} symbol will not appear in the output. For example, the following code \preformatted{ \insertCite{@see also @parseRd and @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd; @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} } produces: \tabular{l}{ \insertCiteOnly{@see also @parseRd and @Rpack:bibtex}{Rdpack} \cr \insertCiteOnly{@see also @parseRd; @Rpack:bibtex}{Rdpack} \cr \insertCiteOnly{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} } \code{\\insertCiteOnly{key}{package}} is as \code{\\insertCite} but does not include the key in the list of references for \code{\\insertAllCited}. % Provision to add prefixes and suffixes is also envisaged but is currently under testing and not documented. % \insertCiteOnly{parseRd,Rpack:bibtex;textual}{Rdpack/see also} % % \insertCiteOnly{parseRd,Rpack:bibtex;textual}{Rdpack/see also/Chapter 3} % % \insertCiteOnly{parseRd,Rpack:bibtex;textual}{Rdpack//Chapter 3} % % \insertCiteOnly{parseRd,Rpack:bibtex;textual}{Rdpack//, Chapter 3} } \value{ for \code{insert_ref}, a character string } \references{ For illustrative purposes there are two sets of citation below The first set of references is obtained with \code{\\insertRef} for each reference: \insertRef{Rpack:bibtex}{Rdpack} \insertRef{R}{bibtex} ---- The following references are obtained with a single \code{\\insertAllCited{}}: \insertAllCited{} } \author{Georgi N. Boshnakov} \seealso{ \code{\link{Rdpack-package}} for overview, the vignettes } \examples{ cat(insert_ref("R", package = "bibtex"), sep = "\n") } \keyword{documentation} \keyword{Rd} Rdpack/man/Rdo_piecetag.Rd0000644000176200001440000000254513501141722015107 0ustar liggesusers\name{Rdo_piecetag} \alias{Rdo_piecetag} \alias{Rdo_sectype} \alias{is_Rdsecname} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Give information about Rd elements } \description{ Give information about Rd elements. } \usage{ Rdo_piecetag(name) Rdo_sectype(x) is_Rdsecname(name) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{name}{the name of an Rd macro, a string.} \item{x}{the name of an Rd macro, a string.} } \details{ \code{Rdo_piecetag} gives the "Rd_tag" of the Rd macro \code{name}. \code{Rdo_sectype} gives the "Rd_tag" of the Rd section \code{x}. \code{is_Rdsecname(name)} returns TRUE if \code{name} is the name of a top level Rd section. The information returned by these functions is obtained from the charater vectors \code{Rdo_piece_types} and \code{Rdo_predefined_sections}. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Rdo_piece_types}} and \code{\link{Rdo_predefined_sections}} } \examples{ Rdo_piecetag("eqn") # ==> "VERB" Rdo_piecetag("code") # ==> "RCODE" Rdo_sectype("usage") # ==> "RCODE" Rdo_sectype("title") # ==> "TEXT" Rdo_sectype("arguments") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoProgramming} Rdpack/man/format_funusage.Rd0000644000176200001440000000517213501141722015706 0ustar liggesusers\name{format_funusage} \alias{format_funusage} %- Also NEED an '\alias' for EACH other topic documented here. \title{Format the usage text of functions} \description{Formats the usage text of a function so that each line contains no more than a given number of characters.} \usage{ format_funusage(x, name = "", width = 72, realname) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{a character vector containing one element for each argument of the function, see `Details'.} \item{name}{the name of the function whose usage is described, a string.} \item{width}{maximal width of each line of output.} \item{realname}{the printed form of \code{name}, see `Details', a string.} } \details{ \code{format_funusage} formats the usage text of a function for inclusion in Rd documentation files. If necessary, it splits the text into more lines in order to fit it within the requested width. Each element of argument \code{x} contains the text for one argument of function \code{name} in the form \code{arg} or \code{arg = default}. \code{format_funusage} does not look into the content of \code{x}, it does the necessary pasting to form the complete usage text, inserting new lines and indentation to stay within the specified width. Elements of \code{x} are never split. If an argument (i.e., element of \code{x}) would cause the width to be exceeded, the entire argument is moved to the following line. The text on the second and subsequent lines of each usage item starts in the column just after the opening parenthesis which follows the name of the function on the first line. In descriptions of S3 methods and S4 methods, argument \code{name} may be a TeX macro like \verb{\method{print}{ts}}. In that case the number of characters in \code{name} has little bearing on the actual number printed. In this case argument \code{realname} is used for counting both the number of characters on the first line of the usage message and the indentation for the subsequent lines. } \value{ The formatted text as a length one character vector. } \author{Georgi N. Boshnakov} \note{ Only the width of \code{realname} is used (for counting). The formatted text contains \code{name}. The width of strings is determined by calling \code{nchar} with argument \code{type} set to "width". } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{deparse_usage1}} } \examples{ # this function is essentially internal, # see deparse_usage1 and as.character.f_usage which use it. } %\keyword{RdoProgramming} \keyword{RdoUsage} %\keyword{RdFunction} Rdpack/man/promptUsage.Rd0000644000176200001440000001476713501141722015041 0ustar liggesusers\name{promptUsage} \alias{promptUsage} \alias{get_usage} \title{Generate usage text for functions and methods} \description{ Generates usage text for a function, S3 method or S4 method. The text is suitably formatted for inclusion in the usage section of Rd documentation. } \usage{ get_usage(object, name = NULL, force.function = FALSE, \dots, S3class = "", S4sig = "", infix = FALSE, fu = TRUE, out.format = "text") promptUsage(\dots, usage) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{a function object or a character name of one, can be anonymous function.} \item{name}{the name of a function, a string.} \item{force.function}{enforce looking for a function.} \item{S3class}{the S3 class of the function, a character vector.} \item{out.format}{if "\verb{text}", return the result as a character vector.} \item{S4sig}{(the signature of an S4 method, as used in Rd macro \verb{\S4method}).} \item{infix}{if TRUE the function is an infix operator.} \item{fu}{if TRUE the object is a function, otherwise it is something else (e.g. a variable or a constant like \code{pi} and \code{Inf}). } \item{usage}{an usage object, see Details.} \item{\dots}{ for \code{promptUsage}, arguments to be passed on to \code{get_usage}; for \code{get_usage}, currently not used. } } \details{ \code{get_usage()} takes a function object, or the name of one, and creates text suitable for inclusion in the usage section of Rd documentation. The usage is generated from the function object. When in interactive \R session, use \code{cat()} to print the result for copying and pasting into Rd documentation or saving to a file (otherwise, if the usage text contains backslashes, they may appear duplicated). Long text is wrapped on two or more lines. For example, \printExample{cat( get_usage(lm) )} Argument \code{"name"} can be used to specify a print name for the function. This is most often needed for S3 methods. Compare \printExample{cat( get_usage(summary.lm) )} and \printExample{cat( get_usage(summary.lm, name = "summary") )} The call is just \code{summary()} in the latter. This fairly reflects the fact that S3 methods are normally called via the generic, but adding some explanatory text around the command is usually a good idea. For programmatically generated usage sections in help pages, argument \code{S3class} can be used to get the standard Rd markup for S3 methods. \printExample{cat( get_usage(summary.lm, "summary", S3class = "lm") )} (Note that \verb{\method} can only be used in Usage sections.) When \code{object} is an anonymous function, argument \code{name} is compulsory. For example, % this code prints ugly: \printExample{cat( get_usage(function(x = 3, y="a"){}, "f") )} % so do it manually in two steps: \code{cat( get_usage(function(x = 3, y = "a"){}, "f") )} % TODO: this is commented out from the pkgdown site, since pkgdown() doesn't handle % results=verbatim yet. %\Sexpr[stage=build,results=verbatim]{cat("##: ", get_usage(function(x = 3, y = "a"){}, "f"), "\n" )} \code{get_usage()} can also be used to insert dynamically signatures of functions located in other objects, such as environments and lists, see the examples. If a function is used as an infix operator, set \code{infix = TRUE}. \printExample{get_usage("+", infix = TRUE); get_usage("\\\%in\\\%", infix = TRUE)} The name of the operator may be in a variable: \printExample{op <- "+"; get_usage(op, infix = TRUE)} Backticks are ok, as well, \printExample{get_usage(`+`, infix = TRUE)} But if a backticked operator is in a variable, surprise springs: \printExample{op <- `+`; get_usage(op, infix = TRUE)} In this case, don't use backticks or, if you must, evaluate the argument: \printExample{op <- `+`; get_usage(eval(op), name = "+", infix = TRUE)} % \Sexpr[stage=build,results=hide]{wrap_percent <- function(x) paste0("\%", x, "\%")} % \printExample{op <- wrap_percent("in"); get_usage(op, infix = TRUE)} % \printExample{op <- as.name(wrap_percent("in")); get_usage(eval(op), name = "in", infix = TRUE)} % \printExample{op <- as.name(wrap_percent("in")); get_usage(eval(op), name = wrap_percent("in"), infix = TRUE)} % \printExample{op <- as.name(wrap_percent("in")); get_usage(`\\\%in\\\%`, name = wrap_percent("in"), infix = TRUE)} % \strong{Sexpr:} % \Sexpr[stage=build,results=verbatim]{op <- as.name(wrap_percent("in")); get_usage(eval(op), name = wrap_percent("in"), infix = TRUE)} % \Sexpr[stage=build,results=verbatim]{op} % \Sexpr[stage=build,results=verbatim]{cat(wrap_percent("in"), "\n")} % \Sexpr[stage=build,results=verbatim]{e <- environment(); ls(e)} \code{promptUsage()} is mostly for internal use. It is like \code{get_usage()} with an additional argument, \code{usage}, used to pass a specially parsed argument list of class \verb{"f_usage"}, produced by other functions in \pkg{Rdpack}. In particular it could have been generated by a previous call to \code{get_usage()}. } \value{ a character string or an object of S3 class "\verb{f_usage}", see \code{\link{pairlist2f_usage1}} for its format. } \author{Georgi N. Boshnakov} \note{ For an S3 or S4 generic, use the name of the function, not the object, see the examples. These functions are for usage descriptions as they appear in the "usage" section of Rd files. Descriptions of S4 methods for "Methods" sections are dealt with by other functions. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{parse_pairlist}} } \examples{ u <- get_usage(lm) # a long usage text cat(u) # if there are additional arguments in S3 methods, # use names of the functions, not the objects, e.g. get_usage("droplevels", S3class = "data.frame") get_usage(name = "droplevels", S3class = "data.frame") # (both give "\method{droplevels}{data.frame}(x, except = NULL, \dots)") # but this gives the args of the generic: "\method{droplevels}{data.frame}(x, \dots)" get_usage(droplevels, S3class = "data.frame") ## a list containing some functions summaries <- list(xbar = function(x) mean(x), rho = function(x, y) cor(x,y)) get_usage(summaries$xbar, name = "xbar") get_usage(summaries$rho, name = "rho") ## functions in an environment esummaries <- list2env(summaries) get_usage(esummaries$xbar, name = "xbar") get_usage(esummaries$rho, name = "rho") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{documentation} \keyword{Rd} Rdpack/man/update_aliases_tmp.Rd0000644000176200001440000000135513501141722016363 0ustar liggesusers\name{update_aliases_tmp} \alias{update_aliases_tmp} %- Also NEED an '\alias' for EACH other topic documented here. \title{Update aliases for methods in Rd objects} \description{Update aliases for methods in Rd objects} \usage{ update_aliases_tmp(rdo, package = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} \item{package}{the name of a package, a character string.} } \details{ This is a quick fix. todo: complete it! } \value{ the updated Rd object } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoS4} Rdpack/man/inspect_slots.Rd0000644000176200001440000000107113501141722015404 0ustar liggesusers\name{inspect_slots} \alias{inspect_slots} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Inspect the slots of an S4 class } \description{ Inspect the slots of an S4 class. } \usage{ inspect_slots(rdo, final = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{final}{if not TRUE insert text with suggestions, otherwise comment the suggestions out. } } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \keyword{RdoS4} Rdpack/man/Rdo_get_insert_pos.Rd0000644000176200001440000000300313501141722016340 0ustar liggesusers\name{Rdo_get_insert_pos} \alias{Rdo_get_insert_pos} \title{ Find the position of an "Rd_tag" } \description{ Find the position of an "Rd_tag". } \usage{ Rdo_get_insert_pos(rdo, tag) } \arguments{ \item{rdo}{an Rd object} \item{tag}{the "Rd_tag" to search for, a string} } \details{ This function returns a position in \code{rdo}, where the next element carrying "Rd_tag" \code{tag} should be inserted. The position is determined as follows. If one or more elements of \code{rdo} have "Rd_tag" \code{tag}, then the position is one plus the position of the last such element. If there are no elements with "Rd_tag" \code{tag}, the position is one plus the length of \code{rdo}, unless \code{tag} is a known top level Rd section. In that case, the position is such that the standard ordering of sections in an Rd object is followed. This is set in the internal variable \code{.rd_sections}. } \value{ an integer } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ #h <- help("Rdo_macro") #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") ialias <- which(tools:::RdTags(rdo) == "\\\\alias") ialias next_pos <- Rdo_get_insert_pos(rdo, "\\\\alias") # 1 + max(ialias) next_pos stopifnot(next_pos == max(ialias) + 1) ikeyword <- which(tools:::RdTags(rdo) == "\\\\keyword") ikeyword next_pos <- Rdo_get_insert_pos(rdo, "\\\\keyword") # 1 + max(ikeyword) next_pos stopifnot(next_pos == max(ikeyword) + 1) } \keyword{RdoProgramming} Rdpack/man/Rdo_get_argument_names.Rd0000644000176200001440000000245413501141722017171 0ustar liggesusers\name{Rdo_get_argument_names} \alias{Rdo_get_argument_names} %- Also NEED an '\alias' for EACH other topic documented here. \title{Get the names of arguments in usage sections of Rd objects} \description{Get the names of arguments in usage sections of Rd objects.} \usage{ Rdo_get_argument_names(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rdo object.} } \details{ All arguments names in the "arguments" section of \code{rdo} are extracted. If there is no such section, the results is a character vector of length zero. Arguments which have different descriptions for different OS'es are included and not duplicated. Arguments which have descriptions for a particular OS are included, irrespectively of the OS of the running R process. (\strong{todo:} introduce argument to control this?) } \value{ a character vector } % \references{ % %% ~put references to the literature/web site here ~ % } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } % % %% ~Make other sections like Warning with \section{Warning }{....} ~ % \seealso{ \code{\link{Rdo_get_item_labels}} } \examples{ ##---- Should be DIRECTLY executable !! ---- } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{ ~kwd1 } Rdpack/man/get_usage_text.Rd0000644000176200001440000000274213501141722015530 0ustar liggesusers\name{get_usage_text} \alias{get_usage_text} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Get the text of the usage section of Rd documentation } \description{ Get the text of the usage section of Rd documentation. } \usage{ get_usage_text(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object or a character string} } \details{ If \code{rdo} is a string, it is parsed to obtain an Rd object. The content of section "\verb{\usage}" is extracted and converted to string. } \value{ a string } \author{Georgi N. Boshnakov} \note{ todo: \code{get_usage_text} can be generalised to any Rd section but it is better to use a different approach since \code{print.Rd()} does not take care for some details (escaping \%, for example). Also, the functions that use this one assume that it returns \R code, which may not be the case if the usage section contains Rd comments. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ## get the Rd object documenting Rdo_macro #h <- utils::help("Rdo_macro", lib.loc = .libPaths()) #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") # extract the usage section and print it: ut <- get_usage_text(rdo) cat(ut, sep = "\n") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} \keyword{RdoUsage} %\keyword{RdFunction} Rdpack/man/Rdapply.Rd0000644000176200001440000001074113501141722014132 0ustar liggesusers\name{Rdapply} \alias{Rdapply} \alias{rattr} \alias{Rdtagapply} \title{Apply a function over an Rd object} \description{Apply a function recursively over an Rd object, similarly to rapply but keeping attributes.} \usage{ Rdapply(x, \dots) Rdtagapply(object, FUN, rdtag, classes = "character", how = "replace", \dots) rattr(x, y) } \arguments{ \item{x}{the Rd object on which to apply a function.} \item{object}{the Rd object on which to apply a function.} \item{FUN}{The function to apply, see details} \item{rdtag}{apply FUN only to elements whose \code{Rd_tag} attribute is \code{rdtag}.} \item{y}{an Rd object with the same structure as \code{x}, see `Details'.} \item{\dots}{arguments to pass to \code{rapply}, see `Details'.} \item{classes}{a character vector, passed on to \code{\link{rapply}}, see `Details'. } \item{how}{a character string, passed on to \code{\link{rapply}}, see `Details'. } } \details{ \code{Rdapply} works like \code{rapply} but preserves the attributes of \code{x} and (recursively) any sublists of it. \code{Rdapply} first calls \code{rapply}, passing all arguments to it. Then it restores recursively the attributes by calling \code{rattr}. Note that the object returned by \code{rapply} is assumed to have identical structure to the original object. This means that argument \code{how} of \code{rapply} must not be "unlist" and normally will be "replace". \code{Rdtagapply} gives sensible default values for \code{classes} and \code{how}. See the documentation of \code{\link{rapply}} for details and the possible choices for \code{classes}, \code{how} or other arguments passed to it via \code{"\dots"}. \code{Rdtagapply} is a convenience variant of \code{Rdapply} for the common task of modifying or examining only elements with a given \code{Rd_tag} attribute. Since the Rd equation macros \verb{\eqn} and \verb{\deqn} are assigned Rd tag "VERB" but are processed differently from other "VERB" pieces, pseudo-tags "mathVERB" and "nonmathVERB" are provided, such that "mathVERB" is for actions on the first argument of the mathematical macros \verb{\eqn} and \verb{\deqn}, while "nonmathVERB" is for actions on "VERB" macros in all other contexts. There is also a pseudo-tag "nonmath" for anything that is not math. \code{rattr} is an auxilliary function which takes two Rd objects (with identical structure) and recursively examines them. It makes the attributes of any lists in the first argument identical to the corresponding attributes in the second. } \value{ For \code{Rdapply} and \code{Rdtagapply}, an Rd object with some of its leaves replaced as specified above. For \code{rattr}, the object \code{x} with attributes of any list elements of it set to the corresponding attributes of \code{y}. } \author{Georgi N. Boshnakov} \note{ todo: may be it is better to rename the argument FUN of \code{Rdtagapply} to \code{f}, which is its name in \code{rapply}. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{rapply}} } \examples{ # create an Rd object for the sake of example u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", examples = "\na <- matrix(1:6,nrow=2)\na \%*\% t(a)\nt(a) \%*\% a", Rd_class=TRUE ) # correct R code for examples but wrong for saving in Rd files Rdo_show(u1) # escape percents everywhere except in comments # (actually, .anypercent escapes only unescaped percents) rdo <- Rdapply(u1, Rdpack:::.anypercent, classes = "character", how = "replace") # syntactically wrong R code for examples but ok for saving in Rd files Rdo_show(rdo) # Rdo2Rdf does this by default for examples and other R code, # so code can be kept syntactically correct while processing. # (reprompt() takes care of this too as it uses Rdo2Rdf for saving) fn <- tempfile("u1", fileext="Rd") Rdo2Rdf(u1, file = fn) # the saved file contains escaped percents but they disappear in parsing: file.show(fn) Rdo_show(tools::parse_Rd(fn)) # if you think that sections should start on new lines, # the following makes the file a little more human-friendly # (by inserting new lines). \dontshow{# todo: additional arg. for list_Rd for this? } u2 <- Rdpack:::.Rd_tidy(u1) Rdo2Rdf(u2, file = fn) file.show(fn) unlink(fn) } \keyword{RdoProgramming} Rdpack/man/Rdo_reparse.Rd0000644000176200001440000000300713501141722014761 0ustar liggesusers\name{Rdo_reparse} \alias{Rdo_reparse} %- Also NEED an '\alias' for EACH other topic documented here. \title{Reparse an Rd object} \description{Reparse an Rd object.} \usage{ Rdo_reparse(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} } \details{ \code{Rdo_reparse} saves \code{rdo} to a temporary file and parses it with \code{parse_Rd}. This ensures that the Rd object is a "canonical" one, since one and the same Rd file can be produced by different (but equivalent) Rd objects. Also, the functions in this package do not attend to attribute "srcref" (and do not use it) and reparsing takes care of this. (todo: check if there is a problem if the tempfile disappears.) %insertCite{@see @parseRd,@Rpack:bibtex}{Rdpack} % only for testing! \insertCite{parseRd,Rpack:bibtex}{Rdpack} % only for testing! } \references{ \insertAllCited{} % only for testing } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ # the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) dottext <- "further arguments to be passed on." rdo2 <- Rdo_append_argument(rdo, "\\dots", dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") Rdo_show(Rdo_reparse(rdo2)) # the following does ot show the arguments. (todo: why?) # (see also examples in Rdo_append_argument) Rdo_show(rdo2) unlink(fn) } \keyword{Rd} Rdpack/man/Rdo_insert_element.Rd0000644000176200001440000000251613501141722016341 0ustar liggesusers\name{Rdo_insert_element} \alias{Rdo_insert_element} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Insert a new element in an Rd object } \description{ Insert a new element at a given position in an Rd object. } \usage{ Rdo_insert_element(rdo, val, pos) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} \item{val}{the content to insert.} \item{pos}{position at which to insert \code{val}, typically an integer but may be anything accepted by the operator "[[". } } \details{ \code{val} is inserted at position \code{pos}, between the elements at positions \code{pos-1} and \code{pos}. If \code{pos} is equal to 1, \code{val} is prepended to \code{rdo}. If \code{pos} is missing or equal to the length of \code{rdo}, \code{val} is appended to \code{rdo}. todo: allow vector \code{pos} to insert deeper into the object. todo: character \code{pos} to insert at a position specified by "tag" for example? todo: more guarded copying of attributes? } \value{ an Rd object } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/inspect_usage.Rd0000644000176200001440000000261113501141722015345 0ustar liggesusers\name{inspect_usage} \alias{inspect_usage} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Inspect the usage section in an Rd object } \description{ Inspect the usage section in an Rd object. } \usage{ inspect_usage(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} } \details{ The usage section in the Rd object, \code{rdo}, is extracted and parsed. The usage of each function described in \code{rdo} is obtained also from the actual installed function and compared to the one from \code{rdo}. The return value is a list, with one element for each function usage as returned by \code{compare_usage1}. One of the consequences of this is that an easy way to add a usage description of a function, say \code{fu} to an existing Rd file is to simply add a line \code{fu()} to the usage section of that file and run \code{reprompt} on it. } \value{ a list of comparison results as described in `Details' (todo: give more details here) } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{inspect_args}} } % \examples{ % ##---- Should be DIRECTLY executable !! ---- % } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{ ~kwd1 } \keyword{RdoUsage} %\keyword{RdFunction} Rdpack/man/compare_usage1.Rd0000644000176200001440000000457313501141722015420 0ustar liggesusers\name{compare_usage1} \alias{compare_usage1} \title{ Compare usage entries for a function to its actual arguments } \description{ Compare usage entries for a function to its actual arguments. } \usage{ compare_usage1(urdo, ucur) } \arguments{ \item{urdo}{ usage text for a function or S3 method from an Rd object or file. } \item{ucur}{usage generated from the actual object.} } \details{ Compares the usage statements for functions in the Rd object or file \code{urdo} to the usage inferred from the actual definitions of the functions. The comparison is symmetric but the interpretation assumes that \code{ucur} may be more recent. Note: do not compare the return value to TRUE with \code{identical} or \code{isTRUE}. The attribute makes the returned value not identical to TRUE in any case. } \value{ TRUE if the usages are identical, FALSE otherwise. The return value has attribute "details", which is a list providing details of the comparison. The elements of this list should be referred by name, since if one of \code{urdo} or \code{ucur} is NULL or NA, the list contains only the fields "obj_removed", "obj_added", "rdo_usage", "cur_usage", and "alias". \item{identical_names}{a logical value, TRUE if the `name' is the same in both objects.} \item{obj_removed}{names present in \code{urdo} but not in \code{ucur}} \item{obj_added }{names present in \code{ucur} but not in \code{urdo}} \item{identical_argnames }{a logical value, TRUE if the argument names in both objects are the same.} \item{identical_defaults }{a logical value, TRUE if the defaults for the arguments in both objects are the same.} \item{identical_formals }{a logical value, TRUE if the formals are the same, i.e. fields \code{identical_argnames} and \code{identical_defaults} are both TRUE.} \item{added_argnames }{names of arguments in \code{ucur} but not in \code{urdo}.} \item{removed_argnames}{names of arguments in \code{urdo} but not in \code{ucur}.} \item{names_unchanged_defaults }{names of arguments whose defaults are the same.} \item{rdo_usage }{a copy of \code{urdo}.} \item{cur_usage }{a copy of \code{ucur}.} \item{alias }{alias of the name of the object, see `Details'.} } \author{Georgi N. Boshnakov} \seealso{ \code{\link{inspect_usage}} } \keyword{RdoUsage} Rdpack/man/Rdo_set_section.Rd0000644000176200001440000000405113501141722015637 0ustar liggesusers\name{Rdo_set_section} \alias{Rdo_set_section} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Replace a section in an Rd file } \description{ Replace a section in an Rd file. } \usage{ Rdo_set_section(text, sec, file, \dots) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{text}{the new text of the section, a character vector.} \item{sec}{name of the section.} \item{file}{name of the file.} \item{...}{arguments to be passed on to \code{Rdo_modify}.} } \details{ Parses the file, replaces the specified section with the new content and writes the file back. The text is processed as appropriate for the particular section (\code{sec}). For example: \code{Rdo_set_section("Georgi N. Boshnakov", "author", "./man/Rdo2Rdf.Rd")} (Some care is needed with the author field for "xxx-package.Rd" files, such as "Rdpack-package.Rd", where the \verb{Author(s)} field has somewhat different layout.) By default \code{Rdo_set_section} does not create the section if it does not exist, since this may not be desirable for some Rd files. The "..." arguments can be used to change this, they are passed on to \code{\link{Rdo_modify}}, see its documentation for details. } \value{ This function is used mainly for the side effect of changing \code{file}. It returns the Rd formatted text as a character vector. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Rdo_modify}} } \examples{ fnA <- tempfile("dummyfun", fileext = "Rd") dummyfun <- function(x) x reprompt(dummyfun, filename = fnA) Rdo_show(tools::parse_Rd(fnA)) ## set the author section, create it if necessary. Rdo_set_section("A.A. Author", "author", fnA, create = TRUE) Rdo_show(tools::parse_Rd(fnA)) ## replace the author section Rdo_set_section("Georgi N. Boshnakov", "author", fnA) Rdo_show(tools::parse_Rd(fnA)) unlink(fnA) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoBuild} Rdpack/man/viewRd.Rd0000644000176200001440000000251413501141722013756 0ustar liggesusers\name{viewRd} \alias{viewRd} \title{View Rd files in a source package} \description{View Rd files in a source package.} \usage{ viewRd(infile, type = "text", stages = NULL) } \arguments{ \item{infile}{name of an Rd file, a character string.} \item{type}{one of \code{"text"} or \code{"html"}} \item{stages}{ a character vector specifying which stages of the R installation process to immitate. The default, \code{c("build", "install", "render")}, should be fine in most cases. } } \details{ This function can be used to view Rd files from the source directory of a package. The page is presented in text format or in html browser, according to the setting of argument \code{type}. The default is text. } \value{ the function is used for the side effect of showing the help page in a text help window or a web browser. } %\references{ %%% ~put references to the literature/web site here ~ %} \author{Georgi N. Boshnakov} \note{ Developers with \code{"devtools"} can use \code{viewRd()} instead of \code{help()} for documentation objects that contain Rd macros, such as \code{insertRef}, see vignette: \code{vignette("Inserting_bibtex_references", package = "Rdpack")}. } %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} %\examples{ %} \keyword{documentation} % use one of RShowDoc("KEYWORDS") Rdpack/man/Rdpack_bibstyles.Rd0000644000176200001440000000403213501141722015777 0ustar liggesusers\name{Rdpack_bibstyles} \alias{Rdpack_bibstyles} %- Also NEED an '\alias' for EACH other topic documented here. \title{Set up a custom style for references in help pages} \description{Set up a custom style for references in help pages.} \usage{ Rdpack_bibstyles(package, authors) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{package}{the name of a package, a character string.} \item{authors}{if equal to "LongNames", use full names of authors in reference lists, see Details.} } \details{ This is the initial implementation of support for styles for lists of bibliography references. Currently setting "authors" to "LongNames" will cause the references to appear with full names, eg John Smith rather than in the default Smith J style. Package authors can request this feature by adding the following line to their \code{.onLoad} function (if their package has one): \preformatted{ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") } of just copy the following definition in a package that does not have \code{.onLoad} : \preformatted{ .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } } After building and installing the package the references should be using long names. } \value{ in .onLoad(), the function is used purely to set up a bibstyle as discussed in Details. Internally, \pkg{Rdpack} uses it to extract styles set up by packages: - if called with argument \code{package} only, the style requested by that package; - if called with no arguments, a list of all styles. } %\references{ %} \author{Georgi N. Boshnakov} %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} %\examples{ %} % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{documentation} \keyword{bibtex} % use one of RShowDoc("KEYWORDS") Rdpack/man/Rdo_locate.Rd0000644000176200001440000000660613501141722014577 0ustar liggesusers\name{Rdo_locate} \alias{Rdo_locate} \title{Find positions of elements in an Rd object} \description{ Find positions of elements for which a function returns TRUE. Optionally, apply another function to the selected elements and return the results along with the positions. } \usage{ Rdo_locate(object, f = function(x) TRUE, pos_only = TRUE, lists = FALSE, fpos = NULL, nested = TRUE) } \arguments{ \item{object}{an Rd object} \item{f}{a function returning TRUE if an element is desired and FALSE otherwise.} \item{pos_only}{if TRUE, return only the positions; if this argument is a function, return also the result of applying the function to the selected element, see Details.} \item{lists}{if FALSE, examine only leaves, if TRUE, examine also lists, see Details.} \item{fpos}{a function with two arguments, \code{object} and position, it is called and the value is returned along with the position, see Details.} \item{nested}{a logical value, it has effect only when \code{lists} is TRUE, see `Details'. } } \details{ With the default setting of \code{lists = FALSE}, the function \code{f} is applied to each leave (a character string) of the Rd object. If \code{lists = TRUE} the function \code{f} is applied also to each branch (a list). In this case, argument \code{nested} controls what happens when \code{f} returns TRUE. If \code{nested} is TRUE, each element of the list is also inspected recursively, otherwise this is not done and, effectively, the list is considered a leaf. If \code{f} does not return TRUE, the value of \code{nested} has no effect and the elements of the list are inspected. The position of each object for which \code{f} returns TRUE is recorded as a numeric vector. \code{fpos} and \code{pos_only} provide two ways to do something with the selected elements. Argument \code{fpos} is more powerful than \code{pos_only} but the latter should be sufficient and simpler to use in most cases. If \code{fpos} is a function, it is applied to each selected element with two arguments, \code{object} and the position, and the result returned along with the position. In this case argument \code{pos_only} is ignored. If \code{fpos} is NULL the action depends on \code{pos_only}. If \code{pos_only = TRUE}, \code{Rdo_locate} returns a list of such vectors (not a matrix since the positions of the leaves are, in general, at different depths). If \code{pos_only} is a function, it is applied to each selected element and the result returned along with the position. } \value{ a list with one entry for each selected element. Each entry is a numeric vector or a list with two elements: \item{pos}{the position, a vector of positive integers,} \item{value}{the result of applying the function to the element at \code{pos}.} } \author{Georgi N. Boshnakov} \note{ The following needs additional thought. In some circumstances an empty list, tagged with \code{Rd_tag} may turn up, e.g. \code{list()} with \verb{Rd_tag="\\dots"} in an \verb{\\arguments} section. On the one hand this is a list. On the other hand it may be considered a leaf. It is not clear if any attempt to recurse into such a list should be made at all. } \seealso{ \code{\link{Rdo_sections}} and \code{\link{Rdo_locate_core_section}} which locate top level sections } \examples{ # todo: put examples here! } \keyword{Rd} Rdpack/man/set_Rdpack_bibstyle.Rd0000644000176200001440000000164213501141722016473 0ustar liggesusers\name{set_Rdpack_bibstyle} \alias{set_Rdpack_bibstyle} %- Also NEED an '\alias' for EACH other topic documented here. \title{Set up a bibstyle defined in Rdpack} \description{Set up a bibstyle defined in Rdpack} \usage{ set_Rdpack_bibstyle(bibstyle = "JSSRd") } %- maybe also 'usage' for other objects documented here. \arguments{ \item{bibstyle}{a character string} } %\details{ %%% ~~ If necessary, more details than the description above ~~ %} %\value{ %%% ~Describe the value returned %%% If it is a LIST, use %%% \item{comp1 }{Description of 'comp1'} %%% \item{comp2 }{Description of 'comp2'} %%% ... %} %\references{ %%% ~put references to the literature/web site here ~ %} %\author{ %%% ~~who you are~~ %} %\note{ %%% ~~further notes~~ %} % %%% ~Make other sections like Warning with \section{Warning }{....} ~ % %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} %\examples{ %} \keyword{internal} Rdpack/man/inspect_args.Rd0000644000176200001440000000321613501141722015177 0ustar liggesusers\name{inspect_args} \alias{inspect_args} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Inspect the argument section of an Rd object } \description{ Inspect the argument section of an Rd object. } \usage{ inspect_args(rdo, i_usage) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object describing functions.} \item{i_usage}{see Details.} } \details{ \code{inspect_args} checks if the arguments in the documentation object \code{rdo} match the (union of) the actual arguments of the functions it describes. If \code{i_usage} is missing, it is computed by inspecting the current definitions of the functions described in \code{rdo}, see \code{inspect_usage}. This argument is likely to be supplied if the function calling \code{inspect_args} has already computed it for other purposes. } \value{ TRUE if the arguments in the documentation match the (union of) the actual arguments of the described functions, FALSE otherwise. The returned logical value has attribute `details' which is a list with the following components. \item{rdo_argnames}{arguments described in the documentation object, \code{rdo}.} \item{cur_argnames}{arguments in the current definitions of the described functions.} \item{added_argnames}{new arguments} \item{removed_argnames}{removed (dropped) arguments.} } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} \keyword{RdoUsage} %\keyword{RdFunction} Rdpack/man/deparse_usage.Rd0000644000176200001440000000566213501141722015334 0ustar liggesusers\name{deparse_usage} \alias{deparse_usage} \alias{deparse_usage1} \alias{as.character.f_usage} \title{Convert f_usage objects to text appropriate for usage sections in Rd files } \description{Converts f_usage objects to text appropriate for usage sections in Rd files. Handles S3 methods. } \usage{ deparse_usage(x) deparse_usage1(x, width = 72) \method{as.character}{f_usage}(x, \dots ) } \arguments{ \item{x}{ an object from class \code{"f_usage"}. For \code{deparse_usage}, \code{x} can also be a list of \code{"f_usage"} objects. } \item{width}{maximal width of text on a line.} \item{...}{ignored.} } \details{ Both, \code{deparse_usage1} and the \code{as.character} method for class \code{"f_usage"}, convert an \code{"f_usage"} object to a character string suitable for Rd documentation. The \code{as.character} method is the user level function (it just calls \code{deparse_usage1}), \code{deparse_usage1} is internal function for programming. In the example below the first command creates an \code{"f_usage"} object, then the second converts it to character string. \printExample{(a <- pairlist2f_usage1(formals(cor), "cor"));cat(as.character(a))} Each usage entriy is formatted and, if necessary, split over several lines. The width (number of characters) on a line can be changed with argument \code{width}. \code{deparse_usage} can be used when \code{x} is a list of \code{"f_usage"} objects. It calls \code{deparse_usage1} with each of them and returns a character vector with one element for each component of \code{x}. When \code{x} is an object from class \code{"f_usage"}, \code{deparse_usage} is equivalent to \code{deparse_usage1}. } \value{ For \code{deparse_usage1} and \code{as.character.f_usage}, a named character vector of length one (the name is the function name). For \code{deparse_usage}, a named character vector with one entry for the usage text for each function. } \author{Georgi N. Boshnakov} \seealso{ \code{\link{pairlist2f_usage1}} } \examples{ cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## prepare a list of "f_usage" objects fnseq <- reprompt(seq) # get and save the help page of "seq" rdoseq <- tools::parse_Rd(fnseq) # parse the Rd file ut <- get_usage_text(rdoseq) # get the contents of the usage section cat(ut, "\n") # of seq() (a character string) utp <- parse_usage_text(ut) # parse to a list of "f_usage" objects ## deparse the "f_usage" list - each statement gets a separate string cat(deparse_usage(utp), sep = "\n") ## explore some of the usage entries individually; ## the generic seq() has a boring signature utp[[1]] as.character(utp[[1]]) deparse_usage1(utp[[1]]) # same ## the default S3 method is more interesting utp[[2]] cat(deparse_usage1(utp[[2]])) cat(as.character(utp[[2]])) # same unlink(fnseq) setwd(cur_wd) unlink(tmpdir) } %\keyword{RdoProgramming} \keyword{RdoUsage} %\keyword{RdFunction} Rdpack/man/Rdo_flatinsert.Rd0000644000176200001440000000162613501141722015500 0ustar liggesusers\name{Rdo_flatinsert} \alias{Rdo_flatinsert} \alias{Rdo_flatremove} \title{Insert or remove content in an Rd fragment} \description{Insert or remove content in an Rd fragment.} \usage{ Rdo_flatinsert(rdo, val, pos, before = TRUE) Rdo_flatremove(rdo, from, to) } \arguments{ \item{rdo}{an Rd object.} \item{val}{the value to insert.} \item{pos}{position.} \item{before}{if TRUE, insert the new content at pos, pushing the element at pos forward. } \item{from}{beginning of the region to remove.} \item{to}{end of the region to remove.} } \details{ \code{Rdo_flatinsert} inserts \code{val} at position \code{pos}, effectively by concatenation. \code{Rdo_flatremove} removes elements from \code{from} to \code{to}. } \value{ the modified \code{rdo} } \author{Georgi N. Boshnakov} % \seealso{ % %% ~~objects to See Also as \code{\link{help}}, ~~~ % } %\examples{ %} \keyword{ RdoProgramming } Rdpack/man/Rdo_sections.Rd0000644000176200001440000000632613501141722015156 0ustar liggesusers\name{Rdo_sections} \alias{Rdo_sections} \alias{Rdo_locate_core_section} \title{Locate the sections in Rd objects} \description{Locate the Rd sections in an Rd object and return a list of their positions and names.} \usage{ Rdo_sections(rdo) Rdo_locate_core_section(rdo, sec) } \arguments{ \item{rdo}{an Rd object.} \item{sec}{the name of a section, a character string. For builtin sections the leading backslash should be included.} } \details{ \code{Rdo_sections} locates all sections at the top level in an Rd object. This includes the predefined sections and the user defined sections. Sections wrapped in \verb{#ifdef} directives are also found. \code{Rdo_sections} returns a list with one entry for each section in \code{rdo}. This entry is a list with components \code{"pos"} and \code{"title"} giving the position (suitable for use in \verb{"[["}) and the title of the section. For user defined sections the actual name is returned, not "section". The names of the sections are returned as single strings without attributes. The titles of predefined sections are single words but user defined sections may have longer titles and sometimes contain basic markup. \code{Rdo_locate_core_section} works similarly but returns only the results for section \code{sec}. Currently it simply calls \code{Rdo_sections} and returns only the results for \code{sec}. Note that for consistency \code{Rdo_locate_core_section} does not attempt to simplify the result in the common case when there is only one instance of the requested section---it is put in a list of length one. \insertCite{parseRd}{Rdpack} % only for testing! \insertCite{Rpack:bibtex}{Rdpack} % only for testing! } \value{ A list giving the positions and titles of the sections in \code{rdo} as described in 'Details'. The format is essentially that of \code{\link{Rdo_locate}}, the difference being that field "value" from that function is renamed to "title" here. \item{pos}{the position, a vector of positive integers,} \item{title}{a standard section name, such as \verb{"\\name"} or, in the case of "\\section", the actual title of the section. } } \author{Georgi N. Boshnakov} \note{ I wrote \code{Rdo_sections} and \code{Rdo_locate_core_section} after most of the core functionality was tested. Currently these functions are underused---they can replace a number of internal and exported functions. } \seealso{ \code{\link{Rdo_locate}} } \references{ \insertAllCited{} % only for testing } \examples{ infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## Locate all top level sections in rd sections <- Rdo_sections(rd) ## How many sections there are in rd? length(sections) ## What are their titles? sapply(sections, function(x) x$title) ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\\\title") ## Locate a user defined secion Rdo_locate_core_section(rd, "Further information") ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\\\details") ## All appearances of the requested section are returned Rdo_locate_core_section(rd, "\\\\alias") Rdo_locate_core_section(rd, "\\\\keyword") } \keyword{Rd} Rdpack/man/Rdo_remove_srcref.Rd0000644000176200001440000000162413501141722016164 0ustar liggesusers\name{Rdo_remove_srcref} \alias{Rdo_remove_srcref} %- Also NEED an '\alias' for EACH other topic documented here. \title{Remove srcref attributes from Rd objects} \description{Removes srcref attributes from Rd objects.} \usage{ Rdo_remove_srcref(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} } \details{ \code{srcref} attrbutes (set by \code{parse_Rd}) may be getting in the way during manipulation of Rd objects, such as comparisons, addition and replacement of elements. This function traverses the argument and removes the \code{srcref} attribute from all of its elements. } \value{ an Rd object with no srcref attributes. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoProgramming} Rdpack/man/Rdo_collect_metadata.Rd0000644000176200001440000000404313501141722016606 0ustar liggesusers\name{Rdo_collect_aliases} \alias{Rdo_collect_aliases} \alias{Rdo_collect_metadata} \title{Collect aliases or other metadata from an Rd object} \description{Collect aliases or other metadata from an Rd object.} \usage{ Rdo_collect_aliases(rdo) Rdo_collect_metadata(rdo, sec) } \arguments{ \item{rdo}{an Rd object} \item{sec}{the kind of metadata to collect, a character string, such as "alias" and "keyword".} } \details{ \code{Rdo_collect_aliases} finds all aliases in \code{rdo} and returns them as a named character vector. The name of an alias is usually the empty string, \code{""}, but it may also be "windows" or "unix" if the alias is wrapped in a \verb{#ifdef} directive with the corresponding first argument. \code{Rdo_collect_metadata} is a generalisation of the above. It collects the metadata from section(s) \code{sec}, where \code{sec} is the name of a section without the leading backslash. \code{sec} is assumed to be a section containing a single word, such as "keyword", "alias", "name". Currently \code{Rdo_collect_metadata} is not exported. } \value{ a named character vector, as described in Details. } \author{Georgi N. Boshnakov} \seealso{ \code{tools:::.Rd_get_metadata} } \examples{ ## this example originally (circa 2012) was: ## infile <- file.path(R.home(), "src/library/base/man/timezones.Rd") ## but the OS conditional alias in that file has been removed. ## So, create an artificial example: infile <- system.file("examples", "tz.Rd", package = "Rdpack") ## file.show(infile) rd <- tools::parse_Rd(infile) ## The functions described here handle "ifdef" and similar directives. ## This detects OS specific aliases (windows = "onlywin" and unix = "onlyunix"): Rdo_collect_aliases(rd) Rdpack:::Rdo_collect_metadata(rd, "alias") # same ## In contrast, the following do not find "onlywin" and "onlyunix": sapply(rd[which(tools:::RdTags(rd)=="\\alias")], as.character) tools:::.Rd_get_metadata(rd, "alias") Rdpack:::Rdo_collect_metadata(rd, "name") Rdpack:::Rdo_collect_metadata(rd, "keyword") } \keyword{Rd} Rdpack/man/append_to_Rd_list.Rd0000644000176200001440000000433413501141722016151 0ustar liggesusers\name{append_to_Rd_list} \alias{append_to_Rd_list} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Add content to the element of an Rd object or fragment at a given position } \description{ Add content to the element of an Rd object or fragment at a given position. } \usage{ append_to_Rd_list(rdo, x, pos) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} \item{x}{the content to append, an Rd object or a list of Rd objects.} \item{pos}{position at which to append \code{x}, typically an integer but may be anything accepted by the operator "[[". } } \details{ The element of \code{rdo} at position \code{pos} is replaced by its concatenation with \code{x}. The result keeps the "Rd_tag" of \code{rdo[[pos]]}. Argument \code{pos} may specify a position at any depth of the Rd object. This function is relatively low level and is mainly for use by other functions. } \value{ the modified \code{rdo} object } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ #rdoseq <- utils:::.getHelpFile(help("seq")) rdoseq <- Rdo_fetch("seq", "base") iusage <- which(tools:::RdTags(rdoseq) == "\\\\usage") iusage attr(rdoseq[[iusage]], "Rd_tag") ## append a new line after the last usage line rdoseq2 <- append_to_Rd_list(rdoseq, list(Rdo_newline()), iusage) ## Suppose that we wish to describe the function 'sequence' in the same Rd file. ## We append an usage statement for 'sequence()', without worrying about its ## actual signature. rdoseq2 <- append_to_Rd_list(rdoseq2, list(Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq2) ## the two operations can be done in one step rdoseq3 <- append_to_Rd_list(rdoseq, list(Rdo_newline(), Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq3) ## now run reprompt() to update rdoseq3, namely: ## (1) it corrects the signature of 'sequence' in section \usage. ## (2) reports new argument "nvec" ## (3) inserts \item for the new argument(s) in section \arguments. reprompt(rdoseq3, filename=NA) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} \keyword{RdoBuild} Rdpack/man/S4formals.Rd0000644000176200001440000000276713501141722014402 0ustar liggesusers\name{S4formals} \alias{S4formals} \title{Give the formal arguments of an S4 method} \description{Give the formal arguments of an S4 method.} \usage{ S4formals(fun, \dots) } \arguments{ \item{fun}{name of an S4 generic, a string, or the method, see Details.} \item{\dots}{further arguments to be passed to \code{getMethod}, see Details.} } \details{ \code{S4formals} gives the formal arguments of the requested method. If \code{fun} is not of class \code{methodDefinition}, it calls \code{getMethods}, passing on all arguments. Typically, \code{fun} is the name of a generic function and the second argument is the signature of the method as a character vector. Alternatively, \code{fun} may be the method itself (e.g. obtained previously from \code{getMethod}) and in that case the \verb{"\dots"} arguments are ignored. See \code{\link{getMethod}} for full details and other acceptable arguments. } \value{ a pairlist, like \code{\link{formals}} } \note{ Arguments of a method after those used for dispatch may be different from the arguments of the generic. The latter may simply have a \verb{"\dots"} argument there. todo: there should be a similar function in the "methods" package, or at least use a documented feature to extract it. } \author{ Georgi N. Boshnakov } \examples{ require(stats4) # makes plot() S4 generic S4formals("plot", c(x = "profile.mle", y = "missing")) m1 <- getMethod("plot", c(x = "profile.mle", y = "missing")) S4formals(m1) } \keyword{methods} Rdpack/man/Rdo_append_argument.Rd0000644000176200001440000000317613521262240016501 0ustar liggesusers\name{Rdo_append_argument} \alias{Rdo_append_argument} \title{ Append an item for a new argument to an Rd object } \description{ Append an item for a new argument to an Rd object. } \usage{ Rdo_append_argument(rdo, argname, description = NA, indent = " ", create = FALSE) } \arguments{ \item{rdo}{an Rd object.} \item{argname}{name of the argument, a character vector.} \item{description}{description of the argument, a character vector.} \item{indent}{a string, typically whitespace.} \item{create}{not used (todo: remove?)} } \details{ Appends one or more items to the section describing arguments of functions in an Rd object. The section is created if not present. If \code{description} is missing or NA, a "todo" text is inserted. The inserted text is indented using the string \code{indent}. The lengths of \code{argname} and \code{description} should normally be equal but if \code{description} is of length one, it is repeated to achieve this when needed. } \value{ an Rd object } \author{Georgi N. Boshnakov} \examples{ ## the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = ".Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) ## add documentation for arguments ## that are not in the signature of 'dummyfun()' dottext <- "further arguments to be passed on." rdo2 <- Rdo_append_argument(rdo, "\\dots", dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") ## reprompt() warns to remove documentation for non-existing arguments: Rdo_show(reprompt(rdo2, filename = fn)) unlink(fn) } \keyword{RdoBuild} %\keyword{RdoElements} Rdpack/man/zzbsdup.Rd0000644000176200001440000000160713501141722014221 0ustar liggesusers\name{.bsdup} \alias{.bsdup} \alias{.bspercent} \alias{.anypercent} %- Also NEED an '\alias' for EACH other topic documented here. \title{Escape backslashes and percent in Rd code} \description{Escape backslashes and percent in Rd code.} \usage{ .bspercent(x) .anypercent(x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{a character string} } \details{ \code{.bsdup(x)} duplicates backslashes. \code{.bspercent(x)} escapes percent signs. \code{.anypercent(x)} also escapes percent signs but but only if the \code{Rd_tag} attribute of \code{x} is not COMMENT. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ##---- Should be DIRECTLY executable !! ---- } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{internal} Rdpack/man/inspect_signatures.Rd0000644000176200001440000000334113501141722016426 0ustar liggesusers\name{inspect_signatures} \alias{inspect_signatures} \alias{inspect_clmethods} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Inspect signatures of S4 methods } \description{ Inspect signatures of S4 methods. } \usage{ inspect_clmethods(rdo, final = TRUE) inspect_signatures(rdo, package = NULL, sec = "Methods") } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{package}{the name of a package, a character string or NULL.} \item{sec}{the name of a section to look into, a character string.} \item{final}{If not TRUE insert text with suggestions, otherwise comment the suggestions out. } } \details{ Signatures in documentation of S4 classes and methods are stored somewhat differently. \code{inspect_signatures} inspects signatures in documentation of methods of a function. \code{inspect_clmethods} inspects signatures in documentation of a class. \code{inspect_signatures} was written before \code{inspect_clmethods()} and was geared towards using existing code for ordinary functions (mainly \code{parse_usage_text()}. If new methods are found, the functions add entries for them in the Rd object \code{rdo}. If \code{rdo} documents methods that do not exist, a message inviting the user to remove them manually is printed but the offending entries remain in the object. At the time of writing, \verb{R CMD check} does not warn about this. } \value{ an Rd object } \note{todo: need consolidation.} \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoS4} Rdpack/man/Rdo_is_newline.Rd0000644000176200001440000000171213501141722015455 0ustar liggesusers\name{Rdo_is_newline} \alias{Rdo_is_newline} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Check if an Rd fragment represents a newline character } \description{ Check if an Rd fragment represents a newline character } \usage{ Rdo_is_newline(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} } \details{ This is a utility function that may be used to tidy up Rd objects. It returns TRUE if the Rd object represents a newline character, i.e. it is a character vector of length one containing the string \verb{"\n"}. Attributes are ignored. Otherwise it returns FALSE. } \value{ TRUE or FALSE } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/Rdo_modify_simple.Rd0000644000176200001440000000206713501141722016165 0ustar liggesusers\name{Rdo_modify_simple} \alias{Rdo_modify_simple} %- Also NEED an '\alias' for EACH other topic documented here. \title{Simple modification of Rd objects} \description{Simple modification of Rd objects.} \usage{ Rdo_modify_simple(rdo, text, section, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{text}{a character vector} \item{section}{name of an Rd section, a string.} \item{\dots}{additional arguments to be passed to \code{Rdo_modify}.} } \details{ Argument \code{text} is used to modify (as a replacement of or addition to) the content of section \code{section} of \code{rdo}. This function can be used for simple modifications of an Rd object using character content without converting it separately to Rd. \code{text} is converted to Rd with \code{char2Rdpiece(text, section)}. The result is passed to \code{Rdo_modify}, together with the remaining arguments. } \value{ an Rd object } \author{Georgi N. Boshnakov} \seealso{ \code{\link{Rdo_modify}} } \keyword{RdoBuild} Rdpack/man/get_bibentries.Rd0000644000176200001440000001061513501141722015504 0ustar liggesusers\name{get_bibentries} \alias{get_bibentries} %- Also NEED an '\alias' for EACH other topic documented here. \title{Get all references from a Bibtex file} \description{Get all references from a Bibtex file.} \usage{ get_bibentries(\dots, package = NULL, bibfile = "REFERENCES.bib", url_only = FALSE, stop_on_error = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{\dots}{arguments to be passed on to the file getting functions, character strings, see `Details'.} \item{package}{name of a package, a character string or NULL.} \item{bibfile}{name of a Bibtex file, a character string.} \item{url_only}{ if TRUE, restrict percent escaping to BibTeX field \code{"URL"}.} \item{stop_on_error}{ if \code{TRUE} stop on error, otherwise issue a warning and return an empty \code{bibentryRd} object. } } \details{ \code{get_bibentries} parses the specified file using \code{read.bib} from package \pkg{bibtex} \insertCite{Rpack:bibtex}{Rdpack} and sets its \code{names} attribute to the keys of the bib elements (\code{read.bib()} does this since version version 0.4.0 of \pkg{bibtex}, as well). Here is what \code{get_bibentries} does on top of \code{read.bib} (the details are further below): \itemize{ \item \code{get_bibentries} deals with percent signs in URL's. \item if the current working directory is in the development directory of \code{package}, \code{get_bibentries} will first search for the bib file under that directory. } \code{bibfile} should normally be the base name of the Bibtex file. Calling \code{get_bibentries} without any \code{"\dots"} arguments results in looking for the Bibtex file in the current directory if package is NULL or missing, and in the installation directory of the specified package, otherwise. Argument "\dots" may be used to specify directories. If \code{package} is missing or NULL, the complete path is obtained with \code{file.path(..., bibfile)}. Otherwise \code{package} must be a package name and the file is taken from the installation directory of the package. Again, argument "\dots" can specify subdirectory as in \code{system.file}. If the current working directory is in the development directory of \code{package}, the bib file is first sought there before resorting to the installation directory. Although the base \R packages do not have files REFERENCES.bib, argument \code{package} can be set to one of them, e.g. \code{"base"}. This works since package \pkg{bibtex} provides bib files for the core packages. By default, \code{get_bibentries} escapes unescaped percent signs in all fields of bibtex objects. To restrict this only to field "url", set argument \code{url_only} to \code{FALSE}. \code{get_bibentries} returns an object from class \code{"bibentryRd"}, which inherits from bibentry. The printing method for \code{"bibentryRd"} unescapes percent signs in URLs for some styles where the escapes are undesirable. } \value{ a bibentryRd object inheriting from bibentry } \references{ \insertAllCited{} } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } % % %% ~Make other sections like Warning with \section{Warning }{....} ~ % % \seealso{ % %% ~~objects to See Also as \code{\link{help}}, ~~~ % } \examples{ r <- get_bibentries(package = "Rdpack") r print(r, style = "html") b <- get_bibentries(package = "stats") print(b[[1]], style = "R") print(b[[1]], style = "citation") ## here the url field contains percent encoding fn_url <- system.file("examples", "url_with_percents.bib", package = "Rdpack") u <- get_bibentries(bibfile = fn_url) ## the links produced by all of the following are valid ## and can be put in a browser print(u, style = "html") print(u, style = "bibtex") print(u, style = "R") print(u, style = "text") print(u, style = "citation") ## The link here contains escapes but when put in a LaTeX document ## which uses the JSS style it generates correct clickable link, ## (see Details section) print(u, style = "latex") ## here the journal field contains percent encoding fn_other <- system.file("examples", "journal_with_percents.bib", package = "Rdpack") j <- get_bibentries(bibfile = fn_url) print(j, style = "html") print(j, style = "bibtex") print(j, style = "R") print(j, style = "text") print(j, style = "citation") print(j, style = "latex") } \keyword{ bibtex } \keyword{programming} Rdpack/man/Rdreplace_section.Rd0000644000176200001440000000366113501141722016147 0ustar liggesusers\name{Rdreplace_section} \alias{Rdreplace_section} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Replace the contents of a section in one or more Rd files} \description{Replace the contents of a section in one or more Rd files.} \usage{ Rdreplace_section(text, sec, pattern, path = "./man", exclude = NULL, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{text}{the replacement text, a character string.} \item{sec}{the name of the section without the leading backslash, as for \code{Rdo_set_section}.} \item{pattern}{regular expression for R files to process, see Details.} \item{path}{the directory were to look for the Rd files.} \item{exclude}{regular expression for R files to exclude, see Details.} \item{\dots}{not used.} } \details{ \code{Rdreplace_section} looks in the directory specified by \code{path} for files whose names match \code{pat} and drops those whose names match \code{exclude}. Then it replaces section \code{sec} in the files selected in this way. \code{Rdreplace_section} is a convenience function to replace a section (such as a keyword or author) in several files in one go. It calls \code{\link{Rdo_set_section}} to do the work. } \value{ A vector giving the full names of the processed Rd files, but the function is used for the side effect of modifying them as described in section Details. } % \references{ % %% ~put references to the literature/web site here ~ % } \author{ Georgi N. Boshnakov } % \note{ % %% ~~further notes~~ % } % %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Rdo_set_section}} } \examples{ \dontrun{ # replace the author in all Rd files except pkgname-package Rdreplace_section("A. Author", "author", ".*[.]Rd$", exclude = "-package[.]Rd$") } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoBuild} Rdpack/man/macros/0000755000176200001440000000000013501141722013511 5ustar liggesusersRdpack/man/macros/refmacros.Rd0000644000176200001440000000352713501141722015770 0ustar liggesusers% insert reference #1 - key, #2 - package \newcommand{\insertRef}{\Sexpr[results=rd,stage=build]{Rdpack::insert_ref(key="#1",package="#2")}} % insert reference #1 - key, #2 - package \newcommand{\insertCiteOnly}{\Sexpr[results=rd,stage=build]{if(!exists(".Rdpack.currefs")) .Rdpack.currefs <- new.env();Rdpack::insert_citeOnly(key="#1",package="#2", cached_env=.Rdpack.currefs,cite_only=TRUE)}} \newcommand{\insertCite}{\Sexpr[results=rd,stage=build]{if(!exists(".Rdpack.currefs")) .Rdpack.currefs <- new.env();Rdpack::insert_citeOnly(key="#1",package="#2", cached_env=.Rdpack.currefs)}} \newcommand{\insertNoCite}{\Sexpr[results=hide,stage=build]{if(!exists(".Rdpack.currefs")) .Rdpack.currefs <- new.env();Rdpack::insert_citeOnly(key="#1",package="#2", cached_env=.Rdpack.currefs,dont_cite=TRUE)}} \newcommand{\insertAllCited}{\Sexpr[results=rd,stage=build]{if(!exists(".Rdpack.currefs")) .Rdpack.currefs <- new.env();Rdpack::insert_all_ref(.Rdpack.currefs)}} % insert reference #1 - key, #2 - package %\newcommand{\runExamples}{\Sexpr[results=rd,stage=build]{deparse({#1})}} \newcommand{\runExamples}{\Sexpr[results=rd,stage=build]{Rdpack:::run_examples(quote({#1}))}} %\newcommand{\printExample}{\Sexpr[results=rd,stage=build]{Rdpack:::run_examples(quote({#1}), Rdsection = "\\\\\\\\preformatted")}} \newcommand{\printExample}{\Sexpr[results=rd,stage=build]{.Rdpack.e <- environment();Rdpack:::run_examples(quote({#1}), local = .Rdpack.e, Rdsection = "preformatted")}} %\newcommand{\printExample}{\Sexpr[results=rd,stage=build]{Rdpack:::run_examples(quote({#1}), local = parent.frame(), Rdsection = "preformatted")}} % insert reference #1 - filename, #2 - package \newcommand{\insertFig}{\Sexpr[results=rd,stage=build]{Rdpack:::insert_fig("#1","#2", { #3 })}} \newcommand{\makeFig}{\Sexpr[results=hide,stage=build]{Rdpack:::insert_fig("#1","#2", { #3 }, insert=FALSE)}} Rdpack/man/zzasym_compare.Rd0000644000176200001440000000326713501141722015567 0ustar liggesusers\name{.asym_compare} \alias{.asym_compare} \alias{.ocompare} %- Also NEED an '\alias' for EACH other topic documented here. \title{Tensor comparison and asymmetric comparison between two vectors} \description{Tensor comparison and asymmetric comparison between two vectors.} \usage{ .ocompare(x, y) .asym_compare(x, y) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ %% ~~Describe \code{x} here~~ } \item{y}{ %% ~~Describe \code{y} here~~ } } \details{ \code{.ocompare} (for "outer compare") returns a matrix whose (i,j)th element is TRUE if x[i] is identical to y[j], and FALSE otherwise. \code{.asym_compare} calls \code{.ocompare} and iterprets its result asymmetrically. Elements of \code{x} that are not in \code{y} ae considered "new". Similarly, Elements of \code{y} that are not in \code{x} ae considered "removed". Elements that are in both are "common". Todo: check if the above is correct or the other way round! !!! } \value{ For \code{.ocompare}, a matrix as described in Details. For \code{.asym_compare} a list with indices as follows. \item{i_new}{new elements, indices in \code{x} of elements that are not in \code{y}.} \item{i_removed}{removed elements, indices in \code{y} of elements that are not in \code{x}.} \item{i_common}{common elements, indices in \code{x} of elements that are in both, \code{x} and \code{y}.} } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ##---- Should be DIRECTLY executable !! ---- } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{internal} Rdpack/man/parse_pairlist.Rd0000644000176200001440000000701513501141722015540 0ustar liggesusers\name{parse_pairlist} \alias{parse_pairlist} %\alias{pairlist2f_usage} \alias{pairlist2f_usage1} \title{Parse formal arguments of functions} \description{Parse formal arguments of functions and convert them to f_usage objects.} \usage{ parse_pairlist(x) pairlist2f_usage1(x, name, S3class = "", S4sig = "", infix = FALSE, fu = TRUE) } \arguments{ \item{x}{a pairlist representing the arguments of a function.} \item{name}{function name.} \item{S3class}{S3 class, see `Details'} \item{S4sig}{S4 signature, see Details.} \item{infix}{if \code{TRUE} the function usage is in infix form, see Details.} \item{fu}{if TRUE the object is a function, otherwise it is something else (e.g. a variable or a constant like \code{pi} and \code{Inf}). } } \details{ These functions are mostly internal. % \code{x} is a single pairlist object for \code{parse_pairlist} and % \code{pairlist2f_usage1}. % For \code{pairlist2f_usage} it may be a list of pairlist objects. % (\code{pairlist2f_usage} has been removed) \code{parse_pairlist} parses the pairlist object, \code{x}, into a list with two components. The first component contains the names of the arguments. The second component is a named list containing the default values, converted to strings. Only arguments with default values have entries in the second component (so, it may be of length zero). If \code{x} is empty or \code{NULL}, both components have length zero. An example: \printExample{parse_pairlist(formals(system.file))} \code{pairlist2f_usage1()} creates an object of S3 class \code{"f_usage"}. The object contains the result of parsing \code{x} with \code{parse_pairlist(x)} and a number of additional components which are copies of the remaining arguments to the function (without any processing). The components are listed in section Values. \code{S3class} is set to an S3 class for for S3 methods, \code{S4sig} is the signature of an S4 method (as used in Rd macro \verb{\S4method}). \code{infix} is \code{TRUE} for the rare occations when the function is primarily used in infix form. Class \code{"f_usage"} has a method for \code{as.character()} which generates a text suitable for inclusion in Rd documentation. \printExample{pairlist2f_usage1(formals(summary.lm), "summary", S3class = "lm")} } \value{ For \code{parse_pairlist}, a list with the following components: \item{argnames}{the names of all arguments, a character vector} \item{defaults}{ a named character vector containing the default values, converted to character strings. Only arguments with defaults have entries in this vector. } For \code{pairlist2f_usage1}, an object with S3 class \code{"f_usage"}. This is a list as for \code{parse_pairlist} and the following additional components: \item{name}{function name, a character string.} \item{S3class}{ S3 class, a character string; \code{""} if not an S3 method. } \item{S4sig}{S4 signature; \code{""} if not an S4 method.} \item{infix}{a logical value, \code{TRUE} for infix operators.} \item{fu}{ indicates the type of the object, usually \code{TRUE}, see Details. } % For \code{pairlist2f_usage}, a list of \code{"f_usage"} objects. } \author{Georgi N. Boshnakov} \seealso{ \code{\link{promptUsage}} accepts \code{f_usage} objects, \code{\link{get_usage}} } \examples{ parse_pairlist(formals(lm)) parse_pairlist(formals(system.file)) s_lm <- pairlist2f_usage1(formals(summary.lm), "summary", S3class = "lm") s_lm as.character(s_lm) } \keyword{RdoBuild} Rdpack/man/Rdo_modify.Rd0000644000176200001440000000704213501141722014612 0ustar liggesusers\name{Rdo_modify} \alias{Rdo_replace_section} \alias{Rdo_modify} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Replace or modify parts of Rd objects } \description{ Replace or modify parts of Rd objects. } \usage{ Rdo_modify(rdo, val, create = FALSE, replace = FALSE, top = TRUE) Rdo_replace_section(rdo, val, create = FALSE, replace = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{val}{an Rd fragment.} \item{create}{if TRUE, create a new section, see `Details'.} \item{replace}{a logical, if TRUE \code{val} replaces the old content, otherwise \code{val} is concatenated with it, see `Details'. } \item{top}{a logical, if TRUE examine also the "Rd_tag" of \code{rdo}, see `Details'. } } \details{ Argument \code{rdo} is an Rd object (complete or a fragment) to be modified. \code{val} is an Rd fragment to use for modification. Basically, \code{val} is appended to (if \code{replace} is FALSE) or replaces (if \code{replace} is TRUE) the content of an element of \code{rdo} which has the same "Rd_tag" as \code{val}. Argument \code{top} specifies whether to check the "Rd_tag" of \code{rdo} itself, see below. Here are the details. If \code{top} is TRUE and \code{rdo} and \code{val} have the same (non-NULL) "Rd_tag", then the action depends on \code{replace} (argument \code{create} is ignored in this case). If \code{replace} is TRUE, \code{val} is returned. Otherwise \code{rdo} and \code{val} are, effectively, concatenated. For example, \code{rdo} may be the "arguments" section of an Rd object and \code{val} may also be an "arguments" section containing new arguments. Otherwise, an element with the "Rd_tag" of \code{val} is searched in \code{rdo} using \code{tools:::RdTags()}. If such elements are found, the action again depends on \code{replace}. \enumerate{ \item If \code{replace} is a character string, then the first element of \code{rdo} that is a list whose only element is identical to the value of \code{replace} is replaced by \code{val}. If such an element is not present and \code{create} is TRUE, \code{val} is inserted in \code{rdo}. If \code{create} is FALSE, \code{rdo} is not changed. \item If \code{replace} is TRUE, the first element found is replaced with \code{val}. \item If \code{replace} is FALSE, \code{val} is appended to the first element found. } If no element with the "Rd_tag" of \code{val} is found the action depends on \code{create}. If \code{create} is TRUE, then \code{val} is inserted in \code{rdo}, effectively creating a new section. If \code{create} is FALSE, an error is thrown. \code{Rdo_replace_section} is like \code{Rdo_modify} with argument \code{top} fixed to TRUE and the default for argument \code{replace} set to TRUE. It hardly makes sense to call \code{Rdo_replace_section} with \code{replace = FALSE} but a character value for it may be handy in some cases, see the examples. } \value{ an Rd object or fragment, as described in `Details' } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ # a <- tools::parse_Rd("./man/promptUsage.Rd") # char2Rdpiece("documentation", "keyword") # this changes a keyword from Rd to documentation # Rdo_replace_section(a, char2Rdpiece("documentation", "keyword"), replace = "Rd") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoBuild} Rdpack/man/char2Rdpiece.Rd0000644000176200001440000000370613501141722015015 0ustar liggesusers\name{char2Rdpiece} \alias{char2Rdpiece} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Convert a character vector to Rd piece } \description{ Convert a character vector to Rd piece. } \usage{ char2Rdpiece(content, name, force.sec = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{content}{a character vector.} \item{name}{name of an Rd macro, a string.} \item{force.sec}{TRUE or FALSE, see `Details'.} } \details{ Argument \code{content} is converted to an Rd piece using \code{name} to determine the format of the result. The \verb{Rd tag} of \code{content} is set as appropriate for \code{name}. More specifically, if \code{name} is the name of a macro (without the leading `\verb{\\}') whose content has a known "Rdtag", that tag is used. Otherwise the tag is set to "TEXT". If \code{force.sec} is TRUE, \code{name} is treated as the name of a top level section of an Rd object. A top level section is exported as one argument macro if it is a standard section (detected with \code{\link{is_Rdsecname}}) and as the two argument macro "\verb{\section}" otherwise. If \code{force.sec} is FALSE, the content is exported as one argument macro without further checks. } \author{Georgi N. Boshnakov} \note{ This function does not attempt to escape special symbols like `\%'. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ## add a keyword section a1 <- char2Rdpiece("graphics", "keyword") a1 ## "keyword" is a standard Rd top level section, so 'force.sec' is irrelevant a2 <- char2Rdpiece("graphics", "keyword", force.sec = TRUE) identical(a1, a2) ## an element suitable to be put in a "usage" section char2Rdpiece("log(x, base = exp(1))", "usage") ## a user defined section "Todo" char2Rdpiece("Give more examples for this function.", "Todo", force.sec = TRUE) } %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/bibentry_key.Rd0000644000176200001440000000136113501141722015203 0ustar liggesusers\name{bibentry_key} \alias{bibentry_key} \title{Give the key associated with a bibentry element} \description{Give the key associated with a bibentry element} \usage{ bibentry_key(x) } \arguments{ \item{x}{a single bibentry element.} } \details{ 2018-03-24: This function is deprecated (and not used in the package for a long time). This is a convenience function to get the "key" attribute of a reference represented by a bibentry element. There should be a better way to do this, I must be missing something here. (2018-03-24: indeed: \code{unlist(x$key)} or \code{x[[1]]$key}, was this available back then?) } \value{ a character string } \author{Georgi N. Boshnakov} \keyword{bibtex} \keyword{programming} \keyword{internal} Rdpack/man/inspect_Rd.Rd0000644000176200001440000000510113501141722014603 0ustar liggesusers\name{inspect_Rd} \alias{inspect_Rd} \alias{inspect_Rdfun} \alias{inspect_Rdmethods} \alias{inspect_Rdclass} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Inspect and update an Rd object or file } \description{ Inspect and update an Rd object or file. } \usage{ inspect_Rd(rdo, package = NULL) inspect_Rdfun(rdo, alias_update = TRUE) inspect_Rdmethods(rdo, package = NULL) inspect_Rdclass(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object or file name} \item{package}{name of a package} \item{alias_update}{if \code{TRUE}, add missing alias entries for functions with usage statements.} } \details{ These functions check if the descriptions of the objects in \code{rdo} are consistent with their current definitions and update them, if necessary. The details depend on the type of the documented topic. In general, the functions update entries that can be produced programmatically, possibly accompanied with a suggestion to the author to write some additional text. \code{inspect_Rd} checks the \verb{\name} section of \code{rdo} and dispatches to one of the other \code{inspect_XXX} functions depening on the type of the topic. \code{inspect_Rdfun} processes documentation of functions. It checks the usage entries of all functions documented in \code{rdo} and updates them if necessary. It appends "\verb{\alias}" entries for functions that do not have them. Entries are created for any arguments that are missing from the "\verb{\arguments}" section. Warning is given for arguments in the "\verb{\arguments}" section that are not present in at least one usage entry. \code{inspect_Rdfun} understands the syntax for S3 methods and S4 methods used in "usage" sections, as well. The S4 methods may also be in a section as produced by \code{promptMethods}. \code{inspect_Rdmethods} checks and updates documentation of an S4 generic function. \code{inspect_Rdclass} checks and updates documentation of an S4 class. Since method signatures and descriptions may be present in documentation of a class, as well as in that of methods, the question arises where to put "\verb{\alias}" entries to avoid duplication. Currently, alias entries are put in method descriptions. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % \examples{ % ##---- Should be DIRECTLY executable !! ---- % } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoProgramming} Rdpack/man/zzcapture_promptany.Rd0000644000176200001440000000510213501141722016652 0ustar liggesusers\name{.capture_promptAny} \alias{.capture_promptAny} \alias{.capture_installed_help} %- Also NEED an '\alias' for EACH other topic documented here. \title{Internal functions used by reprompt} \description{Internal functions used by reprompt.} \usage{ .capture_promptAny(fnam, type, package, final, \dots, methods) .capture_installed_help(fnam, type = NULL, package = NULL, suffix = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{fnam}{extended name of the object, such as "fun", "gen-methods", "S4cl-class" or "pkname-package", see details.} \item{final}{if TRUE, put dummy title and description to make the file immediately usable.} \item{\dots}{further arguments to pass on to the prompt function(s).} \item{methods}{methods to consider, used only when describing S4 methods.} \item{type}{type of documentation, such as "methods" and "class", see Details.} \item{package}{the package where to look for objects or documentation, useful if more objects of the same name exist.} \item{suffix}{a character string to be appended to \code{fnam} to obtain the complete name of the help topic, e.g. "-class", "-method". } } \details{ These functions are used internally by \code{reprompt}. It falls back to them when only when the user has not supplied an Rd file in the call. Note that for editing it is preferable to use the source Rd files (when available), since some hard coded information in the installed help may have been produced by more elaborated code in the Rd sources, most notably Sweave expressions. \code{.capture_promptAny} is used to generate documentation when none has been supplied by the user or loaded in the session. \code{.capture_promptAny} parses \code{fnam} to obtain the name of the object and the type of the required documentation (function, methods, class), then generates it. Currently this is done with the built in functions of the \code{promptXXX} family. \code{.capture_installed_help} does exactly that --- it captures the currently installed requested help topic. This function needs clean up. It was originally written at a time when both the old and new help formats where co-existing. } \value{ an Rd object on success or a \code{try-error} object otherwise } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ##---- Should be DIRECTLY executable !! ---- } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{internal} Rdpack/man/parse_usage_text.Rd0000644000176200001440000000265413501141722016065 0ustar liggesusers\name{parse_usage_text} \alias{parse_usage_text} \alias{parse_1usage_text} \title{ Parse usage text } \description{ Parse usage text. } \usage{ parse_1usage_text(text) parse_usage_text(text) } \arguments{ \item{text}{ conceptually, the content of the usage section of one or more Rd objects, a character vector, see Details. } } \details{ For \code{parse_usage_text}, \code{text} is a character vector representing the contents of the usage section of an Rdo object. \code{parse_usage_text} does some preprocessing of \code{text} then calls \code{parse_1usage_text} for each usage statement. The preprocessing changes "\verb{\\}\verb{dots}" to "\verb{...}" and converts S3- and S4-method descriptions to a form suitable for \code{parse()}. The text is then parsed (with \code{parse}) and "\verb{srcref}" attribute removed from the parsed object. todo: currently no checks is made for Rd comments in \code{text}. \code{parse_1usage_text} processes the usage statement of one object and calls \code{\link{pairlist2f_usage1}} to convert it to an object from S3 class \code{"f_usage"}. } \value{ for \code{parse_1usage_text}, an object from S3 class \code{"f_usage"}, see \code{\link{pairlist2f_usage1}} for its structure. for \code{parse_usage_text}, a list containing one element for each usage entry, as prepared by \code{parse_1usage_text} } \author{Georgi N. Boshnakov} \keyword{RdoUsage} Rdpack/man/rdo_text_restore.Rd0000644000176200001440000000327713501141722016120 0ustar liggesusers\name{rdo_text_restore} \alias{rdo_text_restore} %- Also NEED an '\alias' for EACH other topic documented here. \title{Ensure exported fragments of Rd are as the original} \description{ For an Rd object imported from a file, this function ensures that fragments that were not not changed during the editing of the object remain unchanged in the exported file. This function is used by reprompt() to ensure exactly that. } \usage{ rdo_text_restore(cur, orig, pos_list, file) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{cur}{an Rd object} \item{orig}{an Rd object} \item{pos_list}{a list of srcref objects specifying portions of files to replace, see 'Details'.} \item{file}{a file name, essentially a text representation of \verb{cur}.} } \details{ This is essentially internal function. It exists because, in general, it is not possible to restore the original Rd file from the Rd object due to the specifications of the Rd format. The file exported from the parsed Rd file is functionally equivalent to the original but equivalent things for the computer are not necessarily equally pleasant for humans. This function is used by \code{reprompt} when the source is from a file and the option to keep the source of unchanged sections as in the original. \strong{todo:} needs clean up, there are unnecessary arguments in particular. } \value{ the main result is the side effect of replacing sections in \code{file} not changed by \code{reprompt} with the original ones. } \author{ Georgi N. Boshnakov } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{reprompt}} } \keyword{RdoProgramming} Rdpack/man/Rdo_macro.Rd0000644000176200001440000000504413501141722014424 0ustar liggesusers\name{Rdo_macro} \alias{Rdo_macro} \alias{Rdo_macro1} \alias{Rdo_macro2} \alias{Rdo_item} \alias{Rdo_sigitem} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Format Rd fragments as macros (todo: a baffling title!) } \description{ Format Rd fragments as macros, generally by putting them in a list and setting the "Rd_tag" as needed. } \usage{ Rdo_macro(x, name) Rdo_macro1(x, name) Rdo_macro2(x, y, name) Rdo_item(x, y) Rdo_sigitem(x, y, newline = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{an object.} \item{y}{an object.} \item{name}{the "\verb{Rd_tag}", a string.} \item{newline}{currently ignored.} } \details{ \code{Rdo_macro1} wraps \code{x} in a list with "\verb{Rd_tag}" \code{name}. This is the representation of Rd macros with one argument. \code{Rdo_macro2} basically wraps a possibly transformed \code{x} and \code{y} in a list with "\verb{Rd_tag}" \code{name}. More specifically, if \code{x} has a non-NULL "\verb{Rd_tag}", \code{x} is wrapped in \code{list}. Otherwise \code{x} is left as is, unless \code{x} is a character string, when it is converted to a text Rd element and wrapped in \code{list}. \code{y} is processed in the same way. This is the representation of Rd macros with two arguments. \code{Rdo_macro} returns an object with "\verb{Rd_tag}" \code{name}, constructed as follows. If \code{x} is not of class "character", its attribute "\verb{Rd_tag}" is set to \code{name} and the result returned without further processing. Otherwise, if it is of class "character", \code{x} is tagged as an Rd "TEXT" element. It is then wrapped in a list but only if \code{name} is one of "\verb{\eqn}" or "\verb{\deqn}". Finally, \code{Rdo_macro1} is called on the transformed object. \code{Rdo_item} is equivalent to \code{Rdo_macro2} with \code{name} set to "\verb{\item}". \code{Rdo_sigitem} is for items which have the syntax used in description of signatures. In that case the first argument of "\verb{\item}" is wrapped in "\verb{\code}". If \code{y} is missing, a text inviting the author to provide a description of the function for this signature is inserted. } \value{ An Rd element with appropriately set \verb{Rd_tag}, as described in `Details'. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/Rdo_which.Rd0000644000176200001440000000420113501141722014417 0ustar liggesusers\name{Rdo_which} \alias{Rdo_which} \alias{Rdo_which_tag_eq} \alias{Rdo_which_tag_in} %- Also NEED an '\alias' for EACH other topic documented here. \title{Find elements of Rd objects for which a condition is true} \description{Find elements of Rd objects for which a condition is true.} \usage{ Rdo_which(rdo, fun) Rdo_which_tag_eq(rdo, tag) Rdo_which_tag_in(rdo, tags) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{fun}{a function to evaluate with each element of \code{rdo}.} \item{tag}{a character string.} \item{tags}{a character vector.} } \details{ These functions return the indices of the (top level) elements of \code{rdo} which satisfy a condition. \code{Rdo_which} finds elements of \code{rdo} for which the function \code{fun} gives TRUE. \code{Rdo_which_tag_eq} finds elements with a specific \code{Rd_tag}. \code{Rdo_which_tag_in} finds elements whose \code{Rd_tag}'s are among the ones specified by \code{tags}. %% ~~ If necessary, more details than the description above ~~ } \value{ a vector of positive integers } % \references{ % %% ~put references to the literature/web site here ~ % } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Rdo_locate}} which searches recursively the Rd object. } \examples{ ## get the help page for topoc seq() rdo_seq <- tools::Rd_db("base")[["seq.Rd"]] ## find location of aliases in the topic ( ind <- Rdo_which_tag_eq(rdo_seq, "\\alias") ) ## extract the first alias rdo_seq[[ ind[1] ]] \dontrun{ ## extract all aliases rdo_seq[ind] } db_bibtex <- tools::Rd_db("bibtex") names(db_bibtex) ## Rdo object for read.bib() rdo_read.bib <- db_bibtex[["read.bib.Rd"]] Rdo_tags(rdo_read.bib) ## which elements of read.bib are aliases? Rdo_which_tag_eq(rdo_read.bib, "\\alias") rdo_read.bib[[3]] ## which elements of read.bib contain R code? Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "RCODE") ) rdo_read.bib[[5]] ## which contain prose? Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "TEXT") ) } \keyword{Rd} Rdpack/man/list_Rd.Rd0000644000176200001440000000350513501141722014117 0ustar liggesusers\name{list_Rd} \alias{list_Rd} %- Also NEED an '\alias' for EACH other topic documented here. \title{Combine Rd fragments} \description{Combine Rd fragments and strings into one object.} \usage{ list_Rd(..., Rd_tag = NULL, Rd_class = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{\dots}{named list of objects to combine, see `Details'.} \item{Rd_tag}{if non-null, a value for the \verb{Rd_tag} of the result.} \item{Rd_class}{logical; if TRUE, the result will be of class "Rd".} } \details{ The names of named arguments specify tags for the corresponding elements (not arbitrary tags, ones that are converted to macro names by prepending backslash to them). This is a convenient way to specify sections, items, etc, in cases when the arguments have not being tagged by previous processing. Character string arguments are converted to the appropriate Rd pieces. Argument \code{...} may contain a mixture of character vactors and Rd pieces. } \value{ an Rd object or list with \verb{Rd_tag} attribute, as specified by the arguments. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{c_Rd}} } \examples{ ## see also the examples for c_Rd dummyfun <- function(x, ...) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", Rd_class=TRUE ) Rdo_show(u1) # call reprompt to fill the arguments section (and correct the usage) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) # check that the result can be parsed and show it. Rdo_show(tools::parse_Rd(fn)) unlink(fn) } \keyword{RdoBuild} Rdpack/man/parse_text.Rd0000644000176200001440000000343013501141722014672 0ustar liggesusers\name{parse_text} \alias{parse_text} %- Also NEED an '\alias' for EACH other topic documented here. \title{Parse expressions residing in character vectors} \description{Parse expressions residing in character vectors.} \usage{ parse_text(text, ..., keep = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{text}{the text to parse, normally a character vector but can be anything that \code{parse} accepts for this artgument.} \item{\dots}{additional arguments to be passed on to \code{parse}.} \item{keep}{required setting for option \verb{keep.source}, see details.} } \details{ This is like \code{parse(text=text,\dots)} with the additional feature that if the setting of option "keep.source" is not as requested by argument \code{keep}, it is set to \code{keep} before calling \code{parse} and restored afterwards. This function is no longer exported by \pkg{Rdpack} since it is here for historical reasons and to avoid unnecessary dependence on \pkg{gbutils}. Use the equivalent \code{gbutils::parse_text} instead. } \value{ an expression representing the parsed text, see \code{link{parse}} for details } \author{Georgi N. Boshnakov} \note{ The usual setting of option "keep.source" in interactive sessions is TRUE. However, in `R CMD check' it is FALSE. As a consequence, examples from the documentation may run fine when copied and pasted in an R session but (rightly) fail `R CMD check', when they depend on option "keep.source" being \code{TRUE}. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{parse}}, \code{\link[gbutils]{parse_text}} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{programming} \keyword{internal} Rdpack/man/Rdo_empty_sections.Rd0000644000176200001440000000306113501141722016365 0ustar liggesusers\name{Rdo_empty_sections} \alias{Rdo_empty_sections} \alias{Rdo_drop_empty} %- Also NEED an '\alias' for EACH other topic documented here. \title{Find or remove empty sections in Rd objects} \description{Find or remove empty sections in Rd objects} \usage{ Rdo_empty_sections(rdo, with_bs = FALSE) Rdo_drop_empty(rdo, sec = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object or Rd source text.} \item{with_bs}{if \code{TRUE} return the section names with the leading backslash.} \item{sec}{not used} } \details{ The function \code{checkRd} is used to determine which sections are empty. } \value{ For \code{Rdo_empty_sections}, the names of the empty sections as a character vector. For \code{Rdo_drop_empty}, the Rd object stripped from empty sections. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ dummyfun <- function(x) x rdo8 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "", details = "", note = "", Rd_class=TRUE ) Rdo_empty_sections(rdo8) # "details" "note" "author" rdo8a <- Rdo_drop_empty(rdo8) Rdo_empty_sections(rdo8a) # character(0) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{Rdprocessing} \keyword{RdoBuild} Rdpack/man/insert_all_ref.Rd0000644000176200001440000000442413521613435015517 0ustar liggesusers\name{insert_all_ref} \alias{insert_all_ref} \title{Insert references cited in packages} \description{Insert references cited in packages. } \usage{ insert_all_ref(refs, style = "") } \arguments{ \item{refs}{ % TODO: is this description up-to-date? a matrix specifying key-package pairs of the references to insert. Can also be a cached environment, see Details. } \item{style}{a bibstyle, see Details.} } \details{ \code{insert_all_ref} is the workhorse behind several Rd macros for inclusion of references in Rd documentation. Argument \code{refs} is a two-column character matrix. The first column specifies bibtex keys. To specify more than one key in a single element, separate them by commas. The second column specifies the package in which to look for the keys. A key equal to "*" requests all keys in the corresponding package. \code{insert_all_ref} drops duplicated keys, collects the references, and converts them to Rd textual representation for inclusion in Rd documentation files. \code{refs} can be a cached environment. This is for internal use and not documented. } \value{ for \code{insert_all_ref}, a character string containing a textual representation of the references, suitable for inclusion in an Rd file } \references{ Currently there are no citations. Nevethelese, I have put \verb{\insertAllCited{}} just after this paragraph to show the message that it prints when there are no citations. This seems better than printing nothing but it may be argued also that there should be a warning as well. \insertAllCited{} } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } % % %% ~Make other sections like Warning with \section{Warning }{....} ~ % % \seealso{ % %% ~~objects to See Also as \code{\link{help}}, ~~~ % } \examples{ bibs <- bibtex::read.bib(package = "tools") bibs ## a reference from package Rdpack cat(insert_all_ref(matrix(c("Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## more than one reference from package Rdpack, separate the keys with commas cat(insert_all_ref(matrix(c("parseRd,Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## all references from package Rdpack cat(insert_all_ref(matrix(c("*", "Rdpack"), ncol = 2)), "\n") } \keyword{documentation} % use one of RShowDoc("KEYWORDS") Rdpack/man/predefined.Rd0000644000176200001440000000551413501141722014626 0ustar liggesusers\name{predefined} \alias{Rdo_predefined_sections} \alias{Rdo_piece_types} \alias{rdo_top_tags} \title{ Tables of predefined sections and types of pieces of Rd objects } \description{ Tables of predefined sections and types of pieces of Rd objects. } \usage{ Rdo_predefined_sections Rdo_piece_types rdo_top_tags } \details{ The Rd syntax defines several tables \insertCite{parseRd}{Rdpack}. \pkg{Rdpack} stores them in the variables described here. \code{Rdo_predefined_sections} is a named character vector of types of the top level sections of an Rd object. \code{Rdo_piece_types} is a named character vector giving the types of the core (all possible?) Rd macros. \strong{NOTE:} These objects are hard coded and need to be updated if the specifications of the Rd format are updated. todo: write functions that go through existing Rd documentation to discover missing or wrong items. } \value{ for \code{Rdo_predefined_sections}, the name-value pairs are given in the following table. For example, \code{Rdo_predefined_sections["examples"]} is \Sexpr[stage=build,results=rd]{Rdo_predefined_sections["examples"]}. \Sexpr[stage=build,results=rd]{require(Rdpack); paste( "\\\\ifelse{latex}{\\\\out{", "\\\\begin{tabular}{ll|lll}", paste(names(Rdo_predefined_sections)[1:5], Rdo_predefined_sections[1:5], " ", names(Rdo_predefined_sections)[-(1:5)], Rdo_predefined_sections[-(1:5)], sep=" & ", collapse="\\\\\\\\\\\\\\\\ \n"), "\\\\end{tabular}", "}}{", "\\\\tabular{lllll}{", paste(names(Rdo_predefined_sections)[1:5], Rdo_predefined_sections[1:5], " | ", names(Rdo_predefined_sections)[-(1:5)], Rdo_predefined_sections[-(1:5)], sep=" \\\\tab ", collapse="\\\\cr\n"), "}", "}" )} for \code{Rdo_piece_types}, the name-value pairs are: \Sexpr[stage=build,results=rd]{ paste( "\\\\ifelse{latex}{\\\\out{", "\\\\begin{tabular}{ll|ll|ll|ll|ll|ll}", paste(names(Rdo_piece_types), " & ", Rdo_piece_types, c(rep(" & ",2),"\\\\\\\\\\\\\\\\"), sep="", collapse="\n"), "\\\\end{tabular}", "}}{", "\\\\tabular{llllllllllll}{", paste(names(Rdo_piece_types), "\\\\tab ", Rdo_piece_types, c(rep(paste("\\\\tab ", "|", sep=""),2), "\\\\cr"), sep="", collapse="\n"), "}", "}" )} for \code{rdo_top_tags}, the values are: \Sexpr[stage=build,results=rd]{ paste("\\\\tabular{lllll}{", paste(sub("^[#]", "\\\\\\\\verb{#}", sub("^([\\\\])", "{\\\\\\\\\\\\1}", rdo_top_tags)), c(rep("\\\\tab ",4),"\\\\cr"), sep="", collapse="\n"), "}")} Note that most, but not all, are prefixed with backaslash. } \references{ \insertAllCited{} } \keyword{Rd} Rdpack/man/get_sig_text.Rd0000644000176200001440000000644613501141722015213 0ustar liggesusers\name{get_sig_text} \alias{get_sig_text} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Produce the textual form of the signatures of available methods for an S4 generic function } \description{ Produce the textual form of the signatures of available methods for an S4 generic function. } \usage{ get_sig_text(rdo, package = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{package}{if of class "character", give only methods defined by \code{package}, otherwise give all methods. } } \details{ Signatures are found using function \code{findMethodSignatures} from package "methods". Here we find all methods for \code{show()} defined in package \code{"methods"} and print the first few of them: \printExample{fn <- utils::help("show-methods", package = "methods"); rdo <- utils:::.getHelpFile(fn); head(get_sig_text(rdo))} } \value{ A character vector with one element for each method. } \author{Georgi N. Boshnakov} \note{ todo: It would be better to call promptMethods() to get the signatures but in version R-2.13.x I had trouble with argument `where' (could not figure out how to use it to restrict to functions from a package; also, promptMethods() seemed to call the deprecated function getMethods()). Check how these things stand in current versions of \R, there may be no problem any more (checked, in 2.14-0 it is the same). } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ## load another package with some S4 methods ("methods" is already loaded) require("stats4") rdo <- Rdo_fetch("show", package = "methods") ## alternatively: #fn <- help("show-methods", package = "methods") #rdo <- utils:::.getHelpFile(fn) ## this will find all methods for "show" in currently loaded packages ## (print only some of them) head(get_sig_text(rdo)) ## this will select only the ones from package "stats4" get_sig_text(rdo, package = "stats4") ## this is also fine (interactively) but need to choose ## the appropriate element of "fn" if length(fn) > 1 #fn <- help("show-methods") ## this finds nothing #fn <- help("logLik-methods", package = "methods") #fn Rdo_fetch("logLik-methods", package = "methods") ## this does #fn <- help("logLik-methods", package = "stats4") #rdo <- utils:::.getHelpFile(fn) rdo2 <- Rdo_fetch("logLik-methods", package = "stats4") get_sig_text(rdo2) get_sig_text(rdo2, package = "stats4") ## only default method defined ## using this: setGeneric("f1", function(x, y){NULL}) ## since the following gives error in pkgdown: #f1 <- function(x, y){NULL} #setGeneric("f1") fn <- tempfile() reprompt("f1", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) setClass("aRdpack") setClass("bRdpack") ## several methods defined setGeneric("f4", function(x, y){NULL}) setMethod("f4", c("numeric", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("bRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "bRdpack"), function(x, y){NULL}) reprompt("f4", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) unlink(fn) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoS4} %\keyword{RdoProgramming} Rdpack/man/parse_Rdpiece.Rd0000644000176200001440000000525313521263275015300 0ustar liggesusers\name{parse_Rdpiece} \alias{parse_Rdpiece} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Parse a piece of Rd source text } \description{ Parse a piece of Rd source text. } \usage{ parse_Rdpiece(x, result = "") } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{the piece of Rd text, a character vector.} \item{result}{if "text", converts the result to printable text (e.g. to be shown to the user), otherwise returns an Rd object.} } \details{ \code{parse_Rdpiece} parses a piece of source Rd text. The text may be an almost arbitrary piece that may be inserted in an Rd source file, except that it should not be a top level section (use \code{\link{parse_Rdtext}} for sections). Todo: it probably can be also a parsed piece, check! This is somewhat tricky since \code{parse_Rd} does not accept arbitrary piece of Rd text. It handles either a complete Rd source or a fragment, defined (as I understand it) as a top level section. To circumvent this limitation, this function constructs a minimal complete Rd source putting argument \code{x} in a section (currently "Note") which does not have special formatting on its own. After parsing, it extracts only the part corresponding to \code{x}. \code{parse_Rdpiece} by default returns the parsed Rd piece. However, if \code{result="text"}, then the text is formatted as the help system would do when presenting help pages in text format. \strong{TODO:} add an argument for macros? } \value{ a parsed Rd piece or its textual representation as described in Details } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ # the following creates Rd object rdo dummyfun <- function(x) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "A. Author", Rd_class = TRUE ) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) # let's prepare a new item rd <- "\\\\item{...}{further arguments to be passed on.}" newarg <- parse_Rdtext(rd, section = "\\\\arguments") # now append 'newarg' to the arguments section of rdo iarg <- which(tools:::RdTags(rdo) == "\\\\arguments") rdoa <- append_to_Rd_list(rdo, newarg, iarg) Rdo_show(rdoa) # for arguments and other frequent tasks, there are specialised functions rdob <- Rdo_append_argument(rdo, "\\dots", "further arguments to be passed on.") Rdo_show(reprompt(rdob, filename = fn)) unlink(fn) } \keyword{RdoProgramming} Rdpack/man/Rdo_tags.Rd0000644000176200001440000000265413501141722014265 0ustar liggesusers\name{Rdo_tags} \alias{Rdo_tags} %- Also NEED an '\alias' for EACH other topic documented here. \title{Give the Rd tags at the top level of an Rd object} \description{Give the Rd tags at the top level of an Rd object.} \usage{ Rdo_tags(rdo, nulltag = "") } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object.} \item{nulltag}{a value to use when \code{Rd_tag} is missing or NULL.} } \details{ The \verb{"Rd_tag"} attributes of the top level elements of \code{rdo} are collected in a character vector. Argument \code{nulltag} is used for elements without that attribute. This guarantees that the result is a character vector. \code{Rdo_tags} is similar to the internal function \code{tools:::RdTags}. Note that \code{tools:::RdTags} may return a list in the rare cases when attribute \code{Rd_tags} is not present in all elements of \code{rdo}. %% ~~ If necessary, more details than the description above ~~ } \value{ a character vector } % \references{ % %% ~put references to the literature/web site here ~ % } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Rdo_which}}, \code{\link{Rdo_which_tag_eq}}, \code{\link{Rdo_which_tag_in}} %% ~~objects to See Also as \code{\link{help}}, ~~~ } \examples{ ##---- Should be DIRECTLY executable !! ---- } \keyword{Rd} Rdpack/man/RStudio_reprompt.Rd0000644000176200001440000000246213501141722016041 0ustar liggesusers\name{RStudio_reprompt} \alias{RStudio_reprompt} \title{Call reprompt based on RStudio editor contents} \description{This function uses the RStudio API to call \code{\link{reprompt}} on either the current help file in the editor, or if a name is highlighted in a \file{.R} file, on that object.} \usage{ RStudio_reprompt(verbose = TRUE) } \arguments{ \item{verbose}{ If \code{TRUE} print progress to console. } } \details{ This function depends on being run in RStudio; it will generate an error if run in other contexts. It depends on code being in a package that has already been built, installed, and attached. In RStudio, this means you should run \dQuote{Install and Restart} before running this function. It is automatically installed into RStudio as an add-in called \dQuote{Reprompt}. Whether invoked directly or through the add-in, it looks at the file currently being edited in the code editor. If it is an \file{.Rd} file, it will run \code{\link{reprompt}} on that file. If it is an \R source file, it will look for a selected object name. It queries the help system to find if there is already a help page for that name, and if so, works on that. If not, it will try to create one. } \value{ \code{NULL}, invisibly. } \author{ Duncan Murdoch } \seealso{ \code{\link{reprompt}}, \code{\link{prompt}} } Rdpack/man/Rdo_locate_leaves.Rd0000644000176200001440000000301313521254557016140 0ustar liggesusers\name{Rdo_locate_leaves} \alias{Rdo_locate_leaves} \title{Find leaves of an Rd object using a predicate} \description{Apply a function to the character leaves of an Rd object and return the indices of those for which the result is TRUE.} \usage{ Rdo_locate_leaves(object, f = function(x) TRUE) } \arguments{ \item{object}{the object to be examined, usually a list.} \item{f}{a function (predicate) returning TRUE for elements with the desired property. } } \details{ \code{object} can be any list whose elements are character strings or lists. The structure is examined recursively. If \code{object} is a character vector, it is enclosed in a list. This function provides a convenient way to locate leaves of an Rd object with a particular content. The function is not limited to Rd objects but it assumes that the elements of \code{object} are either lists or charater vectors and currently does not check if this is the case. \strong{todo:} describe the case of \code{list()} (\code{Rd_tag}'ed.) } \value{ a list of the positions of the leaves for which the predicate gives \code{TRUE}. Each position is an integer vector suitable for the \code{"[["} operator. } \author{Georgi N. Boshnakov} \examples{ dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) f <- function(x) Rdo_is_newline(x) nl <- Rdo_locate_leaves(rdo, f ) length(nl) # there are quite a few newline leaves! unlink(fn) } %\keyword{Rdlookup} \keyword{Rd} Rdpack/man/promptPackageSexpr.Rd0000644000176200001440000000665513501141722016347 0ustar liggesusers\name{promptPackageSexpr} \alias{promptPackageSexpr} %- Also NEED an '\alias' for EACH other topic documented here. \title{Generates a shell of documentation for an installed package} \description{ Generates a shell of documentation for an installed package. The content is similar to `promptPackage' but information that can be computed is produced with Sexpr's so that it is always up to date. } \usage{ promptPackageSexpr(package, filename = NULL, final = TRUE, overview = FALSE, bib = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{package}{name of a package, a string} \item{filename}{name of a file where to write the generated Rd content, a string. The default should be sufficient in most cases.} \item{final}{logical; if \code{TRUE} the content should be usable without manual editing.} \item{overview}{logical; if \code{TRUE} creates sections with hints what to put in them, otherwise such sections are written to the file but are commented out.} \item{bib}{If TRUE, create a comment line in the references section that will cause \code{\link{rebib}} to import all references from the default bib file. } } \details{ The generated skeleton is functionally (almost) equivalent to that produced by \code{promptPackage}. The difference is that while \code{promptPackage} computes some information and inserts it verbatim in the skeleton, \code{promptPackageSexpr} inserts Sexpr's for the computation of the same information at package build time. In this way there is no need to manually update information like the version of the package. The index of functions (which contains their descriptions) does not need manual updating, as well. \code{promptPackageSexpr} needs to be called only once to create the initial skeleton. Then the Rd file can be edited as needed. If the Rd file is generated with the option \code{bib = TRUE} (or the appropriate lines are added to the refernces section manually) the references can be updated at any time by a call of \code{rebib}. todo: At the moment \code{final=FALSE} has the effect described for \code{overview}. At the time of writing this (2011-11-18) I do not remember if this is intentional or the corresponding `if' clause contains \code{|} by mistake. } \value{ the name of the file (invisibly) } \author{Georgi N. Boshnakov} \note{ The automatically generated information is that of the installed (or at least built) package. Usually this is not a problem (and this is the idea of the function) but it means that if a developer is adding documentation for previously undocumented functions, they will appear in the 'Index' section only after the package is installed again. Similarly, if the description file of the package is changed, the package needs to be installed again for the changes to appear in the overview. Since the documentation is installed together with the package this is no surprise, of course. This may only cause a problem if documentation is produced with \code{R CMD Rd2pdf} before the updated version is installed. This function is not called \code{repromptXXX} since the idea is that it is called only once and then the Rd file can be edited freely, see also `Details'. } %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Rd} Rdpack/man/makeVignetteReference.Rd0000644000176200001440000000776413501141722016774 0ustar liggesusers\name{makeVignetteReference} \alias{makeVignetteReference} \alias{vigbib} \title{Make bibtex references for vignettes} \description{Make bibtex references for vignettes} \usage{ makeVignetteReference(package, vig = 1, verbose = TRUE, title, author, type = "pdf", bibtype = "Article", key = NULL) vigbib(package, verbose = TRUE, \dots, vig = NULL) } \arguments{ \item{package}{ a character string, the name of an installed package. } \item{vig}{ an integer number or a character string identifying a vignette. } \item{verbose}{ if \code{TRUE}, print the references in Bibtex format. } \item{title}{a character string, title of the vignette, see Details.} \item{author}{a character string, title of the vignette, see Details.} \item{type}{a character string, type of the vignette, such as \code{"pdf"} or \code{"html"}. Currently ignored. } \item{bibtype}{a character string, Bibtex type for the reference, defaults to \code{"Article"}. } \item{key}{a character string specifying a key for the Bibtex entry. If missing, suitable key is generated automatically. } \item{...}{ arguments passed by \code{vigbib()} to \code{makeVignetteReference()}. } } \details{ \code{vigbib()} generates Bibtex references for all vignettes in a package. \code{makeVignetteReference()} produces a Bibtex entry for a particular vignette. There seems to be no standard way to cite vignettes in R packages. For vignettes that are complete journal papers (most notably in the Journal of Statistical Software), the authors would usually prefer the papers to be cited, rather than the vignette. In any case, consulting the output of \code{citation("a_package")} is the best starting point. If the vignette has been extended substantially after the paper was published, cite both. In many cases it is sufficient to give the command that opens the vignette, e.g.: \code{vignette("Inserting_bibtex_references", package = "Rdpack")}. \code{makeVignetteReference()} makes a Bibtex entry for one vignette. It looks for the available vignettes using \code{vignette(package=package)}. Argument \code{vig} can be a character string identifying the vignette by the name that would be used in a call to \code{vignette()}. It can also be an integer, identifying the vignette by the index (in the order in which the vignettes are returned by \code{vignette()}). By default the first vignette is returned. If \code{vig} is not suitable, a suitable list of alternatives is printed. For \code{vigbib()} it is sufficient to give the name of a package. It accepts all arguments of \code{makeVignetteReference()} except \code{vig} (actually, supplying \code{vig} is equivallent to calling \code{makeVignetteReference()} directly). The remaining arguments can be used to overwrite some automatically generated entries. For example, the vignette authors may not be the same as the package authors. } \value{ a bibentry object containing the generated references (the Bibtex entries are also printed, so that they can be copied to a bib file) } %\references{ %%% ~put references to the literature/web site here ~ %} \author{Georgi N. Boshnakov} %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ vigbib("Rdpack") makeVignetteReference("Rdpack", vig = 1) makeVignetteReference("Rdpack", vig = "Inserting_bibtex_references") ## the first few characters of the name suffice: makeVignetteReference("Rdpack", vig = "Inserting_bib") ## this gives an error but also prints the available vignettes: ## makeVignetteReference("Matrix", vig = "NoSuchVignette") vigbib("utils") makeVignetteReference("utils", vig = 1) ## commented out since can be slow: ## high <- installed.packages(priority = "high") ## highbib <- lapply(rownames(high), function(x) try(Rdpack:::vigbib(x, verbose = FALSE))) } \keyword{bibtex} % use one of RShowDoc("KEYWORDS") Rdpack/man/Rdo2Rdf.Rd0000644000176200001440000001022313501141722013754 0ustar liggesusers\name{Rdo2Rdf} \alias{Rdo2Rdf} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Convert an Rd object to Rd file format } \description{ Converts an Rd object to Rd format and saves it to a file or returns it as a character vector. It escapes percents where necessary and (optionally) backslashes in the examples section. } \usage{ Rdo2Rdf(rdo, deparse = FALSE, ex_restore = FALSE, file = NULL, rcode = TRUE, srcfile = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object or a character vector, see `Details'.} \item{deparse}{logical, passed to the print method for Rd objects, see `Details'. } \item{ex_restore}{logical, if \code{TRUE} escapes backslashes where necessary. } \item{file}{a filename where to store the result. If \code{NULL} or "missing", the result is returned as a character vector. } \item{rcode}{if TRUE, duplicate backslahes in RCODE elements, see Details. } \item{srcfile}{NULL or a file name, see 'Details'.} } \details{ The description here is rather technical and incomplete. In any case it concerns almost exclusively Rd files which use escape sequences containing multiple consecutive backslashes or escaped curly braces (such things appear in regular expressions, for example). In principle, this function should be redundant, since the \code{print} and \code{as.character} methods for objects of class "Rd" would be expected to do the job. I was not able to get the desired result that way (the \code{deparse} option to \code{print} did not work completely for me either). Arguments \code{ex_restore} and \code{rcode} were added on an ad-hoc basis. \code{rcode} is more recent and causes \code{Rdo2Rdf} to duplicate backslashes found in any element \code{Rd_tag}-ed with "RCODE". \code{ex_restore} does the same but only for the examples section. In effect, if \code{rcode} is TRUE, \code{ex_restore} is ignored. The initial intent of this function (and the package Rdpack as a whole was not to refer to the Rd source file. However, there is some flexibility in the Rd syntax that does not allow the source file to be restored identically from the parsed object. This concerns mainly backslahes (and to some extent curly braces) which in certain contexts may or may not be escaped and the parsed object is the same. Although this does not affect functionality, it may be annoying if the escapes in sections not examined by \code{reprompt} were changed. If \code{srcfile} is the name of a file, the file is parsed and the Rd text of sections of \code{rdo} that are identical to sections from \code{srcfile} is taken directly from \code{srcfile}, ensuring that they will be identical to the original. } \value{ \code{NULL}, if \code{file} is not \code{NULL}. Otherwise the Rd formatted text as a character vector. } \author{Georgi N. Boshnakov} \note{ Here is an example when the author's Rd source cannot be restored exactly from the parsed object. In the Rd source "author" has two backslashes here: \verb{\\author}. In the Rd source "author" has one backslash here: \verb{\author}. Both sentences are correct and the parsed file contains only one backslash in both cases. If \code{reprompt} looks only at the parsed object it will export one backslash in both cases. So, further reprompt()-ing will not change them again. This is if \code{reprompt} is called with \code{sec_copy = FALSE}. With the default \code{sec_copy = TRUE}, \code{reprompt} calls \code{Rdo2Rdf} with argument \code{srcfile} set to the name of the Rd file and since \code{reprompt} does not modify section "Note", its text is copied from the file and the author's original preserved. However, the arguments of \verb{\eqn} are parse_Rd-ed differently (or so it seems) even though they are also in verbatim. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ # # this keeps the backslashes in "author" (see Note above) # reprompt(infile="./man/Rdo2Rdf.Rd") # # this output "author" preceded by one backslash only. # reprompt(infile="./man/Rdo2Rdf.Rd", sec_copy = FALSE) } \keyword{Rd} Rdpack/man/c_Rd.Rd0000644000176200001440000000413413501141722013365 0ustar liggesusers\name{c_Rd} \alias{c_Rd} \title{Concatenate Rd objects or pieces} \description{Concatenates Rd objects or pieces} \usage{ c_Rd(...) } \arguments{ \item{\dots}{objects to be concatenated, Rd objects or character strings, see `Details'. } } \details{ The arguments may be a mixture of lists and character strings. The lists are typically "Rd" objects or pieces. The character strings may also be elements of "Rd" objects carrying "Rd_tag" attributes. The "Rd_tag" attribute of character strings for which it is missing is set to "TEXT". Finally, each character element of \code{"\dots"} is enclosed in \code{list}. Eventually all arguments become lists and they are concatenated using \code{c()}. If any of the arguments is of class "Rd", the class of the result is set to "Rd". Otherwise, the "Rd_tag" of the result is set to the first (if any) non-null "Rd_tag" in the arguments. The structure of "Rd" objects is described by \insertCite{parseRd;textual}{Rdpack}. } \value{ An Rd object or a list whose attribute "Rd_tag" is set as descibed in `Details' } \author{Georgi N. Boshnakov} \seealso{ \code{\link{list_Rd}} } \references{ \insertAllCited{} } \examples{ a1 <- char2Rdpiece("Dummyname", "name") a2 <- char2Rdpiece("Dummyallias1", "alias") a3 <- char2Rdpiece("Dummy title", "title") a4 <- char2Rdpiece("Dummy description", "description") ## The following are equivalent ## (gbRd::Rdo_empty() creates an empty list of class 'Rd') b1 <- c_Rd(gbRd::Rdo_empty(), list(a1), list(a2), list(a3), list(a4)) c1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2, a3, a4)) d1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), list(a3, a4)) identical(c1, b1) identical(c1, d1) Rdo_show(b1) ## insert a newline d1n <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), Rdo_newline(), list(a3, a4)) str(d1n) ## When most of the arguments are character strings ## the function 'list_Rd' may be more convenient. u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) Rdo_show(u1) } \keyword{RdoBuild} %\keyword{RdoProgramming} Rdpack/man/parse_Rdname.Rd0000644000176200001440000000264413501141722015122 0ustar liggesusers\name{parse_Rdname} \alias{parse_Rdname} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Parse the name section of an Rd object } \description{ Parse the name section of an Rd object. } \usage{ parse_Rdname(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} } \details{ The content of section "\verb{\name}" is extracted. If it contains a hyphen, `-', the part before the hyphen is taken to be the topic (usually a function name), while the part after the hyphen is the type. If the name does not contain hyphens, the type is set to the empty string. } \value{ a list with two components: \item{fname}{name of the topic, usually a function} \item{type}{type of the topic, such as \verb{"method"}} } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class=TRUE ) parse_Rdname(u1) u2 <- list_Rd(name = "dummyclass-class", alias = "Dummyclass", title = "Class dummyclass", description = "Objects and methods for something.", Rd_class=TRUE ) parse_Rdname(u2) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoProgramming} Rdpack/man/Rdo_get_item_labels.Rd0000644000176200001440000000223213501141722016436 0ustar liggesusers\name{Rdo_get_item_labels} \alias{Rdo_get_item_labels} \title{Get the labels of items in an Rd object} \description{Get the labels of items in an Rd object.} \usage{ Rdo_get_item_labels(rdo) } \arguments{ \item{rdo}{an Rd object.} } \details{ \code{Rdo_get_item_labels(rdo)} gives the labels of all \code{"\item"}s in \code{rdo}. Argument \code{rdo} is often a section or other Rd object fragment, see the examples. } \value{ a character vector } \author{Georgi N. Boshnakov} \examples{ infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## get item labels found anywhere in the Rd object (items <- Rdo_get_item_labels(rd)) ## search only in section "arguments" (i.e., get argument names) ## (note [[1]] - there is only one arguments section) pos.args <- Rdo_locate_core_section(rd, "\\\\arguments")[[1]] (args <- Rdo_get_item_labels(rd[[pos.args$pos]])) ## search only in section "value" pos.val <- Rdo_locate_core_section(rd, "\\\\value")[[1]] (vals <- Rdo_get_item_labels(rd[[pos.val$pos]])) ## There are no other items in 'rd', so this gives TRUE: all.equal(items, c(args, vals)) # TRUE } \keyword{RdoProgramming} Rdpack/man/Rdpack-package.Rd0000644000176200001440000004164513501141722015323 0ustar liggesusers\name{Rdpack-package} \alias{Rdpack-package} \alias{Rdpack} \docType{package} \title{ \Sexpr[stage=build,results=hide]{require(Rdpack)} \Sexpr[stage=build,results=hide]{pd <- utils::packageDescription("Rdpack")} \Sexpr[stage=build,results=hide]{lb <- library(help="Rdpack", character.only=TRUE)} \Sexpr[stage=build]{pd$Title} } \description{ \Sexpr[stage=build]{pd$Description} } \details{ \tabular{ll}{ Package: \tab \Sexpr[stage=build]{pd$Package}\cr Type: \tab \Sexpr[stage=build]{pd$Type}\cr Version: \tab \Sexpr[stage=build]{pd$Version} \cr Date: \tab \Sexpr[stage=build]{pd$Date}\cr License: \tab \Sexpr[stage=build]{pd$License}\cr LazyLoad: \tab \Sexpr[stage=build]{pd$LazyLoad}\cr Built: \tab \Sexpr[stage=build]{pd$Built} } % % 2018-05-24 commenting out % Index: % % \Sexpr[stage=build,results=rd]{paste("\\\\preformatted{", paste(if(!is.null(lb$info[[2]])) lb$info[[2]] else "No entries",collapse="\\n"), "}", sep="")} % % Package \code{Rdpack} provides a number of functions for maintenance of documentation in \R packages. Although base \R and package \code{methods} have functions for creation of skeleton documentation, if a function gets a new argument or a generic gets a new method, then updating existing documentation is somewhat inconvenient. This package provides functions that update parts of the Rd documentation that can be dealt with automatically and leave manual changes untouched. For example, usage sections for functions are updated and if there are undescribed arguments, additional items are put in the `arguments' section. A set of functions and macros support inclusion of references and citations from BibTeX files in \R documentation (Rd and roxygen2). These tools use only facilities provided by base \R and package \pkg{bibtex} \insertCite{Rpack:bibtex}{Rdpack}. There are also convenience macros for inclusion of evaluated examples and graphs, which hide some of the hassle of doing this directly with the underlying \verb{\Sexpr}'s. The subsections below give additional details, see also the vignettes. \subsection{Creating and updating Rd files}{ The main function provided by this package is \code{\link{reprompt}}. There is also a function \code{\link{promptPackageSexpr}} for creating initial skeleton for overall package description such as this help page. \code{\link{reprompt}} produces a skeleton documentation for the requested object, similarly to functions like \code{prompt}, \code{promptMethods}, and \code{promptClass}. Unlike those functions, \code{\link{reprompt}} updates existing documentation (installed or in an Rd object or file) and produces a skeleton from scratch as a last resort only. If the documentation object describes more than one function, all descriptions are updated. Basically, \code{\link{reprompt}} updates things that are generated automatically, leaving manual editing untouched. The typical use of \code{reprompt} is with one argument, as in \preformatted{ reprompt(infile = "./Rdpack/man/reprompt.Rd") reprompt(reprompt) reprompt("reprompt") } \code{reprompt} updates the documentation of all objects described in the Rd object or file, and writes the updated Rd file in the current working directory, see \code{\link{reprompt}} for details. To describe a new function in an existing Rd file, just add something like \code{myfun()} and run reprompt to insert the correct signature, alias, etc. This works also for replacement functions, see \code{\link{reprompt}} for details. \code{\link{ereprompt}} updates the Rd documentation in a file, overwrites it and opens it in an editor. It calls \code{reprompt} to do the actual job but has different defaults. Which editor is opened, is system dependent, see the \code{\link[utils]{edit}} and \code{\link{ereprompt}} for futher details. Users who work on Rd files in RStudio can use add-in \dQuote{Reprompt} to invoke \code{reprompt} conveniently on an Rd file or on a selected object in an \R source code file, see \code{\link{RStudio_reprompt}}. This add-in was contributed by Duncan Murdoch. Users of Emacs/ESS have various options, depending on their workflow. One approach is to define a key to call \code{\link{ereprompt}} on the file being edited, see \href{https://github.com/GeoBosh/georgisemacs}{georgisemacs} for an example setup. \code{\link{promptPackageSexpr}} creates a skeleton for a package overview in file \verb{name-package.Rd}. Then the file can be edited as needed. This function needs to be called only once for a package since automatic generation of information in \verb{name-package.Rd} is achieved with Sexpr's at build time, not with verbatim strings (\code{promptPackage} used to insert verbatim strings but in recent versions of \R it also uses macros.). For example, the source of this help page is file `Rdpack-package.Rd'. It was initially produced using \preformatted{ promptPackageSexpr("Rdpack") } The factual information at the beginning of this help topic (the index above, the version and other stuff that can be determined automatically) is kept automatically up to date. } \subsection{References and Citations}{ Another set of functions is for management of bibliographic references in Rd files. The old approach based on function \code{\link{rebib}} is fully functional, see below, but the recommended way to insert references and citations is based on Rd macros. The provided Rd macros are fully portable and, in particular, work in Rd files and roxygen2 comments, see \code{\link{insertRef}} and vignette \code{vignette("Inserting_bibtex_references", "Rdpack")} for details and examples. The Bibtex source for the references and citations produced by the Rd macros is file "REFERENCES.bib", which should be located in the root of the package installation directory. \pkg{Rdpack} needs also to be mentioned in two places in file `DESCRIPTION'. These one-off preparation steps are enumerated below: \enumerate{ \item{ Put the following line in file `DESCRIPTION': \cr \verb{RdMacros: Rdpack} \cr (If there is already a line starting with 'RdMacros:', add \pkg{Rdpack} to the list on that line.) } \item{ Add \pkg{Rdpack} to the list of imports (\verb{Imports:} field) in file `DESCRIPTION'. } \item{ Add the following line to file `NAMESPACE': \preformatted{ importFrom(Rdpack,reprompt) } Alternatively, if \pkg{devtools} is managing your NAMESPACE file, the equivalent \pkg{roxygen2} line is: \preformatted{ #' @importFrom Rdpack reprompt} } \item{ Create file \code{"REFERENCES.bib"} in subdirectory \code{"inst/"} of the package and put the BibTeX references in that file. } } The Rd macro \code{\\insertRef} takes two arguments: a BibTeX key and the name of a package. Thus, \code{\\insertRef{key}{package}} inserts the reference whose key is \code{key} from "REFERENCES.bib" of the specified package (almost always the one being documented). % With \pkg{Rdpack (>= 0.6-1)}, Citations can be done with Rd macro \code{\\insertCite}, which inserts citation(s) for one or more BibTeX keys and records the keys. \code{\\insertCiteOnly} is similar to \code{\\insertCite} but does not record the keys. \code{\\insertNoCite} records the keys but does not produce citations. \code{\\insertAllCited} creates a bibliography including all references recorded by \code{\\insertCite} and \code{\\insertNoCite}. It is usually put in section \dQuote{References}, something like: \preformatted{ \references{ \insertAllCited{} } } in an Rd file. The analogous documentation chunk in roxygen2 might look like this: \preformatted{ #' @references #' \insertAllCited{} } Bibliography styles for lists of references are supported as well. Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested. Convenience functions \code{\link{makeVignetteReference}} and \code{\link{vigbib}} generate Bibtex entries for vignettes. } \subsection{Previewing documentation pages}{ It is convenient during development to be able to view the rendered version of the document page being edited. The function \code{\link{viewRd}} renders a documentation file in a source package and displays it as text or in a browser. It renders references properly in any workflow, including \pkg{devtools} development mode \insertCite{Rdevtools}{Rdpack} in Emacs/ESS, Rstudio, Rgui. This function is a good candidate to be assigned to a key in editors which support this. I created this function (in 2017) since the functions provided by \pkg{devtools} and Emacs/ESS are giving errors when processing pages containing Rd macros. } \subsection{Static Management of References}{ In the alternative approach, the function \code{\link{rebib}} updates the bibliographic references in an Rd file. Rdpack uses a simple scheme for inclusion of bibliographic references. The key for each reference is in a TeX comment line, as in: \preformatted{ \references{ ... \% bibentry: key1 \% bibentry: key2 ... } } \code{rebib} puts each reference after the line containing its key. It does nothing if the reference has been put by a previous call of \code{rebib}. If the Bibtex entry for some references changes, it may be necessary to update them in the Rd file, as well. Call \code{rebib} with \code{force = TRUE} to get this effect. There is also a facility to include all references from the Bibtex file, see the documentation of \code{\link{rebib}} for details. } \subsection{Inserting evaluated examples}{ Sometimes the documentation of an object becomes more clear if accompanied by snippets of R code and their results. The standard Rd macro \verb{\Sexpr} caters for a number of possibilities to evaluate \R code and insert the results and the code in the documentation. The Rd macro \verb{\printExample} provided by package \pkg{Rdpack} builds on it to print a snippet of \R code and the results of its evaluation, similarly to console output but the code is not prefixed and the results are prefixed with comment symbols. For example, \verb{\printExample{2+2; a <- 2*3; a}} produces the following in the rendered documentation: \printExample{2+2; a <- 2*3; a} The help page of \code{\link{promptUsage}} contains a number of examples created with \code{\\printExample}. The corresponding Rd file can be obtained from the package tarball or from \url{https://github.com/GeoBosh/Rdpack/blob/master/man/promptUsage.Rd}. The argument of \verb{\printExample} must be on a single line with versions of R before R 3.6.0. \verb{\printExample} is typically placed in section Details of an object's documentation, see section Details of \code{\link{get_usage}} for anumber of examples produced mostly with \verb{\printExample}. The macro \verb{\runExamples} can be used as a replacement of section \verb{Examples}. For example, if the following code is put at the top level in an Rd file (i.e. not in a section): \preformatted{ \runExamples{2+2; a <- 2*3; a} } then it will be evaluated and replaced by a normal section examples: \preformatted{ \examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 } } This generated examples section is processed by the standard \R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files. In \R versions before 3.6.0 \verb{R CMD check} used to give a warning about unknown \verb{\Sexpr} section at top level. % According to the specification of the Rd format, \insertCite{@see @parseRd, % p. 4;textual}{Rdpack} \verb{\Sexpr} at top level is legal but I need to check with the CRAN % team or R devel if such expressions produced by user macros are excluded on purpose. } \subsection{Creating and including graphs}{ Figures can be inserted with the help of the standard Rd markup command \verb{\figure}. The Rd macro \verb{\insertFig} provided by package \pkg{Rdpack} takes a snipped of \R code, evaluates it and inserts the plot produced by it (using \verb{\figure}). \verb{\insertFig} takes three arguments: a filename, the package name and the code to evaluate to produce the figure. For example, \preformatted{ \insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)} } will evaluate the code, save the graph in file \code{"man/figures/cars.png"} subdirectory of package \code{"mypackage"}, and include the figure using \verb{\figure}. Subdirectory \code{"figures"} is created if it doesn't exist. Currently the graphs are saved in \code{"png"} format only. In older versions of \R the code should be on a single line for the reasons explained in the discussion of \verb{\printExample}. The sister macro \verb{\makeFig} creates the graph in exactly the same way as \verb{\insertFig} but does not insert it. This can be done with a separate \verb{\figure} command. This can be used if additional options are desired for different output formats, see the description of \verb{\figure} in "Writing R extensions". } Other functions that may be useful are \code{Rdo2Rdf}, \code{Rdapply} and \code{Rd_combo}. Here is also brief information about some more technical functions that may be helpful in certain circumstances. \code{\link{get_usage}} generates usage text for functions and methods. The functions can be located in environments or other objects. This may be useful for description of function elements of compound objects. \code{\link{c_Rd}} concatenates Rd pieces, character strings and lists to create a larger Rd piece or a complete Rd object. \code{\link{list_Rd}} is similar to \code{\link{c_Rd}} but provides additional features for convenient assembling of Rd objects. \code{\link{parse_Rdpiece}} is a technical function for parsing pieces of Rd source text but it has an argument to return formatted help text which may be useful when one wishes to show it to the user. \code{Rdo_set_section} can be used to set a section, such as "\verb{\author}". The remaining functions in the package are for programming with Rd objects. } \author{ \Sexpr[stage=build]{pd$Author} Maintainer: \Sexpr[stage=build]{pd$Maintainer} } \note{ All processing is done on the parsed Rd objects, i.e. objects of class "Rd" or pieces of such objects \insertCite{parseRd}{Rdpack}. The following terminology is used (todo: probably not yet consistently) throughout the documentation. "Rd object" - an object of class Rd, or part of such object. "Rd piece" - part of an object of class Rd. Fragment is also used but note that \code{parse_Rd} defines fragment more restrictively. "Rd text", "Rd source text", "Rd format" - these refer to the text of the Rd files. } \seealso{ % \code{\link[:-package]{}} ~~ \code{\link{ereprompt}}, \code{\link{reprompt}}, \code{\link{promptPackageSexpr}}, \code{\link{rebib}}, \code{\link{get_usage}}, \code{\link{viewRd}}, \code{\link{vigbib}}, \code{\link{makeVignetteReference}}, \code{vignette("Inserting_bibtex_references", package = "Rdpack")}, \code{vignette("Inserting_figures_and_evaluated_examples", package = "Rdpack")} } \references{ \strong{Note:} Reference \insertCite{dummyArticle;textual}{Rdpack} does not exist. It is a test that simple math in BibTeX entries works. --- \insertAllCited{} } \examples{ ## The examples below show typical use but are not executable. ## For executable examples see the help pages of ## reprompt, promptPackageSexpr, and rebib. ## To make the examples executable, replace "myfun" with a real ## function, and similarly for classes and paths to files. \dontrun{ ## update the doc. from the Rd source and save myfun.Rd ## in the current directory (like prompt) reprompt(infile="path/to/mypackage/man/myfun.Rd") ## update doc of myfun() from the installed doc (if any); ## if none is found, create it like prompt reprompt("myfun") reprompt(myfun) # same ## update doc. for S4 methods from Rd source reprompt(infile="path/to/mypackage/man/myfun-methods.Rd") ## update doc. for S4 methods from installed doc (if any); ## if none is found, create it like promptMethods reprompt("myfun", type = "methods") reprompt("myfun-methods") # same ## update doc. for S4 class from Rd source reprompt(infile="path/to/mypackage/man/myclass-class.Rd") ## update doc. of S4 class from installed doc. ## if none is found, create it like promptClass reprompt("myclass-class") reprompt("myclass", type = "class") # same ## create a skeleton "mypackage-package.Rd" promptPackageSexpr("mypackage") ## update the references in "mypackage-package.Rd" rebib(infile="path/to/mypackage/man/mypackage-package.Rd", force=TRUE) } } \keyword{ package } Rdpack/man/rebib.Rd0000644000176200001440000001125413501141722013602 0ustar liggesusers\name{rebib} \alias{rebib} \alias{inspect_Rdbib} \title{Work with bibtex references in Rd documentation} \description{Work with bibtex references in Rd documentation.} \usage{ rebib(infile, outfile, \dots) inspect_Rdbib(rdo, force = FALSE, \dots) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{infile}{name of the Rd file to update, a character string.} \item{outfile}{a filename for the updated Rd object.} \item{...}{further arguments to be passed to \code{\link{get_bibentries}}, see `Details'.} \item{rdo}{an Rd object.} \item{force}{if TRUE, re-insert previously imported references. Otherwise do not change such references.} } \details{ \code{inspect_Rdbib} takes an Rd object and processes the references as specified below. The user level function is \code{rebib}. It parses the Rd file \code{infile}, calls \code{inspect_Rdbib} to process the references, and writes the modified Rd object to file \code{outfile}. If \code{outfile} is missing it is set to the basename of \code{infile}. If \code{outfile} is the empty string, \code{""}, then \code{outfile} is set to \code{infile}. The default Bibtex file is "REFERENCES.bib" in the current working directory. Arguments "\dots" can be used to change the name of the bib file and its location. Argument \code{bibfile} can be used to overwrite the default name of the bib file. Argument \code{package} can be used to specify that the bib file should be taken from the root of the installation directory of package \code{package}, see \code{\link{get_bibentries}} for details. The following scheme can be used for incorporation of bibliographic references from BibTeX files. Note however, that usually it is more convenient to use the approach based on Rd macros like \code{\\insertRef}, see \code{\link{insert_ref}} and the vignette(s). The Bibtex key for each reference is put in a comment line in the references section, as in \preformatted{ \references{ \% bibentry: key1 \% bibentry: key2 ... } } At least one space after the colon, ':', is required, spaces before "bibentry:" are ignored. Then run \code{rebib()} on the file, see the example section for a way to run \code{rebib()} on all files in one go. Each reference is inserted immediately after the comment line specifying it and a matching comment line marking its end is inserted. Before inserting a reference, a check for the matching ending line is made, and if such a line is found, the reference is not inserted. This means that to add new references it is sufficient to give their keys, as described above and run the function again. References that are already there will not be duplicated. The inserted reference may also be edited, if necessary. As long as the two comment lines enclosing it are not removed, the reference will not be overwritten by subsequent calls of the functions described here. Any text outside the markers delineating references inserted by this mechanism is left unchanged, including references inserted by other means. To include all references from the bib file, the following line can be used: \preformatted{ \% bibentry:all } Notice that there is no space after the colon in this case. In this case a marker is put after the last reference and the whole thing is considered one block. So, if the end marker is present and \code{force} is FALSE, none will will be changed. Otherwise, if \code{force} is TRUE, the whole block of references will be removed and all references currently in the bib file will be inserted. The main purpose of \verb{bibentry:all} is for use in a package overview file. The reference section in the file "package-package" generated by \code{\link{promptPackageSexpr}} uses this feature (but the user still needs to call \code{rebib} to insert the references). } \value{ for \code{inspect_Rdbib}, the modified Rd object. \code{rebib} is used mainly for the side effect of creating a file with the references updated. It returns the Rd object created by parsing and modifying the Rd file. } % \references{ % %% ~put references to the literature/web site here ~ % } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } % % %% ~Make other sections like Warning with \section{Warning }{....} ~ % \seealso{ \code{\link{insert_ref}} and the vignette(s) for the recommended way to import BibTeX references and citations. } \examples{ \dontrun{ # update references in all Rd files in the package's 'man' directory # rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) lapply(rdnames, function(x) rebib(x, package="Rdpack")) } } \keyword{bibtex} \keyword{Rd} Rdpack/man/parse_Rdtext.Rd0000644000176200001440000000362713501141722015170 0ustar liggesusers\name{parse_Rdtext} \alias{parse_Rdtext} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Parse Rd source text as the contents of a section } \description{ Parse Rd source text as the contents of a given section. } \usage{ parse_Rdtext(text, section = NA) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{text}{Rd source text, a character vector.} \item{section}{the section name, a string.} } \details{ If \code{section} is given, then \code{parse_Rdtext} parses \code{text} as appropriate for the content of section \code{section}. This is achieved by inserting \code{text} as an argument to the TeX macro \code{section}. For example, if \code{section} is "\verb{\usage}", then a line "\verb{\usage\{}" is inserted at the begiinning of \code{text} and a closing "\verb{\}}" at its end. If \code{section} is NA then \code{parse_Rdtext} parses it without preprocessing. In this case \code{text} itself will normally be a complete section fragment. } \value{ an Rd fragment } \author{Georgi N. Boshnakov} \note{ The text is saved to a temporary file and parsed using \code{parse_Rd}. This is done for at least two reasons. Firstly, \code{parse_Rd} works most reliably (at the time of writing this) from a file. Secondly, the saved file may be slightly different (escaped backslashes being the primary example). It would be a nightmare to ensure that all concerned functions know if some Rd text is read from a file or not. The (currently internal) function \code{.parse_Rdlines} takes a character vector, writes it to a file (using \code{cat}) and calls \code{parse_Rd} to parse it. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{parse_Rdpiece}} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{RdoProgramming} Rdpack/man/Rdo_tag.Rd0000644000176200001440000000266413501141722014103 0ustar liggesusers\name{Rdo_tag} \alias{Rdo_comment} \alias{Rdo_verb} \alias{Rdo_Rcode} \alias{Rdo_text} \alias{Rdo_tag} \alias{Rdo_newline} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Set the Rd_tag of an object } \description{ Set the Rd_tag of an object. } \usage{ Rdo_comment(x = "\%\%") Rdo_tag(x, name) Rdo_verb(x) Rdo_Rcode(x) Rdo_text(x) Rdo_newline() } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{an object, appropriate for the requested Rd_tag.} \item{name}{the tag name, a string.} } \details{ These functions simply set attribute "\verb{Rd_tag}" of \code{x}, effectively assuming that the caller has prepared it as needed. \code{Rdo_tag} sets the "\verb{Rd_tag}" attribute of \code{x} to \code{name}. The other functions are shorthands with a fixed name and no second argument. \code{Rdo_comment} tags an Rd element as comment. \code{Rdo_newline} gives an Rd element representing an empty line. } \value{ \code{x} with its "\verb{Rd_tag}" set to \code{name} (\code{Rdo_tag}), "TEXT" (\code{Rdo_text}), "VERB" (\code{Rdo_verb}) or "RCODE" (\code{Rdo_Rcode}). } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. %\keyword{RdoProgramming} %\keyword{RdoElements} \keyword{RdoBuild} Rdpack/man/Rdo_show.Rd0000644000176200001440000000166313501141722014306 0ustar liggesusers\name{Rdo_show} \alias{Rdo_show} %- Also NEED an '\alias' for EACH other topic documented here. \title{Convert an Rd object to text and show it} \description{Convert an Rd object to text and show it with \code{file.show()}.} \usage{ Rdo_show(rdo) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{rdo}{an Rd object} } \value{ Invisible \code{NULL}. The function is used for the side effect of showing the text representation of \code{rdo}. } \author{Georgi N. Boshnakov} %% ~Make other sections like Warning with \section{Warning }{....} ~ \examples{ ## create a minimal Rd object u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) \dontrun{ ## run this interactively: Rdo_show(u1) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Rd} Rdpack/man/ereprompt.Rd0000644000176200001440000000262513501141722014536 0ustar liggesusers\name{ereprompt} \alias{ereprompt} \title{Update an Rd file and open it in an editor} \description{ Update an Rd file and open it in an editor. This is a wrapper for reprompt with different defaults for some parameters. } \usage{ ereprompt(..., edit = TRUE, filename = TRUE) } \arguments{ \item{\dots}{ passed on to \code{\link{reprompt}}, see its documentation for details.} \item{edit}{if \code{TRUE}, the default, open an editor when finished.} \item{filename}{if \code{TRUE}, the default, replace and/or edit the original Rd file.} } \details{ \code{ereprompt} calls \code{reprompt} to do the actual job but has different defaults for the arguments described on this page. By default, it replaces the original Rd file with the updated documentation and opens it in an editor. } \value{ called for the side effect of updating Rd documentation file and opening it in an editor } %\references{ %%% ~put references to the literature/web site here ~ %} \author{Georgi N. Boshnakov} %\note{ %%% ~~further notes~~ %} % %%% ~Make other sections like Warning with \section{Warning }{....} ~ % \seealso{ \code{\link{reprompt}} which does the actual work } \examples{ ## this assumes that the current working directory is ## in any subdirectory of the development directory of Rdpack \dontrun{ ereprompt(infile = "reprompt.Rd") } } \keyword{documentation} % use one of RShowDoc("KEYWORDS") Rdpack/DESCRIPTION0000644000176200001440000000302013575267043013173 0ustar liggesusersPackage: Rdpack Type: Package Title: Update and Manipulate Rd Documentation Objects Version: 0.11-1 Date: 2019-12-13 Authors@R: c( person(given = c("Georgi", "N."), family = "Boshnakov", role = c("aut", "cre"), email = "georgi.boshnakov@manchester.ac.uk"), person(given = "Duncan", family = "Murdoch", role = "ctb", email = "murdoch.duncan@gmail.com") ) Description: Functions for manipulation of R documentation objects, including functions reprompt() and ereprompt() for updating 'Rd' documentation for functions, methods and classes; 'Rd' macros for citations and import of references from 'bibtex' files for use in 'Rd' files and 'roxygen2' comments; 'Rd' macros for evaluating and inserting snippets of 'R' code and the results of its evaluation or creating graphics on the fly; and many functions for manipulation of references and Rd files. URL: https://github.com/GeoBosh/Rdpack https://geobosh.github.io/Rdpack/ BugReports: https://github.com/GeoBosh/Rdpack/issues Depends: R (>= 2.15.0), methods Imports: tools, utils, grDevices, bibtex (>= 0.4.0), gbRd Suggests: testthat, rstudioapi, rprojroot License: GPL (>= 2) LazyLoad: yes RoxygenNote: 6.1.1 NeedsCompilation: no Packaged: 2019-12-13 18:02:44 UTC; georgi Author: Georgi N. Boshnakov [aut, cre], Duncan Murdoch [ctb] Maintainer: Georgi N. Boshnakov Repository: CRAN Date/Publication: 2019-12-14 23:20:03 UTC Rdpack/build/0000755000176200001440000000000013574751104012564 5ustar liggesusersRdpack/build/vignette.rds0000644000176200001440000000052513574751104015125 0ustar liggesusersQOK0Oۭځ EQDvc ^xVn~l}IۉM^ۈ k06GhC@"y5(-d\:QB= a-,RA0dŒi05[TrK[m*$95"TM2].@jE)|ےq2WųsAw_A򍍇 a+~r*D+Vv4ѱRlHkNh4; %[bs0XЮ^V P.3lV2u(Rjb.̱lj҂6m8l)7wdURdpack/build/partial.rdb0000644000176200001440000021106513574751102014714 0ustar liggesusers x\Kv&n`KDG$$W Ruyc"oֽ7 hJUJE,yl˲en"/MGӳxz{fgFl=D^d&K?@^d8qDĉs>ݑJzR[7zz+%dyS{9nNEs=݊n*Gh\i,E?f}w1*j7$Im鯶EX,)﷚^.ѓ^Xnf6^_X\qYD߽>_| |[O~ZÈPΊ#Jed.ӫ/.[K+ %Z~굱B?Yq#R Me}荿]wH꘤Wj=.Ѧ淶̋F{~I6?I%ģƛ Scہڧe[R B!7 RేwSfD;\`Ϧ'3/\v}zb|u-nEts u6釭ы$ f[%!KR~`NH85\y _Tp3D8=,Vjh3: *x,uV$I,n=4贵5_p_EP& VB9J%i-2ԏ闤`e<q\ʱ'ŀG".;a[TXy앋yV)b0p1nr% >q8+}>"Y^ kP\\e#d/q/F&+#c7N)kAN?iMMl(:F;f$Yϋr["=W~) Dkh^Ȝ0tI&c#aMhfʟN+Eہ|+do_(.W/Y+E ƷrB7#=P 6m{us4GП1vKƎVdcE,290 T?eq1s}Q 1~Azh5?j-?  )~Q$gDzb:i"a,k OhڡW@,[jGLN=Jh^໠Um='[V5s>[̃j/ы7،^£/iHKVRVJ6c19) v ?)!K˘7tV[jS5T_5ZY)gJ'.`v".{$ģ fq/FEr[[F=$ztr}Fk>FssYV rV񑑩ɇh1<i$6`%+^<_KMI՝TBywoGjvbۦ}S]|+U/l ݦavuϻ+ݒWqߤ0W),{[v$|C\!zM%}C"@k56h 1~U~Yz -$`;w(ZOɔvauK,H5bciNeh]6Π3Vٸ{ a]/^طP n۔Oِ\ͻ)agQYc6hZ9$zpЬSBIϼb/yY3t!`BZݽ?. m~J.C(;F;3Ref&-F7&[,7;`PҰc+?VFCkvYfQvvt!I|ZŪgԚ2ynjʹDD*(.4_ehD6FmG|R.<[.eYz>j R-h,w4^}4.#`p qEn"cQM"rKgϣy5$otA$. j`[4]Ro1E؁[|\B1ivM/d|&ak2x&dѿ 92g gRr`qz%eSy$K2WW a?.5Y-gZt#Pfio>&I {$ģ k=IOg<%GvXܵU/$ _2!Tn :ZU됆2ґEzy~WQ 8DNjA"o27q1v5V8k+]'~g]~_lY೅B#M{p}6X\ځ斎Dؼݒ ׽P~Ї8 K}إZ= c~o鯛k|P]]yX^D;# '23?A^%(5XVV,'7Wf.=_퇍n.{+[uSȄ*.Jo u[7-}Sfo ԇ-8 sG);5S__fSC"fцsw-obX5+z`Qm>}ᕄa0:y |V卣IIHWemu_FP&6P/Zޫ6%Qbi{ױMwjzg=GrrzG~ [ )+ZUVS/ w)ZQ^[`Ʊj/ uv^Y*^zͪ)A6 Jaz]_B 6Pz^/P埬Uz/wlNڰP-5hfEN*Y=m^}-[{Ҡvo؛ JihMP7R ΡuD$#Nna7( C+n6WwL_+[=qQGsf[N[,1?O{] L|O"jN^eﶬ-nm0%~ so<Ŀ-4h_sG?,;;2caDG ѵ;qC[,A?ӒWY'+ A=p.3xDDxO!ay~*U~EAռ,9b)-_%z Zq "r,ձ/ZKyK%,cٲt,H5oQMyrn5f F r*T:w*7~`ʑD\vDX>vԓU&GM:-Dl՛sߊJ{[_5vx#?nrmj-t[6] t[~<57G#N ۣ0MMpK RrӨ1M ٪6vʮyZۘ4|3j<`?272v'_|$p}=OBnm E 2_Ԛby-kFvfO'f&?xܺYh+Wclz[6q ZߖԲzPw `O\f\OIӶWGܳ/Fnf*qa]ܣ0d))lA< @&{ ntuղ([]h/xgx4ذ-4l7Ak5PR,]2*x,ua2Dݧ5w0>E}}$'; tgGg>#HnFf@g,֛d=ޢߑfo4[Q&'B GghEq{g#>xAQ0O KLkqP4'AsJB<%lJ,/έEۮJC޻3C> s`q,4EM 1^nW4V h,Z?a[ڔX VSS-9c-mpcFRb?T=lto!6F t\r@ZWr#]X_Lrmkd,0bd b^Fd~|HABX^ʱg:n {*]ᯙTЭ&%'XpR"RTg?*{0&ku~|RIR7β_ޛ\WLٗVWMY6;*lslumd)'Ki%hT\/ h};Q&ђTk]$ J|nNRCi\O* 1 ٢F+mA4SjӠͫ"u98wէH5jvE.JY8]yJ%^.Gݲ3av>%ɥD}<ТW-g9,h69:_㮛JXvPy)K(bF&/N~9LL}ipg;jȬ1S)G =F+?5I:!|/B-0MQJ%*Zk@_k[/H8&蛝[otTmܷP:q|7}~*.N,^Ny-dP؎ej1tJ.!xce=n6?,璬SdxXYT 4hDre*x=c>fXmŇHg]71(/|XuJ:7g@ehzv[iV6rN\{4X1ŭȜQfHb  (&'vl-Ó_89 < E2u"ǦO9D`U"*JN3Ao̡^: 1!6>`7^9ZW> ^;5؉۠owN4J8:Vx,=riՠn9*wq[m!nxK3w8ZoFtH1-Uʼn |;_+R-񉴸(Dfd Z->$ Z9=0?))k0ͪ2pxx8"+U^VrKjmMAl1Uni''VONffXѧ%> 6;Z|weC}xzܣ}J5鍝o4Y{2q{^CNKlaے0|0̘\I`l%zz,!w5ǿq/̕G p1EES~=.jY-d9A<ZL{P%i60b6~Z*_W>3)hN}e(Rx4{MI 8F;8glR,'Z3v|%]aлELAkթ heIǐ[dI]1/SZ\ns)"[]P6 w+!Qߤx.,x4Ujz@klhw\\3is yļuq4h- /L2QM481S޻I8;.y#6W -g Yh{"9}NAV=mn'zͷӕ!! Uն )k}ݩZM|ku.˂j~, vGAZ3ytS N5M7-'[*"VfJvYK1m=ݗ'Rtit3|i[VA~V? 9KPSs(tZiS%c4-wlZASj\_*9v 3"4֊Ҳzo90uf4elm1l^|-Iɡ& ,[ F @(4|숥}K\Oyx6Ƿ95:0 :msl9#wC[,,~}۸1g1t}aMLL61 /o仵T j8#T:Ht&Z.~5p \f[)9NeʂWj㾨x~'wd77|lgIZkIqEh8n| [(if{$47CgB;$I}Mu=r7v0_0Pq}0Pq@{ Io\$ hn*i͔qLX:-!Vy{r9PIQ5uTsѫ<;2QvOVsp*eދ+W2A62w]T2i9GD:]΍f[%@Co l' W6WRrS}J(w>-\-΢Ueo2a}ɱc(rmT[/4lޮy7Vu ~U\?7;~}$W),{[v$|C\!zM%}C"@3o>|1dc`{ZHv'ς>pNB<l|ki> [iN,Hh=$̦Jx VL)-? tWrc&')NgY:V`iMg[Ƶ8畂q><+dDԙ2#<TFf"l\dHF[~A"!t7ېۓ5nJo޳IgﭲB]h[>A7fvTo a|U|j?5'M-&߉K. 0E(74TJkδ2/؋[֜sV{Y])H<( UO-t-U8=x$BtQvvzz듑HV:C]%!v2g렯]DupHhONJk7Wߧ񩩔,o>^B&eoXL%>#yG)㤄' N\le%M8ٜy wKh^@]<Λx6+NFn7n4tNyC|5fb$\E}zť{#sܩʂ;zɹzmlDlDky["7KЗZ[CK{ķc-I`J@w^۲n0lm0%~ ՚_$=~c?Fk.j-Uk_;_(D|[$ⴟ+o ?RR^uHP$ģ})z; h&jYVa% VѸ;5Ta Xꚍr%uI/p76]BKRl{0I`4^{Vi6'[lwW hJ2;[0.bl*zoRi5Y`F6E~XCfض߭ M{(!7wgCS>Og򧹏*~PP.NXǹ+n9[];M1 XeX*jFqRm6o{/#!ip$oJ<"hxlFdwP<qBtOV*afH ~(i_\+\_N˲l @/9A7F}̿%__ ^-]T &B]C" f }{.D$w]̥8NU ]JQkVܐW\)qIAEʨ/^r1OY _.n "П|$%k^ԯį$1oC*mM[;*nb=_Akm8pՏbc]{HS|(]ݵ7e7|,$hwC4~ M2IYk\W.br"M\ mq"T{SLHHhG}&2M@u^K!+jzr<丛2=9ђ]8|QզaR1մȢIȺz,MY7Xwidoclc/g ?vq /Ihqwˁ]|+b}|b}%,ss G@hSW%h|k)>Q>]>QюX A_Тq3kX Ç"χ Ç+χ 1ڑx`uC]|o|tl( V-#Mj]awiCb0]ZzzKnUKN+@ zGIܘuYB3&k Z(ZSo-*x yr}147 KB<𜆰G+O[+\ϑ o2[Cˊn&=D﯆n%AQlb+WKLi,q쳱?b-.K?X4|"E{S ܉,K5p+tb< Jʸ9?^B<]NbҼpc'F;NH꾛 r Q;eFSC֛WJ}Cڢ-|*>Sq;A݊?e{^,fٿDG@3#&ݸԳ3HK^wh3?PaGX*16Y 2[_ms8zms x{;ϵ*T-B)3SB q|U5"qxjRӈTNch-;& ("j-ar(p1YZ%ru(:s%*D] IC[dѬ-bȓ<<Mz?`.;j%8-з+1˽s\Mu9@8҈ju΢ gmTgc ಂBZ S ="iXZqUZs9ՙb,씣)UˡW/S<PG4SՊSl |!3(tJ䦼@bY E%QKHA-hFdÑ7j<_%$UΩsƁnȨFr!N(]5dndE6ZA_~#ߘ0w5zpOx]㚜Rw OOq+BݮSGlW*3 m.uofY8qcn2_ZɎ !䋥HDִ݉&Yt(M7;ԹT-mз0!&ӠY_ +۰Sq x <^gK  |0MP?}ڋOs9})3wm"=x1ɤ$iSF nwoɦ߆I)jJDR)(բ3R<(\S+)2ͧM\JGˤ'52ױ02fAn!^~(eA-3nK[au_fq(e'J؋yH+Bяlh֧5jmFQ8_}c]eF*uJwtlMoB&x9< -в)^ /%NӠӝ'cmhPۈXpK*[*>w<"4R CWUr^F1iUuϳ+(tȧohNMIֶ<[<:`*hιׯ )2S,a!NTE= m.P65C\=ܸ7P@|j>'v{Amz@yɟ^lukEj@Vyۉ}ߺuؖ[qTp#qdA3Rb/ /E%B#%֖qu8 cBch=FAK1c 9īMUQ&Fͷ&.&\L{ZYE5;U? S#9CMhڶ5hfHu"n,Y5٧z{Aﵰ&W5S- =' Ke'18|7n" 60E#:Qɻ**TtT1 sa70 ;)71HhoSnO\*Qy;y ь[LOP>Ws<y, nઍ'#O )];Zta.J6Rab;^fܯkbg_0 hc:TRN(:عZAĎmn}l$U"6_ާF\|H!_x lҝhXC7s~EQ71$ӌ)Z Bw%9bwiNuTd0FxifjL .:}Ssr6Q,pn}y5Z1ǀ6XݍƧ2oDl;h?Qq}OT\/Оta(&V} LU`c}9R_~ I!#(p.{|=wNj{V EzuPV50L(]ee26h-e _za+mna(/fY }e Rn~1گOʟÒP L~Eha%7&Em.,>HE!I*Pzaxph,~ .NH46`t Yc{1=4>}F< t dldp3b5ZG(Ѻ^J[-G$gA띝=/_u1a/P6y&LT\/О'0͘_.#*}!mx~W,+{wVգicN "{+;+[N:&"0 Z+讚Aֺ(c |uEl3͗YgYMD(͓;XfV_/Cςֻ~NDe}޸pGL5uf!W&hChg v5&#k<yfRn ? {@hkBlal/EN0p3 JۊP`> SBjB.VV㏃uIГ]?T;xz_ۗgBE8zWNКR1U'BKvpڠ]ss]JBhd.IΫğn­Cƈ?vю# ?T(?q 4_l7bcv(;v,('YblU x h{4Ϣ7>d3G5"+iM b0p􈵎>+W\7WՖT(&蛝WT- qV Ţ[* %lrDs4KPtQ:aR;Pj?݄]2 =YSi3,ā8e/N cue4= p'/(Wzp v34/m´)qph5b#={+ad*94!ͬ^IyS6y5c})tη| /aֻ2*CSNܜ}2vx>e+KvԸ:5곚*˨A]mqPHPsDDɍnq`tD48 g1,pp7g3Y,MRV#:k"˶Wsgɶ݂zĿ !# ZK3EحTe9 y?^Kl'gnNC Lnz$>{g@wŝOKǐ ڶ]aȑsr;I@3c.3=[S;a2D 8}m:2 P y( ʊ8=9&Ÿ= =2~FxaxH璴=* * fpmWr{AqXr|U"N&A[xz[EVp h-&8< f`im(aVs 1uPb("6f7pBnHCOG~~ 6d&< ZoM'za(P*M)]wAi(Ĉp7ݝu]c(e-Q6'K%b1 G@k)K1F>j9i)u-)jA#<=w xӼE_?D'E1dOilQqG-f{Equ?\Af<<Pe6ѺTEv @U凘; jBfi[g\MjxFRRZ&SH AzYx+n,.TeAYʦ_1MFWsDx z0e^Y=e5/S6x#!C6[X%5&Юz~rK/SvJޒW jV"@`~Z~sQWK!+y3xfefK-zؿJ EhO-II0fE`hi9ljl(@p3.|w1i[5 OG6&'KVR4VOīZ'q%2J96U#F#©_B)ćl5rORmu7XKE0xry=xP.:R(ejoV 'AO{rK[[7 Edvfί_!)7nɻ?]Kh#Myn깜#B;ך[R8܏b`:fTi8h&j{,TQ 滧Z;q۠o?|[Fl$[3rO$ '<^Dz@k;6|Ek!~!Y~QDP< f'"Dв$ צ#e6h[cD>EwU[Zu?N 3z#MHl K=?ChG'"B>wK^gy4O:N- '@OW_qř dQdN~n)r9&4A.P;0B:5o'g@i@Ao('xpyHA6*4*V~U< =c4Ww ŠR Ő9 sm{PTR* H<4h{V|5sO.d5wAA E\e;.5!"6q'/U"Vn?1K[4 {/?v_T|7`/d0 bbe3霸ڒӞbbMbs3C7gXiNgDzb: 0β_v OhڡWo&Ҩ܆1>z<=`rjQB{n9Oo\,}'egt+F/7! %pSۦW|02qa׼Xנ2S3[#;D9)ؒhsP,ZVj@?:f[} Ɛ#[ #~CxքӔ$А@D kC,(Ҟp, J/(߂{B{{eaiV|c>QP`,m=N%/!ћR&D&_#4eg{r6m?W@КٽO ~q U!B{wkTM0VKYWv-z>b8 zҘ<?Sc&krŦp~ˑMO5 `;jmBB ) (SdA# ep/@&W#ZCrǾ{2{ 씗  U"@ަfktJRvicӉ+ q~ ȆEt^g\zO mз0cP62c/}T\/ތU~/qn HO'sMqy;;@ۈ %W42wq͇|MӲYuPo3$#E'_,Cpe9 *`Wy- +2PxlO0Dx^ Y`<- T)J*z{Pp#+~xG |{c̜JQ1)`F8 ;p=֨]e\ǏJrDF6A[Љ{0bLx nz=?1+^ < z QO֜0//FLT{r Ԃ^`|dd)B.Zs=h;",ޑ0GPJ.9Q/ᴠdѪ~)MŌAX q/hiBCK2"W9Ɯ:KZb0DMm烊<+hB~VAuV_+/7-N`G-g~*hBCإܨhSw-;e6lXh4go~^bSc*z9~R̋tVA ebw2QE Swy.Rp/V|+2} M8[rçU>"ݨxiA[4e*n8#h V:1~ n*-V\//\vqb A[MT TNIA[HT}* >mjEtGB%p- +Q|Ƙ/,S̹9pyq9 !\< h)ɠR]GT=v#DAyI:es>V6 N>҅鐂2Ȕ-h?!.@qLTY<Z,t  TmJ)<%v( )^ds"M:f{* -B!$Az7~Q"5FOFzlV<%SYAk?UF!.@KSƒsl2|  3nV|qN#q3:ˤT@/oyܹB6Jۦ=x0U.VPo\*aǐϱJ]A"KqRW Iy]rJ,ONgaPoLM>To146h;T?l||Bs"AA5Ob 886hn] @U_7ʗʄ?|+S1~T#msD%1d^ROh&Z9:9Eܐ*\<8bMWEWpB YfڂFD-gKU.j1* &h蓳Au 7Zb`4=d^d׆} n ?D#hm&kp[Hv:FZ-fh<|,prRE'v#h;={՜q(M7@FbL'iUMhmIDō?s},.=-Uy\3"7w @vkLYj~QA[u|O*xLOg-Ey~dZ<1wx]Є5A-{D*nxO^}MhDzQd d9Z[/15(m^JTIA[8ҍp E s+֔]4&4ly7Pd w*8E2RH2 Z3ÒL}i,{Re-":RDHT.:~.h hEVM3[B gq<;~maZDn4sN?U^jc)FK+~0(R$/BrY+3W}>8i Y*nm!JAևvI(boIXl[ur"3#Be'$FaA{jDm'`uM 5?RM&4d/p+=K*>U5\IP%<,h ܕ Q=%B+甘W G~`@INܠHqyn"O1"Ax#7Ŋ^M_$xB%I$f$h5InAlS_Rcq<ӟE9ѡ[뽴J ÁQ;>F}e;rK*ifm@Ա[cj9/tr` |Z[^~v =7W I'i^^&EŽ&h z Q )\TJk:r؎c :ehDy\S?lleL^Uz1Z O#qSbg7;<D Z /}jN)؂_t0:-Co婅U=gʻn~Lk& 1@Ed壵CX>׸D?q$ɉ} 6few'|"m Kl nIB\*xDz%jʁיZ>`t瓯RcN qy 8)h X'[qeu@BqT#%Z n%Z0>B56Y CF/"h+ܒ){5}Ȃ>hSUɿV)U>k(]wkz}zwsir 8*ը *Y&5UZw*E7V,Nǂ/DnR1*FYYc֯1~1)b6iYkB!(a_K߮>?unVa(~OiL"! E C3 E (Bll.8Z0SOc4̓EcO, ZGmSq}0 <)h YUb3YhSepVYxU?5Akz6t10< h ZRw"8EnC,kÀO羷;++8<^e?ɴE0Dh&ɨƒi,u|Ad\_r|aӲIh}RO {Җ$SL?:@}2:Os=%/;ϼh&ݍD4 ?/m?ˇ o̻ P%1~:=>͟6v=T/OEJA  u[s{)eE-!|fŀj9RͣuyŤۣWĸP=7e91_OJq<FO+]$v( %3 0 LjTeq1s2霈E} =4Ě~E}j-? K.O}T.ek,臱t48)vmA=3*jChZtA g[E^#B3Kw|8U1xLzAZqLkUY]VX[Ydڄ~1HIA[pvTkv P: tY~#hF3G@͹?SSj-t/\owGr&]۞'SGÅySv^)0~LsqM~q0V(?zž2Fv^G꨿bChJ:Kmy8_;xv <*h (z&Sǀm$P@8Vܮ)߁lljl~TG Nʦl~G 0NCC69 $C1mvr> R/? )%<) U!.H)?<+hŽKw!mn݅kL7fL\. `RV2 u߃d~ye6B~|H[G (TG (!#%4c@{(?QG:J>/7~C@~b!"FՆȏbTh: xD6ʒ}H-K&!d~J!d~.KA2y\\*aι~ڈߺ$NAH~*/? ^~Z\m? Fd+ߟf:RљJVCu3~RgAKkj#s]'GrދCß*1 Uf@2A1{y~XLXȹ+嶶Lbɟ㒍.F3WðLM> W|ߝؔvB _X_nuR ߽˟i62eCD^zxW=iؼ]n sU\?7;~9WI̢wyk%v)5I1lYɲ/W}#11DF2=x9`畂q.=px"6߷Yzbܕh} X_&d{dշc{d[ pu,4/ ģWN9 eYV`Jŷl,h12앇*?« yHZr1ӱci7À#%vߣ< YOoóh5aCVWo񰿏c5XtKvV\xKgse _=޲x$|C\A![D~cv׽[GXZ1RO v);*%c(.yع5Z˔Ux#\(FHIWCg&Nop[[Ƶj1g -F̼D_D 'cƌg#Y>^A7ςe,XζO$sL:>nznux]Զ%'2x+kѢ<-Nk\G5oq#F@6֕D/ *T'\GKC o7 |yc z5}R"R0V NƁJsl1qd7ħ=I`iB{Fe5E>an!8' /s~LV`K?ЦuI 8U.8&\l#H 6U6hca3gU9'X:⟂KB.YƯYK{l&ڷ ^㗌Ƿ_;U?KHޝx2Ѵ0sT*sO2-K>_ʡ_muVP茖Iz{ײؾE M/;I-/M[u֚"[^JlZo+A4k_H(yPtPhvUߦN$|NM,w5:~ W*#s^}qi}e\ˏ]66"nfs,HI'}[Yk٨^TpٜOuyo-WM--tGOfqBÔ6*Wf7&G~f$m>z+jMSk_6_(z[$4oʛ:cBO錖JiG [LvNZ ӲԭN贘HuC!l+#L&r=p=" /X쬰Z)H*:΢$cH- sszk| ~B+ o|QHj Mx eiL.K\&2O ;R5ژ27kٖiZuJ>^azHQ>6CKB ZT9`(MægwInt9ִ\BIɇڱ}xp qǞ} [^ w) wOOc'f b]I^[:T3eS+.]Ync"&PVflY#㰕⋰tXrGwў?Wt*4ig1׸5PZ6,{}uG [$_= 䊾6y(GۧfNcz1Y*Sn,hs 2uDfX,RͱGj1p5Um+8N4u3aoD)W_gKYm˄A_iG> +eڜFO3w־j&HZ'-K:OIZPg&_g 1ꋻi@jKE0xry=WdZC,uۼS =?M@{GODşf%9xP7/ϡGΥl[jlA&Iyq}@i/)2_q @HǚQ6v1|3y  m[B}/BSuM!YXƟ{,rT\[ﰕ/R]th&^b)vOR.m[[.ʔamO4 K='GߔijwR,ƦХq.TNclME]JGLWpY-x %E'H*,K[Ed]Rˌ_ 0N5re[Q8&Z`"#(;F;!^䭒YF7N-'z%9 hf&,- Swe\!b_+\PE.,Fw7U$\Qj!ʌ3g+s9&2g,z.ERVah4Y/)ЬtI(qI~|EuƮ+h0v\na si,I盝)E Rb9UR*|Yv%8C־TX~JȕFkKd\ 3Q!!=;. 4d-Oލniܽى] Kho6ly al\xx;[.FQ7tifhDq5_~Y[(W9 g ڤlm"չ*;oM͞ vQ'2&!KٲSiUc*>&lGPqS)Kylyv{;wD)qL 27|B!G5u̇;++t´mу[q(]h;PT1 IZ5t*`Jƫ:Lv\~T j?hi@- .Uw;mXZ 6 8Mq(ZeoJjN HB h]/U Q:_sMaK)7#l%oKcI⇥^,jr6 "v 8zȸLw#Gumn=WSgWS !=)Sӓx~Qħ}ӠLZ95dIHAvJ:.EXes\ft-s5h7p[cL_^}ɸv[8Z.cǪ.Sr$>#{*;Haҋb[MoO{A>kUoihܝZSp8/+N -H^+v/p&SCQУg*x:.^Ź7SC Q R݂W{A;vMCDwZhj,uP{!qx.c4^nCqJvHQS" Xč7b靇m$T?hy5w/gS[79mٰ~3txuڅ^: ;ŽllbDZk#R kP/~aDqqߗjX9]SN!@}-,2˝+Pzщ`{x'e+U Y( ߘ+xyn9١PF{{.,NlBՙKJkÞgb jIW5!f!3){@DjD GR-BKNA[mR^KGRucH.P; 0:י9=b9hˑ+;0\Q,Yc&oجTl-yRբݞ=P6}o?}@ɩOۜ2t-^ EF_|E|~cBoJ%FRtQvXk"X]O}LuܯƗ3ߤp_Q/2xD-KA{N*c℡[H8TZ)tP={wKA&ї#H ;aFF3PBn461Bc7=_F@8-HiR $JtOt*N3􁟜. k/brP\B%|& 53鷄Cb5́ooxs%т0^"\#. C >xK;K"ZSkrdKNo6s~_&]qy-?:2CoI N񷃵wٌ^C%B(oI^RE-K%na}fn`CA>q[r0%41Ygclk/MM`8ˊ p, *h =+oZ=[w`ޖ)WW"FPۍ{.}奨pY6rA4k 2E΃ B;-wz6iL!^@w`< |Z=$xk89@ڭyM>C 5B<%WvKhҸ\dEڍ$50P-uaDB یVUL~<.{e\n|UDq[۠oעёl%bsGOΡqHBâ9Ɇ(1<$ 1aEvq*Q{êe nK.*Ai#&%h`c4nCU-t\D;_hC\ 儬Rm㠵B7F2Z{ް.AkMt&UOx&ՐQvd)ST5>p;lC%:deH̓~~L ;t~cs#/˩vH3Kx < ZP}T61zCOsѷ6[9tG]w 2\"&D1xBF([ԭBڪWGQUNyS=kFlȹAZհ"{cw`<+2HҽhKbmީ˞P&`s-P'%ģAMٹqHb)1\l[u 4<ŵ6qg n}%dYG FBF7egÜ;% ڸ㙯OW tg W #ƌW*O.'5X v8? 3u }F l퍳 :EZ;=-!ˁMe[!b !8]n/ 7Qբ?H+WGZ/[tl<'R0>.֋s UyoÄ1_PCBV)#j4$! 4 Ʌ+t /Wh.T,KӥVQ:fXYwyY]L3g+3[ +fhmBtP5UYRxM) MoQ_D:\[pX hoQ@B(WF9,I|cRHl.]Yq̪f[/))EEe୸ _q)GX: eο n RCγ[vb*l!\DR $R Y.~2?a>c~7\;S"adLSgEW73CC< $t޲BqPGc|JVFĘƈsVGĩu3.b1h")Z[G L[wc"Ot#Z}6C[4c%/@ԙ|b~§t8NUuGHǐ柹k_x9W>:{޶GL?l8GA|CQ$ģF Q3}88!z5bBɛ:-T~ qP8k<PJFIGOJZ8XWfsT;oF"n7n8;yC|5H45E}zť{#s[w[͸=FQZ19ۿ7D"Gg?͇z5pK荿Q*Hi7yWdz/~Z(bIؤxذ/dlD-K:N+ï6*^N?Ӕ}G$e0|8=}{]poMONg^YUZ w_&&`E }Iߒ%A?wJ%5S9BD͐y,Eajڌ^"l9өscߨǒ=-)a^}Z/A/VM(}PrtQW$ģq[btDY綌*WF_RGk_m^ƍ2ed]iO/j"Itb67=3=7pjq.6l)S\_k:Ȯ^lͲ _=u}?%ET,)ekMKv[duJ/𥨄x x/2hV5JLfš -2;v/pQv^45^Svwox [E.ȮT-afoS v$pwj]v7g'8ߺ^˝I*W"wyeY(qvHs+rj]x>ƽ{lwP@.]qoA8s2TZezQy;/HpZ~a( fs}~ZFWKr>!^wcDx[o_@ oy'%qLv7f mw--[hC o~8΋6?!!^޶xu]P5e^|QMǚ&+"__fyW|*'Y7;B"/OO!薔+C-D[~N4AZuqL}ǢHFŽmIURw%n H/iƵQOgՁ1@>a;I>`ӊzp$6HǰA*2(ZkI+5=}鰤з@wJ \rbmPJVL3T=zDI)@CwD9+pMU.%ځSدͥcTj%v.Vrb4nl}H~f$N7UOƍ*~x,~|mdzEq]K'1 K "stU1yeM0|591`֧ .{~~fzcu%MW@kP *}4 #gsCmK׀A/GKϝܒ:4|P{Zt:G鴭[ Eح-3(\3mbcv\Kҽ$͖I%3;@[i6ŹHL O>~`2̸kF։-ϗKQ67>B|P" Z)lTbhGmR”tKSg JvԬz3:(}cHĜ<9+Mڍ$hs:Ft[0~~"nNӠOT! AsB9Q9ʹF;,zj]vyxj]n;[,&Nng@k6ƾGu:>.8E-(Fòv^ǫW?V ~3tRV+y%wu,}ZU !Syh=m|&Q7}57 4V0W-XW(3! W#r4 U"gR57oCw06FPvLO>~vO>mGB̫R ew[bߴi~e;?AwↁMN:iwF/-JǗ`#)x%֤UyۻB<8N6=Vs^t՗|roԡXH9ZD[)( MU zŵQ E#@lhf,FS˶,F C#h])k7jsĈA\ڊdfu$\)ճG3 mLl+23 1"{02\kHUĈ=϶_ĨsvOwأ2:b5q&蛝1-зT0ET5qxudX"5*R`Gy斅x}ZB<83YFrlr)RٚelɌ9BШS {1niw5%.hw$16m~;#gȢWzP hI ւ]tG_Qq}cI4n?*[Tq 7wc/C&b;ÍmΆj]vβtюeM*j;T\/polIU$L`^ui'd*q-Se k8= 1;YTdh]FߦO< Zljh]|!yhnEY~c+"7tcnn)*;7 /[I%EB[t/*ϱ'tI,jb pҺtR|Ch֥&FmU{X &>΂67N3Z)\LxvS|A-4cc aZ,W& ze@L""w<&myVЌZTaDg@F u;%,td R^=@(SVD p Ghoϸke#S񺀴9< dmHx r3IFAki1 xNL ssƝwIGAv~YnyAل={ޖJu^2כo ع| > )(q/9vxBU]~ 3Sm]zO$h%LAb〓zWO/gr1Y_ˮ_ /nZF+X{+n)La΂6_$me|y]]I Wn<6<{f-/m({8ǀSϒ#C9\5*?&Uw̿k?AwJnNͼҲ6hYy]hQavϤdz9yK=T=v !j|-k}Ug!#G NJuGY_2h>&F3jΗ1Dbq)SN{?JO2Kn CGR+V67օGRGīdȜDp-dGT^R% T&ъ:(67 ֔RYnk4 .ѹ1VC=} rV񑑩ɇ4;UԱTΔ0I7Nt!r@BD pffHh'OY9do$_A3i6j*~So94B]ZAS=3|(}YdT~ 2+eW/sѿWLc=FK;WnU*x fO1vI̞@b#f;ϑP DOc2Ahk4T. 0"F:C]MFMEWR[z^p/nD*x2}f TGoP#웲x)YqaO3>m$6:%d❒ !ev#+35N\u'?+ߨÕFC}>>qOcehg|98$br{\g]sk48:"2rN0_ 3 F94t(;F;8:8jUޱ,)H-GSzd=+UQУlX~JFGI/[)]K.;?Z ᇠ?4j u&"APvvDHIz Gw la{{#"ĢW*yC1fm!R2nm>pn?&+P5dTZSc@1&ʲ;aQ)˗POX2x'=i\cQ=2벻_-I S@Gt9~x=YS o팭˲Wˎ}RC?GYь:pP!Biwp-s Θl0к- [9"nK}ahK!B j\ϟ-RDen"`ȟ[bK0Eh4=,o>-Q-Ǿ\J@>][BBɛ:-T~ Xꖝ[򝕕Rd m3Fom~1OgCk.ʌJi z٭~~Y|i?u^;_k͵5TF>콑9~ʂ;zɹzmlDX#+Ny -=~ְQܑ,(.=%!I`1ŚӒF>[w[M^=Sۨ@^ߘ_M>z F۩;t荿Q$ HEW[NiG;uX)|`Ws 16- le{V?,uS*:8U|Nu nO،Q_>OoLR ;.ӓSwzbmP.8H6UnM*x:Fԡ5e6]l{}(*f"i*m&zJ|h/;awy*S,m_WW*fe2%/-hH,V|[>ĿQjX Kf^a,rFFHش80gux~0`muKL';T#p| ~B%t5q؏c^@fPvƶKhg&LVx/xQRf@cA-N#ՠD{] ./z]_yh5ދgmet3]}!,saǗriׯW1#N!YFL١$l٢*P)R<ՕtVEo5S Zġk{R5cÒ~' <xBB<\iF}MΉWu)|wKS׊dP,_v|'~:˖]fEJhf:WD2M3;VD; zW z !41!@w))#r@)ÎAr GAvAIH^;fJBMUӈz戧Ӫ8KM kc3>֎Cti1qcssS)K#V9]UYS4TC|99cR| u[~^2RqZ~;EgYB7r⫡,+yy&j,+fxW|ʨ℡[HO2V `|dҤ co'r %7 ]Y,G/,N!|2c7I|2KàX;u1ws-*^ڸѢ^!j]թN{;< 9ow.~ҵ OïΧҬ忷cI5Kd Iw4Tm7'p]T[{έx~wT+׀Za4ToVb ZJX}rX*4 oZ[ ۱wyJ`Dj5ϰ%7Js av  tZʥw)V2 cSv16jy5=_DN䗱Sڏk<9cz׸]Hq],Z .0.93fMFRbgE"AA"aD *x:(Z F39iވPfbJ\ a2zo͆lի m C~iۿ{+PAf~a!]:chQYг6 bHyr/^YX{U3]-]7x2 ,MPCN%Upjubq)j^EZV6a,:6 &^ SK{%\g)p#KP5-9ۑssM).ӌPM-gc݀nnK BZr ȯm(V*'|jTB=s e6?QF*>pϨע⬑+{$vOyxG<[RoF( 8+zV;kY&ab._T|]%GVٸ۝|$7P»vMi t1vI&P1ŷ^ں~16eFl/xNY||Džm؁%S;#M|)w 귻nU x_6~fuNt;D1 9n_GGLҞ!_-uS[ZWfLh*D&cѸx"ҔP3F.}fPTjfPvvF ObڷO #iRc,Hw[*ӬI e,\ᾤ1*xd!ٓ[~Ki?\ ?;J+-bg>iQ}ixFkS2rr{а}ehϹx5w4]:+$Z ѯ5`>TN{rYҋH.[^ i*b7Ee_Bi_ːӽ~;ppWPvvP,4Y;G} }ȘK X>(>myFnC7G+?(-!ӄWB{ehgGH0 Cncx`hOqk1coނ潈ͱw[k`aO(pSo!9} 8ӟC ;֟_G1OJƗ-wѩBY\>gA6?R% pB\7'"eҋ#g^dK J]pX &DzJ?0={TVmN G@0/nղ,ʩMr0C8z :E11i+3I} >>rE{swIEF! >je8 NJv5;17 ?,!C6Q:l T|qq垹kñWi)AV2 B =kCN"fe.QeDY/Gf[c3ڳ"o֑ ^"Rf -u†n7i zk-Y:Ⰵq` B{EVJ J(,gIQ̥iM9X/{x}cOWJLh?YKnPsA\ocۉU9 I$l{Y*Y$dS`TaFZ>clBDX%VFG3jzZ;r -p#;.aL$K:߲CGVU=5Mg[]ԈKG\R7J lT|x4VSvΦ.gv<2<+R oEL}̚&C*n8N4amN8AdDRwbDUiV]l ;gVbP~uƓc?YLRF\;-KMNFve%$֤{$4Ӛ{L١1l,=9}FEFyRU`{}I(+97/d4E/n$;[}Zzp!uhɦ$j2g'" |7b+n@~~"E΂vX[]vˉÃ)e[vS0I2Q`Ud ,>tgf3n< b[E'TR^ aEA#"lB3M(Yd;UKa0A ~ E1L:'x =4Ě~E j.Z=gnǛܘf(I}xzܣO5荝o7 U~-=tpKf|ԬRtj85.!7aƜ|gMO3,9MvKn[պ7Q;\j!= !Kͷs>$tRSKz~pbGBLw,%l]i| ;n4chf:%TI .1eR$9Zfr #C6c1o/V})՛2JT X-AHi7,ڷMBoВ79"W ,m5>@S ;zJߓO7LM9{9yǥ :;Өi]ڹyE o{ _=v]6I:NQy 3&^e5F8ErN5"UB<],]Ovd~Sv/0)ofdvm qJE~H6x,L=Bi;֐-IJ2/7Q>a|}Kꍒv0Rcw3&=EeN'a1hl 3M=Ϥ跜Jј|0,.Hמ<$~CihtzܬʕG䤋ʆcK2qVԁٌ lalvo#6}s`MoA?}ڒ[c&9mз-bR@_iSTt/Rw$ģًM١gx:*~UI>lCa{^,DBf X{_Ebg\^sc3ɦBtŎf1V2Ca㊛_v`Eb|DlR2w2]a)-%=..Ed1δ{u_C95گ =h-[*:p1!K-nh22%7w#/d"(AJ2LbԶY-D=HtCuK25u,|;aB*0Lyo!On-y:1ͧ~Ƣ`4"I~Dhk쬦A1ǬʳR>n=Phuͼ}0˒/lF'S5S$LBD`EYRP =24!&{(US7W.hsx4s։,[0V@P +nb>Cь[.Z&ao6oM]cv -ܵW/.b''] 3O!aT% NڞUN-uFGE%З:+/l+]iN$+{ͷu\+2wV9G3Ys "fN%DEbgx2-odB?m>Ga{s3sӱS:77 '$mQqc7 CcjI~ЫR9}ɇ0*fߛ"Gj*̟ZaBUk!x(<6 A[SP룂F ]eoT\xΏt*~RB<[h2E<mmY6͇v;x hUC;>"R4*諝c9 kVD|ZV2 e!ke 4?4UY欸9H/owؒ x|֦tQic ~ʿ 1y ,ygF޺KQ6/~ &gI7ɤggOzZ_K;S/ՠ8Zk[mꝁH2Rx:͆c5.t-Rm"jL*iߔJ ƑHќ-@]HG q]툗SAЃm}<=Zx.i)IA$9-5Ɯ,\~X).'@2]uoʟc "O(ݜxc,M(о)qn]$ _0 :~CJW0 )Mc NvB@4RiD@Ŋ<$=J5D$UR*K"iЧ/KT ͌hwiN?筺= 2*h?4 RqBuH+6_Dkb s%D$SO?ޚXy> [&4OZRI]ݠwku^x k ca:pHZ%DwjE+m'j^m3I׮IGRKYH(= 7KG^|K3 0 l OE1L:'7!+ʡ\vWsnyfl|) H^Lg>~Kg3F;CVv%>z<=`rjQBN]Юj;)iBp2GKe66zqr+ՍdQŢN-预x,PyBB<ݘ,Gh;#xVf:sp*Em{"atθzkxiI1ZvJ\GMy O:1gf5SOunSU2_.9?J Nh椷3&/%՜;[KV+nabix ;m;kU[ŏ=ѯb*|J7;.gOLXor\~qAx Nh= + UK잖>:ؒ EXuJ7=Tmз0h>@Ǡ5b&ptxPqg@t~À'!C61Qq˅8FB4mDz,DU!eȟP͓;*+r5pD=b0hxe~ۢXD,\^} gB Мm!4b8 hT\/0|mo6RSAb.h{o!?ͯ(SBB OӠƽkm:]5=d7v;^Vb)Q=ZzOZ+úb!LgqYSEM6+ץ&E!vÀ΂jV5? h$9قt^ 1v&2&?i +q`#*xQ hBu8ZV"b}Ws)E$!<@%!<Z/?BC3(h=Yn5Laa81.b@̱|DXN֊T]A>v| Q2z+NXS+y !-k5yGUj8k"Pw୸QDԣ=f&p,Zw)%"tLjǰ\iV~y DxRiYk:Pd9exRʢkǐ h]n1=h6^S@c#ԛE&Z,kVƥhֹqYAAweqFNkxt{y|~!˂j~9S > sL>C|4 Zk+e惯THoe܅Zm]zT/;0Kl=O5>Z]I8zkɖ犬b:b%-csHJmnlzO9*q5em!qLB<^RqAkjG4}_u"LAxљ']6JBC|O^<243a{հR ss E | vn5]Z F;낛On L>lo[I- ›ӕ%юUzMyR;0M(t;B1i\!Zo3[6ڔ5*GB;5?yU~ zGQtQM&Vqv;L[-!R?z{)ӓ84\?+Oo'}4]kqMth w.|@Rmyzcݝ~iBi!(CZFQ6Z֩z%#ַ%ģ9S 'B'SU WB<W1?jU gk]s#)S롫_η/C*R&td\d6&Og zx+*~RB<W. g>43hec]=:5#.62ZwI>zש@ٸ_V(~)^7f1/[9O6ɣDa³ZDIv>ڛsb9N ELfAg菡G@w~ =Bhv&:xo3'zjK>$Vomr٥G&Xn!9ZcPM~/8Fޔ8 hʓO@.b6Bl$Qʆw}{ϋVQNLST 8XVdohZ/p尴ƪw 6NHZ5NmzV#+|S q\)7$vHl'YWE+}-JOITӐ?V 4_+k+Vul|`,c#SOړPJ鶥H !a1ڑf$eHhrR醔4Z᧻+e? ɊюKYٟDK9x*OB;@]2E)-K>_pCX Z|) ;~Rx4MԒ1LgϠ ~F[ف ǟ}Ț 'nPqۀAkpj,e/;'m+R tڲԭϝRUişMuUQ= d2F;Y;]Kj$$ g_7W9DV0$}-G]?%m~D;"nT/ $FOi1@590J8zĞ҂15۠o_iQqI杸Uy"g@Rq-rBhDYme (|ID̾%ɭ! J )"LNبʑ9o%R{Nʇ#TAz$*Ǚ@~XLPJe-0CGhVgOðLM> W| 7<i$ l')iPm[560I7ZUdL ֟NOQHl 5"&|Msq _L0hU¼s>G:|eS^z:+4^WGѩO67&NyJϋW.cZ`eޡݦ}>A2u*}>k,"쵌*=|XkmBd/ms}J(=Or)7|˔#KF\-Kn5iYBR6 {ލU]A#~ow2W)$y |h#b#M%}C"߇@nvN_K Rx,)he\_IƄAkEMN5\Zͱf&<D?)!b_Oɟ H rJ~0lt '@kIPŠT,?K(x$EO>e,hȋwϋjVU\aLeR Y$p7!>GK=}>pzu×J[)\Q=:=oNVN@1jnJ 3@z.mWLX񧇲,p+rzHn$5aG\VvFqw!A1ڵavWI"k/%HC߄][BBɛ# 秪}CPU?@uG'm^Cj_H^++3v*eiCM,w :~ W*#s^}qi?!^rǮ^'?O@DsTUF{|=$Z8:uj;괫4*k^Q9-8w1yb{C<bDo.-UE=n/iUC=qVnV ?a̘gr ryU"糨à_Q]W")TwE]4a.!Їb0ahdxFV;ӴD;Vec+ͺw-(tDxNW|ɜ}>~}x$5%΍З_l0sj1 O+scp\35 dCMq*]F{DV=ebU[G>xz\9N;eJsu}lO{^a6k&v? 9ʚ@-Oբ+fr-EwͺhuUYU /H&chN '29ybW^}MYu#ޢJoJ<>-5;.;'W'$I۵6yp~2!~s',{@mh x3Uq(a"Z9ñu~Yʹ2V] 7#PYgWQ0K%9h ( Z5蔐br{0CJŖ3*DuKqueKlV#љʺ߇ P>0ȵb}ANDG3޵ ;5m-nC-5tjO@O@mª%O9jOB'#Uma͆uM]uf5s]̉$FX]_~ClL;Clj$TxOA'=0Ko*û+ "BwlCSmE5qzGn4*Ye>Wv[&o>=a[غ+r+(vdeOC-"Qc*֬:̻.]]//sKHMr<5_4'n[3\)-CV^ʙ1^U:kAV݌3[2犌- /RTh*ɱC-bnMV?58NZ5 &~"rL3_s +gx [6][4HG~}:N2C͡d;eZ wxܞ$5+2 ryXO^v^5`s=+j:f'NuP^="S C)hZ΁?0 ̟4+C.!FD1)\ < z;S5Vo֖u;)]43UI%Q"!)hu~ԚQ^͆᭐!հОwγdfSxs~5,B|wQ1H M36!9tM}#`C5INf5jb[Y) C- `m]zb /`S۠۔-u3nA&9ģ( F6#_06٬iijZuѷo1t 0(WZX!s@$N؏ĺn-OdNB-{A˭h u7$1 n`ꔲNK(%=R(]yw G}$^Pq$^xyvK\I.?v~$D$J3Mll2gYz똘Q[6F[>C[!s, Rd*M)21zrmJqQPj!mJ|^zƏ p亣T3|np7(*DrVU!h.Dμ3ꂲB=j`oFlMFGA-4gVZto/Z )~4qmXL+@ ,jGlIHδ2KS"iUzkap{ "l!骈]{4bC<wKH_8{9ģEݍEs&\Mqӽ* [P{gB|> T;{!|-,05 P:5PFj( ?~|eh 8(*:RYx~Oux E=G -9<9`-]eX-LR³`q؝D%tm$1h$ gYX~a9fiR?v~)xo$sIFX?/J; b#Tbr[gbC<3w%yw=?Dq'dC<:RGܰn9H i$J4lyO H۠,`>m`RR=!w@Kvg}{G#s!F`4V5W 뭠t 2,2#u3#sc)y~쉧Mf͛$Rz^3<2!؝羁{?'#~ ɓ(<$19ģ"#zuu; =H$oMZUP'atq^Dx҈$vo*ko:iQ"ančt_4cNRKʂ0Zv ?S5G[aT._i--Wg0*Ǡ՗l5Kpmv%/B&H-J?!8$mP:tZ5ؗEдks]P\F2r5!x/nTPNU:C<;¯3QBwW2k %9; 'Aۮ!ls#cOV. G8q xȼ(?蚤9ZjT\73ˠ/+fgD]qxtFWs!U\o؏!J?ČeAKKODQrZ6C:V_d!@xp3q]Qc!Tkw-E]tJ|ec~j([HߒXPBnW@#T aY+{;`T4d+`B0>3PF8Tkf-U̇=GP2p tt[w^oL =į`Jw~Hz4:m6gK۲\ݥ?K%/'+k/)kZ}7*[ ۪X@Hkٰb*:[ꂊMO/`Ac{+҃yp_벇 Ͼzm iWym*oRwve9l2Q׸)7.xb8pt-#!F/>vڊ{gtCzOٓV5^57 Emt\=OD:tde& }} dƒƯbC<fru㘍W*a(p/1(f z_!9#!UqF2HCƾ^2 .+WV@ܣ*th9>!Zc8^e0 qS\V5B Mq[Yxk呲U .A{Џ"3RE˖ C8qAf\꓍P5FĄAS@uj yzvwebM@?V=`43GF2q+r/-pmjQo@qh'6QU+Lp9˼ܾި;[=5k]* a\dм{&kXP,>?X=5lǞMB;?7ǺDK1uMQsIۍ[ΫFjq7?})_u/Vkn/ۻ]_>.U3L=+r 3HhzcS]%PMף勗.IIN2bo6F;x9h`|kn%yed͵x}vL_S颎$\,15G-~XtKualI [d⧻b\p##9^e$'k{ ۩O1LYI M!M0h$)"qqVuÚj{ɱ53 0 0@G88<Fţ}/mB #Z䤼XQQ9lz?5h6ufMz1v]ll,7L6܎k]*>Cl:A}/p˯~rKB]IГ5ђXfWɍTD1tvpԿmnSt@ś^bfy Bz senecI%ﲿx-$̎ +HF"P4Q1o7;bm]ICVM-ƼiI$> tEfbestw~YojƖjU\HT<^o.lE/H<&.C g.yQ! ./8ә)NޅDV A砏sNў6Eת@E4y|Ὄ1Z"+-Fg4]jF$]`mr#K%;1#+V䍷Sf#왲YD}HskJV!Rپ8SX{n6lN7}{T҄ٺp-ižټꦣ'N- q tG2V9qU:ӣYa)qlT8a٤uKUmgJ:,/E }IWZ$н̦0;=Z ]HϦyQϺZ]Pqm:fo`iMdF}!O";i.l*"[*[ՃZ\&RN@+bg{&2 ,_bFHܶbӚHw(eҪH=wudtu2NvF.R,.N~;!keI+#urd:S-O9ҪHww0:qU11{'{˓N}wHEǦudty2Nv4wM;A5=(!y|^;Y0Z2V1؝YNJ|RWyp8Cs4)'G{ QG#(c :~-Q"Ɏo࠮5$#G=ҳSF{Ntv=oW^:YA:uIN2TJX{6} vwq 0뾼016qOabڻJ„u`bjla%N*_5;aZM`j_Ŭ;&q%v&C}$Yn$PYzĸ^_OXkx\IZ5MA(ͦ0ly=qjݸ+iBM lhՄ)riUVUn4&*oNEJL=ljZ=q!IRI5ȸFsit"q2gƪϠ$$M˟46J˄ZP/4?ŊȲfFT#i&4G1Dn[<í? 6'L"Z6GuT#i&4wq^lc#XOF5M{`59mH5fl3ڙj%3IelJFR=爷C/Hګ'64S$o~]pV´̏gkJI3IS$j}$0?Ʈ|?НHqa:՟*$Y(R;:Iq~ziVhH]0xIZf, Ie~=yj ʏ_RŤ8 ݙ? _g\裨-%11{HawO/we.r}h%*+lrU;D;Hq!Ї";(0I]G$wsx[IM8zHF&"^<"D"Lj8=Ҡn9gUGF0O= 1Q7eߔ!($2 ɜ]vWeH%N2ʾ*c^wF}52Q؟f7]HOej}UTN*S2qf_!8*De:X6V9LY4kY dSL-fTSL2Qv9J2$YN#eዱqOjmcv"2u]M'SLQnךΚifeuj]v$ 8fOwZxcZSw]N>O]☺4V*ajY&,+.is7.q&54 t]oqɗ_'R!%]n(+ E{hrcKљ9fN-7V7UFى]Eb+ᬱeZV-ï 7="%n?O३1FoGViC<.j8(_xbYeqU"ѩC?*6,nVU)؎]nS[v|qp-XnZ9'vsc^_vQuy嶞WK]f}HE^xŃGK_F8zJ~wu1Y}P>2U/ HW|ܬ:iU|9a@eÕeLYBS?,ۨ [1]x=*?ov+^@s~qW͆n ۓMkuO_Iy*nԺ#%jA֖!rȘ{/轃1}≨vwtnr{dHC'3!y\If=Z*gkHcom1c (M<;}oN=#c9ޖ5Sk/+旼ezPo!S4J1WNWVֹ6k VC:DQhOj=wFwO/?a(1o\c W/-;mx:u3#Z߭jjU4M=6E[s<{(c7v/x$Ĉظ'Z~Bf$pb,WLz!8 X[՝W[Ji% M`\1G({j3[3O5:^w\N6Vӝ5b > m^}5Bq6'k_gF2~ Z2ᥜjd,2زmZ˜ X3s?xqz !EЋya3i8runc&_v)/_^b [cD'|r1e/F ey``xZѕ6%t.Uj@8#v~8w\ģX-[ʬLsF4˾|je8O|IJ Z .]@tz77w@Q ,=yq\lT> ڨo\iK/b \,v!̦S;$#rgcoVT$o580I+HG{1НnrĀz:b?ġ|Ozci:rW gt8^cB&7sCPQ~~#!VuRU}yC#3^e(j9IȖN&f [Lbvk x;1zրe]T$ 'j>HݰV75i8Ä;}}02:R2R'Y=r@bC<@en:6G8ZGMјXF}UԜII &A|pc2";W u"sLfԟ;v'Hƾʓ~3>LYP!yv1b=nݬ2MdS9s(sʪ9P`^rS|Xd:\0hc PW0c\wݴcj,p@B38.@7'Ip/[b^fZs[cS7z{׵\w?)r?`;흈ơboG ;J}?kl+l]t.,zr7kz]8prqոQwtTc Ϧs3'>BxlJ&Y%ٶLK2x ȼHYs2 ,r)<sF 5Y~kDDT>\7g66h7-hhW\vtrضNj^VOR@/()c53V8y^d/cn :[ȴFCׄ52硑mh뱛Q&:$d&vcCw^ v;j laio`ÊEB~+e ׉9zu4dTjnȬ54K8# B5O>UW<ǁ͎urUWl2:wnh?hwhIީm(u%*ZcXZne6Ox\Lmi7il4æf%y˜Q5ݤaeOxM6W^g V?32AnC'~$OP"iZSn xaewh@X`E*~u!4L>&?W%*X t7O{s}N+/5fE3> /p x1&>%UkEV0qPUxZa`(8cKE-8hb㊒TfR&!v*Vu7X b 76}=z;|Z}#ĕGa4Y'Fּˋ"歳 0%½c)NvV)~l6g /HmHRÊfRgA?Gg7@6M:sGf6ݨK4/@Pj)v>tyބC_θ 6kV7Hu '8K{ͮݼ{ Wh>x[\A%]/q'v?E c*&%Oiu7ێްokBMf}[s~C~AjS`!bګ툯~c,}KF]q*$<|i'PaX"U#2e-^}923\KD]tR \|Z}ag=xP}1w6K3F4JHnL~ Z8:7ϱߪkT\^ʔkK߳~g|2m5M )j-#)epUؓ.n;B |^zo#yxi'x Vorybބ?n nnf#ޏ*/ ZL/e;[$ 7d "mQɐP3L.?"[ 1$|nz=0atg3Q~[0_{7ѫUn!,k&iw_#_EiqôAc?UD1ȕ(S>%KZlk!^/@1ՑǮsn:Nݑe`a؝ Vf̦ƶjf^f|I,q &ip A\*/ L-$opH?;$z]S/ιC 1-ֱwT4vQ֐қmMVkNZ9f[x뛌 ػo͐6]8N'iuDA/CxHOB|*SM6ZdȬ>ΉL.?"[ 1D|>m?q/30 )bX^bwb߁7z'|rmsͨ߿hr^s=_S{K9g29$^1neO.AHl봐k\Po *%K?0&#Urojv"j:Ht_)(k{h扽!5CoD=ڊ!t*R;pW-j u!`4] *#G:{91۱;/%a0WBLDDp}]Qe(xAIYz2LO@IAC@9 L @(ߞYi]Y@v C8)iCx Ȍg_HBno.5^p/d"H[e=2fU |ckںΖu]WߔDջ1EMsAdyxB]CWeA( .^`XM(=0uG;Q{p7S31FoGQ)$x$ͨ8 I(Mk`_C^kuA(h9zr-iMgʹBo},~TܲI (ʢ+Kھ\19]zڷOM6\$Z7P,"ED/-!Z}UX``43/s3,zBNJn-lJwh4g- Ae U7ԖkKbcz_m,Jo $Zw(»H xyZ'7ω [C<RqHH㺂^:XԂp@6̰?B{HZ* F4 }gEG(at ?Obc@jܰ8}vrGVsU񇙨s{Eӫ`d*!$hXSl@Jr㠥bK)O>{!'9QwN!M2-"uI5:.bvx\6µV9ڻ?4V5nЏ{va9*sҶfPiƨFȮLS rt/Ds[-n_:& O -W%: imw⇊*ʢ_VW,OUh-]^f%D%b-" 1uyγUcmWaK][o]y[[/_~ypDy@ݘV܃xf-7?YUdiJL}bTfkKX:.%J[L!(atqo;hLОYw4 f¢[GxԪSg)Yiᚯ֐ȳo5Q5̎ lc-RsfP/@\JwJ>,OIs=K^⺿HH !YgtY>ΟO?B2“RM +e[jO0:>^Fj3$n\3SFr`))dJk-Ex$O8fB {P0`tG]+Ua7Ut[tag?{oZz,VB żC}?$ Q [bU5oɪbX.!29?Ρ2yxG} ?27" ;Jh!>n!D/< %-5'@ůb?! VK!>= library(Rdpack) pd <- packageDescription("Rdpack") @ \Abstract{ Package \pkg{Rdpack} provides a straightforward way to insert BibTeX references in the documentation of an R package, using the RdMacros feature introduced in R~3.2.0. It works for `roxygen2' documentation, as well. \par This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. } \Keywords{bibliographic references, Rd, bibtex, citations, \proglang{R}} \Plainkeywords{bibliographic references, Rd, bibtex, citations, R} \author{Georgi N. Boshnakov} \date{\today} \title{Inserting references in Rd and roxygen2 documentation} \hypersetup{ pdfauthor={Georgi N. Boshnakov}, pdftitle={Inserting references in Rd and roxygen2 documentation}, pdfkeywords={bibliographic references, Rd, bibtex, citations, R}, pdfsubject={}, pdfcreator={Emacs 25.3.1 (Org mode 9.1.6)}, pdflang={English}} \begin{document} \maketitle %\SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Inserting references in Rd and roxygen2 documentation} %\VignetteDepends{Rdpack} %\VignetteKeywords{bibliographic references, Rd, bibtex, citations, R} %\VignettePackage{Rdpack} \section{Setup} \label{sec:org848e2e4} To prepare a package for importing BibTeX references it is necessary to tell the package management tools that package \pkg{Rdpack} and its Rd macros are needed. The references should be put in file \texttt{inst/REFERENCES.bib}. These steps are enumerated below in somewhat more detail for convenince: \begin{enumerate} \item Add the following lines to file `DESCRIPTION': \begin{verbatim} Imports: Rdpack RdMacros: Rdpack \end{verbatim} Make sure the capitalisation of \texttt{RdMacros} is as shown. If the field 'RdMacros' is already present, add `Rdpack' to the list on that line. Similarly for field 'Imports'. \item Add the following line to file `NAMESPACE'\footnote{Any function for package \pkg{Rdpack} will do. This is to avoid getting a warning from 'R CMD check'.}: \begin{verbatim} importFrom(Rdpack,reprompt) \end{verbatim} The equivalent line for `roxygen2' is \begin{verbatim} #' @importFrom Rdpack reprompt \end{verbatim} \item Create file \texttt{REFERENCES.bib} in subdirectory \texttt{inst/} of your package and put the bibtex references in it. \end{enumerate} \section{Inserting references in package documentation} \label{sec:orge601e7c} Once the steps outlined in the previous section are done, references can be inserted in the documentation as \texttt{\textbackslash{}insertRef\{key\}\{package\}}, where \texttt{key} is the bibtex key of the reference and \texttt{package} is your package. This works in Rd files and in roxygen documentation chunks. In fact, argument 'package' can be any installed R package\footnote{There is of course the risk that the referenced entry may be removed from the other package. So this is probably only useful for one's own packages. Also, the other package would better be one of the packages mentioned in DESCRIPTION.\}}, not necessarily the current one. This means that you don't need to copy references from other packages to your \texttt{"REFERENCES.bib"} file. This works for packages that have \texttt{"REFERENCES.bib"} in their installation directory and for the default packages. See also the help pages \texttt{?Rdpack::insertRef} and \texttt{?Rdpack::Rdpack-package}. For example, the help page \texttt{?Rdpack::insertRef} contains the following lines in section ``References'' of the Rd file: \begin{verbatim} \insertRef{Rpack:bibtex}{Rdpack} \insertRef{R}{bibtex} \end{verbatim} The first line above inserts the reference labeled \texttt{Rpack:bibtex} in Rdpack's \texttt{REFERENCES.bib}. The second line inserts the reference labeled \texttt{R} in file \texttt{REFERENCES.bib} in package `bibtex'. A roxygen2 documentation chunk might look like this: \begin{verbatim} #' @references #' \insertRef{Rpack:bibtex}{Rdpack} #' #' \insertRef{R}{bibtex} \end{verbatim} \section{Inserting citations} \label{sec:orgb780a37} From version 0.7 of \pkg{Rdpack}, additional Rd macros are available for citations\footnote{They were introduced in the development version 0.6-1, but 0.7 is the first version with them released on CRAN.}. They can be used in both Rd and roxygen2 documentation. If you are using these, it will be prudent to require at least this version of Rdpack in the ``Imports:'' directive in file DESCRIPTION: \texttt{Rdpack (>= 0.7)}. \subsection{Macros for citations} \label{sec:orgbaabdbb} \label{sec:macros-citations} \texttt{\textbackslash{}insertCite\{key\}\{package\}} cites the key and records it for use by \texttt{\textbackslash{}insertAllCited\{\}}, see below. The style of the citations is author-year. The ''et al'' convention is used when there are more than two authors\footnote{This feature was introduced in Rdpack 0.8-2.}. \code{key} can contain more keys separated by commas. Here are some examples (on the left is the code in the documentation chunk, on the right the rendered citation): \begin{center} \begin{tabular}{ll} Documentation source & rendered\\ \hline \texttt{\textbackslash{}insertCite\{parseRd\}\{Rdpack\}} & (Murdoch 2010)\\ \texttt{\textbackslash{}insertCite\{Rpack:bibtex\}\{Rdpack\}} & (Francois 2014)\\ \texttt{\textbackslash{}insertCite\{parseRd,Rpack:bibtex\}\{Rdpack\}} & (Murdoch 2010; Francois 2014)\\ \end{tabular} \end{center} By default the citations are parenthesised \texttt{\textbackslash{}insertCite\{parseRd\}\{Rdpack\}} produces \Sexpr{ insert_citeOnly("parseRd", "Rdpack") }, as in the examples above. To get textual citations, like \Sexpr{ insert_citeOnly("parseRd;textual", "Rdpack") }, put the string \texttt{;textual} at the end of the key. Here are the examples from the table above, rendered as textual citations: \begin{center} \begin{tabular}{ll} Documentation source & \\ \hline \texttt{\textbackslash{}insertCite\{parseRd;textual\}\{Rdpack\}} & Murdoch (2010)\\ \texttt{\textbackslash{}insertCite\{Rpack:bibtex;textual\}\{Rdpack\}} & Francois (2014)\\ \texttt{\textbackslash{}insertCite\{parseRd,Rpack:bibtex;textual\}\{Rdpack\}} & Murdoch (2010); Francois (2014)\\ \end{tabular} \end{center} The last line in the table demonstrates that this also works with several citations. The macro \texttt{\textbackslash{}insertNoCite\{key\}\{package\}} records one or more references for \texttt{\textbackslash{}insertAllCited} but does not cite it. Setting \texttt{key} to \texttt{*} will record all references from the specified package. For example, \texttt{\textbackslash{}insertNoCite\{R\}\{bibtex\}} records the reference whose key is \texttt{R}, while \texttt{\textbackslash{}insertNoCite\{*\}\{utils\}} records all references from package ``utils'' for inclusion by \texttt{\textbackslash{}insertAllCited}. To mix the citations with other text, such as ``see also'' and ``chapter 3'', write the list of keys as a free text, starting it with the symbol \texttt{@} and prefixing each key with it. The \texttt{@} symbol will not appear in the output. For example, the following code: \begin{verbatim} \insertCite{@see also @parseRd and @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd; @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} \end{verbatim} produces: \qquad \begin{tabular}{l} \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex", "Rdpack")}\\ \Sexpr{insert_citeOnly("@see also @parseRd; @Rpack:bibtex", "Rdpack")}\\ \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex;textual", "Rdpack")}\\ \end{tabular} \texttt{\textbackslash{}insertCiteOnly\{key\}\{package\}} is as \texttt{\textbackslash{}insertCite} but does not record the key for the list of references assembled by \texttt{\textbackslash{}insertAllCited}. \subsection{Automatically generating lists of references} \label{sec:org5309182} The macro \texttt{\textbackslash{}insertAllCited\{\}} can be used to insert all references cited with \texttt{\textbackslash{}insertCite} or \texttt{\textbackslash{}insertNoCite}. A natural place to put this macro is the references section. The Rd section may look something like: \begin{verbatim} \references{ \insertAllCited{} } \end{verbatim} The analogous documentation chunk in roxygen2 might look like this: \begin{verbatim} #' @references #' \insertAllCited{} \end{verbatim} \subsection{Changing the style of references} \label{sec:orgefd3695} Package \texttt{Rdpack} supports bibliography styles for lists of references\footnote{Support for styles is available since \texttt{Rdpack (>= 0.8)}.}. Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested. To cause all lists of references produced by \texttt{\textbackslash{}insertAllCited} in a package to appear with full names, add \texttt{.onLoad()} function to your package. If you don't have \texttt{.onLoad()}, just copy the following definition: <<>>= .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } @ %def If you already have \texttt{.onLoad()}, add the line containing the \texttt{Rdpack::Rdpack\_bibstyles} call to it. After installling/reloading your package the lists of references should appear with long author names. "Rdpack" itself now uses this style. \section{Possible issues} \label{sec:org4871d85} \subsection{Warning from 'R CMD build'} \label{sec:org2375713} If 'R CMD build' or \texttt{devtools::build()} gives a warning along the lines of: \begin{verbatim} Warning: C:/temp/RtmpqWQqji/.../XXX.Rd:52: unknown macro '\insertRef' \end{verbatim} then check the syntax in file DESCRIPTION --- the most common cause of this is misspelling \texttt{RdMacros:}. Make sure in particular that `M' is uppercase. \subsection{Development using `devtools'} \label{sec:org657ff99} The described procedure works transparently in `roxygen2' chunks and with Hadley Wickham's `devtools'. Packages are built and installed properly with the `devtools' commands and the references are processed as expected. Currently (2017-08-04) if you run help commands \texttt{?xxx} for functions from the package you are working on and their help pages contain references, you may encounter some puzzling warning messages in `developer' mode, something like: \begin{verbatim} 1: In tools::parse_Rd(path) : ~/mypackage/man/abcde.Rd: 67: unknown macro '\insertRef' \end{verbatim} These warnings are again about unknown macros but the reason is completely different: they pop up because ``devtools'' reroutes the help command to process the developer's Rd sources (rather than the documentation in the installed directory) but doesn't tell \texttt{parse\_Rd} where to look for additional macros\footnote{The claims in this sentence can be deduced entirely from the informative message. Indeed, (1)\textasciitilde{}the error is in processing a source Rd file in the development directory of the package, and (2)\textasciitilde{}the call to \texttt{\textbackslash{}parse\_Rd} specifies only the file.}. These warnings are harmless - the help pages are built properly and no warnings appear outside ``developer'' mode, e.g. in a separate R\textasciitilde{}session. You may also consider using the function \texttt{viewRd()}, discussed below, for viewing Rd files. \subsection{Latex markup in BibTeX entries} \label{sec:org2606b37} In principle, BibTeX entries may contain arbitrary Latex markup, while the Rd format supports only a subset. As a consequence, some BibTeX entries may need some editing when included in REFERENCES.bib\footnote{Thanks to Michael Dewey for suggesting the discussion of this.\label{org0aff802}}. Only do this for entries that do not render properly or cause errors, since most of the time this should not be necessary. For encoding related issues of REFERENCES.bib see the dedicated subsection below. If mathematics doesn't render properly replace the Latex dollar syntax with Rd's \texttt{\textbackslash{}eqn}, e.g. \texttt{\$x\textasciicircum{}2\$} with \texttt{\textbackslash{}eqn\{x\textasciicircum{}2\}}. This should not be needed for versions of Rdpack 0.8-4 or later. Some Latex macros may have to be removed or replaced with suitable Rd markup. Again, do this only if they cause problems, since some are supported, e.g. \texttt{\textbackslash{}doi}. See also the overview help page, \code{help("Rdpack-package")}, of \pkg{Rdpack}. Among other things, it contains some dummy references which illustrate the above. \subsection{Encoding of file REFERENCES.bib} \label{sec:orgb642964} If a package has a declared encoding (in file \texttt{DESCRIPTION}), \texttt{REFERENCES.bib} is read-in with that encoding\footnote{From \texttt{Rdpack (>=0.9-1)} The issue of not handling the encoding was raised by Professor Brian Ripley.}. Otherwise, the encoding of \texttt{REFERENCES.bib} is assumed to be UTF-8 (which includes ASCII as a subset). Note that BibTeX entries downloaded from online databases and similar sources may contain unexpected characters in other encodings, e.g. 'latin1'. In such cases the check tools in R-devel (since about 2018-10-01) may give warnings like: \begin{verbatim} prepare_Rd: input string 1 is invalid in this locale \end{verbatim} To resolve this, convert the file to the declared encoding or UTF-8. Alternatively, replace the offending symbols with their classic \TeX{}/\LaTeX{} equivalents (which are ASCII). Non-ASCII symbols in BibTeX entries obtained from online databases are often in fields like "Abstract", which are normally not included in lists of references and can be deleted from REFERENCES.bib. One way to check for non-ASCII symbols in a file is \texttt{tools::showNonASCIIfile()}. Internally, \LaTeX{} sequences standing for accented Latin characters, such as \texttt{\textbackslash{}'e} and \texttt{\textbackslash{}"o}, are converted to UTF-8. So, even if the file REFERENCES.bib is pure ASCII, it may implicitly give raise to non-ASCII characters. This may cause R's checking tools to complain about non-ASCII characters even after it has been verified that there are none. If this happens, add the encoding declaration to file DESCRIPTION\footnote{Admittedly, this is not ideal since the user should not need to care how things are processed internally but I haven't pinpointed the exact cause for this.}: \begin{verbatim} Encoding: UTF-8 \end{verbatim} Needless to say, make sure that there are really no characters from encodings like 'latin1'. \section{Viewing Rd files} \label{sec:org5f9a745} A function, \code{viewRd}, to view Rd files in the source directory of a package was introduced in version 0.4-23 of \pkg{Rdpack}. A typical user call would look something like: \begin{verbatim} Rdpack::viewRd("./man/filename.Rd") \end{verbatim} By default the requested help page is shown in text format. To open the page in a browser, set argument \code{type} to \code{"html"}: \begin{verbatim} Rdpack::viewRd("./man/filename.Rd", type = "html") \end{verbatim} Users of 'devtools' can use \code{viewRd()} in place of \code{help()} to view Rd sources\textsuperscript{\ref{org0aff802}}. \end{document} Rdpack/vignettes/Inserting_bibtex_references.org0000644000176200001440000004401713501141722021701 0ustar liggesusers#+PROPERTY: header-args:R :cache yes :session ravel01-r :results value :exports both #+OPTIONS: toc:nil #+LaTeX_CLASS: Rvignette #+LaTeX_CLASS_OPTIONS: [a4paper,twoside,11pt,nojss,article] #+TITLE: Inserting references in Rd and roxygen2 documentation #+AUTHOR: Georgi N. Boshnakov #+MACRO: keywords bibliographic references, Rd, bibtex, citations, R #+MACRO: Rpackage Rdpack #+KEYWORDS: bibliographic references, Rd, bibtex, citations, R #+LATEX_HEADER: % \usepackage{Sweave} #+LATEX_HEADER: \author{Georgi N. Boshnakov} #+LATEX_HEADER: \Plainauthor{Georgi N. Boshnakov} #+LATEX_HEADER: \Address{ #+LATEX_HEADER: Georgi N. Boshnakov\\ #+LATEX_HEADER: School of Mathematics\\ #+LATEX_HEADER: The University of Manchester\\ #+LATEX_HEADER: Oxford Road, Manchester M13 9PL, UK\\ #+LATEX_HEADER: URL: \url{http://www.maths.manchester.ac.uk/~gb/} #+LATEX_HEADER: } #+LATEX_HEADER: <>= #+LATEX_HEADER: library(Rdpack) #+LATEX_HEADER: pd <- packageDescription("Rdpack") #+LATEX_HEADER: @ #+LATEX_HEADER: \Abstract{ #+LATEX_HEADER: Package \pkg{Rdpack} provides a straightforward way to insert BibTeX references in the #+LATEX_HEADER: documentation of an R package, using the RdMacros feature introduced in R~3.2.0. It #+LATEX_HEADER: works for `roxygen2' documentation, as well. #+LATEX_HEADER: \par #+LATEX_HEADER: This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. #+LATEX_HEADER: } #+LATEX_HEADER: #+LATEX_HEADER: \Keywords{bibliographic references, Rd, bibtex, citations, \proglang{R}} #+LATEX_HEADER: \Plainkeywords{bibliographic references, Rd, bibtex, citations, R} @@latex:%@@\SweaveOpts{engine=R,eps=FALSE} @@latex:%@@\VignetteIndexEntry{{{{title}}}} @@latex:%@@\VignetteDepends{{{{Rpackage}}}} @@latex:%@@\VignetteKeywords{{{{keywords}}}} @@latex:%@@\VignettePackage{{{{Rpackage}}}} # DO NOT CHANGE Latex to LaTeX since Org-ravle changes this to \LaTeX{}, a command which # seems to cause problems with this LaTeX style. #+BEGIN_SRC R :results value silent :exports none library(Rdpack) pd <- packageDescription("Rdpack") #+END_SRC * Setup To prepare a package for importing BibTeX references it is necessary to tell the package management tools that package \pkg{Rdpack} and its Rd macros are needed. The references should be put in file =inst/REFERENCES.bib=. These steps are enumerated below in somewhat more detail for convenince: 1. Add the following lines to file `DESCRIPTION': #+BEGIN_EXAMPLE Imports: Rdpack RdMacros: Rdpack #+END_EXAMPLE Make sure the capitalisation of =RdMacros= is as shown. If the field 'RdMacros' is already present, add `Rdpack' to the list on that line. Similarly for field 'Imports'. 2. Add the following line to file `NAMESPACE'[fn:2]: #+BEGIN_EXAMPLE importFrom(Rdpack,reprompt) #+END_EXAMPLE The equivalent line for `roxygen2' is #+BEGIN_EXAMPLE #' @importFrom Rdpack reprompt #+END_EXAMPLE 3. Create file =REFERENCES.bib= in subdirectory =inst/= of your package and put the bibtex references in it. # [fn:1] Currently `R CMD check' doesn't complain if you don't import `Rdpack', # as long as `Rdpack' is installed on the system (yours, CRAN, win-builder, # etc.). However, services like `appveyor' or `travis-ci' do raise # errors. Thanks to Clemens Schmid and Tim Riffe for allerting me about this. [fn:2] Any function for package \pkg{Rdpack} will do. This is to avoid getting a warning from 'R CMD check'. * Inserting references in package documentation Once the steps outlined in the previous section are done, references can be inserted in the documentation as ~\insertRef{key}{package}~, where =key= is the bibtex key of the reference and =package= is your package. This works in Rd files and in roxygen documentation chunks. In fact, argument 'package' can be any installed R package[fn:3], not necessarily the current one. This means that you don't need to copy references from other packages to your ="REFERENCES.bib"= file. This works for packages that have ="REFERENCES.bib"= in their installation directory and for the default packages. See also the help pages ~?Rdpack::insertRef~ and ~?Rdpack::Rdpack-package~. For example, the help page ~?Rdpack::insertRef~ contains the following lines in section ``References'' of the Rd file: #+BEGIN_EXAMPLE \insertRef{Rpack:bibtex}{Rdpack} \insertRef{R}{bibtex} #+END_EXAMPLE The first line above inserts the reference labeled =Rpack:bibtex= in Rdpack's =REFERENCES.bib=. The second line inserts the reference labeled =R= in file =REFERENCES.bib= in package `bibtex'. A roxygen2 documentation chunk might look like this: #+BEGIN_EXAMPLE #' @references #' \insertRef{Rpack:bibtex}{Rdpack} #' #' \insertRef{R}{bibtex} #+END_EXAMPLE # %\paragraph*{Note:} # % 2017-08-04 commented out, # % The references are processed when the package is built. So, there is \emph{no need} to # % depend/import/suggest package ="Rdpack"=, it only needs to be installed on your machine. [fn:3] There is of course the risk that the referenced entry may be removed from the other package. So this is probably only useful for one's own packages. Also, the other package would better be one of the packages mentioned in DESCRIPTION.} * Inserting citations From version 0.7 of \pkg{Rdpack}, additional Rd macros are available for citations[fn:4]. They can be used in both Rd and roxygen2 documentation. If you are using these, it will be prudent to require at least this version of Rdpack in the ``Imports:'' directive in file DESCRIPTION: ~Rdpack (>= 0.7)~. [fn:4] They were introduced in the development version 0.6-1, but 0.7 is the first version with them released on CRAN. ** Macros for citations \label{sec:macros-citations} ~\insertCite{key}{package}~ cites the key and records it for use by ~\insertAllCited{}~, see below. The style of the citations is author-year. The ''et al'' convention is used when there are more than two authors[fn:etal]. [fn:etal] This feature was introduced in Rdpack 0.8-2. \code{key} can contain more keys separated by commas. Here are some examples (on the left is the code in the documentation chunk, on the right the rendered citation): # \begin{center} # \begin{tabular}{l|l} # Documentation source & rendered \\ \hline # =\insertCite{parseRd}{Rdpack}= & # \Sexpr{insert_citeOnly("parseRd", "Rdpack")} \\ # =\insertCite{Rpack:bibtex}{Rdpack}= & # \Sexpr{insert_citeOnly("Rpack:bibtex", "Rdpack")} \\ # =\insertCite{parseRd,Rpack:bibtex}{Rdpack}= & # \Sexpr{insert_citeOnly("parseRd,Rpack:bibtex", "Rdpack")} # \end{tabular} # \end{center} # # By default the citations are parenthesised =\insertCite{parseRd}{Rdpack}= produces # \Sexpr{insert_citeOnly("parseRd", "Rdpack")}, as in the examples above. To get textual # citations, like \Sexpr{insert_citeOnly("parseRd;textual", "Rdpack")} put the string # \code{;textual} at the end of the key. Here are the examples from the table above, rendered # as textual citations: # \begin{center} # \begin{tabular}{l|l} # Documentation source & rendered \\ \hline # =\insertCite{parseRd;textual}{Rdpack}= & # \Sexpr{insert_citeOnly("parseRd;textual", "Rdpack")} \\ # =\insertCite{Rpack:bibtex;textual}{Rdpack}= & # \Sexpr{insert_citeOnly("Rpack:bibtex;textual", "Rdpack")} \\ # =\insertCite{parseRd,Rpack:bibtex;textual}{Rdpack}= & # \Sexpr{insert_citeOnly("parseRd,Rpack:bibtex;textual", "Rdpack")} # \end{tabular} # \end{center} #+name: R-inscite #+BEGIN_SRC R :var x="", textual=0 :results value silent :exports none insert_citeOnly(if(textual == 0) x else paste0(x, ";textual"), "Rdpack") #+END_SRC | Documentation source | rendered | |---------------------------------------------+-------------------------------| | ~\insertCite{parseRd}{Rdpack}~ | (Murdoch 2010) | | ~\insertCite{Rpack:bibtex}{Rdpack}~ | (Francois 2014) | | ~\insertCite{parseRd,Rpack:bibtex}{Rdpack}~ | (Murdoch 2010; Francois 2014) | #+TBLFM: @2$2='(org-sbe "R-inscite" (x "\"parseRd\""))::@3$2='(org-sbe "R-inscite" (x "\"Rpack:bibtex\""))::@4$2='(org-sbe "R-inscite" (x "\"parseRd,Rpack:bibtex\"")) By default the citations are parenthesised =\insertCite{parseRd}{Rdpack}= produces src_R{insert_citeOnly("parseRd", "Rdpack")}, as in the examples above. To get textual citations, like src_R{insert_citeOnly("parseRd;textual", "Rdpack")}, put the string =;textual= at the end of the key. Here are the examples from the table above, rendered as textual citations: | Documentation source | | |-----------------------------------------------------+---------------------------------| | ~\insertCite{parseRd;textual}{Rdpack}~ | Murdoch (2010) | | ~\insertCite{Rpack:bibtex;textual}{Rdpack}~ | Francois (2014) | | ~\insertCite{parseRd,Rpack:bibtex;textual}{Rdpack}~ | Murdoch (2010); Francois (2014) | #+TBLFM: @2$2='(org-sbe "R-inscite" (x "\"parseRd\"") (textual 1))::@3$2='(org-sbe "R-inscite" (x "\"Rpack:bibtex\"") (textual 1))::@4$2='(org-sbe "R-inscite" (x "\"parseRd,Rpack:bibtex\"") (textual 1)) The last line in the table demonstrates that this also works with several citations. The macro ~\insertNoCite{key}{package}~ records one or more references for ~\insertAllCited~ but does not cite it. Setting =key= to =*= will record all references from the specified package. For example, ~\insertNoCite{R}{bibtex}~ records the reference whose key is =R=, while ~\insertNoCite{*}{utils}~ records all references from package ``utils'' for inclusion by ~\insertAllCited~. To mix the citations with other text, such as ``see also'' and ``chapter 3'', write the list of keys as a free text, starting it with the symbol =@= and prefixing each key with it. The =@= symbol will not appear in the output. For example, the following code: #+BEGIN_EXAMPLE \insertCite{@see also @parseRd and @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd; @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} #+END_EXAMPLE produces: \qquad #+ATTR_LATEX: :center nil | \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex", "Rdpack")} | | \Sexpr{insert_citeOnly("@see also @parseRd; @Rpack:bibtex", "Rdpack")} | | \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex;textual", "Rdpack")} | ~\insertCiteOnly{key}{package}~ is as ~\insertCite~ but does not record the key for the list of references assembled by ~\insertAllCited~. ** Automatically generating lists of references The macro ~\insertAllCited{}~ can be used to insert all references cited with ~\insertCite~ or ~\insertNoCite~. A natural place to put this macro is the references section. The Rd section may look something like: #+BEGIN_EXAMPLE \references{ \insertAllCited{} } #+END_EXAMPLE The analogous documentation chunk in roxygen2 might look like this: #+BEGIN_EXAMPLE #' @references #' \insertAllCited{} #+END_EXAMPLE ** Changing the style of references Package ~Rdpack~ supports bibliography styles for lists of references[fn:styles]. Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested. To cause all lists of references produced by ~\insertAllCited~ in a package to appear with full names, add ~.onLoad()~ function to your package. If you don't have ~.onLoad()~, just copy the following definition: #+BEGIN_SRC R .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } #+END_SRC If you already have ~.onLoad()~, add the line containing the ~Rdpack::Rdpack_bibstyles~ call to it. After installling/reloading your package the lists of references should appear with long author names. "Rdpack" itself now uses this style. [fn:styles] Support for styles is available since ~Rdpack (>= 0.8)~. * Possible issues ** Warning from 'R CMD build' If 'R CMD build' or =devtools::build()= gives a warning along the lines of: #+BEGIN_EXAMPLE Warning: C:/temp/RtmpqWQqji/.../XXX.Rd:52: unknown macro '\insertRef' #+END_EXAMPLE then check the syntax in file DESCRIPTION --- the most common cause of this is misspelling =RdMacros:=. Make sure in particular that `M' is uppercase. ** Development using `devtools' The described procedure works transparently in `roxygen2' chunks and with Hadley Wickham's `devtools'. Packages are built and installed properly with the `devtools' commands and the references are processed as expected. Currently (2017-08-04) if you run help commands ~?xxx~ for functions from the package you are working on and their help pages contain references, you may encounter some puzzling warning messages in `developer' mode, something like: #+BEGIN_EXAMPLE 1: In tools::parse_Rd(path) : ~/mypackage/man/abcde.Rd: 67: unknown macro '\insertRef' #+END_EXAMPLE These warnings are again about unknown macros but the reason is completely different: they pop up because ``devtools'' reroutes the help command to process the developer's Rd sources (rather than the documentation in the installed directory) but doesn't tell =parse_Rd= where to look for additional macros[fn:5]. These warnings are harmless - the help pages are built properly and no warnings appear outside ``developer'' mode, e.g. in a separate R~session. You may also consider using the function ~viewRd()~, discussed below, for viewing Rd files. [fn:5] The claims in this sentence can be deduced entirely from the informative message. Indeed, (1)~the error is in processing a source Rd file in the development directory of the package, and (2)~the call to =\parse_Rd= specifies only the file. ** Latex markup in BibTeX entries In principle, BibTeX entries may contain arbitrary Latex markup, while the Rd format supports only a subset. As a consequence, some BibTeX entries may need some editing when included in REFERENCES.bib[fn:6]. Only do this for entries that do not render properly or cause errors, since most of the time this should not be necessary. For encoding related issues of REFERENCES.bib see the dedicated subsection below. If mathematics doesn't render properly replace the Latex dollar syntax with Rd's ~\eqn~, e.g. ~$x^2$~ with ~\eqn{x^2}~. This should not be needed for versions of Rdpack 0.8-4 or later. Some Latex macros may have to be removed or replaced with suitable Rd markup. Again, do this only if they cause problems, since some are supported, e.g. ~\doi~. See also the overview help page, \code{help("Rdpack-package")}, of \pkg{Rdpack}. Among other things, it contains some dummy references which illustrate the above. [fn:6] Thanks to Michael Dewey for suggesting the discussion of this. ** Encoding of file REFERENCES.bib If a package has a declared encoding (in file =DESCRIPTION=), =REFERENCES.bib= is read-in with that encoding[fn:enc]. Otherwise, the encoding of =REFERENCES.bib= is assumed to be UTF-8 (which includes ASCII as a subset). Note that BibTeX entries downloaded from online databases and similar sources may contain unexpected characters in other encodings, e.g. 'latin1'. In such cases the check tools in R-devel (since about 2018-10-01) may give warnings like: #+BEGIN_EXAMPLE prepare_Rd: input string 1 is invalid in this locale #+END_EXAMPLE To resolve this, convert the file to the declared encoding or UTF-8. Alternatively, replace the offending symbols with their classic TeX/LaTeX equivalents (which are ASCII). Non-ASCII symbols in BibTeX entries obtained from online databases are often in fields like "Abstract", which are normally not included in lists of references and can be deleted from REFERENCES.bib. One way to check for non-ASCII symbols in a file is =tools::showNonASCIIfile()=. Internally, LaTeX sequences standing for accented Latin characters, such as =\'e= and =\"o=, are converted to UTF-8. So, even if the file REFERENCES.bib is pure ASCII, it may implicitly give raise to non-ASCII characters. This may cause R's checking tools to complain about non-ASCII characters even after it has been verified that there are none. If this happens, add the encoding declaration to file DESCRIPTION[fn:enc2]: #+BEGIN_EXAMPLE Encoding: UTF-8 #+END_EXAMPLE Needless to say, make sure that there are really no characters from encodings like 'latin1'. [fn:enc] From =Rdpack (>=0.9-1)= The issue of not handling the encoding was raised by Professor Brian Ripley. [fn:enc2] Admittedly, this is not ideal since the user should not need to care how things are processed internally but I haven't pinpointed the exact cause for this. * Viewing Rd files A function, \code{viewRd}, to view Rd files in the source directory of a package was introduced in version 0.4-23 of \pkg{Rdpack}. A typical user call would look something like: #+BEGIN_EXAMPLE Rdpack::viewRd("./man/filename.Rd") #+END_EXAMPLE By default the requested help page is shown in text format. To open the page in a browser, set argument \code{type} to \code{"html"}: #+BEGIN_EXAMPLE Rdpack::viewRd("./man/filename.Rd", type = "html") #+END_EXAMPLE Users of 'devtools' can use \code{viewRd()} in place of \code{help()} to view Rd sources[fn:6]. [fn:6] Yes, your real sources are the \texttt{*.R} files but \code{devtools::document()} transfers the roxygen2 documentation chunks to Rd files (and a few others), which are then rendered by \pkg{R} tools. # % * Inserting references interactively # % \label{sec:insert-refer-inter} # % # % It is possible to use the underlying R function to insert references interactively. # % For example, # % <<>>= # % library(Rdpack) # % cat(insert_ref("R", package = "bibtex"), sep ="\n") # % @ # % # % I would put the (commented out) command on top of the above reference as a reminder where it # % came from: # % #+BEGIN_EXAMPLE # % % insert_ref("R", package = "bibtex"), sep ="\n") # % #+END_EXAMPLE # % # % For a different approach, see the documentation of function ={Rdpack::rebib()}=. Rdpack/vignettes/Inserting_figures_and_evaluated_examples.Rnw0000644000176200001440000001654013501141722024420 0ustar liggesusers% Created 2019-04-14 Sun 17:28 % Intended LaTeX compiler: pdflatex \documentclass[a4paper,twoside,11pt,nojss,article]{jss} \usepackage[T1]{fontenc} \usepackage[left=2cm,right=2cm,bottom=15mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} % \usepackage{Sweave} \author{Georgi N. Boshnakov} \Plainauthor{Georgi N. Boshnakov} \Address{ Georgi N. Boshnakov\\ School of Mathematics\\ The University of Manchester\\ Oxford Road, Manchester M13 9PL, UK\\ URL: \url{http://www.maths.manchester.ac.uk/~gb/} } <>= library(Rdpack) pd <- packageDescription("Rdpack") @ \Abstract{ This vignette discusses Rd macros provided by package \pkg{Rdpack} for inserting evaluated examples and programmatically created figures. These macros are convenience wrappers around the native capabilities provided by the Rd parser. The macros work in Rd files and roxygen2 comments. \par This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. } \Keywords{examples, graphics, figures, Rd, R} \Plainkeywords{examples, graphics, figures, Rd, R} \author{Georgi N. Boshnakov} \date{\today} \title{Inserting figures and evaluated examples} \hypersetup{ pdfauthor={Georgi N. Boshnakov}, pdftitle={Inserting figures and evaluated examples}, pdfkeywords={examples, graphics, figures, Rd, R}, pdfsubject={}, pdfcreator={Emacs 25.3.1 (Org mode 9.1.6)}, pdflang={English}} \begin{document} \maketitle %\SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Inserting figures and evaluated examples} %\VignetteDepends{Rdpack} %\VignetteKeywords{examples, graphics, figures, Rd, R} %\VignettePackage{Rdpack} \section{Evaluated examples} \label{sec:orgf215fe2} Sometimes the documentation of an object becomes more clear if accompanied by snippets of R code and their results. The standard Rd macro \texttt{\textbackslash{}Sexpr} caters for a number of possibilities to evaluate R code and insert the results and the code in the documentation. The Rd macro \texttt{\textbackslash{}printExample} provided by package \texttt{"Rdpack"} builds on it to print a snippet of R code and the results of its evaluation. For example, \begin{verbatim} \printExample{2+2; a <- 2*3; a} \end{verbatim} gives \begin{verbatim} 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 \end{verbatim} Note that each command is printed on a separate line even though in this example the source code is on a single line, separated by semicolons\footnote{The argument of \texttt{\textbackslash{}printExample} needed to be on a single line with versions of R before \texttt{R-3.6.0}, since the lines after the first were silently ignored, with no errors and no warnings. This should not be a concern if your package requires \texttt{R >= 3.6.0} anyway or if you can live with somewhat inferior documentation in older versions or \texttt{R}.}. Similarly to \texttt{knitr}, the results are prefixed with comment symbols but the code is not prefixed with anything. The help page of \texttt{?Rdpack::promptUsage} contains a number of examples created with \texttt{\textbackslash{}printExample}. The corresponding Rd file can be obtained from the package tarball or from \url{https://github.com/GeoBosh/Rdpack/blob/master/man/promptUsage.Rd}. \section{Section examples with results} \label{sec:org80695a1} The macro \texttt{\textbackslash{}printExample} can be used as many times as needed and is typically placed in section \emph{Details} of an object's documentation. In contrast, the macro \texttt{\textbackslash{}runExamples} can be used as a replacement of the whole \texttt{\textbackslash{}examples} section in the Rd file. The code and its results are printed just as by \texttt{\textbackslash{}printExample}. For example, if the following code is put at the top level in an Rd file (i.e. not in a section): \begin{verbatim} \runExamples{2+2; a <- 2*3; a} \end{verbatim} then it will be evaluated and replaced by a normal section examples: \begin{verbatim} \examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 } \end{verbatim} This generated examples section is processed by the standard R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files\footnote{In versions of R before 3.6.0, \texttt{R CMD check} used to give warnings about unknown \texttt{\textbackslash{}Sexpr} section at top level. See also the note about multiline argument for \texttt{\textbackslash{}printExample}.}. A small example package using this feature is at \href{https://github.com/GeoBosh/reprexes/tree/master/runExamplesCheck}{runExamplesCheck}. \section{Creating and including graphs} \label{sec:orgb3e0ae9} Figures can be inserted with the help of the standard Rd markup command \texttt{\textbackslash{}figure}. The Rd macro \texttt{\textbackslash{}insertFig} provided by package \pkg{Rdpack} takes a snipped of R code, evaluates it and inserts the plot produced by it (using \texttt{\textbackslash{}figure}). \texttt{\textbackslash{}insertFig} takes three arguments: a filename, the package name and the code to evaluate to produce the figure. For example, \begin{verbatim} \insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)} \end{verbatim} will evaluate the code\footnote{See also the remark about using miltiline code in \texttt{\textbackslash{}printExample}. For figures this is not a problem at all even in older versions of R, since all preparatory code can be put in a separate \texttt{\textbackslash{}Sexpr}, and then \texttt{\textbackslash{}insertFig} can be given only the final command producing the graph.}, save the graph in file \texttt{"man/figures/cars.png"} subdirectory of package \texttt{"mypackage"}, and include the figure using \texttt{\textbackslash{}figure}. Subdirectory \texttt{"figures"} is created if it doesn't exist. Currently the graphs are saved in \texttt{"png"} format only. The sister macro \texttt{\textbackslash{}makeFig} creates the graph in exactly the same way as \texttt{\textbackslash{}insertFig} but does not insert it. This can be done with a separate \texttt{\textbackslash{}figure} command. This can be used if additional options are desired for different output formats, see the description of \texttt{\textbackslash{}figure} in "Writing R extensions". \subsection{A technical note} \label{sec:org00b2a6c} The above description should just work. This note is for users who wonder about technicalities. The R documentation can be built in many ways and as a result the directory \texttt{"man/figures/"} does not necessarily refer to the developers source package. Indeed, when a package is built, R works on a modified and cleaned-up temporary copy of the source directory, so the figures are created in that copy and then included in the package tarball. Similarly during the package check. On the other hand, \texttt{R CMD Rd2pdf} and some other tools and R functions work directly on the source tree of the package and they will create the figures there. The net effect is that a package tarball always contains freshly generated up-to-date graphs. Developers who never generate the documentation by other means may not even have the directory \texttt{man/figures} in the source tree of their package (but it will be present in the package tarball). \newpage \end{document} Rdpack/vignettes/Inserting_figures_and_evaluated_examples.org0000644000176200001440000001706613501141722024445 0ustar liggesusers#+PROPERTY: header-args:R :cache yes :session ravel01-r :results value :exports both #+OPTIONS: toc:nil #+LaTeX_CLASS: Rvignette #+LaTeX_CLASS_OPTIONS: [a4paper,twoside,11pt,nojss,article] #+TITLE: Inserting figures and evaluated examples #+AUTHOR: Georgi N. Boshnakov #+MACRO: keywords examples, graphics, figures, Rd, R #+MACRO: Rpackage Rdpack #+KEYWORDS: examples, graphics, figures, Rd, R #+LATEX_HEADER: % \usepackage{Sweave} #+LATEX_HEADER: \author{Georgi N. Boshnakov} #+LATEX_HEADER: \Plainauthor{Georgi N. Boshnakov} #+LATEX_HEADER: \Address{ #+LATEX_HEADER: Georgi N. Boshnakov\\ #+LATEX_HEADER: School of Mathematics\\ #+LATEX_HEADER: The University of Manchester\\ #+LATEX_HEADER: Oxford Road, Manchester M13 9PL, UK\\ #+LATEX_HEADER: URL: \url{http://www.maths.manchester.ac.uk/~gb/} #+LATEX_HEADER: } #+LATEX_HEADER: <>= #+LATEX_HEADER: library(Rdpack) #+LATEX_HEADER: pd <- packageDescription("Rdpack") #+LATEX_HEADER: @ #+LATEX_HEADER: \Abstract{ #+LATEX_HEADER: This vignette discusses Rd macros provided by package \pkg{Rdpack} for #+LATEX_HEADER: inserting evaluated examples and programmatically created figures. These #+LATEX_HEADER: macros are convenience wrappers around the native capabilities provided #+LATEX_HEADER: by the Rd parser. The macros work in Rd files and roxygen2 comments. #+LATEX_HEADER: \par #+LATEX_HEADER: This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. #+LATEX_HEADER: } #+LATEX_HEADER: #+LATEX_HEADER: \Keywords{examples, graphics, figures, Rd, R} #+LATEX_HEADER: \Plainkeywords{examples, graphics, figures, Rd, R} @@latex:%@@\SweaveOpts{engine=R,eps=FALSE} @@latex:%@@\VignetteIndexEntry{{{{title}}}} @@latex:%@@\VignetteDepends{{{{Rpackage}}}} @@latex:%@@\VignetteKeywords{{{{keywords}}}} @@latex:%@@\VignettePackage{{{{Rpackage}}}} #+BEGIN_SRC R :results value silent :exports none library(Rdpack) pd <- packageDescription("Rdpack") #+END_SRC * Evaluated examples Sometimes the documentation of an object becomes more clear if accompanied by snippets of R code and their results. The standard Rd macro ~\Sexpr~ caters for a number of possibilities to evaluate R code and insert the results and the code in the documentation. The Rd macro ~\printExample~ provided by package ="Rdpack"= builds on it to print a snippet of R code and the results of its evaluation. For example, #+BEGIN_EXAMPLE \printExample{2+2; a <- 2*3; a} #+END_EXAMPLE gives #+BEGIN_EXAMPLE 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 #+END_EXAMPLE Note that each command is printed on a separate line even though in this example the source code is on a single line, separated by semicolons[fn:1]. Similarly to =knitr=, the results are prefixed with comment symbols but the code is not prefixed with anything. The help page of ~?Rdpack::promptUsage~ contains a number of examples created with ~\printExample~. The corresponding Rd file can be obtained from the package tarball or from https://github.com/GeoBosh/Rdpack/blob/master/man/promptUsage.Rd. [fn:1] The argument of ~\printExample~ needed to be on a single line with versions of R before =R-3.6.0=, since the lines after the first were silently ignored, with no errors and no warnings. This should not be a concern if your package requires ~R >= 3.6.0~ anyway or if you can live with somewhat inferior documentation in older versions or =R=. # The argument of ~\printExample~ must be on a single line with released versions of R. # This limitation has been lifted in =R-devel= starting from June 2018 and in =R-3.6.0=. # # From NEWS in R 3.6.0: User macros in Rd files now accept empty and multi-line arguments * Section examples with results The macro ~\printExample~ can be used as many times as needed and is typically placed in section /Details/ of an object's documentation. In contrast, the macro ~\runExamples~ can be used as a replacement of the whole ~\examples~ section in the Rd file. The code and its results are printed just as by ~\printExample~. For example, if the following code is put at the top level in an Rd file (i.e. not in a section): #+BEGIN_EXAMPLE \runExamples{2+2; a <- 2*3; a} #+END_EXAMPLE then it will be evaluated and replaced by a normal section examples: #+BEGIN_EXAMPLE \examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 } #+END_EXAMPLE This generated examples section is processed by the standard R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files[fn:2]. A small example package using this feature is at [[https://github.com/GeoBosh/reprexes/tree/master/runExamplesCheck][runExamplesCheck]]. [fn:2] In versions of R before 3.6.0, ~R CMD check~ used to give warnings about unknown ~\Sexpr~ section at top level. See also the note about multiline argument for ~\printExample~. # (Amendment on 2018-10-11: R-devel does no longer give the warning at least since 2018-10-02 # r75388.) # # According to the specification of the Rd format (see [[https://developer.r-project.org/parseRd.pdf][Murdoch (2010), p. 4]] ~\Sexpr~'s at top # level are legal. I need to check with the CRAN team or R devel if such expressions # produced by user macros are excluded on purpose. * Creating and including graphs Figures can be inserted with the help of the standard Rd markup command ~\figure~. The Rd macro ~\insertFig~ provided by package \pkg{Rdpack} takes a snipped of R code, evaluates it and inserts the plot produced by it (using ~\figure~). ~\insertFig~ takes three arguments: a filename, the package name and the code to evaluate to produce the figure. For example, #+BEGIN_EXAMPLE \insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)} #+END_EXAMPLE will evaluate the code[fn:3], save the graph in file ~"man/figures/cars.png"~ subdirectory of package ~"mypackage"~, and include the figure using ~\figure~. Subdirectory ~"figures"~ is created if it doesn't exist. Currently the graphs are saved in ~"png"~ format only. The sister macro ~\makeFig~ creates the graph in exactly the same way as ~\insertFig~ but does not insert it. This can be done with a separate ~\figure~ command. This can be used if additional options are desired for different output formats, see the description of ~\figure~ in "Writing R extensions". [fn:3] See also the remark about using miltiline code in =\printExample=. For figures this is not a problem at all even in older versions of R, since all preparatory code can be put in a separate =\Sexpr=, and then =\insertFig= can be given only the final command producing the graph. ** A technical note The above description should just work. This note is for users who wonder about technicalities. The R documentation can be built in many ways and as a result the directory ~"man/figures/"~ does not necessarily refer to the developers source package. Indeed, when a package is built, R works on a modified and cleaned-up temporary copy of the source directory, so the figures are created in that copy and then included in the package tarball. Similarly during the package check. On the other hand, ~R CMD Rd2pdf~ and some other tools and R functions work directly on the source tree of the package and they will create the figures there. The net effect is that a package tarball always contains freshly generated up-to-date graphs. Developers who never generate the documentation by other means may not even have the directory ~man/figures~ in the source tree of their package (but it will be present in the package tarball). # To avoid splitting 'Affiliation' on two pages #+BEGIN_EXPORT latex \newpage #+END_EXPORT Rdpack/R/0000755000176200001440000000000013501141722011653 5ustar liggesusersRdpack/R/bib.R0000644000176200001440000012144413501141722012540 0ustar liggesusers## Do not edit this file manually. ## It has been automatically generated from *.org sources. # TODO: krapka! .patch_latex <- function(txt){ # print(bibentry,"latex") inserts \bsl macros. gsub("\\bsl{}", "", txt, fixed=TRUE) } ## extract `key' from a bibentry object. I used this to set the 'names' attribute of objects ## produced by bibtex (< 0.4.0). Don't remember why I didn't use unlist(x$key). ## ## not used anymore bibentry_key <- function(x){ # 2013-03-29 .Deprecated("x[[1]]$key or unlist(x$key)") attr(unclass(x[[1]][[1]])[[1]], "key") } ## maybe add to package `gbutils'? ## ## if `wd' is a subdirectory of `string' return the path upto and including `string', ## otherwise return NULL. ## If not NULL, it is guaranteed that basename(wd) == string ## NOTE: currently doesn't expand `./', etc.. in_subdirectory <- function(string, wd = getwd()){ if(grepl(string, wd)){ packpat <- paste0(string, "$") while(!grepl(packpat, wd)){ wd <- dirname(wd) if(!grepl(string, wd)) return(NULL) } if(basename(wd) == string) wd else ## the found directory has `string' as a suffix, eg. xxxRdpack, not Rdpack NULL }else NULL } get_bibentries <- function(..., package = NULL, bibfile = "REFERENCES.bib", url_only = FALSE, stop_on_error = TRUE){ if(is.null(package)){ fn <- file.path(..., bibfile) ## check for existence of fn (and length(fn) == 1)? (but see below) }else{ ## first check for development mode in "devtools" ## if the current directory is under `package', first look for the file there devdir <- in_subdirectory(package) if(is.null(devdir)) fn <- "" else{ ## if in development dir of `package', get it from there fn <- file.path(devdir, "inst", ..., bibfile) if(length(fn) > 1){ warning("More than one file found, using the first one only.") fn <- fn[1] } if(!file.exists(fn)) fn <- "" } if(fn == "") ## if the above didn't succeed, try system.file(). In principle, this should work ## also in development mode under devtools, at least for REFERENCES.bib, ## but currently devtools' system.file() doesn't handle it. fn <- system.file(..., bibfile, package = package) if(fn == "") ## if the above didn't succeed try system.file() with subdir "inst". ## This is really for the case when system.file() is the one from devtools, ## see the note above. TODO: check if this is the case? fn <- system.file("inst", ..., bibfile, package = package) if(length(fn) == 1 && fn == "") ## if system.file() didn't find the bib file, check if file package.bib is ## provided by package "bibtex" (it is for core R packages, such as "base") fn <- system.file("bib", sprintf("%s.bib", package), package = "bibtex") } if(length(fn) > 1){ warning("More than one file found, using the first one only.") fn <- fn[1] }else if(length(fn) == 1 && fn == ""){ msg <- paste0("Couldn't find file ", file.path(..., bibfile), if(!is.null(package)) paste0(" in package `", package, "'")) if(stop_on_error) stop(msg) else{ warning(msg) ## return an empty bibentryRd object res <- bibentry() class(res) <- c("bibentryRd", class(res)) return(res) } } ## 2018-10-03 ## use package encoding if specified. ## TODO: maybe this function should have argument 'encoding' ## TODO: in principle the Rd file may have its own encoding, ## but my current understanding is that parse_Rd() first converts it to UTF-8. ## BUT what is the encoding of the strings in the object returned by read.bib? encoding <- if(!is.null(package) && !is.null(utils::packageDescription(package)$Encoding)) utils::packageDescription(package)$Encoding else "UTF-8" res <- read.bib(file = fn, encoding = encoding) # 2018-03-10 commenting out # since bibtex v. >= 0.4.0 has been required for a long time in DESCRIPTION # # ## 2016-07-26 Now do this only for versions of bibtex < '0.4.0'. # ## From bibtex '0.4.0' read.bib() sets the names. # if(packageVersion("bibtex") < '0.4.0'){ # names(res) <- sapply(1:length(res), function(x) bibentry_key(res[[x]][[1]])) # } for(nam in names(res)){ ## unconditionaly recode %'s in filed URL if(!is.null(res[nam]$url)) res[nam]$url <- gsub("([^\\])%", "\\1\\\\%", res[nam]$url) if(url_only){ # process also other fields ## TODO: currently all unescaped $'s in all fields are recoded; ## Maybe do it more selectively, e.g. only for %'s inside \url{}, ## or matching something like http(s):// fields <- names(unclass(res[nam])[[1]]) unclassed <- unclass(res[nam]) flag <- FALSE for(field in fields){ wrk <- unclass(res[nam])[[1]][[field]] if(is.character(wrk) && any(grepl("([^\\])%", wrk))){ flag <- TRUE unclassed[[1]][[field]] <- gsub("([^\\])%", "\\1\\\\%", wrk) } } if(flag){ class(unclassed) <- class(res[nam]) res[nam] <- unclassed } } } ## 2018-03-03 new: class(res) <- c("bibentryRd", class(res)) res } print.bibentryRd <- function (x, style = "text", ...){ class(x) <- class(x)[-1] ## TODO: It would be better to modify the entries and then call ## print(), rather than vice versa as now. res <- capture.output(print(x, style = style, ...)) res <- switch(tolower(style), r = gsub("\\\\\\\\%", "%", res), citation = , bibtex = gsub("\\\\%", "%", res), res ) cat(res, sep = "\n") } rebib <- function(infile, outfile, ...){ # 2013-03-29 rdo <- permissive_parse_Rd(infile) ## 2017-11-25 TODO: argument for RdMacros! if(missing(outfile)) outfile <- basename(infile) else if(identical(outfile, "")) # 2013-10-23 else clause is new outfile <- infile rdo <- inspect_Rdbib(rdo, ...) Rdo2Rdf(rdo, file=outfile, srcfile=infile) rdo } inspect_Rdbib <- function(rdo, force = FALSE, ...){ # 2013-03-29 # 2013-12-08 was: pos <- Rdo_locate_predefined_section(rdo, "\\references") pos <- Rdo_which_tag_eq(rdo, "\\references") if(length(pos) > 1) stop(paste("Found", length(pos), "sections `references'.\n", "There should be only one." )) else if(length(pos) == 0) # no section "references". return(rdo) bibs <- get_bibentries(...) fkey <- function(x){ m <- gregexpr("[ ]+", x) rm <- regmatches(x, m, invert = TRUE)[[1]] if(length(rm) >= 2 && rm[2] != "bibentry:") rm[2] # e.g. bibentry:all else if(length(rm) < 3) # % bibentry: xxx_key_xxx "" # NA_character_ else rm[3] } fbib <- function(x) grepl("[ ]+bibentry:", x) posbibs <- Rdo_locate(rdo[[pos]], f = fbib, pos_only = fkey) poskeys <- sapply(posbibs, function(x) x$value) print(posbibs) fendkey <- function(x){ m <- gregexpr("[ ]+", x) rm <- regmatches(x, m, invert = TRUE)[[1]] if(length(rm) >= 2 && rm[2] != "end:bibentry:") rm[2] # e.g. end:bibentry:all else if(length(rm) < 3) # % end:bibentry: xxx_key_xxx "" # NA_character_ else rm[3] } fendbib <- function(x) grepl("end:bibentry:", x) posendbibs <- Rdo_locate(rdo[[pos]], f = fendbib, pos_only = fendkey) posendkeys <- sapply(posendbibs, function(x) x$value) toomit <- which(poskeys %in% posendkeys) # note: en@bibkeys:all is different! todo: if(length(toomit) > 0 && !force){ poskeys <- poskeys[-toomit] posbibs <- posbibs[-toomit] } if(length(poskeys)==0) "nothing to do." else if(any(poskeys == "bibentry:all")){ poskey <- posbibs[[ which(poskeys == "bibentry:all") ]]$pos bibstxt <- capture.output(print(bibs, "latex")) bibstxt <- .patch_latex(bibstxt) # TODO: krapka! bibstxt <- paste(c("", bibstxt), "\n", sep="") endbibline <- Rdo_comment("% end:bibentry:all") keyflag <- "end:bibentry:all" %in% posendkeys if(keyflag && force){ #todo: more careful! endposkey <- posendbibs[[ which(posendkeys == "end:bibentry:all") ]]$pos rdo[[pos]] <- Rdo_flatremove(rdo[[pos]], poskey+1, endposkey) } if(!keyflag || force){ rdo[[pos]] <- Rdo_flatinsert(rdo[[pos]], list(endbibline), poskey, before = FALSE) rdo[[pos]] <- Rdo_flatinsert(rdo[[pos]], bibstxt, poskey, before = FALSE) } }else{ for(i in length(poskeys):1){ bibkey <- posbibs[[i]]$value poskey <- posbibs[[i]]$pos bibstxt <- capture.output(print(bibs[poskeys[i]],"latex")) bibstxt <- .patch_latex(bibstxt) # TODO: krapka! bibstxt <- list( paste( c("", bibstxt), "\n", sep="") ) endbibline <- Rdo_comment(paste("% end:bibentry: ", bibkey)) keyflag <- bibkey %in% posendkeys if(keyflag && force){ #todo: more careful! endposkey <- posendbibs[[ which(posendkeys == bibkey) ]]$pos rdo[[pos]] <- Rdo_flatremove(rdo[[pos]], poskey+1, endposkey) } if(!keyflag || force){ # this is always TRUE here but is left for common look # with "all". todo: needs consolidation rdo[[pos]] <- Rdo_flatinsert(rdo[[pos]], list(endbibline), poskey, before = FALSE) rdo[[pos]] <- Rdo_flatinsert(rdo[[pos]], bibstxt, poskey, before = FALSE) } } } rdo } Rdo_flatremove <- function(rdo, from, to){ # 2013-03-30 todo: more careful! res <- rdo[-(from:to)] attributes(res) <- attributes(rdo) # todo: more guarded copying of attributes? res } # todo: move to another file later Rdo_flatinsert <- function(rdo, val, pos, before = TRUE){ # 2013-03-29 depth <- length(pos) if(depth > 1){ rdo[[pos]] <- Recall(rdo[[ pos[-depth] ]], val, pos[-depth]) # todo: dali zapazva attributite na rdo? return(rdo) } n <- length(rdo) if(!before) pos <- pos + 1 res <- if(pos==1) c(val, rdo) else if(pos==n+1) c(rdo, val) else c( rdo[1:(pos-1)], val, rdo[pos:n]) attributes(res) <- attributes(rdo) # todo: more guarded copying of attributes? res } ## TODO: auto-deduce 'package'? insert_ref <- function(key, package = NULL, ...) { # bibfile = "REFERENCES.bib" if(is.null(package)) stop("argument 'package' must be provided") bibs <- get_bibentries(package = package, ..., stop_on_error = FALSE) if(length(bibs) == 0){ note <- paste0("\"Failed to insert reference with key = ", key, " from package = '", package, "'.", " Possible cause --- missing REFERENCES.bib in package '", package, "' or '", package, "' not installed.\"" ) note <- paste0("\\Sexpr[results=rd,stage=install]{{warning(", note, ");", note, "}} ") item <- bibentry( bibtype = "Misc", title = "Not avalable", author = person("A", "Adummy"), year = format(Sys.time(), "%Y"), note = note, key = key ) .toRd_styled(item, package) }else if(length(key) == 1){ item <- tryCatch(bibs[[key]], warning = function(c) { if(grepl("subscript out of bounds", c$message)){ ## tell the user the offending key. s <- paste0("possibly non-existing key '", key, "'") c$message <- paste0(c$message, " (", s, ")") } warning(c) # res <- paste0("\nWARNING: failed to insert reference '", key, # "' from package '", package, "' - ", # s, ".\n") # return(res) ## setup a dummy entry bibentry( bibtype = "Misc", title = "Not avalable", author = person("A", "Adummy"), year = format(Sys.time(), "%Y"), note = paste0("Failed to insert reference with key = ", key, " from package = '", package, "'.", " Possible cause --- missing or misspelled key." ), key = key ) }) # # 2018-03-01 Bug: Unexpected END_OF_INPUT error (URL parsing?) #3 # # I don't know why toRd() doesn't do this... # # # # escape percents that are not preceded by backslash # # (the `if' is because in case of error above, item will be simply a string) # # Commenting out since get_bibentries() does it. # if(inherits(item, "bibentry") && !is.null(item$url)) # item$url <- gsub("([^\\])%", "\\1\\\\%", item$url) # if(interactive()) browser() # wrk <- .toRd_styled(item, package) # TODO: add styles? (doesn't seem feasible here) # fn <- tempfile() # cat(wrk, file = fn) # res <- permissive_parse_Rd(fn) ## tools::parse_Rd(fn) # tools::toRd(res) # # wrk <- .toRd_styled(item, package) # Encoding(wrk) <- "bytes" # wrk # .toRd_styled(item, package) }else{ ## key is documented to be of length one, nevertheless handle it too kiki <- FALSE items <- withCallingHandlers(bibs[[key]], warning = function(w) {kiki <<- TRUE}) ## TODO: deal with URL's as above txt <- .toRd_styled(items, package) if(kiki){ # warning(s) in bibs[[key]] s <- paste0("WARNING: failed to insert ", "one or more of the following keys in REFERENCES.bib:\n", paste(key, collapse = ", \n"), ".") warning(s) txt <- c(txt, s) } paste0(paste(txt, collapse = "\n\n"), "\n") } } ## 2017-11-25 new ## see utils:::print.help_files_with_topic() viewRd <- function(infile, type = "text", stages = NULL){ infile <- normalizePath(infile) if(is.null(stages)) # stages <- c("install", "render") stages <- c("build", "install", "render") # stages <- c("build", "render") else if(!is.character(stages) || !all(stages %in% c("build", "install", "render"))) stop('stages must be a character vector containing one or more of the strings "build", "install", and "render"') ## here we need to expand the Rd macros, so don't use permissive_parse_Rd() ## TODO: (BUG) e is NULL under RStudio e <- tools::loadPkgRdMacros(system.file(package = "Rdpack")) ## Rdo <- parse_Rd(infile, macros = e) pkgname <- basename(dirname(dirname(infile))) outfile <- tempfile(fileext = paste0(".", type)) ## can't do this, the file may be deleted before the browser opens it: ## on.exit(unlink(outfile)) switch(type, text = { temp <- tools::Rd2txt(infile, # was: Rdo, out = outfile, package = pkgname, stages = stages , macros = e) file.show(temp, delete.file = TRUE) # text file is deleted }, html = { temp <- tools::Rd2HTML(infile, # was: Rdo, out = outfile, package = pkgname, stages = stages , macros = e) browseURL(temp) ## html file is not deleted #browser() }, stop("'type' should be one of 'text' or 'html'") ) } ## temporary; not exported vigbib <- function(package, verbose = TRUE, ..., vig = NULL){ if(!is.null(vig)) return(makeVignetteReference(package, vig, ...)) vigs <- vignette(package = package) if(nrow(vigs$results) == 0){ if(verbose) cat("No vignettes found in package ", package, "\n") return(bibentry()) } wrk <- lapply(seq_len(nrow(vigs$results)), function(x) makeVignetteReference(package = package, vig = x, verbose = FALSE, ...) ) res <- do.call("c", wrk) if(verbose) print(res, style = "Bibtex") invisible(res) } makeVignetteReference <- function(package, vig = 1, verbose = TRUE, title, author, type = "pdf", bibtype = "Article", key = NULL ){ publisher <- NULL # todo: turn this into an argument some day ... if(missing(package)) stop("argument 'package' is missing with no default") cranname <- "CRAN" cran <- "https://CRAN.R-Project.org" cranpack <- paste0(cran, "/package=", package) ## todo: for now only cran if(is.null(publisher)){ publisher <- cran publishername <- cranname publisherpack <- cranpack } desc <- packageDescription(package) vigs <- vignette(package = package) if(is.character(vig)){ vig <- pmatch(vig, vigs$results[ , "Item"]) if(length(vig) == 1 && !is.na(vig)){ wrk <- vigs$results[vig, "Title"] }else stop(paste0("'vig' must (partially) match one of:\n", paste0("\t", 1:nrow(vigs$results), " ", vigs$results[ , "Item"], "\n", collapse = "\n"), "Alternatively, 'vig' can be the index printed in front of the name above.")) }else if(1 <= vig && vig <= nrow(vigs$results)){ wrk <- vigs$results[vig, "Title"] }else{ stop("not ready yet, should return all vigs in the package.") } if(missing(author)) author <- desc$Author title <- gsub(" \\([^)]*\\)$", "", wrk) # drop ' (source, pdf)' item <- vigs$results[vig, "Item"] vigfile <- paste0(item, ".", type) journal <- paste0("URL ", publisherpack, ".", " Vignette included in R package ", package, ", version ", desc$Version ) if(is.null(desc$Date)){ # built-in packages do not have field "year" if(grepl("^Part of R", desc$License[1])){ ## title <- paste0(title, "(", desc$License, ")") publisherpack <- cran ## do not add package=... to https in this case journal <- paste0("URL ", publisherpack, ".", " Vignette included in R package ", package, " (", desc$License, ")" ) } year <- R.version$year }else year <- substring(desc$Date, 1, 4) # stop(paste0("argument 'vig' must be a charater string or an integer\n", # "between 1 and the number of vignettes in the package")) if(is.null(key)) key <- paste0("vig", package, ":", vigs$results[vig, "Item"]) res <- bibentry( key = key, bibtype = bibtype, title = title, author = author, journal = journal, year = year, ## note = "R package version 1.3-4", publisher = publishername, url = publisherpack ) if(verbose){ print(res, style = "Bibtex") cat("\n") } res } ## 2018-03-13 new insert_citeOnly <- function(keys, package = NULL, before = NULL, after = NULL, bibpunct = NULL, ..., cached_env = NULL, cite_only = FALSE, dont_cite = FALSE) { # bibfile = "REFERENCES.bib" if(!is.null(cached_env)){ if(is.null(cached_env$refsmat)) cached_env$refsmat <- matrix(character(0), nrow = 0, ncol = 2) if(is.null(cached_env$allbibs)) cached_env$allbibs <- list() } if(is.null(package)) stop("argument 'package' must be provided") if(length(keys) > 1) stop("`keys' must be a character string") if(!cite_only) cached_env$refsmat <- rbind(cached_env$refsmat, c(keys, package)) if(dont_cite) return(character(0)) textual <- grepl(";textual$", keys) if(textual) keys <- gsub(";textual$", "", keys) if(grepl("[^a-zA-Z.0-9]", package)){ delims <- gsub("[a-zA-Z.0-9]", "", package) ch <- substr(delims, 1, 1) wrk <- strsplit(package, ch, fixed = TRUE)[[1]] # note: [[1]] package <- wrk[1] if(length(wrk) > 1){ if(nchar(wrk[2]) > 1 || nchar(wrk[2]) == 1 && wrk[2] != " ") before <- wrk[2] if(length(wrk) > 2 && (nchar(wrk[3]) > 1 || nchar(wrk[3]) == 1 && wrk[3] != " ")) after <- wrk[3] } } if(is.null(cached_env)){ bibs <- get_bibentries(package = package, ..., stop_on_error = FALSE) }else{ bibs <- cached_env$allbibs[[package]] if(is.null(bibs)){ bibs <- get_bibentries(package = package, ..., stop_on_error = FALSE) cached_env$allbibs[[package]] <- bibs } } ## This wouldn't work since roxygen2 will change it to citation ## TODO: check ## if(substr(keys, 1, 1) == "["){ # rmarkdown syntax (actually roxygen2?) ## keys <- substr(keys, 2, nchar(keys) - 1) # drop "[" and the closing "]" ## splitkeys <- strsplit(keys, ";", fixed = TRUE)[[1]] # note: [[1]] ## ## ## ## } refch <- "@" refchpat <- paste0("^[", refch, "]") if(grepl(refchpat, keys)){ ch <- substr(keys, 1, 1) # 'ch' is not used currently keys <- substr(keys, 2, nchar(keys)) # drop refch ## TODO: check if there are still @'s at this point refpat <- paste0("(", refch, "[^;,()[:space:]]+)") # "(@[^;,[:space:]]+)" if(textual){ wrkkeys <- strsplit(keys, "@")[[1]] # note [[1]] !!! ## the last key is special, since there is none after it nk <- length(wrkkeys) wrkkeys[nk] <- if(grepl("[;,]$", wrkkeys[nk])) sub("([;,])$", ")\\1", wrkkeys[nk]) else paste0(wrkkeys[nk], ")") ## the 2nd element contains the first key even if the string starts with '@' ## (if that is the case the first string is "") if(nk > 2){ for(i in 2:(nk - 1)){ wrkkeys[i] <- if(grepl("([;,][^;,]*)$", wrkkeys[i])) sub("([;,][^;,]*)$", ")\\1" , wrkkeys[i]) else sub("^([^;,()[:space:]]+)", "\\1)" , wrkkeys[i]) } } keys <- paste0(wrkkeys, collapse = refch) } m <- gregexpr(refpat, keys) allkeys <- regmatches(keys, m)[[1]] # note: [[1]] allkeys <- gsub(refch, "", allkeys) if(textual){ bibpunct0 = c("(", ")", ";", "a", "", ",") if(!is.null(bibpunct)){ if(length(bibpunct) < length(bibpunct0)) bibpunct <- c(bibpunct, bibpunct0[-seq_len(length(bibpunct))]) ind <- which(is.na(bibpunct)) if(length(ind) > 0) bibpunct[ind] <- bibpunct0[ind] }else bibpunct <- bibpunct0 }else{ ## for now ignore bibpunct in this case bibpunct <- c("", "", ";", "a", "", ",") } refs <- sapply(allkeys, function(key) safe_cite(key, bibs, textual = textual, bibpunct = bibpunct, from.package = package) ) if(textual){ ## drop ")" - strong assumption that that is the last char refs <- sapply(refs, function(s) substr(s, 1, nchar(s) - 1)) } ## replace keys with citations text <- keys regmatches(text, m) <- list(refs) if(!textual) # 2018-03-28 don't put patentheses in textual mode text <- paste0("(", text, ")") }else{ if(is.null(bibpunct)) text <- safe_cite(keys, bibs, textual = textual, before = before, after = after , from.package = package) else{ bibpunct0 = c("(", ")", ";", "a", "", ",") if(length(bibpunct) < length(bibpunct0)) bibpunct <- c(bibpunct, bibpunct0[-seq_len(length(bibpunct))]) ind <- which(is.na(bibpunct)) if(length(ind) > 0) bibpunct[ind] <- bibpunct0[ind] text <- safe_cite(keys, bibs, textual = textual, before = before, after = after, bibpunct = bibpunct, from.package = package) } } toRd(text) } safe_cite <- function(keys, bib, ..., from.package = NULL){ wrk.keys <- unlist(strsplit(keys, ",")) if(!all(wrk.keys %in% names(bib))){ ok <- wrk.keys %in% names(bib) miss.keys <- wrk.keys[!ok] warning("possibly non-existing key(s)", if(!is.null(from.package)) paste0(" in bib file from package '", from.package, "'"), ":\n ", paste(miss.keys, sep = ", "), "\n") keys <- wrk.keys[ok] } # 2018-06-02 was: cite(keys = keys, bib = bib, ...) cite(keys = keys, bib = bib, longnamesfirst = FALSE, ...) } insert_all_ref <- function(refs, style = ""){ if(is.environment(refs)){ refsmat <- refs$refsmat allbibs <- refs$allbibs if(is.null(allbibs)) allbibs <- list() }else{ refsmat <- refs allbibs <- list() } if(is.null(refs) || is.null(refsmat) || nrow(refsmat) == 0) ## Returning the empty string is probably preferable but 'R CMD check' does not see ## that the references are empty in this case (although the help system see this and ## drops the section "references". To avoid confusing the user, print some ## informative text. return("There are no references for Rd macro \\verb{\\insertAllCites} on this help page.") all.keys <- list() for(i in 1:nrow(refsmat)){ keys <- refsmat[i, 1] textual <- grepl(";textual$", keys) if(any(textual)) keys <- gsub(";textual", "", keys) refch <- "@" refchpat <- paste0("^[", refch, "]") if(grepl(refchpat, keys)){ ch <- substr(keys, 1, 1) keys <- substr(keys, 2, nchar(keys)) # drop refch refpat <- paste0("(", refch, "[^;,[:space:]]+)") # "(@[^;,[:space:]]+)" m <- gregexpr(refpat, keys) keys <- regmatches(keys, m)[[1]] # note: [[1]] keys <- gsub("@", "", keys) }else{ keys <- unlist(strsplit(keys, ",")) } package <- refsmat[i, 2] if(is.null(all.keys[[package]])) all.keys[[package]] <- keys else all.keys[[package]] <- c(all.keys[[package]], keys) } bibs <- NULL for(package in names(all.keys)){ cur <- unique(all.keys[[package]]) be <- allbibs[[package]] if(is.null(be)) be <- get_bibentries(package = package, stop_on_error = FALSE) if(length(be) == 0){ be <- bibentry( bibtype = "Misc", title = "Not avalable", author = person("A", "Adummy"), year = format(Sys.time(), "%Y"), note = paste0("Failed to insert reference with keys = \n ", paste0(cur, collapse = " "), "\n", "from package = '", package, "'.", " Possible cause --- missing REFERENCES.bib in package '", package, "' or '", package, "' not installed." ), key = paste0(cur, collapse = ":") ) }else if(all(cur != "*")){ be <- tryCatch(be[cur], warning = function(c) { if(grepl("subscript out of bounds", c$message)){ ## tell the user the offending keys. c$message <- paste0(c$message, " (", paste(cur, collapse = " "), "' from package '", package, "'", ")" ) } warning(c) ## setup a dummy entry dummy <- bibentry( bibtype = "Misc", title = paste0("Some keys from package ", package, " are not avalable"), author = person("A", "Adummy"), year = format(Sys.time(), "%Y"), note = paste0("Failed to insert reference with keys:\n ", paste0(cur, collapse = ", "), "\n", "from package = '", package, "'.", " Possible cause --- missing REFERENCES.bib in package '", package, "' or '", package, "' not installed." ), key = paste0(cur, collapse = ":") ) c(be[cur], dummy) }) } if(is.null(bibs)) bibs <- be else bibs <- c(bibs, be) # TODO: duplicate keys in different packages? } bibs <- sort(bibs) pkgs <- names(all.keys) # \Sexpr[stage=build,results=hide]{requireNamespace("cvar")} ## 2016-06-02 was: ## if(length(pkgs) > 0){ ## pkg <- pkgs[1] ## TODO: for now should do ## if(!isNamespaceLoaded(pkg) && !requireNamespace(pkg) ) ## sty <- NULL ## else{ ## sty <- Rdpack_bibstyles(pkg) ## } ## }else ## sty <- NULL ## ## if(!is.null(sty)) ## res <- sapply(bibs, function(x) tools::toRd(x, style = "JSSLongNames")) ## else { ## if(style == "") ## res <- sapply(bibs, function(x) tools::toRd(x)) ## else{ ## res <- sapply(bibs, function(x) tools::toRd(x, style = "JSSLongNames")) ## } ## } pkg <- if(length(pkgs) > 0) ## TODO: for now should do pkgs[1] else character(0) res <- .toRd_styled(bibs, pkg) # 2018-10-01 use \par since pkgdown ignores the empty lines # TODO: needs further thought # was: # (for now restoring the old one, to check if pkgdown would consider this as a bug) #browser() # paste0(res, collapse = "\n\n") paste0(res, collapse = "\\cr\\cr ") } # Clean up LaTeX accents and braces # this is a copy of unexported tools:::cleanupLatex by Duncan Murdoch. cleanupLatex <- function(x) { if (!length(x)) return(x) latex <- tryCatch(parseLatex(x), error = function(e)e) if (inherits(latex, "error")) { x } else { deparseLatex(latexToUtf8(latex), dropBraces=TRUE) } } #+BEGIN_SRC R deparseLatexToRd = function(x, dropBraces = FALSE) { result <- character() lastTag <- "TEXT" for (i in seq_along(x)) { a <- x[[i]] tag <- attr(a, "latex_tag") if (is.null(tag)) tag <- "NULL" switch(tag, VERB = , TEXT = , MACRO = , COMMENT = result <- c(result, a), BLOCK = result <- c(result, if (dropBraces && lastTag == "TEXT") Recall(a) else c("{", Recall(a), "}")), ENVIRONMENT = result <- c(result, "\\begin{", a[[1L]], "}", Recall(a[[2L]]), "\\end{", a[[1L]], "}"), ## MATH = result <- c(result, "$", Recall(a), "$"), MATH = result <- c(result, "\\eqn{", Recall(a), "}"), NULL = stop("Internal error, no tag", domain = NA) ) lastTag <- tag } paste(result, collapse="") } Rdpack_bibstyles <- local({ styles <- list() function(package, authors){ if((n <- nargs()) > 1){ styles[[package]] <<- authors }else if(n == 1) styles[[package]] else styles } }) .toRd_styled <- function(bibs, package, style = ""){ if(length(package) == 0) sty <- NULL else if(!isNamespaceLoaded(package) && !requireNamespace(package) ) sty <- NULL else sty <- Rdpack_bibstyles(package) ## TODO: check if these 'sapply()'s preserve encodings, if set. if(!is.null(sty)) res <- sapply(bibs, function(x) tools::toRd(x, style = "JSSLongNames")) else { # check style if(style == ""){ if(!("JSSRd" %in% tools::getBibstyle(all = TRUE))) ## bibstyle_JSSRd() set_Rdpack_bibstyle("JSSRd") res <- sapply(bibs, function(x) tools::toRd(x, style = "JSSRd")) }else{ res <- sapply(bibs, function(x) tools::toRd(x, style = "JSSLongNames")) } } ## 2018-10-08 ## TODO: this is risky but read.bib, bibentry, toRd and similar seem to work internally with UTF-8 ## if(!all(Encoding(res) == "UTF-8")){ ## ## warning(paste("encoding is: ", paste0(Encoding(res), collapse = ", "), "\n")) ## Encoding(res) <- "UTF-8" ## } res } ## bibstyle_JSSRd <- function(){ ## tools::bibstyle("JSSRd", .init = TRUE, .default = FALSE, ## cleanupLatex = function(x) { ## if (!length(x)) return(x) ## latex <- tryCatch(tools::parseLatex(x), error = function(e)e) ## if (inherits(latex, "error")) { ## x ## } else { ## deparseLatexToRd(latexToUtf8(latex), dropBraces=TRUE) ## } ## } ## ## ) ## } set_Rdpack_bibstyle <- function(bibstyle = "JSSRd"){ ## from /tools/R/bibstyle.R makeJSS() collapse <- function(strings) paste(strings, collapse="\n") emph <- function(s) if (length(s)) paste0("\\emph{", collapse(s), "}") switch(bibstyle, "JSSRd" = tools::bibstyle("JSSRd", .init = TRUE, .default = FALSE, cleanupLatex = function(x) { if (!length(x)) return(x) latex <- tryCatch(tools::parseLatex(x), error = function(e)e) if (inherits(latex, "error")) { x } else { deparseLatexToRd(latexToUtf8(latex), dropBraces=TRUE) } }, ## modified from tools::makeJSS() ## TODO: report on R-devel?. bookVolume = function(book) { result <- "" if (length(book$volume)){ result <- paste("volume", collapse(book$volume)) if (length(book$number)) result <- paste0(result, "(", collapse(book$number), ")") if (length(book$series)) result <- paste(result, "of", emph(collapse(book$series))) }else if (length(book$number)){ ## todo: in JSS style and others the title end with '.' and ## 'number' is 'Number', but don't want to fiddle with this now. result <- paste(result, "number", collapse(book$number)) if (length(book$series)) result <- paste(result, "in", collapse(book$series)) }else if (length(book$series)) result <- paste(result, collapse(book$series)) if (nzchar(result)) result } ), "JSSLongNames" = tools::bibstyle("JSSLongNames", .init = TRUE, .default = FALSE, cleanupLatex = function(x) { if (!length(x)) return(x) latex <- tryCatch(tools::parseLatex(x), error = function(e)e) if (inherits(latex, "error")) { x } else { deparseLatexToRd(latexToUtf8(latex), dropBraces=TRUE) } }, bookVolume = function(book) { result <- "" if (length(book$volume)){ result <- paste("volume", collapse(book$volume)) if (length(book$number)) result <- paste0(result, "(", collapse(book$number), ")") if (length(book$series)) result <- paste(result, "of", emph(collapse(book$series))) }else if (length(book$number)){ ## todo: in JSS style and others the title end with '.' and ## 'number' is 'Number', but don't want to fiddle with this now. result <- paste(result, "number", collapse(book$number)) if (length(book$series)) result <- paste(result, "in", collapse(book$series)) }else if (length(book$series)) result <- paste(result, collapse(book$series)) if (nzchar(result)) result }, shortName = function(person) { paste(paste(cleanupLatex(person$given), collapse=" "), cleanupLatex(person$family), sep = " ") } ), ## default stop("Unknown bibstyle ", bibstyle) ) } ## ls(environment(bibstyle)$styles$JSS) .onLoad <- function(lib, pkg){ ## tools::bibstyle("JSSLongNames", .init = TRUE, .default = FALSE, ## shortName = function(person) { ## paste(paste(cleanupLatex(person$given), collapse=" "), ## cleanupLatex(person$family), sep = " ") ## }, ## ## cleanupLatex = function(x) { ## if (!length(x)) return(x) ## latex <- tryCatch(tools::parseLatex(x), error = function(e)e) ## if (inherits(latex, "error")) { ## x ## } else { ## Rdpack:::deparseLatexToRd(latexToUtf8(latex), dropBraces=TRUE) ## } ## } ## ## ) set_Rdpack_bibstyle("JSSLongNames") Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } Rdpack/R/utils.R0000644000176200001440000002166013501141722013143 0ustar liggesusers.tag_in <- function(x, tags){ a <- attr(x,"Rd_tag") is.character(a) && length(a) == 1 && a %in% tags } .tag_eq <- function(x, tag){ a <- attr(x,"Rd_tag") is.character(a) && length(a) == 1 && a == tag } .ocompare <- function(x,y){ # outer compare f <- function(z) sapply(x, function(w) identical(z,w)) sapply(y,f) } .asym_compare <- function(x,y){ cmp <- .ocompare(x,y) if(length(x) == 1){ # 2012-10-03 added this if cmp <- matrix(cmp, nrow=1) } if(length(x) == 0){ inew <- seq_along(y) irem <- icom <- integer(0) }else if(length(y) == 0){ irem <- seq_along(x) inew <- icom <- integer(0) }else{ inew <- which( ! apply(cmp, 2, any) ) # in y but not in x irem <- which( ! apply(cmp, 1, any) ) # in x but not in y icom <- which( !(seq_along(x) %in% c(inew, irem)) ) # in both, x and y } list( i_new = inew, i_removed = irem, i_common = icom ) } rattr <- function(x,y){ # restore attributes, see Rdapply below if(is.list(x)){ if(!identical(attributes(x), attributes(y))) attributes(x) <- attributes(y) for(i in seq_along(x)) x[[i]] <- Recall(x[[i]], y[[i]]) } x } Rdapply <- function(x, ...){ # needed since rapply loses attributes of x wrk <- rapply(x, ...) rattr(wrk, x) } .pos_in_eqnpos <- function(verb, eqn){ # not a complete solution f <- function(x,y) length(x) > length(y) && all( x[seq_along(y)] == y ) flag <- FALSE res <- vector(mode="logical", length = length(verb)) for(i in seq_along(verb)){ for(j in seq_along(eqn)){ flag <- f(verb[[i]], eqn[[j]]) if(flag) break } res[i] <- flag } res } # 2012-09-08 new Rdtagapply <- function(object, FUN, rdtag, classes = "character", how = "replace", ...){ if(rdtag %in% c("mathVERB", "nonmathVERB", "nonmath")){ # special care for \eqn and \deqn feqnpos <- function(x) .tag_in(x, c("\\eqn", "\\deqn")) eqnpos <- Rdo_locate(object, feqnpos, lists = TRUE) eqnpos <- lapply(eqnpos, function(x) c(x,1)) # 1st arg. of \eqn or \deqn if(rdtag == "nonmath"){ anypos <- Rdo_locate_leaves(object) pos <- anypos[ !.pos_in_eqnpos(anypos, eqnpos) ] }else{ # is it better to use Rdo_locate_leaves here? fverbpos <- function(x) .tag_eq(x, "VERB") verbpos <- Rdo_locate(object, fverbpos, lists = FALSE) pos <- if(rdtag == "mathVERB") # verbpos[ verbpos %in% eqnpos ] verbpos[ .pos_in_eqnpos(verbpos, eqnpos) ] else # (rdtag == "nonmathVERB") # verbpos[ !( verbpos %in% eqnpos) ] verbpos[ !.pos_in_eqnpos(verbpos, eqnpos) ] } for(ind in pos) object[[ind]] <- FUN(object[[ind]], ...) object }else{ locfun <- function(x,...) if(.tag_eq(x, rdtag)) FUN(x,...) else x Rdapply(object,locfun, classes = classes, how = how, ...) } } .aux_Rdo_locate_leaves <- function(x, i){ if(is.logical(x)){ if(isTRUE(x)) i else FALSE }else{ # here x is a list of integer vectors lapply(x, function(x){ c(i,x)}) } } # inn1 <- parse_Rd("inner-methods.Rd") # Rdo_locate_leaves(inn1, function(x) grepl("^signature\\(", x)) Rdo_locate_leaves <- function(object, f = function(x) TRUE){ fxx <- function(x){ if(is.character(x)){ return(f(x)) # evaluate `f' for this leaf }else if(is.list(x)){ if(length(x)==0) # list() return(x) wrk <- lapply(x, fxx) for(i in seq_along(wrk)) wrk[[i]] <- .aux_Rdo_locate_leaves(wrk[[i]], i) indx <- sapply(wrk, function(y) !identical(y,FALSE) ) wrk <- wrk[indx] wrk <- do.call("c",wrk) return(wrk) }else{ return(FALSE) # todo: replace this with a function and additional argument } } fxx(object) } .merge_pos0 <- function(a, b){ # 2012-09-25 new if(is.numeric(b)) c(a,b) else if(is.list(b)){ res <- vector(mode="list", length=length(b)) for(i in seq_along(b)){ res[[i]] <- Recall(a, b[[i]]) } res }else if(is.logical(b)){ if(isTRUE(b)) a else as.numeric(NA) # numeric(0) }else{ attr(a, "merge_tag") <- b # obache tozi tag se gubi po-kasno a } } .merge_pos <- function(a, b, ...){ # 2012-09-25 new if(is.numeric(a) && length(a)==1){ a <- as.list(1:a) # todo: process the case a=0 } wrk <- list() for(i in a){ wrk <- c(wrk, .merge_pos0(a[[i]], b[[i]]) ) } res <- wrk len <- sapply(res, length) res <- res[len>0] # drop zero length values drop <- sapply(res, function(x) any(is.na(x))) res[ !drop] } .notFALSE <- function(x) !identical(x, FALSE) .notTRUE <- function(x) !isTRUE(x) # !identical(x, TRUE) # 2012-10-20 dobavyam argument nested # 2012-10-07 dobavyam argument fpos Rdo_locate <- function(object, f = function(x) TRUE, pos_only = TRUE, lists = FALSE, fpos = NULL, nested = TRUE){ fxx <- function(x){ if(is.character(x)){ # a leaf, evaluate `f' for it f(x) }else if(is.list(x)){ fli <- if(lists) f(x) else FALSE if(!nested && fli) return(TRUE) wrk <- if(fli) list(fli) else list() if(length(x)>0) wrk <- c(wrk, .merge_pos(length(x), lapply(x, fxx)) ) # recurse wrk }else{ # this should not happen for Rd objects FALSE # todo: replace this with a function and additional argument? } } pos <- fxx(object) f <- if(is.function(fpos)) function(x) list(pos = x, value = fpos(object, x)) else if(isTRUE(pos_only)) NULL else if(is.function(pos_only)) function(x) list(pos = x, value = pos_only(object[[x]])) else function(x) list(pos = x, value = object[[x]]) if(!is.null(f)) lapply(pos, f) else pos } # insert sep between successive elements of x .Rdinter <- function(x, sep = Rdo_newline(), before_first = FALSE, after_last = FALSE){ indx <- c(rbind(seq_along(x), length(x) + 1)) if(before_first) indx <- c( length(x) + 1, indx) if(!after_last) indx <- head(indx,-1) c(x, list(sep))[indx] } .Rd_tidy <- function(rdo){ # todo: optionally remove empty sections? tags <- Rdo_tags(rdo) # todo: remove multiple empty lines? secpos <- which(tags != "TEXT") # remove empty lines at top level? secpos <- secpos[secpos > 1] if(length(secpos)==0) return(rdo) nl <- Rdo_newline() nlpos <- integer(0) for(i in secpos){ # 2012-09-20 smenyam (!identical(rdo[[i-1]], nl)) s dolnoto. if(!Rdo_is_newline(rdo[[i-1]])) # inache tryabva da se grizha za "srcref" attribute nlpos <- c(nlpos, i) } if(length(nlpos)==0) return(rdo) # todo: this is lazy for(i in sort(nlpos, TRUE)){ # sort in decreasing order, otherwise indices change rdo <- Rdo_insert_element(rdo, nl, i) } rdo } Rdo_remove_srcref <- function(rdo){ f <- function(x){ a <- attributes(x) if(is.list(x)){ x <- lapply(x,f) if(!is.null(a)) # 2012-10-07 check for NULL attributes(x) <- a } if(!is.null(attr(x,"srcref"))) attr(x,"srcref") <- NULL x } f(rdo) } Rd_combo <- function(rd, f, ..., .MORE){ # todo: allow a directory? dots <- list(...) flag <- missing(.MORE) locfun <- function(x){ locwrk <- permissive_parse_Rd(x) locargs <- c(list(locwrk), dots) locres <- try( do.call(f, locargs), silent=TRUE) if(flag || inherits(locres,"try-error")) locres else{ try( do.call(.MORE, list(locres)), silent=TRUE) } } lapply(rd, locfun) } Rdpack/R/parse.R0000644000176200001440000000430613501141722013113 0ustar liggesusers## 2018-01-30 experimenting with processing of Rd macros ## pkgmacros <- tools::loadPkgRdMacros(system.file(package = package)) ## rdo <- parse_Rd(infile, macros = pkgmacros) ## 2018-01-30 new function ## as parse_Rd but intercepts warnings about unknown Rd macros permissive_parse_Rd <- function(file, permissive = TRUE, ...){ parse_Rd(file, permissive = permissive, ...) } ## 2018-01-30 new argument 'macros' .parse_Rdlines <- function(lines, macros = NULL){ tmpfile <- tempfile("Rdlines", fileext = ".Rd") # unlist is harmless if `lines' is already a character vector cat(unlist(lines), file = tmpfile, sep = "\n") # todo: catch errors if(is.null(macros)) res <- permissive_parse_Rd(tmpfile) # todo: catch errors else res <- permissive_parse_Rd(tmpfile, macros = macros) # todo: catch errors unlink(tmpfile) res } parse_Rdtext <- function(text, section = NA){ if(!is.na(section)) text <- c(paste(section,"{",sep=""), text, "}") res <- .parse_Rdlines(text) # write(text, sep="\n", file = file); res <- parse_Rd(file) rdtag <- attr(res[[1]], "Rd_tag") if(!is.na(section) && !is.null(rdtag) && rdtag==section) # todo: tova e krapka! res <- res[[1]] if(identical( c(res[[1]]), "\n" )) # c( ) to strip attributes res[[1]] <- NULL res } parse_Rdpiece <- function(x, result=""){ maket <- list_Rd(title="Dummy title" , name="dummyname" , "\\description"="Dummy description" , note = x , Rd_class=TRUE ) fn <- tempfile(pattern = "Rdpiece", fileext = "Rd") cat(as.character(maket), file=fn, sep="") # todo: error processing wrk <- permissive_parse_Rd(fn) unlink(fn) if(result=="text"){ # Rd_help2txt is from gbRd res <- Rd_help2txt(wrk, keep_section="\\note", omit_sec_header=TRUE) }else{ indx <- Rdo_which_tag_eq(wrk, "\\note") res <- wrk[[indx]] if(!is.null(attr(res,"Rd_tag"))) attr(res,"Rd_tag") <- NULL } res } Rdpack/R/RStudio.R0000644000176200001440000000321613501141722013371 0ustar liggesusers# In RStudio, call reprompt on function that cursor is pointing to. RStudio_reprompt <- function(verbose = TRUE) { if (!requireNamespace("rstudioapi") || !requireNamespace("rprojroot")) stop("RStudio support requires you to install the 'rprojroot' and 'rstudioapi' packages") sourceContext <- rstudioapi::getSourceEditorContext() infile <- sourceContext$path if (grepl("[.][rR]d$", infile)) # editing a help file reprompt(infile = infile, filename = infile, verbose = verbose) else if (grepl("[.][rRsSq]$", infile)) { # editing R source pkgdir <- rprojroot::find_package_root_file(path = dirname(infile)) pkg <- basename(pkgdir) if (length(sourceContext$selection) == 1) { fnname <- sourceContext$selection[[1]]$text } else fnname <- "" if (!nchar(fnname)) stop("Select a function name") if (!exists(fnname)) stop("Object ", sQuote(fnname), " not found. Run 'Install and Restart'?") existing <- help(fnname) # Subset to the ones in the current package existing <- existing[basename(dirname(dirname(existing))) == pkg] if (length(existing) == 1) { infile <- file.path(pkgdir, "man", paste0(basename(existing), ".Rd")) reprompt(infile = infile, filename = infile, verbose = verbose) } else if (!length(existing)) infile <- reprompt(fnname, filename = file.path(pkgdir, "man", paste0(fnname, ".Rd")), verbose = verbose) else stop("Multiple matches to ", sQuote(fnname), ". Open one help file manually.") } else stop("This tool only works on .Rd or .R files.") rstudioapi::navigateToFile(infile) }Rdpack/R/yytransient.R0000644000176200001440000001026213501141722014370 0ustar liggesusers # 2013-12-01 new; need testing .ascharRd <- function(rdo){ if(is.character(rdo)) # note: applying as.character.Rd, as below gives error in this case res <- as.vector(rdo) # to drop attributes; else{ class(rdo) <- "Rd" res <- as.character(rdo) } paste(res, collapse="") # todo: argument to make this optional? } .safeRdtag <- function(x, nulltag = ""){ # replaces NULL with nulltag res <- attr(x, "Rd_tag") if(is.null(res)) res <- nulltag res } # a replacement for tools:RdTags; takes # 2013-12-08 renamed from .top_RdTags Rdo_tags <- function(rdo, nulltag = ""){ # note: absent Rd_tag's are returned as "" locf <- function(x) .safeRdtag(x, nulltag) res <- sapply(rdo, locf) if (length(res)==0) res <- character() res } Rdo_which <- function(rdo, fun){ # fun - predicate wrk <- sapply(rdo, fun) which(wrk) } # 2013-12-08 renamed from .whichtageq Rdo_which_tag_eq <- function(rdo, tag){ tags <- Rdo_tags(rdo) pos <- which(tags == tag) pos } # 2013-12-08 renamed from .whichtagin Rdo_which_tag_in <- function(rdo, tags){ # TODO: needs testing! alltags <- Rdo_tags(rdo) pos <- which(sapply(alltags, function(x) .tag_in(x,tags) )) pos } Rdo_get_item_labels <- function(rdo){ wrk <- Rdo_locate(rdo, f = function(x){ # attr(x,"Rd_tag") == "\\item" .tag_eq(x, "\\item") }, lists = TRUE, nested = FALSE, pos_only = function(x) if(length(x) > 0) .ascharRd(x[[1]]) else "" #in \itemize items do not have labels ) sapply(wrk, function(x) x$value) } Rdo_get_argument_names <- function(rdo){ # 2013-12-08 was: indx <- Rdo_locate_predefined_section(rdo, "\\arguments") # todo: shouldn't this be using some "locate"-type function? I removed # Rdo_locate_predefined_section() since it simply checks the tags as # below but probably should vreate a ne function based on a "locate" indx <- Rdo_which_tag_eq(rdo, "\\arguments") if(length(indx) == 0) return(character(0)) # no "arguments" section in rdo; initially was: NA_character_ txt <- Rdo_get_item_labels(rdo[[indx]]) if (length(txt)==0) # this chunk: copied from tools:::.Rd_get_argument_names return(character()) txt <- unlist(strsplit(txt, ", *")) txt <- gsub("\\\\l?dots", "...", txt) txt <- gsub("\\\\_", "_", txt) txt <- .strip_whitespace(txt) txt <- unique(txt) # cater for duplication due to #ifdef unix or windows; # see e.g. system.Rd or system2.Rd in base package # # todo: more thought on this? txt } # 2013-10-23 new # pattern = ".*[.]Rd$" would be too dangerous. # but may be exclude could exclude foo-package Rdreplace_section <- function(text, sec, pattern, path = "./man", exclude = NULL, ...){ rdnames <- dir(path, pattern, full.names=TRUE) # todo: allow 'exclude' to have length more than 1 if(!is.null(exclude)){ rdexcl <- dir(path, exclude, full.names=TRUE) rdnames <- setdiff(rdnames, rdexcl) } for(nam in rdnames){ try(Rdo_set_section(text, sec, nam)) } rdnames # todo: return a logical vector of success/failures? } Rdo_locate_core_section <- function(rdo, sec){ # 2013-12-08 # Rdo_which_tag_eq(rdo, sec) secall <- Rdo_sections(rdo) sec.names <- sapply(secall, function(x) x$title) indx <- which(sec.names == sec) if(length(indx)==0) list() else ## 2018-04-21 was: secall[[indx]] secall[indx] } Rdpack/R/signature.R0000644000176200001440000002475113501141722014010 0ustar liggesusers # todo: need to setup error processing. E.g. in 2.14-0 signatures # for 'initialize-methods' in package 'methods' have an entry # with a duplicated signature which causes error. .get_signature <- function(rdo, pos){ sigtxt <- rapply(rdo[[pos]], function(x){ if(length(x)>1){ #when Rd_tag = "USERMACRO" "" }else if(grepl("^[ ]*signature\\(", x)){ wrk <- gsub("^[ ]*(signature\\([^)]*\\)).*", "\\1", x) # in case manual formatting has introduced more spaces. However, # this needs to be done more carefully. It would be best to # parse the signature rather than to scrape the string. On the # other hand, signatures are produced (usually) programmatically. gsub("[[:space:]]+", " ", wrk) }else "" }, classes = "character", deflt="") sigtxt[ sigtxt != ""] } .get_item_labsig <- function(rdo, pos, lab=TRUE){ label <- if(lab) .get_item_label(rdo, pos) else as.character(NA) sig <- .get_signature(rdo, pos) if(inherits(try(parse(text=sig),silent=TRUE), "try-error")){ txt <- parse_Rdpiece(rdo[[pos]],result="text") sig <- gsub("^.*(signature\\([^)]*\\)).*", "\\1", paste(txt,collapse=" ")) sig <- gsub("[[:space:]]+", " ", sig) sig <- gsub("'", "", sig) # krapka } c(name = label, signature = sig) } .get_top_signature <- function(rdo, pos = NULL, sec = "Methods", lab = TRUE){ if(is.null(pos)) pos <- .locate_top_items(rdo, sec) lapply(pos, function(x) .get_item_labsig(rdo, x, lab = lab) ) } # this inspect signatures in documentation of a class inspect_clmethods <- function(rdo, final = TRUE){ fullname <- .get.name_content(rdo)$name # name of the class, including suffix `-class' cur <- .capture_promptAny(fullname, final=final) # gather info about the actual methods curnames <- .get_top_labels(cur, "Methods") curitems <- .locate_top_items(cur, "Methods") cursigs <- .get_top_signature(cur, pos = curitems, sec = "Methods") rdonames <- .get_top_labels(rdo, "Methods") # gather info about rdo items <- .locate_top_items(rdo, "Methods") rdosigs <- .get_top_signature(rdo, pos = items, sec = "Methods") cmp <- .asym_compare(rdosigs, cursigs) # compare methods in rdo and cur indxnew <- cmp$i_new indxdrp <- cmp$i_removed if(length(indxnew)>0){ # Now make inference based on cmp. cat("Undocumented methods found.\n") # 2012-10-16 cat("Undocumented methods: ") cat("\tAdding items for them.\n") # print(cursigs[indxnew]) # print(cursigs[indxnew]) curnamesnew <- curnames[indxnew] # todo: some clean up of the code below. # todo: sort by function name (first arg. na \\item) newitems <- .get_subset(cur, curitems[indxnew], rdtag = "\\describe") newitems <- .nl_and_indent(newitems) # 2012-10-16 proverkata za empty items if(length(items) == 0){ # no \describe environment idescr <- .locate_sec_content(rdo, "Methods") if(length(idescr)==1 && is.na(idescr)){ # NA returned if no section Methods # todo: NA is inconvenient to check # not needed: methpos <- Rdo_get_insert_pos(rdo,"\\section") rdo <- Rdo_insert(rdo, char2Rdpiece("Functions with methods for this class:", "Methods", force.sec = TRUE ), newline = FALSE) idescr <- .locate_sec_content(rdo, "Methods") } rdo[[idescr]] <- c(rdo[[idescr]], list(newitems)) }else{ dindx <- .locate_enclosing_tag(rdo, items[[1]], "\\describe") wrk <- c(rdo[[dindx]], newitems ) # ne mozhe tolkova prosto ponezhe v rdo[[indx]] mozhe da ima i # drugi elementi osven \item (napr \n # rdo[[dindx]] <- structure(wrk[ order(c(curnames,rdonames)) ], # Rd_tag = "\\describe") wrk2 <- wrk allnams <- c(rdonames,curnamesnew) rdo[[dindx]] <- if(length(wrk2) == length(allnams)) # only only \item's present structure(wrk2[order(allnams)], Rd_tag = "\\describe") else structure(wrk2 , Rd_tag = "\\describe") } } if(length(indxdrp)>0){ # todo: maybe put this note in a section in rdo? cat("The following methods are no longer present:\n") print(rdosigs[indxdrp]) cat("\tPlease remove their descriptions manually.\n") } rdo } ## This inspects signatures in documentation of methods. Signatures in documentation of ## classes are stored somewhat differently. this was written before inspect_clmethods() and ## was geared towards using existing code for ordinary functions (mainly parse_usage_text() inspect_signatures <- function(rdo, package = NULL, sec = "Methods"){ rdosigs <- .get_top_signature(rdo, sec = "Methods", lab = FALSE) # process signatures sigtxt <- sapply(rdosigs, function(x) x["signature"]) # in `rdo' urdo <- parse_usage_text(sigtxt) curtxt <- get_sig_text(rdo, package=package) # process actual signatures ucur <- parse_usage_text(curtxt) # 2012-09-07 - may tryabva da varne samite elementi, ne technite indeksi. icomp <- .asym_compare(urdo, ucur) removed_sig <- urdo[ icomp$i_removed ] added_sig <- ucur[ icomp$i_new ] if(length(added_sig)>0){ cat(length(added_sig), "new signatures found.\n") # print(added_sig) cat("\tAdding items for them.\n") } # else cat("\tNo new signatures.\n") if(length(removed_sig)>0){ # for testing only; cat(length(removed_sig), "removed signatures:\n") # remove eventually print(removed_sig) }else cat("\tNo removed signatures.\n") list( changed = length(added_sig) != 0 | length(removed_sig) != 0 , added_sig = added_sig, removed_sig = removed_sig ) } # todo: It would be better to call promptMethods() to get the signatures but in version # R-2.13.x I had trouble with argument `where' (could not figure out how to use it to # restrict to funtions from a package; also, promptMethods() seems to call the deprecated # function getMethods()). Check how these things stand in R-2.14, there may be no problem # any more (checked, in 2.14-0 it is the same). # curtxt0 <- showMethods(fname, printTo=FALSE) # curtxt <- curtxt0[-1] # drop the description string # curtxt <- gsub("^[ ]*\\(inherited from[^)]*\\)[ ]*", "" , curtxt) # curtxt <- curtxt[ curtxt != "" ] # todo: improve! # curtxt <- paste("signature(", curtxt, ")", sep="") get_sig_text <- function(rdo, package = NULL){ # finds the actual signatures without fname <- .get.name_content(rdo)$short # using promptXXX functions meths <- if(is.character(package)) findMethodSignatures(fname,where = asNamespace(package)) else findMethodSignatures(fname) nammeths <- colnames(meths) # insert quotes to make this consistent with parse_usage_text(); # do it defensively (hardly necessary), in case they are already there sig <- apply(meths, c(1,2), function(x) if(!all( grepl("^\"",x))) paste("\"",x,"\"",sep="") else x) # get one column for each signature sig <- apply(sig, 1, function(x) paste(nammeths, x, sep=" = ") ) # adjust `sig' so that `paste()' would do the right thing sig <- if(is.matrix(sig)) apply( t(sig), 1, function(x) paste(x, collapse=", ")) else sig # a vector if one paste("signature(", sig, ")", sep="") } S4formals <- function(fun, ...){ # could be made S4 generic if(!is(fun, "MethodDefinition")) fun <- getMethod(fun, ...) #browser() ## 2019-04-21 was: ## # todo: check that this is ok ## formals(body(fun@.Data)[[c(2,3)]]) # if not, fall back to formals(m1) ## ## This resolves a very old 'todo' (see the commented text above). ## The hack above doesn't always work. Replace it it more enlightened approach. fff <- fun@.Data funbody <- body(fff) if(length(funbody) == 3 && identical(funbody[[1]], as.name("{")) && length(funbody[[2]]) == 3 && identical(funbody[[c(2,1)]], as.name("<-")) && identical(funbody[[c(2,2)]], as.name(".local")) && is.function(funbody[[c(2,3)]]) ){ ## this is the old hack: formals(body(fun@.Data)[[c(2,3)]]) formals(funbody[[c(2,3)]]) }else{ formals(fff) } } # showMethods("plot") # showMethods("plot",includeDefs=TRUE) # showMethods("plot",includeDefs=TRUE,print=FALSE) # s <- showMethods("plot",includeDefs=TRUE, print=FALSE) # # # m1 <- getMethod("plot",c(x="profile.mle", y="missing")) # # class(m1) # showClass(class(m1)) # # m1 # m1@defined # m1@target # m1@.Data # # str(m1) # # formals(m1) # # m1@.Data # m1body <- body(m1@.Data) # m1body # m1body[[1]] # `{` # m1body[[2]] # the expression: .local <- function(...) ... # class(m1body[[2]]) # "<-" # m1body[[c(2,1)]] # `<-` # m1body[[c(2,2)]] # .local # m1body[[c(2,3)]] # the function, what I need # formals(m1body[[c(2,3)]]) # the formals ! Rdpack/R/usage.R0000644000176200001440000004642613501141722013116 0ustar liggesusersinspect_usage <- function(rdo){ ut <- get_usage_text(rdo) if(grepl("=[ ]*[,)]", ut)){ # TODO: this is a patch; should be sorted out properly! cat("Encountered formal arguments in the form 'arg ='\n") cat("\twithout righ-hand side, dropping the equal sign to proceed.\n") ut <- gsub("=[ ]*([,)])", "\\1", ut) } urdo <- parse_usage_text(ut) ucur <- lapply(seq_along(urdo), function(x) get_usage(name = urdo[[x]]$name, S3class = urdo[[x]]$S3class, S4sig = urdo[[x]]$S4sig, infix = urdo[[x]]$infix, fu = urdo[[x]]$fu, out.format="list")) mapply(compare_usage1, urdo, ucur, SIMPLIFY=FALSE)# ucur is of the same length as urdo but } # it may contain NULLs in some positions inspect_args <- function(rdo, i_usage){ argnames_rdo <- Rdo_get_argument_names(rdo) # TODO: this is for testing! # stopifnot(all( tools:::.Rd_get_argument_names(rdo) == # Rdo_get_argument_names(rdo) )) if(missing(i_usage)) i_usage <- inspect_usage(rdo) argnames_cur <- unique(unlist(lapply(i_usage, function(x) attr(x,"details")$cur_usage$argnames))) ## 2018-01-31 in case argnames_cur is NULL, ## since sort used on NULL inside identical() gives warning. if(length(argnames_cur) == 0) argnames_cur <- character(0) structure(identical(sort(argnames_rdo), sort(argnames_cur)), details = list( rdo_argnames = argnames_rdo , cur_argnames = argnames_cur , added_argnames = argnames_cur[!(argnames_cur %in% argnames_rdo)] , removed_argnames = argnames_rdo[!(argnames_rdo %in% argnames_cur)] )) } # new 2012-09-22 parse_text <- function(text, ..., keep = TRUE){ # see comments in parse_usage_text ks <- options("keep.source") if(identical(keep, ks)){ # comment on 2014-03-28 : this condition will never be TRUE # since ks is named! res <- parse(text=text, ...) }else{ options(keep.source = keep) res <- parse(text=text, ...) options(ks) # restore previous value } res } parse_usage_text <- function(text){ text <- gsub("\\\\dots", "...", text) # deal with \dots # deal with \method and \S3method macros for desciption of S3 methods. text <- gsub("\\\\(S3)?method\\{([^}]*)\\}\\{([^}]*)\\}", "S3_usage(\\2,\\3)", text) # todo: tova sa krapki za S3 metodi. Need to pass # syntactically correct text to parse below. text <- gsub("S3_usage\\((\\[+),", "S3_usage(`\\1`,", text) # [, [[ text <- gsub("S3_usage\\((\\$+),", "S3_usage(`\\1`,", text) # $ if(any(grepl("S3_usage\\([^,]*,function[ ]*\\)", text))){ # 2012-10-12 dobavyam "any" fun_flag <- TRUE text <- gsub("(S3_usage\\([^,]*,)function[ ]*\\)", "\\1fufufu_function)", text) }else fun_flag <- FALSE # deal with \S4method macro text <- gsub("\\\\S4method\\{([^}]*)\\}\\{([^}]*)\\}", "S4_usage(\\1,\\2)", text) # parse_text ensures that the srcref attribute will be set. # parse() normally does that but 'R CMD check' for example sets tmp <- parse_text(text) # keep.source to FALSE, leading to errors in the examples. # todo: check for errors after parse() # a character vector with one element for each usage expression in text usages <- sapply(attr(tmp, "srcref"), function(x) paste(as.character(x), sep="\n", collapse="\n")) if(fun_flag) usages <- gsub("fufufu_function", "function", usages) lapply(usages, parse_1usage_text) } # TODO: x %% y i podobni tyabva da se opravyat! vzh Arithmetic.Rd ot base parse_1usage_text <- function(text){ # modify usage texts to become function bodies embedded in calls to formals() f <- function(x) paste0(sub("^[^(]+\\(", "formals(function(", x), " NULL )") fu <- TRUE # in most cases we are dealing with functions if(grepl("^[[:alpha:]._][[:alnum:]._]*$", text)){ # a variable, not function call fu <- FALSE name <- text S3class <- "" S4sig = "" infix <- FALSE res <- NULL }else if(grepl("^S3_usage",text)){ S3class <- gsub("[^,]*,([^)]*)\\).*", "\\1", text) # patch, undo the quotes maybe put by parse_usage_text text <- gsub("S3_usage\\([`\"']([^,`]+)[`\"']", "S3_usage(\\1", text) name <- gsub("[^(]*\\(([^,]*),.*", "\\1", text) if(grepl("S3_usage\\(.*\\)[ ]* <-[ ]*value[ ]*$", text)){ # S3 assignment method text <- gsub("(S3_usage\\()([^,]*)(.*)\\)[ ]* <-[ ]*value[ ]*$", "\\1`\\2<-`\\3,value)", text) name <- paste0(name, "<-") }else if(!grepl("^[[:alpha:]._:][[:alnum:]._:]+$", name)){ # non-syntactic name text <- gsub("S3_usage\\(([^,]*,)", "S3_usage(`\\1`,", text) } text <- gsub("[^)]*\\)(.*)", paste(name, ".", S3class, "\\1", sep=""), text) S4sig = "" infix <- FALSE wrk <- f(text) res <- eval(parse(text = wrk)) }else if(grepl("^S4_usage",text)){ name <- gsub("[^(]*\\(([^,]*),.*", "\\1", text) # same as for S3 name above S3class <- "" #browser() # similar to S3 but there may be commas in the signature, so change accordingly if(grepl("S4_usage\\(.*\\)[ ]* <-[ ]*value[ ]*$", text)){ # S4 assignment method text <- gsub("(S4_usage\\()([^,]*)(.*)\\)[ ]* <-[ ]*value[ ]*$", "\\1`\\2<-`\\3,value)", text) if(grepl("\\([ ]*,[ ]*value", text)) # patch for 0 arguments in the current signature text <- sub("\\([ ]*,[ ]*value", "(dummyvar, value", text) name <- paste0(name, "<-") }# TODO: non-syntactic names? S4sig <- gsub("[^,]*,([^)]*)\\).*", "\\1", text) # same as for S3class above # but S4 signatures may have more than 1 element, # make a character vector from the single string s <- paste("names(formals(function(", S4sig, ") NULL))", sep="") S4sig <- eval(parse(text = s)) text <- gsub("[^)]*\\)(.*)", paste0(name, "\\1"), text) infix <- FALSE wrk <- f(text) res <- eval(parse(text = wrk)) }else{ # extract the function names from `usages' S3class <- "" S4sig = "" e <- parse(text = text) name <- as.character(e[[1]][[1]]) # !grepl( paste0("^",name)) - s regexp tryabva da se vnimava # ponezhe ako name e "+", tova e drugo. # ne mozhe i fixed = TRUE, ponezhe iskam da match-na ot nachaloto infix <- !(substr(text,1,nchar(name)) == name) ec <- lapply(1:length(e[[1]]), function(x) as.character(e[[1]][[x]])) res <- NULL if(name == "<-"){ # todo: more care needed here e2 <- e[[1]][[2]] if(is.call(e2)){ e2_named <- .make_named(e2) name <- paste0(e2[[1]], "<-") wrk <- paste0("formals(function(", paste(e2_named[-1], collapse=","), ",", e[[1]][[3]], # rhs (i.e., value) should have 1 elem only ") NULL )" ) }else{ # simple assignment (todo: can it be anything else here?) wrk <- paste0("formals(function(", paste(ec[-1], collapse=","), ") NULL )" ) } }else if(name == "!"){ wrk <- sub("!", "", text) wrk <- paste0("formals(function(", wrk, ") NULL)") }else if(name == ":"){ wrk <- "formals(function(from,to) NULL)" }else if(name %in% c("if", "for", "while", "repeat", "break", "next")){ # control res <- as.character(sapply(e[[1]], identity)) }else if(infix){ e <- parse(text = paste0("quote(",text,")")) ec <- .make_named(lapply(e[[1]][[2]], identity)) wrk <- paste0("formals(function(", paste(ec[-1], collapse=","), ") NULL )" ) }else{ wrk <- f(text) } if(is.null(res)) res <- eval(parse(text = wrk)) } pairlist2f_usage1(res, name, S3class, S4sig, infix, fu) # convert pairlists obtained from } # `formals()' into named "f_usage" objects. .make_named <- function(v, sep = " = "){ if(length(v) == 0) return(character(0)) nams <- allNames(v) wrk <- sapply(seq_along(v), function(x) if(nams[x]=="") paste(v[x]) else paste(nams[x], v[x], sep=sep)) wrk } # generate f_usage object for a function (needs clean up) # todo: argument `...' not used? get_usage <- function(object, name = NULL, force.function = FALSE, ..., S3class = "", S4sig = "", infix = FALSE, fu = TRUE, out.format = "text"){ if (missing(name)) # based on a chunk from utils::prompt if (is.character(object)){ name <- object object <- NULL }else { name <- substitute(object) if (is.name(name)) name <- as.character(name) else if (is.call(name) && (as.character(name[[1L]]) %in% c("::", ":::", "getAnywhere"))) { name <- as.character(name) name <- name[length(name)] } else stop("cannot determine a usable name") } # get(name, envir = asNamespace("mixAR")) # do.call(getAnywhere,list(x)) x <- if(!missing(object) && !is.null(object)) object else if(!fu){ x0 <- try(get(name), silent=TRUE) if(inherits(x0,"try-error")){ spec_values <- c("NULL", "TRUE", "FALSE", "NA", sapply(c(Inf, NaN, -Inf), as.character)) if(name %in% spec_values) x0 <- spec_values[ name == spec_values ][1] else x0 <- NULL } "OK: variable" # this value is not used further, it must not be NULL though }else if(!identical(S3class, "")){ # 2012-10-16 dobavyam getAnywhere, etc. x0 <- try(getS3method(name, S3class), silent=TRUE) if(inherits(x0,"try-error")){ x0 <- do.call(getAnywhere, list(paste0(name, ".", S3class))) if(length(x0$objs) > 0) x0$objs[[1]] else NULL }else x0 }else if(!identical(S4sig, "")) # todo: coordinate with the rest! getMethod(name, S4sig) # transform S4sig here if it is not convenient to # keep it ready for use entry in f_usage objects. else{ name0 <- if(grepl('^".*"$', name)) # non-syntactic name sub('^"(.*)"$', "\\1", name) else name x0 <- try(get(name0, envir = parent.frame()), silent=TRUE) if(inherits(x0,"try-error")){ x0 <- do.call(getAnywhere, list(name0)) if(length(x0$objs) > 0) # todo: needs more work here. IN particular, there x0$objs[[1]] # should be a package argument to avoid taking # blindly whatever comes up. else NULL }else x0 } if(is.null(x)) return(x) if (fu && !(is.function(x) || force.function)){ warning("The object is not a function.") # The return value may be appropriate return(name) # for data objects. # todo: Rethink! } argls <- if(fu){ if(!identical(S4sig, "")) S4formals(x) else if(!identical(S3class, "")) formals(x) else{ spec_args <- .special_args[name] if(is.na(spec_args)){ wrk <- formals(x) if(is.null(wrk)) # takes care for primitive functions, napr. seq.int wrk <- formals(args(x)) # argls will still be NULL if x is a function with no arguments. # Note that formals returns pairlist and the pairlist with # zero elements is NULL (unlike list()). Taka che # pairlist2f_usage() needs to know how to deal with this case. wrk }else eval(parse(text = paste0("formals(function(", spec_args, ") NULL)"))) } }else NULL # 2012-10-11 smenyam pairlist2f_usage na pairlist2f_usage1 res <- pairlist2f_usage1(argls, name, S3class = S3class, S4sig = S4sig, infix = infix, fu = fu) if(out.format != "list") res <- as.character(res) res } .special_args <- c("~" = "y, model", "@" = "object, name", "$" = "x, name", "||" = "x, y", "&&" = "x, y", "[" = "x, i, j, ..., drop = TRUE", "[[" = "x, i, j, ..., exact = TRUE", "@<-" = "object, name, value", # formals("@<-") actually works "$<-" = "x, name, value", "[<-" = "x, i, j, ..., value", "[[<-" = "x, i, value", ":" = "from, to" ) # the comparison is symmetric but the interpretation assumes that ucur may be more recent. compare_usage1 <- function(urdo, ucur){ # urdo - usage from Rdo file/object; # ucur - generated from actual object ## 2019-04-14 in R-devel for R-3.7.0 this gives error. ## What is the intent in is.na(ucur) and is.na(urdo)? The documentation of ## compare_usage1() clearly shows that the intent is that of gbutils::isNA(). I ## can't find now what may set ucur or urdo to NA, probably initially I was setting ## NA, not NULL, and the check is.na() remained as a guard, which is not needed ## now. ## ## For typical input here, is.na() gives something like: ## ## --- value of length: 7 type: logical --- ## name S3class S4sig infix fu argnames defaults ## FALSE FALSE FALSE FALSE FALSE FALSE FALSE ## ## TODO: check if it is necessary in the code below to be more defensive ## e.g. (urdo$S3class != "") is potentially troublesome. ## ## obj_removed <- is.null(ucur) || is.na(ucur) ## obj_added <- is.null(urdo) || is.na(urdo) obj_removed <- is.null(ucur) || ( is.atomic(ucur) && length(ucur) == 1 && is.na(ucur) ) obj_added <- is.null(urdo) || ( is.atomic(urdo) && length(urdo) == 1 && is.na(urdo) ) if(!obj_added && !obj_removed && urdo$S3class != ""){ fn <- paste(urdo$name, ".", urdo$S3class, sep="") if(ucur$name == fn){ ucur$name <- urdo$name ucur$S3class <- urdo$S3class } } status <- identical(urdo, ucur) alias <- if(obj_removed) "" else if(ucur$S3class != "") paste(ucur$name, ".", ucur$S3class, sep="") else if(!identical(ucur$S4sig, "")) paste0(ucur$name, ",", paste(ucur$S4sig, collapse=","), "-method") else ucur$name if(grepl('^".*"$', alias)){ # non-syntactic name, drop the quotes alias <- sub('^"(.*)"$', "\\1", alias) } if(obj_removed || obj_added) return( structure( status, details = list( obj_removed = obj_removed , obj_added = obj_added , rdo_usage = urdo , cur_usage = ucur , alias = alias )) ) identical_names <- urdo$name == ucur$name identical_argnames <- identical(urdo$argnames, ucur$argnames) identical_defaults <- identical(urdo$defaults, ucur$defaults) identical_formals <- identical_argnames & identical_defaults added_argnames <- ucur$argnames[ !(ucur$argnames %in% urdo$argnames) ] removed_argnames <- urdo$argnames[ !(urdo$argnames %in% ucur$argnames) ] # note: !!! intersect() is binary operation s <- intersect( intersect(names(urdo$argnames), names(ucur$argnames)), intersect(names(urdo$defaults), names(ucur$defaults)) ) unchanged_defaults <- urdo$defaults[ ucur$defaults[s] == urdo$defaults[s] ] names_unchanged_defaults <- names(unchanged_defaults)[unchanged_defaults] # todo: more details for the case when !identical, e.g. equal up to reordering, # added/removed defaults structure( status, details = list( identical_names = identical_names , obj_removed = obj_removed , obj_added = obj_added , identical_argnames = identical_argnames , identical_defaults = identical_defaults , identical_formals = identical_formals , added_argnames = added_argnames , removed_argnames = removed_argnames , names_unchanged_defaults = names_unchanged_defaults , rdo_usage = urdo , cur_usage = ucur , alias = alias )) } Rdpack/R/promptSexpr.R0000644000176200001440000000660213501141722014345 0ustar liggesusers # like promptPackage but uses \Sexpr{} for automatic information updating promptPackageSexpr <- function(package, filename= NULL, final = TRUE, overview = FALSE, bib = TRUE){ # 2013-03-30 neew arg. `bib' paste0 <- function(...) paste(..., sep="") overv <- if(overview | !final) "" else "% " hide <- "\\Sexpr[stage=build,results=hide]" pd <- paste0("{pd <- packageDescription(\"", package, "\")}") lb <- paste0("{lb <- library(help=\"", package, "\", character.only=TRUE)}") lbflag <- "lbflag <- !is.null(lb$info[[2]])" Rdtxt <- list( paste0("\\name{", package, "-package}") , paste0("\\alias{", package, "-package}") , paste0("\\alias{", package, "}") , paste0("\\docType{", "package", "}") , "\\title{" , paste0(" ", hide, c(pd, lb)) # init. commands, cannot be outside sections. , " \\Sexpr[stage=build]{pd$Title}" , "}" , "\\description{" , " \\Sexpr[stage=build]{pd$Description}" , "}" , "\\details{" , " \\tabular{ll}{" , " Package: \\tab \\Sexpr[stage=build]{pd$Package}\\cr" , " Type: \\tab \\Sexpr[stage=build]{pd$Type}\\cr" , " Version: \\tab \\Sexpr[stage=build]{pd$Version} \\cr" , " Date: \\tab \\Sexpr[stage=build]{pd$Date}\\cr" , " License: \\tab \\Sexpr[stage=build]{pd$License}\\cr" , " LazyLoad: \\tab \\Sexpr[stage=build]{pd$LazyLoad}\\cr" , " Built: \\tab \\Sexpr[stage=build]{pd$Built}\\cr" , " }" , "" , " Index:" , paste0(" \\Sexpr[stage=build,results=rd]{paste(\"\\\\\\\\preformatted{\"" , ", paste(if(!is.null(lb$info[[2]])) lb$info[[2]] else \"No entries\",collapse=\"\\n\"), \"}\", sep=\"\")}") , "" , paste0(overv, c("~~ An overview of how to use the package, including the most important ~~" , "~~ functions ~~")) , "}" , "\\author{" , " \\Sexpr[stage=build]{pd$Author}" , "" , paste0("Maintainer: ", "\\Sexpr[stage=build]{pd$Maintainer}") , "}" , "\\references{" , if(bib) "% bibentry:all" else "% ~~ Literature or other references for background information ~~" , "}" , "% ~~ Optionally other standard keywords, one per line, from file KEYWORDS in ~~" , "% ~~ the R documentation directory ~~" , "\\keyword{ package }" , "% \\seealso{" , "% ~~ Optional links to other man pages, e.g. ~~" , "% ~~ \\code{\\link[:-package]{}} ~~" , "% }" , "% \\examples{" , "% ~~ simple examples of the most important functions ~~" , "% }" ) if(is.null(filename)) filename <- paste0(package, "-package.Rd") if(is.na(filename)) return(Rdtxt) cat(unlist(Rdtxt), file = filename, sep = "\n") message(gettextf("Created file named %s.", sQuote(filename)), "\n", gettext("Edit the file and move it to the appropriate directory."), domain = NA) invisible(filename) } Rdpack/R/slots.R0000644000176200001440000000423013501141722013141 0ustar liggesusersinspect_slots <- function(rdo, final=TRUE){ fullname <- .get.name_content(rdo)$name # name of the class with '-class' suffix cur <- .capture_promptAny(fullname, final=final) ## 2018-08-27 - non-exiting class (TDO: check if it could be something else here if(inherits(cur, "try-error")){ return(cur) } curnames <- .get_top_labels(cur, "Slots") # current slots rdonames <- .get_top_labels(rdo, "Slots") # slots in rdo icmp <- .asym_compare(rdonames, curnames) # compare; get fields $i_new, $i_rem, $i_com if(length(icmp$i_new)>0){ ## 2014-06-18 the labels contain Rd markup, as in \code{mo.col}, but this seems ## harmless. ## 2014-06-21 new slots were not handled correctly, see the changes below; ## see also inspect_clmethods - there is a lot of common ground. ## todo: consolidate? ## 2019-05-12 was: newnames <- names(icmp$i_new) # 2014-06-21 new newnames <- curnames[icmp$i_new] cat("Undocumented slots:", newnames # 2014-06-21 was: names(icmp$i_new) # 2014-06-18 was: icmp$i_new , "\n") cat("\tAdding items for them.\n") # todo: insert in particular order? cnt_newslots <- .get_top_items(cur, "Slots", newnames) # 2014-06-21 was: icmp$i_new cnt_newslots <- .nl_and_indent(cnt_newslots) # 2014-06-21 new # this ensures that the closing brace for "describe" # is on new line. todo: this needs to be indented. cnt_newslots <- c(cnt_newslots, list(Rdo_newline())) # 2014-06-21 new dindx <- .locate_top_tag(rdo, "Slots") rdo <- append_to_Rd_list(rdo, cnt_newslots, dindx) } if(length(icmp$i_removed)>0){ # todo: maybe put this note in a section in rdo? ## 2019-05-12 was: cat("Slots:", icmp$i_removed, "\n") cat("Slots:", rdonames[icmp$i_removed], "\n") cat("are no longer present. Please remove their descriptions manually.\n") } rdo } Rdpack/R/manip.R0000644000176200001440000003215613501141722013111 0ustar liggesusers## Do not edit this file manually. ## It has been automatically generated from *.org sources. # generic rdo manipulation functions append_to_Rd_list <- function(rdo, x, pos){ # pos is a numeric vector rdo[[pos]] <- structure( c(rdo[[pos]], x), Rd_tag = attr(rdo[[pos]],"Rd_tag") ) rdo } # todo: allow vector `pos' to insert deeper into the object # todo: character `pos' to insert at a position specified by "tag" for example? Rdo_insert_element <- function(rdo, val, pos){ n <- length(rdo) if(missing(pos)) pos <- n+1 stopifnot(1 <= pos, pos <= n+1) res <- if(pos==1) c(list(val), rdo) else if(pos==n+1) c(rdo, list(val)) else c( rdo[1:(pos-1)], list(val), rdo[pos:n]) attributes(res) <- attributes(rdo) # todo: more guarded copying of attributes? res } Rdo_get_insert_pos <- function(rdo, tag){ tags <- Rdo_tags(rdo) pos <- which(tags == tag) pos <- if(length(pos)>0) max(pos) + 1 # put after the last occurence of the same section else if(tag %in% .rd_sections){ indx <- which(.rd_sections == tag) iafter <- which( tags %in% .rd_sections[-seq_len(indx)] ) iafter[1] # put in front of the next section in .rd_sections }else{ # otherwise put at the end of rdo length(rdo)+1 } pos } Rdo_insert <- function(rdo, val, newline = TRUE){ tag <- attr(val,"Rd_tag") if(is.null(tag)) stop("val has no Rd_tag attribute.") pos <- Rdo_get_insert_pos(rdo, tag) # 2013-03-29 - additional check for pos # todo: this is incomplete! if(newline && ( (length(pos) == 1 && pos <= length(rdo) && !Rdo_is_newline(rdo[[pos]])) || (length(pos) == 1 && pos > length(rdo)) || length(pos) > 1 # todo: this is incomplete ) ) rdo <- Rdo_insert_element(rdo, Rdo_newline(), pos) rdo <- Rdo_insert_element(rdo, val, pos) if(newline && pos > 1 && !Rdo_is_newline(rdo[[pos-1]])) rdo <- Rdo_insert_element(rdo, Rdo_newline(), pos) rdo } # this is not specific to "sections", any Rd_tag in 'val' will do Rdo_modify <- function(rdo, val, create=FALSE, replace=FALSE, top = TRUE){ sec <- attr(val,"Rd_tag") if(is.null(sec)) stop("val has no Rd_tag attribute.") rdotag <- attr(rdo,"Rd_tag") if(top && !is.null(rdotag) && rdotag == sec){ # rdo is the section `sec'; if(replace) # todo: character 'replace' not handled yet. # append to the end return(val) else{ rdo <- append_to_Rd_list( list(rdo), val, 1) return( rdo[[1]] ) } } pos <- Rdo_which_tag_eq(rdo, sec) if(length(pos)>0){ if(is.character(replace)){ # the value to replace goodpos <- sapply(pos, # todo: the check below is simplistic function(x){ locval <- rdo[[x]] is.list(locval) && length(locval) == 1 && locval[[1]] == replace }) goodpos <- pos[goodpos] if(length(goodpos) > 0) rdo[[ goodpos[1] ]] <- val else if(create) rdo <- Rdo_insert(rdo, val) }else if(replace) rdo[[ pos[1] ]] <- val # pos[1] in case there are more else rdo <- append_to_Rd_list(rdo, val, pos[1]) }else if(create) # argument section not present, create one rdo <- Rdo_insert(rdo, val) # rdo[[ length(rdo)+1 ]] <- val else stop("No section ", sec, " to replace or modify.") rdo } ## The 'locate_' family of functions finds (recursively) positions of elements of rdo objects. ## A position is a vector suitable for use in '[[' or a list of such vectors. # find the index the element enclosing rdo[[ind]] that has Rd_tag 'tag'. # (e.g. if rdo[[ind]] is an '\item', we may wish to grab the enclosing '\describe'.) .locate_enclosing_tag <- function(rdo, ind, tag, baseind = numeric(0), mindepth=0){ repeat{ fullind <- c(baseind,ind) rdtag <- if(length(fullind) > 0) attr(rdo[[fullind]], "Rd_tag") else attr(rdo , "Rd_tag") if(is.character(rdtag) && rdtag == tag) return(ind) else if(length(ind)==mindepth) return(as.numeric(NA)) ind <- head(ind,-1) # drop the last level } } ## The '_top_' family of functions look only at the top level of rdo, in the sense that they ## examine the elements of rdo at the top level and do not search recursively its structure. ## Some of these functions examine also rdo as a whole (todo: maybe all of them should do ## this for consistency). .locate_top_tag <- function(rdo, sec, tag = "\\describe"){ if(sec == ""){ # search at top level of rdo indx1 <- integer(0) }else{ indx1 <- .locate_sec_content(rdo, sec) if(sec %in% c("\\arguments", "\\value")) # these sections are themselves lists return(indx1) rdo <- rdo[[indx1]] } indx3 <- Rdo_which_tag_eq(rdo, tag) if(length(indx3)==0) return(integer(0)) indx3 <- indx3[[1]] # playing safe, in case more than one c(indx1,indx3) # todo: option to return a list of all matches? } .locate_top_items <- function(rdo, sec, labels=FALSE){ indx1 <- .locate_top_tag(rdo, sec) if(length(indx1) == 0) return(list()) indx2 <- Rdo_which_tag_eq(rdo[[indx1]], "\\item") res <- lapply( indx2, function(x) c(indx1, x)) # returns a list of positions # todo: item labels (i.e., the 1st arg. of \item) may be long, is this a problem? if(isTRUE(labels) || is.character(labels)) # set names attribute if requested names(res) <- sapply(res, function(x) .get_item_label(rdo,x) ) if(is.character(labels)) # take only the requested items res <- res[labels] res } .nl_and_indent <- function(rdo, newlines = TRUE, indent = " "){ nl <- Rdo_newline() tab <- indent # todo: allow it to be dropped wrk <- lapply(rdo, function(x) list(nl, tab, x) ) res <- do.call("c", wrk) # todo: is this the correct arrangement - ne, gubi Rd_tag attr(res, "Rd_tag") <- attr(rdo, "Rd_tag") # 2012-10-16 todo: "Rd" attribute? - use c_Rd? res } .get_subset <- function(rdo, pos, rdtag = FALSE, keep.class = FALSE, newlines = FALSE){ if(newlines){ nl <- Rdo_newline() wrk <- lapply(pos, function(x) list(nl, rdo[[x]]) ) res <- do.call("c", wrk) # todo: check if this is the correct arrangement }else res <- lapply(pos, function(x) rdo[[x]]) if(isTRUE(rdtag)) attr(res, "Rd_tag") <- attr(rdo, "Rd_tag") else if(is.character(rdtag)) attr(res, "Rd_tag") <- rdtag if(keep.class) class(res) <- class(rdo) res } .get_item_label <- function(rdo, pos){ # 2013-12-01 no need of looking for leaves after introducing .ascharRd() # indx <- c(pos, .locate_item_label(rdo, pos)) # res <- rdo[[indx]] indx <- c(pos, 1) res <- .ascharRd(rdo[[indx]]) res } # 'labels' is a logical or a character vector of labels .get_top_items <- function(rdo, sec, labels){ # e.g. sec = "Slots", "arguments" itemind <- .locate_top_items(rdo, sec, labels=labels) lapply(itemind, function(x) rdo[[ x ]] ) # see also .get_subset() } .get_top_labels <- function(rdo, sec){ indx <- .locate_top_items(rdo, sec) sapply(indx, function(x) .get_item_label(rdo,x)) } # manipulation of specific sections # todo: this is very similar to parse_Rdname # 2012-11-04 partly done, introduced function .parse_long_name() .get.name_content <- function(rdo){ # todo: error processing Rd section \name name <- rdo[[ Rdo_which_tag_eq(rdo, "\\name") ]] # 2012-11-04 # dropping "-methods" or similar, if present # short <- gsub("^([^-]+)-.*", "\\1", name) short <- .parse_long_name(name)["name"] c(name = name, short = short) } # Rd section \arguments Rdo_append_argument <- function(rdo, argname, description = NA, indent = " ", create=FALSE){ if(is.na(description)) description <- "~~ TODO: describe this argument. ~~" if(length(description) == 1 && length(argname) > 1) description <- rep(description, length(argname)) wrk1 <- lapply(1:length(argname), function(i) list(indent, Rdo_item(argname[i], description[i]), Rdo_newline()) ) wrk <- Rdo_macro( do.call("c", wrk1), "\\arguments") Rdo_modify(rdo, wrk, create=TRUE) } # Rd section \usage # todo: get_usage_text can be generalised to any Rd section but it is better to use a # different approach since print.Rd() does not take care for some details (escaping # %, for example). Also, the functions that use this one assume that it returns R # code which may not be the case if the usage section contains Rd comments. # get_usage_text("../gbRd/man/Rd_title.Rd") get_usage_text <- function(rdo){ # ut <- get_usage_text("../gbRd/man/Rd_fun.Rd") if(is.character(rdo) && length(rdo)==1) rdo <- permissive_parse_Rd(rdo) # Alternatives: pos <- .locate_sec_content(rdo, "\\usage") # wrk <- Rdo_section(rdo, "\\usage") # wrk <- tools:::.Rd_get_section(rdo, "usage") # todo: maybe the following 3 lines would be more generally useful? #2012-10-04 drop comments and specials rdo_u <- toolsdotdotdot.Rd_drop_nodes_with_tags(rdo[[pos]], c("COMMENT","\\special")) wrk <- structure(rdo_u, Rd_tag = "Rd") class(wrk) <- "Rd" paste(capture.output(print(wrk)), collapse="\n") } Rdo_show <- function(rdo){ # 2012-09-22 renamed, was Rd_show outfile <- tempfile(fileext = ".txt") file.show(Rd2txt(rdo, outfile)) unlink(outfile) invisible(NULL) } Rdo_reparse <- function(rdo){ outfile <- tempfile(fileext = "Rd") Rdo2Rdf(rdo, file = outfile) rdo <- permissive_parse_Rd(outfile) unlink(outfile) rdo } Rdo_collect_aliases <- function(rdo){ pos <- Rdo_locate(rdo, function(x) .tag_eq(x,"\\alias"), lists=TRUE) res <- sapply(pos, function(x) as.character(rdo[[ x ]])) nams <- sapply(pos, function(x){ if( length(x) == 1) "" else # 2012-10-13 as.character(rdo[[ c(x[1:(length(x)-2)],1) ]]) as.character(rdo[[ c(x[seq_len(length(x)-2)],1) ]]) }) names(res) <- gsub("[ \n]" , "", nams) res } # 2013-12-02 derived from Rdo_collect_aliases() Rdo_collect_metadata <- function(rdo, sec){ #sec is "alias", "keyword" or similar simple one secname <- paste0("\\", sec) pos <- Rdo_locate(rdo, function(x) .tag_eq(x, secname), lists=TRUE) res <- sapply(pos, function(x) as.character(rdo[[ x ]])) nams <- sapply(pos, function(x){ if( length(x) == 1) "" else # 2012-10-13 as.character(rdo[[ c(x[1:(length(x)-2)],1) ]]) as.character(rdo[[ c(x[seq_len(length(x)-2)],1) ]]) }) names(res) <- gsub("[ \n]" , "", nams) res } Rdo_fetch <- function(Rd_name = character(0), package, dir = ".", installed = TRUE){ db <- if(missing(package)){ tools::Rd_db(dir = dir) }else{ if(installed) # use lib.loc to avoid highjacking by devtools tools::Rd_db(package, lib.loc = .libPaths()) else{ # d <- find.package(package) if(dir.exists(file.path(d, "man"))) # in source directory tools::Rd_db(dir = d) else # installation directory tools::Rd_db(package) } } if(length(Rd_name) == 1) db[[paste0(Rd_name, ".Rd")]] else if(length(Rd_name) == 0) db else db[paste0(Rd_name, ".Rd")] } Rdpack/R/zzobsolete.R0000644000176200001440000003422013501141722014177 0ustar liggesusers# 2013-12-08 removed. # The name of the function (with this implementation) is misleading # since other "locate" functions look recurisvely. # # Rdo_locate_predefined_section <- function(rdo, sec){ # 2013-03-29 # Rdo_which_tag_eq(rdo, sec) # } # ## > tools:::RdTags # toolsdotdotdotRdTags <- # function (Rd) # { # res <- sapply(Rd, attr, "Rd_tag") # if (!length(res)) # res <- character() # res # } # removed: 2013-12-01 # .aux_Rdo_locate_leaves2 <- function(x, i){ #new: 2013-11-28 # # if(is.logical(x)){ # if(isTRUE(x)) # i # else # FALSE # }else if(is.list(x) && length(x)==0){ # :TODO: 2013-11-28 VERY dangewroug change! # # arguments section: has list() with Rd_Tag = "\dots" # i # consider the empty list a leave! # # }else{ # here x is a list of integer vectors # lapply(x, function(x){ c(i,x)}) # } # } # # Rdo_locate_leaves2 <- function(object, f = function(x) TRUE){ # fxx <- function(x){ # if(is.character(x)){ # return(f(x)) # evaluate `f' for this leaf # }else if(is.list(x)){ # if(length(x)==0) # list() # return(x) # wrk <- lapply(x, fxx) # for(i in seq_along(wrk)) # wrk[[i]] <- .aux_Rdo_locate_leaves2(wrk[[i]], i) # indx <- sapply(wrk, function(y) !identical(y,FALSE) ) # wrk <- wrk[indx] # for(i in seq_along(wrk)) # 2013-11-28 :TODO: krapka!!! # if(is.list(wrk[[i]]) && length(wrk[[i]])==0){ # va <- attr(wrk[[i]], "Rd_tag") # if(!is.null(va)) # wrk[[i]] <- attr(wrk[[i]], "Rd_tag") # } # # wrk <- do.call("c",wrk) # return(wrk) # }else{ # return(FALSE) # todo: replace this with a function and additional argument # } # } # # fxx(object) # } # removed: 2013-12-01 # .locate_item_label <- function(rdo, pos){#find the position of the label of the specified item # # 2013-11-28 "\\dots" in "\\ arguments": Rdo_locate_leaves(rdo[[pos]])[[1]] # # 2013-12-01 was: Rdo_locate_leaves2(rdo[[pos]])[[1]] # # this function became redundant after starting to use .ascharRd() # 1 # } ### 2013-04-09 macham fromgbRd.R - izglezhda nisto ne se izpolzva veche. ####### begin file fromgbRd.R # strRd <- function(rdo, indent = "\t", verbose_blanks = FALSE, omit_blanks = FALSE){ # n <- length(rdo) # if(n==0) # return("Empty list") # # tags <- tools:::RdTags(rdo) # # res <- character(0) # for(i in 1:n){ # if(is.list(rdo[[i]])){ # wrk <- Recall(rdo[[i]], indent = indent # , verbose_blanks = verbose_blanks # , omit_blanks = omit_blanks # ) # res <- c(res, tags[i], paste(indent, wrk, sep="") ) # # if(is.null(tags[[i]])) browser() # }else{ # wrk <- if(is.null(tags[[i]])){ "_ No Rd_tag" # }else if(length(rdo[[i]])==1 && rdo[[i]] == "\n"){ # note: new lines are # if(omit_blanks) NULL # not only in "TEXT" # else if(verbose_blanks) "NEWLINE:" # else rdo[[i]] # }else if( length(grep("^[[:space:]]+$", rdo[[i]])) == 1 ){ # if(omit_blanks) NULL # else if(verbose_blanks) paste("BLANK:", rdo[[i]]) # else rdo[[i]] # }else paste("", rdo[[i]]) # # if(!is.null(wrk)) # res <- c(res, paste(tags[i], ":", wrk, sep="")) # } # } # res # } # # compare_attributes <- function(x,y, nams){ # todo: not tested # xattr <- attributes(x) # yattr <- attributes(y) # if(identical(xattr,yattr)) # is this comparison meaningful? # return(TRUE) # # if(missing(nams)) # nams <- unique(c(names(xattr), names(yattr))) # # tbl <- matrix(NA, ncol = 3, nrow = length(nams)) # rownames(tbl) <- nams # colnames(tbl) <- c("x","y", "compare") # tbl[,1] <- nams %in% names(xattr) # tbl[,2] <- nams %in% names(yattr) # # tbl[,3] <- sapply(nams, function(x) if(tbl[x,1] && tbl[x,2]) # identical(xattr[[x]], yattr[[x]]) # else FALSE) # structure(FALSE, details = tbl) # } # # .compareRdo_elem <- function(xrdo, yrdo){ # list( list(xrdo, yrdo) ) # } # # .compareRdo_core <- function(xrdo, yrdo){ # if(identical(xrdo,yrdo)) # res <- return( structure(TRUE, Rd_tag = attr(xrdo,"Rd_tag")) ) # # if( is.character(xrdo) && is.character(yrdo)){ # if( xrdo == yrdo ) { # todo: ignoring attributes for now # res <- TRUE # attr(res,"Rd_tag") <- attr(xrdo,"Rd_tag") # }else # res <- .compareRdo_elem(xrdo, yrdo) # todo: refine! if both are non-lists # return(res) # the values may be the same, # } # and only the attributes different. # # if( !all(c(is.list(xrdo),is.list(yrdo))) ){ # res <- .compareRdo_elem(xrdo, yrdo) # todo: refine! if both are non-lists # return(res) # the values may be the same, # } # and only the attributes different. # # xrdo and yrdo are lists below # # xattr <- attributes(xrdo) # yattr <- attributes(yrdo) # same_attr <- identical( xattr, yattr) # # # if(!same_attr) browser() # # xn <- length(xrdo) # yn <- length(yrdo) # # # todo: zero xn or yn # # res <- vector(max(xn,yn), mode="list") # todo: better handling! # attr(res,"Rd_tag") <- attr(xrdo,"Rd_tag") # # attributes(res) <- attributes(xrdo) # if( identical(class(res),"Rd") ) # class(res) <- "cmpRd" # "list" # # attr(res, ".compare_attr") <- same_attr # todo: needs better handling. # # if(xn >= yn) xc <- yc <- 1:yn # else xc <- yc <- 1:xn # # if(xn == yn) xindmore <- yindmore <- integer(0) # else xindmore <- yindmore <- (min(xn,yn)+1) : max(xn,yn) # # for( i in seq_along(xc) ){ # res[[i]] <- Recall(xrdo[[ xc[i] ]], yrdo[[ yc[i] ]]) # } # # for( i in seq_along(xindmore) ){ # if(xindmore[i] > xn) # res[[i]] <- .compareRdo_elem( NA, yindmore[i]) # else if(yindmore[i] > yn) # res[[i]] <- .compareRdo_elem( xindmore[i], NA) # #else{ # this should not occur # # res[[i]] <- Recall(xrdo[[ xc[i] ]], yrdo[[ yc[i] ]]) # #} # } # # res # } # # # todo: obrabotka na blanks i new lines i pri sravnenieto (?) # # obrabotka na comments? # # !!! option da vrasta samo "leaves" koito ne sa ednakvi. # # !!! da pechata i indeksite (optional?) # # !!! obrabotka na attributes ( v momenta prosto gi sravnyava s identical) # # # strcmpRd <- function(rdo, indent = "\t", verbose_blanks = FALSE, omit_blanks = FALSE){ # n <- length(rdo) # if(n==0) # return("Empty list") # # tags <- tools:::RdTags(rdo) # note: tags is usually a character vector # if(is.list(tags)) # but it can be a list if some elements are NULL. # tags <- sapply(tags, # function(x){ # if(length(x)>1) stop("Tags must be of length 1.") # if(!is.null(x) && length(x)==0) # stop("Tags cannot be of length 0 (unless NULL.") # if(is.character(x)) return(x) # if(is.null(x) || # is.list(x) && length(x)==1 && is.null(x[[1]])) # return("NULLTAG") # x[[1]]}) # # if(!is.character(tags)){ # print("tags is not a character vector!") # browser() # } # # # tags[is.null(tags)] <- "None" # # tags[tags==""] <- "Ouch" # # if(n==1 && is.logical(rdo[[1]])){ # res <- rdo[[1]] # return(res) # } # # res <- character(0) # for(i in 1:n){ # if(is.list(rdo[[i]])){ # wrk <- Recall(rdo[[i]], indent = indent # , verbose_blanks = verbose_blanks # , omit_blanks = omit_blanks # ) # if(is.logical(wrk)) # res <- c(res, paste(if(is.null(tags[[i]])) "None1" else tags[[i]], # ":", wrk, sep="") ) # else # res <- c(res, tags[[i]], paste(indent, wrk, sep="") ) # # }else if(is.logical(rdo[[i]])){ # wrktag <- if(is.null(tags[[i]])) "None2" else tags[[i]] # res <- c(res, paste( wrktag, ":", rdo[[i]], sep="") ) # # }else if(is.character(rdo[[i]])){ # res <- c(res, tags[[i]], paste(indent, rdo[[i]], sep="") ) # # }else{ # res <- c(res, tags[[i]], paste(indent, rdo[[i]], sep="") ) # } # } # res # } # # print.cmpRd <- function(x,...){ # if(isTRUE(x)) # print(x) # else # cat(unlist(strcmpRd(x,...)), sep="\n") # invisible(x) # } ####### end file fromgbRd.R # # urdo - usage from Rdo file/object; # compare_sig1 <- function(urdo, ucur){ # ucur - generated from actual object # # # browser() # # 2011-11-12 commenting out as both should be quoted # # urdo$defaults <- gsub("\"","", urdo$defaults) # krapka; todo: elements may have embedded # # ucur$defaults <- gsub("\"","", ucur$defaults) # quotes; need to investigate where to put # status <- identical(urdo, ucur) # the blame happens # status # # # Note: commented out the rest since currently only the truth value is used. # # # # obj_removed <- is.null(ucur) || is.na(ucur) # # obj_added <- is.null(urdo) || is.na(urdo) # # # # if(obj_removed || obj_added) # # return( structure( status, details = list( obj_removed = obj_removed # # , obj_added = obj_added # # , rdo_usage = urdo # # , cur_usage = ucur # # )) ) # # # # identical_names <- urdo$name == ucur$name # # # # identical_argnames <- identical(urdo$argnames, ucur$argnames) # # identical_defaults <- identical(urdo$defaults, ucur$defaults) # # identical_formals <- identical_argnames & identical_defaults # # # # added_argnames <- ucur$argnames[ !(ucur$argnames %in% urdo$argnames) ] # # removed_argnames <- urdo$argnames[ !(urdo$argnames %in% ucur$argnames) ] # # # # # note: !!! intersect() is binary operation # # s <- intersect( intersect(names(urdo$argnames), names(ucur$argnames)), # # intersect(names(urdo$defaults), names(ucur$defaults)) ) # # # # unchanged_defaults <- urdo$defaults[ ucur$defaults[s] == urdo$defaults[s] ] # # # # names_unchanged_defaults <- names(unchanged_defaults)[unchanged_defaults] # # # # # todo: more details for the case when !identical, e.g. equal up to reordering, # # # added/removed defaults # # # # structure( status, details = list( identical_names = identical_names # # , obj_removed = obj_removed # # , obj_added = obj_added # # , identical_argnames = identical_argnames # # , identical_defaults = identical_defaults # # , identical_formals = identical_formals # # , added_argnames = added_argnames # # , removed_argnames = removed_argnames # # , names_unchanged_defaults = names_unchanged_defaults # # , rdo_usage = urdo # # , cur_usage = ucur # # )) # } # # note: todo: !!! is.pairlist(NULL) gives TRUE, so NULL indeed is a pairlist with zero elem. # # but inherits(NULL, "pairlist") gives FALSE # # # # this function is probably redundant and is called only by get_usage (and with one element, # # so the return in the first `if' below is invoked (todo: check and remove if so!) # pairlist2f_usage <- function(x, nams, S3class = "", S4sig = "", infix = FALSE, fu = TRUE, # verbose = TRUE){ # # 2012-09-27 !!! smenyam inherits(x, "pairlist") s is.pairlist # if(is.pairlist(x)){ # TRUE also when x is NULL # return(pairlist2f_usage1(x, name = if(missing(nams)) "fun_1" else nams, # S3class = S3class, S4sig=S4sig, infix = infix, fu = fu)) # } # if(missing(nams)) # nams <- names(x) # if(is.null(nams) && length(x) > 0){ # if(verbose) # cat("Argument 'x' is not named, supplying dummy function name(s).\n") # nams <- paste("fun_", seq_along(x), sep="") # } # # if(is.null(names(x))) # note: S3class below needs to have the same length as nams # names(x) <- nams # mapply("pairlist2f_usage1", x, nams, S3class, S4sig, infix, fu) # } Rdpack/R/Rdo2Rdf.R0000644000176200001440000002442113501141722013243 0ustar liggesusers # backslashes need to be escaped before braces # otherwise backslahes in \{ and \} may get escaped. .bs2 <- function(x) gsub("([\\]+)", "\\1\\1", x) # escape backslash (bs) .esc_br <- function(x) gsub("([{}])", "\\\\\\1", x) # escape {, } .bspercent <- function(x) gsub('([^\\%]?([\\][\\])*)%', '\\1\\\\%', x) # escape percents .anypercent <- function(x){ tag <- attr(x, "Rd_tag") if(is.null(tag) || tag != "COMMENT" ) .bspercent(x) # expects, correctly that `tag' does not disappear else # but see the comment above about usage with Rdapply. x } # this seems incomplete, since \v and \l should be doubled only in R strings when # in RCODE but in contexts where parse_Rd considers them (and other # escaped sequences) to be markup macros, they will be in the Rd_tag # attribute, not in the string. So, it seems that more complicated # processing is not needed. # 2012-10-14 dobavyam obrabotka na poveche ot edna cherta. Togava vsichki osven # poslednata tryabva da se udvoyat (may), a poslednata se udvoyava ako e # posledvana ot v, l ili kray na string. .escape_bs_in_Rcode <- function(rdo){ f <- function(x) if(grepl("\\\\", x)){ # if x contains any backslashes # before 2012-10-14: gsub("(\\\\+)(v|l)", "\\1\\1\\2", x) res <- x res <- gsub("(\\\\+)(\\\\)", "\\1\\1\\2", res) res <- gsub("(\\\\)(v|l)", "\\1\\1\\2", res) res <- gsub("(\\\\)$", "\\1\\1", res) res <- gsub("(\\\\)('|`|\")", "\\1\\1\\2", res) # browser() res }else x Rdtagapply(rdo, f, "RCODE") } # 2012-09-29 included srcref processing # todo: this function was patched many times, needs rewrite Rdo2Rdf <- function(rdo, deparse = FALSE, ex_restore = FALSE, file = NULL, rcode = TRUE, srcfile = NULL){ if(is.character(rdo)) # otherwise print(rdo) may go into infinite recursion rdo <- list(rdo) if(class(rdo) != "Rd") # to force using print.Rd() class(rdo) <- "Rd" if(is.character(srcfile)){ # remember which sections have not changed rdoorig <- permissive_parse_Rd(srcfile) unchanged_sec <- .rdo_equal_sections(rdo, rdoorig) } # browser() if(rcode){ rdo <- .escape_bs_in_Rcode(rdo) # this also does the examples }else if(ex_restore){ # 2012-09-27 promenyam da izpolzva .escape_bs_in_Rcode # There should be no more than one `examples' section in a proper Rd object # and no `NULL' Rd_tag's at the top level. Allow them here since `rdo' may # be an `Rd' piece, not a whole Rd object or fragment. In this way this # function can be used for intermediate transformations. Note though that # print.Rd used below to produce the text output may be more picky. indx <- Rdo_which_tag_eq(rdo, "\\examples") for(i in seq_along(indx)){ if(!is.null(indx[[i]])) rdo[[ indx[[i]] ]] <- .escape_bs_in_Rcode(rdo[[ indx[[i]] ]]) } } rdo <- Rdtagapply(rdo, .esc_br, "nonmathVERB") # escape \{, \} rdo <- Rdtagapply(rdo, .anypercent, "nonmath") # escape % # 2012-10-14 # rdo<-Rdtagapply(rdo, function(x) gsub("((^|[^\\])([\\][\\])*)[\\]$", "\\1\\\\\\\\", x), # "VERB") rdo <- Rdtagapply(rdo, function(x) gsub("(^|[^\\])(\\\\+)$", "\\1\\2\\2", x), "VERB") # pos_only = function(x){ res <- 1; browser(); res } pos_filecmd <- Rdo_locate(rdo, function(x) .tag_eq(x,"\\file"), lists = TRUE) for(pos in pos_filecmd) rdo[[pos]] <- Rdtagapply(rdo[[pos]], function(x) gsub("(\\\\)", "\\1\\1", x), "TEXT") # pos_filecmd <- Rdo_locate(rdo, function(x) .tag_eq(x,"\\samp"), lists = TRUE) # for(pos in pos_filecmd) # rdo[[pos]] <- Rdtagapply(rdo[[pos]], # function(x) gsub("(\\\\+)([^\\])", "\\1\\1\\2", x), # "VERB") # krapka, za nesta kato \code{\\} (see in base R: basename.Rd, body.Rd, Arithmetic.Rd) # 2012-10-14 promenyam tozi (cautious) variant, koyto samo udvoyava edna cherta # kogato sa necheten broy s variant koyto udvoyava vsichki v kraya na \code{} string. # todo: da ne go pravi v examples section (no tam to trudno ste se sluchi) # rdo <- Rdtagapply(rdo, function(x) gsub("((^|[^\\])([\\][\\])*)[\\]$", # "\\1\\\\\\\\", x), "RCODE") # 2012-10-14 otkomentiram, promenich v escape_bs po-gore. # rdo <- Rdtagapply(rdo, function(x) gsub("([\\]+)$", "\\1\\1", x), "RCODE") if(is.character(srcfile)){ # replace unchanged sections with dummy contents unchanged_titles <- sapply(unchanged_sec, function(x) x$title) rdo <- .replace_dummy(rdo, unchanged_titles) } # this was used for saving before introducing tfn, etc. # res <- capture.output(print(rdo, deparse = deparse), file = file) # as.character.Rd ima bug svarzana s newcommand i/ili argumentite # na href, vzh. naprimer which.min.Rd v base, tam as.character dava # \href{{http://CRAN.R-project.org/package=nnet}{\pkg{nnet}}} # (nay-vanshnite skobi {} sa izlishni). todo: tova e krapka! rdotxt <- paste0(as.character(rdo, deparse = deparse), collapse="") rdotxt <- gsub("\\\\href\\{(\\{[^{}]*\\}\\{[^}]*\\}+)\\}", "\\\\href\\1", rdotxt) # todo: krapka; \code{\{} becomes \code{{} which wrecks havoc for parse_Rd; \code{\}} rdotxt <- gsub("(\\\\code\\{)(\\{|\\})(\\})", "\\1\\\\\\2\\3", rdotxt) tfn <- tempfile() # use a temporary file in case file and srcfile are the same on.exit(unlink(tfn)) if(is.character(srcfile)){ # 2018-02-07 removed the following, since redundant (see above): # tfn <- tempfile() # 2018-02-07 (removed the assignment) was: # res <- capture.output(cat(rdotxt, sep = "", collapse = ""), # file = tfn)# writes to tfn # but res is re-assigned below without being used. # Also, dropping capture.output() and moving 'file =' to cat() cat(rdotxt, sep = "", collapse = "", file = tfn) rdocur <- permissive_parse_Rd(tfn) # to set srcref srcrefpos <- .srcrefpos(rdocur, rdoorig, unchanged_sec) rdotxt <- rdo_text_restore(rdocur, rdoorig, srcrefpos, file = tfn) nc_ind <- Rdo_which_tag_in(rdoorig, c("\\newcommand", "\\renewcommand")) if(length(nc_ind) > 0){ nclines <- sapply(nc_ind, function(x) as.character(attr(rdoorig[[x]],"srcref"))) rdotxt <- c(nclines, rdotxt) # put before anything else todo: could try to put at } # original place or at least after any comments? writeLines(rdotxt, tfn) #overwrites tfn res <- if(is.null(file)) paste0(rdotxt, collapse = "\n") else{ file.copy(tfn, file, overwrite = TRUE) # todo: check success NULL # for clarity; capture.output above set it to NULL as tfn is not NULL } }else ## 2012-10-14 res <- capture.output(cat(rdotxt, sep = "", collapse = ""), file = file) ## 2018-02-07 was: ## res <- capture.output(cat(rdotxt, sep = "", collapse = "", file = file)) ## restoring the syntax from 2012, since it works also in the case file = NULL; ## res <- capture.output(cat(rdotxt, sep = "", collapse = ""), file = file) if(is.null(file)) res else{ cat("\tThe Rd content was written to file ", file, "\n") invisible(res) # res is NULL here } } .tmp_pos <- function(name, pos_list){ for(elem in pos_list) if(elem$title == name) return(elem$pos) NULL } .rdo_srcref <- function(rdo, tag){ # todo: special cases! pos <- Rdo_which_tag_eq(rdo, tag) attr(rdo[[ pos[1] ]], "srcref") } .rdo_replace_at <- function(text, pospair){ newtext <- as.character(pospair[[2]]) m <- length(pospair[[1]]) beg_line <- pospair[[1]][1] beg_col <- if(m > 4) pospair[[1]][5] else pospair[[1]][2] end_line <- pospair[[1]][3] end_col <- if(m > 4) pospair[[1]][6] else pospair[[1]][4] res <- c(text[seq_len(beg_line - 1)], if(beg_col > 1) paste0(substr(text[beg_line], 1, beg_col - 1), newtext[1]) else newtext[1], newtext[-1] ) le <- nchar(text[end_line]) # 2012-10-13 was: length(text[end_line]) (!?) if(end_col < le) res[length(res)] <- paste0(res[length(res)], substr(text[end_line], end_col + 1, le)) c(res, text[-(1:end_line)]) } # 2012-10-13 dobavyam 'ends' po-dolu, sluchva se sections da ne zapochvat na nov red! # vzh. NumericConstants.Rd v base ( stava: \note{dummy} \seealso{dummy} ) rdo_text_restore <- function(cur, orig, pos_list, file){ res <- readLines(file) if(length(pos_list) == 1){ res <- .rdo_replace_at(res, pos_list[[1]]) }else{ starts <- sapply(pos_list, function(x) x[[1]][[1]]) ends <- sapply(pos_list, function(x) if(length(x[[1]]) > 4) x[[1]][5] else x[[1]][2] ) p <- order(starts, ends, decreasing = TRUE) dec_pos_list <- pos_list[p] for(pos in dec_pos_list) res <- .rdo_replace_at(res, pos) } res } .without_duplicates <- function(x){ x[!(x %in% unique(x[duplicated(x)]))] } Rdpack/R/inspect.R0000644000176200001440000002311313501141722013443 0ustar liggesusers.parse_long_name <- function(fnam){ # 2012-11-04 new, code from .capture_promptAny() namreg <- "^(.+)-([^-]+)$" if(grepl(namreg, fnam)){ # fnam is of the form xxxx-yyy (non-empty rhs) fname <- gsub(namreg, "\\1", fnam) type <- gsub(namreg, "\\2", fnam) # without "-" ## suffix <- gsub("^([^-]+)(-.*)", "\\2", fnam) # with "-" }else{ fname <- fnam type = "" } c(name = fname, type = type) } parse_Rdname <- function(rdo){ # 2012-10-01 todo: Rdpack-internal ste dade type="internal" # 2012-10-01 otkomentiram tova, to raboteshe vyarno po sluchaynost! # (ponezhe gsub() po-dolu go prevrasta v character()!) # nam <- rdo[[ which( tools:::RdTags(rdo) == "\\name" ) ]] ind <- Rdo_which_tag_eq(rdo, "\\name") nam <- c( rdo[[ c(ind, 1) ]]) # assumes length(ind) == 1 # 2012-11-04 changed with the code after the commented out section # # if(grepl("^([^-]+)-.*", nam)){ # nam is of the form xxxx-yyy # fname <- gsub("^([^-]+)-.*", "\\1", nam) # type <- gsub("^([^-]+)-(.*)", "\\2", nam) # suffix without the '-' # # suffix <- gsub("^([^-]+)(-.*)", "\\2", nam) # with the "-" # }else{ # fname <- nam # type = "" # } wrknam <- .parse_long_name(nam) fname <- wrknam["name"] type <- wrknam["type"] # malko kato krapka doctype <- Rdo_which_tag_eq(rdo, "\\docType") if(length(doctype) > 0 && type == "" ){ # todo: sravni s gornoto! type <- c( rdo[[ c(doctype[1],1) ]] ) # wrap n c() to remove attr. } list(fname = fname, type = type) } inspect_Rd <- function(rdo, package = NULL){ # rdo: Rd object or file name if(is.character(rdo) && length(rdo)==1) rdo <- permissive_parse_Rd(rdo) if(!inherits(rdo, "Rd") && is.null(attr(rdo,"Rd_Tag"))) return(structure(FALSE, details = "inspect_Rd: 1st arg. must be an Rd object or filename.")) type <- toolsdotdotdot.Rd_get_metadata(rdo,"docType") if(length(type) == 0){ type <- parse_Rdname(rdo)$type # todo: clean up if(!(type %in% c("package", ""))) # for now; there is, e.g. ts-methods which type <- "" # describes S3 methods. } switch(type, methods = inspect_Rdmethods(rdo, package = package), class = inspect_Rdclass(rdo), package = {cat("Currently reprompt for packages is not implemented.", "\tHowever, you could use the function promptPackageSexpr()", "\tto create a self-updating shell. 'promptPackageSexpr'", "\tis like 'promptPackage' but uses \\Sexpr commands rather", "\tthan strings for automatically generated information.", "Returning the Rd object unchanged.\n", sep = "\n") rdo }, data = {cat("Currently reprompt for data is not available.", "Returning the Rd object unchanged.\n", sep = "\n") rdo }, ## default inspect_Rdfun(rdo) ) } inspect_Rdclass <- function(rdo){ # rdo: Rd object cur <- inspect_slots(rdo) # methods: items have the form \item{fname}{signature}, ## 2018-08-27 - non-exiting class (TDO: check if it could be something else here ## TODO: think of a better way to handle this. if(inherits(cur, "try-error")){ cat(cur) return(rdo) } rdo <- inspect_clmethods(cur) # compare with those from promptClass rdo # todo: inspect other things too? } inspect_Rdmethods <- function(rdo, package = NULL){ # rdo: Rd object i_usage <- inspect_signatures(rdo, package = package) # i_usage$added_sig # i_usage$removed_sig if(i_usage$changed) cat("\tMethods in the documentation are not the same as the current ones.\n") # 2014-08-23 new 'if' to tell the user to removed the doc. of non-existen methods if(length(i_usage$removed_sig) > 0){ cat("\tMethods for the following signatures ", "where not found", if(is.null(package)) "" else paste0(" in package ", package) , ":\n", sep = "") for( sigus in i_usage$removed_sig){ txt <- paste(sigus$argnames, sigus$defaults, collapse = ",\t", sep = " = ") cat("\t ", txt, "\n") } # 2014-08-23 todo: maybe give a more cautious advice here? cat("\tPlease remove these from the documentation.\n\n") } if(length(i_usage$added_sig) > 0){ cat("\tAppending new signatures to section \"Methods\"\n") ## 2014-08-23 TODO: ## the code below now is executed only when length(i_usage$added_sig) > 0; ## before it was executed whenever i_usage$changed was TRUE. newsigs <- sapply(i_usage$added_sig, function(x) deparse_usage1(x)) wrk <- lapply(c(newsigs), Rdo_sigitem) # todo: slozhi blank line predi vseki item, names(wrk) <- NULL # no da ne e chast ot itemite, # a mezhdu tyach. idescr <- .locate_top_tag(rdo, "Methods") if(length(idescr) == 0){ # no descibe enviroment there. wrk <- Rdo_macro(wrk, "\\describe") idescr <- .locate_sec_content(rdo, "Methods") rdo[[idescr]] <- c(rdo[[idescr]], list(wrk)) }else rdo <- append_to_Rd_list(rdo, wrk, pos = idescr) } # 2012-09-07 new; not under the if above, # since aliases may be mismatched by manual editing (or otherwise) rdo <- update_aliases_tmp(rdo, package = package) # if "\\usage" section exists. if(length(Rdo_which_tag_eq(rdo, "\\usage")) > 0) rdo <- inspect_Rdfun(rdo, alias_update = FALSE) # alias_update was added to Rd_fun # to be used here rdo } # todo: more systematic messages about what has changed (or not) inspect_Rdfun <- function(rdo, alias_update = TRUE){ # rdo: Rd object i_usage <- inspect_usage(rdo) if(length(i_usage) == 0) # todo: processing of arguments may still be needed here return(rdo) i_args <- inspect_args(rdo, i_usage) # 2011-12-08 new; corresponding additions to compare_usage1 # 2012-10-05 slagam as.character, ponezhe nyakoi mozhe da sa ot class `name` # todo: make sure that they are character in the first place? aliases <- sapply(i_usage, function(x) as.character(attr(x, "details")$alias)) aliases <- aliases[aliases != ""] rdoaliases <- Rdo_collect_aliases(rdo) # 2012-10-05 promenyam za da otchitam #ifdef new_aliases <- aliases[ !(aliases %in% rdoaliases) ] if(alias_update && length(new_aliases) > 0) # update the aliases for(alias in unique(new_aliases)) rdo <- Rdo_insert(rdo, char2Rdpiece(alias, "alias")) flag_removed <- sapply(i_usage, function(x) attr(x, "details")$obj_removed) if(any(flag_removed)){ nams_removed <- sapply(i_usage, function(x) attr(x, "details")$rdo_usage$name) nams_removed <- nams_removed[flag_removed] obs_aliases <- nams_removed[ nams_removed %in% rdoaliases ] cat("The following objects are no longer described in this Rd object\n") cat("but it contains alias entries for them:\n") cat("\t", paste(obs_aliases), "\n") cat("You may wish to remove these \\alias{} entries from the Rd file.\n\n") } usage_changed <- !all( sapply(i_usage, identity)) # usage_changed <- TRUE # for testing if(usage_changed){ # update usage if changed f <- function(x){ a <- as.character(attr(x,"details")$cur_usage) parse_Rdtext(a, section = "\\usage") } u <- lapply(i_usage, f) u <- .Rdinter(u, before_first = TRUE) wrk <- structure(do.call("c", u), Rd_tag = "\\usage") rdo <- Rdo_replace_section(rdo, wrk) } # todo: Rdo_append_argument probably should check length(newargs)>0 anyway? if(!i_args){ # update arguments if changed newargs <- attr(i_args,"details")$added_argnames if(length(newargs)>0){ cat("\nnewargs is:", newargs, "\n") rdo <- Rdo_append_argument(rdo, newargs) } remargs <- attr(i_args,"details")$removed_argnames if(length(remargs)>0){ cat("Argument(s): ", remargs, "\n") cat("\tare no longer in any usage statements in this Rd object.\n") cat("Please remove the corresponding \\item's from section '\\arguments'.\n") cat("\n") } } rdo } Rdpack/R/alias.R0000644000176200001440000000176213501141722013075 0ustar liggesusers # todo: are aliases updated for classes? update_aliases_tmp <- function(rdo, package = NULL){#only for methods, currently; only appends fname <- .get.name_content(rdo)$short # name of the generic rdoaliases <- toolsdotdotdot.Rd_get_metadata(rdo, "alias") # aliases currently in rdo curtxt <- get_sig_text(rdo, package = package) # process signatures described in rdo ucur <- parse_usage_text(curtxt) methaliases <- sapply(ucur, function(x) .methsig2alias(fname, x$defaults)) new_aliases <- methaliases[ !(methaliases %in% rdoaliases) ] if(length(new_aliases) > 0) # update the aliases for(alias in new_aliases){ rdo <- Rdo_insert(rdo, char2Rdpiece(alias, "alias")) } rdo } .methsig2alias <- function(name, sig){ res <- gsub("\"", "", paste(c(name, sig), collapse=",")) paste(res, "-method", sep="") # no comma after the last arg } Rdpack/R/repromptAny.R0000644000176200001440000003143313501141722014322 0ustar liggesusers## 2018-02-07 new ereprompt <- function(..., edit = TRUE, filename = TRUE){ reprompt(..., filename = filename, edit = edit) } ## 2018-02-07 new argument `edit' reprompt <- function(object, infile = NULL, Rdtext = NULL, final = TRUE, type = NULL, package = NULL, methods = NULL, # for the call to promptMethods verbose = TRUE, filename = NULL, sec_copy = TRUE, edit = FALSE, ...){ objmis <- missing(object) tidyflag <- from_infile <- FALSE # If 'object' is a string ending in ".Rd" and containing # at least one "/", it is taken to be "infile"; a # (somewhat dubious) convenience feature for the common # mistake of omitting the name of the "infile" argument. if(is.null(infile) && length(object) == 1 && is.character(object) && grepl("/.*[.][Rr]d$", object) ) infile <- object if(!is.null(Rdtext)){ # process Rdtext, if present if(is.null(infile)){ infile <- tempfile() cat(Rdtext, file = infile, sep = "\n") # save parsed Rdtext to 'infile' on.exit(unlink(infile)) }else cat("both 'infile' and 'Rdtext' are given, ignoring Rdtext\n") } if(!objmis && inherits(object, "Rd")){ if(verbose) cat("Processing the Rd object...\n") if(!is.null(infile)) cat("ignoring 'infile' and/or 'Rdtext' since 'object' is of class 'Rd'\n") rdo <- object }else if(!is.null(infile)){ if(verbose) cat("\nParsing the Rd documentation in file", infile, "...\n") else cat("\n", basename(infile), ": ") if(!file.exists(infile)){ # 2018-02-07 new wrk <- try(rprojroot::find_root_file("man", basename(infile), criterion = rprojroot::is_r_package), silent = TRUE) if(inherits(wrk, "try-error")) stop("Input file ", infile, " not found") else infile <- wrk } rdo <- permissive_parse_Rd(infile) from_infile <- TRUE }else{ if(verbose) cat("Rd source not supplied, looking for installed documentation.\n") fnam <- if(is.character(object)) object else deparse(substitute(object)) rdo <- .capture_installed_help(fnam, type = type, package=package) if(inherits(rdo,"try-error")) cat("Rd source not supplied and installed documentation not found.\n") else{ if(verbose) cat("Installed documentation found, processing it...\n") rdo <- .order_sections(rdo) # the sections may not be in canonical order in tidyflag <- TRUE # instaled help } } if(inherits(rdo, "Rd")){ # do the main job: inspect the documentation object res <- inspect_Rd(rdo, package = package) }else{ # documentation not found, try to generate fresh one if(verbose) cat("Trying a 'prompt' function to generate documentation for the object.\n") # 2012-11-04 arg. type, package res <- .capture_promptAny(fnam, type = type, package = package, final = final, methods = methods) if(inherits(res,"try-error")) stop("unsuccessful attempt to create Rd doc. using a 'prompt' function.") else if (verbose) cat("\tsuccess: documentation generated using a 'prompt' function.\n") } if(tidyflag) res <- .Rd_tidy(res) # tidy() could do more, if(is.null(filename)){ # generate appropriate file name; todo: may need some mangling? filename <- if(is.null(infile)) paste(res[[ Rdo_which_tag_eq(res, "\\name") ]], ".Rd", sep="") else basename(infile) # do not overwrite unless in the current dir }else if(isTRUE(filename)){ # 2018-02-07 new filename <- if(is.null(infile)) paste(res[[ Rdo_which_tag_eq(res, "\\name") ]], ".Rd", sep="") else infile # will overwrite } # todo: error checking if(is.character(filename) || identical(filename, FALSE)){ # convert to Rdtext res <- Rdo2Rdf(res, ex_restore = TRUE, file = if(is.character(filename)) filename else NULL, srcfile = if(from_infile && sec_copy) infile else NULL ) if(is.character(filename)) res <- invisible(filename) # return only the file name in this case } if(edit && is.character(filename)){ ## 2018-02-07 new argument `edit' file.edit(res) # TODO: check that it is a filename res }else res } # (promptMethods) todo: filename = FALSE is a useful # alternative. In that case the text is returned in a named list # containing one element for each Rd section (multiple occurences # of sections like '\alias' are grouped together. # 2012-11-04 new arg. type, package .capture_promptAny <- function(fnam, type, package, final, ..., methods){ # 2012-11-04 promenyam za da raboti is replacement methods, e.g. "[<--methods" # # if(grepl("^([^-]+)-.*", fnam)){ # fnam is of the form xxxx-yyy # fname <- gsub("^([^-]+)-.*", "\\1", fnam) # type <- gsub("^([^-]+)-(.*)", "\\2", fnam) # without "-" # ## suffix <- gsub("^([^-]+)(-.*)", "\\2", fnam) # with "-" # }else{ # fname <- fnam # type = "" # } # 2012-11-04 replacing with the code after the comments # # namreg <- "^(.+)-([^-]+)$" # if(grepl(namreg, fnam)){ # fnam is of the form xxxx-yyy (non-empty rhs) # fname <- gsub(namreg, "\\1", fnam) # namtype <- gsub(namreg, "\\2", fnam) # without "-" # ## suffix <- gsub("^([^-]+)(-.*)", "\\2", fnam) # with "-" # }else{ # fname <- fnam # namtype = "" # } wrknam <- .parse_long_name(fnam) fname <- wrknam["name"] namtype <- wrknam["type"] if(missing(type) || is.null(type)) type <- namtype else if(namtype != "" && !identical(type, namtype)){ cat("The name and type arguments give conflicting 'type' information.\n") cat("\tUsing argument 'type'.\n") }# else 'type' has the value needed. ## 2019-04-26 print a message since otherwise the error is not clear, ## e.g. if the call has 'type = class' (note: no quotes around class) if(!is.character(type) || length(type) != 1L) print("!!! if not missing, 'type' must be a character string") wrk <- try(switch(type, methods = { if(is.null(methods) && !is.null(package)) methods <- findMethods(fname, where = asNamespace(package)) if(is.null(methods)) promptMethods(f=fname, filename = NA) else promptMethods(f=fname, filename = NA, methods=methods) }, class = promptClass(clName=fname, filename = NA), package = promptPackageSexpr(fname, filename = NA), ## default # v tozi variant ima problemi za funktsii ot Rdpack, za koito parviyat # "if" dava TRUE i sled tova stava greshka. Za funktsii ot drugi paketi # tova ne e problem, ponezhe za tyach "if"-at dava FALSE, ako sa # nevidimi. # # Tay kato tazi situatsiya mozhe da vaznikne po razlichni nachini, # promenyam koda. Tryabva oste rabota za sluchaya kogato ima poveche ot # edno ime... ### if(exists(fname, envir = parent.frame())){ ### prompt(object=fname, filename = NA, force.function=TRUE, ...) ### }else{ # todo: needs more work here ### x0 <- do.call(getAnywhere,list(fname)) ### browser() ### prompt(object=x0$objs[[1]], filename = NA, force.function=TRUE, ### name = fname, ...) ### } { wrk0 <- try(prompt(name=fname, filename = NA, ...), silent=TRUE) if(inherits(wrk0,"try-error")){ x0 <- do.call(getAnywhere,list(fname)) wrk0 <- prompt(object=x0$objs[[1]], filename=NA, name = fname, # force.function=TRUE, ...) } wrk0 # todo: needs more work here. IN particular, there should be a # package argument to avoid taking blindly whatever comes up. } ) , silent = TRUE) if(inherits(wrk,"try-error")) res <- wrk else{ res <- .parse_Rdlines(wrk) # if successful, res is not inspected here # since it is generated from the actual definitions. if(final && type != "package"){ # put dummy title and description # to avoid errors when installing a package wrk <- char2Rdpiece("~~ Dummy title ~~", "title") res <- Rdo_replace_section(res, wrk) wrk <- char2Rdpiece("~~ Dummy description ~~", "description") res <- Rdo_replace_section(res, wrk) # tidy a bit, e.g. to start each section on new line, # which may not be the case for installed documentation res <- .Rd_tidy(res) # tidy() could do more; e.g. reorder sections } } res } .capture_installed_help <- function(fnam, type = NULL, package = NULL, suffix = NULL){ # this does not work, package seems not evaluated or deparsed # hlp <- help(paste(fnam, "-methods", sep=""), package=package) # TODO: the last example in "help()" amy be helpful here. # namreg <- "^(.+)-([^-]+)$" # 2012-11-04 new namreg and related fullname <- if(grepl(namreg, fnam)) # fnam is of the form xxxx-yyy fnam else if(!is.null(type) && is.character(type) && type!="") paste(fnam, "-", type, sep="") else if(!is.null(suffix)) paste(fnam, suffix, sep="") else fnam hlp <- help(fullname) # todo: more care! hlpfile <- as.vector(hlp) # removes attributes # todo: but may be of length > 1, e.g. for "initialize" # cat("hlpfile has ", length(hlpfile), " element(s):\n") # print(hlpfile) if(!is.null(package)){ # try first "/package/" to avoid surprise matches; # see what happens with package = "methods", without the slashes; # also, 'package' may be part of the name of another package. indx <- which( grepl(paste("/", package, "/", sep=""), hlpfile)) if(length(indx)==0) # ... but if nothing matched, try without the slashes. indx <- which(grepl(package, hlpfile)) hlpfile <- hlpfile[ indx ] } if(length(hlpfile) > 1){ # todo: mozhe da se napravi v loop to collect a bunch of sig's hlpfile <- hlpfile[1] cat("length(hlpfile)>1, taking the first element.\n") } try(utilsdotdotdot.getHelpFile(hlpfile), silent=TRUE) } # 'usage' may be an "f_usage" object obtained e.g. by a # previous call to get_usage() or generated programmatically. promptUsage <- function (..., usage){ # todo: add formatting options? if(missing(usage)) get_usage(..., out.format="text") else as.character(usage) } Rdpack/R/runexamples.R0000644000176200001440000001420113501141722014337 0ustar liggesusers .comment <- function(x){ x invisible(NULL) } ## see also > utils::example run_examples <- function(excontent, # package = NULL, lib.loc = NULL, character.only = FALSE, give.lines = FALSE, local, # in utils::example() it is: local = FALSE, echo = TRUE, verbose = getOption("verbose"), setRNG = FALSE, ask = FALSE, # in utils::example() it is: getOption("example.ask"), ## prompt.prefix = "Rdpack" # in utils::example() it is: abbreviate(topic, 6), prompt.echo = "Rdpack> ", continue.echo = prompt.echo, run.dontrun = FALSE, run.donttest = FALSE, # in utils::example() it is: interactive() Rdsection = "examples", escape = TRUE ){ ## set the environment where source() evaluates the code; ## 2018-08-13 todo: it is not clear if this is the best choice; ## maybe could pass an environment from the macro \printExample, similarly ## to the citation macros (but first need to check if the cause is the choice ## made here: if(missing(local)) local <- parent.frame() # dontshow <- function(x){ # x # } # saveRDS(excontent, "excontent.RDS") excontent <- deparse(excontent) excontent <- gsub("^[ ]*\\{", "", excontent) excontent <- gsub("\\}[ ]*$", "", excontent) excontent <- gsub(paste0("^[ ]*", ".comment", "[ ]*\\(\"(.*)\"\\)[ ]*$"), "\\1", excontent) ## if(interactive()) ## browser() # file <- tempfile(fileext = ".Rd") tf <- tempfile("Rex") ## tools::Rd2ex(.getHelpFile(file), tf, commentDontrun = !run.dontrun, ## commentDonttest = !run.donttest) writeLines(excontent, tf) ## if (!file.exists(tf)) { ## if (give.lines) ## return(character()) ## warning(gettextf("%s has a help file but no examples", ## sQuote(topic)), domain = NA) ## return(invisible()) ## } on.exit(unlink(tf)) ## if (give.lines) ## return(readLines(tf)) ## if (pkgname != "base") ## library(pkgname, lib.loc = lib, character.only = TRUE) if (!is.logical(setRNG) || setRNG) { if ((exists(".Random.seed", envir = .GlobalEnv))) { oldSeed <- get(".Random.seed", envir = .GlobalEnv) on.exit(assign(".Random.seed", oldSeed, envir = .GlobalEnv), add = TRUE) } else { oldRNG <- RNGkind() on.exit(RNGkind(oldRNG[1L], oldRNG[2L]), add = TRUE) } if (is.logical(setRNG)) { RNGkind("default", "default") set.seed(1) } else eval(setRNG) } zz <- readLines(tf, n = 1L) skips <- 0L ## if (echo) { ## zcon <- file(tf, open = "rt") ## while (length(zz) && !length(grep("^### \\*\\*", zz))) { ## skips <- skips + 1L ## zz <- readLines(zcon, n = 1L) ## } ## close(zcon) ## } if (ask == "default") ask <- echo && grDevices::dev.interactive(orNone = TRUE) if (ask) { if (.Device != "null device") { oldask <- grDevices::devAskNewPage(ask = TRUE) if (!oldask) on.exit(grDevices::devAskNewPage(oldask), add = TRUE) } op <- options(device.ask.default = TRUE) on.exit(options(op), add = TRUE) } wrk <- capture.output( source(tf, local, echo = echo, prompt.echo = prompt.echo, # paste0(prompt.prefix, getOption("prompt")), continue.echo = continue.echo, # paste0(prompt.prefix, getOption("continue")), spaced = FALSE, # do not print empty line before each source line verbose = verbose, max.deparse.length = Inf, encoding = "UTF-8", skip.echo = skips, keep.source = TRUE) ) # \Sexpr[stage=build,results=rd]{ # paste0("\\\\examples{", { # pf <- "Rdpack" # tmp <- capture.output(utils::example("ES", prompt.prefix = pf)) # flags <- grepl("Rdpack> ", tmp) # tmp[!flags] <- paste0("#> ", tmp[!flags]) # tmp <- gsub("Rdpack> ", "", tmp) # res <- paste0(tmp, collapse = "\n") # }, "}", collapse = "\n")} # browser() flags <- grepl(paste0("^", prompt.echo), wrk) outflags <- !flags & !grepl("^[ ]*$", wrk) wrk[outflags] <- paste0("##: ", wrk[outflags]) wrk <- gsub(paste0("^", prompt.echo, "[ ]*"), "", wrk) ## wrk <- gsub(paste0("^[ ]*", "identity", "[ ]*\\(\"(.*)\"\\)[ ]*$"), "\\1", wrk) wrk <- gsub("^## *$", "", wrk) res <- paste0(paste0(wrk, collapse = "\n"), "\n") if(escape) # 2018-08-25 res <- .bspercent(res) ## TODO: prefix with spaces to indent from surrounding text? if(is.character(Rdsection)){ res <- paste0("\\", Rdsection, "{", res, "}\n") } # if(interactive()) # browser() res } ## cat(Rdpack:::run_examples(quote({2+2 ## ## trig ## sin(pi)}))) ## ## withAutoprint(quote({2+2 ## ## trig ## sin(pi)})) ## ## e1 <- ## (quote({2+2 ## ## trig ## sin(pi)})) ## ## attr(e1, "wholeSrcref") ## ## ## e2 <- ## quote({2+2 ## ## trig ## sin(pi)}) ## ## attr(e2, "wholeSrcref") ## ## e2a <- ## quote({2+2 ## sin(pi)}) ## ## attr(e2a, "wholeSrcref") ## ## unclass(attr(e2a, "wholeSrcref")) ## ## e3 <- ## quote(2+2) ## ## attr(e3, "wholeSrcref") ## Rdpack:::run_examples(quote({cvar::VaR(qnorm, x = c(0.01, 0.05), dist.type = "qf"); 2*3; 2 + 2; a <- 2 - 2; b <- 2/3 })) insert_fig <- function(file, package, code, insert = TRUE){ dirs <- c("./man/", file.path(".", package, "man")) w <- sapply(dirs, dir.exists) dcur <- dirs[w] figpath <- file.path(dcur, "figures") if(!dir.exists(figpath)) dir.create(figpath) png(file.path(figpath, file)) ## plot(cars) force(code) dev.off() if(insert) paste0("\\figure{", file, "}") else file } Rdpack/R/f_usage.R0000644000176200001440000001434013501141722013411 0ustar liggesusersparse_pairlist <- function(x){ is.missing.arg <- function(arg) typeof(arg) == "symbol" && deparse(arg) == "" # x == NULL corresponds to functions with no arguments (also # length(NULL) is 0) also, NULL is a pairlist with length 0. # Is this function used with x other than pairlist? if(is.null(x) || length(x) == 0) # If not, the test of length(x) is redundant. return(list(argnames = character(0), defaults = character(0))) nonmis <- x[ !sapply(x, is.missing.arg) ] wrk <- character(length(nonmis)) names(wrk) <- names(nonmis) for(s in names(nonmis)){ wrk[[s]] <- paste(deparse(nonmis[[s]], backtick = TRUE, width.cutoff = 500L) , collapse = "\n") } list(argnames = names(x), defaults = wrk ) } # 2012-10-03 new arg. infix pairlist2f_usage1 <- function(x, name, S3class = "", S4sig = "", infix = FALSE, fu = TRUE){ structure(c(list(name=name, S3class=S3class, S4sig=S4sig, infix=infix, fu = fu), parse_pairlist(x)), class="f_usage") } print.f_usage <- function(x, ...){ tab <- max(nchar(names(x))) for(nam in names(x)){ if(is.null(nam)) next if(nam != "defaults") cat(nam, strrep(" ", tab - nchar(nam)), "=", x[[nam]], "\n") else{ defnams <- names(x$defaults) for(i in seq_along(defnams)){ if(i == 1) cat(nam, strrep(" ", tab - nchar(nam[i])), ":", defnams[i], "=", x$defaults[i], "\n") else cat(strrep(" ", tab + 3), defnams[i] , "=", x$defaults[i], "\n") } } } cat("\n") } format_funusage <- function(x, name = "", width = 72, realname){ res <- paste(name, "(", paste(x, collapse = ", "), ")", sep="") if(is.numeric(width) && nchar(res, type="width") > width){ delim <- c("(", rep(", ", length(x) - 1), ")") wrk <- paste(c(name, x), delim, sep="") lens <- nchar(wrk, type="width") if(!missing(realname)) lens[1] <- nchar(realname, type="width") + 1 indent <- paste(rep(" ", lens[1]), collapse="") res <- character(0) curlen <- 0 for(i in seq_along(wrk)){ if(curlen + lens[i] > width){ res <- paste(res, "\n", indent, sep="") curlen <- lens[1] # = number of chars in `indent' } res <- paste(res, wrk[i], sep="") curlen <- curlen + lens[i] } } res } deparse_usage1 <- function(x, width = 72){ if(!x$fu) # a variable, not function return( structure( x$name, names = x$name ) ) # todo: maybe x$name tryabva da e character, as.character here should not be needed. if(as.character(x$name) %in% c("[","[[", "$", "@", "[<-", "[[<-", "$<-", "@<-", "!")) "dummy" else if(x$infix){ # infix operator if(grepl(".+<-$", x$name)){ # name end is "<-" but is not equal to it name2 <- sub("^(.+)<-$", "\\1", x$name) m <- length(x$argnames) res <- paste(name2, "(", paste(x$argnames[-m], collapse=", "), ")", "<-", x$argnames[m]) }else # todo: make sure that the name is not in quotes! res <- paste(x$argnames, collapse = paste0(" ", x$name, " ")) return(res) } res <- x$argnames names(res) <- x$argnames nams <- names(x$defaults) res[nams] <- paste(res[nams], "=", x$defaults) assop <- grepl(".+<-$", x$name) # name end is "<-" but is not equal to it name <- x$name if(assop){ name <- sub("<-$", "", x$name) value <- res[length(res)] res <- res[-length(res)] } res <- if(!identical(x$S3class, "")) format_funusage(res, paste("\\method{", name, "}{", x$S3class, "}", sep=""), realname = name ) else if(!identical(x$S4sig, "")) format_funusage(res, paste("\\S4method{", name, "}{", paste0(x$S4sig, collapse = ", "), "}", sep=""), realname = name ) else switch(name, "$" =, "@" = paste0(res[1], name, res[2]), "[" =, "[[" = paste0(res[1], name, paste0(res[-1], collapse = ", "), .closeOp[name]), "!" = paste0("!", res[1]), ## default format_funusage(res, name) ) if(assop) # if assignment, add to the last line, usually the only one res[length(res)] <- paste0(res[length(res)], " <- ", value) # "[<-" = paste0(res[1], "[", paste0(res[c(-1,-length(res))], # collapse = ", "), "]", " <- ", res[length(res)]), # "[[<-" = paste0(res[1], "[[", paste0(res[c(-1,-length(res))], # collapse = ", "), "]]", " <- ", res[length(res)]), # "$<-" = paste0(res[1], "$", res[2], " <- ", res[3]), # "@<-" = paste0(res[1], "@", res[2], " <- ", res[3]), res <- gsub("...", "\\dots", res, fixed=TRUE) structure( paste(res, collapse = ""), names=x$name ) } as.character.f_usage <- function(x,...){ deparse_usage1(x) } deparse_usage <- function (x){ if(class(x) == "f_usage") return(deparse_usage1(x)) nams <- names(x) if(!is.null(nams)) # remove names since sapply merges them with the names of names(x) <- NULL # the list obtained by lapply() res <- sapply(x, deparse_usage1) if(is.null(names(res))) # in most cases names(res) will be the same as nams names(res) <- nams # but give preference to the ones returned by # deparse_usage1 which takes names from the objects. # This `if' will hardly ever kick in... res } .closeOp <- list("[" = "]", "[[" = "]]", "(" = ")", "{" = "}") Rdpack/R/threedots.R0000644000176200001440000000424513501141722014004 0ustar liggesusers# > tools:::.strip_whitespace .strip_whitespace <- function (x) { x <- sub("^[[:space:]]+", "", x) x <- sub("[[:space:]]+$", "", x) x } ## tools:::.Rd_drop_nodes_with_tags, but tools:::RdTags(e) => Rdo_tags(e) toolsdotdotdot.Rd_drop_nodes_with_tags <- function (x, tags) { recurse <- function(e) { if (is.list(e)) structure(lapply(e[is.na(match(Rdo_tags(e), tags))], recurse), Rd_tag = attr(e, "Rd_tag")) else e } recurse(x) } ## > tools:::.Rd_get_metadata, but tools:::RdTags() => Rdo_tags() toolsdotdotdot.Rd_get_metadata <- function (x, kind) # e.g. kind = "keyword", see help page of Rd_db() { x <- x[Rdo_tags(x) == sprintf("\\%s", kind)] if (!length(x)) character() else unique(.strip_whitespace(sapply(x, as.character))) } ## > utils:::.getHelpFile utilsdotdotdot.getHelpFile <- function (file) { path <- dirname(file) dirpath <- dirname(path) if (!file.exists(dirpath)) stop(gettextf("invalid %s argument", sQuote("file")), domain = NA) pkgname <- basename(dirpath) RdDB <- file.path(path, pkgname) if (!file.exists(paste(RdDB, "rdx", sep = "."))) stop(gettextf("package %s exists but was not installed under R >= 2.10.0 so help cannot be accessed", sQuote(pkgname)), domain = NA) toolsdotdotdotfetchRdDB(RdDB, basename(file)) } ## > tools:::fetchRdDB toolsdotdotdotfetchRdDB <- function (filebase, key = NULL) { fun <- function(db) { vals <- db$vals vars <- db$vars datafile <- db$datafile compressed <- db$compressed envhook <- db$envhook fetch <- function(key) lazyLoadDBfetch(vals[key][[1L]], datafile, compressed, envhook) if (length(key)) { if (!key %in% vars) stop(gettextf("No help on %s found in RdDB %s", sQuote(key), sQuote(filebase)), domain = NA) fetch(key) } else { res <- lapply(vars, fetch) names(res) <- vars res } } res <- lazyLoadDBexec(filebase, fun) if (length(key)) res else invisible(res) } Rdpack/R/sections.R0000644000176200001440000001733213501141722013633 0ustar liggesusers.sec_name <- function(x){ # this assumes that x is a section Rd piece. a <- attr(x, "Rd_tag") #TODO: paste tuk e prapka, dobavi treti element! if(a != "\\section") a else paste(as.character(x[[1]]), collapse="") # 'as' is to drop attributes } .sec_content <- function(x){ # this assumes that x is a section Rd piece. a <- attr(x, "Rd_tag") if(a != "\\section") x else x[[2]] } .order_sections <- function(rdo){ # todo: take care of empty lines at top level. old <- Rdo_tags(rdo) n <- length(rdo) newpos <- numeric(n) curpos <- 1 for(i in 1:length(.rd_sections)){ ind <- which(old == .rd_sections[i]) len <- length(ind) if(len > 0){ newpos[curpos:(curpos+len-1)] <- ind curpos <- curpos + len } } if(curpos < n){ # note everything in "old" accounted for. Can there be things # other than newlines? missedpos <- seq_len(n)[ !(seq_len(n) %in% newpos) ] # browser() # for testing newpos[curpos:n] <- missedpos # to make sure that nothing is omitted } if(identical(newpos, seq_along(newpos))){ rdo # nothing to reshuffle here }else{ res <- rdo[newpos] attributes(res) <- attributes(rdo) res } } .replace_dummy <- function(rdo, unchanged_titles){ secall <- Rdo_sections(rdo) for(sec in secall) if(sec$title %in% unchanged_titles) rdo[[ sec$pos ]] <- char2Rdpiece("dummy", sub("^\\\\", "", sec$title), force.sec = TRUE) rdo } .srcrefpos <- function(rdo, rdoorig, pos_list){ secall <- Rdo_sections(rdo) res <- vector(mode="list", length(pos_list)) ind <- 0 for(sec in secall){ pos <- .tmp_pos(sec$title, pos_list) if(!is.null(pos)){ ind <- ind + 1 res[[ind]] <- list(attr(rdo[[sec$pos]], "srcref"), attr(rdoorig[[pos]], "srcref")) } } res } .replace_from <- function(rdo, rdoorig, pos_list){ secall <- Rdo_sections(rdo) for(sec in secall){ pos <- .tmp_pos(sec$title, pos_list) if(!is.null(pos)) rdo[[sec$pos]] <- rdoorig[[pos]] } rdo } Rdo_sections <- function(rdo){ res <- Rdo_locate(rdo, function(x) .tag_in(x, .rd_sections), .sec_name, lists = TRUE, nested = FALSE) # 2012-10-20 new arg. nested used lapply(res, function(x){ names(x)[names(x) == "value"] <- "title"; x}) } Rdo_modify_simple <- function(rdo, text, section, ...){ val <- char2Rdpiece(text, section) Rdo_modify(rdo, val, ...) } Rdo_empty_sections <- function(rdo, with_bs = FALSE){ # rdo is Rd object or filename if(is.character(rdo)) rdo <- permissive_parse_Rd(rdo) pat <- ".*Dropping empty section[ ]+[\\](.*)$" wrk <- checkRd(rdo) ind <- grepl(pat, wrk) res <- gsub(".*Dropping empty section[ ]+[\\]", "", wrk[ind]) if(with_bs) res <- sapply(res, function(x) paste("\\",x,sep="")) # prepend backslash res } Rdo_drop_empty <- function(rdo, sec = TRUE){ # todo: drop other empty things? emptysec <- Rdo_empty_sections(rdo, with_bs = TRUE) rdotags <- Rdo_tags(rdo) stopifnot(length(rdotags) == length(rdo)) # paranoic; but tools:::RdTags above is # non-exported function res <- rdo[ !(rdotags %in% emptysec) ] class(res) <- class(rdo) res } # rd is a character vector of filenames Rdo_replace_section <- function(rdo, val, create = FALSE, replace = TRUE){ Rdo_modify(rdo, val, create=create, replace = replace) } Rdo_set_section <- function(text, sec, file, ...){ piece <- char2Rdpiece(text, sec) rdo <- Rdo_replace_section(permissive_parse_Rd(file), piece, ...) Rdo2Rdf(rdo, file = file) } # todo: this does not consider the possibility for #ifdef # return the location (full index) of the content of a section. for # standard sections this is at the top level but for user defined # sections it is deeper. see also tools:::.Rd_get_section .locate_sec_content <- function(rdo, sec, onlyone = TRUE){ # 2011-12-12 add 'more' arg. tags <- Rdo_tags(rdo) indx_sec <- which(tags == sec) # in case this is a standard section, todo: do it properly! if(length(indx_sec) > 0){ # standard section if(length(indx_sec) > 1 && onlyone){ warning("More than one section with this name, using the first one.") indx_sec <- indx_sec[[1]] } res <- indx_sec # for standard sections the content is simply that tagged list. }else{ # user section; todo: arg. 'onlyone' silently ignored here indx_sec <- which(tags == "\\section") if(length(indx_sec) > 0 ){ # wraps in c() here to get rid of attributes; # note also the two 1's in the index (seems # that each arg of "\\section" is a list). methindx <- sapply(indx_sec, function(x) identical(c(rdo[[c(x,1,1)]]), sec) ) indx_sec <- indx_sec[methindx] # take only those that match. } if(length(indx_sec) == 0) res <- NA # stop("No section `??'. Todo: create it instead of throwing an error.") else{ if(length(indx_sec)>1){ warning("More than 1 sections `Methods' found, using the first one.") indx_sec <- indx_sec[1] } res <- c(indx_sec,2) # for user sections the content is deeper. } } res } .rdo_equal_sections <- function(rdo1, rdo2, sections = NULL){ # todo: arg. sections ne se # izpolzva veche! wrk1 <- Rdo_remove_srcref(rdo1) wrk2 <- Rdo_remove_srcref(rdo2) sec1 <- Rdo_sections(wrk1) sec2 <- Rdo_sections(wrk2) nams1 <- sapply(sec1, function(x) x$title) nams2 <- sapply(sec2, function(x) x$title) u1nam <- names(which(table(nams1) ==1)) # u1nam <- .without_duplicates(nams1) u2nam <- names(which(table(nams2) ==1)) # u2nam <- .without_duplicates(nams2) unam <- intersect(u1nam, u2nam) i1 <- which(nams1 %in% unam) # 2012-10-22 dobavyam all.equal, for some reason sometimes # seeemingly identical things are not "identical", # e.g. Special.Rd dava takova nesto za details. # todo: tova e krapka razibirase. isame <- sapply(i1, function(x){ i2 <- which(nams2 == nams1[x]); if(length(i2)==1 && ( identical(wrk1[[sec1[[x ]]$pos]], wrk2[[sec2[[i2]]$pos]]) || isTRUE(all.equal(wrk1[[sec1[[x ]]$pos]], wrk2[[sec2[[i2]]$pos]])) )) i2 else NA }) # browser() isame <- isame[!is.na(isame)] res <- sec2[isame] res } # tools:::.Rd_get_name # tools:::.Rd_deparse # # . function (x, sec) # get the Rd # { # x <- .Rd_get_section(x, "section") # if (length(x)) # .strip_whitespace(.Rd_deparse(x, tag = FALSE)) # else character() # } # list_files_with_exts("./man","Rd") # list_files_with_type("./man","docs") # Rdo_replace_section(a, char2Rdpiece("documentation", "keyword"), replace = "Rd") # files <- list_files_with_exts(dir, "Rd") Rdpack/R/predefined.R0000644000176200001440000000670213501141722014110 0ustar liggesusers.rd_sections <- # note: user defined sections are typeset before note, seealso, examples. c("\\name", "\\Rdversion", "\\docType", "\\alias", "\\encoding", "\\concept", "\\title", "\\description", "\\usage", "\\format", "\\source", "\\arguments", "\\details", "\\value", "\\references", "\\section", "\\note", "\\author", "\\seealso", "\\examples", "\\keyword") ## todo: "\\Sexpr", "\\Rdopts", "\\newcommand", "\\renewcommand" rdo_top_tags <- unique(c(.rd_sections, "#ifdef", "#ifndef", "\\newcommand", "\\renewcommand", "COMMENT", "TEXT" )) Rdo_piece_types <- c( name = "VERB" # sections , alias = "VERB" , concept = "TEXT" , docType = "TEXT" , title = "TEXT" , description = "TEXT" , examples = "RCODE" , usage = "RCODE" , Rdversion = "VERB" , synopsis = "VERB" , Sexpr = "RCODE" , RdOpts = "VERB" , code = "RCODE" # macros , dontshow = "RCODE" , donttest = "RCODE" , testonly = "RCODE" , dontrun = "VERB" , env = "VERB" , kbd = "VERB" , option = "VERB" , out = "VERB" , preformatted = "VERB" , samp = "VERB" , special = "VERB" , url = "VERB" , verb = "VERB" , deqn = "VERB" , eqn = "VERB" , renewcommand = "VERB" , newcommand = "VERB" ) # todo: not complete. Skaniray instalirana # dokumentatsiya za tezi raboti! Rdo_predefined_sections <- c( name = "VERB" , alias = "VERB" , concept = "TEXT" , docType = "TEXT" , title = "TEXT" , description = "TEXT" , examples = "RCODE" , usage = "RCODE" , Rdversion = "VERB" , synopsis = "VERB" , section = "TEXT" # not clear what to put for this element # (and the following) 2012-09-23 new entries below. (maybe # their absence was the reason for some strange behaviour of # char2Rdpiece). Slagam vsichkite "TEXT", no (todo:) tryabva da # se proveri. , arguments = "TEXT" , keyword = "TEXT" , note = "TEXT" , format = "TEXT" , source = "TEXT" , details = "TEXT" , value = "TEXT" , references = "TEXT" , author = "TEXT" , seealso = "TEXT" ) Rdpack/R/elements.R0000644000176200001440000001221013501141722013606 0ustar liggesusersRdo_newline <- function(){ structure("\n", Rd_tag = "TEXT") } Rdo_is_newline <- function(rdo){ is.character(rdo) && length(rdo) == 1 && rdo == "\n" } Rdo_comment <- function(x = "%%"){ structure(x, Rd_tag = "COMMENT") } Rdo_text <- function(x){ structure(x, Rd_tag = "TEXT") } # todo: check for % and \\ ? Rdo_verb <- function(x){ structure(x, Rd_tag = "VERB") } Rdo_Rcode <- function(x){ structure(x, Rd_tag = "RCODE") } Rdo_tag <- function(x, name){ structure(x, Rd_tag = name) } Rdo_macro <- function(x, name){ if(!is.character(x)) # the argument has been prepared in advance return(Rdo_tag(x,name)) # (bar the Rd_tag) cnt <- Rdo_text(x) if(name %in% c("\\eqn", "\\deqn")) # these are like two argument macros. cnt <- list(cnt) Rdo_macro1(cnt, name) } .Rdo_elem <- function(x){ if(is.null(attr(x, "Rd_tag"))){ if(is.character(x)) list(Rdo_text(x)) else x }else list(x) } Rdo_macro1 <- function(x, name){ structure(list(x), Rd_tag = name) } Rdo_macro2 <- function(x, y, name){ structure(list(.Rdo_elem(x), .Rdo_elem(y)), Rd_tag = name) } Rdo_item <- function(x,y){ Rdo_macro2(x, y, "\\item") } Rdo_sigitem <- function(x,y, newline=TRUE){ # todo: newline not currently used if(missing(y)) # default as in promptMethods() y <- list( Rdo_newline() , Rdo_comment("%% ~~describe this method here~~") , Rdo_newline() ) Rdo_item( list(Rdo_macro1(Rdo_Rcode(c(x)), "\\code")) # c(x) to remove attributes. , list(y, Rdo_newline()) ) # (todo: does it really do it?) } # as.vector() to remove name attr. Rdo_piecetag <- function(name) as.vector(Rdo_piece_types[name]) Rdo_sectype <- function(x) as.vector( Rdo_predefined_sections[x] ) is_Rdsecname <- function(name) name %in% names(Rdo_predefined_sections) # 2012-10-08 todo: wished to change it to # .rd_sections but those are with backslashes. # need to consolidate. .char2Rdtag <- function(content, name = NULL){ if(is.null(name) || name == "") return(Rdo_text(content)) tag <- Rdo_piecetag(name) if(is.na(tag)) tag <- "TEXT" # todo: check the content and mark it RawText if it contains % or \\ Rdo_tag(content, tag) } char2Rdpiece <- function(content, name, force.sec = FALSE){ content <- .char2Rdtag(content, name = name) if(!force.sec || is_Rdsecname(name)) Rdo_macro1(content, paste("\\", name, sep="")) else Rdo_macro2(Rdo_text(name), content, "\\section") #todo: dali name e "TEXT" tuk } list_Rd <- function(..., Rd_tag=NULL, Rd_class = FALSE){ dots <- list(...) nams <- allNames(dots) mflags <- grepl("^\\\\", nams) # LaTeX macros wrk <- mapply(function(x, i) if(mflags[i]) Rdo_macro(x, nams[i]) else x , dots, seq_along(dots), SIMPLIFY = FALSE, USE.NAMES=FALSE) # process other names - title, name, etc., not starting with backslash sflags <- grepl("^([^\\\\]|$)", nams) # other named elements, including "" wrk <- mapply(function(x, i) if(sflags[i]){ if(is.character(x)) # Rdo_piece(x, nams[i]) char2Rdpiece(x, nams[i]) else # structure(x, Rd_tag = paste("\\", nams[i], sep="")) Rdo_tag(x, paste("\\", nams[i], sep="")) }else x , wrk, seq_along(dots), SIMPLIFY = FALSE, USE.NAMES=FALSE) res <- wrk if(!is.null(Rd_tag)) attr(res, "Rd_tag") <- Rd_tag if(Rd_class) class(res) <- "Rd" res } c_Rd <- function(...){ dots <- list(...) rdtags <- sapply(dots, function(x) attr(x,"Rd_tag") ) if(!is.null(names(rdtags))) names(rdtags) <- NULL for(i in seq_along(dots)){ # process "character" elements elem <- dots[[i]] if(!is.character(elem)) next if(is.null(rdtags[[i]])){ # todo: convert the string to Rd object (parse attr(elem, "Rd_tag") <- "TEXT" # it); for now, simply attach a TEXT Rd_tag (not } # necessarilly correct!) and embed in a list. dots[[i]] <- list(elem) } # now everything should be a list; # tags may have changed res <- do.call("c", dots) if(any(sapply(dots, function(x) inherits(x, "Rd")))) class(res) <- "Rd" # if any arg. is "Rd" res is also "Rd" else{ # set Rd_tag to the 1st non-null rdtag indx <- which(sapply(dots, function(x) !is.null(attr(x,"Rd_tag")))) if(length(indx)>0) attr(res, "Rd_tag") <- rdtags[[ indx[1] ]] } res } Rdpack/NEWS.md0000644000176200001440000004307713525466664012610 0ustar liggesusers# Rdpack 0.11-1 - in documentation of S4 classes, such as `"classname-class.Rd"`, `reprompt()` was sometimes inserting entries for slots already listed in the Slots section. The same bug was causing the new slots not to be reported properly to the user. - in some cases `reprompt()` failed to process properly `\S4method` entries in the Usage section of Rd files. Now fixed. - `reprompt()` now handles `\S4method` statements for replacement methods. As for other functions and methods (S3 and S4), it is sufficient to put a declaration with empty argument list in the Usage sectio and `reprompt()` will insert the correct formal arguments for the method (they may be different from those of the generic). - `reprompt()` now gives a more helpful error message when `type` is invalid. - corrected some minor typo's in the documentation. - README and the documentation of `reprompt()` and `Rdpack-package` now give more details on `reprompt()`ing replacement functions. - README.md and README.org now give the correct `install.packages` instruction for CRAN (pull request #10 from @katrinleinweber). - some examples were leaving a stray file, `dummyfun.Rd`, after `R CMD check`. # Rdpack 0.11-0 (CRAN) - Updated the vignette about `\insertFig`, `\printExample` and `\runExamples`, to reflect the lifting in `R 3.6.0` of some limitations of Rd processing in previous R versions. - Vignette 'Inserting BibTeX references' now includes a section on bibliography styles. This section was previously only in README. - The fix in Rdpack 0.10-3 (see below) for an issue introduced in R-devel in Oct 2018 will be made permanent, at least for now. This fix resolves also a similar issue in package `pkgdown`, see the discussion at https://github.com/GeoBosh/Rdpack/issues/9 for details and further links. # Rdpack 0.10-3 * fixed issue#9 (reported by by @aravind-j) appearing when a package is built with R-devel (since about Oct 2018) causing references by `\insertAllCited{}` to appear in a single paragraph in the `html` rendering of the Rd documentation. # Rdpack 0.10-2 * added pkgdown site to DESCRIPTION. * README and the vignette about evaluated examples now state that R-devel no longer gives warnings about `\Sexpr` not being a top level section. This means that macro `runExamples` which creates section 'Examples' containing code and results of evaluation will be useable in CRAN packages. * new function `Rdo_fetch()` gets the Rd object representing a help page from an installed or source package. It works also for packages under devtool's developer's mode * The site created with pkgdown contains fewer errors now. (Note that the documentation builds without error with R's tools). * Started moving tests from my local setup to testthat. # Rdpack 0.10-1 (CRAN) * removed redundant references from REFERENCES.bib (they were leftovers from testing). # Rdpack 0.10-0 * updated vignette 'Inserting_bibtex_references'. # Rdpack 0.9-1 * now `REFERENCES.bib` is read-in using the declared encoding for the corresponding package. If there is no declared encoding, "UTF-8" is assumed. * Now macros `\insertCite` and `\insertCiteOnly` use the correct `results=rd` instead of `results=Rd`. This was not catched by `R`s building tools but caused errors when processed with `pkgdown::build_site()`. Fixes issue#8. Also fixes r-lib/pkgdown#784. Thanks to [Jay Hesselberth](https://github.com/jayhesselberth) for uncovering this. * now references produced by the citation macros for BibTeX entries of type `@book` and `@incollection` treat field 'series' similarly to other BibTeX styles, including JSS (issue#7 raised by Kisung You). Note that even though the underlying base R tools are based on JSS, they treat this field differently. * Bugfix: now Rd macro `\printExample` evaluates the expressions in the correct environment. * help page of `get_usage` gets a fairly complete Details section with numerous evaluated examples. * now `run_examples()` escapes `%` by default, before returning the text. This is needed for text that is to be included in an Rd file. It can be turned off by setting the new argument `escape` to `FALSE`. * now `reprompt()` gives a more informative error message if an Rd file describes a non-existent S4 class. This is not captured by `R`s tools. It can happen during development if a class is removed. * now reports printed by `reprompt()` about methods documented in Usage sections, but no longer existing, are more readable. This is due to a new print method for (the mostly internal) class "f_usage". * Many features of Rdpack are best demonstrated on a package. The new package RdpackTester under `./inst/examples` now makes this easier. * now the help page "predefined.Rd" does not print some tables twice in the pdf manual. (This was due to using `\if{latex}{}{}' instead of `\ifelse{latex}{}{}' for those tables.) * also in "predefined.Rd", removed illegal use of vertical bars (in column specifications of tabular environments) from the pure LaTeX code in the `\ifelse` clause(s) and wrapped them in `\out{}`. * in "get_sig_text.Rd", replace `help()` with `utils::help()` to avoid warnings from more stringent `R CMD check`. Similarly, in "Rdpack-package.Rd" replace `packageDescription()` with `utils::packageDescription()`. This may be needed in `\Sexpr`'s more generally (__TODO:__ check if these would still be needed if the symbols are imported by the package.) # Rdpack 0.9-0 (CRAN) * some brush-up of the documentation for the changes since version 0.8-0 of the package. # Rdpack 0.8-4 * now simple mathematics in BibTeX entries is rendered natively, no need to replace dollars with `\eqn{}`. # Rdpack 0.8-3 * new macro `\printExample` for inclusion of example computations in narrative sections, such as `Details`. The code is evaluated and printed similarly to `R` sessions but the code is not prefixed and the output is prefixed with comment symbols, eg. ``` 2+2 ##: 4 ``` * new experimental macro `\runExamples` for use as top level section in an Rd file as a replacement of section `\examples`. `\runExamples{code}` evaluates the code and creates section `\examples` containing the code and the results (similarly to `\printExample`). So, `\runExamples{2 + 2}` produces ``` \examples{ 2 + 2 ##: 4 } ``` The generated section `examples` is processed by R's documentation tools (almost) as if it was there from the outset. * new experimental macro `\insertFig` to create a figure with `R` code and include it in the documentation. The related macro `\makeFig` just creates a graphics file, which can be included with the standard Rd command `\figure`. * new vignette gives a brief description of the new macros. # Rdpack 0.8-2 * Now text citations use "et al." when there are three or more authors. (Issue#6 reported by Timothy P. Bilton) # Rdpack 0.8-1 * in this file, added backticks to `\insertRef` and `\insertAllCited` (see below) - in the rendered `News` on CRAN the backslashed words had disappeared. # Rdpack 0.8-0 (CRAN) * `\insertRef` and `\insertAllCited` macros now support `bibstyles` for formatting references (feature requested by Jamie Halliday, issue#5). Use `Rdpack (>= 0.8)` in `Imports:` to use this feature. Currently only long author names are supported but complete support for styles can be added trivially if requested. * updates to the documentation, in particular the bulk of Rdpack-package.Rd was from 2011! # Rdpack 0.7-1 * improvements to handling of free form citations in textual mode: * (bugfix) now the whole citation is not parenthesised in textual mode, * the handling for textual mode was incomplete in that additional text after the citation was not put inside the parentheses along with the year. * updates to the documentation. * fix a bug in `Rdo_locate_core_section()`. # Rdpack 0.7-0 (CRAN) * consolidated the changes introduced since the previous CRAN release of Rdpack (it was 0.5-5) in preparation for the next release. Users of the new macros for citation can use `Rdpack (>=0.7)` in the `Imports:` field of file "DESCRIPTION" to ensure that they are available. * comprehensive overhaul of handling of errors and warnings during processing of references and citations. In particular, such errors should (in most cases) produce only warnings during `R CMD build` and `R CMD INSTALL`, and not prevent the package from being built and installed. * Unresolved BibTeX keys produce warnings during building and installation of the package, but not errors. Dummy entries are inserted in the documentation explaining what was amiss (currently with 'author' A Adummy). # Rdpack 0.6-x * new Rd macros for citations * `\insertCite` inserts citation(s) for one or more keys and records the keys for `\insertAllCited` (see below). * `\insertCiteOnly` is similar to `\insertCite` but does not record the keys. * `\insertNoCite` records the keys but does not produce a citation. * `\insertAllCited` prints a bibliography including all references recorded by `\insertCite` and `\insertNoCite`. * new entries in this file will use markdown syntax. * updates to the documentation. # Rdpack 0.5-7 * `get_bibentries()` gets a new argument "everywhere". When is is TRUE, the default, unescaped percents are escaped in all bibtex fields, otherwise the replacement is done only in field "URL". * removed several `print()` statements which were accidentally left in the code in v. 0.5-6. * updated help page of `get_bibentries()` and included examples. * cleaned up the imports in NAMESPACE. # Rdpack 0.5-6 * `insert_ref()` and Rd macro `\insertRef` should now work ok in the presence of percent encoded symbols in URL field of a BibTeX entry. Closes issue "Unexpected END_OF_INPUT error (URL parsing?)", see [Rdpack issue 3](https://github.com/GeoBosh/Rdpack/issues/3), raised by [jdnewmil](https://github.com/jdnewmil). * `get_bibentries()` now takes care of percent encoded symbols in URLs. It now returns an object from class "bibentryRd", which inherits from "bibentry" but has its own print method which escapes or unescapes the percent signs in URLs depending on the requested output style. This was also reported by by [jdnewmil](https://github.com/jdnewmil) in issue#3 referenced above. * `get_bibentries()` now tries to load the `bib` file from the development directory of argument "package", in case it is in development mode under "devtools". (Even though the search is with `system.file()`, which `devtools` replaces with its own version, the bib file still needs to be looked for in "inst/", i.e. it is not in the root directory as is the case in installed packages.) # Rdpack 0.5-5 (CRAN) * Streamlined the help page of `reprompt()` and `Rdpack-package`. * new argument, `edit', in `reprompt()` opens the Rd file after updating it. * new function `ereprompt()` (`e' for _edit_)* opens `reprompt()` with suitable defaults to replace the original Rd file and open it in an editor, otherwise equivalent to `reprompt()`. * now if `infile` does not exist, `reprompt()`, and hence `ereprompt()`, strips the directory part, finds the root of the package directory, and looks for the file under `man/` (this uses package `rprojroot`'). In particular, if the working directory is anywhere under the package root, `infile` can be simply the name of the Rd file, without path. * now README.md is generated from README.org. I changed the layout and amended the information in it. * README.* now get links to [georgisemacs](https://github.com/GeoBosh/georgisemacs) for an emacs function to `reprompt()` the Rd file at point. * `viewRd()` now works also when the file is from a package under devtools' development mode on any platform (e.g. RStudio, Emacs/ESS, Rgui). # Rdpack 0.5-4.9000 * new RStudio add-in 'Reprompt`, contributed by Duncan Murdoch. If the file being edited in the code editor is an Rd file it calls `reprompt()`. If the file is as R source file, it looks for the help page of a selected object name and works on it if found, otherwise creates one. # Rdpack 0.5-4 * added the version of `Rdpack` to the abstract of the vignette. This seems more informative than giving the compilation date. * now `reprompt()` doesn't give spurious warnings about unknown Rd macros when the Rd file contains user defined Rd macros. These warnings were harmless and rare, but alarming and annoying. * fixed a bug in `inspect_args()` which caused the warning _"In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'"_ in `reprompt()`, when the signature of a function in "Usage" section was empty. # Rdpack 0.5-3 (CRAN) * The warning message about a missing reference key now appears also in the respective help page. # Rdpack 0.5-2 * added the github url to DESCRIPTION. * now give a more informative warning if a key is missing from REFERENCES.bib (thanks to Kisung You for suggesting this). # Rdpack 0.5-1 (CRAN) * an example was not restoring the working directory. # Rdpack 0.5-0 * moved gbRd from Depends to Imports and adjusted some examples to use `tools::parse_Rd()` rather than `parse_Rd()` (before this was not necessary since 'gbRd' _depended on_ 'tools'). # Rdpack 0.4-23 * new function `viewRd()` parses and shows an Rd file in a source package. May be particularly helpful for devtools developers. * revamped the vignette, added additional explanations of possible issues. * new functions `makeVignetteReference()` and `vigbib()` generate Bibtex references for vignettes in a package. # Rdpack 0.4-22 (CRAN) * Added the requirement to **Import Rdpack** to the help page of `insert_ref()`. (It was out of sync with the vignette.) * Updated Description in DESCRIPTION, which was also out of sync with the vignette. * Bug fix in the vignette: changed `\@references` to `@references` in the roxygen2 example. # Rdpack 0.4-21 (CRAN) * Edited and amended vignette _"Inserting_bibtex_references"_, including: * additional explanation and an example, * requirement to import Rdpack and a mention of travis etc. * paragraph about devtools. * changed the URL for parse_Rd.pdf in REFERENCES.bib to https. # Rdpack 0.4-20 (CRAN) * cleaned up some minor CRAN issues. # Rdpack 0.4-19 * new facility for inserting references from BibTeX files - just put the line: RdMacros: Rdpack in the `DESCRIPTION` file of your package and the references in `inst/REFERENCES.bib`. Then put `\inserRef{key}{yourpackage}` in documentation chunks to insert item `key` from the bib file. This works with both manually created Rd files and roxygen comments, see the documentation for details. # Rdpack 0.4-18 (CRAN) * from now on, put (CRAN) next to versions published on CRAN (as above) * a minor correction in file NEWS. # Rdpack 0.4-17 * In file DESCRIPTION, changed reprompt and rebib to `reprompt()` and `rebib()`. # Rdpack 0.4-16 * don't export `parse_text` * corrected bug in reprompt for S4 classes - new slots were not handled correctly (see `slots.R` for details). * reprompt for S4 methods* if the methods documentation describes methods that do not exist, print an informative message for the user. (Such methods are also printed for debugging purposes but in non-user friendly form.) - included `methods` in `Imports:` - around R-devel version 2015-07-01 r68620 not including it triggers warnings) # Rdpack 0.4-8 * new functions `.whichtageq` and `.whichtagin`; replaced most calls to `toolsdotdotdotRdTags` with these. * removed `toolsdotdotdotRdTags` # Rdpack 0.4-7 * removed `:::` calls from code; copied some functions from `tools` to achieve this (see "threedots.R"). Renamed the functions replacing `:::` with dotdotdot. * export by name (not the generic export pattern); preparation for more selective export of functions in the future. * new functions: `Rdo_get_argument_names`, `Rdo_get_item_labels` # Rdpack 0.4-5 * dependence `bibtex` becomes "Imports". `tools` and `gbRd` remain (for now) "Depends" since functions from them are used in some examples without `require()`'s. * `rebib()`: now `outfile=""` can be used to request overwriting `infile`. (a small convenience; before the change, one could do this by giving the `outfile` and `infile` the same values.) * Bug fix: `predefined.Rd` contained `\tabular` environments with vertical bars, `|`, in the format specification. This is not documented in "Writing R exts" but works for LaTeX and remained unnoticed by me and R CMD check. However, rendering the help page for the objects documented in "predefined.Rd" gave an error in html and text mode. Package installation failed only if html was requested at build time. * small changes in the documentation # Rdpack 0.4-1 * new major feature: processing references from Bibtex files. The top user level function is `rebib()`, which updates section "references" in an Rd file. `promptPackageSexpr()` has been updated to use this feature. `inspect_Rdbib()` can be used in programming. * new auxiliary functions for work with `bibentry` objects. * new convenience programming functions for Rd objects. * some small bug fixes. * some gaps in the documentation filled. # Rdpack 0.3-11 * `reprompt()` was not handling properly S4 replacement methods. Changed the parsing of the arguments to rectify this. Some other functions also needed correction to handle this. # Rdpack 0.3-10 * `Depends` field in DESCRIPTION file updated to require R 2.15.0 or later. (because of a few uses of `paste0()` in recent code.) # Rdpack 0.3-8 (CRAN) * first public version Rdpack/MD50000644000176200001440000001627413575267043012014 0ustar liggesusersf4fb12a48d8c21de554d8412ad640df5 *DESCRIPTION 4d8f2c2b9b986ffc1df1eaaf8c646483 *NAMESPACE 1fce54e5e3c9c257e41abe84d87ca2ab *NEWS.md 5c7c194cecb76e0046d4387e1b074ab9 *R/RStudio.R d4ba37dd52ea4f3252abca2a3da897af *R/Rdo2Rdf.R ae81a25645f62384220411684b33e8cf *R/alias.R ea42e242b36d8e6f7dcb33037f4ffc96 *R/bib.R bfe06e3d7f729a5614b0ba6fdc30fcfe *R/elements.R 3e80ba9e806acef2fc33f8db6e840964 *R/f_usage.R 95eb0f8cc5558175fc9e567c957ad7ba *R/inspect.R fea6530f38874362b59f1c95bc281116 *R/manip.R c0e900af1694b27451acb2754e27042b *R/parse.R b9e4ce86d15977df259070a58545e889 *R/predefined.R 41b3623cb4e992c23c3871dd269ffaa6 *R/promptSexpr.R abd60f89dfacc7bcc33a018b1c1858ff *R/repromptAny.R c5fde30dc30c436472da8fbd5a53c109 *R/runexamples.R 5735fe2d04a7a730872a94786ce2ac2a *R/sections.R 2341d017a688b8470b0ccfef0418eed0 *R/signature.R 4b03c8cfbf7a632aca417756f7ef766e *R/slots.R 085eaf35d4daaa9cbab28dada4062251 *R/threedots.R b4d36330bf64cddf616d79b126677a8e *R/usage.R 7a35e91aa982372631ca464d89ef63fc *R/utils.R dc4224cb43cc6669175bde3108e3d6e3 *R/yytransient.R 013c92d24d949dd5a14f2e57244c6106 *R/zzobsolete.R f31f49feeb21c15077d3ede02f3c85dc *README.md f81ab78166a2921c80ac32258033bdcf *build/partial.rdb de83927e78fc961669c0ba7204d7c974 *build/vignette.rds 6f7f4274f206e12d9dd4a3eca463e4e0 *inst/REFERENCES.bib 66d8527ef38edbb31efd9f926c2db3da *inst/RStudio/addins.dcf efb52cfa02f55d1d2ee932b7fb2f7243 *inst/doc/Inserting_bibtex_references.R 27ecccc983261a2ef92304bbf919880e *inst/doc/Inserting_bibtex_references.Rnw ac7550a8860c76261ecf70c466c69789 *inst/doc/Inserting_bibtex_references.pdf 65531fadaff311cac822edd83fcbae4f *inst/doc/Inserting_figures_and_evaluated_examples.R fd416bcea3135e6f78ea79cf0d315533 *inst/doc/Inserting_figures_and_evaluated_examples.Rnw 61f05c5c5ee443115f2f2422f08c3a4c *inst/doc/Inserting_figures_and_evaluated_examples.pdf b122f5d3b5d8026264e902577f3fe840 *inst/examples/RdpackTester.pdf 37133c96d536676dae244c529c92d11b *inst/examples/RdpackTester/DESCRIPTION 8b54e5a89fbda3af5e077053d40bec76 *inst/examples/RdpackTester/NAMESPACE 8cc805ac5647942289b069e8d41450dd *inst/examples/RdpackTester/R/RdpackTester-internal.R 931ea4caaececc9b6c9afc61838ed68c *inst/examples/RdpackTester/inst/REFERENCES.bib 03b2bae7d202852767095d0fa61aa526 *inst/examples/RdpackTester/inst/auto/REFERENCES.el 2b757f55152a6264e97e6f004232caf5 *inst/examples/RdpackTester/man/RdpackTester-package.Rd db800015ba2282ec1e36c49316fd9cc0 *inst/examples/journal_with_percents.bib e8ac73c2782b741df4665121db17b036 *inst/examples/tz.Rd 622b071bcbb4e3124bedfe8507e9046a *inst/examples/url_with_percents.bib 3ce861b41014cb5f5a0f36efa1695703 *man/RStudio_reprompt.Rd 54a40d82d306027c83c510207da8c7c6 *man/Rd_combo.Rd 0d6b7f6829f85cd59a480d4d029d38c7 *man/Rdapply.Rd d597ab179cce61522f258b7d333c7e2e *man/Rdo2Rdf.Rd e6d0730f9291a0d52ca6d42c1e3381e4 *man/Rdo_append_argument.Rd 109ada7043a5af057fc5f979833917a7 *man/Rdo_collect_metadata.Rd db377e52ed67dac64fe3ba0368b98cd0 *man/Rdo_empty_sections.Rd 4095fa1ff964ff1eb168a854517727b8 *man/Rdo_fetch.Rd a6ef0c7c48e1b9e4752ceeab0106a046 *man/Rdo_flatinsert.Rd d8144fe53d234d3f7d3f0b3302388eac *man/Rdo_get_argument_names.Rd c519543d648e6df2e422ba2a84ad40b1 *man/Rdo_get_insert_pos.Rd c7afcccdf050cec02aa58447b77bd42a *man/Rdo_get_item_labels.Rd ba691cf053490c91e2a602e704ab6aea *man/Rdo_insert.Rd c2cd1db2705344dd653c0a95893b5c9d *man/Rdo_insert_element.Rd 774cff52e02f2f1526de1e1cc9368fd9 *man/Rdo_is_newline.Rd 4bf76fc9f2b7ae6e62655adfd9ce0d8f *man/Rdo_locate.Rd ecc69e8592337dac7ac3f5ec25eb7ee6 *man/Rdo_locate_leaves.Rd 8f2670e3fe48eb7a042516feb2c31b48 *man/Rdo_macro.Rd 2b51182cd8e4881e3f91263846a7bf77 *man/Rdo_modify.Rd 20a38d61ada82b7c8f50a74ed4f42dd6 *man/Rdo_modify_simple.Rd a7fbf7b0931cfa1a9ecba847f4b6213e *man/Rdo_piecetag.Rd 0bafc9f685261c4c60de5b08a5384a16 *man/Rdo_remove_srcref.Rd 79076f7ec3947395bf3e6d0823f9eaed *man/Rdo_reparse.Rd 5c18d0067046f8c16bec8d2243324964 *man/Rdo_sections.Rd c8eeb761a98d71d7783a83b6d3cf5292 *man/Rdo_set_section.Rd 1504fc2b31e449847ff9e161ea917da0 *man/Rdo_show.Rd 6e8cfa5234bd29a601daabb172907235 *man/Rdo_tag.Rd 2e6a44748c5507523abc3a66e238f095 *man/Rdo_tags.Rd ea77f741cd50357fbffb5a3a4c964b00 *man/Rdo_which.Rd 3bbf10b23c7138b68480871318268fb6 *man/Rdpack-package.Rd 2b52255cada6c60ad076f58a78df6474 *man/Rdpack_bibstyles.Rd 738ef3d5d5951fac76d384c7c7fb2cbf *man/Rdreplace_section.Rd 326506d2c3f9ec1c27d188d93bdf5419 *man/S4formals.Rd d673a08cd551a2e38669a385a1aaf775 *man/append_to_Rd_list.Rd e6ed7510fcfc9a95cbeef05e525d5379 *man/bibentry_key.Rd 66ebb8cec7ce664d197fd388626836ca *man/c_Rd.Rd 00e5d6675bbe5bb984361786ae54b361 *man/char2Rdpiece.Rd 197fcb0865331981c7da01765a26786d *man/compare_usage1.Rd dd68ff3fe1d9c64a98621a63ecc76162 *man/deparse_usage.Rd ea64043157fd2165732a69739a588021 *man/ereprompt.Rd 788bac58a666d58081e3f6ef64046d99 *man/format_funusage.Rd e4a19f8012ead2010d9ea4c3bb9d66ff *man/get_bibentries.Rd 71a0669fe4db6edc01802f94b6a06824 *man/get_sig_text.Rd 95ef0eb8e847562637859da515b8e094 *man/get_usage_text.Rd 31c4d60aba7575a4b67b95827a8052ea *man/insert_all_ref.Rd efd148f0d9a2757743c5cc8c6d8161ff *man/insert_ref.Rd 952f0b8c2d93c748f06fc89d9c26d0b8 *man/inspect_Rd.Rd a7eb7002a64c5843cb52a0d4cad297c7 *man/inspect_args.Rd 74870e0195d62d2d93d1d7a51063bebd *man/inspect_signatures.Rd 315b02a7da8bfa3d315311a3d3e9bc25 *man/inspect_slots.Rd 86c5b735a5ee57bfc66aa959c903b392 *man/inspect_usage.Rd 0e840f06ba0488b45c399619d06fadf3 *man/list_Rd.Rd 6b9e4aecaf0fe6e5f5bd7db082c7e847 *man/macros/refmacros.Rd e4843c663b48a11e597be3c75a387c43 *man/makeVignetteReference.Rd 0dc7b50269710a091b4b952db4488a0b *man/parse_Rdname.Rd 69d2c2e56777b86b3c3b8b39fa6f52c7 *man/parse_Rdpiece.Rd e750cb7e5453d2c0d333a0cd472ab81e *man/parse_Rdtext.Rd 1fb01d5ca3ecb4b1d72808324399cf49 *man/parse_pairlist.Rd 41db54b67ca20aa99ee7c003782ace3f *man/parse_text.Rd a1b2f57e1a1f9b27f156c9db254e9e8f *man/parse_usage_text.Rd ff558a413dd5b8af3e4c2ec7327181a3 *man/predefined.Rd b2cea461095dd10b405d25593717fd92 *man/promptPackageSexpr.Rd e2615d974b76df096796da1cdbdc6d91 *man/promptUsage.Rd 0a3d93f1f4ef6890772d4399e0f40b69 *man/rdo_text_restore.Rd fade6ed3bdb261e336df91ccfa539cd4 *man/rebib.Rd d84b9a9db9352311fe2d0cb07e1b4ee4 *man/reprompt.Rd 218364e0bfb6022833ef51bfede377d8 *man/set_Rdpack_bibstyle.Rd d884e588e0f5adaf4778ce19b2cc3d31 *man/update_aliases_tmp.Rd 9c2b9eacd37b990679fbda4248cff872 *man/viewRd.Rd d7fcfcf5e3b4d6e025ea1fa0eb9275a9 *man/zzasym_compare.Rd a13a20109cc06181254b976aa58c7dfe *man/zzbsdup.Rd 0a20af2e97069ded300b0a6ca1025c06 *man/zzcapture_promptany.Rd 43ab15e6cc0639d0e5aa1cfd2e7f9c1f *tests/testthat.R a62c0ada2058937d01c0979c411a746c *tests/testthat/char2Rdpiece_a.RDS 2ed49593b0fc0c3c100e32d0240a98ba *tests/testthat/char2Rdpiece_b.RDS 8956358852e44bd8b1a7958831487987 *tests/testthat/char2Rdpiece_c.RDS af46fe05c6a34fa8a80ee2b0bd297cb3 *tests/testthat/get_sig_text_f1.RDS 916988d6d5aed8c8213ff37afbfa52da *tests/testthat/get_sig_text_f4.RDS 80c3904cf8862d3401bb3a48bc42e644 *tests/testthat/test-char2Rdpiece.R 27ecccc983261a2ef92304bbf919880e *vignettes/Inserting_bibtex_references.Rnw 8f31fa9893d5658ae75aed4788032e98 *vignettes/Inserting_bibtex_references.org fd416bcea3135e6f78ea79cf0d315533 *vignettes/Inserting_figures_and_evaluated_examples.Rnw 5d83f7c05daee4fddd8aa45521dbf378 *vignettes/Inserting_figures_and_evaluated_examples.org Rdpack/inst/0000755000176200001440000000000013574751104012442 5ustar liggesusersRdpack/inst/examples/0000755000176200001440000000000013501141722014245 5ustar liggesusersRdpack/inst/examples/tz.Rd0000644000176200001440000000171113501141722015171 0ustar liggesusers\name{dummyfun} \alias{a1} \alias{a2} \alias{a3} #ifdef windows \alias{onlywin} #endif #ifdef unix \alias{onlyunix} #endif \title{Example in Rdpack} \description{Dummy description. Second sentence. } \usage{dummyfun(x, y, type, flag = FALSE)} \arguments{ \item{x}{Description of \code{x}} \item{y}{Description of \code{y}} \item{type}{Description of \code{type}} \item{flag}{Description of \code{flag}} } \details{Dummy details. More dummy details. #ifdef unix These are on unix. #endif #ifdef windows These are on windows. #endif } \value{A list with the following components: \item{res}{result, a number} \item{convergence}{numeric code indicating convergence.} } \section{Further information}{ This is a user defined section. } \examples{ dummyfun(1) #ifdef windows ## example on Windows #endif #ifdef unix \dontrun{ ## need to supply a suitable file path (if any) for your system ## example on unix } #endif } \keyword{kw1} \keyword{kw2} Rdpack/inst/examples/RdpackTester.pdf0000644000176200001440000035050313501141722017341 0ustar liggesusers%PDF-1.5 % 15 0 obj << /Length 1267 /Filter /FlateDecode >> stream xW[o6~[d`byu)bm)Z/saHV`DBt$mER\{CBJ&;;?YL^cC1 ʝ!q8 (HvJ+GSr>OԕM+{9sd|kIwrb)k-HMQ- #³rUuNE M&SV |R9=Tt%snFqʝcsKC=]r#?]K8 Xg:37U)ţBjZGbı%YŸT:O?x՜(Z颦!ϤL˪f8!++}1?zgy! ;ÓVZ[mĤ2]!K@˞V͔"CmztEa84DZ;:ENv~=q<vgqeM"2_|mrF.&LHwE1ub ;)8rt' LJsnfԹ 1H0f#t3P6N@P¡b"a44> stream xYMsWm98V-IzS)К!׻9D*)U:H$F0.;:"!jqZ0JB+J|KeG3"7&ߧR4!vk {?!鼝-% vS՟ c'#gNjD;SKbrp۪ٔÒѠZ2_$I"7Ǵ([32`?v]Zfq)f{tDĦY֔iM^5(8OUy ܦ.{}ڬ}bK]NCp'MuuM]tٶMZQ{E&7 ЫDySCdPeƠVq\RA!c$ҳPKQ eUn]yUb0*\si&KXia8bX1&< }CF7IؾbZA"Fo;#D&"Vx*NDÔtQYF c<""bJMcK<ܴVݑ^dǡ lpH' Òet6Ń+RHQ(ʒ:>(gZ8]p^9kZ L <ا-=ulCe\)na[MVx B#-s XӶD)\yʬ+k’CಈIgY]}M%<);qHCa]I,Y7NQmdWS}M0x)0ĐUU1wdնm]<]HĆLCO`͈z\z5 Ԃ#h/M:Fk> ØZS?ߴ/`o""W^-1ٔ@ h01 lD-V;7]9J U4c @U U,O#8| FRM O_^E4I9sts+nt 9&,CVgiGfm{oRShrħ7rˊcml-XpUeY4;L#oy(r\*UzaT+]u~k}c7Y[|ۡTGXl7ڔm\S^~\͇-Ӷ(B=#'ZgE׋'g; 2ZЅqqwq<#^at5*WUK}¾/]3Cf1YȾpJ2 !/ay^n]> stream xڥ?o0|TwkyTUjЏ_PX<{ v@0b>j:Ġ!mP[t&j`Y?45"P{|E 2dȤIsABE ݯ7]ہ"Gń&QMSH: #]C_./ p(b^R/_%(]"'(Ο"ҕ5FnCcFZ _Qn5zk@(e=? endstream endobj 66 0 obj << /Length1 2316 /Length2 19242 /Length3 0 /Length 20448 /Filter /FlateDecode >> stream xڜvt۲nԱضmutԱWlcu:vǶmcxܳ>{o1kV}5?9gzac[C [=3@hd t6p2`W61s6p|aU-M(XruG [ ϟ&N+bN0g @ `faac01s+ց oadn`b P17p3%sw03w22qYv9 L-6& |21f0233QG?~lOHV?*2?L-Lhb p8TG0@h1ǙI|c8YTNNv<Lp182M?(ؘaahbfe#GcNnm&&&f?t?0ZA.QLMQJDџ""nO&=3'' ,(@S[7vW.{*[T;#Ow=d/zG_#?AcnFf{~ft0J8[[CTCB|@3R䟅wT.Ti'f.Y8JXp22X;s]f-&m-xO~;T-&r-fv;,0<&n{32m> ;g'`".KZܜF?-_N._7OgdkӿV3&s|X;(/GAX?, m7G_?f\5&Or37{k3?(_%r|ha/Wn\Ckۿ L&_'v&=&_{|07??,qWGOo B>^vN&;>\m>;:]0qg#g6qm|LϿlS51q31]5 j}sg6˴($2s''|XAhׯB# S{Hs[뼩vu^%:_޶\ ڿ"kv MauT(* ;-c3PTqw~%`qG<Ƌp2TV[4Hr(#oRhIy׊ PQ꧁Nio^ ܊`Lp( `tvI$+WuD"T%[YxSFTa'|1ӊVV^UɟNΐsrr&^Voj5v;A0OGNѺ#fu ݹ>ǸjY!ɈQ$^7{jjׅγM3*6W'uPeM.L4^0F!7Dqb]!>'Y$>(*0"T(Hmt7Lycѥ\Ua8 D?gv2o *Vk陽/gpHYȶ GP{g3GNfD6Tr8 /D X`:6E&mYNӉԏZuos i.J/ϝTaCW.ѫP! N,JWF,1iE.r &B^4]]p#|NMl3pm6WSJ0G53W-l>'6~k(9p%0_(.Vn{ƚUGNO"p3 T,N 2SCӑ-oU3"Gx=I? MDeXxT$2geݲ ީM\O= :JqZ5I"mF``y#qVwgtr hқM_^M(R8AJU:)7y$bAS^r4JBzF1=Ȋ=ʞOQ?aʏmnx]ˑG[ٍJt!{ lDxmFYnì-]No`is*q ^\6㠷~ڏ-:\o[ qoy2XbLBRW,I>(M=!a3oSoF{O݀ny9{?=o,TPyG ΂2W] LTV(rDo*Ek~4Lׄl+V{v-%<1=(.m$6fʴHG.黠}OD)#;ꟹٱ 3:ĭw"G^75UPな hKftk B:?K_(|ז~(}wbiWzly_ fKl/ǂϚc[c:nYaC:yϊ,hTZ4Pވj5|m7;#*¶^7PK#~%: DP%D3y +I3q3 T˼S皷r):C\Xы֚yޱ >  d ?]usPd~j@וB3f#&; Q;p^:w|`uUs78:?_Ɖ)1Q;kV+p?WJߓ>& `}}8Da 9MYQ]f'pݹe1+4G %8H4DIin^甹Qo\( {\@0e@=k0,k\Gs6h 9u0%f@vUc~7}F<$s:[0廆/6LGOGx*  UB8:  !3!rlg b"rN /|Ld*j>َ3y< );5x-l6#xnbR֞ 5$@/q;&Ds1I(EKΜQѼ5=kbRAW0N0[}#-Hx! {$m(|u}gLKp@׫`x6;߮m#[QPoAw351)MfOH$iMqloC'"9Z!M>S?^H!jZ4(L!M\nK;f'u1'wہ^cx1MqK%fOh*%ZƯscc۟mcgP}{1.`vM.}Z V)g%(\9؂yԢ-[Si} K{WLx4Y<Ǣ i~V_~ldR'@585&IK|R.҈Y f3YJ޻{)l9}& 3*:1W[bh{YH1/~umFz]CnJm۷@hdF rIo)^ȅt5feF%9V(k9"Ӵ珽yFk,?c\8ӡLyGYV ^Qyg@ 7RfTBK )`Y8a,VX:hClg{?CAW) 9-o4[Nk/Q͛FBȘj&7mN %:F{z'h f5?WA ϶2+oAe۟s ~/r@8K.Xr4/W5lIPSXo?jmnvQɝ|gJ(Q{V1gKBwA})%aH7Vo qX/q\ߜ:í4{ UU`kZDx| Q8%7u{!oIOHä7SiU՝!(' Ż`X 'D6?sM\;'.#VDobPc$L{[͓q Õ=P BގHPK]vm|~Dk_8_uɾW8bxlhvn,q}պ;d?ɗdl wә(fVQ8VZ: A ׯ;Ʊi(~VW*~=Hxpv 3Gx0X^J-ū.#eWy;({&FW]M ~y;=W#8Xz{AkJdtЬRH.yJb79`v-'}ˮ̧{ff!{(O!gt˪E Sv m?hsGfm:r@)&x0d*Xh7V&V_֔YcH)jl%(8t(|!BO F"}7Nmȭ|/ianXٮ| Gմ=͈KF5|3WNF-SIoyuYM|[ xz J uloVƦ%sTV73G/)nQa9zӻ^Eut]\_aO`_B6;je:$*D᯶^`!= !صRᵇ9lA<4~RZ}T8>ofAыd(ʲl~'uUzuBf w ᖦ:Ǧ q։ƋŸ+Q&(::|w\Z[^..% ~*::gwFhX! ufKy3mu)2ძ'H0~\Xn+/k!|=7*)J/4{~","GjLP(+ՉPCsGȚ/(7nG/!V]C/}Oo6&V"6葫@4ROkfe~;ۏ; )K 8 ]y;emou#K!hZ8Xv"2[f*L{WL 0ɖ@PvLi-|J qLVQKW 3mȬh݂< ZOؾW *lS.|͑3j߬^&*_y++ag ]~g.(򫗶&|Iyd}_?a!v*f?G/9x-֍9}0"RQ)0ssD+l@RlJt;vܔQ$ s-Oc^vN+H Pߕ4FjjuIlf>7O+Rd/&&p[%A>V\3Fv-4 R+`PQVܮT_]nZ.7PH= Km1*HӮ,8 CE˃o:ѢCKQ (7 X\'6"|pͮQ&-ZB{'v٪\P[;Mג] )Wȳ0Ψx0ɽ@2W*|0!gFW ݈YH=9v`s^̈H|2zmdVmh:b**~ɮnjk͒_^R\)oEvY]{;-ݣloؾT'Ll[[?}-ւ03o<4ޡ55\ߐ1K;.nbdPR c i4:cO2zîvQ] r>5|=A!8g0!Gr%g6^}݋k]}x+ ԾOiLڨFmf$Z_Gɨ ecE<#$v 01xÃe}~lBzQf`YKޗ e<ԪM\νӱVľh3ujj_E:B2>i*;Աg,ƝR{fDk>=ֺW"bN}ấ4'v)l+[;UAS|W))ƼZ {f4f"'lÙY=e4\ Ulv.])Nd$>H[ˆ(0o(]Ӓ\X5Gk˂,Eu+H}(F'NzӤӝi|ODdZQSjNW%L#YFy̡eZICe 2\)BD=+@zǏ첾dm|P?%sӦ%-ԂMVL%M5ե_(+ڒ1۟shv0< <:Żͪ癳g-J,Ҽj"@"QET6Esw?$ߋ+Ε~/B{ v'i3jd("}6mܳ;F}=2ef$h_pd&lEHМ ‘P zdtǍ>xsU\d=HW pdf΍sgi32y8/(gcœ.s!3p8)R"V&cbtUҵA-IOqB}%zT1o,*7$Eb>g4 [T;xaU m\`1e$;+X;R1#73tCU i߸|/]]Ǖ|EGE@ua kODP49 F3‡ۺd,b 5;O#e0c5G12HRR̓ҺR5,"_zc6\=,?'%jZl#%eSv~knl=9$$q ulDu[gBU,ݵm*IqB7c&m#|k7?uz>H0!#eIySjw }b@HeQ[; !w]$[c-] }͜T-KgH}ǔC2&ߣ_,^ I;49è:ԣ΢-~Afsv]#K+^rK€X붠Z-)swnR~όDyP6^р+#RwB7Hoa={g7cMD6H)ox$s6Rî"2FMN0SR]=ֶT4r9- 5EI;ɸcd>ҕF%.}{@!= }e3͋)ljOJo̗vK_ [TL+zC65j˼Ԋ=]ŗ)67Qa< #&^ kV9c8(!Zc?"0^6P.q]FaPϳ_z;8vuΙGlĞmTH%bQOYP(I,1q- ,'⺭4=Jy,8|`_g!-&/ēϧ$&Jj0aߠ4qgq: g26 iO܆򞃚b 5vdڸ5y!S}GKT%^ xw%CM_?d]S)ߦ|YMS'/O?_Ii3lm =/k^`އ|KيJIIS~ɫP,?tRi@jf~V&%йTyψ%ǂJ<.Ine$ 17D:J)?,G-FL;fd"h匊?|a|t(ځtfxhq]$H213,t:Ae)d9f3<=_D(m!JӀ [X/2Ph";。@fGQXԡ>HysnR̤.l<bː<tYK w9uHo6b*_F)PX/N,k\+Y|kre?Z)\,8XWo;m!u]hͣݴ >h'6R[9aF[@8;N].t֡E쭯gɺ=jRIyFBIpABA&ZorJOf̼V/n&m{PŒ4*˫U:U7OgE\+g_v  3ޙ@CXb4p^"NO.XrUMb&ם6 tTpcv9ŕЫZym>hD.]n mgȢ*qҮ;c>q5E[)''hwK{8xLȵ(}1fvɨn'fE FѪ<3r:֭AGhiV0cݞP^BJn8f+RZ5l.ߖ?>Ȝq O), ~Bmʀ;'CMxs##L,ZBSfB7OM#Fl19|XL#͹znVZp=,v,7o1L 7V2Btޘ@@3m0eHb3%BW)/qN$ >ڼB!9IGxoD48o"֭Cջ-h!~p O_t&sè]ˋ4T5a͔DS@5ߪ1^ rwR`SVQ!K:,W#GlQ/H߳ fT~h;Ӓ3G;{M$Z{31bK,QG ]<4N+B9M#`^y&64Lz=lO%\ho'AX3N`ֈ8߳#})qP-Lfl˃N:z2nrF`ZS$ژM Yp>ԝ3J޶϶lKٲV0lCةR3-d)סyE\n^&s)"V'hpۉimQnLn&!mdlGCE}4aSLϢY4:9H$=6L/j[0"?k.nKܑP]N-?^=(S)cF+`~?M WuӺ?u,wkXlAaY\nA:4~ĝ5_HվG ^:EJ Ncjʓ>pK.y@x|TY؃ŊJߪjbD`]ZGf_vBr i .JmPZ| Qt_# }&<:>p?S[,y+0xV["XW* +D J}B0>PW$P?sz՟(AX`HdGkOI9?A3dF<*4R~..,DxhpFI5 帼?+YGܺG"zBG\<};ђ214_2Zð{Cx:J*J{I 3ޖM_U 01"P\U h"RIkpdu0pZ0l32g7yi֒–*:`:i 35Pԡ<`6M$rM{>ڍg )4~oK {RBQ HlSզf~ LFS}RYF3kRYnN{ ro_eKJ6bkH^ʊGקpCoUS;6h J{g0*%3C^ψK!=Q"qEE)cK_ 02j|Tx;_.hn̅X:Y^uV >˲98K_aZ|dV2(w[ؚ켁 Bj|**Q͇'SLc,4ixD T;:|H`S0C%vOdpǚ!ޚr76t" ^$Ɖ]Ng-߽,Nn~]Π`Y̚*c'Ml9N.i+-Ԙ35B/;?*]SEţzTJFP_Xh :Gj4Z$[AגռvCʹ0mț?6Y;g/eyG|Qz -lK?* 2/m.)E79RY ﱩlyfƅgNI@ci~ 8q*Q 4@͞wٸK⵵U 'AxĐmJle_o'n-_p'Zb`nK8dEm*1[jd |FBu7ӞW'ANr -n;jכ3avEi&i6c"S*1oo ܄Q!*!T!tV~mh +{Kn Kn5ÙwMHxFl'tfX(, WEag3:xZ9nѴB ,%6l%Ȍw R3^/" b(uM 8~r /0)| e*Q~BF!p;nSijE7wjP7s'RFwoZ̬9:~܃Q][:Uˬ8Ôk{] Oa}KJ*8N>fBA|HliOjGQr75t!TB9Y Hz{Px:Tjk}Fagg$ Ǝ1 ]} > Y x@6 Ҩ$UA .k1-t5 =Q@ VzԖd}R|o#ov<2} z25`m3 m6#gTݹ': CZ_ExhO "PK|AZ湇zP)]9\ĒtEy񥰕"*jHlfHLN}1iy'gbO1m=3]lFKf*-Di^42m;9\H%,aYԅ^fM-|/J,gNPJMzNq3坅 Ҍe#tk2.FlF3}0)wͣ0trt}|;LzHn+ZM+mop $2^n֗LS9h5Jq"6a 0K18.Irµ_ WQr* ]#G_{(b^\a_4!LY3zA ;F(vRJ5ejAu$ -!iQ+zrINhm5*q]3jCMFAƋz#;)*)#.zlR%m׬WzGA{V?Qj-sQZ.#6뻸"Q` oL\5'u236:n>9oƦgQbD/OzEOixĢ1o,dPMG%ه}Pka-qАm^Xʵaʌ ӜL"J`Iv3SUu*ͺie!2Vʢ唌 aQ@RZ zҺaS -~%f>zxƌ  ?Sm\ Ecx,pq[cNOz c2Fvm[a(yQ \H4w )WKyJ(")Y(z2'\ld>;LzWa)GWٕa¸-/5|ܰ[TXRBbXG.9o8}7.B8|lε- 7 2sz$RuHjm 6>P1~^ˊ]EjlT,)G}h$୪dQdy9 U`m пW;MEb@eH "`'F߀װ uX E}=F[O{z"p3ak+DQxƷ^?BdY(im$xƜri[MzmG&ܥ4Te t [0\SV/C!0Zb%?CoY"%%->(]J? Z ̑> n}hd^8sGW.q(D"°n))ψC}BgwªFR R{3cbӲNyj[&5{eSV"rJу`lx8ZaheEP+25Q \z آ |<o8;c:'FnfuSܜd A' ñ;]"卺8sG'{}FY} ؛[ڊi(ZdBwَBиu&F&L+Rz]ҫfCު\a+(#uw0Of1:v!) -ί:!3D\^ddgV*c_~QM*pF.5p <.~wo!I˧ m]CMbIh; NBxВxX`h]! xʇ`{ B7詓ݿܗy ޥPA#J^Dwu3:&hOh##Ecԁv9h&MEM@c<eQ9=+@YjMÖ\uJPZ/!wwLp6b<fP]S᯾ƺ@UAվB& GAw}$^;\`$ΦbO; '='zmԈĿ$'VEb+vI.fj+HTO!Аu,2\M/iQ3J6Ny M# .C3)RdF|Ѥ1pi6ݞڧi{d4:NpW<_\xRsȱQCmföx4_ A_xJɢ}6QП3(Nh@ApLPxH;K|#p??A ׽UY9ҲȊů4DrGV@-l纟?(}RnߑQCW[K4=+3׏JP,0yB%0[kB́_K3 f<8{cA/LͩΧ<8//[A{N:HF.We, Ɗ kfBJ}ByU9B'(}QF8M쬧QD~bߩ)IM9\YҜaD9Ms_h{-\T_Duk'+cF."L9Cw_XU+_ τpn'K>h^$J(9ýP?`ITXHS(mKofނ]%0`3sE~ x1D J/0n6,-5XiDlX/]:E۽E I2RόԽϱř-o/&doA:+32I ׻no>s͎YO/g:tEyt ۞D1T0Pclj(א236Br'8i4F3Xzu* `(Ў+/`*x.w;CURQtih6):OnD#{.>7T)9yߵm%jUࢤWIQ8R/n)Oj`:2j*Mi0|(" n%xpv_y <FH~G> stream xڍwT[.RzIWi)!Hw^(һT" Jҋ"G9wZw{f=白p3RC5PX!0H @ QaH:֓q1BáXN P(,!" @ @ ꉰ \2nU %]:]p; c +#.a u1pwOW} ҄ɸGO1up g xں4OA_ /_0 uA:p0+B1(?pS4 P\Շ#X0F0cVwSE]_!0ܹj.dpUhpk9q8{6῍_j\ ~h`+^d~'uoÿ%20`ap+?qj2o~`av(Wg[ 4UTP?!Q8I$qǹEvG~//5!|G tK8濢?ix8; ?P_u=1Cf?gWnpo6eWb ?nw9I?& ~]18/l)!q?MP n䰿KyPvOD\uwᚏ~`ܘvEaq.\{;ٯFKJT%iI$#IH`KyM$\˿8#@dÝj[Ov2NE`{GLjLk{BUp/\Fا|1Dh}y7*Bgj{dNἂzIK[m -TQ/ m؇r9?>7y Qx>-lN-*JȨ0 _#.8,ooWrsM*zveVǫz,Wz/X^L(%`}@/Cr'vx%eg!t{Qxd%!gY}2t/Q۲}= W?Z (.D&i Zh"R (n}}DJk8Uy9/oia闫9L97[]^o0͝7q}g_jxf1H O)ޱkjLKP-pԛN+Jn^۶7-۴;& ہ=9֘I8pd0n(! A_ nO<@'z|M\;XJifF!G}*Ə0?F >Ml&FY\_ܸED3};|FeV_#2F娝{+ ֪={fQ?r2  /-m2f|ͧ5yOMCe !Ŕ2g0nWR w zna*EOlj rN:?q!f\2ކ/ABuO3 >bu͏y)Wc6j=W~1<ѝdOϟo)(ܚZGmye-ȐEfÛwȀ{1-k,]t>ߛnGaW Z8$ܰg4+#)|URFc>whr0u"N[Z;o<6y10/|ꂚ[ sE[׹2Mσk/g9>j3THZq`#삃fJ7#E`‘{מ>_+wiLV[|UϨY(*_6S<@X< hkMzV":amk*_/$:c@{HKmY oZ Uޞ4m49miy}jFXھNEMo"ɗ^];io8y֗h^uЋr>h1^d^D(NĢ"DنVK+L!3<)LJ@i|پk4|S|8vg!! s}ME&WAylpN.1n sؒkz[?wz>:&6{y|=:1>/+J+ x:,3n&cv7,kDfgvW%ۢ =ڭ»'$jݱz_od6$R?V #!ߟPq ]Խ:` i'C(?fBSi]UZP$EocND~O10HuŨobTIn=TwRt2q7uAM{'Q K{ =S#[Bص̌W5"O?H /Ƌ"3ؼZkޤa{z?sN~KQlzU{ߡtѣ @7{}oZk~DWtB金քog$U^ _4n\ + mK[~^AD1?URJ}*ӤBwɔ;: YalBȒRZy^\Q#[_7!_V(Z)~X' e\tnn ud )eBv}Y@#I%֣M o'̫zv_C-Aթ,snFJَ%(a9ּN$ܤ78̺TA nH! c4ZuO+,b CQ+A$QC+s]Q;qn<6 {3,6 }wLZhqV0^QcIufDG}~|6*I+%ԔTGOdZ<ᣏ9DxV|ھ} ^ߙ=Ǝ0{ K6h}>1;{b j"?ۙcҴU!Вn>Fr} B9ф?5?TY4o2*?!Nf-9Ľv>,k@ԭ~>{ạPhZBj{dNsR3`TuBm~jj+&3HW;Tb;6HyB eRAQO83F{;SHn`ikr{+)vN$MwcL[)k0 t=EOڕP%tӆ~$HYXT7#iqF^UDBζ4ΎVa!f6̣b\Iޫ?71:HhZojC&Pv2}Zuj[;~N@V_bܢ 펡S{<2fo[3Ev 1Q:J碟,e@|DqoiȖ{| +A// e{ ?2[֮I4wؕ ;Dq:G o *lG;k {t+<2аa'X8}jaᡴzshqM~Fz%m;] .{vE͉un<%ir#SlV!z@blslə^smHWTOdv544ykEuFL*u.Xv58jn>|bZ(bwEn";3 Ў7VT+?08K.fVQa$hA{gF%tڥ*C%aڳ`@#\ݨ4)9KӍ5(3$} )PX$u񃵿eI']PɩSV*lm^Uş]F1]WՠViDž+j]4qA;\ю&Ɵxr7:~()iwD\=\p^qPk+r=SFf??jkH:)gJIWq7O}{!zКi!ǙFWS#Yr@٦3a#w<:S]H ᓗK[ o5nm}UFmta!Ջod%agmǐ˕g=Z+&\eHo~Z;IE#كYEIWHYvQS~,+֌yrLE;*NܴJbOb[`8?7f]ݥ %1p;Os |fh`Vqf=`@0򝧨qk̪cuՅXEȶJn&9AǍ<7o<Ǫy8vKe2-v ?7gOA6\iڽAֆ[H& ai {7rT]Z)c=yr3 :z#AA&ܐ Ó$)moO}0\qffH\4P"v}NdZ̬K+Aۣ/ endstream endobj 70 0 obj << /Length1 1400 /Length2 6326 /Length3 0 /Length 7286 /Filter /FlateDecode >> stream xڍtT.)"]2t ҝJ CC4 H#%-% 4(H{׺wZ|{gww?L-k*!HnP " y@>0@?$$|@迀W1f "P7 s[;du`Ԁsœn* r&uF8lPC@`6P @C|wA+- (7揍Z+ ^˫bg^_nOAaԋ?ha'UnE]ӿ:K`&Z(?$7 !So UEnHww`(Һ#Q@doh50w (!mQd anJ0/6 C?~_Rs7دo * J_ ?!JlkeCQrgp`WW7j(K B ^8Jf \~~~|(c >~ÿZBD<ؾ&Jړ{}L{?̘{,٧8iV4 R2Ԕs9<{VKW-pM͖*v}*' aZQ#B>4mڨJ[1>c陋d!)RV ixWUNF#jl_<`ZuyiD5s8_ziU=BD4 8K9WY;oZ=&Sf:_gV9j=W;~*]SpsǁK'tCwb*d2)i*{K 4zpɛt>|eCx#ʹDBK,{ OKG<ϏLyroM.]A!whY*`B~2.1ג'rI36vn#=Cjk e}׽m>ep\$)?6e k7olobMׇwnKs+s =ž2cKK*'IduHR&r>%kz_eRg53eH.JGQo]Vb~WsMv͜6aQ +v+#'Ǣ±,?upHX0n6=hήx-0|/i?5FX!DF_uޚK<|V%&jxYɴ蒡i+bV,*z݇Gȅmʤdf-WӇѶ1EcǢ|oЗe?.AUЄ =h9 ,5.c%έ?8*M yHLvy#==ǰ .gZXy{Si+gN 3׻tT1#%۲BvIWWSoQ8sJ$B58?1vZ,0idƐcLh^E\2sϤYF"mNc>mhkI:^xYg2:P@qj#9 9VaX`tv e"h[ c4! ۹>1 J7~lg{~c=RixV+A+ca 3lV2D?-X y/8W&$uǦg{ա ^;ӛY74-59|W_n8+齫)3gHJ Dŏ鐆Sԅ%4aRriB苐6BMX_,`ƼvOCL\"*b۔-m+Hn-g|UkTrH3Xٙ;yg6[}5'Y3wA|hraƤ+ATq5>]AE`B־zCX$ ǯ.O!*hiCMdVK-մYo=#tX+8X/3/A: [L5V;d!oqNEFG><&j.E2̘o?!Q-B |zF7LH&Db'qءAY a~QTZIZrҌFV.^0 ݤdIx0"5H{f1tgMspӆz63WJ`N:!Rfi䂴% L ?E}dMj5,qY4Hc=KLmR' ` rg-ptAx^`eX]XO'վ?8ѭ(;~llOKB )9IJso6=u_^X&UΦSdFӞ/aF v&l,-(qဟ5K8p  j/21'O4Am6;yQ`Za8 f޶,/¾5T^y&v,9&jmdw*5¹ڕҖ?f#@N$xk%!h xwsѽ־GwckW}QTi{UO?: ;ck?rrc S WsD87}m`>9(._u<8sGmd)Ȧ7[E5j[8g@2g᧢.D:WIX1|fޘs@]JjyUגsB]C'XwOGs'8y=޻,%|/͊e3GXSvvvzMlRyjSf]<sn3-R6f4sDo'??x|]NѲ5C=-Va6Oj%&PEHi4@u:|L w 3y%$GSVô{Q"gQAsifUp"~ z87޶eQEM7s ?Lc)5P"-)]{Y3 #Rs%{{0($?hl˼.o^&)$`4WR S9 C;$CHτ@<( JWψ`eRFWмuZ/ +Ks0s{Nǒ$:3Q[ԏE@|OF Tb;l7oC:Q9iUO;{V2OTX0DޥЃ<|4/`f7`wx0ˮ}H ݔri$_ѿoanٮQrXgkچAjG0 ŁؾR{?f$ 24ZKR!7g/z5e& P$H 3vz%׺ז[XQoW'RmEflCz j+St^}as3nNW+X[1eU?0”EV=`1 MzƲG.3wMm>e,;SH@&OSGWAHaF^ 0z٪"y)A1\9 řu Hn4>͇>б6y?RD=%秾6QB6svËďHdn;\YTBX6% ;SߚngA艖O~hntX <-{;QROfN8|n[њO~ Ǧ *hW8e(=?#'xl^͎GPdm cq{U yi.KBG 3Zv*+`#׿J@S+Re\A;ЦS񤢔檉)Mo./_ /> G;ƹX^ℱ8A>!cjnBRSdMqmH|x:M۟PT{41ێ,xL-hcx /y8ٺ:H+iEcD<xlpN;'ʢ߼%t\%,Kv өʽ.|G[hdHA@Bý{ϫ lM\ڂ6chFI$l7aZm#{Rj| }RLbſIX:) +UuP;=S(qP[ާeB'nm1#2r#A'DȩEnL_AbEiI*ػ5?7^NHvy(AfjEiնdܱ:`lrկ5-ENm rO0V*+ >Y ~?HJ;BCiv Rvյ0Oԭ6w;7-`X{b%1인\#rdJ&3'*ʥ5^kf\M S&=~Kq?T=G.YdG\̣t\u碥/%&zXG,w07FϠU5>N+`Kq z/a>i{}@7hQSg"1iBz"k2 H6@A\˪GZueǯʀDĎh(:,أn0q:dtglT\jB/-:ю:j 5kP8@\^2DP,lĕ}&YT@#u潐n'J&4ڙ&"^2QO"2wVٔ󚬓Cch6[Z10vj;/UzrtNIN|{Flm>`%U!1Qd)hoL/2 ^()Ti,qyn~GYXpi$O^Z?;cpHW8wP46Ѹ# cv(Y\}q;m򅪁"e[х45PUo i)N!z)֌Eu爧f{ ];~q=vB9H꽁;~Sv+q2۾~I6Wp2GC3`!^(L[;yqN%W}ZC1]9xAGyRذmW%XJ}]\ϙٿA''M>9lKoSBFt&-ɱbjž )j'`ؔh94)s/:E} :tYr5DQ 773̇/X M{UzCrYU,ͼM&HXuQoy{Z%4ݬqZf{-DzǝB:oqϪo3LcdBhGu7[uT1j55:d$\{*;q{MM]]ҝq,w J<#a.Y@viOksGvG`-ʣ z"Ж K9TIjzל5v! -ίa<էޣ&\fmrIQoC\ܹ'^ -Gާx|0a8VP!VE'a$ln2SGJBz`E`BZ;a/܋)xq"mq5V$Թ%lO ]lBo`D%Y"T6M?,"6y;a3S'^Y>KIp{* J;s{~{du~IQFTIn%w+d{r҂yHT:v=9+xzMufv@ǦEh"줴sqLcXq@Jy,qhܖ'/_R6%frwy3nNwDŽNSUSr]8;k7bK^sb DOO$4 2 ³%-2O*~$K wK/:` 46! endstream endobj 72 0 obj << /Length1 1400 /Length2 6146 /Length3 0 /Length 7102 /Filter /FlateDecode >> stream xڍtT6 ! J )9tw 3034H R1 Htw( JI|s5kq]#ABR!H&0a$ KFcu`4O4=aHK$a!!9"R2 8E̡pEB]kuxp@ :qF(2.h %@:P `AA^GWÀ. 3b7B8HU8  w 們6q5$w%n`/ 8Aa@OU[p_` {0=w`@Uc=F _- J Q QĿS"!ر 8;:j]h(Us1!!! I@|\7u6~#'l@G{A4J u@g(X5鏌]>X a~}{ʚʚ:MQ bB$C*?b5N@O1b9xE`Q ?Cwῲo T=af v|r%KAVto%1BQP>-&X!׳cW_6,`M,sy bbc 468!Ŀ6*!عcտ5 [aߊDb%:q G8HV7RͿ6poc)ٵg< Cg=m7fWTOo5\lL6hpfh8D<9Da0Ku'#zGiws;|^wbfWka>ǙZrgѳP8|9xɢK'RQɘ\0>=ʾaNM > 2,/INګށV\>P&WQ"h*lcU" LM[\3NK~z} Zl׷yqO]JkY\7莊eT:s| JDߴ׳go7ABB1~$vO(̛:2L\|G9*s !arZ_eo]jk=V'y_MM XWc7kC":$7KKmh>#LOʽ{,K<~gshe[]<ӕ3o>2WNgȀ)IvW W;ƹqc G m۷=u.n*22>ν> ?ܪHMŃ%rN,㎍p7VfJYx[!jفmu +c^r<9u/S%^ʪzLD= \e(/DCg^~Q1wJfXVr?b&ơJRaJIC"3E]͐J_D%5_bbHLRZIsGl H"b:>Բ56>v+ FLuٛMUi7(saod2AB%2MvkN&3{\?־z.`'w EKbۗo]}Q=:49xjC} RYg>4F]^=<xK<~Ёjc7تq]TOԋ2H1317Ju4Ot^Z{/?:n _z0;{iBK`VKO+Z?8J龢Z[bf&nh-GzB#+5a??'-ZoB{bn2hMp s8?gVv7D@D ÜiV@N*ƛ)2n$\5ꞁ2RmRü|}u8j!倹i]wJRc^a'Đ^$a dOo v0G[y':q `a?~W/?/1vQVvٻ?nJO4GRV e-B-gnսEy6S-c/ߙZ-E @tE}@N.I:/ZyF8v= $ 楫.FGMB]Cz0|k ō$Wիݗ"Z{@(9h,sbmkjlzh-%W(D `IA>yglS"᧠^0RW`2ۧay R,d^wW3~KBnһ0*Uϑt2?\-paXV#SLd|i;ېV{9Y:j+n'ו)Y= abDSB^ T(x7Hg-1G4p&mϋܽ[I3%Nv %-ʕ@h8Ct#Gc^fH|MrLDJ/.8^M*qp9ZCaγNp* PRV-TI.s۞ێa vL[a#} q(H\.rfmىӂnȏu,Na3l"8E)K`~$fTs$/ _RQ,TE<2xvKfjL-nF8tӱ daZQK"0u|Y~mj\5x h"R;*JEވVXz,Wu,}rE4GeJFe1D绳lx*\37߸̑A p[3m',2t*.ލFVPOAΩy_91  E}hf1) opRd ِ6Bwzg+h]|~mRxJs9|yZۈgڇY_ k)FC:޴βT&>݄7pO|t47hћ̓ڂ}8kF \m~HjV)}-+=H3cqII\ {Y7d!3犑p?Hfto3ZvBFH9$:}frRxaR3$}gFbj`cų/8'k#/86 T*뷙SӰlD:n4RY4B^} !ifɫqWK,phc"łog$ʒd(FXA iB}fSd++sj&\NI. NUr~0íޏ'@ݞ[؉x1U5riσXjr~n?%P|{oiC2鲥.k򻞾gNbY2OolCgCEtpWBB>3"-\WZ~ߊ#dktoņ~b/Gr{[rnԚIǴ#"GLЕ uل[?ν(Vڔ`g,ɴ-~+.t\kRSV-q'9Z0vb1oyxQqeSY6Нw ,tZ܉k-sb7iAMPZ ߻kcWXI!tY6ھvxwg&Rqӎ d4-~L5r#<(i9ZyIhA/NaU6g_vI~f|'GWXU fbED?e*&8޷ev7:;3@kaAS[]vWn\-fڬI`3-~`O;^ea7ie@ OTڼooo][k(]{_m̋^ !_5{-u zB~̟&w Y/elw~axZv]M1G]J׹=(\Ǧ6Vg$ь.;E4BM5 8q>IQNi2?ǔ ]9|RT\غ-AX=?7}b?ͦuCxasQARҐ6χTuxB֕r ʏ e:]OPk?HjOr+[\,*k}EXjG~RunC䚑yPLOˢ8A[QU:Wxl#ށ|$QuUhpWXCjFD?YD\\X,ө>Mi 3 2O W'7!AbŒ1{({&cjJX @ڑZ+6I]iz̰}M\θO=M|vB@4!]ayMS2\qЧƧK_1t>!!YAx켌I9C*ݦYE#1Gaq0Yl7?7ϭؗupWab ʎ7yhcW"luY~28ϥ5n F~Va}Z7h3L̙W(`Ը:h;fO^}SRחhdޱX5V+iTl^t="QyG{MM,qSMSg+Ai~vWҥQZoBb##vTtMa5笫G^1 m.ݑ{Bg.|, >qVyr[jU?zMrmx%ʲɽʷ>.aorIB\Zk]3"krUz<̲Cw,y7,> stream xڍVT]$e$RPSj`f`r DBJIiEii) i %U@;{׺wk{Ύ}k*;hV"` 10XgzX|po~U ԠX|>B$i9 eՠ~gPT^ʿ@ "++#;c0( źaPO)c!p ŠH14UAPM>p] ݘhc6E`8oD(|/j ?zD] "7_ٿP (W 4`EP@"5z X=PhrvՂk7±@)0,# ½Yˌ?[ \_x;@ @g t"Pf˟=~D6O<-g43誙[* n.t'*.!qq ~O#(*j\@?o_5}!'X8Poۂ0M)z4|=={~Dx>ZUEW k@KDh F,U }>(@Q>`]phy: v.q)i #豈8^ Ph,>o/~ b0xY<kShͻUwV* ʏX>Ma}i_fEc:>- +Ms6^E77:$4&z\I!j|lA@ت×{(пK3l}ĊKi]ӲmË򜞎pbE9ɅvhFr.t!$ q6 GA}XyYmX8ޏ\ǩ0ĕJ|j# XHJڪV~fLt3;^DRk;t۸ 2*g2_^ &/ϟʵ?ǥ0ͥǚ^q- DeLA:./} Qڞ bT.8pNѱ/J";daZcff NF8ít&ŮuUŰb`WSPE1))9(xtƥ9n=yQ K4eLPL! &bnIN>g{WQԎ9l4EkK>bw$̈b{dR#}g|c[fMz |k.H>IƢPޝ/t/|՜&%2TXmL]}%ֳK:G nC&?,Y-z0jg6(𱟮LϬ=, ̫7xHZT!eh"c#{SiLͼ[΋iy7rt^\NX^tڽbHr8nx9ޕgrLexr"\h 7RuO$S dyYNj?=ڡ唶SX>p">.E9caIR<ŏ4vRUOjC^=PwiFn zx.,!feap7Hz(f9`ڡrZ.݊B`ǽzp"OT1c*I\{~̌kˁqzWfCp*OgY zP .DEE_#.3 nڴDD2;ܞG)HۈV_zO{M7^IR$c)SHuK(~^@*6ಲ+s4=2b6&LL `#2֜E[u8j b<}V,:d3=hk/V{\.ѦĢ>ڼMOkxkxJc[dz5żZ.~|p d1s ֋7dcVDM]?]snyxvVNr>HF3O{EiZ)&+ةm]f4>qK}`$JZl׵ߴ#r[KXS5LnJCۀ0 L[+Kn5<,bW?"8q ||mg|- \SnYuU޹99Rk [Kf3:z*ڡki~$bVy!,UB-FŃ ӼWIxWFijsgcB>q+m^WZ+5Hᴛ&^ZB݌RoS9R.xmC_ hwu =- DeID(Z9 gM_ AB79 GYȤې,Nn*款ү6cXuWn%d-eHQeN aZ,ׇ ߘr.v輁qiIzq:N9Oѹ,L LO'yn\m!^οQRB8v߈u[LjK0d|4/:ʗ- f]DOˆDi Xt'|k7m88gh6 *mgO .sʸ2T1$B @->&8s%"a2@o(gꧾ4]Q;m:r ~o{W 8I@d<(Ҥ+zVy%%wlљbɵSd~8Oԋ:S+MRiٓ;/,mi]•GTl4O{krMGKNݫ6RLl Gdw' x.72(Wo*w͑F+zr{ Ў}5't)"(t4h9E59@.t+INzq5$;6 4dj3QV[ic6`Wy_>?Tcu/h?0p'|MU\J LfKƮjt,ՇIϹ݃ -Cf5nwNbgJK"_f꒞tz.0X.#j3MHVFX{cЇ# WK`bUwm'c I sxQC2_k5E;+z"<_"'o(* BT,dlz;MfM߱eJdMTj. )nDhkm.樛E\2_`v]dG:HO%e0%$/K,Afvۯ'@]VhcRhUD.&R[7JՖ?=bŭR4y7tR2 kté95f~Q~ʿh9MK3eU/Ø.d$(i$pVayScD7N˛WPoJ Ak,FDWz[N`R-ݣjỎ/{E 0+V "'U>#%PuǢztC|FD-N^b_jvk!l00^FSSP跐V9䟃̢WD-%pw/Kk'Ć};LE9c!mÕs.%KZ5H26woo8N$oF7YBo ~N6X<\}/Qp}֫Aflg2#۸$y)Xb_c^D|'P9A3LخUԾmv;K{DcZpڋ:6SH60}y2Ԁ*{b>r`zӳ׼euHPrH҄MtbFI)p$W /B/S@zvUwj.SXC綾 Fe.yB4bB//L|x+v4!r}bnP?*ƨ|\f Jԃo9U C)ME/ 3T\ =iH$oG7H?G*y8M؀CJF;JORXFo?N.rk 4T>, 9 Hw-^c vk0q("*ML֋08}&~`pdr%[L-hXL.'2V3rHrኍAyτk<iU+ӳ[ hl%^]#'8@61fk\"w(.3ȅ9B"NTI[3á%[5eM\ VLgRy!|$alJKShyZ51R[$]kV#qBGˍAo~3)րSSm)7QYzBL厍 Ta¯ۿgdTwksw6HO͕ ]\Rjt KI-giB;dQpUMNF^0.8T* DTNQIsdL%zcfO:DiG =W6>!Q?JC/;OW'#]#i=Sl"ÌLچɰ^=H"'k2P(n(5Ἕ6_s"95QL;wҾ墄 os& F,aEri#׿{ӓ ||ě(xUKl `P +&J}VX^(U |R9AKKX/&Dƽ,aB\mn* 9<+&cQ?nr\BM&q5iOuƛ Gclw\na*.n0ݣ| }c4`7y/]jO}c b\Ky3/ *oԻQN .MgY<$a*fn 1U!ZtX%JA}fs:HjLUnGhY0tw[8BK6o!Nz-r A&{V|Zߒ\v )zq 䲗bJ']RCB?ib74gcvxBp^f~5 7Hx|ļ~GkJsdHñ2U2Rp9}s8 !-Y>;ijq1 bm vj[p1?#Xk}8A`OöỜ^Ϩ^Jd$*jIBk U7gσjAjȞ.~''Z3 ;h$;k)>$_ L\0n'@ k=?Si7ÐKt'H!y$X^eT-J3B +T54D f)b\*gS4I(@ endstream endobj 76 0 obj << /Length1 1403 /Length2 6102 /Length3 0 /Length 7066 /Filter /FlateDecode >> stream xڍx4\ڶ ZtE-ʘ cFDD JtD-ZtA&ysk}ߚ羯=u홵9  H:JTt-E PL%4пDfP TAh PD""@ @`>Eq }=`NhLo<`^p! 3 S ``g_L|ݡ͘ݑG@#EyAhOh:"@``4C;; uk9; HG,eig9>AQ) """3B8"R٧[?3\(D13X+JH An0h t- jKPZhF J' E ea>P v5M C@ (د' & /Fd`WSoUC_b<<@DƬ"UB> B јf@#҃A(0+9ہa7`O~SZB}`i$X&UDy0rGLeo8k晿~Ce{HSٲFosB5Xjߏ:AY HQɧ1Idָ)ӗ$6^~yqՁڰOO:v[q,-SzXgxh^a?ş)]]N_SBjH*~驓rFaq)%Er-K.,kMlpS ѳ)>-׵xdm])9Y)2g5t0cZ ߍKX;,)=o 2Fwn$+ID&M~se 8l@ Ges莀з罰 fӻ$3DhE{Nvk-f|jZdoB^dQ~Ak{Y ŌV#IrR*׽2Ʌ5ɥ -P5@^z˰MDaQ[+g=軉ƝMeˉ|k`;ҠO~8iϷPǤvN=nϔfkw;wچf)àt?{D1AESuuHcwb3k z?*(ɸgIVpIG|GIkFa9;6i w97R]hv3}je>) S@ga }wJڽ 󇌪axіwJ#( -Z\ډ6ߪj.CjLlhE^2ef6'LbJ]̀yCm,E=᰸j4? Nrn(.Z!`rB;|{UF_l"?J"&ٴnŽ|cŵz\&aF"ϝr4[rV}3 q:V2⿘@'k+vUԱ͛-] 7C=]jU*S+7Q^ o{ƴ,qݛ^F*iE9Dvy4C9d4OJZusYTM?WXϏD؁ЯƃZu#e(G{Öm_&Z4ei/P L]4|h!+iJٴDWnGa9ŝo:BҋtVn@AB/Y@,-dcK$װ8*Y7(9ead#Tǎ[QcOd 33Wӆ/DU}Wj_NTKE0H>rC;򮫾u) #\R"W|q]ݜ|l x~|dCqV8qeŖ7d'Dr\77VLn^ vieC$~),GPX4Y%Lmc4~VFe#7,=7?) Fz qG ,O~/'+ wD}/:`5,뽠 [[4_eٜl*L c9 )I?JI%lq v &25{H)J[er%iLuaPYIET~vPQ` ~*f۬Mx2Tddujwf7 ܕ띌͍D{Qsqi݆U[]2}s28iMK )&*=蠖ތț%HfݧRq}SZ .զڧT>.-Bx"5ӯ:V8bgIQ;eT9i\dhtrykuB?'hɛ.~ W!%j{:}z'bKE&4;ҵSKctm8hĆW!b2aL koN{YQB 8L/y0bBD ]+*Ǻ| ($`Dh5^2/>y*37􋘤yCaZ\wNLuʝw>%WU~]П $^PL8JU3~ֱ!ߖ%7=[* "O "WJv^0k:~Bc4WHTWm^3&R@%Su?_Τ6[pf@rrݩ=;6\T+ =} 7~b%3aZF3&p(;;TisNuᅺZ$ߏ[dvIiXio7Ϣ' zơ^!]SuȌAwimENuְ>(ӹ Y z&\A G BԸw1j"ۮ?q⑅?( Xuu,#=Koy-owk/N.)$<)=.mN/s‹5yMʬɄ1%T BZ2 l&/B^h✚ڬ Ou,^&6#D-+WɷꠂdKҎeT-s7]xpr6?^`%Fazjh;ݝ?"ړ}NqZzW7:B5@ <چ@zɊqCnL9{K OBB;Cf+CeuE+\2K֙²^Nnǩ_jx8HzPKI|m^mj<]%ZtIpqm3bkޜlCPB#ڱ ˝/a=m"UTodY= OHBjNERYeeюv-|UAFcR sij~.|zCxrsOJjuÁKɯ@< ^:h6C8joH+tSgMG}.*nE+%C]/\ ڱ,_1Qwɚ[,fHȣ302- Rjzkx{6Gqn͹QZg⩋ ^-#,OYT'[lj= H2*N)ʱq#s{'2ʶ e)b;oՅ{"Zq8^/in̷ǃ^ bxd((Em(S[ S}?=QpMlA'Vvݶpz?.W4SWyhNm42}IZa[$Y/ȩ Gfԃ@#ZRec='bƊ-.%_N'ub-)xg⒮K)w85` TQ>EykQ7wKn5[I=rXw64L OlPtzn^.q/dm7e^b]Z X#.w=v@N 턮?ܱ$(qOoZ*ՒUI׾Ru_qK,*:'IM4>ބ;7-f" bXSK h%%y:_mb ƳbDzk<5epyT{&xZ~eaO)V?f^[hU y6>>(l'Eob̡.ࠝ8[,dJb^+^L7.M/sn;9;a;<Ł \p 1RjH?Q|AERޟͦ_)tkd}$l\> -7ˢ>B p=׶`u ca> f_Bve*Tk QrҮz2w;ц'NcI+mWWy3lS? -ߩj37mǸ{VSry&A}dv7?_{SN'IM?AXq3ܮm.y!A12ߥHEE)D@vAl6*LtBNI{[0> 9&w)d-'"n:vVXr].}J-#IjIYz`[@I1&p>6sxeRJ9ܨ g2}m RtG䓞gY@u17v]iצѰ!r=֜"R񒩑+]RV+E '~/MIq8Nou1Mz[ iet3pIu7Uk. &]$ױ2޶:yv'Xbo,x?!gdD_Y6(]}vg^9,Tܔ/2VBMIİ1QTWŻSƖswK*[;,^ (7NR=_Vj8`[,@ guq%0 FY7„4UuM$KinABk Wi5t$|nW;rb2(!.KK9-R/hlmUAf@0 [pאzbgJɻQjEzNhN{Sq̈́;u, v;M5.}oѨcN&*xY endstream endobj 78 0 obj << /Length1 1144 /Length2 1528 /Length3 0 /Length 2250 /Filter /FlateDecode >> stream xuSyQa"AXHx\dDg"B+1+|&WY#]AĆ#t rt&TA>Z4s:¢gBvP#X4L,SB ]3i̜!>@͝[q?,fδ6Ptw'alPXp+c62@gH4Lx`Ѹp;џb B;E`B !@5|SGa5 V ku^(o>H0fn_T06x)"o1WB;Blľ  îWALd3Ep?5wO-47˝dq\xӽsiiWsYw! 10uL 2)5,fμ87 `px.1"`P @7C0sN0aB0 Q̯4xf.=eςAp+P/AIg'ϐc0nYXm,Zn+t^fD6r)m`9o9L{c" j湥i0=gCT~Ф5EkcϝWFWO;T&#񺓛Qz|%1͏(u#%[҅S.x^Ѡ[ꨂJvU}E*&6޼d(۴dzt̬]ӣ뫻5S^ّX}Dkm60dx0t~zli^Kɚv󶞆{k'֩#%ILf=?x$6wjVurhu(237k<]iu4Mтָ'" ^&?S^PZo#fn=q-ޞ'IS 6Ɖg'v5+:+E-%F#/7삯O$1w_H\W8PAݓҨ@BT9>2hZJ?U7[qf*L&\꺪#oXl-Aih\Fѹw)}ʭDءx5{b 2+: M%w:~uxe[ؤ=j*/ާ z:V]q[e"Y)sa@&YDtd[~Lwp[:eMY1uX|ƹڪ~9qluL,a$+o[{$mr>[4|x~p7>Qi\XZT< 0\8e@<2}llDUޭ\Q=D-)p#1ve9k|U\3)J)}AؾގWuЉ<گ4kli3[}!FW7=81&A[%E R9etI犓%?Hd)g֍{}:drވ>~s@ҞhReQ? {#nq69WxKKԇn7r겜p=*VmI.xu$ #c|?M>ՙe:Y`{Yt2C eͺiۍ{6i8U捞5 K֭^]%+ ڍ#VE\~E"Pk~%lLs+ęyoj UVHF`iͶ8QO 6kKZ$M sSC] ąhv~B1Ja:`:>LcKRa-4&w([nR(UK}5*a㧬'R4>o R:`4V̷(2語rnxjo \s͓T҅ اPPhy`#qRãvEjA fR[SiNuC%eNy՝թsG9޷h{cdE>!Gm,)hi|-M7Q21dՈDZêhEm 쩒\h endstream endobj 80 0 obj << /Length1 1626 /Length2 11094 /Length3 0 /Length 11939 /Filter /FlateDecode >> stream xڭveTۖ-܂K(!8] (Nn݂;!C}sߟ~G%s͵{-&%$ qp Tn2 xJ̠`$YANN*-@ 4tLL0Ok+@89DM ANE r%XA\8, Zse}Œp\@4/3 vu}].f@!_^V 9@^#^}`jW x&-P3_]n5bWK^a^P3+ U:ٛy~srMhO=OlQ u[rpִֶ;+ V?nNs= vJh Y@% ;Y}"$oO]вn*f 7Ș9^ேJ1s{5Z{)@^G"h* ;+?`WYR Xٿo%zX8la 6bcH9M}^vEH\.wj<['L?ܚc[KĞRZ!3B#Du3;ֈkec[U::[S._IAFEnkac(KbE5BFnQyj*jZ­ ?a@(y;%ɓ4UXkǣ(jys+(IA/k"piPL"J}эh?,%KP)G`ŋbc|(>IZ(.8]e.H8\xK-R5}bJ8 ^YK{m]"BL:lpFYK Tdr #B^Pwc^#&;oFh!['ȂJN9MN9|7ڃ/W}PV/&~ tI$P;OhPuA&ψ8ٳcon p{ܝᔕLwfR I7Xx=6~eH޳&X(vVRD(\[V mO*+hlQ:Jc-ѳ~u\OFlZV9tX]Pga6Q3NM6:El)y=G:9mXqYK}f@S%\mIEk\VHh[%5W](o4m]!v Mjr@EZTy&E?'T|fk6:CКLKF~CAfU<- iIE_4ԅ?Y3Ee98xNi@ wlSfvSG*zZnU8MMU2O YfQz{tEg,H XI"l`cWN鄗.֭qkg&G+u޽"UF.PY8'R:-V:FLpE?`/Rf @V׫uW)!BT:gi}YzWp"|v5Ѵs=Uh-VPGJ4JEPZ GY tyWBy`!YrxBʢ8THGqv) TK._dtRۦ9\,xc6xxRIV#ߓ/kSۆl58Minyz٫CpIE1:ءatjӀW_ W92gMzqg٥'-| h8|jlӟX+W(_K͸hcWpE߱9-#^xw'L)ߵQ#B]n@ltu>?: Yf.͝덕T~0doӛΨG y鍲#.|05۟;؇\9/@'r2{,}0C?%g&W ٝB):%/dH gNOcť,5 .GKVSq0. 2R#?]}WgJ[q#&1y\iq& oJzT[xd¬ 8 wL'AXFF0 ~Æ\;,"e'Ew?i+ $L+.CΣi8 ҉u'qL"ֲbջY-*$`ٰF!r9PZCDZWѵǘ+5r̬ #"'xc-;1D;^(c,jkӇ;DneBSha6^@l".fP~%8 "do#E^DOM~sY./%S% %KLD Z/B -QaS:dڲ?R]B"{V/+c|`3ļ {r)fgbcIAoIv{Ωr\<۩#?f8s:S|ߨm+Ϡ(fĥ&:CFJlmm{ ;Qd5+dzw`-q*<Q6qq'F΅cVB,EPbwJYIbMƢ&u/L;fjRJ2QJ=rZ_`뢗ɨ LA$3D/|.F+x^8Ζ[ 45,_xܳ8ZbOPv]71KC+p!_sFZӃ<r$"]jLWf'&:i~7|99 =BE)W1AA&Cu#u˚e=tɔvMGZ~]<.oHAq[Bw3AZ"wO FneɄ Kx؃/ \Mc~[dkMquTRe4N)nxB[_%r`c!F"+ ,ld/OX"YX 5Cl=*9ss4r/PPmA=(&B!bR(z$.8q\X~@zj'xzrӄܘEw Mꃟ"+ʣxm*U} ^;G-L5O..Ӳ "Ows>rAs9M0FwG sXK}q;֓S-6ox6HN9n[|KΝ14lH#x Dmg6}v9Jw$T3)јc8*+djp;/ӵK6r!w\VݏׅaMƉoв؈F3!8roR2TSWoZxrYo6jЋrǶB'I ĽE+`$5k2 iwKzS$?,RgH}*-WѡQԕq`]E~#rxxQ!( 䍑]2"\)P{zjcYf ,e/8~AZ}Dž>n*wa oH'Ѻ]ͼVkZbiPX@J |8SIE5g3|ߜ2hrA`qA]ܩŵ+ C4+ dr2֎}ZPLGl?QI lQ(G7I/]7]U۽3ޙxĬRE6i( X)I<;߱D6na N{TyF6?>^a^ijRqp>=V`# zy>9|(PM`c0ΞZ711Ā,#u{t'Kvθ!i3xB~4cUL8 Z/1>E@Sdnաğ6࠮ͫ*ix@Kß jqd3(VU6]~aϳTwI#u 5$c%ƒuLI a5x, De8$4gdNSM6Cq.ziV;DG͚֟p_ ZS=Oqk L!(2lmkx|DXZj=ǧ HEMR1X^踟ocM]SwxZdګ,UOA''<ζ޳D?? wJBV"_$'Rk6& M~? v^c7X> r]eo[cZ Ɯ4=~f2mQR u6!,!8N1%?Ÿ˶l 8NLS:++oɹʛ+u5/G3EYkĔ& 3w\y &(tqIG뮘]{{g{DD22l1{@nzŐC-/C/W.aNdBH1S?g_]Z(L;۞oOnrsEb#-C+̴T7ԫ ۜdw뼢ux[ ;'0ϑ]r9T軏Gr:69?&2K\c|v605yٿ(\E!B{%]TڰKUpٽM7uS&mbuY.527Mq ޭW&i'~D?%;@vg]jzo )-%F!q} Vo֦Wxגp8J?w%Ƿس<[[!e3hGb&d?Y.oe|p5u@jkITOA!]ھ 1PjQ@vT1Gaavp6)ir˔tےNݜ2 2~(C`sCOvޗEtbX+\yqCyVllߞM!} ]&ڰ=!ζJƭ#oG`i}XaMڈ/פ(࿑,(T-> }w0ȳVi&dZ;U:C5oEDžo9xdpo`gy=!^ÀoRB-ۿ6ka.ikHHMw.D+TId?ԘeֶDKy"n]ILO. +wOGX6 ;尶Kh#Vθh{ӕmZ1q2a ䷹ ag]m&SW:<3)ך\DXv3)q /4\'!v ҟ 2's, IS16oӜp8e"JHgZԥ+-zHQL=( >Qʋ8OG)Z9(Ƹ@}>~bM)/zm&7-fR3уt!8oÞ?}4#`j/O}썈4[| Ziĵo7 Eʬ^'ɿ劌ƨELs-мnMlp?LH{:.x?R@USa%=*pNʹ݌ EXa@ qC6͟7Я+"OmŖ"PGtCUi|P!4WQ3adO.1`,1&B@ơv JL3=gAC~^1C6"J=\BGH,.n #z=;m5vRI^`b˭{.b<9:y?r4'5L bwC&oFݥ!ª*ȵh$)~bQɃIHPMbpZDF^qŪG!-im-ef+:O!%߾i)&awDaNeJeRUG\-3M2eʹax a/,"\%mfMH8MAQܩmJWJۣ_ҐKƮIQx{S(EZ*[G|nTn~c5[Yh00ag'GvR'<*s+OR-ȫif'_Clw&`ozwǯVnPNQ}A~E }&C# [t njcd:e[e:Nk2 JYGTە @4NFSR>x>uLHR'YTXKwr~ೣI=6c޵=O KJ$mYgp!2ǔQhVc0Đ@a0mq'cqJZ:>%kfcDLL_Is2ڧG=ְv`E -]o`aAJ}i@qdʃˍZ!ZżIsIlat>g&l7r?]ï> ;~C.d\Rn:]2]ǨF{^9ކRp^ ))JnZeoŬSxH bi<-=8\LVѥJCKţ#9&fIhg#2uKk7 CN0Xi^bT>ߛދSH qhNș)yj~M"(Y: EkH̠".c\jNM$r/~͉  Uޚ$UcF4Ki,ϥ|#GƺK+_s5XBQF7ム Cުޫk$hu Hb7q_ןLJ*['ٶu+S^pH"7^}] Ff4'\@K形aN2,4Zkaҍ v澞 Glv5lKW CN"L!!Y:T|ӄftÀrY%a(/?+E%Z'ÖY;E:"Km3'uA+?$ 1ѩ ;%1Ĕ8U&ΑS wh>{}q-0\_z'bĵѓB?3ORĽes,W=zX gD(v\@XXq}(ELfn% H~kpؾWfFuw,x%]HL#yvk shُtԍK2#Yؘ,<5ܧ+DhY6Uy~UgsJ\3& F 8V\wUem,0fLc=rETz{h Pߟ R^8}o0daBB"N9,קxA\$S}ؿ% 'BA@.zJ=a^YZÅfp}o@m;|f;nؕ70pUzawüSmSK?`,zrhXZeLZWsئAL 3jb#~[dD1BiX6:QstHsFQ慆5w-7Ƹ"~jLP+wb5!$5e9Y YtjyI> Ԙ5ÚJOXuƄoҦ>*H7~%K,nxj?c\:8 |5Qg ldKiK@qtZ? Vdžj]#|߹e:=Uzr[,u[h=e62v> stream xڬeP\m& [wwwwwwww'Cp/Ι3u?3Ǯkkݫz+ %lmx k#gG[k[n9z3௜\h3t4&11 Osw;T4iiS ?4=Af6/.@+[;k׎@ 0YJZ *I5$`hPr6@@G 5`Oi c ; v@c_71` rt9 m1r6_9LdUIL8 ؚ45vu28nN2L@vVs f gG"8 LOwNRme?1V ,s;mggVmLmL8Q33AXL NSXf#[#r\_CK8[Y)Z%chgrd?v2a010[rM@NSC=\`_m331ws?$[1_JIho wwG5&O[7'=3 _,or_?Oz%?dhcw_V=4_[5 HLwc +m^TWc]6i}@pˊ7xOMJ_EI{_~y(~7_mK٣qjC,fJ³sē?C#ýP9p伆>gIN??^\8Z5jP\=_~3_} 3 -ʺ^ İ%M~ѯZ>_XhI\!5E.KoS I -fjěH3q+kGr G W$ Gw:y|6X}D?f>rxcҲ9zyQ)gŇՄ%R1mQsd F09Uj7Uj˺'J:>YW'M=iA@l{㈖T2Y8<dwE&:J_I2lX(\S&B",bd~01Yh5x;#qtL#ĭcV|ަ7aD_}*]7")\\2r1I ރ=u6g]6R̋,njki@Vn/wuqn(Y͆ Ŷ%~a&oA 'p\d؟/n#P 6s*{v(vznA@7:WNnf ݯ7)*@x Ead0t:ȓbČ߅缤쭧n!9.F}o}(o`ɁΛbW8M<&xyxcAMlDIӂ u&H}/9ZYGlnدXJ5,C^)SL{PE͙75t(Pmir1b`s#8'$ @|!+9ҮRY4xfRdj,$'6+e&T LpvPƑ3tl+^  Fw`WagŭӒOƪ9 `B TX~W(p:'i#?ihn^ P=#phnk{Xy4GH80F̩Z SzHL_bѱ}z2ZeyI΁hfLNɝLT>5'c*^Hʽ~xi}|8zrI5Y \7g+q㉛|# dՇJH.t[]cS!Y$8Ü|F_GUUrl"MI: 4 \w>Ym[\Av`i7)Ę}L~V$~,خ<.W@Ak5YP\VXܚ i{A-VPsBO*V`C' i,&#{"GA|pn̫5^Oz0<^dѾB0Ԓz=S+'~ThT 'DknFb e&itqd^pŲ$&4~ E}V~cҜ2\1H$-;Br[BW$3O7r4Gh4ˆM1 i4Z" / B}bk/F6k™f5a9 % 2r'Vf}7$W3a/^i !d3s 7݂+;jO1葆,MSb,c[2d=t!í66aE .2e4LJTw֙w/rcoc3wF\^H4ۦ.{-SnQf4Mкqe,`*f[VA [\C5BDI[7NgG >^ԞF) jͮyx]ts O~wUH" y=cIv;5jMO,C6i9Sgq/br:`I_D6EzZ _-ź05UJg"ݙ;/eLc FFU:|[ySI= (־{x9N%|Y۔@%Fl *ZHD?ڡDa%:ﻕeKfDBCoStXʂla9T ,$1>vҧ޿˪Sz%Kn Db>nBM3k#:CTˀ.-&Vy=M=^/>{&{D[Ag糠' jviĔ(e3ԞW$e/{=H޳xϲx]_ qCVI6jгFne݌|VxS+r!bxYޛi [˃,׌KfЎ| ;$"@[5 y<>ױCFuBvn,!C{]pm9/AwVN9K\C}z;!!J"G>֍KiF TkE[7@Q,Cٳ<$r?G/ rGtQTxQ3DUY7jrE%60XH'ml WQ?/'q "{sBUlP}3_'tC>:Cl0.7s6%aIf$pM&0lqxuFp2,kZHg/XIѓ4>gi=QZ.䦥%D-VS;^MH' FnuCC)bTܴ<2zhJVKViqtXiEqK6Ixr6$ФxKF.%ő,m 7)gHB#g9C7UfPgt_-Zu Y- FEAA(-؈όw*%1i6wTo2қJ\Ȣ c[PEv 8 j{K;&߸mQ|{[Yać?yB%l0"iQI Lh1khf`hnVÛ :t֟8JbVq ]Qee"%ʩIce‚KuP{O0dq=%{DokzZtIbfYS~p`JNpCkX\c^HX.LֵVnK/̩*9aTž5%qq4JlH.)v*15%!Ӑ(pqMOCf^˖;/Vk1W0ٜ}6Jgh@uxwsy,0tሉ(:~ٕBբk=/kCE}Wl.}pE q>:!dzpCu7ڰV2S XUk;LܦO%;륂u8q[]sᛨŽ?SPpѲmIL:TC]TIC;.`,,݂@TgMH!x hD#9@+ʧXa5 4״zHu>b~@V=#"&<DŽ=xs`T>יtHi}w 碑8'w $.!#sj@c^ri s6\IJQz5gqG=[q3Coś;(ݟ6EJ 6"/IwjXŜ s_5'hR:$əY& E;Ѻ8bΉ4OnnZp፬%W݁dN?zS^8#K;zEnFȓ;U#\s[UsnuW( qޮQNa"Dh|(Y^oAʭL֥h1k oq'"ԏɝgpe40Mt䨰A+U`2ǾjwE}юHr=t|Z'?zE(gƌ'/ jdZE6;2́z^ڡZXU/N9缐'X<&f_NsT T (!@Xܙ}PmecN~[< .Qz-3RXߪL&[9U{ؗ|j>ʐAّ%оdzh"@~Z\%d!F`_令6nxok>l.c00mMiN r$}BMȣߜNqG$M+5J%Sqb!SP+.Րh#cd+ 2=K~+4;F'(ixmt!§ #}TZ (~)@<ҌTZ{gu:_?2#Rv[q/*%4֊}M_XŹL}FnxN1=">0ڣv!fH45I{-vŽĬT7m^(2B2ʊ$X-p6b|.GyAP܀0PY(;0*2$|#x-Qĉk2\O`gCEOF P&@"SQsH?^1m'rn!D2)2 ٬ţ1'-i;O&>WcTDv HH&{rk-S$B9r! >o_{Q)I*-5ibPJN\~֡)wW$Ҡ  6hCP' Erb,<Bt8gXdtt#%&GҹQ"6Ql ,}hXrtO;T:$X &DA6%"qj)+B[ոg,*9夦"}M&2LN:ahQ%1B6Z܆@-M﵆'sr>mP3:؄ZS5C:Jt~JlDd]%Ai2 mq%-e0#U|Ȁ}['d,raϢ:-퐢uo|x Ćק$a8HC f>8/(r|.ryiMpf)J Saע?rmQҀWA!weo =$:,;:gi7+2ETFƘݣ=)V#ڟh,,PH| Lk$H2ϛx.>R5ɷ6R&4Ȁu!%"E^Wn_x7]=YWGl8jY8:Q44qbfɄAk2ʈ@n~V zޒdV SRBV[E4)ҭl!F nyJFLrdPg[c KeNFJ>DEbIXT*˚pN7R{O ?ge=l"MEAVW[I,/\{3LfW( ^OpYYB =&xAaF`!$>n}F'e <{e+U+^L*Ť%*Img:FQ宅,XH-"4AxBM]knaRP䫖+()Ƚէ{RF+VGLx`*+\ц#'hU U.\ E EZ!񵲒)O 0G X_a;ɶq =KL^'RiI?jƏ=q,[5R"7FU'i#sy.Ok^3tos.r`9#:^NUhvwHbYJ1eyeŝp7ҜUI=-q jb 1R⸣4;} %v׶/pLi<3zT]w+6@SdT)Ȳ4JW;7{c:|5\C4I0>UԙN +'?W۾04׃Q>>u#sŮ [x5x3e%Ք|x.d:f(Bp󋉩ׯHG1z*ڽҿW "|ZR)^:cwϞ33f9Hв#YB_2Vrt-?uӾ!H. PfUqG{a|"_mر -e2K6W.`ơ-NL!ƻc|S 른&7T#H]:NSņ ATR.KV'[ mtSEXhvv b'YŻIGr5!f?u MsxNh"P(S!BLa!yWPP+vϋ LRQgmm-X/0a)4<ݩa+Ap̡;J7(`R sV{w皪<OՖFﱗu:1G}5Ѽ9M;~I&ďca Ihf4JƋ%tiɥ{7} *OUkԼq2jXT,0]`REyZj }G[V))Zy( 55`h.'~^_ %{y4\ڷIyaAJP{@m -9_PR8Q-lR>P^6A\8!pA_\E2UE Krx]\RI3ٶm@w5njډG$GA2iq7pPBFB~ϡ&M*D>\!ߙ-3Ug $zIqZ(8k=O[mаX}`bs39BJs Vn,:4ƅح^5ƞ$èf |Ʊr[IaL3˔'YޟDeĒ8$`0lx+ce۪_Ҿa^9a(:;#0ϟ4KAC'}"83 3?`5N Kf@zz;!A5SVj + njԓfUHXn6c̶/0ۺ# fXݬL@J.E6'¹8bbU8mc50/~~Mv4Tb%b8R~u$}F|.! Fʤ%<+N -0a|rJdDA<\G5POœ<4HmL*t}|4 MKfY]Kt'F?`5|Vw:G[]uG`r‚y%K_=m:Qý2ax1z eF,(s ["E3}&_3>[\`Z}ovzJIE[`o0ԨͫoSv\ld ?=%A)chmr||cyj )0p͕B(OFr7Xin P7M)֒0Cl!Iԋ={(t%Y^z8}7V=ߞ|˩]= l#i]fbh, OׯlM @-z ;e+ޱQt( UD]b6~k`9L"0Ը: 8W[Y?n)+'R5ty}Д}BkuTV:}t7?!|<ԽucVNo҄}C7kojO+K|5RtwoXXK!Zy b>Du5. 7Wn3ȓIa"y%u/dW dž*_ f9qU޴_S{=-e:f39G,`9PFKhcl4ȉHWDȟ)JgH~~)$$Mb}efrjkMq}-YgXOTQF`}A. BJhAR %d<Y7Jw."E8⎾SCNBaEO?U )>w NN)52W#- Cj?6E:`IȀ v!(֐yk]3n1fW2ъW҈(;*ZN}DIhzo, |H$(=i#ǡJ3qno ͬ:$Jf(%qp߮3kGazFQ\p:-:V<0!|5]A@.>A=1[(ؕg\zb%FNɱT<ʴ&n1SL/EyYqG(7CiKxKgm5:Mx;JDP:T6yQ4LV@m9-YE~̈m5*0oJAVo%bVCuD~HN`{q1R{9B&n eSF5jcz^z5KbU@$yX'D g+tXlu4#ՉF0&zB^ ?S16;8{tEӅ',K/͌]PoWwPK‿e ۪2ݢ뱛59}ŭ kǕku m!1}5)O<2tO;Fm sӦŚ\T`86bq$>]NGCG%fmk݌ %pf])?zPd6&D<܃$q>2WѴJʘ%qP U'4MxQz \OɃ JڂAcMYYƍ WɌQCfՆf aA3Ͱ {2s;)Iatyn7U^n#+r8|:aT{= )sEpRKfػ㉛Jb.%;3םtf`Ftt[b.Dz]*Z 2{5Aӏ5"[Iމָ# *ˑHi.k]>gaS/i) 4$07EtxMQx}#1}32ˁڐif0d$8?U d-?8ry9OMQBm>F}3cZjҎ=]-[@P2vypݿDc )oד=5-W>(U*_tk*i`s#=#sd$ӺU2 &yW+*4o I1ZU%jmPd@ 1 L) 2R+TK Nt"yʰABۢ\@N4j7xIN 3]hhǪ.j_Q!UicW'DKwZ՟iiBAB8Sܤ3n8ƾ$SgR0ciWf*B|uؒI \^XEG]Hѹ K~y`^吱rsLuIL Rfm#u.nŲk+6vSW?J/,/RLP* )FTRlTy>[ ?/(O'y-/?MIloa},6jt9_6ۼAA]O_]g9PzaKw}|QQ[y(!@RŦFa؁` d^C'S^cxX $">>y P}mS5@3gPTd҅IkkaǢef SSa!4)A)Py@<N&Ȕ3#`#aĴ ㋋VKǝ3B2 ?BT=9A>2k.o*|_ZAT&8V)^Ȕ1VڟϙSm#&|ŠIA8xȼU#(EHwtaV,vt A;AIr߭ۆNt.R0y">} 1o(ۦrDVagTO\DJ[S+=-Ybb%T-h8 w;`[)I G,l)SC$2z.+o: L0ۿ  4 *g;#_ML2%zZ4#C !hPri +eĎJ&oL-c Ewf,gLldL9 ?4S~okmm<{ ֆT!Q̽`*#j %{s%0 $m{Co>*\~JC\O}C,9o\2*fr.<`ʕ͏&[a B9/!፜D/>'hyV#QCjf핹tҚkp d!JMz0LM7HO0dtj)*A 2 ū}l#Mm>\(@5C ѕ}ۏA~J?`t?mrjShxJ:ZP=n_?#6C\hdt0WXـ-JVo2֚[q̏oْ5HqPgػ9+:~,W,J 6F갚ʭJ7|MQ}5ox?-LL4yv|5aB|@wO _; rꙫUu@0jw9@@0 p>xH:x?  tt u}8d-kHqQa~pgWۈr_կy%[}@6487)ٺRyL=$Kb\/l Lc^Mi}G7\7)I7.>f&g:?@܀BZSc5ix@O x); p_[Y=ƍb:ٴ$Gs;֦@-ӉRi6{O O"K_^5s/ƠT8NnM-uBl̵y ,q$u'$jK O%csYNOSl,;:*$m,ZhyR#.P8bpʾz2zj&M15+Jt-Y.pq$L#g F87PC1zϙ}W  nMeTwo?kl-IZr9b]+$9.1z]wwTJ/ ̬B{!*:TtT21F RdmB+Kb#UTn6V^+[Ră#$kd-̄ B.p'h83#V":U8(4d$È:P=YӗDs|-"Q]ơ0XQ(/8r^SVbРXj:iT ?Y+͝ ixF8FJ'%(h39{jINFAHew#iGTzhvVqvŁsq^* gq%AjpRsT~/ +O4?^lAe6ҍrtÄ ,,x6J \.vb ZǏxgYqO}c+tڏ42x9䍦0M^ֱkv"0oIvsQzM]IݷL2\,%|W%sl9cIőt ;aCWo?+gO:3ؓ6*̖t_m6J_2*l8.0HSV\ +eOH)p%U5B \/6*CK-Vk̋MQ B}YN2 T):d_m3o+F1};2D4=yUr)ctrp VQjGFLHv^s n+wY7;f`~Wztrw4O9܅idq%YWa3qViz@e{E"3&LjP|aˌ )Ԯf(Wǡ#C#QM`a.Nڌa=3>'iqqԃ%lΝz-rgJeӎHڸtҊt:W ~Ckp#J-c_NNIVl+2u6<{Z@`t0h?NѢ+襱,`#ף*,XhS%aʹ_\bmڊ'&fOl[Xu!M% -|,Tt6Z&K7B=)rqAfS5PympŸFi[#DA6ҵt02?~᷐*XT ΅SLp5>a 4"3911N;vk'۵)iZܚG)2a(cu6#"YG2^Ґo4<=1x*yj9$X*twa**] s,53 k|tPp/-M%ZGʡmÚi Y +P{ҋ6g~~7,4 -1{/2jBŨ "F7#/*K%Zm]x}މ80F:h3笿ۗ0wd"U0ɹ'`?+zm2J/ͺi {WBK0UsN}g~KkYV 7VjSzo7 %ᬦ|B_0Wo` Uj3ŠYlF y r];P;EUHO \-Rd0A{G)R_Fq^$6SpL"DUc6w ɏ:TTQTSVHIܖ=3Ho1󱳩b$O g9sH1/:t98OmۗuJQv8N`x91{rtӶ1'5ydy[@8YaiqHt lORf7?}y}@c疽;+3GZā_Cxl|y8C¼ KaD56rpv  Km;}%9q)O/.¢EiUea[9Pv B;!DR`UIԂQۺ%w7U_F'\~xx7n73y8 =G 3ƹi6V\]=^붼ez:+/Gk .9FDX>W^?>.G~H}g}WhGt_bJ;qGE:2z{x]~$c.3*'×_:r-Hct9[6SQ55є߁TR.83z(8-N\SpG!3mpWyC,N *%[nuxiYٻC8)7w<%=\ؕC9WmɁsރJAG/V Hu [ؙ/ 4}>f@QH׎n(vn69/0XR8o 0sx-!7/cvknn̘˟Q8-rf2IE.JXZ)d!AiJc51HL}q<嬾շSbQiFd/:TC7Y27]G״`.*ye*oYOJB4ސ;| /sjY(Gkyb e4$z~Va6IKDexee3GdyqU%zu96U(!*6Q uhU䪛sa cvZ1wPSr~2a;ڍu!*54"|ΊR#:[iUf<IPf}X joyY7uyU %6!3Jx\2H~3UL}2oGjx=/5cd&\0|gռ͐Ry~^\?<g'|@=l1Ծ*j~q&͘dpurLIUʕ_B˞ _B]oTTg~$ "aLc4fn˧nfx)z~;e&*9Ȭ;*j}.57?{w& U'QEA{F̰Pk.ޣGwM'q}y%=bVK4jO~JʕaGP'1ӧMخTs96"VpT#[ۣv M$hKH5o%ʒr9JmƼeFF/kr3Bo[<6:4X.3݃G~ѕ~r&@0ǥ,Xe'RGȰhk$QB7$KdWEBapJZ]J%@wY1mn)IqJ@oOh~w!)Fr G!]MKA†IsB^Thz0K5,+w& 0v]0^bOj Rj0 %Ǻ[4798V sh~L7Y ( 6Uݝj(%g#ZK#GexWWF $!!P@7 :K%q`:wwJAXQ~n4A+2-՜pmȎx}#L`ޯ9_:~&Γb3)ձŞDaQջ,tk;WRwiH.v].>0.,WR‘ 7qPEq{|*adH\ukNkM,+{XLi>)u͊]~[?\-7xSUmZ nZ:t;nL[@ KK3jsO6^yߢM\ڰBMhҕ3񕾝 ˾/ׯxpt̳׬\qzo4GpY2,Bby2r'x)81\~hjƒ !T^ SXpRuLx5fup[5vNzXeY(Yr)LvC~:vg<|RD{tn>nn8X 5 w xaoDEHo'r<'0m ?5Dlbwα oy)l\ Xz,&EEliڱ'mvO4Idd+d'P/BA0aa ]YG7`ۍ& L_-Lv҂3AY~:VĐd0X8PS!l#Xjݦ}^O}7xGiق!v!0,fC^B{DhQ#BDYd#~6Eb!#Q0 h rpnCO&/D uY&E):0ސ.҂)Rs@ _f\r+])Jخx\.uC (%\~&YaHS#T"}syĖD eGgBz$*F)W-EWV:V;^V 5:QlXJ6?i̳)Q )V,%a"y-\,  +ŦNb:]թ`dD9*oؐ<6Y{qO>6b2Bf5xzqf޷tf,JJ{试"yl뿟5NeYF7*tN:z9$/:5?6>iLV 7,{U|LRj+*]MOB} )ulG' D%>|*9S%չ>GsU0,Z; F; endstream endobj 86 0 obj << /Length1 1647 /Length2 11959 /Length3 0 /Length 12814 /Filter /FlateDecode >> stream xڭvcxݲmccضtضmcÎmcfg}}sFUQޗXQN(ngLD 1rqR㒥SH9Z>168rrG34&...8r3JMY+ ,myt0P|>mΟcG lZX" R* y5Y1@h 0sXc054'O.!'!hlt7쁎6NN '8,l]LJnjwBv;l>O2E;'g'cG {ggTEQlnWl'O`g寒>i>QgC ['3XF@gO2{Gpq5WG5WRv,֦pL̟1?cY1/Rv&M\> zg&v)gHLe=$_E?q]rSX[|6? s>g @װ6t5p,/WC kwp;Bf 1ѳl$n4Qp66Zv5[-SӉ0Us c+ۿ`5>uE%o4ʹ{gW8zI]?Q ۹عt:r1?M;@ ߿VF#fklgW8ښ|]?{|Vߗtí,[ge8bMj0ؗ6uosUo~oX8ۗ>N^~-@٠h9d+E8S%`gBIY`?k?:٣=qZ}Fr#jmE#` d>MN,9!o)q};+ Zƛ i-IHofһ)4FFϫ{s>R@~k&wx-iq5~FMiNW TDoq*s)[RvK-'EB=6溦dy%V;s/[_Ju*oTـ04 #[oB-ok0/ dh=Su Nkwܢ?7l^-vY0wD>pȜp˴嶏Ne:;)TB,L^vv!-9Cc^JHҨ)aсޚ{%zq|bT97D.\_Tc SWӨM*˯Qʂ^SSrKQҾE7Hy1D46Ս"DMrd `裟t:`ZX[IKjd]2x.?d18|VӍ۲ׄNO@EmaLr=?THj/8I.yZ(w*Mu;RBSpH4 gID~Edp"(лS$cɐ2q "Dh%7nƳ'2U<Oβf4D!AΣꇃ9:?2E ~vfnw &gg9[[{i]V mM2]o!/ ]- -j%I .0]Ť79L6z.d̟ TuM[u<UjYx@xx9,X_Kf]R߷?.ɋt9Ԋe#S]~: uTEM{;;<83ǗhA(y̷1;+L΋m<^IgNɢc*]&O-Zܿ]2'ʘd{L 2.f=ABTYPxjZed|rx!N̫P0j~E4'>ӻ\=Y&JC1 :Iuq kjah 1^hX[ھ6*4ųl/Gǭ0g C` )KӇ}u8+wMxwB5۫MyoUJ;2bGW+a[U6O3E+`}:`b&X)e^Pomޞ(aѲk wC"Cij7^Jgy @3y֦qj/\D#`q&wKRm؞`Vnגp0޲z(j|Yt3>%J:˻)eo2ÆeD}A'~烤bn?>Hn87w6W VKf9oy1aTL'R')z!5[J:FX2/ccd:;3Ql@HxſȞ)`+ :ʃr.s rѬ&H:;Ϋ˜h49#RO婪>C׌hm1yw`n`2܌{}GRYIK<*=5-( Ƥr{ڒ<t|(K!_ꀴgqL1{n߇V7NF9:@~E?H~xMl9ݐX( ThZ#qkҧ _b'RQdn.<+uF+3_;?*TJ(KPOT3{MF:¾>(XR3^r^V E6͕ (xOdؠx)>TL7~/aO_`,aa*IK' i;\a@^_OKL=LKN;uڹiF6eaGȝC@NlTP_)c2ZlM>l.^[:C̗RFDbjx@P_`*L${%(?1!#]U)S܂<)m´5q0jsqP귖2xW7xy2yA2D>5Cq}y-+OD";%)!V^]#ZJw5NArɮg*[EI<5QA]GZL2:&nH)rd!9. BISK8زx jP$`EukwRʪYn@fgJΜؑa!o-jؑdS?rP祵1w6cL~,&ׅN'ղ]C0OYF Z6f1l#\/IbDϟLq28jj,&µagAv5FيHR'dž74nojdLU ʂ7m]JG6Řs%(WJ(w OyG Z@3TVS@.(1VY=X2< j\*`[H/DJe;G4񒷥y?Q ھ~$R}vDKL̾Exv.0!=[j@W3x-fj.ᒫ5տ&zD|*l`UOZ8̝'AGK5ʨ *hd@l enyRIgo8S>ّ:Axա>گm#teݨ6+*6Kk/}T80u*xK1huf# B曥Ѷ&F;PfѳvKI2=$frVo*A7 *P4&'\ה0_dsr̂bl'((BF~[@^^<@(k; xSz97!1ݲ?r~̌^($[p (+IXL0rtg䏣3_6) ˅=yn`7,9n.ȀE+亏sٴ4¦[4ZLD%C6'OM^34C -ԇN[*Z밆895ڝl D}FāO._+ఏz%0G3ut;<۾݉гL ?x!J+c/^R18<iqYDC*.-A\º5%O5&pFH(8}˓G|;r 98T{ZKTTpE[X K  s 8ET;Z_odN{V:s|E"'jK_?Kx1XSaθIwh 2KOs?A°O>Ϟ쐅/T#.L:MQre IXڿkb.Z7C6JЛ;yoUK08wu+S9:SQ\A=QYeq/SaM`B聯[˛/Qor;Zh_ǝVڗGIwv#]BO.0]9|;-^)T g5R`w)."EK1nq^ ?PPZ? W L_ʐ>v,Vl@cHB4Q@I4-n%XEt_MeJ̢ΣF(7?!4.T*j{F?ql3=ޙ07!\C%jaVQٱmavINU J͉[%0h[6ʮŒ۬o8ZHЖhd->l\)'$x{uy&ؘܡ\{LК?%h1Ü2܄~u-=PmaBKew_IuglUG%ȠL{ UC<)d0ĚHxA\2[1u&$LFݺxl8*|mI.4v!><5z3_ 8p Db0%U 0S*s)J1#aϤ aQԼٝu5bZXb} ŸR̻*;KZ/CgChukȌAI|M@m5m TE{mP%-={{t(EqXʜD!F۹qE;D_qD崿5ǐi须 Xj 5xwmdkSQ46FXtG\ I>Dt[aGa^1H /%_N\FD:\a𚖰:4*:[3):1 s+4d}-;)ݚBw w6vB;bMvOAð\Ƿ-[_|h;H,l}B(aJr%5$Y*v~l$W ~,רQn AΩ9-t/p˂:S0LZ5q8i]#ۃTl-ˌR֨ p4a>$e .h[3gNPaGmA$fԚJK 86Lť<,Ky)e;C8[gB5\ 1ep+XǹڴG;kNݠ HD uV1=XOi_<Ϙ;"/XKoL84H4,F2>2Bdb="98`x4(2@<(,H庱|pMl J#TA>A8g2YO<+2מ#䢿A 2(AtI %e7RDIJhN=j=} 7-L!0 ҟȤ |a> /SDZ2e4]K̨FkVYlEtKZ"s7&kgd,͢|ůDpzd@$% JY&RȢܲwP*;+kz_gWTxS_Z)im䣯%L S:<_eQiXYU nzy?X72?pBLN_@m([`&^l@A|YB,]nC^NؾRDYqkUiqj*>;gpUQᔠH،h-ΐPBfl];^Mq0XyFUax? RUԇ(x] iw{Ț? 5C,%0Ԉ+A4VJ׏q'|Xeg,lC\5GÔ&'9/a 9S덹_CzFp*6 v}%G4=wB?*7k&W Ry.zœ{2BQPKJ k\/ϰ@χIP矗/UBߘjy^Ea\_7,s3l>mLp<\=MU٣@\p\q46d\\.CfSq ~)FPw}.Zix#700i;.]-.8 ΧGMCJL|gbOIa"c>@U[V%9B(o|$ 2k>'̭ǃإ2  xǕFX .*f/s#:Om?/Ula'tЕQ\ύL/o|8YC_-CGC{USc"6~I[lC"fN gb.ltZw5J9(A OP,6~ZzoƦ7\*wI n>\T2gfK]#;abܵ'_Pї#MLXQ9תs ]!$sʘsŊzGRf*c"&vm.nQ8ejjKj=jt˨huφNIzM ~ZzfuƉ=V߼ZwlUxK3pg 2"gC{"kI?-w>~ۯոmMV&l ȫ&٤)<ӑD˯`q%<#ogOzTQCe#01Ifyv&һNE _R[Zhh=S~g!-%Ze&l+2UC+74i9;2SM%*'9\u9Za??.MP*T)4bh0MJ$G#=]OgnyABf%VM}4p?*W"\ǐŵf i0 *wDؒY?t䨚h;-݇UO޲h<Θk>g7"V=4 tO_H8kNvX#pO,$.-2)qcNb$̸9 )F|.cqo_Ys0\ֲoz3#)ЦU._q0 u>SXV2-,ys-n.g7kb؟tTXX_bw/*e..+ #<ВXK2Ⱥrx1_!64yc b]o.L\RtDC=V:l]H720MPpx&}Rw.W ;ȭ֯5?L)wシ-Q[>ZM~,ģ;Jq$4㧜|"2pgOV)VJʻ ^P2eݮ磲FGz}y(Vǖ7SlEr/z}5;# fq׃`Ga]wdn_&=|Q -܈13i3Vid79!Տ.]r\m%khhq՛oHV$xͅ+I|w #Ѧ;oA{1<gJȻ#$t!_Lᾝ[/P5էZe{*l7+ۼ,Tuw@'Ah2B=PG1*MMW C&.&/I.Rɨ%c1 d6L^P|*%mq; C]VBN3t*/tмKNH'})y( 5S׵ 7&!r`SEWct_Z4|pٞC=bPֵ|eZ٫r??V%| mCoʦ,=]-2UklEf*3Pʝ4m.| +xDdIMYTdd/bѕ IaO5IT/݊>+m2vZ.YНR3kq^za9Uh \d1DPY*]̚o1f LΖ[q\ʄB\Z5=vz] +ĺ$ ;VWqH= v`(KZD>kZaMLX 6Z,#gC$6EDAPn&;s:XIQEZ>gs"O%$n:+d"?Vf9h=B>a^A{:h.-]pҖ2 :Zg&2YӐlƘKE^uB(PA+WWVԃXc3me~TX ?ꐻ̧:rv:jrA 2ۆEzc|4hd/Ԅn| endstream endobj 95 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20180922151505+01'00') /ModDate (D:20180922151505+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) kpathsea version 6.2.3) >> endobj 2 0 obj << /Type /ObjStm /N 79 /First 616 /Length 3364 /Filter /FlateDecode >> stream xZ[s6~ׯc܎ F;8q8q.4dzȴ͍,"@Jr$A\P,e2f3H5.&ńƛd2Cb:EMbYf2ᙔ,2Ŭì7LZ(sNaN2tV02 Ar"M QeRh;E.ehlcxA[i1xj g< jR֑LKCU<6@13HA I`V,@  8;p9|@ )0@VC(=tr)xF`^XhB>OtgFނ,=0KX"5ԇ\5YiC}On"'3*AҠ'P0B >d'7SكIr|~3}zU>˰Jbx'bAL۴,UL/IZw9%S8sʎ?(3{p~3c'U $?l䴡E~^ MӔƛ^Üg3`ޛL8q60T~r GӀ?Y`?>UԤY2"A%)F4naY{24FsGu^/৉_ZD ܎gkH5 EIlZtN+}hDlTi"@_ "_M9Fq$$U[)MG'9K^ЩtۂNb:]ё٘;P!K8UUiLg\ n670fxfΚRbn%>$pt+MАa"WBkPm碎jHD_?넞*s;'&]di6eJ 6BJMFn"!y9UD]4ҹMҺb~lb8YWT -T3k%43)%e^ӝ5$WZ')=u~Nc[Zb]AKgL2ڨ eo'wbʐziDIkÉd>A<&+I^=M)uKFcD0:vLh)C ;EaAeݱ@7iWV^,E3~(ЩY^س$c;Owdl5 .JS dJWlz`U"4)kTmؚIQ2RJ4ա+Ƅvi:@ 30>aY"fS&1D|"Aj2Epk [K,]ў5DdcG"y0@'8Ц6A\Jq$!c4`gE5N:ƢVFwRZߴH.VwhF$΀/$?#J?jzK>gPHt?E5eZ:KejoۀLAn W(VT${S+neD;jkEfAY&3Kڨg+]/#AjNF~[E| pEoQmBŴs+‚dYkpÓ>`r2uk-ۦoG?¼d'.RFE5l# jjck \}5ß5#&DMe˒_ O~Cq~QեY&sm^3^2 /W9~[~;VMg9gӝZfwΖk-?y~x/^t%XR T?S1+ Dl#O6:=}v/NvJHXqO9V26Fg?2>of_KǷeG+VGZ(݃RvR&zMӋ#hr:Iv}~/ QbtV!0U.&=3m>;wa)]e`Ft\$EtG  }@*zX~435I_[O/`2*Aj3XZ*r{X0x8_l]('V^{B}p,$)uV^3c.\/%8q$>6XrU4uG^-S̏XadqqcTTBDLW@mhd<(BՂ8 b$DK G,KxiiJ\¬⇘㌂P{SFh3x Oi#/y~ l#u[ף Bylxg-r3U"\  ?i "z.Ϋf#w1Q,xgm)zUV,RlϺq6}Δ嬶_x>Zps^pNF2K#DָGtokZwsKި|rZT$[1a"=@O8{p1j='RNWdڇ^^PAՓ.[3 %,y9?֜wM$n1f5DfP9WTXɴDXs9<>gg'i^҉>&ݓj8v,4tu@lvݡي΃Q,NV~T\UO9Y_hdrb/eb}G4R@'mN)h-טlIy١#a:ޭ;tT*%&} |=wjxO/up5pWG^/9[xuOptZa_.; endstream endobj 96 0 obj << /Type /XRef /Index [0 97] /Size 97 /W [1 3 1] /Root 94 0 R /Info 95 0 R /ID [<50B1931FCA95B34B73F159AE73761296> <50B1931FCA95B34B73F159AE73761296>] /Length 235 /Filter /FlateDecode >> stream xѧRD@I%[ 8  ϜjxTLH Rpt!@)$ !k)P U۰հ 5i@-CC4B+Y8]hfXUX XhhR>%ae1w2a]GI1j*lԌ5kDكQm>j~.F- Å+(K endstream endobj startxref 118621 %%EOF Rdpack/inst/examples/journal_with_percents.bib0000644000176200001440000000047713501141722021343 0ustar liggesusers@article{journalWithPercents, title = {Dummy example of {Journal} containing text with percents}, volume = {1}, journal = {Example bibtex file, https://github.com/GeoBosh/Rdpack/blob/master/inst/examples/journal%20with%20percents.bib}, author = {Boshnakov, Georgi N.}, year = {2018}, pages = {1--1} } Rdpack/inst/examples/url_with_percents.bib0000644000176200001440000000043413501141722020464 0ustar liggesusers@article{urlWithPercents, title = {Dummy example of {URL} with percents}, volume = {51}, url = {https://github.com/GeoBosh/zzfiles/blob/master/url%20with%20percents.bib}, journal = {Example bibtex file}, author = {Boshnakov, Georgi N.}, year = {2018}, pages = {1--1} } Rdpack/inst/examples/RdpackTester/0000755000176200001440000000000013575267043016660 5ustar liggesusersRdpack/inst/examples/RdpackTester/NAMESPACE0000644000176200001440000000003713501141722020057 0ustar liggesusersexportPattern("^[[:alpha:]]+") Rdpack/inst/examples/RdpackTester/man/0000755000176200001440000000000013501141722017413 5ustar liggesusersRdpack/inst/examples/RdpackTester/man/RdpackTester-package.Rd0000644000176200001440000000230513501141722023666 0ustar liggesusers\name{RdpackTester-package} \alias{RdpackTester-package} \alias{RdpackTester} \docType{package} \title{ \packageTitle{RdpackTester} } \description{ \packageDescription{RdpackTester} } \details{ The DESCRIPTION file: \packageDESCRIPTION{RdpackTester} %\packageIndices{RdpackTester} Some of the references here are non-existent or a modified to test/demonstrate features of the citation macros. \strong{Note:} Reference \insertCite{dummyArticle;textual}{Rdpack} does not exist. It is a test that simple math in BibTeX entries works. \insertCite{nadler_diffusion_2005}{Rdpack} \insertCite{cayton_robust_2006}{Rdpack} \insertCite{fukunaga_introduction_1990}{Rdpack} \insertCite{fukunaga_introduction_1990_fake_vol}{Rdpack} \insertCite{fukunaga_introduction_1990_fake_number}{Rdpack} \insertCite{fukunaga_introduction_1990_fake_vol_number}{Rdpack} } \author{ \packageAuthor{RdpackTester} Maintainer: \packageMaintainer{RdpackTester} } \references{ \insertAllCited{} --- Formulas are handled in fields were they make sense, here title, journal, note: \insertRef{dummyArticle}{Rdpack} } \keyword{ package } %\seealso{ %~~ \code{\link[:-package]{}} ~~ %} \examples{ test_1() } Rdpack/inst/examples/RdpackTester/DESCRIPTION0000644000176200001440000000065113501141722020350 0ustar liggesusersPackage: RdpackTester Type: Package Title: Testbed for Rdpack Version: 1.0 Date: 2018-09-22 Author: Georgi N. Boshnakov Maintainer: Description: A lot of the functionality of package 'Rdpack' is best tested on a package. This package is part of 'Rdpack' and is used for that purpose. License: GPL (>=2) RdMacros: Rdpack NeedsCompilation: no Packaged: 2018-09-22 13:55:28 UTC; mcbssgb2 Rdpack/inst/examples/RdpackTester/R/0000755000176200001440000000000013501141722017041 5ustar liggesusersRdpack/inst/examples/RdpackTester/R/RdpackTester-internal.R0000644000176200001440000000007513501141722023373 0ustar liggesuserstest_1 <- function(x,y){ "This function does nothing." } Rdpack/inst/examples/RdpackTester/inst/0000755000176200001440000000000013501141722017615 5ustar liggesusersRdpack/inst/examples/RdpackTester/inst/REFERENCES.bib0000644000176200001440000001032513501141722021715 0ustar liggesusers@Manual{Rpack:bibtex, title = {bibtex: bibtex parser}, author = {Romain Francois}, year = {2014}, note = {R package version 0.4.0}, url = {https://CRAN.R-project.org/package=bibtex}, } @misc{parseRd, title = {Parsing Rd files}, author = {Duncan Murdoch}, year = {2010}, url = {https://developer.r-project.org/parseRd.pdf}, } @Manual{Rdevtools, title = {devtools: Tools to Make Developing R Packages Easier}, author = {Hadley Wickham and Jim Hester and Winston Chang}, year = {2018}, note = {R package version 1.13.5}, url = {https://CRAN.R-project.org/package=devtools}, } @Article{dummyArticle, title = {A relation between several fundamental constants: $e^{i\pi}=-1$}, journal = {A non-existent journal with the formula $L_2$ in its name.}, author = {A. ZZZ}, year = {2018}, note = {This reference does not exist. It is a test/demo that simple formulas in BibTeX files are OK. A formula in field 'note': $c^2 = a^2 + b^2$.}, } @inproceedings{nadler_diffusion_2005, address = {Cambridge, MA, USA}, series = {{NIPS}'05}, title = {Diffusion {Maps}, {Spectral} {Clustering} and {Eigenfunctions} of {Fokker}-{Planck} {Operators}}, url = {http://dl.acm.org/citation.cfm?id=2976248.2976368}, booktitle = {Proceedings of the 18th {International} {Conference} on {Neural} {Information} {Processing} {Systems}}, publisher = {MIT Press}, author = {Nadler, Boaz and Lafon, Stphane and Coifman, Ronald R. and Kevrekidis, Ioannis G.}, year = {2005}, keywords = {algorithms and architectures, learning theory}, pages = {955--962}, file = {[Nadler.2005] Diffusion Maps, Spectral Clustering and Eigenfunctions of Fokker-Planck.pdf:/home/kisung/Dropbox/V3. Statistics/P3. Dimension Reduction/S2. Nonlinear/01. DM/[Nadler.2005] Diffusion Maps, Spectral Clustering and Eigenfunctions of Fokker-Planck.pdf:application/pdf} } @inproceedings{cayton_robust_2006, address = {New York, NY, USA}, series = {{ICML} '06}, title = {Robust {Euclidean} {Embedding}}, isbn = {1-59593-383-2}, url = {http://doi.acm.org/10.1145/1143844.1143866}, doi = {10.1145/1143844.1143866}, booktitle = {Proceedings of the 23rd {International} {Conference} on {Machine} {Learning}}, publisher = {ACM}, author = {Cayton, Lawrence and Dasgupta, Sanjoy}, year = {2006}, pages = {169--176}, file = {[Cayton_Dasgupta.2006] Robust Euclidean Embedding.pdf:/home/kisung/Dropbox/V3. Statistics/P3. Dimension Reduction/S2. Nonlinear/27. REE/[Cayton_Dasgupta.2006] Robust Euclidean Embedding.pdf:application/pdf} } @book{fukunaga_introduction_1990, address = {Boston}, edition = {Second}, series = {Computer science and scientific computing}, title = {Introduction to statistical pattern recognition}, isbn = {978-0-12-269851-4}, publisher = {Academic Press}, author = {Fukunaga, Keinosuke}, year = {1990}, keywords = {Mathematical models, Mathematical statistics, Pattern perception, Decision making, Statistical methods}, file = {[Fukunaga.1990] Introduction to statistical pattern recognition.pdf:/home/kisung/Dropbox/V3. Statistics/P3. Dimension Reduction/S1. Linear/06. LDA_RDA/[Fukunaga.1990] Introduction to statistical pattern recognition.pdf:application/pdf} } @book{fukunaga_introduction_1990_fake_vol, address = {Boston}, edition = {Second}, series = {Computer science and scientific computing}, volume = {82}, title = {Introduction to statistical pattern recognition}, isbn = {978-0-12-269851-4}, publisher = {Academic Press}, author = {Fukunaga, Keinosuke}, year = {1990}, } @book{fukunaga_introduction_1990_fake_number, address = {Boston}, edition = {Second}, series = {Computer science and scientific computing}, number = {2}, title = {Introduction to statistical pattern recognition}, isbn = {978-0-12-269851-4}, publisher = {Academic Press}, author = {Fukunaga, Keinosuke}, year = {1990}, } @book{fukunaga_introduction_1990_fake_vol_number, address = {Boston}, edition = {Second}, series = {Computer science and scientific computing}, volume = {82}, number = {2}, title = {Introduction to statistical pattern recognition}, isbn = {978-0-12-269851-4}, publisher = {Academic Press}, author = {Fukunaga, Keinosuke}, year = {1990}, } Rdpack/inst/examples/RdpackTester/inst/auto/0000755000176200001440000000000013501141722020565 5ustar liggesusersRdpack/inst/examples/RdpackTester/inst/auto/REFERENCES.el0000644000176200001440000000056413501141722022535 0ustar liggesusers(TeX-add-style-hook "REFERENCES" (lambda () (LaTeX-add-bibitems "Rpack:bibtex" "parseRd" "Rdevtools" "dummyArticle" "nadler_diffusion_2005" "cayton_robust_2006" "fukunaga_introduction_1990" "fukunaga_introduction_1990_fake_vol" "fukunaga_introduction_1990_fake_number" "fukunaga_introduction_1990_fake_vol_number")) :bibtex) Rdpack/inst/REFERENCES.bib0000644000176200001440000000206213501141722014526 0ustar liggesusers@Manual{Rpack:bibtex, title = {bibtex: bibtex parser}, author = {Romain Francois}, year = {2014}, note = {R package version 0.4.0}, url = {https://CRAN.R-project.org/package=bibtex}, } @misc{parseRd, title = {Parsing Rd files}, author = {Duncan Murdoch}, year = {2010}, url = {https://developer.r-project.org/parseRd.pdf}, } @Manual{Rdevtools, title = {devtools: Tools to Make Developing R Packages Easier}, author = {Hadley Wickham and Jim Hester and Winston Chang}, year = {2018}, note = {R package version 1.13.5}, url = {https://CRAN.R-project.org/package=devtools}, } @Article{dummyArticle, title = {A relation between several fundamental constants: $e^{i\pi}=-1$}, journal = {A non-existent journal with the formula $L_2$ in its name.}, author = {A. ZZZ}, year = {2018}, note = {This reference does not exist. It is a test/demo that simple formulas in BibTeX files are OK. A formula in field 'note': $c^2 = a^2 + b^2$.}, } % The entries below are temporary for testing. Rdpack/inst/doc/0000755000176200001440000000000013574751104013207 5ustar liggesusersRdpack/inst/doc/Inserting_bibtex_references.Rnw0000644000176200001440000003707613501141722021401 0ustar liggesusers% Created 2019-04-14 Sun 12:05 % Intended LaTeX compiler: pdflatex \documentclass[a4paper,twoside,11pt,nojss,article]{jss} \usepackage[T1]{fontenc} \usepackage[left=2cm,right=2cm,bottom=15mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} % \usepackage{Sweave} \author{Georgi N. Boshnakov} \Plainauthor{Georgi N. Boshnakov} \Address{ Georgi N. Boshnakov\\ School of Mathematics\\ The University of Manchester\\ Oxford Road, Manchester M13 9PL, UK\\ URL: \url{http://www.maths.manchester.ac.uk/~gb/} } <>= library(Rdpack) pd <- packageDescription("Rdpack") @ \Abstract{ Package \pkg{Rdpack} provides a straightforward way to insert BibTeX references in the documentation of an R package, using the RdMacros feature introduced in R~3.2.0. It works for `roxygen2' documentation, as well. \par This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. } \Keywords{bibliographic references, Rd, bibtex, citations, \proglang{R}} \Plainkeywords{bibliographic references, Rd, bibtex, citations, R} \author{Georgi N. Boshnakov} \date{\today} \title{Inserting references in Rd and roxygen2 documentation} \hypersetup{ pdfauthor={Georgi N. Boshnakov}, pdftitle={Inserting references in Rd and roxygen2 documentation}, pdfkeywords={bibliographic references, Rd, bibtex, citations, R}, pdfsubject={}, pdfcreator={Emacs 25.3.1 (Org mode 9.1.6)}, pdflang={English}} \begin{document} \maketitle %\SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Inserting references in Rd and roxygen2 documentation} %\VignetteDepends{Rdpack} %\VignetteKeywords{bibliographic references, Rd, bibtex, citations, R} %\VignettePackage{Rdpack} \section{Setup} \label{sec:org848e2e4} To prepare a package for importing BibTeX references it is necessary to tell the package management tools that package \pkg{Rdpack} and its Rd macros are needed. The references should be put in file \texttt{inst/REFERENCES.bib}. These steps are enumerated below in somewhat more detail for convenince: \begin{enumerate} \item Add the following lines to file `DESCRIPTION': \begin{verbatim} Imports: Rdpack RdMacros: Rdpack \end{verbatim} Make sure the capitalisation of \texttt{RdMacros} is as shown. If the field 'RdMacros' is already present, add `Rdpack' to the list on that line. Similarly for field 'Imports'. \item Add the following line to file `NAMESPACE'\footnote{Any function for package \pkg{Rdpack} will do. This is to avoid getting a warning from 'R CMD check'.}: \begin{verbatim} importFrom(Rdpack,reprompt) \end{verbatim} The equivalent line for `roxygen2' is \begin{verbatim} #' @importFrom Rdpack reprompt \end{verbatim} \item Create file \texttt{REFERENCES.bib} in subdirectory \texttt{inst/} of your package and put the bibtex references in it. \end{enumerate} \section{Inserting references in package documentation} \label{sec:orge601e7c} Once the steps outlined in the previous section are done, references can be inserted in the documentation as \texttt{\textbackslash{}insertRef\{key\}\{package\}}, where \texttt{key} is the bibtex key of the reference and \texttt{package} is your package. This works in Rd files and in roxygen documentation chunks. In fact, argument 'package' can be any installed R package\footnote{There is of course the risk that the referenced entry may be removed from the other package. So this is probably only useful for one's own packages. Also, the other package would better be one of the packages mentioned in DESCRIPTION.\}}, not necessarily the current one. This means that you don't need to copy references from other packages to your \texttt{"REFERENCES.bib"} file. This works for packages that have \texttt{"REFERENCES.bib"} in their installation directory and for the default packages. See also the help pages \texttt{?Rdpack::insertRef} and \texttt{?Rdpack::Rdpack-package}. For example, the help page \texttt{?Rdpack::insertRef} contains the following lines in section ``References'' of the Rd file: \begin{verbatim} \insertRef{Rpack:bibtex}{Rdpack} \insertRef{R}{bibtex} \end{verbatim} The first line above inserts the reference labeled \texttt{Rpack:bibtex} in Rdpack's \texttt{REFERENCES.bib}. The second line inserts the reference labeled \texttt{R} in file \texttt{REFERENCES.bib} in package `bibtex'. A roxygen2 documentation chunk might look like this: \begin{verbatim} #' @references #' \insertRef{Rpack:bibtex}{Rdpack} #' #' \insertRef{R}{bibtex} \end{verbatim} \section{Inserting citations} \label{sec:orgb780a37} From version 0.7 of \pkg{Rdpack}, additional Rd macros are available for citations\footnote{They were introduced in the development version 0.6-1, but 0.7 is the first version with them released on CRAN.}. They can be used in both Rd and roxygen2 documentation. If you are using these, it will be prudent to require at least this version of Rdpack in the ``Imports:'' directive in file DESCRIPTION: \texttt{Rdpack (>= 0.7)}. \subsection{Macros for citations} \label{sec:orgbaabdbb} \label{sec:macros-citations} \texttt{\textbackslash{}insertCite\{key\}\{package\}} cites the key and records it for use by \texttt{\textbackslash{}insertAllCited\{\}}, see below. The style of the citations is author-year. The ''et al'' convention is used when there are more than two authors\footnote{This feature was introduced in Rdpack 0.8-2.}. \code{key} can contain more keys separated by commas. Here are some examples (on the left is the code in the documentation chunk, on the right the rendered citation): \begin{center} \begin{tabular}{ll} Documentation source & rendered\\ \hline \texttt{\textbackslash{}insertCite\{parseRd\}\{Rdpack\}} & (Murdoch 2010)\\ \texttt{\textbackslash{}insertCite\{Rpack:bibtex\}\{Rdpack\}} & (Francois 2014)\\ \texttt{\textbackslash{}insertCite\{parseRd,Rpack:bibtex\}\{Rdpack\}} & (Murdoch 2010; Francois 2014)\\ \end{tabular} \end{center} By default the citations are parenthesised \texttt{\textbackslash{}insertCite\{parseRd\}\{Rdpack\}} produces \Sexpr{ insert_citeOnly("parseRd", "Rdpack") }, as in the examples above. To get textual citations, like \Sexpr{ insert_citeOnly("parseRd;textual", "Rdpack") }, put the string \texttt{;textual} at the end of the key. Here are the examples from the table above, rendered as textual citations: \begin{center} \begin{tabular}{ll} Documentation source & \\ \hline \texttt{\textbackslash{}insertCite\{parseRd;textual\}\{Rdpack\}} & Murdoch (2010)\\ \texttt{\textbackslash{}insertCite\{Rpack:bibtex;textual\}\{Rdpack\}} & Francois (2014)\\ \texttt{\textbackslash{}insertCite\{parseRd,Rpack:bibtex;textual\}\{Rdpack\}} & Murdoch (2010); Francois (2014)\\ \end{tabular} \end{center} The last line in the table demonstrates that this also works with several citations. The macro \texttt{\textbackslash{}insertNoCite\{key\}\{package\}} records one or more references for \texttt{\textbackslash{}insertAllCited} but does not cite it. Setting \texttt{key} to \texttt{*} will record all references from the specified package. For example, \texttt{\textbackslash{}insertNoCite\{R\}\{bibtex\}} records the reference whose key is \texttt{R}, while \texttt{\textbackslash{}insertNoCite\{*\}\{utils\}} records all references from package ``utils'' for inclusion by \texttt{\textbackslash{}insertAllCited}. To mix the citations with other text, such as ``see also'' and ``chapter 3'', write the list of keys as a free text, starting it with the symbol \texttt{@} and prefixing each key with it. The \texttt{@} symbol will not appear in the output. For example, the following code: \begin{verbatim} \insertCite{@see also @parseRd and @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd; @Rpack:bibtex}{Rdpack} \insertCite{@see also @parseRd and @Rpack:bibtex;textual}{Rdpack} \end{verbatim} produces: \qquad \begin{tabular}{l} \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex", "Rdpack")}\\ \Sexpr{insert_citeOnly("@see also @parseRd; @Rpack:bibtex", "Rdpack")}\\ \Sexpr{insert_citeOnly("@see also @parseRd and @Rpack:bibtex;textual", "Rdpack")}\\ \end{tabular} \texttt{\textbackslash{}insertCiteOnly\{key\}\{package\}} is as \texttt{\textbackslash{}insertCite} but does not record the key for the list of references assembled by \texttt{\textbackslash{}insertAllCited}. \subsection{Automatically generating lists of references} \label{sec:org5309182} The macro \texttt{\textbackslash{}insertAllCited\{\}} can be used to insert all references cited with \texttt{\textbackslash{}insertCite} or \texttt{\textbackslash{}insertNoCite}. A natural place to put this macro is the references section. The Rd section may look something like: \begin{verbatim} \references{ \insertAllCited{} } \end{verbatim} The analogous documentation chunk in roxygen2 might look like this: \begin{verbatim} #' @references #' \insertAllCited{} \end{verbatim} \subsection{Changing the style of references} \label{sec:orgefd3695} Package \texttt{Rdpack} supports bibliography styles for lists of references\footnote{Support for styles is available since \texttt{Rdpack (>= 0.8)}.}. Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested. To cause all lists of references produced by \texttt{\textbackslash{}insertAllCited} in a package to appear with full names, add \texttt{.onLoad()} function to your package. If you don't have \texttt{.onLoad()}, just copy the following definition: <<>>= .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } @ %def If you already have \texttt{.onLoad()}, add the line containing the \texttt{Rdpack::Rdpack\_bibstyles} call to it. After installling/reloading your package the lists of references should appear with long author names. "Rdpack" itself now uses this style. \section{Possible issues} \label{sec:org4871d85} \subsection{Warning from 'R CMD build'} \label{sec:org2375713} If 'R CMD build' or \texttt{devtools::build()} gives a warning along the lines of: \begin{verbatim} Warning: C:/temp/RtmpqWQqji/.../XXX.Rd:52: unknown macro '\insertRef' \end{verbatim} then check the syntax in file DESCRIPTION --- the most common cause of this is misspelling \texttt{RdMacros:}. Make sure in particular that `M' is uppercase. \subsection{Development using `devtools'} \label{sec:org657ff99} The described procedure works transparently in `roxygen2' chunks and with Hadley Wickham's `devtools'. Packages are built and installed properly with the `devtools' commands and the references are processed as expected. Currently (2017-08-04) if you run help commands \texttt{?xxx} for functions from the package you are working on and their help pages contain references, you may encounter some puzzling warning messages in `developer' mode, something like: \begin{verbatim} 1: In tools::parse_Rd(path) : ~/mypackage/man/abcde.Rd: 67: unknown macro '\insertRef' \end{verbatim} These warnings are again about unknown macros but the reason is completely different: they pop up because ``devtools'' reroutes the help command to process the developer's Rd sources (rather than the documentation in the installed directory) but doesn't tell \texttt{parse\_Rd} where to look for additional macros\footnote{The claims in this sentence can be deduced entirely from the informative message. Indeed, (1)\textasciitilde{}the error is in processing a source Rd file in the development directory of the package, and (2)\textasciitilde{}the call to \texttt{\textbackslash{}parse\_Rd} specifies only the file.}. These warnings are harmless - the help pages are built properly and no warnings appear outside ``developer'' mode, e.g. in a separate R\textasciitilde{}session. You may also consider using the function \texttt{viewRd()}, discussed below, for viewing Rd files. \subsection{Latex markup in BibTeX entries} \label{sec:org2606b37} In principle, BibTeX entries may contain arbitrary Latex markup, while the Rd format supports only a subset. As a consequence, some BibTeX entries may need some editing when included in REFERENCES.bib\footnote{Thanks to Michael Dewey for suggesting the discussion of this.\label{org0aff802}}. Only do this for entries that do not render properly or cause errors, since most of the time this should not be necessary. For encoding related issues of REFERENCES.bib see the dedicated subsection below. If mathematics doesn't render properly replace the Latex dollar syntax with Rd's \texttt{\textbackslash{}eqn}, e.g. \texttt{\$x\textasciicircum{}2\$} with \texttt{\textbackslash{}eqn\{x\textasciicircum{}2\}}. This should not be needed for versions of Rdpack 0.8-4 or later. Some Latex macros may have to be removed or replaced with suitable Rd markup. Again, do this only if they cause problems, since some are supported, e.g. \texttt{\textbackslash{}doi}. See also the overview help page, \code{help("Rdpack-package")}, of \pkg{Rdpack}. Among other things, it contains some dummy references which illustrate the above. \subsection{Encoding of file REFERENCES.bib} \label{sec:orgb642964} If a package has a declared encoding (in file \texttt{DESCRIPTION}), \texttt{REFERENCES.bib} is read-in with that encoding\footnote{From \texttt{Rdpack (>=0.9-1)} The issue of not handling the encoding was raised by Professor Brian Ripley.}. Otherwise, the encoding of \texttt{REFERENCES.bib} is assumed to be UTF-8 (which includes ASCII as a subset). Note that BibTeX entries downloaded from online databases and similar sources may contain unexpected characters in other encodings, e.g. 'latin1'. In such cases the check tools in R-devel (since about 2018-10-01) may give warnings like: \begin{verbatim} prepare_Rd: input string 1 is invalid in this locale \end{verbatim} To resolve this, convert the file to the declared encoding or UTF-8. Alternatively, replace the offending symbols with their classic \TeX{}/\LaTeX{} equivalents (which are ASCII). Non-ASCII symbols in BibTeX entries obtained from online databases are often in fields like "Abstract", which are normally not included in lists of references and can be deleted from REFERENCES.bib. One way to check for non-ASCII symbols in a file is \texttt{tools::showNonASCIIfile()}. Internally, \LaTeX{} sequences standing for accented Latin characters, such as \texttt{\textbackslash{}'e} and \texttt{\textbackslash{}"o}, are converted to UTF-8. So, even if the file REFERENCES.bib is pure ASCII, it may implicitly give raise to non-ASCII characters. This may cause R's checking tools to complain about non-ASCII characters even after it has been verified that there are none. If this happens, add the encoding declaration to file DESCRIPTION\footnote{Admittedly, this is not ideal since the user should not need to care how things are processed internally but I haven't pinpointed the exact cause for this.}: \begin{verbatim} Encoding: UTF-8 \end{verbatim} Needless to say, make sure that there are really no characters from encodings like 'latin1'. \section{Viewing Rd files} \label{sec:org5f9a745} A function, \code{viewRd}, to view Rd files in the source directory of a package was introduced in version 0.4-23 of \pkg{Rdpack}. A typical user call would look something like: \begin{verbatim} Rdpack::viewRd("./man/filename.Rd") \end{verbatim} By default the requested help page is shown in text format. To open the page in a browser, set argument \code{type} to \code{"html"}: \begin{verbatim} Rdpack::viewRd("./man/filename.Rd", type = "html") \end{verbatim} Users of 'devtools' can use \code{viewRd()} in place of \code{help()} to view Rd sources\textsuperscript{\ref{org0aff802}}. \end{document} Rdpack/inst/doc/Inserting_figures_and_evaluated_examples.R0000644000176200001440000000047113574751104023574 0ustar liggesusers### R code from vignette source 'Inserting_figures_and_evaluated_examples.Rnw' ################################################### ### code chunk number 1: Inserting_figures_and_evaluated_examples.Rnw:19-21 ################################################### library(Rdpack) pd <- packageDescription("Rdpack") Rdpack/inst/doc/Inserting_figures_and_evaluated_examples.Rnw0000644000176200001440000001654013501141722024132 0ustar liggesusers% Created 2019-04-14 Sun 17:28 % Intended LaTeX compiler: pdflatex \documentclass[a4paper,twoside,11pt,nojss,article]{jss} \usepackage[T1]{fontenc} \usepackage[left=2cm,right=2cm,bottom=15mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} % \usepackage{Sweave} \author{Georgi N. Boshnakov} \Plainauthor{Georgi N. Boshnakov} \Address{ Georgi N. Boshnakov\\ School of Mathematics\\ The University of Manchester\\ Oxford Road, Manchester M13 9PL, UK\\ URL: \url{http://www.maths.manchester.ac.uk/~gb/} } <>= library(Rdpack) pd <- packageDescription("Rdpack") @ \Abstract{ This vignette discusses Rd macros provided by package \pkg{Rdpack} for inserting evaluated examples and programmatically created figures. These macros are convenience wrappers around the native capabilities provided by the Rd parser. The macros work in Rd files and roxygen2 comments. \par This vignette is part of package Rdpack, version~\Sexpr{pd$Version}. } \Keywords{examples, graphics, figures, Rd, R} \Plainkeywords{examples, graphics, figures, Rd, R} \author{Georgi N. Boshnakov} \date{\today} \title{Inserting figures and evaluated examples} \hypersetup{ pdfauthor={Georgi N. Boshnakov}, pdftitle={Inserting figures and evaluated examples}, pdfkeywords={examples, graphics, figures, Rd, R}, pdfsubject={}, pdfcreator={Emacs 25.3.1 (Org mode 9.1.6)}, pdflang={English}} \begin{document} \maketitle %\SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Inserting figures and evaluated examples} %\VignetteDepends{Rdpack} %\VignetteKeywords{examples, graphics, figures, Rd, R} %\VignettePackage{Rdpack} \section{Evaluated examples} \label{sec:orgf215fe2} Sometimes the documentation of an object becomes more clear if accompanied by snippets of R code and their results. The standard Rd macro \texttt{\textbackslash{}Sexpr} caters for a number of possibilities to evaluate R code and insert the results and the code in the documentation. The Rd macro \texttt{\textbackslash{}printExample} provided by package \texttt{"Rdpack"} builds on it to print a snippet of R code and the results of its evaluation. For example, \begin{verbatim} \printExample{2+2; a <- 2*3; a} \end{verbatim} gives \begin{verbatim} 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 \end{verbatim} Note that each command is printed on a separate line even though in this example the source code is on a single line, separated by semicolons\footnote{The argument of \texttt{\textbackslash{}printExample} needed to be on a single line with versions of R before \texttt{R-3.6.0}, since the lines after the first were silently ignored, with no errors and no warnings. This should not be a concern if your package requires \texttt{R >= 3.6.0} anyway or if you can live with somewhat inferior documentation in older versions or \texttt{R}.}. Similarly to \texttt{knitr}, the results are prefixed with comment symbols but the code is not prefixed with anything. The help page of \texttt{?Rdpack::promptUsage} contains a number of examples created with \texttt{\textbackslash{}printExample}. The corresponding Rd file can be obtained from the package tarball or from \url{https://github.com/GeoBosh/Rdpack/blob/master/man/promptUsage.Rd}. \section{Section examples with results} \label{sec:org80695a1} The macro \texttt{\textbackslash{}printExample} can be used as many times as needed and is typically placed in section \emph{Details} of an object's documentation. In contrast, the macro \texttt{\textbackslash{}runExamples} can be used as a replacement of the whole \texttt{\textbackslash{}examples} section in the Rd file. The code and its results are printed just as by \texttt{\textbackslash{}printExample}. For example, if the following code is put at the top level in an Rd file (i.e. not in a section): \begin{verbatim} \runExamples{2+2; a <- 2*3; a} \end{verbatim} then it will be evaluated and replaced by a normal section examples: \begin{verbatim} \examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 } \end{verbatim} This generated examples section is processed by the standard R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files\footnote{In versions of R before 3.6.0, \texttt{R CMD check} used to give warnings about unknown \texttt{\textbackslash{}Sexpr} section at top level. See also the note about multiline argument for \texttt{\textbackslash{}printExample}.}. A small example package using this feature is at \href{https://github.com/GeoBosh/reprexes/tree/master/runExamplesCheck}{runExamplesCheck}. \section{Creating and including graphs} \label{sec:orgb3e0ae9} Figures can be inserted with the help of the standard Rd markup command \texttt{\textbackslash{}figure}. The Rd macro \texttt{\textbackslash{}insertFig} provided by package \pkg{Rdpack} takes a snipped of R code, evaluates it and inserts the plot produced by it (using \texttt{\textbackslash{}figure}). \texttt{\textbackslash{}insertFig} takes three arguments: a filename, the package name and the code to evaluate to produce the figure. For example, \begin{verbatim} \insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)} \end{verbatim} will evaluate the code\footnote{See also the remark about using miltiline code in \texttt{\textbackslash{}printExample}. For figures this is not a problem at all even in older versions of R, since all preparatory code can be put in a separate \texttt{\textbackslash{}Sexpr}, and then \texttt{\textbackslash{}insertFig} can be given only the final command producing the graph.}, save the graph in file \texttt{"man/figures/cars.png"} subdirectory of package \texttt{"mypackage"}, and include the figure using \texttt{\textbackslash{}figure}. Subdirectory \texttt{"figures"} is created if it doesn't exist. Currently the graphs are saved in \texttt{"png"} format only. The sister macro \texttt{\textbackslash{}makeFig} creates the graph in exactly the same way as \texttt{\textbackslash{}insertFig} but does not insert it. This can be done with a separate \texttt{\textbackslash{}figure} command. This can be used if additional options are desired for different output formats, see the description of \texttt{\textbackslash{}figure} in "Writing R extensions". \subsection{A technical note} \label{sec:org00b2a6c} The above description should just work. This note is for users who wonder about technicalities. The R documentation can be built in many ways and as a result the directory \texttt{"man/figures/"} does not necessarily refer to the developers source package. Indeed, when a package is built, R works on a modified and cleaned-up temporary copy of the source directory, so the figures are created in that copy and then included in the package tarball. Similarly during the package check. On the other hand, \texttt{R CMD Rd2pdf} and some other tools and R functions work directly on the source tree of the package and they will create the figures there. The net effect is that a package tarball always contains freshly generated up-to-date graphs. Developers who never generate the documentation by other means may not even have the directory \texttt{man/figures} in the source tree of their package (but it will be present in the package tarball). \newpage \end{document} Rdpack/inst/doc/Inserting_figures_and_evaluated_examples.pdf0000644000176200001440000043340713574751104024155 0ustar liggesusers%PDF-1.5 % 23 0 obj << /Length 2971 /Filter /FlateDecode >> stream xڽZYF~_A>&yz/HXy)hKBj<,>(Gva_쮮dT/n._e6ѥ2:ϒD\NJS*q^G ʖTgk? ݈#٢v~wY2lh=9l;^|U熈vVUfTLk\#A @rxK Kků&: U6)TeMŏ? KRe*y$jhn7<2IH)sU<)lt% Hyͮ_UFW,TerhT* tslh+Sp9(# j#Ƕ;y+~v`Q4x/[xv84yh HcN*#ʗρۼ7\eKYǂ7S("ix5flBraK%W/=c$ݎvE:f+~u-QT$vin 2?|n3h~~Wund3o?8.RwcH ;ZڹAnڽEl!S`ѝ˰tMYf8f󈇑 xz.WDi^#0RSxN8)TeS ;YphwH=kǭ i^C=8ܭF <9\_o`^2܌ݠ0 _̀SPDLО;n0nЪKzuYe$ *b".JngO@O_zo}-?cn+nW"Ϝ':D}IH\=5ܚ+~9dQ _Cn${(cքH@Wֱg}A?Q`8fZd~Jb=7nRBuO`'`ZVP,F568q|8pY3#|xbz!w~K:P T 5UU!,SmXk?5 @%PD:T歰 T*s!;, aap>;>:16K3QL%'bt١ g&Ο1JA;ɸhHSĥ 2j+Yvf?2# t\~AG"%hCBu=R9!RˇBK -L]e(2Ć=9}i&4WSL >y<x%U)"kTVy\8ǝelVD51{ ŀIwۑR9/b\{\[ZeJG5 w-uddE9o)b;*rfncZK_s?rV޹})JWbZ>bM^*c Np Ö֠w-Ő8WxV: {kN,|e@ _Ja8z]~4 ϊ/} _s(lFPH UeJjoPP>Oޥ}r-l.д.A@k|qm BoY%Dsbg{Hf .wetĭ}*@kuƣު4v.hmdB'`|?/>HeG)#\=/t:.I7FP[vfyNUKdbXV:Sp9Iq՛l$g ;onj_˧Y|~!HhȞRk*- Ei]M%g.ԡ] Tn8e&C_ÉR*ln%9SqQEػ9މ76aMaB'J>VǤO|QIޤIiWI$TTʸO X8o8'![T/LPBHM,*6$nb=?eC%T!'Ⲑs?Nv% ]u6p%?$c9 L_stT!tĆU*Ԇ#!Fd#UY'rb ͭӇ,RN_-2;a 7ky>KA"5X&4a]Y?>2]-$_kxUWk7e3G8i=\={4 Erׁ!~}nLV"x%&7䯮Li> stream xڵZ[o~ME E !-QjITI*Q\gMR2ə̙ssƋE՟_y[.LUqe﷋,.W?'hH:7˜4%_K31'P4/ H"4/fAͤkȓ gjOrM\IxS,: 7q˽{ڿqm{&$o) !DM&R[h0#=j&^YzO;צ\:'&!fzCtlhXZK! y?{怾- DxHn{?фHXXQU6`DhgmSt"vx`h 7rhh`¢CDht# QЂ-S-*b#6LR.lTe HҨ h}?NZ,nz"Yvb y${/>t|Ц<ѽ;Ѻ^ ꣌6{[;X4ʬˌܘas5cpy1N(FpM^=QYlK^ҪZ~MVnNL5y"5Ě9Vk[=s vt]PqWbDL46|=ngBO*v`=΁q2պ=iSh!IV-dE_F1fJٚ 4l 'Da܋+k`fDGyg; ;N4H8jbP͍vr%1H~J'^@G!8H RF ˚K }If=SRe2'cӒ! 6aRˮ-x/oN &L\FI~XW7jf&gd_9Ҽ Rl'"˂U]{R\c,&\FjH`Cg,|$K܈4s3q.IhsnƐ)o~cGuA}V!>@769Zdl$Zz1?8ޣ:zra%&ظ&/k7&Di^yaZDdH&{Ux?ث#.2 qe5{TK8f816YӒ LR r޼hX\o^fc,,[8㼜ov%mGd_pO3FdacP،|J#:DJ2ڷ<oR=]+AGhqlESI(od,Kw1Dɯ}|Q\x>ؘeM\%ldjh {a|볥/܇-(ӱ)7$Eۍ=CnjE\IOrZ*"@+pp1Ix)n}IT7ԋQͣڠ:B>"wjs) -K 9`!̢j-Ej ? ,Z g:Q3t8_Ev9A?p].J"F* l0ZG0Tw5OH@2(L>) E%Uk"9_ҹIGނ=DCI5J/BhX=ٱ"g hZ~1dE!VJN|x}{Z;:j*h Fn" =E9_%( `1%`w]=O_8IJ9`5͍/=Sr+-cB.@t`u=k`dt8cn^!\?J n|΂/KԄ1](7ܤP)npIS#?Ӕ9hKt?'ySwwz$du'( e)<pcBu?91a-? ? *VH€78=6ǁpy |7fw=S9Q8C?D2c{ToyA|-`F TtkF |*N3;\CQZ8ۦn z֕[8^OGq$ԾUS0`|]ȋJݮ6A9FryLMaZq$U3'<0TOx|}|s ޏzy^:ADyDl*]:cV*S]'s&erV}"^W/;ש{susN d_"``}9ly+C%__U&_W/6,dO40Uċ?C$^dQU9U 4墊#)q-eTaA &1C2_@UM:j]be<[ۖGmV9`RqF[ɲ.%=7J ϛc:Gιf9[s=ʵ)s{ʰ(.{+>2ܔ5Q^:L>&=U=, ަ7wU\؄X,P\S㑞.)gi))* sf?~28*}q3Ǻ"ڊ Me5|#K&װiHVX35ğ|Lީժ1+'g5dc)ї8~a >T 학Órnł[UgrPed18v zQa3V9e}C =!P r>H 'o\*aBȔ[Fu{MNvJ9~CzY&2ŖZQ;d61n5=r4s(KrFn0vUxHb4 _.Q_V*8_ì]0Cq^& 4&y>6#Q@UԺ9r1:`}-IXLt{F?Ȇ6} endstream endobj 56 0 obj << /Length 381 /Filter /FlateDecode >> stream xڥRKO0 WJk4m$6 C;um4h-.v$@z`Č #oTxX ULqRHH%dJ3H$$~ ")O7u A౸`ũ25S< tJ$4W$)ͥ%gù-A[d=l<'& iQA[W)[P Գ1EX PeK="Vc zZlX"aF U( +K4r쇌 k[L˾.M!>ٙ3] *s3!H#vXלka6Vh6t9h' ȓww> stream xڍvTֶHHt343 HKw0 00! ] a H tw|}}k֚9{g9sְ0hpX# H7( x& @~ EfчD j s/a&Qp ppwzn)  O@vq{c]%)^.p7>ڿ\-!/oK ;^0BNqwqo5/kzA!ؓHXǐ jOQG>. w9In#Yg?٪z9Q"^{xY`LWZ,n]Ug_@:f\gwa||s/^__Oh|sz;F/4d%*#7-&Ѿ(Q-J<'v ؋ofP2SSТ ȮOGKLd E >%sM 2nfbOH \2`e e)UI,g.Ȣ_0$Xs6ҵl5s\( ~b%L3 h+ζDaCv!֐QVq[g)UЅ1u`tewN=^8`qg|lQ|7.:Xp~zVԧ~h<."7XO10.ͽq&%`F scV :Q/ ^1zoi<^ 0XJ΢-`ŝx:4͉x ӲE@}XwWBE0 u8qW-fPZc}N Z6BhĠ SM0aMle/J#R=#͈ [J>,ى yPܭ*.IBӶΨb`BY)$Gy*X!,m(iBc#سa}|wQ0 >g8h ߓlL?B4*ius 8>&LZ+S)rkQBZE2S+8cBOͣWG*19^o t1E_ii?YK0!kjCgË E+ȭ򍅝.gՇ=\IŤ=e[9>KL5)0UD2_x0Eҝjr'o}G߱+357lg{zD/Ɗ~E۱ML){NcDì`t5W\vEJ͓Y6eWiŠ.V-ux"'ěC\xBN>i}Ȑ V_o{^졂tZy>"h5 C")eg$@1j)[Dj:Y=u6!R!DXlKV-~gvY؎0\Q8x ˫>Ŕ\HZeWW+=PPΧKayC˅]*㣛{U ĔEzB-̟ t;W#Bim6> p_=B;19)V+Z2kyChK7kXW|z(8l>B[g?Y=-sTAMA瞘)tT3t/\ fϪeA{țZ*)wN$oP_\5qB-F5ؕ&`Ʒ^R ڣ"bGܻ$>SLT9Ku#X0>mPLEތչo.lK&cX λu&"z8N̆7z9H>^B#?O* Ob115װQўK\w]uIsx&ݤQ֬Qjӵ잦,*꾟ǵ ^mTsAױΪW8˓~* `X{wZ ~&(Sypvwr.zy|v?fͳs[DmdS:FGGFl !()8 !by~ :@I#Ƥ`قF$wT0mh9QC5&|Q(X$W;U;Y2lTgnkD峙l]Tϯ/CW2X5v!J^I-F a5^O0}j;"hUqg@M's fFr/)՝,%}*BL4N턜3Ht2&CwbMo\2|4S;Pe}KmN*TOiG@105vH1TMnLGDz g-Z[ݭX1ykASaDL&GBDxzG[U9Uh8Oh S ,zvc7?J HG75>1W0m ˙ yRe2g"j7<d/'Oj9s 6D|}'tk&J@wa˔#@μ{:ϫf(C EU9y#!+w,8Bak(iOP+ݞG^ͺj84~G1us* 3si}nMZ4BNͨyWu:X!DH0z¼p7A>Jݲ8̥uΨ:cu7u 薰?Y%i7 ]n@|OM#sơ)ILR=!@ ~k\VHv_p9p?VeѶ|ec/i(V~ &vS7P/Q?*:1EE:L"HǥP\8rG--0 ?;Ӂt֯+FW \)RAlG!W`cr7>@30&iڑ~j%4ϞOTȽ拑YҜ Sbj|Ј`40XsoYLB1˚\MCtggQ5dB)=BU[k ,VTbIy3oB|#"%HaA|>-ޛB j^@ҏ!kS; =$q{a\(֮zϖ -jvy2]K OU`6AO\Myꪥnڳ Z]٘t~0vCe<ƴ຋o%$5Y/JQvf~+{y6X5OL3-SRYD.#9i}mQoUX4eHu|d^vIxpYa!;qW,G&GoW3m)j]YӛD{ncIbd>eQ =v\\i0 P_=&Eh[/X؝-\Hoy-\,>]ppCDkfrW[W4qKh>8,ȼ g5М`sMOl?BK\cwi[qƌPE4G|) y(G=&M*.Dg$LZUbE\Q c[L[*lggLB)q9tIu.M=_Rd8#Z#WP7;ϓWfijN2?6e=(mzܼϰEpŊ/)n܏$7 $pYaN fϜxh@^"Fyr[fa~8n]C|" Mb5q]Hr$rCQGrRW*skpc0-mK(;^DjߪWR.U/%%M J?>5uP# z:sݟRٚji'ҍstke臽N]^JkaUf幕z34y} čXKSDAE}ƫD^#*? hM*oHr܇g$wR eg7ERm\fǵ7-0 qo)yUz-qC\+ɶ@}>p~tA|`y_-bUu)֓\KKiqvQ+ -_4+\N@l΍)h\PYeal.qW9 Q?%cφ rt{i½S?g;|TnD&d{+2աP endstream endobj 71 0 obj << /Length1 1456 /Length2 8518 /Length3 0 /Length 9499 /Filter /FlateDecode >> stream xڍPJ-h/b =x,xpk${?jvt9= 4lRV < ) Q6prsrrc00a z +$ ({aOD5@psr C@@w@ qb0@`[>,L.!!?)Gl ta ǧ-m%L00;ѕgfxa-+nt;@Cb BA'dvh+^9"E`}8.v;w"ӟ`%vX@W0O+dtp<݁`O@&ZB0WvW9~y:f9'+# >Y0dt^_d v݆3 $7Ʉo \ OK[x98~zq8AO?>@wu l XlNdY q>ɏ ɓ¬ N^bMC-Y/4`pq~GUr*)o 0= ̀ΥyR.osqZ>}q?Og +wspg^3{5,8/UJCק>͂ÿ*Yia/As;4 O |Oei|>i 4<%q?0 za<]p=NS9?5FRMo$7pX qq8p }?zzj*tJ6]_ {Ne<7Ak^Ϻj~)X 93(06*4gg_/.VN|wp;f{B۵̐ $[e91kbs"CzfTh5H!lbY]YP=qu :4P*JpvOϻOt;Y|Ib_lvߠp'TSV_Oji gpfhh*܋)H1vgQ|}gQC QYP'Q{74ηA5BGWJ] [+c> 釜oeK'ώyc1M3&F)%O Ct݊d 3L9 ˻ih 缃I3;0UQFj U3 n ̱<.;IS׏.Zt .ԛdC ųD|蕜rA]$Qit KI4M kwO c7 3M8Q$%P!`; Cy&!:7QCfv9J_Np;XT9oh&J:f%iyLD8avbcKorj?yC(fi8@:jN#(lA9D\ȣ|spϼl4cJ$!q3>DWizQ4ޛE`"[Z{k\TTTtoρZL$vt_h=Vڜ@7}M7,7'&1 X5q?U0(q$365ь \iw s s4i?zıX5=? ](WL՛e,Ϲf~iz 6ts棱bk/IDhw ]L4s8~B.>[yaϪ\ǒB2Я5>;{X+P߂fvd KU+n棭{QIux(Z3*SڦeJpǧ/GC9=WtknF~ CVJr,]>wng Q)i\k~Vl e̽ TԀbԥ*[ vNJ^X˲׌/9= xp51G-n=&?& X3NZ\sRw,ڰOcZ:7>֖QlB[vEml2a7`q}kY$Vuܼ6s8PƩ\jY2{iѺHr2m<~ śr47A2F#UN=2.t t:VvswKл^_~6"cɒEbg+nNKF2n¯vJ+aڃ `xmzeݐ0f ѦF M8{qN1Pn1f[ NɵoqthN g3e21cdH$%=FZb BrMXxU^4[z_•0ul:+8*,}+W]kS <5iD+keZ8 ^MVLxk[>7Q*A=k3S1k@o4e tUAC̸1t; I ҚO171ӣXy+\?31{3QEEXMXjt9Uٷk 4?cFD4~L;Csԧ (%jlWIˇw2|uԥn'P;A<7xTx=?; cBӭuExckߑiصL KBi I[.c0PvF/m[fo˭\P ب_h""iX"NEt0C%vWq*7겔0K.:υ==Iy?A5,=uf!ht3,sqYH 95휔m `m5wMTg=+773g.:,ij"}M:BRvPFUmu'O !k)U $82oOu}A%B6ɗ*F6/,D~^{AaM:HsO,9|TN42k6{76#.?ݛ垤>dOt[O2h!3-˫]dlDTdb 6WqP8`G LKzpU.s>S?ɼ6`},&IdRpݗ{:'ոyau +wu$켇,ӮKqgzMc(zTuCe(ժ2mc/K RxE{L-2-I[0V!R (P`tm.JP~w=52XT*d^%Nٻ(LQ͈#PE^;p]{'MD@a^qKKZf_.׳h?J+q&wkG߶ܾӝWu(~X8;lҩ0g&ˉES!b#نSuQqOU!blK|K<錘iŏk?4*Rś=4wS4`XF+͗Lk>/xE.j'zrs3$bLJ!uE1k\,f ::Q,O bJiMu5Zn鏒PS K_ky"̏ `/70_8#+b  5)ס 7xeܼxs]V'F76<+ p= T "]l4aRCC›?L"|8i[v4[qEo.f2z,]ow:B2N,sׅD?^^,PAzJm+z , [:|r/q|MSlnp)Ag|Sw14t ""ЩZ1Pe^wAV2#zCCt"Sb;aoJ@͆vVYM+LJN.; qU[e.:Hkۖ&"%jy&.@Ǜm}DCT)vT>,@lSCi^ZZ@9CAfDңd/%qoqyv?-M3E$y Zvs0 {'tG!;~VU<& ;FQƩue%Fgfsy.N& ZZFo(=:%S]~l;Vwa^y{uUv [8նOkQrzcFBE" 8PXHIzpHAEC$iԔạVi=u6ѶRdVX D5 ~ =ΰBѳ NuWUDUnQlq6frJ*4<<>=ÄSռys՝S\ZKJwQ"]Z:t%"0TJbH9-Y8` S,{Uޣ .Uz!(AB1.g60K-7^j? nCa;אh]MӪ6M~ѮW=:^5{5(z12h*&ɲA^ZU)d%Ji+bө1bU[a!ͲjC\/%0iʸ;ǃϹH Ml[DUt݂T棁O}+%>e܄}#ΣkL6[Xf"se䑩 g5>GJ>mǙXUWmŅJ&FxQk`9"u'EܖTԭ zM\zKa/\ soQ>Kg+%Z-*ãG? -]:n=Lh"ECYIJE~p!<7Пe{\8˪}fcffҐUuȦ0l0s]R7 -, j"tYʎI(vD1iPs*T#[QjQp=gyU)%!TeTɦ=Ӽ֐;fc"7yg[J2MSɊiw)+G%Dv\LY&ibp|`Jp.o0rس?[F1&YyL(>s\4 `sx2T˨ڦo8!Q$I 9YM :}1xopzn]oeE3B"N7z~z^j{^|F҉lK]%K %;&:3dJBA/nf^vq8_QiʉP68_8]'^ѓ*Uݻr5+ c220d^PZ٤:Ի56 `;ėuaM`^5Q:pEru7`$5ʈ~t\A@-Ě)Ҽ7|~Ϣ"d>%8x@ή%3$!PlQdPNwLhokZƜC4TJ yzY!nfJMym2zWېo%8eEY˳Ij4aoY.v&aElC 9R Vnkyy=w޺Mߕ[#Z0a"`jJʷIlEjh5>3Ja'c"jl!valjY2FUaU7l>†Kf.F5;v1e߮ "_dVJAH#P{LP%g]$wNQT;7?F,­w_؍4핎a^# VB4hLۍ?}!othFkئݿrPWsUS5~RϘ{ϝlGMcyIyߣ9^INQOq_rto|ݓ\Y$:`Euga 7ygLBPsu1^MHmã!z-Uiř^q~ nfWd|tTiMM,ytѫWsQ8؊-Pijh"[|iKBGD5Ds)+kd8('}F"m$)U8&HrϬ=h1Ofec80'mܫ@b|$a6͍2cIX6*7tH8%.1sŽr^BkZ$VŇ圣{.:Ck&fhdzt!I"?ٿ1cr ߵ !<*wg5+rr8pAq zB+OxӹQ0L{*5g$&T˽ϵj8;aSOB/}~m>qa tɾHO |yc ѠjtBnS6rTbEu^~OؚO2B0ѹc֟.Zg,z F:<*{'& LLE1-PiVo(>fF?Uu~ Ag.zeE'&)xFkH@$=F\nHRrLĀؒ=Iwt=xu]PYB}&TH.lUͷU_UV ;VxnE,DOsKMu5*>3VNG 7r? FUhw86y#n/X!Ѳ;(LvF[kd?AWIܣ)gLM=fA"mv;:vښcP~\oTCln!O [5rH@5_Vq\\w# kDjz#H~b:1<_h=>]FN=j k',D,%~?Eo4>dI ]~2)lHZv8 ~{d}ɮEu7:*fmi36.:+Ԑ㖕,Ա[#=Ё<>^H ;bjh- 7ZPĪN,396ӢSW#~=X<@ʶR#-<=`rt h'x|=>n,c>& hGKSoo we_H qE )w-1LjQb endstream endobj 73 0 obj << /Length1 1883 /Length2 12380 /Length3 0 /Length 13550 /Filter /FlateDecode >> stream xڍP\ !{p=hHp . @Ƚޫ]{s1WUPiHX:d!n,)I=N;;+;;' =?r#D_R. ۫Lj(8|Nvv:6V#B#bce?z  PY^3Z6 7 A/l$ tpeute`xڸY4@ %@߭m\Rh:<. q}uqX\ ʀwN _0# OgmmAwʬn^n C?hc45t @VB|\-\l\Y]m0cXJ9:8 n('mx7߇kqm ?ڰtwbӆ8y#xx gšZN?_{urt_ۀA/_W  `U _ `J?_f#fSQՐRf*%%,<\NqԀ69d9@07+sAnncQ_+uSO`c+s^@u TJ:[_u$ VR/%cm 5GW? ;ѽn?Uߔ2 G?tqzR񺎖 ?Y `c8^]P8Q^/M` d8lr .?_/x ƴ/yp$L_5+ `m_5տૹk6~-_Be׍fs/~}~댝^_4WOWny:^<_^C, wew9@YYt 뼭 dٝJ~PZ"ykmGJ|1=Qn tD92ߓNlt"M;?Z>砜WPɈ]^%98Xy<"*7r$F3/89/Pqlr-WjqS^LJLQ$\--S &7Yl:sQOLoMKcF|Pߦ;&m+{0-@qU"r s;VLd&^ gϔ%e!9O/9 |^0| H /Ef9)s̎?W؉B(N}WxP|d*j"w'䬵lYnϰTM(=D̯5L:ʖ4Tq ) SHZ#.KngޣXHZ~U(9 7|Y]1 z+-}ʑ]X:9sѣJT=O.E2I4̅R5ds vL۾k&4gϚ;( ?ftUYuNUr[1%M\T"ZnQޥ[=_ɝ⇯նGjU]EܭBFVcLJZZ){{Q~Nh3~r?zGȓ0gW]fa cq k,W{9AQj9 }Fp4rҷL>r]y .тK5xcey| : O/mMY~au c! FPc\bv#'2Z "\rg/UаBat{}PG" P鴑'R~{az#Ұ)|Gj3D* X YZ1ӑ(H0}N&w1JKMJ_uRSS I~ks^M⻣wdLZ>}؃!DfvrYB=! ~!T_ݦkt/936OR*?&y\?\h(߬lb\K 0U;G-,_KMnNCEN$h#1)a 2TTBk`l0 1MG"rv&8dMes@%58¿f3HZr6=o;Ǥ;bk^S=a4Dz}BKE =r\ghzR2o+[S4Vg>3O 59]'*?4,| hL("|dAZPb:Ct'/U75oAQ Q@{;3mUFSlL8G@esYX 5 Wb/2s3}I1a@-l+E[M7ڼ'PF?,M-5GXC\n_A' 6ݻ R^Sub9|NoRĚ(NC|,' wF\[aj.LLTbW9TAd凳2Ȕ^eN;\a䔃VY^|uz[M (td2EAHK4oG,@03:٨ϜT*4* 4tYA\W + xhaLNMָD"@}ͨye# l&ܢv1P'5Q^gW=pθ7sJ"H[z 3?m}ؒ9u=čM'x{'g颒U]ɗaE Tth# p i%&)I_['x*8 e 5>9s7/ 4JwۛzFFKK`N;FEw=h;fW $:^w&eʮZS${bQ1*赪6' <[jd#Ԥ) e䡛OQa&|F[ w#%YS]y`Aڗ7NKK.5bj 1)D:X!i |.9"-h}ռ޷&0rrY2[6do=Ui%H*M7""?wimt\rVVu>pM#j{lyB4g/@)uJ>{c3Z9%UN|$sʂCMa=a>W}vL6TǜsN7hCA%mxLP0X#p—W%2ȲA I!Sl&AJ[i h-&ӦQO!ybۻXL&AP'eGK摠"Icxy 6p[ *6wb]X2\u9u{k1-iFg7x!6g,M͓TIjZ#lU8=|+쓊 LMGDLQaИŸpzwR~%yR^Dy;:<^Dcʖ]a-@^ƨ|kgEX[1ɍ@p#6 _5k.Od HHECCKaWrTf,+`Wӹ.oxZCۮ!>W`s?24u{@,.1}*9Plwm7K՟zcѐ=S0@udޱA`{W\8wR(SHMhe2z?0\R@Cqd@;F|!18 圆FQ{8\7JnI ƚ_%{ 秀dÖUe[tOHA^;79剡<l#uHK;. 5O9 W`ǖL&ti'lt}EfN7h=+FκFD/4Z%D.hTu0ҘfQTT^&5<4 :a ÜL;E5zmځ m*PnH=}RkXչ*r}Mǚ~7o_G#&˧>w]x+/mqny{ WiO}/< ?;0m8@۪@d hr5pU5ᄥ/JXтƃCbAѧtKvjbl;4[NJ8Н<<}Mԯ\+ v(,E-;.uG)Q%p}Ƅ” L<~Z׷q>ClP柖F=qi5˽?Hd p1%A|zhX1Ј8trWlR;Ap*J -׹}?:MV˪mh$Yk"Lz=eh4@W6$)LtV&c3fh}?n:d= JEzXiBNR&Uh aNu":Q^Pz`ǿ[No@hP&Ҷݽo[@S MCڟ=# T,Իӟ7Q3Mo'0h e2~z6Q~lR&+ᥬy9cGF9@WuRWޛѼQ^I > Gn*D )Bki5Os#Pǰ~]6aTNS<)Bc3&ޛCݔ Zń!!,H5 pͫ=\x.}>$9sĕL26,}(!=%' A>8C5˧n8 Aozcw;lTQI͚n{C&:?4է5m,,ƪx NVʹOPEAf&9|tRQNr7wց\[_h50`^f)~S :!TQKH'\QPҤĀ#2>U16hۃ Ìd;{g.>;8{NMV4 4-[DE 3skͧ ';F%Yz ޏZ.%UΒ_& SӘ|(krb1p[PWNG+g"oh+]ymd㹣E@~|zsF" *1q޾qG^K2qwXt7Eפ`.b(ݽխ Vȳ KsC/tfqr]qPR<ʜ#S#t?eG6y8-)Е•?75~-&,o4 šW51;)yӁ(u3TmA*_ [ԐFQjX<=& 3@a ; Z‹=% <]CݍwBWU⠱nu_GW7nR8*t%SKѳdsN!Q_{ξ'58F);ޘy+ Gldand0=X&ǕkP(Yȫ=8K!8p@Adbb!DBu)a_}:Iy΁Kc:93IV1^LŦ]TvIPP2dU/#1W^|]u MDpuՇ=NwI6#m:#P)F),Y4#s6jOͶpܘM'@4{y5ɭATe¿??E R*R .ښv߇/IaR :qz>Uw?,u08+B,WxȇēX$TNXG1Ĭ](+RkDng7/d⹖65'tM8,ZP&$0›_b ^*o9M?O+Sp\HzFD뎲?T2J)iݵJ04LwTw)DeUYGsn_FoaX;+Az F, ~lEh_ dr %8߷֔07_|:P9s&,nrվX|a,eupMl2ftQGXv#dZ ea TCltZZ*9 _ԏoy06gu<9 |6~@&a`Ǘ;᪙I`vr{6]&SȝVvvT09n6\(:Iw%-k:Hn.Z'D zyp)̥roO_.]YE)T%տԕ1 F@HуC&5B/BNrzs ID[?U܆)9'Q*X"}C\Ġ 3[utJKk`/uyRJnM#0Uز)Z08S[ T.R.OijpuYhZ9uc-$Q5 1ϗ5 LhiA4 }'|HROיִl4^AZK oe&Jt*/4edAEwd|D[Ģp`F#h-PW8QbB|)YM a4:TdfVZ@I2%Z_JgQ;'S=u|7$K,op*GNbb6zpdG:E!a e[S~[2B/"V4pѢ8)KV}B^)h1ٕ{C26)B%I'"k`C̈cmV)A0zj!H6Iz2Õ%JԳi ~17J1Sy4k &16)sMHT&k:F4EbL8sV۬j9ww%^tK(b/ՄO6l\2Uс!=n$ Hil⬹B,:rjd/RJ]y?#),zS[ mf`Ї( )}ZW i ZSV~o&$̝Ѱ: g0Lh ,Jۜgc o1UكgzQD?yThTOi2!Sww+BsG$ˈc eZo-#xcHLMSږ_`R%N>oZz3 [Zΐyh4cܼ?LI+giT-~ylEVzu.pUO;hO =UN$z oceHTLA{ȟ~p$7unb oq3RW"bQe0w77y.܉?1sR11ll#[O.Wfg$(9Ih mKT/jG 4ȗO`S)g3I)K4Ǣyτ9Q Ǹ&f_?Xӑ75Dm#duxG<.E q#M'hFhKЃwE'u7DoioU g4UMeVo͖%0opv>l]ISאl}(L BBfV+:pң6czS]CXᇆRoG`Y<%#颎ZtJ&(x*qa_ߟGC.GL"Gz"bk:ѶypEUt|ֱWM:)_~'B܌Qw6ji{M^97|]U4avHqJd*4,JN7-$hD9l4A؀ w(tBDA0YQEH}Eѧ؋2|xm39x51tW,o7-oh|BR6@TS։}fitI=/؀R3~]̀ E$FiZOa;T^8CEτزO_|_Z6#*]c&p$`[aÌ*Bz&r))-4g>Ĺ6p9 +Fhq3op)YRABo Ԃ.)F&\tX}y(wUw~ߊBOT \!bz強*uC u-:.5ׄCHY2'A"BY94EehDd!sAPL[hغ$̐^6 ù=?`d"(4DSaTs>;7ƒ7DzzU[':_iy1ȸ?k`Dņj,q*&DR2QC-%R;(&}^:(Jx:e'w56#^3J̝ƅL968Zl9KqOEO&|Xif(\΃s)ܱ ;a~eOi}DyAXqq-?BA'ۃl`7Xުn/Ӝ c5zKɺhM4L4|˚U]Lj]40B t$YяO6VhֳPw9x60e/'=X>c XXQ-h)dH"ESΖR'OW%]#~'}{\űcURu'1k&b(]|I%b8u6DluD}rpIګޚ'|ebSF|2W4:w܇0>T}-F(`,r;N;[0] qa|@FJV5 H`޴EAU ҫBMX䘟O~m JGD>sJo$P gw(P{M~'VFݹTxD45AkM?fӑS.taҍw#~%2+I ƏQT#o~;݃rOX4IŸ ҝDtG3Dy̝hG  S4{FBKVB )~C3_u%JـhXh!+5MzCcq=C0@ћw24mvx4jnqnq5}&Wybyi'Dj9ZVx Qj!St. [Irax fJQF`y08l 'xN0vsN >pM%-l&nq,a=5j |>53ixDg~QE܁S#(]<*GPХcV@-\39QyWv`\3ff 85{wH. %X.Hg*Sb˻CtU=ӀaW!oA ^`Ut[cg5ݴ/k+͒u 5*c W6!#˷?q(2SNTc7ғ ZH 7t8:N|h&hY݆:Da dfA CF>rJ&(J endstream endobj 75 0 obj << /Length1 2269 /Length2 19204 /Length3 0 /Length 20536 /Filter /FlateDecode >> stream xڌp_.4wƶm۶Ac;i۶m>~9w-_kP^F(jkD@K Qd33’*;YÒmm80r8˄ dlmV&+''== m8.Z T=|(( lF6'3{F#+9BPp99qѹX;:RR\͝@G a5fe3sJ&N@hlc t'(IH6Kc@ 7Z@6;ZظۘḼ9QiZ'7'j_V.VWnP#_ ec![kk#_ ;NZغx LmM"alGbcn ][f tӳq0_+3zz:N@o?`FNC b?Z?_:elkcTTVm4Fz_Ca -_ [?վ*vw(]Jǒ}Z kӳb]&(!:[Y[QX[k>N c6T ͝V}lLFsGQs7?\-2:uhޏWp|ɿU"6F# + }n1N`b׉Xߧ7b F:߈@'FtbN7z'Fd|rA#FoO7b)FU~|jA7zng7byZHX[,=K6 ߕ&32'3wٟ]Sw#ڼml_w*vޟ+o)ÿ߫{ lcKg{g['2qo1ûO*:'3o6;Hj{;tǡ{û&t'-{k߷*4]5 z]+8 Z %C#"Wʪ [Cȫ;"7/GMP -O^zqS{-G5}x04^/^`Mhbn5}+!{ URpϥ4Q*E9sDN4xTnH73Yoqa <57<ʕ;qHp4nPG<$< Vݚ WiiӪ#lz]Fv?&T49aTE9U3YMZoUL,q9kfG~]OkC4w!C ;]jE|}| T"fZ+ixNc:Հ._ٟ! =.?2lkC➲d{]D{Wԝ˶o΢,Xʾv$1觇P䤉t}Y!W ,;߬.q'fY )`[ pxȣ=UPieS =; 5>ܾ-+ip^&8]/Q.UL C\!񉲠 uC 2Xg+u0)yLOP%E~_nS#E﯀ 5^~|K ҳ0=C82CiU]bL##\vCj޸*P[68$jcG?䗐K|FOȴ$it~\ƣݩJ! frkִX@٧o8U󉙄 SҌ XZPw |) #MQ"Av$](3pVlN J"UB,t*!de%W<pAW2(`J$ʒzFUo=~0 7Sϝ@_a1}}|=;ht]i|C8|WlIGpzZ_ۯ乙x&AXS~2=}S0Y+TcjT{OyYمP+MN9YM3FQG K, O y,oDL87$`mjubdž">BH.1&VyIR;Ȕ3b{;ǧfβR}k*DF(z/͓J4>7r +ى~T>rmKo%6jL_/Pct#8d'6d{ˠJ9(_}xBHߥc@r0y7G[15ẵŨc[ڳ{0Ar>>c@^L2.tg \^"aK۰(]|/3HK1*l&X;+ @Lav1ƀ0+$$9eߠ6R_ajHJA7'a#'êT^1_URIPnT(S o.ÊsyQF2:$$Sq6WbWO L+n\_Yvn۝S&4Q]Ab=;>q¤X˚u[D/$ UCQ$o%|QU0FM@2|Uip:LE4jM>M|[Ok\]5 kZ! AY%08Lo1,1"6(RG;| +G y)1 Yce TQU12 B#9$ITSIbiӉ4o-)S9l&AwrF*W0IL8h$~#`+dlIo62'\39X :~EJm)v9MC7s&"2Uլ?>ߧDz4 6uO1&ҾM#GmDBjIe?|Ml2>^HCУr84+䚑eï֛uPU7KXenV>w{&BT/Yg4?W;8\&]}u56C3Q)rߜS2].wR(OT~pF3l#038M\S4FeacG{sD0ʝOVyRh]2f)|gA5d"ŲQ(Ņo|Li[et-3^f^gn}3X}C],f9&j 0'a^o;&f$x}:g2MbR\,eG-gL&(~k=mSgӨ?on9c N(G4CfZEoJR8A(R%$C rZ">湃KP$Z HJty{wyoLtǺhD}n{)?;Kg踬]v~w c~5[2SL'}AppdQ̼n׏]suFXboci t&?STN| 'x)Rmb3?4WQctz~p+{P7+I~xyT.r\'{sAʹJ)g7 =j||ӝMǕ K  <2B4hFMtE4YjarB$E;#v砺ߍ r,N*ŶY gR Zͼ$\ZVKR|vzOQ @ JIklSmҿ٤IT,fvF ~ 5\lƤu\"Σ{uZ~UcE?KG/ͭ+*L%+\=n 4HIeUN 5`sHU\!7L6"ʲGŐh R~F0Hl;RJA+e)Z,禱qAS*F\Az-M<[Qd=楇Wpw^\ZxIukQYc/NܼVqb³dj &~%2STk8FeT+ΨK7(emWtؔ4Zun.uN\>Ϸ0'-J,!]5QD=5?[vu K!W(~P"]!)1#vue *z4< BȰ%>Ӆ{X@Y=G.F_ӥ?RK,(GU b>bLN1.N˳uaUh B[6(e;D炑[igLw w߼OB;ש <G_ c*6#ެJ:Wh5G rR\ .>bw[U z?N(~ڛ*@{TM ^f%OwT^yD'M &|w c?4zܢ{Hp1&"VQ,dת$VZCkܠ 'fdӣI$3﮽cnxS%΂)AzP۪وƬ:rɛ<:dFFɣɉfS}h o4!t< ɞACe_C E(C<;X*:&XI7;Rh˝_ژ<$pYJ0iX Ld!N/G$IQ$Gb]d \^{qswμ_Lqe5Kd[Ed:E:M( -n6À7¼ k1-UW4'-He@8OvH\Oz]߶`ڟNd#>_e ;Sİ 4pYq^qJz8Ԭ[f@mQYuKrmKvxi@6h7^b '`aY>8xJC;p7XJsjU*9{7w{1 D@ȤOSyi f?:vǟL\jhD @3`I O:"ouc@6^!wsH'I2 1oʹ37c5 KĒUIg4Qf†-dJPQ[~JkoZ>Q^𻈛@y2ެ{6iQ1u52e5?L~^> &DXUqɠVZVyl;6ִ 'M1nT/NQXcs`a!J͍ȵV'yã eCsU7!j9jτB)J9֝v4"$an'ƈ1=bPa٘D*Xxoe{Z{T Y"!P|-2h?Ճ:cMtu|:'y .K4U`?~|;x}T:wis 4]5LEGPp;$gR5t8z@? %!X$|s F 7̣9_QK3|  DHv<(,}O-3igp,` Z{1BԱ^T'|$`.?*;R@͐7oRfRrielh `N$R'?߀c_gT%}+kB Ǥ%F $^'{ңkw@dq_E0GN {I=kd]S'[;ko3[C |v TOhZXQqzU1PAvr`Yi%*%*pp̶[X@r܂3 4meaӏ^O=0<Vwp|;`97F9˧vx%|ŗ)i) ~ħyss~YDWPYmX5c5n(]V/,TFa哰[tlMtxBʚ(gun_!^}_ƒ7K HIS<)mx,͐C"Aؔ;t;.Yf)Ix%5NގWS2sew-WgLS2/A3 #*ՂSYUwk~F!,cO"V>=O yֳ8޸80eB)?i?j¯i!$ UXNwTŌRY#T&BDw볬Pʃ`;*3t/UF٬I%*-X힝2Kr, tr읇 AQXYL|NY\X<&eK [eh`fO} 7+SFO)f5:S}3/Ry4spL)Jd  )b8ooPތ'7˜z 'jТ:#|}6 yJ\׃Tv+۪x)O v*փp429ʫ űrti \L8L ̃ JSO O~4h&ePץ#S]j3VSKt+,l?I+L9:B;oT|$t4О& mKU6e;!|Qr :UNkF@&o(NGf;!W ìNq3f897' C̝&gH'et mY`~9]<>3c{d]AmAL8άy/yX ) %vf, s(]"nu\:NLq9Z_.9F6e>Tv2TC=9{<螰c `qM`o+BF[\7$|kfy{S{jtU "ׇ)tgxH4ԒU N1\t ~_ofc(Qߚ=1j_A>H+݃7d\͟sgg ģi|d-{pFnO+'z Ӳ=~a7ZⵝP#mvE5d;⋖]߰If&ϛ(P֒iDZÁMʹce_98f"H\NxH|0W?q|95,NbqckҋՔZ7h,hM}n-1bO9|0or!U@bE+ W\:up$Z11mT cQWi& ϲF_d/.K}mi6`UPZW:\.!Aat/S:etB)F(R J5=TIH8?>g/(GVSZG)|R\?_ĽziAϟ3/\sj6?qA ٣=V(ul#ӣMw5 ίʌL%C8R!\53iydf[I}B!lڼ>sP:l*W^^ ("50U:%#<.iLn𹞋}ɭ4!QIRzT?ౄG;7Q/Lo,8Wv1/0 `#G,@{2cSmؒ8>R&Op5XDF92ݺo?x&1u5%mw8~T&"n%4<^ԇy!<,-i5 kplgvq=<K{Cp?NFB3ua(}-sHq<1Z{Wv ZB}i|@ )]47W$p\ PGɑU\o4&ˣLV< Uo2\ȴ5B qWXpPV#Ҏ;S#GrY2QE8#X2UnRkL>AUI 8WQS$7paSNԼܺHCKp_%dJu<l0`FUH" BVL 핍L9A qG#k9_"Ws𮏈}ieh!y`VUJR}3ٯwS}ti2 <;tݬlLw"{ ^o͢Y'&(ՕSОg-+H,shH}y>v#G`p_kL,`]c&9*dɹeؠm*<:nrltfh}\FHw-ףMtrPcfK׈Wf\Ov}3$da~V\s'̍\s3&J=3pU"ND3y)Wyˈc=m2ɃKٷoTkl؋CF*ZyfYPvl¨l QGlqZG4\vEBE2w g^0G`vbPj*քͮ]4}4H(ȭy(g^[K=`S(ھSrRy]_e+•X+\m7xnAЯ(N?U')nX kÅy_9oJ2Մ㡷A~Y&wNb}٫,ڰB`jb+>C % U0YSϏeɷ~vvp<'"4= yᰁ2tTKz,#*,qګ*=nIC -I$9v|V5S뾪١GI /ll I U{2LHQ2CXckM%Oq"$r͛{-ǥ(^f(ɸhf .a-Ë"%@Rf#fdaJqp˚|FJHk lB sþcP2*Ob}Àoy43ŧo0TA˴X`(?/F1lQRZ`]wȲ st2Ŏo4?"q~ln\ [M3^~? _x%reZ& ŸdR+Z[<"$Eя$ 6OSc5̔ 3| nnmUzp;v~iӮ_j@2oN%] hfx8c'(S/Bv)gN[ Z&p@u f8߱I7攣~ӏ4s#E~taZթ6Ċ 1||ɯH$i ]<> oVB~*aOV ˡ - emȨ{~&V uV [Kh*28;&;onT=P_==WNZ{CVB2=}Y~a W]?C-#c[)D: <jCONcvY>-9GTjڻ0N/"Xl|yWvʯx88$+-J#R-%z]WmhAHsJˇ)oa4Ei Zadn?ByXbOllJİYH1Dd\?#6#Hj<7\ܫΜ% eYd y%oJSq9bߋ"әڴҲWe0|z܏%%^ǕhU k,W (LI 'ArNlrRMnV+R:=>/̊s-<n/ S~^]}}?YS*zPu'% ^'ki븦}wW'BCה!$uj&  X6r!~ a{&fF}!W&&v3F{tL)HO'ӝQ"tRnd??ZhZKjnb0ʼnUL5%KzU6%;L~U#}" l>tM 3vÞ?9IssJԀx͖&PWڑBC=N'GOP\>\'/s튉=H ɥ# #]  ? !PiCsQ|XԊkPY\=FVA{ %PJF@TR>A.\/m4L3; >m >1jy\ 3.fߖN|,Y Cq(,ч*Qŧ]nԵYHD~=^7N-㉰$"=ei~y-ɶV* @*(։7`UƉJEaCTR{M՝atY^,"ٶ3DtNYqKDSAKc[Qwj=dtaLEe^813\V 8GAASe%Hm)li8H~B)򆛼355˄ ʃ2ֽ>UVp_M޼#ok!UA׈L֔%39drOjeJG+ck^qip]'\b4UA s@ Il_oLUݢ g>7Pu53+QcUWc 0tH=v`H5KӟTpadUD)ˋ' B}m/?:]{#xZ4Yb8E޺Wv%HN64;kW^-!sJxy=dySWN%{a* 7) Y`jD Z:}uક "с :+)qC_$;f:l?h4?o=3;od<`&PC_v6b\J5$s?Iu6.-ႺCwTY[^()11+xV+q4Q7MbE9*٘]KVl)X 63H\~r 5D!_62T@nW|ǞGaMrSV-#DFcv-8#}(nu^!D|_\95^q}7s!%奵g[}l=B١%kFQ7 I"ծDƈ5#ȿ2(Y/b<wp,Ij!kJ\RU_-xgKӿvJ0 h.ב(_ׁ]nd_qTY8p@iz4B lP cU)\b iyt.Zg+pu^;(ra`=1q5p&ni狖\w^sNhw /|&9wFĞ&uYbRLцxY{fT,4U=(qA.oCҥ;4;ӶP fȑ$Ep#8:$` -*+tۊ 윒!<0s)(dȯ WQFar)u8Lxз(1%'et )U;}N%Ԃ׆H< *.b]HLH LY%SBHqzċ;pySQv&֐΅TpjZY+ӏ$Z>,4 6p/ױaQw6-),3yQ/^\<\m}JAR]"ntP4wJG{+2.$g#OGq<38Р:>.rӮ*?9nTgnĵI"7lV jfGθ5d~Y@n_zN5뒕];-1 [1a >!f_zUWFP]eT"|#<&EV?԰ p%9"_+k'͛MF<\s; P`S?eD_ZqUԨ;҇W{EN=S'[8ϿMsLG '=~a2%Wߔi3́Kl` j67:<b4G@ |!cz={JrZ\x(Nϸ_v N]SQ>nX替GC(˒FEVhWhGyVݎr)9;vGG{2H, S!A`#Π7_i,wGMov~?š7kݸYtɋE V0.?,?WX|D'8Viy݋n:shQk[!SGO&~b,ҏj:jc{L)h:9*FKLҖhdh2g/m' %in?칂h?ҥ$ze|{W߲\| (Z3.nFs} `0Xdu3QIG.pTnex+)`Ls;;FEgmz~\Q廅dNc|Nv2"C0rs%b+ƪ)i' 781(ّ-z(X/GbVR߇fN\2YHUr}=yߢnWzP!JOpl% s`y}n,2cF 2zjd$B(1b,"{tZO $dž)+ᾦ;rKB7,i YRH% jR,䓃T@-ʸ3&L5J"]m1+.#إp;Dė·rzIl..Q+ endstream endobj 77 0 obj << /Length1 1391 /Length2 6286 /Length3 0 /Length 7237 /Filter /FlateDecode >> stream xڍwTl?JH0atww0ƀ l8lt7HtAJKI4 H|S}s]q_slh¯waH~!4@EX$PJnAxB0Ы $S!1fzp@ $@Կ i*haOvuvAbnIIIv(CP0!]  7  %DzH =gyn>0xBGr wH.P? B@ <1^0G` 01п+=@04 pAH92y1 o 18da:O0PWL`*pww I+?U(t-{0 stU "s b@ PBR y.= B`L~pH !yCH$?HP0qH!NdP!-[po44125]Up_DC?eW HIӥ%Z n?c1& P | i_Qw>^nn\uC 6YW=#ZHf`nn"S8B`?TZ07( bzPB@0[v<>VA0K+``3b$¬#Aq` 8$)*H? q5 ,oj`{!L2?˄?l 8Wÿ6*7žf7:'#L ]A|WJ|EYDӥN[aT{˟vk/IiJvG|Tqy+nv6{#/I2bS7o+Eά׉^TN'ۄg/rțc!@#u"}V5v2/InHժpٴRg==ܓ[&873o=+]A˜&廦o|}LNZ+.~]3Ž9@4`Q{M zm&шW=UƼ@}wD(,M{Ph}}&z}^Q$+!tI`b>ްT` zz$%, { Z*lb5__i}}Y&_H$#aJ9ЪrgdVSe` (h Qz` CNk5%;>|:5idpy=&zD V>5fƤ(sJWj9~mcIyC,1z"F;Z(ИaăTvөݠ{Rl=VߨѶnHDE!\]Nΐ|<N0IP3c hP=wyfdfU@~ʗ9]N$ $Cj{PJ 6agྎŬ⼼-ӧyɍ ;iհ9[-$xHu@ M|Bs?|[pc/,`Cv(nšr2#[x}z'lI?7D:'oSYy L42 m~RzG% bd3]/ř s4b%oLtID w9ըA4B^ aEc82lw6>d9\/zoSݪ#wi-j,g)v$1)T+s k6OfZP) :ƽu1Arvl ]v$UG \]`X$ dԵpKZU7tqNve.l)g\^|]I7ϭcZ!ysuWNڑ[b|l>%Fo>SILLQk K[w:4qrIc=ppB;k`F x2͘O"e%$}cEͬ*&N|>äKCW#hшv*YK)T43Z{[$CWb}kb2.l(7 {vgpؾmk@ )\tsL}>eR]plf\aO'̛F1uP/;2ېƳ8rf\*^ s{<⤖"vn;΀}Ht`\;jǰTY5*8^ly1;|RؔcD:S_uRkSO&FoJaUk=B*k~!НG$,pW_zͱSoS/Jj댁msw .#L3,ʻ:ɵ5 ƙ/G|5Xbn'{9 n*2hw!dU~>JØ,yYT֖{|\pS#--Y^Wr>9e+լ] B IVC^[0iBv =hIu1IB 2}rFn3LflG3 a@RНQ0~wՊE/ޜ.~o tO^vj;1<~b[cMbkKtf;p _9_1Dtxx3~x7kjVkq9i:9Ycy+ϰ'NXʿفef>OZN`R[{_$*1rZY+1I1.vsaxLכ%+"%iKxzic>yYWRp%Ch}jLe; =}1P Ekex.&Ffګ>\Σl<,,9Dcs(XQV CLPءOw7?-j "YR>Ɉϕ5FF?,7Bj3U֮Nw,Cu jA  |*oS,cEӆ&e_o#mFԍU<*Mw  óɈ#4Rzk5kGk"I9{z K5k Qw^]s pMy֟ˬLߙgqfh1_;\sRc_b@Z~;_1cMd㋙R|ߞ(4^<+a^;aĬEyk٧֜6۲S٧R)gtb8f!dpќI^_Is 7\|9e!>[E0pRq;4o_n5oKf-H Z؜E{' Pࠃh^9rUx(}݇zR^`,V7%-Aɾ5fWkJykn02AHh^(u~ىfB~ɘҀMW^WcY"#d [cpU\I e fPsB?(#yo8G0ګnUBŬ5wsͬjG&^_0f$x}*j~l39S8󚑎oȀ(J>&J[MWqx7/{"sT+ssd<ǏqS=~pQpzɡr3!Nsxʹ[rAs#޵^poA{dӊ&jCЫhs r%KL~\xz;8]J\[9ʹೳ]'.bvoeS{2rY3jf?<^Hoh:Js/W6M^gN 5U:"'iez >$۽ SkA@;=̲=C7' 4eIEx7z<%W#ՇQIΥ]VBя#ס\)n\Ղzȿ-sJp,ۊ2B7t@a+uɰcRX h|" +S I^b/>:;753IbvMÔ^*U)]͹&}fPyp=7B^uA~]sBh./q5 2CL#P(5&t([*WHe\U^:ϕ-oVy7LH*B盔t dž+ۃGÓ[cOkxq9Ǿ/vu N&k>g]y!7* QTpW|@#d->`&şZ(F5Ju_-9K4I߇ VHۮ ?VRߺ,e44?$r+mw}XGa-xU2O*(℀k흁WDT /[[U߮6%'u9.|_(޻{"_arDaΚ%-d?Fb1weUĞ!>`=9T7\,nql\mMr|xpׇ<K Sn?$V)x$4RH.P-U\&xx~Fsêܠ_<@+gs/=DӆoY:ivUO "p ٍTWj7=RUh)5ZDvLTOٴԲﴮF\S,lE*Z}Q&} +r@>e-c- ա (tSZ~<<ؓUdll؞BRms8lgX4Q贇K=KwL_db~tzuSa+S ($=R}w3먥k*,ӍG=븺`TM mpq8g*T}0rM##*qeXwNgt_0":uoijCn 4) 9>3Xˮ=C4 匈7y]~Jcג&-)v_j `~3],e,GL_XfFpi{.$z^F9e9_? OY7r> stream xڍtT6t 2 Ctw "%RHJHKt%ߨ9y}kz{_ff疵Y`P$7O ' cf6#!?(à(L 2ӄAjnPeM B1\`{$*˿6vPLL;@XAVH3*^&DzxxX9#x`p\0B [vZVΠߍ1 ?>aPl"PnP[ Wh5ppy v9XAP{h+i =\+/C+rCQ (PvA"x`ȯyA]"V "xSA6[=V'(ljͅ vu*eAHr_QܲA!^.y|B| @ug+_U Z v?ciP& ?ݿ/z Z_Gk xG & 6} [kUVC}`dF8ׂAP ||Cm@[B-?S*Bm`_H`[yF>@ڂ<3!Q.T{~;<g[F͇‡B<`qQ%rd77xXJƃ{sDjy+vn9x%!v {elϊl'27>_Út[|-7[>Q|å6q5 rhBPcqu%#;V)] ݪVw]:cmT4Ŝk5Mň =$:9$}=zK#d?b{܀񞚉ڄthGnY7+iʶ5d d{SKÂyT\5*zY%ѹ!K0pQmSH5K;| !>}ՆJZX$z)-{c9+}z4/Y*p gUF͏sUV2MK@* NK 6E ᢓj*] $Dw^R}Jz`TY*maCZ1-G8Xd1&])lW ,{LVĠdDNCZ;Dm1^&9F1al}6^gcg{j`,@4s6;¡ ?txRQԒ:འ󱷪]`+tAec^ V4}IL&\;w :nY:zEScwTX$fϒ8wWK }y@HTm 47!Y'nXjfDN=X h3t2Nm9υ GO}) XMii! RHRv@eP7U&*ml;%)D܆! wFJ^]P7r(߸d{)ܧUuq $Ѡwhо4A"QiGS˞M=r&=~wYZUFl(_Nk\$NL #輝ooi4:ξuDVmhA-pq`܎?1{iģ@}C6ضgolJB"_ [sG_KOXSy&1X֤+XkƐ@K&Ok{=Qu=RRx[)L^wMz0W+N8&~bO/Er9Mg}2Vjne؎G.;q>^5ѭ9t+16^9zo*iS.H7=ٿ\7;3Z09)T(2T^QS-Qɹ;@F.XXh}p]Kn]Q!6Ń y͕>4QO߳qnȳ&a>#pS|;GM5K7ẗ xoD39]XO(6O-Zo \cB,Rɻ=^紃ox&&PntVJS).5i¼+|i!˃d͖[!7rKV+7 Wm˓"LV68mIsnv̞ٜqY]RuQ$UWkRآNO?MM׉͗bY~>oUE?3+lޝѐ?|ȉAHW:(}+2ŞE-逾$pjkoQߜ#pOulca8#6\ oLjB[Ɋ!ӷj{ kaTV8CIǝD.<#/~k'ŇtZ$v󾑵i#C+4КâϽ+tR^sNH^{]}튎 4 VKl@_7uMRX: -1/;s"aѠ3t-T*F4Ěʜ]7d7DH1_> P#R 7}VGGdNU-p9llx*>kGztf.ktBi3Ԫ$+6 =N.Q } :M?<6'FhrP+E i2}϶<ƴəI|=xK\=63;x 17.T{RX_iZLw?137900ծ}ﲵA=f,w-۔Iy*V\[6mPp00dǰ0}Q8(~i#~U-IHՌ}+4P_G1Pvs=M" xB?=Z?xR{Uhhej}MfF-^8퀑g179[HU)Fڳt6 Ǘ#S+Y8+x'g@iSU0dSSE `o0LF3 (Swޤz5vX Lbd %pL0+TPsԶnv:b%+.=kYMa+Ѩ;vȟJ:|918"4)I<쎱 ] [) OWUbᖅ09H|s~TP֖g)MP$xԔ/C\b~- aU_{RPqzlm+Sݪ iܽ2Gw&>!&L;Z#ph_odqDCIV^G=>p''+kZF H &+$ޙYbu{M{6L| G{78|4ҿ=RVYGaBqP%Y C}GYV\[ jmHyxfuv%''7bޙhS:3](FS u0 Y 9]fp&4^J'r#57n2y*^:!vikrLYh昙w;*Lk+ڶo}|Sڏ.wK/8MQzfƭ"܎s ǽ%*גZ<r>\ICÉyzh >v,en_nV ꈯy^EAzLe/mгE,}ߔV+ @9wu`AJV• 91|aP}"!% !8x;EZbTrNGCQrrnW ؆|o9DbxLD]Q#}])}f# Љ&}p >"g<% )lb5׶ E|qq/yMѻ?rƚgi?~%^v[VoKw^h јY)NQe"JsK8"qix†%žrІCYtW%ɠ]F0=!Ki9ݍ&?eX8;{ڐy(=Asbk'?5pR"8:HսøΎ AqJ]=no= solH{e1^W,fxauƻd_/1Ta>~`:gdsm-:a}S *7U~nB?BUu1+wseyEᢳAs4`@Id+އ7H:QQg;un˶_C$֣Ζj~{ʤG26h) ϒHp.}I ziuj4@UiV&0}/|վ*9 *uAESA+GiU7֢|Evw-RHeG<هreanN@+:]Gڪ+hمWn >jaN:[y;4dx[m[J`ltGk2Fm -edQG!4:뵘-h-]djP/<Ũ Siͺx8 AO ۤ|-ޜ-nm^m7ya8^QheZh1W3+ @u}哶Ti!l z+JEN4{=8$۶R*Y Hw76',Z03O%zjps$XLez94WE:Ļk*$ Ew/7ZȾ S]u;赫 ƫLَ{xpM{~?f6S-D!THj> zZ̞N`:5DPGmT8cb1͞npNu*lbqY/ E̬<7װ)iI)` vL47)P҃2?uPZejG͂`Q1v3MQvX-X'"]3ӳ^M8%kG1L~ ~zS endstream endobj 81 0 obj << /Length1 1856 /Length2 13350 /Length3 0 /Length 14511 /Filter /FlateDecode >> stream xڍT-, kNp@# Npn .]Z^UuvSu 1P W03123SPY)ԁ [0?x1ӛMM qX8yYx+z$n=?B'ef#$G8d2C B]N!Q1َ%P)-lkԾ9s9E_ Ӻfn̎E"-`<4S!NòC;f$AB ?柎ܨޕN>,-_SltNck{+)/vc~,yZ1ڳkѷ..5c.KESIn{j|9PT8,Y0^fn0tp`^Aib i룁a` 7#h7rU89QDζoΤH_Qqd>&N%zj=cmeno!D@e&+Ķ]6ʺ2.ƕn.v}V!jȇƀƪM_Ivt'̨"&/irfײ ' d!##OIl*:I Ȗ ݌8t^hɏxNjZ)"CfEk>\w6i Fq0>vs6o1K4o=x׷,D[ %]ۅғsT5T8, kVI!!ܾ%L{&f7/"=Q?~ɾYUi̬vPkR!س` ~(%-c:4ߚ\*yyCݿ<׺w۠S帛jYoi AeR:(wFaaNˠw38sw`?F#x$a3_zX.#q'4' d"ԡ ǘ"8 oxoR̔{-JO#z>*>Jb\'ç VCF"ɱDx>ASnJwThbMZ-,͑0҂d% RfwJB.*<349'}/zDw%@b9mkRMWP7Ee@|+qf6C9lalxK7a{& SJnj-F&up:.Io؆/Ok͈UmSl4 [ jv^625oLŖMy?c^ +t]^}^RXTĢE[Hկr!T{>wdxR4j=ҏ VuѽO7^|cF|uu2$;V.P)Y5~ E9z 9yocYyٽMdH赂+% W4̺R~X>٧7Y>5TS:iZؖ⍳fX<;1t٣)T9b퍞qX`LOC'BY::QY4pTyGϯ` i\sK (1U˜ce灇L~,#ŮuS_AR731cAQQaY[qzjATf.N,et)J@EѠFeRPR`_@+~pw¹-baKS+e(hI/\IݠW;K0JUyntS)qZuTxM/E΋ɗMz }c=pP^I -tQ*JS fi(6BOhٷ$㚔BmC+{g˄јKf1һG9%D쨌τ/qCco=yHUBOGI45Y!H\$*3c/kB<{V];Z;WFj#vh9"$?P Lx>p}z%=JR^*ӾY*ٱbޗɷL]'j7Axd$!xi3-ҋ-"uwh3&<&GҌAJ0LxkvVre-awyC= n8\ۚW_c,3.ɭqsk2R}.@ҧTpqQs%HB⦓krPLɨ39l85b;Z R蝎Hx Ĵ{?a7sWpa+U'!n:R"){>m7^[ }pq$|\7i rT-,OPr 4S}g0ѿojψWISCqE }Ⱦ/7 lq1tFZgҤtB~H=YPsiʯ Ӈ xZ?!a34"T]_ wX ~E/Y*"6J APƠ3wMsS{]Oە ɽ{zoc*06|ηWTf%k8r ~L7(hZjy|AfOBX o&QURko,ٙ[.V5pqa587eJЩw@o M'R <'yhƮ#Y3ICdj@#rnU(:"0Դ}2B!4neMSl~J_U]~uvdHpHEތmj]^ėI{@ZGdiwƂb@ӨfB= ‚/d\3ʖ1V"i;5f4"qTn_E?WnOEO d, ȐTWT3@tC ȏxk,+m<)n qsƈ=6/OսGlEv.'1A-9-H@>+\ &#jBtTG-C!3jDBh|h I~!W񍲺SrTȻR ^VKy 5!G8xCߐۺh0ˎ1 TXB~XLꝛIXFʫzLOT=w`8*EluNJ{laJI cl_vF=̱fmѫix H:;}1ދ+Bԝc%hw1#PXܞD16bj |JN/[:ak%hu^ZPJbSlGq?+uab.$eίwٰҫt}|vH(>o5ws~O$Glt슏ky5G;vۏVPH>БjsHݗ1/=}d1NW&j!ρ$EAl'//|_*NwHw;}iIz +y "j1|OWAT7.]2.q\8\](E`;M8–P)B+¬Un9)qMP3r嫡zu*"Mدq q5w=tt%ߋgԠn";BJ]TH.l^,T؇ZL"ǜ .IwQT9gJQq/wqQ@v{պg'X3 ilu?2qmOm`\&bn !v42j@CB| 273e[af\{`(9 "&3s޹?EJ)sWFٗx~i&gy@xR;Q-фF\fט+ Rѻt2 0ӣՕXpjۢ_>AW{Pvޮ)goU@> Ru$cZ{hO4,ƛ^ÕEM3a#?gD`[RrƜ3㶉XsTkV>(38 ,f7_&%vUB~$x`4:y2X`nʸ#߈m). (wjK,x%$1,E(*bLb¢i2~呫KĂiM&GǡT @ӓꖗUi"lƝdt#f $YԔCC(%oxß;eZb3f3E#nfH:?SxSivK.@'p{ldnCasZWN2SeD 1A3;&5dr qd6OGeg. yb1"AS[q\hf VUbLVىqOt?PH5VgӿRGPAk"RaxBGa[ymz]z6ٚR>I^3@i:h=ęMtW^pAR[Rzu&s^86boV VaOO1Fc'*iKjcFyVI%9.qfG$p.-Ur[L͚J>j:R }ϧuЪBB_g`jD+cOhdb>lKrY%ze4o;d&9'x6\yT6\+S?[~=-R΍DIL\Cb@d˴ؚ>i1*kF.F.2n;nY9 ޡi;VrX?-5%]Gr)}IXy-m!~HBS<3i^s:f:fE<l O;_FF:v3clmF$ CV[r_]+ E>> `4jRQ'@?d$Wb?}4z}WIظԓuw: 28d @EU:@tϒV%:C. (e;&8yN?m.* [)ƽMTujy qe#R3CW\5 rA+p I vO$yHE|Tt#l%2,ƾ2_w_CvWl"OJ5u`joUH#q5];#X;D8<;~q Sd>oqhYgBY[542##^lf~ׄX|Hɩ8%LM~M 4;I]sD5M&B{L~,<S߇VGEQ)b B6qIXmdaqL_}3lGΚWB8&ruec(;LmQ 35>/@i+dKij8o7 /5չw$ xeK90dh8  D ‹/ f3s:? 3EZgh1$.P~@!vql/\JЕuލ"%L#?hMJW@Zq^m -]HvVUѱMUdHF/%1W߭#SqP &C 8Bu;*6ߠ°^)1f볩/x.bdJkB3zElB\IJ?[ ;'˅bxhu|ZG|6=y|u,U^i1`C|nq)V ?N\,v[}/2Z][Qʪ3lthcA5\˷UA҃T0Tx//ůþEGi7tuZtzfU-HXI9/ܻ60ªC'˾7s^fH&)9ςezwE#Iͳlvm~gb^-]_ "rǢy;4\u0c 7<_ gM>_a&='YR)əKOzSj=tMeK gX*G]#+rrk^DidJF櫝hu7 fnzDۢ~!k\ QTO$38O1hC2{$E~-s:@ ˍUbȅcG TX6{3DD0Ƚj̱V*Q[jH7U ]䘃 4.&`K }EFƾUzWHr*ľTӓR&B80'|;) E&Y8kĺٙ]$9? C*G{ +pkn^v X3F2+ ׄ{- %QPU~Y,T꭬9N`+yxt,^tiA<t| ~W.(B90& ӲYV7i=inȆؗ&ɸ-OTPvǯNH Z>-*x|B%E=4lF>bɦ _qgrM]%+xxS{w@6c#AZ XDs-?Y:rIw^,Š!$,3JGFw_ɄCRf[tFjL{u@gȼaaT# HXyeP*w: ܼW`xABоhgs3]Mh |RyIϙdDv-X($v7ZzqZnS,:;8U?UI(s>%/L|T~ Px|0 ݊kp/ z2Ͷ0S܅qА7[P#G~ ?DJ]NV(ROZ_ndB%,Z:;\ +h,5Tm:NvZ5x_fpKGqUDy;(e2)ŜkcŸH5MNpb;=B) HBVO`K;ӣl{Ո|Ȟ_lDm mctԗM ~PbG޴q!f|^Sn p,7g5p9o' MUOpSp1]UyYZ|Ek?EԏEIo"y!or{>'XОw$J%=CVLA!=0ɓ*$I/ʈ=@>~<xpƓY2k婤:4 $C+~!.Rn')6`b }x4=@Ѷ tf}qIM=jg co16͐TD}![,6yƐA m>NQѽ(tc"\*52Wi\'aJM^1;d{jL>Btɇo1wC}`*~-ŀ5 OK(2ft. >U&U$8vlɎa/Sg-Wmcn49oߪs#?hd%W^ij*GYX%K*Su'!y9VJck/BK~!`#u+ ۡܚ^Zw(Qvތ|, JKm3hjifլܛ -? ~u&t}9pRxH;hhؿZezĠo .HJpd !S~CQ~, ͏w"|_}dss|RS0i.o>0kS-,eY|eݱWx;܊~5$Cm*OWi%s7YЃ?KVĕ/9x QĐ|U./$3$j&;'y;rAr5 UFT=5Az猃UW@mcݧ3 { _d ^к~~1Ir(`9ra%1Ǵzn$Vtp%Hk:$v\MrbAIC7Q)m?/R/>25Uuޠd/Y nA\dBWSMS^DVwM3J9(=pk?#WEwy7َF ,A 1iaaI0-QKpEjIpDk"x. GsNI ]5&Q#8RDëC8KOJ ٛ?y Ybh[s~^>unPG$*~+Ze.%5i2͹@ʹ#y=ߔp).e(r;(8Dm%dN׃-yi㤓{{ua2\^ZJQxd-|m-tg0pnPfn0-[5"JƿE /~K/'QI endstream endobj 83 0 obj << /Length1 1720 /Length2 11249 /Length3 0 /Length 12345 /Filter /FlateDecode >> stream xڍP[-LpwҸww5иww <;w ;3}ڧ QRe13J:302UXl̬j gk@G'-b@#7#@y;[5 `efW#/+ :S{8-#ڄEW:@219[mV41ڙU͍ٞƉ\r@S F6ZcYvڙ99ok -x[*-P,w=0?ٿ lJ6217ٚ@@3=w[-/F e[dwvbtYwm5:;4yw_ dkj S{&u[ P?1o&́fff.nt7`=/'o[>^v6> 3+` 2qAfe~ Oo 3O_G̤!+)#GOvڹ8Y V6ۃQ2\i[3;t_]?BZ vo#t=ff/gUB_F.l@D)m fC5<b^igi5S4#;fhr6[45d}X6c&Voӛ2rF迗53=k#GG#~C/4e[ E#s06XLAl& n¿7s&?[ + d0d~&? ?÷bYި8ߨ82o\o\_k_t/ۙYyư;ʎq#纯 V(9y~ZdleɋT ef{]I΅uOCǐʠۍ \֡$?ʻ sFDH\nn6D6Jvir+DBV2wGGH7YGiݜnq8ꀛ֠ONBd|;WRWgZSr6M9'9X3j[oXvjֻiv4Ǹ:[)1r1k~ 3 DS+kߗPQbv\n.4ȯ2 ڌ @-'A՟Q8Ff>j?wH`WWdX]3*hayg уAByj,};?meibzzA%P`r*v1E~bnI&a5"q5g`JX .l RgI?Kjm)(ׁ5o:QuPE<)|М8eS>=="\KFSAXͷT4ch,J&wdB:n"e(c3^^>۰@j_pbw/~hfM䙴bx{c?-G DD~vvڷsċX_k5 h9]2TM=cw[ʲd0Z`:p 9 W*3718[>/~腲i3N{Dt*h I Z~%"[Q?sDhD&|_L Km* 2F~* ʟ*@V)}NLA* RTWVIgP᧵9x;-qHs?h^V2SX`/?t'­'y}(ӣcsPi }w&& 3һxqnvyU@+YO;Kvf[.m R-W]+%}$|j!RSwmoݕ\"]~KMb^-VǑ~bF)P1 ^)7#  R 5Fh+Cp{*5U r%34Y3a`.tTpkܯ(Y W~iEj̕܍ nƝ>hLSdNBF=?uK7ORFZ:c' PP]o?" RRSִ\it^ doz+^tW"XOyXvM{0?X%wcr qRxA_ܮ</VMVft:l<5᰾/(x>$XNio˦^9^w;fSI0|=Bu?ĹD,}'%ls=cmɥQ)q{y:׸w|y-(ժ sbkt2w2?F: 4d}9NM 碗/ص6SX"8MpZ+͝w } &B\ :;4uw(}35e6a"XgOD~ncwv/<ڌAnij[_}ÎdOQm* =eDS 'xPX3ut I<BA9jJpcڦðGD\">Q}LB2fdP|Kio᫷Rlʟg&fӲ,1[fJ6-\cksWxYk[Vjx>Y]n4eamGLkRH6)* ]2&/?C7>nYI?$ >S5Djfqa#-qeer2i|Jtb稙Qzul8֘M?~Y#ՃqH붸\o~M à@$q s#T,ul&E?"TZW7Tp:/2FE#h[ERpE-z0;Χy}JaZ.E‚K}lJ/;圭>ׁK.T~rۀ ,Bփ"uXڂy+)q۝ 2k~6]'ťL8q)O&>jZoSp~60!ڲNiV.Z:[N-7;7=#&D<_$ OY~bQ!9no 2 ʖ;{fzп,qz*Ms-0}*p].{`* H+l[P3Wvx29Vu 5m B!әˇ*fIyMIb )Iu,ZwzZi4X81ғucˁ-m.5H#S/Jdf4֜~Ŧs8k[:tQ_3MCh%k4ISw? xnFh~lw>4*t&N'P$yЗ[skQo;5**_$ o 3T X.W/vq^i-!`{7K3Wo:9b8+8]Hgw;_гKyayppx5ӒF؀i|лK$<2u MPγQ4 ؀}!ƹm!Dxݥh~͌ڽf5Qsi= 3z gW!Fϱi~}_w/lXσhdfbm KÛj/7(%T,F`tf.6ey4RZ;JmGAkvVjFYU^q${2}k$Idpzx+Sqs&㽧[[ ǚWx-k&~!z-[aWn˗z /M6P\=w+mqյ] U7wz  LSpX,imlg$eCbʬO,+N,jh{_*^ۤWbz^v]kDتq Ďz%/Y_@::S| ~lǎ:B%2V%0usvZVƑs͗q,_'~7>7iM=<9mb]j94! LZ5waA+} 5ZQу1Pcɤ'Y9FUN\v]R^_goQMkTAy=SSu0(akM.c8`. BQD(1Ĺ6~OĘ?]-Ǩ}t|ٻA0! ıq%D-|-n.є[fF /@^k݊3/d9 q@:*"nq~G*zDB߅v:ir@u\Z.M=)LR!ј}K/Xx":=2,fNH„ni<:@A.bip(37 ~<$IdHy<2|ۗ\"y-R]-dnUȻڟE|灌un"9, 0lsMf6>^Yt{JA_ksv󚚏9~ qr Ynj1>g5xw]U }OMz< mP ׎.f} Z,ۂ)]`Uabk/e;fl\*h強l^029zs'cjt Yt4"a G]3MSĬi0u gXvHHpbA"vّ22l`ӿvv,dk_"ՉEXB*Z B3_t{X:};)T3Kȭm$"ʪ]զk&_O;VP]ؖA9+=(JX6 pNG{;iO FqcB+-EjWGBޮ$kRIQd>ѝg^N+y%#Ayywn[̇y 4Dgդʮop~% ”k$K+Nũ!OG`qa6` !ZB/#?`rTMvX{꺽<O%2~{1F$䲂E;)f4]bD>,M̨*J[q9j%&|u ԓ:gA4) fd NNtr!Lj呩,Q$R@^:vh4aie2W <R:}aI%8ƃjkEڄr[pB.IĊS+re{lڳ,Qj * 8bJbQǎ$xr]c$dt~\[)䉟qϥm/3#H;LSվRn+hEӑsrq.v2p}kXՌ5MA []6j\1 > M&NRL/R0 Z*Ql&KVja[SHghlTl1xU6 qutx>ǩB@Ǒc:\ҸY만f$PrfIz眩E^ 'pfLCrb:ܑ #uY+Y5A_6_mqfXU/ ` 3$[3`庅fw3=e3ՁHxDuȮJ`VA2I-'K{~3͉̏ﺣiH)1gMK=PťCE<" a, }K, J3݁l %da?(-1VaNS?,B)"65ٓզA[pφ"M]3g$k!<., F)6-xԒ?6lh->ڕ! Plo(Z vVi7x|m!muW [) 뼆g%Q<`$M\ļ4Dn*"ђy" ~3Gx9&7%aӎ-5-ϸ0 p$T+v:MpXb}%+ɦUeM%Y`jp1VԳ Q+wR̺p3k܍WF,>cQ(V|Jhk u%?<ڬ!r7@+F(;@~lI$0U %V/iJbL\$_9%wu]^m}VZ)u'~rl^'Pe;3i%Z?cjҊ2%5zȞ&Q@{&%֥z+rOV j8ћ?ꙢT TֈNXrY~0ѬĆ]X+ FPIg<2kU5Vb֚FT4h 9Cb6b$L17at$ 6݊ETPb*ӲGkqCQ_ ڃ%nAn1qܾ#TPIGgw^+8MU\mȵ9blB숙vJrXWn'Z2uH od?Xߡ-UK__T|qH|0WK_Ց!^=IIj!ɵ$QjA%ROΜ(>8"x vWM|a {(?8{PnG</"-V q^0>B;{@+yH|r g:WtW1N6,u+p³`z"HS`Y+ @@fLgp</T{SbCI%9QFL%,٣i@0oQ zĉ& 96gلw,[_^!y=?z&>W뫷fܨ뎞CƏ\cfi`T ~GgAApc i ÿJT1I7,*7tE@RaMP"ԟNSfvc0cqM}qTGഥH {ڦ8"8!/P jk7Mp%rEvZx0P:%3Yq6[sx%B:-t? v7vY8GW=ȤTFsGgNLdXCs,7ֈ|řR15~ $'*¯.ZVnFRLe:1hḾIA $pyHsg'F#x<\7:2i&ømSqF˝3\%]ɧd-&J-JAj=k27^a/A+ pS:lT􉍂A{pxtrMDCA޲o<|//}~-í݅>/NNȰ ߴͤ%b) 8 tl+}`M,(#;KIÌc]%&GQz~:i?yǺ2ut{=ylbH"eU 5(_FI`<򂟔bKaLu?'5JqӊR/-:C(o¸U=)|,\i&U6EhNsfXNk|u?BT7&(Rt|0: (X:d8AN3oD7ǞsY$W* \}RW+oeIKלFPg7dAxXu?Ums ]ޥ|k`"IRyzy 1z8DzI9V: )CM>9^u`j{Zǟ".쬯?frlC;G4ֵ(UkYm!~ AfHξF0 a\ fE1VOJr1 'i3pkUi s4$J2Rpi qF !Ѫ7<Tt~uOBMUf5]ȱtJ[zf}Y 6<-6rS^6'}Ql`Tu ]:!fllOAҫ`2]O 2~Z qh4{i ^%BZޝsAM,qG1vBoO@|>vAKZRSuc$xu%OeKϝɗ (Ch"dM(.v+bug`3 endstream endobj 85 0 obj << /Length1 1554 /Length2 9440 /Length3 0 /Length 10465 /Filter /FlateDecode >> stream xڍT6Nww CwwtwJ 1)%HHJ4H4Hҝ[oγgfz]ny{H sI ||<||X̆`+_v,fc' H ?mD-( HJEzJm-:a1+@?;'BGQ¹D[W1jkHS-@Y^``w8v#4ǬW p }.$_ w݆;RSh @/Љ~?Nܡ6@A`V{zo;#f_=g|{e0{(??W̫akn&wv>} p BEѵ]?b P_>ӿJ[l;siC G||w"e/W?~oƣrS}RM@^54C/' Sup_n{\.E@qc*?*Q) y@ _ka ph(Oý9& dC{[/LAD0?v^sz+jhOŔ[`zB]+:WLK`KFbHvФTnhs&sGE'X\,: RD|f[jv5&رد';W}KkԻ2otPiL7(nްFO%ci`k8eN{៘.,ϼ'%' {P2lǓa,nb%AMIȾ|jY`^fveھ+(@wdwSjT?isVRY%ni"Pμ?0"Po,*JTĘHn8>2H5I_N0o)H d}Pp<]ʂii9[+Έ&wJczы;qn_2afYPoV,sQ*Qh,iF‘Z]-:\{58C3c!"@ik&w??\@BAÛ,=ySޣ*ٴODD%e B <#1 9O, yGռ7uo,mcG.<2GX:z*-䄬Yy~]=rE]Zc%E1aQXh7B{nҙU̗K{ N\nQE*+:RҪkXBL1^)D+LAsy9},+2.|۸uWwiX^_i -MK("}??C Q%^jF͢θkR@1 Y ;X'4Ӎ"fvCIXHDA8ւï4W|ky@["J?#tfK.UڔSgM|6HC' xlYمIJw$,>97KTiOiWx8!~;V~Re+ݠt{ZwdT׋0?oL@6TcKs,AAOӭ̾JJAH!= >m`Y8!6L"Ͷ /ҌBlM۬:" &$oMv ESd;Iؐ ٙt E\$*r5$ !H.3>݊؂sINz"iFư(,UqAyqEy 鵽 XxV^ X }Z%"J7e$Ҫ+Jpe3,"b'@ Ǟ \MfUX6.8J 4PNVuS~l˿vOG/E+, ΞzV=kϘײv1ݒm𵤍7_oBd-35ݱMv&Pk4m"V\0*q8JSW:c&(Dܼ ey)Ceӻ` CO'T<{˜fsO47:.IĒ$1374/\hx.]Uu&].dMgе\\LUO_bZ*·J䧬d 䞂E #և@7J15ixhR.{S tJB+d^spo8FW;<%%MF ~XG`bF(%jKм~2[خg,YM  nAI:K6\\tZq%~D׍ )qN|땶~gD 3zkO;^üt\^ıQ3F{?Zi-7_pZm!t+}TX )L_M]t {OOc˘ ESPM1-ۍ=r߀\VhBTcXm I]Zz4$;c:II෥QK#gSx]; 4i0&8F$\wA6/g;*.ۍ؉8TU)9 kLܽon=oo?)`öją7=[}Հt;>aVtqpIM:06Do y](˞b87sHPK.#:!E4,kK#ڜ]$.&IqB%o< oXE8vPX Ny%~|6\?q=y11.>e11C:qeecӒs 7']#" |hf8R\+ONyڸl$w`Ϲ0Y1(LGHA3}JedsXڸHA/z@Z kU7 qv턴lJCBܯ ygXL Wr #%}ʰ/J),:UJ6@^qIJn\0 ^cǮ.Xe1LL&nǼh9)o"ձLW-62fq`,c͊^GIo W(4 6!OIyPKJ`2,"EẂYFIE`A T~mCWۓ8s5 q3Ή!GSЬ+gϖ%rP3,o;QɇV*֌#$r RmsՖ{>`=EkZ9.2j"uUͮ!oɲ!8CLe5CNq/D#MuEWN]Ap~!u(Z+)oՁ>SA[%<,{_a\6;'@۹i~-u6b4{5}t5.-J1/_`z}z; ^h9~ p_Bȵ(OHmTy"ϼIJH%k3Ǖc*g?nO#V*V|%P׽x&r*F$X6p>MC}jq rAߚ4p{;I)Qp[řugcer/<qEa["yɆsj@CP g_L~dxU"j,Y#̲':AHFDrZY8yold[sRw9_H7,(qHW;>|'\V # p;H}G\S>Rc;LKb%Wȉ6Q"* #; 퀧d8~<㛝L$ dOtG.0v%]z=Eإ+)`#Acπ톺xI',8y^#*5QRVs{23NSt]Ob&& p3[Hᤚ4ט7XW"&wS5y #U~;iIq/yGHiqҽsQ2Ca|*lHd43m*&>OO/n bj>f5mF oNW_iSRt-5 gDpIg4y d]x fi ' *} ,QJV]6rJ-wg;`D E~2H%higYm āҧM^{5Tst|lRsICz^;M."@G J}Z2y3(΄עGbăv/ 5 As");ٰDH!(:ŇqiS1Qb./( Q>mc5D>UAUogl5$c/9,x L4n9P`ן:ASa~8z@cZ[z+U h ʜ!7=O-Bǣ0*)@+H7y!V^2 ĕA}SwCE?5*>-Yu1?2a]=W`u4݊x|^56To 6Nї_9@:d+oW>2D]D@Rntp3WF%mByDABƁ4䪯6uKoг u^*`+Ddk().t/920CRub0K-ޡJ.ܜބ>OuŞ7d>:(\ʦ@? QѮ f$MėjWӤٯ D㌸۹f.p+=679$>=,H]D\b@M5^P<-ouZ1w9$Fv Ԯr;wQ[T,n4yѐBQ4^eN$&/aDtn=sc-BnҁZSi%NtPCmg)hpKndPrѠ8?C*zZ0D| rF{Y~G&[(72J9xvx6-}+!\Q#cOIekwv|-Dui~H^D$Ǿ^IZ6[NZ^#ϧF{ô+7T=nL2ADl><,HJ]՚>Vn;O,-*~G^=[Nwf¸[鱃rK)1Ƌ+(_TvyhZ[_$ӹCFE(ٽQbߡA{J8xއD\nNǘ*['q~K=kx E@=6"'(Bp|3{1y.mTM)AcXZ8r qf`Ɓ ՜' YȽzY;2Fv ?bkCZׯ6BO4{ V1U}"nc,0fﱊQE(8q cr\oZÇ8zJuҽyql Xwzgݛ@Aq2lj/k"9z]Cieb茚+"Jt?1c+WjY%AnrR)V| F*e}Y8, !1)U ƻ^`dnbWf,ŨVqzN-nO 4- c:7J G M#X˫'2AgE\&/~ ѻ.u>3~n3=o_RRO>ɺL3±bjT Eix߈6ꫠ"7wK (L#q%6{<,Ǹ+0(.ߏ-j9 5(]>ܷ;fu_[,t\Яw~y!s,xQFEbi'c&S>gtӛ!䫣< ܙCBs#H8%y@\³gR;| qdA@A| _lrqanxF.jLò_41;ʤvjbN5nqş ;V 3-asPK04a-fxW?~KAn3 1vxnU Ddmtw}}YMmǴړԐ #Ė!c>#]WJqKF@۾(vj9h\ %NdȨӤ<|ٺ}: 7bO}lT^`H~A%fNK bb 6/UrA̡G3VQ,ء@r2q0Ժ,q,XOx uIXOeMj!S28+,AVxNj{,rY0滢晒 .jLx @’WUo!@U<05QYx]ny`ƣ] !&\e&Vߟl< fz#ҋX;17~Y"ΤߴʉȊ!IRϐ""(a6Q>qK**`Za2[ې0by1]_gP!+{?V{mvoα'tn`sS7o$ i;kݦhIoY]W2,.tjc'/}C=aa<#E>I6z+*~\U } ^K LWlqg]G1lM! n|VA/cQH6(_[xEH{ACD:>YQӄL̠ڋEhH/enէ/QW px?-F ($onm+g wEg4BimY.2y :CGaBm6z0 cMX!4k% }RV(l:6[{naR1J{?w_r6^Rt67v#ՠHװ疼27Sp spmwp&{޾[=-?|C+[:YԌmʘK.(dld 78"RqwećR _l]R> stream xڌPb ָ[Ӎ; .5Kpwww%H 8\fΜ9{UUkuAE$f6JA.Ll̬ Euu6V++3++;"rD*M5/ '˛LP |pqظxYY쬬|5;$Mܬ̀`Jdmift6>>?b@'k3@ h6xOZA+~wwwf{gf0# t: P2U3"@? 5&6\\A@'[v@ 5wd l`Y,eifF C;g𛿉Mb&oU35R s =?Ik'[=Y-/[Q('͛%:fV,$PtdCV`V pqrz[ `nm0ZZ&Z~l?~da`?E^NVNNᯒV=L&vQTLb/O9o]/a6o,%>+/#_FҮvvic7mo]]n@v k*ͭ]V@v7YhbbfnGǝY*`g?^+ѽo@f`?`dI\\ok4zfV/H,x, ^?"7aH,2(#^v?hLFloLͬߺcg[m@ζQ5:ۙ8[+[nS'3_bտk7zK`{<8Xovv&Nxk_?9@`1|KO=o<Yɬ:j/V?}ckn+-4Wʷ׌/V?B8}ŀlIo sxr5oϋB _Lޤ%p ߙr8Y"7P~{X\PY\ݐo|ooP8aݹx }YxP-T6Pc]d?0XVd)}X2ՌkNQ,ݥe򔛋 CnÜb<W`ntNoONyY 5K>:b+]vdRxL9yxu KtEE+HJCC*HoGk3@!Xxy#w\7Wݝ.qH,.NjZcOvH| Dgڤ 'Co{r1(,jNO#`u|jnJ"PaYԭ,8* H%(ΉCEPmN%-PlGo/aŠ/u\wGwsc*6f(@ZR/n"auAogfWߌ͢ dt,i: n=vdNiþy@[  >V oVnn',UV>SwŪb0#v ר"ׇI.߯O"\]H"-'R##,%Jv:D&K6. f@GFjɵ=kq5SiǎhNV3Hٴ W3wz.ӳ#ɫQ"Viͦ/+P情ȟ3s.KbJ}4fKO,`˱$ \Szs*22&~b l,iCuj-5AG961^cmZK [Tlz(L?A_~H2פWEpdQPlݹ,E9];<^MNf؈›.~DJyдݞpI}tt,.a}qgC~?7͖3͌lCX-];L?,z,aKoaHz"VU5LPư뙏Z6Ȑ)݉h|-1#t(ċL2SznH? Z8WCjORm+:[3$Is4iH4h;s(4R[*JGj2쪨["L 4ߏn>I2;Z!̾z 4)+q_Q0Ql\YyWgrԝl'yݹ?`T}6R4p_ˑ`{[QA) \~!l/z\9H6hט1sۗc{q7 :!lV\wyxFLE ˙;uD*c3"`Z|~f3 y.&,yN#.؜֧~b;.1uGd#ށm%%Эn;8G EDysh(f8?dN. X"Z_0<mig]bcrVØ/U&&fj1*[["Ӳ2M_A\B':g$+B|J𿆸ITEvaj6v>)ux K1e3LOVNUya|46a~E1n%:kaΐ pZ?KO+e^$T"GIƵ >K(2^X2di:u)W Җ' x bbub y660n5騰0lG8O _N&Wj6' W>yoۮq|[` mcTX>|K"ڗ̮2ROZx p|Ov>&É(x4̎?M5•C4AaЦ&٢6_JV^5אKS\a^W8y0"=ehgz_67QJPz#+FwPʽF>f/D^AMb[&@}BS/8I#p:ݟf.Y`Did#p Х/qTX +sBWU #ndůQ9 6<̎\UȮV9hDa wMų&x}־Lem "#a6uW,ѥ'G]*mf<}QcW=0B҆kا< N '/SWi9ҕHu:mR:\=`_v.U\L+KMճWRGr,֜b@iT l*$AK;8.*)KSsDѰ#8YǛ5q[Mu˽OϹ?}i8풦E﫺6[x2Xxy2;M{Xv>`|؜Y ^뾭WZK˛ԴpVo0b5h‹pWn,E=9Rr$%Hl'Z*.mI]63ey1s˺(TxlxW@կkUp3@@bZ4$E'?0[Ҡulk$1i.B_:Gf^OzBNcXb܂醓mTTRpȇ.-]iYуIs`G+J,~g<*87zrEqXT>%9w\V hL { $8=U ^odxCh_>BwC2G?2U'ϝ4WM&H0i`v['@sS2ްMpק.n` /IC$BR#rurokj#7'My!_,`ˬ6-Y: հ~Rr;/ 5(&J&NK e)=nU\uP'\@~I U&3!kWq/*N 2e}*zkB7]p]wcmhev7iے`5nT `Ϟ.2HxquKTU_\\uɰ)( y좶 "#D\v:ET͒]Ꜹ/c)jKvJ?cMlFBK;\X79 Y6?}sCCPkr)LC9Mej!vi+妖N[wzTK枊?Kmao}_1<^ϖ΃gɱDJl&M_x=Q!S&gύ_tg"h q<5z O83_`فwD3]wz3$K Y[ڭA>bq^:ՈdGS?lgbSeua(]dn IUr勐gi ,| Eoq$EQ8k(UL( G8SӇxcnS1i 畹YiI/;JHZ!q.y- )od^=}eN2FEmJNٖG"툱a^CߐL6,!7L _)fQM(~C[M d[2-nў|$lE?+rj#rMQ nW+\R6[7;JJ3VGď3N]هauin^AKX㒡q`mjH&M r/.P.d_⾄u^YrtBI5oPBȏzdLEl\ rL/ r?!B)21?NLQl4oǀd(Y(N긦@7VY*r{D%uA9!~x?dz矖N's*Rw-mG xDSM”X`'w٭K\hYEw}$6! LwoP%"# q< 1.94`$^EbU.hG?uBJGs=&~ziA-XJΑ/ AxfƠ>P훧ʓyԜ t F׌Y!_rձ68ԅ:8mq[.h(2\ҟCx6#?Σ*$UYo Y7HjCxADSCTuc># PP sgx)˺asawT@ 8̺iwx^?)%Gnיqǁ09VoFþGi,je &FГ IAϱJ۰`1Ddh-Q}@,Da8#kY"םK0١grp2_\._6lU|'ypyU2L^bq 0EBdt=E$ϫoxh3 WE#y ]Y {L55ǜEp!E[0My z4'9>7˵OSn%yP˯f-&$R&UgxWOY좶v@cr i]G8$(4UnfEn'r)&<5|1+ڻ 8N| yL*Ϣt6@ rG-imekyNsJ{ZO1)a=U12=MAs/*uhI>n|6ٞ]Tb0L*۳ Aܹ+j־R7krdRDqF u|Ke;D}h(~~]|(ϷՎ+rW?iOLU9 \V5#P:"`ELQ伲 6ǧs/ͽԥ܋pl7ZCǶ&YఛGU%4L!~uyg;rGKP-}G< uD 0ҲICH}= k(Fe8j>-%= @=DaseVz-ă Q/b+u1kiQ;f6?VVk|1Yu; sY[B ٛ@:֏}1-従SS,Rފ俣tuGஞ5F;zpO:ZLᮊ>dHY: *FM<ٜlFweWMQ0Y7\%PNQxN/1g,.4ONQwTwn9|q& x.oGe/PcWR>ɬ&o~6#D,]mK1._Q-Æ0. /4rR'tVetv SMBmM)j pPNAf;6Q@rB1"OpHMcm9pq` GBf!בqI%H 国=(vC2&ʚ(z ,֮ 1}즬v9(.GhKze.y8-n"1ԇɛw޼wˎni<(_X3!QR~N҉nԅ銈H p0] _*%$a0}4Q_ ˇ]ͮo=ɫ.ˍVu'.AogYҵ򱡌>d<8$Tx/%B,c`v8@j}I-A$h)}נ,NuhPkI+d]*si[az[cYaF11"<%&a%nX򪜓agYד4YHh}-zs keAؔRB!!jn)TJ>{[7&޺v=R^=jנ% R@ZmYp$$$aMD>v&;Ψ?T` rEˆx4ڛu|AђȸQ* f}Uiw]} Nƪ0YOL"ř+Jm#ko뻎>fψAeSà &'~z1/I1q-f8 MNfLLOcB K¨oX3=uC{I.~ ~MmZUBl-xRDi%>ڙ ǫd= ;[T8H7L}EaZPm2)lʠP[# ~y&3s k(+:џV={!^c x= '`Ŭ$<G 3G;1B$/9M܌/=E3OD8JzdQR^WN(Ų0m <@'|%v<׽ۦs8:tp\!_`xX A-.fڴw.^rO`tZi`'َͩҏ(z5VLs)d 'eyS`VINDYȧ,nbh FL5xugj@cFER%"G%'݅WW.Owy|2% pޝ+Cq'tk*ȤU*8:K".]{<T~s@"Qé$D M51^IVQYsVNH Ԅ;/ja! fc#='$mK^45 ʲh ]wۡJB}? {r=_#gP-(VD 6(W $(\[z`vT$o,f]"K%Cl I|C# ¤(&-FiCܪ)U)6:~̲[ _c;R / OxrdvӕSwtCmA#h3Dc8LC5Epg.:+֎E`vY0P]X fsQnbh 1 wwgX׽xvDb+~cZB:ub̟, ^>}&E.xv}t+%T M6dq=Ug9ap#MWaMEQ^v"X]+ݗ[:L&Z%U١DJaɘt2cOyQzdwZXoUDhR&I1OrA /d-"Q3Sۤp/;Z.W9&>y&:Gs9bYQoWR:a9 diI$H9 $e"!\|>&M !Ev 籸Ep`a@,4 [f_5_L̮@!3͝Iamh+}+aZDc#v8=GۅM_^^9\৹į؝Xs5{/u<" a!e-*&H=emFA|b3mA$4r1͕KD.P8]a]wckrWΘC+dX"ej#Kh}T3}0IEDWgQ<=:|_Ρ,"r 5{T&9qcPCs9Qt,g;~JLA6C+Keh>IE.m<@.}o4t@! f1/nު,^ J+z*-N]s,7Z(&EL8Iع솛l (1t^TwC.k$nKOv!I)Ǥ\4,@%tQp y/:fBA8͟2> :mR2k}JdT :)%Q~^үFk) Ii S[{6 owKЩpTI#*ٰKJ kdrmmd%wM(TxVw@{&Y#l9v b]nzm)mh1ӄ.cvX4q[riLjyq&⠾"ĂZhI0PK熅(z8Og TQx ؇~,AsSR)܋C觶w>lDNp)4n'w;K?&򥝦Fy2hk5vD6H6xMmK; MެlNEDżU.f0H 34@Hz EPzi 0{ʲ;5EoΥuĐ?ߜ*n力$~SB?ҊQm>K7lt;-`Ou '>y(ȨExSa^a w*VF.C3a#=o9>}ST@7ukI4Qٽ˨bMM^͈Yݗ̓B%B5[hsBggzJKb2=PX&' ]g@"=ChFShr hk]O׹6~]UXYɗbPҹ`rFDj ՠw& 6!DRb~Ե?V M@F"=~; 4T;ty]?Xhzf@2 oӫrYl)6<**PDpD}7ilyݹ=VۍdCba@ئ^LjkO Ra]D}Yh* zo܃࣌U甸j 7DL"U`igx8!<Ժ\|Y,v}wl4o"ՉP&Olb䣫dY&Ss̀4z$wGH6&yHF1bX רb^L}Mxu?]Ў7\A>ZLq9&lb` ٦hnc:W gs遵TȄ{vj{uCQs_ 3$gqtb15ZQی&̔C}/?gqP.as!Omt~JWF|9uoh4{̾zfRzp~zSY 52"j{Yʸv9K,FG=mp. Q.ݳX|Z0>'[BI1Z!C .K< wId):(|=YiC0\=lLjMaѝE N"<g?`mYkMђDCs#hY$C~>q,:њ-_3]1 1_韲&TP n(&ܐ}-{=x0+1,X#S*^xcjFό=<,cvYjjc}66нG?^z/j EΝ2}PZL3h(;)+oCc{BҘEqˆJlm S&[Ec]J1Dg\7G+I]@|)=H5vw~%:<|(%ڊhZ*^R>y)-нmңuJ+}v̫D!F{6Ux|2uC6X#';e:ڀaCOC2C+b~r-(v6nFibfTr)Ur%R jbF^W4,puT D4RO& BMaaU RW*$$CU("wxum{c4||+ >y? .)~4bV6,I; ڑlک>!<i^>xԤNe6 Θ3.Jmbcs 2)|DBq5B}xEƍ;y4X GZ;/%;ƿw{z&"lof8brWlcaթz͘P]sۀO٭ilK?20lt&k!EQ-=ENǯْ endstream endobj 89 0 obj << /Length1 1816 /Length2 10396 /Length3 0 /Length 11546 /Filter /FlateDecode >> stream xڍTj6LJ7C*=tKw4 1C %!! ݍ4Hw7!-]9=>k}ߚfw׾4Y-f (H*ki @.6 ^ cF99 H:LaO6)SO (8|@ "I e (3:$ le {J?|,ۃ)d 5`╰5 fjuzpì g+a=Z`PKd O'\  'Sr@7ll@`_M͡0 ` Te`0)7tlgjDrS:s6w;ٜv[di I=sF] d4voux, MX8kC. y(O&?6+ 8 Gܚwx-_οOx9@OM|t/gSWO#t0Y!?Aw Og$/ (eגQTb}Pw+/ w5S?EXB4j0; I ? ?}q? #&]_W?nS{?'ɺ }Z L@be2`wfn06k^1;0u~S@=핹ӻǿ\s:9zdxZD _ A#|P'`mإ `)9]_$4fvOEO*g)7rtyRS?VܧKCI<?'?SF*98*p =)jr:B'Ӯq?Eq? f3ΧOzK.NNO_ ;\(ئ&J܍u4dFVNm.( kNW Cݸ˛ү.jQB[c5&[&?Q`~p ElPvtV%quW4nn[}Wd5J;m@ }Y, 3+*;4~#B,3QW:gYϕ2-NNR:R} KI/Dy5L #+T芽Uvl3@.3e7z(O)JZ6G@sdafU. & +ෙkBuM Y~К|vS&'l#]!P>T`EFףObI=KIB?;׏i~&̮\nfR(].vmGi{cDY(le-y7WɆ;XI>IE-D4WTS:XSTQ2 F hmOӘ6#M;Grv/Q>QRCH^N8գ'J32lw`aj}"%cfQNt&2[ENW[CVn %.&5F'}!L:HVdB2Vⱥ;lFM+!$cAq+*fٟx|w<\`j=hV͚V:Mc Rg\yt;O +J[$_Q~ZH..\;nHႾ1e2.+F$p"L ln̏ɏ8pmŝ N{[MhxPIszEboc0xĜ[ɠOը4~Dzع7EQW0`T9CwZ-]HU j;Hd> u b508!\$E' xUO,,gX89=fuBʒG'O䃏߉ `הß^qۧKCYt:ZYn/&ɴV HѠ~i(O0~f1rNffr4)&fBA!\CU:%B Kt_&UH-¨[P[Ab8jH;қgKG}?n ?\f5ն0%ǨVXBX">S&%a" uKܹ{%P Yn[h"z @FqƱr&< k'-`.(϶BVC R #eHun/DAG,kP5o68pF<6&ZRhdV ~o WYaa`sz6c`#Pi5Ȗ2}޼-CL_Q9χW$ݍnmx Ϯuf(Mq |JAʇ;0ig(Iy~9E( ^ˆPHD`;'kHe{`pCX Jq 9kY@~tL,?_@?4y! *:&'C zD/Pؕ6,|nyG` ;T=cTzvo(U/'d9KPm #/A97՗ĠUنogKzw2J /(Uw*^fGDa{NK~ٜWJ R '& a%og53˟e5rd.F²K>p~*)򌿯)|{(DkF8үytGG'- yܝ V*mݺmɪ)ӈ^y}-A&2qזE&ֺ9OplQQu|ƀ ܳζ8`Ňa DvTo·;7[#>"Bjr|(x:upmrt f2'Z 7/ӭ%ZF@a`ϤG"v'\mb]I_"¦ ⰼ>ܢ?U6//]ة[= ̿ͷ/ SVY*} H?O67JUypKC-ƾM\/}MHQ6RJ6c_wmc{]m}'O2ɷ( DmK]@("/M,*'+N1x!k_Ukr/#ML&69Dٯ]&Mk-@*:_P8͋oӣ?fUgϚT| +Yv&??|Ǽ^Iһ*UJ-2N4$^38ݣ6pu"C'reH5z!t߇K-ڏɯ<->5=؀T!ZT>гDt͙L;cѭpՍv8z'^4uGB974u sMո dKbq{9>HL= ugǓ~}!sYi1No)QIl<@"*'aݸR4L$gJ+C,Iy3VICjR? ToJݩK!7JuWt+!S o vb_v)\W̭YˣouϊGxQ@6ut:n7*6C鿔r]WKT\y:F~eLg_E;mڵ~9["\Kd/tPōgzn|6 I Ckdf|HNoWzoͿNU$ 1yK|,5] : cWGjc?$3 ݋@U3x{Լ%lJ GJ))mb!kňU22F6&2cG #nqƉzIO`avJ1b0ukQ 'fqʀ##y5+tRDԂC$*:={9a}?g_%ѹѵ6~.Gᗏ-n<{QjHoV`L'Jۨ2X Ti_;jT9EjQzj2jmXډC0HDΡy"yNgpC3JxIG]Ȣ3b\Ru^'%p3%/ 8&=+aHV 1ZbSo~S4f@:!c\FE/9m "!Y&Ӭ<~;f Upb2u&Kd/Z@j1\~u=j*&͚.Dt,' JW3[ "n8:3hv)aZi2H拫mhKఽ(Eofqj̎=DdS(L (B9聆݇gt9'" snCFu+ ݯN^MxeZN>čxn~uda;MqĞe9J#K246tJItyHnwzj]])(f߭hQTB>PR]}\L9HQu+;ܰtz#,9V')1QQ\z r71GyAɘx9H!/j&7T *]~ga)d+Jb6xn<\L*9_-zJ|k 0JR- -jxO 䊏-֕xؗa0EïQn~>rbLk~%:-Apt)c3\.vU=\!X!5jsfo}*r}= I<(WTq!YCc7ʧb!>pZ! }i]ېpƭB i;^W0]yheAk` _J훶u BwH"CH G@xD .+u%ic?o_+v޺*8oPT% γ҆`x4P+A}y% :uvȁKJ%Pu]Y񚋠P_ӷXBnMK;p>=e,;g"Lxkȳ!QxK{4%N|D_&8Ӛ.?H; 2Bn0L~>59n4RR6  vcMP6>ݚzb O:VňዢXO?N6|& EHoTZԂ64=ZݭaNqd|8(>،:16Z6`)/)0Dc,A-]<*aP~cFI>G_]jz8 hBSUSQ,Qdlyա-gKNu .82FSAMM:&2`I3)i?"L1ruQ&|àꭋsgB\"XlҨ*Ή/&wV=Ֆ %oh64tc#-,:ַ&OtqK6TR5I<>/0#?{`}S޳_{KY-΃(^=iLuJ>4A߼.PԕԑRݎ_ä9xƷHpoKb}MŢgy9+o&b&6V9*+w6m_h5LqhVk<̽<҆$~ TY66@^h³ft>&$qL ˲@r}eCmrs7ibyE.\䨿8+t IV-R[kPIҒ "-tiDDZAKUd$OƟM0<\H呿)~WlZlAݝ{~k0YO5So}R754Ԯ he7RKό$,>Q)մV,\qtp 'ܻr{Bu<0YGlZ2X]L^Rѕ/in;}!ytMiߡa1gb8Tr:cx@6l4cW K/w F>,SCY%rl|%7:4L5j(cƙ;2IEfK<&V~_2 QeU'%m q#H$&q1ڞ2:Ll-李ȱיW~{/D {!7o߻Nc+'xoU09'ooc]Yo\ 'c>I.ZIEkWFiDUeRF:7zO眦oiS1 15Bo{V"uM,/-Q"/L%3iX=P|d)_}}iڠ$[â-2$??5!jd$1 nr`#4gqj X.3ПGeDP2DXݶ~cց@^98u$=R2__*$oۧGo^+]V `r` "5[%>![ ̡f7Ne.l5A%5Z }}+ya6ŸCz譻bi~*0.30km,BSUVx· {4XDo\_D}ZϭOm&س\Iɔ$b's|d~R(0)FN'<[$} Ӝ $<bi'_dˁ歜yVoV-y~"--:Z"pS X,+<7gڡ}5f p'Jٖ!YY߅duff9:փi1_.Tt3{=/}t4OX/NlDv:m!gD ^W4d J'z5LK"{E=֘')9~t{տS[D}hQ>r$@IG8fz<YFKI,[-|F1+F𦆃x]ON /%nq֊9B5k]„R?Nۥd'$E08!UlRUTI eE|o{l nq/N$3mU_ERƚo([)cր4%$? SötЏ]i+i:[e~<_Qfn ޡIِ7wE 9v+˞Éπ]#ͶIɏ01>%8BܑY};U+>iBZΎe0*gsU,*M)!joE/rVEBƨ~U4]<_7_;_Bъԕ{L6kmE3<w3aq_#p1=df`s0}M'._G6`́y][ d:r c5o > endobj 2 0 obj << /Type /ObjStm /N 82 /First 653 /Length 3458 /Filter /FlateDecode >> stream x[Is8WTb!LKqNҶXȢZ:9o$EҖcٞKb޾BY KІ24äaJf2XwL99,.1&!Lpw)&2LaHKR2Uib;Pإ1ъi̧a g,) !p8I#25 l&w0 3)> &2 AIK` XK `!($cfb 'JAPQ1m ~0!RSEìxI!sNT$PSlh(e%T K70 a@d@8ޒ B XC[@#R ;Z0ّ贷;| W@9PT%Jϟ3~i.{rI>şrXfu}^ͧY_OEV<]JDը&XNw`f*ddȆdvI83d6./p>n c2󢢤-BXfl2NaY$-,13.fnjM353|'٬,I8Y/#agp;>ǔQ\!"l< `:[30RL J tC٠Ãp\o狋lg%; F%,p{ $q}%K`2B6r *JA !J4QY#o=)-oR~ߓqY΋r~ [Gy1+?jX/yݢ㋧2KHH!xPpo>~bCF)Rl95TǑEhbH BY$GMU$Q^R5rir{OS›j^Z-Շ0Du01՘ ơ1*񠄩\7|tEv?;mERhQ Qf$It "ZLdQ]RlȾg/YVb9{Qq6.lDxQKZ0,ɥ(ݏzDl@!w:uEi* yFw=9fov%ZBHRB$kY!}] Kt{qF G+9ν2nۢ-C2udjbJ*SP_k6F,#S)#]b+ WMգV6hG^k1xk5.VfRkPb"Ռ ,@WH%w!ajﭰ+C;+ЋlB?j#g;V+).tP( Z ϿPϢV$U"%ԙWn1,3Z:{)<\H !iuWAt=-\-M鹺 z mŒ_3Xo.^Hxu~dp' 5*_KK$;S#o$ G)읊Zݶakuֵ @+.d֕q t>_5'BQiT_QRV;RM;mZ#-p7M+(u ]g^VC@AVl-4L6@Ў4L?ABk3i ؐ1E8_ǒjls7Gjwס0\]ي贵і(`'e_X)+} lX ZАH[nVy/[V~s-bO`yI E_ъ}Ae6њ'*L~9NF[iƀ̮/ڄႾ<|G󧁋 ٧6wHJL%0qzP[b-x˶XD;A,F,EbU#"6/|'r|`2w|sN糌<[L^p-K'ƿwT6QOLJuq4!V y%C~Uo'+WWà>(8An9@64RтxUc4L0\}O;FH617'6 }u|;2oG$Y&U':322m&?~ ɭ2)822!>BLЊidorbqםnl rg\]J'h$5iHFӛO :U҈$>U*ڵ"{'9;2n_#OV HT LKB!:c#rZѮG>Ba1L"Iq>}-bQ3/&t:\HʗnI!fE<[ʡn+@1 [T]cB0fWe`[g|nd|]o5Tv:-yZٰe4NK:-'w⶝Ǿ_`k{r"N=so(JYpX=j3O.qAAۇ>qttsnG\2^=mѡ-V活W֮E:iQS6I]63ey;L[{kzg=_{į9؛% ޫ=\MVx͉j@l:ߐSHAF`rQ4GC1De9ŋYQQf0m5zDfiuQuDt!8;Q=.?Y[tºʼnisLtY踉äaF~_۩COvѳr(qsJ)rGR=s~gUr#ip~8=𬯐>|[TY uIst(-4Q/t%}Zx . m^ I igN3l-S*X("Aճ'/вN1lΈF endstream endobj 99 0 obj << /Type /XRef /Index [0 100] /Size 100 /W [1 3 1] /Root 97 0 R /Info 98 0 R /ID [<6C4AE0A2C454C640D1462B19520A2378> <6C4AE0A2C454C640D1462B19520A2378>] /Length 243 /Filter /FlateDecode >> stream x%2Q!B/f! 31-l\V>\PVlStW13 fȨ$ @ Π bSh8dZڠ'/.؁m؅ C7t@TjpG0iq%}aF`` '˔$a",’,˲ʧ׊({ZxI[ ^]kCz|ڔ^^e-8\%\5(>_{ endstream endobj startxref 144663 %%EOF Rdpack/inst/doc/Inserting_bibtex_references.pdf0000644000176200001440000063404213574751103021412 0ustar liggesusers%PDF-1.5 % 55 0 obj << /Length 2875 /Filter /FlateDecode >> stream xڵY[۸~_!֌HQ<5btQlcĶAs#EٚɴhL$|$ZFIE"ϗӋgomBhr SL<__x;jY͂5Nxe9?kګT=-qy $7#pV- >֪2l"SiVDkTSϸC-W;ϗ8W`q7Ӌ?.4(t*(e4m.>Ds%JTZQn"[jUV>^Ky ,*U&G p]Yҹf_|r^fޖF]4ʖwpeJp,eò`mZ,aSZsgwt0Yic=[$ ?IujG'HEsk|3

<Op0_(mzUq&%S:^D& Ow4>8ɎJj=AIDT%p¶28[ܱLvVVŵ;iH: &*8 ȭ`D9F:ٳ0]G ,}H0kD°H7<*2*J_xtCZ&Za޿;t*2$d(j\mrD7x`A4k?Ej*k{OoeYLrm"U ɘPg:gXb. E281cc pW'?g+ 4{=Sm #P"qf@ROGbJmNt*Cd3AC9ؐWFxAHkRH6<jkFD[N]ٴ^+y 9!gS-nb1v#_;^n0Y總g*\"^]hSsq Un'ikqMd$i]A.ÈH!Ap6ecg 3H ?k\ @pa9P:l!]spݚpi7-/MaCbF р`M B &ѻ*z}"Py1KΣkCYK&ߺE<_LuW70#~?H%*Te_0 Ɍnh/0Neߧw Ph{/T`.A2N(60vCtHIk*+yލX{XmL lЏ9m})4[9]8pyӆ8JjN5F9/8_|4=|ݝ5gXOxHKWY:$¾KAJi,EP@‘Dp> stream xZYo~X(ZvsHaVRov==L{Ꞟ!E*"zbG;諗hUڌGPEFeTYԣ臱=_,1^P4،7-s 88kl8VYN`tƯܬmulps{Ac-Qڦ;]PvHjif'qT@-g]!)Wg^5.7.Wǡ7DC*-jNj2C10;ƞ\/|~ .[!?{^9mD$ɦ69̉Rό"&>:k[$yA8!77t)ݠV[ۯuԐ( N"h.+ɕ8F+2c2@$FCi=V+ccȹ}2!;5Q+$:PʲK5cXHݯ'F',ILїd&gίA@6_ˢP2Sr0TRnm̃ .ݞegu%ߴS)ZSv-|VTۄYƓ^=$d Hix 7yC2}ٸ!NʣZ4uP&B* gW,KjyK!izhOrH2x0Jxr8wND~lQZUv/b 1$)ӻ\)5]9IhUZi[g^.OڹѰQC3jU'^nmM _{M,J2>@V됁%yS;la>:* ;@"4[nOր UCܧYX?"zָ[vxǣ<ͺ\^ †="zf=ܭJAU15/q|mO[ᣐE w"!-l*qU |4L;A+3/a<ŇmɊ{ISz0ZT%P&l H`cJn_ +\ەECj sO`J(e (!0 f-N93yl00g#T;): SJUZvLiGNա'k!zhC)VhjxK;l3na]d7\zeꪯN6zȬ0g)LY,]\0逼2d ٺ5/F? •jtC=# E|ѿ0gkV`:cr}S床(kDk&GJIV=c3>p8O>h@Qh'}>J.e :iU d ]|ٱ<ːál)zla,ye Ҷz vj =Q$ᴕ_d6cT-N?C̳K͢ARuTf#)g%xP?VI!ovT qaOi˂0kz@ICKo4NpvY+lw@W>3=UR}X_Ze7Ʒ)}  xf5'h2}; R~.LX6+˸#c!}#4Yn>"X7Y2 BQ*F!ay@V姉+ƊIN=Ab#̘π>sf+a\S=dXT(YT"A&;<=r|UM7/nrc >dEu=nb6ґ,8_&"GB'Wt6x*> @Y>a.,yۢVmxCe9w~>gN n[+S%"~(8΂-$s\1+mV^^ ժH\c1 ^oR"|Q\wPQo''SdFp%("V&?<{'C-V 0| jT݃1:3a(, &)RuQx.뙀eJkeKZ*UjF{H*>:/dyr.N:jkXjbE!ә~Vf}J">! $e떰r|oS17R&f\/񷫼>H2ٮ& 6ɫfx{:OafYqQ03/ V endstream endobj 92 0 obj << /Length 2746 /Filter /FlateDecode >> stream xZY~_A($;\6yI!l%Yo,#rZ {fsYk@M}UUU"/^^\]gY⨌K΃d΂JƼSQH[&vJu΋,gܦsZHD$+y#a>ˊrPY ǤVhM , r-Ma ѓAλ3RS#L0V:JMyV`UM Şm汛jiX-@Iϰ4t_ۆޢrgQ'}= 8d#BLTkj +lh~IwmUVm#R{K̒[n郳l)PT̪`5Ud$^^p@V ө-ȖF*Iy4ZfMv߭9f+?A3k3 ~0HqY rԼԢpr9dQxoA󰭇]ؙ5)A`l,_obe+wvDt1F88vyɨya$,9׭;י8PLB_ V o`A5ϭ lAP5gP;42 { 2{̱Xbcw#v<.o[?X q#=.9l8E:]jXŠsSWyO$C5ǁ0b.t00+.fJ~Y`Lf]=`w9.}܍Ҍ22IdL`ӽt d]"E]2e]g, ^ SmGVQBwÿ( ܼA.:LNUt.=pYZ_RzIH-TMF6|3W{64G&Vڱ#I8v%pw纕3!LV;V_ɕ"#"Xìg G]a3ҖBbPK G:wb 寉%;R*qliq|F-scFNI&r`f^g ^"H%!lҙH'A*T [q9X,֐!.9|xvjUAwܷٺHD%e KH%zJX[ˊM:S6!ϓ'S«6ῑߝƐ·VB":–(SGN,/pʻiLdcG}%\S9\ #|^gn䳰"h sQz]7|E)]0nZW'>$eG3OI:w>qi9p>4R l49}gm.&?.9|)FGt*eB,c ]i#g:{>DIڕxz1$] E"\/1XU{AEsEgM LN1P!`L[;E,pa0ٔãʏZV7ApW7t6"_2#}^]mװdG2n/~P)( Y"tL?S# i:Pe)Yxl,u endstream endobj 104 0 obj << /Length 3577 /Filter /FlateDecode >> stream xڽZ[o~ oy)lAH.-ѶjQTH)^m~{uf(q[(Zggf;gngg]=UΒ8*]̲<+3+,*jv4\}UFqVz{̇~s{0{QoRJ.WUoXwxwS-li b9Wa#cQ\峅ɢ'M"n! n/2">`AAITeQ^$e%E&~̼Fl L{p->%^rolVHl&QlE47s{_r!Wyz3bD"`}EHoOF82g1I&NqT&.tURFroewwpl 4d%^[g_$dQiKo"H,5$7sN._~NIs ~ZzR^p,UD&S1NΧt$rS茟c r^|)7SeEhH,؜HHHO__%=Y8<)-v9ׄ?lj/9xkZb_ÁwGͮUk\.IModgb?1RZĶhn\I\8%/J$Z͚Y;F<@}+}3e牯-{k g i{ r8_9yg0`{Иݣ~*I(ОT;$qkKY9Yʹ=d+0,ǚwr42,״s"5ܦŚ V<5f3wĞ@#SrkwGh#gW.@gՆ9K$U`g^JY 3ilIDEZożX {Uͣ/8J4NE\.bKўYdhQ/Y5Rrx?ɑwjˊJ'#C+cUL ~GlڋppLn'DQ'v{0 c3pa)E`=w܉zlvL;E%DA!sz7tt2g0n*H vL tl%8#eXOMTL QF phռuބ?Ցw75A&a01M!ƈ$(G\Oa]+4=wb[:M[b@ƌy@ǖ,X 66Z\2_S1 ,3%}'ѧe'X4fCً&.FY$>]S{?g% FO+^E׺Ӡ摉֤W ܃:6e$lx`z`nL66EW$r1#h'rҐS C%U&JNSiaA ]a zatNQ{I22k*ƞ.U]1ΝAvE6MhV@^}4뫊4UKYtY9hd# tҲp~{*9x Ǡ2es }*,k]C=uL8417&,}5& Zz\"a[$R02Yz-{n=nL^zDE[Ű唒A; BΜbF|ZuZte>{eWZD+ۓ0QGp#wJ۩zW.\_8uhb6uRi:}RB׆^J$IBYʞz%u95bWqzgEV(:h K}xv x=EwWZڨ.Q`MceK{0\(MsYY ϦdenwV-2 #9L.S/ ؟Ust_nFs+PfB{=%ex>mGkϚNd$(d41VbNKCspEŴ(:Q. b{tG/('`"z bgh̓YdgG7o1`r% Kx̾( AD0__zN2ʬ-۳~g+=t }6ϾOx.>RQEi8o<+*-C$CˍhJkډNI~$7ǙM@׬NjH!7<-Q7}GUA[^2Wk]e&fjb_Rgue|ޱ#.QV`H}jrr9N&Ҥ {zlҥ^f-wf.2i_ [+ܢMDʚs lI@X5~Ƞi|QM4UjRSܝK.37i endstream endobj 118 0 obj << /Length 3229 /Filter /FlateDecode >> stream xZ[o~ b &r!l'MUb%"( 2$>#r\sqtч7W<ұ*RGU晲y͖ѯc=O4](MGoiozef_^/zZº4e$'l$B&i ќǣ9*eu.+h[lw]-[ny-yf ^s>]pPۑ7(Y S781jY )'3s9G1'zhU5v3v{e#% 2aKI`:?PFxO;OYˡ`qaFrZV6_T[l$)~l6}ЀK](M^0o;nX}dJ n::p$*5/zr& yg 4$H9%Kg}E`Ea nmo Q󱌺.ŤG#Ev@bV(QV+]$|g^sW"څ%Q%["_kc \9ծyG{ѦsbltvEC=`YAaw2CMyɖĹ!s3o?dA}\@[ +g#VhҖAj㐐[}$J[;zS$-Џ!q4#Mr*E9@?T>q;Pe,ETKV! nIع<+D\bdl}B$)2Ig=vC/ѐ`2Hh>r=hTz;35$g@vBe> E YNQNIOa&2ώ|A3VA&eixCb W <$Y>7/KE L3V2y&'~Ɩ_ &9zWe@-A(zyaehע^q7C>eCBւewRm=k~lٱ[ 0^r &zwKj6Bx>$+ֻz0Yu&&N% )$G%w:|nf0N*мAPD1 Du18O8*xSe@Ӊ1)-Ec0Ճql|~Iae, n_/*tݤ5ɬMw([ Za N̚ҿoL`TͭOl$΂nrگRڰz DHĉkkozvY>n,;X9ْ;R4A v-tN!ڹ+URrׇmPvpHP,ATcthA+T^dw귎cʶ_'ΏYƥprqX?ѧR/d-Uַ|S|AW{PL[Y#L}~mB?ʽ+~Y*6M=К#쑀3s=(_)*9@]]p| fo.eۢpvAZH}j!D^ZY""X蓸@>m˗giA%GAܗZrQ|HuPu:pUHC5s+<W"a{g:ثo$r~-Y}yw'N,WyF֨~&SJŁøZxG䠙sd=IBVR-ʪKο%39_~KWiW;R]tW\S`Rjn"Aӻzu,Cy}d)%%p\]@eL^֭gj0 %C>t<V7xBr|܅` m#A߻{'w%B Z5q͑hՠ UZ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 802 /Length 2350 /Filter /FlateDecode >> stream xY[o~ׯ8oI^8_tlmu TǎGcHM#i$_jq(sF$G&')2$- F,iH2aYZ0y$@Pp (DI&PtѐUXM)aP2JH{+oȁ5c΀ 01p>M8"V9 Xiql \4Bdi( |\ !N.@2IR "2b}Rq!%Q2g4JbzoA/Y>9T\/-lF:a[qrR,\fw9?CtBq{K5U#Q3iq!8NY3r(A#oe$ *t p2i@2̏5 6u<8^6z/՛L?ר3 UUNX.E*EiS\5MNj{aXHT6ɈA'ԜR!磧?DHfCP_V.P'pHd uPc@M Օnv{Bw v@z+5*k%J烨LQ>ɮ*/sc>M>*$ "/HP ]Qwջi3Bq޽zMK!bC(쇴`5B[.PnN B[|/6$=Ǹ!diEI-l؍w >'F٤2zOоt ynņx]}7nRz+ŽnHkX&"Y涥5aiwM[$_ Ր+Ad}3YEo}++uON%y-)a-4&PzV"*_W6 ~}6tHfk aYͮ޲} |2u \aXqX)nQqn'we~ly( L? ⌊wO3n1en' e >hh1l~=ׁr>PlM[H*/W(rVε=9-!p6H6 482R~E;I>HuxpWJuZ~?OUgi~>ԳH?V^Gjvkخ*Rb}ʺCŲv}~j8so%Q++mȭE5'@xy~OԌV3^"ve wcymGx^lAquUyŤWDY練(+QLY $!ͥr-; A1uFpl'$vX#VBR)R@wÅxi lе&Ylר=Vڲڵe=pCGyc$gX: Wkd^X&NYW(:[%1׆|&@[; 㒭[ZΔ~YLN=-(S}cOxolZk#*W0-ٹJ[F_dSVH?xt^Ɣc<}~9 U۔bՈWs)AJ?b̿տ2QsT3_ףެdfs_> stream xڍvTֶHHt343 HKw0 00! ] a H tw|}}k֚9{g9sְ0hpX# H7( x& @~ EfчD j s/a&Qp ppwzn)  O@vq{c]%)^.p7>ڿ\-!/oK ;^0BNqwqo5/kzA!ؓHXǐ jOQG>. w9In#Yg?٪z9Q"^{xY`LWZ,n]Ug_@:f\gwa||s/^__Oh|sz;F/4d%*#7-&Ѿ(Q-J<'v ؋ofP2SSТ ȮOGKLd E >%sM 2nfbOH \2`e e)UI,g.Ȣ_0$Xs6ҵl5s\( ~b%L3 h+ζDaCv!֐QVq[g)UЅ1u`tewN=^8`qg|lQ|7.:Xp~zVԧ~h<."7XO10.ͽq&%`F scV :Q/ ^1zoi<^ 0XJ΢-`ŝx:4͉x ӲE@}XwWBE0 u8qW-fPZc}N Z6BhĠ SM0aMle/J#R=#͈ [J>,ى yPܭ*.IBӶΨb`BY)$Gy*X!,m(iBc#سa}|wQ0 >g8h ߓlL?B4*ius 8>&LZ+S)rkQBZE2S+8cBOͣWG*19^o t1E_ii?YK0!kjCgË E+ȭ򍅝.gՇ=\IŤ=e[9>KL5)0UD2_x0Eҝjr'o}G߱+357lg{zD/Ɗ~E۱ML){NcDì`t5W\vEJ͓Y6eWiŠ.V-ux"'ěC\xBN>i}Ȑ V_o{^졂tZy>"h5 C")eg$@1j)[Dj:Y=u6!R!DXlKV-~gvY؎0\Q8x ˫>Ŕ\HZeWW+=PPΧKayC˅]*㣛{U ĔEzB-̟ t;W#Bim6> p_=B;19)V+Z2kyChK7kXW|z(8l>B[g?Y=-sTAMA瞘)tT3t/\ fϪeA{țZ*)wN$oP_\5qB-F5ؕ&`Ʒ^R ڣ"bGܻ$>SLT9Ku#X0>mPLEތչo.lK&cX λu&"z8N̆7z9H>^B#?O* Ob115װQўK\w]uIsx&ݤQ֬Qjӵ잦,*꾟ǵ ^mTsAױΪW8˓~* `X{wZ ~&(Sypvwr.zy|v?fͳs[DmdS:FGGFl !()8 !by~ :@I#Ƥ`قF$wT0mh9QC5&|Q(X$W;U;Y2lTgnkD峙l]Tϯ/CW2X5v!J^I-F a5^O0}j;"hUqg@M's fFr/)՝,%}*BL4N턜3Ht2&CwbMo\2|4S;Pe}KmN*TOiG@105vH1TMnLGDz g-Z[ݭX1ykASaDL&GBDxzG[U9Uh8Oh S ,zvc7?J HG75>1W0m ˙ yRe2g"j7<d/'Oj9s 6D|}'tk&J@wa˔#@μ{:ϫf(C EU9y#!+w,8Bak(iOP+ݞG^ͺj84~G1us* 3si}nMZ4BNͨyWu:X!DH0z¼p7A>Jݲ8̥uΨ:cu7u 薰?Y%i7 ]n@|OM#sơ)ILR=!@ ~k\VHv_p9p?VeѶ|ec/i(V~ &vS7P/Q?*:1EE:L"HǥP\8rG--0 ?;Ӂt֯+FW \)RAlG!W`cr7>@30&iڑ~j%4ϞOTȽ拑YҜ Sbj|Ј`40XsoYLB1˚\MCtggQ5dB)=BU[k ,VTbIy3oB|#"%HaA|>-ޛB j^@ҏ!kS; =$q{a\(֮zϖ -jvy2]K OU`6AO\Myꪥnڳ Z]٘t~0vCe<ƴ຋o%$5Y/JQvf~+{y6X5OL3-SRYD.#9i}mQoUX4eHu|d^vIxpYa!;qW,G&GoW3m)j]YӛD{ncIbd>eQ =v\\i0 P_=&Eh[/X؝-\Hoy-\,>]ppCDkfrW[W4qKh>8,ȼ g5М`sMOl?BK\cwi[qƌPE4G|) y(G=&M*.Dg$LZUbE\Q c[L[*lggLB)q9tIu.M=_Rd8#Z#WP7;ϓWfijN2?6e=(mzܼϰEpŊ/)n܏$7 $pYaN fϜxh@^"Fyr[fa~8n]C|" Mb5q]Hr$rCQGrRW*skpc0-mK(;^DjߪWR.U/%%M J?>5uP# z:sݟRٚji'ҍstke臽N]^JkaUf幕z34y} čXKSDAE}ƫD^#*? hM*oHr܇g$wR eg7ERm\fǵ7-0 qo)yUz-qC\+ɶ@}>p~tA|`y_-bUu)֓\KKiqvQ+ -_4+\N@l΍)h\PYeal.qW9 Q?%cφ rt{i½S?g;|TnD&d{+2աP endstream endobj 142 0 obj << /Length1 1456 /Length2 8518 /Length3 0 /Length 9499 /Filter /FlateDecode >> stream xڍPJ-h/b =x,xpk${?jvt9= 4lRV < ) Q6prsrrc00a z +$ ({aOD5@psr C@@w@ qb0@`[>,L.!!?)Gl ta ǧ-m%L00;ѕgfxa-+nt;@Cb BA'dvh+^9"E`}8.v;w"ӟ`%vX@W0O+dtp<݁`O@&ZB0WvW9~y:f9'+# >Y0dt^_d v݆3 $7Ʉo \ OK[x98~zq8AO?>@wu l XlNdY q>ɏ ɓ¬ N^bMC-Y/4`pq~GUr*)o 0= ̀ΥyR.osqZ>}q?Og +wspg^3{5,8/UJCק>͂ÿ*Yia/As;4 O |Oei|>i 4<%q?0 za<]p=NS9?5FRMo$7pX qq8p }?zzj*tJ6]_ {Ne<7Ak^Ϻj~)X 93(06*4gg_/.VN|wp;f{B۵̐ $[e91kbs"CzfTh5H!lbY]YP=qu :4P*JpvOϻOt;Y|Ib_lvߠp'TSV_Oji gpfhh*܋)H1vgQ|}gQC QYP'Q{74ηA5BGWJ] [+c> 釜oeK'ώyc1M3&F)%O Ct݊d 3L9 ˻ih 缃I3;0UQFj U3 n ̱<.;IS׏.Zt .ԛdC ųD|蕜rA]$Qit KI4M kwO c7 3M8Q$%P!`; Cy&!:7QCfv9J_Np;XT9oh&J:f%iyLD8avbcKorj?yC(fi8@:jN#(lA9D\ȣ|spϼl4cJ$!q3>DWizQ4ޛE`"[Z{k\TTTtoρZL$vt_h=Vڜ@7}M7,7'&1 X5q?U0(q$365ь \iw s s4i?zıX5=? ](WL՛e,Ϲf~iz 6ts棱bk/IDhw ]L4s8~B.>[yaϪ\ǒB2Я5>;{X+P߂fvd KU+n棭{QIux(Z3*SڦeJpǧ/GC9=WtknF~ CVJr,]>wng Q)i\k~Vl e̽ TԀbԥ*[ vNJ^X˲׌/9= xp51G-n=&?& X3NZ\sRw,ڰOcZ:7>֖QlB[vEml2a7`q}kY$Vuܼ6s8PƩ\jY2{iѺHr2m<~ śr47A2F#UN=2.t t:VvswKл^_~6"cɒEbg+nNKF2n¯vJ+aڃ `xmzeݐ0f ѦF M8{qN1Pn1f[ NɵoqthN g3e21cdH$%=FZb BrMXxU^4[z_•0ul:+8*,}+W]kS <5iD+keZ8 ^MVLxk[>7Q*A=k3S1k@o4e tUAC̸1t; I ҚO171ӣXy+\?31{3QEEXMXjt9Uٷk 4?cFD4~L;Csԧ (%jlWIˇw2|uԥn'P;A<7xTx=?; cBӭuExckߑiصL KBi I[.c0PvF/m[fo˭\P ب_h""iX"NEt0C%vWq*7겔0K.:υ==Iy?A5,=uf!ht3,sqYH 95휔m `m5wMTg=+773g.:,ij"}M:BRvPFUmu'O !k)U $82oOu}A%B6ɗ*F6/,D~^{AaM:HsO,9|TN42k6{76#.?ݛ垤>dOt[O2h!3-˫]dlDTdb 6WqP8`G LKzpU.s>S?ɼ6`},&IdRpݗ{:'ոyau +wu$켇,ӮKqgzMc(zTuCe(ժ2mc/K RxE{L-2-I[0V!R (P`tm.JP~w=52XT*d^%Nٻ(LQ͈#PE^;p]{'MD@a^qKKZf_.׳h?J+q&wkG߶ܾӝWu(~X8;lҩ0g&ˉES!b#نSuQqOU!blK|K<錘iŏk?4*Rś=4wS4`XF+͗Lk>/xE.j'zrs3$bLJ!uE1k\,f ::Q,O bJiMu5Zn鏒PS K_ky"̏ `/70_8#+b  5)ס 7xeܼxs]V'F76<+ p= T "]l4aRCC›?L"|8i[v4[qEo.f2z,]ow:B2N,sׅD?^^,PAzJm+z , [:|r/q|MSlnp)Ag|Sw14t ""ЩZ1Pe^wAV2#zCCt"Sb;aoJ@͆vVYM+LJN.; qU[e.:Hkۖ&"%jy&.@Ǜm}DCT)vT>,@lSCi^ZZ@9CAfDңd/%qoqyv?-M3E$y Zvs0 {'tG!;~VU<& ;FQƩue%Fgfsy.N& ZZFo(=:%S]~l;Vwa^y{uUv [8նOkQrzcFBE" 8PXHIzpHAEC$iԔạVi=u6ѶRdVX D5 ~ =ΰBѳ NuWUDUnQlq6frJ*4<<>=ÄSռys՝S\ZKJwQ"]Z:t%"0TJbH9-Y8` S,{Uޣ .Uz!(AB1.g60K-7^j? nCa;אh]MӪ6M~ѮW=:^5{5(z12h*&ɲA^ZU)d%Ji+bө1bU[a!ͲjC\/%0iʸ;ǃϹH Ml[DUt݂T棁O}+%>e܄}#ΣkL6[Xf"se䑩 g5>GJ>mǙXUWmŅJ&FxQk`9"u'EܖTԭ zM\zKa/\ soQ>Kg+%Z-*ãG? -]:n=Lh"ECYIJE~p!<7Пe{\8˪}fcffҐUuȦ0l0s]R7 -, j"tYʎI(vD1iPs*T#[QjQp=gyU)%!TeTɦ=Ӽ֐;fc"7yg[J2MSɊiw)+G%Dv\LY&ibp|`Jp.o0rس?[F1&YyL(>s\4 `sx2T˨ڦo8!Q$I 9YM :}1xopzn]oeE3B"N7z~z^j{^|F҉lK]%K %;&:3dJBA/nf^vq8_QiʉP68_8]'^ѓ*Uݻr5+ c220d^PZ٤:Ի56 `;ėuaM`^5Q:pEru7`$5ʈ~t\A@-Ě)Ҽ7|~Ϣ"d>%8x@ή%3$!PlQdPNwLhokZƜC4TJ yzY!nfJMym2zWېo%8eEY˳Ij4aoY.v&aElC 9R Vnkyy=w޺Mߕ[#Z0a"`jJʷIlEjh5>3Ja'c"jl!valjY2FUaU7l>†Kf.F5;v1e߮ "_dVJAH#P{LP%g]$wNQT;7?F,­w_؍4핎a^# VB4hLۍ?}!othFkئݿrPWsUS5~RϘ{ϝlGMcyIyߣ9^INQOq_rto|ݓ\Y$:`Euga 7ygLBPsu1^MHmã!z-Uiř^q~ nfWd|tTiMM,ytѫWsQ8؊-Pijh"[|iKBGD5Ds)+kd8('}F"m$)U8&HrϬ=h1Ofec80'mܫ@b|$a6͍2cIX6*7tH8%.1sŽr^BkZ$VŇ圣{.:Ck&fhdzt!I"?ٿ1cr ߵ !<*wg5+rr8pAq zB+OxӹQ0L{*5g$&T˽ϵj8;aSOB/}~m>qa tɾHO |yc ѠjtBnS6rTbEu^~OؚO2B0ѹc֟.Zg,z F:<*{'& LLE1-PiVo(>fF?Uu~ Ag.zeE'&)xFkH@$=F\nHRrLĀؒ=Iwt=xu]PYB}&TH.lUͷU_UV ;VxnE,DOsKMu5*>3VNG 7r? FUhw86y#n/X!Ѳ;(LvF[kd?AWIܣ)gLM=fA"mv;:vښcP~\oTCln!O [5rH@5_Vq\\w# kDjz#H~b:1<_h=>]FN=j k',D,%~?Eo4>dI ]~2)lHZv8 ~{d}ɮEu7:*fmi36.:+Ԑ㖕,Ա[#=Ё<>^H ;bjh- 7ZPĪN,396ӢSW#~=X<@ʶR#-<=`rt h'x|=>n,c>& hGKSoo we_H qE )w-1LjQb endstream endobj 144 0 obj << /Length1 2146 /Length2 15454 /Length3 0 /Length 16735 /Filter /FlateDecode >> stream xڍPҀ<]]n݃Kpn d{a^{ 9*1H΅ */`bbe`bb''WtGOrr.d\m̬ffN&&  xb@7KS<@ O.jdin?_T&fnnN¶ 'K@b}hڛX\<'#;֙\nbP9@Z(mAnfa/; xX]\LANUi9_r2p oY 41uyZڙ,m@E 9:/C? hi4~7t @BX|98Y:838[#_aޏYTd W}bN sdZٻy,LjՁQ$-ow9 9@&%PtdKރ 3 pqrzS 04q-Ddez?f_>av6bFYei5)_@ `ffp3|7u03psOn/5c)ؿO.@gؙL??.(+p[O/=`M5AZ]{vYddbbq\E);[虙}Lߟ[z_M)ngboזsNN@OxQbagx3))02ٻޛ;uFD"0!.08(X=z 3(c*!zj=zϠ3hu?3Cu&6_wh||/hff|G?]~ޗ?x{g81m~wAp]]@6 3JߟI ?d~b1n]ߋp{{{_&NN2' //؛XՅt<|wߛ%L^vt}BMt'2҇#Nu+B}ޖb245X~оϫF5d+x y+R>wI=Yh9%^KMɽ!dtg_5">SgRQ+~HΙ+X5 z"Ƨe8pGNHBpp+0"nf 4XY4Ҧvy܁i T`-Ҙ;W'ka =',xec[&|_iYmq߈ە!vNi{8EY|̰r^[\A/Ns tO.}餗:'"w`=ev"䅭 iLr7r< 4>HLvչzYZyL=NڕI<5#&X"Hey {oY*H_Cd`ۇIن)e$"2ᾚ!f9A--@t*~[9qUՃ B5JOkVXd,>[<2HR6}y;=xp횻>Zϩs[e-^ 1ƶfcgl9YCL&:cNsE6ա,)ObA31EV|km{v\Cduʼn!)M;恰\0s1Ngi"D7l"ǔgs!UYehݩZ.gpikoI.ڢчtb3nC_8²*tt=8B./: )#G\D>:)japuh~Pة9!?aX:m3-'jSNnt*Npm+ÐڂĔn3K?s'$?r[jQ zƇ)\uNg6%adw nGVKqߐF]"2H]\6o^*? l-AfW-Y%p L'{tIh֋fZ IAB45.P#2CƄ:qeuQq<Nv![%,sfcnfsKzVdx/dhl'dp9pFqclI`Fb3C woa>j7߬q%0Ѣ HgŴ3Aڛ*f$U?Ï4a_,/1e&,:df=iT}",%58܁[duan|^:rL G*wī4#r~g/?e>I _A#!z94/wp~Ew$ݲ1rDJZc^9:a&3orKf,(?7T s 5 N'+WDVh5k,6:Yu dgZWZ ]_-^e&rIXj20<Еnx/т Q4mH-̮$K ƓQ' ĹkH"G.^AzYЕ*NlLJXOX`Y vX+OోMN5JI$JzH&ˣY%}q(3WzH  fr(sZ$kĜeǔza?<vw5߰Tk&T+8o>_wXD_,m] ]M[!Q< h`A-Uऔj:o'ʚ2aVu`<n5"AnS|e2R].Ok+:8dFGW.3̞@< r.@F@nCWEDx| xn87%x lϒnA0F<<2 m ܱ|viMU7Cp][ \GdOݤ$ )~ykBKuԸ1jD%w|Fd !+|oI۵!_kN^HOhphՅ#~B xp^rw#??"aG0&mHvׯ􌌷v'cEQ9rvpDvTE@ b B%Ǖ)a'掰Rՙ@6U7_M3o}caΣ~YzLjY}x+ K[4ښwhގdW8:<ʧg>rdیFYǎqip>ֳXz[}^c,I_UO@-{&kWs,ך4@0uOI}iEDx f*Cwlj07h\<K0Nps$ +'x2ӃdRL1ks^-Fi&# ag]J=-k/ǝ~7\I⾘GQ.Y[8 l\[ vE`KNgX*dE=?-bSdf$"q{8خnғpU?$D9'5oC= +BE\#IL4;Di[#'MD=Enפ9/E C5ócZDZlR:?48GtL-#|@ 2܅M'+UlNv/"Pc,aE9)0w+9=`75-9FPp@8ut\l?>xroYurR%EH̅3j1o/oYV;ʴٱohҎS/Hלh3ӀnYZJt3CUMoƈ̣qzUߙߧ2^aM[ VJTf,ȨxTe~zX|4=2Fr-b(ݣJ_hN򥶌kF&ʪwHcq;!^n r:̻/Et6:Bߌ"p0D!s\ y?{DMvnmxNhYb&_ԕEfsל)06v{Z|_|FZ.qXHGy|Ʀ:8٤Y;]I]fUEfzn j 5o:a7P> siwJ k|wя[7Ej Muc-(qiqB䷜&i\s8a$+pK';yOaT oݐoN-? :gd<ҷ]= &\SvdA}Um"u{MN2~5DN5I:L(ƛȆpm 7,iz+GPA\GIva3.sΡ드󨩦$Gu'3qdQ3yz',T6;ITe4|-"L^?81y5 )wcc`◐>MF۔A4fs, Ql7}x( Z_T7ZX<-aj>W9vnGnyRj1u̚HEHȂPzxC}ጔŞB-gl)ok0")˸ ;hH"Q @ܤ沟r5`!l[~#>ׯiWX8oGv0׷˥xl8+s^<_H#!/XwUy&YzZʚev35n:x|8a]׌\!:Ù Bn+'sݳ8Aw37 &: ɘ(bߴZϿDd:ܓO/c^1xu,3c(fIB=Dm~ J2H<,Bk汶k(\ES}kad֘o|d&QAq'Ҕz~6 rdV22P׫p- c;-/t ]r A~])PdIX&w8]ZS?| 2jR Z`K-,سOAM5//cI?x\BFBھLk"[oH=3K0dג6k<,(XӠoRQv]tZd9񟾝]8qdlJbdI@A %}t?m({|; ͨ)m]e߲jz3Gev?̔W^zST6 SYB xI*泳L W!o*( X`$w[zòV6E$#WۉBvUl*yfLͶ_FK;!;}盲 ozWC:B8jP!, ;Gg T.YK/CJ )4tފGջ M%Ǝ֯C'}=~P'Iq@Tי`ܯukhA2sG]>+_*c'3ւ7tqH샙h};C4̰=;=}6T1݄4yK2Zn5e6h!U ^QNiTK^r^g%+FcqĤL6n_U8h jr#&Η6g6A{Iyv~dWH( TB!FEǠ[zpyy+BD߭2/`vYcI]j&sc('ܘB 2R gBN5W\gd2AnX~#<0Oq6N׹B-A ܓW&DGXmG=O oKϚ ptNymg%>?WN*XgL'~ ؝J]|ECJ <"&!H&՚Tl;ılcз~ZԂ}W[E/Hum)x7&\GuOp_Ȳ4%im$EZdt4}'/։0UzX0(dϳ+9>O*n o:yVac)i EzMA>7b.{][ Hχ(#/AΦQlYN92\&s^dm jsr UaZTͩ xgh2pAA+{ƞEQ_퉣 [jӽFpVmF'l9c< 2\r䗉7+^:mXumq7c)A嬻D^)˺ŏl`7Sg.)\22z5KR={φ q'8""RGm[kxUQ WG:E$ѐ}VW7+2asIg֔[E-nK{*,Q UKs(7tA%7roҘ!kΪgˎ{>E|"ez:@Y('EQqI$tRf(Stl6.x˥Be.ͺ^zuXhxkg<(/%{QT+雅Ҙ+dq>^/տc:qd &G"{ ϓA C-ۧԞIdq]P@i=@;X^( ZM[5k5d6]P 17fq~A Rʯ4}x\<R&?]~ӿ/<5]z&&|J%7 hQ @}BTfo+GR I YvߧgVӾOD+{+}E8B!ڏ~@L!\TuNÐq1 7-sFM` !=(c] ,2YU=},XÒ{[o!ɏVA62|%%Dfsr{+S mĮ.&'#Wlb*ENtrWR>ޠѯZO2}8N> %A9$Ⱥ8lܑWvuXgoߏ?Is"KZ1%0O qIA'А'x W;YZiyԃhkj͸͢m.TRu=Uz9}1#Z< \ݹF$zψ~"''yDYPgT]BW&+_zq[LDheFt{+nnlSO;'*t ɞ(fOHq7h6e0c)υM&a<GaYL{NHMN7q!seRweWE-KSC/#GU"rLM-mbu8])4Dfi]%l)p H@M_`5^gcy9j!̊Dl drL) s.&9|p ,)eeΗ@n]nhSW[<tvc~ʥhNz/r șd!ƪգ.ʎ_QuđcS~FbSK{i:ZL,ބIu0)4f!c$~9tqZemFE E$0۝wr+M\CGfA@w~n{m"ELRtDqӤs~ZmZæS@9ݏpڨ rgWJCZ|;TJ_`TDI)ڝo[n8PnQ 5]2Lg s W!$nsiD604,ˌÐ'[_[OPS\l34!FIZ k@W5ni}Ԣb{ӝz8s6O^ʀ'v^ة a&2KpsJիCYYt7)O1)ZH~SB~#E+`FL.|a '(ژv _$Vt)C+xrzr9oK{ԮD}FdAxM8ӮۂpŪ.>')W`,WkC^!=hO3Sx"f. sdcnfi?4S֚A}MLz lw*psX 9Sܐlʎl\Y+/%vX u׳лRlqmvGϵHdgѓH|tVEb]*Vܚc<y.&-_|8#c_iQg75>*.5uQ?ff1Şn}ﱦR`&azS yyXٍnEA7ԥy>/#u-c0({G펹.^J ;2I=>gcpY2t/>(S ^N R_h˜Q|,!hżvuiaZќk3*4 dpvY#(lp22( !tZYf$r͍1S.1˧ p4c~}xa8Cʪ+0Mn,!iPܾ n jsTɵ[Ocwc^s(OmrTDUD1[Qiy1@zN ¶n'ȘuX6dIN D{T¯81-Jԣ >snȜh; Dy3_8m_r5:H)x&@)XWrD$8FnTFf**)9 :I܌H_?B*aL 740DTGmlI t?oeHmRgĿ8Z X=waqPjP8e^>*7:T,PZ $jXHrxJy蘶dMLphUƄEfN;޿Y?CGfjO} }#cin<W&NzN$0'x O,͌P2 p#}\,A O ,q 9ICӸMyǯ/O%t$ }m*'D3$bݯ'ǰߴ`2n3#Hp5:s~1l{IL,j4qp R |ItUlM[OhDglHK5>e ۳׽0P~c5ٻ}.Ef\{A/yZm/WQwRKa<ě A\oyl5,m:6jwS2uΤ`2@oW/")BeB1I}~{en/6DL5.WrhS`q2Ƭ4bF AQD믙J$;4 ΐMPٸjJ/ /P= 絹8RA ?1P9VAsn17A=!_>ȵHQ׷+**3Ŧ\(/Z5%lnc ໄqI{{*ˈ4Dب"lܦE7a2>e7,,GLXШ| $:9k^$.Kc p!vʩ$+vGfR{*d4yU_{[,?'ه(zz~*<^M۰]U ) fc' )@e_+aLr?#'gI?\ ޣz`WMg[ks{#7oZ ϸ iIS͌_.VO4#oVrk{0utmy VIg&_?yvv⮺Գ,M' |uBdz75ݴSS% ٶfکڕ> |Xh'UH.c,iZ؉T򍀯W1g#~wo+YF%օAqG[f)n)Qx1xן#:925!Qܦ0su'ɏқeϽH}y{m^h>?yI=4Z||w7 #RRFf&84悩+F"igat(`s9O2p<5}rھ<~N;:j*5zt:.趎w;|f}ch1bLD,k]*+VQZ! 奲QDizìhb܅24gn^:PqCu٩LXRį&̩Z$j_Cb[ኊ\Ж5c'u)u 7'lMl'ͩTFJ@CtòlzxtƝ 'im%DB,+m{Fol*qÿsQdn;BI!NgŬ k uwnS`-Aa=ZƓ5')|D0FjpT0x{g\A5F+W\eA{ GYLp*ǞÒ0}?ns!؍CbN* DK<:Y#uOlHd0~=ē,t>ʉoK[9ӗ'@b% |J4ѹy Lyp^yݮ\^O+|wVxP`xK<х5W7煃斞Y4ն'6 npݧW1 +?K^i3WVsp ׵R媖c]ͣ"|ܝ1d/ u8>_dV{:*%yy_z:N`m%.r[i$8xEKYkK5?c}C;AgLuIK3IE(C"-pp82\A4VwD P@{ϫٷJ68́ Bi!yM BzvhC-k+kBVKzcφ>$m5%巣n3pA?MVQoM4Wi1+ߵJZ*k#:`+9l㡣r -KJ˪NEơ endstream endobj 146 0 obj << /Length1 2522 /Length2 21563 /Length3 0 /Length 22998 /Filter /FlateDecode >> stream xڌT 6&Ol۶=5lۚlNd۶=YkZu' !PƉ "`ddgdd%#S5w#%S:8pa 4pz8L,&vn&nFF3##:pD \̍ri[#,{yPQ8h: ̀ *F@'QP99q30X;:S\͝@G WykߕÒTؚ88+s#㻇1"% Pm,-K_D6q6023q71[ NnN m \ ̭ @\H `^?9999;[U"_4]189 O`bnclWv j6@)LEe@'### h1En/{ޞvv"&?.@3Oſ, `45.߇`{Lƿ~^ƶ6V3_5OJ4W_@`k8Mh`OJ٘M? @qP%o@%fdc4zqXoKw?uvz?93ߦVhllRN dcj6;͝ޖj] P }4K~ZF ~9)fcdk׉1  a߇Lh tml]yLl`(;A/߈ qo ` bE߈ 1$#o]7z.GޣF8ߣ+Fx*+A7z}iq[Fѻۻ}#aeKbm3߻ޓW@kcG?ދ6 )L)S]w?{Xfng]f|0?{W-#vff{wy?N_b~?p6V@-deGβgmJcw}'wuZߤ\hmLL<́齭{6Fetc=s~0g;kGۘ202c+[j;}.\{vGtwL@Cf>%|_}4]^5 juۛ%H\vhw~DJpJAZ\!| 4a4gq[3o7x5:$CJsjD@n|uI#ze^S5%DxV"ok 0ivTg><2@wr?8Q$/gD-f9|m;?iK(D ap)ôȨ :wƖu]^!߱9h劢.fؙ|qm"B.%G4O ~.b^ĝP6nmrUJwob8\;+L\5-Oh$nH80pLXV5Lx8jK#(K߷.GT »^CSUa"hD UǝgWR)Q2e~#Pe%т^*?A/7~5 3֣2WIڇ/_qqUTsI<6AzgwFwH=ʵX,e6Q~]__U.0/p͑t7 9Mii^d=Aƙ)MM< Nҩfz`LjL{OeUՅsޝTKnym3Q~ٕ7Mc.X 0oi,|w 32k2X?i1%Fd< D%a W)e(BzgՓ+إII7cn~:G@cˌ-3&VzIa:}g:NJ]_69Q!З'aD5:y}aͩ\d'jד k{~iHSzĊ¤`!=L.:!a>_Dqݚ9Sw~d}[?ulK{7z/Rf·9g␘LKI%Cw]+?AX6l*W%tdzUY\?(v)^ڤA؈CCGqz*/!wbRi\ x.&k oŶûeW8eB *00d_&4!-NIk1UŪGaI]8ZC@*ÚЪ96mιse&VAvLv~n >O|RC] v {] t5lwƸ Oc}T[4dgP4pVG׫66UD@];R-G3hh^:_Ăqγ66R@iNY@xlOoSX|QF^5)%C?ʊʴ;spi~T{U jPƵm^T4VsԵRcAbN)Kй*YsV⏔pK_ Ay6 _<ƕ#=oP$;vrKDËm+O*mO#ƴO)r-rhE:rR8h# ܦ]b1)ݴm\:,]&D+ԏ^>u}I 4&.[z5#B~1 ̵ACnY jGĉ=o eL }ϱ')订s ,Vx{< aR acxBdz a&n~^?4xV%А4QY-_?oIjϖ}gJH=5b*gn~wd? o0U↮Dbs<^±ɟPK<ڽʼ;eȢV8BOYX_YحV/{Q3M*y8jTk9b=oE~frcQr <OͤEcNRm0C˚xK6eIHzNl{;w!dm" ~`da DDTM`5tV6'Zu*ņRu4d>\1D@`S|mu ]m!ͭ6PQbg}U,d0R" '7fiJV)Sm'>v~_`7bʃID /Oׇ8 <R&$2hEy9[O MVcgx{Q.0L*jduT;U &ML< @4*=W< [Ш@)OxyLJO@r=ۂl0Y)D֬Tn/G݀ )Q2?C!OC4&FD _4%}F,?\fo`㰨Eh.Ҏ#zZ>}BeeΤerŊUyR% JZ0dzW#]qQ wGDPE< -?S<O{Gڠ\ݽmr-ˈ(")pRu7FRhDIr4' &;H]8E2A"Ɏ7(BК+m&5XeRU 3T ѪKrL4u~thBF!GVurWѐ E$S6,^V`.-RV/D{u97=#' b)|vpKf g;v9H֯aM{iغ}^u3qNhA;͹%;V)+ GSߝ7$ö.<%ɢN]@o YIcͲ,J LX6)߼P ZӣP􈶎-[?bqc~ԼY->mpfӓH_f*|Btb:9}&LIfߤԔˌTG\AIwYB文 2uîP1P&wޫM#|ћ[c(u@cZ4IsEo*X\2qA}2%Hw]M?oELzk@b-*22#"FUqmՌi=q~7ߟyUo w}a-.m@w!}I"p>sD8LǘXV^+N7ĉ}+Y Loa=~_7s=PǨFjOJ+SB;:i's}~~]1Y~Rzc@h뀮8byC`նAY0Ej0mצ?M vbijSy{Q?=7~{n2}cĬZ,6x=e/ HQ;xW7B5*iR\.A|)"?qɒKӯ8iɗ'Ob'EIHC?zWU8V4 *!-Vg?Ҕu6B$쑲Ԩj"!YŪM~c(:;H=}4V]9pD.񚿩Tb_ak?-A%NY(i-x5ws|^--D‡0TL^Ry ‰gdngI&bUp^tqxRa~*D%ߔ_R(2X yHY UƸK- OWɚcGr2`T5CSm|g@|3%΃D+O^Lj^]--u%97kK@TpI@ JS:c5wVMHvVfqFUZU0*]i:`WZ0-&1)_wppz m؆%W-6hLqt@p,OqAj HRpڄAkzO`\RĞK,j+λ&c7#Tb1ajTsܛ$͕kafPpmt͂q2;^JS`{+G>:n?y붢! 8>>؅ϵƍKkxWF'+X~^NLB]c.=2^0Wu?bb2`Sӕ>Uč!`eUlTuMX+>44w/Pm}WװDr!z`]4y"^MނrLd!c)\}0oX: (Kx + FʞbxPE`F#f̘9Ҕ"G7f%0]0\Nڐo( :dJ>f[;Gc'Uy$+ƅvA ? m6 <40LC7(< 3xsFCf `(.'5<gP(e+<nH'qutջ>נ<7ULL P-=N(W#*mFa(!%qa6z"ZӖPFͷ쓙YPnv&sbjb/Gz%C1 '{2MZmsZڑvO ϵik磚sJ@8uVJ~@FkVKo1cdDWx cx QBLtVUd'Z*"zB$FLV9LY9aDh^Jllg >p VA.P`Z$' q*|5v-M=Ce4eO uě7Iֻ#ULX_^SdQq)IHLn@;KlRexE~Ch-̫q>juyK9YLLtX #d|ԅOؽhL-oO}*r&ߟ-LAL<ؤc{x Nγ['T I~`s?]T,B&UO3ύD+'}'呲Dۼf/IjN(Q3)L}va`!؋,I[ȁ1 =@ F[n:׽%Qx@`uFKf6]ӎJ,ޔjQoYxJ9`+g!\kr9r55"c>.,ߡOzUO|v X 7~j4W2).2<Ȝ$F[uA1p`tJgNMI~id&kʃ#J*$C##"局/dJ9\?ona|'ɋ'U9 #qmOk=Ni#%5 _(q*!/AX V5C5Ef^"*Rݼ͌4Mv>|wG=)Yc&Oϭss76o-%,5u2rfTQMGylBTPLL֪QA k'*#U̦,ejm4w `Ry`Sd{R@ !e`lSHEd21"|MuV2҉&YJKogc״'~VxfbMlN]:h[&td B!*:;^yVg,=UKMt':f|7'd/n'iE g14LeNV({]^9x Z0}oL㱍}-=Ϭgk'dSN!NP?i>@QDxik"ݟ`>p-[&eB6Y=,3|ꈩg` :5vRW(hv&=Upc5UIrUtl C\eUjμLɑ 1Ynȝ|S0xI wUo{- I$қ?vfRM2jt$] 8D< G_^6}BWGi p3e48f!qHZjl(Ws)RWqRj2+hCI}?[J73*7 k:R3"/@sIcX>ש~%M$E zmў:rA.C8 Aڥ!Ej>f YuͫjXceJrl*ZyXT_M38)qn43#fM"TӅڻ)#'a{VC۠HYb:_뫥]$RXFx'9lUl6CJ[%AN;YV!uۈ_gH7ĉصY(s#hoJ^z_bo*\׶ {J!Y=]E4 Ŭ:Q0w%x9,[5LFò+A],c9GgVFw &W92bE G/|YZ+ͯ;[-]^0wM Uud ") yf"5yœckyFZ+ +nDFBx9Rd7xی4aezpƬcbSwK|I8">[תsA|>I35@ϟ%FS :Q9r9IlE4P`8,yBfzd+(UQsX L].;W Cn F9TNa"V!Lj*ɈB$݅UQ\O~d)7fUԔ~)yāX@"@8A cSY׸@[)2B*ߖ'!; ZJzCD P?~<GUCF6L-ik;zT'iyOŊ> [J*1ǖ/MijCv`P"pYHXFQl7\[#8MIySIX,q:& R8zY|N7beۇAMdoua m>>^ º+V9W_91 S9v'OPB?6DkTSX- t#7 8yV1X@Zr\ӘM5Xy&i,$ñ d DvN㲬j(劈0ܪm5(Yn\kU{Ǡ")HW˷_L]+x0-mi,Y؃"{dttBiA0r@x; xRY)dYwx oz| hiڕ_yф9$'R*DsI/20V܎śkOQI|\S-;#O!B% ,`0}v -f gCSr8M!u| Ke_I0^Kig.f>1z-|W/~<0N"sWKk4$/"ƁI%*m G͏R/h,o҈5)?*4g2I/}b\|VnANmy6_LR #mV.2 p9YCY={!3i O7>qƘwr"&AV "r]$Mg]e@l<.<<[b!Ǣq`AzAwy||m-J %zv6 \2;2_r/ 3_Su*!Ykbj Qcd|E#C':U!CH NGM |<X#7}q2 /Y1m2 ~e}+g!.x⒳ΕnåIΉ8܏C:|)|ƶ,yt+:ާ9|P:i&WϰcKN/"8Q/Ne;T;wm_B`LS>'8)V^j쾾YmIQٚ߿#O^l p : lSZ^zŻtϥϫ *ėw~A4(އGr1 l>MA"<|Usn'4r#JO+藺ѯn[kq>h]Ҧ1SE5<,N\<$6$_Qiyҁ &PXD|}cXD EXt~U hu¬Lr &(:pwȡpȦ,j޻mOF@@eZA8+}բ Xi;cNP2֛%5#ghhcS&M&O!~LK"`jy )BmQlر8hFH%0}ʩVluswZ^˦M4*We~̤]n+jI'rIN'Z "&)ƺQufvsCK| PM?ŔSIwv#Z 'UJ1]oz&d<CY-# gHvD_:LUU(I5,r_1EɎbk3eg{Xd PސYQ,]Tq!A+x8,s!tzeZ#;CC-|. DlCL)3-tfJiWѵCDB܈FݳBL+& 輤C?~}sjDfZr;֏SуiH&]l 6?3{N w =2Mfݫu7^[b->-$N?kOC^~1Gwc tvk&z  kYȥqW]f)m%!C +p!jY4UNH~X+ $q["#6EГvnHm4VyCʹ!$G|yH~sۿDZ힉AN!ꇫʥ9uiE˝mP17j*Cm~jnF,z)DAQ 36ɛԋQ; J8ȟ(n- {xn i^jү3g8?f$*|IncgaQZ„tZS곕0lkAJkBvdQoeV`N9$7sv{O5;fE) +\6i~og]b|+=4^;/{x"˿ckovg%ƒ֛ &AJ#/Jn0"}$o{%A{ ~3 /2[~%5{pi\a~W(^,iBJ:bVW4OcdomrLRڍ`]uL;*|M-XFE>1̗jBd\4iBK=}n{FG$p )c[+Zu G$;SNC{Yd |.F޹xb'v7L,OOzi#}>|ō0>vuo7gwB4X#}^! wƔFf/+Dnt\.oRUDX|>mCQNaQ rToS7J33=fqiq8( =# LdbuW3 = Z 83H! (iuW(BGbs/Q{?SvXZ s`F͉:/_bbS3Ru'?RJp ?[W;<='磄"[aX36nFV~r7XsڣX̙5cdӗR0FsZ9JA)zGK6NBfntw@!-a4@AzXY,T6{Gl*9j U6b} ". 113@}$v>&Q%?킠\M/@?qa F2b]QvT0Re_f_€wggxCҴׁI3;;jT;xL)B 0dѦx҃.3jUL)d_0_@xTYM‹t8Fb"Tzdfa]&UY*SAO"gni14ߗQofV ѲwnD֗Y?;yP@08s B'm\YHu<~-ƨ̳#cI?i L1nf"S}i~dHheL^1bp C;'m'"Tnʑ%6Ҕ i#,<Zd}]p"q;h\"$Xצ\e$O![Zq[խVC;UW/DKw!II@kk RO JeSEd嬳$1GWUDM/?κy:I tJb󐯺WGQq;H!C[񧿩5`GY8^@e0;IG'@’,%e5^NyTXIP&iWȝI'y}Ę9,ـZf]=`v!rJuBY&w8K#Hɒr Tp9fRnHZT8q嬸!,x5by_k%%]rE #`[+|~ɇ<+kj&jlo mHQgEirV r;B_.p_}2M WTbxqWko>o% #=V7$WΏs1%JH.SjpdY{32O-ML TD_;$uܱO7I#] w|<>mVG A@deg6nkOժ46ȷ{V-]WotL '{2G$Wx0܊#NQ'@ofʶ9 .W̔aNe>BxŹu RVL` z֬~%f#E?cwF7r/]J[ee2ZR8SeH%Y Џ^ ׻_QS+ ͘y[Fzt@M9Rw}o裸;^+F_E;aG[!*S*f&2zOm+CU-cc%'DJDhGdx(Ea'^c6M ǧ3A{Ov-2۴kM>Y H0pl$U,ͤ?ɽ13py K/jS pWǫfەQqNj`-oǻ&lyvħUs-(-{| R_/s uK"\QgΙ~aA0#2N 9}p M@6xg- k ԸŞX82ƹ͞s={Vփ*iz㎫ dM0;Ҝ1j{gT \cSYz,7k }@)mP~Nzew/~?ZBv0?;%jS7O0/lM ?P@".5n|n2k4>v"yPz;118;cm֗Ғʠ pNXܝry3];>+G#ZWO4[$BRU%:oJS_Y[e(`rg=QX!_7f,֢>XȺ*4Fd[ϒV|ۋh7txqvVKTv,0dzS}Ly)}'ZvADx^D2;~sC0=A`Wr 5;,*i|ONO0ryrubb! Fw=Dsu;m|l+v+ kqQc&p@'cTAieQr_ޥs:8,omOU:UEkÛ]fŋ徰? *M!8#/ي5|Rh!x I{{xkm'!?L̬?6Uy{<ȋ*g-9Z37'R^sW~<]EDSҽv]OhrZfNY%'_xNu|o69҆E6 Ԑ9U v!.!a0ʛ+EvmUG'a!؉I@>ۡUѫiڻ(Cf^MLMɱejwZ` vvɌ|uyf3'o$q,iH6sX0*exTz.s.oq^~er$äX:4-``v2* ׊IMþs/M&xN  Wn \]HHi+eV0Ё7#W2_)T3B q%v!ͽˡhnQ?$PC-4g$[ҤF[#%$x]7](\Vf8$c_ 3X02etKrPWv9 hy*Y[9|y[(702 C9AUX/|z,,co▼r4+?>l/Goy̅S:e[A+n85:}k"C^W1z9^`KNGg{S!`UHh|90e&F0uS-4|KŖD38ImvDَsjXY8}n9j}=VGhz]4OJ{޶z+f&pe@1KВu5HA wXU7\k lڎO1lBߣo-fpMhBXԮMBGA%"k"j 7S i";UUu{g7Sb,i~UWBzXnXО\އ;Z׉T EeC޼0>Y->;[kJ<vp[QY%jro'ԿWDmh[!酛Җ8JЌo MۀKNfTȴI/ab6麒IђJA/7i nEek>(Ys8L ]]A r|_~IkUrSukJkbn*Qɦ}#Gbb32b!y#=ԂDˎT=LR2MɏzG4J`3]sut[ζ.5LlZ{0ѕަ]8gI%5E#}ܐ>7Yy ;r~t_;ֶ0R}I\Qw@Z]<٬ڝxӨ\S>%v'UZ:qzUfNgDy/lTgJ2B>E`Gћߓݟ}+J߸'72qv ) Egm("0>~ZS#2}){n%^Z!cQB! hrYn]'gn:nMVgDE^dl;"u삨hK7g뙋S5 DtsO$RjSWz޾ 1cw?Vw}B i0ќ<\BU<a0j  P"9hMϿ1 w'y>b]~eMm2c+cG/oO/D]紎 xM"XI?xFkN]TIhڠ#))o.k? ]/P`\$0x"S$/܌BZ0 `}fU{ dCD(`W/35F L6|h=+yFQLg=<0G9D7Aȡ64{lagGmQ|Xr`MN1c̕@'ݜ3r$ל}dY3Pd/<B3@3IY"qju [ScKʬ!|+&lLPduK[~3[QHR$7ᮗ+,4VXI()7~b-+.=BV+5E1y>%픔N`mͶkF6B12|.Ҵc*MBy<jxGxGLV.(8OOq55s7Ks8T"@ubV/y2mju Z#|'rphYnsz i^[Q"m:T 2Jnrs#{ a^غW tɿ@ -˃B)(佢v}m6yq@̩y01ㄧ)J#2qGi].GCEBpVavF9{G*208?e6ͷ+kYt(9UbY> 2׈$sک= ?-\~ʇwo<#kUTib/IwHjPL{ɈWl_wuiY/Ү70 tlY{O2؄fhqFovw\[~V endstream endobj 148 0 obj << /Length1 1494 /Length2 7343 /Length3 0 /Length 8349 /Filter /FlateDecode >> stream xڍTl7NtѱѭtIc6ABBi nIn>}glw Ȫg(`"( Hm DA a" rA&P; /jBc6(6pE`qi4c@Jm@ c|?+ A}`p= U/Flv mhO-w6U} s a(wAw ~A7YnpqQDS!t}~ 9vJp2<Y!0( $$P7(++ FpأK"?wO( AP[ NOt4 #'yAh_Ohn!>V)*"~ K$ЇGѳ_ = 'Yt_k1x@3  1o?v![Kڸ}ңBs_B6Z z7 P?TZ0gpzP`t譂8 w4*pv lH"ђ^C;o./`@'IOIh"I7  ߀@_2n!w'E#h6-B(G$|@h [W$߿.? Bg u F&k<~?H3xjBW2ސ/~Q>o?-M*`|hnwdG{&;FMB[14nzT^Լ_\9^+E|U9!`oR>,͟gC 0RzM~,aL# M)3[N]2vf`0g>0駸I7t!k't&9r'pT^Z#.~M=ե5O4pQs[X֝_7v,рS5YƺnK}gx7wP>Z+a†bEVP7ɔ;=T[CJ@Y1^ZG3..V{zw 򏂒!ub5ؐ@'yyKX Ij&;U9K-dxHu@ MdI!sg^L"kcpA+o.e֯R*pzuXhO{>=ڒ>\i ΝKtHۦ2IrpL7k鷉ȦS޻7ݐzh|p>#$'.f1(;+QukB^"Z>Z FF7-Ùi1nF5xe Ṟ̌pëԢV_۰PEA y$8pwv@m\4,(D^Jvl+]M2 48͉I}4զ&]RlCq~֢~{s" ogK;*o@^- Żk;=rv<8L1Y rb:YNd/Qߩ zc9X툓 H~ 1e^K-xҍz1cuS?G2#;0iT-՞˔d_K4rncUϗi7MrMD&}wh n{+e_ƭ.Ŵ infF\3oMg7f~j%t~'b?dBQ8Z@ <=[+*/r:-^?eUo)-_Ks~ا&Z4JP.|O=nsdJ-ڷ119ŝXyPq0k{W+m:KNd2~4v,l\?{' < ]mO=4p1p u?X8̩7i~G^%/D쇪eXO&;:|1!@ΟzuRn㥈. 1)Fu v'g/xޡV珧H8/ޘƧ x__O|]+} DzB/e%؛QpcGHKH'Tkbqr_9`}FtI%Gy{k5)uPe3XbmCۢo*豜?pgW| aN,ɀ}.HoM=r(] QKOOOIΒ5`IಇW Ay֟)Ȟ=tl{U4,1_֛11V+rtw YzO^?6Bg[7.BNƍ/2a$XkM?Lb`^0ͯ8S\m;z-Tnsyl}V}9E1҅<Ȳ4xRiaϦXITN5oTF13R|K2-܉=[) лٞAexMC,Qɝk^׾;Ă,{oZݪxQ_VWP7@1у2;O*Yǫ5 8OWhnWt)\ޅ!Pd5{?ޗ7ٕ_ְB_4S|0i(n,Շt:'1x/th4y²um.o%XP~X\tO歝YQc?3LW0SV9=ƀXTir^|Ƕ;bZ]{Vw*μvIf&2 z$#8XnuA ^2$$jfwNnmZp8R}%) (wcT \{]ka%U14rh&ܵU;zKV5Wb GO[mEN˼$Ӄ|(fG>gÌ^M0W'd=Y:ʖtoGrqgB˿Ft=f,.x^-QfbAyaZS"U6G 瓱۝l¤ J;mڰ{x'D 1Uc#Mpv=G4ʦ~Oy`0yd4e3Mz+0y?7R&эN7#}@kj-m=WOfrf %0XYc?۟7ԖW1lu_~^gpzUtjjhޔ%Un( btL0NR:SkGB+]cEd1MJ o77&ޓ\% _ΛoUz5? |@:ݶyƔ-U#e$z`6)Zs laabNJJ|C-kov+`'mԴpXj轫*mn'ͼ./8a!u<>hT/rems+yb{U%| P.(F kjMbR(!H9fo9t|~;hrYiCBe+x`~s+[!Jmܟʄ| [R|ܪ7ð>bΆqGQ-~}fGXcHAN]L'ۖ]2X,q;BF^T+2^*_FU[:k"#끡E󦾑6*VGy1 ̢@̒Pifyjz->ǟLw&\ن2zԑP'i2]+^`(+( x'd"mBN-hyzj $E)F9M]? t1#ݢHsSrYbKol8'ɕ*M~?3B"E+^9pW;4oѨn/pka>uYKJ*JÓI{z9j})5ok<"dɹKի{~sc…Z*=^Cfu Oר`) )kf5[Wz%ЇaG r*]FDW;%~܊wZi"^͔vGixkИ8yKhϊ]U>4d/۪֒}U|hYvW6JSvj2YdT_ĉͽH7amV2m9UԱnV-{<ㄌwql wOͻ]eP`3~)b{G@/<(7d#ty:DY8ļ{bE[fzz!l]=QJ.:z%< !ƟMq)8⯊{=Z"X+|񶬟$a!%~QH:xMHN@| Y3*<[.hù׎i}8h\g^F!٫L2쎎Z2JKMš$^JI)l,>/4هmĘGJ)V;~m1LOJaǔBpBw$/5a}$ eEj[9+? f!c/KN|)J.ϧ|vuR[ :8:Jnq(4G'IGøSc9V vɾ-sI,[yxC6+ۄ?b8OVAg@Q1pN Xs#9}">ܥ*4ݗ]U\+Q+ab$̎$A&YKH#DI"4 VM ;#ʻ|7ˎ4ˌ1 "TT`ۇ^u#!er/_L2k!8)˻xebtƆ즪ĜxԌg/7)EH}fwؿCN )FpmS]\rO|S^jq7Ы@Ok^vY!*QiTW7W }T2 #>`&͟"(ٜJ^u_gd͹K4 }fG[o`#g+is/ ez F<#l! ۯ>MyVQ&{̖21;KkY&?c>XQ#Ջ㟛/|_(ًD:܄=CZ()b>әE<#$li{#FȽgw"L⦙GwnT)G ~C<|{QX+ɿJ4{M7 ؕrdtyhုB2iWYۙ܀_"`;WKmDqCiD`})zD#s'ERZ쨨Q M*Ry5(bJ7Jbk6RKjqs,C!v5pdvyau2`b Ns^(ԹS[E-Sd|M]SJzUmqL ,܎v9%&:NlaW5^&Er^e _"]ZYASlfPVOE<֣jBZX;b4mEf{#=ye.uCG 1~ztl-s!q%{ z&+0NGE IX]3P-oёfzrDM^nm}-(?Fy7t#1$z= 5V!a,Ad1C+@a *Lw[q#uQ;/ ^z / v=Hi8Sy  om`xgʒ.)!D mSoUr}&Hi TǛlȼRH~:-2Jj×{䔷vycLc̏jT6-:?jwkw1&ߟSx8b79<y;ç8S~cgV>%33Cx8b&[x 7֬;1n0?rP(UvOq&W([`UZw+c`o[q"`h(J /qi9ւ%ug6b_\kF+D?yS/77vP=4ɱ+^jk)e1'NmŨt?%\Z|QڋmqD-)HP"%u\DU` c5aF-; Go6m~ l~ɵrsbA.:FGEp+niˎKƨ/*2`/d*v;|G:9+؆"*a)uSy/K8_u$RhUi.!|CZǪܸ5Nꢢ]*?c'] Ұ.3# ȚwOd%߃q/Nʌ6c7]khUn5Q) Am*JSД-綶}gʺ'(?5$e3L]Z1w%:V%p%NdB! t"ec=7K*ؠ놟^}c:6|}85=JE|CkI1Э>erq=b1-`s"=lxBe#塧S]XXV怀s2w1B }F;o@$K8QU;!dRbprZb5 &Oӧq ̱g,+ޖV \'){n(L]JFK r*د.W䢳q!5>g4G>)jj@$+ wu(B}s&660AE,E#lgo8&݌soiy[PJ,+1TԪ_rP# !@g1cU1 sbn; |_bOl .v#e,?L]Qr<~hslenì> stream xڍPl6 ")H-H"!) ,,.ݢttHt7ҩt>37;{}:23hql@0(' }{Ǐ̬F@@8̆ w8;H3 B@aQ>>?ȿ aykO@ 8r0Ww#y˿6[vPDD;@4 䍶 BW6qGUˋswdx] .iS3@ փ#A$ۂp@ SQhe5 p{qZC}P=h) \koCkCm(]슀lN"8l]3Vg(  ]+R s!|||"@ u\GF s#KA?'p% `El@`(ο#a_2r`o)x@?'s$`PϿ WVNS^IOdea?Bn~A>O <wmkYWj,KJ C2`7l_gqc(o>-oGkG 5}k]5@v`ժ ; uD0\ #l_ mApG*[gG \Rj ]Bkwwk䈑 \C;xy0,/`s=O!Ao菄 W O`$߀0@@  /|AA@/>|H Gzm=ݑfK@ [9K2^[c[Sٹ<1٫2_$u~P`;^Tޜrc;ՂeLm-6 a3Zj*s3|< ^%ھő-*!G7eSܱ1f!3lf)1ܴXG3g9 8O LV.g};L(iNG&YdwުR|+)\qI%o]syni^`aeE#UYiVNt)fH:KΥׂ[;L֦ĶSR+u\*QO{Q?c¹zXVOF-Ky"-:杠ͫ=t^=hޅ +f%s`P 5vk2YcehjFv}DŽq 9"o)t7|:+b.(R$3G5c[Ğ/`)aĚ$w& حY*O^[szB!tUO7ph5j:Qu^ Aq8EKmV ahUx=C5Dްg3-b6ı<-6&"@hn7FE;~Tz65@#2ChhǁtYW<M犗b+ƯXܔFe\&9:+FlElN̴ L!Dct!y|פԃcu/Y/"KH 9u穃n]})h=\mZwۗEb7*jh:F¥f7KJkjWj7:РxڕzzFbL]=$ ,> MG5f>?|}`vjTh;\!ڈ[F:* ͠ea~z,1ˇ0װejdpOK{BN3v_*]fXMy\/]'o[SgO'rOva)e&d~']uY %==&-y${|ᄈkM4wӥ |n]:"Z$ |$#g<aZ5[9vugz%Č`a zڙ@ b,_X1=04qlr}Vunu51ȃв&]Q3D&JiL`\}[*3ņZ](c^p9C$Wl$g=QJ,q)WD] ;6g|&P1̂qHeF2.&cLj&j%x7GGNz љXNN.|C%*nK]g0Q}5R".lSYOe{\ZIQX#QL0͙jKKGv*6w4Chvmx`E+I-l @ INr8}_nxcsE'J]MPͩ{ Ȱh*Ƀ}J:jSAw7,#O'r^bQ쵃3^CoI etO'}\ιFf>x ?c+ш!Vȍ;!F@?q3{裊^~Ì b{F'᭧ < 1[q9K>ȳ&f>%H)~'GM΃5+B1qZf 8Cό2F9]YΜ6ϴ,Z ]=c_Y&ŤI_;fJxi9NLz-U%N>r'Ҡ+ZJOׅOl oq*}r#:-Fǭne#jNQgasaBE}ffFj>VL00ߋBY*W!As^G lv8gg6n |gI̬OF8δ:RطXT1 s,:陓|+Mp q,sŃ 5ߐ`WI=BhnzOPұ"F \H"vBf R.3Z1i: zw7OovWuK0 PD 2< 'MWLG+ar+7P :Q,%ô?N; @j'?K%X(}nxdc^f+.Zp>:! 9]~e>CoP*'sHT=~cP֧ gYu)Py_'8ȴ[W}vb:n!*^9{&QS#qJoROOk H5jr8)Etyo+l${ںBQ^_y5^U"Ygf{- imT  K(C'Ey_ԬWP^̕4vN74R>ufnWp;6i4?fNI"2#Z?D7x:;7W?k ۪#ӀE+.mRrHRQ~cwY 3̺o ne 6/0DŽw6lZ=edYϝEuL*rJCFs;^r!}S葞me2C>I~-3RiG8{ {B"7%aeRf)@'~RÚ\gIːGb*wm+]Ryis>58 K\}Es]8#ѷ$U֏z٨>h:x~@P['DPAuĞWU)cyn*@`&]ο9X 5keNӷz>9m//o-}k)0I#FB e?dtsWZE̒Iwf|ASoN@poȆݣ:G x:0뗭ysa&NnMhB'^`Ln;6oӷ$&_byd0ڗdLҚ.Hƚ*SzI8GBlŗ3'>Xv[ +8|y ZȚe<|qɨH?i"'ofH"lP9ѹ 湤]xJyBj4k Q˓ F:Az;;O9lCNM'gbkxt͓K!{~'s0,wĊ:VgzUb\L/~OvFbhۼModq\/@<Vrb*b oD oz*.R:.8uT$`moҩ-נ;-dVw]Zjb̼'*)KjцܯF!#_IPY<5C}GyI+N=}DVM`g3cBa?޹&h0_z y'ьz;gj^32b*S/{?)|]߷R;B,:̍ؼHtAdP3tTVHJn}*6*wO/0CIZfK)WGyK\CՎ\9O[8Vr}w;tQbĥ^qN`81]qwQ x]󢚠+d9~JeW "=SVk2aӳ9`YO5P*V7ͳKY\!(Kz;0h'EJl\yjV[CArzaO$  ؆z)`9TltL/ 3F_ qi &1>b'+R=K7v oFK>qřgiIvbHrߗ^9@֣ϗjV'>*Qq G a' BC862sy-C 94 w;U3GzM%>W=oKb<bNo3@`4@_#oeA.qCfӾ椔QE>_&2Cofj9BeDxCyExA-O$+1.|V&'ޤ|/ 'DjNIS֓?ѫRNTE(^5d"$:jH\{*7$z3jNGv:'Tn5\=AQ:Iz mNjE0gՌrS/5|OrJg{k-gsDK=)7.]YkHX-.#a4׌ !AwE>YU-[u:c$S2u9EoѬYhg+9b90U7)qڦnJ֍X6f]fe ®gÙ]>X'}uMq[>pVBJ,ʒ&//u''E.oQK$y c9Iå݅78sM0^SEH]aOC GW\l%+Z+(i} [Ш^1 KzN8ySOd}oΫ Pf iNjKF|N'"|s@;{:4Z|-&NP/ s\FoXensyG7m=F+ph*];;% ^)2rf_oy MꆚA%3,/~eqcnƽXѹ uN40ζ%djOKԗvTU;LG,wJq6u8+@K8X`/s2G7]_w% a]xjh𼼣-,ՊGO*$ ׫f-~i;+ul'y3KܠvK2Y`fsv zM!2h/畬§UG() ^!=)zu|{A֦!M-\bo4jZ Ce4_ztq&C( "V(JvW^Sc̗=%裪zQ(ZI.-a2?F;8cth.b׶#|nM:0q0Nq9.qԯ7w\yZG"*8~TΪj‡jy dcz钖 ?={YO9]8bH?ݯQ6z&IXb,(Dn^ cǧqy|!moOl e+Tu_M-w=qѳۏiZo8jsc٘ tfƘKT I"8 cM4^S$A~EF&_GiHaHP_ޗ,fҤ8e /~AtT9;*&OQu2,Tx/Ê 6@ouKrbF endstream endobj 152 0 obj << /Length1 2138 /Length2 15983 /Length3 0 /Length 17273 /Filter /FlateDecode >> stream xڌP\۶.;wwww 4.Bw'H=?>s*z}ÿ1ǘ$UQg5w0J9ػ22x,,L,,l W[࿤Z@g=?@w뻙=@`cca3@dPd9](AVY@cF `f jtM\vLlf ruucf`2sarpex\j@;]obL +˿&@dwywp7:seʎ@+ˀXXlbf`hbXle)&WOW_&.&& [w 7HL3ՅdC¼7Y\hW} g{׽>V{{=[-`ȬirrJ]Gf tppN_5+YxY߿|\L܁Wg7?XY 3W)d'h/~ O>Xl;z1pED5&'`eap?wп`+koW]}4^ ZRrxX πpa](HKњ؁lW7Wtxm ׺*Anv[+ji"E 4WYkT%klA@_ ޷pyǿUfm' '} ́O0N`yrqE q x/Y?,e({?={? T8AL { w _=g6d0[c^C^?{>?{mh~x?;w2v {~0;InT?w_Kh뿥E Q w{X;sο9]o?/5ǑN{G6w^hz)߂+? 4CXs0 i%`JL[|+<؅-Is#DsT+I(QmraaoXG/ZpUVz_E *gMl岶MGRy2ρIga%L\H0!ȂK1I jDĝτ08PBM6{&[m*d֗]W\71ȱSwPaO/0EuaOnI\&HW桘#x$l>sxtu'O+a6 'HSQ_4SZ1 a$<.'>WsC}Qg{vo^ o~S=6u_MmaN!δo&R7հ4mxu((M!!X!e b4T"]{ۣ;$~_|vD("1 z~ mS,{7IV~2qh dw\L)=8]BAgO40<1[!@2e|މld͎- ӹ}NA I% %O^(N!e[Fö=V?c#e~؅ː/ӡւB5_dxIr5sѱu3TH,EBta˽|y_{ϜUeg|SP3$\xP+Tz?)1HwTzǎO%bQR_Wvnz:pjFJ93QUO[$=6Y9 t?Ԥ^bLeѐjRkd5R%ˠ6 <*i[JKN;m.917"VP]ŷ697qCr\\<<]HZl%N 66ˋl{Rԝ#+Kc>S"oCP>%_O?m ev, aGvr5IӊYdFvX6 Nż (H)zW+>ŁzMn!rgZ %SqҴE*O;:.?w;;]B14 JOD#ZӶ&aeTW=7ڵB]zJo o֖YNV|4hʰ=S}uצeoǨ ZzS\J'_՝0*5I WOvqqޯAh^ 8KgmXyUy";xD?O~R&=qU k^qb Is+qhIO:@Cx/0v ia,tS(_CT6 R@QQJH(s܄3yBȿ1Ya[|諅_ !GSRn4oai~ .-CZ"f}gdO؇gVD~zÒ{]{w )̜ǢkS2pPeUb+%A &vc\7(MK7QUf |A3*.]&fv-hzn ?2OOMH^-MST ۜ dʚiv?rj?6S"l.k8'JϬT]ASAjTT̢3eK hZHXMVk/͡ y9׆ZMn<6u=jO7c02#YRoѷٵY&c21RGLfqnGL*ZP!֋TE6!߄0UX dZqsXnk9V;;, 8^@:Vi9TkgX'uζ.,j=bٙ gL;e*{!PCY}1B]jkY47A*׿#Rl_3@{өdFFeC l CɆNԧRU4%OVl!-|CN^l~whEGĿԕl"c'폞sZaMOCP-oJC\ԟ?H`~g&kXQ̠$,3ĔhgSiգ>a,7-! %&*ҷ&bq<ⴣzբvS,؝\8jH2T!yB# AnYԐEla]^A8ſj!#@ +Twys`{{^U#YZ6FEGpPf |YN;5@'P;N~C)J7{ů?^eEwȂq:Г(c<%11gbh{y:͘L%C!**H̎OHzN ~L F[MY=hhuI{dϾT :J/UQw 7P =i5+9/D\Yg {ǼT^u,J_6/X}bY90g貊Z h>:|vn4dT[3oɄ^k /2G[PMCچfdN ?[ˍglF.'yNZY&$}>4!pڞ+}*Y eԷ_螦Si4rq׵!V&fcp:ui4 `ܣaV S7+OtĘ%Ő|CLvډ&=NWG s$6r֪i>\\ʚl{>>r=bތJ1C!u&x̸U!N"#Vkakgu7rnJXWAMӞ{wDs=.J3bq5oEuҮ-li[tD1=~ݬ=Vz:y#} ^4\˺ou`s+]ORꥫg)\-D\!W0һ G~F*'v+Ie3l8'MRZojEtR2.(HzPp@{؄\ GiHzYiK$Z?}ME$T93@K]Qvo&;T ,18s6m~'M_Z,uW^vcWlǓd(*Z*Ո@-])ESw.^H/G=Bh➐ JʹSZ{k_n~+=U]GN {K/Pz<^GnؓsMte#K5<8Sh67~,Tp@ hB 8VNO(MH#U+&B0KaoeK%$&"P԰:]9,ئ5Fm]&ca5VK(HTIъ(DrҊ-3yJl"Sv,*GQ!)9 N>*[p_TGUsFŷg (MY18v)K٪D\({쟩DD17t]A!L)gvueNt\*1GX:گ& W;\+QYA?+9}Oi+|urԆ7|YS)6lj!hQm[2/9= rg9 Σ|-&hdR:-l_{D*X`4&AZo`5z'sGbD""V۔2kwk x]ʐ^C'DB$>?~5B 55L "*D@.M9sx0fa&.KElXz=)hyB{oi-Dn*b.P]h80Mڝ>k(GXC'Yb BPqOHY}Q^)lL ^9jشRv>vL/ ƅT4'#=lX0=G׬H tf܄왾.Ic˗ "Fg/Ō7jZ\ֱw߁UƞP23FvHB0ƻ:gݵ{O.27>?`)WC.yty()ߣ؀yEe~{ʟ䭐rf,Gg{>`6:/)P= ~W 5*ѠgcGz.iZ"IgUiIX:Gqg+"ݙU4(L8<>ĉv ۙߣ0Э|u!U9H g;B'a1WZ"P؝(j\wE֠BVX8~?u5L'cvz1Gc,]ǝGHg-X9ۮRݛ9Xg +!C? .%_ϯ8l`(dwoJ Fl%ixǬ ʤBo׸gڻ;%q㩵rw9$9?䙢*'^RP+qrзC7rCRG߮mCd~;iptJ-m9va1JlͤChK (NVl-4d*[eU"^up)9W& msG2ՙ,_ %\gXSm!Z]1J. e%ދ죪n Ja@P7-0„.d{[OYu _koYȁ^@CEa4'wΗE,z /%~urh^б:*ϟnT(?0};c+:W,B_Aȭ ۭQ  5 ti z EэA&m`4:+7xi۬#< nmF:mXUż'dAP 4pCF_"3ѥ"%tY 7~n6_Ҡ 6-7nkRS2@CǶ󭠿& :/&K!'#YתKPΗo)ADg΃شs%|g7+14Q.zt#190$#w2[M\-JMMCH L^&E8sGV:β".&)&/4nb=R˿)YTˀ6ۨuGc) %Huǟ63b\ :f%+d qϥTzK9J18mt4dqJگP[?Po$׊儙w/0Ip57-1\$H̨k:uQinVbIK-tQaޑ[ԘF~ww"kT2ۈ/& ϟi3a5Ƈ`+"|{Hj>)oiJ^Vpa?kot1XM?쏐L.!r *݃\ՠƝ4؋:aאT3z_uyQ,G#RY(q ~G"mvԿDc :NrQa2ϼ}f@'zB~C g%T;&㚛cIZKq]ۖY8h$m`-d,me|G S !CqR/bt{p6ujڕ#W 3!v{=[K8U\cUޫ?vV;,WN\dp` 9SĘ^{im4D1ygb1 dW-a a1]Az5rKə2ؤaKY΢j{wSRBǿd)&V͉u)IβYԈnIz ^ix8>s )0Y}p$vz>+DFuⓤno3rK7H+gu)|+@3v\N[#͆gW22bD1g3H槊!3Թ痃ju2n{4 -,h"j\W>Z46ɾH:WD#!:}ʓGuȤe Xh0딫CshJ<礷"xBm&l_ %DC%Gԇ ?J@?[A/G"5GEA>|1i~{X|N22/K@kk06":r9={>%Ț:pLAN}MזZ80s/R&2l2FUnBT!רrQ΂DV19xB:\# \HfyuWŦKٜ+d/]}b/ZXu}4 Ȯ,N!5*BvZM!qK1^$%$sAfP:zّUʇe06Nj?FzД$X%/Er\fUǛKYci=<"qzw\;+`F!P& įVx^Ĺ 1`~ͫ昕d> M0W`n}XG{2d&sj[xֳm@ f IN[l1p|H1>Ҝl?^J (HMdPE@}ă3.G~v!fquH{K`f9qo ̎77Kc0q0,V&L*;;;9n q ;]p"J}?<pST<Xn0ԝe7cߢMcdÔ@18D1n8 -q8"<"砢R#/o-%Ž~Yu-mjhk]hJ Y+X.ӊ r*iy.*j-ט.4ͳf(9kA׬rZ]NXA@PG0T+v",lFws/Dl+ OO 7\Ghi[~XY˖96Zy2>'~ \4 ?c( kvp;9(U nUx4'!M,"yx}(yfxu_et̫lqO2an6xd5Kh[R8`1Cn5\bln{@]j_]ك1o bNΩw gj+Ǒx6ʾbD珱aFΌF3aK|KHrP&oi,]s?nJߠ,\ j(A*^)H2G]E ̔̾ 'r^IՏ$lsIԺ:h䞸N@diZ<"-n<ԏo—q"7ySH36Ȭ}W"ŕ~ QFS|«`#A%lVHil*tM8~@?7ڨUPjo C*= 0>kcP@Z@<60;{"hd3,Mv;n]_PM͛Fy*qk)Ԉodѳ҆|CEvY>CvXrSUUN4ȕ{6&J@ |, χ xkK ]enq'~iq68_ms-GwUb);.8K%0xQnԨep iӜS|]cFjNk6Vu2"T0*yOVd6OXAe $6QR!HA6nߌvL"z5-`.6xz=:t mg<$|+&gɸ d wǺah,Y)/'My$/]s*7v(v=oņ6EߏҼ4z,;.gP3D>N`.*M#߮w$W8ZV#Qmz~`T{ 5?dvjX]3G4P`O~aqhkק14l4CXiMMyZb ]^Pbnipq^Z|d>V}u172yb [4ҳ!BEur@h'N_#% 0P <I9M"k"ƫ`*P76nBS;$ajbp '#rzP[.0ֆ>"*}8f,sgyP-/ӑKpotKܽLȕBh B *eCڮU4:ORQ"ЕciËIk钜7:g|yZDa:1zʪUfQ!- 5W$RD Bl`XEE\0-+VHzbQ&w J2{"!) gMM)j5\`K_z(c:^% ge0 A֊7=Ϥ| vJ [,s;:0B̛"V[{FYWɷ QYr Lerfl+ȑO?_`g"HB>sG1G/,#bw|"vHop|ts6 k!$Zk;(,U<2PKc-pSCpo,RlnQz|qWF_4Oh8qsI'Ǿ,iŽ+274~.ąj.~_j0< +ȼ:2 aV5eA't c G9-#ݣdS\9?+5Ԣ@Kmw크6=3|ӜӿVaG1 q:aE1fn}oLuL1sHՉ *oAX @&v2zB<(Bm6tHY1e &mrI8b>Up}.Mr(6z=g 1%FhggG!HepN֍O /^MF?bC$S)ǯ|Ĵ-2@~N!TO79 9=YK4ehQx=#'ISǪUtԯ j1 %e'h4@N=RgbrcPfbwbi5-ޣj: /Ԙbž"`YfӀ\<0.;t}?d:'1q+<YR+YR50pZaEllD\) rmf<<w/מyo”Y?޵`SsoZd؛ʍݛR5Lm%5 :c|ןjz%Px[HD)xnzQIjg| "{A?ʨ'!fAEObiX-`B&>Aa r?JD{Ҧ%j%z1sV4=E,ةρřO]ɉgS DV_LhP udzEH9,#Ӧvzå'鳭8fnX AH̸c(yYo:NX,M9V/y paRs*\pt[-=ѧN!DE" ^dH} ^ +5ud.f?UdXv;'}slJW GMt}n:zLzb]n; GW vŚ6w9NO5cqA~~NΧtb9>)iL}5bX7"R嘢)f/|"kq/H5~| x3=^IXv/2}!=aVLHa)@K_X8U %e4+ J|~ 8CђӪ8Z%{\(Ε 3xNUQUmƈo l AG%ĽzTk˺uЈ-J8B0Q)<$q'F, kx[58xΞ~3ԕ@%\ދ*J!cZcw,#sQp)AzF/ͲEHl?c%IGtxz[O+! )׌Uq\Ry=ћr IN49Kdg!`E5 _nN{;4CM%Irq[j9!~J]-:4Yh{cQ 0y:+%7;P }(z>3g %3łp%+$90 *S~M^tn/@ד & pQsVA[㝏Y_UO0T'"+E#4_ Y2[Dɼts4ʳЌ546׊`# ҆;kGcD4*XjpÀH0DO:8m]0B{[w 3Qu梓IJ읲9Qp{|P Uό&#` !|ᬹb~Zzy9 f-4Tddp['.D #Az(Bfnk愢Yt -.'iɒs|aQh Z ;#Ѱ5x;b0*Xh=a::侷y̪aeݭC)]}1·c[YtyxnMahJ 9F8+a 0 qDQ]"f'𠼤̴'f_= &'ц3RK|Ӗyhuqgbu?h l_"f endstream endobj 154 0 obj << /Length1 1749 /Length2 11634 /Length3 0 /Length 12738 /Filter /FlateDecode >> stream xڍP[-܃Cpwwwi[pww`݂ܙz[kn2be:A#k5ȁ @XVY L/9< a;ûLDPr02ٸٹL 2;dA@{x2akW;3S;3Ww1xIaF K9bzqq9i[RHNcbe0221<;uWdl sWNsw,9w!7V7g?_9ZZ׷2t❹[ k 5U@#3GJ:o t_Xً M"_r? T7120} -/wfZkLl};;}WQ#V;R]2 ޢ' q08Az?7||d@o 7|Ok?}Ay CoNBT=?໇ÿ<~]kq0 /?}ޢ@ ~yڐ;6Zϙnwi*V}Gi_O9?|Ikn/a[&ΆGj86(c_Sh2L{ҝZz #&!Y*,ZCqʻ s/0̈B5s&N RGXVJi̶R񎎐lo2Rzpd;=O1~7mcܙ;SWWg?PަdhQ~pRZ5ѻwdce-0%X!aoU5["~r\;h7Bx0#ciW1R5̬+LLV|7K_Dž@ ,f\.v u| &x GF2k- @J-kH BBel!6pcL%H=j88P݉HmV$ oOqn!֒~@Ϭ֠,os\:7Κ^=8J&.QgkTſFLNƻB=w2aiJ ؾ-e,3-6H6F\,3Y\LuQL{ƻqNY=M{a;-C BU`o g溾JӦC`wQO~uSpZOi+qy9N/cnMT6aW &xY$~pDaos9.@ 9Ǖr û3ga[~wcQ ~F'¨_9MR jٱDu7w9`:f^xb[{rtk$&ґ(mMB<|08f݃]z 0Hտ*WO[:Y<2/VeM:0TS"&u1 5i95EMwV+윍4Ɔņ~ht#TVbZeKgBFJ:]2PPCgP4i8^Gw>ٔ~hjtvԩ}@6D>ƼvxQd%iҫVpz ?Js{J!+""ik˺R޵v14cCt=LdsJɔ;d$ \ݻ[fc؃iF pwyBǸxџj*0v`9x- /ӵT/(PNa{` O|}W6ض]8e'1tm; Knmɥ~ qGY*ˠwx~!(hަ sb "&3{AeaborXt0NF`zGyy-IN+#k#+k΂3T7:$2%޶! Yhψ%J>jCX'RFnP3l@7tWkf㓉~y vÎ5Q&Ώl*&Vyx,a:61ŵ]͗{kBu_6щ5ff% v j¬wԳȕ~ޗ,`"Pbp-v7CnKBzMRIf3gxKԂHݡʑgt## rfܪ <4ބ N}Lwǎ醿, >[ Ίғ, +BM{9PH E$A6fx;91r3[NteGFhGeԶ-*:}8?1(N+la3b%I6j* 0Xd9L[zNZE^ |g3yI!Dy8eb\@fbSѥ0?>uJ S7 Njȯ+%}$G!LO:Mmx‡+ Q۝OĚd_Ic`>OHsSrpIqLU˫4˯^]mnPkKd!4y١!9& 1.o4h|[{wJ@Ryl3os^04y/CƝ•CO+r vd#*/7Y(Eaf/mVST>d; .٣`;5c#JoXb}/ ^5bCh$?%*b=zS[xr V9k$'Pwݗ;d->sVn˖Oa4R]l׵\!U6t"#2N鱐՘.3oxgmgčgBKROc$O,i2^`_[V衻]sub\k쀔Zv]QQ->dAR">u`FOmnLk]+s sp a_Q?G9" Nm@R2%]'Aqpk )jp䓩=7*{YF~ڜR3 n))\" | plJO^1N)>Ǭv]tpOYH8 Rqh!ӱo F)1R,r"*禉/N//&.y26yp{~dNj:TC} y!ߧdS1boz lT'XqK~SCk0iρӵOUO/{W&7lXVu"i]ombދV j?lފ1)A< |S ܱ|Y@*zBFۅv>it$C[0f_)NN: *"LP"Vw~K-b]<W,`g 2X̍GZc*t$Ji2+ rb Tq91Kq y,P-3qO+Iٳa.AT~Iun.>rNYj~r@s* IC{A.wU`r4whۛX De8[ɸnSC |(6:z$6M;tO"zTmJ7:Ib,^$gۥub\a=sLS0Mf6YbۑjOkT&efXZj H!Wy^W;KYrtaU K~J?-2.D,FC0ykJ!*.OUkol0V>.v8F>6] 0FPZ1)߂&_=ÏmDNh7Ck˹^ mh&PŠ5chKGp:Ӏ8:"QrT+Kbw)D\hQVR-)bpw7/k X x·2qk5yc5'gf?Vq۶^-"6chFu(ƅ)dqGۿX5s+tHvYڤ=xC݅p$dD0yg4TFm$ d;x[s>h6 f)Tbn4;=78{R. 9w+XSe0,X/lrPeloуoWy+;]>΃CR 0 E^z&s~@oWglkn'](eAsG2e~3W|ui`?3W ێ ؇0AJf0Z(7?40$Lb\zd[7sMrG/͖Sۺ(W\)C} WC]/3'Q:n>JoRl4M7gLP+y'FFms "&@24/=EԱ+qѲ4sGDw{!YEz0*O_vs,z&  &[ʴcy7CE!jmM,Ki=;6Q2)^}w RFІX0`D A4cSĊQgnPoOؼ.ʤvLUOFaP&jH,;Z{09DHe/ɛXA[ %p.83=:j&Uk6,4(_r_? hl洞NniQiw<->.~/pwjR#܄F\#}+ =E7W' s)`@qȸD=*,j+ٖ(#T/e4i.E {qxFh*AuJ(dcфת,ګ:D(tU"3lVO`?vN$ek^BχhKe⠱d*o6hzjfafI~ѡ6i)7@*ʏźJͮ&EZΦ>ڵRiAv؊_ eJС@h7~wzN{3^!WB[ĒMi^Hl2O;[>KmrU%D,{4`nUx¾АŎ>'iJ_G&oaWSf}`J#6dc2ӘQ_DD1 2>R2$PyCcs2LNQ1gnBybtn i4 S@ RgG6sc*XnYΜHeS'uN`&7}_2kpTU&*(诽큏sc#A̓O0wO1ЋW.\u5X7uk(p/q$=EZv v̈L3# nW G3& :>`t6 "a)L,I<)#=D*+y,v0J,2^yf󝦐Ǧ7RB.gp+1suW6VWxeҢ^rL:~)4XQ1Y8Yk85*qHh$rQ6X5݄7gzT=BT MeTl6=bEs= Zn^AOʿJHqoI:},Ӗ#&OLo >R,\*R= W0SC=AXa8)% zV%? ֭}С&Zj w|'Ic斔QXE5ٱvasMR1›$HL1jaX[##ȍKo0uL]M8ھ50<𧱱7)Ij#pW~ӬCK/ R^9[DyfY!ImOMv } 3δ@oǁHjF7b賴U 6ؕe1tMq̗LB сox&,CǷ@]LJ"-)U}eXVt p@ERڨ[̥S~M3_>MUP6?[f~TW'\RG>PYNYoZFEszءP@knzq?\%D5q`6E6}FJ2! S{iviOY"%`` ,X}J`ȩBܼӊ{¼fiG܄}xnݑ^7uͤikyeL o=uad8]Nw;5f gxPHWy9=:CupLۆf!&^yU;D; wW{UOcfg'($Wyj1]P,GՈ4ץ_&B]'˺m/89w>][)Sv'jD| iقrR[hhfeP􀊔o^^n4&¡P%tÖ#B`É zX%'t=m9 a#]Sư3YWRiF{mwԯ5"[K FAekZQ8p!e `)IkInL"QIH)Rļ&$؀L+txOt0߫iL 6}|=rFho x${a俰~Ƹf}{Xf8#FP8},ַa6mV@wa%q4%1 f^qYVzkoR^>qib*vxwt /ˉuLz1 ȧ6o4`yqSȁ-hE)]DpiZ<|_ 䛸IuK;qsDD@xaߘ JW3 y6O*uy.Z<(ɼ2R2-LWf}{DuͲ|=JmuYG24\(< w{VK0X& v$ ''pjx O?O0ynS0m'9A$sJD5kQ2U,VaU-.k9'WǂgDϘq* +c\8x2 `Mz %s3K}|}% Srsy%fjHlhdtzHv+gvFr1IX ]ԙPV1秥H9D%{S*v%9:~kkO]MS;*S)Ǵygae7ԍ"mwh Zm  (5ǻ-Ho&{(!뭶&Qv&-$m&‹nT 8CO YZ?j:Ϫ#F$0l.e:OqGeojx #(ܾ*SxtXAimR :En&W$_62_T'@3\$zXX1ݞq|`3 :hⷈD8Ojnho )epnf3ݽCW?D~H |o >UM^=r/'^6I%)mix=i;w }D)qbu=8e8GAU>!XWSJqFj/~f2U(@Ialv+NK>XŠbTg嫙ORNgT/%f!KБI?:?m#wOٗ?kbd-b[Q+uci_$.U ϜD% BM|ZgSjq;H3iISV^ӖM?Pݗ?wf %Rhtv9 _G5 B:$#\twYgD$OPkܡdg >/Bq*&I߃?xN{gReK!ѡmtxMMr9"\Rq󍙩~\];=HxEo ^({>DV`c*yO5RDXxȌA$BHFqɉ}^e_czrɰF-( R[ܫ@{?e6\>] BwDJKCh%z;]m;:W1hmb#:g>L[)G ļ]h fcfXEPAƆ.4;SrN?NZQ endstream endobj 156 0 obj << /Length1 2025 /Length2 11413 /Length3 0 /Length 12659 /Filter /FlateDecode >> stream xڍwuX-Vw V;)ݥC-bERH)s=|_5{kv~Vd;Z@dl@!'r\hZ6P;4z)9f6¨ʎnvNn''CttHۀ쀗W4z)G'/+k(l|0$!.6 s9bdnt@^Q u`7wewtcbx@W; U6@oqh-k׿4-.`g8œl@ 7Yo+89 @69@N^6VK;@UV e;\a6v0_ɛd%buewU%ǯ0F8!PW_I۸@@{q{Ķ>W)`7'mg7?, @BO5ǯM -r2qrtXJXB`h> #4NNX@l~G!c \l<@9_tvtM9 td X-eIIGO  ;?`;_X?B`gNK&`ލ@[+7'Y7;_ s{;80 Aa BbeW氱pIMo'fY%ڿjq5-:q%l{W#q]\̽Ѐ0Qq|8a xg#UttAu|_C_$x"A~oqrqà9ba8upEP G;X?ceݯFqȿrvi7Vo>l5;ئֿSend qa ,__{Vo\?b. ? ,CN[Ὼ S!Ꮏw2ܰZ=Yh'?ha qYq9@``){K 7XпnM@G7*X;MvnbR2Kiak*CDeD2X~[AvxaQG"*B(gR^'WbR#7{Ϊd{LTՅ;#_v6M`xittWَk63+0.; /亵nW|(kb?- :ak4;XZvxB4s,F+TK"koq޹|S'oq';m&n#Uy-B@!5=f/&.q[/ĴUn&3t m PN.1 tהa/8c,@sϔM!P碌iWNWx'KbDCqD%C+h.t>K&He'56^dF Fߔ<.2/^mHbU 4HE9C|#R}>^HPt8s9zNKːx_$[x7FXN$ׁ/uMQzU{su#bo6 v֠xoy8K) adW,*y pM}Ҿ0`''dO۹~V>SS3E^ny[qX: 'i'.ӫ V5q 0hݪK)saAN/BR}dP: ٶEI^CdU*k㴟*Rm={4p6MPYРZ|=6 >ovDp-|l.q{I8D )+(z`sүUAܫwG}W \,~"%9S#&=zfNӫ*ȳśʺxQ#c\i3\D9,Xr1/u{%A *|FER$P4}!^r?9J=| Ա9lv]4w|Wg)8wq{`gq{1Vj%2t-3+?'Ǿ_5WזxՄtn%SNc'3ql%cJ^MzRk{Ol:& Cvo f|<9w^5\1vJw-O;'ek jgjVT %/eyt0/qrT$|I9AqۛZPY2WLdymd[*~7SḺ|*'R-SydJbW7Nj40,3pݏL;C`=gFN\zS)긗Y^WK C @G3gj{IUo{piڰZʷ /L&:L[K4#HHk1|k~:k2ߌ4Bg,rP7#Kڰ ,svT=AEq?CnjV'[/j3wn2u^Nk] 4l ^]̅NKqs 8ʪFx,nkBYs KR oh_ZY }_^|OQ(9Ɉis 8)oHr t4~A`kyˊH)wŴP~A̳tW{/=;I"T 'LGl9h!XMyF?ױZ {ʘ>6615rf(/L },akp'S9jҭrLR `ÜTeCpWjX 6n'@PwVd\h܉@G7Q)QLIQ > 5\<˅v>9t&W+rTS|Lli8*G/.E|z4~|z[b’ TF({pD%*Zk,&$T.R\/xJETn壛rh M x%܎d6Yc<w}_z:3=oZtkU.TcdC^OR152ߌ{{7IE{cC3lWFOH,LD$Dos۪= z\asiKa"m?Q AVx?HfӇQvs/|y`C/5)r#td){2dwp~Y)׀N7UXMmP{q 6i$8xB6_%o$(YVqDaGjY¹>gQ,Ԅ]7-o"IcmP[]pG/ .7;~qY۫n~^> ~;B=<|ڰhoe%eTi A#{9xljG[BC?lEݮċdΙ٥AbO)U8vC;x1&5䐈;Q=O@{1ANocFΧӣI.Rl{Xg,dW7vneI唵.Όp-\! Wf68L[@3me=gdIMN}ԦEE< NjbF7w<ȇx~6A%TO Wsr聂_ kx_?f[cV5޽jyV*!M&R'䊜}1)y'%{F#`_ ^|Ft@JU$9y~yt %$x3j,sUv$kzy:"~?y,NE}`wt{]% e3@Rd6s)E,^gOYwCZO[L5ql5e$ Ż|cGK6x2f(zYV^67:F, =γU߲XK(V +˟ ٝpo|[S$.AYw7K !H0'Q7<^_"ř"h> %B]yֵxkՇަcy/&[WHj&&Oego $dCZҒW\PPUB!Xdr/k/Ƅ+~( #0UdUt/yGJj6mi9>s$͉pC#HHoѨ2hdY^IR+\}yr x.yM*CiJ]E UƸ`fDw'ʃ<{{LQ!HvԄy,gmv@ge'ꙶVt#!|v~J@.gZTB:eRCu=-j alD_CqV}s}'NC^?>MȠu7{1.y"#{W$tO'uoȫlٱ;)~90Bl7QBh:0`0GY`cUlo},wJB|x f <䏬,|\(2u;aZ4wd$; YJaE kzeTY%F6kNf>(Dl+nd@+{X.YSao%䍇[6BK8W6b1j ؏ 05cv"dE>O1UTLF9,*ɓcq3n6=gc_) G{znRˋY{3e -4(z$+Zr3V 4[TR ㈈*?w̵?_.,T9UѾ=15R&+eA~\. m+qnPDM[-ߑUw踮zȬ칷_eCBḇ}𫍍ՠ O* d'K KWC,Q)Te }t,ݦȜWK:3rpE0?&Čk[T*ffXE)t3>LPWԚ.ҳi"[JyLO{J #(?&i6`7ޡ`|_VK.Š` `M{@x4m唊}^.>bpPCg,u^2@רVG_Y,$ޛ(BUL"t촩hdLo^[gjKKNF@@o{ "ʹd9G\j9Zikb6EZ!X^*/`U9}"FeϢM/t1l1d>U\I#ܬISc*N<uGCf j@nbǒ|V2_ #:Ͻs" 3| K5x"%JWʓ1`SoZ)>9(ǩl|1-[*GSv!]d}ڽ]~iY4a/9ON4(rXKWyӷ. |+q挒-}:2.T+ń׸(`Tp}ESɸyWKe?f"'Bi,*ǮsZqki>A/,Cϧ_*Ŗj zT[j %8@jT/8 "&?lZPe +ҟ#f5蒇̔[LbSMhZHt8vS}kG7gH˄Љ߻ďTڪsֱy9&Ww A+w xhVuA1 FCݘj S' <&ب[CH, noBrE^\{#]jTk ?;1-hp}/$M>/s`M.`^68)]c.hVoTR!vY ?{л3$OF;< U l̂R㉼f8Ÿrڳ°0ŸK!|*xz] k` Ivl"{՝&a\{~LΤ;y3+|RK8I1-He1h>DF{OZ<|E8 MTc#ۍ̽C%kD3IZp߳ޑKx7LCF#BS/iSXʌ_<`=~.%C~YkcW[%X>;FR ͋׻v|> he mQ(ӏR\h/Gݚafٶ$yMC8$5yd?]>qbQ?RDN\uA.SJLfG\YWP9ZqjT>6G)_!95l޷zy+]S5{5eSySߏO_pf'R`URy%˟J!Z_5Uoha..Oyot>@F])D&̐bŶT!Qy ~֮}ThџiF5#W(|A ۆO.ctЛB<d#,2Bָn@M;m$vq` &V!&b4OVuqmcFރIDL/35qV]5 x!QaY` lQ}z+1&]3KIYp 17kk4рAG#ihlqa?dj}Z^7 _dg B%LjB&OggIt;.q=7Hϐ ]I&^, !;O^GM^Fh.[Qkg nO 欵!n25}E? E-{E^'ؖva^h^0iE P!ο)SI!72Nv?٭?ȟ ~Fs0he娒DpbI0f=+eeuܻt|1f|X;ɢY*!W18RsȒ@ ~`S3$1FGgKI)lʼnrV8&/ܷ&|/x'HXU\b]nʐݸXb0z:&tIjVj'ƱEչ_WVmۊ8e"ZZNi%fO^[ CQ$NkvdnpJP35Y+eQFMAy^ݬ`Yy2P}U$0V"{wr N{< Wϝ! w&ҡSe%Ϡ>%1э|sD^DwĮ/_=A"ڍ1 >^;{7?FYsv|tMsө[ђVd&"=u/ݴ ^۸<^+{=s)̏|Nf6Q䙺L;qmgF+ L}a{OJ$߈ س8~ϲJٞir|K*Wu% FIL~{&;l]vgY3-R,ŀm{[J&jC7rng vٞ2.|dn F.tЕ[y2p[ݬ޷8fYC29Q2nj4BleT5KOjI]NLlv]K>^&g9+q־,j(n:8w` @EAћ\;Wi-},½PeuQE*<+ Nx@n.Ep^ůloST啑ݹBL8QIWJ7vt4?؟ cU51]7`/7K՜V,JtُK|_ #73 /uF]xtHCE~S%1Iڙ x}N`J\ɧM¢p#\ZM?:6Vs@{a@|[NOxH?TzP8lf v9PV34`:3gqҊBLaԛowBB q z+s<&qt!>΋s8 +V޻7'?R 1$9z/`Xa& Ю>,"_5 8NQ;} p%c,v9|$`Ǝ!پ1[h)Ky M״0|2XQ&rcICp2mvJdx4"ݿDzLbjwoP9J?pwueX2]q`W6&zs@eaD"M4yq&sΎݭJ8,qb9>$xvt e-j,Fm'|\ϐbх{l'{_9Rths]tO| bHaS[`q%b&0[5߲oh($hi1EB]MksSba{U5bgXwn_Ǎ,ƒcdB̕،fUJ|7g"prVegq\<ŕEga lՑBnK#D=- &_~%33*yX8 ??=L^jEICO Z:3o˶F-iynkCSdGe{hf6Og@ӆ9$ap|iH'4\9:l }<~ $?qy&+BI>/&ԇhS9>}n@rSc]o~,nx)$-P2jF4+T<9.kWN4Y2ZݢIMQf D^{ :EQe40|c6m-V!Ktp7E{KEhqjEB{v[sr˶~e5n(;A\%ɧQ.9S~m@m>Rlܯ!Je`in5ď4v?zPn)d ^?6gn۱ ܬz1uyxP ǧ{Be/jmb˷y2Q9Vf}Cȑ\ewmZ[lϷ$wY=14"NYrfJLͣ&*]ڷV+3bpdEs0NHzRPCF)Cq8Qx~C; N)<9SzO~zkO1 $Е^xog!ɉ.qx5>R oԖnTz`^! {FNN+#@gF(>ɋQ? hUa3Itv Td< !0\VWЅ8Hfv/Ԯi vqR8jRnlß +:N'8$n /B3[qG"=P>8"-9Z1\sAn9?jaXQ;x9>$z,Nw [*%3V8y6BS~\,.20Bqw7$m*^om/:'u">x:~!\Ǒ1M (z ժaa^P:V$繝v.UpVC[M_Id,Oճ.z0o8pjV-!^E덗60I vլjIh N8|tE?J>P;G-MZժ;~Rt7{yU-jg ^]?2n`ZӖU endstream endobj 158 0 obj << /Length1 1370 /Length2 5960 /Length3 0 /Length 6892 /Filter /FlateDecode >> stream xڍwT6R HK7 tw03 ] !-4()%!ݍ}[us]ZD%m(aH.^n @ ~nItma҇!p d `Ma @$7&ȁ=67 A8Lpo7=ߏ5+**;vA0@ 8V;:pk(H'7 wd؀R AC$w񃝡NuGފ@ ~+C )W buwo|+iӿ E(@ 6P_|ˮKiNPDz\ nex@ܒ rYm~ɌOPq@\|yohMcGކp7_w*h2#ۭ~_mͿϿ xAq&ա-gUT\˟0[z"_s}U?q)'Hќ, b92 KVA,qvAhlvS&hQ[$L\ wV\"VE7g脀. +ݺmDǸhdJGfꮫ5w*Cqd۷ޞ|Jp" be(H2(2'c](1G[iuiexE}gmF_CE)"W`|d}hF/jN~0(.5IҪSPbE,f촗oC!vv5!}Yw_,a!o.oqهW؁G[U,JLقdOhBS+B>1| 3^iAK c݇'EB/=${&Q%:(wDq"F4g]L21~by*WH 4:t8|-0B ja)-9'Vuj:0 @{<=- mE ݖJ6rJeCޖ7FcsC;۫MAU-gi@1 ELCӳВe # '%EIP?I{pC2bo7j9>B ]MbeFtsWc ?mO9uJКoD^):4$Fչݣ 9x)&UTǾi1 טmJrHƑH)z!%_B 2~Xrz]Z^|.̣8*oX!YI:4DF:ɢ85鵣v]E+ %r$s۱s(e3C$vol6 Gkч AI9*4Gv;?+$GvoK-$Y-^ayr+!@Yg)ǡ%,gAt\ZM~™ԴzgvQI0l72ʎ_9 LQ`gYS7޴Fwt~n0#7W&DX%/KRTH#P71v,3V\hj$\ۺd`8 XdM:$w*@^EWk'銳#], jL|1܋3iwcݹ7^݈n/Hn>}0Xy'A `?->P*t.WtPD:xX-dL.Z{|J Dr^x@ݻ@Pg ]h9sēSIa/ Id?A9[IP >=~fMk0#(3uVHw BGfo`3ZHڼ)͝۝R*c9kG{?LFOokw-qaKP_з fVd=џoK#3df½̭ eԜC ۂ.pjRUpY˻LXkP~+h;+ӱð<wE&\ǫ8{X͍pNX]ꛃW .s Ke6@FqO 5YH aQCs;N)v x8aN˕SdCЭuop,a2jL@GR+=_v7e2t=3h18P .Q̛dݲ:#cAN([ߦVV=>EN]ZyZL.dk*ƭٗ d:ep9xBr;֋p3V? O&-& |ga0$_/cY##Loz#< a~ɠ?IUD|GֱrwE "Y[7@f|,Lz2͜ߪP dΞ^hBOhggs$t8@6\AubTWj<,Ue_޴ͻ#p_ɂjͥ־3N*C&F:9Տދ:D-XW`/q.R.+DWzJR̾i}.zv:~P/F !-rMN *,P~ ߞ jV_ Yçb4%7h|}Z^O/=+ʊ٫O9XӕnegM^Э2KYTruÛ`T;e U"o6o)cSh4&l&"7%"a wã:mL*yloIkew͚XU@fù))o,].` gmc;uM) _0v! KҜ%G Z\ݯ7GJL|pu+!y]>KR,IyCUrUMӐm3[˲cV-CRJ V>Ԋ Dy>mtU >CH:\wX}s-#5{(^c+)RE;}two$P$$Zڶ膔E0Zq? 2⦓L8uRI1mg21oL)˴R|îrC+`2?,KDIlK-9.hq,ܩ}fjs˨{sS<*{۟:#AZ؏DrZ+nt$% 0Pe+4M+?qbdJѦhi#IXԹ> &CP8vI!Cu3\CVݷ.У&%B]ϓ'>‚^ &sFt':z\͵srKO̺o(J|m=I!Jt.e6 n"V'Gq*OR{8O`̚AYrVD0EW1lL'KVT,IJDlεQNx3etr 8z ;I9kyW++mC\+iy63b6 = ]졯{xlPǽ l+Kz|,G^c ԟ2.j8$hF$\8! d)/de[ o r! mp Ű\2PfŸ4,*8F|Y_WmdL|;+fVll]Wcb$*F/jdZ%̄j,*eHFoTl֙.6ƃ<@;zB~tPV A>/zMY@i.[>wW/ҳ+QȾ: 3𨟿$r bj`Dz0Tq_~0=T$r ޳7 }?@Li eb % :{&22JG{j:&_Q:>/` 5uP]̰q>`}ì֊*Hm#PjV;?M2/&~N6fXHJctFCMʻ,n(ZRD^H3_hI(NY3sa^=nq0FphOLZIL&5Rpv]3S+7a/~Mg%S?Q]);"J^(SJȺT0V HH}<ϗ4Mg@Z/:.{,n5ܘU ?4\0Pb{2# G::6 >[dbAN;zv#&]zU>ص> '^ HDJ~F`7 Ҫ!gC?ʏ׺B7ǭFLZ Go`2*NZ[*&O4J_3֢pؖp]cF+ ajƼcuXameđMAl]5v]2I?T6WTa!+kY7lH "|~1-fv֫̀.b9(&#> stream xڍTTT]RBZ?binafDNCB$D@ZE@ iAw{Y뜳yk<FJT  e*F PT!1a?fRS(C"d@ aq6UE"Zp(@XBFXR"2U' h!P ) 僆99cqe %ܠh肰P7\E00BaP?R9c(!!///AFvx΀P  ~ AO&H0va~ۍX/ 00Ex P4W`GA:?{w??A`0 BNG Wzc ' q O r~u+@a(,FQg.! *H77(!ٟ* Gɺ"^? GsJsjLۜX8PZBB`g}P_Nf~($ s>~'E{@+RaaN0qf50o=a? Ho2VQS)+#~"iq)@RR4 ؟6j"_{!qKc-7ɭ@0%?_$φ=_n_>8z`qEdOhuz5 N82  ~au7bÂS0[pQ@p \P|YW FB~LD\BA>@D~8AB޿ D n#MX!4 }Z8'? =h~W__B`ɏH#G-'5J,^˃Wg",zű&rueh+C*R >~gd{+j=ʻ}^;A!HfaԈExC6J{+BۉfC%;EWV .0қ7@g 6F)m?ʂ{oaMKJ04+D3,ZŦ雞T~ 9RYwNv ~~Ч@9G±Y!IL]pFM奦x޽4f_?i2+7 ?1oƫ졦l^R4)8{šNj[Z__^:H}2Evc& Bb"O5|zYз/7QvLJ783GvJKJP`sޛfܿǚ̸95Q2u#`T1_zQJʞB]ՕaVuK}m5c>5ow 3xjɞ(\YeFh\<_\:$G\bg`1#dOLs"j)7Љ]6A38KZcV*ny?GxPfkf^{f9&~-.b21*λ>Yd/im6{dHZx%{E7Dڋ.@`Q@cwEקëz1s=&ذf'2[40HW/;W—'Wjs w_p667( $͢ MDocܲ疪|'h@;\=1o=Hģe,1Rj%/6 xe쾿 E:*F|e0b8O%̈́KCW !PbTмKv@vJ9TYu^|^]-y2=88|Mpr"%[`B`'ôsw;t)465c NX^'/ruב4Ogd<||^;8[//Ikj5KroMT(L\K6N sƜrҪ8@iEl^#3m9NY1$>>=N$|p]'~}ﰻ[NБ9nߟC{\ozSeEѝ˗ YUr:M4*"2Uﶖ0pHשּjXBR b&t(;5ٗdV-\ԢFd_Śl%-A7 >|~ u.GHťZ&ާ51y;tyidz'$U[%y`1i>P@o'Ae>aXBіA2gHba"\ñC<9&sѮ%{ӼEvrE|Ue{$JP~vsZڂT:o1$?l^ ۥX^&3//<[\pc@<3vm%p}YDtnP =\5~(`l||L̉ kJOyP\Ĥ'O̳1py11nbؘU h=XIx)J|ܘ@|Y'w >qM`~ۚA;eū}-^%%@с`Iߡ.,fd=dbyO2uj?7oRrPy߯yR`(00K ;)C>&/3 qhaQ磠%n3~]ZpkA{ Zow^8jv`GDdHU} J(#B&UW^!)b΍?|=5E;cFNqI44\یV(+C9 .XEZdƄO. *T 8sGFFkC <%hn٫ɧ5?4as5aczBZWWS!Y.nr9jQY(AohddMa|rnA"*3!nV{Jx! Ȃr\]BWFYpβV\_!5\t,;-bUDz.ۂmϮwCr==5ZzQ Nz@z*,Uױ)Łȓ콓TikL)&2+zfbBDËsjE+Sp ̦u?w5Q_PxcPڼ:lckz&r@lFKn[t#e3 }Q&;I;oT'Jx22 8t]Wn X =&:Udu&74KmkUoWu=$L&HYH =h.nnɸęg?w\?_Y|_>P|IS{\eLI=QXtFSϱ{IDKAW9H(5a*[B|/| 9r̨O I\5]bQG+$J':rXIQEG ߞjҍUn`yAr㽓硙OJkFQ]4Z|4Qdމۈy WчaSgGJ[@]g+b [94̚(_ʔxX> t{x5Bc6g$W@BQZu1j;U"w^O=[nKy^_?9}.Ih"!i#U⵳$֐0#o@:ÌQ.ţ"rMCⵧc`̮J <_8O9orK^ D =7|݈cs8W^ytf214y8sǮr)YUf9폹Y"_2hYχ1R(~іmGV߉%ϥXnMTmWD.wBr+y %xCԨBܾX'OMI&UBWNod1ܢ7\o'Hkmc!vR`:j2'⤰31!HֳNaqȺA[Dd<46'Xߕy8֬c=bb+l+%AFǛ'&SnQv ^ dseg#(V3  XZ{IuP9RNBh"^-0I3 p#U\[a\trWF/i JQn|wޘ|Qm"bMW`rM o:I>LnT*-lFdQ>Fe܁Y¤Ů ߕh_rU|4ETɌ>|l;oBmTLEnnRhG&W\0''jݴS'BILCL}&'%\;wT//XTr%C-8|HJa;([=!qsoSQl$ ]ոopr3DM>lʟb0[看`)8&O3V.z9( \kjjbӋ9+ e8{N+S)ۻ5;-F(v<{3$XhM7"wC]?S Jtdi/ֿ`e.$/%zL5E0Mz8GBK^>y:f$+ 9 L!grd4GBauI!vh0Bt- i)F7IurಡK% u㵉0SN)̴7{7ȭb:'Pf9$kfvDx#V;\8"fa~f2*o:B7Eo{-+Dj>40A+d2V(u zt 99k/2rj{r鱀fvօ9AD#̳t)쉋83Kc>/,?=: ~GLADM$y&woh7@ Kpa~;0~1G×`܁يtJ/IfnX+b/{ endstream endobj 162 0 obj << /Length1 1481 /Length2 8562 /Length3 0 /Length 9558 /Filter /FlateDecode >> stream xڍtT6ݝ͐%9C3tJ ݡt ! R!%}k}ߚ~s<0l0(Oeaa1 \=T O0`S!Z0(@/"/")PyCZu aQyBk `p ȹ=!v (@ p=hr ``tB Ł@^( `8l2@5^yW ڃ= 4:`_dͿ܀ ~# (k"|7 =ăAWO (_O/; BvN/ys@08 _!syxE?6''0 a* BaCA'5~@Ⴠ@!!P 7x~;/Oχa#`/gqf'\~Y#Gm\@$ dS{K/LAT0~Ak{ɞ@})j`F8bC;w$\KFgSA#aG3iJnoY;*-U?9b5CO|$**A.C|L3Dv|?UFׁȐ ]|w]=O5l&,=Jn^Gn1հ_PRTJo[yGDo.FfT!<5{:{ ii<H|g"[pLyW땰 DQQ{/*. a SqmQ1H>y $T{@5k?3Vͩyk2P xJ8n5E!NeXS'ͦϳmbp S_#і(1ok@ߤfG>6uHí H㎔}S?'pU&NݠUN9NA&}^6I['^Ee#6A$u^uH_mw~eӒ*t%9XA҆B7׼WcY }! ܊ H-BcH/oiLOE);ά75sxž." HD/b:I% S+Kup0ܹ$U&z&άӻ5Eckn%m?I@ֶQ/ϫNXm>G+qp'<0m+BzԾ"xc񝑋]x σDJr߉Z-18kӠ#,N3_XɅr,{/]?ѯ~TZ8= ,eYMN {Q~b_]`RӎLD?G=)A7&@i29/jf}eki"XE408t&yߘh,"BRĔDi81CT@s̞yK`)H.Ȧ$-׳ j rη^ 9B4|ه?ya_>inYT^hV&}YLLH(exG=>aDP"O&s$HlDSaoQuW,(EG7K'Bь[O):[%6.Za [~ɼVXS3VڮǻEdS̼/H(?]{nwSbgYK.^W"E#!i15h//gn= J_7}]QcWrZ~?zCG ep?( u>wPe+JC>'HĪ,3!P .bJ3oɄw ("Nnv@CCŃ>-0L]N yf\9GQz5@;QN淶]U<9hHݿE MI%s �pŎEMa+O ~Y^'dPE*j5l(n\&3ݳc>Dj K5j|g(ީdu?x 0y1!ԇ-0|uMLTSSڏt'HAe0ُ6BvbCocI>r0 NBJsӳp ۮ.:?Lw;$5ǣ@?OhW|m 4xXV^x*x־~ kN~kʄ5\0lV=[ԉm^ӻMLsraMXTClRf"0-Rd,\nmX _LЪaﶖ]m@(e;~KgcJYR;LiY8̚~i򵤋^f|?I_>+Xfn>e(D1KDmi"ɤc(EMYcRrM ~DQqĝ膋U$h `=T1 c8=$ $͎6Zԅu058 Xy).k)9];sjѧp&^<-gI>' Q,}E&QNP\R@zW _N'=ֽKe4xpsCB]5s*fM]q%/9E.8g]\na(9S /}TM<9~!ohnD}N`ͻNwb-_=#ڰX4y7؊d(q{ᢱ0t '[xO|faDZp^ߢ@d+P S)J YރzBǶt!\ox|tp K AGcāniÀqQl> [Xo8MH ^ʊbbaM7q R_Pq4Iù"v8uP؀+Q(x:{yΊ>-ɄknW KYRjLݽ&n@e5 V{}+1 al'| jCEKUry Nl27sHpK.#QKkK#$T]KӪag\0%r M'3T Jk?W9K9h9`DVJ6;j$4"\|E<q?z]ӮWNHGG7qi9h!pn>qfx%0[0:PUJTn|3D6oujtZK>N`NY_د4Q;4/ ZKqMŰ֮Ci!=_/.EJY0LDnX:Y72.쏸Cr;Lk }P_uoj_ەh5OH'ikov͎Ed˪G,X)!$xs/Ĕ&?a|pjU?KZ5} J*ZHv^@Shcb F&uTE_[|v_pOsˎz%ۊ|`,i|{.X{>,CJFyc͂]1UA XOOSdtD྄o9YLl;N*Vr%x.r:I2(pCC}&7'Mb{a>UEWs^5 Si έ>ڜ,+R(P=G 0 xځ=<@R g_dxEQGtGfeOL0KHfdrzy8Ӿ<l7ԩ[nψ0*e~!=BscRa~_7ٔ; kDT/{ C$acx{+t(Kn/S?KU_V~F&F{D !oHhyOo+!x~ g+x 5eHnt*̾3?zS$b/y5aXezMea! @ )v'XQv KO:ʚ- orQO2ߜ7P"*Kp[=yQM&7ԓۺ#-_uҵ tcqbLhT puu5k$V?nrڣgΚMi.SAۥ*,i:ĦCW6IEu@_O!5ǘJz!8,rIu$~zT8?9rnL|ZV&NmN WEw[ 3ӊQt.w2я 3J̶Zov"v;X=۟bS  H{(}d,Kz?a9Xd76IũQ~8z @sFW"FU @̝`.k[) -W_e~L. \W4_#a8GC"| P/ኼ qWkL\>?mjER6T+Tk2P6" iO)?&R8&PԒZ!]~xS;LP/6 2K/1up"rNN94g?,:60GQ#tlc+,21 7g7S]MJz]eҋe^~*m9 r_Eg)C _'om\yb!'W>z$\;Ԑ 4|'8ZĐo48#XW5;'A$;8/Гs7.uw37x{>;lݲ LrBO]^]9b]߅=܉IcINQt2_#>{~Ryd_Nw>Nme?<`~$ղH^;]jm!8TOk!𘥜i7[OK 7M&@ʱטSsP79{AR<ܙXX%-._;͋o15ܐX|E3W\r HXwv60&Yg I͟WJMxQJZ= [@]UU측_ ^&["^ʎpʕDӬJOOUqDg ˓E34|qٓ/ <򒟂FǸUYRRdhȒڶrJd.4xqKEݿ"AU./}9",r80{=LlI*S[-F0чvbcy a|/qԐ CǰiaX퍃'J(9)XeG^Pb*v؆@ z>ߌčgF%p$~sT>V_ˀۦW;;ZKʶŰ]Ƴ)пaV;-%DOh~ a7aVsŗgƊ?55$h°0{,,h碦+jJHݴ}F{{OD~q!J {9Ȩu_: itO# CDQ9YV|z6b"R>2^&ptC||~Ù'GDzi&{l?bN+.F# u 27${z/%,ؼ9Yh4t[G^+_1Y*ۗ .>UNF.֧@VX/px]#l]^FI8̕D.ZSULS.#jU|^Io8=T|rax5/tW{;q>%%@gYm^N,g@^;otu1VOJQ˨V BȄsAg?y4\㔻=<-P_$ϱ!e|-?q QRaY*<"G c]sT#5wmZ֣(hϣJ''j_܍4L%Q'.d>ngo%4jڌW%;|V<I|+̐LЌ8*Xoox{&"L'I2nIN<›i$6 ZWFP5ɪρ5w>(&Q>~ۡB1L{h5?-Z؈-450X 7!kp5W7 +ā8ͰӔ7$%C\ endstream endobj 164 0 obj << /Length1 2576 /Length2 18173 /Length3 0 /Length 19678 /Filter /FlateDecode >> stream xڌP  9,469&k~])RRET !9(*(8E_/&62zފZOE6ƞBw$jgB-R$Ĕ!SpOHS}a[IURt[fEǢGr4VVI)X$OR@rա*J5]Z`b\:*A 3X HaZ =r14Nj"3~ ]=Bjʄ) h˔x d)D LtuEyZn}0e f%$Avu],H koq,z[.[ _~Ņ mF ʮ6S~@o64p&LBnT+m0V%f;7ADPt꭛Bw"DKXI-k|uەr3s3($ YC,`jؽ) 6QZpGG~@#M/r "C)40d':k),[Ѧ-m =@!rg㽼խf/([ºrW&F 0'^-hȃm@ 8*Okdc3wr[zTo5C(h u' (ڜ2ީ? B^id/< q2D*n[?V#7aK^zr8shFa}0v=^G>@P;HνR3Bdٞ4 ?zۇKV#͎wqf-A-VT9}D #9c.QBՍ.}_U4 t,e^n432w=*We8$].,/ǚ{*j׭*:ƾ2qu'+]{vgW.i XVEu=k\ $h@tc.Rv z~ac 'zg5ky²250\ư&&O,.s|>6<骅)GOeHW[-y)\xU]F(Jwz]Df@ w@|Y[C,El#)sDVQj&/X#Dz.tI3'Lx:xv>zo"\mYPBMF~jf4b#kkEgpN8V >qO܄2<jdא\6[F£JصTOX#'\5(j)!`+NK>G@ o^ ȿ*v2uC"\Rqc2$c72Ԝ;C3skaZ#e'Ŭ|U]c2mr= +ݡuVqo“FzrKyph>"i +O6Z@EһF)x~8ߛ-̱9N%o+g<pVІ!k.DYL ;(X ֱ&nL”ۀZn@O)U҃1C l@Bӵcn j=%4r=|D$Chhņ/LʇFPW`8;zTe8sPaXm :wJh:R*.if&$`):6J#rmlۊKu\huإm[4\g:HƩ,<xm7}u8I1\Ce}kKI)w=dHhF߱Dɻ6>뤧qC7i sSJKz+Z!xD5Wd ,!O3vV~AD5/cRKBjU0kKjPKS 03n_$7NU|xٱS,}z1Y} mQZ K]_'͠`SYkaT]uK;یa͘3䡸.ͷE<~`hr|Յ#(ƢDĝ^NUa {cĽLbS5JީLDN1>`|Ԑ mJ>SR&Q4ުۉˍA\? qU؛j1}Nͨ?BH/%P%dz"{^^qq^4^_z_ͮu.nFި8#~ϩ 'ac:[XΐOj_I:=ni#VV!{ح.QY# n`gb >e [+@ >l{FVXC%z'J~h_Hf1fڴIf~˹zxlf*Y$»-CʬؒB7EOCEIsJ;FD{'fE-_z ppXYvA0yh|BmNIto: =Hp>Kmq;| krڏlK8jzv`@kM$`U뭽<X.Ɖ^'9"Ϡg]7y (|pzOɠ-#oǾ5~VO ,u8TCpOOp:i:'1>66YҾ4|9$}wk4]x3&XvDz*P<!S~UYͪGj}YӬrl_ϖ[QH!,BC#6HQ?U|V3h/0Y:Ȗ AWangp|2Ic>f3X5e"bSЬ%ϘNk 7H ʠ 7VO!.`S8rCMa7䞲V8yKZ4߿:ܔ0zMuN]$笀q A9Ԧ &ftq:g'sV!^{) S&M Svό~4vl{#rф[:OP?^4jz)hw 5͞0v ط0s PEo)e;ТU$9t50vJkȽ' )Gm3<$+Rlw&BIMy=ʍQ"%eqiyRIg!'t,]"!P&y&L +93bf24JY1)HhRw9,eՆ?M#nrQ4 %io~5=So!Wb qsW\}LK@(&ȇl`ipղn@fYŬ7pg&ɹwqaLsNo9.}&nXKUoAFMaMk{w[|Tnir5e2q^&?u*+|Sr`'yRlŒn|bvXZ&3Y#G?ACe { ze8'̉G㾶܉-HE37โ[1fF m{=O?Ѹ,MMo+g_tER񥾘eKHhg]oAguoߴagwtޖG((i&s4`$ʼ] 4&3q#%Lv}M@ E>:6wf]Tdi B7EK }l0&[/y"54ٓ јugzd(%Ҕ6\=ze7$WnbNe5Z nG++8;$A~5IQ4z>PK0Z_| $(/`{rl|_i;x2$B"yȏx'{KP &wsn/ETjx>WS4 h&!]/7SJ'dQ_~y쎲5jnFjXA yqpͧ"Vgn^ ZY]64Hҙ_yv">PzC0tVQl^pĮMz# zKqL唪2](Q#<)Xֱ^V놥 9wn׍* ,X%~B8Y+gېeJdu<`%[4kª(^ r1ay:\1XFX.23R외tS*W%o }C\ę?>_ACsQfB|kAVԈ`l'D/B.5 `8w%ϊJU,^Xt]\00>֒Z~B*t_bu\ng ӜCL|Lc3}w1yե1Ms kaѐrAB0ҏ-M6BZH6l"eb)?3ÜM+1!7]6Ȓ9Y'?PaHk0KH=u!iՁ,NV 6W"e"m# Dt[!My=wo1Ix@ȁ М"\Wjęy4w~ 5_P2W L>iC6=:&z,Ep<,s8 wPdN[ހҚ2Ц_fGC^(R@,Q,԰>x@t\E (;m\;=B' 6F=O{F䎺3س΃+Ε~)wƇY5o2s[/COWj^VQ&EK' q4-mx0x m@Pi{ҧ38g#U7T$? , ,.LR-t׵,VSIk -u4~f9ӝ*X(|i)$_\ }RlivѮm3AO읢K&m+{pǟ #yH5ePhy6%]x)eJ>Qq9Ly*ʪkbge^xN:E%Px'h4a*T/l VB*zU4`ŵd{>q`f{H!} ݴ73߈¼Cj-'ClhcrI/6.0bseegbyVd+]1DX/ \zۇ%[J+% *,AB_̊U-Sc4}1FzS)V'W@=)UzH!?^$\47l]. ?N觋8뿼ja2DPDR9 >K3Qos7HiM#{]qC;#?.+^)*N, ZHI T+xR`J+~ 4RI+|a=5Puv9t~ NeA|Gc*Pfd{o% jTi=[WVRSو}Mk%/3D|fZq}-(j|^;%2tC.̀Ʀ6['L\娳iKz}u zʯȅL%b(XTQObh|V}u,@rgKIh^8+Z}hbŸ~fe̳;ryU*Mrx^=v"UfڣhҢ)̋1 I.~ޠ 4n}|67^-0SibE3D[Gjf]?:]X%\Ż?Y>c& xw5Q = y RWӊa'7#Vj+DA%i$[ဘLb5 T#\ve%2J˳qņ?4Sn\~2}צQpR%.=?)34v#8 =Xda9v0V: wiqd4v_[1cjP2M?5S!WARdR;!: Vb{*w|)#1Hcr"=A-h幝J*w.b4}J$Ub̑>ܵA%]l|XMty@`"NA/XK_U^7"P7я5TZhk CiS4c*أ4vE7gk?XBծ l04 |-R7erWD<Gͳjcy~2>;( rOyM<R<@ר;4Ҿ%Me Lԓ2i7SQYG^V4SlVI O6bҠJ[&8Ds = KYPI?'Щ)gu X/% Bj2LJIR&((}M!S=IZ6;EMr]+Y'W}o&Ӳ,tU{WU]Ջ/j&oЅR#:>L>*s{紌=qk^IBzvPb1C+Y~Q$"\ڽ2=No_NjxYKAuުp졷wJ-`6=4P]I Y0?d9:kٔ\S^ڳ%.{&elJo`P/mc]W|G~⃻N׼w 6)˞[_{g&OW7x(S;aC?ȻuL* 1&ٲn&^qԠ>< &CAí X~WǮ2'Qk\ ;n`$(q`|1|~._lċ*Ϳ?brqY39ڴȖRjݖw'8XUZj(PKZ07N}7'Tv F_hl%\?it^ȁCc s4IݪxGەz)ޭ8)!ZO.Z۔~K3G6d OG1U?x (ɋ#"\*U]Ԥ5"za?"zpM#8WaOhU|օPx#Br 2~uXj_X×*EK` }nk.('>jGG(~8?hqܜ/ 42kv^w6:_}زL*A4=+:m7hd/_-ע fJ7:>=^g >W=8 E?t8 /5Hvܿu7䴺' pnLi.S兛4*]G?"涤MeFXI{%(O=%˹riQ6eAм9ZH9X-cv*r7ݍcg cTeR//.E .Iba@ڟ]2xά$UrWG+kRWl7I#=>J2'L:d2@AdUIсNd<}w%v(7:b)&Ge)3""p5s *' (S"(`-֦Jri:iA(Eth#O,8d^a隁*4^G AE/\TDrOIƪ[^Ƣ I@MA Ϯ=뺷/!J[F>|z؄bmr!foܳAz_2^~n$Yc!F@./ -^h/XvԱjQRkFGʚ)g?'y2M hsJG~U$9l󬵙C,j \K;oHQE%D:5?ԼRSZKjD;J[v>$N>Ӫ!9>yb^$G- Ǿ-OWt\ԐQZu'6xJ\ȶI?h%>@$׽>de|C9yhdIYayo(X_ Ӥqiօ"Z!1F7-VH UCq1>Q=7&dEeǃN=͍I%9r ",~=ںW#I*dC@ alQ5{ð 0佽 o站Ɣ+x ;I`TΆ :_aPW,5;Szӣ0rkrQZ]t\jZ%}F8<= 1X{TAܖiKNeVƻﶋB&?yŔ.jP!˘{I9+wɊ7"pGGZ~=x;Zu š ȹH`K8Ѫ!4fDrՒGDžʈ`̀EPu8 S>7e~i:GTd6k9ΙfZё 1N2 6}Yy dRwYvoQ "m &PՔ^YGN$ gy^?sKk?<%u vbil"TgG0pb6naO7yV5V)T93jS{#T"4:(tCm$yg;=YJ1 ZCKgDXƋBRa##l>@$ ɤPdsϧXF#nCO 0GC >G4^8q`}D! HBIJc4|c3'ތtVJ^[~]$RTZZ)\J`DpzO%T9G GXaj=ugd (٩6އσ"Ii1B{mu#"df }=Q')#<%4z5)LC N0BN!ey+?6ɤ^z&ڧt;#UΜ'=[|g~`h -J{Pr3=)Vs+)BY0>- _Ȉ;rL_g DψSwz!L dZ,;dy̅j NJm_.(&[р-mVo^P$]E0ׁ iKbD*:.s-/*Zᢗgyt.* z!g%Z䣏 ^B(cj#h|sl&ނgR Ge`Y.V Y5:h:XH\r, Aa=[W]uÏzj^b:Ci|@wd$/?iy ,ءȖ+i H2U|+7p`|-uêА{jEHT)ߌ̷X:1sVPHޯ,pZJ5hFA>ߍ> T?՟I \|1U,s~EVaV4〦RU+C#J0xW\{cOϲ],J'4ʹo6rŀ$?sɽͪ_ ݙ0 tXQ#@kq|3WzSoi Iae+Js{q؇JЕ`4|ܱE۳U3e As؜/ _H{%k æ,F(0AI{.[: ӑvL2h>R{xp"*WH("T< а&h뇜]OI.|ط93]$'<1A>L/zw}c ]ikz]ڊ8>˪8"9*e:I `qԨNHj^&MNX0 3vv?1'F={uzAn) 㬄X!#b4S6oJh=Dx-WӇ9ҲHPl˱ =yŗe_7&`7&9fwg5U`~+=q`bg+"ftGi9+N|N2oA&pCD_*zIM5BsUD9Ŷ\~8k!!1*f]pn#]O:V9m̶X*+^Mmk Iesr{=`HvR9{~QD5͸{akB:ä.M:*u%t vY[=JV#_xyEdP4UEB,wI`1٨?gi6ǭr('r{Abc}KNɦ ^gM|VNyWl?'PQ[D(Q:﫟DY%idG1F| &jD)Q-05>%ME7 VxД>~ЉP!;:.ko!VN>GHrj/X+e#=8țNwc.*Huϙ+H͕mR*  iydD؅|DŽ0^k$j_WszlCuXZFMI˹pX Sx1Q )VpP7 9I N)6-A>:e?={KQTV ;ެߺvzg9txQмj Cg6L73'=\ A!!;WpݻMdr+ە<g Y֓J4x*[,Ml &tձ<憃cwC`cQ3(tr AJN;VFh'M-afht ӕ˓~cq=BAqd{ς[w3B~]mL \% ЊJ Q i\9ϒy+ՍnjUgFl)꛷g=m&;4ubĎQX|w(wāxK[uIӷ>:}}G"qH,/WpHYӔ k3cx~̶Ui{1ЎQ~4ڤ^eٿ&Gs~l#v=}ZtS&!7/ĵ=.B( 4Pb*͈LsK1fG͹ȗsV$j~;B C8;҃ qRiLjI<XEҳB  Qdz)GS`znn"G(>z-$Nj(1{hFiʷ{ ]&Jq&0궪 TR ;Q _4GH wl2~Q^Q1vqJ)?c:Uw0{HRLj0ߩo3# xKs'i_ w~bfʉ!i>OdpD<9LbϭT|¤]޿g8ӏ5RmmJ-.sgA!aK\It\aD1v=qNSD_1lƺ>)2 >+}qmPRhlUN,C#39ݷЙ=9Ehil+|w O8 fNVĥ j")"oA5 ?)?"nZ53b,zGX#r7p1## , 3>_x8A`wl1av3[^ ;KGwSczsM@3F' x{I1{쬅 ܹ*6t,놷v+C7P:H;t$ԏvS"e6u)[[׸SNNg9ُ|f B044d|PJ)/=' =Vߦ3tB,4}d$. 粆(e>ܘwUL k: 1 ;҅XhJ:8=!7-oQ^e~`^Rvjklgz/}Y,^Y;_橲6%fѣ5&Y5d azGTlB}jͮXԕpw]qx#($ܩ(EeF+H)~;TqZZ9ZķjwP]j2Z:GIP endstream endobj 166 0 obj << /Length1 1712 /Length2 8742 /Length3 0 /Length 9856 /Filter /FlateDecode >> stream xڍT.LPJǀ"-0 0R%4(H!xѽ_5k=o23hrH[9ZBaNnQ̬EC &pqɁv0 rs. B@G,"_S0+GDD;PA0:a q :x*n@8rqq\86YفnP-PBj e `B]un 8xC˽f*5 2`] 'Ͽ;;:8`P jj*q"@! ڃ, 0N :!\8]S0+YG O Wg`n0k(wVH'.} Q@@nnna> qrgO\@ x% F-!6P0/p;Є~xܿ?gz?^V0{KUHWSqtzq9x@AaA&2("j;BO/A7߿F )  #D܏ʪCH*#@k w. Pw3W h9@ 7 lw7\ r6< h{x 8#^"ZAL0戸wgv~7Tȥ#@H:Kb*[͙?D =%/Dy#>%/p;DfO{ v_\i9s=M3XÆo_$i;ݏ$x埚Kn \F_E٫Ks#!w0? ~UJڍckDby0kފ&N`L \K'w=Xڐz&@;9^yV `nh74zR޷vM*YHaBKE%Cg+U~LpDyP8Ŝm>MyFrN4uv>I9^% =/x7jsLץҘdhKf7Q|֫ͪl7+'3H+CqrEP> ,yQOfx C,rŷ@Gj5;lҝVMZ6{ Зyb2l?댚X2YkRH7m ҇!RR.IN ݋IbWl?"~g9lL9hAw+b `[qN^/?N6f H%䑕~e;7'x!FU?uj"2HϐϘgg9 Eg|Ғ|:yܦ^4in}JO -yqļG @ZCvG1'a;ϰ1QM~-(3Y(tlrU_O?,_vNjʜo)dMͩ jȉN&|xٗΰXYQ \mchY+c1" ],K;pUmׯNAK?jV8l_5&Oat Y{'sܩ|l(0RrMGjYټ{$&My0\7ƹLpk`8R|ٌHY^bٸg _03<^JD5D_XMyjxEnfDi((]kr:; E{7k^3qV.u;uTSmWʸC}ld B6s?ƤaSp.f]cs'˟&y&$FZ{2<-q]6F~\E1f4֗ϼv+8EAj~E#7o@lx:{ګ} BZѾ`;x0A~a*5JMxtHprOrŝTqWa`fƹEJYbO̽w&kJʻ۽|E)*D;% 6gb:a|6YE>hPtJiNp|GJMVv-sTT(iCLir#Mv$ٗq  Uqf5y+8V**!U=G'Fo i31LF'kt]z3湂c 'gn=l| e/\WٔhCns 8-B)/o۰F^-z]<,&:lWz#Ya`c@Δc/ y9y串na}J1JO PW`אʪ.#TnVNJ~~8EFq+*@U8Thׯt%eZ1aP&%,Tg',$ '#+V ϯ~~K,?Y|ґS SvF#L}HZQ{_ڪ(!Q}sz0 EmNhgecW=[HS,efh8|U0 >kIYQlh^D,1 ea,/֐w湞CO%}v,^skrsΨ a% SNX@S=ΰ<|%坞?k)/뉈Fo5Oo11ˣ~Xvބj∶_nqVq5ٔ5eË_-D8]f0-GzصkbmNc dLͪ?J]R*au+Hwy.X0UWJDpLIlu44LpR`}Qb͗|]=ԌWGI!Bj( ͆PFc $ K~0bg pmrwtO@ 4 %b9kjHYi7_T;Ks=80\IOHO8 1KZ~h!;UKJ|b PSZ`W)Cz;O0"~NL!ՈNj4+֞dmֵsjKe ]~^߱d<C9}{N7|:7D &II,rwUګJ@їO"-@QAM^Y1c,ܷM- +yL FpzyEyi,R^peU$兏`u Pd{m?(|{\'"^38Mح5p~8E~.4ܔYom{.n3NΓ<|dd֘ZrJ͆.j%NLgس='RhO$X_Iyѕy3DOS3Q;^`/e;&D+]PLLCXPdv@3rRq)O>cOgE2)k͉O|ۿ)Z+~/Ȟ_'Q psɜd)a _wCS{|E (Ùְy1Z244BE^◚3%`U"o]ŏg5Hs~*R qbk(4>I)V*FZ^X`Hn['0Y ԫML p=+> `wK8on|:GU~41GKгRcCx!l G='ڮqvސe i5([Vr׈~`N#old\EVg̛.UM8'k}}yvBy 9dv8ovSo ;㦜4:ZrމOUoha67RäJ di hqd?uIT[R_UW[2?=kxu7%lY'E8S|=?vGlq֠)M8]ܼOT}IxNR(ʺ-l2߫;I\?zf1[7JXZ&/oP7AT3.L7AN؊3LkTDYi ~ÜNTBluSlB]zSa\9q9 7 OXu+]5"j!Ai!}2]=<3?.쓸Tz_FHʇ_N~<) 5epI_RġfmE|2Y3niVf"x7(˶69]4HBͣ{!} =wɌN4]/[7bTVsA6$S".:27 <&= acch@h}AwMFvhrL Ǻ;Z4pm X&A^Y}'s3"6oV+%ESMwb s" H^/?ҰhEX1N'LOm4H\9|v6y0h CP Ϊ3 mМ8ܒppH5Ov)YlHH;L6SfAq9(o^YÆStfo",l..ͮ.h93ihχZ]V72eȚڽZ &xHNd'ZG1Zu hc+Z/&_sCӮ:HSXI2z1^X$ET0:$iLŝjn-ĦPpW4Qݎ i 8.ؚ`(Ib% .u 1Agmu w=rkj>͗\6yqdJKqľπǥ 4ٖR!$a\lW[E i?0Ґ@p Q0i[eqS2W.-`yYMbYt5uvMQ% 2Հ},m1["sq:Jm &(/֖#-}2+,U`ZǑ;7nvאLH(nEpp6_4}1d'#Dډ̌ZH@&JRP>q-]7<q㣡 }MM YtLzJS7R&3druq)r3KPdsl!kQJ|q|m~O}'mOh:yE!|*fT;xu:^v炶+HzaEw^_H-=6 ~Y]%xIAc׮Uv }#]8tٓZfP 7hmUWJ7Xhk$WNؒ1*+$g͉)XZFHK&C˳J5^HR 0XKPX;1#|^?΋3MU]ąəaXzxFdɇ3v[j G@ˤ$2FUGfjJhO{UǘY>([)R%lsn$cstnnH4A!BPW1ESګ&x 7.,nfr0 Uҹ\>D}o];,qO:{>Fu;Mx >dwvС?kȸ*7^2ȠQ]Ԯ;h.qXrT\1R"?3 wn yvbM3'Wlz;:O ONꨴެCGu;q䧼fs =n?Ej^dj҇5 (G Kp%il ws B<;*sdi ы0 4,$p3+OS}_ OWR7"W(K'z*~ i_͆nI J*|vz/J"l] 'ǍUׁ,izIXǘ@`w%T2W —(>nYv_uVج.0`J—R/ٗJ0 qKSGݽ;gǩ3ZK~5| ZQ$Q٭$Xi<žbְrBpjߺKo ,7B`{ ˹kqgCٟڂX4G xqRY^;ߔ# 󋏓ds^ZfbRhDJ1~_g.ksdlY/eZebewe)1g`mV8uy4r+u| XVs~.n۽٘=e- Z.b7H_nSYi98ߧa[C_ѾXk^V.V>u`n点'ԉ&"Ѐh1l ' r?3R+K@ N-ad)Z> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 137 0 obj << /Type /ObjStm /N 60 /First 513 /Length 3112 /Filter /FlateDecode >> stream xڭZo۸߶xSbMf$m+[Ij[YI!%YiD1oCR  K4Ia$6`( FB.V#"NܪS-K"B"9kF4HmaJ+"!JrlD!L* hơ|-"F4 iiYx[脚1LHsbX@B S0$68 iU) 2 ) ˹ o/qtsSЁGZXN Ca3 h` C;YH[(C rQY1D)5 OnBx,(K9 u<>F0o<īYTZO'90oaCg* ~]3E[6( vHa8:Ҳ'at9_9R/+' x~5C+GNXF=7ڊ)_(CԞBlkiz|?W9Zi&, Q+ 9QrjÀS;C w$օX$mXZG+-R0yŌ9K+Ӹ$ ۺV|cqB Iw)Vrђύ@#|*9kjO! .{J3f$aS0tOHN)ۈ㴦iUds -T SJlP4$ԭ>YJlX< =}5ant!"B硅5 +Ө1K2J[$1츿XG:a{o';ըF#%1( a38ڊz(\jZ?/!kܜGȷ?FCLQ(|%E\<̛/Oj0>r"=^||(<箈1ӈxQECE-8I͒nYwsuUdGe\gFtB3}V%`W?+tz+ɽWL_^W7WFsZu K_p(߯V=O!=W(^+ץt. 1 u?_.3zGi!9]Д>Ї8K)g,-|+C;<_S_W~o+w߸.r\ V7li _5o yvbi,j[e+cwȮ_VEډϯ^㢺<ṁZVrLxKʝĢcv﯎?8`pE(0B5 !6lg.nhKkXKf, 7pc>̖y 8/r1|f1{2{b}9qg\'v7S۞lUN8_=P8ԩ?VgYyhgRޓVrJoU{_?xqN] G ȟ*+ԥwk'v'g_k\5Oǝ WZy ]}tŽUxWG# mUO.N~<• V̈́rWj], ˟Gև`zUUKn۫~W]=g ;7vZڛ]aW ʕYO}VlnLo[n7@f{IW}/8ֿt %-s뜖Í6ˍ^{Q{yثŠE{g`ybWA?A}K<J}35zYuS{o ~{g.aO&Sج}q#ֿBoPl-6CL#ZKŘp.)LMS |?Nf-֒sv9Y)0gaab bxSk*bbggto,@=e5ܼ w%jaNքp3V\cfpLm&ކIu!xj^cl- 4}vN_QVOg/nӴX{vA;(vKAC²"гd+Z&֕npwG4GKӠUS3eAE׳Ӎ(>e<;8iD{OyP{ > tC# x[$9VUb:f$'yȔwIx1-T!|uU4Rm2l,9PM;2ŋ8*HfI^8mo'2\#a\ܕŽ+/{։'F;lQJ9|,7 l|g&/R"MggVk,*oH=ˇUz%7W5@nxحbS7Ye?&KãËMr20ana6!mf  Tc@*ڄ̶Ub{.W6IoA5 ]|^Vj_wjХZ0\UqjS`L  -O:uyjwwy5|7mhCUJOiK3Gs"w#' ] /Length 449 /Filter /FlateDecode >> stream x%ӹVSQOB$JQ1A  Z66>.,m| *KZv>l~Ι%dnӇFxB P&eSAj&`HGj,ܢv9C*) ! EV&R1A jI]pt=p,,& %A}d ~`Ж(% -!zr]Tt .t>]:sFajPup2W5I<rafa``Vk:l3x/a 7Mm܁]؃}x bbŌU?3n>+5}))5>TSjv_+e?VZrJ+JF<-WjiLG(=B *Э=5J=y\