surveillance/0000755000176000001440000000000012242705203012773 5ustar ripleyuserssurveillance/inst/0000755000176000001440000000000012242645665013767 5ustar ripleyuserssurveillance/inst/CITATION0000644000176000001440000000667712143006164015125 0ustar ripleyusers citHeader("Some guidelines for citing package", sQuote("surveillance"), "in publications:") ### Default citation of R packages # if (!exists("meta") || is.null(meta)) # meta <- packageDescription("surveillance") # year <- sub(".*(2[[:digit:]]{3})-.*", "\\1", meta$Date) # vers <- paste("R package version", meta$Version) # title <- paste(meta$Package, ": ", meta$Title, sep = "") # citEntry( # entry = "Manual", # title = title, # author = as.personList(meta$Author), # year = year, # note = vers, # url = meta$URL, # textVersion = paste(meta$Author, " (", year, "). ", title, ". ", # vers, ". ", meta$URL, sep = "") # ) ### For hhh4: Article in Statistics in Medicine (2011) citEntry( header = "If hhh4() is used, cite:", entry = "Article", author = personList(as.person("Michaela Paul"), as.person("Leonhard Held")), title = "Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts", journal = "Statistics in Medicine", issn = "1097-0258", year = "2011", volume = "30", number = "10", pages = "1118--1136", doi = "10.1002/sim.4177", textVersion = paste( "Paul, M. and Held, L. (2011).", "Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts.", "Statistics in Medicine, 30(10), 1118-1136.", "doi: 10.1002/sim.4177") ) ### For twinstim: Article in Biometrics (2012) citEntry( header = "If twinstim() is used, cite:", entry = "Article", author = personList(as.person("Sebastian Meyer"), as.person("Johannes Elias"), as.person("Michael Hhle")), title = "A space-time conditional intensity model for invasive meningococcal disease occurrence", journal = "Biometrics", issn = "1541-0420", year = "2012", volume = "68", number = "2", pages = "607--616", doi = "10.1111/j.1541-0420.2011.01684.x", textVersion = paste( "Meyer, S., Elias, J. and Hhle, M. (2012).", "A space-time conditional intensity model for invasive meningococcal disease occurrence.", "Biometrics, 68(2), 607-616.", "doi: 10.1111/j.1541-0420.2011.01684.x") ) ### For twinSIR: Article in Biometrical Journal (2009) citEntry( header = "If twinSIR() is used, cite:", entry = "Article", author = as.person("Michael Hhle"), title = "Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics", journal = "Biometrical Journal", issn = "0323-3847", year = "2009", volume = "51", number = "6", pages = "961--978", doi = "10.1002/bimj.200900050", textVersion = paste( "M. Hhle (2009).", "Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics.", "Biometrical Journal, 51(6), 961--978.", "doi: 10.1002/bimj.200900050") ) ### Otherwise: Article in Computational Statistics (2007) citEntry( header = "For many of the algo.* functions, the appropriate citation is:", entry = "Article", title = "surveillance: An {R} package for the monitoring of infectious diseases", author = as.person("Michael Hhle"), journal = "Computational Statistics", year = "2007", volume = "22", number = "4", pages = "571--582", textVersion = paste( "M. Hhle (2007).", "surveillance: An R package for the monitoring of infectious diseases.", "Computational Statistics, 22(4), 571--582.", "doi: 10.1007/s00180-007-0074-8") ) citFooter("In general, the references given in the help pages of the respective main functions should be used.") surveillance/inst/NEWS.Rd0000644000176000001440000011310412242634744015026 0ustar ripleyusers\newcommand{\CRANpkg}{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} %% some pre-defined commands: \R, \code, \acronym, \url, \file, \pkg \name{NEWS} \title{News for Package 'surveillance'} \encoding{latin1} \section{Changes in surveillance version 1.7-0 (2013-11-19)}{ \subsection{SYNOPSIS}{ \itemize{ \item Package \CRANpkg{gpclib} is no longer necessary for the construction of \code{"epidataCS"}-objects. Instead, we make use of the new dedicated package \CRANpkg{polyclip} (licensed under the BSL) for polygon clipping operations (via \code{spatstat::intersect.owin()}). This results in a slightly different \code{$events$.influenceRegion} component of \code{"epidataCS"} objects, one reason being that \pkg{polyclip} uses integer arithmetic. Change of \code{twinstim()} estimates for a newly created \code{"epidataCS"} compared with the same data prepared in earlier versions should be very small (e.g., for \code{data("imdepifit")} the mean relative difference of coefficients is 3.7e-08, while the \code{logLik()} is \code{all.equal()}). As an alternative, \pkg{rgeos} can still be chosen to do the polygon operations. \item The \pkg{surveillance}-internal code now depends on \R >= 2.15.2 (for \code{nlminb()} \code{NA} fix of PR#15052, consistent \code{rownames(model.matrix)} of PR#14992, \code{paste0()}, \code{parallel::mcmapply()}). However, the required recent version of \pkg{spatstat} (1.34-0, for \pkg{polyclip}) actually needs \R >= 3.0.2, which therefore also applies to \pkg{surveillance}. \item Some minor new features and changes are documented below. } } \subsection{NEW FEATURES}{ \itemize{ \item Functions \code{unionSpatialPolygons()} and \code{intersectPolyCircle()} are now exported. Both are wrappers around functionality from different packages supporting polygon operations: for determining the union of all subpolygons of a \code{"SpatialPolygons"} object, and the intersection of a polygonal and a circular domain, respectively. \item \code{discpoly()} moved back from \CRANpkg{polyCub} to \pkg{surveillance}. } } \subsection{MINOR CHANGES}{ \itemize{ \item \pkg{surveillance} now Depends on \CRANpkg{polyCub} (>= 0.4-0) and not only Imports it (which avoids \code{::}-references in .GlobalEnv-made functions). \item Nicer default axis labels for \code{iafplot()}. \item For \code{twinstim()}, the default is now to \code{trace} every iteration instead of every fifth only. \item Slightly changed default arguments for \code{plot.epidata()}: \code{lwd} (1->2), \code{rug.opts} (\code{col} is set according to \code{which.rug}) \item \code{twinstim()} saves the vector of \code{fixed} coefficients as part of the returned \code{optim.args} component, such that these will again be held fixed upon \code{update()}. \item The \code{plot}-method for \code{hhh4()}-fits allows for region selection by name. } } } \section{Changes in surveillance version 1.6-0 (2013-09-03)}{ \subsection{SYNOPSIS}{ \itemize{ \item The \code{polyCub}-methods for cubature over polygonal domains have been moved to the new dedicated package \CRANpkg{polyCub}, since they are of a rather general use. The \code{discpoly()} function has also been moved to that package. \item As a replacement for the license-restricted \pkg{gpclib} package, the \pkg{rgeos} package is now used by default (\code{surveillance.options(gpclib=FALSE)}) in generating \code{"epidataCS"} (polygon intersections, slightly slower). Therefore, when installing \pkg{surveillance} version 1.6-0, the system requirements for \CRANpkg{rgeos} have to be met, i.e., GEOS must be available on the system. On Linux variants this means installing \file{libgeos} (\file{libgeos-dev}). \item The improved Farrington method described in Noufaily et al. (2012) is now available as function \code{farringtonFlexible()}. \item New handling of reference dates in \code{algo.farrington()} for \code{"sts"} objects with \code{epochAsDate=TRUE}. Instead of always going back in time to the next Date in the \code{"epoch"} slot, the function now determines the \emph{closest} Date. Note that this might lead to slightly different results for the upperbound compared to previously. Furthermore, the functionality is only tested for weekly data (monthly data are experimental). The same functionality applies to \code{farringtonFlexible()}. \item To make the different retrospective modelling frameworks of the \pkg{surveillance} package jointly applicable, it is now possible to convert (aggregate) \code{"epidataCS"} (continuous-time continuous-space data) into an \code{"sts"} object (multivariate time series of counts) by the new function \code{epidataCS2sts}. \item Simulation from \code{hhh4} models (class \code{"ah4"}) has been re-implemented, which fixes a bug and makes it more flexible and compatible with a wider class of models. \item The \code{map}-slot of the \code{"sts"} class now requires \code{"SpatialPolygons"} (only) instead of \code{"SpatialPolygonsDataFrame"}. \item Re-implementation of \code{oneStepAhead()} for \code{hhh4}-models with a bug fix, some speed-up and more options. \item Slight speed-up for \code{hhh4()} fits, e.g., by more use of \code{.rowSums()} and \code{.colSums()}. \item Crucial speed-up for \code{twinstim()} fits by more efficient code: \code{mapply}, dropped clumsy \code{for}-loop in \code{fisherinfo}, new argument \code{cores} for parallel computing via forking (not available on Windows). \item Some further new features, minor changes, and bug fixes are described in the following subsections. } } \subsection{NEW FEATURES}{ \itemize{ \item Using \code{tiaf.exponential()} in a \code{twinstim()} now works with \code{nTypes=1} for multi-type data. \item A legend can be added automatically in \code{iafplot()}. \item The \code{untie} methods are now able to produce jittered points with a required minimum separation (\code{minsep}). \item \code{simulate.ah4} gained a \code{simplify} argument. \item New \code{update}-method for fitted \code{hhh4}-models (class \code{"ah4"}). \item \code{oneStepAhead()} has more options: specify time range (not only start), choose type of start values, \code{verbose} argument. \item \code{pit()} allows for a list of predictive distributions (\code{pdistr}), one for each observation \code{x}. \item New spatial auxiliary function \code{polyAtBorder()} indicating polygons at the border (for a \code{"SpatialPolygons"} object). \item \code{animate.epidataCS()} allows for a \code{main} title and can show a progress bar. } } \subsection{MINOR CHANGES}{ \itemize{ \item Changed parametrization of \code{zetaweights()} and completed its documentation (now no longer marked as experimental). \item \code{twinstim(...)$converged} is \code{TRUE} if the optimization routine converged (as before) but contains the failure message otherwise. \item Increased default \code{maxit} for the Nelder-Mead optimizer in \code{hhh4} from 50 to 300, and removed default artificial lower bound (-20) on intercepts of epidemic components. \item Renamed returned list from \code{oneStepAhead} (mean->pred, x->observed, params->coefficients, variances->Sigma.orig) for consistency, and \code{oneStepAhead()$psi} is only non-\code{NULL} if we have a NegBin model. \item Argument order of \code{pit()} has changed, which is also faster now and got additional arguments \code{relative} and \code{plot}. \item \code{twinstim(...)$runtime} now contains the complete information from \code{proc.time()}. } } \subsection{BUG FIXES}{ \itemize{ \item Fixed a bug in function \code{refvalIdxByDate()} which produced empty reference values (i.e. \code{NA}s) in case the Date entries of \code{epoch} were not mondays. Note: The function works by subtracting \code{1:b} years from the date of the range value and then takes the span \code{-w:w} around this value. For each value in this set it is determined whether the closest date in the epoch slot is obtained by going forward or backward. Note that this behaviour is now slightly changed compared to previously, where we \emph{always} went back in time. \item \code{algo.farrington()}: Reference values too far back in time and hence not being in the \code{"epoch"} slot of the \code{"sts"} object are now ignored (previously the resulting \code{NA}s caused the function to halt). A warning is displayed in this case. \item \code{hhh4}: The entry \eqn{(5,6)} of the marginal Fisher information matrix in models with random intercepts in all three components was incorrect. If \code{nlminb} was used as optimizer for the variance parameters (using the negative marginal Fisher information as Hessian), this could have caused false convergence (with warning) or minimally biased convergence (without warning). As a consequence, the \code{"Sigma.cov"} component of the \code{hhh4()} result, which is the inverse of the marginal Fisher information matrix at the MLE, was also wrong. \item \code{untie.matrix()} could have produced jittering greater than the specified \code{amount}. \item \code{hhh4}: if there are no random intercepts, the redundant \code{updateVariance} steps are no longer evaluated. \item \code{update.twinstim()} did not work with \code{optim.args=..1} (e.g., if updating a list of models with lapply). Furthermore, if adding the \code{model} component only, the \code{control.siaf} and \code{optim.args} components were lost. \item \code{earsC} should now also work with multivariate \code{sts} time-series objects. \item The last week in \code{data(fluBYBW)} (row index 417) has been removed. It corresponded to week 1 in year 2009 and was wrong (an artifact, filled with zero counts only). Furthermore, the regions in \code{@map} are now ordered the same as in \code{@observed}. \item Fixed start value of the overdispersion parameter in \code{oneStepAhead} (must be on internal log-scale, not reparametrized as returned by \code{coef()} by default). \item When subsetting \code{"sts"} objects in time, \code{@start} was updated but not \code{@epoch}. \item \code{pit} gave \code{NA} results if any \code{x[-1]==0}. \item The returned \code{optim.args$par} vector in \code{twinstim()} was missing any fixed parameters. \item \code{hhh4()} did not work with time-varying neighbourhood weights due to an error in the internal \code{checkWeightsArray()} function. } } } \section{Changes in surveillance version 1.5-4 (2013-04-21)}{ \subsection{SYNOPSIS}{ \itemize{ \item Fixed obsolete \code{.path.package()} calls. \item Small corrections in the documentation. \item \code{update.twinstim()} performs better in preserving the original initial values of the parameters. \item New pre-defined spatial interaction function \code{siaf.powerlawL()}, which implements a _L_agged power-law kernel, i.e. accounts for uniform short-range dispersal. } } } \section{Changes in surveillance version 1.5-2 (2013-03-15)}{ \subsection{SYNOPSIS}{ \itemize{ \item New method for outbreak detection: \code{earsC} (CUSUM-method described in the CDC Early Aberration Reporting System, see Hutwagner et al, 2003). \item New features and minor bug fixes for the "\code{twinstim}" part of the package (see below). \item Yet another p-value formatting function \code{formatPval()} is now also part of the \pkg{surveillance} package. \item \code{polyCub.SV()} now also accepts objects of classes \code{"Polygon"} and \code{"Polygons"} for convenience. \item \code{siaf.lomax} is deprecated and replaced by \code{siaf.powerlaw} (re-parametrization). } } \subsection{NEW FEATURES (\code{twinstim()}-related)}{ \itemize{ \item The temporal \code{plot}-method for class \code{"epidataCS"} now understands the \code{add} parameter to add the histogram to an existing plot window, and auto-transforms the \code{t0.Date} argument using \code{as.Date()} if necessary. \item \code{nobs()} methods for classes \code{"epidataCS"} and \code{"twinstim"}. \item New argument \code{verbose} for \code{twinstim()} which, if set to \code{FALSE}, disables the printing of information messages during execution. \item New argument \code{start} for \code{twinstim()}, where (some) initial parameter values may be provided, which overwrite those in \code{optim.args$par}, which is no longer required (as a naive default, a crude estimate for the endemic intercept and zeroes for the other parameters are used). \item Implemented a wrapper \code{stepComponent()} for \code{step()} to perform algorithmic component-specific model selection in \code{"twinstim"} models. This also required the implementation of suitable \code{terms()} and \code{extractAIC()} methods. The single-step methods \code{add1()} and \code{drop1()} are also available. \item The \code{update.twinstim()} method now by default uses the parameter estimates from the previous model as initial values for the new fit (new argument \code{use.estimates = TRUE}). \item \code{as.epidataCS()} checks for consistency of the area of \code{W} and the (now really obligatory) area column in \code{stgrid}. \item \code{simulate.twinstim()} now by default uses the previous \code{nCircle2Poly} from the \code{data} argument. \item \code{direction} argument for \code{untie.epidataCS()}. \item The \code{toLatex}-method for \code{"summary.twinstim"} got different defaults and a new argument \code{eps.Pvalue}. \item New \code{xtable}-method for \code{"summary.twinstim"} for printing the covariate effects as risk ratios (with CI's and p-values). } } \subsection{NEW FEATURES (\code{hhh4()}-related)}{ \itemize{ \item New argument \code{hide0s} in the \code{plot}-method for class \code{"ah4"}. \item New argument \code{timevar} for \code{addSeason2formula()}, which now also works for long formulae. } } } \section{Changes in surveillance version 1.5-1 (2012-12-14)}{ \subsection{SYNOPSIS}{ \itemize{ \item The \pkg{surveillance} package is again backward-compatible with \R version 2.14.0, which is now declared as the minimum required version. } } } \section{Changes in surveillance version 1.5-0 (2012-12-12)}{ \subsection{SYNOPSIS}{ \itemize{ \item This new version mainly improves upon the \code{twinstim()} and \code{hhh4()} implementations (see below). \item As requested by the CRAN team, examples now run faster. Some are conditioned on the value of the new package option \code{"allExamples"}, which usually defaults to \code{TRUE} (but is set to \code{FALSE} for CRAN checking, if timings are active). \item Moved some rarely used package dependencies to \dQuote{Suggests:}, and also removed some unused packages from there. \item Dropped strict dependence on \CRANpkg{gpclib}, which has a restricted license, for the \pkg{surveillance} package to be clearly GPL-2. Generation of \code{"epidataCS"} objects, which makes use of \pkg{gpclib}'s polygon intersection capabilities, now requires prior explicit acceptance of the \pkg{gpclib} license via setting \code{surveillance.options(gpclib = TRUE)}. Otherwise, \code{as.epidataCS()} and \code{simEpidataCS()} may not be used. } } \subsection{NEW FEATURES (\code{twinstim()}-related)}{ \itemize{ \item Speed-up by memoisation of the \code{siaf} cubature (using the \CRANpkg{memoise} package). \item Allow for \code{nlm}-optimizer (really not recommended). \item Allow for \code{nlminb}-specific control arguments. \item Use of the expected Fisher information matrix can be disabled for \code{nlminb} optimization. \item Use of the \code{effRange}-trick can be disabled in \code{siaf.gaussian()} and \code{siaf.lomax()}. The default \code{effRangeProb} argument for the latter has been changed from 0.99 to 0.999. \item The \code{twinstim()} argument \code{nCub} has been replaced by the new \code{control.siaf} argument list. The old \code{nCub.adaptive} indicator became a feature of the \code{siaf.gaussian()} generator (named \code{F.adaptive} there) and does no longer depend on the \code{effRange} specification, but uses the bandwidth \code{adapt*sd}, where the \code{adapt} parameter may be specified in the \code{control.siaf} list in the \code{twinstim()} call. Accordingly, the components \code{"nCub"} and \code{"nCub.adaptive"} have been removed from the result of \code{twinstim()}, and are replaced by \code{"control.siaf"}. \item The \code{"method"} component of the \code{twinstim()} result has been replaced by the whole \code{"optim.args"}. \item The new \code{"Deriv"} component of \code{siaf} specifications integrates the \dQuote{siaf$deriv} function over a polygonal domain. \code{siaf.gaussian()} and \code{siaf.lomax()} use \code{polyCub.SV()} (with intelligent \code{alpha} parameters) for this task (previously: midpoint-rule with naive bandwidth) \item \code{scaled} \code{iafplot()} (default \code{FALSE}). The \code{ngrid} parameter has been renamed to \code{xgrid} and is more general. \item The \code{"simulate"} component of \code{siaf}'s takes an argument \code{ub} (upperbound for distance from the source). \item Numerical integration of spatial interaction functions with an \code{Fcircle} trick is more precise now; this slightly changes previous results. \item New \acronym{S3}-generic \code{untie()} with a method for the \code{"epidataCS"} class (to randomly break tied event times and/or locations). \item Renamed \code{N} argument of \code{polyCub.SV()} to \code{nGQ}, and \code{a} to \code{alpha}, which both have new default values. The optional polygon rotation proposed by Sommariva & Vianello is now also implemented (based on the corresponding MATLAB code) and available as the new \code{rotation} argument. \item The \code{scale.poly()} method for \code{"gpc.poly"} is now available as \code{scale.gpc.poly()}. The default return class of \code{discpoly()} was changed from \code{"gpc.poly"} to \code{"Polygon"}. \item An \code{intensityplot()}-method is now also implemented for \code{"simEpidataCS"}. } } \subsection{NEW FEATURES (\code{hhh4()}-related)}{ \itemize{ \item Significant speed-up (runs about 6 times faster now, amongst others by many code optimizations and by using sparse \CRANpkg{Matrix} operations). \item \code{hhh4()} optimization routines can now be customized for the updates of regression and variance parameters seperately, which for instance enables the use of Nelder-Mead for the variance updates, which seems to be more stable/robust as it does not depend on the inverse Fisher info and is usually faster. \item The \code{ranef()} extraction function for \code{"ah4"} objects gained a useful \code{tomatrix} argument, which re-arranges random effects in a unit x effect matrix (also transforming CAR effects appropriately). \item Generalized \code{hhh4()} to also capture parametric neighbourhood weights (like a power-law decay). The new function \code{nbOrder()} determines the neighbourhood order matrix from a binary adjacency matrix (depends on package \CRANpkg{spdep}). \item New argument \code{check.analyticals} (default \code{FALSE}) mainly for development purposes. } } \subsection{BUG FIXES}{ \itemize{ \item Fixed sign of observed Fisher information matrix in \code{twinstim}. \item Simulation from the Lomax kernel is now correct (via polar coordinates). \item Fixed \code{modifyListcall()} to also work with updated \code{NULL} arguments. \item Fixed wrong Fisher information entry for the overdispersion parameter in \code{hhh4}-models. \item Fixed wrong entries in penalized Fisher information wrt the combination fixed effects x CAR intercept. \item Fixed indexing bug in penalized Fisher calculation in the case of multiple overdispersion parameters and random intercepts. \item Fixed bug in Fisher matrix calculation concerning the relation of unit-specific and random effects (did not work previously). \item Improved handling of non-convergent / degenerate solutions during \code{hhh4} optimization. This involves using \code{ginv()} from package \CRANpkg{MASS}, if the penalized Fisher info is singular. \item Correct labeling of overdispersion parameter in \code{"ah4"}-objects. \item Some control arguments of \code{hhh4()} have more clear defaults. \item The result of \code{algo.farrington.fitGLM.fast()} now additionally inherits from the \code{"lm"} class to avoid warnings from \code{predict.lm()} about fake object. \item Improved \file{NAMESPACE} imports. \item Some additional tiny bug fixes, see the subversion log on R-Forge for details. } } } \section{Changes in surveillance version 1.4-2 (2012-08-17)}{ \subsection{SYNOPSIS}{ \itemize{ \item This is mainly a patch release for the \code{twinstim}-related functionality of the package. \item Apart from that, the package is now again compatible with older releases of \R (< 2.15.0) as intended (by defining \code{paste0()} in the package namespace if it is not found in \R \pkg{base} at installation of the \pkg{surveillance} package). } } \subsection{NEW FEATURES}{ \itemize{ \item Important new \code{twinstim()}-feature: fix parameters during optimization. \item Useful \code{update}-method for \code{"twinstim"}-objects. \item New \code{[[}- and \code{plot}-methods for \code{"simEpidataCSlist"}-objects. \item \code{simEpidataCS()} received tiny bug fixes and is now able to simulate from epidemic-only models. \item \code{R0}-method for \code{"simEpidataCS"}-objects (actually a wrapper for \code{R0.twinstim()}). \item Removed \code{dimyx} and \code{eps} arguments from \code{R0.twinstim()}; now uses \code{nCub} and \code{nCub.adaptive} from the fitted model and applies the same (numerical) integration method. \item \code{animate.epidata} is now compatible with the \CRANpkg{animation} package. \item More thorough documentation of \code{"twinstim"}-related functions \emph{including many examples}. } } \subsection{BUG FIXES (\code{"twinstim"}-related)}{ \itemize{ \item \code{nlminb} (instead of \code{optim}'s \code{"BFGS"}) is now the default optimizer (as already documented). \item The \code{twinstim}-argument \code{nCub} can now be omitted when using \code{siaf.constant()} (as documented) and is internally set to \code{NA_real_} in this case. Furthermore, \code{nCub} and \code{nCub.adaptive} are set to \code{NULL} if there is no epidemic component in the model. \item \code{toLatex.summary.twinstim} now again works for \code{summary(*, test.iaf=FALSE)}. \item \code{print}- and \code{summary}-methods for \code{"epidataCS"} no longer assume that the \code{BLOCK} index starts at 1, which may not be the case when using a subset in \code{simulate.twinstim()}. \item The \code{"counter"} step function returned by \code{summary.epidataCS()} does no longer produce false numbers of infectives (they were lagged by one timepoint). \item \code{plot.epidataCS()} now resolves \dots correctly and the argument \code{colTypes} takes care of a possible \code{subset}. \item \code{simEpidataCS()} now also works for endemic-only models and is synchronised with \code{twinstim()} regarding the way how \code{siaf} is numerically integrated (including the argument \code{nCub.adaptive}). \item Fixed problem with \code{simEpidataCS()} related to missing \file{NAMESPACE} imports (and re-exports) of \code{marks.ppp} and \code{markformat.default} from \CRANpkg{spatstat}, which are required for \code{spatstat::runifpoint()} to work, probably because \pkg{spatstat} currently does not register its S3-methods. \item Improved error handling in \code{simEpidataCS()}. Removed a \code{browser()}-call and avoid potentially infinite loop. } } \subsection{BUG FIXES (\code{"twinSIR"}-related)}{ \itemize{ \item The \code{.allocate} argument of \code{simEpidata()} has now a fail-save default. \item Simulation without endemic \code{cox()}-terms now works. } } \subsection{MINOR CHANGES}{ \itemize{ \item Simplified \code{imdepi} data to monthly instead of weekly intervals in \code{stgrid} for faster examples and reduced package size. \item The environment of all predefined interaction functions for \code{twinstim()} is now set to the \code{.GlobalEnv}. The previous behaviour of defining them in the \code{parent.frame()} could have led to huge \code{save()}'s of \code{"twinstim"} objects even with \code{model=FALSE}. \item \code{simulate.twinSIR} only returns a list of epidemics if \code{nsim > 1}. \item \code{simulate.twinstim} uses \code{nCub} and \code{nCub.adaptive} from fitted object as defaults. \item Removed the \dots-argument from \code{simEpidataCS()}. \item The coefficients returned by \code{simEpidataCS()} are now stored in a vector rather than a list for compatibility with \code{"twinstim"}-methods. \item Argument \code{cex.fun} of \code{intensityplot.twinstim()} now defaults to the \code{sqrt} function (as in \code{plot.epidataCS()}. } } } \section{Changes in surveillance version 1.4 (2012-07-26)}{ \subsection{SYNOPSIS}{ \itemize{ \item Besides minor bug fixes, additional functionality has entered the package and a new attempt is made to finally release a new version on CRAN (version 1.3 has not appeared on CRAN), including a proper \file{NAMESPACE}. } } \subsection{NEW FEATURES}{ \itemize{ \item Support for non-parametric back-projection using the function \code{backprojNP()} which returns an object of the new \code{"stsBP"} class which inherits from \code{"sts"}. \item Bayesian nowcasting for discrete time count data is implemented in the function \code{nowcast()}. \item Methods for cubature over polygonal domains can now also visualize what they do. There is also a new quasi-exact method for cubature of the bivariate normal density over polygonal domains. The function \code{polyCub()} is a wrapper for the different methods. \item \code{residuals.twinstim()} and \code{residuals.twinSIR()}: extract the \dQuote{residual process}, see \cite{Ogata (1988)}. The residuals of \code{"twinSIR"} and \code{"twinstim"} models may be checked graphically by the new function \code{checkResidualProcess()}. \item Many new features for the \code{"twinstim"} class of self-exciting spatio-temporal point process models (see below). } } \subsection{NEW FEATURES AND SIGNIFICANT CHANGES FOR \code{"twinstim"}}{ \itemize{ \item Modified arguments of \code{twinstim()}: new ordering, new argument \code{nCub.adaptive}, removed argument \code{typeSpecificEndemicIntercept} (which is now specified as part of the \code{endemic} formula as \code{(1|type)}). \item Completely rewrote the \code{R0}-method (calculate \dQuote{trimmed} and \dQuote{untrimmed} \eqn{R_0} values) \item The \dQuote{trimmed} \code{R0} values are now part of the result of the model fit, as well as \code{bbox(W)}. The model evaluation environment is now set as attribute of the result if \code{model=TRUE}. \item New predefined spatial kernel: the Lomax power law kernel \code{siaf.lomax()} \item \code{plot}-methods for \code{"twinstim"} (\code{intensityplot()} and \code{iafplot()}) \item \code{as.epidataCS()} now auto-generates the stop-column if this is missing \item \code{print}-method for class \code{"summary.epidataCS"} \item \code{[}- and subset-method for \code{"epidataCS"} (subsetting \code{...$events}) \item \code{plot}-method for \code{"epidataCS"} } } \subsection{MINOR CHANGES}{ \itemize{ \item Improved documentation for the new functionalities. \item Updated references. \item \code{twinSIR}'s \code{intensityPlot} is now a method of the new S3-generic function \code{intensityplot}. } } } \section{Changes in surveillance version 1.3 (2011-04-25)}{ \subsection{SYNOPSIS}{ \itemize{ \item This is a major realease integrating plenty of new code (unfortunately not all documented as good as it could be). This includes code for the \code{"twinstim"} and the \code{"hhh4"} model. The \code{"twinSIR"} class of models has been migrated from package \CRANpkg{RLadyBug} to \pkg{surveillance}. It may take a while before this version will become available from CRAN. For further details see below. } } \subsection{SIGNIFICANT CHANGES}{ \itemize{ \item Renamed the \code{"week"} slot of the \code{"sts"} S4 class to \code{"epoch"}. All saved data objects have accordingly be renamed, but some hazzle is to be expected if one you have old \code{"sts"} objects stored in binary form. The function \code{convertSTS()} can be used to convert such \dQuote{old school} \code{"sts"} objects. \item Removed the functions \code{algo.cdc()} and \code{algo.rki()}. } } \subsection{NEW FEATURES}{ \itemize{ \item Support for \code{"twinSIR"} models (with associated \code{"epidata"} objects) as described in \cite{Hhle (2009)} has been moved from package \CRANpkg{RLadyBug} to \pkg{surveillance}. That means continuous-time discrete-space \acronym{SIR} models. \item Support for \code{"twinstim"} models as described in \cite{Meyer et al (2012)}. That means continuous-time continuous-space infectious disease models. \item Added functionality for non-parametric back projection (\code{backprojNP()}) and now-casting (\code{nowcast()}) based on \code{"sts"} objects. } } } \section{Changes in surveillance version 1.2-2}{ \itemize{ \item Replaced the deprecated getSpPPolygonsLabptSlots method with calls to the coordinates method when plotting the map slot. \item Minor proof-reading of the documentation. \item Added an argument \code{"extraMSMargs"} to the algo.hmm function. \item Fixed bug in \code{outbreakP()} when having observations equal to zero in the beginning. Here, \eqn{\hat{\mu}^{C1}} in (5) of \cite{Frisen et al (2008)} is zero and hence the log-based summation in the code failed. Changed to product as in the original code, which however might be less numerically stable. \item Fixed bug in stcd which added one to the calculated index of idxFA and idxCC. Thanks to Thais Rotsen Correa for pointing this out. } } \section{Changes in surveillance version 1.2-1 (2010-06-10)}{ \itemize{ \item Added \code{algo.outbreakP()} (\cite{Frisen & Andersson, 2009}) providing a semiparametric approach for outbreak detection for Poisson distributed variables. \item Added a pure \R function for extracting ISO week and year from Date objects. This function (isoWeekYear) is only called if "\%G" and "\%V" format strings are used on Windows (\code{sessionInfo()[[1]]$os == "mingw32"}) as this is not implemented for \code{"format.Date"} on Windows. Thanks to Ashley Ford, University of Warwick, UK for identifying this Windows specific bug. \item For \code{algo.farrington()} a faster fit routine \code{"algo.farrington.fitGLM.fast"} has been provided by Mikko Virtanen, National Institute for Health and Welfare, Finland. The new function calls \code{glm.fit()} directly, which gives a doubling of speed for long series. However, if one wants to process the fitted model output some of the GLM routines might not work on this output. For backwards compability the argument \code{control$fitFun = "algo.farrington.fitGLM"} provides the old (and slow) behaviour. } } \section{Changes in surveillance version 1.1-6 (2010-05-25)}{ \itemize{ \item A few minor bug fixes \item Small improvements in the C-implementation of the \code{twins()} function by Daniel Sabans Bov fixing the segmentation fault issue on 64-bit architectures. } } \section{Changes in surveillance version 1.1-2 (2009-10-15)}{ \itemize{ \item Added the functions categoricalCUSUM and LRCUSUM.runlength for the CUSUM monitoring of general categorical time series (binomial, beta-binomial, multinomial, ordered response, Bradley-Terry models). \item Added the functions pairedbinCUSUM and pairedbinCUSUM.runlength implementing the CUSUM monitoring and run-length computations for a paired binary outcome as described in Steiner et al. (1999). \item Experimental implementation of the prospective space-time cluster detection described in Assuncao and Correa (2009). \item Added a \code{demo("biosurvbook")} containing the code of an upcoming book chapter on how to use the surveillance package. This contains the description of ISO date use, negative binomial CUSUM, run-length computation, etc. From an applicational point of view the methods are illustrated by Danish mortality monitoring. \item Fixed a small bug in algo.cdc found by Marian Talbert Allen which resulted in the control$m argument being ignored. \item The constructor of the sts class now uses the argument \code{"epoch"} instead of weeks to make clearer that also daily, monthly or other data can be handled. \item Added additional epochAsDate slot to sts class. Modified plot functions so they can handle ISO weeks. \item algo.farrington now also computes quantile and median of the predictive distribution. Furthermore has the computation of reference values been modified so its a) a little bit faster and b) it is also able to handle ISO weeks now. The reference values for date t0 are calculated as follows: For i, i=1,..., b look at date t0 - i*year. From this date on move w months/weeks/days to the left and right. In case of weeks: For each of these determined time points go back in time to the closest Monday \item Renamed the functions obsinyear to epochInYear, which now also handles objects of class Date. } } \section{Changes in surveillance version 1.0-2 (2009-03-06)}{ \itemize{ \item Negative Binomial CUSUM or the more general NegBin likelihood ratio detector is now implemented as part of algo.glrnb. This includes the back calculation of the required number of cases before an alarm. \item Time varying proportion binomial CUSUM. } } \section{Changes in surveillance version 0.9-10}{ \itemize{ \item Current status: Development version available from \url{http://surveillance.r-forge.r-project.org/} \item Rewriting of the plot.sts.time.one function to use polygons instead of lines for the number of observed cases. Due cause a number of problems were fixed in the plotting of the legend. Plotting routine now also handles binomial data, where the number of observed cases y are stored in \code{"observed"} and the denominator data n are stored in \code{"populationFrac"}. \item Problems with the aggregate function not operating correctly for the populationFrac were fixed. \item The \code{"rogerson"} wrapper function for algo.rogerson was modified so it now works better for distribution \code{"binomial"}. Thus a time varying binomial cusum can be run by calling \code{rogerson( x, control(..., distribution="binomial"))} \item An experimental implementation of the twins model documented in Held, L., Hofmann, M., Hhle, M. and Schmid V. (2006) A two-component model for counts of infectious diseases, Biostatistics, 7, pp. 422--437 is now available as algo.twins. } } \section{Changes in surveillance version 0.9-9 (2008-01-21)}{ \itemize{ \item Fixed a few small problems which gave warnings in the CRAN distribution } } \section{Changes in surveillance version 0.9-8 (2008-01-19)}{ \itemize{ \item The algo_glrpois function now has an additional \code{"ret"} arguments, where one specifies the return type. The arguments of the underlying c functions have been changed to include an additional direction and return type value arguments. \item added restart argument to the algo.glrpois control object, which allows the user to control what happens after the first alarm has been generated \item experimental algo.glrnb function is added to the package. All calls to algo.glrpois are now just alpha=0 calls to this function. However, the underlying C functions differentiate between poisson and negative case } } surveillance/inst/shapes/0000755000176000001440000000000012242645665015252 5ustar ripleyuserssurveillance/inst/shapes/berlin.dbf0000755000176000001440000000161611731650466017206 0ustar ripleyusersj AWIdNBEZIRKC2SNAMEC 0Steglitz-Zehlendorf zehl 0Tempelhof-Schneberg scho 0Spandau span 0Charlottenburg-Wilmersdorf chwi 0Mitte mitt 0Neuklln neuk 0Friedrichshain-Kreuzberg frkr 0Treptow-Kpenick trko 0Marzahn-Hellersdorf mahe 0Lichtenberg lich 0Pankow pank 0Reinickendorf rein surveillance/inst/shapes/berlin.shx0000755000176000001440000000030411731650466017246 0ustar ripleyusers' bZC 08Ae@`/ d=A^i(TA2X0rV R V8  0surveillance/inst/shapes/berlin.sbx0000755000176000001440000000020411731650466017237 0ustar ripleyusers' pB A80 CZ@eA=d /`AT(i^2 BV fsurveillance/inst/shapes/berlin.shp0000755000176000001440000001624411731650466017250 0ustar ripleyusers' RZC 08Ae@`/ d=A^i(TAXZC 08Ar6n@@ d:An7KA(&p68Aoq:AZC 08AAtrE8AA%Q8AA at8A8{RAM/>8AjA8ApXAZڵ8A<Ae  8AdAO_E9AdA//9Ag_SA)Y9An7KA2Ī9Ats<A + :A3sjAj|e :A َA;4 =:A.|=A d:A5)AئW:AT6rJA-:AAl+9A7і@a5p9A9fADQ9A65AcZ}9AevxLA*/>U u9A\h#Aj9AXYGA'JA9A0rAd$8Ajf$g@d$8A[@SXJ8AGi7Z@z5 8A&7@`8A ))L@$8A~@o>z8Ar6n@@<8A\76@"78A&7@p?o8A}@gb8AvzM@^':PV8AFAEtA8A+d A&p68Aoq:A2Ī9Awx&'@ :A^{< Ao:AAYCJA :A+nEw@zye:A{EHb=@6LY:Awx&'@I:A6/Q@E0ƗGi:A:1@>dj:AQ@(04:A@72,A-:AAئW:AT6rJA d:A5)A;4 =:A.|=Aj|e :A َA + :A3sjA2Ī9Ats<A$f9AA)$+:AA :A^{< ASP:A13 Aٯb:Ar A4K%&^:AaAc՟:AaAF:A :t$A^Z:At%A%:AbQA WA:A25gA :Abh[AA 1:Ae5}|6Ao:AAYCJA0 - S8A8{RA78"9Aj5 `A# at8A8{RAf/uW8AlPA - S8AVULAVhza8AiAaIs8A*4A0ܽ8A(݊ A OƋ8A/` A呺Z8Ao A[aj8AV[AVk8A|2PAp됓8Al+xA2@8AwAir~k8A@hVAVhza8A*1/A˕58A[A>8Aj5 `AFɄN8AZIA`<9A}!y*`Af9A@hVA4J+-9A,3a LAA.(9A Q!A_d9AR0AEm%9AR0A78"9A\r e A%v9Aֈg Aّ[9AJl߶Y A켑'9AJl߶Y A1C$9Ao AeXU8Ar Ae  8AdA,Eh8A C.AZڵ8A<A8ApXAM/>8AjA at8A8{RAeXU8Ag_SA :A*ARUV|9A*A1#-9A;b( A 9AE Awo:9AEdϑ A* .9AR#-# A? :At Aw:A]*W AJgq:A k, A :A^{< A)$+:AA$f9AA2Ī9Ats<A)Y9An7KA//9Ag_SAO_E9AdAe  8AdAeXU8Ar A1C$9Ao A켑'9AJl߶Y Aّ[9AJl߶Y A%v9Aֈg A78"9A\r e AEm%9AR0ARUV|9A*A̸e9A13 A7sp:A9?fDA!*h:A9?fDA/%03|:A_{YA6LY:A~ Aʎ:A%zv# A7sp:Ay A=Ҝk:Ax A7sp:AO 4 AF:A$jg A6LY:A,< A$C_:A@%+ ASP:A13 A :A^{< AJgq:A k, Aw:A]*W A? :At A* .9AR#-# Awo:9AEdϑ A 9AE A1#-9A;b( ARUV|9A*A̸e9A%A]F9AX#pA.P7:A!~]A!T:A^j8CA,>U:AJA!*h:A9?fDA!*h:A9?fDAc՟:A|_A]*;An[ A$jD;A|_A0";AAs"Ao:AAYCJA 1:Ae5}|6A :Abh[AA WA:A25gA%:AbQA^Z:At%AF:A :t$Ac՟:AaA { ":A44> A5Y:A{2* AB[WU:An[ A:A=Y A;A ۇ$ A]SZ!;A%aNA 2;A߆ A*;Aޱ6tA {1 ;ARlmA\~53;A= UA3;A:#~>A]*;AmP:A3;A&SA$jD;A|_ASP:AaAH;AzŠ A4K%&^:AaAٯb:Ar ASP:A13 A$C_:A@%+ A6LY:A,< AF:A$jg A7sp:AO 4 A=Ҝk:Ax A7sp:Ay Aʎ:A%zv# AV:AzŠ A^:Awd A#PH:AF A'+;A AX ;AQ)R A]U;Aő AH;A@9 ATc5;A44> A::A"GTk A/e:A~"r AB[WU:An[ A5Y:A{2* A { ":A44> Ac՟:AaA4K%&^:AaA/e:Ae@`/ d=A"GTk A<3;A&SA]*;AmP:A3;A:#~>A\~53;A= UA {1 ;ARlmA*;Aޱ6tA 2;A߆ A]SZ!;A%aNA;A ۇ$ A:A=Y A/e:A~"r A::A"GTk ATc5;A44> AH;A@9 A#Sa[;A  A Hn;A <(A-h;A+?CAgu;AD~A/5;A^A'LA0-;A^]AA A <=AԮ~ŃA=(=AY(uAqM`LA*L+;A^z5r AC ;A1 iG AX;A9=FV[ A@;AH*( AQ|;ADC AFt;A(}A֋;A($:A]K;AAoq@A/5;A!`ZA1W5;AO #:Amf!;A/-e~GA_;A#pS(Amy;A.*IAA~>`Xg;A:AƆ;A!A1W5;Aj)/<A/5;AU JA]K;AXA/5;A_)QAgu;AA-h;AAHA Hn;AF-A#Sa[;AlG AH;A籑y A]U;A޺ AX ;AbzT A'+;A A+ܗ;A@ Ak:A(` A5cM ;A,䗟 wA齊?;As5AҤ/;AL#SAi-;A~ vaA*\ ;A``+A yb;At2xA910;A'iAi \O;ABtNAB `Y;A<7b&A h:AF A"7f;A^i(TA.mj:A,,Adr~:A"5Ag:A6@GA%r5:A7*A5!:AR{%A~ˢ:A߲>A̫;AwO41NA.J:ADtdA+I:AymmA柑 :A'A?م:A[wA%;A^i(TA_š;A'A⏣ ;A\% AHδ;AxqoqA  V;ASLA"7f;ATٱA|Hb;A=pAY{tF;A,^5VAuM6:;ADblAi \O;A?uKA910;AaA yb;A9>vA*\ ;AV8 Ai-;AMAAҤ/;Ar҅A齊?;ANeKmA5cM ;AX#G_rAk:AI L[ A+ܗ;A@ A'+;A A#PH:AF A^:Awd AV:AzŠ Aʎ:A%zv# A6LY:A~ A/%03|:A_{YA!*h:A9?fDAh:A\2AM00:Ag51A\J:A_ZA1Y6:AJʼnAN)I:AWS AjL:A#A4%[:A.xW(Amj:A,,A 0=8AR0A!*h:A@/A#&9AP)QA0^9Ahv[A1Y6:AJʼnA\J:A_ZAM00:Ag51Ah:A\2A8X:A{A!*h:A9?fDA,>U:AJA!T:A^j8CA.P7:A!~]A]F9AX#pA̸e9A%AEm%9AR0A_d9AR0AA.(9A Q!A4J+-9A,3a LAf9A@hVA`<9A}!y*`AHm a9A&ŁA=8A`5h>A5N9AkqAVH(d9AՀA~ab9ANKLvA?d-9A"5AVJ9A֟ApwE9A֟A<9A@/AP<9A@/A)}9A5ej!A49A2Ab@`9AfAX\9AlA:/v+9Aw8LA&9AP)QAsurveillance/inst/shapes/districts_BYBW.shx0000644000176000001440000000230411731650466020625 0ustar ripleyusers' b@1@.@@28"xl `h   Xx0.pvjHB`8~B 60!j"~X#$&'`(P*>+,,.v00162p4645~`567089:V;<=>?@ABDzEv FHpI\J@L$hLXLhMX(NO8PR`S U 8VFzWXPY,YZ4[@]&P^z`8bcdHdheFpe`fgikl|nb0opqrbXrxs:pstXuw Xxhy<zXH{h}~~`x `DH`@< `4hJsurveillance/inst/shapes/districts_BYBW.shp0000644000176000001440000023231011731650466020617 0ustar ripleyusers' d@1@.@@@@v@Л@@ܙ@4@\@Z@8@~@X@|@Л@@@@@"@@v@d@v@d@@@@@@@@$@H@@@H@@@6@D@@ܙ@`@@@@h@l@8@@ޠ@@^@@@0@l@@@@@@`@X@ܞ@8@@(@@`@@p@@p@H@@@@@8@@@@@@@h@Л@@(@ؠ@0@@ܙ@@ܙ@6@D@H@@@H@@@,@@f@@@З@h@l@,@ĕ@@@@@t@@@D@У@4@У@ė@@t@@4@@4@b@ĕ@n@ @6@H@@@h@l@h@l@@З@f@@,@@H@@@H@@@@$@@@@@@@v@d@v@d@@@@@@@@t@@n@\@4@<@@T@@@P@ܥ@L@@@<@`@n@|@n@|@@@@@D@l@ڤ@x@@@@4@@4@@t@У@ė@У@4@@D@t@@@@@@У@ę@@@@\@4@<@@ܙ@@L@@@@@̠@@j@L@@@V@О@@Ԟ@@Ԟ@@4@Ң@@j@D@̢@@n@x@^@@@@@@|@Л@~@X@Z@8@4@\@@ܙ@@ܙ@ؠ@0@@(@h@Л@@@@@@@@(@b@(@@@8@ę@@@$|@p@@@2@Ȟ@ @@@@ܝ@@x@@x@@ @@T@@(@^@@d@@4@<@4@<@@\@@@У@ę@@@@@@@@@@v@d@v@d@"@@@@@@^@@n@x@̢@@j@D@Ң@@@4@@Ԟ@@Ԟ@8@L@|@p@x@@f@@ @Ԡ@@@@@>@l@f@@@@¡@@|@2@@V@r@@8@@@Ԡ@l@@ȣ@n@6*@l@@@@>@@:@l@Ġ@l@Ġ@@@ @@ @@ @@ @@@t@@@@@$@@@n@ܢ@<@:@4@:@4@@@>@@@>@(@ڠ@@@4@X@6@@@B@ȣ@@ȣ@@|@p@|@p@8@L@@Ԟ@@Ԟ@V@О@@@j@L@̠@@@@@@@@@l@@Ԡ@@@@@>@l@f@@@@¡@@|@2@@V@r@@8@@@Ԡ@ @@@֢@ @֢@@@R@@@J@@J@@@V@N@@4@@ @@@v@F@ @J@ȣ@@ȣ@@@B@6@@4@X@@@(@ڠ@@>@>@@@@:@4@:@4@V@@@Z@ @֢@ h|@@@b@* @b@ @@R@t@@L@&@Р@@v@§@Z@@8@@@ܧ@H@ާ@@ާ@@d@@B@@4@@|@ԝ@@t@@̜@@@R@@ @P@@x@@x@@ܝ@ @@@2@Ȟ@@@|@p@|@p@ȣ@@ȣ@@ @J@v@F@@@@ @@4@V@N@@@@J@@J@@.@ @b@ @.@P@@8@ڤ@,@N@@x@@@>@@\@ƥ@p@Υ@p@Υ@@@@@@ȥ@~@@~@@T@(@@ @@F@Ȥ@P@@@@@@<@@@V@v@.@z@@l@ڤ@@p@d@@@ԣ@@ @@R@@@@Ҧ@ƣ@@У@@У@@l@ @ @ @ @@@*@Ң@P@h@ @b@ @b@@.@@J@@J@R@@@@ @֢@ @֢@@@@@@P@ģ@~@@F@Σ@B@@@@ڤ@ @@0@X@ި@@@<@0@@0@@̨@P@ި@̘@@ܘ@@@n@0@^@x@@@ا@D@$@|@@@@ȕ@@ȕ@@@@@z@P@@d@@@@L@X@@@@@n@|@n@|@@X@V@p@ި@@ X4@L@@@(@@@Ȝ@Ψ@@@(@@ؚ@Ψ@@Ψ@̙@ި@@ި@@V@p@@X@n@|@n@|@<@`@@@ܥ@L@@@P@@T@4@<@4@<@d@@^@@@(@@T@@ @@x@@x@ @P@R@@@@@̜@@t@|@ԝ@4@@B@@d@@ާ@@ާ@@\@@@@xL@@@@ @@@@L@@<@(@@@@̚@@@4@@,@P@@Й@p@$@@@X@L@4@П@4@@@P@@L@@ԝ@@@X@P@X@P@@x@@П@@П@К@X@@@\@,@@X@@؞@@8@ě@Н@4@@@@@@@:̚@X@@@@@@@@@@^@d@"@l@Ġ@l@Ġ@@:@@>@@@@l@@l@d@@@@X@@P@@@(@4@@4@@@P@@L@@ԝ@@@X@P@X@P@@ @@ @@@@<@@@T@Ȝ@@̛@@ܛ@@@@@@@@p@D@p@D@<@@@@4@@4@@ě@Н@@8@@؞@@X@\@,@@@К@X@@П@@П@0@ @X@@Ě@@@H@̚@X@`@P@l@ @."h@@@p@ @P@@@@@@@@@@ؗ@@@`@@`@@t@\@@h@@@@ܖ@@<@<@@@@@@ @@ @@@@<@@@T@Ȝ@@̛@@ܛ@@@@@x@@Ț@@$@`@l@(@@@h@@@@@@L@@<@(@@@@̚@@@4@@,@P@@Й@p@$@@@@B@$@"@ @@Ȝ@@Ȝ@@4@@`@@@@@"@$@@x@T@`@B@@`@|@@@@@@@L@@֢@@ @@@@@L@ @|@F@@@@@@@8@L@8@L@@J@Ĝ@@@@@@@@`@`@@(@Ȝ@@Ȝ@@@@@@@֢@pb@t@ @ڤ@+B@@r@@~@@R@@f@"@f@"@@$@@@<@.@b@j@T@@@ʤ@@@@@@ڤ@@ڤ@@@Σ@B@@F@ģ@~@@P@@@@@ @֢@ @֢@@Z@V@@:@4@:@4@ܢ@<@@n@$@@@@@@@t@ @@ @@@¡@b@p@@@@0@J@d@B@@D@@J@@;x@"@̛@N@@֢@@֢@@@@@|@@@`@`@B@x@T@$@@@"@@@`@@4@@Ȝ@@Ȝ@@@(@`@`@@@@@@@T@ޣ@@x@@@X@Σ@@@6@@6@@6@b@6@b@@.@@@h@Ģ@؟@@z@@j@:@j@:@@@@t@(@@B@@B@@J@d@@0@@@b@p@@¡@ @@ @@@@l@Ġ@l@Ġ@d@"@@^@@@@@D@@x@"@$@@ @@4@@@X@Н@h@Н@h@$@@4@@P@@@@@@@@@x@@H@ @@4@@Hh@4@@@&Н@h@@X@4@@4@@@x@@p@@p@@`@@(@ܞ@8@`@X@@@@@@@@@ԝ@4@`@@@@@ĕ@@,@@@@,@h@@h@@@@l@(@$@`@Ț@@x@@@@@@@@@p@D@p@D@@@@8@@@Н@h@`<@p@b@l@)4@@ @@@H@@x@@@@@@@P@@4@@$@@Н@h@Н@h@@@@8@@@p@D@p@D@<@@@@4@@4@@@(@P@@X@@@@d@@@l@@l@@@@@b@(@@(@@@@@@@@8@@@H@@@p@@p@@x@4@@8(@8@@@$|@ @(@X@(@X@p@ē@@@L@@D@h@@8@ę@@ș@@t@@,@@,@@@H@@x@D@Е@(@@@@@@ @P@@p@h@@h@@@,@@@@,@@ĕ@@@`@@ԝ@4@@@@@@H@@ܔ@@h@|@ @@@@@@`@$@Њ@@Ȋ@h@h@@@Г@x@@@@@d@@(@@@@h@(@@@@`@@`@@@`@x@ȁ@@P@5@h@T@@4@@@@@@@@@@@@@0@@@@@@@h@@(@X@@X@@@@@@P@@0@@`@@H@@@t@؂@@ȁ@@ȁ@x@H@8@x@h@@x@8@@8@А@Њ@|@؋@@P@@P@@ @`@@`@@@@(@@@h@(@@@d@@@@@@Г@x@@@h@h@@Ȋ@$@Њ@@`@@`@D@X@@h@@h@@ԑ@ԑ@ԑ@`@l@H@@@4@̖@@x@@@H@@H@@Џ@@H@T@ȍ@L@@Ж@@Ж@@@h@@h@D@X@@`@@`@`@@`@@@ @@P@@P@@@@@ԑ@ԑ@0ԑ@@t@@#`@@@@@ؗ@@@@@(@@D@Е@@x@@H@,@@,@@t@ @И@@ @@@@@@`@D@@@@H@@H@x@@̖@@@4@H@@`@l@ԑ@ԑ@ԑ@ԑ@@|@@@@@@@x@@x@@@p@`@@И@@@|@@|@@$@@@p@x@@x@@T@@@@@@@@\@@@@@@ @@И@@t@ @,@@,@@t@@ș@@ę@@@8@D@h@L@@@@p@ē@(@X@(@X@@<@ @@@8@ȝ@@|@@X@@ @H@(@@@@@@؛@@؛@@x@@x@@4@@ܚ@8@@@@@@@@@4@@T@@@h@@h@Ж@@Ж@@L@@T@ȍ@@H@@Џ@@H@@H@@@`@D@@@@@\@@@@@@@T@@@x@@x@@@ȋ@ @Ј@D@@\@@@@ D@Є@@@B@h@@@"@@@H@@@@@8@@@Ȇ@8@ȅ@ܞ@@@h@H@(@p@@h@Є@@@@@\@@D@@ @Ј@@ȋ@x@@x@@@p@$@@|@@|@@@@ԟ@@B@h@!؛@`{@@@5<@`@@؄@@@@@ڠ@P@ @`@@@@@@p@@@@}@@|@8@P}@@~@r@@2@Ȁ@&@p@~@~@X@|@X@|@@`{@@{@X@~@@@\@@@p~@x@}@@~@@~@@@@h@@@p@@؛@@؛@@@@@@@@@@h@Є@p@@H@(@@h@ܞ@@8@ȅ@@Ȇ@8@@@@@@@@@@`@@<@`@"@t@@P@@w@,@`x@@v@l@t@@v@4@x@@x@(@}@@@@ȁ@@ȁ@t@؂@@@@H@@`@@0@@P@@@@@\@h@\@@@H@@@@{@@w@#`@u@@@)@w@@{@@@@H@\@@\@h@@@@@@X@(@X@h@@@@@@@@@0@@@@@@@ܚ@8@4@@x@@x@@@h@@@@`}@Ě@{@T@{@,@}@@{@@x@d@0z@@x@@w@@`v@Ę@pw@@y@@y@@@w@@@u@$@v@@w@$P@@8@F@l@'r@@@8@Ң@L@@@@@D@@ء@@@@@@@4@ԡ@(@@@@@@,@J@<@J@<@t@@@@D@P@ @@,@\@@h@l@h@l@@@6@H@n@ @b@ĕ@@4@@4@@@F@@@@@p@@@@ԣ@@@@@8@b@@r@@%|@4@@@|@ @@h@@ܔ@@H@@@@@@@@@l@@@0@^@@ޠ@@8@@h@l@h@l@\@@@,@P@ @@@D@t@@J@<@J@<@@4@|@ @& @h@@ @B@h@ԟ@@@@|@@|@@ȝ@@@8@ @@@<@(@X@(@X@|@ @|@ @@4@J@<@J@<@@,@@@@@ԡ@(@@4@@@@@0@<@@p@n@X@@h@r@@B@h@'r@0@@Ԕ@Z@Ē@$@0@ܥ@4@@@r@@@@@@Х@4@8@Ԕ@@@@@@(@4@<@Z@Ē@(b@P@§@@6 @@@@@@@@8@Ԕ@Х@4@@@@@r@@@@ܥ@4@$@0@Z@Ē@Z@Ē@@@@@@@@P@x@@@@t@@@ؑ@r@@:@@֤@@Z@p@@T@ȣ@@r@@r@@b@@@8@@@ԣ@@@@@@p@@@F@@@@@4@@4@@@ڤ@x@D@l@@@@@L@X@@@@@d@z@P@@@@@§@P@ @@)@@*@ؑ@.*@8@*@@@@@@@@@@@@Ҧ@ @Ҧ@ @@@j@@h@ @@Ȉ@b@@Ф@@@@&@`@ @@ @@@@@@@@@@@Ȏ@l@@^@@@@@@Ң@L@@8@r@@r@@ȣ@@@T@Z@p@֤@@:@@r@@@ؑ@t@@@@x@@@P@@@@@@(@*@8@*0@v@ʤ@0@#@@.@@@@p@@h@h@@`@d@}@@}@ʤ@z@~@y@@x@@x@H@w@@v@@v@@`v@ȣ@v@@`w@@x@f@z@4@z@@P|@@{@@~@ԡ@@̡@@@@@@@؄@<@`@<@`@@0@@0@@X@@@+@x@"@@. @@&@`@@@Ф@@b@@@Ȉ@h@ @j@@@@Ҧ@ @Ҧ@ @@@@@@h@@8@@8@@(@@0@@@@"@~@Ʀ@ z@Ʀ@ z@@@}@@P{@l@|@֤@ x@@x@@x@~@y@ʤ@z@@}@d@}@@`@h@h@p@@@@.@@@@@@@X@@H@V@@@@@@@ȣ@x@ @@,p"@@ @@+B@h@r@@@h@n@X@@p@0@<@@@@@ء@@D@@@@@@^@@l@@@Ȏ@@@@@@@@@ @@ @@ȣ@x@@@@@@V@@@H@@X@@@@@@X@@0@@0@<@`@<@`@`@@@@@@@@@@@H@"@@@@B@h@-@Ԙ@@@ @@P@Ԙ@@T@@T@@p@N@@@Z@@@T@@Й@@p@@p@@P@@@.@@Ћ@)@(@@(@n@@@@@@@@@Ȏ@)@@ @h@@@@Ћ@@H@Ԯ@@@@@x@@x@@@@@f@8@@L@@L@ή@h@@(@/`+@ @s@Ѕ@ K@ @+@@7@X@:@(@N@Ѕ@c@P@s@P@g@X@K@ @0@؋@@(@@Đ@@@&@(@&@(@@@@@ @p@ò@؋@@Ȏ@@@@@@@@@@@@@@@(@@(@@@C@@@Đ@1 @ p@6@(@ @ ~@@@P@@v@ȁ@k@@@@$@8@@@@w@@@(@@(@@Ȉ@@H@@@ų@H@@@#@@6@{@@0u@@0r@@ p@K@v@d@y@&@~@ @ ~@20@o@@@#ȯ@@@@@@@p@@@@P@@}@@|@@y@@`x@@v@@v@@q@@pq@@o@@o@@u@ȭ@@{@@p|@8@~@8@~@V@@@@l@x@@8@@8@&@@@@x@@@@@@@@ @@@@ȯ@@3@L@|@Ԕ@@d@B@x@&@@ҭ@@ڭ@Ԕ@ڭ@Ԕ@X@P@@ԓ@@\@@\@@@j@@|@@|@@ @@@(@@(@ή@h@@L@@L@^@ܐ@@Đ@ڭ@,@,@ܑ@ʬ@\@@d@4;@X@B@@ @@7@@7@@*@@B@@@P@ǰ@p@ϰ@@Ű@X@@X@@X@K@h@]@@;@H@M@0@A@@A@@@d@ @@5@p@+@@. @@@@@@@@8@@@@h@@@@ڬ@|@B@ܞ@B@ܞ@t@@@@p@@H@@H@@@H@(@t@@@@T@@T@@@"@@@@+@@#@p@@h@@h@@H@ί@ؚ@@ܚ@"@|@@p@@p@@Й@@T@Z@@N@@@@p@@T@@T@j@,@Ĭ@К@r@l@V@@ @@61@@@@1@@E@ @O@@@@@@Ұ@@@\@@\@@4@a@X@@T@@T@@@ @@ @@@d@A@@A@@1@@7@|@@@ |@@j@@@@@\@@\@Z@H@@Д@@@@t@@@@@G@4@U@`@@@@@@@Ұ@@԰@|@@@@@@Д@@\@@\@Ұ@@@@@@O@@E@ @1@@1@@@|@|@@8@@@ܑ@N@@.@P@@H@F@8@@@@@@@@@R@@@`@t@ @t@ @~@x@^@@~@l@@d@@d@ʬ@\@,@ܑ@ڭ@,@@Đ@^@ܐ@@L@@L@f@8@@@@x@@x@@N@@9j@b@@0@@s@t@Pu@@Px@@Px@@z@@ @X@~@@0@:@`@T@ @8@~@8@~@@p|@ȭ@@{@@u@@o@@o@@i@0@i@ԭ@b@p@b@@g@@@g@ެ@b@@b@@ g@̫@m@r@`m@j@Pp@@`q@@s@:@@ @̐@@@@(@6@@@@N@@6@h@@@@@@P@@`@ @@@؊@@@@ @@ @@@<@@@̐@@̐@t@ @t@ @@`@R@@@@@@@@@@@@ @@@@;@v@.@P@\@ @@@Ұ@X@ٰ@@@@@@ @@.@y@.@y@@@y@@v@@v@@v@@`x@@y@@|@@}@@P@@@@p@@@@@ȯ@@ȯ@@@P@@@\@ @< @@@P@R@P@@P@@(@@(@@@@@@@@@@@@@@i@H@B@@6@`@@@@@@@ٱ@@@@w@@a@(@_@(@7@@7@@ @@ @@@@@T@@T@ܱ@\@'@`@4@ @R@P@=N@@@@0\@ @@@@P@ȯ@@ȯ@@@@ @@@@@@@@|@H@@@|@(@@@N@@N@@x@@x@@@@@Ԯ@@@H@@Ћ@@@ @h@)@@@Ȏ@@@@@@@n@@@(@@(@ @@|@@|@@@|@1@@1@@A@@A@@M@0@;@H@]@@K@h@@X@@X@~@@\@ @>@Ԕ@@@ڭ@Ԕ@`@\@T@ؕ@@\@@@F@p@F@p@P@@ @@@@@̚@ @@ @@V@@r@l@Ĭ@К@j@,@@T@@T@P@Ԙ@@@@@@@@ @@T@J@@@@ڭ@Ԕ@? ڭ@ԓ@@ܚ@!@@@t@@@@Д@Z@H@@\@@\@@ԓ@X@P@ڭ@Ԕ@ڭ@Ԕ@@@J@@@T@@ @@@@@@@@P@@p@@p@"@|@@ܚ@ί@ؚ@@H@@h@@h@@@@@@@@ @ @@@@@\@x@G@@7.@~@@}@ű@@@~@@x@.@y@.@y@.@y@.@y@ @@@@@@ٰ@@Ұ@X@@@\@ @\@ @~@@@X@@X@Ű@X@ϰ@@ǰ@p@@P@B@@*@@7@@7@@_@(@a@(@w@@@@ٱ@@@@@@@@@(@@@@@G@@2@؅@ @@@8@(@@@ȁ@@8@@~@K@ @+@@7@X@:@(@N@Ѕ@c@P@s@P@g@X@K@ @A@8@@H@@@ @@@@@@@@F@8@@H@.@P@N@@N@@@@|@(@@@|@H@@@@@x@@@@&@@@8@@8@@@ҭ@H@8@@~@؆@@@B@z@@@-@(@w@@@@@$@8@@@k@@v@ȁ@P@@@@ @ ~@ @ ~@Ȳ@}@@{@z@z@?@~@@ ~@@~@@~@@8@@ȁ@(@@@8@ @@2@؅@G@@@@@@@(@@@@@@@6@`@B@@i@H@@@@@@Ȏ@ò@؋@ @p@@@@@&@(@&@(@+@Ќ@t@@@(@C@@Px@@@%@@6@h@N@@@@6@@@(@@@@@~@؆@8@@ҭ@H@@@@8@@8@l@x@@@V@@8@~@8@~@T@ @:@`@@0@X@~@@ @@z@@Px@@Px@P@{@@{@*@@@0}@@@~@@P@Ԫ@`@@@@@@@@Dh@@@@@ @@@@=@D@D@Ж@a@@@@@@@p@@L@ȕ@@@EX@ؖ@J@@@@@ؖ@@ԗ@@@A@@J@@J@@@@FhC@@̲@@ ̲@М@Ų@@@ě@l@@C@@_@(@i@@@@@@̲@М@G(@@@@"S@4@M@@t@`@i@Ԛ@@@@@|@@@,@@@@@ɳ@@ɳ@@@ @@ @@h@^@@5@@)@@@@@@@@8@X@S@@L@@^@l@s@@s@@@\@@@ҳ@@ɳ@4@@@@@S@4@HM@H@.@l@@l@'@@5@ȝ@7@T@i@<@@@ߵ@@.@@@@@@۵@@@t@v@H@9@ @@ę@@d@@@@ @@@@@i@Ԛ@t@`@M@@S@4@S@4@@@@@@Н@ɴ@d@@l@I8@@C@@$֯@P@@@E@@Z@@@@@H@@d@C@<@-@@-@@@@@@@8@@@@@@@U@`@G@4@@@@@ @@@ @@@@@@@@h@@h@#@p@+@@@@"@@@@@T@@T@@<@֯@P@J@T@g@$@3)G@$@@x@ñ@@۱@h@۱@h@@|@@@ @T@4@@Z@@b@`@U@4@g@@g@@N@h@R@P@R@P@4@ @'@`@ܱ@\@@T@@T@a@X@@4@@\@@\@@Д@@@@@@@@@԰@|@Ұ@@@@@@@8@@@@@-@@-@@G@$@@@@@=@D@D@Ж@a@@@@@@@p@@L@ȕ@@@K`ɳ@l@*@@)J@@A@@@@@ԗ@@ؖ@@@@@@@$@(@ @@@@`@l@`@l@@@R@@'@@@@@ؖ@γ@h@@@ɳ@@ɳ@@@@@@@,@|@@@@@@@ @@@@d@@ę@9@ @v@H@@t@۵@@@@@@*@ @@p@J@@L  @4@@Π@! @4@@X@|@^@@@@@@`@@:@2@Π@2@Π@;@Ġ@5@@b@N@@b@@@@l@@l@ɴ@d@@Н@@@@@S@4@S@4@@@@@ɳ@4@ҳ@@@@@\@s@@s@@`@D@<@@ @4@M8N@Đ@`@ @$@Đ@C@@@@@(@@(@@P@R@P@R@P@N@h@g@@g@@s@T@@L@@ @@@@x@ @p@.@@@@@ @@ @ɳ@@ɳ@@@@γ@h@@ؖ@@@'@@R@@@@`@l@`@l@@ @@@@Ȑ@@Đ@NzG@h@s@4@,"۱@h@ñ@@@x@G@$@G@$@@X@б@Л@@@ @8@0@@F@@B@@B@@B@@B@@u@؟@ @4@ @4@<@@`@D@s@@s@@^@l@L@@S@@8@X@@@@@@@@X@s@@`@0@ @@۱@h@̲@М@Ų@@@ě@l@@C@@_@(@i@@@@@@̲@М@O۱@L@@@@ @@@.@@ @p@@x@@@@ @@L@s@T@g@@g@@U@4@b@`@Z@@4@@ @T@@@@|@۱@h@۱@h@ @@`@0@s@@@X@@@@@)@@5@@^@@@h@@ @PP<@@@^@<@Ԣ@B@"@j@:@@^@@@a@@<@Ԣ@Q@@n@X@ @@X@\@ @n@p@i@@h@ȝ@@@@@@4@@ܞ@@@!@ܞ@)@L@@@X@R@t@@H@ 5@t@@@2@H@Y@8@`@@t@@@@@@@@q@ܤ@T@֤@B@x@5@t@S@@=@@2+.@@.@@.@@l@*@"@@@ʣ@F@@0@P@f@d@*@@*@@2@@@@@@@@&@@|@@t@J@@t@@Ȱ@@˰@"@=@@=@@@@!@V@@\@@Ԣ@̰@آ@ΰ@@@@@@@,@а@@İ@4@@@@@@`@G@@ @@@@@@@\@.@@<@Ԣ@B@"@j@:@@^@@@a@@<@Ԣ@T@@@2@l@%@t@ڱ@@@@@@:@~@L@ԡ@:@@@@@s@Ƣ@Y@@@l@@l@@@@@@@@@4@@<@˳@ޡ@γ@@@@2@Π@2@Π@@:@@`@@@@@|@^@@X@ @4@ @4@u@؟@B@@B@@@ @@؟@ֱ@ğ@@t@UP@T@@@'@ @}@l@S@@,@@@ȟ@@l@֯@P@֯@P@@<@@T@@T@@@(@t@@H@H@@H@@@@@@@@ޭ@@@^@D@j@@@v@@v@@@@6@@@@.@@.@@@\@@@@@ @@G@@@`@@@@@@ @V@@{@@4'j@p@t@(@@ @ڰ@$@@@@@S@@@ҥ@@ƥ@@ƥ@@Z@N@(@T@@i@@{@@{@@^@֣@8@@@@@@@@@@l@F@=@@=@@=@@=@@˰@"@Ȱ@@t@@J@@@t@@|@@&@@@@@@@@L@j@p@5@t@@@2@H@Y@8@`@@t@@@@@@@@q@ܤ@T@֤@B@x@5@t@W֯@@F@@7*$@`@$@`@$@`@P@@O@ڠ@_@@@t@@t@@t@ֱ@ğ@@؟@@ @B@@B@@F@@0@@ @8@@@б@Л@@X@G@$@G@$@-@@-@@C@<@@d@@H@@@Z@@E@@@@֯@P@֯@P@@l@@ȟ@,@@S@@}@l@@ @@ @@@$@`@@@X@\@ @n@p@i@@h@ȝ@@@@@@4@@ܞ@@@!@ܞ@)@L@@@X@X@`@@F@0@l@Y@@s@Ƣ@@@@:@@L@ԡ@:@~@@@@@ڱ@@@t@@t@@t@_@@O@ڠ@P@@$@`@$@`@@@@ @@ @@@@@İ@4@а@@@,@@@@@ΰ@@̰@آ@@Ԣ@@\@!@V@@@=@@=@@l@F@@@@@@@@@8@@^@֣@{@@{@@@̣@@£@@l@YH@ƥ@_@@@@@@@@W@̧@[@@y@*@@@@@/@@@P@_@@#@@@ƥ@@ƥ@@ҥ@S@@@@@@ڰ@$@@ @t@(@j@p@j@p@H@j@@@ZH@X@ԫ@@@X@@@0@@@@ԫ@h@@X@[hȮ@@ί@@ @z@@R@ί@0@@*@@@<@@,@@Ȯ@R@T@@@z@\pl@@`@F@ @@ʫ@ҩ@@ȩ@l@@@@l@ @@F@,@@J@@`@@@@]`<@$@@Ԫ@ @@@@@$@g@(@<@@r@@j@Ϊ@@Ԫ@@@^@F@v@@60v@@<@r@"@@\@@\@@L@H@@H@@@ث@@@ƥ@@ƥ@@ƥ@@ƥ@@v@@ĥ@j@ԥ@T@@^@h@@F@@F@@j@@@@@@@`@@2@ڥ@@@@@@@@@ک@x@F@@@r@@@֪@"@@@B@t@B@t@b@@b@@|@ @֫@ @@ا@@>@ @*@@@4@ڧ@v@@@X@@@0@@@@ԫ@h@@X@_"@d@@@8. @ޤ@ @@@*@&@~@F@@@@ƭ@@@J@@@\@@\@@"@@<@r@v@@v@@$@,@\@@T@@@0@@Z@ԯ@@¯@ب@¯@ب@@@7@Ҩ@B@@B@@B@@B@@@@@@@@H@j@j@p@j@p@@L@@@@@@@2@@@*@@*@@"@@®@@z@d@ @ޤ@@z@@R@ί@0@@*@@@<@@,@@Ȯ@R@T@@@z@`n@t@6@$@6+@@|@@@Ω@@@t@|@n@ڪ@H@$@@@@@@@@ʪ@@@@@ʬ@l@@2@@*@@*@ @ȩ@6@@@@&@|@&@|@@P@0@@@@@@@@@@@`@@D@Ϋ@4@@@@Ψ@b@@b@@B@t@B@t@:@@T@@>@@@@@@@@@@ʫ@ҩ@@ȩ@l@@@@l@ @@F@,@@J@@`@@@@a@ @F@@@N@@ @X@@T@@@ @@ƥ@@ƥ@ث@@@@@H@L@H@\@@\@@@@@J@ƭ@@@@F@@&@~@@*@ @@ @ޤ@ @ޤ@@@@N@b@@G@x@90@@@(@$@N@@@@ʪ@r@"@r@"@ @X@ @X@6@h@P@4@q@d@q@d@@x@@@@@@ڪ@@ڪ@@ڪ@@ڪ@@@@@@@-@8@ @@@@>@Ʃ@G@@G@@@@@@ǰ@D@@@@@@L@B@@B@@7@Ҩ@@@¯@ب@¯@ب@@Ҩ@̯@Z@@ȩ@h@@h@@:@@@@@@@@@$@g@(@<@@r@@j@Ϊ@@Ԫ@@@c0@@r@L@#@@&@|@&@|@@@6@@ @ȩ@@*@@*@z@@@ڪ@f@@f@@­@@­@@@L@j@,@`@@`@@`@@@@T@J@r@"@r@"@@ʪ@@@$@N@@(@@@@@@Щ@`@x@r@R@6@B@@j@@@dv@,@ԯ@@@@@j@6@B@r@R@`@x@@Щ@@@@@:@@h@@h@@@ȩ@̯@Z@@Ҩ@¯@ب@¯@ب@ԯ@@@Z@@0@T@@\@@$@,@v@@v@@@@@@έ@Ĩ@@@@@eb@@@@&@|@@@@@@@έ@Ĩ@@@@@v@@v@@4@ڧ@@@ @*@@>@@ا@֫@ @|@ @b@@b@@@Ψ@@@Ϋ@4@@D@@`@@@@@0@@@P@&@|@fB@@@@@@y@*@[@@W@̧@@@@@@@@@@@B@@B@@@L@@@@@ǰ@D@@@@@G@@G@@f@J@]@ܨ@@@gX@@@ @@̡@@@@@@x@8@@@ԡ@@ @@̡@hx@@^@@ @@@@@@@$@@@@j@^@P@.@@X@@X@@ @@@@ip@̢@6@@ @̢@@@@@@N@@z@@@@@@@@@6@^@ @̢@j@@$@@@&@Ȭ@ڢ@$@@@\@@\@@p@@(@~@@~@@&@F@@D@@D@@\@@\@J@@@@ @̢@ @̢@6@^@@@@@ @@X@@X@@r@@f@p@@d@@@@*@@&@kX@|@@F@@D@&@F@~@@~@@@ơ@"@|@@@@D@l@@@V@;3R@ʢ@R@ʢ@R@ʢ@@ޢ@@@T@@T@@@*@,@@,@@@̠@,@J@@@T@H@.@h@@d@@d@@d@̩@@@@@4@@<@@@@@\@@ާ@@ާ@@ܧ@H@@@@8@§@Z@@v@&@Р@@L@R@t@ @@ @b@ @b@P@h@*@Ң@@@ @ @ @ @@V@@@Ĩ@@ @@T@@@ޢ@Щ@@R@ʢ@@̡@@@@@@x@8@@@ԡ@@ @@̡@mX̩@&@@ԥ@(@&@@*@@@@d@f@p@r@@X@@X@@.@@^@P@@j@@@@$@@@@@@@@@@"@ܪ@@j@@@@̩@@@F@@F@^@h@T@@j@ԥ@@ĥ@@v@@ƥ@@ƥ@@ @T@@X@@@ @@N@@N@@@2@@@&@nR@@J@@T@@@@@ޢ@R@ʢ@R@ʢ@f@b@@@@@@@@@@z@@N@@@@@ @̢@ @̢@@@J@@@\@@\@@J@@"@T@@oȬ@@l@@ @\@$@@Ȭ@ڢ@@&@@&@2@@@@@N@@N@@@ @ޤ@ @ޤ@z@d@®@@"@@*@@*@@f@d@0@P@F@@@ʣ@"@@l@*@.@@.@@@@6@@@@v@@v@@8@F@@\@pH@@@@&@У@@2@@x@@x@`@@@@@h@@z@v@Ҥ@@D@@f@@@@@@@@j@@F@@F@̩@@@@j@@ܪ@@@"@@@@@f@b@R@ʢ@R@ʢ@Щ@@@ޢ@T@@ @@Ĩ@@@@@V@ @ @ @ @@l@@У@qh,@@p@p@*,@@@*@T@@T@@@"@@J@@\@@\@@D@@D@@@"@|@@ơ@~@@~@@@(@@p@@\@@\@8@F@v@@v@@@@D@j@@^@ޭ@@@@@@@@H@@H@@p@@@@t@@B@ܞ@B@ܞ@@@Ƭ@@@d@@:@D@h@,@@r@@B@̠@@d@.@h@T@H@@@,@J@@̠@,@@,@@D@h@@:@@d@Ƭ@@@@B@ܞ@B@ܞ@ڬ@|@@@h@@@@8@@@@@@@@@\@@8@@P@4@@b@ @@@@d@s^@ @4@@ @>@f@X@^@@@@^@ާ@v@@@@@@4@4@4@4@@*@@ @@>@t`f@ڧ@@|@ @ڧ@f@@@T@@N@@|@@z@@<@ԧ@ڧ@@ڧ@u@6@@X@ \@N@@@:@@`@n@P@:@$@6@@`@ȥ@@@ƥ@Х@@@0@@X@\@N@vxΠ@T@@@,@@ @*@@@@@ @@@2@Π@:@ޠ@t@ޠ@t@@@@@ԡ@ƨ@&@@@@@@0@@0@@@~@&@§@x@@@J@J@@P@Ʀ@P@Ʀ@@|@@V@@T@\@@x@@d@@4@4@4@4@@@@@v@@^@ާ@@@^@@f@X@@>@@>@~@@l@@@@w@@@h@@@X@@V@@v@@<@@ަ@@@@L@@@L@@@6@@h@@|@n@@̩@@̩@@@@f@ @Ъ@ @Ъ@0@h@ȥ@,@0@^@0@^@"@@4@@@ @@@@@@\@@@x"@j@@@@b@@@@z@ҧ@8@\@@¨@<@@.@>@ڪ@v@ª@v@ª@ʩ@@@@@@@p@n@@@j@@j@@@@@@@@@\@@@ @@4@@@"@@0@^@0@^@@@@b@yB@x@T@@ @@@@@@>@@T@@:@@B@t@B@t@@@֪@"@@@@r@F@@ک@x@@@@@b@@X@ @@֧@B@@@@ب@l@@@@ܨ@@j@@j@n@@@p@@@@@@@@@z@@@@|@ަ@@@֧@@ @@@@l@@@@@@@2@ڥ@`@@@@@@@f@@D@v@Ҥ@@z@@h@@@`@@@x@@x@@@0@ @@x@Ц@&@R@f@|@ަ@{@@p@>@0p@Υ@\@ƥ@>@@@@@x@,@N@@ڤ@@ڤ@@@@@@ʤ@T@@b@j@<@.@@@@$@f@"@f@"@$@t@V@@T@(@@6@@@x@¥@@@@@\@ @F@^@@x@@@@@l@@~@@@>@@>@@ @@*@4@4@4@4@d@@x@@\@@@T@@V@@|@P@Ʀ@P@Ʀ@p@Υ@|`@@@@)@P@@0@@L@@$@@ʦ@@ʦ@@@@@@<@@P@~@@~@@@ȥ@@@@@p@Υ@p@Υ@P@Ʀ@P@Ʀ@J@@@J@x@@&@§@@~@0@@0@@ȣ@@@@@@@̩@@̩@|@n@h@@6@@L@@@L@@@@@@ԧ@@@@@@P@}L@@b@@2)@P@@P@@P@@@@@@ԧ@@@L@@@L@@@@@ަ@@<@@v@@V@@X@@@@@@@@@j@@j@@ܨ@@@ب@l@@@B@@@֧@X@ @b@@@@@@@@@@@@@@l@ @@֧@@@@|@ަ@|@ަ@@@@@P@@ڧ@f@@@T@@N@@|@@z@@<@ԧ@ڧ@@ڧ@~T@@@|@P@;.~@@@P@@<@@@@@@ʦ@@ʦ@@$@@L@@0@@P@@P@@P@@P@@@@|@ަ@|@ަ@R@f@Ц@&@@x@0@ @@@@x@@x@@2@@У@@У@Ҧ@ƣ@@@@@R@@ @@ԣ@d@@@p@l@ڤ@z@@v@.@@@V@@<@@@@@Ȥ@P@@F@@ @T@(@~@@\@N@@@:@@`@n@P@:@$@6@@`@ȥ@@@ƥ@Х@@@0@@X@\@N@Ъ@̐@@Ȕ@@̐@@@Ъ@@@@P@@2@@p@ԓ@t@@t@@@Ȕ@@4@ҫ@d@@`@@̐@H@@"@@"@@@@@P@@@@X@"@@`@}@v@@ @p@ާ@@v@(@p@~@@@~@0@}@Χ@ @ҧ@Ȁ@@p@Ҧ@h@@H@@@Ҧ@ @Ҧ@ @@@@@@P@(@@@@H@@@@@@@@@H@@@@p@@@n@h@4@h@@@T@ @ڭ@p@@(@F@p@F@p@@@@\@T@ؕ@`@\@ڭ@Ԕ@ڭ@Ԕ@ҭ@@&@@B@x@@d@@d@~@l@^@@~@x@t@ @t@ @@̐@@̐@@`@ҫ@d@@4@@Ȕ@t@@t@@T@@d@@@8@@(@0@Ȍ@@@.d@@N@@@@@@ĩ@@@h@@h@@@ĩ@@@8@0@@@v@@>@@N@$@r@0@n@@n@@@h@@,@@@@@t@@t@v@@v@(@@(@@(@@8@d@@T@@t@@t@@p@ԓ@2@@P@@@@Ъ@@@@@̐@@̐@<@@@@@ @@ @ƪ@Ȍ@@@@d@@ا@@@ę@@ȕ@@@$@|@ا@D@@@^@x@n@0@@@@ܘ@ި@̘@̨@P@0@@0@@p@ę@ @x@@@@ @@t@@t@@@@@,@@h@n@@n@@ب@4@Ҩ@ԕ@<@$@@ȕ@  @@ĩ@ԕ@!@@$@l@@p@R@@f@d@ @@ @@§@P@@@@@@ȕ@@ȕ@<@$@Ҩ@ԕ@ب@4@n@@n@@r@0@N@$@>@@v@@0@@@@8@ĩ@@@@@h@@h@@H@\@@@@z@@$@@@@4@8@$@@*@8@@(@@@@@@@Z@Ē@Z@Ē@4@<@@(@@@@@@@ @@ @@f@d@R@@@p@$@l@@@@@@@r@Ѝ@*@8@@r@Ʀ@@}@@r@H@ps@V@pv@@ w@ʤ@r@ʤ@r@@s@P@pt@@v@@v@H@w@@x@@x@֤@ x@l@|@@P{@@@}@Ʀ@ z@Ʀ@ z@@u@@t@@r@@@q@@@@82@t@@Px@@@z@@@{@ @}@ڨ@X@v@@@@@@@@z@h@@؅@,@@d@@@ȇ@n@@d@@d@@@@@ƪ@Ȍ@@ @@ @@@@؊@ @@@`@@P@@@@@@@@@@@@@@Ԫ@`@@P@@@~@@0}@*@@@{@P@{@@Px@@Px@t@Pu@@s@@s@ު@q@R@Pt@ĩ@t@@r@J@r@@t@"@@@@@P@@@@X@"@@h@8@n@@*@@4@h@n@h@@@@p@@@@H@@@@@@@*@@*@8@*@8@r@Ѝ@@@@@@@$@@z@@@@\@@@H@@h@@h@ĩ@@@@@@N@@d@@d@@n@@@ȇ@d@@,@@@؅@z@h@@@@@@@@@@8@@8@@h@@@@(@P@@.ި@@Ψ@̙@Ψ@@@ؚ@@(@Ψ@@@Ȝ@@@@@@<@@4@@@̩@@@d@@d@@d@@@b@ @4@@@P@@8@@\@@@@@ @@ @@@̚@@@ @@P@@F@p@F@p@@(@@(@v@(@v@@@t@@t@@ @@@ @x@p@ę@0@@0@@@<@ި@@@1@@@@.%@8@@8@@8@@@@@@@@@v@@ڨ@X@ @}@@@{@@@z@@Px@@t@@t@ܨ@ p@@g@R@I@@1@^@1@@@`@b@@a@@]@̦@d@@ g@@n@Z@n@@r@@r@@t@@u@Ʀ@ z@Ʀ@ z@"@~@@@@@0@@(@@8@@p@ާ@@v@(@p@~@@@~@0@}@Χ@ @ҧ@Ȁ@@p@surveillance/inst/shapes/districts_BYBW.dbf0000644000176000001440000004165511731650466020572 0ustar ripleyusers_ySP_IDCSP_ID_1CidNnameCX31_12_01N X31_12_02N X31_12_03N X31_12_04N X31_12_05N X31_12_06N X31_12_07N 8111 8111 8111SK Stuttgart 587152 588477 589161 590657 592569 593923 597176 8115 8115 8115LK Boeblingen 367830 370337 371678 372113 372155 372228 372755 8116 8116 8116LK Esslingen 505340 509495 511564 513105 514245 514108 514503 8117 8117 8117LK Goeppingen 257651 258488 258707 258492 257783 256967 255807 8118 8118 8118LK Ludwigsburg 503229 507043 509681 511830 513317 513998 515146 8119 8119 8119LK Rems-Murr-Kreis 412959 415764 416635 417463 417697 417609 417131 8121 8121 8121SK Heilbronn 120163 120683 120705 121320 121613 121384 121627 8125 8125 8125LK Heilbronn 324043 326229 327540 328866 329503 329979 330302 8126 8126 8126LK Hohenlohekreis 108920 109519 109755 109756 109718 109717 109900 8127 8127 8127LK Schwaebisch Hall 186967 188229 188563 189041 189580 189346 189288 8128 8128 8128LK Main-Tauber-Kreis 137508 137284 137474 137736 137259 136296 135387 8135 8135 8135LK Heidenheim 137055 136957 136337 135737 135174 134164 133449 8136 8136 8136LK Ostalbkreis 315345 316495 316812 317056 316760 315661 314624 8211 8211 8211SK Baden-Baden 53084 53643 53938 54301 54581 54855 54853 8212 8212 8212SK Karlsruhe 279578 281334 282595 284163 285263 286327 288917 8215 8215 8215LK Karlsruhe 422952 425768 427149 428312 429603 430351 431519 8216 8216 8216LK Rastatt 224309 225896 226669 227549 228408 228006 227929 8221 8221 8221SK Heidelberg 141509 142575 142959 143123 142993 144634 145311 8222 8222 8222SK Mannheim 308385 308759 308353 307499 307900 307914 309795 8225 8225 8225LK Neckar-Odenwald-Kreis 150091 150951 150920 151131 150628 150022 149572 8226 8226 8226LK Rhein-Neckar-Kreis 527796 530608 531649 532788 533993 534220 534989 8231 8231 8231SK Pforzheim 118002 118785 119046 118847 119021 119156 119423 8235 8235 8235LK Calw 160115 161249 161524 161530 161069 160341 159644 8236 8236 8236LK Enzkreis 193873 194839 195379 196083 196417 196159 195457 8237 8237 8237LK Freudenstadt 121682 122275 122369 122407 122579 122275 121865 8311 8311 8311SK Freiburg i.Breisgau 208294 210234 212495 213998 215966 217547 219430 8315 8315 8315LK Breisgau-Hochschwarzwald 243043 245342 247002 248400 249535 250013 250183 8316 8316 8316LK Emmendingen 152953 154506 155160 156069 156728 157265 157629 8317 8317 8317LK Ortenaukreis 411491 413008 414292 415405 416410 416973 417754 8325 8325 8325LK Rottweil 141761 142302 142322 142357 142148 141765 141551 8326 8326 8326LK Schwarzwald-Baar-Kreis 211321 211922 211807 211712 211320 210617 209709 8327 8327 8327LK Tuttlingen 133866 134407 134614 135035 135297 135291 135306 8335 8335 8335LK Konstanz 268859 271373 272966 274096 274692 274752 275120 8336 8336 8336LK Loerrach 219149 220523 221098 220689 221357 221787 222528 8337 8337 8337LK Waldshut 166114 166864 167057 167266 167274 167168 167200 8415 8415 8415LK Reutlingen 279177 280613 281690 281779 282049 281891 281580 8416 8416 8416LK Tuebingen 211058 212993 214365 215835 216477 217172 217482 8417 8417 8417LK Zollernalbkreis 193196 193696 193387 192961 192722 192138 191531 8421 8421 8421SK Ulm 118347 119155 119807 120107 120625 120925 121434 8425 8425 8425LK Alb-Donau-Kreis 187000 188146 189101 189717 190233 190189 190212 8426 8426 8426LK Biberach 184548 185980 187138 187885 188532 188810 189089 8435 8435 8435LK Bodenseekreis 200948 202449 203523 204392 205446 205832 206759 8436 8436 8436LK Ravensburg 270572 272273 273681 275079 275677 275900 276470 8437 8437 8437LK Sigmaringen 133671 133852 133889 133732 133385 133078 132419 9161 9161 9161SK Ingolstadt 117311 118416 119528 120157 121314 122167 123055 9162 9162 9162SK Muenchen 1227958 1234692 1247873 1249176 1259677 1294608 1311573 9163 9163 9163SK Rosenheim 59310 59820 59988 60108 60226 60394 60674 9171 9171 9171LK Altoetting 109023 109590 109611 109367 109227 108789 108773 9172 9172 9172LK Berchtesgadener Land 100626 101304 101738 102177 102587 102407 102383 9173 9173 9173LK Bad Toelz-Wolfratshausen 117416 118152 118731 119678 120633 120308 120834 9174 9174 9174LK Dachau 131345 132267 132990 133480 134382 134965 136272 9175 9175 9175LK Ebersberg 120416 121612 122136 122913 123895 125052 126400 9176 9176 9176LK Eichstaett 121031 122466 122972 123181 123233 123745 124419 9177 9177 9177LK Erding 117949 119216 120568 122123 123094 123703 124876 9178 9178 9178LK Freising 155396 157161 158140 159367 160655 162452 164692 9179 9179 9179LK Fuerstenfeldbruck 195869 197392 197995 198901 199783 200362 201148 9180 9180 9180LK Garmisch-Partenkirchen 87408 87709 87441 87013 87351 86923 86872 9181 9181 9181LK Landsberg a.Lech 107609 109025 110303 111281 112080 112283 113311 9182 9182 9182LK Miesbach 92720 93350 93688 93942 94970 95045 95267 9183 9183 9183LK Muehldorf a.Inn 109733 110570 110840 110940 110930 110623 110536 9184 9184 9184LK Muenchen 299883 302750 303604 306182 309080 311493 315462 9185 9185 9185LK Neuburg-Schrobenhausen 90224 90810 91084 91254 91181 90945 91067 9186 9186 9186LK Pfaffenhofen a.d.Ilm 113111 113881 114489 115382 115809 116014 116407 9187 9187 9187LK Rosenheim 240106 242729 243714 245132 247057 246828 248047 9188 9188 9188LK Starnberg 126588 127478 127723 128283 129091 128789 129515 9189 9189 9189LK Traunstein 168827 169600 170264 170449 170906 170440 170546 9190 9190 9190LK Weilheim-Schongau 128543 129667 130253 130632 131034 130777 131317 9261 9261 9261SK Landshut 59513 60075 60282 60545 61368 61923 62629 9262 9262 9262SK Passau 50669 50810 50683 50537 50651 50644 50741 9263 9263 9263SK Straubing 44316 44364 44473 44683 44633 44504 44625 9271 9271 9271LK Deggendorf 116558 116943 116967 117284 117492 117517 117594 9272 9272 9272LK Freyung-Grafenau 82553 82471 82363 81975 81582 80771 80427 9273 9273 9273LK Kelheim 110918 112051 112846 112939 113237 112927 113088 9274 9274 9274LK Landshut 144504 145892 146857 147736 148101 147990 148286 9275 9275 9275LK Passau 187355 188090 188533 189027 189142 188474 188462 9276 9276 9276LK Regen 82721 82555 82162 81796 81416 80748 80195 9277 9277 9277LK Rottal-Inn 119107 119416 119729 119727 119598 118944 118800 9278 9278 9278LK Straubing-Bogen 96035 96902 97485 97848 97797 97734 97810 9279 9279 9279LK Dingolfing-Landau 91218 91907 92092 92081 91906 91644 91481 9361 9361 9361SK Amberg 44217 44443 44596 44593 44618 44394 44216 9362 9362 9362SK Regensburg 127198 128029 128604 128917 129859 131342 132495 9363 9363 9363SK Weiden i.d.OPf. 43071 42821 42684 42775 42672 42496 42445 9371 9371 9371LK Amberg-Sulzbach 109083 109044 108886 108784 108159 107683 107069 9372 9372 9372LK Cham 131416 131622 131489 131306 130871 130111 129605 9373 9373 9373LK Neumarkt i.d.OPf. 127312 128027 128625 128725 128613 128529 128488 9374 9374 9374LK Neustadt a.d.Waldnaab 101043 101444 100933 100480 100081 99496 99007 9375 9375 9375LK Regensburg 178095 179389 180354 181406 182193 182388 182721 9376 9376 9376LK Schwandorf 144370 144751 144780 144904 144748 144411 144089 9377 9377 9377LK Tirschenreuth 79804 79359 78875 78399 77729 77089 76549 9461 9461 9461SK Bamberg 69396 69726 69899 70026 70081 69574 69884 9462 9462 9462SK Bayreuth 74519 74558 74818 74548 73997 73503 73097 9463 9463 9463SK Coburg 42798 42629 42257 42082 41950 41638 41283 9464 9464 9464SK Hof 50654 50150 49685 49163 48723 48191 47744 9471 9471 9471LK Bamberg 143107 143877 144268 144831 144825 144993 144949 9472 9472 9472LK Bayreuth 109249 109302 109404 109219 108724 108256 107649 9473 9473 9473LK Coburg 92199 92205 92053 91785 91325 90786 90244 9474 9474 9474LK Forchheim 112838 113331 113258 113447 113543 113397 113389 9475 9475 9475LK Hof 108744 108198 107505 106632 105715 104613 103686 9476 9476 9476LK Kronach 75458 75038 74582 74275 73678 72909 72289 9477 9477 9477LK Kulmbach 78674 78266 77940 77556 77141 76641 76153 9478 9478 9478LK Lichtenfels 70874 70984 70640 70350 70057 69519 69045 9479 9479 9479LK Wunsiedel i.Fichtelgebirge 85278 84391 83365 82627 81631 80505 79433 9561 9561 9561SK Ansbach 40412 40537 40708 40512 40624 40412 40330 9562 9562 9562SK Erlangen 101912 102198 102449 102578 103197 103753 104650 9563 9563 9563SK Fuerth 111257 111784 111892 112506 113422 113627 114130 9564 9564 9564SK Nuernberg 491307 493397 493553 495302 499237 500855 503110 9565 9565 9565SK Schwabach 38518 38633 38586 38630 38791 38862 38753 9571 9571 9571LK Ansbach 183668 183967 184333 184576 183755 183052 182293 9572 9572 9572LK Erlangen-Hoechstadt 129751 130455 130660 130652 130489 130788 130873 9573 9573 9573LK Fuerth 113530 113840 114571 114297 114024 114203 114483 9574 9574 9574LK Nuernberger Land 168693 168811 169146 169075 168389 168111 167444 9575 9575 9575LK Neustadt/Aisch-Bad Windsheim 99156 99618 99768 100033 99979 99490 99106 9576 9576 9576LK Roth 124963 125280 125722 125757 125708 125306 125240 9577 9577 9577LK Weissenburg-Gunzenhausen 95176 95349 95227 95054 94660 94163 93711 9661 9661 9661SK Aschaffenburg 68361 68682 68607 68703 68642 68664 68646 9662 9662 9662SK Schweinfurt 54568 54670 54601 54467 54273 53970 53798 9663 9663 9663SK Wuerzburg 129915 131582 132687 133539 133906 134913 135212 9671 9671 9671LK Aschaffenburg 174577 174863 175214 175406 174974 174543 174168 9672 9672 9672LK Bad Kissingen 109498 109382 108926 108607 107988 107267 106628 9673 9673 9673LK Rhoen-Grabfeld 86717 86811 86824 86731 86094 85313 84676 9674 9674 9674LK Hassberge 88412 88301 88256 87878 87607 87063 86477 9675 9675 9675LK Kitzingen 89104 89335 89498 89525 89501 89378 89293 9676 9676 9676LK Miltenberg 131369 131568 131548 131543 131376 130692 130303 9677 9677 9677LK Main-Spessart 132206 132393 132090 131770 131218 130678 130148 9678 9678 9678LK Schweinfurt 116874 116868 116653 116380 115924 115173 114657 9679 9679 9679LK Wuerzburg 159311 159845 159836 160080 159978 160222 160761 9761 9761 9761SK Augsburg 257836 259231 259217 260407 262676 262512 262992 9762 9762 9762SK Kaufbeuren 42246 42665 42581 42430 42183 41945 42043 9763 9763 9763SK Kempten 61505 61609 61504 61576 61360 61480 61703 9764 9764 9764SK Memmingen 41101 41132 41133 41191 41107 41111 41021 9771 9771 9771LK Aichach-Friedberg 124501 125534 126711 127238 127446 127531 127785 9772 9772 9772LK Augsburg 238536 239979 240874 241494 241381 241033 240976 9773 9773 9773LK Dillingen a.d.Donau 94435 95005 95417 95626 95512 95124 94759 9774 9774 9774LK Guenzburg 122114 122574 122942 122636 122450 121833 121691 9775 9775 9775LK Neu-Ulm 161110 162214 163082 163504 163387 163495 164135 9776 9776 9776LK Lindau 77850 78240 78643 78900 79467 79733 80139 9777 9777 9777LK Ostallgaeu 132389 133196 133782 134206 134766 134551 134462 9778 9778 9778LK Unterallgaeu 134920 135300 135804 135858 135708 135699 135898 9779 9779 9779LK Donau-Ries 130335 130833 131222 131141 130969 130321 130035 9780 9780 9780LK Oberallgaeu 148315 148953 149474 149959 150507 150396 150690surveillance/inst/shapes/berlin.sbn0000755000176000001440000000037411731650466017235 0ustar ripleyusers' p~ A80 CZ@eA=d /`AT(i^ ] hiv'sVx ` d׳ v$m Mr$V^@El\surveillance/inst/shapes/districtsD.RData0000644000176000001440000025773012010434201020270 0ustar ripleyusers7zXZi"6!X㦈])TW"nRʟXgqjn]LY~S5ttma=}2T:&N'z%N/֐#zQ9neLs \xvfa(O eJ!oTDqAߞkJ֌,<?MbtևVa|R-dYLӸ*ƣ%1ꬕ[ctcRH5-mg?!ʻap9rيj^[Ǧ歭9]"|Y`oM z||a`DލP,Nt}VXZ˧V@$vj`)$K^s4hʷɩjBZD/_8`IW^]Rhj|~~ Wsp)q":8.eUti^ԚASN(mO%> ^(waTC\ 6Σ'+#Y3hÔPߌH2m@yߴ)jYކXzS8j4W{ۤQaJUp8(S QŷV'JQ+S5J m2Xul]뢹ǃzd76͊{cAkzO\Re~Deݲ?׼mMv&WEzqk[;ϸ(+wM$bլm*#tL ͹Xs~9kKZ<VX$Ofny(9wC+ԃy(5@z0U +:+`o76`*7v3:sgep(z] [ƽWwF( ,:W5Zߣm. xC'\g0z2)N0K[3p(fCmˍ+NǙcFMJ~[{QያYNB:l6aYhN:|xg*Yճx*wu|xín*G_-L_2tś[2k]Ҧ4]QC48.IBHN=G䨳oIK}nvBSX%T㋉S~d8|9pjo}hOarCz+ӹ"! QT( ֧܏ YLma` ;#  }QzѳNSkl&8VU"M߮RH|=us ~Pj8}=x'<0@HhM.'>kFCJ256+Mɇxk&XW1Cׄcy鴙PAf |;1<7T)8A#8cIh;k.7Ulפc #W`ϛ <ݚX)g =ԩ 7~u{r5ragj/!% ^nDH=W;W+]*?Z1I p:[bHt\U`%XPʣLRku~^/ī^!R*>i,TF4D/OӝJǻ_?3?V:Js3v?XpJ05>[B>4C}̝ PӲg7g^G3gwU <L[0E*2! I"Ǫ1[8-;_7d~b+g^Uy%dIt+|ዯ)*M[| \57yD% ܳc ^8ᜊҮ!۝r'zjyhOA~uH%Z%{{Ԧl|>B#~ aB >k2O&TMZs@O݋NҡMrfg`7_ Ȓn+W{.R_BBu&3NFv$$qճrTa]nl=T0Dr19~bU%Qtj@r.ՠ;k- T>._oa&!kx}?QN(F~+#̲ix=z^ݍ;5^š;.D ^n#!NXP6pOB]q?NR< B=t?"E {4>AF!NaS\}) Y^NE u%CߢrI*z>x}{yn]|ҷ_'|C\F 7&c# n^fG_vNT0d51޻ڸ.v%C`WSR[vzZ|ߐhf zx+M-<4`C r8/#5jVrMi:Q4D0{)%Mߧc+kúUiVr0>{Ӱ>+P0%D搴性׻4)TԴݧYB&%A;*~") 3ֲCyjhei*ZQh0`ۅx~Wt (-)qJr!A4T"ՓEk̂򋾞!K{ x+O4êo4[]̞QjuR 3+_> 2KDp񵡰Tjwۮ pWbθ"(lyl~] cY=zvϢ+1eZ*/x̔g"Ch9!,ʽpHE$p-P]l6P듚h>k05)ݐS۾l]R՟(}[nH}(|N um/t?@ V i-9vWj* d 3mO4uڊ9E%<=я,]lt3?_4[SW@sOy xΡxuiVR Qm$(HF8鶮o 5VOF_;1co"#ϟ( rm]WJjF]|86lyoU2M ,[<;i%@cf{Ѽ7C!ZQUm_B?`υ`LRY e'H6EfPǣCZA8n6hP? &;si;68_ı-OnӢK3eswrXf) `6@ ,f1)(R |JٳdD uΉC 9~,hK7-o!2.jZQ/4Py?rT ٲq qKT=*Jj| p$vpSo|,>'wp.ۡDA3p _۲l@&ndajpZO ?thXa0LFbBh鎪"{vzj8OD2<5P[Mء`^Z*߬i d}|ɴ.ɮwۡG߾ 0<扠D 3nd bQ?/r䩒'UFʫ22a I._yNgR*aqs(]P]<_a!/9p6b] T8o4S@i.r7SBr*\FLsDEuqsW1z88בKOB-qrPmɓ>,m+mAICα@ໆp;,9P:M3ld(|l@1aHDEC(u~IjyO'\Zo<2?m&+Fm&AﶓZi='SXf}ňSwyuqp5sYJ18V;W5:MdU%2/_WFw5TzF?z[\pFEHǃ>0/M/4f=>˽IQ؎z7W= @ȯ 2UB|xAF 7V6\1I:_*CB&R}AOb}Lxw0 0. غ=* c W+Ut#HwICT`|RR0G_),(iXQÏiHiX0L$f@.t t䡡dz\g ˮHu3S]PNLhY}:+]XD¥G٣oʧ1֧mV:E^پC?vzJq=}#2؄=u DLw%.h<ɍ3]qќj ȾsxT,J5"ИH⺴ >fI9cWΉat;@- oefSD^꟨έL5WkUI\Uk:(؛|-l]{g#gw=2!'Mc*(X[ɺ+SB-LD1`>hv,q"Hw˴4: ꫴP#@(U=Tke ?Y<(p`'ٽ 2 9K$NE%=fHkZ6ķ-ƙdC vp2 @uM9mv6)|{w>&;w]OM]F Ҹ(j<r-wfUY6{ƶܩn kH>`Fc@hzo֎x#mcg; >6/EbS%w֛|R-f0B&qT~mIvɟM7=|ZFv'VD1|~71/n`)a!A񣵺bA ~^Vɾ|~aH(EVX[ 1b"Կu'?(jĞ%&Ő]Јt_H#L`n~-1 M޸g'O.ƚw{v{*/o>8lR&*2XR?y /(]l\/4t=rNIaH]ͮ\w6H_ݕ r1l5Z!ƒv8GWӓͱQ5 ͚W6@z#]Y!zX |+Ԯ8d|4ҷ{?w, ,ߋNo& KK,9!WnOߡk:Kʢ5C U%JCJxjvC: 9WHzEu{Q6= SpP iykR*,>n˖>#{#1OkOˁRUᴼ]Ek0K$)tPP()Xd k{L%8 xne+`NyL@ h1T@IRV3RL@mFi5TPAoWi^ s>7XJXbl:ke{)ٹ.cIU\ypzܠՃߗ3[z`|K ꎹ4ua[y|aazqEYkaypiʐuWoc&JuA*$1S^oKZuZ Qe撗Я7wT6;d#^J >WwlI?&:,h]V-]C,6-[btraRϖ3mA2@s~CXDW[F'FزTXJ-YQjwґxgsM+:JrAZ&"kT)Ra%}Z]7/kAXC{zyfx/72P9UP\-.acMƦX'ë t2݁s3Ҧ;j= 㙖M>/_302id)- yH $Y$c]XpO3^Lx\8dCŚ-2p&^\vA쏻g| A0ЋKiN'rmzgciu3:OC쥐K(n/rwYXaX]ilZfIS-Wsߥ/LH1h [tzz%^CWYȟmKٜy*V?:Uj k׉s,P Q$=KCh0J]s&Yq+$6"찭J1Ԉc|€Z̬{ԟq#Mcmz%Ǯ \#׎") -1^sORĦ#34zwn;=H]M^1C׼z p$]h(W? ~d_C%&ՙx8  ^ӣ1~b*\rI&QávzOs@D lAmkWN$+&\yCH>;%ڵK3=6xM[=to~^t;B"NJekiII }M҉CdBLU40ni&\ uhePdWp+' Ĭ܁=#@_['|7Am5{E#?m-ygٶ;@I?L\(!LLcQgvA(&+moa߷Qzc+\]&d'mG{,@L "@jAz`S胔S]@N*) +5yVJّ:B 17KwWqs;'UX2JI]*! 2F$Aı~J:$a>E]iA$9!sHw< @4y[L GƂmIkWfT--G&Jg|7Oi qo"T<lsܥjR4TK4 ~Ԃzz<`n|Lܬ,?*MnI⯡ܮMfPmp|v{D9n?8g_餵dY$GU@I礭;yY>nJ\1otq$3(}h; gxbd,I1Flʵ>(G|9#tEܪzFw?k0Y&?`["c)(R=âv5Ny+鯸H$޺KZC)fag:Ҽ2S5uWkb O"0)\~]*aLCy'Z{Ú~Y?Q0| fѐ:U#zэ4Bh|$`I˗Mtb^QI/I;?_89)֘u]nSM^[.HL3^S$N [#\POzG|=Puɣ2B[ƁZxST&Yw82 }Ts1>P1ndrx ][FF,<oB5|{i7T:)% _в@cz#Dp]ypyl]L)u >1>l;`ں-mR%B#<mU M +k` mkV$\{-z1WלhSLc#7%X]ZF*UcBݾD1/`x?Mj*%1SAxhmѭX<ƽnD D0мˤ̺F=(55Chj.v&4c͞㤶gBU.@~G 1exqVpu|.|6מˍ4`,:!jz]I}#@&ʶy0=#d7}OKYpl]ZDr6CdD9P)ͽד^P1xq2X8]F0|q}->"UV=1Y=no{ͥp>u-[o [vl'(l6; c03:J"Dzt!\{= VmA{Cb'Qv-[qqnc24ÙC"-kPG`MaN=sOӿ 𲇄4r~7d\vo8Go! Wو᣻ãWqW:U0]꠪Rp!"<,&G6ee&Z+Y-hM0$eVXzUCF& 쿻D2=8H5h2[fc%ӿ*?F!c@3p牵 :Nj!LַjΠIyVVǽkEouqeN 듘4j V,D"OK0BKw-,CK"VfeTF(H 0ߘLJ!bUPYoa `(3>Yl5m`Ka aac4a!748s%,|h!HL[\`.*,4 N܁ܾkMn9 9nr$h #Wꂍ 5_ {hc DLq1W}e~k(ǽ*bGd `X 5+=7Av l {2[R#3Aߵ}pmig̲̐-~4]vDSڏQ#:볠o?r/a&ET)c(1{Tn"b;6C'B@"I2?0V~B軩34&B/E+N1CޔPnLrQyO,=EF>Uz#SjX'A)\b<_u3 -񿹮i100NPx4hIvni~fK%|D5m fɊ{?{<*,R 2^8wt1m?Z WBPNW-0$Ѥ,)IMu4s$Buu&Q @4zNZ5:kKgj"RLp' T.1N՞C+u6N/3iE$!叝cQlMBrnď ڴLQyƻ#gV}4PN(ccaH#E3ة!;O!b!=q6o}@򼣡=8溓&^Hj&EJ+ 4~Xvq}VrD,:Фk:uqKАp5Ҷ +{C_r0tg8j'z,@L(KS>bѬ@?s,+VcOG2HCKPu8oee]ZWW#$q)B<6o9G7!@lAB #v2[wV9G{G0L6:r#i:mڰ_#z/s6&۵`¤faI4n'(6mn٫^)9xDDi1p\D5ʦިblݧM5![ j#|wJ1$/@dF{ГAs%9j%"(rسKpyl$^OUڪABXS~xw+x5N'N'1v<Z J{WWG>?ѝx 1,KPs ,o&z| ŧ?$ngxmV%E@tqݟ`'fNj>Lx F' aIiQHcӾLYEQ}~`gjREjîh[ʸJFbj?ǍD1**f: 9a"es[fH?9뤳s24ʼ>AiTMP}!& `sh(c_<\Jpz>Dٞ4ڼŻT(pkt;IU7' TnTEAC1Y2_apt6hiYr)))iQ0k $IuZP5ݏԕ+Z/ZȬWPB|q37w4,KdFEY˶A i™q'3έUl-f0vQĈS.^i;az ܽ-@vɡU¿>nؘJy(g5TR/fޘt}tt$L;l=N I2eW)A:BWagş6Wi2VtR- -x:ќ^bf=rjNCgUʕAE 6_-;-<%im,^>Cq*ºa<޷ƐK*s 4 N65z$I Q7[ *tX됋Q#n"dc R?"jvoQ$UI70͕qAޢֵAzuGHK 8w.nV laL?vUSUHi)WbwU:G(Ccro^mGa\3 I nր=s9'z=a-Pێ?kmDAq$+Cw(+_ KY@UIlV]aN5P{*xcb갂)l̪? it?F¼$  frHV[S!R:E2]A0-dguqw,]5bzҖmÌKa[ 2#1Lnjwi13IJ_ue,{yT?*w$s\m%k>4Թ]_ǑOM40ڕ4%RTpZ rЍyZ`>hٴ Ѻ!*ǙgV9!aAOs)ne= Hoi 0+W- %ON&Ͳ`'Rajܠ nng ZU#_Y;.N6f]WZ>s)#qkn~z劉8m _W|MNÓGe>c8. ̣JG}Lci1!?S!w \@24TS=0`Ud5y`stŜuj/j\Oyω95 Np7f.R:<nG*RK.ΡZiwuPVWs):x|9O@ט)$W؊)2]5#q;v'sNDxYA/0zo wE}$c 7?TӏkEt_"9e-@,ꙀE{TT֮zNw/C0P "f;OFcKe"Ek]_9$ --BD^GQ2MT,P+{;FƙF ޅ<0jYjnٱ+]YAECiK)hbYmjI Rb/Pma] Ppo` u5Sa&WKRn#/{^ ܶ@1yyo' +s'AL4w懜5%sVzwP=[W*Uc ߊǦָ'_Fp=ȇ\:p_Jlh>NxW pXAbzE*SD^p_X/:y܂/Y:o&gQ&>FqP+z%ICגn/ZGOmЕhINZ;$3>5U#K ն'_1Ãh 2qF0>ǭGQ0r2O6ƯCi=q4ݑ[05&Q%I&F,44S87}C% %p1&<%.kn!ǗWwyV`t#PKQ(,+79}1m`b1 ~S\rQn8_ wl|ȝ` Zn{GR/,ģ+^h#;*qGo~Y)1`tF~Ψ %`?gt>{KR'EȀN9^_-*nDRՒ>AntK70͎[P"Sq0Tz׬%LoQJzĆqLnYN;_t5W9C He#g'-$"ﰠ*j"Z+UJyϧ¿[.FC-G*9D$hdpEXb_&!1!1[1qN2Үd,'fz¾Q+nӒ򋇰P{JDg9ܥǬ )^P 9Z{6Ԡt&"ʣmݔABZ{lgsփ#2*t5V5_+84;GHʠq߅MABl"qXRwћb^6>!'1A@\0ȗML=zI,H}JD \-z#g|svrd(r)$=l}deMyfbAyט)yr7QY}y%ʹI⻥Ɩ}Gn-`2dp;ׅ|sy_NBB[@ exxl9'Dٚy7vŖ Sx|I^XtLUa1K IteN e%pzUVBn#ҢXm&ePk<:&_{)*Z2اy~An҈u^"opѹ?k[1a8c`-yCVAӯ x^E-La5!ߡJa[9f<0"0LDR`,OO lx&޹"456\A=.)2N.>J959kS^/5g5G~l@a[ci<#(1b3q?AxN?4N47w#v*۫GT!IHѴ-P.K ~?^ 9Uob?v2hJx|z:~;GPv~PJƭץAu%1C!م#wUPl_ :'~;'*> h׃}J.\tx~N2Y'%;!c8AE(cDVO{}*凘j]bBw8LrXdX#hHuGa(D#T[N#;μ:^iXгpkMSpb;%!: Xh xv mB_v GCE13\+V$CdilAܡnfX^F$UAUc9Nߡ SIDH OeN=Q3UvY0a4܁kU?o10ݹNk)$4ޙ"a2 {Ly.4s+2릹֯w^}7ium{EXeP#Tt)+0Kф14>=j.UOuR{ IME+J; #{W<Ϙ&}I@A(Y}%5!q.UhRE8"DbEyٲ+olt%f2#—6 OhO_VAcEs苖9׮jY]d |>E&O]΍OJ+,Z?0*f;%9A-'*ds]TG :vaMjL~cwm5HR?PI+ r0d7Ntr@%J4-̧*l0cN۸&*_DI ~OT~g(jǁj!cHE ~.9{礽.w j&df-:~X<֛݀# P2MU?@j)G\<*>jrRTR%`Y ޸lWM:+iİg^b#o6Wpz2HǶnI+!=#SB&o00k敾<3 cjP0 gba=O ,tbiyW,6.`w(D1Bϟ:y"Wx`_@#5ʱ}]ڸ8JFF#';c;rh5+UéYV4y~EKm4Blŋ$>V^^]ًNlnF{wPl缩B u> {< _iuvI*X#f [E f)ٗr \8SlO?ƒ(&D!f᰺LQj{[7rZV c!pR֎9}4hyW!A#%)$]kN5g:Q8wY*TQ'W W7ԴʼĂ~iyShFT?dӺT^O[{ |x 41p"`ѫ!w[K5m'b,*`9Jɟd,9y`!Zxey+=Q4Uvј5#v,3h:1&(ԧ{TPO$-}o63-PV}M)y(pV?:=aB́GJB)oz OgYN{gF0f}LX1gx`ډP@!o_a8=5$R1v$ȯySxё`T6h`u918{CIh2琜&NcLkWQV"oVŤ5fۂ =<=[#i)[ǧE1DnyL AqD˘pڎHﮆr{a]2#p">)q":/jJyL Hͣ ŵL5 -9zڋ Thl.h!JrΛ dZ:=Ptg⠧ #aHI&VY)L /# _&|lȸL|S\J=,wmvh6JxP(T)Ws ]9|C^nm T޹yL{?PB2&n"Zʢle%ZXcZ\k>Y;)l[8Q)| EQ/dL:I.+-]y9d=K03?-q}˜KRA3~,rN%7AsI=4,vbMD)=5T d585+vG)lN3ۊ P >~Rk5Eڬ\#A z#\W|(O`( ' Ԧ%Rcb^!xxh#lLc6!,svC lԀ38(¢ Ey4Gћ&+;$-asQ4ʲ<խr Z*,q>~ߥ^I>,F.^Qߖ4 $0my , e]Kӑj5yaO`Cyk##fS3tS5;Aqzor)ǁq!N-޸ocLp3db>ZhAZ juY7>M8/6@r EnL^EDkJ)] Zgᅓ M#ixQa,>s܄'$,,A_1(ijAzmzόQPyŁl_o!EԣVgUێ/+xNգ.o[`44Cd1z^?Z7}Viyŭr()am=y-@~«=v4! ݇ 2A=4 sƚ~(o,pjs#q 뚈=짎-A3$P#e!l`:!ē=Aei =̣`C>TȐ-GbrGiF~vgdQ>2aI6brIm.]ĸKs48x?)4=DW `PA]C0#pp)V2{ޫb+#pd@;oI&Jp_C-1lSwE>A?X\]*Bg0YdlE#ݨ,R$~P xݾf~nה/t㚴_"#R.[̉m1F&B 9۫'v-:ۙޟaɬ5ex+EbJDo,G j^긲݆!1]1_O"kXIӈb=Zdfr0X~ W)ǺTYg)kTs wjNR S Z|/CSjoS-L",IF5:l>%Oj=-YۨhܞL8'j{=P[?YvܨTFN>`q-n+),GX{9vl);I.)ܸV"T6zFW"T݄u($䶰_%Iqr Kl_s]X,#:YGOY3'T/kk%ӝɝ2~)oOcE+ 1uD.V}%#c>Ǡ*[OwK/W߇C' gvs?%>˕j<(wEDvġ6F^炑+K}o嗨+Ю^+׈~;`ۮXIї|n&=~Wd Av-tujxm1"a=+6`mZJWo)v`]!Jn{}%?2lĆoKb$ԸaaA|hվa%o[3Z̳G|K苖gV$|@FB60B'  _mJQW.[x^UY-7BӢ;Y(<洱%*UӞƢT 5 9l.&~Cí,4usg]:<ȿW0B{D,WuH=7 **^+ ] T%NpOPy<0.Qܝ@c8w3bovD^jlR]*ܡN[ yC7W'8qOnic]P8~7:":h8E0x!A!i1ة:O5ؔE7]M?eT<_gzp j8p7S.tiݞ\D:y3D] κ1at?HE7;Pgᱦ1"t-ut%ġg]d+TnUeT2ˇӤ Fib^%! #:DSbaMvi}qfa *uhHݯՎD::m**}L-Pm.l6/Xu'iO'}ÅW wV X57F(OFۚ‹Lȥ 8X[=%7 i$]|IcqPtZ IJbB՝w-,&joq%^-/[2*f:\#)4S є^]8ZP5 p A:REA)F14H16qaA^Vk.Mi͈n697h b#pqX? Lф+Tq\4ڌBSLKj6m ,Zzgw hy:YH}Dc ?q.{g5baӌPʭӰtjp$IVx'Wx^Δb͗|F1!*SE r~?>m]o=$vTC#P'x`_3M {=v֝e] 6>x(R2ZXQWo-;đǴE+/B骔EW dv6(Y.4DAy=\V^ 0't&4#șՖB'Mq 3UGj#,-Yzt+JzcN_/El0 C'+gӁ,rVn+6CDT|\o!KȗgXKi<纼M1+nz\ 7pqZJT^GՄ7oUR2%?d$K!m1y¶qr*R58e@ק̄ö`zI|iy+Tq#:ʾ`6i;WW^Jߩycأ|"x h4ީؘ$K kN1B\׷ɜVd3* QizkCe0C\>ذ7䮂fw5&Aw^!Ӎ40qWF RSa&+U r/KIPy>LP+|fPkާt"c[VnL:>w>A0o]s-7=1`5aґ9:Lmu#RUAZirmWng2C |@&НQYKȉ$wʇʾBH !] t88l){"5ÀAmsBQM+.64ݕWdM9zv?bQddg;& <,OX3_#E@M;/,'B`Qeh8Yia ӛ3lg१?C: a:ӬBN'% O%`C'mQež if[s wE]eSx5uue1H2o fZ1 T[қ ǝY,,燁HuiW$Zv0A;`im.Wg1'*lAzL403>3)G?A l pL/B, #>:}!8t#]QWX\ܹU(Oy5b [¤z|!9v[M)H8l=%T%P4.A+2N_k*([kl:TXr,iQۃ!/?q hPTz+޻{4B *S8{y[ w ׿YvA9FQ*Bx!` !T9_?Nл]]meV?:p3Ipհw+)٦C2Gw@9 RVƬXz,ھLk k{~=../1cs6iri8/_A'zx:'u!}u` |E#HKW876jqF@ {|ӦOOl?߯_ɳ=pz[ACLm=3Jyµ,Dt٠ܾ@/م2T$?9㺨 mܤ2)֥/qxi̪cL73͈[oyA DUwWUzwm,8gӌNQa )a=T%m Fk:DmcTRo¹J/Eq$|jiX;Z$,K;FxS-0Њeiy?#X! jJcThvX6 N rU ?j96lmÇ]Q}k C>mȱi ׉ 2%%u]\$9ƨ%yh?xb+a̙!=-τQg2BƁHxT(N/do W;TLu7tI81Vj}n# 3 X%gZ,s"!IL-Bn<:#n{QPʇ,>6}V`i8,4>*"`} n&;'~Ad,L;ٟ:7,ZB4{#NCD uэ[bȤ}[_^ǧ\3@ /̈]ި~?( !Xr44!9@=1fW>Rc9WR7 HA%mrc8{6˽ı俸M)A91`M#2B>eq@qJMv$}>k-tp[@ _,73%sa\,& hmVVsq5NL%$/I1P5e$^[3W^ Y{1UsRܟ&T~-;L r z jv8Ho;Įl!q6Cd~#׉ Q>Ϝ0~Cz*?X{MgY/H uB{~Z59{ZpnOӊ-W OQL)Ez,5'*}3)&U rMkēϐuV*,f1v]ڰpb)^(AnҟQ.!y]0E6@>}%VGBTul=eVAʚTC(Iq x7/CU7ѯsǜRh-D񥷹o+Bxz(BNw;X*xԕ$cU?#[_&afn0ˍ=]) '| ^FBt%֚vR:/lJ4r:6& &[0pH=1sl UK?l$3uvH^jfk=!PlOoG_1 2-{-}VG%V!fUs> \blதz=Ֆ hcMsݎK lGsv$+VB[9^hrYmM?!_8BLU }ᢀbz#dv\x˦ &bgS=@,`lG߯%P'&D](`{C%KH="dO6;aXl22~eӐa;-Y7`  _85&rk@:q8؃|¥_ôv} pҞ: i2/`F2^MnaVM:&ЅPb4SDNɫ\22@NݞarrJmAl0yd'cEw [z"dI{q}?#p8.2&`UBɝ+%`!#z⼴lYî4Vu˖`J[nL Z(~TCfv?$&g[ܫej=]Z2]~-9h"Jzq⭐=޻_Sĉ4(4J_b@޳#:w?$tĻG- ..Q'Kw̩K[n[Ϋ,L7Pb>QAc-ޯvQYu~MN,cGCu^Jj,JKj kb^Cwϊ&?#r4*܎j>!/07AG.;KqԚ|kMn`H"]tdwJn]`7SnJ.rBJutDL#(/WN{)$kBQ-l"<)\~(f2~bm[],%j+Z"B!s^M3a{L~/9ۓV0];KJՐ9ٴ#ʆgU8Cx޷sڊrR ~:XuC!{ XB2x H GեWˎ,2=֠FLp)Y:Ulv% gz#A8ou1N};oJ#uewO nF- CbۑO> 1YjH"*)Dj 3"r,e(fA5͂}l*cugP?C,eVQ|hϧRO _s7S[6S0#'!~Y:g"11WFOJ[proDuW"|dDs'e\2 -4U[-t*k̒$RT}AXޝE\]*Ӡ/K%c*}}eG1/N*MgIQR"Ui"F:G#U "KlLV5d)4#bj٪pԨx݊.!c[Tߕ(Q|S*j,~vg0ɐ"9zdXݾ2jѽ N|F8];K!ّEtg4V8 q>bc,I[ItJEIhKb-``R6YrS| p$5_ ~[ eͿQQ *Q(I[TW֣3,iF߫=-vs-:C= ?HAë2}( wzGtFD$ D26)|HIQ+خl㢖i$nb}:qxmL@fgB~}PČmx`Pci]-Siz[ SOkQ%d01|⼛ 5j>nrƲKʘ^/1bWgBQJ9c! zb҈e7 ֲ_:"3"  >d?煏j[@屰$# W-cEʽ-*-3jG%;0H5I8Inu^"AHE3eK+.FO_bM}2{v".q=\=I߄ /PAe}Xuz,VإtzD~._"匿>`;yv#ک`#m`_CjEgEϹG RwVAswiZ\eJ6 .%GWhIfoPmc&}ˏ&En p`jj^]9Kd89hCZzS(k?xUzh^Ձ?zIhO9Eq\fzȿ E>89.nUԟtOӊ5{ S> ˒̿67_\x}-+k"1\ܫ܉K(Eʈ%{$Iaݩ=!: ZY6oNd#L'5K\+ճG)Do|4s^hY"|'TcZ[ْ(Yi(!<ê*0ݑFU8NQ{}$ֵ!> %% 5;* i@.W$.c}%N~GA{_ t"rm8 ix;>[Q" ](]F*q+P?zдQjtp+, qv6!an7 ɬgB,N?IJ#UKQ!ɨ>5FYB)'oiQd=mxreaU)`"i Jw]$=QuN]XuyM7WjuW@ŸfJa3Ћ('^zDL?Z6 ^![yC~ѝ$ _&Έ+9lt~@iS[1܄NWNpϭsdtOPK-D|g]Uܣ˟(d{PL'BR})a lM`LYY˗S ^}\*QU?+ذŘJW+2i;t~ JXVSeT:Nt?ER~^# +C3|зS5^Q[D`eٸkwqu|aVkDd?s%aErev3*JHpV: &SNxFhgjqEiʤFK#tFмwq5*ga4}% &sVWWq;a /(]mdhT58NBfXm+ X 'IK$T&k6>3>2Vꭉrs*05E ӔXspKaaR3hb5fZAU2c'm:Ͷ/X'NazѮa.Yjw݃Ҟ 73 6RF V6b.r[~ج)A,;(_Hzyݤ@'bo6v 3&(A{.u=5U~cf}t\WQܣC/!H] 9Q)Ҙ(2T}V1ҽhVEQ~ӲztʋbI_;c`T v\ꎝ^ e][qAhF4LR0uYK=\z D-3#ak צywQh, ѲfF3IF= HPN79m:΁Z/nw<.Š5LkK6cC${L f\{jL7L\`O_xX.)o}`\㴽[vFeAd :?Ϧ)&Sn*5I]jρ- .!Rfi̘+o:y Tm _%&E= :/9_##,eҀl,B'/"6\tx61/qc ꧉T<0 uކK$;&KIҭSa>yFAs:ecXUw؞>8|Sֶc ˨.|ϕ}C*jEɶ3gIyND('a|N0y\-R5HjjB9%4QV-X.H$+/kXf $sq 0P>5h:,5U<4' Z6fa`dfDؗbd`Y{5; [HOOKъ 3aRQ baa<<#xhLa/0SqM GCk x) T3ϟ$v8YNeG R)Ek߇0Y!RuPq:ٱ3ob@SS>tb 4qA>CG|ns,H1٠oPCƧn~zy7~zpYf!B;cr0v⥊/NymzuK oq3ڂMOmw$ .۞#!0E;D9HU&.Q~h 6,tXا$McLUP *GL2I9; 7"o9)ak`=7SV.Àۻ@TZ$A_dˣ\m0(x2KCFxxLW/ʜ͓ry~jl95^݄(5rI}BRbvS-&Zv'$g+]1o w:e\WjKqw;F?$怍ȰΰfD}ݏEbF1]}HB9'^R zVၯuЎhUHБY3O0_\h'e7R +8{EQkXKmIY1;ok5v+x_ɫwiDSy{_ 0FC9J^EINzpAp& ?E'06QwQ~4(EuBy " [zp^]&Se@=6#}R+ p3୭P7+kdO(,nRiQ;2-XM,j]xVt2f2HTMG8HZ5|>{ܯ5@;ˌ`x:>}N#'@{ 07L7$6=9ջ"f{sG+]2=s /<MǟŦ2sZ(ri0CHg]f^M74˻|f bj5v-Q6FD O/|© O_=8U:[Te **\.5-4V[D~{0~~B0gj5&`-6yMR ka8"g_X)Di~XвlUxQ+8Fb=\0k="Nof^ >XZ@C,obXL6'nxD6ОO|4I -͕xW|7uo*V:C=:S (.:~qspZےamT*7H xD=Wn1*3ֺ֧Wޚ ځ5=hUdP U|yU\Lkn5 R|dF\Ę#w™ h5x߅^ qy:l͡{*>4fҥn~LHxvE\N.\^5-cDZKlD}y/;')}j(kejUbKp|#EAZOJ&n§ QB wF}No !{g|71l4jwk[T~D 41i[u SPj5}s]5s}e9WSh>}eO'Ф ѧ2WD&Mw񅀟e*nV+ZeҴx˺[ϑ q3 #ZBӐa05S8w;`K&v!T"5m 4#Gz[.Q]a\h?K=}Fnk6T"L?] ی~4:au3[t:&;(i Z|לN觏}A) VM7a._dd)QP'"D MIpC #_sr֎ +nutpi"H"3<ٿ] EkW5{!T0Ps!׬婰Yj94P%/+kUDh+hd{V3Bl.?\xixDy\/]ҳQKW?aa5gWsCd-={q5r@kzhQosJjWV P=߆؊+ z BLz/F\q݃0=j4  A, 82e(?Gːf<=+e4ćj ڸ(1_kwm{}4Naefljhl3Xw4N#L2X!!39Z޺{9&,;e(4c41x"Re+ K}󤶹Hk &%7-ѽF"/"zdd $K_0ٿE_WN2AO1c8Qq&k.n3r@/W8%>Bb7˖Z aBk7HpXl{#ybIoq,EW?]t ^Нylc hW4ۤ|) ]FE٥@DgEUC,`<̹ $Zj͉8$o SO"(JHR|:BJ[A_@;v$寮OէrQ׎c@o%uDRysΐTg|;(Z=uGu'*C-IG\UwN2[4ŨJi*- L#K׸[JqÚտne`D,eH}h,_{ a+72TW:xܒ>p☜:O,Fs7,5"S`UC}',Eߥˮ?*Å]/Gx!&q%T9= TZwW`YB1eB 3S> mr "Tڄr:{82?mqh"/MXΞBGdMfy)zJ'Ky5uܞFzI~T͏V9Q`ô\[qI.`6jnbN2ӹn/ Vu R]D8DwAe)\}ktg~"6`h"G~ ʿaEY=3d]7)c1R#~鬮Q -;&hPnfZN 3+ɛkܐlDd rU쐼m MKEfI&St6[1{ߞ$F6轀"$gvfYMSZ$29G/d \Tй~p&o,_؉>](*cK OUֿ p/uzL)J$z#H@g'VR؁q/l!) "˽UC`S[J5y 'X] :vk% +!.{xzp'=>?a">:…rnK>IK]mqF3h"|R{^ﶨвBV3uW:~-HaoW246P5鿸PySrdҫQ'2FU/i9&V%-?bhR:goAI0ïc<u8MR ҈T/Z$%]Y(Riin|.l#AAŁ`n}oE"&4k:vB4DAo`vF\-rzLƞC)GA8nODJtjvܫ ͦ%#w_Dz >Ŧv,Hb'NU[#Pjiq(Е[>:!,u Ubctz/cXmC?%3W*X^Ky$,W)@)ޙnǟ$=L - aG%aifL;ؽ7`/[TdrӫrTQ;5m6=bx8}70C>i/A!}s[pAXSHu3BHQB>.k*;A#ok8ҳދ"{({*h#ȥw|,K\]E$ي -aEk?Ԛ.B vc<`ǝ ^z/p7/kbZ"A5X ;hh*  |>Q}EtS*cf 2]z."Ms .$BbklViwMQt&,$m5v)Oj7Lˬ?cTz)VY&.lϊ~T~pYMhyG!7@"f)7Yu٥(.hn*Cd\Ҿ8Kޔ(V i-j 5źLI=~w YF^tu/Ԝ N;YZd/bZDҞ &ڈy@6/{8t:'Kr2Ф+!Dy4#|Ǯ٤:Z-&``~U >6%m䉆{Zy:s[ҁFKPdlfḧ́\687!Iw\Tf*>SUd ܺ)7yw\fnҰS:]%NOr2a{U{&,^@;US zfwaGkEڿг&j:UpvBNND qn܅vKS_qD崟X"F$ݪ*]NX  HDws$w(-+9ۈ ڈCsS R݀z˪ zXq#Qwœ'UK=@jxUlH8IcٖX! Vjn7TxpZ5Yk-&׼{|c(## DT[]܊g!A]8X (rÛac~;?; Wu%}tx& .}Ro+u!NUh}2eKuM\#T&FL \»pqw }_ aNv #WjFw5aϦ툠Fȶ<$׾f_Cł~+@9ˉܖfڝ{-4rA9a; ; zx/Qe.)0 %/7¯BrTRwo)Z1¬J$:hytG]K/jU?\#;H?E9r#Ӫ5q{gϦ6,->KnH=ddBAqjKmc&fPvPp8p(b¿o0^pIh/C{ oWqX6ԖAL[yV{3zEJ 9eAVtY o;k}O|pG݂T~. A Wz򒎦ҏ8T!Ac̳aLR"4zUR@r>RG5mEȨ\wW@75:#4bXdD^sX @6wjgUo5}lQQ<%hu,l"2U1H ,c\΃ሔ)Yf/j~C?$ءekண?Dcُ;b b@+N1q눡DhvlF+Ti; a1*OľacǴa^#hL:7 "EGK ,&sv}7 9N|_,ؠT2vk*BN1#cvHKp-l"E1/'ÌplFȽS`I &) ^kOІibcwOKKH&cE!/6l'ԓhqJXCPX!9qGG/NҁbrV4D 0#2ےu% c6R9pa:h0ƅghц5WzIzRD(.lx}a` a`<F1 YX4nʮ̎{Dknu#%Q*g;<^}a(R豎a67*4ɞo+?2>2,>֒11 ;ܢ =.Uw8lB?|* 61TznO L!ѹ3ꨰ|˜f=U>+\Y)E@)WA^ &jzgiPcq /ùg D .&\iI' Ec` 窶$uTV?d- Kj۠N5Q $mǚSaoěF5%,SMXɿ &C54\? WoRǫ]qs.^A@ި㱪1ۥ-ӄHIf (}'`cR v925u8G**1̿D퐙rIBRmȹJC+KQ&KI1$%=uSu`IiaQnJ$Vp5A"Dⵀ(Ŵ+>Q5;DNi5kM]-1c-+u޷reۋ/c)wѐ>c!6%U׍vP?1 Y[?`-Iݐf}Tf}"7c7Xǘ}gv|1{nk]+ǜ;]P ] 3R iD>9bQ0DݞeTm> _AԘZBJ ݼ'sj <~'&{01nXs93f ʗyJ/u۸$w{T޺BF;5wYUf2,=Lh$wYk 22 ~2ݟ`&/M0kPtXVEBf!ȹv|.ab({>4&OIq9'f-f'[vO{\U'qPú˺4 "gdVzOYTne|v,Ip~ %6k_.ҊhpU˙EfM<&i 4P8@dj Ζy-Y V;20>j+sJvIakt&Hkc*s[@:>MLX{>٨5^0tjem̦{3Hm;N˸U,UDwCuIaš\m*"5]l~+f3SL[$Au/T^˟y,x+) QZ`CE1ͦ-~#TF @0e99ss߶J ռ ,HLCO'ỉ*(HXCX1mA+r^_:GA?d6|7![淗XeUം iVLvW`!8AC_٭ta9n4mjӥ1p "q 9iuFb9VX頤JXT aݯTrgD[MX@gWyy)Q/D3 YE}-0㜋b{\n!Xk0qd$XA/8qV*[OGT38JuIi}\@kq\̘~:mwK(ǽ'孂M7HMԖ>_&AxFyg콘9~)} @A -= SCz3) EPxs?v(uZǹuM `ئD kJ:QXyY&~žzml&'gcI q ø?a׿x.Fp `L-}}VhʂzT8AvYH$mN3]-9'҈`Uax Ɩ*> 7`ts{keKm#ѐu#pOƽ:hlJ{yaaw=len"4E*^9oiQW\i)"iU˄/s@>8D1vD엧ǺU-NFn7jFU/ c(_KjtƌZ(\U9F0AT\mϖ;3_vM>`cWRA;'h{9`:.Hu^KX[8ul1+&KYIf&SD༔_"R)9;${+sB?ld '<^S #{l X~Sdk8E-ܘ?&ɕs: ~)=F%F t\X^ ' 1W~y'$m"nO 5ש\ZI.qX' aMrb(*aEO`3n.> eZmFi@67s_ud׌Sz`SWL hX;)F_w NI2!]ؽ7AYǿY/tgH1p3+ދKWb =l!}ٹ-S! ۟@8&`HA\乤K TjRuʞ&jsZQ <]-<U@jH\KEOp7Qt%4y|8ՐaH/YF k-ȷ>n)̼BUg,!f^˲/3EÿȈQ, $.8M(}bдFy"JxL%B |n^72=' 6nWߪ#Ń?j`o]se#:X2XHmXGHަ8љ-] "!)F Cĕp6̭n^  iyVc< 6D!݄raHʮFJK]V:GC4r3{J(FNQElYJα Շ-ANR܃>>%ȫe3t",I6ʽO'B!qI* &$y}T\\`o#R.֭NBeib~SϽ.`s:ݱu)jg_|@Ym >R @-zT~\;4;hk'6"|D(1+n^kxu8sIz(Rꉓfd5 IwmY~MJz MяwP  ?>CY:`no4)Sfh5 uǽjIcH?kf \*t r'9L<ɵ$-|:'ow jB|>fY"wء{q#Q]C$Pu>uz %9WT NɈXgcߒz=[hNAS%j-م;d=вq•ڪc-Dm,JfQ緗^'U0jrK ~ۋGM 'E Gmض(U(Urʔ/WUB rv-ͅ4!%q ;`#qK1T cHy `v LXwBz\(kyỦSg {;!ܞ6lS Xs6 A%DL|J :w);=RlB_;s?י,J4o^k]T}R 1'<ҬNk! L9l}2,nTH{AȌ=04块5}c<׃w@g2PB>itݨ )4gG-MErC]~JHҩF? ,X.H$~W2V9;_\{rorAY XIj_gY |Ԧ} pmko*7j Ux9g[/,Șز{}'B_T?@T5YjjI>+2wCADe2I$TP k|~.U&5pE)?mGOCtZ ^\+'zH_D/ad+L|95R`;aC~ ў4|;t-ONЪ1- ҵ4J>I(ſ]`j}/{0D.B}3檉ӘjBO/TwMU(%>Bd3@< [QsTrT8x3LUfW- k,-\ L ಛ|If [Z`(NXGSr 4/叜 2݃ѐED[E5ikWv;!綿O,FcSn MMC\%;\Z/oA,Nc'@dXZ)~2*FesjSrN@^Y:PafJ 3bX6U A}Us*hOITPXi L[+pe{؃=ط'EG6җ/IWUu?Cٚ3+$'P35(މwP{'U`\46Q# Du0qq2{G$E8=ľih6x/x`2fI9r\ X~ҭ:YNM̧MrwEB-bp+v/_E\R"4 Ӳ(XFLOUepM,[d?ࣣsp1=NʑisF]Gr$޾Z,H}lk0n0$\t:Mu`OW/=kmKx|%dQ$,E[fjUz-''V0vE6&5AOem{O6աw,lD#hk `m܆!]}FuyWv7BBq/OLJp"=NbK?Qk>Fkob8GWs)ա0n/U&̱}(6Gl+ l9טV aB}U=UyXH yM:];!8"ƚzYWxSèbK 3T G߀R^m60qj]]VV:ѐUgxeH ,A#'9u쀽iDu-V۽˷*vtjLa|y4#`/_ GA4&\gGOUj3[z8;@w}O-(:EX~zt,΅x-");%g&( :)DsĞur)Lk/C9$P}&/Ϡɽ`Iʎ Eí-^'Fzn⍀xSR924aVr϶"2˶AAt< 'LP%z Q]~D]6݃Yf!o3 F|ŐVxV* Rm:ɂ8A1"sA,r)@,XI #AIsR`x7ܕ;?2xJx]ܴO`}^peb-yXFk64?Wv}"򨠡bQgAQb/k"5 eRHכOѿ]j rD$CJ/A'\ C}^űa!s2ZZ9)2nUS콋/pBnPކr cՑ&MyC]~bʕk0& 7,:lٙ뻌HD~V`eԇBBeh?VSQ20baxF%;j\s3~KLtRBPO6kNO䀣K ,&e_@ `-ˇ~[m)49cmA^c6&#p邭bsE-0j%mCwM7|b.65y4Gdgc;ڄk]/?HMaIs76KSVFƈ+x%9oFQ1(ĵ0%:&OYB|}ߵUtif׌5M&%NЄ+櫄 Ll"S85rߜ^.>*QqؘX&*X @,8$hRg'kQ|E4aW{*b)@8a4w.2|d<~"8"ӧ$ӺWpyySH'1-X-nMSə65_s&,UHQ_48)̡?@~mWdj)*WX[e8˴2~x8jժYF%]4rĢj\Jȩp Cxjڃh$67,2%ZZ":KozBrW 4_ Lԕ\ة1s'\gߛEFr>yqek?X;J Gu1Om@,q(=V]Ⱥ@9|y'=XTw*iTٔ8ЗSFM(zhR'M6{$ f0[pZ73iuC&UFݽ ȔB, pw\1vl8K#:I2[T 5Yr'7ܨf&&2/e!~V2V <3ĬtD?G`D3LM].bVA`;I>>m͕^QA577^Z=;][=юn: }_srfA蟬|=K ЩY]x|; K,[Dk{فL8V:/皡e"0O Mrh((*705߁GSpmun)o0 .wŜz40:gWVձRJ8Vͺn {*F:HO%<Wk6d9%vݩ;6_g1Vn8фtu`i~r,e#hL]ˊ|=T*ZHStHz{-}z?H|A$AWMDO/f|F90»5N92ڸbZޓDα\- T')* c"UʸE q-E\G )x\ș'ޅJ=# $ rwsFwtjݼiAi4De=b 1<42myp XO``!ttZS #~Jޤ.-6Սpz bB8/ݧH3%aJNĽ9-ŗZ G]><=zܼ[ewd %3]k79U{#vx D]DQ!$'¯ʏZZs>CI+]lVPJ>ܓ3^UZ3E7d62rpK ˼Un5KC8ѯW(fvȼMC!h Wטg5pr]q֒dL4m?"bzp:.Ęgw9Tv ?SјqO.ʷާe}1@Zx" vz.eb;J0L4Brwmːeam+DyUڽ׳[ zٶ;IҨFtc#c:F❶Q 7@ e ++甿kp_eW" ~β9{]'A hCTHE7$0v0Y8>$suS' Z|^! AH"˶+(.e~# kAv/lQW 7PP'[i\>[A[›o+^PYedℎ6N)' e|mIi6e,|eNCrYԏ9 %Oz.bDcDUT^B{!cI_B:z <41 VИQ̙Չ}o0'FS%O[1WK{d~4J54@ |ƶDy[elwP[A ݡ$2qlme+X4h֛} jWf^qB, /7] / x 'hTk;`nW0Z=$5@5)8%ZEMB@{ R4xa˦; d:JyV24voP7OjBF #0HbZY * aE6'(sR мqHFqqDG34>3Bi'Gga#_jǹp\ Eubmv䠕%|?9~p.c \ !0/1OQ.m jtMu3.P;p BM]YWl*.A,`ʜJ9 !Zr枽o\U(A'9{fzXύ9]>*~l5l]ٸAX})Ω:AQE^>R-WNBp-tP@7A.hI Y2l<8[ͬ1f+ aфmTc'gm OH3P{U$Tp9{u1} / Ͼ]'JQkݴ/!}`' }&+F~9SQBXbrYux,ƈ)3ѝM?fyK)-PIRY@70׆\n~釔TAASo 9{^{oD1`XnhrĶ NDJO Zc|,Z`s ++њ|;3nwSk.FK3ۤ$ŐrT x+pi]EήE1ӣqs 4ޖ(tHd 093p>uR Gej#`ʩNǷƐU"0ؖi$QZ(]aXФ(4t3S@܄i|KJ@>Of YIB?:KTOq&Th mSPzH}Y[>ZDsݟƿ whU3 -`@[k}/iĩ5,7rT 'Z5iӕ Y^y2?4WkOJzqvᴉyj'޹4bda]B`EZaE m,XLg>/]zN}M9)^{>IVxTvp6tn.1QcgJC"J`=\uL6Kz]yO۶gz#3YƇm3%JE[(v #kVԑp=e}6ȢVi][AU2˃Nw2,eφO3Tǔ5{8߳EcB⌣c1Go[T}宋%:ݵ(Sl?gHk.hCXth>ȪẐkVoۤZ) TsjsrD4?<_?, >F~<N dֺP{M ZQIgzn$xT+WZh6>iq=;ޤ"^A7|r1) )7 ENt+Sn'z5_ͷ~fkn7cOQc+e#=rj\gHAG@"{"Ԋ5vTy|_bCĦtyTN+ `Y.NEwxJ5{5楑TGPQJ盃/TEIT,ޝy\i_+hdZ2A-GW[q?:("Qd*!D$".ߏd(jѤWv R2o:@3FL`Y4&˷Ի!&NـZL4|ꠂL۞{žl _;L馩fMmnUt}Oʙ1d@/-uAOfɪ#+sT,1zmQ@2ϝJrg拋HBd|}姨I[CJ)trR}biґN]USc=0eA7U%wCril6Uɼ(7F1\&]z?g>%3T/ə5E7IaȌN jg&RI/sw@L]DBի0`NP@Ξu"ӮKM/FM+m78bޔuK2Ù56p¬O 9Ȍw Lξu.s?`{}S4v>:dZ88ę9crD"0&|k(qXS.&U!e:S>5 ZOLH&v.+axwL"R;C#1dbR8fSFxejДw7}\U?Rģ%na;T)QmpUW>\xAovS9Uzzo_Re6wD-EYbz)<܂5`) ^ґ .+Q{E $B(pj{RE'?a< I1`ҹs[~?^{;'rdwsMԺGQ W"^64N*C(+)QWߙߺt)g cDw4C~tWBXyB^GjT,}m|9{E788c&kYY Ѯy.rwNu3 >?Quw\USwf4'u@Sђ0J;oUCNV[n, }ʶƽ?DvwĹڈj#Bv{s;t# |͊&j9yT A+{@Oذƅibt.fdȥakbv+tB03dKj\=;E<&eH#MA!jdvCˢeZ"/A/||Xx>P]fBnCV{j-(tijR;r Rfzb%D1&XI+jsK΢tg}DȿoЁxw4տs~FPUNĺo"W,M*5JQם%qW$/5a_@wjj({/Cw?0δk ;@._ơե !#Mi貑`yk/mv"t1=q{L6 jiPZHiw*{s×3Kj%쨺Zٜ"=(!R5[|k 0Y{5Ta `̚Iw~Ry|9.<' t᭻' ߯zvn8{ko+)/_4=`*L$CqR~vNkusoY~8Fm>G%p^RXOC0!y}o9t9>w zXOAqLp>zܤ׵{8:{l>H}H/\q [,Bgc2͐/TZczTkQ5P.lcn1n9Oe #3u+}]^q 9uD>HO;fW/ub|&$lf8%/; kōaK#6| ݛNi֜hfnRl 5^aR6莐(CN|%RҍEB_sB\sA(h$7fhSp)ߣ:\vWpo2,Oe#9re/.CStABI娀kiP{!4w0)pfrE[Q@0ƆTxK`VXKɰS :ἳU,B89 Q _|rGˈyD9wd tGx+@mL]#XmZpyc^'}8^% wõ0韫K f} = Nb u)5"u87%1T!M%Uv/`=@ArtsrͲ-ީǰO!+D_kqViF)BlahSN|z."Uٰ<GP?ԙP I%z?V9P_㊩XQ0c8XhIOGy.ӭ{?0-HLZcm?~Hr~ ֽ^`N桏yܗ'zvw%x2Ƽ'SLL\Π<Җ q5tyhhAG($s v` B+C_4ٷ[0UUYDx-BK.vd` fۉGCaL˫d:Ɯ 4>s6:) ֗oLU|7n<9婻~{)C"NS.QRmUevZCD 4ˉΞjϞ:Zd</S|ր@2tB(w &l^~耇9_A Ш`?ocֵSq~P(u ՚lK<)؀pP[t ;73꾗>"Z=CW ,`(Lʔq Qw@|+dI^K,o<o%E4I2.N'L :nkT?/Ȩu\ 58\^of+^>䛁QMfEidE/j("`VeRN߹]x̏vjeuv |vjb$ yLCsEb'rhtt׌7$e1%sXP8L-;:M"f),&7Ysm;&"ԛ U'U{Ґ4HS(#nY6BfťB1b <Xۓ)+K)I1b ι{m)ؾatڵhΕ%V]eQlv:+v'un ( Den'#lLzwr+ iV]TڋT|AkuD gwsx(i= =9J"!Gl pz2Np"063NȎ<)'ecpJma 6--]ȢU# [#ӋT6gK^ ;bВ-}/kܗڳWBOǿrX s LY/=7qOO&’M}N^C t8pNdȰ*8瓪WI%Y_&ɿMu^zɮh)ʣmx-_u n(]8VlMx kGd 1)-ac\wQ{ʁJHq<QAg2gfcJ%_RA{ } ꂓTH6j l>uio+J 9?OxY> q ybQd C!g$ps_\㟙zg{22fK~+ЮCB2Hi=g29eUP}pQ8a"2xT).Ph@y1Xn[A{ :[b >/zWxAPCki ]pcrOKG=yW7VNkD͗hGfFDlc_.)o}<e,Ѩ6\x-ͫNA9:ςa]P{NCY0v?!]1}'ڕ"iR4Qz͖;\2ȥ >W5&xxU8CNvP#-WBl47cʔA%l 7cq߉ӘxAK e5=S9Zcԩ%ĶD Z`$wI61R4 %0>W$Lz Kp?GMo%?x:,#2oшw[n6?V͔ajrZg+ (:|*뎥jB=fShD47b0L@'UW6/Y w姽ε c &;B֖t؝-n#MH|9Ҁݹ}e>OiDptHİ\n%RkfleD9dmٕwk/Q \%Į.Ye8Ik 8N4KԽ 'bly-J^\w /7J̈́TOsnkArm :s6pȘ~5oŭx zw&P7gn*/4{ *}rrD/<>γqja%R1xgMv@T<@;]H'QӰeIC:yT"dSxJ@7}}*<ʶ\DDAԆ:_5xVAU:g?ȚѼT"B1lbߡiSR8 \f -M7) lʳ^+ y'K2ׂBB)9 vyj1Jɹ:'). kkSB!"Kf74 E&2N-V{s}NbrZw&r Q-@"v2^x3v +X>蓇ns onQ8sZG $}RYU_k~]afR9I &x+~(耊M$x;XA+HheFDbH*~Eq EN~Ou]V*(_7_}cFB ݣbzY.jrvjDCrvA=:Ogd|fMTxj"r|-a2!|MÐζhfޮP^*ܥ7׎cIĘ ,D[͚Cjfr[gF`A@H* #JӺ(pxizúmk-ȣ"P9m[$/YX" R'qGTh^ n|gi?1 ݛ )82$<(PV'2;FKAJ\(O*ݛ $!H1[ qE8qRwJ8?`]aH{oPM"$)J4 b, @Fx9i5RE,riwJz'MzuZ#:8KpQ8A&To iD pD(L KSs3G0y;`}oِ.hяU3a_emn " ƤYӛghK"tË8# hGlVQ{3-)9ͯjd dw o2lc #3؆i1TSBöM_d{QZOrJ J@i&>E 03@[ydaMѳMw1V Ҩb4q4:vU[O6Cr&BYt YS2[dX >өފDL@C( Sl8>ے de]AæwoUÚyO{'|U 8a,oШ֧xk-w+SHb&(JW А|5&Z5ch%A+]"^fNZ0TtKl%}mNyt Ѧƿ=+w5k 8%{퐷w׹? I@Qw#$ $әҡ1 tG G'S$ֽsn=XƏӌ; 9VlY l=}H\ҋ"&z1L f BI"iPJt-C 1_5%BMAuӟ>Svaxjs?Dů)F35'T([򜏵B~9 <ɭ1h/PUaZp]L! 2ZL( MӴz=̡Cgzz \oCY BH~~ …V?I=.͜dנmQZ#B_bX)!`'bwhmmDϺi0[~8FFX&PF+UI?p{ؕ%K_"Dw%=&纘|LLHkŮh2O ""RLR3$£4t}@/҂jLt5{R2&;\2)~bgn=4_J`i*$Lȵ8rbt]NDr2[;lJF:#SPSSm6G5y9ЧA t!D= cq2ck \&@-2g+ ԵjļO/ML,d+2=?q`N-\RzKN Px͑/qv{wnL=?ZyُN&:(dD!{ lŒpjդI*(ZլI=ce/1bGMS0jpn4M|f-B*J\(·b1{l O|Rrnc O ~a,oT38'ƷWRkq&iU CGgx|{;e%%yoMdzU"nB\Нà"g^iхe' Pgؔt Ǩa#o{Fvf3J6 % /f-<ji"\0˶8],x Scccv Zu Yެ;.&f:Wk];tWdcӌB`8\f6uf!PYL]iLj֒7D*3eK  !PMj3$s`=ɛ @P5`;q, @5|-{NqhLrcw>AMOl~K>M3RUX1Ώ(f%Уo.~]ge<Eݿ&Ofx, G>!trH8#gMkAsWjBf1uFdӬ 9B9ၚbNyR5}NxÎ6M -_ @'E j3y#EڙZ`)ipD-o8ZU'n%_%yuzɨӈ x3XTZw$z'6Pv~6Y!S m=񗍙=Kص>fݷwo=@dPb}1R Gj+X+zE=nx[7-(N~ Bc1GznP7 Y)1? #e}u9&eޢCIKhS<&AFjbP8Jbdq|U"9ntg{]m#y605u!UR#@0z[YLB="sNPzKCf:բGfx 0qL$yjPÚ^޿Z;G^ze@SpG—|_aV ӧVBX W[?:|tU>NjS ߑhei>6nXUeh@69xv 5D"5w& !>E\ΚE%~aO*1v랷X6>xaEPD3v# moou0sIz,bme}"G;Ydv%+;pá ٳQ(l.h{\p/Do\2$Ts_幂#3_|;6$wڹXJxhH\\Ω齬%Yx&18tZM OKJ^L(*9'Qbp2$)\l8ĦGSOۯ&i >Ln\N&ccC[{1sR~}>c.*CϏji ,Qs畮sE[NQ#5V.[P$lGG׾9I_ _ ; XD- ^Yxp4r¶aXswȥ&퀊gv)ڡiHYe;p,t kߓ?;@Uk 93/X%ܶe /uGa~d`{/LY)Gde]TaV;Vf9*MN=ST' k>c}zOw`TyLOYJмڼ'8b,]}vxew@_5G%+F3u_%vak<ݎx^\,3ܲ%KFg8T2 \702kGb3_eV ~zZE⥧\?/YO,dl-@̋ƭN!__oi(9ixѫv&욜NjaCZc)v~:Y@lט/V8$\h-g}U-LDr5,QӺRY"0kuמ3*ij a9 W,4eWox,YZOuvS `c@t P #SغE.kF'ZPNmXg|`pmFRt(z7_9qL(^]2$SvۢT Z8; ?̦Csٿ(72 pQVe'0gytl_+Ն{ŕѤ.KKj}{}1#TN2+NX18R",%%&q9΁3:ڊ|_W с"LŰl(#FvtF[4f(QH͚y)˿?p'@ܮ_Il*}{ɻ|U0Uϼ;200nNC?wLkJLnTO4*0ťrjCkRI3"?O!$:"# gidNOWW"(d0؆>I.yn!0tSv}פmZ+Պ6QQt=|V]vۯӸk^3}Ͼ̕ڱ9q}/k)e3EL8,a xUX H<PԠ{L¼NfײcXtu>w_ܥֲ.JAwyD#MFp#d-b)L椅gn xWr# _!K~4?us/e?ytpmmWGӏ34<|8S.\.l @1\mI ?4T,}++X޴g(nqWGpw 7r|eW^9&29b#Xė=V̙yA]W-TeC&C)xM"kcMcJn.:Ep(9]d=!,mWIm3bG.#{ @5M ݾp$%r{XE6}9agGB&;[m - 3+ͤE(k.Fׇz{bAN>sE#diCٗp@}٤ l+6y@lvIٛ\ֳܐmNe8HFZmosqT2(-Mv|*g꼸Ont^ד3W1Js H }Xm>vf1MX|{Kؘ`^{"n(-R:Ή@ORiQέ[JOE$ V67;3+/; 0V^ȱלN]kv<g<+ A?XRH}[c!6`ך:j"d-כZM C `mAYށEo^6 rU7 ,Wݤ/EaU=g"-BħFV}p9xT':TOosGP|Zu $nM7&yfgwFZpt!]h#pݯ:avZ6i &=- Y+|3I%$TdV!ZjkeU'Z u6qc[6=S $Dۂxu" }Am t{B@a|hQlܴZ}s(8S-4wbE˽) exn 2n_-M,X&=nmuܣ,Ny8Q~@J|!B}>-ƚy4 A&7FM)Wz p'xbKdDPsCB/ކӢQ@?qBfp^X('c.Z y nsQ Í-pmɩrϢy5|MьA)i! .z% xW.ٺ {zQh#Cgqbӌ /I5y-0(^ڗͨu}dspxgDMl0es=q: P^H ">Ra_g}Btȸ ٯVAAcГ+yP WU J,صUdwoXl8w6ShѠ(z]J ')ߠ'nk^ ٸ编es U<* {+Lm„[ Ph"C{/Н#t8RY6L.eCN$dO {lߍL݀aHoRnMER埽u ];m3L?^ =v}vs?@x7(gU_uC!fL:&=#ZP>yl#՛ܹxʡj$<״!fne7 *n2"1YZ?NKӀqHh3n6>(]k{Z[K`%Y9V,aKkFhl$#v`|}jsA8o?fEeW'K~ nԈPޓMۦ$$JI˜FbjzΙ=)yvG\SBz[hUɢvg3rI䛬]2N%|{nU69p5)/%,FOS֪[U rS jk#5LTN{>W Ij O!+\V,|<`p|zKa[zl'Iz+CЕ Q8ct;~A&-Uf@7ly?i8J3V\`ڟ8#-JYcRZeC!2iVj|dqgWHM>u hu¯imչ=6|hT|bitQWyv`q<P'"W{+dA{H`Jf/Ȗŗ~%Q͞5&#/${V'ՌTB 5XPbsR-DbȄXyg4gId.W0Q% HLO jso8Yz@-j8.&l(|`2kH9~N#_.!âVp`‡RCx;zek4Tpf-;2uޟ%o1F!;tqk `%Q៖4P]Һg>?oRIA%A@Wd6*e1oӄs\?]R^.od:g~e fBҞq(c1k03!G-x)w#Z*/Ap4PbN.&CqOk]S 0|d=7\ZVf]iZXBj2-eVLԹ7,VN6Jd\Bބ LۥytPJ_N.N ʼntdN7t:$ӵf>0ׂS<42c]!~dKjՊ!Xe2FxKu,6lœ2Nғ00( ^g]}n,N2.f/s! / 0>ueZ[AY–p-„ҁ"PT4y6q%9TT.[l928\\H۳@i,@l|4C,8YX=''aRdq!-/+rLmK;VM3nљL/kd`v|k \G`-wvY">HzqINyrey14!dQC.jVY?fY9}Iե)"#>FBJ+ַFJ rCλsƃi麏\]S[KkH@3(8r`^I>Qs5l f^%.M\m_!^x?8 ̰vukCM2'pחu8ZP8C _ )vu \ *ÙQx9u09ec.Js*ɖD#5sXxkp5rg66y~|䢽`ϜX-6R عn JJfb6z"g?A'P#Vh?Ψe|Ĩ'?qC7ki {tVw !a3k5/@sF!K;רj2~,~4ko[6vB>Ϩ~91Oʜ  0~'@9'TqY#`\C7$Gi{0A]6-N^.:F}˦4-0AϾTsqVaXss'Swsqf/?ٌ)Q^'kz  #EC!=V g񮳠6 %*uȾҀY(9$ WͰ&'!@z# ]YQYY[hCRTWv8\18d"y7Iӗ^}t`ߟVն$$64Ϙh6S/G(>wYsrHw:Yg Ae)RKl mfo]-:A-f5-(H}27u@qc*ܒA|5 B&4aV:=CN״g!7Ųe+ ݑYgAIz%dUÊ4-\KF5JD=ưSI8?יi9G6/}>*gXK2A gDssMfFWupjID{}4OPW[ VHpcStMN` {e{k ANcc%8Ƙ}v \i@Ϗ TZH3_@?7hi-K#oKym* m $ 5>Asvծȼ yyxKn91R!]!tq*a*Td-Ɲa([ Zv`E_5l6sXBn00u!VP=w6`^0Å:HhC8j_8=-!dG~7 e8b|X[E^ev=:^UblCn`u/D_e^֩XyVT̙KW#L"1(}}pRBjBxnאCZL0*:%t>-n_O]PJ$y{u+8ncU.u#.(Nz k3KKQ7^CYԬS ;^n]_F,Z8[m}/e ĎkW l:IO.jՈhx5´"!]F7BN1O& 91`."$:V O|vSWB5Yfm@7ѸJcR ▘Hh>׻gi񊠀hƟ  6MD< R=:MC$?(F7 ̒.Plքu}]4e@,U>|ir}x0q%9f=AhhA(D^tW8Ha~Y~&ʂ]3p`NpI0gCr >;nq7T! ]l⃾q틶J# Э3'5^ fuH~?N@(s7f"Ź+hd O-B͚E b!x}+jcX~Af4;ۤ\?>Omm5GO7auQ\襨{cS{h,MIW3sxu"w +t67ܦ!t_6O͊tPaN R#NRfN'sXI|~.h7FT?KUY\]Y4T,QYx_52,qċbA t- Vl)T3Su1ӈ2[tRQ~@YmKĪn,գAUWy4ύrTp{)Q%0EcZ N1^?a*5>]GgngX`ta{>uAW v |eCmSgRWqbou #>11g(ӡzGT q3|*&Ijgz"+oOs|jrtx)>{VdDS(Zj\CoACR~;LHSb]~ӥU>)f[*@?e PvxT='3kmVY~`!T1qXةt ǝ3KJC#3C.QZ]< +"[Ɔn[1Y?Sw5zT.0Eϭٜux`! Yt.sg+a{uLwj9;b5ׇ9)t|cCק:7mPmgP1p/Q,F̲Wi2H[Յ mo"cwB5=3O lN&y7of]HlMYU 5_ҙ c75{hN<,9rڄ*",g.EH&F`hMG}VSSAX#^Ћk 3K,2Z A7'jJYGӐswq*w4G-uYNt_@8׽TiclZ޼Nmq:W-m/HEXz)L/8l{x%_(y sTT# Ŏ0; i/BgQ)_%_ E%X;ky(Yi ytuпX2ԕܪ$x.vIe]ZuM!b1(F\ +x]9)iBvڎF8  4H7i2$,Q\|=|\TcKq;CRaU8ʖ}kGwAFm.D(% M~͆"e #߫"\ZqՀ])q~'yEͯkn T+h29AL^?y?qש92,YULjyj.{#{@t TX[X&ť ԗ+趢}Պ6 /r8{O?ML _sy&\A) (QQd`KuH,WhOMuKI^Z<7Ȝ:d$^lډa=犳HS7,6YCF&AԩQ<0"Qf՛ b9QMpJ.+8)<*M檸k7*k[a0X9!R :SÖK-<2d H :V:Hv|štw`SA>₻ג yhtW!X4H_QbR(1ZhD?ǒ{7>Bk.VᲉ2W]K2 @kgԘg#1,-kz2gJa\K_'2V8!c4^@Pwk b.s^#qЎu~<s,]IΕ e# *Z.Ec3-]~ʌfj%=Z,ǭ'/G m#PٻM!9 ڕ; r&"#LM?4p#c-F. Bz%Y?9Ip벝/j&'/sE.._8yl(6eKn}HՀta>4 Lf~>i\# (we2?L`{snf֣ (o)hޚoO='>ng+Fmѓ#ЃkֆCIagi-q{kyTq8C<)|LB[,ja͇^ך*,p:o!$ţEկlaίq_G&8Id-:Ϻ#%8܇ȱI^B4% "|4*3yn -S@۴-i/R좰yWE;;WikN[/ q*1L@/yjzJ].Lfx^^)5< )ըK`'Z dI+/yɔSՀOW :Q"vE9c{1XGua\a:>0Z&ɘx).b7gSd7 [0!dvh *Dfcf N [;qc G\MN9+E f&]`>)dF4LD71aeCib\%MɘmG_yDuqr\(>,k+B<#RB W-wf1zg4H%[IQ1w_Pج-y? kX r`\=NJDf$.6ym赊NݕFw{TVFI'fZNȲ-M1̀ʃ49s̀AP#6WsPp_{~ކ.@(aUqwԻ佖2 ٺ ]m"v>*0ј$aP-i$wGoN$mxE-2iI񬯧*:voGE`UYDY+jx~ ?y>hPt.I&Y$\,AdB=9Wlm q}HЈ_ /#NroE蛖CR[j߼ ZpaHwxHbMQ2%z|ޮyF ˖Q԰w&zq]2OTʘA5\E@ m_Z@t=t ES@,Dqi Oj ~/!T5n /UV\=бĩ\|= tηeSʼVk9Njgϳ$b3q]^ltx@Wz -z}3G8L,bm6*萵Jg=Jȼȅ}dӇYg`L/0I ͌H6}&'hZh 2R M-G$Ֆ][xw%uܞ~v;NŌ-ƒO'b@^EuJ#E+ D.z,)m+FT|L h5d5D{V9tWeVΉ{{d X?@p fTK.š/^GӏDS'i60W foDPcgᆙ$к(#Hx&7өd5%+y}8NY Wuu!d<ujPh[`Sĭe0Ot G2Rpy@J ,fR%2<Һ()SWR8t2q^|al4F J$ m8[O,Ԅ_*l{_,y{+PM}56K&PÍLI4z|̞S/8z-\[-莁'[{*f~$ JU.uM7S+'ʀ'ycʯw&!3MTq Yo9|:%ŎjE!7OT34>">.~vWCR馍Fs?8+!N1le_wJfmdWYTz7ӽG| A`C“FGZB󧫞~΋ 6$OlV)6mm~C[ݐByB2v686.N[k6 ,%еI 1+|#J3Er3e)W8'(9 UA_tGfMPfrȁ7c0&\`JyܳrG=,3+0_\xS`;hue*|L\ zyX!}AN:}grF4ycO=ӖbNfeo`5\=&<Hr{nDC. . ;qWvHle7Kh9N"u$L7hB>oS`N.>0 YZsurveillance/inst/extdata/0000755000176000001440000000000012242645665015421 5ustar ripleyuserssurveillance/inst/extdata/h1_nrwrp.txt0000644000176000001440000000344612003774136017720 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 1 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 1 0 10 1 0 11 1 0 12 0 0 13 1 0 14 1 0 15 1 0 16 0 0 17 0 0 18 1 0 19 0 0 20 0 0 21 0 0 22 3 0 23 0 0 24 0 0 25 3 0 26 5 0 27 0 0 28 1 0 29 1 0 30 0 0 31 1 0 32 1 0 33 0 0 34 0 0 35 1 0 36 0 0 37 5 0 38 2 0 39 4 0 40 2 0 41 0 0 42 5 0 43 2 0 44 0 0 45 1 0 46 0 0 47 1 0 48 1 0 49 0 0 50 5 0 51 5 0 52 0 0 53 0 0 54 1 0 55 4 0 56 1 0 57 0 0 58 1 0 59 0 0 60 0 0 61 1 0 62 0 0 63 0 0 64 1 0 65 2 0 66 0 0 67 0 0 68 2 0 69 0 0 70 0 0 71 1 0 72 0 0 73 0 0 74 0 0 75 0 0 76 1 0 77 0 0 78 0 0 79 0 0 80 0 0 81 1 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 1 0 90 0 0 91 0 0 92 1 0 93 0 0 94 0 0 95 0 0 96 2 0 97 2 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 1 0 124 0 0 125 0 0 126 0 0 127 1 0 128 1 0 129 1 0 130 0 0 131 0 0 132 0 0 133 1 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 2 0 146 0 0 147 1 0 148 0 0 149 0 0 150 1 0 151 0 0 152 0 0 153 1 0 154 0 0 155 0 0 156 0 0 157 1 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 1 163 0 1 164 0 1 165 1 1 166 1 1 167 0 1 168 1 1 169 3 1 170 1 1 171 0 1 172 0 1 173 29 1 174 17 1 175 11 1 176 2 1 177 5 1 178 5 1 179 6 1 180 3 1 181 6 0 182 2 0 183 0 0 184 2 0 185 0 0 186 1 0 187 0 0 188 0 0 189 1 0 190 0 0 191 0 0 192 0 0 193 2 0 194 2 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/n1.txt0000644000176000001440000000347112003774136016474 0ustar ripleyusers"week" "observed" "state" 1 0 1 2 0 1 3 0 1 4 5 1 5 52 1 6 0 1 7 4 1 8 1 1 9 5 0 10 2 0 11 0 0 12 1 0 13 20 0 14 5 0 15 18 0 16 52 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 2 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 1 0 35 0 0 36 0 0 37 1 0 38 0 0 39 0 0 40 0 0 41 0 0 42 0 0 43 0 0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 2 0 55 94 0 56 34 0 57 3 0 58 0 0 59 1 0 60 32 0 61 0 0 62 39 0 63 15 0 64 25 0 65 1 0 66 0 0 67 0 0 68 5 0 69 0 0 70 0 0 71 0 0 72 0 0 73 0 0 74 0 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 5 0 93 3 0 94 1 0 95 1 0 96 39 0 97 34 0 98 52 0 99 36 0 100 11 0 101 2 0 102 50 0 103 2 0 104 2 0 105 0 0 106 0 0 107 9 0 108 7 0 109 7 0 110 13 0 111 31 0 112 3 0 113 2 0 114 7 0 115 25 0 116 27 0 117 1 0 118 5 0 119 13 0 120 2 0 121 0 0 122 0 0 123 1 0 124 1 0 125 0 0 126 2 0 127 8 0 128 2 0 129 2 0 130 0 0 131 1 0 132 2 0 133 1 0 134 0 0 135 0 0 136 2 0 137 1 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 1 0 147 4 0 148 14 0 149 0 0 150 0 0 151 0 0 152 1 0 153 0 0 154 0 0 155 0 0 156 3 0 157 1 0 158 0 0 159 0 0 160 0 0 161 0 0 162 1 0 163 1 0 164 3 0 165 0 0 166 0 0 167 0 0 168 2 0 169 1 0 170 2 0 171 0 0 172 1 0 173 4 0 174 4 0 175 1 0 176 3 0 177 1 0 178 0 0 179 1 0 180 0 0 181 1 0 182 0 0 183 1 0 184 0 0 185 4 0 186 2 0 187 1 0 188 2 0 189 1 0 190 1 0 191 1 0 192 1 0 193 3 0 194 1 0 195 2 0 196 1 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/salmonella.agona.txt0000644000176000001440000001046012003774136021365 0ustar ripleyusersweek observed state 199001 1 0 199002 0 0 199003 5 0 199004 2 0 199005 1 0 199006 2 0 199007 0 0 199008 4 0 199009 0 0 199010 0 0 199011 0 0 199012 3 0 199013 1 0 199014 1 0 199015 0 0 199016 0 0 199017 2 0 199018 2 0 199019 0 0 199020 2 0 199021 6 0 199022 3 0 199023 2 0 199024 1 0 199025 2 0 199026 0 0 199027 1 0 199028 1 0 199029 3 0 199030 5 0 199031 3 0 199032 4 0 199033 3 0 199034 6 0 199035 5 0 199036 8 0 199037 6 0 199038 3 0 199039 6 0 199040 2 0 199041 5 0 199042 2 0 199043 1 0 199044 5 0 199045 7 0 199046 1 0 199047 10 0 199048 3 0 199049 4 0 199050 0 0 199051 0 0 199052 1 0 199101 6 0 199102 0 0 199103 2 0 199104 2 0 199105 0 0 199106 0 0 199107 2 0 199108 2 0 199109 0 0 199110 6 0 199111 7 0 199112 1 0 199113 0 0 199114 0 0 199115 0 0 199116 1 0 199117 1 0 199118 4 0 199119 3 0 199120 1 0 199121 3 0 199122 2 0 199123 6 0 199124 3 0 199125 4 0 199126 4 0 199127 8 0 199128 12 0 199129 9 0 199130 17 0 199131 16 0 199132 8 0 199133 6 0 199134 13 0 199135 4 0 199136 7 0 199137 10 0 199138 3 0 199139 11 0 199140 4 0 199141 6 0 199142 4 0 199143 7 0 199144 6 0 199145 2 0 199146 9 0 199147 2 0 199148 3 0 199149 4 0 199150 1 0 199151 2 0 199152 2 0 199201 0 0 199202 0 0 199203 1 0 199204 2 0 199205 2 0 199206 2 0 199207 5 0 199208 0 0 199209 0 0 199210 4 0 199211 2 0 199212 1 0 199213 3 0 199214 2 0 199215 0 0 199216 1 0 199217 1 0 199218 3 0 199219 0 0 199220 1 0 199221 3 0 199222 2 0 199223 3 0 199224 6 0 199225 2 0 199226 1 0 199227 3 0 199228 3 0 199229 2 0 199230 2 0 199231 2 0 199232 1 0 199233 3 0 199234 3 0 199235 2 0 199236 3 0 199237 0 0 199238 2 0 199239 4 0 199240 6 0 199241 7 0 199242 3 0 199243 1 0 199244 4 0 199245 1 0 199246 2 0 199247 5 0 199248 1 0 199249 3 0 199250 1 0 199251 0 0 199252 1 0 199301 3 0 199302 3 0 199303 0 0 199304 0 0 199305 1 0 199306 1 0 199307 0 0 199308 1 0 199309 4 0 199310 1 0 199311 1 0 199312 0 0 199313 0 0 199314 1 0 199315 1 0 199316 4 0 199317 1 0 199318 0 0 199319 1 0 199320 2 0 199321 1 0 199322 4 0 199323 3 0 199324 3 0 199325 0 0 199326 3 0 199327 5 0 199328 3 0 199329 3 0 199330 4 0 199331 3 0 199332 3 0 199333 3 0 199334 4 0 199335 5 0 199336 7 0 199337 6 0 199338 5 0 199339 3 0 199340 2 0 199341 1 0 199342 3 0 199343 2 0 199344 1 0 199345 2 0 199346 1 0 199347 1 0 199348 0 0 199349 0 0 199350 1 0 199351 1 0 199352 0 0 199401 1 0 199402 4 0 199403 3 0 199404 2 0 199405 0 0 199406 1 0 199407 0 0 199408 3 0 199409 1 0 199410 1 0 199411 4 0 199412 4 0 199413 0 0 199414 1 0 199415 4 0 199416 2 0 199417 0 0 199418 1 0 199419 1 0 199420 0 0 199421 1 0 199422 1 0 199423 2 0 199424 5 0 199425 4 0 199426 0 0 199427 2 0 199428 1 0 199429 1 0 199430 3 0 199431 6 0 199432 1 0 199433 7 0 199434 6 0 199435 2 0 199436 5 0 199437 7 0 199438 5 0 199439 4 0 199440 5 0 199441 6 0 199442 6 0 199443 1 0 199444 2 0 199445 2 0 199446 5 0 199447 4 0 199448 1 0 199449 6 0 199450 2 0 199451 5 0 199452 3 0 199501 4 0 199502 7 0 199503 6 0 199504 10 0 199505 2 0 199506 4 0 199507 0 0 199508 3 0 199509 0 0 199510 1 0 199511 3 0 199512 0 0 199513 1 0 199514 1 0 199515 0 0 199516 1 0 199517 0 0 199518 1 0 199519 0 0 199520 1 0 199521 2 0 199522 2 0 199523 4 0 199524 7 0 199525 6 0 199526 1 0 199527 4 0 199528 6 0 199529 4 0 199530 2 0 199531 4 0 199532 5 0 199533 5 0 199534 9 0 199535 8 0 199536 6 0 199537 3 0 199538 2 0 199539 3 0 199540 4 0 199541 3 0 199542 3 0 199543 4 0 199544 4 0 199545 2 0 199546 1 0 199547 2 0 199548 3 0 199549 2 0 199550 2 0 199551 0 0 199552 4 0 surveillance/inst/extdata/m5.txt0000644000176000001440000000344712003774136016502 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 1 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 0 0 38 0 0 39 0 0 40 0 0 41 0 0 42 0 0 43 0 0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 0 0 57 0 0 58 0 0 59 0 0 60 0 0 61 0 0 62 0 0 63 0 0 64 0 0 65 0 0 66 0 0 67 0 0 68 0 0 69 0 0 70 0 0 71 0 0 72 0 0 73 0 0 74 0 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 1 0 99 0 0 100 0 0 101 0 0 102 1 1 103 2 1 104 1 1 105 1 1 106 0 1 107 1 1 108 11 1 109 65 0 110 3 0 111 16 0 112 3 0 113 10 0 114 2 0 115 7 0 116 2 0 117 0 0 118 0 0 119 0 0 120 0 0 121 1 0 122 0 0 123 0 0 124 0 0 125 3 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/m2.txt0000644000176000001440000000345212003774136016473 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 0 0 38 0 0 39 0 0 40 0 0 41 0 0 42 0 0 43 0 0 44 0 0 45 0 0 46 10 1 47 12 1 48 21 1 49 18 1 50 31 1 51 26 1 52 27 1 53 0 1 54 0 1 55 0 1 56 0 1 57 0 1 58 0 1 59 0 1 60 0 1 61 0 1 62 0 1 63 0 1 64 0 1 65 0 1 66 0 1 67 0 1 68 0 1 69 0 0 70 0 0 71 0 0 72 0 0 73 0 0 74 0 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/m3.txt0000644000176000001440000000346612003774136016501 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 2 0 11 0 0 12 0 0 13 0 0 14 0 0 15 11 0 16 3 0 17 1 0 18 0 0 19 2 0 20 0 0 21 2 0 22 4 0 23 3 0 24 3 0 25 8 0 26 3 0 27 4 0 28 2 0 29 0 0 30 2 0 31 0 0 32 0 0 33 0 0 34 2 0 35 0 0 36 1 0 37 0 0 38 0 0 39 0 0 40 1 0 41 0 0 42 0 0 43 0 0 44 1 0 45 1 0 46 0 1 47 3 1 48 2 1 49 4 1 50 12 1 51 38 1 52 25 1 53 0 1 54 22 1 55 30 1 56 33 1 57 29 1 58 31 1 59 24 1 60 10 1 61 51 1 62 33 1 63 41 0 64 18 0 65 10 0 66 9 0 67 10 0 68 12 0 69 19 0 70 6 0 71 3 0 72 3 0 73 5 0 74 5 0 75 6 0 76 2 0 77 3 0 78 2 0 79 4 0 80 3 0 81 7 0 82 4 0 83 1 0 84 0 0 85 0 0 86 0 0 87 1 0 88 1 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 1 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/neighbourhood_BYBW.txt0000644000176000001440000012031011736257535021640 0ustar ripleyusers"8336" "8337" "8315" "8311" "9262" "9172" "9163" "9776" "9763" "8435" "8335" "8327" "8326" "8316" "8325" "9275" "9189" "9171" "9187" "9182" "9173" "9175" "9764" "8436" "9780" "9762" "9180" "9190" "9188" "9162" "9775" "8421" "8437" "8426" "8417" "8317" "8237" "8211" "9272" "9271" "9263" "9279" "9277" "9261" "9183" "9184" "9177" "9778" "9777" "9761" "9181" "9179" "9174" "9774" "8425" "8416" "8415" "8231" "8115" "8235" "8216" "8212" "9276" "9362" "9278" "9274" "9178" "9186" "9161" "9773" "9772" "9771" "9185" "8135" "8117" "8116" "8111" "8236" "8121" "8118" "8221" "8215" "9565" "9372" "9375" "9273" "9176" "9563" "9562" "9779" "9577" "9573" "9561" "8136" "8119" "8125" "8226" "8222" "9576" "9564" "9363" "9376" "9373" "9361" "9572" "9461" "9663" "9575" "9571" "8127" "8126" "8225" "9675" "9662" "9574" "9474" "9462" "9377" "9374" "9371" "9471" "9463" "9679" "8128" "9676" "9661" "9678" "9479" "9472" "9464" "9478" "9477" "9674" "9473" "9677" "9671" "9673" "9672" "9475" "9476" "8336" 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8337" 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8315" 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8311" 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9262" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9172" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9163" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9776" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9763" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8435" 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8335" 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8327" 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8326" 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8316" 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8325" 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9275" 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9189" 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9171" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9187" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9182" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9173" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9175" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9764" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8436" 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9780" 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9762" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9180" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9190" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9188" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9162" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9775" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8421" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8437" 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8426" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8417" 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8317" 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8237" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8211" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9272" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9271" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9263" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9279" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9277" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9261" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9183" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9184" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9177" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9778" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9777" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9761" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9181" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9179" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9174" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9774" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8425" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8416" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8415" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8231" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8115" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8235" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8216" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8212" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9276" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9362" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9278" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9274" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9178" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9186" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9161" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9773" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9772" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9771" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9185" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8135" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8117" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8116" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8111" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8236" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8121" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8118" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8221" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8215" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9565" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9372" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9375" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9273" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9176" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9563" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9562" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9779" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9577" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9573" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9561" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8136" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8119" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8125" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8226" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8222" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9576" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9564" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9363" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9376" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9373" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9361" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9572" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9461" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9663" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9575" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9571" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8127" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8126" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8225" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9675" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9662" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9574" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9474" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9462" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9377" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 "9374" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9371" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9471" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 "9463" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "9679" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 "8128" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "9676" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 "9661" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "9678" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 "9479" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 "9472" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 "9464" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 "9478" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 "9477" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 "9674" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 "9473" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 "9677" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 "9671" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "9673" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 "9672" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 "9475" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 "9476" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 surveillance/inst/extdata/s3.txt0000644000176000001440000000344512003774136016504 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 3 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 1 0 20 1 0 21 1 0 22 0 0 23 1 0 24 0 0 25 1 0 26 0 0 27 1 0 28 2 0 29 1 0 30 0 0 31 2 0 32 3 0 33 0 0 34 3 0 35 2 0 36 1 0 37 3 0 38 2 0 39 1 0 40 1 0 41 3 0 42 2 0 43 3 0 44 0 0 45 2 0 46 4 0 47 1 0 48 1 0 49 2 0 50 1 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 1 0 57 1 0 58 0 0 59 0 0 60 1 0 61 0 0 62 0 0 63 1 0 64 0 0 65 0 0 66 0 0 67 1 0 68 2 0 69 0 0 70 0 0 71 1 0 72 0 0 73 1 0 74 1 0 75 0 0 76 3 0 77 1 0 78 1 0 79 1 0 80 2 0 81 3 0 82 3 0 83 1 0 84 3 0 85 4 0 86 1 0 87 2 0 88 6 0 89 1 0 90 1 0 91 3 0 92 2 0 93 2 0 94 3 0 95 4 0 96 1 0 97 0 0 98 2 0 99 1 0 100 2 0 101 2 0 102 1 0 103 0 0 104 1 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 1 0 114 1 0 115 0 0 116 2 0 117 2 0 118 0 0 119 1 0 120 0 0 121 3 0 122 1 0 123 0 0 124 0 0 125 2 0 126 0 0 127 3 1 128 0 1 129 4 1 130 2 1 131 2 1 132 9 1 133 7 1 134 3 1 135 2 1 136 12 1 137 5 1 138 3 1 139 7 1 140 9 1 141 6 1 142 10 1 143 6 1 144 5 1 145 3 1 146 3 1 147 8 1 148 4 1 149 3 1 150 2 1 151 3 1 152 2 1 153 1 1 154 2 1 155 5 1 156 2 1 157 2 0 158 1 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 1 0 165 1 0 166 1 0 167 0 0 168 0 0 169 0 0 170 0 0 171 1 0 172 1 0 173 3 0 174 0 0 175 0 0 176 0 0 177 1 0 178 1 0 179 0 0 180 1 0 181 1 0 182 3 0 183 2 0 184 1 0 185 3 0 186 1 0 187 1 0 188 1 0 189 1 0 190 3 0 191 6 0 192 7 0 193 4 0 194 4 0 195 2 0 196 3 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/s1.txt0000644000176000001440000000346112003774136016500 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 1 0 6 0 0 7 1 0 8 1 0 9 1 0 10 0 0 11 2 0 12 5 0 13 1 0 14 2 0 15 2 0 16 1 0 17 2 0 18 1 0 19 1 0 20 2 0 21 0 0 22 0 0 23 0 0 24 1 0 25 0 0 26 0 0 27 2 0 28 3 0 29 3 0 30 0 0 31 1 0 32 0 0 33 0 0 34 1 0 35 0 0 36 2 0 37 1 0 38 0 0 39 1 0 40 3 0 41 3 0 42 14 1 43 19 1 44 31 1 45 46 1 46 40 1 47 45 1 48 33 1 49 47 1 50 27 1 51 24 1 52 8 1 53 0 1 54 16 1 55 13 0 56 7 0 57 13 0 58 7 0 59 2 0 60 1 0 61 2 0 62 10 0 63 3 0 64 3 0 65 4 0 66 1 0 67 1 0 68 2 0 69 3 0 70 2 0 71 1 0 72 3 0 73 0 0 74 1 0 75 0 0 76 0 0 77 4 0 78 1 0 79 3 0 80 0 0 81 1 0 82 0 0 83 1 0 84 3 0 85 3 0 86 3 0 87 0 0 88 0 0 89 1 0 90 2 0 91 0 0 92 0 0 93 0 0 94 2 0 95 1 0 96 1 0 97 0 0 98 0 0 99 1 0 100 1 0 101 0 0 102 1 0 103 1 0 104 3 0 105 0 0 106 0 0 107 0 0 108 0 0 109 1 0 110 0 0 111 2 0 112 0 0 113 1 0 114 0 0 115 0 0 116 3 0 117 3 0 118 0 0 119 1 0 120 0 0 121 1 0 122 2 0 123 0 0 124 0 0 125 0 0 126 2 0 127 1 0 128 2 0 129 1 0 130 1 0 131 1 0 132 0 0 133 0 0 134 0 0 135 0 0 136 1 0 137 0 0 138 0 0 139 0 0 140 3 0 141 1 0 142 1 0 143 0 0 144 0 0 145 2 0 146 2 0 147 0 0 148 1 0 149 1 0 150 0 0 151 1 0 152 1 0 153 1 0 154 0 0 155 0 0 156 1 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 1 0 163 0 0 164 0 0 165 1 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 3 0 174 1 0 175 0 0 176 0 0 177 2 0 178 3 0 179 1 0 180 1 0 181 0 0 182 2 0 183 2 0 184 2 0 185 0 0 186 0 0 187 0 0 188 1 0 189 0 0 190 0 0 191 0 0 192 0 0 193 3 0 194 0 0 195 1 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/q1_nrwh.txt0000644000176000001440000000344512003774136017536 0ustar ripleyusers"week" "observed" "state" 1 0 1 2 0 1 3 0 1 4 0 1 5 5 1 6 0 1 7 11 1 8 5 1 9 16 1 10 7 1 11 5 1 12 6 1 13 1 1 14 6 1 15 5 1 16 6 1 17 5 1 18 4 1 19 2 1 20 1 1 21 2 1 22 5 1 23 2 1 24 2 1 25 2 0 26 3 0 27 0 0 28 2 0 29 1 0 30 1 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 0 0 38 0 0 39 0 0 40 1 0 41 1 0 42 0 0 43 0 0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 1 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 0 0 57 0 0 58 0 0 59 0 0 60 0 0 61 0 0 62 0 0 63 0 0 64 0 0 65 0 0 66 1 0 67 0 0 68 0 0 69 0 0 70 0 0 71 0 0 72 4 0 73 1 0 74 8 0 75 3 0 76 1 0 77 3 0 78 2 0 79 1 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 1 0 91 1 0 92 0 0 93 0 0 94 0 0 95 1 0 96 0 0 97 0 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 2 0 130 3 0 131 5 0 132 8 0 133 4 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 1 0 168 0 0 169 0 0 170 0 0 171 1 0 172 0 0 173 0 0 174 0 0 175 0 0 176 1 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/k1.txt0000644000176000001440000000346012003774136016467 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 1 0 4 1 0 5 2 0 6 1 0 7 0 0 8 2 0 9 4 0 10 1 0 11 6 0 12 1 0 13 2 0 14 1 0 15 0 0 16 1 0 17 2 0 18 0 0 19 2 0 20 3 0 21 1 0 22 1 0 23 0 0 24 1 0 25 1 0 26 1 0 27 4 0 28 2 0 29 2 0 30 1 0 31 7 0 32 1 0 33 3 0 34 10 1 35 200 1 36 10 0 37 16 0 38 22 0 39 9 0 40 8 0 41 12 0 42 7 0 43 12 0 44 11 0 45 5 0 46 5 0 47 1 0 48 1 0 49 1 0 50 2 0 51 3 0 52 0 0 53 0 0 54 1 0 55 2 0 56 1 0 57 0 0 58 1 0 59 1 0 60 0 0 61 0 0 62 2 0 63 3 0 64 1 0 65 0 0 66 1 0 67 1 0 68 4 0 69 1 0 70 0 0 71 2 0 72 1 0 73 2 0 74 0 0 75 2 0 76 0 0 77 1 0 78 0 0 79 1 0 80 1 0 81 3 0 82 3 0 83 2 0 84 1 0 85 3 0 86 1 0 87 2 0 88 1 0 89 6 0 90 3 0 91 4 0 92 1 0 93 2 0 94 2 0 95 1 0 96 3 0 97 2 0 98 1 0 99 5 0 100 4 0 101 4 0 102 0 0 103 2 0 104 1 0 105 1 0 106 0 0 107 0 0 108 1 0 109 0 0 110 0 0 111 1 0 112 1 0 113 0 0 114 0 0 115 2 0 116 0 0 117 0 0 118 0 0 119 2 0 120 0 0 121 1 0 122 0 0 123 0 0 124 0 0 125 0 0 126 2 0 127 0 0 128 0 0 129 3 0 130 2 0 131 1 0 132 2 0 133 3 0 134 6 0 135 1 0 136 4 0 137 4 0 138 3 0 139 0 0 140 2 0 141 12 0 142 12 0 143 17 0 144 11 0 145 6 0 146 5 0 147 4 0 148 5 0 149 5 0 150 1 0 151 1 0 152 0 0 153 1 0 154 1 0 155 1 0 156 0 0 157 1 0 158 0 0 159 0 0 160 0 0 161 1 0 162 0 0 163 0 0 164 0 0 165 1 0 166 0 0 167 0 0 168 0 0 169 2 0 170 2 0 171 0 0 172 0 0 173 1 0 174 0 0 175 0 0 176 1 0 177 1 0 178 1 0 179 1 0 180 1 0 181 1 0 182 0 0 183 0 0 184 1 0 185 1 0 186 3 0 187 0 0 188 3 0 189 2 0 190 1 0 191 0 0 192 2 0 193 1 0 194 5 0 195 2 0 196 3 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/m4.txt0000644000176000001440000000346012003774136016474 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 1 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 1 0 20 1 0 21 1 0 22 0 0 23 1 0 24 0 0 25 1 0 26 1 0 27 1 0 28 0 0 29 0 0 30 0 0 31 1 0 32 3 0 33 3 0 34 0 0 35 1 0 36 1 0 37 3 0 38 0 0 39 0 0 40 0 0 41 0 0 42 1 0 43 0 0 44 1 0 45 0 0 46 0 0 47 0 0 48 0 0 49 1 0 50 11 0 51 0 0 52 1 0 53 0 0 54 1 1 55 2 1 56 25 1 57 15 1 58 21 1 59 26 1 60 56 1 61 68 1 62 26 1 63 25 0 64 25 0 65 31 0 66 18 0 67 7 0 68 15 0 69 9 0 70 1 0 71 1 0 72 0 0 73 5 0 74 2 0 75 0 0 76 3 0 77 0 0 78 2 0 79 0 0 80 0 0 81 0 0 82 1 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 1 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 1 0 117 0 0 118 2 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/s2.txt0000644000176000001440000000344312003774136016501 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 1 0 38 0 0 39 0 0 40 0 0 41 0 0 42 0 0 43 0 0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 0 0 57 0 0 58 0 0 59 0 0 60 0 0 61 0 0 62 0 0 63 0 0 64 1 0 65 0 0 66 0 0 67 0 0 68 0 0 69 0 0 70 0 0 71 1 0 72 0 0 73 0 0 74 0 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 1 90 0 1 91 0 1 92 0 1 93 0 1 94 0 1 95 1 1 96 0 1 97 2 1 98 1 1 99 1 1 100 1 1 101 0 1 102 0 1 103 0 1 104 1 1 105 1 1 106 0 1 107 0 1 108 1 1 109 3 1 110 2 1 111 3 1 112 2 1 113 0 1 114 1 1 115 1 1 116 1 1 117 0 1 118 4 1 119 0 1 120 0 1 121 1 1 122 1 1 123 0 1 124 0 1 125 1 1 126 1 1 127 0 1 128 0 1 129 0 1 130 0 1 131 0 1 132 0 1 133 0 1 134 1 1 135 0 1 136 1 1 137 0 1 138 0 1 139 0 1 140 0 1 141 0 1 142 0 1 143 0 0 144 0 0 145 0 0 146 1 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 1 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/counts_flu_BYBW.txt0000644000176000001440000035352611736257535021206 0ustar ripleyusers"8336" "8337" "8315" "8311" "9262" "9172" "9163" "9776" "9763" "8435" "8335" "8327" "8326" "8316" "8325" "9275" "9189" "9171" "9187" "9182" "9173" "9175" "9764" "8436" "9780" "9762" "9180" "9190" "9188" "9162" "9775" "8421" "8437" "8426" "8417" "8317" "8237" "8211" "9272" "9271" "9263" "9279" "9277" "9261" "9183" "9184" "9177" "9778" "9777" "9761" "9181" "9179" "9174" "9774" "8425" "8416" "8415" "8231" "8115" "8235" "8216" "8212" "9276" "9362" "9278" "9274" "9178" "9186" "9161" "9773" "9772" "9771" "9185" "8135" "8117" "8116" "8111" "8236" "8121" "8118" "8221" "8215" "9565" "9372" "9375" "9273" "9176" "9563" "9562" "9779" "9577" "9573" "9561" "8136" "8119" "8125" "8226" "8222" "9576" "9564" "9363" "9376" "9373" "9361" "9572" "9461" "9663" "9575" "9571" "8127" "8126" "8225" "9675" "9662" "9574" "9474" "9462" "9377" "9374" "9371" "9471" "9463" "9679" "8128" "9676" "9661" "9678" "9479" "9472" "9464" "9478" "9477" "9674" "9473" "9677" "9671" "9673" "9672" "9475" "9476" "1" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "2" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "3" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "4" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 3 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "5" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 5 0 0 0 0 4 0 4 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 12 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 2 0 4 4 0 0 2 0 3 0 0 0 0 0 0 0 3 0 0 0 0 6 0 0 1 0 3 0 0 0 0 0 0 0 0 1 2 2 8 0 0 0 0 0 0 8 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "6" 0 0 1 6 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 3 0 0 0 0 10 0 6 0 5 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 6 0 4 0 1 0 0 5 0 0 0 0 0 0 1 0 0 0 0 1 2 4 8 0 0 3 0 3 0 0 0 0 0 1 0 1 0 0 0 0 7 1 0 0 0 5 0 0 0 0 0 0 0 0 0 11 1 0 0 0 0 0 0 0 4 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "7" 0 0 1 1 0 0 0 0 0 0 0 4 0 3 0 0 0 0 1 2 1 6 0 3 0 0 0 0 0 6 0 3 0 0 0 2 0 0 0 0 1 0 0 0 2 7 0 0 0 0 0 0 0 0 2 0 3 0 1 0 0 9 0 0 0 0 0 0 0 1 0 1 1 2 1 0 9 0 0 3 0 0 0 2 0 0 0 0 0 2 0 0 0 0 3 3 0 0 0 7 1 0 0 0 0 0 0 0 0 6 1 0 0 3 0 1 0 2 11 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "8" 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 11 1 1 0 6 0 0 1 0 0 0 0 3 0 3 0 3 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 3 0 6 0 0 0 0 2 0 0 0 0 0 0 1 1 0 0 1 0 3 1 6 0 0 1 0 1 0 0 0 0 1 0 1 4 0 0 0 0 2 2 0 0 0 1 0 8 0 0 0 0 0 0 0 4 1 0 1 0 0 1 0 0 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 0 0 2 0 0 0 0 0 0 0 6 0 0 0 1 0 1 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 2 0 0 1 0 0 3 0 0 4 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 3 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 "10" 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "11" 0 0 2 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 4 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "12" 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "13" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 "14" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "15" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "16" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "17" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "18" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "19" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "20" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "21" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "22" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "23" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "24" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "25" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "26" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "27" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "28" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "29" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "30" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "31" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "32" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "33" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "34" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "35" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "36" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "37" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "38" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "39" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "40" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "41" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "42" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "43" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "44" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "45" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "46" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "47" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "48" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "49" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "50" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "51" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "52" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "53" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "54" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "55" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "56" 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 0 2 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "57" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 6 4 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "58" 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "59" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 3 3 0 1 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 5 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 1 1 0 0 0 0 0 0 0 0 5 3 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "60" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 10 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 1 1 0 1 0 3 1 0 0 0 3 0 0 0 0 0 0 0 1 0 1 6 0 0 1 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 3 1 6 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "61" 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 7 0 1 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 5 0 3 0 1 1 1 0 0 2 0 0 4 0 0 0 0 1 0 1 6 0 0 1 0 0 0 4 0 0 0 0 1 0 0 0 0 0 1 2 2 0 1 5 1 3 0 0 2 0 0 0 0 8 1 0 1 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 "62" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 2 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 7 0 0 2 0 1 0 1 0 0 0 0 2 0 0 0 0 0 0 3 0 2 0 2 1 5 0 0 0 0 0 0 0 3 1 0 1 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 2 0 3 "63" 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 7 0 4 0 5 0 5 1 0 0 0 5 0 0 0 0 0 0 0 0 0 1 7 0 0 3 0 3 0 3 0 0 0 0 0 2 0 0 0 0 0 5 2 0 0 11 4 0 4 0 0 0 0 1 1 12 1 0 0 0 0 0 0 0 7 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 "64" 0 0 1 2 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 4 3 1 0 0 0 0 0 0 0 0 1 2 4 0 2 0 0 0 0 0 1 2 0 0 1 0 0 0 0 0 1 0 8 0 0 4 0 2 0 2 0 0 0 0 3 0 0 0 0 0 2 1 1 0 0 6 1 0 0 0 1 4 0 0 0 4 1 0 1 0 1 1 0 3 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 10 "65" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 6 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 10 3 0 0 0 0 0 0 0 0 11 0 0 0 0 0 1 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 4 "66" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 "67" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 "68" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 1 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 "69" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 "70" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "71" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "72" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "73" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "74" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "75" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "76" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "77" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "78" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "79" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "80" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "81" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "82" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "83" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "84" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "85" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "86" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "87" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "88" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "89" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "90" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "91" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "92" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "93" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "94" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "95" 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "96" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "97" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "98" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "99" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "100" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "101" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "102" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "103" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "104" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "105" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "106" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "107" 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "108" 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "109" 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 29 3 0 0 4 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 1 0 0 0 0 2 6 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 "110" 0 0 1 5 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 9 0 0 0 4 0 1 0 0 0 0 0 0 0 0 0 24 2 0 0 7 0 0 2 0 2 0 0 0 15 0 1 1 2 1 0 0 1 0 1 0 1 9 0 0 0 12 7 0 0 1 1 0 0 8 0 0 0 0 1 2 0 0 0 0 4 0 1 0 0 5 3 2 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "111" 0 0 0 2 0 0 0 0 0 0 0 9 0 2 0 0 0 0 0 4 0 1 0 2 0 0 2 0 0 19 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 14 0 0 0 3 0 0 2 0 3 0 2 0 3 0 3 1 3 1 1 1 0 0 4 0 2 7 0 0 0 8 16 0 0 13 0 0 0 12 1 0 0 2 0 1 0 0 0 0 2 1 3 0 1 5 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 1 "112" 0 0 5 1 0 0 0 0 0 1 1 10 1 0 3 0 0 5 2 11 0 5 0 2 0 0 0 0 0 26 0 0 1 1 1 1 1 0 0 0 0 0 0 0 2 45 2 0 0 11 0 0 6 0 5 4 1 0 7 0 9 21 3 6 2 0 0 0 5 0 6 6 0 0 1 22 51 0 0 12 1 1 0 30 2 0 0 1 3 1 0 0 0 1 5 14 1 0 0 9 6 10 0 0 0 0 1 15 1 0 1 0 5 2 0 0 0 4 13 0 0 0 9 0 0 0 5 0 0 0 0 1 0 0 0 0 0 3 0 0 "113" 1 0 11 3 0 1 0 0 0 6 0 9 0 2 2 0 4 5 2 8 0 10 0 0 0 0 1 0 0 37 0 2 0 1 0 0 0 0 0 0 0 0 0 0 2 47 2 0 0 11 1 1 3 0 11 7 5 0 8 0 16 0 1 7 5 3 0 1 5 0 3 10 0 0 4 21 57 0 0 7 1 0 0 14 6 0 1 0 0 4 0 1 0 3 4 8 5 2 0 16 18 13 0 0 0 0 3 0 0 0 0 0 2 5 0 1 0 2 9 2 1 0 14 0 0 0 2 0 0 0 0 3 0 0 1 1 1 0 0 3 "114" 0 2 7 9 0 1 0 0 0 8 2 10 0 4 0 0 0 1 0 6 0 7 0 2 0 0 2 0 0 32 0 0 0 2 0 2 0 0 0 0 0 0 0 0 4 23 0 1 0 8 0 3 4 0 4 2 5 0 26 0 4 2 1 9 2 1 0 0 0 1 1 6 0 0 1 12 12 1 0 3 0 0 2 15 16 0 0 1 1 1 0 4 0 0 13 4 3 0 0 12 20 9 1 0 1 0 1 20 4 0 0 0 2 14 0 7 0 9 34 1 4 3 7 0 0 0 0 1 0 0 0 3 1 1 2 0 2 3 0 0 "115" 0 0 1 6 0 2 0 0 0 0 0 4 0 0 0 0 1 1 0 4 1 3 0 0 0 0 2 0 0 30 0 4 0 0 0 0 0 0 0 0 0 0 0 0 4 10 2 0 0 0 1 1 0 0 3 0 1 0 12 1 2 0 1 8 1 1 0 12 2 1 1 6 0 0 0 3 15 0 0 3 0 0 1 6 2 0 1 0 3 0 0 0 0 1 0 1 0 0 0 4 7 12 1 0 0 1 1 3 2 1 0 0 0 2 4 3 0 5 8 1 4 2 4 1 0 0 0 3 1 0 0 5 0 1 0 0 2 0 0 25 "116" 0 0 0 4 0 0 1 0 0 1 0 0 1 5 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 6 0 4 0 0 0 2 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 1 1 0 3 0 0 0 4 6 2 1 0 0 0 0 0 2 0 0 0 3 0 0 1 6 7 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 4 0 0 0 1 5 3 1 0 0 1 0 4 2 0 0 0 0 1 0 0 0 3 4 2 3 0 5 0 0 0 1 0 0 0 1 10 0 1 0 1 0 0 0 0 "117" 0 0 7 5 0 1 0 0 0 2 0 0 0 1 0 0 3 3 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 2 0 1 0 0 0 2 0 0 0 4 0 0 0 1 3 0 0 4 0 0 0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 2 0 1 0 0 0 3 0 0 0 0 0 1 1 0 0 0 4 0 1 1 0 0 0 0 0 0 0 0 0 2 0 1 2 0 0 0 0 3 "118" 0 2 2 2 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 7 2 0 0 1 3 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 10 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 0 "119" 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 5 0 3 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 "120" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 "121" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "122" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "123" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "124" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "125" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "126" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "127" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "128" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "129" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "130" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "131" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "132" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "133" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "134" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "135" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "136" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "137" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "138" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "139" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "140" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "141" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "142" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "143" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "144" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "145" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "146" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "147" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "148" 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "149" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "150" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "151" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "152" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "153" 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "154" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 "155" 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 "156" 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "157" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "158" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "159" 3 3 5 2 0 0 0 0 0 1 1 1 0 3 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 7 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 "160" 1 0 5 10 0 0 0 0 0 1 0 1 0 2 0 0 1 2 3 1 0 0 0 0 0 0 2 0 0 4 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 2 1 0 0 4 0 0 2 0 0 2 0 3 7 0 3 0 0 0 1 1 0 0 1 0 0 2 0 0 1 0 2 0 0 3 0 1 0 2 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 2 3 0 0 0 0 0 2 0 4 0 0 1 0 0 0 0 0 0 0 1 0 4 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 "161" 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 6 0 0 0 2 0 2 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 3 0 1 1 1 0 1 0 1 2 1 0 0 1 0 5 0 0 0 1 0 0 1 1 3 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 3 0 0 2 0 0 0 0 0 0 1 2 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "162" 1 0 1 0 0 0 0 0 0 1 1 4 2 2 0 0 2 2 1 0 0 0 0 1 0 0 0 1 0 10 0 2 0 1 0 1 0 1 0 0 0 0 0 0 2 3 0 0 0 1 0 0 1 0 2 1 1 0 4 0 1 4 0 0 0 0 0 1 2 0 0 0 0 0 1 3 3 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 3 0 0 1 0 0 5 2 1 0 0 3 1 0 0 0 1 1 0 1 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "163" 1 0 0 2 0 0 0 0 0 1 1 1 0 0 0 0 0 4 0 0 0 1 0 1 2 0 0 0 0 8 0 1 0 0 0 6 0 0 0 0 0 0 0 0 1 4 1 0 0 1 0 0 5 1 0 3 0 0 5 0 0 0 1 0 0 1 0 11 0 0 0 0 0 2 3 4 9 0 0 2 0 2 0 2 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 3 0 0 0 1 0 1 9 6 0 0 10 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "164" 0 0 0 2 0 0 2 0 0 3 1 0 0 0 0 0 2 0 2 0 0 2 0 1 0 0 0 0 0 7 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 0 0 0 0 0 0 0 4 1 0 4 0 0 0 1 0 12 1 0 0 1 0 0 2 2 4 0 0 5 0 0 0 2 0 0 0 0 0 0 0 0 4 0 1 2 0 0 0 0 0 1 0 0 0 1 0 1 0 2 0 0 4 0 0 1 0 0 0 0 5 1 0 0 1 0 0 0 0 0 3 5 0 1 0 1 1 0 0 0 "165" 0 1 1 5 0 1 0 0 0 2 2 6 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 1 0 2 0 4 0 0 0 0 0 0 0 5 0 2 0 1 0 1 0 0 2 0 0 0 0 0 3 0 0 0 0 1 0 3 0 3 1 0 1 0 0 0 0 0 3 0 0 2 0 0 0 2 1 0 0 0 0 0 0 0 1 0 2 0 0 0 0 2 0 0 0 0 0 1 0 0 2 2 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 6 0 0 0 0 0 0 0 0 "166" 1 0 1 1 0 0 0 0 0 1 2 2 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 2 0 0 0 1 0 0 0 1 0 5 0 0 0 0 0 1 0 0 0 0 2 0 4 0 0 1 1 0 0 1 0 8 0 0 1 1 2 0 3 1 7 0 0 1 0 0 0 0 1 0 0 0 0 2 0 0 2 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 6 1 1 0 1 0 1 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 "167" 1 0 5 3 0 0 0 0 0 2 0 5 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 0 0 0 3 0 3 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 5 0 1 2 1 0 0 0 0 0 0 0 2 0 2 0 0 1 1 0 0 2 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "168" 0 2 2 2 0 0 0 0 0 0 0 10 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 1 0 0 0 4 0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 "169" 0 0 0 2 0 0 0 0 0 1 0 3 0 1 3 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 3 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 "170" 0 0 0 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "171" 0 0 0 2 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "172" 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "173" 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "174" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "175" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "176" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "177" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "178" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "179" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "180" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "181" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "182" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "183" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "184" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "185" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "186" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "187" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "188" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "189" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "190" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "191" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "192" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "193" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "194" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "195" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "196" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "197" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "198" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "199" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "200" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "201" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "202" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "203" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "204" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "205" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "206" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "207" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "208" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "209" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "210" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "211" 2 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 1 0 3 0 0 0 0 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "212" 1 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 3 0 0 1 0 0 0 2 0 0 0 0 3 14 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 7 0 0 0 2 0 0 0 0 0 4 0 0 3 3 0 0 0 1 1 0 3 0 1 0 2 1 1 0 0 4 8 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "213" 1 0 0 6 0 0 0 0 0 3 0 2 0 0 0 0 0 2 2 4 0 3 0 2 0 0 0 4 5 12 0 2 0 2 2 1 1 0 0 5 0 0 0 5 0 6 1 0 0 3 0 0 1 0 3 13 1 0 15 0 3 4 0 0 1 3 1 0 1 0 0 2 1 0 2 10 15 0 0 10 0 3 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 0 1 1 1 0 1 0 2 0 0 0 9 4 0 0 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "214" 9 2 1 1 0 1 0 0 0 4 2 5 0 1 0 0 3 1 2 2 0 1 0 3 0 0 0 5 7 26 0 1 2 0 1 4 6 0 0 11 0 1 0 1 1 10 2 0 0 1 2 0 0 0 0 10 1 0 27 9 1 2 0 0 2 1 5 4 2 0 1 4 0 1 0 12 24 0 0 6 0 4 0 0 3 0 0 2 1 0 0 1 0 5 2 1 1 0 0 1 3 1 0 0 1 0 1 1 0 9 3 0 0 0 0 0 0 0 1 0 2 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 "215" 10 0 4 4 0 0 0 0 0 4 4 11 0 0 4 0 7 0 3 0 0 2 0 1 0 0 0 3 0 16 0 0 0 1 4 4 7 0 0 14 1 3 0 5 1 1 5 0 0 2 0 1 0 0 0 20 5 1 38 1 5 3 3 0 3 5 4 1 0 1 0 0 0 1 9 8 32 0 0 21 1 1 0 0 2 0 3 1 0 0 4 1 2 7 4 0 3 0 0 4 2 4 1 0 0 0 0 1 0 4 1 0 1 0 0 0 1 0 5 1 10 0 3 1 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 "216" 5 1 8 9 1 3 1 0 0 4 3 5 0 0 6 0 8 2 15 1 0 8 0 1 0 0 0 7 6 38 1 0 1 2 0 7 2 0 0 4 0 3 0 4 2 20 7 0 0 8 1 3 0 0 4 8 11 0 19 0 5 2 6 7 2 6 9 2 1 0 3 7 1 1 19 10 33 2 1 21 2 1 0 2 1 1 4 2 1 0 0 2 2 3 8 3 6 2 0 4 5 3 2 0 0 4 0 0 2 22 1 0 3 0 0 4 0 3 7 1 10 0 4 2 0 0 1 0 1 1 0 1 1 3 2 0 2 0 0 0 "217" 10 2 2 6 0 1 3 0 0 5 7 6 2 1 33 0 5 0 11 0 0 3 0 3 0 0 2 7 1 37 0 2 1 0 1 4 2 1 2 6 2 2 0 3 0 17 7 0 0 22 2 0 2 0 5 5 8 0 18 0 9 6 3 2 3 3 5 5 1 1 9 3 1 1 28 9 35 1 0 21 3 7 0 9 11 2 4 3 0 0 0 1 2 4 13 5 19 2 0 6 15 10 6 0 2 2 0 3 6 16 1 0 6 0 0 5 2 6 18 1 10 0 4 2 0 0 1 1 1 0 0 2 4 7 2 0 0 1 0 0 "218" 4 6 1 3 0 0 0 2 0 2 4 4 2 2 0 1 3 0 11 2 0 4 0 3 1 0 0 14 0 35 0 0 0 1 0 3 3 1 2 1 0 8 0 2 1 13 1 0 0 11 3 0 0 0 2 0 7 0 28 1 11 6 7 2 5 1 5 8 0 3 10 6 2 0 25 12 40 0 0 15 2 14 0 12 7 3 1 1 3 0 1 2 0 5 5 5 12 1 0 7 30 8 5 3 0 6 1 4 1 7 3 1 5 7 0 3 0 7 26 4 13 1 4 5 1 0 11 0 0 0 0 2 3 7 3 0 1 3 1 0 "219" 6 2 3 4 0 0 3 0 0 1 3 7 0 2 7 0 0 1 2 6 1 7 0 3 0 0 0 21 0 60 1 0 1 1 2 5 3 0 0 0 1 5 0 0 2 11 1 0 0 16 0 2 0 1 2 5 14 0 17 1 14 4 3 7 1 3 3 0 0 8 6 11 4 0 24 6 29 1 2 12 4 9 1 7 5 3 1 2 0 0 0 0 6 2 17 4 13 0 0 4 9 0 5 2 0 0 0 4 10 9 3 0 8 3 0 2 4 0 12 2 3 0 4 6 2 0 2 0 0 0 0 3 2 2 2 0 0 1 0 1 "220" 2 0 2 3 0 0 1 1 0 0 4 4 0 0 0 0 1 0 3 2 2 1 0 1 0 0 0 2 0 22 2 0 0 2 0 1 0 0 0 0 2 3 0 0 0 4 2 0 0 4 0 0 0 0 1 2 2 0 2 0 7 0 3 2 2 0 2 0 0 0 1 1 2 0 13 7 10 0 0 4 1 2 0 3 2 1 0 0 1 0 0 1 3 2 4 0 2 0 0 1 6 2 0 1 0 1 0 2 6 15 0 0 1 7 1 0 0 0 10 2 5 0 0 5 2 0 2 1 0 0 0 0 4 0 2 1 0 1 0 0 "221" 2 2 1 2 0 0 0 0 0 1 6 1 1 1 0 0 0 0 2 0 1 0 0 0 0 0 0 6 0 17 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 4 1 0 0 1 0 0 0 0 0 0 1 0 0 0 2 0 1 1 3 0 3 2 0 4 0 0 0 0 3 1 2 0 0 1 0 0 0 0 2 0 0 0 1 0 2 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 2 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 "222" 0 0 2 3 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 2 1 0 3 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "223" 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "224" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "225" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "226" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "227" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "228" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "229" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "230" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "231" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "232" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "233" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "234" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "235" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "236" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "237" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "238" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "239" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "240" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "241" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "242" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "243" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "244" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "245" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "246" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "247" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "248" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "249" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "250" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "251" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "252" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "253" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 "254" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "255" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 "256" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "257" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "258" 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "259" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "260" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "261" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "262" 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "263" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "264" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "265" 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "266" 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "267" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "268" 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 3 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 5 2 0 0 0 0 1 0 0 1 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 3 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "269" 2 0 1 0 0 0 0 0 0 0 2 0 0 2 0 1 0 2 0 0 0 2 0 0 0 0 0 0 2 9 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 0 3 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "270" 0 0 0 1 1 0 0 0 0 3 1 0 0 2 0 0 1 3 0 0 0 0 0 1 0 0 0 0 2 4 1 3 1 0 0 0 0 0 0 0 0 0 0 1 0 5 0 1 0 0 0 1 0 1 4 0 0 0 0 0 1 1 0 0 0 4 0 0 1 0 0 0 2 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 "271" 0 0 0 5 8 0 0 4 0 2 2 1 0 2 0 5 2 6 1 3 0 1 0 0 1 0 1 4 4 14 0 1 0 0 0 2 0 0 0 1 0 0 0 0 0 4 2 0 0 0 0 3 0 0 1 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 0 2 2 0 0 2 1 0 0 3 1 0 0 1 0 2 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 "272" 0 1 0 1 3 0 0 1 0 4 2 0 0 2 0 10 0 0 0 0 0 1 0 1 0 0 0 0 10 14 0 0 0 1 0 5 0 0 0 4 0 0 1 1 3 4 3 0 0 0 0 5 0 2 3 0 0 1 1 5 0 0 0 0 0 1 0 2 0 0 1 1 1 0 1 4 2 0 0 3 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 1 0 0 0 0 "273" 3 2 0 4 3 1 0 0 0 10 0 1 0 4 0 7 2 3 3 0 0 1 0 2 2 1 1 0 8 30 0 0 0 0 0 0 0 0 0 13 0 4 2 3 6 9 3 0 0 1 1 1 1 2 1 2 2 0 3 6 1 0 3 1 0 2 4 22 0 0 2 0 0 1 1 3 4 1 0 2 0 2 0 20 2 1 3 1 0 0 0 0 0 0 6 1 0 0 3 2 0 2 0 0 0 0 0 0 0 7 1 0 1 0 0 1 0 0 3 1 0 0 0 3 0 0 0 0 0 0 0 3 4 2 0 0 0 0 0 0 "274" 0 0 0 0 11 0 0 0 0 4 3 1 0 1 0 23 1 6 2 1 0 0 0 3 1 0 2 1 10 29 0 1 0 1 0 0 0 0 0 10 1 3 1 1 2 12 2 0 0 2 0 0 2 0 0 3 1 0 4 0 6 0 16 0 1 3 0 1 1 0 3 5 4 0 1 2 4 0 0 2 0 0 0 13 2 1 0 0 0 2 0 0 0 0 3 0 2 0 0 7 0 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 0 1 7 0 0 0 0 1 0 1 0 "275" 1 0 0 0 4 0 0 0 0 1 1 0 1 1 0 8 0 4 4 0 0 1 0 1 1 0 1 0 0 15 0 0 0 0 0 0 0 0 0 2 0 0 2 0 2 6 3 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 7 0 1 1 2 1 1 0 0 1 1 0 2 0 4 0 0 1 0 0 0 4 3 0 1 0 0 0 0 0 0 1 3 0 1 1 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 7 0 1 1 0 2 0 0 0 "276" 0 1 1 0 2 0 0 0 0 0 1 0 0 1 0 4 0 3 3 0 0 0 0 0 1 0 1 0 3 5 0 1 0 0 0 0 0 0 0 3 2 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0 3 0 4 0 1 0 0 6 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 3 1 0 0 1 0 1 0 1 1 1 2 0 0 0 0 2 3 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 "277" 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 3 0 1 1 0 1 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "278" 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "279" 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "280" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 "281" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "282" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "283" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "284" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "285" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "286" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "287" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "288" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "289" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "290" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "291" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "292" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "293" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 "294" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "295" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "296" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "297" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "298" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "299" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "300" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "301" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "302" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "303" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "304" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "305" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "306" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "307" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "308" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "309" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "310" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "311" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 "312" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "313" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "314" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 "315" 1 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "316" 1 0 2 2 0 0 1 0 0 1 0 0 0 0 0 0 2 0 4 0 0 0 0 0 0 0 0 1 3 5 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 4 0 0 11 1 0 0 0 0 0 0 1 0 0 0 0 0 0 2 2 0 4 0 1 0 0 0 0 0 1 1 0 0 2 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "317" 3 2 2 4 0 0 0 0 0 0 0 0 0 10 1 0 1 0 4 0 0 0 0 1 1 0 2 6 2 11 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 2 0 10 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 10 0 0 11 0 1 3 0 0 0 2 0 0 0 0 0 0 0 8 0 6 4 0 0 0 0 2 1 1 3 1 0 0 6 0 0 1 0 1 0 0 1 0 5 1 0 5 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 0 2 "318" 11 3 3 14 1 1 0 0 0 9 10 2 3 4 0 0 1 0 11 1 1 2 0 0 4 0 0 17 0 43 0 0 3 3 2 16 17 0 0 1 0 0 0 0 3 6 1 0 4 24 0 0 10 2 1 2 2 0 26 0 6 1 1 0 1 5 1 1 0 1 6 7 0 2 1 8 17 0 0 29 6 2 8 8 1 1 1 0 0 1 0 0 0 0 8 4 5 4 4 3 1 0 3 0 0 5 1 1 0 1 1 0 3 1 6 0 2 1 2 1 7 1 4 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 1 "319" 9 8 14 7 2 2 0 0 0 6 17 4 0 3 1 1 11 1 7 0 2 6 0 10 6 0 8 13 17 84 0 0 5 6 1 28 16 0 0 0 0 0 1 1 5 15 3 0 4 15 3 13 5 3 4 2 23 6 20 3 1 3 5 2 3 1 0 2 0 4 3 6 1 0 1 13 36 0 0 37 3 7 7 10 2 1 0 2 2 1 0 0 1 8 30 5 7 5 3 4 0 0 3 0 1 14 1 2 2 18 5 0 3 0 48 2 0 1 3 0 11 0 13 0 0 0 0 0 0 0 0 0 2 0 1 0 1 0 0 0 "320" 6 9 8 17 1 2 3 1 1 2 27 8 1 3 1 6 12 3 5 5 4 19 0 19 9 0 9 17 5 109 0 0 1 13 10 32 9 0 1 3 0 0 0 3 17 39 7 0 4 17 3 8 5 6 0 2 18 2 13 3 10 0 2 4 0 1 1 0 3 8 13 4 4 2 7 21 33 0 8 12 5 23 4 13 4 1 3 8 2 0 0 5 1 7 15 4 7 7 5 12 4 5 5 2 3 5 9 7 2 9 2 0 9 1 0 6 2 1 7 2 17 0 15 2 0 1 0 0 4 0 0 1 6 0 7 0 4 2 0 0 "321" 11 10 8 14 0 1 3 3 0 8 15 17 4 5 2 3 12 5 12 7 7 8 0 11 7 0 2 41 3 52 0 1 1 14 10 29 13 1 0 3 3 3 0 1 9 21 57 1 9 15 3 7 6 7 1 18 14 0 22 1 10 1 6 5 5 6 12 20 4 11 12 34 12 1 27 19 26 0 10 17 2 13 2 25 9 1 7 3 0 1 0 2 7 9 6 10 19 14 4 21 2 10 17 0 9 10 9 0 38 6 6 0 10 0 1 3 0 4 5 1 31 1 18 5 0 0 1 0 0 5 3 1 6 0 8 0 5 9 0 0 "322" 6 6 3 14 14 3 0 3 0 10 10 5 0 2 0 15 12 6 7 8 5 10 0 23 13 1 8 3 10 29 0 2 9 8 14 12 0 0 2 6 0 3 0 3 10 37 8 0 4 15 3 13 4 7 4 8 17 0 11 9 6 1 5 11 2 7 13 9 0 10 9 3 5 0 24 31 19 2 5 20 3 0 0 17 8 1 4 3 2 2 1 4 3 13 18 11 13 5 1 7 4 14 18 1 3 3 13 25 35 17 0 0 8 0 2 5 6 4 8 4 18 0 14 1 0 0 0 0 0 4 0 3 14 2 5 0 1 8 3 5 "323" 9 9 6 1 10 0 0 1 0 5 4 3 1 0 1 10 6 8 0 4 3 8 0 11 6 0 15 6 13 14 1 0 1 9 2 39 0 0 0 3 0 2 0 1 14 20 17 0 1 1 4 3 7 8 4 8 5 0 4 2 8 1 4 5 2 3 5 3 0 16 8 14 4 0 5 12 14 1 5 4 0 2 3 16 6 1 8 4 3 1 1 1 0 6 9 15 10 6 1 4 3 9 24 1 4 2 3 0 16 5 7 0 7 0 2 6 0 0 8 1 8 2 5 1 0 0 0 0 0 0 2 2 8 0 0 2 0 5 0 3 "324" 9 2 5 4 6 0 1 0 0 1 1 0 1 1 0 5 2 4 1 2 0 2 0 8 3 0 0 3 3 5 1 0 4 2 15 26 0 0 0 1 0 5 4 0 2 11 2 0 0 2 2 3 0 4 1 4 5 0 3 0 6 3 2 2 2 2 5 16 1 3 6 3 5 1 1 16 9 0 0 4 1 0 7 7 6 0 6 4 4 0 2 1 0 3 5 19 2 5 1 4 2 17 17 0 2 2 1 3 2 6 2 0 8 0 0 3 0 0 2 0 6 0 4 1 0 0 1 0 0 1 1 7 4 2 4 0 0 4 1 8 "325" 5 1 2 2 1 0 1 0 0 0 7 0 0 3 0 1 1 1 0 0 0 2 0 2 3 0 2 0 3 16 0 0 2 2 1 8 0 0 0 0 0 1 0 1 3 2 1 0 0 0 2 4 0 3 2 11 5 0 1 0 6 0 0 0 0 3 17 2 0 3 1 2 1 0 1 4 1 0 4 3 0 2 0 3 3 0 1 0 1 0 0 0 0 2 2 8 0 2 1 0 0 4 14 0 0 1 0 8 2 6 1 1 3 0 0 3 0 0 0 0 6 0 2 1 0 0 0 0 0 1 0 0 7 1 3 0 0 3 1 1 "326" 0 0 2 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 2 1 0 0 0 0 1 0 1 0 0 6 0 1 0 1 1 4 1 0 0 0 0 0 0 0 1 2 1 0 1 0 0 0 0 0 0 0 1 0 3 0 1 0 1 0 0 0 1 0 0 4 1 0 1 1 0 3 2 0 1 1 1 0 0 4 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 1 0 3 1 0 0 0 0 2 0 3 1 0 0 0 1 2 0 0 1 0 4 0 0 0 0 0 0 0 0 0 2 1 0 0 2 0 0 1 0 2 "327" 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 14 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "328" 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "329" 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "330" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "331" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "332" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "333" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "334" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 "335" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "336" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "337" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "338" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "339" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "340" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "341" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "342" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "343" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "344" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "345" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "346" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "347" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "348" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "349" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "350" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "351" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "352" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "353" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "354" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "355" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "356" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "357" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "358" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "359" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "360" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "361" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "362" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "363" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "364" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "365" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 3 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "366" 2 0 0 1 0 0 1 0 0 2 0 3 0 0 0 0 0 0 2 0 1 1 0 0 0 1 0 2 0 2 0 0 1 0 6 1 0 0 0 0 0 0 0 0 2 4 7 0 0 1 0 2 0 0 0 0 1 0 2 1 1 0 0 1 0 1 0 4 0 0 0 0 2 0 1 6 6 0 0 1 0 0 0 6 0 0 1 0 2 0 0 0 1 0 3 2 0 0 0 4 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 "367" 3 2 0 0 1 0 0 0 0 1 0 2 0 1 0 9 0 1 2 2 2 2 0 0 1 1 0 1 3 47 0 0 1 1 4 2 4 0 0 0 2 1 2 1 1 9 4 0 0 2 1 14 0 0 0 1 1 0 13 2 12 0 3 1 4 1 4 3 0 2 0 3 12 0 1 15 13 0 0 3 0 2 1 19 1 0 0 1 1 0 0 0 1 0 0 4 0 3 0 3 0 2 0 2 0 0 0 0 2 1 3 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 8 0 0 2 0 0 "368" 5 8 0 2 6 3 1 4 0 4 4 0 0 0 0 28 7 6 12 5 1 4 0 1 1 1 0 7 9 58 0 0 0 1 3 5 1 0 0 9 0 4 5 3 4 7 34 0 1 6 1 27 0 1 0 9 11 0 22 15 5 2 7 1 2 2 6 6 2 2 3 12 21 0 1 17 27 0 0 19 0 3 3 22 1 0 0 1 1 0 0 0 1 2 7 8 1 6 0 7 0 4 4 1 1 1 1 2 6 0 2 0 1 0 0 2 1 0 0 4 5 0 1 0 0 0 0 0 2 0 0 2 0 1 1 1 0 2 0 2 "369" 10 2 0 2 6 1 3 5 0 7 8 5 0 0 0 13 5 1 14 8 4 4 0 4 2 1 4 7 7 76 0 0 2 0 2 5 1 1 0 10 2 4 10 7 2 21 40 1 0 2 0 28 2 1 4 8 7 0 16 9 6 1 8 0 3 8 13 17 4 11 4 23 31 0 4 29 23 1 1 11 0 1 3 28 2 0 0 4 0 2 0 2 4 4 12 5 0 7 1 9 1 10 11 0 0 0 1 0 8 7 1 1 5 0 0 1 1 0 2 0 6 0 0 0 2 0 0 0 0 0 0 1 0 1 3 0 0 2 0 1 "370" 6 8 5 4 1 1 0 1 0 6 5 6 0 0 0 4 11 4 19 5 6 5 0 3 0 5 0 9 8 28 1 0 2 2 2 4 1 1 1 5 0 0 2 6 10 25 7 0 3 3 1 12 1 2 0 2 6 1 28 11 11 0 3 0 4 3 5 11 1 8 3 8 6 2 0 20 48 1 4 6 2 2 1 8 2 0 0 1 0 5 1 2 1 8 12 15 6 4 1 2 9 7 1 2 0 1 0 0 9 7 1 0 2 0 2 2 0 1 2 2 2 0 2 0 0 0 0 0 0 0 1 10 3 1 1 0 1 2 1 3 "371" 16 9 8 10 4 0 0 3 0 6 10 4 0 0 2 5 1 4 9 6 8 6 0 1 4 0 2 6 4 69 0 3 1 3 10 9 3 0 0 2 0 0 1 4 6 10 9 0 4 3 0 4 4 0 4 2 5 0 24 14 11 2 8 0 13 3 5 0 1 3 3 12 10 1 19 12 35 1 5 8 0 1 0 9 4 0 0 8 0 0 4 5 1 9 11 12 5 3 1 7 6 2 7 2 2 3 0 0 11 8 4 0 0 0 6 0 0 0 6 3 9 0 0 0 0 0 0 0 0 0 0 0 8 2 0 0 5 3 0 0 "372" 14 7 5 2 4 1 10 2 0 4 6 5 3 0 15 9 7 0 17 9 2 6 0 11 4 1 0 3 13 46 0 1 2 1 8 3 1 0 1 7 0 0 2 4 4 6 10 0 3 2 0 11 0 0 4 3 2 0 13 9 2 2 6 0 5 9 8 10 2 9 1 1 7 0 17 10 31 3 5 18 1 2 0 5 2 0 0 2 5 2 3 4 2 3 17 7 3 3 10 11 1 3 10 1 0 6 0 1 7 6 2 0 11 3 4 1 0 1 4 1 12 1 6 0 0 0 0 1 2 1 0 1 1 1 3 0 3 2 0 0 "373" 16 7 10 7 6 0 1 2 0 1 2 3 2 2 8 11 2 1 19 3 1 9 0 7 6 1 3 5 10 93 1 2 0 5 6 3 1 1 2 13 1 1 1 3 7 31 5 1 2 3 1 6 1 7 3 11 0 1 15 14 3 12 4 2 6 11 13 6 0 3 0 6 12 3 20 17 37 3 1 13 3 5 0 5 4 0 4 5 2 3 4 4 2 4 13 12 19 0 4 4 1 15 8 0 4 5 1 2 10 2 1 0 1 0 5 11 0 2 1 2 20 3 2 1 0 0 1 0 0 0 0 3 3 1 4 0 3 6 0 1 "374" 12 1 3 2 10 0 0 0 0 2 2 4 0 1 1 5 2 2 4 7 4 4 0 6 1 1 1 1 5 42 0 6 1 1 18 1 1 0 0 13 2 6 0 2 4 18 6 0 5 2 3 2 0 5 1 6 2 0 9 1 1 1 3 0 4 3 8 11 3 10 0 3 3 0 2 3 8 4 2 9 1 2 1 6 5 0 0 5 0 0 1 3 1 1 9 10 6 3 3 4 9 5 20 0 2 2 2 2 7 8 1 0 2 0 4 3 0 3 4 3 11 2 1 0 0 0 0 1 6 1 2 6 4 1 5 0 3 10 0 0 "375" 2 2 2 2 6 0 3 1 0 0 2 1 0 1 0 2 0 3 1 3 3 4 0 5 0 1 3 0 4 31 0 9 1 0 2 8 1 1 5 8 0 0 1 2 6 14 8 0 1 0 0 2 0 0 2 5 2 0 8 2 6 0 5 1 3 4 0 1 0 2 1 0 1 2 16 19 16 1 6 9 4 0 0 5 0 0 3 1 0 0 0 0 0 1 14 4 3 1 1 1 4 14 5 0 0 5 2 4 4 4 1 0 3 0 5 0 6 4 3 3 13 0 5 0 1 0 0 0 1 0 0 1 1 0 3 0 0 1 2 1 "376" 6 1 7 7 1 0 2 0 0 1 2 2 1 1 0 2 1 2 0 1 0 2 0 2 2 0 3 1 4 21 0 1 1 2 3 2 0 0 4 1 0 1 3 0 1 8 8 0 0 1 0 0 0 0 1 2 1 0 2 0 3 2 1 2 1 0 2 9 0 0 0 1 1 0 4 5 7 0 0 5 2 2 0 3 0 0 0 1 0 1 0 0 0 0 4 1 2 2 1 4 5 2 1 0 0 0 1 0 1 5 1 0 1 0 0 1 0 1 1 0 4 0 3 0 1 0 0 0 0 1 0 1 0 0 4 0 0 1 0 0 "377" 4 0 1 3 2 0 0 0 0 1 1 1 0 0 0 0 0 1 2 2 1 0 0 0 1 0 1 0 1 4 0 0 0 2 0 0 0 0 1 2 0 0 0 0 2 1 3 0 0 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 1 3 0 1 0 0 0 0 2 9 4 0 3 1 2 1 0 2 0 0 1 0 0 1 0 0 0 0 3 0 0 0 0 1 0 0 4 0 0 0 0 0 1 2 1 0 0 0 1 0 0 0 0 1 6 0 0 0 6 0 1 0 0 0 2 0 1 0 2 0 0 1 0 0 "378" 3 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 2 0 2 0 0 0 0 1 0 0 1 1 0 5 1 1 0 2 0 1 0 0 1 0 0 0 1 0 0 1 3 0 0 0 0 1 0 0 0 3 0 0 0 0 0 1 0 0 0 1 2 3 1 0 0 0 1 1 3 3 2 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 2 0 2 1 0 0 1 0 0 1 2 0 0 2 0 0 0 0 1 0 1 6 0 2 0 0 0 1 1 0 0 0 2 1 0 0 0 0 6 0 0 "379" 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 4 1 0 0 0 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 2 0 0 0 1 1 0 "380" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 1 5 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 5 0 0 1 0 0 0 0 0 2 0 2 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 "381" 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "382" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "383" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "384" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "385" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "386" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "387" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "388" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "389" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "390" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "391" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "392" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "393" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "394" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "395" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "396" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "397" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "398" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "399" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "400" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 "401" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "402" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "403" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "404" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "405" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "406" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "407" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "408" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "409" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "410" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "411" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "412" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "413" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 35 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 3 0 0 0 0 0 2 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "414" 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 1 1 5 1 0 0 0 0 0 0 1 0 0 1 0 0 0 2 0 1 0 0 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 "415" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 37 1 0 0 1 0 0 0 0 0 0 2 1 1 1 0 4 3 0 0 0 0 2 1 0 1 0 1 0 2 3 0 0 0 1 2 3 0 2 0 0 0 0 1 0 0 2 5 0 0 6 0 0 0 6 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "416" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 15 0 0 0 1 0 0 0 0 0 2 0 0 3 1 0 2 5 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 4 0 0 1 2 0 0 0 0 0 0 4 1 0 0 0 1 0 0 0 1 0 3 1 0 0 0 5 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "417" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 surveillance/inst/extdata/n2.txt0000644000176000001440000000347212003774136016476 0ustar ripleyusers"week" "observed" "state" 1 1 0 2 0 0 3 15 0 4 0 0 5 0 0 6 2 0 7 1 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 0 0 38 0 0 39 0 0 40 0 0 41 6 0 42 25 0 43 0 0 44 0 0 45 0 0 46 3 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 1 0 57 1 0 58 0 0 59 0 0 60 0 0 61 0 0 62 0 0 63 0 0 64 0 0 65 4 0 66 84 0 67 0 0 68 0 0 69 0 0 70 4 0 71 1 0 72 0 0 73 0 0 74 0 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 15 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 12 0 98 32 0 99 89 0 100 1 0 101 7 0 102 160 0 103 4 0 104 0 0 105 2 0 106 0 0 107 15 0 108 17 0 109 43 0 110 2 0 111 0 0 112 1 0 113 1 0 114 45 0 115 1 0 116 0 0 117 2 0 118 1 0 119 0 0 120 0 0 121 2 0 122 0 0 123 1 0 124 1 0 125 19 0 126 0 0 127 2 0 128 1 0 129 0 0 130 0 0 131 3 0 132 2 0 133 1 0 134 4 0 135 0 0 136 2 0 137 1 0 138 5 0 139 2 0 140 1 0 141 1 0 142 1 0 143 0 0 144 4 0 145 19 0 146 0 1 147 2 1 148 7 0 149 5 0 150 0 0 151 85 0 152 6 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 3 0 162 40 0 163 2 0 164 12 0 165 0 0 166 0 0 167 6 0 168 1 0 169 3 0 170 6 0 171 4 0 172 11 0 173 0 0 174 1 0 175 18 0 176 40 0 177 2 0 178 2 0 179 12 0 180 3 0 181 5 0 182 1 0 183 4 0 184 1 0 185 0 0 186 1 0 187 0 0 188 1 0 189 3 0 190 3 0 191 0 0 192 4 0 193 11 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/q2.txt0000644000176000001440000000344312003774136016477 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 1 0 37 0 0 38 1 1 39 1 1 40 2 1 41 1 1 42 3 1 43 1 0 44 1 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 0 0 57 0 0 58 0 0 59 0 0 60 0 0 61 0 0 62 0 0 63 0 0 64 0 0 65 0 0 66 0 0 67 0 0 68 0 0 69 0 0 70 0 0 71 0 0 72 1 0 73 0 0 74 1 0 75 0 0 76 0 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 0 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 0 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/m1.txt0000644000176000001440000000345312003774136016473 0ustar ripleyusers"week" "observed" "state" 1 0 0 2 3 0 3 1 0 4 0 0 5 5 0 6 1 0 7 6 0 8 15 1 9 11 1 10 9 1 11 10 1 12 8 1 13 6 1 14 13 1 15 11 1 16 13 1 17 17 1 18 12 0 19 5 0 20 0 0 21 1 0 22 0 0 23 0 0 24 1 0 25 0 0 26 0 0 27 0 0 28 0 0 29 0 0 30 0 0 31 0 0 32 0 0 33 0 0 34 0 0 35 0 0 36 0 0 37 0 0 38 0 0 39 0 0 40 0 0 41 0 0 42 0 0 43 0 0 44 0 0 45 0 0 46 0 0 47 0 0 48 0 0 49 0 0 50 0 0 51 0 0 52 0 0 53 0 0 54 0 0 55 0 0 56 0 0 57 0 0 58 0 0 59 0 0 60 0 0 61 1 0 62 0 0 63 0 0 64 0 0 65 0 0 66 0 0 67 0 0 68 0 0 69 0 0 70 0 0 71 0 0 72 0 0 73 1 0 74 1 0 75 1 0 76 1 0 77 0 0 78 0 0 79 0 0 80 0 0 81 0 0 82 0 0 83 0 0 84 0 0 85 1 0 86 0 0 87 0 0 88 0 0 89 0 0 90 0 0 91 0 0 92 0 0 93 0 0 94 0 0 95 0 0 96 0 0 97 0 0 98 0 0 99 0 0 100 0 0 101 0 0 102 0 0 103 0 0 104 0 0 105 0 0 106 0 0 107 0 0 108 0 0 109 0 0 110 0 0 111 0 0 112 0 0 113 0 0 114 0 0 115 0 0 116 0 0 117 0 0 118 0 0 119 0 0 120 0 0 121 0 0 122 0 0 123 0 0 124 0 0 125 0 0 126 0 0 127 0 0 128 0 0 129 0 0 130 0 0 131 0 0 132 0 0 133 0 0 134 0 0 135 0 0 136 0 0 137 0 0 138 0 0 139 0 0 140 0 0 141 0 0 142 0 0 143 0 0 144 0 0 145 0 0 146 0 0 147 0 0 148 0 0 149 0 0 150 0 0 151 0 0 152 0 0 153 0 0 154 0 0 155 0 0 156 0 0 157 0 0 158 0 0 159 0 0 160 0 0 161 1 0 162 0 0 163 0 0 164 0 0 165 0 0 166 0 0 167 0 0 168 0 0 169 0 0 170 0 0 171 0 0 172 0 0 173 0 0 174 0 0 175 0 0 176 0 0 177 0 0 178 0 0 179 0 0 180 0 0 181 0 0 182 0 0 183 0 0 184 0 0 185 0 0 186 0 0 187 0 0 188 0 0 189 0 0 190 0 0 191 0 0 192 0 0 193 0 0 194 0 0 195 0 0 196 0 0 197 0 0 198 0 0 199 0 0 200 0 0 201 0 0 202 0 0 203 0 0 204 0 0 205 0 0 206 0 0 207 0 0 208 0 0 209 0 0 210 0 0 211 0 0 212 0 0 surveillance/inst/extdata/population_2001-12-31_BYBW.txt0000644000176000001440000001527511736257535022316 0ustar ripleyusers"name" "id" "popFrac" "pop31.12.2001" "LK Loerrach" 8336 0.00955704642962118 219149 "LK Waldshut" 8337 0.00724420011321107 166114 "LK Breisgau Hochschwarzwald" 8315 0.0105990592491612 243043 "SK Freiburg i. Breisgau" 8311 0.0090836619332578 208294 "SK Passau" 9262 0.00220966550402911 50669 "LK Berchtesgadener Land" 9172 0.00438828082276013 100626 "SK Rosenheim" 9163 0.0025864978792549 59310 "LK Lindau" 9776 0.00339502377170787 77850 "SK Kempten" 9763 0.00268222141398706 61505 "LK Bodenseekreis" 8435 0.00876330426303345 200948 "LK Konstanz" 8335 0.0117248901250817 268859 "LK Tuttlingen" 8327 0.00583787093414831 133866 "LK Schwarzwald Baar Kreis" 8326 0.00921566883058548 211321 "LK Emmendingen" 8316 0.0066702513931154 152953 "LK Rottweil" 8325 0.00618217039050841 141761 "LK Passau" 9275 0.00817051610466703 187355 "LK Traunstein" 9189 0.0073625135299438 168827 "LK Altoetting" 9171 0.00475447240414782 109023 "LK Rosenheim" 9187 0.0104709772348066 240106 "LK Miesbach" 9182 0.0040435016584811 92720 "LK Bad Toelz Wolfratshausen" 9173 0.00512048954629225 117416 "LK Ebersberg" 9175 0.00525131897872801 120416 "SK Memmingen" 9764 0.00179240683418067 41101 "LK Ravensburg" 8436 0.0117995937310025 270572 "LK Oberallgaeu" 9780 0.00646798909056973 148315 "SK Kaufbeuren" 9762 0.00184234006756032 42246 "LK Garmisch Partenkirchen" 9180 0.00381184634344819 87408 "LK Weilheim Schongau" 9190 0.00560573591119647 128543 "LK Starnberg" 9188 0.00552047873105917 126588 "SK Muenchen" 9162 0.0535510160649821 1227958 "LK Neu Ulm" 9775 0.00702597661990823 161110 "SK Ulm" 8421 0.00516109028015815 118347 "LK Sigmaringen" 8437 0.00582936702103999 133671 "LK Biberach" 8426 0.00804810336571798 184548 "LK Zollernalbkreis" 8417 0.00842524100961945 193196 "LK Ortenaukreis" 8317 0.0179450446608073 411491 "LK Freudenstadt" 8237 0.0053065289992159 121682 "SK Baden Baden" 8211 0.00231498319713989 53084 "LK Freyung Grafenau" 9272 0.00360012071195633 82553 "LK Deggendorf" 9271 0.00508307232861562 116558 "SK Straubing" 9263 0.00193261237594099 44316 "LK Dingolfing Landau" 9279 0.0039779997226416 91218 "LK Rottal Inn" 9277 0.0051942337363752 119107 "SK Landshut" 9261 0.00259535067084972 59513 "LK Muehldorf a. Inn" 9183 0.00478543536982428 109733 "LK Muenchen" 9184 0.0130778408957106 299883 "LK Erding" 9177 0.005143733575455 117949 "LK Unterallgaeu" 9778 0.00588383567474408 134920 "LK Ostallgaeu" 9777 0.00577345924357911 132389 "SK Augsburg" 9761 0.0112441791805019 257836 "LK Landsberg a. Lech" 9181 0.00469280813165976 107609 "LK Fuerstenfeldbruck" 9179 0.00854181003391971 195869 "LK Dachau" 9174 0.00572793060109147 131345 "LK Guenzburg" 9774 0.00532536843748664 122114 "LK Alb Donau Kreis" 8425 0.0081550346218288 187000 "LK Tuebingen" 8416 0.00920419945034194 211058 "LK Reutlingen" 8415 0.012174856153039 279177 "SK Pforzheim" 8231 0.00514604489542803 118002 "LK Boeblingen" 8115 0.0160409967109481 367830 "LK Calw" 8235 0.00698258485815037 160115 "LK Rastatt" 8216 0.00978207305341068 224309 "SK Karlsruhe" 8212 0.0121923436871746 279578 "LK Regen" 9276 0.00360744716017273 82721 "SK Regensburg" 9362 0.00554708071565444 127198 "LK Straubing Bogen" 9278 0.00418806818132262 96035 "LK Landshut" 9274 0.0063017921015655 144504 "LK Freising" 9178 0.00677679016092892 155396 "LK Pfaffenhofen.a.d.Ilm" 9186 0.00493274931074694 113111 "SK Ingolstadt" 9161 0.005115910516157 117311 "LK Dillingen a. d. Donau" 9773 0.00411829248402355 94435 "LK Augsburg" 9772 0.0104025098318318 238536 "LK Aichach Friedberg" 9771 0.0054294650558947 124501 "LK Neuburg Schrobenhausen" 9185 0.00393465157069456 90224 "LK Heidenheim" 8135 0.00597694262082752 137055 "LK Goeppingen" 8117 0.0112361113655017 257651 "LK Esslingen" 8116 0.022037781795695 505340 "SK Stuttgart" 8111 0.0256055876378397 587152 "LK Enzkreis" 8236 0.00845476485153912 193873 "SK Heilbronn" 8121 0.00524028569659259 120163 "LK Ludwigsburg" 8118 0.0219457214850711 503229 "SK Heidelberg" 8221 0.00617118071818381 141509 "LK Karlsruhe" 8215 0.0184448567025227 422952 "SK Schwabach" 9565 0.00167976269285349 38518 "LK Cham" 9372 0.00573102689765911 131416 "LK Regensburg" 9375 0.00776668925654867 178095 "LK Kelheim" 9273 0.0048371129956364 110918 "LK Eichstaett" 9176 0.00527813901237734 121031 "SK Fuerth" 9563 0.00485189672150164 111257 "SK Erlangen" 9562 0.00444436303946426 101912 "LK Donau Ries" 9779 0.00568388469217143 130335 "LK Weissenburg Gunzenhausen" 9577 0.00415060735383518 95176 "LK Fuerth" 9573 0.00495102182147713 113530 "SK Ansbach" 9561 0.00176235967453126 40412 "LK Ostalbkreis" 8136 0.0137521357904845 315345 "LK Rems Murr Kreis" 8119 0.0180090638630791 412959 "LK Heilbronn" 8125 0.0141314539249266 324043 "LK Rhein Neckar Kreis" 8226 0.0230170837072875 527796 "SK Mannheim" 8222 0.0134486115072336 308385 "LK Roth" 9576 0.0054496127884898 124963 "SK Nuernberg" 9564 0.0214258053205714 491307 "SK Weiden i. d. OPf." 9363 0.00187831816148015 43071 "LK Schwandorf" 9376 0.00629594838691671 144370 "LK Neumarkt i. d. OPf." 9373 0.005552052234087 127312 "SK Amberg" 9361 0.00192829500467061 44217 "LK Erlangen Hoechstadt" 9572 0.00565841656265727 129751 "SK Bamberg" 9461 0.00302634643110391 69396 "SK Wuerzburg" 9663 0.00566556857163042 129915 "LK Neustadt/Aisch Bad Windsheim" 9575 0.00432417440086661 99156 "LK Ansbach" 9571 0.00800972673220349 183668 "LK Schwaebisch Hall" 8127 0.00815359549807201 186967 "LK Hohenlohekreis" 8126 0.00474998059363419 108920 "LK Neckar Odenwald Kreis" 8225 0.0065454401145717 150091 "LK Kitzingen" 9675 0.00388580858258521 89104 "SK Schweinfurt" 9662 0.00237970015638478 54568 "LK Nuernberger Land" 9574 0.00735666981529501 168693 "LK Forchheim" 9474 0.00492084383239529 112838 "SK Bayreuth" 9462 0.00324975949189337 74519 "LK Tirschenreuth" 9377 0.00348023734203436 79804 "LK Neustadt a. d. Waldnaab" 9374 0.0044064661138687 101043 "LK Amberg Sulzbach" 9371 0.00475708899279653 109083 "LK Bamberg" 9471 0.00624086919586125 143107 "SK Coburg" 9463 0.0018664126831285 42798 "LK Wuerzburg" 9679 0.00694752257025759 159311 "LK Main Tauber Kreis" 8128 0.00599669786512532 137508 "LK Miltenberg" 9676 0.00572897723655095 131369 "SK Aschaffenburg" 9661 0.00298121027691358 68361 "LK Schweinfurt" 9678 0.00509685302883219 116874 "LK Wunsiedel i. Fichtelgebirge" 9479 0.00371895744641881 85278 "LK Bayreuth" 9472 0.00476432822139131 109249 "SK Hof" 9464 0.00220901135686693 50654 "LK Lichtenfels" 9478 0.00309080173148393 70874 "LK Kulmbach" 9477 0.00343095825581689 78674 "LK Hassberge" 9674 0.00385563059350336 88412 "LK Coburg" 9473 0.0040207809470481 92199 "LK Main Spessart" 9677 0.00576547864820053 132206 "LK Aschaffenburg" 9671 0.00761326994211234 174577 "LK Rhoen Grabfeld" 9673 0.00378171196417716 86717 "LK Bad Kissingen" 9672 0.00477518706428348 109498 "LK Hof" 9475 0.00474230526693129 108744 "LK Kronach" 9476 0.00329070910424576 75458 surveillance/inst/doc/0000755000176000001440000000000012242645664014533 5ustar ripleyuserssurveillance/inst/doc/surveillance-cache.RData0000755000176000001440000014536012242645664021221 0ustar ripleyusers7zXZi"6!X<ʱ])TW"nRʟXgqjn]LUJΎ+[׼ڽ}\F74Z"PIkxM{dLbٟ 's!p?L,ď+5G'ߛ1SԙHKj(80L0U=N)eغO4G^jd2V#_ pM1n9v`F_8B)!V+Y^Ljb.HL& SPoNpi]f^P@!ubZC)ttFt0'#WP)%xNN%`v5~Rjgh½u7,3'8Iq3d%8 iTl}8A4M'$ݧ4ptB/'GTkQWdFb5 6-׃D{I/GHP@|ٗ'F*$χ5.J=~\r.T=B Ɗ5?tjDm`| .Ü0/Ei'RlאeN0wĄMw9\R9&L"y@҃06ntP)*JCK- zCAb73'jURJMX.gu+8㣑J1J_XPG tWlCK9{%VFRS\tj5쑱Xm+} C-0Rb-KiV=Eooe M>@Vy΢0.) RV^@y'Q`n&~<xSh?lJ=wb3շd-I1E$ӵ]oA4giK1]_r^dcxg;+9"mb09`AV*y5 $ ߇>-B]@ fhnԃAXx|<roX)-ZcRd|j^.Cg /^]yCʱIQObh`҆ [xMAČdgV3-Ww \o i/f0{J"u9G\xUT/WЁmsY5d1[m6]4)nQ uc6/?5] [LyWƛm['% JSB'Y#oZ?,x)Us @ٻHe/EsvĒO|mi-B"9{K.qJީHSHxrFSi%$g8?ںVy C$JU`Yb zpƝ3(o۱k~8KA-ޭ>BǰܻJ;DJ"'Rh'NS3Ġ9fRu6ʕa.p3\!aNK鰯Z<"K*i <.ɒ#LANw]v}oyLehZؕl77^rO; kκW Iu vjhT8{\Ph:hʄ?.MwmQrU6@} Ζ5" u71׬)TƮMLVuƄլ7{\ }6l0~4y?GSZp/^K]kӒ~%vEP7&=+չo:KD`I|ʉ.}pr9 Ctnj;G9Ȯ z)G܃hSS]lMG._/k(vv5zi?I[^g}["^Ƅh>={bE$?>bN3R-FluMR1jC0r[x*r&vFqcbМެf WGċL N&@@%kZ1Ȯi9-,Zq[ƞnOVI]zMaVCׇѩògeklJCle <nлY ,C̽lVN,-H+z;dHŇ grp/)-X;SbKlU\gQ'0CNF32Amղ_:^+7 $чm~t6f>M1r'oߍ}g[- TʲRU=y8ӓ`^27Sp8CEZ M"8);h~-}-lBo^b`ɞ^N.IGK m:9Nw>"97:?S~I H.c9kc!;7P2zYR  mW1z|f9ؓ^\#6_y:f0=O![KT։fZl@hqLU&\+x(HZqyTO2>p>gRLku{Ab+&`pl[ EvzmlSXN]ZF,X~O\j}4~yPI!TFƱZFN߈񶏕9`t'`(<d GBiUUmM'I*y]PaD8-@Cw9u>h k9^֥n;4m?q]\{M%}a׈v`;d{/w0hTKAӓկuZC]yW=I+2YԹ*`m-UޞܐKk;#ʂ*~;Ջ&_KÃo:=H1F2dgldIJ6nb6Pi:iLNO+%p8whC?R򿩒^"`|׺Gp=q5m<1s'[涂jT ZKؑb+Ҭ7LrI`D'WlN}&'\(a~h wϚX% k6qAA@.tWF*pUNƪAOچ/6>X^L;2 {Eb_{7(SZt +؂!"!Tl饼A#Vx0X gO6!za՛+*?O7x ,O\ٝ{XOGd"S aYD5!0fM-R\/++Bn e/珏-9@"EBĕX+lʴXv`nWևр>\625?Q`,;sri UH)5-,Ȑho,f1GxAl oߟB0iB9f} ܧ~)q%^m8c3mwL[oӔ sdnͮ-&·ԹKjؤYLȃ>X{FSw:;te;EDP?rzUD${e83<`P(Ƥ ncsd2gAB娘q/aJ5+'L'f%l O#&-,{O긋!DYryѭ@ mGM<4O|P|{ZZP0q%4[5'tI~ktx^Ӱ#9Y"@ _d풡S[pNΕ[slW(:s*c%ז%WAMU(kOkCC^6Um] w\>#!"]''sQs'̳ 3UǾ3T%J 4HDߧxXR %[ HXr|I,D*!(-[fş@>81|~C g@aXo!Z]lyO _4^MfO|jŭ Ȏf_ , G"I,HC rKlk9`9G5TTyWy.t_7_F[ύ*R+2TRb4py>iK"hđ*G.4~HKŒ9"Rc5rTo&/i16@юH2cb ‘+$I%ttub5ޤe}oeuZ/GxڤضaIXoR R͸:胹 PCuQE*R60{P 8g;Ѥwڈߕ̋47?4q4qlW8\uJd%M]Yh]̇"Q(ϸK`n'\hl#+bF\uy IvPUiP{/[fEQhtwCɨI&c'.zik=W@LmL7#]r&m+9NREN-\0/L?>ǟWe6u EMV?@:︲2Ou6:܅֘ ˔c`X3I8ş l @yj^.x$XjTYH,+Mtbo0 ;:אda0i"}A!`_>j3J դO dȻcA}(IPf$ی6*ip][<đtjUP>ǣ i$3| hm ~}>^GU Y)rokm쎸ذ:"ڹ}3!/6ϟ{Uw@ N!snlG{_!)cQ[9TFjFC7ΡVčVp=P~RbTy ZpSRDM냈>KmDK0f!4DC*k3ijV⼜N/R6{ J[3q& ?,±\+LUNLZdE%5)n2{Å7L*JƔ;wܣ[F?4vi%)T+@gRhn(+6U a%04{0$R 'H`jOb-ŭ<` *qĕ/;ㇹsXCpa( n:QAAAgOIud;DBtPjx:)2 |r3w. &RODy4u-RbZ23HS醯d IZ2a=C _gulZ$!&5~# E!h&uq4;pȂ$uO+nB4T3kPHGJuԍ};Ðb,Bo|R".fo:˖O^̟(%$mc´ߵUJ(ĎM}">Y>s|ŝ!VV~dliGh<Vz\o}m-#r_YLF{FlcBwM&G潓*}#Pu, ]Ұz{L._=Z5fܟۺ9Ű11qvßԍf,C9D7偟bZ !<,8=2'a7m"݅?胭0sW&D=i9|s־yjN#k] Ty RL| & Yhq|x{_H. o:A!/x_sXل3?-U{oqIJO]|7ԛ2q6(|y&(S˪kf/nc+r3>")Pnw^}K#nQ-`XȫN9+ O‡xG&8>nlܓ W֗O ~U ǿcK@vӫ'"tgO //i!~KThG|C[ùM@Jt1+L{脡T8NLDA;,sE}kqcY+Dsn M)U%n|[& `s,*,_mBJ%6l]<:50^XZ`3%4(Xu)O+~FhKyzQr9 9=jMM%Q]j蠼*D꤃L_,Y]cu+~7:d(ċq.ۼEϤȉu|uؕ1X/jmޞv񣴮)r?d QȾp|B]{u?۞;+ E>YfjE8 փa/qve~$ fQXIqO80U:II%ʷsEU` 4i#Ѡ$^[wdByp(Ks# 1)s2R=xh4!>!IOZQx&~hPQPNt]7e((_OO@FP%h`jZ|6$ uqo=b讹dЈ.`n[*GdI" ]&(y]6oLPJ]nnz65  \x~ϸ H[Ɋi4(hzF~ߡ{/G)|>Es')EWkye(Ďԇ4wYPM`M:IC-tPALɈe?Y ^qxˡS*&`QsąrYq;ځ KO(!iAE .IŅb'?& YMK?c1c[G^%?VD \"nA%5c5Dj'bS[s j?YW/Ҡur;ޙ9*yEnPp<&|C59[p=Jz&ijiv7t`U-Bwa&zD 3~E@uSd**]H<=,x`&/Ycq>2 $pIǗh`oEˣRB^;.E{8A0z}4+EfO .7 x'3zQvm7v**ֵZ,Qm2^ ueajEkdv=T!>`n'KE扺, nU+\*G'ł9D\5ŧ_S]&'ق =KhqMyڊj[P]P;?tofӦk_Gqu-9S\j6E{lK$W>mJ[h7<@GQ>!Bk8ѝ4z- ܌v^U [E{2 (,6)$XꀨAH$MʗӌT.Hb<#wO 鲀 ;5ߢ3?j4 .qtɶ9."\ h=0΋_P3McknT&D9}N> >̟ P=XqJ5$mid{ql+ iBKc,.R8 kx'(gXo{=hNF4|i!aJ +wE/ kDTwX@Q f+\w$6Kb [g/TtZX!vQQIJ@튇TXѸm8 ]3·{CrRYA]*=4OKg?]9&;.i(*lXa6Gy+;BnA7tL`7ǘ2>'Y$Tvd6$5s"' HT1lD ?)d 1^j7^n,ltZSl[+% -n\ҩcԈ0!oӯN[D'zji)D& D!`;VѿFr!o8' J;a.d&2{W 㯯UmX#)FmEqmSm)caA 7Ć0yE]?` z,@O(a =rX{o@G=']Bk3nG> I\5$̱k'c;]+{h18;4Nth:}LCN}\8M9qF}GMW4i1[!LJ4ɆI bJPlccXuk)k~CjL#vÈrs 2 TJy3mG!Z|YAGpadā*est ^" QcylHLl ;4~cD8YZI;ojL}n4p;CʟEp=uwbܑA\/hB@C 5i$M AW.4Φz*@j% kYnc_Qo٧.GU8b(si;=T}5Q8jqWae̬ c\OyA8JjO1$K u޷Χ{0TP0{[2>;-r#w:d&@īEy4(y:k?`\!dS<ĨQwzlWfupԵu|!شۮ:1ȤA9[t "Ћmx|w:Sj[ GR@? >:xaNhEbC-j̨B= W/\~Au`Ḅ=Ѡ#l0mcQɼ;o )g3 o*ᲄ \1hQ͟p*n^=šVnie& e)pQӲQ˻B^w:_Fݎ쨌}t:#%q3ʦc< TrSS+晆.ZQsIXr';2.9HLB;wknK|ןM0* [+)"ⶬS3\ e`ҚzUGGYP_g/wt2q 3H@|5RyiT5؞j~snKy0(|@t^އ<4yTm _JJ+-pshXi:`$,,~"{Y}Bܝ_`رJRq[LI~ߥ {L@W#Q]G$<9!2 c1;8 W*/̵Aʁ5Ká-dU ͅzV3Ȼ;`"{@\[ ͕\PoOmT5jRm(c$vuX0)gs3d)mلl8+IyN8MDq4|t5CL{.G#^Bqn}.=ׯFjdۘ}8u1O~S͇I pXI8Q#"rg qoW&^woaGT`^,w2Oxc~z@GCT!7TrtY#p}gezEDJ8*-~ _9F aT4mݩ GZ.iQS+ecr97zXRU^ cy8K6-^7=.1|eQҪF}@XHʩvH( 3Cӏ3( g%mqoT1ԡڻqR/VuO9,e [$%aV̅*.1Ii3b44.`e0sm;',der61#љ7BZk{,RYv#DXr?N]ҎYq /kG{,|;曯Z/DoJpec.QNɩe3lJY3O4E <*?ه^J\_^1I {uV`?ߘm*=27Vl+h= '+Q=Ҩ=ϩU5>%"C4G}0-K?96~jfdJAX|Cצȕiy4Vˍ{s/KRLXpR2}DT_qkpۘ+!"22e"rw#2 Y~Af-ͨfb+֭OUwYLwk9Qo5Z|GffTqLU %S277v݁HYzSo"É $AިbRq6.>s f%nWk>0th&<[Ǫ |L [p;%{2$,axq$s{=RBG3R|Y3쟰{~ݾeO;GCx{VsꙘ٦ .N{Ӝ [lzdjx9ݎ?dE"iƣ-b])^tc"-F`P{XՍW ZY8qT~(_l"1p$0 |DAֽ4|!DYt>Ilw[ "ɪB-B:>\gf&1T2[!uix;[ Rӆw:.7mʪnf*Iq t0b\v<F-JRANޜ/}="jT4'p}H`_Z.73y9^kC} ʲ]mjO0Ilڸ I벻˗ "\kaٽ1/ȎLnt0WZDi Bn聥EI(կ|)'+c&5B{"ì;P%h|4,A+E!mYCG皵&<Qm=Z$ygҧE2™ b07-2OKsX*s7&4:ڥ[&Q$~F }({ĸz3q6!*z[1lc׎՗4kX-\a&y9kxMHqsy>Z U=5%KXjPɼ@.t^x%Uw'I9B6ӥ?Ak_Mi9 sK9rCd>IGIh\P_Ti[mDY4F@Nw]Zۧ$Y :A`}j L4jϝSO%KIoQmӧxDXTس.]L5f+Rs8] YϴK}YP{!Y׏ɻ M#55卋cul=z+u8}~@dy0[,-)A/e^|?}yۡ*}BݤynDûֆ(w!F^aZ:9A>B/- !565ITuI).e"0P'^# 'f;'D72l}tGTUO1CChiWuT ؒfn| ozȤ '|<{'`n(} wS=JqV2 ?l86wi{=Jd 7֟^7N R&h{+ƕ9>8y>qc Y iy&5tM,1 ԉj_)/qޔޗrtoonykiܹA/ĒU 6::hcOKPoH1$&8DlQc6VX6s V(`$7Sۼ0T&J N`þ"eIYd'#h;IbEYMf(F>anpTn_{ɢR@ʂ EY  pz^Rȇ~& \Ě`O!4HkhB?[X(FWDaeLo0vx"N>N&6ION_M)Ȭ5&,;q ҵ7 X|v; ٪^ 1X4;S#+l9S 9I@5o\!8vGHu1{H DJowqsU-aZUl6#U[# ®lg}LeS_r<$hSCTA_) K$iqE(W^\[-k@3W0ǝgPr~=j;LnQ&^*1sԎhD_qe% }{'_ÒpLa$Kiu]%* ߶[8 kGAV]Ny _iM+ ƁJA%; b8XM_YaR0fuOd*$:G=zLo3mo5suD[zux#ßJC\HAZT'bUZ|Lh&&;f**-{NL O14KJJuI]RafApo%S3E-xNV/ٙ !5N?M0݄1ӟN)ӴAV ֪NfqnYIegDc]4gi`WS˗ɀzWwR>3#.\0?M^soBQ쥮q[LdEX>My.$]-Dyh}<(ITՄ{#Scm̩"xHE\D*Ξ@SdiEn/*T8 ;& cg6-I\IR{$mkY'<%})/VJα:&㭫W12k'+ő4W-7WoJp"!K.Ϡ?Q f4S@]-2:B& 쾮fJA)Aybd^* z2LO-0TciHUoT,u.DZzƁSbU`Δ(^iZ'խ,M|Q])3t X bԤA?Dm`Ѱ[hx uy/SZ\(Q(=;87V7=q *NJ>P I+KF0vNf1B~Ң q> rOq3"h5S6Ã`\mFr ni1 yq 0[oɖ,ڗק˓Qw$go>EցwPN]i1(v-"z0w'5u4s3fO>rpE`#?w:[E3'z"MuTRLk ۫niLcc.®{ܞͧΏ_lsEq d9WA!((ذ"{n)tZ7'zba%ĝm5_XM[$+Iڬ\;W6KD0aI|HHҞөx׷7:;Mq+& H\ ҆Fao -POUr;7Tz $#ԑNI5]wfZ6;@t V V2&:1I FB;^4zV06YǐɲG69AA?ҹ)Fk'J?V֎.Zy!hw'p3K|uk /Dmi*S dy93WjvJZsHr8`ٽE'Tj#j)ƭ2f"ٶu|ɏE)Ic_w/jt|#+ ǶhHy73'7u*“M&] uбCx9r"{zǷey)8 | # > zoxh I'ع&v~N4)Ko?_{gᚂ#soȀ rL*zzeĐ#10×g{j: n3ʩtp A-y'i㍈a:Sq(tlSpiv[0& JhNcMBTVM(qчyBI!^w!!^Ig "C3R Y(,4<68t} ر땸3':`J*A ֺBs#zdU#|5Q#$!٥7 * mم&7!ȷTSdis!3jkvT5盓 n>| o}E{;誕(_EӘI( U~q馺jʄ%ު%r-81*ӫw&8( ;lz@A H 6c >LS'R}4$ux`-\,׫C ERhc Gk [U|lSIO)OuJ7(7\竦Li BφbqbeaHZٳ?TrCƃrS"KI}S_%h5~(HgHgHY$~'y= (gaC2p1h&Ӥ eɤrɴuG]~iT^x:*l׷㫲=洽> Dl4)5TW(+$UIQQ{M}hY'Rs.=hd?( x.jߴM6ǩ]iWQ:4rBF#p*I7!*TA L+k.p$##"!!o^5z,͓$dlsDqEO6)$ A*ל %I?oβƐQ$zx gF"BL4_^X{V6Xw%hmaPVt۳ &0$u9 E ǯ !*?7^tFt .}@P ONV` A2x5~w@c -Z2|CٯXeJ1JP~x5w>CL )@ Y2m"g;{3`ك׶-^ƬC%AAϡQjLHå;^ǘLg[~Z0sH_˽ 2Q3*2_,wTY2W)p٦ [;6 2F¼O&Oyu]4tb*Tb㍚n>F7'ʼNZ =T1KF5@< K'Hm@{kIPؠUŅلUM&)W"t(灧yt{:XЖLdLg* u0`@S[;߰a)"2\K6y|y7Wm:_B%yʨXpxf4DD0橷~|7GxenϹ lj 4c]UHErh,I3dYE_ -R` F6 Hs%u@>GcuX#_3yb<ʝ$%& Q(Ƅ%x#=;i]gq[73jE-7s\(3 3݂!ua>\ ÅMC`fq*zK+Q*?jMgȋc\]D[NaO=%UFUAAo1/c6h=.Z˳S `D- i!@fq;sωL0)c: &+nC]D4&UAE&dAYߑVMYfGysh%L~m0?[|d케S^/mf֕Ew*5#gqdTU Y k5Uǎ%*~A?mjC5LnX,^>tZJ6}ӏZUHLqSmzol8tRTV`E8Sf/>oGQBCXC%)dju1ȵI‡wnr0M@o%7Vsu2.g3(pd}alb ;'hFÒN{^B)p<NU<"8η;c#n=G*4+w3{U!ry+A{1@Af7lgD iQ4Vb菃O '۩agk/sU1mp\FD!~\̚Eh^"@LZ3Lȼasđ wIk'a[8/ ~I[<%]n /}Nֱ5_fTTcl]H!p=v.$,M'~8ozx(,2cQ('+NuÇ<ךeBޗbr' C~٪_ϞzebݘyhH_whyJ 3= 5E`n3u.AC&[ئe=vBKLy]cҹAtҿ|NF[ݮuXdxfxa:ڜbD^F!V'@lFf3cz߿f!>#^f@+5 }G߶VIiH,]&8Oy]&xlHDv8M߃H*;A?4%A,d"7JPOE{B7B;e0 QCOH8f/~w\lLⲽ6OA,hɳb%] jX. n1~&4Z8л@jBa"P{O$Y\6W:=EkA=DTaV٤fMiDDآja iMRl}tJ>q:ڏѴ_]@ b^q(Nl.RF3ތsA5s k݀+dV4B`'7j "dhy.q%r>'4]g 'hB,6EٜnE GL=v_ 4d@S^uR]?!]~?."{.aǰ_qUւ)@",fp9mz64 PNRӢdm2I #$LmY_^b*kL^:!% CH?J1{Yɋ%/%dIe0142~x4.8>tnaSœ;9ЎYcg{!`ꆽnz =[,x#B^ ZOg0' KZ,GbLyF3 )|R!p(7B+1,2ho0+?ECrʅ?-2:K0dEB4msTA"GIX֎VS}k`ujcΨdLEe2ԛ:FNXQ;ĚHj."M~3#gC7Zč?+\9uiJ\Y-O:nh[san|lj)eE+T~XWP%UHABw)1N,>*E GV8|WA@X|ͬBf)^Mqws6{fuSäf|/JA^3^$YKBg Eڢz5腉_qu|nڥlwM[j*X-UG]")Mڒ'ftoOY |HLkb>FG&ZMFmfYo}~y Xֲ ~id[{*J TlZl#W$[*ǒ=Nތ&k 1>Ee >V2ZeѲY>Cd% Cx6LE%AP2|r֦)IG[ yؐ-lʯHMa`ad !\j,xX#Y(o\!4؆#$y3J|2(%E/ZTduH\vubv%Y ئp໵QA yyC%p܂gmu[f⊔Еd~dg\u=KU%]m~(2Gq8"nr"δBɝL9OzU0əkU\;qڊ^8" gk0O'[ٰt[]K<2>JDcJ t8:xaev?`Zj"%BIey4&:߱L\)8v{hmOLNQWhO+͌_g'&d|o.!ePZ|^PGAWL&"K~@vƸa;h" UF`DOuZw8W&yHBpk}# к27%|}K2(~ƓHZ,̜mdp,-{q88JmVm[]UQڮE,s|o 1LCzOC{p'5j4@u4CGch#}K%0n0CzB}$)BOew'`(ÒOLtJ [OkGsնJ`5*.DMԄΎf0.\\=xh+HDlfENM~Mi/ Ý|Ɏ8 "]R*y˛ƾ:uTz\9\0H~;bgd/mMJK?+ݻ,f“y(zQS/ F;s'k&eCFMG&.G!ڣnD bc{Ϭv"q5@%uc{g^"rf]:`90 aUv\S|sW;КBk٪Ŋף"d~t!o,?jli}!8>ԝ$E? aG򙗱XuP>}!ܽH,^[8 䣁_k9=feW|`"kKf `hF_LȢ,l! }/2=zn׆iwy`gνN0ilgɚd(Z.zt⇅yRWMŇ o<餗vsj[4d4jCXV i? "STH![,ŎXgm烛j3&Dpw#^Jza=<)| е25MFFz<7T PO+^PM)\/?(K4n\ ebUw F5@Q -lU5Q=:u9`#un:QY~C},lXLw/9/%Ls >[D*9>^yܧ 4Uq5L{ľ=2j H" mh |3pFO8k'v5-lFsepmȍ@xZ:*7ⰮF{Z j98T??980 ڣ~f|Ͽw|ǯ0yu3j.BtNɟW}W 8Dun?sNJ5wȽlFb&2-2gdPX,F(ubrnϔ[drMp곯Y1}-#;تQ* c*,Tdz] !$"{Tk? 4m"F-iSjNJ2Pլ+D`0TaT.RR/QC|A3czZ05 BKilUPP9t_Bs()q\JL&H6s؞2Ubo2Ec[n9_bu8 qb;@Mmdr?Nw4NrmJAϩhblZ?BAu G/{<1Y{'AcBL IЫ=Mm) 9~)48,TKgCQ.l'`,F$T_z>l&cCs"`YcRd@E Y;GG TJ^ Ś UOT׻IGYȲVu4!ff>F{N*[$D t$0DN CK~U-5AQuwVᛀERk&=ӌ7sU7ɭٲF3ͪx9 c<jߜl-j;O;viXd@tcsVӒ(S"(M ~1ERmzkbg^$DӛWmpm Z, Ě[2}7/,=p٩CUS;11b63RoyY3% m\$39jBɁ+̍gphd܃Qk7d.Hn2QJ>z{#I^Ӣ1e]Ƨ] kmoJj9+=PRL򾧁G1J* Cfg/Nq .Ɋ3_^C~2[?ih|g_HwQ-ᅁt-2Q2,;63OFu`+_^+WlGZ;ξcG*Fb=?(s&q*hY?9p<%\90j*7lQmcQGS8[L06"<֩{(;` De]*%vݰyCƃh m+d+ xssA5MVw=:-E0{P:M{RE~|) tSk4щDGi"<kGg$HEL~6'} _Mk.T63QҿcP¿4᭼A0 ]1WX' Eذpt7ܪy2ߝʬFTvqä?9~ G*׶UWDI<d̔at9´vPk_E~.FR_Hu:;]{`o\ؙOU\˩"]!#;HtUЛ+<|_H5 ζղSpy($}[uMREg+9dUr y8n0NP ~ae]~(V&h13a⩀t8K)u zk$`mقUEC05(u+kf<Zx9 Qx"a<_&pJ7s$b",e AFM:mzB̙_4J06m WLj0[g/au=i }!M^IWt)cVj%&e(1`1t祉<8MP:nŰkP؃G0MN<84ͼn%ݳȜClAA#j?]3$hW:g6ii-o&&&6S+Hji7XKO9 '$y-ZDN*D+5{Bє p%'{֠d,&Jt-rЀj͛Ơ|Ղa Zܡe\YGx C b ? E \tzW?I!I*DޘB>\[sg!|L1E||N/v".iCE3/k[`r&4p[p1 *4+yK쵱:5rdU+\lw`繾X|j0P:P~Mih4˟[v @㉩Nrt\h솮dZ:xS.0~0D"Av^;ԗ<$o$'\"P836"9 ca&|}&mQ0B'tW$pb$gm>$@ieʞoۊ.[':oΤM'H K'#~/3$nAًoS =ޗ57(FD [Krmh(MELʚ EQ>;66 |-+A v881 Rzń5-A V/8|X |FdyZҔMy%T5B p#! 9K,>9tJDz[bܝcf5f{|T|F:|#I}%-@'*dl܎i,kIL{؟P *@s(C9v4.s-Ɇ gì|MIb~~6Jn.2.C ܺ;X/ge<”$\r-bbg” :v8 Zժ 5:"0q?h ~F፛5luS'"g:qC9*W|+/PE3GkN]]sNxz[ tԏ1|_s'?!ү^\Ȣ9'} Jcv[uG/F^RctWo"Ū|g GJ`=zۢ/WX+Lt*kM%R,&gi?Ǹ4Y_ Xx]D<.n8r;zZd%'[%_ᐲ{]K}l0iN0B #3\ ^(/K#J B{ SX`OTYPT,.{n  >9*ĕ߫,lB?vJ12#K h#dB:Jd}L! ISHwM"] 7IX1lRT jPPhQCR SمPcm}Qn<0oXuI eKr#{T 0Z+rP-!j!Wiȅ\2d9 [b"RzMU7hmB=pT+G6@_#Nܿ6oRmNi43K%6E! !̪%ڵj>[Bdw0zmO$>'-JHS' 59ML!ϩ6b X޼?Rx|eY ]#޼z RGU)J{E)?؍.ē 09瀘R* v"l٠Arh/Y"/1=̵]n5j^(ρtF,[~8ĆX8{~bX-B*_@^1ϻ/icXC4HL (]pkͷ߷۶>ћyq|%b9ƪW|:P܄JΒGۿKOЍ<;NFu&"#9A`O=!ۡHAbC!XkP|} #yF-H-4,:):M@j|(1zZB/մY;P$Lb 0>˜NRj#:eT1/fM6V[m= мP# %W_7\>pOZF\!6 =wѭ }X$r_ƩW@ϸs= qmn2Ω]Xht] y4:5/laEw`Ry$)t :# #XoN7jzLcaН|9D!݌&޻GshXY!Oyߎ0~4,.W^+ҨtQcUKS٥@;+S##FVZJ'SY2QO60yj5+y)zkXU.vAgMc60BRg#YkVNClvCZSg-nhhS`$\^Ks-8%\#mJsk%l#ZRoaxDj7 RIt9(\oTR } :ϗ=wq$LOw?M(:ưJm`a?cTYJ1GgaWDa,&r(<0r 4-־ޗI͂Os3d$oO5hǶ08@5X l-Iɳޤ#o}dzQ/mJ4竮AMEs@whޭYyr9P81I,6#k,4QT9וaI(.д.8C2E&E[o0'"36WBa߻*vK`3yh3?רm*r´%B5ۗ٢$1L\3(ZJ]:Mù/<hB組HM(4_&wCbfNPH[AӦV-s[YȊe |_ })gP_>}+JTj@xA"¢ԂQg!) Oel!}ƽ3X1j͌ҾYVʷJ.NSF_$\28h9QEo&@^aWpm\En0@ R!ߒR5:osxox[wpΟnЪ9fm^fP9J{7>W7X܌M,^/]lwMl SL/{. m]W - :JޔL%uYcsZ9U6z"҉Tcc]ε*R"!FgV.Mଵӣ~qΒqŦ&y+@ @/~U#_&\0Bמ{]TWݾB}%UŜ#+p?jLn9G S FGPr9k)C-@ /@;E rM߭JjiIڍ˕'-5A\+DKk\] (\`!Qxֹ%8]ԥA)ߵ~O}1~}Sꣷ[QBNaFΦoiAeBywr0jrkL!d:uNJzSK:66]I. i? ֞ à.ލ*p#?k}5l/FLN<~\iM`Tvz pVi, i] ĆĀQO7EOACMy~I?:;r-3;C2+sq1(8$̞7Zz{()T(,. O (v2M*'Ӊ6wBgn5[ MNM}>!OqU2^,`R&a#ޥkwݕ8 lvVZ໚'F:"ה^O7bz{lctN< ް9ϧ !lJU<g .iIUd:!yXf*58J AMPwE0XyX?bF2V$ ;]&?j_8lJe=w z# 4`ؼsqlEvdm3IMaSv7 Uw B"E6Wޓ|)j_@FD,o]$rPW!sN}ŰI#"֥Du,)Iχ  H|L\@GО^(t .kP1u-UF]B+ U@'9ėFV90ԪlE];#e 'LH|\_T/ZReWSξ[ƮM)7`x^$Wi ұE a{zlWJO؆-/{MmfvsZ1fvsԤЕY4,-t4g@G}u8vd_ys{\<\g{GdϫD O1bcD^;xt*`Vn6tѩ`5d@J l%$<[`qngIe]D$`xQxT{ٌvr0y(v("4|_Xj6)&yjo829~Ų4pP`+q[ZoNڙQpL/0{6s68 NĈVҋXzY!+R2_Ҽy嫗`foX .e CE"g=\9B4AQ֒=x4`b⩓:"k/ ND4"M@!oѳ-3H,,fdag1HD(@j MGAY}oaמ#>jcȶ5ZţdWg.9 S+ثܗXBT/!/'U`P DjbGC\V]F}>F&r7M*IC{_9i=eE5UUŘ%+NsXe(E >*="T=nb8]n%u"/F$ L02npCB•V藋/z[@#qS,A}k'ǣ1̍} ~rh:<[_E׬,3GSUz{҃z5t17ϯ@D=31FeQ覆J*W6}I[8AtT;%y>K9]I5j*Rm[FgA8{Kd 1_UP|<{,cEG?xxU~& }}TU7%7'M${eo, q9/$^‰/m7Xa, GL\Nq(cq+?GJ̘<]&k1Y@2qHsl-p0׍3gk^VLN7/X].u܌>[V@+eWiGEXnsr>0mT#FijfHP 4m<~X3؋6a0B&'>fv aNؓp2h!aqD@ǀ3d#,:hz4xY+rA1ܮ%F̜t23m9lyl1l!t/LYgwZİ_ЎPHM|}L6MΨ*Xu jrgvOFtU%IV̼I|C x sF>zHPD&ʋt'O]p klOBV#`SI{Lk!NFӦ{A|wDTb]+RO7&)Y>cZO+T%ߥ9ѸE#W3̞hXun+I 7ԓJZjN̞hoUE؊cN0={\$ewpҭ$;sUHןhog1.@Ri.-vU+06{KnjB" O'jёv^G*sZW5 jl:hhO>Q|!LTO#^duz%)Hc~cET#$<+P/(h& Hi:D2W!;|vPі'+h\Av.FġwFm˸kZu'3LhOlTyhh?/߱[:K`gx{')GYۢ?zmiB?V59r)Ox@֝Z99az-W`:P].ն KIrPQ05ps"t{'369Zkup LjDdE+EwIqL;1RPfFㄳ?HNQJ3ޏ~Q h7 ;`s٨0P;#~H~Yˢ@}.F-&d{uȜcsw~~—%IAgQbQyc0$+w=BMW?ptaS+}yP~J’Tqv}ս}%, c1S g}y=lx`(L^.8@۳<9nEG.*ߚb ls4pj YnhF!ć0'*Wesith[K@FXBPktZb hTבrrak)7-^L'ygx$F$PaԌ;<45ąFQ2Md#d!PߖN}qe &M@j&e]'mLq]KVS(:WsDX| >Zw=cqN˝M?|ljI]8vК54G ~H55J@5D_3M+45q7G~w,Ӑ @_&|)fv6v*%(V KpiIsqFKuMZ6+-ʮ?#\c L*` =Ig="'q,JQ8錤 ض%XgC\ԓ<xB_@3aOh@JD})0b,MY5{:9\Jq}(gL##=H"@%ac3~4͙;X" *!VuM;_r-QstYMܠl9K˝V[{D0tj8 QDu5+uNc=JyKx;_CɵeŌY;*h8򳜎7I[Nf?h*p4`- Ldv  X$ҽ+8O; jCB%$|Zj9#K.2gϕؿGy!˩U3͚ø5<՘/waDq  [K q+Yࣄ&~XSѳm|srCF ^\ϵ[+]L $ =7u`@o.S!IJajN ~۳3h%RXs.{+q'%v^y@ yEc-`6ky`4wjw4I 2 qVf7$%@O X Uʌf;L*1#>v_ sNZqI/MUT!"Uސ%{Ώ$Ն#_e(q"&3=7&5ە @đquu!l_Pl @􆕅~0*)fOH?ϔa$"c`st.LD{0Q:`!X@|G|3_amR+m8Ģ|XB` [>?ێfreСx;2jH}׽6$}{pt4`h2$!L<#K]a蝓u> ̵vTߜ.YM~_8=B{wgRӏfdÈWN#8~6rV7Ibz=:ߗ R 5dz.=ۑ0"uk*\vgWu"?_XOb`=ZHt1,FIOyOKGXWSaZ7W*Ԩǧmgv_zfPѻN 0^T2p">Ebg7An̮єBR -g`a5N+++`FvqS&&MS|YJP[Qd$XB҄PI.p6le3XoQUN^"JO5aςN!oY#a `m܂,ubBۄtzŘVtG8fw׳3.\y2AҘ (NOI?F8ڙQZ+A,&cK[1%P1 T="^׍KO*J2 4lmHeWfnk^.^| xWx6Mm%=Dx5(¢Թ#l ڄf^v{#TԆnTB6WBh#Ez͟^cgZȤp< 2"D+CЭ 5odVM BZ;?#Ь[YJF^ <(W(y eqPӳ)9\&Ly|'L1W>L""Yd8z8 iHTE&5e|w6h{H2 i8[&_>; uQtuQ#SoNg.PfSz[OuKqsAύbg+:Ykr섑N.qy"lek\z5Y]btߴ@Lqr`Y@ջ/x>-xk@>@uul7c1mZ454C.g't0K$l9bć1[E)NL$fO8oB>ܢ-\ȈܝRPw,MbMY/K%**~ v@UvZ=6|͔ȗnMِm_%\H݀7kgs~5ʈ \fY= &S!fK3~qصc5Oۻv'6ʙJJK(Τ;3uFc b@>n(ܰ'b[Qv8ARWkqV NⓃ{9I|/o1T׀X29/AZ1Wb?JX իXHHr^ pDz lj:=]{6|&`ƣA2ƈWEDN^XWd oxlvִZ`$6KA"Q\T>9>P|VLKtXEK(rR߶`*L6m2RQ( ns*z!Pe~vXˉ9t0{1yg Tz p~ɜt''±3ʯD߱wmS> = e] h'h,wb _< D=+#: G]@Äy.MVy9ViԈ;h*ʱ޶%U7!8%I|@!}J%(TlŃS2Cdaq֛ѻQ2`{@vJ"تnI׷-P~ [$7UEMv=xWn;^x U w eͿ _TS*Uō<٬H5H@%V/6pdJ sG6Gh$G!r~w\zЏwO:88v|o?|IСJcۇh$XOsC%s' 4 R󭮫cbʴx'|BTX0JJ`=V!IC iA8V}SaqHǕ yENK?;[6u L=[`zE!Ⱥ2!2%eBJPenU'Fĝ2ǩuO[i3Ħָ&ʨ阆A(V5T1Ls+-sCwo?]1`)=pf8s87hCexP9/5ް\LP"V7? ToV&26=`Z $Bp@!WoہBdy9 ˉASO&ĜLNzT08.z&-VHsU\kΎ wnh~]T<;'{?qъH΁G?>rԫ2Ĭ'l^Mp:#NJ{D$3YጚFB^PRWeY!|b3tݎ2+w6-ؓO{^[][G jB"{k2C][pb_I;ؗW*|ְF˶T{6usi'}FYh<7JiL ⺥\Mx|G$13Cm{䶐9Qgc#cp藾c]} t[Evu~bն F1Fw񆙦tۏopuI&&Q 7&A$)'hEP7$ț@4GMF+;W5=ņ?lZz"< 7NλdJ:Ynűq=`>X3GRRжz%(cw# p TJTVlJw'ae06>-cWtzG_"@J}ٷJ A3>wÁ*0Xt>$ЦL!_Z|Z8j&A><#P!i ǼMjf1JjxRZ+PύwR |,q#{:LjҸ&' $@lY'p>\j \PwĢ0XW;=, ehzE`zsKnC:ž>\, yqX5K"^G#,`U[N$BT ~,B1v~Xѕa>S7=@41h%ؤ#yn]4ܥ'1ry/}q vqL > %9nLv^9PV1LggOLGj νmxؙ6 :oq⸻`p#Q6Rgo!^5Zq1fA?QA*u9풄%nqy%΂C[d_Of=I- F4/I3_jBڏ=G :ro2λ;ev|L'a.?~cO7?Ht"]=Fsӫ+ r>eiC|*޶ubf%svJ<":rEh8t U+7? qi2qu*%4#Pl*)R{$Q{/;sEjH(8SVGEO=kӸs.vJM h {Zvw qQgb1iUڡ^Ҽa/IPke^Β:+eꯙзq| EOͤ+A'HTuFHh\OCf'*O Q7}X|HbΞg#72.=z Vo{4Z :&yVn@*'o?4X9*Oy?xJmܸ} cca_k'uT*ZpPu6eɖm C4 ca4?"ǂwG{dY;9D:o  H>ݪQ`kAkeg%N̩dIVlso5|23,3oB4*#-|3"`LZH՝qPC7QGe2|z1$7Yʳ X # ۚ4%^&V apSɠtpz̀}^3}M[L[{y_(Ѣ~C pSwK@YXtd󳞥{VƱSedIH:v3{:;Δs&uD$ 7fS{G f8:jONnZ`ozW$37N}c{xڸ6&%f~C1F FD_\R C%9zOD{E16ǁG9}ekzED(XDl8/:S>|"Rx=]C & `hO$#2ɮIEdznn>\AiLڬ|I+bCS<AtPhw>F]SE28 dP=+|ȩmqq*>1nHnGG%?B T癮Xi*:[XQBUA tw/q7A{o1Vae@+Nٌh޷! w/X Ή_ƘmyaR0kgc$7ˉ=#ޣkw Sy"A] 36Atbe Mlopk^+)|PX:٥7/8`? hdugn7> NYKrGw1K͐X&h.jBP@E}@ȣKB4?*-7; 5 B$6d[$/>sGpv٢A䖹kͰhLhXQ)+ i1$/^UfGȚ]с(ybp5d75jTȋunrTiXVnM)WKGP\ = fRBߓ 柙3uJa{)ۆłbLC;.&`Q!&26FȳQsxa\uN|Ϧaߥ^C쌂X51ZI:U#=HɕVV>0 YZsurveillance/inst/doc/hhh4.Rnw0000644000176000001440000007711112242645664016065 0ustar ripleyusers%\VignetteIndexEntry{Additional documentation of the function hhh4} %\VignetteDepends{surveillance, maptools, Matrix} %\VignetteKeyword{getting started} %\VignettePackage{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preamble parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage[utf8]{inputenc} \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{relsize} \usepackage{epsfig} \usepackage{comment} \usepackage[english]{babel} \usepackage{pdfpages} \setlength{\parindent}{0pt} \setcounter{secnumdepth}{1} \newcommand{\Po}{\operatorname{Po}} \newcommand{\NegBin}{\operatorname{NegBin}} \newcommand{\n}{{\cal N}} \newcommand{\surveillance}{\texttt{surveillance}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\hhh}{\texttt{hhh4}} \newcommand{\R}{\textsf{R}} \newcommand{\sts}{\texttt{sts}} \newcommand{\example}[1]{\textit{Example: #1}} \title{The function `hhh4' in the R-package `surveillance'} %' \author{ Michaela Paul\thanks{Author of correspondence: Email: \texttt{michaela.paul@ifspm.uzh.ch}}\\ Division of Biostatistics\\ Institute of Social and Preventive Medicine\\ University of Zurich, Switzerland } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \SweaveOpts{prefix.string=figs/hhh4, width=10,height=4.5, keep.source=T, strip.white=true} \setkeys{Gin}{width=1\textwidth} \definecolor{Sinput}{rgb}{0,0,0.56} \definecolor{Scode}{rgb}{0,0,0.56} \definecolor{Soutput}{rgb}{0,0,0} \DefineVerbatimEnvironment{Sinput}{Verbatim}{formatcom={\color{Sinput}},fontshape=sl,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Soutput}{Verbatim}{formatcom={\color{Soutput}},fontfamily=courier, fontshape=it,fontsize=\relsize{-2}} \DefineVerbatimEnvironment{Scode}{Verbatim}{formatcom={\color{Scode}},fontshape=sl,fontsize=\relsize{-1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library("surveillance") library("maptools") gpclibPermit() library("Matrix") options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ###################################################################### #Do we need to compute or can we just fetch results ###################################################################### compute <- !file.exists("hhh4-cache.RData") #load computed results if(!compute) load("hhh4-cache.RData") print(paste("Doing computations: ",compute,sep="")) @ \maketitle \begin{abstract} \noindent This document gives an introduction to the use of the function \hhh\ for modelling univariate and multivariate time series of infectious disease counts. The function is part of the \R-package \surveillance, which provides tools for the visualization, modelling and monitoring of surveillance time series. The basic functionality of \surveillance\ is introduced in the package vignette \citep{vignette} and in \cite{hoehle-2007} with main focus on outbreak detection methods. The following illustrates the use of \hhh\ as estimation and prediction routine for the modelling framework proposed by \citet{held-etal-2005}, and extended in \citet{paul-etal-2008}, \citet{paul-held-2011} and \citet{herzog-etal-2010}. \end{abstract} \section{Introduction}\label{sec:intro} To meet the threats of infectious diseases, many countries have established surveillance systems for the reporting of various infectious diseases. The systematic and standardized reporting at a national and regional level aims to recognize all outbreaks quickly, even when aberrant cases are dispersed in space. Traditionally, notification data, i.e.\ counts of cases confirmed according to a specific definition and reported daily, weekly or monthly on a regional or national level, are used for surveillance purposes. The \R-package \surveillance\ provides functionality for the retrospective modelling and prospective change-point detection in the resulting surveillance time series. A recent introduction to the package with focus on outbreak detection methods is given by \cite{hoehle-mazick-2010}. This document illustrates the functionality of the function \hhh\ for the modelling of univariate and multivariate time series of infectious disease counts. It is part of the \surveillance\ package as of version 1.3. Section~\ref{sec:data} introduces the S4 class data structure used to store surveillance time series data within the package. Access and visualization methods are outlined by means of built-in data sets. In Section~\ref{sec:model}, the statistical modelling approach by \cite{held-etal-2005} and further model extensions are described. After the general function call and arguments are shown, the detailed usage of \hhh\ is demonstrated in Section~\ref{sec:hhh} using data introduced in Section~\ref{sec:data}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% DATA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Surveillance data}\label{sec:data} Denote by $\{y_{it}; i=1,\ldots,I,t=1,\ldots,T\}$ the multivariate time series of disease counts for a specific partition of gender, age and location. Here, $T$ denotes the length of the time series and $I$ denotes the number of units (e.g\ geographical regions or age groups) being monitored. Such data are represented using objects of the S4 class \sts\ (surveillance time series). This class contains the $T\times I$ matrix of counts $y_{it}$ in a slot \code{observed}. An integer slot \code{epoch} denotes the time index $1\leq t \leq T$ of each row in \code{observed}. The number of observations per year, e.g.\ 52 for weekly or 12 for monthly data, is denoted by \code{freq}. Furthermore, \code{start} denotes a vector of length two containing the start of the time series as \code{c(year, epoch)}. For spatially stratified time series, the slot \code{neighbourhood} denotes an $I \times I$ adjacency matrix with elements 1 if two regions are neighbors and 0 otherwise. For map visualizations, the slot \code{map} links the multivariate time series to geographical regions of an ESRI shapefile (using functionality from the package \code{maptools}~\citep{maptools}). Additionally, the slot \code{populationFrac} contains a $T\times I$ matrix representing population fractions in unit $i$ at time $t$. The package \surveillance\ contains a number of time series in the \code{data} directory. Most data sets originate from the SurvStat@RKI database\footnote{\url{http://www3.rki.de/SurvStat}}, maintained by the Robert Koch Institute (RKI), Germany. Selected data sets will be analyzed in Section~\ref{sec:hhh} and are introduced in the following. Note that many of the built-in datasets are stored in the S3 class data structure \mbox{\code{disProg}}. They can be easily converted into the S4 \sts\ data structure using the function \code{disProg2sts}. The resulting \sts\ object can be accessed similar as standard \code{matrix} objects and allows easy temporal and spatial aggregation as will be shown in the remainder of this section. \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Influenza and meningococcal disease in Germany 01/2001--52/2006} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% As a first example, the weekly number of influenza and meningococcal disease cases in Germany is considered. <>= # load data data("influMen") # convert to sts class and print basic information about the time series print(fluMen <- disProg2sts(influMen)) @ The univariate time series of meningococcal disease counts can be obtained with <>= meningo <- fluMen[, "meningococcus"] dim(meningo) @ The \code{plot} function provides an interface to the visual representation of the multivariate time series in time, space and space-time which is controlled by the \code{type} argument: <>= plot(fluMen, type = observed ~ time | unit, # type of plot same.scale = FALSE, # unit-specific ylim ? col = "grey" # color of bars ) @ See \cite{hoehle-mazick-2010} for a detailed description of the plot routines.\\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Influenza in Southern Germany, 01/2001-52/2008} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The spatio-temporal spread of influenza in the 140 Kreise (districts) of Bavaria and Baden-W\"urttemberg is analyzed using the weekly number of cases reported to the RKI~\citep{survstat-fluByBw} in the years 2001--2008. An \sts\ object containing the data is created as follows: <>= # read in observed number of cases flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", package = "surveillance"))) # remove 'X' in column names colnames(flu.counts) <- substring(colnames(flu.counts),first = 2, last = 5) # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", package = "surveillance"))) # visualize adjacency matrix image(Matrix(nhood)) @ \begin{center} \vspace*{-2em} \setkeys{Gin}{width=.5\textwidth} <>= # read in observed number of cases flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", package = "surveillance"))) # remove 'X' in columnnames colnames(flu.counts) <- substring(colnames(flu.counts),first=2,last=5) # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", package = "surveillance"))) print(image(Matrix(nhood))) @ \end{center} <>= # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in population fractions p <- matrix(read.table(system.file("extdata/population_2001-12-31_BYBW.txt", package = "surveillance"), header = TRUE)$popFrac, nrow = nrow(flu.counts), ncol= ncol(flu.counts), byrow = TRUE) # create sts object flu <- new("sts", epoch = 1:nrow(flu.counts), observed = flu.counts, start = c(2001, 1), freq = 52, neighbourhood = nhood, map = map, population = p ) @ This \sts\ object is already included in \surveillance\ and may be loaded with \code{data(fluBYBW)}. A map of the total number of cases in the year 2001 may be obtained as follows: \setkeys{Gin}{width=.5\textwidth} %\vspace*{-2em} \begin{center} <>= par(mar=c(0,0,0,0)) plot(flu[year(flu) == 2001, ], # select year 2001 type = observed ~ 1 | unit, # map of counts aggregated over times t labels = FALSE # suppress region labels in map ) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Measles in Germany, 01/2005--52/2007} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The following data set contains the weekly number of measles cases in the 16 German Bundesl\"ander (federal states), in the years 2005--2007. These data are analyzed in~\cite{herzog-etal-2010} after aggregation into successive bi-weekly periods. \setkeys{Gin}{width=1\textwidth} \begin{center} <>= data("measlesDE") # aggregate into successive bi-weekly periods measles2w <- aggregate(measlesDE, nfreq = 26) plot(measles2w, type = observed ~ time, # plot aggregated over all units i main = "Bi-weekly number of measles cases in Germany", legend.opts = NULL # suppress default legend ) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Model %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Model formulation}\label{sec:model} Retrospective surveillance aims to identify outbreaks and (spatio-)temporal patterns through statistical modelling. Motivated by a branching process with immigration, \cite{held-etal-2005} suggest the following model for the analysis of univariate time series of infectious disease counts $\{y_{t}; t=1,\ldots,T\}$. The counts are assumed to be Poisson distributed with conditional mean \begin{align*} \mu_{t} = \lambda y_{t-1}+ \nu_{t}, \quad(\lambda,\nu_{t}>0) \end{align*} where $\lambda$ and $\nu_t$ are unknown quantities. The mean incidence is decomposed additively into two components: an epidemic or \emph{autoregressive} component $\lambda y_{t-1}$, and an \emph{endemic} component $\nu_t$. The former should be able to capture occasional outbreaks whereas the latter explains a baseline rate of cases with stable temporal pattern. \cite{held-etal-2005} suggest the following parametric model for the endemic component: \begin{align}\label{eq:nu_t} \log(\nu_t) =\alpha + \beta t + \left\{\sum_{s=1}^S \gamma_s \sin(\omega_s t) + \delta_s \cos(\omega_s t)\right\}, \end{align} where $\alpha$ is an intercept, $\beta$ is a trend parameter, and the terms in curly brackets are used to model seasonal variation. Here, $\gamma_s$ and $\delta_s$ are unknown parameters, $S$ denotes the number of harmonics to include, and $\omega_s=2\pi s/$\code{freq} are Fourier frequencies (e.g.\ \code{freq = 52} for weekly data). For ease of interpretation, the seasonal terms in \eqref{eq:nu_t} can be written equivalently as \begin{align*} \gamma_s \sin(\omega_s t) + \delta_s \cos(\omega_s t)= A_s \sin(\omega_s t +\varphi_s) \end{align*} with amplitude $A_s=\sqrt{\gamma_s^2+\delta_s^2}$ describing the magnitude, and phase difference $\tan(\varphi_s)=\delta_s/\gamma_s$ describing the onset of the sine wave. To account for overdispersion, the Poisson model may be replaced by a negative binomial model. Then, the conditional mean $\mu_t$ remains the same but the conditional variance increases to $\mu_t (1+\mu_t \psi)$ with additional unknown overdispersion parameter $\psi>0$. The model is extended to multivariate time series $\{y_{it}\}$ in \cite{held-etal-2005} and \cite{paul-etal-2008} by including an additional \emph{neighbor-driven} component, where past cases in other (neighboring) units also enter as explanatory covariates. The conditional mean $\mu_{it}$ is then given by \begin{align} \label{eq:mu_it} \mu_{it} = \lambda y_{i,t-1} + \phi \sum_{j\neq i} w_{ji} y_{j,t-1} +e_{it} \nu_{t}, \end{align} where the unknown parameter $\phi$ quantifies the influence of other units $j$ on unit $i$, $w_{ji}$ are suitably chosen known weights and $e_{it}$ corresponds to an offset (such as population fractions at time $t$ in region $i$). A simple choice for the weights is $w_{ji}=1$ if units $j$ and $i$ are adjacent and 0 otherwise. See \cite{paul-etal-2008} for a discussion of alternative weights. When analyzing a specific disease observed in, say, multiple regions or several pathogens (such as influenza and meningococcal disease), the assumption of equal incidence levels or disease transmission across units is questionable. To address such heterogeneity, the unknown quantities $\lambda$, $\phi$, and $\nu_t$ in \eqref{eq:mu_it} may also depend on unit $i$. This can be done via \begin{itemize} \item unit-specific fixed parameters, e.g.\ $\log(\lambda_i)=\alpha_i$ \citep{paul-etal-2008}; \item unit-specific random effects, e.g\ $\log(\lambda_i)=\alpha_0 +a_i$, $a_i \stackrel{\text{iid}}{\sim} \n(0,\sigma^2_\lambda)$ \citep{paul-held-2011}; \item linking parameters with known (possibly time-varying) explanatory variables, e.g.\ $\log(\lambda_i)=\alpha_0 +x_i\alpha_1$ with region-specific vaccination coverage $x_i$ \citep{herzog-etal-2010}. \end{itemize} A call to \hhh\ fits a Poisson or negative binomial model with conditional mean \begin{align*} \mu_{it} = \lambda_{it} y_{i,t-1} + \phi_{it} \sum_{j\neq i} w_{ji} y_{j,t-1} +e_{it} \nu_{it} \end{align*} to a multivariate time series of counts. Here, the three unknown quantities are decomposed additively on the log scale \begin{align} \log(\lambda_{it}) &= \alpha_0 + a_i +\bm{u}_{it}^\top \bm{\alpha} \tag{\code{ar}}\\ \log(\phi_{it}) &= \beta_0 + b_i +\bm{x}_{it}^\top \bm{\beta} \tag{\code{ne}}\\ \log(\nu_{it}) &= \gamma_0 + c_i +\bm{z}_{it}^\top \bm{\gamma}\tag{\code{end}} \end{align} where $\alpha_0,\beta_0,\gamma_0$ are intercepts, $\bm{\alpha},\bm{\beta},\bm{\gamma}$ are vectors of unknown parameters corresponding to covariate vectors $\bm{u}_{it},\bm{x}_{it},\bm{z}_{it}$, and $a_i,b_i,c_i$ are random effects. For instance, model~\eqref{eq:nu_t} with $S=1$ seasonal terms may be represented as $\bm{z}_{it}=(t,\sin(2\pi/\code{freq}\;t),\cos(2\pi/\code{freq}\;t))^\top$. The stacked vector of all random effects is assumed to follow a normal distribution with mean $\bm{0}$ and covariance matrix $\bm{\Sigma}$, see \cite{paul-held-2011} for further details. Inference is based on (penalized) likelihood methodology as proposed in \cite{paul-held-2011}. In applications, each component (\code{ar})--(\code{end}) may be omitted in parts or as a whole. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function call and arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Function call and control settings}\label{sec:hhh} The estimation procedure is called with <>= hhh4(sts, control) @ where \code{sts} denotes a (multivariate) surveillance time series and the model is specified in the argument \code{control} in consistency with other algorithms in \surveillance. The \code{control} setting is a list of the following arguments: <>= control = list( ar = list(f = ~ -1), # formula: exp(u'alpha) * y_i,t-1 ne = list(f = ~ -1, # formula: exp(x'beta) * sum_j {w_ji * y_j,t-1} weights = NULL # matrix with weights w_ji # [w_ji = neighbourhood(stsObj) as default] ), end = list(f = ~ 1, # formula: exp(z'gamma) * e_it offset = NULL # optional offset e_it ), family = "Poisson", # Poisson or NegBin model subset = 2:nrow(stsObj), # subset of observations to be used # in the fitting process optimizer = list(tech = "nlminb"), # details for optimizer verbose = FALSE, # no progress information is printed start = list(fixed = NULL, # list with initial values for fixed, random = NULL, # random, and sd.corr = NULL # variance parameters ), data = data.frame(t = epoch(sts)) # data.frame, # or named list with covariates ) @ The first three arguments \code{ar}, \code{ne}, and \code{end} specify the model components using \code{formula} objects. As default, the counts $y_{it}$ are assumed to be Poisson distributed. A negative binomial model is obtained with \code{family = "NegBin1"}. The log-likelihood is maximized using the optimization routine implemented in \code{nlminb}. Alternatively, the methods implemented in \code{optim} may be used, e.g.\ \code{optimizer = list(tech = "BFGS")}. Initial values for the fixed, random, and variance parameters are passed on in the \code{start} argument. If the model contains covariates, these have to be specified in the \code{data} argument. When covariates do not vary across units, they may be passed on as a vector of length $T$. Otherwise, covariate values have to be stored and passed on in a matrix of size $T \times I$. In the following, the functionality of \hhh\ is demonstrated using the data sets introduced in Section~\ref{sec:data} and previously analyzed in \cite{paul-etal-2008}, \cite{paul-held-2011} and \cite{herzog-etal-2010}. Selected results are reproduced. For a thorough discussion we refer to these papers. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Univariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% As a first example, consider the univariate time series of meningococcal infections in Germany, 01/2001--52/2006 \citep[cf.~Tab.~1 in ][]{paul-etal-2008}. A Poisson model without autoregression and $S=1$ seasonal term is specified as follows: <>= # specify formula object for endemic component ( f_S1 <- addSeason2formula(f = ~ 1, S = 1, period = 52) ) # fit Poisson model summary(hhh4(meningo, control = list(end = list(f = f_S1), family = "Poisson"))) @ A corresponding negative binomial model is obtained via <>= result1 <- hhh4(meningo, control = list(end = list(f = f_S1), family = "NegBin1")) @ As default, the autoregressive component is omitted with \code{$\sim$ -1} in the formula specification. In can be included in the model with <>= m2 <- list(ar = list(f = ~ 1), # log(lambda) = alpha end = list(f = f_S1), family = "NegBin1", # use estimates from previous model as initial values start = list(fixed = c(log(0.1), # initial values for alpha, coef(result1)) # and remaining parameters ) ) # fit model result2 <- hhh4(meningo, control = m2) # extract ML estimates round(coef(result2, se = TRUE, # also return standard errors idx2Exp = 1 # exponentiate 1st param [-> exp(alpha)] ),2) # get AIC AIC(result2) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Bivariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Now, the weekly numbers of both meningococcal disease (\textsc{MEN}) and influenza (\textsc{FLU}) cases are analyzed to investigate whether influenza infections predispose meningococcal disease \citep[cf.~Tab.~2 in][]{paul-etal-2008}. This requires disease-specific parameters which are specified in the formula object with \code{fe(\ldots)}. In the following, a negative binomial model with mean \begin{align*} \binom{\mu_{\text{men},t}} {\mu_{\text{flu},t}}= \begin{pmatrix} \lambda_\text{men} & \phi \\ 0 & \lambda_\text{flu} \\ \end{pmatrix} \binom{\text{\sc men}_{t-1}}{\text{\sc flu}_{t-1}} + \binom{\nu_{\text{men},t}}{\nu_{\text{flu},t}}\,, \end{align*} where the endemic component includes $S=3$ seasonal terms for the \textsc{FLU} data and $S=1$ seasonal terms for the \textsc{MEN} data is considered. Here, $\phi$ quantifies the influence of past influenza cases on the meningococcal disease incidence. This model corresponds to the second model of Tab.~2 in \cite{paul-etal-2008} and is fitted with <>= neighbourhood(fluMen) <- matrix(c(0,0,1,0),2,2) @ <>= # create formula for endemic component f.end <- addSeason2formula(f = ~ -1 + fe(1, which = c(TRUE, TRUE)), # disease-specific intercepts S = c(3, 1), # S = 3 for flu, S = 1 for men period = 52) # specify model m <- list(ar = list(f = ~ -1 + fe(1, which=c(TRUE, TRUE))), ne = list(f = ~ -1 + fe(1, which=c(FALSE, TRUE))), end = list(f = f.end), family = "NegBinM" ) # fit model summary(result <- hhh4(fluMen, control = m)) @ A plot of the estimated mean for the meningococcal disease data, decomposed into the three components, is obtained with \setkeys{Gin}{width=.8\textwidth} \begin{center} <>= plot(result, i = 2, col = c("orange", "blue", "grey85"), legend = TRUE) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Multivariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% For disease counts observed in a large number of regions, say, (i.e.\ highly multivariate time series of counts) the use of region-specific parameters to account for regional heterogeneity is no longer feasible, as estimation and identifiability problems may occur. \cite{paul-held-2011} propose a random effects formulation to analyze the weekly number of influenza cases in \Sexpr{ncol(flu)} districts of Southern Germany. For example, consider a model with random intercepts in the endemic component: $c_i \sim \n(0,\sigma^2_\nu), i=1,\ldots,I$. Such effects are specified in a formula object as <>= f.end <- ~ -1 + ri(type = "iid", corr = "all") @ Setting \code{type = "car"} would assume that the random effects are spatially correlated instead of uncorrelated. See \cite{paul-held-2011} for further details. The argument \code{corr = "all"} allows for correlation between region-specific random effects in different components, e.g.\ random incidence levels $c_i$ in the endemic component and random effects $b_i$ in the neighbor-driven component. The following call to \hhh\ fits such a random effects model with linear trend and $S=3$ seasonal terms in the endemic component and a fixed autoregressive parameter $\lambda$ to the influenza data \citep[cf. model B2 in Tab.~3 in][]{paul-held-2011}. <>= # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") +I((t-208)/100) , S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1+ ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1", verbose = 1, start=list(fixed=c(-0.9,-1.53,0.56,2.45,2.05,0.33,-0.49,0.21,-0.36,0.21,-0.09), sd.corr=c(-0.02,-0.34,0.68)) ) if(compute){ # this is time-consuming... result.B2 <- hhh4(flu, model.B2) s.B2 <- summary(result.B2) system.time(pred.B2 <- oneStepAhead(result.B2,tp=nrow(flu)-2*52)) meanSc.B2 <- colMeans(scores(pred.B2)) save(s.B2, meanSc.B2, file="hhh4-cache.RData") } @ <>= # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) # endemic component: iid random effects, linear trend, and S=3 seasonal terms f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") + I((t-208)/100), S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1+ ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1" ) # fit model summary(result.B2 <- hhh4(flu, model.B2)) @ <>= s.B2 @ Model choice based on information criteria such as AIC or BIC is well explored and understood for models that correspond to fixed-effects likelihoods. However, in the presence of random effects their use can be problematic. For model selection in time series models, the comparison of successive one-step-ahead forecasts with the actually observed data provides a natural alternative. In this context, \cite{gneiting-raftery-2007} recommend the use of strictly proper scoring rules, such as the logarithmic score or the ranked probability score. See \cite{czado-etal-2009} and \cite{paul-held-2011} for further details. One-step-ahead predictions for the last 2 years for model B2 are obtained as follows: <>= pred.B2 <- oneStepAhead(result.B2, tp = nrow(flu) - 2 * 52) @ The mean logarithmic and mean ranked probability score are then computed with <>= colMeans(scores(pred.B2)[, c("logs", "rps")]) @ <>= meanSc.B2[ c("logs", "rps")] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Measles data <>= data(MMRcoverageDE) cardVac1 <- MMRcoverageDE[1:16,3:4] adjustVac <- function(cardVac, p=0.5,nrow=1){ card <- cardVac[,1] vac <- cardVac[,2] vacAdj <- vac*card + p*vac*(1-card) return(matrix(vacAdj,nrow=nrow, ncol=length(vacAdj), byrow=TRUE)) } vac0 <- 1-adjustVac(cardVac1,p=0.5,nrow=measles2w@freq*3) colnames(vac0) <- colnames(measles2w) @ As a last example, consider the number of measles cases in the 16 federal states of Germany, in the years 2005--2007. There is considerable regional variation in the incidence pattern which is most likely due to differences in vaccination coverage. In the following, information about vaccination coverage in each state, namely the log proportion of unvaccinated school starters, is included as explanatory variable in a model for the bi-weekly aggregated measles data. See \cite{herzog-etal-2010} for further details. Vaccination coverage levels for the year 2006 are available in the dataset \code{data(MMRcoverageDE)}. This dataset can be used to compute the $\Sexpr{nrow(vac0)}\times \Sexpr{ncol(vac0)}$ matrix \code{vac0} with adjusted proportions of unvaccinated school starters in each state $i$ used by \cite{herzog-etal-2010} <<>>= vac0[1:2, 1:5] @ A Poisson model which links the autoregressive parameter with this covariate and contains $S=1$ seasonal term in the endemic component \citep[cf.~model A0 in Tab.~3 in ][]{herzog-etal-2010} is obtained with <>= # endemic component: Intercept + S = 1 sine/cosine pair f.end <- addSeason2formula(f = ~ 1, S = 1, period = 26) # autoregressive component: Intercept + vaccination coverage information model.A0 <- list(ar = list(f = ~ 1 + logVac0), end = list(f = f.end, offset = population(measles2w)), data = list(t = epoch(measles2w), logVac0 = log(vac0))) # fit model result.A0 <- hhh4(measles2w, model.A0) # parameter estimates round(coef(result.A0, se = TRUE, # also return standard errors amplitudeShift = TRUE # transform sin/cos terms to ), 2) # Amplitude/shift formulation @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Summary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 \section{Summary} As part of the \R-package \surveillance, the function \hhh\ provides a flexible tool for the modelling of multivariate time series of infectious disease counts. The discussed count data model is able to account for serial and spatio-temporal correlation, as well as heterogeneity in incidence levels and disease transmission. The functionality of \hhh\ was illustrated using several built-in data sets. \bibliography{references} \end{document} surveillance/inst/doc/hhh4.R0000644000176000001440000003310112242645664015507 0ustar ripleyusers### R code from vignette source 'hhh4.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: setup ################################################### library("surveillance") library("maptools") gpclibPermit() library("Matrix") options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ###################################################################### #Do we need to compute or can we just fetch results ###################################################################### compute <- !file.exists("hhh4-cache.RData") #load computed results if(!compute) load("hhh4-cache.RData") print(paste("Doing computations: ",compute,sep="")) ################################################### ### code chunk number 2: loadInfluMen ################################################### # load data data("influMen") # convert to sts class and print basic information about the time series print(fluMen <- disProg2sts(influMen)) ################################################### ### code chunk number 3: getMen ################################################### meningo <- fluMen[, "meningococcus"] dim(meningo) ################################################### ### code chunk number 4: plotfluMen ################################################### getOption("SweaveHooks")[["fig"]]() plot(fluMen, type = observed ~ time | unit, # type of plot same.scale = FALSE, # unit-specific ylim ? col = "grey" # color of bars ) ################################################### ### code chunk number 5: readInFlu (eval = FALSE) ################################################### ## # read in observed number of cases ## flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", ## package = "surveillance"))) ## # remove 'X' in column names ## colnames(flu.counts) <- substring(colnames(flu.counts),first = 2, last = 5) ## # read in adjacency matrix with elements 1 if two regions share a common border ## nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", ## package = "surveillance"))) ## # visualize adjacency matrix ## image(Matrix(nhood)) ################################################### ### code chunk number 6: nhoodByBw ################################################### getOption("SweaveHooks")[["fig"]]() # read in observed number of cases flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", package = "surveillance"))) # remove 'X' in columnnames colnames(flu.counts) <- substring(colnames(flu.counts),first=2,last=5) # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", package = "surveillance"))) print(image(Matrix(nhood))) ################################################### ### code chunk number 7: fluAsSTS ################################################### # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in population fractions p <- matrix(read.table(system.file("extdata/population_2001-12-31_BYBW.txt", package = "surveillance"), header = TRUE)$popFrac, nrow = nrow(flu.counts), ncol= ncol(flu.counts), byrow = TRUE) # create sts object flu <- new("sts", epoch = 1:nrow(flu.counts), observed = flu.counts, start = c(2001, 1), freq = 52, neighbourhood = nhood, map = map, population = p ) ################################################### ### code chunk number 8: plot-flu-ByBw ################################################### getOption("SweaveHooks")[["fig"]]() par(mar=c(0,0,0,0)) plot(flu[year(flu) == 2001, ], # select year 2001 type = observed ~ 1 | unit, # map of counts aggregated over times t labels = FALSE # suppress region labels in map ) ################################################### ### code chunk number 9: plot-measles ################################################### getOption("SweaveHooks")[["fig"]]() data("measlesDE") # aggregate into successive bi-weekly periods measles2w <- aggregate(measlesDE, nfreq = 26) plot(measles2w, type = observed ~ time, # plot aggregated over all units i main = "Bi-weekly number of measles cases in Germany", legend.opts = NULL # suppress default legend ) ################################################### ### code chunk number 10: hhh4 (eval = FALSE) ################################################### ## hhh4(sts, control) ################################################### ### code chunk number 11: controlObj (eval = FALSE) ################################################### ## control = list( ## ar = list(f = ~ -1), # formula: exp(u'alpha) * y_i,t-1 ## ne = list(f = ~ -1, # formula: exp(x'beta) * sum_j {w_ji * y_j,t-1} ## weights = NULL # matrix with weights w_ji ## # [w_ji = neighbourhood(stsObj) as default] ## ), ## end = list(f = ~ 1, # formula: exp(z'gamma) * e_it ## offset = NULL # optional offset e_it ## ), ## family = "Poisson", # Poisson or NegBin model ## subset = 2:nrow(stsObj), # subset of observations to be used ## # in the fitting process ## optimizer = list(tech = "nlminb"), # details for optimizer ## verbose = FALSE, # no progress information is printed ## start = list(fixed = NULL, # list with initial values for fixed, ## random = NULL, # random, and ## sd.corr = NULL # variance parameters ## ), ## data = data.frame(t = epoch(sts)) # data.frame, ## # or named list with covariates ## ) ## ################################################### ### code chunk number 12: fitMeningo1 ################################################### # specify formula object for endemic component ( f_S1 <- addSeason2formula(f = ~ 1, S = 1, period = 52) ) # fit Poisson model summary(hhh4(meningo, control = list(end = list(f = f_S1), family = "Poisson"))) ################################################### ### code chunk number 13: fitMeningo2 ################################################### result1 <- hhh4(meningo, control = list(end = list(f = f_S1), family = "NegBin1")) ################################################### ### code chunk number 14: fitMeningo3 ################################################### m2 <- list(ar = list(f = ~ 1), # log(lambda) = alpha end = list(f = f_S1), family = "NegBin1", # use estimates from previous model as initial values start = list(fixed = c(log(0.1), # initial values for alpha, coef(result1)) # and remaining parameters ) ) # fit model result2 <- hhh4(meningo, control = m2) # extract ML estimates round(coef(result2, se = TRUE, # also return standard errors idx2Exp = 1 # exponentiate 1st param [-> exp(alpha)] ),2) # get AIC AIC(result2) ################################################### ### code chunk number 15: hhh4.Rnw:529-530 ################################################### neighbourhood(fluMen) <- matrix(c(0,0,1,0),2,2) ################################################### ### code chunk number 16: fitFluMen ################################################### # create formula for endemic component f.end <- addSeason2formula(f = ~ -1 + fe(1, which = c(TRUE, TRUE)), # disease-specific intercepts S = c(3, 1), # S = 3 for flu, S = 1 for men period = 52) # specify model m <- list(ar = list(f = ~ -1 + fe(1, which=c(TRUE, TRUE))), ne = list(f = ~ -1 + fe(1, which=c(FALSE, TRUE))), end = list(f = f.end), family = "NegBinM" ) # fit model summary(result <- hhh4(fluMen, control = m)) ################################################### ### code chunk number 17: plot-fit_men ################################################### getOption("SweaveHooks")[["fig"]]() plot(result, i = 2, col = c("orange", "blue", "grey85"), legend = TRUE) ################################################### ### code chunk number 18: ri (eval = FALSE) ################################################### ## f.end <- ~ -1 + ri(type = "iid", corr = "all") ################################################### ### code chunk number 19: computeFluBYBW ################################################### # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") +I((t-208)/100) , S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1+ ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1", verbose = 1, start=list(fixed=c(-0.9,-1.53,0.56,2.45,2.05,0.33,-0.49,0.21,-0.36,0.21,-0.09), sd.corr=c(-0.02,-0.34,0.68)) ) if(compute){ # this is time-consuming... result.B2 <- hhh4(flu, model.B2) s.B2 <- summary(result.B2) system.time(pred.B2 <- oneStepAhead(result.B2,tp=nrow(flu)-2*52)) meanSc.B2 <- colMeans(scores(pred.B2)) save(s.B2, meanSc.B2, file="hhh4-cache.RData") } ################################################### ### code chunk number 20: fitFluBYBW (eval = FALSE) ################################################### ## # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise ## wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) ## ## # endemic component: iid random effects, linear trend, and S=3 seasonal terms ## f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") + ## I((t-208)/100), ## S = 3, ## period = 52) ## ## model.B2 <- list(ar = list(f = ~ 1), ## ne = list(f = ~ -1+ ri(type = "iid", corr="all"), ## weights = wji), ## end = list(f = f.end, offset = population(flu)), ## family = "NegBin1" ## ) ## ## # fit model ## summary(result.B2 <- hhh4(flu, model.B2)) ################################################### ### code chunk number 21: hhh4.Rnw:632-633 ################################################### s.B2 ################################################### ### code chunk number 22: oneStepAhead (eval = FALSE) ################################################### ## pred.B2 <- oneStepAhead(result.B2, tp = nrow(flu) - 2 * 52) ################################################### ### code chunk number 23: scores (eval = FALSE) ################################################### ## colMeans(scores(pred.B2)[, c("logs", "rps")]) ################################################### ### code chunk number 24: hhh4.Rnw:654-655 ################################################### meanSc.B2[ c("logs", "rps")] ################################################### ### code chunk number 25: createVacc ################################################### data(MMRcoverageDE) cardVac1 <- MMRcoverageDE[1:16,3:4] adjustVac <- function(cardVac, p=0.5,nrow=1){ card <- cardVac[,1] vac <- cardVac[,2] vacAdj <- vac*card + p*vac*(1-card) return(matrix(vacAdj,nrow=nrow, ncol=length(vacAdj), byrow=TRUE)) } vac0 <- 1-adjustVac(cardVac1,p=0.5,nrow=measles2w@freq*3) colnames(vac0) <- colnames(measles2w) ################################################### ### code chunk number 26: hhh4.Rnw:687-688 ################################################### vac0[1:2, 1:5] ################################################### ### code chunk number 27: fitMeasles ################################################### # endemic component: Intercept + S = 1 sine/cosine pair f.end <- addSeason2formula(f = ~ 1, S = 1, period = 26) # autoregressive component: Intercept + vaccination coverage information model.A0 <- list(ar = list(f = ~ 1 + logVac0), end = list(f = f.end, offset = population(measles2w)), data = list(t = epoch(measles2w), logVac0 = log(vac0))) # fit model result.A0 <- hhh4(measles2w, model.A0) # parameter estimates round(coef(result.A0, se = TRUE, # also return standard errors amplitudeShift = TRUE # transform sin/cos terms to ), 2) # Amplitude/shift formulation surveillance/inst/doc/glrnb.Rnw0000644000176000001440000005504012242645664016333 0ustar ripleyusers%\VignetteIndexEntry{Additional documentation of the function algo.glrnb} %\VignetteKeywords{getting started} %\VignettePackage{surveillance} %\VignetteDepends{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preabmle parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} % Brug times som font - vigtigt i % pdflatex? %PSTricks \usepackage{pdftricks} \begin{psinputs} \usepackage{pst-all} \end{psinputs} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{relsize} \usepackage{epsfig} \usepackage{comment} \newcommand{\surveillance}{\texttt{surveillance}} \usepackage{pdfpages} \setlength{\parindent}{0pt} \title{The function 'algo.glrnb' in the R-Package 'surveillance'} \author{ Valentin Wimmer$^{(1,2)}$\thanks{Author of correspondence: Email: \texttt{Valentin.Wimmer@gmx.de}}$\>\>$ and Michael H\"{o}hle$^{(1,2)}$ \\ (1) Department of Statistics\\ University of Munich, Germany\\ (2) MC-Health - Munich Center of Health Sciences } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Put all in another directory \SweaveOpts{prefix.string=figs/vignette_glrnb} \setkeys{Gin}{width=1\textwidth} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontshape=s1,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl,fontsize=\relsize{-1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library(surveillance) library(xtable) options(SweaveHooks=list(fig=function() par(mar=c(5,4,4,0),cex.axis=1.5,cex.lab=1.5,cex.main=1.5))) options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") @ \maketitle %\mbox{}\hrulefill\\ \begin{abstract} \noindent The aim of this document is to show the use of the function \verb+algo.glrnb+ for a type of count data regression chart, the generalized likelihood ratio (GLR) statistic. The function is part of the R-Package '\texttt{surveillance}' \citep{hoehle2007R}, which provides outbreak detection algorithms for surveillance data. For an introduction to this package, the vignette for the package can be used \citep{vignette}. There one can find information about the data structure of the \verb+disProg+ and \verb+SurvRes+ objects. Furthermore tools for outbreak detection, such as a Bayesian approach, procedures described by \citet{stroup89}, \citet{farrington96} and the methods used at the Robert Koch Institut, Germany, are explained. The function \verb+algo.glrnb+ is the implementation of the control charts for poisson and negative binomial distributions for monitoring time series of counts described in \citet{hoehle2008}. This document gives an overview of the different features of the function and illustrations of its use are given for simulated and real surveillance data. \\ \noindent{\bf Keywords:} change-point detection, generalized regression charts, poisson and negative binomial distribution, increase and decrease \end{abstract} \section{Introduction}\label{sec:intro} For the monitoring of infectious diseases it is necessary to monitor time series of routinely collected surveillance data. Methods of the statistic process control (SPC) can be used for this purpose. Here it is important, that the methods can handle the special features of surveillance data, e.g.\ seasonality of the disease or the count data nature of the collected data. It is also important, that not only the number of counts of one time point (week, month) are regarded but instead the cases of previous time points are considered, because beside abrupt changes also small constant changes should be detected. CUSUM-methods (function \verb+algo.cusum+), LR-charts or GLR-methods as described by \citet{lai95} and \citet{hoehle2008} can afford this. With the function \verb+algo.glrnb+ these methods can easily applied to surveillance data. A typical assumption for time series of counts is, that the observed counts at each time point follow a Poisson distribution. If overdispersion is likely, the negative binomial distribution provides a better alternative. Both distributions are provided by \verb+algo.glrnb+. In the GLR-scheme, an outbreak can be defined as a change in the intercept. The function \verb+algo.glrnb+ allows the user to specify whether increases or decreases in mean should be regarded. For each time point a GLR-statistic is computed, if this statistic exceeds a threshold value, an alarm is given. The function also provides the possibility to return the number of cases that would have been necessary to produce an alarm. This vignette is organized as follows: First, in Section \ref{sec:prel} the data structure is explained, in Section \ref{sec:glr} a short introduction in the theory of the GLR-charts is given and Section \ref{sec:control} shows the different \verb+control+-settings. % In Section \ref{sec:extensions} some possible extensions are presented. \section{Preliminaries}\label{sec:prel} Consider the situation, where a time series of counts is collected for surveillance purpose. In each interval, usually one week, the number of cases of the interesting disease in an area (country, district) is counted. The resulting time series is denoted by $\{y_t\>;t=1,\ldots,n\}$. Usually the data are collected on line, so that the time point $n$ is the actual time point. Our aim is to decide with the aid of a statistic for each time point $n$ if there is an outbreak at this or any former time point. If an outbreak is detected, the algorithm gives an alarm. Observed time series of counts are saved in a \verb+disProg+ object, a list containing the time series of counts, the number of weeks and a state chain. The state is 1, if e.g. the Robert Koch Institut declares the week to be part of an outbreak and 0 otherwise ~\citep{survstat}. By using the state chain the quality of the surveillance algorithm can be tested. %The 'surveillance'-package provides standard plot routines for the surveillance objects. As an first example the number of cases of salmonella hadar in the years 2001-2006 is examined. \\ \textit{Example 1:} <>= data(shadar) plot(shadar,main="Number of salmonella hadar cases in Germany 2001-2006") @ The package provides the possibility to simulate surveillance data with the functions \verb+sim.pointSource+, \verb+sim.seasonalNoise+ and \verb+sim.HHH+. See \citep{hoehle2007R} and the vignette for further information. \\ \textit{Example 2:} <>= # Simulate data simData <- sim.pointSource(length=300,K=0.5,r=0.6,p=0.95) @ <>= plot(simData) @ \section{LR and GLR-charts}\label{sec:glr} Our aim is to detect a significant change in the number of cases. This is done as follows. One assumes, that there is a number of cases that is usual, the in control mean $\mu_0$. The in-control mean is defined in \citet{hoehle2008} to be \begin{equation} \label{mu0} \operatorname{log}(\mu_{0,t})=\beta_0 + \beta_1t + \sum_{s=1}^S(\beta_{2s} \cos(\omega s t) + \beta_{2s+1}\sin(\omega s t)). \end{equation} If an outbreak occurs, the number of cases increases and the situation is out-of control and the algorithm should produce an alarm. The change is assumed to be an additive increase on log scale, \begin{equation} \label{interceptchange} \operatorname{log}(\mu_1)= \operatorname{log}(\mu_0) + \kappa . \end{equation} If $\mu_0$ is unknown one could use a part of the data to estimate it with a generalized linear model (GLM). If $\kappa$ is known, LR-charts can be used, if not, $\kappa$ has to be estimated, which is the GLR-scheme setting. For each time point, the likelihood ratio statistic is computed as follows \begin{equation} \label{cusum} GLR(n)=\max_{1 \leq k \leq n} \sup_{\theta \in \Theta} \left[ \sum_{t=k}^n \log \left\{ \frac{f_{\theta}(y_t)}{f_{\theta_0}(y_t)} \right\} \right] . \end{equation} Now $N=\inf \{n \geq 1 : GLR(n) \geq c_{\gamma} \}$ is the first time point where the GLR-statistic is above a threshold $c_{\gamma}$. For this time point $N$ an alarm is given. If the parameter $\kappa$ and hence $\theta=\kappa$ is known, the maximation over $\theta$ can be omitted. With the function \verb+algo.glrnb+ one can compute the the GLR-statistic for every time point. If the actual value extends the chosen threshold $c_{\gamma}$, an alarm is given. After every alarm, the algorithm gets reset and the surveillance starts again. The result of a call of \verb+algo.glrnb+ is an object of class \verb+SurvRes+. This is basically a list of several arguments. The most important one is the \verb+upperbound+ statistic, which is a vector of length $n$ containing the likelihood-ratio-statistic for every time point under surveillance. The \verb+alarm+-vector contains a boolean for every time point whether there was an alarm or not. \\ At this point in the vignette we move more into the applied direction and refer the user to \citet{hoehle2008} for further theoretical details about the GLR procedure. The next example demonstrates the surveillance with the \verb+algo.glrnb+ in a learning by doing type of way. The example should demonstrate primarily the result of the surveillance. More details to the control-options follow in the next section. All control values are set here on default and the first two years are used to find a model for the in-control mean and so surveillance is starting in week 105. A plot of the results can be obtained as follows <>= survObj <- algo.glrnb(shadar,control=list(range=105:295,alpha=0)) plot(survObj,startyear=2003) @ The default value for $c_{\gamma}$ is 5. The upperbound statistic is above this value several times in the third quarter of 2006 (time points marked by small triangles in the plot). In the next section follow a description of the control-setting for tuning the behavior of the algorithm, e.g.\ one can search not only for increases in mean as shown in the example but also for decreases. \section{Control-settings}\label{sec:control} In this section, the purpose and use of the control settings of the \verb+algo.glrnb+ function are shown and illustrated by the examples from Section \ref{sec:prel}. The control-setting is a list of the following arguments. <>= control=list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept",theta=NULL, dir=c("inc","dec"),ret=c("cases","value")) @ \begin{itemize} \item \verb+range+ \\ The \verb+range+ is a vector of consecutive indices for the week numbers in the \verb+disProg+ object for which surveillance should be done. If a model for the in-control parameter $\mu_0$ is known (\verb+mu0+ is not \verb+NULL+), the surveillance can start at time point one. Otherwise it is necessary to estimate the values for \verb+mu0+ with a GLM. Thus, the range should not start at the first time point but instead use the first weeks/months as control-range. (Note: It is important to use enough data for estimating $\mu_0$, but one should be careful that these data are in control) With the following call one uses the first 2 years (104 weeks) for estimating $\mu_0$ and the the years 2003 to 2006 will be on line monitored. <>= control=list(range=105:length(shadar$observed)) algo.glrnb(disProgObj=shadar,control=control) @ \item \verb+alpha+ \\ This is the (known) dispersion parameter $\alpha$ of the negative binomial distribution. If \verb+alpha+=0, modeling corresponds to the Poisson distribution. In this case, the call of \verb+algo.glrnb+ is similar to a call of \verb+algo.glrpois+. If $\alpha$ is known, the value can be specified in the \verb+control+-settings. <>= control=list(range=105:295,alpha=3) algo.glrnb(disProgObj=shadar,control=control) @ If overdispersion is present in the data, but the dispersion parameter $\alpha$ is unknown, an estimation $\hat{\alpha}$ is calculated as part of the in-control model estimation. Use \verb+alpha=NULL+ to get this estimation. The estimated value $\hat{\alpha}$ is saved in the \verb+survRes+-Object in the \verb+control+-list. Use <>= control=list(range=105:295,alpha=NULL) surv <- algo.glrnb(shadar,control=control) surv$control$alpha @ to get the estimated dispersion parameter for the salmonella data. \item \verb+mu0+ \\ This vector contains the values for $\mu_0$ for each time point in the \verb+range+. If it has the value \verb+NULL+ the observed values with indices 1 to \verb+range+-1 are used to fit a GLM. If there is no knowledge about the in-control parameter, one can use the values before the range to find an seasonal model as in equation \ref{mu0}. \verb+mu0+ is at the moment a list of three argument: \verb+S+ is the number of harmonics to include in the model, \verb+trend+ is Boolean whether a linear trend $\beta_1t$ should be considered. The default is to use the same model of $\mu_0$ for the whole surveillance. An alternative is, to fit a new model after every detected outbreak. If refitting should be done, choose \verb+refit=TRUE+ in the \verb+mu0+ list. In this case, the observed value from time point 1 to the time point of the last alarm are used for estimating a GLM. Then we get a new model after every alarm. In the following example a model with \verb+S+=2 harmonics and no linear trend is fitted for the Salmonella data. The observed cases from the first two years are used for fitting the GLM. <>= control=list(range=105:295,mu0=list(S=2,trend=FALSE)) algo.glrnb(disProgObj=shadar,control=control) @ <>= control=list(range=105:295,mu0=list(S=2,trend=F,refit=T)) surv <- algo.glrnb(disProgObj=shadar,control=control) @ The predicted values for the in-control mean in the range are shown as a dashed line in the following plot. <>= plot(shadar) with(surv$control,lines(mu0~range,lty=2,lwd=4,col=4)) @ The information about the used model is saved in the \verb+survRes+-object, too. <>= surv$control$mu0Model @ The $\mu_0$ model is fitted by a call of the function \verb+estimateGLRNbHook+. Instead of using the standard seasonal negative binomial model from equation \ref{mu0}, one can change the \texttt{R}-code of the function \verb+estimateGLRNbHook+ to get any desired model. The standard code is the following <>= estimateGLRNbHook @ To include own models in the \verb+estimateGLRNbHook+ function, the code of the function has to be changed. In the following code chunk \verb+estimateGLRNbHook+ is modified so that weights are included in the model. \begin{small} \begin{verbatim} estimateGLRPoisHook <- function() { control <- parent.frame()$control p <- parent.frame()$disProgObj$freq range <- parent.frame()$range train <- 1:(range[1]-1) test <- range #Weights of training data - sliding window also possible weights <- exp(-0.3 * ((max(train)-train)) %/% 12) data <- data.frame(y=parent.frame()$disProgObj$observed[train],t=train) formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } m <- eval(substitute(glm(form,family=poisson(),data=data,weights=weights), list(form=as.formula(formula)))) return(list(mod=m,pred=as.numeric(predict(m,newdata=data.frame(t=test), type="response")))) } \end{verbatim} \end{small} Additionally the fitted model from the call of \verb+estimateGLRNbHook+ is saved. The result of a call of \verb+glm.nb+ is in the standard setting an object of class \verb+negbin+ inheriting from class \verb+glm+. So methods as \verb+summary+, \verb+plot+ of \verb+predict+ can be used on this object. If refitting is done, the list of the used models is saved. Use <>= coef(surv$control$mu0Model$fitted[[1]]) @ to get the estimated values of the first (and in case of \verb+refit=FALSE+ only) model for the parameter vector $\beta$ given in (\ref{mu0}). \item \verb+c.ARL+ \\ This is just the threshold $c_{\gamma}$ for the GLR-test (see equation \ref{cusum}). The smaller the value is chosen, the more likely it is to detect an outbreak but on the other hand false alarms can be produced. <>= control=list(range=105:295,alpha=0) surv <- algo.glrnb(disProgObj=shadar,control=control) table(surv$alarm) @ For a choice of $c_{\gamma}$ we get \Sexpr{table(surv$alarm)[2]} alarms. In the following table the results for different choices of the threshold are shown. <>= num <- rep(NA) for (i in 1:6){ num[i] <- table(algo.glrnb(disProgObj=shadar,control=c(control,c.ARL=i))$alarm)[2] } @ \begin{table}[h] \begin{center} \caption{Number of alarms for salmonella hadar data in dependence of c.ARL} \label{c.ARL} \begin{tabular}{l|cccccc} \verb+c.ARL+ & 1 & 2 & 3 & 4 & 5 & 6 \\ \hline no. of alarms & \Sexpr{num[1]} & \Sexpr{num[2]} & \Sexpr{num[3]} & \Sexpr{num[4]} & \Sexpr{num[5]} & \Sexpr{num[6]} \end{tabular} \end{center} \end{table} \item \verb+change+ \\ There are two possibilitys to define an outbreak. The intercept-change is described in Section \ref{sec:glr} and equation \ref{interceptchange}. Use \verb+change="intercept"+ to choose this possibility. The other alternative is the epidemic chart, where an auto-regressive model is used. See \citet{held2005} and \citet{hoehle2008} for more details. A call with \verb+change="epi"+ in the control-settings leads to this alternative. Note that in the epidemic chart not every feature of \verb+algo.glrnb+ is available. \item \verb+theta+ \\ If the change in intercept in the intercept-charts is known in advance, this value can be passed to the function (see Section \ref{sec:glr}). These LR-charts are faster but can lead to inferior results if a wrong value of \verb+theta+ is used compared to the actual out-of-control value (\citet{hoehle2008}). If an increase of 50 percent in cases is common when there is an outbreak which corresponds to a $\kappa$ of $\log(1.5)=0.405$ in equation \ref{interceptchange} use <>= control=list(range=105:295,theta=0.4) algo.glrnb(disProgObj=shadar,control=control) @ If there is no knowledge about this value (which is the usual situation), it is not necessary to specify \verb+theta+. In the GLR-charts, the value for $\kappa$ is calculated by a maximation of the likelihood. Use the call <>= control=list(range=105:295,theta=NULL) algo.glrnb(disProgObj=shadar,control=control) @ in this situation. \item \verb+ret+ \\ The \verb+upperbound+-statistic of a \verb+survRes+-object is usually filled with the LR- or GLR-statistic of equation \ref{cusum}. A small value means, that the in-control-situation is likely, a big value is a hint for an outbreak. If you choose \verb+ret="value"+, the upperbound slot is filled with the GLR-statistic. These values are plotted then, too. The alternative return value is \verb+"cases"+. In this case, the number of cases at time point $n$ that would have been necessary to produce an alarm are computed. The advantage of this option is the easy interpretation. If the actual number of cases is more extreme than the computed one, an alarm is given. With the following call, this is done for the salmonella data. <>= control=list(range=105:295,ret="cases",alpha=0) surv2 <- algo.glrnb(disProgObj=shadar,control=control) @ <>= plot(surv2,startyear=2003) @ Of course, the alarm time points are the same as with \verb+ret="cases"+. \item \verb+dir+ \\ In the surveillance of infectious diseases it is regular to detect an increase in the number of infected persons. This is also the standard setting for \verb+algo.glrnb+. But in other applications it could be of interest to detect a decrease of counts. For this purpose, the \verb+dir+-option is available. If \verb+dir+ is set to \verb+"inc"+, only increases in regard to the in-control mean are taken into account in the likelihood-ratio-statistic. With \verb+dir="dec"+, only decreases are considered. As an example we take the salmonella data again, but know we look at the number of cases that would have been necessary if a decrease should be detected. <>= control=list(range=105:295,ret="cases",dir="dec",alpha=0) surv3 <- algo.glrnb(disProgObj=shadar,control=control) @ <>= plot(surv3,startyear=2003) @ The observed number of cases is below the computed threshold several times in 2005 to 2006 and alarms are given. \item \verb+Mtilde+ and \verb+M+ \\ These parameters are necessary for the so called ''window-limited'' GLR scheme. Here the maximation is not performed for all $1 \leq k \leq n$ but instead only for a window $k \in \{n-M,...,n-\tilde{M}+1 \}$ of values. Note that $1 \leq \tilde{M} \leq M$, where the minimum delay $\tilde{M}$ is the minimal required sample size to obtain a sufficient estimate of $\theta_1=(\mu_0,\kappa)$ ~\citep{hoehle2008}. The advantage of using a window of values instead of all values is the faster computation, but in the setup with intercept-charts and $\theta_1=\kappa$ this doesn't bother much and $\tilde{M}=1$ is sufficient. \end{itemize} \section{Discussion} As seen, the function \verb+algo.glrnb+ allows many possibilities for doing surveillance for a time series of counts. In order to achieve fast computations, the function is implemented in C. An important issue in surveillance is the quality of the used algorithms. This can be measured by the sensitivity and the specificity of the result. The aim of our future work is to provide the possibility for computing the quality and in the next step to include a ROC-approach in order to have a more formal framework for the choice of threshold $c_{\gamma}$. %\include{extensions} %\renewcommand{\bibsection}{\section{REFERENCES}} \bibliography{references} \end{document} surveillance/inst/doc/glrnb.R0000644000176000001440000001351712242645664015771 0ustar ripleyusers### R code from vignette source 'glrnb.Rnw' ################################################### ### code chunk number 1: glrnb.Rnw:64-75 ################################################### library(surveillance) library(xtable) options(SweaveHooks=list(fig=function() par(mar=c(5,4,4,0),cex.axis=1.5,cex.lab=1.5,cex.main=1.5))) options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ################################################### ### code chunk number 2: glrnb.Rnw:112-114 ################################################### getOption("SweaveHooks")[["fig"]]() data(shadar) plot(shadar,main="Number of salmonella hadar cases in Germany 2001-2006") ################################################### ### code chunk number 3: glrnb.Rnw:121-123 ################################################### # Simulate data simData <- sim.pointSource(length=300,K=0.5,r=0.6,p=0.95) ################################################### ### code chunk number 4: glrnb.Rnw:126-127 ################################################### getOption("SweaveHooks")[["fig"]]() plot(simData) ################################################### ### code chunk number 5: glrnb.Rnw:160-162 ################################################### getOption("SweaveHooks")[["fig"]]() survObj <- algo.glrnb(shadar,control=list(range=105:295,alpha=0)) plot(survObj,startyear=2003) ################################################### ### code chunk number 6: glrnb.Rnw:181-184 (eval = FALSE) ################################################### ## control=list(range=range,c.ARL=5, ## mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept",theta=NULL, ## dir=c("inc","dec"),ret=c("cases","value")) ################################################### ### code chunk number 7: glrnb.Rnw:193-195 (eval = FALSE) ################################################### ## control=list(range=105:length(shadar$observed)) ## algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 8: glrnb.Rnw:201-203 (eval = FALSE) ################################################### ## control=list(range=105:295,alpha=3) ## algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 9: glrnb.Rnw:211-214 ################################################### control=list(range=105:295,alpha=NULL) surv <- algo.glrnb(shadar,control=control) surv$control$alpha ################################################### ### code chunk number 10: glrnb.Rnw:225-227 (eval = FALSE) ################################################### ## control=list(range=105:295,mu0=list(S=2,trend=FALSE)) ## algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 11: glrnb.Rnw:230-232 ################################################### control=list(range=105:295,mu0=list(S=2,trend=F,refit=T)) surv <- algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 12: glrnb.Rnw:237-239 ################################################### getOption("SweaveHooks")[["fig"]]() plot(shadar) with(surv$control,lines(mu0~range,lty=2,lwd=4,col=4)) ################################################### ### code chunk number 13: glrnb.Rnw:245-246 (eval = FALSE) ################################################### ## surv$control$mu0Model ################################################### ### code chunk number 14: glrnb.Rnw:251-252 ################################################### estimateGLRNbHook ################################################### ### code chunk number 15: glrnb.Rnw:291-292 ################################################### coef(surv$control$mu0Model$fitted[[1]]) ################################################### ### code chunk number 16: glrnb.Rnw:300-303 ################################################### control=list(range=105:295,alpha=0) surv <- algo.glrnb(disProgObj=shadar,control=control) table(surv$alarm) ################################################### ### code chunk number 17: glrnb.Rnw:308-312 ################################################### num <- rep(NA) for (i in 1:6){ num[i] <- table(algo.glrnb(disProgObj=shadar,control=c(control,c.ARL=i))$alarm)[2] } ################################################### ### code chunk number 18: glrnb.Rnw:337-339 (eval = FALSE) ################################################### ## control=list(range=105:295,theta=0.4) ## algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 19: glrnb.Rnw:344-346 (eval = FALSE) ################################################### ## control=list(range=105:295,theta=NULL) ## algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 20: glrnb.Rnw:354-356 ################################################### control=list(range=105:295,ret="cases",alpha=0) surv2 <- algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 21: glrnb.Rnw:359-360 ################################################### getOption("SweaveHooks")[["fig"]]() plot(surv2,startyear=2003) ################################################### ### code chunk number 22: glrnb.Rnw:370-372 ################################################### control=list(range=105:295,ret="cases",dir="dec",alpha=0) surv3 <- algo.glrnb(disProgObj=shadar,control=control) ################################################### ### code chunk number 23: glrnb.Rnw:375-376 ################################################### getOption("SweaveHooks")[["fig"]]() plot(surv3,startyear=2003) surveillance/inst/doc/surveillance.Rnw0000644000176000001440000007250412242645664017727 0ustar ripleyusers%\VignetteIndexEntry{Getting started with the package} %\VignetteKeywords{getting started} %\VignettePackage{surveillance} %\VignetteDepends{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preabmle parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} % Brug times som font - vigtigt i % pdflatex? %PSTricks \usepackage{pdftricks} \begin{psinputs} \usepackage{pst-all} \end{psinputs} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{epsfig} \usepackage{comment} \newcommand{\surveillance}{\texttt{surveillance}} \usepackage{pdfpages} \title{The R-Package 'surveillance'} \author{ Michael H{\"o}hle\thanks{Author of correspondance: Department of Statistics, University of Munich, Ludwigstr.\ 33, 80539 M{\"u}nchen, Germany, Email: \texttt{hoehle@stat.uni-muenchen.de}}$\>\>$, Andrea Riebler and Michaela Paul\\ Department of Statistics\\ University of Munich\\ Germany } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Put all in another directory \SweaveOpts{prefix.string=figs/vignette} \setkeys{Gin}{width=1\textwidth} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library(surveillance) library(xtable) options(SweaveHooks=list(fig=function() par(mar=c(5,4,4,0),cex.axis=1.5,cex.lab=1.5,cex.main=1.5))) options(width=70) set.seed(1234) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ###################################################################### #Do we need to compute or can we just fetch results ###################################################################### CACHEFILE <- "surveillance-cache.RData" compute <- !file.exists(CACHEFILE) #load computed results if(!compute) load(CACHEFILE) print(paste("Doing computations:", compute)) @ \maketitle %\mbox{}\hrulefill\\ \begin{abstract} \noindent This document gives an introduction to the R-Package 'surveillance' containing tools for outbreak detection in routinely collected surveillance data. The package contains an implementation of the procedures described by~\citet{stroup89}, \citet{farrington96} and the system used at the Robert Koch Institute, Germany. For evaluation purposes, the package contains example data sets and functionality to generate surveillance data by simulation. To compare the algorithms, benchmark numbers like sensitivity, specificity, and detection delay can be computed for a set of time series. Being an open-source package it should be easy to integrate new algorithms; as an example of this process, a simple Bayesian surveillance algorithm is described, implemented and evaluated.\\ \noindent{\bf Keywords:} infectious disease, monitoring, aberrations, outbreak, time series of counts. \end{abstract} {\large Disclaimer}: This vignette reflects package state at version 1.2 and is hence somewhat outdated. New functionality has been added to the package: this includes the \texttt{hhh4}, \texttt{twinSIR} and \texttt{twinstim} modelling and the \texttt{glrnb} outbreak detection. A description of the \texttt{hhh4} modelling can be found in its own vignette \verb+vignette("hhh4")+, \texttt{glrnb} is described in \verb+vignette("glrnb")+. Furthermore, use of the new S4 class \texttt{sts} instead of \texttt{disProg} is encouraged to encapsulate the data. \section{Introduction}\label{sec:intro} Public health authorities have in an attempt to meet the threats of infectious diseases to society created comprehensive mechanisms for the collection of disease data. As a consequence, the abundance of data has demanded the development of automated algorithms for the detection of abnormalities. Typically, such an algorithm monitors a univariate time series of counts using a combination of heuristic methods and statistical modelling. Prominent examples of surveillance algorithms are the work by~\citet{stroup89} and~\citet{farrington96}. A comprehensive survey of outbreak detection methods can be found in~\citep{farrington2003}. The R-package \texttt{surveillance} was written with the aim of providing a test-bench for surveillance algorithms. From the Comprehensive R Archive Network (CRAN) the package can be downloaded together with its source code. It allows users to test new algorithms and compare their results with those of standard surveillance methods. A few real world outbreak datasets are included together with mechanisms for simulating surveillance data. With the package at hand, comparisons like the one described by~\citet{hutwagner2005} should be easy to conduct. The purpose of this document is to illustrate the basic functionality of the package with R-code examples. Section~\ref{sec:data} contains a description of the data format used to store surveillance data, mentions the built-in datasets and illustrates how to create new datasets by simulation. Section~\ref{sec:algo} contains a short description of how to use the surveillance algorithms and illustrate the results. Further information on the individual functions can be found in the on-line documentation of the package, which is also provided in printed form as an Appendix of this document. \section{Surveillance Data}\label{sec:data} Denote by $\{y_t\>;t=1,\ldots,n\}$ the time series of counts representing the surveillance data. Because such data typically are collected on a weekly basis, we shall also use the alternative notation $\{y_{i:j}\}$ with $j=\{1,\ldots,52\}$ being the week number in year $i=\{-b,\ldots,-1,0\}$. That way the years are indexed such that most current year has index zero. For evaluation of the outbreak detection algorithms it is also possible for each week to store -- if known -- whether there was an outbreak that week. The resulting multivariate series $\{(y_t,x_t)\>; t=1,\ldots,n\}$ is in \texttt{surveillance} given by an object of class \texttt{disProg} (disease progress), which is basically a \texttt{list} containing two vectors: the observed number of counts and a boolean vector \texttt{state} indicating whether there was an outbreak that week. A number of time series are contained in the \texttt{data} directory, mainly originating from the SurvStat@RKI database at \href{http://www3.rki.de/SurvStat/}{http://www3.rki.de/SurvStat/} maintained by the Robert Koch Institute, Germany~\citep{survstat}. For example the object \texttt{k1} describes Kryptosporidosis surveillance data for the German federal state Baden-W\"{u}rttemberg 2001-2005. The peak in 2001 is due to an outbreak of Kryptosporidosis among a group of army-soldiers in boot-camp~\citep{bulletin3901}. In \surveillance\ the \texttt{readData} function is used to bring the time series on \texttt{disProg} form. The SurvStat@RKI database at \href{http://www3.rki.de/SurvStat/}{http://www3.rki.de/SurvStat/} maintained by the Robert Koch Institute, Germany, uses a 53 weeks a year format; therefore a conversion with \texttt{correct53to52} is necessary. <>= data(k1) plot(k1,main="Kryptosporidiosis in BW 2001-2005") @ For evaluation purposes it is also of interest to generate surveillance data using simulation. The package contains functionality to generate surveillance data containing point-source like outbreaks, for example with a Salmonella serovar. The model is a Hidden Markov Model (HMM) where a binary state $X_t, t=1,\ldots,n$, denotes whether there was an outbreak and $Y_t$ is the number of observed counts, see Fig.~\ref{fig:hmm}. \begin{figure}[htbp] \centering \begin{pdfpic} \input pst-eps \TeXtoEPS \SpecialCoor \begin{pspicture}(0,0)(10,3) %lower y -2.5 would be better %\psgrid \psset{arrowsize=7pt,arrowinset=0} \rput(1,2.5){\ovalnode{X1}{$X_1$}} \rput(3,2.5){\ovalnode{X2}{$X_2$}} \rput(5,2.5){\ovalnode{X3}{$X_3$}} \rput(6.5,2.5){\ovalnode[linestyle=none]{Xinv1}{}} \rput(7,2.5){$\ldots$} \rput(7.5,2.5){\ovalnode[linestyle=none]{Xinv2}{}} \rput(9,2.5){\ovalnode{Xn}{$X_n$}} \rput(1,0.5){\ovalnode{Y1}{$Y_1$}} \rput(3,0.5){\ovalnode{Y2}{$Y_2$}} \rput(5,0.5){\ovalnode{Y3}{$Y_3$}} \rput(9,0.5){\ovalnode{Yn}{$Y_n$}} \ncline{->}{X1}{X2} \ncline{->}{X2}{X3} \ncline{->}{X3}{Xinv1} \ncline{->}{Xinv2}{Xn} \ncline{->}{X1}{Y1} \ncline{->}{X2}{Y2} \ncline{->}{X3}{Y3} \ncline{->}{Xn}{Yn} \end{pspicture} \endTeXtoEPS \end{pdfpic} \caption{The Hidden Markov Model} \label{fig:hmm} \end{figure} The state $X_t$ is a homogenous Markov chain with the following transition matrix \begin{center} \begin{tabular}{c|cc} $X_t\backslash X_{t+1}$ & 0 & 1\\ \hline $0$ & $p$ & $1 - p$ \\ $1$ & $1 - r$ & $r$ \end{tabular} \end{center} Hence $1-p$ is the probability to switch to an outbreak state and $1-r$ is the probability that $X_t=1$ is followed by $X_{t+1}=1$. Furthermore, the observation $Y_t$ is Poisson-distributed with log-link mean depending on a seasonal effect and time trend, i.e.\ \[ \log \mu_t = A \cdot \sin \, (\omega \cdot (t + \varphi)) + \alpha + \beta t. \] In case of an outbreak $(X_t=1)$ the mean increases with a value of $K$, altogether \begin{equation}\label{eq:hmm} Y_t \sim \operatorname{Po}(\mu_t + K \cdot X_t). \end{equation} The model in (\ref{eq:hmm}) corresponds to a single-source, common-vehicle outbreak, where the length of an outbreak is controlled by the transition probability $r$. The daily numbers of outbreak-cases are simply independently Poisson distributed with mean $K$. A physiologically better motivated alternative could be to operate with a stochastic incubation time (e.g.\ log-normal or gamma distributed) for each individual exposed to the source, which results in a temporal diffusion of the peak. The advantage of (\ref{eq:hmm}) is that estimation can be done by a generalized linear model (GLM) using $X_t$ as covariate and that it allows for an easy definition of a correctly identified outbreak: each $X_t=1$ has to be identified. More advanced setups would require more involved definitions of an outbreak, e.g.\ as a connected series of time instances, where the number of outbreak cases is greater than zero. Care is then required in defining what a correctly identified outbreak for time-wise overlapping outbreaks means. In \surveillance\ the function \verb+sim.pointSource+ is used to simulate such a point-source epidemic; the result is an object of class \verb+disProg+. \label{ex:sts} <>= sts <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) plot(sts) @ \section{Surveillance Algorithms}\label{sec:algo} Surveillance data often exhibit strong seasonality, therefore most surveillance algorithms only use a set of so called \emph{reference values} as basis for drawing conclusions. Let $y_{0:t}$ be the number of cases of the current week (denoted week $t$ in year $0$), $b$ the number of years to go back in time and $w$ the number of weeks around $t$ to include from those previous years. For the year zero we use $w_0$ as the number of previous weeks to include -- typically $w_0=w$. Altogether the set of reference values is thus defined to be \[ R(w,w_0,b) = \left(\bigcup\limits_{i=1}^b\bigcup\limits_{j=\,-w}^w y_{-i:t+j}\right) \cup \left(\bigcup_{k=-w_0}^{-1} y_{0:t+k}\right) \] Note that the number of cases of the current week is not part of $R(w,w_0,b)$. A surveillance algorithm is a procedure using the reference values to create a prediction $\hat{y}_{0:t}$ for the current week. This prediction is then compared with the observed $y_{0:t}$: if the observed number of cases is much higher than the predicted number, the current week is flagged for further investigations. In order to do surveillance for time $0:t$ an important concern is the choice of $b$ and $w$. Values as far back as time $-b:t-w$ contribute to $R(w,w_0,b)$ and thus have to exist in the observed time series. Currently, we have implemented four different type of algorithms in \surveillance. The Centers for Disease Control and Prevention (CDC) method~\citep{stroup89}, the Communicable Disease Surveillance Centre (CDSC) method~\citep{farrington96}, the method used at the Robert Koch Institute (RKI), Germany~\citep{altmann2003}, and a Bayesian approach documented in~\citet{riebler2004}. A detailed description of each method is beyond the scope of this note, but to give an idea of the framework the Bayesian approach developed in~\citet{riebler2004} is presented: Within a Bayesian framework, quantiles of the predictive posterior distribution are used as a measure for defining alarm thresholds. The model assumes that the reference values are identically and independently Poisson distributed with parameter $\lambda$ and a Gamma-distribution is used as Prior distribution for $\lambda$. The reference values are defined to be $R_{\text{Bayes}}= R(w,w_0,b) = \{y_1, \ldots, y_{n}\}$ and $y_{0:t}$ is the value we are trying to predict. Thus, $\lambda \sim \text{Ga}(\alpha, \beta)$ and $y_i|\lambda \sim \text{Po}(\lambda)$, $i = 1,\ldots,{n}$. Standard derivations show that the posterior distribution is \begin{equation*} \lambda|y_1, \ldots, y_{n} \sim \text{Ga}(\alpha + \sum_{i=1}^{n} y_i, \beta + n). \end{equation*} Computing the predictive distribution \begin{equation*} f(y_{0:t}|y_1,\ldots,y_{n}) = \int\limits^\infty_0{f(y_{0:t}|\lambda)\, f(\lambda|y_1,\ldots,y_{n})}\, d\lambda \end{equation*} we get the Poisson-Gamma-distribution \begin{equation*} y_{0:t}|y_1,\ldots,y_{n} \sim \text{PoGa}(\alpha + \sum_{i=1}^{n} y_i, \beta + n), \end{equation*} which is a generalization of the negative Binomial distribution, i.e.\ \[ y_{0:t}|y_1,\ldots,y_{n} \sim \text{NegBin}(\alpha + \sum_{i=1}^{n} y_i, \tfrac{\beta + n}{\beta + n + 1}). \] Using the Jeffrey's Prior $\text{Ga}(\tfrac{1}{2}, 0)$ as non-informative Prior distribution for $\lambda$ the parameters of the negative Binomial distribution are \begin{align*} \alpha + \sum_{i=1}^{n} y_i &= \frac{1}{2} + \sum_{y_{i:j} \in R_{\text{Bayes}}}\!\! y_{i:j} \quad % \intertext{and} \quad\text{and}\quad \frac{\beta + n}{\beta + n + 1} = \frac{|R_{\text{Bayes}}|}{|R_{\text{Bayes}}| + 1}. \end{align*} Using a quantile-parameter $\alpha$, the smallest value $y_\alpha$ is computed, so that \begin{equation*} P(y \leq y_\alpha) \geq 1-\alpha. \end{equation*} Now \begin{equation*} A_{0:t} = I(y_{0:t} \geq y_\alpha), \end{equation*} i.e. if $y_{0:t}\geq y_\alpha$ the current week is flagged as an alarm. As an example, the \verb+Bayes1+ method uses the last six weeks as reference values, i.e.\ $R(w,w_0,b)=(6,6,0)$, and is applied to the \texttt{k1} dataset with $\alpha=0.01$ as follows. <>= k1.b660 <- algo.bayes(k1, control = list(range = 27:192,b=0,w=6,alpha=0.01)) plot(k1.b660, disease="k1", firstweek = 1, startyear = 2001) @ Several extensions of this simple Bayesian approach are imaginable, for example the inane over-dispersion of the data could be modeled by using a negative-binomial distribution, time trends and mechanisms to correct for past outbreaks could be integrated, but all at the cost of non-standard inference for the predictive distribution. Here simulation based methods like Markov Chain Monte Carlo or heuristic approximations have to be used to obtain the required alarm thresholds. In general, the \verb+surveillance+ package makes it easy to add additional algorithms -- also those not based on reference values -- by using the existing implementations as starting point. The following call uses the CDC and Farrington procedure on the simulated time series \verb+sts+ from page~\pageref{ex:sts}. Note that the CDC procedure operates with four-week aggregated data -- to better compare the upper bound value, the aggregated number of counts for each week are shown as circles in the plot. <>= cntrl <- list(range=300:400,m=1,w=3,b=5,alpha=0.01) sts.cdc <- algo.cdc(sts, control = cntrl) sts.farrington <- algo.farrington(sts, control = cntrl) @ <>= if (compute) { <> } @ <>= par(mfcol=c(1,2)) plot(sts.cdc, legend.opts=NULL) plot(sts.farrington, legend.opts=NULL) @ Typically, one is interested in evaluating the performance of the various surveillance algorithms. An easy way is to look at the sensitivity and specificity of the procedure -- a correct identification of an outbreak is defined as follows: if the algorithm raises an alarm for time $t$, i.e.\ $A_t=1$ and $X_t=1$ we have a correct classification, if $A_t=1$ and $X_t=0$ we have a false-positive, etc. In case of more involved outbreak models, where an outbreak lasts for more than one week, a correct identification could be if at least one of the outbreak weeks is correctly identified, see e.g.\ \citet{hutwagner2005}. To compute various performance scores the function \verb+algo.quality+ can be used on a \verb+SurvRes+ object. <<>>= print(algo.quality(k1.b660)) @ This computes the number of false positives, true negatives, false negatives, the sensitivity and the specificity. Furthermore, \texttt{dist} is defined as \[ \sqrt{(Spec-1)^2 + (Sens - 1)^2}, \] that is the distance to the optimal point $(1,1)$, which serves as a heuristic way of combining sensitivity and specificity into a single score. Of course, weighted versions are also imaginable. Finally, \texttt{lag} is the average number of weeks between the first of a consecutive number of $X_t=1$'s (i.e.\ an outbreak) and the first alarm raised by the algorithm. To compare the results of several algorithms on a single time series we declare a list of control objects -- each containing the name and settings of the algorithm we want to apply to the data. <>= control = list( list(funcName = "rki1"), list(funcName = "rki2"), list(funcName = "rki3"), list(funcName = "bayes1"), list(funcName = "bayes2"), list(funcName = "bayes3"), list(funcName = "cdc",alpha=0.05), list(funcName = "farrington",alpha=0.05)) control <- lapply(control,function(ctrl) { ctrl$range <- 300:400;return(ctrl)}) @ % In the above, \texttt{rki1}, \texttt{rki2} and \texttt{rki3} are three methods with reference values $R_\text{rki1}(6,6,0)$, $R_\text{rki2}(6,6,1)$ and $R_\text{rki3}(4,0,2)$ all called with $\alpha=0.05$. The methods \texttt{bayes1}-\texttt{bayes3} is the Bayesian algorithm using the same setup of reference values. The CDC Method is special, since it operates on aggregated four-week blocks. To make everything comparable a common $\alpha=0.05$ level is used for all algorithms. All algorithms in \texttt{control} are applied to \texttt{sts} using: <>= algo.compare(algo.call(sts,control=control)) @ <>= if (compute) { acall <- algo.call(sts,control=control) } algo.compare(acall) @ %res <- algo.compare(algo.call(sts,control=control)) %xtable(res,digits=c(0,0,0,0,0,2,2,2,2)) A test on a set of time series can be done as follows. Firstly, a list containing 10 simulated time series is created. Secondly, all the algorithms specified in the \texttt{control} object are applied to each series. Finally the results for the 10 series are combined in one result matrix. <>= #Create 10 series ten <- lapply(1:10,function(x) { sim.pointSource(p = 0.975, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7)}) @ <>= #Do surveillance on all 10, get results as list ten.surv <- lapply(ten,function(ts) { algo.compare(algo.call(ts,control=control)) }) @ <>= if (compute) { <> } @ <>= #Average results algo.summary(ten.surv) @ <>= res <- algo.summary(ten.surv) res[,5:8] <- round(res[,5:8]*100)/100 res @ %xtable(algo.summary(ten.surv),digits=c(0,0,0,0,0,2,2,2,2)) A similar procedure can be applied when evaluating the 14 surveillance series drawn from SurvStat@RKI~\citep{survstat}. A problem is however, that the series after conversion to 52 weeks/year are of length 209 weeks. This is insufficient to apply e.g.\ the CDC algorithm. To conduct the comparison on as large a dataset as possible the following trick is used: The function \texttt{enlargeData} replicates the requested \texttt{range} and inserts it before the original data, after which the evaluation can be done on all 209 values. <>= #Update range in each - cyclic continuation range = (2*4*52) + 1:length(k1$observed) control <- lapply(control,function(cntrl) { cntrl$range=range;return(cntrl)}) #Outbreaks outbrks <- c("m1", "m2", "m3", "m4", "m5", "q1_nrwh", "q2", "s1", "s2", "s3", "k1", "n1", "n2", "h1_nrwrp") #Load and enlarge data. outbrks <- lapply(outbrks,function(name) { #Load with data eval(substitute(data(name),list(name=name))) enlargeData(get(name),range=1:(4*52),times=2) }) #Apply function to one one.survstat.surv <- function(outbrk) { algo.compare(algo.call(outbrk,control=control)) } @ <>= algo.summary(lapply(outbrks,one.survstat.surv)) @ <>= if (compute) { res.survstat <- algo.summary(lapply(outbrks,one.survstat.surv)) } print(res.survstat,digits=3) @ In both this study and the earlier simulation study the Bayesian approach seems to do quite well. However, the extent of the comparisons do not make allowance for any more supported statements. Consult the work of~\citet{riebler2004} for a more thorough comparision using simulation studies. \section{Multivariate surveillance} As of version 0.9-2 \surveillance\ supports the visualization of multivariate time series of counts. An (multivariate) object of class \texttt{disProg} contains matrices with the observed number of counts and the respective state chains, where each column represents an individual time series. Additional elements of the \texttt{disProg}-object are a neighbourhood matrix and a matrix with population counts. However, only modelling of the time series as by~\citet{held2005} is currently available. In the near future the surveillance algorithms will also be extended to handle these multivariate data. For example, consider the weekly counts of new measles cases for each ``Kreis'' (area) of the administrative district ``Weser-Ems'' in Lower Saxony, Germany, in 2001 and 2002~\citep{survstat}. Figure~\ref{fig:map} shows a map of the $m=15$ areas. The corresponding $m \times m$ neighbourhood matrix has elements 1 if two areas share a common border and is 0 otherwise. \begin{figure}[htb] \centering \includegraphics[width=0.5\textwidth]{map-weserems} \caption{Map of the administrative district ``Weser-Ems''} \label{fig:map} \end{figure} In the package \texttt{surveillance} the measles data are already available in the form of a \texttt{disProg}-object. <>= data(measles.weser) plot(measles.weser, title="measles in Weser-Ems 2001-2002", xaxis.years=TRUE, startyear= 2001, firstweek=1) @ The number of counts for each area can also be looked at and plotted as individual time series. Here, the x-axis is the week number since 1st of January 2001 and the y-axis is the number of measles cases. <>= plot(measles.weser,as.one=FALSE,xaxis.years=FALSE) @ \vspace{1em} The data are analysed using the model proposed by \citet{held2005}. A call to the function \texttt{algo.hhh} fits a Poisson or negative binomial model with mean \[ \mu_{it} = \lambda y_{i,t-1} + \phi \sum_{j \sim i} y_{j,t-1} + n_{it} \nu_{it}\, , \quad i=1,\ldots,m, \, t=1,\ldots,n \, , \] where $j \sim i$ denotes all neighbours of $i$, to a multivariate time series of counts. It is estimated by maximum likelihood using numerical optimization methods. The $n_{it}$ are standardized population counts and $\log \nu_{it} = \alpha_i + \beta t + \sum_{s=1}^{S}\big(\gamma_s sin(\omega_s t) + \delta_s cos(\omega_s t)\big)$ with Fourier frequencies $\omega_s$. <>= ##################################################### # measles if(compute){ # algo.hhh cntrl <- list(linear=TRUE, nseason=1, neighbours=FALSE, negbin="single", lambda=TRUE) measles.hhh.neF <- algo.hhh(measles.weser,control=cntrl) cntrl$neighbours <- TRUE measles.hhh <-algo.hhh(measles.weser,cntrl) # algo.hhh.grid grid <- create.grid(measles.weser, cntrl, params=list(endemic=c(lower=-0.5, upper=0.5, length=3), epidemic=c(0.1,0.9,5), negbin=c(0.3,12,5))) cat("running a grid search for up to 900 seconds.\n") measles.hhh.grid <- algo.hhh.grid(measles.weser, control=cntrl, thetastartMatrix=grid, maxTime=900) } @ For the weekly measles data $\omega_s=2s\pi/52$ (i.e.\ \texttt{period}=52). In the following, the model specified in \texttt{cntrl} is fitted to the data. The counts are assumed to be negative binomial distributed with mean $\mu_{it}$ and variance $\mu_{it} +\mu_{it}^2/\psi$. A linear time trend $\beta$, seasonal parameters $\gamma_1$ and $\beta_1$ (i.e.\ $S=1$) as well as the autoregressive parameters $\lambda$ and $\phi$ are included to specify the mean. All in all, there are %21 parameters to be estimated. $2S+m+4$ parameters to be estimated for the negative binomial model. In case of a Poisson model, the number of parameters reduces by one as the overdispersion parameter $\psi$ is omitted. <>= cntrl <- list(linear=TRUE, nseason=1, neighbours=TRUE, negbin="single", lambda=TRUE) measles.hhh <- algo.hhh(measles.weser,control=cntrl) @ Depending on the inital values for the parameters, the optimization algorithm might not converge or only find a local maximum as the parameter space is high-dimensional. It is therefore reasonable to try multiple starting values. The function \texttt{create.grid} takes a \texttt{list} with elements in the form of \texttt{param = c(lower,upper,length)} to create a matrix of starting values. For each parameter a sequence of length \texttt{length} from \texttt{lower} to \texttt{upper} is built and the resulting grid contains all combinations of these parameter values. A call to \texttt{algo.hhh.grid} conducts a grid search until either all starting values are used or a time limit \texttt{maxTime} (in seconds) is exceeded. The result with the highest likelihood is returned. %algo.hhh.grid <>= grid <- create.grid(measles.weser, cntrl, params = list(endemic = c(lower = -0.5, upper = 0.5, length = 3), epidemic = c(0.1, 0.9, 5), negbin = c(0.3,12,5))) algo.hhh.grid(measles.weser, control=cntrl, thetastartMatrix=grid, maxTime=900) @ <>= print(measles.hhh.grid,3) @ <>= if (compute) { # save computed results save(list=c("sts.cdc","sts.farrington","acall","res","res.survstat", "control","ten.surv",ls(pattern="measles")), file=CACHEFILE) tools::resaveRdaFiles(CACHEFILE) } @ \section{Discussion and Future work} Many extensions and additions are imaginable to improve the package. For now, the package is intended as an academic tool providing a test-bench for integrating new surveillance algorithms. Because all algorithms are implemented in R, performance has not been an issue. Especially the current implementation of the Farrington Procedure is rather slow and would benefit from an optimization possible with fragments written in C. One important improvement would be to provide more involved mechanisms for the simulation of epidemics. In particular it would be interesting to include multi-day outbreaks originating from single-source exposure, but with delay due to varying incubation time~\citep{hutwagner2005} or SEIR-like epidemics~\citep{andersson2000}. However, defining what is meant by a correct outbreak identification, especially in the case of overlapping outbreaks, creates new challenges which have to be met. \section{Acknowledgements} We are grateful to K.\ Stark and D.\ Altmann, RKI, Germany, for discussions and information on the surveillance methods used by the RKI. Our thanks to C.\ Lang, University of Munich, for his work on the R--implementation and M. Kobl, T. Schuster and M. Rossman, University of Munich, for their initial work on gathering the outbreak data from SurvStat@RKI. The research was conducted with financial support from the Collaborative Research Centre SFB 386 funded by the German research foundation (DFG). %\renewcommand{\bibsection}{\section{REFERENCES}} \bibliography{references} \end{document} surveillance/inst/doc/hhh4-cache.RData0000644000176000001440000000604212242645664017346 0ustar ripleyusersXy85EQDS2L1Ťk.ޫ4ZM*͍PMhRҼ l]kZ.-go=O9ϻ|j(U@ DIbH$ Iҵ2$$ɓԇ>//Kج~"A$HڍAg3L24ٝ:aphȍFi,#ŏ)']i!Aq0cF;y|gLW:A?Vl6 VvHV]^&ۋ2 >b{{]߯ju*s=jkp;^ZRVXK 毌{ِ(H35utih@J`mȴp~Ū_S{RA8|YW*L;gMkydךH6rhM9' Shc6ˏG!2C!>8;vL]1YˤhS(d1 w:Yw6[c:z>aB6XC ?1X_wxW:z函Q۝I|>yrXl ͕=Tlfu5V1 ~BD%_k}'Fi.tJ}g\ Vtay0‰Հִ q7l/豷# ZG.FOVzOZm{_ɷbnѵ_.lqX3kJZAy# V<+Gr<<2r_C;LlCC|1.ndZOh_W·FK-Eu +)-u'#k5Gᾠp,dl}=$t(G]QAB-nn{ ّfVǗnnݼn\ 9s8*$LvwRlGH f1ؙkMa*ق/D6odmbwITo7򫅡 ةwL ͱ:WNr{h2{T-m uM'7B[O3+ʓcm5+1odk^ﶶB}- sr>t]Yפ)7-5x-`y, vz݉O#JlhS{ ז*AR^pWL?f[cW'@g,x$5$&훺uws/ۀM5Pf+4~˯ͽ)d!GT&oYt=rhؾng}#C ueխuZ4&%̓AX ۔vZ,#RNh]Y7oUGZAֶӖ P`3(ֻBP~M]H QŌg|Uy.wh|oA3EKynS_MF& )<\Ȼx@-b䧺I.:_JrbVr2vvQ]=U/i`K^&:-#^mr/Wbu=B@:5jy+nOIg˨SmR9m2>z;Wt/;^ 7ƅV= 1|b~d\+!UUBɲ +Wa|'%~gPaXmJk,IFb[3P&|x=};ҷ{腽9ܩߣ.R%>Py:T7;[ /|1g(_t%KhxDz+jhpH9PV}5J/ohcyS:MD1Sr Nz 5;I TuJU̶{M4`(ge<3X/r,?\KƦ_ 2( 4{1)X~JfM윥'S.Q'QNx? zGVVсgrQBW JO?џ~:yB4Q-TE Py>E N]GnY:1*RbY'A՜EX,܈՜9xg1 {W)v8M%B=^5t),|p$tH`gOa_bJfRtIK|͙XpW5dmt LaauL[Vݏd9 Ps$XW:f O2<)vv|/XkŅhgu2};|beEi-LĨKڋ-QX,w[18[mf/⌄,~FE Q5_Cr PkKQym~\99ݥ璞VC-W `uY=%Iފ9OǕ_v2[ *z .5SML7v *86ݒ#xI9.Cլ=ko| =pl@ǃR 8ʼ$Exf@'7:P*}@R=+RĖmJvJZ[B!IҵfuarJ$'o n_p)0{MF? Ζ>ˏC2[ZAs{T&c4x\Ś ?`lr ths3nFXC3~?g n IvIP&g5G GfGt) DѵN*9>JOb % :4I[MMBhpɻqG<~|&KRKBtFQQRݩ/c2='L;Ph#W^qJدIXOXd7+kEG/mhlAJ6B]\$KY_1T쵘fj?(oT RI*8{(Y5.JY#$ @#surveillance/inst/doc/surveillance.pdf0000644000176000001440000126132012242645664017727 0ustar ripleyusers%PDF-1.5 % 39 0 obj << /Length 2670 /Filter /FlateDecode >> stream xڝrF@`Fh\=N& "Y_2>om6(Nr [g2ɒ7WWW/^ubk[W&)3TUf``l_?Mo,Ӷ3--iA>G_!=z݋yXks9=/rSz?iA~.7H\nr'snxh"K!2:3G癩amiBvϲb I2WyEzPƖ܁:Ň*}D 3GrbG+el^"] 4N.Ϝ`= ?1S1w*f7zaɥL=CՀz#:6 4n/2r-*YZf(JWk}a4gNwAċr` Ɵy+ 냩)Z#+&1N[^e%s:f,v,]xO>(>w 3.GÔC'|_9{*qAwAcwF2x&3Ļͥ!] \gJU'TԾV2.o5-/*v" =$ӑ =pp8 1>rYINQEv9R-J\限~yypOzigƋ }CHaY>(%ĥ#oƶCbЗ&E6Sam6}208(<oqۧZ)%wkoJߨW優5ϧV&+ ]q$ f -n&`;hy~2 9qMR#rĆbd`V.Aй@,Ãa˙*?/Bm#jmk\UM8Qz3KG%v`]ZE\X wuq?ARJZ#tvɬ)@{f'$eI4%H 3!h_ҧҔ!pƕAܜ7/6jbD(xSH)QR)lVWx$8sWQڃ)fZ)SsP_ > 8eɂ7Xl{BNTys!w&.,Q ?d&CX8r@5LvToI= ɠ'vcRH͸թeI3ѤVjT52>ťZu4eŞL閐Q7X:\X,~O#ւ=R: EJP*5$m0зq ;2in5)jsc{*G=n.% 5qm]]t +tioU]C3H.sGksgB:GXҧQ oo~B:iV-8I,Y$plI>-,) D&yw_[0 Q2' JZXYx=xw$;mJ%'lKmڣ:\7,N;?腊?Clw*LRpM92XHX9t)2Oxd㰅S@!,-@ AR M ӹohz }WۿXo..R&dJz}aiOzL4 . z endstream endobj 67 0 obj << /Length 3519 /Filter /FlateDecode >> stream xڭ]=bZ'.(MҴAq@>hmym-,IJ6wA`K"Crg*7<͏*&kUש3Ί4:O%^'v;l8\ϊl_{!~k! !3G:~_t2ߝLVH;;lt۴,ЍXq8r.2G4t83vdﴃ@Gx]I8Zҷ:n!qQ/38cl밖6uV2(5$(w B*E& @m62Hz=+ConqmFWJUђ{b4"ȯ͙#Y0..v ψBy{C#u_h[~ 5GY"K{rU @bwSn4/[AEw#@;x55 + " 33'ޞk?ps\G+y{[[MZK DepATYkX^dïQ G3AgUU%.$xn2ikΫqYHغLϐiÁo~lʱɭ˴0l >!,ŔM xmylȲiW^ w`0Ef^l#GYkvGfyU&SX#yƙ0q72N߿F]n8"2Bi=RNͩ9A>,w]4'hm jT35UgDHk-YR v!~I?NxalJiȲ7k䮛.y(D4`@!e6DDȂ]aϲ rbBrPNB#1c0}L+ rVs?c2F7!.G(\AVwƮ9šA8] 5{}\IA0&ZyJ=/Vh5.6 5۪T"6U>~{"y33^ƨ@DD> \hb4)7_;e=@MxjHz>|A}Szcg'M)X" In'V"f;q}>=t;h!}Ld{U^ g _ yCf}6:c|?hҏ KR2KMR "-@nBp:mLli.P|6o66Y:`Sv 8 < ]r~GŏZr.F1kMQn SBj!_&|: hQ<`ŚىE8ɤsFhs|GF{uGiV2cp8hi-"`皐檅"簷(r-zh5M: $E"ONMrY&m7٪'5K20^SHT47qR_ T>2sVѼ1`6ڳC&>xފ7Ksלgkt(ѩL15ؠ{s>Zs|!Ycv +Nc}tlo2=5ӽ>RU{RVn ~RW5pQŢbH~A`AkLCz8Ѭ yҝh,4V{Y2IEJ]IRt=)b蛽hK\!u{=INW,NJ|ƞQU=X45n&^ÃL>Tܧm]25yJ &74377h 3<"$+_*ԔؐC qtiBhoqi^YG>N8@; endstream endobj 84 0 obj << /Length 2308 /Filter /FlateDecode >> stream xڵY[o~`R s"EhInJeVyob|ɶ0(rngܾsX&D&?H]()*Y2Q.BZKΗ/Lkx,3K5vAZ݊;pql]f72?NUpө~M'xJWt–5K¯e+ܛ||O ?xD<(Q&G_;7&iǢ?8C1ZآaɃaQλ>=,Dži 3(d?ȢHD)M; .C9G-O}ЬPҒӅGOF/!"Mz`S>e NUW,_%9!p j|a l[҆vszC͟=O]u|3جUΐCj[TP@RqS7@yv1%7VY潏ӽ!qeAi.007W,a\@5-Ng$!{A)%@SUJc{Cq ~los(DaɃxLڀ0Ä|cؼ Y޼_H9}LG4K̡q?=ԁiqy@A"._&}T v+  ȧf98aэQ/Qa=_1kQр@psF) pѤ")B t}6RT,qXDZi 7XfHeaߗ3Š!)>n$u>OÂsT@"O*-J d2)X{햼t\aԻʂM{KNeu\-G-+y/(uknb L%9uPrr}lXMCBDCu%\)!D@bMS>F ]TMyaMIoL1O7R@cԧzU]qخK7=u$v=WO?Ek2wpŅ<ȼ[48'eobCā]_XZG&m;>YL" TV߇ "qۆ/`wph\!+5wND&ODSDTóK!! CFM}h?J2V(D[ YԿ&Uх42~y3OTaUZQz:NҁgY!<7fDRNMyWx]@+˾ 2IPֹz endstream endobj 78 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette-002.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 89 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 90 0 R/F3 91 0 R>> /ExtGState << >>/ColorSpace << /sRGB 92 0 R >>>> /Length 4490 /Filter /FlateDecode >> stream xMFSxٽ6PQ-@,:P Iguݪ甪3ybA⪲}z>;[~}ꇡ;_nF~~iK=eѣU~n辒\ 9ܝ[]P\arTt{ta쏱Yɳzoˏs4|^4&c7Sڏ`;08,ԟW0o1o{g嗥`Q+&Q׭`PF3t+5#wp?I{q`|;O_`t$.s'0&]?0I@s?$[L$1LD\aLj:e'F9I:3&KfmjIȲ<4_WI/u d |>2o'7:% <3wp^ydNMzE pA?Jx"pWꚁ@i.$}6`_`0(_ }PG?b+~޿C LJu'O]20IK(a-:WO@tN0YF`'o`Ѡ3Il@: ?}L ,3Im5HIb5ALVQ gj r~ FMQ g^bL`=1zf gހF5I«hѬ !Ұ Q 'O״3KMk>KЏY,KUOo>IF_,~j>}פٓ+f,ٓd'Iw$! g޾f',}|4A$id5A$i``|O~H$0p3țI3`xy3K3Yj:Wg6sO,eԙ$ƴ $<7i;qԜ3I$I g>ך yf h׏Yz}Lj3KW $?1xf5A$i?%]'g]sO$_0w4I2 vfY]C,׌3N B~눩+N柘95A#gkBa|ș%F,/H$0q3HYz pf ?$ OCMo7 },+/Y/^+;c%#ׯ mC_;Mh8G gހF4HI,#FN뢁!Fid;"'I7$ 9I`$id50(0rf4$_0r4I2爑d`|Qb$y_tɧo}H/uuoI2ӳ=YgVկ}'/?|/~w߾{MoiO7/NrVkȫޅ7_š'P;Su_z_wn^_N`q]q:QGk:_!k:y-\4E5q&uP|ڸp^k:|!{o:GuhGCעuZ+h:0MZG8Ei&Cפu>@5i&Cפuڴkh:yhqp-\8Ep5q~k:yM\囸ׁׁup}MZG85qwCעu*h:`k:5qu^|k:/xF&suZh:qM\8h66i&ׁuZp4Z8ڸ u~ pM\WaGg&sZqpM\8|:۸pסߢup\k:,ߦuʚp^ yJ>q~ {J6&ڴq^8k:yhk:o:o=u7q༏o:yׁׁ׹u:9qpOp&#uށ6#up[yڸp^ AMZG8렁&#o\N]+9I`Kjon LA&ӦX0MM<$i%a7XIRhSDA*$Λr'IM)x8p5OMēyS.O ܛzsY⽉ v R2)<- / R3)D- 1Kx[ IajK5H̤@5_K ͤP5\»ނTL WK9&H䪎8YCJL.>\| 3qJgR3LΤFk Ң;߂09'kLZ*Lj |ə\| 341H>| L Y+#\3q{HLj$|љ\| 3)h<+v&r Τfk̇oA\?3q;1J3av&5[c}ٙlQ-3@fgRZYC<:gx-3qL ]\3q{@L'mgr  R478b˽ &NUAa&NrDФ6Fh-@MIAlT14 \Ց E1T> M &MjP|)Ԕp 0T> M.>)ԔZ1T3va&5ec}l GP- .S4)C5a\hRS6j#ec}l GP|)Ԕp 0T> Ra4qΖ{@M$&r1=`&> H'm ҤH\Ց JKx+\I Ea& U R4wp\TЍ[qS\jr AI ݘ0T1c33ۧMqAI ݘЍ[ 1c3DPMjƌ|nGƌ-).C5@jRC7fl#tcf0T1c336aS\jr A0Ta&PMjƌ|nآ0Ta&g~Eդn ]qA*&c&RIݘEa&rդ`8x-W| IMޘ9ޘEs61g>7l#xcf>7l'Ɯ|o٢O9ޘ9[ 1g3s61g/v7{M6.nH3ۦvG<&vVO>.~FW@,|Y~_4>Yo'YUD~˲|t6>~Y/}t_zeY|Z:Svi{ ^МO{0['ۥxh߬g?U3Ӗ#"Ah4>Ƨ犾]Bi}x݋>5R _6{#~z׽$Q cGߣ{?O%^qğ*%y'4HŘOsnǺ4kM~sS]C~¶ŐxWy_-VvAo7]Zˋ=?h}??ef@^0q>YioмC|-E#&`w;X;351kߏxFxvn7v?5YG뺿?l~oOebWf endstream endobj 94 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 98 0 obj << /Length 2451 /Filter /FlateDecode >> stream xڭio>RrymxAN hhY}]>sz!kٹgdY|ygOw?T kvqL+W-JS&reyra\2ٶ0=,=*x eE򱿈2<-sw}D`e&YՔMA09D,E{!lAkk߲AI.lnH:Pfxi~dAptE8KtS9;t#V)]C>suʁP[ܓr Tvy.$cx{O5B$prE*`1z2-S _MK~mϞyx3ܥB漠qk[яc$̺G 0$cSGfM5({͖U@*FdSL5a fVL.d/3ߠ'yE\5=d 󐊓A!_`mΌ(~e|pλ*K: /ʴ. AԩxBCeUi^B#7=%r!$U˃QhP#/=^g[@ռ8ԣ$*)fX xO|sZsٜQYTET.:u*JeX/u`U%^1gnTakPs%@=4' ?#^ɪ}zn_z{(q\ViJ$ H)T;OS4rB5&)ƈ 쮑 mg4i jŠ)9yYLMQߌ+ZP?M`dH! ɨchf8a4LL/UBrgb^HyF(`g$p]:vՑn*tO^@PșoihGڢz˄@3M6I/@C-)fYf '@{ УU endstream endobj 95 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette-003.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 101 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 102 0 R>> /ExtGState << >>/ColorSpace << /sRGB 103 0 R >>>> /Length 8386 /Filter /FlateDecode >> stream xŝKqWrfrMn%؆X\{!haK#@S̨s}KhkadEMTF .9l}YzdopIڃQ$g9SMrx_&}ϣ5PopXνm j8cy~XRMrx_&y/jouѤ4Xwqa]D~߸KPON]4Gs;u$4wI&;KJ 9%bh .4VopIɰᒒ%2MJ]m\WIiMJ{$:Y$n{ݤ4MJ xI>]A$$n.doxIo7ɻ&'vE-$Ծ xInp m->XI8XIXI:Vc`k=郬mRlmTXwqIPIi0MұA6)V܇mNm䛱NmtJsۤ4X&m$gۤd&ymRlnWm\6]#O6I֜϶Eagsu s"A6) f6_&Xc"my[db&u`k7) VvX6],[$ٖhMP/$&nR2,&ټ&n3lqw;6uѤ4Mf⻘INl&yfxIaol]$c:Mru`k7)f6_MJ8Ia9$eXA3ۤ$X&@-Ia&ɕ0Mr u@6du&6E#$p.$W]\wIPIދ:wMpsڤtMu~s]\dl\&nb&>e/m-Y!n 8Fq6M(e&!KLJYfR24-.D,D3 $ 6J4-. LJYf.M LhGYf<( L҅ee!<5X&be!+>:4muh&y'&Yf.$LJYf̲$-fYfruh&hϲ$,Lt-ͤ4uh& u[dI>,D3)d!I>gWYf3$* LH$[wh&9& Lr Dͤ Llm$. Lr,D3) d!Ii LJ $g8d!uh&%C3%$!LR!LJY&eII D,C3 YfO LA$_,C3IGYfzeIދQ$W,C3) dIn024\$LJYfR24҅,C3524tϲ $Y)qWIA,C35. $׸24|B- $"LN $,C3suh&%C3)5:4J 9 8 7x-:T}/):Ӹ33z~̵jbC>ܧ_\>fԯ 3kJ\K4zϷS5QA`>]v-KijC\j{IdL5fp5;K~\ ?j US)8Wկ)MދSpJN*!aKA`*EZT)8]կJO>k)>| r ϰ Tp+ 93l)(*8fE9sV֯ pTpЪP NZ/TpҀR [Q/Si^TpܪP [Q9\=M3l)D"r/7 \>CWC*8uE9{zSAUϡ\"xUV ϰ UpʯBjq~UԪNWUϡx"Ug _#ܙ釜 a`)p[+<ÖX!^BV2WW\>T(+<ÖY9>YA~W ϰ VpG#Vprk`+<Ö@[q,f cx d +8@\,rgR+8P Ne1U eb\VE+8{Q NfQ!hV1ElVT+8P NgLUOOӵtuw<עzw&?; jUaj:\t7K~\,W N#d=Q@ [ [ϺC.gC28~s(^ȟ)m⣼a |@U(`gR3<Ö~T13l)aKAZ/94ή|Ϊ pfpWDB ΢sTY38Ua38+U ϰ fpz y4ߗ@4rgҼ!Bi!J3ʬ Pg͏-J7GߑpHL~t/i QS  78GE)783Z [ z I8N 3@Q78 {Q 1U N:vpԋnp@\E78W@8!aKA`P\T7<Ö@!bq *oG*)⣼aKA h\-El\op8op:r(,S3[r}_n/uϣW:WA [ ngRx;<Ö!yߵ8yߵ8yߵ8yߵ8ث wx-3l)s?NQX3l)aKAdy}_yep^y@^wp>ϟ|^ 9#z4<8GL<8Gu| Y#`xpNWԣI=CH<8׏xpV,0G_i<8G]q<8+UJȃ{C<8םH9ɃC{=Byx-ʃc{ݕ!r{J.O.˃{}C$kY*)ٽއypxrB=eZ|F΃{G|"^2@N "§/DWz )>wb_E1=8+UN:ԃ|@Q^zpPV}QXN2zpz»W,XA@_D_T=8gk g|N :B?V=8C=8C=8V=8 %h_ϡ9݃}}<ރ}:R>|& {x-~(Gk3l) aKA)?eZ!?eZ!?eZ@!b~ ,wCk]Mϰ |x-CDkq&k]HSghO>o%AKnKi]PVT*mtVhϡN3ln]ew3q5E~Wmâ:X jƁloy<&?fUg  B٠'&x-3l)' SLQbp.rp0gRO8G gCUR?th) C{?|h?h5^2"-蜠(@1Ѿ'9ދrx-3l)$(:ܧ+,(",hhi^Ҡp\p^sϰ Ĩ-@"" !x gFO gϙ');ϙ&?;w@t5޶WSgf9;\jzvL5;bf^s5ۙWsɏTSst\q  } /kc y [ ʋgRX^8PNR9\uKAy/fEX^8Oρ#ݭ™_ L/:Jh~@±^bp߾' ߾'J~=Q#l/k~D нppx-%| [  g{/!~+ *勈+59` { ϰ ,-Ο,/aKA}Ѿ1x_=j}./X¦Ku==^:uoMpoc}ȝz8w&{ R??{/d_{ꙃjl_'՞%{>=KxJMz|9z:3-=Kx=K4ok{:g=Kx6=Kxu@Mz^[/p޾zd__쾓L4 =nkd_P]@x J_m[ݩ?r #3w?x??K??G|{뇌_ۤ\yZvexx/R{@{xCq/yom)L>^/yX?q'J/0}ۨG_ϻs_q?br_q| Zu f~{׬I=pxO>^v>}s~}u;Ty*^GGmDMvIuy.;vͯ"sxgvgz`ۭr^kKKn^`KD\ף}Wu^n ~f endstream endobj 105 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 118 0 obj << /Length 3220 /Filter /FlateDecode >> stream x[[o~ϯ̐/46A@$F[tƒl+4$osHΐ#4 vx9dzGoq|uv$8y-FW#! Ҏ /Pzt1Tb 77_'JI|3w9wUW^ +]4w}>-}&p ISŏ߽eJ3^DiV02-0:+d'ZDh?#jéh9GjE2kVJ4)Ndjv$A0~"jXθdSev 2iSf v=p91k `;֨H$LZT)L:c2e:[i4p QGB1nx3kU :Ѭ QTr,cxhUɔ#AKO4J]ҖH?`Sxtv̊Bx4;۵í4ۣR*Ws l<)U]\d =pA8§J~Oۥ3378_C *Se^"%^gYJǸ^u}3 ϐeXruh]V K3Sܚ Rt4,)xx\xSH1\$\K7rQsqA'gūn[N^_4_Om,wɂ^7nHC6VUh:¥\>Ŭ=q.G5KRqJ,lKu5x _,a{EtѶ֩zm) in7Ne +[lˇM!Yէ٨YiYaY[uYu u de ϊleCM{D!nefSSb\ԃ#BY6G 9t;`\CL$jBJ{qbgPВВ|ZI ВP)hXyؗo1M$WU0U<7G=5{"}\8.;tσ [GٹDZ- GO*];a97vjJ4E'|۱?v̯[ps89WIs⎎΍> usWE#c-B&8OxJ۸\RWY;\"}t { !)Dʰ?jIOر:|rxr"L"akYִ@Q\Z%!U@ *o!CjM/4LNuI.'-:@8ȆW!mzny*Ze6R$\hP-#fC…mC̡ޮblχC{6"ބzLj5/aQ$~\E %fSy q 9X}d$ 2YtLiO Q7L>DM_?-|W|W"]y%oc9k27I\](i|Z^ӂȖz!M>ja㬇- Szg =.:Pf]ECxy+EFV]F jM{5u" HmΉU`V`ǸЉ]}I 6 Niu|gVN EhwXqk)B;@}[XHWޱe\] ᡖжܖ|h\ β`.!yLg42 1Ng|$'R@.7 +9wLijASW=nݲ(~ zF9^r)KF0r~)H{I,V%: aIbON78Mg5TuW7ʟCUub$u%ga{1w ۫E*ʩQ,jiN(I{:R7K2.E 1C*j?.迷}Z (/2]܄#8J:fyjs$zu"Ǽ|B6*QLor`-xUVs&PEnX?fc\}}&Y)N!ypk"kW;S\*w΂7gD\dU l+Y,EpkWII^5M? "PVra\-5xiKpg&%Bݫi)״($eCظ6OL d_S%&e]S9x*k.M|ὰ"Wʃ^o$J{K.(U?UV"-+yx_:oDݙ`3N2.9 %!0- !S 0셓S78As4KD n7/i ?2#.*jQx~YFGmrs%\O&}拧Y7<^p8oi I|Ep믂TA C 1KEU%#t쿩 endstream endobj 128 0 obj << /Length 2545 /Filter /FlateDecode >> stream xZYs~篘Kv+ZTYN|.VRea]A풦_0 Kr%yX h4{țˆ7ߜx}׮yE2']cy˄2yj*&KO\MgJr^r Vqx݄Yۋǯ]S=W8e Ls|]\tv ͞E!u6_{j[̔`p0Q2o9L fEf 4&n 4RD;`Gȴ*or:N^ńMar,~3㊇#cZt6U@)ӊw\ YڶϕsäP-!)` & Y#ǸL*j-+’Z=[UA!G;[=˺(7{y\"T$VuMq B ϓ=px#eZkͬk'ʛ9|pw4uH,GZk*iZ?qS0r=Qdɸ5=-ʶWR3i=3LFj'w 4ѝxK~pn1|vnM7WqPrfD&}PJAJn آjGR,,"B dPcW^Dw%/:4.a&eOe(HLhxp*usyo1뎂|bGfߊG8hD-9Z!r|ЗX|9hPh~>b`=ZFXpѓr6Cx֩BV#!Hpˇ}Kr0ҕi[k- ǀfI9҂diBL@ lc|췑UQ7ɟ*|,c,MOb"YAED˴u#VZ>*jE`p&v 201n!l\ؑ[q,]Gbb#\ɏp.eQ [9ИI)As:W㴔>Z T $L|rgai2ENO? \8䙜yVZB".@pr0}-`.0%xkt4"+, UÌbR~E2m ș5Xit(*m} tN qK8`ϰ߆))anI8L@MݛeCejKd;8۪ixԨ$UֺhZuL?GY{(P |~b^{wP ,2ɹ=3J氈Ȝ>.廒2Z:zTh*0Τj{]}YUp9[V9zїhpq6a`}ټ 6VQؠhrTOaptwy쑈PMAQۭI|׆PL5Et2xTt!h <\H1fּQ}֋X^Ac9WT#"9F#i=#|N╀XDk~i!xG8,Yſ e|W+?8 +6Y=ث,>b;GZ+jnSTsf=&yhA$n3>@tLe|HRFJU݅z !C򃚺2zZp{gtdTy=1%ED*"v3D}  uә*"?L/T.uI +,H􄟅q&⻋ϫ4\ҧ}i6X$aEO΁S:Nx&>C]\8UF / -y݋`0=~zQSp)')hXeJ,LbU5*>JQ}`Th+R&<}$#~!)S˃(Ma׎6pt}~3 lR۳¡O ސBiX )dksYjπz% endstream endobj 124 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette-004.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 131 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 132 0 R/F3 133 0 R>> /ExtGState << >>/ColorSpace << /sRGB 134 0 R >>>> /Length 5296 /Filter /FlateDecode >> stream x\Kuܟ_LE K8qc,,T)jBo ؗ<$}1=a~Nþ4ݍ4i v믇n X>:e f 3fE6+ o 㳳O l0:}V"*ۻY V (rJk\ QA7|`E!W䎼ҿ fXqeWsU26wsq<<]#3lC1Zl *`W`uP 쫒0~( p0;ý5"j(Gx8%@8W b{ja9u6a;0bPšfXw`\x|p+Z4@ Jrg Bl-  */[/ C{xng + FK#*`0o,%觠S0deXf)eFޢ~ F̨_uƢ~ FK#agP?#MJ?oJ?|k8*Px5 /η ϷFxP6.6X!/ xE>B %6H IŠ X΀ B AqA^`y&3 8!/c<Xy? PcܑyXLfC^`y" Jx""}Idzr~i6 ^xXNrb9}t],xJXN{r736e s'-2r,^XNqs1d:ŇXTN[o-]s-Us:ѫyz=akS/:iZ|_Yo.ƦS{Njq;]}<Uy|W,]uN߷Y\Nx8pփqq]b+z8f[ ?NWfTɊ^gg%D3̅]Mjq^xSzXi\+sqﶅإ,?vpn|cp/mau|=>Vѫũޯ)o,| s=<.Zƻ-F:Njq;ѫŹ(Zی qZ/03Ns u5?+lR;vH3Nus ]`gRy. 3lb3N­1suf>mz=akEX+z8gWƹ=SN¹Y:V:,z8H?lmqjL)t?,CC # =eF|Ldt?%XZhd'$4MOM њ2hf#TTIVZEI҃ш[gM1gӄghȿƜM'T^`H,O;;xjrG(t=-\\x*_a4ƤtSP?Df*BL'!S:#T"n2ԆuXxX“S 1Ռq^eHX'!S1֑ȫ Uxb*㪰SM1!c)*UO:DL%d\Mj8RԦu8j O:EL5e)b)㼽JS2֡rtڔGSԦu8\'"NSIsӣS#41՜qS= 1դqATj8oTaS$>'=߃Mx;MׄS%Lzq OMhWԤƚSTSI/ZN-SM5UjJC[k{Pe[k.&L dxjh>$6 D'\lGxej:,<,I'M6 lAtrO:LmYd2G&u9*٬cY#Kdxej:y\"ÓN.SlAȫd2 )Trd2 KdxӪ-TJBjϫPtPtb r,%$Xűtj\;*M5Wql*qrMOH36<U5lMjO:M%^pG&Mҫxju<̈'/&}@)DZJ3}{jc/kX|XpOM|,b%*d3c^g#x!zjC:Syיz1d3Z<U_Ir\;ӎ:QϯJkO:Om_7TYiק6ίq~օxq}z<>=t\O:O'ק6ίc_#xq}z<>877y}j:y0&O5џ1اcT}j:y\ƓS U`J&O5ҟ >J1?ouXe~4INh {y3,| 9g>Kȶ ><3aS0V^BnO)d b>ϰ3)|O1gXyy^ C\'`X',4oNVmP.le݅TmhᆟYpdE/OV=x #NFGC7̀l*ʋsg <0N%e?!#7x [s8Gs3`9l=t|xCәpH;n&rsg8=Hln DÎǤ`d;2`#;MvP/mFu)~C(ۆ|čox7wqǸ/u!u53tgOdoxqh=il Hk_ߺKOp}af 62f )>hPXn ]_B BOs,exfij".^xd zr:#7^w?[.{ )4_}O}o'> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 142 0 obj << /Length 2023 /Filter /FlateDecode >> stream xڵn6=_G⡫()PV7ZN`~{"E9B@p. g4DiU*ߏn^ܔJ*TtIgQD<]E?_t)xv Gws U{.~M RfhwDm m'Z#t ipGE|޴d. 3H]'y^x;Jv@V`&Z&yZA$ RĦGh{ 4~zL?4.UM+;="k^׌;'wvJj< &`!NbDyө?Q{bQYsA5tqQ_xYA2Ŕ[aڨ"^#ݎPztx8Q F{Far>,A=rԉ`1r܊ snW$͋N#ĥJRɐ{m?mXfIDS0׼>IYңTNlʬ$Jv29wؖhHl̆"i\Py? } 'Op^i@=*>N/=^ +1@~qP ׽Pap恬jH5`@%iZ uw^8yxF2x>Gڑ;'WŹYz^(eCKp%YjJmf'td"sM~NTk4X/h`|MpJƏ>q&ZAγbTl"¼Y7 p[::sp/ze~Kμ; ܯEGiN0BX!`M`[řvު\w#Sl1^3N@vP _CWc>Ryned48e~JLiTIA6xFWŸ[Z:\ۤU%Y'd۸T{ &ܘ1uu.a>!.<m%}kR? ]rrQbiX%p? a 0wUAM%PƧc6'E?n5Jہ.W.Biɛ嬫\mYdvs 1OTFrM~N^.hRSޞJki~ChN}+r:%`F$~IWDQJjj_XL93.ܥM՗zs~Xi!#tDvpw&A]cPK^)$ƺJЧـW¤sIQC6*H9s`AQ˔$+(zK=Du&Zy~"RD\"BbU9Ii8 @PY4qN2K`pu쌽^s]ɭlBM$xUQ \$$W;POc7R=_l} dhΦ۞$[*~ MC .F_SDyr+41ޡ!V)xу :侏wmmZ@u⡀0B&Q#繕A߹ 5Cb&UPs~s{~EhэFm;aKI*AkANQ={dpk΅w㰰fc>O{+b"-]_ E2VRMk?F^iLO + NLR7%-JC CZNz$/eB$~LQ之ʆk5{ Gg7\rk.-z:?4u'I$>VيLo{s 熴,?{n\5͚$~g3i9!{ k{6K$uڳ,O=a^o-+\pJa:tC Wpӽo$ ;7T0-|(> /ExtGState << >>/ColorSpace << /sRGB 149 0 R >>>> /Length 8096 /Filter /FlateDecode >> stream x]Mqׯ˙Q$elā @031<=AV/yX{۝}.KYX<<~XyvL84̓}G|9_??>ǟiy6/(ǹO9^?~x\tĆ4 0O͊OYI1s%*mZ,htm>ŗf@ܺDe ˼OL.<%oK=,~ZNa:tn p4/*(Hp 4$Mۧ99}]% eS`g}8 ?OA!eߓAa%Ԡe  ljPi]A@ >}ЃBþOpYgHyA +?.J´Ì=(6Ά'Tb:9ЃBCl:A A?ТuQX&@[?,P۷8] a9\q[!A;yxAa%y(+07# (6Bm?Ԡ;˧ !ZԠ jP=~A +0yPBi -(m:A ЂB 7' -(OE5wNiߥ;ôy?ol05U@w+zH8u8h@@`%݃@*,-zPȦ5$pN'A!<5ڕL=(1D@]>.Ǹś 5(j́$A q:֯1m0[˧  zPca 9 (DEŦu 㻵=$c:V -)zH^j-@@ h/a:=v禣!Ace)8PBc:4DLo-(:8yc\s)!=M JLcL}&r_y?>|wO+bރG#/R$?܏?釯~=>?|/?|~KAFkmĘGp]ۯb/koӣ1[iu|7_M?sSMl~7ׄ.,LC5+*ET:SM]\K5&r.D.ڣH_\hjSM_j@j"RMPdj"RM(.D&٥ET{RMxgThj|jSM]LG5+.ET \O5$&٧E{T5AO/PM} DO5Q͊J&Rլ:qMO5v&p>D.ڥET Thj"BTbj" .ڥETKj"RMq]YqD.ڥ0>D.ڧSM]\K5Iv&r.TЧEǨ& QMSM]\G5v&r>,c|j2TqMoPMU^AH|7eJڪL po zj`_/Ud噅OGF#WRP~,GM[lbZm1Cd1o =nYYS sxB B#hb'ULP#oxA+E&"ɋj0pc:o0c1A0Oěɫlb{,^"xw1=voŁc<-vE|ik c;=:ۜ F}R}bsE{ip|qe N)ﳛ48n|VLb[XƵsw48.ڟ[bQ3c15r*/$U5-Ojh,ߓoΫiOjf,޷4VbyML=^z`y4XPĻ/],i>5xrษ=dG,h &3:D3G1'58..XN,f5xGenYۄO9>k}9zYy5xME?YY1/Y9rpf;Oէwrn``96xDP^ćfoSY=g42#3k^O7=0k৹t$O_('2w&W?*~);^Pp&\×5xrT1/B{e$YFٗ#C~e$UuLu)nsRM&Ǎ.M&ɍ.M&ˍr\JkɤQ΃+_iF9؎:эr&\GF9.dR2dr袺M&ٍr6\y[l7p:ݍr>\u儸GF9#xujR袺M&. d(gq7iqucɕL]T\EuѕL]TW]de~ɤe~EuᕛL]TW^dMKd袺M&.d袺M&.M&l\'UL$:%N۱M& r\^L܋#N=: J8}ں߲uuL+٘p^Fe4MU[&hNPe4{ٞkV0<o d _M>Rh$7TQF#`՜L"]T͹ɤ.Rmk]rI^r^XQ/Ro,}t_n2 3] F.sIan29j)g9]bXQ1skd)':q։3l2颺M&rcIH91'&rcyu6#tGH9߱gX4V'4Rx,32dR)aU_ԽCvdr7~;>~vΞ);F5qFqyz5bu4~ڸ k_<+S!<2 iS3TH^ i;Ow= [>.yF]>zJX OU7^8_ \}Iߔw_͙j:p=HS9"{WK]41y0ڧI}5dӚX`-J `Q#2J jU*'YKoXj-E=*p` 5c^N>{Xm-AjPB>{0\Tֶ9 Xm-E\Zە?WW5 +5$۳L$vv9ȹ>?E V;V[K8Z.n9ÖxVԐ (rg i|4zPz2 rhXm-A`un4 zPsR Z=(wvb W[=(D=pЃB$[=(Ow=(A!K.j;pPBFZ[f 8sjk -A!jk V;V[Kp,3V[K{ ua `qnjk "@ rauXm-J`jkT7c.Z@[K;`whA!O`-(O ]jk wypЂBT4s qjk Wup!ЃBsqЃJ`jk p{]ЃJ`jk -EڥQ&ѧQ9jSP] cSPc E.[)(rEMv9(r.Eڥ|) ZQE=]|K']{h"nhZ-DSq@L-<,eիzv81j[Pdr4&`.958bw"XO7޺b~Zk}U_KKElOS}ku݉i0ฅ 4+*fųF?XXNF/^lxNi0絉ii}{8 ssT~?4xMCM/4xh?z4ا54[vWf-Ǭ' ZcV#wċ[4X8+c0 ^5&pzY׳é`YώUձ Jn0ówN^ ~.ׇCZ78_ːG*eǦiǑHwx4bΧAs [ ;R8G9&o?k4B78$кG?&A,!'Kpr`җr)Zg],h HYfx:߰ Zw}a489?kt N9 ӳKV9聙q7yY0z\E-i8-5xӝީ[͙DY5,'e?sc3~K+p2d8t_n2^nک婝:ڎ77e?O7?YGO֑*&ȡIm7O΋<ϙ,%ߜR\R ᗓbCaLpy&%VR]yqEj*e'k:8Q2dݬ$&FgOQ);ZK#5 Ij-}ԮTʾ֢ڗJZtZ;S){[5TGNo-d{U1&PqM7*ekIRs-w}t_n2NU/7*ekqR>j*Ykfv 8V){^(j*ek֨qR>j*]旛sJ{{uVmǐߛ{5_ƿya$[gsِQ63˶r=u5 ek囌9}CSf ye*'7{5K^$ 1&~yzpTf~7OɕB% ,}Ve4R7y ߜa6~qѿ2C33 i$I|+3g,!g =o21ʷ\PBȶDe~Ʉe~PD( (G">H/7Pʱ.&րr0B֘ 67hy3.PH(F$^Ed"($q!cbb(%ALa y-5a5qJuȄ2:rhBXz@96h=r >PQGe~ɄPO(w((7@PtZG Q Ʉ PQȻ&@9H!!e~D!e~Ʉ!S!e~"=Js؄gutZjs'+K }?aiW_bnO0'_V.`iWJnO0<K;NX#QwcSM>ƻk1G3 t<_U@?9X#,xo`%vJK}]E:iH;K@ J8CY"aHGYg 'lsǑ.fO~|DRbj=%yw9t9? ܝ +ˁz.yQ endstream endobj 151 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 154 0 obj << /Length 2479 /Filter /FlateDecode >> stream xko#p(U{b%yh\}F a-ezw83ܗ(Z>yq83+9YNO_/x() j2(~TLkQ@7SU³Όb~i ؾijWDul\Ng*m 5L׫+{!8>q]vN tu%Hc ȵ2Fv"{ҘAm܉#.5Zi@{OX沈^Vz[ZSÎ%{0mm^BW6R8c|$Uq[] |NZ†C1]x',JV}<3e+]Ζ>^|3υ=D}A0JXb}rrs ra? z2.[MvF;k^ŢVhkMg/AiXK!J凜Q3)UV'DUjTdփ-'YQ%!/f'e,fg/3;δ-Ae7D>HkaKbmq$mOLZG( h_ĂÖ1~5D,ȩhUDz)=n5#qvy;F;<\B8r@Okc^T‡̢iXW"=\$uv8_/eHC]bI[9W0:R4xi˱̃P-r58?Ll݆6BhbJ1Aw$Lro&[SoW'p`q(u.Z ɪ| 9O|8;;"+F 8Fmwtp"*EJHTZJ&`jHN ;@XfAbepZuw4bv-TK[%!O#M nud.F~z~zܷtZ6AS,44G[t7koF]e?ca )`3Y 9|M hh8^AXXi, Ryx 73+&)x^c}^d'6/?s3~ɳ| X7+ܑWnWf|^yvOj+BS4<9X3 ӧcK!IWm$)k/0# +>o౽aU?)Nuȷ1UwBr;zU U}&^Wm G(6}ӕ%J(sXy)lXR&n1 .`>)q(~% 2;DeA r'cۜ:TL!`MU9q&o+"Y}6 Iŀ\1 [>F3AqHT9JS #sqgþ\=qvʢ>\`eN8+X((Mko o聏MԺD"WκLa^'oVȮb2DYB,@$ޜ㪌-t[pIqe̻- !hm*;);jf @FG|5P^h,lY9ߚ?B_ҥݻSşlT)Ri_$mn cӡa٠o;U&nk$/=;Zұ{؆<}H];LW1 cRO[B~ȅ1IJpnլ`S'Tl'X;We04SfŧXY+܂F ;([.B(PtnaT{O7lEPa!) M24"d"ڷc=$?Yy~$%+KfQ25'u/Բ4@;N(x*y{f~2E$>0ÂӾv{rG[Þ<6:3UPZ<'s+%Td[iU!" Χw@Ώh(Չx 8 u7 C0Oʺ,JvL Ԑ?T?N)?wy~+fcy#1 v-ɧ5OQv'zbf3ٜ[<$I\|g/ЫIoR`V~jg_1'֭bY6O/NSv':HA>R_ f{&I=~3~ڝ>/0gdgc s ̻9w"OnTdgcPL'H endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 816 /Length 2481 /Filter /FlateDecode >> stream xZ[SF~a~MQb`IjI Ńh1aw$l&[5侜sRL2njdY )7Li<,SN1xDebZ1mHk=Z  ŐlDcbZ$ YXD-FXIL3X $X߂ P%6@@`Q}B`NZ`Sp'8-wGǸ=*l > u1R)BI'rDHL{;ND$S1&ᤝ!i?5u~T@0C&>_UZqVmܻٸX7f` O3F?0>78wC~Xm w@]tbw5 wPNl[5 ɣ"k EA gė/IL]ML~QbT4q)2:;FKeRIirxmߧ#ɮ/|~YwyPp;jjYĿ^ԨFihZ6--P<Wy=Fܦ9E ſ'4cR/œeWM˻^#ʪ]⬥,5:>"˻y٤"rz iS` dymKL˩qq&(9Tf2n/Rћ^gyqBiqv)R횇X7ʐ꿨tW֢c[v`xo- ]%-Uߖ|[PGmTrWuCOsR?y/ I=|(~!j$T٠ 'M'!wHOxfOa0 ](_tB2]q,K< ng=\Ps㠾s(^$X7},I!tbaTQ|Дd~Jٟʧ؟v5C,5s> stream xڝYr}߯`9~c nI7JZJA D1.@ZJ9f@Z FO3nF"ZE\xy/TQW7 0KEPj)x\KԽ9{=Jzk }&[{מNBxIXlzikk^KٓMBڥ΂>\D[en*4"oIW,V* 88LLAVWMKm^*N@Et+pϾ߱@lPx]bx&xFa }Gq%aBib}Gc_=Żb?Gʰ:% =l,/YƱ)z80HHiFEK֎}bBzj[^^_i;Ъ`4nh\;b`;{3],_tcx :8 }E (j9$ҵY5jVp$/%_OHW!MF\W^YLj{|bJF >q&A;_ |䡫c79\$S Mbi=@Yvd+v{S7_-bC2{%?un472 ȼ_E$X{͔H9ks(ENIlgAw1G9PhDOV|g%?[ۉI!O7 a/}ˁZ7SI@9hzsk@Τ)7q[cϖ5O/ϜgLI*۰b7O )bV"}NPg /uS ? h< 5s7>ɗXXb.LCi31~~ɘ)Q2ES/v2Sԁx΁3j '>M3f4='P:={z;!Ad%x-YMg0iML)pb/G#~mT>}L% PJ2[Aᖳ"Pq#cLۏXGoHESh ڇiyPN ='%^&%]HO:i@U!mz]65:ֿ뇷3~h9 m˺H.zۃ׍TlLぎBGS10ט6q+ڤU০uO8卜:jE_оP )UDӝԼ%/?"-R>@! StPGŜF<\gU% RHfPm; {ޥ(ymBL,/P$y,pȥ 0 Pŵ<}{Cxߡʦf)BRJM2m$^v]M:C&IURf/8x&2A +R|l(0_5so:ښw:./.g4 U4XCF[I𰨕g}BՇ8-,3Rz{L=+'e%3@f^}Di;TTQ:IEػq%DA6Z@pcü)> `m11%@CeP강BC=Դ,g|tOGG,> stream xڭZIsϯ`%0^XRƉǞIU"!Pr4J*y[$(>@h-[)5ٷ~Vi*=i])gRmjs9sO{xz=4B^~r ^ [óyYe< wk?\ d\hb)~;_hW0WA6ܵz?Cw #q#C=/&+j+= +L%| ^6bwBl'I>XlF 4 =Vr;_IsN_~cy Tvk*x_Z/3x촗N_:dJo<^ @r&o*%U"tB_Â*+7F`_~c郾{_J*g];2b`)Wf^.Zo5@9+K,|qN64"7uiS&Qw%E]J,Nq;OHYFqg@9BTjc }@Y`0V@εch7M1oef1-sY`$qcs^"ۜEs2iXV2+Ad FZ1i3ë7.DJZTs)֑?O˘ W+Fۆ"PugqxQԒ)̍Φ+EjT%Gl(M u$N/祌(, (ʧvElQw2X,AIrnV댷PKr&OZ9`59kwGd fkv#n MAd(R 8 5 ( Xr㖈~|(6F) 7ߖnCﲙx‭l[DYU * Cx0SE}S~8_ n0eaǨg|<_Ll*pGKhi# 1(J_yXI1}7P-pb/MaxI )Ҳ̽ҏnDIv&鐺` YV[omܚ"eF*_qqJ!HBdsvjC;2=f9A`}I_MkN^髠< VIo\qZ JfF}q RJ^#y"3b;d"@$ǔ8HR *U:+8Ł/Ν n,ƀi)t(CP/~jU@v̠`_b7?ҕG'Hї]{qMkh۠a)lp54T.'o4+?\Pcij72޾ҭwt p=lR+  лlspܦ=o:. Dž2$A6G[6 ksydvG.գ%kZy;.6pC|>G*tqXD 'w2Uச[<~݂eg%A@|K~:ȉj|JPn) zl-X_vp 6NT&L7.KKe}MMw.vMLm\{в[?ּ GA4ƿŦCL3IGNJuOA p)CgIsI&Ƞm/T赡y% >Ixi?u7F79RbaOd0!׈a݊{!v˛/`HCbdTش/vC,v%; 炚?5b{ݯƛ"\~9p| w;V:9*YoB?y*k~JR*_f9{JW]ȁZh7ׯt4 endstream endobj 181 0 obj << /Length 751 /Filter /FlateDecode >> stream xڵUo@ _qS"[|wB !6mmFn}vB_եջQ| 3 \jg35~kB>}g8ꐣrtt+uʩi+g.Lʉ\#]Za ># )-QvիVg0WDj);ZBק `ynkڎu2#Gy$Gnxȁ3j(1l{'1"Vkw(/h?WlYFCF삸;F:#?S>"' Pf ̣xإZ.x9ݤDM-߅8 LŁŠ*H݈04@s Tv HBڳkO;hOY(rm3] [jg'O sܦ7+_tڈvXPue5g6&s{I>RsTMw,%LA Y[TY\3^I:巻ռqջR!x5׆-VX&!Wǃ7,LŅ*Σ7+џL3=BQ|V7ͻ endstream endobj 170 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./map-weserems.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 183 0 R /BBox [0 0 434 626] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R6 184 0 R >>/Font << /R14 185 0 R/R13 186 0 R/R12 187 0 R/R11 188 0 R/R10 189 0 R>> >> /Length 3265 /Filter /FlateDecode >> stream x\͎$ S19l[$E\[} GTA8b0RD˅_N}?z6K?ygF>l_,vC%v^\bpkCFzekq~æﯰ ز볖V'ذno^EHXM2Z1[T&^ِJS|?+L/pqKq|u`{|z;2~~z+?N5 HӨVpxԥ Ⱦٹ0-|5*mn jM>nNM8 lfK/Hׁ'("ܸ@ SAWo&9HV[q.1,Jq3yi+f_ &JL&|)X(ATjU-+W,(b$ e%ԭL#!e HaۻӈrH 5] ŵ6 f4Ԥ =,boԬ}ĸf*?g1=YjY Ѐ81|ajxNێ8Mju}a-afS_Peʕ]Hm+x5j|,Q-5H|I/ j"}bZ%ߞE]6K2K_mvjbnrLߋ-nm.$g2)ȭi7,Hp`E٠Zănqs"zrnV$=xPf&/O&lW9pV~[~b Jf@۱py3|aL?fpA%CL-#6 /c= ?;yH9kF9 [ujZ%C9z8z u–ۋSzBJN4bypoU&,JfA'ERI9왤Bmt-h l.wzn+E[ƝlCp ;U;43giAasiX bdhyF~P__ $ ˽cSײUTuT-Y1_(4a;ZgY{C?.:_pQ;!,"`APP.` |*ݲmA.&Edn_|L5Jn˫GaWͿ%G}?9 Ϣ:Զ M eW}ӊ \<0mIj՜ x s endstream endobj 190 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ 0 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xc` endstream endobj 191 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xkhD endstream endobj 177 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette-020.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 192 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 193 0 R/F3 194 0 R>> /ExtGState << >>/ColorSpace << /sRGB 195 0 R >>>> /Length 2705 /Filter /FlateDecode >> stream xMo6+xI  ;L<@ ؿU"ےwuHPDVIVoV՟՟ʅ*U ze{V>q}}^տ58Ͽ^-q];mU.Ů' q]]4"B-S+iCuC%l/kCdt%R.V2.4}te\%(Ai| hvhp|oF +&+@K7h=jh#7T ZiP:==4 c5$ih= ^Cڣh>Jv}m>b絤z_φ6f4 NTϢEJU(V2XU(yJ2a9oh;EEѱtx׈d^fT𢡒DVf\HWΣkq^pf6́U6s?AKY>`3hnpR=`3Ay{Σ$.ˣ*3zO=b lJ9=D񕌵Bk$ =>b+ S- r[TjGBtxO{dDqbhG;K[˱YTGlyjjEtBDwDC)y`{@?yxdv%!d=%D3QܩV7w݌S*ϛ(`Gxיkuթ?>?6vy/>Qpʂ(S,3LE.(eI2TQ,3EG9 %ʲ D(Yef~e,%Y%$k#dFdd,3AYf22@MeɲO6$6I6> >OI<742:}F"/Eԓ5!٦cl,EHT (E(J9CxZx|#W˓QyTRyXӤWD,TeF Fx)cD敚 m"'D`P%, Jhrf$%\TF %OQ)D4d {W{Oa"G7gxP+D} Nx(d{ OxVhO$"\J|B@~,>p@:=ƻN6>y~kɬ W(@'y;@RKBm0A( ',2EyMZѶQxprlxh L|麵%""{,,\#M1 -,b!ZC a=v`DE^8= H8.$agoD.?/9x6{FT{he׆8&y)LCTDnsg:gr9>BVr=e(BB)K.#4(Q\).X5OdfٯYBk eoe:O(|Le 3R8 wQaL3SW0)xYƚȄYLmWB5*L,PєB {l\i{,* YxmAAbF\Loud.jH0ƾh 1}Qy4cUe60> d2hx*Fd⑲2ź|qieT{Ox+-[`CG0Y~yʻ-:z<Aec*[r:C_ay)A Ͷ Z&o88YA-"򮗝 OX E G_3<^/n.'$ Uf^fl.Ј0P&+$ -:Q݀(aFhAeP[8ÑGvl빶A`dD F(&yvo\|#t9ax{#,cm6E&#HxΞEJfRs9{oYR`dQqBF"վIP1Wgva?"N,?o.|UZXڲ7N.-˺oÅ]&IKhj4TUʓz}LM@%KٌטѫdG G\2фR_Zz"*k^k|dnRK[\夾=t??>>AQ}gRyTK*Oju_>jr8't>+;>]Z /|^~%}nA ]_Pʿwny[w\X{ןp ~b~r&= wWV?]C_oWM7co/D /9K|M/3>1sK$9DNKF$9@NKA$9)$1'O`<[@^؅pa샹U0UX}f nzM7X_kH{^rr6w~'vv=KB)Vڥ=7Fέw߯8Ҧ_i4cG3{Q-{R%-' ;~r_EZ6> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 202 0 obj << /Length 2455 /Filter /FlateDecode >> stream xZQ۶~_` ;N}JLg>$Ir硿= R}xt%X,vr]^|\ȅV8U] zӕNKGIջ]|]}Us WoB—^.nRWfQ)'Rr+WlٜOo͡A'-ل }=+eivp=B]t} K`to8noOE~_TYhJz🛿jᵅƄ^qewU&ik}q9q:=t[o&6,N7FD=`GOv¹RV ^2~6QjƄoJ1>:& >Z@odV m $(k5G/ ]4dk ,.'?r4JLnXBN`t`RJ)u@Dr%\%ʭ>o/  ĻJZK bcxrG'}뇀|dLI+qj=]@y^UkQѧ>pCd> Ц_nF0p}B.,:w7;:xiTXpD]ԎGXt,ލW¤Ca*O#ufRYv; 6@EJyP*i׬0 W`*8UNQC0,{͓xܒ5,ٌ3p>#SDq%N-=VeqWwF&I38S3*NOnC-3쎔y0pRJ _8%lR߹X/!=..XS*K4%!8z?5fHh2<+ $VLe^cgsZ&2eUɆc<]Z*cR60.tV(#^l%qsE4F'q5G \򑶸rpzˤ21'cS#3eBW|MV~ilǕ BCf5;Ek,r˱cc1`)sP6 A(L+gv+8UZF?I^l,WfW~8M 7ǩObtŠ_erY8zb-NM.H<,Fj֔@8gz?KL? q(d/XpOaPQ b~(l#"GR܄|8oc(gt.0sԦ!pm…?atwpD̄qa&V,s8CrP!N߮ ݁t mbmXTC (NxBy3 eJ&ߚFQbn1+HtR ͈9(O0dy~7|Z&>{59my--<8[EZg0vx<{t,rϮG4\ZsAdf3kψ]yKM1)2nOF&ﱩ}1XbQ2~?]sdxBQ8Kh}%5loq3N3MJT.MK4u[p"/'|yBCǍuGao1[C_@6 wMQ_xNQ5Їa5Hp(~}ss?q endstream endobj 178 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette-021.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 204 0 R /BBox [0 0 936 648] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 205 0 R>> /ExtGState << >>/ColorSpace << /sRGB 206 0 R >>>> /Length 24789 /Filter /FlateDecode >> stream xM$v_Krפּ&0 A+D04Pp ?fyowt7y?rرʪΌ礻Oxԯ||=ǒRK_>|ߏ|>~qjx>[araxn_?BJ_$-ku+[pI$[}ʫ[QOܟ?ԭlںG?dOW~V[Cޞ0i+ٺG=,W)RF=|-ԛ~6'w7?c<37s=l^ɸVגG2f[}97kZ<o2.{YO_K2u+ٺ^ʣe DS,WϗWSVz.%mʣߟɶd/9Vu+[=sE3?$[}غ_r'yr'[[wJYnV%#NY2Qd4>|~lj8 ?e.'|]j8d)JFՌݲk8/~ʈ_Zpf"eʨQ5cf@8#HF2d)#lVQ 9GO _>YpBH,yʨ_>Zͱ[ ᧌yj8%9HF2dTHҾcmkφj8d)#JF2%cyI#?94 gj8%9#IF2d)c^W:ͱ! _پz| j8dX G2eԶzq8N} ׺|A36A2”}# Gn˕j8d'etmSc:/t\OYj}wїwXϏrآK^߻o.?7+Kyv|p/?ܿ)Es[u=k9G/ O}o׿ݯK?~O|&L43iL3iK4ZIEIp49Ix3i4Fx=iϤo&fzh3^O,d4YgȎϤI#;dɐ%w؎@'|G;8d)r󜛈O">;8dϹ HF2*g0Ϲ #HF2dϹ 'g0Ϲ O$yȒA<&k&>;8VS 97D|wpɨSF 97D|wpɈSF 97D|w'|"sn">;8H,sn">`c 97s A'|G 9g\+<&c0e s A'|$s A'|G4e$ s A'|L|wpA< [97v-D|wpص$s A'|G(^ p󜛈Ow2Ϲ$sn">;8*es A'|Q2Ҕ$xM'|]s0 J񜛈O">;8d8*$ o7Po7P|>IGna&r,r*^2$#Lb GÁXQ%JF0mk8V:"5 b G8e$HSFXQ!ͱC?ecX pDɈSF14Nb K9N b J'K2d)#щA(tbk8dT( gcX pDɈSFF;7P(~fy2@gI#;>Fv|&L48Lͤd4ϤIghFx3i4ϤI#;>FrL~UQ2dm]['|0eHrD|wp !>;8 #JF2d9]O">`O">;8d)#KFЅOE2%xM'|Y2Q9yM'|^2%xM'|3D|wp A'|G`c ?exVO">;8dTX+'|L|wp /Q6 A'|G:eT`s A'|G(/@q\$@ a-ctJf!GSbyri8 SX"p$HSFX7G|ri8V 9w5I2ҔQ"pd#-A3H"pD:qVJY2Q$IG)?"p,tJk8d)#HF2/5tgk8dT(O j` 7=V%#NI2ҔA}\H4`u pA5tk8d)HF>XAw}K2d)#r7phrY%j p}h;>X%#Nt7k8~pTɨ.AH` G8edSFn?ik8 }8~zE_<ٖ˵@ȎǶ?ٸеq&ƱLf8v9~g(n8p@q\(K|{oo8^ }џ6&|tw 16Pk0(o莱;(_@ ~sEolkҊS_&Rl|(+?";8rD|wp$SF* 5d)î%ٜ𜛈O">;8dT9]Op JF2dD9]O">;8 g0Ϲ O iH;8OU2.'|I2ʔQ$yB|w'|*a;8(<&O">;8d)#IFЅ k&>;8VrD|wp$(rD|w'|*ACî%ٜ𜛈O">`O/aA<&Osn">;8 #JF2d9C|Յ𜛈O9X%#Z!>;8ȒQ ">!'|^2”$#Z!>;8Z ϹO">;8dcD|wpT`s A'|Q2%Z!>`c //@q\@"b>};l?e0)E($GSyʨQ5côcSX%OQ2┑"p:1&gz]J#IG6Q2NmN)b GSXQ%jI]DZaSOGS6 3Kw Y2t7L{JQ#oockKYiO):RtwZ7LrQyVɨLSXñ)E]GaruDɈrQ_)E(tJk8dT0)4tSk8覴pDɈSF.}=?ri8dY2W)5tSk8d yf[B/f;6'vN=em]Gmvu9NmFY~_(B@q\(7z{Rm?t0;4}Ew @q:(cl莾; ~6P/u{Eᄍl@on8_nꊃS_&Rl|(P{c [nlϤ'zhb'f8IqIq4YIE4YIE47F;|3i4דF;;i7F3|3i?IE4ڌFL4th'vzhgo&cfhg'摾4)IE4YI.&ffhf'vJxwh'ܞ4Iq44ͤq>ƿIq4YƤO %wm}e#KF2*g0Ϲ KF2d$9]Odss__;8*g09C|q0ϹA|؜w֙ >D|wpص$sosos";8d)r󜛈O">;8dD9גlNx >p >0D|wpص$s#esy ߅x ~97.sncs;8kI6'<&O"uʨ<&O qʈec-%ٜ𜛈O9X$Z!>;8H,U6 !>;8VVO">;8d)HFB|wAkI6'<&O">;8(<p 帓nXvO?}⏚~˥my]$^چQ _OVQFQOܟmqu+[mpu+R?V_dnene'Oߞ0ne-nQ lIz:Vz:VzǶluԭlu^oWGVo[WGV_?=d7u+[mYu+[=rIfQVQ _uO&QQ3g/_ͩW$>h=86`N:VbUIbzl$u+[mEu+[=r uOy=?jۄ:Vz~+spa5mqX GS_?̒8n@SX88/V[ǩMF:.j8d)JƩcֈ楉5qkW/~ʈt8NG Եaus+ꬃ41qz|8>0ሒa5Y2NmK9>0#0(a5U2dV@wb)}w~ԻQ1]^㽪K*Cz8Q0Suola_azh BG/ }ٿp?Hyt ^Lpe篽jղbPW/;ZT2v+ 5bPW|g7v(?˭ gwxڟpv6X ;έ6/]u^H]^;tiWzL _M Ϩ3j3/QgFQۨQg8jף1ǛQYQƽ!؛Q.oFm&ͨdǿ8ތ0ͨm ڌͨ͌nڌͨm|ϨofoFmf2j[ ߘ'ƭ2Zq31n:V1nzV1nu/ƭV_)1n:V''r_[NŸuԙZ}~+Ÿ_[h?Q/l[NŸ'r_[NŸ_[GqՉZq#'OO|唿Zqk6|唿ZqՉZ=s~/-연ĸ'r_[Xkq >)1n:V1nz~+7|~0_9/ƭV'jop `[p nA&]۰9+7`[Ak6'x x&܂îm؜Lp ,uʰ_ٜLp 0-8d)#J3]A x&j0-8چ ^  ܂îm؜Lp9X$O^2`[p n%N3"ᕛLp 0-8d^  ܂#KF2*g0^9`x&܂Lp (Wn0-8ਜxvcC\n|vew~ٶCك5>k!j8d)#KF2vH A3H%Om;qX GiVÑ%#OU2fm;pm4᧌8m4(Q*U3|9]_Cշa5A2#JF2vH8GO8}< g:~vH8#IF2d)m4#A3H%Om;qX GiVQ$LU2fr8HѶCpSF8ea5m;qXX84m;qX GiVÑ$#MY2ѶCQң h!j8vH$i(q㟵ausԶr8HñrF8xm4r<@km;q@c8d@>)^Xx G Q&ɀ/\ϣ~Uu@u}Fi_t=G<9T.5%ea<Ϩq@wc=JS_ 3e)m~U] vׅփ]z2H$#Ȣ2_Uap(ៜAW0pSF4edYeuΌtsW5Aךj3pDɈSF4eZ3JX7G\84+g#1pDZ=,Y2~z5Y*cu>P~b_z8ˢz87r/v_YnQ?^T?p+^\O{ao/`raxBٱSїwX:e,Կ;bc,~9~lrn7w {͕g˥m8Ze4=㬑.43ido4ǛIEiO"_O,3idgȎϤFx3i43ۓFx3i4דF8^O,8^O,"_O,ͤ"_O,"M,夑f'vzhg'vzhg'wnhfo&f43id_ӤW5Q$C֖a;Q2%xM'|mD|wp, /sn">;8ȒQsn">;8A<&O"uʨ< +܄D|wp %xM'|ص$s>997D|wp$SF 97]sW6;8VS 97D|wpɨSF 97D|wpɈSF 97D|w'|"sn">;8H,sn">`c 97D|wp$(S]K997]s0 aגlNx돃y 7mNx lNx}lNx mNx Cx klNx < > .<.;mss$sos;3ws wN!$< B97D|wp A'|G 97 |es $#MI2D|wpTC<&c}sn">;8d)#IFB|wp 5d+'|Y2d|dqtE(|۷(SZ#X7P099W/~DG#@ᨒQ%#o65+O#JF2d)QAtء2HñҁAtbk8d)#KF2 ĺ9v'c pxSFXÑĠK_cְarF2dT9(o ptbk8d)#JF2B'JFՌ)4+@'#JF2d)ЉAcO{bk8 ?e:15N b G,'3f'N b ?eDɈSFsIQ!pȩ#? ptbk8d)#JF2B'JFՌpi8V:15N b G8edSF9ͱ_ ᧌`r ;~Ua5Y2Q%JFܯjyc zg8K2d)#r7pZ*U3 JXhk8d)#KF2 -wcU]3H%O#ђ9pdSFncXñri8d)#r7p$Z"eʨQ5cXñr7p(|Gdlh%K?;",["t= i©cCZmFחx)9.=e(|IZ Ep47Po`yOFv4YgHϤOiho&4~&4~&43i$g'q(D-aKF2d$9\O">;8D|wp %#MI2.'|]s0 A'|Q2%aB|w'|"~@u!>;8Z Ϲ k&>;8(ICOsn">;8 #JF2d9 ]O9+d)KFЅ î%ٜ𜛈O9 KF2d$9 ]O">;8*g0Ϲ KF2d$9 ]O">;8*g0Ϲ O(yȒA<&k&>;8S 97D|wpdɨSO/qʈdcD|wpT`s A'|Q2%Z!>`c ?exVO">;8dTX+'|L|wp /Q6 A'|G:eT`s A'|G(/@q\$@ a-ctJf!GSbyri8 SX"p$HSF=HυN)b JH#)E(Q4cSi8:5N)b G0e$HSFSXQ"ͱaRi8V SX"p$HSF2eT:usN)b  C5tk8d9('g` + aH c5tO ;>XA}#IF2pd#-A3HA}$` GXAw}JFՌ pe;>X%#NI2ҔA}4`u pA5tk8d)HF>XAw}K2d)?` ݁*U3'gC` ݉(qH܍5t?k8dTX ݑ#5Q2┑%#OtGOZ3H@h%rmlϾ-!Oh6.\z8|jpz8v9.}96Pcm n(r{qioo80 KOFv|&s4f%K-kvOE2.'|I2%yB|w'|*~;8kI6'<&;B|wp QCOsn">;8 #HF2dϹ k&>;8V s A'|G2e s 5d)#H񜛈O">;8Z Ϲ O iH;8 JЅ #IFЅ k&>;8VrD|wpd(SF 97D|wpxSF 97D|wpT`s A'|Q2Ҕ$xM'|]s0 JFB|wp %LD|wCO">;8d)#HFB|wp Q9yM'|D|wpDHVO">;8*g0Ϲ O(yȒQds]s0 Hl8BnHvE|`vw~C˼aSX7PNN)b G7o>b&gT9(oo"p:&#Jyr090)Eeôu=nZ\7Je=i0)E~ڲar$9o*U3 {Jk8V:5^2N=qHtJѥga09RT*UN:*&enJx+ݔ(QN:*k6u%zܠ*M˪@7}ٹR)5^2pq)fI] tSǩc#(hJFEI4G\蔢Sw{vݔX@Xbۑ/XѴY"ݔqY"ݔqc9^<c64-Mj᠛>tSG9d4FÑ%csMi^2ݔqiX9KuMi]G馴KHƩ#Q5Mi]nJ.%Hy3戒m ݔqZX覴QA3HA7}\zX>XA7}nJ` ݔ$i(Q )us,tSk8V G0eDZLXQ$HOol%rmḻkvBחMPñ?ɸp3v#ǥ/?v<_(B@q\(7z{Rmͦ(c\k0(oq}Ew /Ǐm_}s~wEo@q@ 6L?h@7P @@gI#;LͤqLM'zhgo&ff8f&q49Ix=i'vywh'vzh3^O,ͤLq4o4ǛIyo&&ͤ"8L,7N8Lwy3i4דF;|=iȗF;'z3iȗFE4ڟͤ"_O,"_O,ͤ1YI#"_NirHדF;|=i4דFE49IE4FE4,NN8^O#}3i47F3%|=iדF;%|=i"_Owy3i48i4ۓFL4i3Hhm]['|G:eT`s A'|8eDHrv-D|w'|D|wpص$s!s𜛈O9h-D|wpص$s:99gs|essnmssߕ dss ϹȒQsn">;8kI6'<&î%ٜ𜛈O">`î%ٜ𜛈O">;8d9גlNx}lNxM'|]K99gm <zss"6'<.;mssn">;8Z Ϲ Nx]w2E|'mNx]wE|'mNx ;?[qs"6'<.? 󜻈 ϹN~ۜw=R97997odϹA|sy]w >P!y}lNx mNx}lNx )329C|#%szwgswasosw!sk!󜛈O9X$Z^K99M997D|wp !>;8VVO">;8d)HFB|w'|*aecD|wp`8rIM7PdiC'>\چcc쁿VͮWըV-[͏U6^UZ}T~Uj@Az&mZQ6^U^ZuVgըVmWQ7Io{J\U[mXPW5,תV]mU6^UZmPFj,z ƶ)Wjն!ժz 6^UZm@Fjʽi{jնժmU5U#FMԛm2Fj`zUjCZժUۦҫjT WըVԛPo6U8yUGn7Po޶i ͞W(ro}^0ѺgըVmDQ7JozUjն)ժz+.6Du#Qo;AGH#GܟqۨC^v^u+Q_J=CpTu!M=$n$ x,oqD}=n:G7t"FHq%6F^JjԭD}=n$󏺑Gڟ?k9nd1VP{z:.cGH3g_ㅉ$|ԍDspGHqa>F?k*A5?VQ7u^#GO~ԍDQ7z@#?LB_Ҳ?[H[I]CfO9G~d[n,_Dܺ=B9(h0Xwub포?I8X_K /b8ס ZXjWxiK[T< 5x|:wK,G1X{7yYíg1P;Nߌp6\.gš|Tbzeo&Wyd PhT|(4~B g(dP ͭ 52C{C!S92CP32P/j(ALD+D'jiVBtҪz&S\a:iu͇֛cq+L'[\a:A WNPO8WNPt#goq)0: {oq)0nqU+8-0S\a:A W'q+L'[\a:AsG WNPO8N5(?~â6I| ԶGڟ?k6F# [BVk6F޶g_J_n%vՍDssW׍DpU=z)z~#QiC:6x]u#D}Sжvz{ydƮQ4D=skԍl6t]u+Q_J={o[FHFQ7E+C?-\WJQ7A#Go[FHƭQ7D}~+Qo[Fr~r۰5FH3g8׍l6j]u+Q_J&Q7EkԍD=qEQ7kۚuխD}~+QmumK֨Cz&>mcN92h!M&Oߤ籘CzpԛqL~yR?1V?hAJVS[J+DZ!+Qe~AAI]CjlPo%!zH?sOh>i %R22w9rײ?U?ś5]}_8BVͥǕfJ77fZ| \K'rZ3g/s>cYKXܿc_|̂Kc,zG=?y)V>7>7>w?{4c:>mגӭAs3x]yOZ,?vo}f֭ӭW3;P{903/f́٨__@3038فˁ90끙30W3;z5033P{50W3_ @30[fr`fV&3S903/{` / fg㔏* {o)1nqU+8#!-1S>bBW'q}?NquGCcq cqGCY`qu`s?#m >[>bB=s|8GCs|8#! W7+6㔏P|8z-8#!-1: [q)1nqP1r|8#!/o)1:+o >_9wQ}bqf"|8YA9w7+9wgs?⣾ >ߟ]|t=~|8#!-1:+yꖏP/O㔏P_h S>bB=p'qGCN|8#!-1i3 S>bBꖏZqc>bB ׇ_dq%ty+̏?Q~1_| (7d ~'{IԳ=$+ D}}D?H?jŞAjO !;~+Q_$QGڟ?kl$Q_@%^=$AY+W$Q_$Q?rd zDrm{I#Gܟ?H/o%{Iԓ=$Wҟ{?jDCHgCZ;0?H?HkAb z*e~+Q_$QGڟ?k9k_PSDs0V ~AlW/(?k~#z/(x!zmԍDsQ]Db,Dr[j,D=K$Q?sb,l,X"BVk H'g_%~4u+Q_J={vIԓ]DE+W/(̂%vI'+`+̥e+ޜ}Q߉{]S^_Y<e+}I%+̏+tsqo0?^ǿ s ПTZy@'g0?cy}i0+̻0œp sۭ0?o0?o0?07WW+iƴ@})[509ots?n[+@30 LOc`f/ff}f}fT fj`fjg`fꟁ_,0GC{?IGC[>bBQg>bBꖏPܟ?qyP|8GC[>bBg/|@/P1nVl)1nquGCg_)1nquQ#'>quGCW'qGC[>bBg/|@/P1p~e>bBW'qGC[>bBse>bBꖏP?rzP|8z~|8#!-1?k~?NqՉP_k~?Nqu`s?NquGCGquGC{??#!-1^)1nquGCGڟ?#ơV'>bB}~c>bB+c>bju#!W??#!-1^j~|8#!G~ J I8b^yoWqO} sGl@[/|H,OD#GH#$QOܟ?sj!9r$+[~9Bd,!z9Bb)ohWȒ#GH#$Q/_"~+Q_#$Qڟ?iGD#GHfD}~+QG{I'/_#GH_#$Q_yTl=';=HNw&z~w to}INw&zINwr"$tp}INw'zt7p?_;D Nu+x& Nrk SDNu^DNz /zw ?_xcx[g)M5\o^ȥT᧴;9D~qdT!M~~x~]Ļ#ޥ{[g~x~IN'z~x^$QD+NQ$QDr`Z >Qz303l_@r`6ffuk`f/f&30 3S903[3S903f_~W3;P{903+?O̲﹟0GCN|8e>bBg|F/P1r~e>bB+|8ti㔏P|8z~|8#!-1?i~?NquGCN|8ꖏPO_p|8GC`9|8#! 8#!-1nqIg>qu`s?NquGC[>bB |8YA9|8#! 18#!-1^)1nquA[qGC[>bBR?S>bBݬ S>bBff7f+S>b:괂`s?as?NquGC[>bBꖏP|8z;P|8z~|8#!-1?kYA9|8GC/>%+̏++<2>{~#GH6L9BY+W̑#$Q_#$Q?rd!zGDrm{d I#GO{I+Wl)@cC3Gti9B,g/Goh/${Iԓ=r$WҿC7GD}GDsQ=r$9BU74o%}MI?jtSs$QDs~9I$QܟrԼ9I$QﵟnjNu9I /75/njNu9InjNu9VOtSsMIN75':Ԝ$%eO75'njNuyg^]~9I MK/75/njNu9InjNu9VtSsMIN75':Ԝ$gO75'ynjNu9I$QD=qE$[}DnjNA$QDp^aWbBGO|F/ꖏPO㔏P|8#!#'>quGCW'q !9|8#!3>q31p~e>bBW'qGC[>bBse>bBꖏP|8z |8GC/s3zP|8zꖏP^#!-1^j~|8#!Gܟ^#!-1: [qGC[>bBݬ S>bBP1nVl)1nVl)1nqJ?NquGC??#!-1: {|8#!g_yQg>bB}~;P|8z+c>bju#!W??#!-1^{?%+>6} endstream endobj 208 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 211 0 obj << /Length 1582 /Filter /FlateDecode >> stream xڭXKo6QFWZ>D*Z )Z؊mdoΐCz%oyIa~çG3㬨Yg04+ .b5=_-ˮ${8>悛+9f *gwA`amr애G %%dݻp }B: WHW1鐊B."'\J m")on|R=lݤDDmO5u87%h2Fla8q'Wk4E6[' 8Z;vQGyu%r&fGwܧ􋪀⋴c, 3dS ,jQcIrKә"4˥( KD\";Q{?9(- pG>"n)N~Qh>`XmwzLfm0 I ;#(P9ŗVct"3D`ѱn l}x&:RB"؏couI`Cڊpavo#&ORmby]J Z=C=9n|Z! <75ӣbHJK 3s7RZQK)UͅRAD& &NOg,W$-):9ytS)%# ʛTPX81ŎJ+JY&cՍI>Ri12>:REA1IgeӽrY6RBP'$IJ.հwQ]ϟBw΍4xԉ^ޣ<>Je& } OCP| LӿXa_@ endstream endobj 220 0 obj << /Length 2147 /Filter /FlateDecode >> stream xڥXKs6WHu"$Hv^uL:3=4="%k,Rv&@[n2CX,d= 'o>~MNp^E4^M(q>d亚( C(Ãx:3Q2'y 18#{*48 a7P/SMʐfMeqU+,Y&IB\3 4!]`Pj)T`"̀ct;ܹiQ[0Vz# AۊznG$তh6Y4ȭ>8ƹRn2pjt%άN#!i5aypo{+kC1;!ZoKFG a$ipd}Ms%J1́w؝u3(A < ^ݴD aΖl\, 4ߛs&_04d*mé:><(oŌLRWKE`~[AͲV8?ELccʙ0^q r 5lࢍxqkQ9>ަ?Fupf "Tf $yg܆2^4FsZ}5k>ǥMnkS&`HӅm±p+";w2"z}gã endstream endobj 226 0 obj << /Length 1985 /Filter /FlateDecode >> stream xڭXKs7 WVj&Z/_ZnN'mMk4VVz&@pzdiV$㦽q/{=~qdi.{w=))RH=]z/תj_IqЉd9'(95 yԦ04G IR;9EoI֬q[Йgt93 4oyfGEN'8WhDo 3(NfZ@?R+qWVX[qq&Cy+)WN,p0)!/no2ck,Wm9/<~C7++P#h](1-\2PhMI2e *Zƒ+R1&;]koTb%mQ"q=pFij:3qcGm0k.i Q& <ᤃzQx@b$ItXfVaQ6[tȤXiS3Bng$zD^!kJ)q;Q$FJ2F=/0Z_(`5w>QUeUE/0!z8z\Ô/ |O(3vNihNgkLL(x#FrLW&_CPbP-p'kNjXg#0Abnó/bz c]Da 3~w ɸoCBt;KApSbo.nb^GrN q%!bc޲1VG_^(k'ۊ+PeMl{RP|HgQoBq kH5# K,jhЎkp>[`<4TFH +cD,b~ 8ǎ-ҐT D0>S|MR8x`Nv7Aoራi4X^/]삾є70TmX"1JX[^lcApV,6}@1EIuTi.{tv8Mxb\R \ƨNB@yL雙@XAYx]k鰄8ލp)6 Puu6+ .7TUѮd~܉@cpz㩥ly70M}c"Ԛ7m+=0ܫǰUoWPp՛XRLL,|_E2n&PKnɾ>.Aqu0&ti9b!D1b8)ͨqp9wiؗ vx82!0:uDӭиb/AՏ}f{eIw)u٘pyt6h'66#v@|?ƄoZԨ[4'q7q8ێepT2Fhq,MMu]ftNZ)74-36t (~/m_u..ŚUkpa,λRuQU#X&1L2wy#vcjn0\xR{W:~(\҈x%}X(*JCEtToE~ puev|fܣ iKIu6>,;J?kE&{6OrIKL㵨#tz_qO& endstream endobj 247 0 obj << /Length1 1585 /Length2 10025 /Length3 0 /Length 11057 /Filter /FlateDecode >> stream xڍT. =twwwHw 0ЩHI7HH)R)4߷uΚy;뎇R]Ub8AY98ҪRn6.dZZm[o92.$/ iW0,B U!N%w'7O_!!U  N`7dZi 9G)(;@j :TPsFقA ubgd:A\YP&  P:ƆL жuSz]g-d vWo {A ;wmU$;cӴ;zi _o+3߮^I&vc.o2\J,R<5!$jݛkN"OI!jK=龱 ۡD.s#U[4:[ɧr_2emE !+(+"Ʒ˫iOJܟ| ׹bnf|Vʴ:h ^\bLJ(}Z揈X|ד0KDNU4#H'(A4E -J,2" y&JЇdEy|K(7H~%ٞw8)2 fzQ5ԨV[t]QS._v/>CWzP,O?|ꈳ4½ 4k ߚr=r'6xǢE 4K`@)mcэTNoBRtW}!{ 1wfB4{t@QR7'BFbDC#tS`n,O*b@ TE$BCH P[fC#X~G$cȩ[&De}1ᥡrY\/Y$ljGAU.*JfvuGݕ9טhD G\is r u4i;rľX؀؈{꾦( h5l2*%ƗL>&>;J]~%3C BGd{X4LJt0͙jc78fW uxw8 N\Ed%97t ~AY݉u߭P1D,wHt_GнOWjJ&6Rվej ;^<KeiU9cN?j1 {uq0ʋ 5w#E`AKxY&$]Ǯn[ԫ4^!e+X eR:.!(E~ S"7~ L5][nK{}۬cL\#fnqϡ Sf,IZ`+<4j^ȡtGKZEJt|VndB?gۋ/ & /O[>洚 40b"l6L~0 Cz/9R M6RuKYSJO,N|{#Q nizjm6 k9;L拃ٹ= $Oc5e_f*ʺnNG8oY~a&}EGAU]neCQbVW]V|{G܌}5$:f<+tSW}dj

OvT6ӿ&4O33у 7GSj;tW|`*͐1vD횞L$}ޚX`yf.h j\I ⲐBtvrhcRc)^us·|0Ԑ̜ua!ma6B\(*4RJKK,qRi5MZ%r~08*dl` |8O_S䖈 TX8W}~KK+AOoo?\P|i0AX'nKsfm=wc3brc==40>>b%Vdf^Pǡ~n*">88 -fjKExp]ǒT$})!`S/*yaL>M "sH1n^66 F%FUthX] a"Ĵu3LE鈴+R duC撡W*ۭcEdKp)7ޑl^S }v%/+Rd (Yfun.Ɉ2~cuFk/~)E4XÈYÖSy;g66X<\Iס~*%e~/G2WDK?Y=~eSj0]w2%()'kt>?L"ym)`(gp8i)qH 2I樘* ra@x&=Ga ,ޗW^)"t ]wh@t.bE{,Ht .G Ln9GZ$-v,t0':tcZe%$QiZ[MwӏV&mp) x_2 ^䦝ZJ _WRK%מNa]d0:4UJ>)K-蕧GN_վ2HfP~s?B@՚jVYut=?rGlqıֱqƜpU[eNjnHKiJs#">(K|@D#' ^A>$F;ןx )!4tNg-5q6CDsH^q]Um 8" =F_S3ʰ eUZh^qL77!zRci 3lnq/m2ֱdz^1 N &Φvi|XMDZed~iU)-4\jQ!u:d'#dڧP8hFV )V~L=L(%ހefhU6\ɦ[Ώ%sFh>6f]7bR-}qυX14p=5ef㸀*\؃ƿ_KmxgV·IVpfhBF3)NGOE^P/]8FjiZQnގfl{D4w[B\dvFR {$[gNr~Z_aj]BL(suԊ2X(s bQ9p !yA:^-%0F'V(R/{(MSy\yhTȞ'wY 1A[$ep^0c 7 q{═Da{kBzծ7ˤ:\8ˢufmhfRU~HڧvY/1,DV>~i 貔cW4cRP%S^wbQx9gyY.$!.TmThƐ+jc"/ﶤ(UCɒac);gDf\DI:~\!G|?M~_?9w1՗)-<&b1.^3>e)4ʳ/~ $H *qA7=j_[@bں$zJ[=fl=r≚"lK=M9U,H:!>*2ٻQ,k8RNVصV') ;;7dF@ +fh^rybf$_4~pNij+-%XekͬkhpݐmzY^&ɛC0qVT{Csʽ Kb_; *ņ۫,;xIW6I]0^L; B>LƽO'\&ei}f:7qE< Gxp AasMRʔ\%Ub_e74/⢌yjCA\J|Y%== :ѹ|\쁪.bCwp| p'_]jqy"al ~*nTvvx_VtN^mjqԶ9 uƷǒ?؂\tS~v,^Л<}NVɨR. c'q0@Kj%0`Rs(4f'7g Y#O[Ja:&@#K}1y.Zj3 ,D($@hݰ䥚~r%dS$g8t$VzK. r9]|tn*zs`1tdwV!qi9-Uj0s!itf%}4WQSMTkzt>2}RcDLiWaAVôVj|坤5?Tl9ġ&\ ИC,V :CYO3:L1ŤG~HrX"LZZp~RO ՖjV:sr+qMRAxH kJ&35P^3 ;X}Bĕww0CN_o*EL59)l1PN;3 /O+" l մσU^l:Xu{(?f"^P%}䵗 ||CAkE\ pn3\By=Cn*,30j&I|VO˫3;ΌAus\|.$.HJ@FpvTr!% &vzt-~3n*_-_}{UO/MMwӢavnm]<o*Z2<~X`O6Ի.VBkӳuå&[}yܕ;W3՚Ĝ& }c :BO%9Iq(DS4~86cE/30a6Y{)*>9>|67e5~%m$aaEFG۠Zb)ж"Z6X!0冢avk}}s5:"Knx-wq~yrv?v=3+`Z "e;Wk ˇ69]x| 8A3, [La^o[a8Ԣ|sRV-|wP$5_ӍU4k&ǥ0v_؝E8.[3lp)934uMcgL< |&{Դ3I{f_ hXWlK7'?abo D"haMH5}Be$l@!ho;q8X*?nRW Xb1 ő0_ӆlOݬTiFhDaR!lG7L];p쥃٦'u);vhC~C]܃AIgJEChGLZ::&^8 Ia["a0|~4Skl~OoBt Za岣ږņ9Ci Q6WtE0' n $8Wpxۗ= c=;R'oCJ|;č;?UZoi.tg`@v&>GE6Nz2 nGS|ߊFrJFqkO{* ڎrʼZlb& 2bCӪ䤕m:]hTgxڧ~WLZ_6f݄h* CheDS)5Lc>;|}oo>sJ,~rs*izڀm X|1?{.#`+fԁ^8V|i6G+咸&oU&eͲU)Pi:k 4)m$f6)l1RンuKt k0kv DԥZ9uckKΕA 7Ii Hq$F  ؛^?<70z}iU a{z40Mޝؿ^@!1Xo7-ܓ=g]2 %1i11+m}6v6/wS#%\%.i )?.v^۵_wNهTt&wt t[VkW -:+otfɧw&b7b6K_"qHE婹xk]HﳿR\qp;bYu _{Œ@Y9=}lWA%W8MbWDYm]-ጜXukVZI3L@54^S|4 .T@b`zڹSeL=S)э4sr;\>bK]Uȋ~o `Eu $Bw׷`KdIJy'A hb\3 ^Nmo摶,nx%DvO[#E.Bi:S+̢/ݥb^C 8VoPĄph }H0߇.⃙wv`#)0,,T<^xLڣ^G $ߣpqIz^ҭ|xƷԅW6x&Uk|sCU\{P*k>s 'Z< Ý|AI}tg6bM}Cbxނrz9Ӥ@r͜-|U9y6>j fKPLacB nji8ۡ~I> stream xڍP-www@q $Hp<$$hGf̽WW]E{mY} zj mv)k%X) Q6prpprr@] P'1d\ g, u(y8x\\œnNNY'P:e>[;: `bp rB@NU }+0rt〺ڊ3 v-l -r%cqӡ q9 xVT;$I`u8.;`q@uywow67}y  gRг¿YB8 5y>f9'k# wW\{' kg(ل]`o+;:>?\g` zoX,'?6wx9Ǐ / :9C㊁ R*I)- ع\\NWwdTt|zd06̀}g07z,ߎ=3IA q_>υ:XO!RN#M ր[9D' sqry~^.)d{|+y~\Kj c@'sY?F@ߦ? (7A<?HT rZgH  Vߊ\ _9y6|P7zn_Qߐ\_mq=vgq?vsKsmw/;|_?M+.?O6 B[ZU'Ež;!6Cq\z%2܇-t)Lw9-I;vI/(Pu$^? ۭD!Q듂w@ױ]ͽZ~eiXݷ&9s4H(,?g/fpHU"Z++WxSbCa6"މ r@ݽ$Z1esyLTD7.b."47ͮB7ճٮ'ܑaLH] $BӌO- ܍{@ޘ']p~k|cx"3 C>L ᲣA8}%+S~5a]_-*TbLtFncEg#lѺ<JX aT.[8h GWbJ6V/P[O.d$m(֠h*Bf]+mzJb{K3(U/`ZYSJhn%BY tc&0Wb&*[Y-Fz Xuj~n7%Onlq3MwB8s0q-Wh@)ۜx1o!A7x5P:Ϭ"aW72=$;T֫1Ƭԟ gmlWe+%O~b/P]Maav*q)+ "O R\Q#L>寳 3/: 8a{] bj a 1 w>fib6e }B42ʢp|mE <h|{qOiB`劰8)eyu$.^6iqy*8C(=J?-T6I lȭ vYX^!§{:xIԓ4+B obFg+ Gpb=dTR$&. |d=Y#ޚYeTZ:?ՏUQx߇#2=&:Z'Od3S7JY~ɡ`_ %ars[GAqx$Ċ`>Ճ̝*kJpNۍG|U Բh<2YHurJWq]-8&m5YK,cd†MW)*mwr?4|vmz?. RF\-Ҝ`,ģJьu?Rijqaܫ9Ԙ(uy :9jD[g3Ϫl`K52˗YJyǫ!eg"d]x{EbX./P;j{p\q).lsoR‘3/A[xMqPMj ՋnX|t12>\\t;0RggtKȢs#v o?{9oǻ|TP ZR/?ϛ^,+Pb5qD"W"''w ARXNw{Ia[xgakLļvZH;Qd-Mvy?@h%”"Fi=2PntGhb_EC@-Dt8Fdf*sjZ.W_Y=T;&,ߛ*>Ȅ(J,FDu+m3uzխ?G}cF):O9hr%P{YB/hv\(ݛEn/y~id&'T.6#o pQJjp&P${L[MA7s/|D\r^۪Ǽ$6/a-%.e9/Bؒ*O񯫮hicT4 F}-J"OTmԹWk6Lj NgZ};1nԿ:*}lF (T+rw*Pkm8+I7K:>Kq~גәK`*dHA(AH/i9Jakȳ%IB[xHX 58<+pK(m誨ᵱPZs5#PCnZ0ʤ=:O5y5!^drMB_ÖE ʞh^ ?.6̩PfQJE2&۳- D}#M;w>2QLƲݰB xqmRnba=Gw*<.,!͂I- poK7ok)2@4zx /lJ\SR#߲:"bk;V_dȃ۴=% ߚ}h3FO#pFL7ѿfLNфw@m%VVwsQ$ n@{K] mz16J/: VaE->~c~i*~~DMG zq Xh`Jw}&@ʛOeX_e;EdQx@0̝5#qfrDRX;;7m,I+b\YD3{SzG*Izf9lu *NOu0~KI2D0<$OfT';bb?  k3k7nY.)8沃팞NIw0ئN@`AnI&E!NTP!9XGGW,8ZL| mQOy>Iu_$~6G2?+GzP]Q?M%\(uΰ1c}7~[>FOeo~ ^ sװ{KӘ(F)Х$鶣+U'9E G2-Z]FCZ_jDeEO981dKSW I)Ĝ3.Hq\j I- 魴#6:XB2 cV԰=ur31 ߫1z( c},oAFM&FQ]_uN#pH1HL>_t*{ʘ&ܛzƥ_HlG1Ɖgf#qs5f@{`lnoU+6E$;uA~zj( ?~;ޥOo?- RtL:gíw5=~lW{BhxlGEF..u2o꾳a,>%97\ulw¼Ebs6Dk`7ş޵~1?lW,B=?=QciD$~akqE*ͯ0t$By?dm= 2?̇=>nAf9Z(/ڐ@3qoFOd5A/Ap;Lr-S斳jm!ŀᄑMۥ{4"mRJw*8L{M E l_T8D| 1^JOC JS"Mλ'=IaqlK}$ 1p"goW*STPQ7ncn!*7K _tb{,X~0ENpboCnVx:XGURv8KhV3ͩ0QD/껈&d251VD'xԈ ?2*Taehbȩs]9@te;}FSӊHp.ؼ$+"Z׸WzH+qͦ1yKxuv@M$jߴϝKR~zzJ5wlNν*Fk}-+ xi?}cw%yK9!tKIE /<; 1*)>8" :tmtpyQj.wQ;PqCE('b!ԲUs/Vo|Y7즏8G!{8likљ=R+@5M‡O0mMUO`|) S&Q? vd*J-\^Ar\Qh/6[ن|WZP_rיeЗAh47Ub0fiQlI"{vR4̅>:3=oix/bM8"^U{nyݱүvh3Ytf爀{X,nEgbΑִVN ٤{pjv6:*¸MЛk&mOkQ%S!tHJx=H*끹ӼIO|OrԮ'}*|qii>q2;^LqPy.@'U1/;ͲnHj"UT[5 5P f%4XėB[\AWM3iꍘZe[Z /B˫8u~ $&Dz? |͗|BIAH;UIXLRޞҎЋ㈨*PES1 s1F!w$%e2&)JEi kr֡%^Uδ`=lPÎZ N%!7-&wm#y"Oq` b1$ߜf^|pa%{H஄qB *k " AB,g[yS50 EkΖ3n8!.rHhjK//3Ϗu8(SWeSF"7J}9x@ϰ (;Fvb^1j\qYeXX%n-M(x|, ?mg <ɜ(gh?r'Z6:7"J$x1NNQ"Jcjoca\2#SgnZBd\^iN=\jH0(b@`Aʺ6)WQ~S/X {W\&E)Fΰ*` nu@_ǽhH!B y rħ]Zp{'4!]v#WI[x2f=a1k ןs4SYĊ"ۊ:L=5ٞ ;&Mn0W+xrMVnZ5mJ鄣ǹjd69;oD#6 iF9 v}ȅL8_dU&Dbp;VDI?ZN ,C.6 "/˜=:_VPlP6n_˦ΠcQ" (͏` H$ 9Ӆ8izct RVU#ziÑ;[QNڔB# ^@5;&X&^ެC L87;}GHBaf['n=y)'^ʊ vo< a7#'!B,1 oV + 0mx$Mc7NTfw32(-dC]Lc#\ҮyL?.;O2=Q0#Aɻe'E]k Wq|/J(Da%2,/.2LS>=( $HCQ+$t A'sK!? `#QBry!2Ň&q6ZUZvzIh(C~P]gT3sss!6y;VirѾvb+ն9djek(@"x[D6m]h+EԅR0aREVҴ'F t#!q|9ӆϳ8?40Tڕll3?I_^\gtYͱOVO $S^Dd"I-Y*>/jo?ϯ}?2=y+ E硕ܿ.jx8|lu㋼Kʭ8!Y]%'-NA;KaEID y-*9^ޗ1oTf~™Iqq+8.h,Ƅ4mXyX* ܶZ'r޽*j~"Ԅ'#4V JZŠNd-QQtF/C!\4SC検$N.<ಲS8Y!$DM{͜*0zR`Y"y?d@Q}ꗆ&o]CY2b`b-6l}Lȝ+h_˪A%[zenNH4 ֧2??!G8.hsZ5UwCS49+Np%BނkkRONHsG :N&ʍ+qGbC,fim i|ļ9,_0K2ˮʌQSۧ,cYaҷ b3`9$ hp8@\F0F>_ިp}f(!gD>|P(vǠo #i OuCr驐-v0rPF2PMq>xpM+5gO)Uy'j47Bu'V 0L-T"^=Ssa䒤K^KF1nt9kd~sH-34Z.ϱҷs69A*RƀV,'ϪK4uϷTȿ^덗Y"U;N_cr7-~ȉ}d6'TsޜZ];tIshyFI".fಉd ό3flkmd.+d)P]BX➤4L*:cU_uc{-3[[fwi~@29Ƒ~FBtkTf$a']&hj_tNIˍ%҅7̦~Q1\wk* &Pgmf%Aτ!+#66*D p*ΑS.W* _clJ޿%#l:KU ?MJkx#+;/7nCrXݜVXњex@((s सyՌeyLޯ9R?qBt-w|TY#GetZErM|ȩ8jm\pB |2!`_ϕmI]v[ Fߦs%9uۥܬAL/'pX 2CA⓬-e J^RmӭO`lՆxc0 O]F|`ua˻-#}уpT`$BJ-QjPs BA:)ǡ ;W / &U$jϗM*f)kG-$*җYZ\RZkZ8xRhWpk9첈'-"hl(Xסϯ{ #LoEctp ^A- K%XM1=_0 a9HpM{>(R6h}lHzBuc0y*&e+Y=p'0ǯ^=:LJ'j T[~g3-E9X?]])oMM< jkrQ3,P}m3F,aj YmgR,bb2s-=6OkQXs^þI"؞Q3Z8)يAYI 4ahNr2:%0K̎Ne8Qa>@j+f KPawTXpkYp/2470djہ/vUZ-(5* r`/ x*OZz:w~~ټ3y$ 3EM1۟o#9.wtP-KN`'\D_ .)5!$.0#+^8~G؃f$hTxB.0/ GA1)(;.=o`VQv,pM_\^@4S Uh6Ie: mw,l endstream endobj 251 0 obj << /Length1 1659 /Length2 7549 /Length3 0 /Length 8607 /Filter /FlateDecode >> stream xڍTZ6L#H7J Ctw7 30 ]HH)]JKt R4|k}ߚ9yq :ܲvp5M|>>>>~\ff ˎlFC00`ΦB50Ł"||~>>p8@ h0;.<qpD'͖u# @teAp[lH8/ŝpbxA=;  ƃ 0p^ pgBl0;Wha5 p,;ܟ޿A`ApWsC`~APw?l(@w n"y!_y+"N!qO݇:^0N/v0XUOΝ 60 '/", ޶_; ~pW p|p?p@ ;@`~gq? 0? _wfA}Gb^u#Y=3C?% ~n~1a>PPH "wKV#*C]Rh7gЂ 4⳽ނ.+u{#%(7\ P?w큼[M݊K5њ`;QU$nIdaп qWxt H[?>܅B``;כ[;[w[!V;"nk {xv` w.;y{8WOw; @P;+\l8m'.(;o;OaW !$O^׬3]jw߯uDGjk ]:~`o-V"̩6Zi~6Kd/S.UE9kz旺-W?T#[KCm oބڡƜ!JGzգ][:1bj]wJXq8X \I*F,$7=o‰$ٟn^p -_L.𻿧~DmFE~BqO[_qRC뭲A0#UBO1lS)7(+Khw,+{I:6 zg9 KQHY9K.gyoakXL q\K550ϫ.6Qh"j(Jڼfho_)4z݃[4q2SnsSXwDZND>%"X`6>8W;rz`؎̅gqy׷囘^=˿ODސvnzvTQP\L8cēMn ⢖?]Vl{%ǽBV$Mp)\aSxOȼDM-aU%K y\˾dO,<e>?gbIŮSUOΦ.e*̈k&|\v(\3FpX;h&yb&d>5\Gc'}7Xd,?T=bRݯdE[שDw}~tl`[Ik_*Vu腹􋠋ۀԠ"Z2EU6DMs/w;;?.n,GOWv~-,-@_0w0so&+0.N.Y86,B)?MńON( :dmP̊ r۰NS*פ"z=Q/]H~polӀHbn` Mr=7@ IÍZXǖ5.NXb}̕JY\M%|Y]V SgL-p)4\p0W=!iacqM.*[W)tQ͠ބwHv - BlTC|ZTvzU )tZ1b e澼e9B(ۃ{gyZl2ʔoEA*?JCq Iȯ˽"/ ڞmWFC'"4>_2'&SM,)Pdǭ/t$4LJMV,yR~e"Y>ZTTI++e{br>V񧮨K':%o7ϫ:&d ^Nѣ̶&F+N۟wSkv.䆰"c{sZؾX$cEgpXGQI0;ig }ˈy^ C6Qx*B/(|92JZbCJun#oݡ!#W^m; n?@  ,MX1):%0wY_.?/YI9<龖\eh!;ȉ@_T#FR[Ӧ?-s C5fa0B#0#}.*ޯ< GdRc_ ;6S&_Гke8 ⧄$2 v ޳V;A+N!4Ä#S#*_[zm.e˖f%:Y>R]1bj󔢵٘ZiUVJ[ tLJ} LPHo>u/)g=E~GRGCLPA9{Ȱ%RC?{>_ˤf (x(vM)|{-xv\/ue"CД}Oqmoϳ:H:OכOmQHͅV3z~_n{y]lŮ=}&ċt P.Mn{rj9ԟ)'CZe=< z,EowVv^^T^5Ft%ȁqZpQ⻚Yk>Q|;hL/'>tv5lW~li*B‘?ս0.|C:.iѽ {ѢS oGX"V%A&;9j;aS 8K"H$r>VN"I6LHQ1rr~՗˶S[-krf;hrteB!Bj0r;+^ҮhYH[@ ?t63ȱWZ{0MX1Q]pIt@D,jƠi'+7za탟Zj=.%^4 ZF]NxF!)P\z 2嗚=j^|>=ZbɚD27óux~fk7҆IAE JJ)FQ@tQlVx-.kPȩL^ @Bc# n5o$dym]a (H4Thشٮ`2y[M?A;l[5Ddϛ͉OuC_ķZ_}>"~ƾA|/6Q[Ӯgi#1f o(xRkr;qClxҘG"Adf-Vn"|bczmgR.mqL16cõc/m HNۅ0SS,/Sؚ}&(_:ΦQx($0{=N3%62z#ى)z\Ӧڝ˥\ o q9+w1 }ӎ8ng,y"8*M,4haE0̮| gyeeRvNApېњ6jXd~Xm# +{ѐNP7%Rֵwp~K8f}'tGRvpܺƭ cBYL<X @"=G 㤠ŞK6ŞڂxʂHRܳha6g rKQ/l6O3YA»:,i6(s]N/"cq{*L(Ӄ=[ea3 ""פXwXљ6m(]eX1-ܶyZ2zCoMs4%8j͛-&U[zDhU <]px#'L]3R98脊q"G7^[겎kt ޤ Nq *hPu1+Qʈ}5G{HPi>:T鋳ɑu+1i60H*;%Laq]7W&P ~N kSu.L]&7ޢ~}ӕO y ?VRi+.Q5ɎBjΠrKwR;j $Eaxwf=3k$ͣ{xHIRTdZ!b[mkظw3u5psT6:z%V@)`*D&,}^Py p&v}XxVǤ#7pk#՞ttSy,<&sNL(t'tp%']!7vJbt>֩sqUSQN~(GK`A:s@Z&cQtYѥ\;ߗ256B:?3x2۞39`ތ*ϾG? 3:h')GG@Y7R饳7Uг^,OXfq?LH U")>JO 9slS:`Q H~C;42%XΤ~ >k]V0ЕpkqFU5Mk VZ9U^C`=;'Ex`?zz)H6z)N2ZHa<:9rz'ZkJ+%S?'7=XWYIXB\dkC>Ul[Dr,\*.N% iiFٙOpCC^k*#j7,9)N+z+24FU_  ,v1~Ӡ$ȨO;kw”@ej]a@o\i,no60W ͆mx(V f!~t4Wc. {iUлW^ۑF.V?T[ ?YԼHbzF3%s ,N]`k5:4x\USms2bO1%49wI> stream xڍP NR{qw\w-Z ݊⮥P9t;sdȔEL@RFV&> + J b Jl` q'*B^ .Vv++7 ?N| @ `rFw{8YYXB^@cJ `f jr2KkFS-@ 4͍ hd!DpXTA 'We"ojL(TuK+)!n@'U`ke w~uq79^dJ`ewsL o?r:؁Vs+[@IJ am^@+[ɫ_R*+s6uClpd͒fvv {3ʟ$@}`pm̭0s3k[9d$m*B[f8Yxy8 GԒOu0/%+/`JcezBr'?PXYfV bz, `놙9zm׈55$dMJ11w#;~}8%UZD7wIk߫Aﻡo Eׅh}N?/'ߊ\lmGB@^CD_2rZHD-^_r+g)+w_i氵);8[yzڼ\_g/!!io`&8@''J"Ny3`g\f?7;Yo/a0+̪W?Yo `/z=f-_ 﫵׸& ?ԯEko&2 9^Oה -? 5-Em_[xZ;?ioߌ_-./wW>t?-s|5w/zl׆@_c~{gmM]^NLQ~;[V1 j1"A%6Բ2J~JZw*9f-\xԑ{p\3JXͿ\C&zc4Ci+vR&B6WPۻFS"-ҦU])K̫sKb2y!g.6h;J?mv' X1Q|GL}aWa̠Js/p8AD{>|(=KkNwZp `x-Ԛ/a'28B3Aۺ͋b;$av&=Ge(0!6Mt%'vhD0~%ER#wgbĚZ'0;Y=C])gxBS3(o3BW>WgHY:oNkXu+,J ttdʖ;,MhtNMYj=n-PަY5S` y#~"[OË{ՋNhHUwJ|Sm`zXZ̺3DlM.aI3$ h[x앇{S%hZ l#`L̲pw{=RunϪC;;Gi<;+ ˜,i2͛FF~3"| 8rt+=mx*3nB@]hq9LaM`ؑyKc Mѥf:6c_P. P~ԏp.M}Bk2-!}nx\ԒzX9BInW1uXWʈvȗ_ Bovs~}C>r|z@B܍p'8doI;?a~Ӆ7D[:쁇-\fdضԊIՅ%4͜[^Ua}e'ge!h&Lrihe3e! Fb' o%=<B"3=3BAz~Tw,#~<LE_sȹmXo@:}`2Ҭ<\;rn#6lK-aMH`KZ'z#ey M n͡uas_ "5G ]zʋ(]'ҚZd/*`"PCj)=Hǐ/NP'imF!XJHZk0%9%.w,76 UWh%w s5:&?9X\Ƭq$gmjkɴ:o5R3 lե짟=2@/!p+!*="ϖUJd¤s" L̼0S2GRI_:5``m̹7rI=Pj|jMmuj<'+Ԫ{4 fk6C'"zc.Э(`RZXZ٨DߩϨKE>XEI:DODއYh'[37.c_Cp|x垚P]t ZYG<3dMR#cτKF~(f*)2):C4voo d|1ayRʸX f|ߎ1 !^̋{nCL@žjayEPf'2M,Sd2Q-}FxOYԃ<=>XZ+5u,H&YSiCKb;{Xh-fv)X}K}^ַmOy5lUqʹVrvX]Q5;>oV(c)#,Y#5z)";E"L"#O2$hRsk3VK'F9hںgrZC}!՛XJxi"RTy戸}f1+GqV.gdϭ4594gbOX6mZRl6/ɽ\Y3*Х:Ӆ@ BЃU"h$>؉zτ3P'IGJ(]k&dNuLߺ7?@f젱N53* n]˳*{."ŋFĥx](J0u[/$ުdͪPt6qЮQ?z|ӚeⓏ?B<{Ό" 6eFK-ȫ"8xaJ5d{SFS'F;q3g0%7&R4AJ:vokaKBnC${o4W~Jd}`aMUF2L!ޭP$c|ϺpW&(AIv65{~H%>F2W:^R>i=)Msj_n ~zP9&l:၅NVVeωC:ߢ A%ŤaCsgP15\c:1!H|Yb)@I8jz2jm=,vrF i3l2Qr@]PF%qrֶo$Y|"P=@ó!](nH7uNΝvrEFbøI)01=x$S6 "irj,B^V!MqOgcgO"8Fm0RaJ =e",?@_~nY;2`[~tBŵ3 *Z8-~eTdię`_2Vض{J T|aYd&d7MN\yy`ZG8Jr}}vgG*px@o{JS5c"N҄V䈭%F  ~4 g8ãjA UểODh#6'_9@:*{q%ELK0Ɲ /c| &!K'+ dRP9i~3ߛ,iPk";EVhcUeI}BEh7yg6G_LEr^WW-]9=Ŋ6}f2AaE N._2'lEҟSQL]>;!c" 7GorrAewd)% V i,C0 -EhۡͧE|pCrR:/9!eMȳXo/ՙ:V ?ؖSz^|:'J(+r7 KRVI&?ڴX͹LQ˽E}և#BaHvM95(x*,|k Vw"$*B!~5Ȍӕ| "DuGMån<0UguuVo R[L5vO 2s:zN tGdt {8S4}j 淝:Mm-ȯN5ԬR>֋ը= t MD#+@iWg"Hrj9}@xU1"4PKZE b2]׍Xm* |Yw &H0{#nhXTzD`3X:wߧ8鍁Nw͖M_si_Lvp!QD Ӊ,,Mߝ4[ݠYnHHcSKz<8Va1%F{q o[YW綗ԌѠA qLP`Hmt5D]K8xIɝ=}w̭v3AnG_,ud_FR::;~R/ rZ::O҉kKl[6ț EC@y`ǓW:ά ÒCTځPvߠ/mRJAm7䣛6%4 Jf5ٲY(,ST}Ќ4BEt%?8,N[e8]U niMUQl^G) $L 2ѬL^a/PX&{-(H(D c^.TϠQb <6[eB>𬡹R8)sMq9֢b1{h'@1ht6\}P ׁ" Og].Y-I5 !")dƼ@3 odPlX!~;__cIl}ٍ}xTHw|A >SNв!Bn}0[I3}<՘>$2k+3AmLx ͤ8^P- ƌ YݏOZV̝5P7.I. ll\^FZKQRHGW;y2!/ hݲ[Lj"ˇmǪDqr]M)Y]qjH*%^I=Vcr5;0P> 9ьM8J WeOYLQ'0-DǷ RC1mꙘ/ >ŭYn V}őG-bKL9L* S%E/a{q#*e;kŴ}X `>@yL#K'@#⑻0N ,`p 񧑛EJT}K)%rǻkqogل+$F&D͈ 1q /q_*:"K58LSIpv$-1{^3aR@WH#z |Aklf^nҤN{o40djN͇'؁䘃E>nl_(zv#$Z^WXzoPƜE,T]?%=5nH{I[<CNR5 SHTzGi  #G%KCAFBRGr b"VinSrZ޷6C6+Y4)5E2};g"wiǔ|ht .VCJzA\$Rhy] ~熮#W5!XIuh8Ye0fYu+GR^ ic6 Nε{"[P6'M5σl]є䲿,|Q0Yiȥ9fS9U(w=r yFc^*|DŽ6,!o\Qee:aIW$p jouGÈ,dcTʮ;Y$ paVP,2i{\bQ(Ir_$ta+[9EՄdnѓ'}Fm2BxɊiMA9}B  g͠3$;)=!\Iilݹ6Jsz/ t{$#^D4ULS] $/ t- jj >[P|Y룫睓p; v,+qNHƒ=Q\o2Nď=lnB`@b__xh UۚG11ijzE)#ƏbS E̵9çc޽k͙,42ˡj "*N%T5ި9x#9}HwQ$!BZ?a+1|,8SIJTz_a߇a"w 驪ֺ֟Q2u.l4<6L#[ ( m IUkmeN.l::9۳RH'ةR0Ox >yG•j`mGř߽kfmH%߻mYǷ[cOYNKT*~dUJc'K Ż"wXkkx+>"$:P]s8کծ8;AE~tCU"ph\n'UϫDȮn}6iwK)[jfV8UQ&*-#4K ϟc0_BՈ;HPNdTԇ+*.B)?W63xXn#/GnF*`>t)S0eISr 7@u3o՟fꖋ>XA~9-CtzDxd̔R!٫Q凓ڈ{T|.~0`Tr] Omh$%s5G3x%t/Y6ĕ^1vH灂eTlO݂ aW*9\rTa0Ƨl׃[h|VFh!K)Z'k 'l|p#kU\~NXXueMؓ81OLls r&s̯gc\dC֜ơqK^n xz` 7. q3y_lipҼfқ" Sj)'Z DQ1C谴> SmQ䑧uMk4L oƸP &)L=<ǦM2?gY-LIkhN'e> X}KQ*#iSnYPY>Č8:E -xyͷ逶f~4}(Ӂ , XrVqcThqXhWEsz(3c|]ՏR+ǼQǷd<55T{IYJc=MJ}:^.o,A+-(W _%JYOɦV*J-F$Tб@S` sh8#NNM,XOa>v)!RMys 7뎕YBWk}-3UHjQuϓZHAȅ0ḯ=ڍ x5G#R(Y;bFw`ַQ+S%eZfQf'_!bA[iW A "RVY|d (CvȔ؈z)vmS:תBT }d-I Zz/ xm@K7^ _@U._'0:?=AZM kð݊~hMKxp!O^g7T5_^\qgTkӂJ 1ꨰ l94$`ҡ=BHq,6MaF66nc/=X6_b1:"6:u1}v1nNլZ6*e.AȺۦ)&Lbu~=>߮{eEPU@s,Iid8M8XV;㿉|8ī})Zn ǗO"阪k^MB@Q”X=__(Nը5L{W7a͜#ljʱ(DEDhv) {'Ƃзǂ!u, _區?H ef=Yf NNžV\*Kb8HǜD>Q igqmSfi&$N"H}5/ނ'1G6ZFs||kkIs2o:*G)}+FMPPj#lÆCpa`rtsky sBR=B\j)BߥVbgZ/+%2YeE}~S~]coE^n/VG:BVMZll K׵sgdc ELZ]WOֈ8kIr5Wd d_VHR22awv'h`D&TG16[9jcO;yH:>erC?>g VVK.ƒE:*$;v; }vC`Z`|飧 ;s#Eh ,&U\Z!osVL( ;0RiQ 0:B>8Vͫ%=Oy? ל>O9o:nՒ-+`m{<̕쌢3! z8=@\hcf,T@|d<:oP$?pfz]Tcdh= 4Ґ:Y*mΘW[+<f%,tNv\UROD8I5)GχqsG0JCp} ->(!0eO6.EÉ)uAZnHb߼ 7*L #i<}P fn΄~}'A= O S/IZ!H ήl:̲E]`W>>aJZsѓLyΑM [i݅MDGGLUP2Bqc>L"(ӪvcaN%Xqz*x Ԧڥ~#%%; #T3Op6saRiޗ1VT1a:¤zdH0;>hmHgreT;mx+a9WFc5t*-҇T;$:"p4z}GX(7Z0+7&VCr,g`KUT~өQ0Ppz}EҒ~U^.PlD3H= sd?G9P-j>on/C5S}Q +ɨxO1|lMߒ5IۥhoF4#L;"$OMZ%@ ֒xQ 21TSQIfn ?mb8B=wOAŕ[*.FhijvR reUt- z :&Xk&gQISZ*(L&Udđil;.e]z?3+GtBX|UpU;Ԋ#̪yYb$ 7תerT?h  endstream endobj 255 0 obj << /Length1 1422 /Length2 6329 /Length3 0 /Length 7290 /Filter /FlateDecode >> stream xڍtTk/t3H͐ ) 0 0 CR*-4H#%)(~u޿gŮ'CY($F$(ii@A PKq&2](rPB!NiuWHIHa PoGZ qCZuB¥rD#ll12as5[xӆ*jd1izlEVt7K(;0n=.rΙX;ԅ` fwi̒;0 V}kbܙBSnkȴĸS,-biWw XsKEYYp!Efv *V6#z>]z BcXmz򖜔<[ԳS{_ؼ,=kmb`xgwM{O+%AMT]wݡ@UPGF뽤`)[nl ԏ,,s(+)Si4a H"ưi4$f^==+<=}g4#xO-ʼEwtF8U~[+ vx&F8u> Na^2NH!L 0+>=J*ƹK#̞,]76P/ÌsB(<hM!H06g`vH 1X*W~"^ ?1e;.>a֍/:DZȼk\%{C HRIIX;i sy͌]2f7iaG6W*\Н3؜yK^8H"2kFLss"{V{۽o/Ӆ@Zʼn5e%4 ĸݦ] J=a@UN (nDEn9aڄ V~L|6z?"8*6 c:s{ѳCao.ʲs 1oG F#Liwy9}=%v] Opnb5,~O+fŬ!O%7G?9%(Q#^=v׎]| R$]Hq~_,[s4?Ahu-r.LE߾'fqF"?Ȟ} ?mL`歐ϗ:^aۯ8~X7*!p6:9ڹ } 11/FpKe^eĞ;Z7 w+˗p:eI ЃY)-UڋSj18̐5W.lenJM' !HkAUeiUkVE<<ܗI?lϘ_88}?vuS YKkoPɽ0֊nϼe/?沙a.&SruFӚtC?Ux'?e0:uЈnogXk?ΒiC_\gKd*J9cp͐m7\.x0xi)k,q6%­I8=ʘ7lTeo{U*'*ܟh#xtR3ܰH6XH0O{c(<'F|O`X0L-x'<`$۳ŝw`YIwΨ3'~Y'h]`=XC?`%? ry$rLN5Xo4uQWnW%~\ T}ϵW l`1SM O?UT>e-eMWb|K@E"vV_R(1:Z߈!krIdxU:LNsC!?2@9u2[-Sv1_z<7-nujawFfxf#vqbQEl,טdfU%ځ5=.%Ro}ajXvɒ2U((&yu%cVՅSܰ6Ө;N0Տў90N-JI'lACd>8FOr`ڴހn鉍 !IIކOujتPj8`xDN&UteTR,[^x} ɲ_Zsw<6W 1SX>9"|ϿTX34v"\kg-tﬦZӯBdRċH%q.|~N5+YkBj<5-^6F"O鶇U=-BigZ葻b%*"5ZM]u֥:![_ .얋sּql1 A<Xl_kݯ@$ ÿ8qjM|3v˄OK8'F Z\DjBp3+ (%v9LF|ZinoI3 KkT\9!Z0z}$}n GL8=W84OmU_tj%nt6'fxE`˳5pj>.6ejh{Qn7gǵ#hß#}s8bq FC)յKixi|q΀} 2Hs :cB(>-BX \Dі;;DŽh^N$e(O#_e]xX C,hQ:j^ބy(ή~^B-ǒRUpӍvhXbcJ;ޛݒLg܎?Jđw z9<4hki(}:IÐQ/b[z'4F&=^Ǟ yJd08EcVifX&ܝsA.HQ&g>RO9)U7"h:/p% T|*vЅ3_ ̺]ʘ%| 7ͯt\m!dv#hqՒA ZBzV}.W֖&]_kmlې XM5em;V$3 Yuږkj٦}lѬ[Sc.uL̢oڮ@xtcY`cW"ES8O#mg 7Iص[{v69kZ0HJtq<ʹPK?rg悥IH:ĿZq𔮋\SBPIīy9.3;oe:hJpD}\Ilt AixHB]A njB5GoU|f) 7@SV,qn WY6֬G]EH;_hbGc,&DM+!Cqަ{3'8fٌRrZ&$nIkfߓUI"\1DڞNYKPOo=*`xgп YlLJ?Π-:yǔ ;l+`EhnׁU, k^<_džg5lg?|4b.@rKDSZQS^D)ݏ4ݳuL='#@+zո}?x"Mj ea\rS}D[g Q 4="7Ig4^JCK#TGӭi[imR3z$U:n^VvSX~a+ZڐQUg{5St.P|d߶ޖyz50oVhn.n/ Hw)=Ds&. eˈso[FC*nD_nDJ   'Hsk5jA+ehj0Z66ޥRBAүgrilV<(KNWwѿ=ym>r8Y "~) Yu6ez.o}vPXKojl%˜!JnU:ӳƍe@, őGH!pǸY)q- Y* E{vrZMnY +ݻd[hhh+A#zvJ~OqҢ9~Wzy:'kNTΙ=w|^ MAX쫳bC4LDhdjf$5N:?ߗPT؏L.t{mʦ^viYx1{-j_4Q޼0 j*YXM7麲 0pX;=~NR_V*Dv5˫Y<fd+B6Nxcs:+PﺮtM5&/ʂ|JWd͜fZ~1spjXtRcmwBDpoTFlҦs`I{(p,t-+^?:c2NKD@d\AR6ISŅS}wƏ쉡,G9<.7N%7窬N>ٵ;-5}rk)QFeQ\[y;at痁83t2Y:q̣[ v b$H3~"H\/re1Mp>LQ+T=Ǿ4$khvK!~q5GbeUrβ-鋙BQx9U9Wgwb޵pp}~h"1wm*[gdw.@uH\ҙ8̎qܧ"Xl3Vvy+au t4óoUyQ)ok'g%'kO9i/ o?MzX!'nu>> xjaZHhJ- endstream endobj 257 0 obj << /Length1 1608 /Length2 8902 /Length3 0 /Length 9960 /Filter /FlateDecode >> stream xڍT.H#9CtwH7 1tHJ4ҍt HKHwE>so{k x="  !0:W7;TRsLh`nO/@ \vV" qà9{d qH8A\,͡s-1#@ fi{W&[8Yӓɍj ihB +N:hڹ%ׂY=]!G%j_ wq699C6k;G@MVgC~;=- Tn?6w{nvp77;-r8e aOb8voο6yB}vP+MX;sڹC6yaGfxA ei;3[؁3`C|o, ?]G2~ ?TSWVa$%a^_v.;/A?Rus'xy0;*oY>/Gq uwtf͝6x;.T`_S]_sw_>$6gpx۹yA1_xh~?9^ Yq{_*sYo yCj }\|sWWsoGB<"^/n ^.Ǟ0WkpjZF4wt5DPi5 p p8pB}}i9Wv\( ٰwۑnA zTxgwk.?祧5r}‹?q \؉@.&QS+5Xfk H ݞ:f(fʾ 0Hoiq2п۾3N^D*/6G޳8z]>3lkO3z! @'`|u(0BVp iߖc0πxۂkie hQL1ވ /FTTM64Hy&zL!\ -ytu!:ڇa\l#$emQ1O}cq5EI*WM͏tdgvq4N_f%n}+ō, P ݷ՞6(~mnW}U%(?%#~[ 4Xee X 봩0;hyM)߾d7K~2@S+f^GU/5'u9~ƅ3$xt2:+}9C]?(Y'_N/?Xw4MMYS꓾b I);!U+`CgӉfD\r& P3F`edGiGq`P_d X[: S\9؅%!2ٟRY$6KR!zQkږnR ä Qu3zsV|&'/.4W:uf'Y/?d2{}F9NFϢ>C wo{r6ޛd3JP.fū/Jq(t 拍,dې[?+Y+JD:wKm&!Kbdx9}Za  \ıJ@Q'UsJѡqT'NYPB v1zځbA~IXSC6WC )d1,Nz}DNVQv]|Gy1-44m_c _N.navB%; %˙y<59cv_ "%ӸY"Ž_yul,rΏO2͈HuL ;w8j:xg:ΆQ܈&w ;ͫ1r̞AaYr+ )~n}WD9vK=֞wcNmн7HD4+ba~<ϡ~^\Nj['ICVw9[--g_?P?j:5ZfaK1d 8Pxe:kʢ^w+"L(ká, :>֊Y% ۛbk.TO[ˊ| oOΏ}Çі'6S5Kv 9V8h*Bk0( >#:+=mp,yǸGfݰ6,DHwHL%'Xq V^'9D?.2'}Z\{%򇒟|%x.}bs,S̋•B+AϦ#+@<w>}jIjVјnyGj&&B<+%OW?Ssi鼡ң tXGvb҅M}pӢT ؓN+a!/s㡥-?-fXMw C i qbKn^aWpBD(e^ñMwlOa凂hA)w.z&mZՋ&<6w`kQ1'^A۴9k2|Yel-#D!wϦZ(7u4옩RQe%x0.&El[ IV?:>ٴAԯqRBAeg0`\7΢;2zXKA*Iԛ1qh:g$Z:.13Bo3# e)Gg݄m]~o%2 MLB!,{:Y4pFVtLM)9k_{qrO&g-|{N)k4J Aˑx%YQPtJ["(EnhQg2'D^Ɍ؛2mtX oˀw[C,_%JxNovGDƾ(|eȿ^nzA%݊>, sg}jb?%w2 LǭD5ӪL)0`thBnY0aN47yuTLwVKEc'+Y[.MhΫk?BhqL#A]xv\FՌ%^D&\ؔSs瀲L:3KSpjXt[!jxS0}oR];|cq26ɪEvy~RJTaޛtZ ^^]Tٳq~ʷat&HȐ[6H]LΎ W$[`0PkyRwQh=2{gMޮH-@TY^,YTew} 6bЏj82Q!a}+[hzqV]XFJ'uR@S]\FNQuhT-iةFR΄״s;1͹7WX򁋴(ftMy ߦ+h_#n@=a?5Gv-Dw CLgq SX'g~o\O f9p!u=Vvg8?w|-,O9ϭEls*bSlE&HoT"{<]|lᚏvjxv;1 &u88v?an[_YPvbLB͹WmyhG<*᾵&|}ׁszɅ>\F:)98I$)D|;ɷ4RNN{}Jp@C'ֶ Ѿ/`_pL+SB @j%',Hd %6G[H 1){VEDl%W`0_.u,7ɳ,KVB֓lchNdAᅡx~?[14\;ivU kWJ;#߯<RsV*mV;]44 N.VD眘KQ>vr;QV8 E,!Oe^3{f.*PjޟLV+p^G2I쥀/Fʻo(qBM/2J̴ZeWe(P:_'7t37 jyeatծ >>_~Ef9x%~$IBm?jERD(VP(5tY[Wp6\1dpjѧ zOy$P`K7S9,(M a\Xo{'lhPIb ΃dɈ W-H]6ή$St*Et2Ր6w=U_QBQ#m) '1lS+*v9r'FtK' e3~Nئ6 `}0\W:A,TIyZ>f4MKkʵxg:=\7Vi|Oٮ  y3cdی`8*j x YEyw,Ͱ1)Y߄ZXywGEf~N,Z U#!l?*D]( P}EOӻfU&O.ӪPUk{s qV!4ڢV.'e` AϘP&KljAn p% tK" μ%\~#u'2T,|&ngtm>|Wr =VR vxeWɨ%̆scE4kAW8ʳ #W !iX G)h}47n>=E6 DX֫eÁS}/z!б<}K=^/+K$$D )}= XFxkӂk{D)*&{؝r]sv5Ow'sw.;q5y]S37mL b9EJi!M2 endstream endobj 259 0 obj << /Length1 2664 /Length2 22766 /Length3 0 /Length 24268 /Filter /FlateDecode >> stream xڌsT%~ gNvm۞̝&ĩ&{mkdd}<]ZO)2!Pڑ ,```c``B %U1w[@w0@h8dmRNFf##;?6\gsc,@@*lcfonj #J#'';?A+5@ hhd` P12:-= )% t; XU)@_reG{ $47Z;<Pp @h/c#g##+[k7skS% /&CH06ch``7p6040@LP`*9ٛ::9[) ˢ6VV@kG?@mwdX۸X{[)ɖ^ ()oMf t200s2vz7[?J?bP^6P@/s 3h[`ln0[#@a]Z c0'zX[3_zI)q 5yU_+@`d^K N/FIkj5?u8{-(}2 ge mX@??.߄Ĝ,-QSQX[N5UeNVW+h:AkSAh`hd@@? 4Ѓ?* 7cbe!FBFЅ]Ym=#* `bcglz?!6b !Ћ3#^ 1%3h{ ^ r~C\d(7E r/@ѕ(EWyCo] q['@,oJPjo9YX1+1=yoQd`l:7#Poonv-?>vN{5 L,_ Y@,Y8 d`e/ 2-| wiXUo̬ Wkn Ԡbl 2[XkK[Y-Q6oCe5y98 -'3˛0s[b?Cke99w'Y+mY@s{AU=f:u/_4P (Y@ޮAPD o܁ ?=h`?@#Y#@ֻJAڝQ)$JZ6ik7D) =jaC[=b&vZ Ҫz>y}l"ͲsxΥWܵxi8xvGqMx6R5Bۯ`40}Ƒ )̱WjH<uR&N,,MLlt?K-Ix.̋`U nen{q%4mw XmA[GY:Xᯉ-2F7kD2e ܖo/ED؋IX㪪`"nUO01l3* sU<[Ѻ'% kۼt{ FVFʧ<JpFxfQΕPE i>Z|/zZXjLʱǃ[xx̬ Ne8}{9S"1.ʡ$~6<{< Epɯ<-Vg ifW|*+S//9\xXg.y$? q%75zK;10? AJ8UOLyݸaϾxjٝj77ȳ8jJ6R_7R+ghowt#J_cڿM3zaT\v[I崅SsGofԙ\ 9e'˷pl#xNb4mINo}I{:&\6V7tl{zf>8g Y`p1O0+pc\\!bX*_MUVdrbnS ?J>=zl#'1B8XAw Z 4aY-2,$AS=fǭћ\[*2es R*  gݦ[r{D n m-K4oWb[O7,Tܘ6$mW6ߒ*ݶ[ 8yƣlt0sn[Fde4W J_"|`-KʁPjBB^{jߠ̱hV ΔZ"!d&|]1F?~迼R̪@RQxvȺGھ,b=49 Ч*~0`cƖXS0ppRAӫAYˆOU\-KohR< WȌ=:: \N>cݜd?'84Ww]HlAZN%1)]/ʒҴ+}p,rqx&a"#F7sN-`8䇃qT{.8ز\Y\ w,O~8ˉˊsHʘ ΛlX[HG]H)G b9NZ ؙ۫%_S_ ' xBK77_t7FuțdGprm\qdt*+Ng+8FŒ>QώC D)tFR;a6K7*gֻ9)[3sfg8V>ұ= 0&tWȘX\,wIP]V~sg P!G(V~V*^6WA?ו+5KGWQ+%k> h\hZqk(<\!8|=%9A"\SQ`º#ikBZV!%{/YS٨u* %zs>kzR2p {YS<֖~~I5\>F?їс[2Uox Ev][/u!?m9 A Y''C뭢-ygǯ?) YZ&iDo١h]g3>.>Vn5׶#T!kIM(h3ڒDTQ/*M3>rg|ñvsf `ND뵛wgVQ`B(3 2H%.[ROՑ7wlX՟a=Ka eMS,N^}{=W0 _ LJ`p;SXҤFyB Ò:80˩Ofe̊5hw_ X E3P:PE`A+kwi1|= "!?>n9٣.' u-VTd}I,_&K [L~4sOoo%i&,A { t@KR*f4($tsk:F0"q o8&2uċy-!W~xQ§=rY i^O7u us#gp#Qz!գ>1RtH`?, &*c>㵜:+LO1(EM1 >Qk( ^ҟXgp+o&zY"ܩ}ʾR:F"w`_oH ~ziû2'ex'/#j.7o4eY\YAKz@y<1qtR^ZqЍ^T MmhN0|q-]_Bnr*̼埏[Pbio̷$<iT;J~v&C&Qi^t{"dCNzVNB܉UO<n1#}4zouUe֡z"|^0Ի&Ŧf$x}:gM7ܬ%0.G-Pےvg&k̝J}W{.&Ύ'5?\pEG.*A?;-FJlP;l9Ʃ5] )WE3ɶ`\|&k8]@$EkGVbN:/O3NwMձo.-mϥ\g{c}iu> N~p};lOcڔl8n´*F>Oft`wAv51@x q{^ c`M}%fexr8_ -@#䙴>@[?JǠC1󯖟O_bf6 MZW3l# T['.MMG 9ՊeM$|~p[i,.xj0ye̤P"eGEn׸ Ц:-Im^l8;1d oͅeD"Jbj24{h/Ev=P7f}J5KE1SR3e,(ye[C^~ zoODf<?(2 8h ]:hUfx4F%t$6$"w2|@DIiUy<<]yە1@yiT ,=Piڪ_7NeL+YfWe=$MGq14rd(EaUr]#W*\'bg{rʟVxJ)[gaXLD̢kT (u'h]iC5Eƅ*n5#u7['O^^46X1ļR]" U3UM1wƬ|i[,rx!7ZapR[('ռߦ(a즹֍-*B`Zlhb!٣<C vvA^923(ay\&3V݂gѳzybfj㞤Ҵkp/Ѝ1}?xrl`*gV9Q5,M#M Q4[BSb`*jg.\(%~#*e!eVເ ޴}֕m]">8%j*@ L>%ZXDV.}Y{O^0}"0>}]Ň4il?iZ<rbq^a3q . mAjAdQ٘9$`:L9ċ.x`6pq#ؔu.yN֩ZUl䔴 nmrيna % bcI#/ 7p:.C*S7w!i5d}"6b@ G*HKkE67wn`VAݦ~o.L_ߗ fr xU_6QKC;PtAŵoAGK?"|B*Յ8 PVhkju9TD^{Μm4J344ĸz_E kZ•[WlɷoVqR z7 lh$?$V Әc| QpƧ3lx&oUr>`^T!2}>{KWX+Pg81>ձtjG)59V*, ]O`6shiVW_P!euú$GY⪧qNVWڅw|8Kr}L׹gH㸄q\+wb5/ QO9IΣӍ{8j Ac/H֘uJ^<_.^Cn?|Fur5[9.y  dJ\(GG3OAjb,VoƩo J;B!vl\&-DU{`:Yk#(ػvYuKk#}RX!/M +ml4V rPKЃ.yfcӅ(xG2{ }eG* 8E;2cik8V`iӼ*WnkUbj%$O( wLbaQsk(jv ]2 5""K^1~A QǞ'!gi OBZ0_l#1 +ڂ%by s}\MI*h y|<`K)7(< 9껨N >5 7"ezKbtE8a{6 ?W3'"@&E}%SG,NbCz!ڃEz-N_N ;+Rl:6p>gIn TǖSkrYLV>9৺ +$RO4 ׻@gp wHe6:n)Myla_Hs k6gHH+jN ԃdUZl领_%޸8m l@Iam0V߭;}>KߝC CjbsX:158 ,=^mᬑG"G9BOۚ$|Q's*XޞhB0lOCiCk ό,T<:ː5N5QxZ{:K| ,kP /jȩH҇q0+M1nЃ?U \R㍲u~ Pdfhb`påxRVql{M$[0wR#`<+{OKp`Z `r3M@vLm-~#q-zһTLԞ>YaM4l#V_CZ}U>9yxӹLI=j#t@5 }z7F6c+ڇWFZG Q qmϝ٥m&Ԟ]fǍÖ$#!ӽjc%ŞJf8=bm|%o爉 YkSpfLK1EUna|kj`bEPփ6Yq ӧ9>lGZҤs{Aa#AnC84N"Ϙt9sҒ)&"6;DQr*S~!PlVʷw#ހB[&7wѷimԖ+y'vňooVSAFy ;z*kӯP- .rnFK¬l%( ~X:SAN Y"P3D yLjA? ~Y7㐺{tbD>fur'VT o DER `0HAL6<Ѷ5 l^Zn{*g.i!O`&d Ѽ>B5xtJdNAlY| JY jjTϽ}1UU_a!ዱXQoYYmL<^,(}:,a#)تau(mIi>PډXcŏp;2j>M8=Wga-|Ep4k[NDTlNUBKU[KQ*,+P7N:Uvxa-|fԣ*?ށNZ޲u>#[&XVSeª7MHe9AHop}p2cAhhNѸY{@}PQ#U=jZ>|uEwsVm W.aq &, ;);6ұHnRn&t. +o0^@$CBkoLF-?~hgC*2go^]f.nW!auϚz!2/Fem/޸u؛9ԩ֢i*QS2&[Nՠ`q*LO+/ ]6#.tg("8O9&] X%Nb|`_9^YЫtjQpsD@PF9Xl&<O,Z ,klH~LZ>t2^51ya#'ġ#AN6cHxpΠx YWK6*egf^jcm[=noX5@`ߪjs$`5Hw _1o &xٽ~)/e.rC%SsS,Q`Kz8Sm,)H]ncZi4|  1QE/;;՞*D5mvO5 (T?Mq>/CZ+¥ůپ՘eN+ Ln;W] ANQ+0 >\$,qjrsDž6weLPXQ _jVoIP34..X?d|vO=ss[VI\V3?DrRl4aPs*Bv#A[\SL2=Z&Cfq =)/r&Zofo_UK? WQOUlꟉx]y$R=jCR$W7rdأ^-[;סSۉ2CX' z.,|^nxqo\;$A4Me6 -qL(hJ+ H|&mfظY8pg:cBv(YAt\җôV5~r'W%"b`IR5+! ,e!P I.d()Ϳp>|d#D,0T?VLW{59ꤔc/u&kߙIܴjT+]u2XȕJn)O~uv 9iV$.RtA#kaz}E}@!U^la W=3@p]0P sh 4Ή&<64zmF0.beU_Cu֭X\+rDQʾͱpFDm %LË}iC/57nGÔϯƛf8BZ*$4]W,=uc t}Z fOn B/u5鋰S YURLl55׈BKm{_JVL4#!`*lspƖPJ<0R/H@r ]`zUe酪{.>=w/@߻wD]!XF2CwiK\f|⥬sS7Up!)0mOuX酣 jޅ%&=!|'S~ mU+'QQh_~YHa~d sNc_ɸbyF\F=DaEd~Uh,n\ᴃQbUBa^g6XWF-7 2ywxQKk? X,$$͋3]Z+I.1'as?k])uiڬXsCMTZ;Em.}i$BguĒ ʨ%u@  ]kf8v3N\3@OUOw{CiҼ@δ|lP a"]}'R+ǻČYr cb@]:ǥGYڀ]V~o456^QMl 5G0G옄Vea-bP3ւ@]n[-k$@Z,O.1\ &57mY) .-mC3WU37!Y ls ˣm[R`=Ӄ 06jŜG4p:\nK G4[klu/% bU敢2-Syη9Q ]3&3`'t!t!J"`&Aq{X$*w`0Mgj, 3ed'^v],7\"h!oS~0,W<#"\fO:xPAq@Q$ziKcjR%z,!~$*YbgHNcyzMݚkbƢJ{#u|ޣ5I@m_{-k䣫Oc8e`0)|h?V*BYݦ`LY[r}):b#Q& PQRkOpK:(Nw ~˅s?tbNr:KhxOvYjE:8_ZBz^!,ccZ639`RO^Dħ/ah<"-π ~,r*ɊsfĚox#oͺPQ9?O4Ol~4/|>n c".7|9riI7$ZT~ XpqJ?PF\ppwT#˾aND[t0%[g@Jդ9uktK%q+(j WU_(̵=lJp`ʔZC#vfUft1Nc&|-pz|R W؈n(Gbp{S}&sz1+Mv |ŕ)]@de$~IһxnjONLWI@RLŦ,f?tHi}xaH(e|4=ʡ}"A,vV&R~ (X)Ƹw~݀ѩ{2kw'17ۣ)v{odӕ_\𒤀u-p?>!T2.v86v^@VhۓBOn;>1bw:cţh8Z-6f,:27|4w3*+Cs,ַ0qw6CAad~>=e;ňvx׸1,\ uð8vտ,U,wݱv>>N6Զ9R ^}2y&g@,f2^H# :)M+ _Tb.jVB dC)~I45#rĦW)y[MG.q|IqMsF\9M;)6q^Jq$\ٿQT'( ͭ38T^Ե&G*1Ҩ|LD>VĖpL@ddNyd)D(@O= X#Zف zhtrUT!*I26/+BM}:"u-MTOrVoyVG&$') _|On *i_|b%sz7`Fhzc0Ҏ]fKx\%b']tS 3`/UmFj'X Qwđ)kkrBwi\m Y,6ª3w$X]XcG4ĔCcڅ Ux4{ʢFFݢOJ&;lk->PPO[t5Oe'QEQtV@Pxa;QKtUc U5 39HuJQ+wTQJkk"U?تq"*F & Ӵ* un1N Jf4>O٣e8_\$(;+e *x@p%yLR_=ow:WD܇iyw51iMHU-_?Gfڡ8j]z$ʼnO8uכ"@hpxaK%/Ib2S(nu=Vqx5{Ml+kse̔Ѩxc*FeSo7qs(\q Ech?[ϝL|Y>@V,Vtz"L((~S^dT_.*A3| N~Ц4v}{BcHp5Xܿ@7ɸ97?tPcD`xD]3~Ɣ^̽)zQ_D3<̃VNDMd75o劺lKR7\Jk;WMŪ`psD;-W ÜݵŞP1EE'3$Z,w, bBwR#mى_BOFB_ 8e("<{V{Uy4l|4,\~62׳b[}W#M ril@h?$iA/#y_ J{Țb;>RL=0!wƕː{V#4tcDX#%t ,oS9e rGM.ޥ܉nov5zJE'bo54)F !jdCܫE`DNd/:$K^tQћ&my']bFقsȖ{mq=#dB*BbϳqӐMn5u`6d1;tE՘SeAS9B~X\bO܀)!a5&#<HEO/ DVIhϙcѿ[|@G16_K֚zR>E^^c{ڈ=PL?"O]g?=oa&ّiE>[6 g,ԜaK{eDG6 rC4QoM@N8 %j\ˌzNǼb"/ASQN夈㯱Y?h;#LetKXA24fʍaj5T)M/Wwnכ0+'ɕ)i(Y#?Pc MfjO@:8'' L:wP>H 0G~xIf;q(OMa jT=Td< -g@ƬW2~ }2-~&ho\dpv%#>jm /%n|ntSYb\I8AZ"I ueyC oZc#UHE.7F:<^h9!YӉY 0 ~qO e@ouzl==̏sJ ̌}zY0Pz,KZ '1, .?1E*#AMj r0A3,Df=F3j@=pWdO 1LDiգ#BMY`P* 2VUݔyHe(B7n2QVg}% =L L)>@HquI𾩪5Ȑcϓ3{iTンl1ݖcCU .@Pڽߒn%aWɦ]sqZ5E?W m)~V9u~Yu#/M0R?|)6[羟I)՝Nшe;1sRG/fWMYI}V!LoфO0bݎ.%VT>x&T?W^v˜ZPy2 ƴ]B@w':cۺcpwhg? ‚kR%:f1ds=zKsɝ, V*FHE76Fޯ'FC:U!\ǝPH*Jڄ)^-S(\$"[BT\Qoo $ n$γGd܁pnL$uSOI𢡆3j!?'3 ÑKe{ě XFJX d`pMH d8'a/jr_LĐ])3 >VFp08%x#f5IHHߪ0Am[C CaVNDؖ}YE~dR ݱ'pEG,(],RiU+2ڀV;풋: B~sGɼ'a$ v~Xsqq}Vo/Ew>j]j@&)du ˹#Z.Ƭ9Nzz%5hCGPh+[{b< 'mT9CXbX:jpo^_ "k <1X\f-5iP;cfY&x`]e=-F!/`> &MkHRczj58GqЃ$ PTU;Y:\2JL5q7뤖{7ؗ8߱qStcK)k >=OR[a uంM0& NNp&J.2E^ 0dgVY֪h?IռKc"Hk'CRkDŽF#t/N]LgE9챻Ou,(2d+]k# [G)yۊ!`P溣T,_I k\vnqS&,r; +' +E97UwH:6!"njP0Va2|'Н 5vhX)l;'2,R )-IzLfTH`JIs@_T18aq͔E۪C7hVrOi{nu] ޴Y.WpDtP\n97ׇNMP>H"3zs6-8Q%g![K'pS9tf;z 7Z*T+9 91lKFߣ0\Y>Ѽ r@ cZԺ؅ekGmz%lBAG;kTO/V/iӁ7 /my~9{q [qZgt~L'* s;L+'%УV$k/ݷfp%D `|3ʆ<^@f!TV#,?!=jyn MNWB7d6/\)!@=l Y;_yDTk"?a:1LFϻ u.m,&^Tm;9z4,wk_xO<=X4?TSZ[9gxI4u-(*pʚf TT`UH\^e8|ZqW|zqkʷ0kZ @i2yw6տ|s,N&z宍-Sm4> 9M qIv0f(Pz3D!ӵ:'>p)yon!l[o0*Be I*SZk<9fxD5urڳkg~6Z 88)`玙U#,!J!pv`>pϐm(xe2Y")Z&-s"4S)A2eZF6[yAQ(7F9r«Nm}gj 2r [m hi%AxFiJy(O!V(_א#[Z}8o Y[:&Ć/a3,ShIE<!´s?zR1ɖY>T\碰ɟ6J:{>]7v wдĶAtܨ?S^ƐY`N_a[*4ʤG-;="7eZ1Dڦ Z~aSΪ4Քd jrRIk&JrVf"@rݼ Vyu}~8чm826$ NB}Y1#!zQNAr45ɱ|:Yۺ(eʞ &Q5%rƋbڂdM 8zgY0zdw' \)N|KAMc}:c7< w79e= f%ɩ]Tz&f;Fsh'\WfS SտYz{Y&Gd/)5(ͻ|s]ܔ GJ*|w7dקjo$`@;}۶"Qt1i.i-Be֤$GBbl%+?@lW/d{-_ zAp>AE!u<%K=ݵFM oKF{,*pnQ[`n\j)A;nUF*hjoGX~9J$'K=d/0o-XY $Ol¹)}t{׿w˜s}VR!/g/1 AkNӡ.`ot 86;+f<#"`'PF_NĻ/v^t,pXCDo|Y~l1pوtM~1һn #%GXVhv")c?[ #6v˕MBI<ȕ6Zӻw HM&:qN WjL{f|7%f㲰,´T瞦+H}9eag!\̹̇Ya?bc6֢lCِăJ2gU&(Ҽ.tbyAE-l:h2 #'|Ktq*t4E1 z"Ȋr k'Ѩ@ PLMY{ugvf W*/λ[VNWba놾!C b:gGU\y|ȍպ ,m$G\gdv:J6$gA^<ۤİ.(5~S;wLB::1ZuR7]^39IщPndɟz|n5oVp\> stream xڍP-=k n!8AkpNq䞜{zղݻ JRe5FQ3{=ș `aagbaaCTrmF::Yك 4v~I;)؃r.Vv++7 ?| cW+3@tBwpt~+SZ+//7ßQ;1`l {hjl P7:{3- t:(RƄ@ PrˮfoflL V&g`eb?@&9<@s+[ @I=3dG[[DUodhdeD?hNYd&nog9;!џ#=Yo`n23C PV7o~M-Wpd`&ce|Br2v]>^v7B`eY:LV of_z,o `/2z~ދj; ps|UX~ʂIx;p{*hZWPe pa?SoCR.ivVMV(ؿCmo! ܁fVΦn Tw0mLm|[.) 27c8Ǝ,o b}[P3 `f;Q.NY `27Y7zS<߈UqFo&/^oeft:>Z3|c|k_~Cַ [uVwo~_N #7۬0;+7%:7߭9=eר8:=>os{MM;kD w'g(wRi;]Q`h3oEFnK܈,:nm kKTi~:ێgpX~Ȟޚ6r]xP1WBwU˧5Jf)L`0Qgong0r&_I|Nًt7b<|Qgs#;H]*-ZwKߴj{@㹫zxxiHE9G %)jM&4#|Un]ĉA)UɖSw1N.L;FSO^k1?dcVc /$QkEf[uґUa 9pm:[k q'3;|C$@ DzO8YD.I鹭ʈC vi35_E+sy2 e`cc!6]poIamʅǼЄ_iU~:3(`d`*PCERl&/А녯DB`W_`9̿|^a?cP5aqr vaHD>?s v>k>1kf O_qZeXNc(v/d`C;B^@K(ӫYZv)< >y>tSl Q:\*J4Eee2I7:u~&xd<1e}JT& ]iKyҟ\U\îӏa; S zgĄ'; ZwX*6./#yKܻg4h+_D 튰_P.k5Kqݧ3?M GzPSW Rdp@ҦDةScrm.rRKdBLh\?M0;LƚFJ(1h:-2i.7Id:JꒃvF-[uŸХ%R bfrZ9.ܣ79Ĺ6"jbvIm a|?M_Ej_as#"Mxוivlxaʹd 9RTe9*gaw5yӭECb~4&u@ RTCGJU nw{ΎBHsҦf%FGD2eD)LCt&nA߁hVӲj;j?N )Qcƥk+U|% u4X<+B9K,=y"K#ѝHLL.6GKLCJҧa lxx? YWk0)O\K;"C6Gbdq+)kh]F}Xxm+D嗫Iᒓ {7jm?pa_Q'g_5SGj*3CT]d륑<#ew҉!A뾔K:5(NE5~/`bZyB >s)FJ<^{< JE/1Ÿ+c=,]=ӭn#3a0;[ŒTG3Ӛv)&/MtQУIBk?\v5U.ISd $ ںI}' & =gw6dzv K>gl_=[pMxvHkf4!I 5A-WNڀ %I9ѡ! ^ל8:BXjY;疙*>3EgUsHCH;U?g7]tU Ha,$P[H@r&^Lh#B7!|P~jR`ެzuʅm7܄{6^~m:7f~`t9y=!%l3$N\/6wFzހнYTO4/1P, Vƭ|g}/VS1A.SxswB䀋˂=@}/Af\tm'ZNxڹz&J6[:/gl+r ?,Y >p鞽hM0{׳Ox(ح d`oNo?r՘b2*wVϗ;F0=IT9Mhx(XH+)CiuFCKPՕ GDG8!TNQHU\ڤ 0D7MRL=]ɇl(?!k !B+v"t^WQIΣ= MY7o&Zy+1K򺙨A9 zmΧ76YC?cqm:^k.X9B@DJ8eZc4 ْ~591R#+ҋHIF ֠ |z$1نT: o% @GeRia{i΃U|xE.G/idNI2E@eM\'dFjlۮ.^*i B3! !FR&܋igy>M&>'Ns@!ȄO;sM>gK9fȍ jfP=e֋|诤,}ڕD,{VV`Guʅ#I-Bhd:{9>cB1A!K?i'A)T郆Fڳ(J)j Pp0(X2E[,4Ƴkѯzz2JO~R 0pfl9.Uцձ0Wz\ʛi,/>ϫVfm~`aRB kd:YT{o#H2j[l1R@|7qaw6IcK ԢJVTߵ+<siqKIѡvExcwY)Fˋ(FcޙWxb[)j5=J.=rj)Ϸ`ڰ|N9, 7 ~QJ #5U&(Zi7 _6k.24<(WufY\bD Dsń')v" 57D-)͎yai(m *Z :n@ 餆e)}ERXD\!(W>XR&칡#?09J₴lЗxPAЙi,2B4\:g<35e bÎW- dr2U*.Ɔ?\%j#Y ʉgCZyȐ7pX"҄Z v t1,tcd=Gg¨#*d+W9̆yFyPgd#Eaӧ' |)༐;n++C)O Z35{W*7Q^FP]^/?ډFdܵTfp(22H!z dIpCs[SRzBf3}ZUWKe=a(=a{ˌU8-E1TMr(RmY`vӽxV)͊/ki'KώRjx?̝ t5~P4G~!X.mzB%!vX7l>hwKn/K0ZYnno2T} ^b*]h1w(Q (cb[wl;Dm`0FsB6I|D?L6mB]iaQB?L,פG?RıY}H+t:3zg ~8d`J0M4X@z?>c?HrseצPPqS4o|F=ܵ ){ wQsE;{%X5HEo'߬BW^n=A2'. \k(OLAP% 1PzSEPKtikHZ˫(-a٢d iBGC, 73ݰy] `ŬGxWsd.*LBHU؝QUW5]Ɬc Z7?<ۓ,j>)ƨ*TM:GPز\zI>BYsdؐgYfDvOi?[KnA%?U?ѷx÷lzy|J`= +c4sC #QDwzZ$Z 9h%q:WX|7G!KQѩkڲ?琵ٵK!Z^H3 z-xA]3"ˢ>myebáSQޞ(w;ח H[ߔ] ì1aŃ-K5@o "#9'Zp_.Q;2ʘ(TNpjWܟ6|X&r(B:"w=̰Oڝj>$(SllE@/~eA5 ڷzV{C{Z($_é(nHi)h!(؅vbBģ5۽}"ZoSj9;yof 64bQ:zq{n'Ce}bs=0d,n.а JK]&yJ'UxP;B:W <;56)$)oMF8`;i/)o[ېxfB_ފٝXi閮 <)v`R (}DZ#zzZ|ڧrcwnz&L?&\ЊqJ#E/wpRoYʨx?:Q⑍Zg)8ǻh1t= (tbʌE+H|@axXeBG6cM B@mzﲹk!)f`P\|q0sUNH3W(oxޝ-S1p)o1$DcM }t_qL񥸳Y(z8?whcnbKj!D܎(K#{qPJ;w@nUE陫0U*pEALB<Ѣ^մKPΞTŊbfǥ$n$M< 􇺯ZTD->!Ghhg?1x;raN[C%wmyƛ80k„D /nQ?-ohaU; mIu !]bW/NĘGGTE kU32s ]\|V9X|ׂ`yݎD˃/k"[ޜ3~n=9ֻ-&c8b @EX~R]0uIaG_\4hb5ؔC$UEcOeB,|yM %<,'?ww󾉒U[A'k"!f+.J5Z#5X/KP愫H3|xDxbV˞Djy9Stp~j437 \ZLVY~.i sKZߥn1\B(Å{d;N{΅ P0:'V;_J cvDA n:,-34o&cLG44:5(gG'r446*C= #LڃNl01M%=WWrE':֯zY"1 7aD(OƥE0`F$RK\ąiKzUՉj)fñgC"X$9 kYϷg,*4b؀Dw+J_ܙ%fŔBB:)ʧ2m?1JL,/ZzG7<0R0']nPO{/ķPe^y ֝TEJ"<j=aMRbDkZUa>RÇ.7~'=6Mpl'Ƈ. 8/-ev\k;ʝ$CNv iF ͷdDZB6'fiRuD!jҧ߸hIq,Ⱥx&{9,Ndj6<*ތg@ԉK!sʊ'yBM- 8^3Ekz"*/ AC_y r\U'5BiFsͷ_*݊hLPp%@1YSN@U|"J2/C{]`:F:9-yiOB=e@'8FETJ>*FNٯ+ ]5ͅ5q/pSFXf垺 j400;dYZ,%Q؋q{MJk,m e bN{PB$,;pTdBʵA\FGR1ۊQBҡsY()jŰC%%Ux*Y\Ia6+9OOaD.E$3p{Q ) ]!vlިL6EԝiTOi J6m?/lza #ȝo iaɹIbMJANe1>W|I*nPTƷO"D/Og5N ? {JiݜMR5UuOr{J b?PPCo׸INܸe)y61vX,=Vz94-iP-1kUKؿ(xƳdp~d{#J8^1\Ӭ@n_ݽ kQa7ǏDaCXnz9l9E\vSPUjNɖ)5k|EG֢+'n$zo*fjUo^,l/9Sl3G:_ qz5vJHĤ̶I]PZN^1 66N&BO<ֈfT6z{#SiNx&pIV gE*sl"mU2U ˱p1>I6J3/a2FRJD!*~&wN"t!WgxTȯbtT́2RۓL[uI|d9ŔD`P L]6/&|XuU+h뮢kGBÂCeU|M'Dj#LKǣ$gڽ+H3<'9\0ӭE4Zsswcj [g%Eb6|O~ԁnꝋ+9e=l"["QPFl~ ~M8\QXfVMYAwbԸ|\I3ıH ĎxJI/(?bWB3+#Է$+$=p:^ө4_}Z MX~%Z7*p2$6M^T0ـіH8J Oj;s^&<"fQV$FԏihvkzݹkIdӁͨ .0)U GVhVN~z0QWO_F: f]KȒ v,쎄ecF)?>ZC= OC=hk_Ay+ TsE޿C4">tWo=!cblF\YxlYpeyF #= xZGyH᷽@;?1n}vXe#1J2hӌ`lb3#݌$9A' ˆ {׊cv{M ["^wM_x|˲P<~`f))bp]f.}vZ$ژ?XE-ҷ-wtm1U0I=>E ?:n_M2g MKW-afV@)r(ʕG/n3nt |3o&QˎI>ϗ"HQP~ݲJ8j_PD0YckNd;h=}ZPZ(蕼0σy>~9 !X^Ge\ֵ+l4s`Kk'Ngf#CQ|GzbX<\ 7~lf {h>zz!AI l>{(5?g Y# դmx:~rQElC?ub)[180v0k 3կQ2( endstream endobj 263 0 obj << /Length1 1647 /Length2 9023 /Length3 0 /Length 10090 /Filter /FlateDecode >> stream xڍP-Cpi,HƂwwwinqwM]w \!h13sUUWѽuڧ`UbZdwv.@JEp`wG_f F] W+&ma.K!.~!   '*[T8P Q sjf+ ?tleXہ:ZY8V``~e,aueax 7aOfm;۟v-+dp[ nO05 PsA V3 8.WVVP'g 7b ;j^l nЧ|  S[d%4Of vvwp;A2O,:9 nO zvo?'zB|6`$aΜ: Wȓ - ʎΠN?O }'  pw}o[,A`?՟ ?]^#?>2y5Ori(>IIy]o۪nl *@l?)<hx 6TORQ1hYSdG@0Gn WaO[} d5^w퐀:}`7YZne3`Hs{7+iV]u2+{`j|7iAA^ @ݟRO6PW?&*paq85AN ?$q=/|*d7|R%cOē /_Pz:?:t8 d 븩dߝeKca]vAMf pH[ݑa_yڀN,AszcTw*tJvm=?`Vy.0~9 {/0gu⌃K-IP٩X Np.f ri^`nrYv&c 3$B$~+H[>cA10cIt7~RUj3(sl:GC-vO/@ΫGI4agxfv8]A vƼ~J,kS֟ 極Tuj[ 3'(ios>+,RY= w-g/U< GG;A0SȫYm)Ry-/ކrIVgq5[.$ UQ77GD)w.yXf:6x#>'Kd89B!o) K7dˇ#P~r7!rq6V>FÙ1zt-e7t.%%N!&ydR|<L[Yi\ 6[M:M(,iO.,3] :v77i7maIWΛ"Њ.bߞMk6r5MղҥԧtS 9;(q!ap ~:Ert)_?ԋp!n@f\!ƅy eV b+U:uƺ֤[X7{{EE> e- *IGhW`֯};_՞=Ip¿7ǞW7F5LIZDi)zl=}FB똉pIBM2gz5|JfU.tc+cY'XO{fԽrj\m Lqj= ays_BM?z>hK w$ 5jC,u/[' ƿ >3Q4`:OT&(UԠ b~<{/j m 7Z]Zq}r>Pn΋Dy1bHȀ&7j %賮jHqMϟ7(q%W'wk"AM9L_Pآ}޻.q"qB&UpFј@rVeB[5!ώ,DDG 9o |Ǖ`~xg W;Z Ho˚yD<*;~a:vF2!WD!VĠG(Jj ĔDGSxj^MYYzE3o尨VMW.TFnq]hYZ>",x| Uœ`:ĥ( J1޲Ms}y}]kIz<캦[ku@jjkLLgSVo6xJ=ytfdžҨ\&/WcLg8g4V#yi}bX.K.~ wF~#R۫ڜ.rKދ(M>O|F:N_J=8oSc"+xhK'`/0mNV=2̛+J̨#wcVb'?W(M ݹXuȠ즊 xc>0U TaF# OC\*H#yzÿ!՚L8jnMx܏6b}S+ uLxD&؍Ot:΅]|y-##.LrJz ӛcoΆ\pe18`q:W/9a= AZu@ "h]sHojfA~.ZcەXfrJ=Ίix19ULA+ޱBΈ.{BJ;0Qc#q)b]f"j\:RPImڈS*ڞ@M6JXݍk-DZӻXGT-C{w LCKoaZ *fK<^uB6wC /!ld)Ia3֫dIAiSU:D/(zv{> Je߅p5*cL ɮ> 0YQ!6{`Zyj OOG5mYiC5CbPmiU: 4HC$6ģ΍s UEvZ$  (*{ /M-wA5ނYN(u2J PYWBFw&6?8 ٢&Ժ})-6XN~D}4x=xB613 QɪP#-Pύ :L@_A_QMq0ۯ{ EWģ̪"Ypq\ އ|oznySE6.;{QCDi݂W k\{`Cf!ڳUL*B%Ȃ|K ;xU:"%غ,Ch-ՠJ_&6lR4jq 8s!z GuT^?caF+#PE7#Z}y!'1'CCF`jɕ+L(6u`a;KaYK2Ҹ:.ȘS,Ql[3㷝z u2UdZ92(=rZ4P?̫x@9:&6M|AY/rDґWw:럛ix'z+#BԥT=6ݽ%HU߈;8BJ~/󺮾`)P3CvtaUXD26+7.3mVx 6op)uN-r[NϬ/΄WX娰1X#>" -xi帪 'l6:X*z{7VfPg=H@(0H~J7~:GHB-I=yCWuQ7N["_Jd0ª my Go1T, $ceI8nsYEgƬJ^^6!yXElvIrRHX>qh7T;s'кeI'ױ2=91Ij6z"'{f+UW|9rU/i KQA^BG z;9DgGIGgsu3>usZ.>~~Nu?/˯ !sRϣR˄"J7Jth9>x,Fd\;vSojLRH+u2\"ۡІlx5( څVى@z{7 Rq{:q~8Qv|+>";d>"A[g.dLAX;cFbhzɲ[VA隝$)T"PVKӗҤ4JE$XA :mPRq5ԣOF?lO봰}Mړ&$.h)*9&, hK?"SӨU ]H8%դeO/%2 Q'(GC4ij\p}彠oEv2Z7ŘaxiRbC+/~8qB#Mo_`2sKiꥅg4J0N"&+0#ډz|؉g8Ո?5=fq{ 3]~[LTClg -2q*k*ﯩ~ +b^J Q; a0]4T b_+G)*r:"UJ^^GɬOА9D&=Ycd9-DFQǘ~\0GS7͙׸ ;NVy T"3+ zSS^دڌfڣLMkb%iYG@\ nqѻȚE+IV,SX Q9 ,#JYa?C>Ex; xT>w쪅Z mrxMĴVg¥:Xbl ͭ_!FRɋw_UqHfЮI]qG n:gV#*2wq;8vq~uWMp^YZ}i=B*{|Pg EX"'QMB?H s&}RmɄ`_>F6{1:=T ]%?l%uqQ;9̞*P`-QZ?7Cǡ2 qV$N9Z5)r tvA4c{7C3'xoWbVʫ&a# K;Daީ^S_ݎ: Ycc,&8/?q(iJf qԯاeM|B*пݞǜcKt(h d Qr|#?_[Wir*$c,Fҽo,;O|],$n\dbdl˻<&d|I\i9`PZv0wI݊X/d-,-?)״gih:0 :꺼5׼~E2KzQn3C8rTسdd- !:s^M$A.Ԙ7XL"s(,+ u#Pe8z&jjf2SBA/I%IIceq\'_)W.[$kط(ÓsyWHjix)Mk\q_x#e^a\ 9;:OP9f?2 oߓG92XVS3'z66Jh7۩;kf Eq.3E9uq4%N5#Eŧ})TJܜTcUefL5@ ]Tǰؿ䳏Z얏зGǨkNtTV`yQ=E~:.fj7zIzZiJ_4>G H%qsFMvAS1y;X Mʔ79?s}YT| h+P9Ґ,56j:E%FQTP_Y9)'64cCf4|Yh$!vWb k)G&GW}:S(xilbp"#; <[&pȋ^fI77¨p o&PK_E%h=F}/Fĺ7fԵQ`CUl KƢ6HsI->|U-Q@^gq}$6 >Of(#u{ۖ;o1>]qmUL{1ׅ!A{&36[0`0yhE9*i.}ˑ8G~d%McWA4{6%j|sd^PN:vV{dLu銤 IG=8Y]L>V:=m`5ئzU~""6 ^0SQ+EN_ھZ7FbR*lFi (~Wr%RaPгR ?qol~/piɌ_iB󣽳\?\sE~(S$<ݷq<S6DNl4o2Y K+SH I /%\6꤫>Rj& 9?wkI5mC}rYr=* Q EtI`;ͯ8vo-^ӽL_Q/[a)z'ɭ`*:ꥱp ~m)@ÄM+W/_`Q,I0`]#[#dQ};N>{@!T>}En6gK'1Խ7eZ91yV^hzؕfNl yh_eO`af"0oK OG/#@l!f4c%o,(/mN~vN[j{99Ǯ%d`.C9M˖:/UN,b\{زi|YA 1.C/|TзbpLn '-97jSd&3E>mRk$D~dνvq7C'Nx;dSΛ}詊|޶>/9"ii@s.kč&HJIR+!KMt2 o}%'Y>k̾Po9Q ,j"}V|tC*M1Y5Off uxhWτ٠rgV\PMM] endstream endobj 265 0 obj << /Length1 1471 /Length2 7180 /Length3 0 /Length 8170 /Filter /FlateDecode >> stream xڍW4GVEM޴F  $n]FUv[j*5[{ν'$3<='F 0[* Jt E@(Hj ATٕ`F BܸMO@@TR@L9eЄAJ07脸#Î !!; C@Pv0AԿRpH;!n| W>Q A8 ` .@ `Cms@x`bzxBp# melwu:CaP?/n&P'XCO?:G0 %`wi+1 (K}S pqz ;F vC<Xo'}= p5 ̕4ۤC|y^A @@@B vswV6?50nz ?9p}.`?nqWYo+/\!.?7,Dlf/jcuOj @7utUlA9Afp< ]syJ`8_Ey7T7`0lG0? {RZ7$sN^yx91^gUV BZ' ;Mux)o]X'%-QxMX~4Vf&k8~je C3UZe&q%SL^\w$S''^3h&q  &M,U ztаИS:;4櫸yoU |4Uk&Ϻl4(4bVՓ]Kq5W_Śl=x!z.bŌl׍n ץ\$(3J#-X3ғ{'ђ72n8W8?KqxP3*nBHuM텘T W2se+&=g^5%ˏF(̈D]Zs[ I7ΕrhN'Oyt$h)4DJy6ɴRo}xƺԸv 3zUcsC_FC^,-QmWrMxȢٯbq*|mJ ^y$moCAO#ö@Bύl[)2q}GX~F(G(Ayz2=ȫW<_@b6'GG;wʞqWrssCӢp[,vB\gdu뤪᥀#Mɜ))x* '\l1[F}B魱* <3GbSU~LI0J>mrA'Idr33d)X&@OT|*>O8CttE?pͪHʹ_)T DJٝP5dăGE*; dj,"-c[nV4&-E~Et .K40 j|Tx EĿTi`g0\/!2Բc*LhPE 9dr @5JWO{lV;_><V Zts&k4[EԘ7YI]dYi'a"S00h: 7Q56`!Nysao)nvt]VDeVw8kC6ܤz;DSzR  2hb9a'؜{a;|_3rF֨q֮EvIdq)Or[vX=4{bK#հ$&j[DB}_P'EA>6_8-&] <6dgwy /zO՟)^zWF MgYk+3 eh+4{ϕ.īCe mU-ɿ|cwc3j2c=N#!dc8!3cj0gI`]z|RcM*R_ 8Zaj}Y>s~uW㙕ƫK}&J /\|dGnYV"~׷z10Lfv"OJ'nw<z6f?Bixu#,a/w^W?Ă, oW{g7U6OXUf*y^\je[H-vΞ +`&MRYԿw]R`Wg{a 8n [G"0 -8NR^ ,5ԉ0L|#O-އz ,sWX}yp۔/K7<Ǻ|͌zQ3iW+y |9!@Ea]2US)2{EU~隨|I`HE`]KV8X.: ~_hSzFbSl;8#qٲٓd>* (q|`#r;,Uh+*IC'sI;ҪbSߪ-w:M^g=Y:?,c佫gVԻH.@3]p4.nG9H]6vyLHj 7lD%OU_P%u>YLx@u+N +  MAbv+PI10Jt'ht`oEA8JQ3mn^%f Y0/n3.2F|vQJpT[^3b%etu`W #)K7HS@0YY "N>l7cswmVfmvo(aE ,n(DãO2Ä͊ix{L8zny˩?A\`(R#{瓡1*}HIڰ|qպ \~dpbi)qc5Le=`Zkq zH;k–Ly4jY3X{aZS5 yMu%b{ӷмu (-̑W;Ѷ(' rѰD*wB+͕ڽb PMJ՗ ?vgUvLZY~469Ii`HÔUTQ0) C光W1YZA޴j"cMF.Όɗl1塂%^,L4T/OO%8-mQcdA*DjCVΝj4FyYrduBj(BH9y)Mtm{#UnLT5" *zڏ=:''Y5ru>_g LJ (j}Kg{ĖOe㇫. %tڃ}߂9H3uZsM8&=ϥVVqssLHЫݹ`7/?:=ZqPa*ԣIpW.Zr=)yoDQfǧ#R+AiLW#y|ӌ:>+_$Y7E"gn6.~]Rx 1'ْ֥{-|!TrضWn>b\)y(ϪUf1&waƖu"8&0w 5XY$آcbgv=55z{¬+,85Jdwc]tNx4oEd1(EeelDs5n?_c ۥ l4)3+A[:vح}Zέ/ǾՉlz$pBwZ>-w )f'E-/̂RUJK!?k>JHbd豨C)k0vEErd+ϵ>K&$D585YO:{#vK/@nw֑!&f8`V+pnp(TrǦs4H'dFJ&t.%aouՔp  ~ΤIgJ]مu zߌ)F( ױN>rQ$rV710q7hOU h!D?j8- .(2ѱ\ dPx#%.擌{%␯Cs2̲0!ώ=OyPccmbdfp7Z?{ٖ|B~S : !,q3!L~L^hTDJgԪq1̮m8m$iTnьZK>jGCk~ B:]s3B޸\o9:&`ƥ 4ݳ}V$6[*(gxD4͇[[_6Ƿ,|_(ؿ~![ftHjʜ))`3Jd 2z=#E+}x*sDwH4Jt>b\h=أwGER pE{?JĦ{^t &0RO.WQ@o.=}fQw3o>uͅ^vSl3f뻴nlo@b}d]J\U8 8w|P18ɘL'>;&3PG0wwʥS nmS '.mw#3*.b'<`9󏟆 Gϥ05S7p]U7 \FM]Ѥ~tjqTm"Rwn= >?dQP5_RTĥp-*e6SدIvI\`RNj7gCn7Ў.rSt(ha* |SȩzKCk,nq4\]i6wY4$ŠEɤ?N_]uVBJx0IU(r$^A-De9em3^@+У tYuւEᘇI(8lG2(o Äʐ"/{_Ks.^{epϹŲ(i0*MB$jOo 7@?KJA ʴ4ͩ `YPzį cVq;SKTE1ܣAWt_S~UVi1M(@ВպcٚupK[қSin׏c*Rپbj^N&WB~Wo_aIq=hoblI^";1rWh}WI Uz;";Op\'dkR '§x|HJܿ< ք>LbnM mñyDdG | [S/xKGkbd[H>忌3PWmh!/kD59Wt>hmN*eϋf+O&]ŧ)y*F]>W@#-Vg%RTkoABOJwzJMW9س߻[1^k۝ 9{@&_{-$h6@aϤ9~Q(V5!.6U4zF1'̢?wc{5nkc0VOXR dZm+J7gަE=E:EóF+ w}rUx2p%/¾Y%429z8Ska=zؚi'ri'0cDX?ZY>5i4mrߖ*T2@WG}vn"Bbw"(һr/A.ʌ<2I;FQC?)/k$#5珞8i 2zJ|6s&> ':X2/M endstream endobj 267 0 obj << /Length1 1601 /Length2 8433 /Length3 0 /Length 9489 /Filter /FlateDecode >> stream xڍTo-LtH]" 00Н" H7%-RJtE߷ֽߩ<}fz}.Yk%X sr5Dܼ|X7(//!G\ r{)40;Āb>^^.b PXp'o)|جœ`فNAp+ $ܜxx<==Ap[ǜO@ v[~hqc1 6n 0Xa0k l@ +YN߭] ] ;:`-4ݼ8 DPA ˇdu~sr8rByh"Zbluocu=a}@`6(X;Ě`kFU@! D lqK@ uஐ_ ?]rxxJ\&;~X>Rfs|B a `ߺpn%z ֯y x~~[п }?*yB,gI@|t<l~O>Pڟvx\ S)-뇞c~`/,J}Y*OQ)歧i|]ܯqSWgXu9Mv&@wTޜrwk7ՂyopO@ߝarbsN>ѥgW]opj!uI'1%y3 hn\4G^xgSo9c|],WvR0Q OmV#--ZuN!mYs|nli]0Q FǬ6$9' d-z 7Yrj'Aµ='uimB_S>e7VzsvzESUQi>г*O{_ͿiCq\ʬu>K9Y`1y/Ap=WU~af#9T<|77BPo[ŋtP%ɼ-^zU#Ɠ5ERTRgݮG;Lkf/~wک{Sܕ rprY{6>MFϞ]̬4Q7*|}gt6w6OHhҵ4))=ڴv&q2ôRgEɅ)SU)ސ4"7 ^dmr8tuBozE Ę{n2Q|AKV1˹Pq14P1nF,DH&NiKc[lӓj]EFs9h w%rSu3Ya"4_+F8 ~fKHka!t@iP;pD%dHf\J(Fs{td 󉉅o8Ģ܃2S T+A}TFDv5mM-Ĺ? ]4'w-#GyMPe_gI#j+2=GVSKuc m`CNv[nU⣦ K1"bwjx!|&O*4* /ЈvS\o0Oǀb03T|ι1-@OJ*_UC-3p91i<`7&HpsuKT@loM.s,jOZNl* I6YUustEܓDx`a}VP[8ƐA3:tW/`ixtZW etY U{nwY!o'dn3Z<[&h${t+q^C씂x#}M),e^.,JD\-o5FH,nZn̶͞^<5~&aiZJ>*.?QJAlvndԹ-HDB'l6U?~!Sb_< piܟRumv`ATJri&0o+⇹}p'(8GڟnuSۣRD4qktvy J2MFcӃATGqOVp"\`&))!Պ@م Uhx_.Yh-wG*FZA:kk^Jw~rYy3)܉i?`\sxrq "hk'ۣ[wO|O|G6/ZQJIw9AZ:iE/?o:5%3c0bF%MۣC{h+W %͑s0#盖؁Qe.GM- Ct;u|s'UoCW yO%PL1,~6o7 9Y M㯉L?t\k-."0Rͪ y^|%'HcL`XI#So"->_Jͮ(l>5I !}_ >5O+T~b&C-eF\99`6T8)k$ }@!KZbo]Fאv%Z~kI_W<>5 bO3|:yT'4ŶO~ ZJ*PV{ɗICMk?n%l=)*k5T̾զ.M'uJ_J/{4a?tNܔsʙ$=pnyb=#gHxHLKI3^W3r(^P=>9nQ,fq*cozX+M=8 j;,7NJZ<|rL@8Q}twou?uު2Qq6G a%Bs!YBk~H^y/T慃1ӆ^Un9_&T+ĕOb!7!ұ(u@lӺU n_&NꢏLXP;O _Dy!#?m(T⋶ۊk2IIS2CyyPW\xRe'?Fk M$a*7۠hm@НI7J,Xt0,tzt4eBOZvIQ4c+ cJJ QB_N"k(&]giPRNe)LK. عCg'sO+.?]{N#ϸqrAiIn7 ·\^}u0/Bг͙DjO8Fs,Ī4"uk<,J9=5 i8Ot֑-s/ P(U﫨?;xZ?LZ~v'&')5uUPtTרt#o4Oz fNqIHG<1a6! i$ޑz L׵8c4ȏ{sG`b~={NY`,gd5Miu _2{iA*L`PĦI)9b9ϳ ~͍Iz{ Uq. %)?fy.+Q:/~6q+Fl 6wO)gzz퍇 (n#>Fu8YE7;IK%W>tЩd hw}W)Oy iH/0iy}@b*qHFja+R۟ZSroTlLhPP+$g$S "YB x2f?;i|g0]g2\qlê=RXq ꙁҨL x_=raw2Ff)"3/Ȯ:yL|4qٵQH7k6NC 3$:Er:^R6~%Qr ˱ݓI2oFʹӤ9ûzEމ[ֿDZGC0{ƌڃS.-H*L/izCbdImY2oKGn'Qf,+=Q%ߊ=_SFVsHj(L!y9@DuR1}gee6*C]չ> ]_d=*z873bc;'7$E넑%kJt1}itT]mP&<ڥHr~KGs&Ҁy7bY9Yl GVwJNͭw8,eV\Ʃf'ޫ/L5io{-`$}_L82gƽۆx [ABqbrT%uvE:={[^ΏǁqrPO4BVsp)L 2كk5F,v6XMhU'iQ˘n[|u ?Mi`a} C-M|?sZS'@rp4qU@e}Io_50YL*h;3#d pg!>a8by" acqa›V^uL(б*>,~Ek:Nϧ?R`oAY]_m/%'gZ|RPNR?Բ'Y?t?/X1^:P^'P֗܍ZlaJ=l# t"mg3K37&OYjs 2wYZgtRM3qOɳ}btFBQvjX,'.]rԜLj)׎2y,wAt3 L7_䦏x>(<Gz%]qe]}Yz<\jLnG+Q&Ua+g=~NR#R=ռ+9'i@BC^!_ޖ)Wj}?TV+xY|,ctVhe]Y,_)%̏MIR`69ӏ!Zy endstream endobj 269 0 obj << /Length1 1937 /Length2 13612 /Length3 0 /Length 14815 /Filter /FlateDecode >> stream xڍPY-s.rq$;. ãg{+[Zg}PVc13JځYXb v&6$jju /+& d_hf7v~ Sd]lV.>Vn> Ʈ 3@ tBpYX:O)-t-dj (;[mN45ٙU͍ٞ։Br@3rƶ?1!Q-AN̝݌7 vzKpogdJ@_0u5V&W@?MMl d(I39;3f8ٽlM$n Q:'SGyd -?q#=l5 ׷9lf3{f 0(#76 3 tM-(a=Md|d 8;}o 0:L 0@[A]c/2xgsEĵ;`eap}w?Ơqc  Ϳօ'(ڽ1@pb?Sf*_>.66zipƶ ߦm#- b^g[AN w2wۀ@e;' |ofj8uOmH ;0vt4@zkx-Ϲ03Ro|vH,/`%YR#qxj4x"Fo'qnjgvppa;;b63No/Ao\}W`0F bM?(ۿ!qu7vo7o;bɬodC:[B֍w|#}['/5.oOیt"-/ؙ~ j!vcܝFL[[$yc͍ qK|hkJۣanɂcRDFu=goMk.Y<4wnRec! *{\rOe3Qzs_L (In~bN#f/b\Pgs&|GC@ }56K Eѫp{ !y.*C#[f5H5W:3/;fCGJ%6HlZvk AzosTޙW<7Eb-jN_7 Y49sF[~ҹI[wMB}op)|\a l6C8 tA9~x $jpx0-֛{;ÝʕV k[>X+T{'_Oq~S <:MaN-0( 5.|\ n58.6ҁM'6z~ח<P 풤zڶ> 7lȮ9NdQ`؍mWg=물Q ɀR#kZi; 3 LjwYWH9JXeČdԠ=w/ iJ eBzp480;1Թ0DrOF3> }#AV&R<ʤ6jk_KtWDW;3ˬf)1St#7#9~|g04J:hOE;kT fGӍC%oki:}~QtTv-Lː1'q;kC7[;#>EVzG?)C۞ kI.$M.> FI&w1fC*S$h3Fg=FAW8\M `+)EQĺ\(B1 ďb1RM=m)W[6~ E/5Y%[ %>P=WM;Ke;Tu"U$xt8T4E?N#Lഀofx}Γ =>b ʏFOFBMbRT8>FKu}Yy߳R;Vρxࢣ$.jrrٞoyWOVl Bsd=Z)Kd`u ܕfzJ{^+⤪]ߐ35h #@sMv—T-eJHS3LylsCkӥY&Hh^۪n Cbw[{NE:UԤw|&'tl/M4Y[{m,ڞR%1n.)&Z16!* [%cZcSAu^W^\K2.6(3ELܝeG.GV_SF@DunȽ`Y6|[s]TzʀFđ kљ]NY|4lcz ǁgF^f@EM*a TդzE'vVW>菂M5^#v+|02}`s=txJ7>ǖ+KPV(*9U>kH8j.0tXF^ ~4MSmyE + ]}As :E4'ZPP/uu`RG < \;bJM~g:g=M/63Nwd$=tG|gK?8(43mֽ?6UI[55Do}^9=z)-p(;l%?y(RQ)$40qSs1@sh|AU㱥I!MA'd0?xz^:s̯PX7@ec6LO#έO`fdR/3 dc-P L))+̎Wt<.Cl]oC7 c*Io|q|؛YmQH -в+ PaZ:1qf\7V3ا-T5:g#]9@ŠgvTW¤>1 U Kw|eΦ/~._63 Xw22*yDg*I4?`s߰tLg8T}\y r$ P?~i3; NcDm_j*K$]XH%ۼ0E?~L3ӗx1D(n-yHHhnDm;j-5K_[ 1|%8hդ^Te6S,ȂÅr("<2lSujԠ"6svxŭmPV8oUz= X J{cĺ_ ZY 4;gDqSInYNI`An`:*lտ@ȈnQ>hANMDE ?EwRiluxjN{LL%`|*;+q.i$ e}TML~ta5RǤvu8ahܸ jGsE/Fv(BUŖ^ּHUǕv4*RXk+dx}O)&O[,hv6-N8|ɀl XFn?t6Si >Lh)\ `#,꥿:s}nBʹm\V0fkÜb=0*bq4fys[5}:ɏz{_x7N&Z^c Xڂ>2׸W !?]X 8RT|LLJVKqk #zeb:.*)49uIMd|0xԍј_1}6\Г4wq9gw'B=inyn%)RNZhLyO d &bs(do7AcǬ4VA^7gs3Zjt$'Z)&0W:J%*T9G+ˆ!1UKGF0JkҞѕM[aȆt@C+vġ%ei@IM! +jqf3ݒ*EC[W0~)g dݭ%htmۈ !(JFqi"nF[աMZT@hi@ ɚҥ6.S~Qz8CZ[K6CP:$86K%/s~؍9 i7L$GCn8AvOzꉙ^u`C5@HȄ A%srB9vFObq'a &$h"Ӿ ,'L1lS;*ujaolY87Gwgd.\OH ^Y}AQ{R[FW<ƶ~hK6-l[ /$ڙXmN>5xRjtŠ<᜴bW2 ng28:(~z:h[&7h8D\: F8բ{yy݁p^bСBJj L{[TFOt t%UJ|ȬuRZ&liJʱ84rHdm: _Ƣ;~:):N;щ'SqGg= ZgYd ' 4[? T0 ?LYOj"l_`&a,E|-U-ZP/*b1+$MYEqbQXr3L4r!m%1Sړn+H0Ó/) KoT5aZEߖUr[+Oh~_:w'"\ nZӫ@T{۟8J5P/!nnJ.twh鯚s=ҽ<5l_'./32e G6F2q)KylM:mIB<@̑sw @OOx<^dbKU_dVElaaZ}hֆV N.}S?:KZޖیegZ\"SCdl3 1K[R%lة.ߎz 3 Y'sLI[v8Ve]!mLOBYjؓpNm`(8s#1=KqLJZ@P5Qkz㍏"bt_ntCu]Xlj{*(zk$2ae5_[H+o\eV$T>(DU ~4-TLӆ'  x<ѿvmcyv ^No8y 6h-wm!>\Y^beje~fr& _}?٬KtXzݽ+ 8A4e;@/=(bCWj͏꯻ ePĎB#DEp:m3rS|!`DK(bhYc\ûٌc]ڍ0w?%qlّI*R_Kƈg5>xkNBުAS8Xƻo7)ƴ%mOh{k4k(\i= =p$CE]ŖNXsJ.l.>%D{4[|}K;e4i%O$L27$!YX8WL,pγM-FX[<\H3݊61.68l.gG={88E쎻D~T\u;$9 7p16m6klk>^O!X4_f֖@NKdŬxuش =>E k&_uһVAS7_A/)qژ/ d骒sQL,  2ރ%̱Zis\sRt,=>ʤ]h(,PZع]d{ xbId$_bt6$ m;4QLQ'HtNT -<}@ <⣓`'&FrvOsYئm*-ތ9,SKdq{ƟDP(+e8ޕ* G-`?Af 4GpJe%>aA{um\g~t(iQ6/"xx|Sn<3:B83#wFAVj7@AOl ADC p䝵zv=CNODO yy'^hαI-$2dj%E4r%kt4ޔTβY6_O*TݢЃ ؞g]%)+M5 )]q9bx=8.wpBͱzrk΄񭃌-`AfɆn8āo3 ~^A'QS⦺-)Q 95+-8aaDȤ5%q]p%q 'vRZvwe`vCTĻqM)qU;-Q:k8Ax/>&̕R?ZedȆpnĜV E]3ٝkI%UX1%Ǖlg^_(D}>ɆOUl9"GP6L 1Fl6mQU?am+o̓Qd2ڌ秛"BC#ؓri"0Nt3%łLꐂ`Rӏa- CyA]9r)hN?7MP(t;`54y W9dY,,Pid9m_t[W}]C_+<J-`qԯ[_:!8LbMw!0ղz򪡁g[V0V(5B|E c#Bn @5өv3' %qEE;lJͶScgmI5w_N#BGX]& wYdpFv;+ntABW:KWVpeDQRH|:%D= qdb[-L짛ͬ~T.؃U¼9t}yuh %{-;'֨i[F7pH~tbtYg|lO8fv:OH#ޑjpkWS{`|jմ+H"^xr['f= aD^*-eW%z~ ~ɼ!`be/րf؇klx H4Lu(]1$֙}F6򼿪Rq"7I9gd{`h~aX`&nsH :lC™ lb p #7RL,X3q a)=6skx~*\cvWꗸ)VHWWp8+l>vW.Zz D C@ϵ{O׉M z$%T8"ڝ >eS9f!\gBTmY pw zuu3^ ƅ ]eMĻҼP0c6~MONEJR{WT!j6]>SmI}D|<}K^=r(+."uǏ7b8`o+E'ڀ Ǔ`最I\"$9 )NaX!q^ ٺqq_dֈwHx:-gD$$F K//lДC;\s> ܐ[<t`E)OSw}%H;Ú _=&N8OeEnSOOuvzP, Ϛ,-W|RTÔ WZ"o KKj4"KJE`6٬*M-CbwؓvϠB9_u4Bv,r c֮hc_Ƿ;'ZfKJ g߆f( xF7ܾ8dL/d N"ke*;B+b4/Mb~jv#%@VȳssiqtQvZb(G(uvecYfǿW z9ϲs< DzK) /#$RTi_Z|R^G}#4юS> 邘ap6SۤWTclך}e]Hr+94KH Rhd'T+vI71˄z;=x8zxM#4v>`e2ƅ~?d@y/QHg+#,‚ʐMH:6ەʀ5:96kdaHT, V_56$ٍSYwuZ&YJr^S~e i8KK̦om ئ ob.݇%p='(Tȩ{G?*g%3IN D?4!+]˶JkQ { "PLR`km3$0;!긪(clX轔y)tCHՑf]do\.t`ڧƬլF0KFdfORO֕mZűvj.[a:?H')q~'}Kq*?6rQ;89+&EP~ R7Y7]Ya(2ĩ\𻂪g=x[9< "!$ۡ&F:=[ˣX2^HU)xEW-$q8~՝ߋt.8f3t9E876a:)дINP[{Snh2^,G8H}kJѺҗE˧4(WDUQ: 3<|=gYYtr -DJM.-zԷr(]WC D?  _mɏmO HC v3"B\ ˢW֞J:2m-^ƕP)(Y8LB5bYk\rfDbsm8!PS񂣚)|:yOS2~.auR7G@)MF\dK#ÝwfMsm4 lP^-{|L"-RMءVJ\R'3] IwvRLxMcJ+Xհ X͏`VWeΜ}}Xza}M?Tn#K+zPV d4xgoN9fH{@ Mu/r!R< ._‰ã Z%M4e$v*qu|:RR?v$ }\.ᩚѩ9/t{5\ }yKAWz8N ;˭BDQ`]o\@1Yh@3'#Y?J151SC?6'VmVp-/)Vm3"2Fk9umWPli9I9-t$$@d.oܔ;~'UcuAU"/=i\[D?KFaM8#V`阙#~:i03[mC^[@J4?/wJs9"_,HI#a bX3.كwsYI=E FA^8#Op)dEצ";6V д3ᨪV=J!#[Y;h]gRn:s UǞ].7y\gmT *)kzb[O-?ŤNY8C -( 3YB=щ<+-*+G(ua=mӫ'Z >K&}bb&ZT-MT,ȓ;Oiٗ.!}L])]])luU:#+6'H,ѪgB0$C{mU01Ls9 )@G[y=V\hV%v矺-CT/vRaxP:7E!pyQ]nϘNhv|W7xOoQq=B؉:Wcn7|Bٌdh$ORGIQ=?q,bH!~ OTD W }i4Fdg]3ܽD߳=)|O(cUEwVbz 6P9flY%=9C2+pB]vGR +RNg#7@2HCEqTц7hy;\b<#%QZd%ViiJ^HNT>6GryHGBJSA9&) "+"p8Ë/$caLPm;+ptPx]`eEJ6= .hXCV&}8ȩYEj: T|3)05 9a_צC.70>Me)_9HHL5e4?vrŖޫ\k>!xEQI4FXW.XIvMfMf%@aIIu-s)-QMG 3chIH SHߣ97˕A/6-oc^b)Vbua-<8ZNʓÌ ?t, lVk0[<{$:Ydp#ŴLh| j l S6D/' `>6XvtK΁/OO[)蝍8ܯ\fñ͊SRPW| ;c\N)eA Ocz~9L^ _<4k=vD%Bh]ƦZ[c~PYi9d8x!w0/ȯLjU^\[P.E\0+T4o"S$]*﹆QlΑ_jL8j*L< H4f*N@uM07xFN6]ENKm:_ehV: c!S1֌tۧS?A~+vCҙқ!Γ&֪݅'N窺g,wmE@W>H.7`62u)Ӟ)CD%&ť낌n \6:VRAuJ!jC€ endstream endobj 271 0 obj << /Length1 2497 /Length2 16209 /Length3 0 /Length 17674 /Filter /FlateDecode >> stream xڌeT\-;NN.ݵpww!@pwwwy{;}xƠj\ρLYI$SPWWge3!QQ[ف Qi\\#2qM Yw;+;_EG>9@ rEstvr{O/s=`f{439YܼV͉d6wevtcxZYTA 9wE{?1#Qԭ]>Rsp4q;k3+@+Oy̬7_&ffN& k;@IRˍ``[loabmgb V+x 2t5svrsev%7 b 7W[b[GO?w*N@ kgw"?2KX3efD !o18_'G'8j}}`nm0YZ; aAcX{XC `xh:?Is,*ebc0X\\%M/#,o&l=(:,,f?ϻ f؂;&Iw;4h0xK^[U n+̭S78Xo\o;@ʎֿ/ xl+i ^%o"'ê4_E BraJS5h) 8:xnY:)RЅ[K4/D\r|F&VShr>o%3J{O.wp׬4'̙n1c}Op#e(ߋ-iEOZK߾%Kr%5#<ͧ m! jVba]{gL hF$$x:XLRvi g< tVT{G4L*L2$iM7xLT|LB1Z<ğ+ yUuXE6|Ug==@ox-F6KDb>x1_6['0_:FM1d&,[aǸ\tQ#OHD_LDC׸΋ދ6̇D09)*+F4j5S.0o*DĹy{ _2+Aig4[ɾakm Vg2C`*Y `vn O|uP2+傛b.$ s˝ܒ?I#kmu~z5\/4'buPj OWFQ@L -.;Fc6u~B(m;m 3}o,ͦW5Aگ9E;ݎ"z!_[ Hn8A\_C\>"ҟ c:=#@bFgfJ ͊⏍G__$ϱH|j@%b]a31 *])șj6e׊mD/彜%1.|H}N1h.zOo"YbxI eM.W \,NoU®o!K[B/mU r}{2OXEu~G7*IaT>]˰;ԅ6ZVQi3@d<άL-4|J7LJU'aA)>-+ʼna1 .|ޗoJk_2K3) W8FuN}D 污=.yi?(cjjM2x\n(\n*[ <Y8oԄqG9MWQmˋdWӾh!0X6-gyM_m/:W~vN]DIxފ!iY>h/f6L'=#gZVL*Ӓq#1rw*7YCF%k4#2d,|M*bzff1!qAI>0Wȼ12٭N͕i'TEM%o)yi#"^JOщCʘ [:ЬfGLvXmpDآ2U"$i88(DH-5~s̼ZQSz;N}O2xBB\t(E;k_40їUs|Q4m=ݫ'j]^\ǨX(t鱄B6wLu.U7Qy.qjl=HMDOZ&?l"['[PHedI<+-gN̢u8QԚM}izV}`GaĆ1@osxW9 BqU=+ITbj+xL_df$ᣠdoŁfY&dq3kSah>)8uGp=,|mmLg)^`!2bJǵ(&KHf j?^ףUH=8 7Q,E+M.*M>>KJSx]9qB)lGKd=JpDkGIX-tC%WdRy~z,O iW7FI -֣)rc>~?W18L1ੑ%wM 17@]nmxva9lL"*4i~9yY? N#پl, MZ)롕m+r[!r~ Z~4xgh޵+|CrՖ֮l1q$f}Z {8as?}эx&̽IzvqW5{8t9)yIq7ag|bHw= _ŞL1 ڇ1$IqWtB3Z-zI~г24w1(NkLN7<ɑ! /ERWiZvSۚÀA=ijPvxP8m-hI΍Şb?rXzze>+(aT)2;;BXA.3\+L H!7kݻ.2snH|љ=`ڄvc(*کc`EP3 ޖE#ׇm0$J%AS`EմY1K` B"Ǟyuk!o0߈ G035C>$[L/R!M>v.cgAXWirDy|Z'OPe_ -D*+kIH C0Cw ?Xd䂔-{e /*&/ٿ|f۟3g0 UL%eP`#9v+#F9N_ c}5o]CV^Bzhr)BB<㸛?`ef˷4%=ezu#$%"̄p߫; Σ]ۓ=eX5t͓")< 옝/j=^K+9uţ@:KXx2;b |g^dy{m\1ޯ*5c1B50:ёo؇kj̟rS?U +!jtژzZjI.>nWSA 鴖aZM^2B*z%jXYJ\?\VM%: MSL$ֽ ]zShff1Z~Y6ٹ]{)V/e߬lTX= ad$/L>tg"1I{Bu0 |[,nXmꀎݷTZA];r/_wB.:M^)\$8@է׾u~0yB,H=c_J@nګ e rˉ7P !scC4⻼64[8+bH$zs)av%m-;Hrcҭ9BLf T򐋽s,L kuqUP: ,"gSi Sd Ont5h~14I|izsVIjL0Sfi&Ӝ!^;7\nc-@Rl{nAaS_\9sȈQ}x hR- .X>;FOk^(^ߦWcrJx^ wy 2XW e" mnXϤz|@^,:zysvF3J4[IuB'a[MQksCOY"_e)K:"=9-4™7p(C!wIgIeEuIƽ"~ [9E=Nڲ+jb5嗦/m,9jɞ0̳y9'c~aCZ8߫A2"' _+~TzLBvMjE60ʃZz,~&͵hWl˗Y"k-?Mk>O;/LqLBW1ʁ 6gj1$;gi<>& V奉?f:CtH]11o=#_Y asr""  >_GVCI``oPIǷ4󅊯P[dAr6Lrj ZaUoDcNrHqĞ:֚ )+|Sq{(ES]UYwH5,¦dT"_̌˩}迄 y˥2>eNlxQV.^ñׁBX[I7qMjYPa\L!-1ӑIGj̙ Y^4F-CmOnЍjа"4:^ V5S~|us>/D-Sjm/Y15Ϟv~.Q+宕KL&k|y;|õZI`%hL.iB2Z^IQ c7%Χo~75!wQek7uUrk\Lg8p(Z2 I ]/gLɏ~wl\:#A)yє,|Q\jR44Gm]ٳ8QY?(*L1'Yȓ$UYt6|>g OƝ8D ̶xYm`@TrsucYGn};#hkr33 .ܯ B$+ڲ*Tmw:UTNyS`0k06to2],SDW!\tN|W:vdž$3mL:;>_ȣ:Zhi3{oe )@u~xcN:#Ofڮůڛ-C _1f fE!ôY~H;tc ob|YR)|dXK?1;}JtQM9#"0a.,_C6 Lska~F1Ή%|hansFN_rf|,1@/T!eijߜ6wUDo~)EǸI4=62l v. )h_N%e%(avXsz@Y!nJzD~-(THUyVAzjE;| π.%ɤV^5+цP4j;Ie|f5pZp>$СaqCd bowJW2O`Ir8hΪwV@pKafz7EKj)f^9>k3W'P{_ +^FXi o^E8>F&Ӈd8# Y+tߩH] |;/Б:|AkߢCi:ύ daomr]8Xl=O?r9XbfTW{E_qe"&+#˜P/=V>9/&*6AY|:":nF4n/S Coep9n=:(4sdWeNuMV(BUa@q#W͗3 Vv.dΟV^T#QjmK0: +$kՈ9/d%e+?&<Z.R@g_LTNX tB b!65{~sԉSv;uevx~T#$)`@a~kk>I#"0 Us%gU&E33#Xm+,-Q2;oR_˱~:p;/{n?gs9PItVTuXϖ4dE~30qyՉ)"@Q |F] )q&@dLnmGqx=rUQ]^Y$>Ưb'DJشqfGZ(zJ WD"cQfMhRkRų<%7ԃPP*-2#rH8נk֧Ъy/=uD S_:ўԻ,];lgۏJ-29~}<Sray¯:9s;8߇5\u D<A2@=oQ!O F=Aܸ! }u.DG ŇSk Fc]|3с< 2X'.wnludB߽B6AHc]$'N#a(6bs紟 O\41.WcM.jߤ۽aUശh172 Cin*~_Mzu8MczŨM|jq睎}yfԨC"h(B "L3oT QΜ/sq_=Z Dg7&Šq3e'CkWo1:aqlI~.5qsK}:o!UR> dݬb҇UH~%;Y ڀ'c&D^*~-t'mZUO sŖ±$oB RMzfs/kB^bQߍ}n|P /5-c[}h VՠpҖr $|3ڿYsQ,kp( Vtwݚ1҃A^ .1C+6?pq}# H쾖%Й$dJOik`V7/;ZcHR_{kY?2&<]1 H8"l)#U84`KٱwK˶, %G?F{/\MOx"ŵW-,zד@\r h7- 1-@#ȱ=bmI[i)kv;oj:V )o%uES;T{^2)ҫisj>G!]ʑOPER:Ó ĝir.3(Ai1+OIKe܍7*_D_5 3ɮ׌RaO޸y#"mE%'v=ǯ#AGFR̊KЅ1HcrW͉T)[ kT.9Pi;dOi*R\tv~nק{fZO }Q {,eBK6ONbIg.2EyOۈoFΣJ,(jQcD*xΙ“(!tnqWͨ Nb,LSe2w:6w /)>d)Dg1;=ŝ/쮦,vs2.`\}_Q#'L0d:ӕGMί.-l!I n_ga)FoiPf9Awbլ 6g?%:<0dž 5`>BktH7光 ak9fB)1s̞$V:hr;|.[mX|Yn˽sf= + o1X\7x%U" ڞKw9br<6>j$2xt pEӬil9+m:ŐcQ~pkܜ( Jprը?k׽uِҶLPh W}&1zRLtW Na9Kg%uQebC*K9 u̢=WHg$guV e0RI\"'6gZ%!IG͘Z3!dUe%ƴ7n ,z:HOd=}\[BZZXqvi} l=/󬣼M -#d}BB[c0W埧Ixކ@2 $mlʪgS+ur+maUgۧl.bm } ΐ֦F*+D+.Kel[z6tu4㑣aZRL5Vp]1n̞qQL8Z?Ŷ|i/T ǂ0`V Ŋr1ԽfpS=!^ ꪼ=L"}"bkiXloJ;jv,d-2\NDɅiE?H1M_7l/1gzwY-9RхvEfIAXRB9Tw>Ce&Oifw`|hԥ|mluG!GTjaޗXV5hՃNOʚ<ڠb&ޒ%hˡ^]W6Juû8Jb%mN1a.ka$O"df?R;Lx+w޽HO}~}.2A|?_ƚ) z+R *y2m!pK9z E2jYBI+h0r)շM<oKHzt T@\h "b \.Xdl(tVL/%3ݚxb3nv2rTm9P!5B1Mh#ح~QzH i8)(9-oBn}4Q[??(e$Djlunۄ )Qx [P.FR0ĹUVUjUhb2:̃u-*Z,~|[{_aF#5bܷPG:jlomwt _S2m30-cro \.;q|(ڳv*-I|tQAU!w(V˹O:Ku{Bнم 9R3jKy:osޟ\Oj$v.Ȋ6r[ď$u-d c&lfljK83' x9FZ ȾPۏkD``gvL{SLQel'DJQo9ʱ,q xmX9 bWŶ7.x jp!k$=bR=DTIO2:p1 ю)Ƨ>.Q|i#OH3mXi;㺐mc=F}nbP1;Cn'it~qfjQ/0uу4omg?4%vaڜ -"d\he pb\ݥGZ-~UNʚ^)ȐAoʠTH90o> Onovc};a:K1%Hz?RaKKzKń)Q4΂?QjG`!E<ԅ$Ft}P {\qd(׌*L>rHB(Kֲ2ɹ-2>s~dwUeq4f?Ipӵ"WA |2G;:^ט_) 0N,M6E ozG9O2 7fT*ՏɲixM 9\l7\^$cʯ S=2MEґkyG"B]'g'G ]o}EkeWJ(D924[ZL.QGo9$A梤WN4lHclOV /~2Yv^ʷYg,q)g"m},H>v2&R/0cYC'q!@7 c7'v%ʒf[)Y<:6KxuyeE#U4'@9[`43[LQ,W:*gV!]GqǨen[kyهތN} iPz&WFbYA`l1;_}>{^`=  r!A]?q^kp`>Z4]E0wjf"] N3G 'kp:G,Ф4 A!Uwg ~] >6[Em'ZLyWZX>lZ[, 1VdŸpbhq0'e]dK0+乭jJϝ!J_q;0A @F~&Αݼ dj+̫W~~oAsYwR@'iW{L"eI%I8S<~97beqD!X1E_jO˗Npه9PNd`ѤZȨZ,bzD%+t 2K E0rx.MhΆ~uƵ_UVw&GmE?\t߽05}'\cdz,ixͯӑPH|]`I8,뫣`!֤\7j9M2w}83 ]c7Aq@v^ӅE.9VQ9.r p&W'N#o*;%\Ktm}7ӉANk+t?3^"B(n%KM?ē9h#ltL. $q%RF)$PGB 6@UxGn`(*ުP<.EBh0/i 0W)e'RupFvj#W\7# (6 zEBv"7瀻7Wqm1"uu?Jcgq A^;hwbc/]7U"ٛ$=hZ%}F40Jlowf [ TC": ݯ [ endstream endobj 273 0 obj << /Length1 1619 /Length2 7427 /Length3 0 /Length 8499 /Filter /FlateDecode >> stream xڍT?()]JstK l4Ht7tHH()ݩ !H駿99y׽y=g;cg3WCBT4P mh&"@0!; @P0$B_ %7Ah Q;ܟ޿A`0!PU@{ /"BbA d!:avQ(F_a0ǬSB:;Ch) `̹{ Y\' CAɰsw4F\!r0?= J  AW#ooobd@aPn"h- ':@XcX1'zd0;$w5LyQQKBBBbqqQ}`_5P$@KǟpAg 1oBCEHmap?~vGcfCRAhmhfF>/C¼ vz04^pD~;/ l;adMd7 5¢bț(W3v-@ F?t#UX!L ڂN(8  n 0 Qpa!{quo&#(t!Q0; s;@i~ŵ} a Kb_ ϙ0!~77@Z /pa u|vQ@ɿ9`){렅6hcW}w(]o<|b֏Ũ9Aih,uCoo!LvH:1uD}FR[ɏfĻD^|*@mK%gd,iX]f,lAdqnFcOaqm1߼-2jv׈USR罰JSdvC$FɠݞWg&<*b:9d5w|^TA~-j&"FsFZ[X:fRa Sd$N__,V ? nI>y?~xCY/n~7[CAa|+sR· ݄mEɠC|֔eOCcǝn4*GãR:'֭31dnLRoaf4RI9*l>ΑgVI8@Ajג18҅%}~(t \c,G~ 0dYA6 + լcѸr?S3;fsݫ@ RN6~~zT-L8UEW4NRPU&]ϲhY:%Nf,_hziecoMYw& q< Ro+;ҒL[ 吶;QB[ zV Y%v>N\s LA{zP_]ї}=c-癚u w3C“),q=|>>#qT[~Wn5مg6T܃d{=!i|NաHjf5@_Ң@\4NFFTtd7b܊\ɃB5ԡY7} y(a(ұZu`&:+gWte5$}-!U.=C"zbwc`9W1GWз kkVY,F= cժ/ 4A톬۩WVXQ Gb2 =33X&)-qG}#'x2dHn\A. Sg|+uʃQ*>ZVuh76L7FC:AY'r3|DGxrXOH.R\ z,.o[Jכmwmx3I:y4'yH)̭irƥ B-m}ԔXك KŞ,ui#bCzl^HlhS7]lYսIDNK5?b>f"硰+B-7' 1$vUtzt懓f+uuhw._r3|Fp˅I}sg4Wꐬ=:_XJY6 (IxU˵b2u%Z . Do/]՗P6nwj]InP(L}IU] /W##߭7+lmG;Fկ ,PڅazQ< hIb] u!nqxkxA0qGPCe"xKׯXQVlPwsUZa{Aă7Y7$}p^oE*-&f"y%cf4 k5( ZpG.xmjg_~%Ȇ+k :oG Oڎ9B/HbŃbxTDE|-BƥZ*UȲJc2ي5=ͯ=hxy$߫o#dEI,0;ڵ[Geϫ gb*8hؒjO&u W0 7gqLxx$lQoӐ #/~b(4**9/tv\ ,ħG}T`\evz *'t×-Et]"h o`Os[Sz-1(SNrqQ,;[8pӝE#nOބJJvleI,k1BGb%8@IҼԯ Iݵ<;A]M8}̏ _nwg&]!y{pJVvmQr(zY+ղqĥ_6V=o& W I?1Y3]~zݸۨ,ɯLq<. ||oe+EɕųOgj>   9 ":NgYg/# ukiA?w&DJ?w*2)K5xjh+ܸZ߷3l"jt‘ Dz 2>ܳ5y=': ͷ4w"h|'[Rbn|+>l^]b7 % [ x\H#-#4yth䛣=,"7[}dM4sBY4N"sAT)eު\>QQ$@+3cˍ!I2?n_'6t FzԄ*xbE܎Wp+s6]^x|r>?R!FbHk_ i'y#LzX; <%5; _4ϼϤiqw|R>&Ǩ*0 :ceXn]9<'9#GBRz-"7@Wh@$.ybڢ';?!PݒB'뎂H-?V9=t*.,o2 y&q9ZH;9Y{t_&МvԒ*u:v1G1-彞.}jkvBy9%SG/W\UywQTr5}btnhޗiE+xdo,Q+_Į]8>Ev}HDz(sIcS,4ͿlDT"ۏɗY )h|83 zyʏ{xIFNP5(b8#[a9-O8?2'9.A: xTۅFgx 0EsY$j|js⛽I`TKڅU <'ڟQ Z&u׆b%)÷yLCRMA\g*l/3M(i'6xex|(a Sm^ ~,;$ms;b>x ͪnLR}rOq7zidǚ\ܖwn<#ѺK%NeM&]<ڷl.{yOKhIPN!oHD<t=&kox\n5/_le߰Kaz4#ngg& H0rC2f[SK)tK}x+ڊY8[q#R nowy55#ˠ5{;mϭf^}R;{)LfP@n{9RS~xXdˁkO(5}PDn]ӨCL'e )M>IM/O4EνKf%,Dt">Vp#8Ҍjeގ̮8Ĕw;| ATUbKJAG`O 8yrpbJ32:'N8M,taFN$@r~ŕ:MKʏ{—^= eZZ 44 '9;Qv7dN}z|\.4arM/y8Vʠ퐸:%{rgU10vOrO>|!;^h|Yz"9R0SDL?E"jtf~;T˒5m"`VA86š9eٔ}"uV~M^_lDӜtz;yﶦ:@CC߻CqЛͷI66gúeL4&|8Vh‘^,ͶgpB'U<0Y+gVP|~j8:niVm[f2[d=;u (%{{fΜQM:o*^gtv7oxRSʉK>Bz,J33IOqP1+)R\>r@typ4zygLb b W%p{\D.]:*rE-&2)H$8GgA:_9 xRyI(;,:eȭg3Us&sĂC$Lºʭ'8/nu 6;xGj#gJ.9|!adq*8TqJo\;C{3"l,z,ֶmҝ}GCNZ6s5;@AUt'VCL9-N;:"g!($t$ZLQ ٩ ﴜb)~FId7$H?,r)oVr)L16R/3sl܏0=@7oHQ􇡚蹨{ͅ3^Ձ&6Tjʋo- n;?^2֚L97> 4#KY>5?e4!]BG%7K!޾:XIoY{B޵i1HƳDDTVE'OaIKʇ(!} {?(oӨ3mJؠgC# _U?? endstream endobj 162 0 obj << /Type /ObjStm /N 100 /First 904 /Length 5275 /Filter /FlateDecode >> stream x\[s7~ׯǤNe˩VI(l(r,1H__7@HTޭsR%b0@;036VURWJ:Yp*cu%hוt5U0hwR=|%6 tV7]2P [ N4b0_Yt,' *ᤡy *m*QDkpIiU`KW֫ H|u֒dHS+ u$*"Iv$wA5{j 45,٤&ERJ !]HG5#Ar lV:LdCkNA I\PL"-iIB+Fꫵ嗫jw۽h8m M=kNh6Jn:i{s`l5V Ôui XI߱͝k^Φ|?ƽv3/q7z5Bk#+B9W?\5/hrT5'ɴ3B09)FZd7yZ5o}suRSl0XǨao|KIJ7</Z >@UwS J86_8!_}ptS-_QՐvy٠՚Zڹڀ`W`;Sc9yyW۩h=b1J1A. =ߓ|W5EZ}'kYP/)W!Ķx#)q[uûX[H;np?nW&HNY²֬g*hlMoN&|6l6;0h?76x4l-`0Ț^SL1np8Agx1wƳAg6mFavmWo%0HQ5_a7C`Ǘ؏/i➕PwKpcN\Z09(?;.T )AF#)̖MNx(퉾=g޵L”i#Fy{>C(q-m7tT C 5B&H̐|W9e]ouM9PF(r[W4yb.7yC嚮/Q[Ӥ:<6#! R'$!ʾTCJJ%K: PZO*vݲby=kR*T8[, _|$a2z)/9Koq2c2g܋9 K&M̩"aVbSƼM\XK03޲KeW 5< ).eSޭcN-ް" yI\;y|X,bن$ҿe).G82,i dH [2*r@H[',q]NRIm<6cOqy^.tV^H[Wd8ByԽNud|I EoZ@yԹԉ0Z.)Xb`w L-wSTw!Hs$!}bGydc騄3T/t^牥LgK (wE>*WxFs]$Hs>0-Z"?# vX. 7*չ\;8v껔y^R>x'{I̦A,7 R!,(P*tP;:2.S׆I7$h|'T6`_q.9np˛Wk;BcEMqf:.RGA/4_r֢$ScKz|$SXGzْ0c/O+.`6qk[dܒ4KH}a>3K~?N[Ie$uO#}K/LL:$kt~i ni'IΠڊ^b=o DEqiΚn Fæ״ͨ7f|1Q|/o^雓GOJՖjZ)=~V* +=l5Isڼ͇'\Fqs\4c3h.!0̉I31m3k̚O_W<ܪʀ3g5j#JΈ/N-|1`%[i{> zՠ󥹢ב]yq3]֧W>&t t7-n7΀&K~{>Ѣa~6kVކ~;xk%L雔'VC7Y4ov(bC-fйń ajhh.&ko|=z| wYǸx4~;(?mexּj^1w)-XHia+OچgkatsC~K~f>'7?믖>pc c&͟[ـ7 R-'''Jadn9BW;V_Oao ڤC$'I'9H7I bIjrOVO>a>-|DAk|[du'Qx󒓒vUQIM뚅.Vin//" AoUZ4Im-~^ϓkŽͻ֖ɓU| kB7-V.÷GeqtgF'l5/3N`~ yM\|Kpœ/fd^u\8и`.Z -c2F#$ GƝ.jC\h0:9ˡ".>H5e,\?}֋[% m]mi϶23d7Q [Dȇ* endstream endobj 275 0 obj << /Length1 1399 /Length2 6085 /Length3 0 /Length 7047 /Filter /FlateDecode >> stream xڍvTSk.ҫ4!${oR ! $"("(](MAQ{׺w333{m^.#SQe(BbE@<@UJIA q ^^38 QHPE XM QH,K˃eA 8$7AP>B0(wŗ (Ɉ(#`h# Ї`]`|EGaqJ!źˋy{{! v)(c]&0 ~@?̀38a CbH( j a?`?_gIWDp`# AHg 0b}" qà/ 9l E㈆c1@ E_i𧬎?58?v؟κ"QHNp$ 9 V 7QcsaR 9iiIqt 2Nx @`,^Q( p9ÑdǛaN>^{`xyAQH7?474?>OT *')@FV,7V#ItBP4R_#w^0?ʷI7d+K! O7n ApJB C-a&Y{"۫CW(Xcc4>0GG_ 0_|_>9?*|~`w]u# kĥ45&.% -oCx'W[%b 3/'ſ 8z|׿G9RLOB׆(y. /E&XuGHa>fjyC+M= gvCg ܬň09"D8FVP~@q) t}~Rb boHL`l%|~kд:ibKQ7l*}-jyàJ䌰E疗PQ*(W|r5a\RI*ZBZa+Y.^*h%9Y-;>G_MVmrQ6Y( %u EQӴ9aOT(%,wF{If"02kGY8H1̣,#mFP6yO=. z{ZDGYp;?->'@qa8bWb~rm c+7zR\[Z9upx}mS~&+n9K)HzZ=d"ݣ0O #fzUv؍e u jƞʾ丮VHhTM ,=H$d3~2pǧ: #ۗb(DjHnwh2~һHZV[9u}X=K5L0Pi !X~Pdܦe/J*<'`Y=͓I^f5X?*Ke88\>1RբMp;fac}\׺sƾ} }sL!Bqz} *u+uUsٳ$`wRnN:I R?Mbw^{) zNNSJPyd UӚk)#!|ږ-z])ᘔ\ϼl1H:٥rdEf5m&/ .S .i&y5)s~Aj#7\~c;;-qÞnlmk`b[q%Nk_z㜳71 M,[>iP 3@jR7uv<z/{N6gy4c1,UqR!R+ \ZP0DU%fdLLCsy ls?Aw}Q­G Ac}6畅UU?Ofx2mVӸ[AHmK$IJ>_wYyW!>a2R't,yWÒu_uW73yS  we[s`4njU)#̝O駖}7$X!2}a,dR%i fRpʼZSD/5-EԄ~d 9{۰^kvǭ0>46 gn] tN'۬א̕zr>%%e$v჌"qQg}/'iDmp=Li7roG0jL#\]Sy$_ uˤ~:QS *N5 Dd𔐸ȴ.9rAlH(=0H>ߜ0f#P7tmV5xnokb4,(kk}~(]{^r8¾0^7o|Yj/CeG{묫䓄c][r{ZrX,ݲ+hNgޱeX _H, Sn4F-T̬eC^ [fa;s+?SA H R2lD;W.- tU \{cnB셮c>"[\9a?KQg޻̻Ǐ>!&b~MDM11-V4K :;&`: 2UErhf 1yJ]m U( _rHJzWyeF2%ME,Z_~ZTp?F*s2U듢os|bV飭* \ݥbzPza ގX7e$UIPfY2Ao>̷"yZP^0~^lǪ_`ig.ֶciF:aiF%B#\`>^exYgCZ-|d$A{gdwέ4yąz_ǩef.4> Q\O+ ]3aJJ-/;;껛A.}d}>j҈\ [~'2tH%n^ޙ}6M>}'bҵUBtfU>alo|0eɝ$bN./~rKKXN/sAͿm˲hk׫|ˇHnϳO;im]+aԮjLK`/Mp#-)2GהdH*8[L:go]TgU@^[X@ʩ 'Z[ƇXMԯ;ղ;fiL¾}˼?fv& Hۧ>MAӪtwV|ߦuX}4<6ݡiW'Ρ}'2٪ɯMrrW^_qGC;9! ?LGV+/=„I2 P wȇIv[YW~j.J .)O &!zÕEk#j}aicXssѩs*׶}O4x_;*#mӉ:S8sSC*v$voy.e3w (_C̷gy3W.,c{Y!I'|lђ1'@o54 `zOF61ߖ%:!#&Xi`V 1JY4ǩP3˥yģ9kHn7$g5N;9U,\ltd+lQ6E&BZ<^yfT%rxDǛ]yֽhlyH@S_9"9,eQ$|DrAoڂ9 G;7rղ8.0; x 8mrhI[fer"NRVʛa)aӫC7 eT!v7?tmZp 2$|xSGtt]5,iTEl/MŽw5 9؉x.i_KW77£,j~`\EoL 1M _ ^)Z:7ԎJmҽ$ 픟ZJ9e$ ,qִJI(t P2C%H /M\ez'$,zJ$7L7nPsG`AQ}#C r?v9GYb:VQU޳u.D ޷+Z^Ϸ:Oքئ63*_S&[hvh%oakџQ- m*ؘs9^[7bmSʳߝwd+؀)cMIIOzʱ&5lz5uH}mi1_+τަoϤf{҂ޑzcn>:lB㠵Kknk #>J>|~#@ x93l0N RR8YɌra)MBIrFvmvɼ"o͔4s?pZ1=:_ʢ'10iqo9|sllLxT*գs&P8ԡV endstream endobj 278 0 obj << /Length1 1478 /Length2 6565 /Length3 0 /Length 7568 /Filter /FlateDecode >> stream xڍxT6-NF=;tnFlI %CDA:$DE?y9{vO>3+Aa HPch.  ٍ'_0BÑ堂1XL nN@! PXPPoG$J vC: }$ ]Pp;{ ߏ@.7PHJJw8PCcsVHW .Y{ EZ@vF(;yn>c4a(w04H[b'8@c#P -48:HtEJGC Hg0 `@{ 'F@9Hl< w?:9xOI` 4E_i a kp =v/?uD =>-l/P7c abRR@+ ( 2qAm$`~p[À pfG lG=X }y D8yw(iaMY K$ŀR@&ڜ2j"l@?7dp]e?ҷ`wMp'Rv`B wso&%VB A?8} 1?BNpLqQeN{ mau$ ( 0V>B1<(B 1 jPr]ec `& 8;epl~p@X(cOk7 򷪰\^9`0O07Ȅ:Ԅ6T)1x}h)yc}#h4ْi_'#VYA18j=ʻv0F(nT"-jb]GOM/$:E+ .[R[@g`9s*&N)u /Ɯ3杹y<%2Hx/Kwlna?'Md/OR<>s`R͓ he#D9KM .ZΓ{ ,[g'C,^w jގ̅$-'ZU7/ښy"ߧBFLK/aѳEP*jc|focwC"*3QxeC{LZ\CM/C ЃW&ڲ.w!]0}//Q]g"[L8k~bV@N!'UAzލýEVr /~@gHm $ T,jR&zëyRtT+8i?.GoPY@4a}pwrÉwo5^ VxT{PZx`Q4ƚ;]ISۢ,tEE왌Ǔ" wIHR&5Ghl#+˱ޥ7bv]ROIyhYIFl16f FPqRrC~'X4z^%0A7ZNEyE:ꍐJNEq$1.~"Qoџ#=w|<3s@M[  ~Щ{o%9ͣ)4w. l^!z"LvPTND=Fig:?] {m" ^d)FtR|OC$; ~oeFI}mmi1"]¶g ޙs>]D$/ S@ &Z&̙FkN!a 5(c"^>z~GX8yK\el+쳶CE :sWtwrR6t?JfU2?rvXVjh_IuCy;EE!3Cη1#̑xf=nٍqOw?:8H:`yБ~8067qWXFLfҷG#G? ieQl VJgvکNhTԠ]ߍ@+[iEʴ6p K]fՖ )D>L5?d屔1,paW~QhtV25t2)QKLC R\>rd$Zv3v'Ѡ =A„Rk$)Œvx~Ӊa9-Λ_EX7K"7C:mg[#ssI)h>z_  hKzVpd&zڄoZG0_VMd(V5W8R }a)ȡvNGa1aػ7 6.kx,#M1w9/'R?O~ɲi9vlcǷ} ˏdFb 7mfRѕ=T:}usz?ս̕\#K̈s$">s̽=ZfA9JPӅ/ {JgkD*O j/Jc0sT*^Cxv(l.j*L4W{M;O8:npqIh[vg\N9bU _ӓ%~8M!ta`[zpq曊[w_O2|)=5RvB $T)t%*طu.n4i{p۸ SJ>fJ37(U_ ɷWMaUT=z3'+d}Yp .GW?Өݺw-ypcqfm7Eu/٘oZͮ|Ҙ07$q5gO%NIPW|IHun4fW-˘8YZTQYS(1՝Xgwd=pqq$3Z,6ZZߪwt9qHP>ח4|~d޲f_=oѮ?lFAɾ%zߨ#T܇o/76 W>9K:\ KILVxkV-%/&5i"YMG!T4-OPω>VgW }H_J \Wc&=)ja_Fw65v؁IrOJ();+7?q˗OytEBN9Cߢ4QZMtɽ?DG[r,H9zS- AA5Vo+ŧ<%Y.rf|$EMvi*Ht%c s;=o8|(lpu14/\:T;/l{yzyd6 1~'=s3:C)U9GޟL !lDwBlɣRƽWn6 -'xsL3 '`5Q;^Op9C"#[owmp1y}i|@w=PmlN!$\nT")Mzn<+p-#r}1ge(\YT83dSgT_)?V֦s1F_U2}b˾Qõb/[Rh{{  8)39v?O(U]=演ǔ?4lYo2N8XOSƜ,B9t+@{y;`ŽG p:PWhpFPG 񗢃w q2oV"<3W_yl`3F{|_|%!d~FvU:)!q>3lxG )`$&mlQJaR7ܣoE(P$m#%jY3"{R+nJ[>"KYOcovpS#SaBR+J w 5)ixnw sT'A{AR3/*-R!sL=x,+q'4'r'ThKi5G.Bf2; sfck֧K3d_J.Gk[Ts7*^ d,Gw 1LJ#~Ĵ_[ OIBK+ϰCyi7! M62d01>n=G-z;wNHį 8Zei}5W^RQIe;n;IZ#`iqk ΐUK>kU+/gt~xϳZp_fЗQtI>˸w{r:ؐ6!0#{R9ڌ]\#O.yeAY0t}JL]'j+' .r$!i9)= en3۷}{}m-m v6hdx'I4˺ϼ|*1AYܓAMk涴bGlV>fbk&ٓ8vxWYP" ^O ˻ҚWtT/_r1R endstream endobj 280 0 obj << /Length1 1873 /Length2 13751 /Length3 0 /Length 14918 /Filter /FlateDecode >> stream xڍPҀ,8w`0`!{p -e9{{a^{U 5 PPҔcgqqPSk 6Q`4$ƐW1UQ d`ggcpGޑ i 2(`j {7G%5L||*qX!.?X%^6?Az_{bff_ofBv+___no?2пk*Z!`O>9nrgM_/| _/|x'Ę:9:>8|@W)@UU`m כH:[Rλjw9asbS;awk؇/ֺxlֆax5&LcB`E'6=#N;3 _.L϶Sei~ܔY fAC$D lKm!^)69*G>9}'3ѻP ZO&>8xpz Hh 0I)E9Џ-B*r0dQ1=Rkx=e&=6Ӳ6Ža=<&2ϴa ${34YV> b. r޴.AH_4a*(T%s152|j$ 1x BX`vNr<+jhCS x/Ճ;OVEkUwW;_QU_)ΪTQehϫEB-!q@r/vʅ.1®rΩj -IjV*D4g1>UIFt_Y1}Fq2X.Y_uT-sG[MjdZיA'q ͱ= s̯j ʖe_NB$˶C"?-ء D]f*ABs3qtj%P0RqO{ĩG|,u#Q|Fb}@rɑ>f9Av1a Sbnq1xݗ/Jk7C$J3b#kS )1H3o= 19/JFU*Qf&irM,#FQI;H1ny$RÃÒ238Qstk NQ"mꧺgQyBt_LQ>帝k5%t+z.cM_۵Yј§ 1\#)0Fjsw!k ()%ΨS7|*PRn\.YADL3?@ս)HQxap3W\z8-d=4X< xw(`5)x;hF[\@b(i eBF Pu.l܊][E~[3-YqÒDdtn1E"`d )7 gӼCnA9gu)˥}$Mv9^pϲ1_a8ڐTFmb9J幔hѐ~>HB${c*5!ۘ0Kx>P z1*X9y߷X 'ʹѐ>cʻW7ƱE9mVi/ڇ~0B(ׯ(B૜v첄6M۫1p/jO8D%ŀ54C}NRLDzjn@Wn.}zoGqēBBK|'%oN .5~>$KF;)o=Tz?q572}D-vUh97`ۀN|!I3-!vqP_y,e/DhLTGP8>ȨթLy筊2#Ɛٞ~FRc {3 NPz+;/Rǽ7&8yפE a$U{ڬz4r' n!MىܕCU[K"@|E' ,-Bu> U'Mù:'KSw>ÚIJ:,ʥ![o2+DzY)bJӺ;"uaS;-%ꁆ'vMh€a7p,5.uC ٲJf# !"|(UR2>!9'){ib I0_qtT :.IƅV{-N o%;r)I5 Qy''V4ZQ5kwd:UAuʩ[n95TZOI[ 74psP ::\ŹM͖oG׹L8 ѡf{dͱ^@^5yڃ 7;M(Z`v8-.~R $Ϣ}wO1sU vRU$˄<,ކRL l=},3hXSV/r lBfS Z;clmۭ,I7{{'֥ܢ{cazx(Y"C1`G()q5&;r<5*|N@3EN1pn< hcBqsh+k*1~/CU\wwC0l mcF _$9LE\D`^.jql4~1N DXyj`4y#5(m;Vvc[e.wš !2[ax F-M^}zn=䑛0^OgMI_uy]}%YԪAhebhpMKDBRccJ]>$g&&> ))WJͱ#1;(Pp1fYӺD"2͎3*Kj_wuz|1!} =n\MMsNԧV*7]"]B! z+qL&AJ'ILIw=acm;P}u:N8KcuGMNJ!tio u/la 6 ՂI[U!ϰ"YMdzX6_ e"ΤV>%$B3>hAfuĻŢi0QiaY /^F`{y˽ѺZ_ TyBtz#7 ٳ@̓"4&~U/w0/m.zE,_hb""aqM0`!gh~Ϫ_]-=N' ihIqS*u[4AZb'9P1T$bКdҀB択#5{̰4C)%9-c_s,jFpS{&cߧ5t_X^ufF%r?o9kQ3IT3 Hh0㸢Wd;p v:TȽxNhڈ ?ᚫe4l [v^04>;D`HQC3UPOƀ2s,y_+ˑ;5N"W?Ƹ`ďkU^s’Fa!&knBwTS_g*5pwJ ЇSB=c,*>)Qix{OUV% o&( f)ʺvR;F$"evd۱ץ8XunT?i-#+W-|*p5gIZv<46E: 7F> lnġ_;5*}s>eq'"x*V͡k:]`c~Zq/VzhYEv([5웭G."zLc6'U:fZD7SxPԟ jj<'oPYcy13]|Ĩ7pA¹L:Dt+'w0LfFE?a8j:V&C{Khg#u|+_b!l:",Ŝn)~BfII7[Dw~cy|xӈq^ϾJƋӝkt!: A/_,1oŃ5AKAnWZ*zݙ2"i㥊}/g6~Xu'vLn>$\3xW4]c{HX' ] 'mUPpSB[& 7sOOnZ1˔/AߢvKkz;47e4 ϰV2Tdxq[i/ -I[|:Q3 x$]{T}ŴVzN%j'ZT+J}:Wś[xB"V<#x'Fl},[M55(chy?Zu%}.eb'M7ƘCi㯂8Ρ)%648DءQ:.917vr. d.UhQ%]+t,c7r.3,#t_ yzeϨH=,Tq Hivr* o/dRۨ.Qo5No]m=k+~RZb~?Q7rJcN{\o+<쫸~7a\qQ,?MT-]JPْVYn=O#x0{t$:ݎgD/%(O H\'MDJcTV.7T Oorw#&%aCxI9DB4᎙?"5>VK˷86 Th Ly3Ey_bjHs&L/ׄ7a +eiz|A@aJU:jpC@h#gk bJ y=L-exaG.2, *Hy牢 XX4F[nvdTa)򛹾^&/oZY9 .]VRq{t= ?H,ƫlX;ztaZ7QJ. ]D#px9vO0raj~ |k(u&^~;|cvU%.oNI5YL{(DM <ݗ;1xfĆM:hwiĊx9i*wj;5Byqf.h$AiwB Im}"!3L)}ؚkXӒ=0 ﳢ{#tosھix3G^@d=jQM_ FK&R֙(8AYm$UQzBrQ|Ԧ)' pD4x5.C*WXOx`YavL# 4_K&.5)=[d٥?^\d&ZTWyCZ^P U4k:%+'Eu ; Gv̐;+mf5Xi4Msv=L:0Bx (f@r5'-Øovљٟ?JȖzbֵUAܨgĠ0uGWﰚfȷTqU%cUm [`_q/S )bbiB, 4$NʼOmHUf{V(oL"eW rNRF*Dd :ry~Φb|!OyrA푠(ȸKN[|tkK6)^xJhդ~ ^%",FWuxvDs$bR";I ?3zИS@!5g(Ain{[OBiR0QbY#Zz rSjlCF+n bk-g # ÕKA^)E\jTPv|c,Zڿ\x.]<Xp ԍ i/mW PȪZ(XVGsZ qJԔ{vl!_6ٙe˿-x=˶iF|i|8<'&n<2摡 }4n]砱QkZS|oUK*|.Xj %jUPC1yLeB0ك^UR7&q9$#x:.õ7:f}Rm%@h$eG@'A:TYs~w#Kct x4-X33C["Rr}oW}Q(ߵ>J'Yxd3 .` J1xB̼Ohxb:!][G&3Us{T㣪@@l/)ԝD򉚢v~ qXsԈK8|wRT"]DclUyKk ^L>ޑjVޖ5hlR?U5j:K6;PJaܲ=>Vޡӧ%ds\!3sf\BJxCgI*0&p Pa+"K/~` Yh%~tձ/ctƊ&8=-U0l/=~f21ϯĀ:5j-Y% {We6iV,4|[t|2SײIx|ZE|nߒG2TK "ޝX[blc+<lxΒ5v_tv ɽ=5ɕJ—8jd1^%6f*,eBP ޱ_wn~! ٘]kJ.+HxBiSN~\+DN\aY[WMu5F+O`'hT4jül/¯8N &a-lO#\%ҋǔc~ș*1H.3"mt,oU$y^m~Zc,n 2[C,MX|H)ک$߰1F%8FӘ~)y!6/.UR$\p٠Et/)H1Us X}'}ecg1xm_'Gp G=ۏi!HhC_8h\HG^R穻+WH| {Ji6KM'u*lzQkIq+ih #V> z'kE'ׂ?f̏pc:CG@@Lg|q7ԧn>',Q:5NJd1Zׂr3$/i"GvKԒ?)KO])ᯜ&\ߪ@%U=x mzd -fAm;r0tBx O}Kc)Q7 eԓEQaDQ WXl#*~62B88mMwHpIFʷ4bY)c5|/(YN߿; )7eS'u7V&D1yeSKbZbho/!5*h]^ 鹟,M$#z9D/0Wgh Z~^bDC}\Ի{дex~ < m [KhY`QlAzVt=c6EL?^HppV9TD Hd =`d8a7o^j(n#Ѿ4aɼ oXF<|GtJ}o S=ڔɘjX*m}7J=/!LtGYD6H2_Tiکjt;)fホpD:ߜt\Xӭ93/pt<l=UMX-è\EҸ:8&=RCTŠj_5s}80#D ^4V&7!+Oݴ{yTq>|5-ړlSӞn_3.OjbB"ƾlRpA%Newlsu"i.MM5۔t2tsXv<؀M(}Dm=I=tl'1{B4t]_Ɉ뻁ԷFlhq.pj83*P`CCbj;>W6 uVvcm8c R7C{vckNS1h IHCNȗ2Sr ~>ėz(RB3KgWGk1V~|߳tVyFXݢ`t{%7vC0m$|VCP땾mI0Ks"$f]ݺ>l$oH~,3KP|Dbڱ7_v)# ]&J6s*K9֞?1mx`T9e#ƭ+ Jb}0~%nzn5x{R F+acz(Dvc0Wc/ϟG~ɑN pu FN"RHsT3I~R$q}#T~/)V}2=]tue-']Q]ю#{b8\( !ե6ks@!bpj"cZ‘*Vht+a]OF:=6z6$?dHttՂEc^ni"sHw+}3qU~?f)ffGVaA_ؾ4o~ ỗ!)h8FK,v%!]EJXQڑ0@g֒ 71V\"UJxiK,+e{QIkr=XV7Q\XqتO= 2%}Ac]x5'c^vL:֙d*!3sƓ0~M#jo~#XxU*yTxCh3 2u}/'WĆmRO< utہc,\vc@Cmb:8ę`нY~ߘ@v|4Sԁ,kk ܝww:%Zr;UC_"]__T.u$ҡƪ 9}4D `_4FR&՝o5 7u >38e} acd,6 ۾qD7u0𷖡7+. o4 \v\i.u:{LF'Y_~9k 3I7쳌FK6}W`YKеž|^fݝPyٺY>lBnee/ݓ8:߃X,y#n!>wa#?&mqim4bR]n_7&Y:,ktHuVrUDayaz6tEnEo19J8!A E%=J? ,߁sU8Ǿd6NEO7͇EY9:4ߊIXæz׃U"B91r i| b1S[2-s8Who~˷|z N,&n2wgui">0w2wjaK0bD5PeZT74)|D.6 ['f؞M1:tcDia[a#( ?ؒOql#1J+).27@Uax{ ȄƒUqo +`ӽӚV+랶\* |Yw䛶N@XcEg,-e\3^!% yr#E{X[އ6nW-Od=]@vw2_| 9?OMM 00"rKWdeKgzjvoMU|$hO2ZC^h$ Bv<7c PɬJ'L!HKΘp=nг\SP"#K|ti @S^psia8H!AyǙ<^,9@r*prt VI:kUJ"}Şb/fd#:jMh{muOXL+KK7F@t䥜ѭAwt悒;̔ۂJPw솷G摲eFWfL=i!(QA>g"_ qZϞ-#_!*[wQx\_o:$šS0q_~x1!Y&}WBVAQaFx+(C0(p{vRX8X@qުLIJx&l%޶Vhgp8ւOhڈ[0 ^n|f)MԪ{~ E3`:"pw!wlin(aؤb;]+4^MB^yg]p0!8 S7O[X|GVAakE*]&bjҩӽ칷!k] ړ=|vxnOk6pn9ĉL4aeK2-dn6 |f%|G^QˈiXG<}F9L;ayᶩ4ɀ:%*?C~=TH7o BUR(Duw]X;um~sa$1u8Nx\~NF܍ H SMQ5^]ب*4 aQ E^y=깩b.dUis59D»jexlF5%}ږڞ, ưu^g/%зm:`wF)0q}3<Q<{o5kÚ>􊎉fM3-p6\Ɩ}!e-OO=\ȇ& ba 4vw_HzQ~tppik`p&ePtJEƊnw׍j@s_%C3Gr:v(Y;eSO&2}# qVP Kg#0 e7rI^#ӏC*B{RcD}mTgaKe)|3KojQt"#\5UQ^ϐ4JSKWMO]g;(cL1;>~7 ئtĊ,MCHHVG)"G*ސ]G/`aMTJiF/JMnڎ@x{&w1N 8*vx1(r1ާ]>i(:ӞS Ȥ9 _w^fţgIJ+clNy'WzዔB+ٖe'6F9ECwX)9cg5VK\Aܰ84֜<%ET|ˏ oF~!: <)5hv  缝_:w3etOEkP؍W,^2?~EykcSU|x[~y- 80x'^a-T@4/FຂF6TDz"-z'n Ez ao $WӇt{wLG0Ց-~Z+QsunjE>ǂNEz_CCl퓙yH~R-:%xSR' XuB2.\Ͳ-iu\'1UoԿ=؋7 N{r=Ia*ۙw Zsozg#zT,2l#)p(#3Mp<,[ɮmgύnivG_>MW8u(Lf,1&XC`G%Iҫ+LbAuy@Nب)gS} O*yտ(imֆ4+pȧh(+ѶL //bm\RG /~HE~beBbeߚ<F߅ΠMłϜ5Ç9`Io b92<[UDO>3H?r endstream endobj 282 0 obj << /Length1 2332 /Length2 15990 /Length3 0 /Length 17370 /Filter /FlateDecode >> stream xڌT%z &ڹ&۶mcW;6'ۓ=ٓm{T'7yp<[}Wkվn_7~;JRe5sS+ #3/@LA] OIrWO tv9Bh.7q}7TpȺX,,\Vff:8MAF=Rdi4f.D 3{=-@ t4VLL&v.Ζ@tv P4#<%@ o3.]]́΀5y#69F@ 999{- [ @IRӕ`boû _$ET& #_a,ao.`gwu>q3^L/nL '7lEd@W3337+zY1@/%_w~>w@?;< d 0ZD- 1 ?oILLQRA?V:x| ll6.''%U6ēp{K?{A󟣡oEmh,>3/'/WIKOo?~ aM>g9je\M/DF\$A@seտ6cxn *;zo ,G~rf6o_f7s0X98&&^ayQsVhxgppk&DF&?} n`q1$ 67~TXLл`Rb7b3qy{"?9| ?rͿFlwN$vvk^L)"?8;/w"\k#_j78XeaZy9Za.?y0 jпr;Qs|qG`ox`&!;s'7W?K-w.ǻww.&.V^ɟ_0&W+g?FN1;$?=?{T9w_ _/c h`jE`Z`@+g͹ 6.'x^$uus_Nxi{lDGJQA',LH!o'_ vY'7ndRC*ur/ qAeKd0 D>DY_@ϟy#M;c+ak{ZեO}rGG,ΊOyiJ3-#D9 :$_g#S"\΁S\: IJmpt ^>kPw:wr 3zz{p{X[#0`o{}+(}g<=պ$.ܐaS3QP1Z(1x:Mh%56_ 'u3垽=<lSfJe8L[Iu!3铹*yɅe7k:%"* -NZFC-FkF+aFKs06 (.J&*ћ*Agp& Ƣ5RQ&[elN_R5S j*_mA9 %DrOop y ƤB׸h]lCDH^1X6zAag/=s&w֌F 'I O=Z>zڵ-aԦcN m"1:`T'8Z0r W0}e|,S6En.pJk3'fkćv[UDM=Kcl r2%\\" Jь|b@y|~ IyC:w+nU$]E# 2]j엊.G8vf3p%nzgH:iYy]zciEM9BVm9׈ (͇K)aaQAdW*|5.+Nc-p`~Ua7>.TgpLt_XsQұ0Fh"'ԙf"56g%YR\%f[> #}a(j4TJcMͽ/u5!}bp[TZ#\{d6q'MPguh GYWֽ%e3 ,q/?Me "rx?M~GX.8*}.4rCbg)9=C {/Fđk/Yye{Ԧ[Ni/?vtaܦ[GR Y>/3AB0:NC2t|hghs@ ;IuQ'2!5O_砃ί<+kX'jB݄p Se xcԘ|2?@Het!rJ\y$ YtQX'x576L2Å2ȣڢÙqxyv;U+I\~qfG J(7Ski꯺Qk` q;uQ'#?w6IKf|-$,SݡEޏ]UyO3NDeT[";Ϻ)]cdϽx0 j^+FQQO )SF-L^8QyfX/ǾUT] &)z7[ϸ4̎Z`[!0#Qf3YbJ W–in"Vd(񼭣sxIno#!Fx!;(Vzl}#lRL; 0J8$J YƉ:V/mX-y"['DhЏ=8mW0ݛT~8]x|PcD2 /\ _SvJj/~y4* 8svҜ9/0cj450Eȇ-,cɠeTI_%FN YO8h&DMP-BӒIq:#*@j3{wlSpR`=ioX8~S|eijUлOphݺ#jh(WbfL;&f\f3P{[5Gj $} ٨Pvnrh L޷K}iDx]3:OiR!]TlWrl!ThwV>p ,0mE$~i!tL)ۭ8A4.fd6e켁N{D,svn$!ED @"̘nnw:'Q`VRVgitF^˪BYtbG[AjAcoOuä)3=NoծbgVJ|N{Aܿ(0ZE#䝑},z[)C~B(}AF|r5w-mҙU!?ߖ-WGxS̘h4Uf (p%V~I.mŶoØygBz|6r:Lֳ1{etApcGgmM+򸝭/2%_>8\Q5f:wdMuB#W%nC&X- ҬK’fz mcFMl앎D6wY/KosrYyl! Q! lӲI>d˯f Muq:ur3AjW‘ŁFK.;wX'L{16[nR~,_QۦΦ1Rn˞aI0b0wD ($yBݞ[z ]Y}hR˭ا'k?5m.Y0Q6? \X?X:M/PCZI@_B\~TCl/J"1sEC!=}u}>gTcjCtX5׿{WơجpxNQ8AAĶ[n4糟1i.R[ &vcx"擟H韴z}ti~JÍ FLs+ :iń$^mPº$S!:^ٳQч戳ZBaO]tRɞke_b153@wc; =",_EV8m>/FB8mdG}W> dX?Csy!Ջ F5J06D 13OR'!q~1rwT<&(?*dے)ӳеJP&# ^H "ʓ$6 -uSHi$,{uSĔ B)xo?RֿO1Q94 Bwb_I^e2/Ƚ#5(nJj& xsN&zZ ?4ȑQKR )8ATvpsW>`:TWO`E_)xQuK (uz?lBu EןڥFt),">受f!+_ ʽ?LT$9U"QQ$DuȷT+y AoC׭k,+',[*:zG/S1s/_XP~&~3*51/U7DSOSb9q8e 8ŝ}ۤIiθY&7]9RnOcw3KnrjBS̺D] y˗)Hڑ&@9$C@:8R;vRq^:cfBU2#$R hzY:Gä7('V f`̹}F% }rc\~d,k$ZClUtuH7x=3BqG^z(۴'TA/A.[~N#ԡcɒ-o)7Q* CpeeMA вhLѶnљu8amk Gq]9"B$%,{,|8Y(dBeEnI'6ߌ'F;ća`eI~_~h3d]rhRG"]h@S%xz?k }qdj}XFE3u9+%H}@@'6E@BL!ߏ~@`Mz 0mj^~)\6<uKJ/"|*B׳J7+8$@2^Û7XEq$ 5gTx$c^|bG =o ̬'XQ '7y)WZ˥'53]kC.Pm;yIE}ydښF֠ĩ2ޮ7 @$D{(_py3 +IKz0=1 ߫. N 3]:x |x$Z1!&D]׵O\6ؒQ fE~y"[|yѿFxy:0Hڣۤ5PS >P%I\Cz98%)Ka)8Q }G{MԋI{:k]͛w) XlbYu&8^m$đ3+_6ӕJ԰2 p]}:݊7fɴD<eٻI(Ӣ()h_n. K`(n1Ֆ="YΣobٿuBӷٖ޿CSs ZN :ξ6$h/qNY ,E( DaInn n;ր/mI&vg55#(Hw%)]H&w6`vCG"0XIM^J9pմq`Ѝ9x]Fl{S~9 XbJfo?bFbn!k{ ȱn?MPͱlyI%x7Ht>10gIk3> UT&4QI/t0Jh+ _"D*g<~{"d*xc)G !h,6g {Xv1C) aMo3NP*0*8;sgʒ\'P_5繙oi3N҄.4K>wX\q.;i%'wMc5 J&ʮ}6*.[9P5CxgѲ$PkFWգOf7 v]rw"{{zQN{>J^#wCL4PJ&mZ>!C!2IӾ0`Mdjbm9ꓒ >1\5wwy9lM7~z*}6('="Anօe2cvi%5önQ~Gu֔=rSh ڦ>oR,pnq[ѣhCh}ª5ksW"zwW+36\%rfC;%3r.ѭFP>U܀yj?,on.g_$5pn_Z}Iإ#ٱ S1n .jg]ZW4Ҝ`nEvjw) k P +!#'Q ֐ l6>S0Lķ%ƌǓJL! I.B~rޕAMcwdB诐0Œ7^pĂGp. wӑʾ4%*_C/aۗ:}^cמܧqG@M(h7\ 8h5$U| 8aeU~m}wAhK:vFl) . R5£ IlrܔMpruy%*FMK\ȡTt0Y]U9ZӶ Ç]ٔS/5 JwlXO<*lg1yP45g%P\jbyh_;|9yv[}w40 a1[ǽzރKF}ISzv* z@!.$*vi&71^U '씑ҵ#ı,3"?^L]Q [Xi:%7Ҁ=V ݷȰ8'+Ovq:iWZ9ڜ+[zrOq=94bC(_agp?SkӴs˴PR#l=zi?_w:.ßGEw+; RZw|ħR'Eh (:POY3D2}ͤ;w!O)Q[1C})_* Nf6MO1MNrf͸JwՐ@Bi"4bkP!u59 )'`C|ozR+d}܊h >7ѦwaAdj/BޓZ):*v'W2iw^ގ/ Os$3M#@Y\t^FØ^WյתHU \NLcz.fYpVuS?_mHb6N#M"~>еK(O|D7 pܰ/pT)daBX>u)j:)H-Wҭ 0BFmA&h:!lUuC=)q83 '|Hf]j 'O0pci%GlUM,4ҌH)D,ϋ♰xYV/xBƿgyWqj |3+D{J<-۟.,M5(n?eq؀IH=q$ogs^8,Rj&j"ΘcwQGk8]Tscc9#-jO;<2M\SQK uK|*/- Ƞ:wd Џ9{9Ia(aK6B >t\}u,{IHn٠Ie߂~w½>*$Z9ۊ=|/w{ю!_ Vfza{< d5cXHWGTw .~Bםga1yʩ7X}yn`\,X?k#'?N7h>\Di1! `C͛@̏20JQ(q`^O2MAI棒mLJ!8)_+Sl "tU$C2(Kjۡ(`5r&6ډT^ 0Qaw}7 vV`({ӆKxxAo 2?txomeh ME4#Y(ʛ]K0E^'ɑaИ#V F]>!"t=!<~(HY/KnňM36js+%WӀ+L"T?go=D?3!epoVsZH׮ vO TR5%eQJ@ecjĬ(V@zJ>' {<~)&lvgZݣ&wux$ bE~;N/lY}Qv#f[B G!`i^]d~孒4r.֨r[p< s}t&S/).lK7?n珗A3 ioSX4̅)>\,5Ei\-av3tGDBi2Թ&,{ HzV-Ug`QGzD濹C: ~|ƹ9]7gn{ P,2U!9m -.VڌR>BJ]E5.9j-j0D/2" G}G_D7d=h<Χ$ .kWK5Z*VHq;Jz/ \]Gro&'Ey+Ϛ _1Hu5 m-Fv&yk!Z?OpGw.YmjZ}GkǒC="7na?e?*$c]m%#FtjIdqeiٗ,eaqXfx# Q`XiXAGfcZQC z8O"y8Kvq$&'9/RlA'^~'L _bm}/t蚤Bjj?ѓfJ ^)5e3/R+͕YQ\'8ObSSvf(6}=/lwdR/G' crVA8i,.ut sK4u- "S#$~i*:՟_:|=1+,͡FhFP'$e^!-`{A'Q] (^LvImam/}׿8KmUc4BFJF, ,mwIB)*-6Ɍ!RMG,?-Kfm~H)NNPSۗ mgU7`vN9H`tVPIwm} }7."Y̽oTnO#a7I_u}kj"mo5BB>u{+j+y$}&Ѐ%XISaK eLjP]˓QyjJm>~utY˾(R,h|l!KӾ 黸HKK%v3zCIY;-&bKhL meSVk%y$:f[JYNۧ[;J]YǕ*:\q{ATa6S(~9,Tl Gi|26SԝR=(wl/#+[]vվUTPAur_*Ҫ5 ֩Dc PФ;Gnl!RC0Q#bC?yE'U P;H'~EDZdOL_X˥ )}]zge&^NeЗc[|s3/g5).A6#I!rrWY o3tϽE"uJǺQP:ȉ08Ibц݃͑hςl@B|0D\6D(e 9 Ѽ"5 Z*LeO -=Ds!S_6m(G y{I)[=>.D'q%Mk2XHT sdt!23`3`)#h5b:k32?7!xgzOOP9NS|Nb@;F8fLEGvf~?{5Ʀl6qI;=sRޜ$6}ݬΝ-!mBq)Ox8Sb(E= ahe@MxDъ!1=W4˓$q7"@0r-XH1y|%, ˢmwT@_{Mq1W8YS>"!fI v[ȭMF{ٻ9#?QKiqTm ]S]{wba& oƒޟ,%a{B\EJ;Űt2T 1u"^?H]Oq:Hf+CN^Wב[J`L:$\,o2~ªE{ui,To0Q60|x3ϔgΰkp(y|Si:-$27e<~ZEV1NV X ٥f!ܬϰ _C(zi$& XIIs!a zH{6NmiH|h7J.U"#,XZT 7 hLH" î5'CPͦb[)40} `50VB"qVwp~rws|>ikq ?Xf-D0ڵ^Y7{#Df>%ixy[wv~a0 *j&Hk( URx,׽L ]M-m@4J&qYlxD0T`~dsfu6ihc|&4L"JOGm[Y0p1 `gI~Ԧ]L҈YC 5=X~Ywu6zDxmYB[¡ze+Z+cĂhg%M-2 SIq~777xJmp5lUJS I=DHlz*D|؂c n֬;Nflĉ;xt< P/6P&<iZQU0™M!~4f"4s]17S!<3]xYk, 0Xm~K>@FiG%bJ,"nW4DKE9ʚ5Q &u.C`~y'RcuuzV[J.T!ڤzJU9~8=#0r$~>zd XV" ,ts d5N+}LRN:_Ⱦmevn,k "ƊYi px?9(Oz<>"qͬ!lf#mHia|X[pJ  -T$."\~Oa Wt'dQc9|L;vF"v|gق C(>WA=~A6_P}? v?ˮnp|6#D>SO;`z~ 借\{94caH|h~E㿞[f1K33PX"DAfpþzZn8/,5u[{cMcSWo 'sd>Fӱk\W<:bU\Q %ߧC: [įT :|K*ҙ0<9սqEQ+|w4`FqCFoefP}k]QH׼sI`ucX0幆-}6Ztl-2ɪ"ܒ}M"gd .k9j34 Tx~x ggz 1H /!,!C:tt..Y2dq'iˡb" /0e uݢ|&I\%)&YAZZ 4t(uvtsqj*@kî^]>DtZO5`Jz=* y-ʊ- ojMPem@kw;p$ĺ(bQer% endstream endobj 284 0 obj << /Length1 1614 /Length2 8103 /Length3 0 /Length 9151 /Filter /FlateDecode >> stream xڍT- ]Jt7t#%]# 0 1 !HwtwwH#tKֺwZ3~ss; Z 9(%Vpqrpq`30hav? : 'g0"i'a8U(bp p pqx :dp@N`+k_gnaaAI{a {DGs@ jS♘5 w:Y=gfaM3 " Pڃ`Ɓж;aׂZ\N `6A. xGϽpsp]_@ssX,v K9 X 9C@8l|r @NRD EW.B, dN sĶsq+O` XX"a vt)0ac\\\B#fnDy-Alg 9_N]}Iu?퓒<<~>EVu ϥqSOb u)g 3Ԡ%?9YSTM 9;g7lgB.0PBP] WD $m;ˁ@`ouv`H uعLJ6s[m8.bQb5u< !.~~7b<-@nu @a@_H`Caa8-ADߐ?_Pi/hfF4W.b8Tp: r՝!AO?g䄸T~7225 l.tedMdfr\t)A.<ͽǷjX[;hF1ҞoUTXOص_ly;z٢#*1;g\vɻUu. ljl (NG0˛bxiNB|F0uq9I6F)k?7`7KzRz]1RB^?-(z-[TFq1ZD}[T<1Cɕ<$iv&,>%/xᜀ@۹0 n`ч>'}":JUuY;SyGō&G/s&o %hyqIv.i&du'<24Qbg0Y'q]Puvl UzS ?5./&+dt( bDb(29D% b7K 2 >~:l1^ &J ýeq[GŖ\?DSD7:}UCһ5tX=UQ煊q&"^zp|W#v9{l\ye2Rny1~*4T* 5Z \6O.Mx̓!90n`х}"7 .B$O^ZfgA«Wԓ4?n<'S[>m ].mn gHQww>X6"BQ <"`Kw|xI}ԕϧG|$/忚,qtEr_˛OWVDND"w\62(W ;evDbzf''%_*h'K[kc=&9at}؟ @~lA,k#_rȍ x);z=m(\i[f]oK2(RՌܕLbՇp!rc"S#=` kg>eL>!]qpGZmX{2Vhų#YVX^ 'FMhЦl M-. JvZ}y|/Uj%9"C uiPRJrx+{ÃxU_x KU惓s-<T>d9ӋEZta4`pZpa[ק9 ,۷ܐ/Gl4*;(>JT~ܻP@okT_z=@_ 2W(܂iI"Шk8% RHƿYi[^+G6~Iܺ\fW]i+|)AP(!` ͡-a$AIz j6'+x/|<ԿIrV뮍|t,>gٸXD`!ڬ M"!$Z)ZSөv5!Um*o8*`*nq$^~gl"b&݊;Q wy`# **69tgm h$2^չSΞ4jS31yc$2Xl9%oso27d?)[B|h>>ISabrԮЮFߗP'6w:*3qЎx\j)bj$}wmp80Kz'_76Ki7J2jPq^ gv·=^ξf7RI]uۗ2hue:J;ThQ972/ڕ {/JʳfV4L>B:56>KTfjսؽ+1E.̚f= p{og#RneЋ)j߅Ag[5eOSvj=߃Hl7uOc߼pa(rV*)i:ۥzwIGznf&ȏk:npg( y4T yCCCe.E^PN5_WzD(fBv nW6$=٨p %4lkq&%p"MyM:̇f!`e7(f\noh !JEi6O0PL\~EƤf֠"eIJh:nRrjVƕ˞Rpj+/ 'T%F%0J7ϱiS%׀UWjirԖ=Dl]2Hr~"{f$sqhc z5)XjF:/,ή̫;>WS71o}^QwGG$mߌ:)H| 0?MnI$Eۚ"jS0~,ǚX'p$fi֚T!nT}3QR~eVc4u̥g$rZ[o%Ns7nQii FIqjdO* QftR(,\0vuZID8䋂=Ԟ{Lx H_[a$ZShe⮚ rpY(Hw4]j= fBegFZV} EUK*k,*(k4:ʐ\ub LPW ̦/t|)v6^ТaoNޮ迸V {3_ifx;ƢO;6<4Qa^w_~,~WC/\K0TZzm%qˆa6 za+<aDg\%8#,hHǾ9Wj#M٘G֩mLY=VWT̠AEó} ۾ǭ# SPG\`͔y ~>V/^V笘O(q&Va&5Y6oHEמS*'lhD FtKTAM<})LFfH=w?5?Ӵ^8Mn (&DTM֝:R;j@ד=ͤ(jү|ogD|QEM 8d~[ rrĢn8&rr8*KPo Gu kȐIQ1@rP1^Oӯa ǜj4n 9$Z{E E 7ze1*W҅ڙڳ **ց ld?t3 ֤\a!$$P2K7HX#׉\6sj=nbZ}$'ٹZ>T 1G!WgFv$*ZR讵DQҾx=fƂ,f&렬IBs v>lT𤕟&ftv"MF7XT=؜3ooeuXdOvϤDOr@9Y/!vjJ&Oo5_=[f_V'M/WۂPɇ,宣 6 jx.ZCyȜ~RXtMG6dH(OQ&]ϥQoVppd)$xve-Bay,%M?ن/*g9jH5be=Tu0yvlU̴0Ʒ $6_Jz¶6a3(M磡i3MB3")=8jL2NF猹t]@Zs\OՌ˹ 4J Sxsj%h:f6H_.X135;is:R 61GelL  Xe.V'*Le -CR;yHVdvHså$64LY|[L:!t2.2 $%G# ^':e:\Ұ0j/gLp5Juhu̱vCc-@|{R>eX|~~wOH\|IQζR?+9?Fi|R6vKd8؈c-\7uT9C}7{L==gܒX4rTdžIV'YjTmQ6+`iDz>g+zyQ(N,f Nnm g_I(f%)ޗQjgsR(bF8tZ_@N{KB 3Q|um+u x6RlM*}H;0lϔ!pW[>!q_JCJ& #72=, endstream endobj 297 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.12)/Keywords() /CreationDate (D:20131119122956+01'00') /ModDate (D:20131119122956+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 277 0 obj << /Type /ObjStm /N 44 /First 366 /Length 1789 /Filter /FlateDecode >> stream xڭX[s8~WٝTL3ےMsO:}p&m67ha#|Α%9QUq mŐ"DrBD0uB# Q ЎKu`*Q (윸0 * !4QusF9bTKD }L I#ASIH-.CL?;6"!SuC-, OMBK,a;ZA[U@H9v `' (  $HD p|Wsq&>><#|/%?aOu>5!qg89='8 _+(gYFÑj,Pb.P*qIHE\B)$$Lce)HcoͤyNc dGAlef |_x쿀" 6CF { 3_P_Dyz $$O^2?+8&nۛM(ݞ'Y ^R'_K*m\:y;a@\+ oX؏W4`[)&0m7?rxڄN2<%xg{5T:g輎n+]{&v?;g]6a/; G'QZw'@h^:AwKuGG?=wzKFq}^<ۂ(;V]s.wP.ZN6}pka;Y𖚓lmO,nΟ'nNzWT:("UǪR;X 7kUWjeWN<+APs@Zo-JwzщO~7%W`3]]l&O+m{-ZC`ڱ=ٛxJD 匑΍?A_wOra췊g+:wl-R oJ|,8;X4~Z"xdYc)rCo.[Qpvl^}%TJԆbd~b!䇖Cʏ*!F/ Nx m:YJڝd+EAFԋ=TT滱^μ0.wO&Nv:{HV|\Ii!-u={q쇓4*[HS=6g~Ze:lO%@I:]?Ih⼳1z]q+ Ű%I=,ߖ;{N(|O߃JչԂoPy'd 5 9,f;$U-ێB-[ uX=7հF`y$Gnk-Zܒ@['JBzL+l_n6e JQƇYPH&/+B#*ҸF`Eu*^nb[ADdY xF"Kȥ #crIœmZ-aasc?>R/&|#zÖ{K합hY/FO_'m#47a7Ç_" endstream endobj 298 0 obj << /Type /XRef /Index [0 299] /Size 299 /W [1 3 1] /Root 296 0 R /Info 297 0 R /ID [<5FDC6A1B1DC7D03942453055A93A0ABF> <5FDC6A1B1DC7D03942453055A93A0ABF>] /Length 748 /Filter /FlateDecode >> stream x%IHUQ>5y֜ǜ2lpxeAѢ h΅Z"Im ""UR͇޹9zyNܷ{*3ʨ<8 WJ=J_ DHbG 6hF!R(A ABCB8fO VND ِ6/9zXŶf핔CTB4C-dK~g{bVN$HΦpJ\Yl'~Q{Jڠ4눆:e?^mkJUtCۼkSxa8 <\z-03 UΡ"L;?oKpU7<ы6y a={c+b) Â6y}u6I+𑿞0v jA'jfj&ʚ"f#tXx+"NDڬIKV \fCHN@~²ˡOC4PjFɩSRQ Jd+ G6JVGkbmybLk'4.dRSɕ$yQJɕ+%WJ\)Rrc@tȆ %J6t&Hȫ2{P\[f+jjVaĻy`ռx;V-cբ%ZUڴjEVkպC-VmHp YN"3[NkXI}*_"bUPPP`ʵ`S/xw0 endstream endobj startxref 351972 %%EOF surveillance/inst/doc/hhh4.pdf0000644000176000001440000132711612242645664016074 0ustar ripleyusers%PDF-1.5 % 57 0 obj << /Length 2615 /Filter /FlateDecode >> stream xڭ˒>_[8U >e]Mզ‘81\'j8ޭAw6[g6ۛol*ygյ5~o]_(`x~=b J )bO ?C4׾?^WEޭGBn@JO>=S=_δUEklUg93@ "~KEG\l[A`` TJS #`m1G}֦CpM'yQr@pra+NIw`9 lQmᐮ0m} yD?!\/`Dn̨xW"#n4yS< N1wJH"6¦Qr'o91R~pxG=3ڊDQy1HkG2t•B }6n\-*g +1Q[^CY*_0 )h2KN>_" N"aF:w- qe#3) ד1hyh iTjMao@tMPJF| IPE *³oq^yՖRRʩxv*U'C6Q>tP[0;-kǣUdw$j5{4/(Gd;c\x>$a n1xiΉE5Bk^bg96 .ՙB_` Oqk oI Kl6-uKKm 7PβI$ԉ%WM8~)Rz$`\&rPOث%m̘x{Cd?tjÆME0UJZ\.-+KIgcPu2žz)q)A.#ShcLN,1.IflYLo_150'w<6ox1r.϶v /fdc-+-a2ވn}YDŽ5{[_f-/Xih^o+ףe-JIJ[n>hplAEV$^6^('N/X=VE":T.ա~2($ס왺1bYe T>9f2wmBf'!`h'aegmx+xX7{׹Zn n9etq"BoYqvuqb !ުfz|yh@՟jf\GLvÔX/WL0z" &/؏vzYc_~~u9t>_sI'F{ʮgXFҽPEU}j?L|wsf.s.ƃ gg/l`Zh@wоĊaȅiC@],6kL[tMcEo!q>~> stream xڭْ}BHU+,qW6f8̛+8ǎ HaƓJ$` f,}닷龎Tzv}3ӺTfe收z=a^ysuq mb>ZTϋ<7^vnBg5{\k_iilugźҔuf'ʧLyZt7R[ϹGt>nYㆶ;9ҟ4 wzW/gRp_;L' >ǔp]{Yt"̽'1F}DjtȆ' 3L>+}2KfGY,LATN 4)c"p-""xRB5Ǔ*Zݍ%mZ=y2{bYSUd%氖i3HLH;6.<"vdsFlf+lQgbyvZ3n5z)#le^t~Wxڒ5f~՞ 08~{zaDt@߁i:[͊x4JR̴S <5,ZT\ݟ%RHW-eݐ% #ru&\xx3Q.=1nV owʁx @_'Wsdg9JՀG',Nҵ&ksQοG?Ų}'ugUU__'d 8l{-)#FQEwI<mP һ~Mі|!eڊJiM/x]=_u[hĝтG6R_\L;l3ܱ9EZFOT5*rl $ˠ.x啧̻BhN-o'V:<=VKh~d[L wbcڻɴ:eb*u$i1Dr^ =8.4c|i 0"w3TN$o88iGBFk$8tClp襪9]SɈK$ڈ!԰Of]ȂcLWA`Cmd51*;1*6KSѹ@xAuFZ-p [ʇg&VuNUs'T;͈E950IZ fwY=eU ]l)~<V{(ņ@]`Z@B6p@<)G OCd2  M8$],`uW&S~yj&)7IΙHLc4$5嘠vaAF(c8q>ykW!;Y2FIØ[wϘt~!C:.$8XnPESfwKQ3CP6nV~+a*Xгe6bIΪKh{ݑD&mbqv&ȖA# vmS^MP#};>W8҂VUC'*yLUЗ2@Rg93.Z]K:?qRvyFS7)$EyT frԞU^^}^ N'@-BkJ[ Wq*+yVl Οv6©kɁȫI![ wf>dH!U"u{='c7/XMcjac;!AXOxw..x nŘ#01HP4h:_cC3\pCyfqC6]T˧SwcQ|Dj$QLy?#._*B5;هVȸ,f%3UzX2@7} Hȝ"B]1xֵŚuTrcUt]+=s2%z[A.W\λ<@ƘBįȹ|)2:cln0e i+l"IO &Cwlo5b> )=䪛Lvz$~M|.wjC=%c2Ҟs"ڷ̥>j-5=ٟ}Gs\usO`ы X~:(.P p(gDj#ˤNmʈCga9aȆh\(.*9{_}oE/j>W&\UQÀS4q_dp|.VBAX+F{[AGiVHsf9XqXZo/~$:|۪mJ=[/~)%UY0ig]]5fy`Y\:A QR9ʞ"p /AzXN~G2zV~J Yhv $w4EV 3: =30'ZN endstream endobj 104 0 obj << /Length 1554 /Filter /FlateDecode >> stream xڕWYoF~  i.wy=q}hb(HCRv_\C7'p?)߾< {&r__*ϒ@9W GOI+;Wlz*:.y2vB뫟,/MlX٢>]< c%.o^ mjGZȀV!Po|UVĬvUۇ7v(v-mF{ļ鵘̼$9eȚmY]k1`h֦&s, 2oQ #? Laܮ,ݼA2>Y,V-/0.3/Lh|[ ᬢ&kf NJrܟo؊s,TR~d$8F8tA*A1Ac?C7|=d5}"yQo}FІۼ4ےݣGV[u9#'|kq./F9rs@YNbm1{s?DR+MI uUU3d·O h{~Jx't" :F@Մn8GϮ9QΤ5#%!_.d}}tKXy/ibm;rH! ޶l5x=FSU,}F~7G36Wg`/R)6gʐĈ$' 7> ,˳:R6'ӟ~l`*,*s_$&H/M2]zO-i̇A I~UI0PSwQ7L8~߾5XfAxRFa74HϤ\d1bUU@YCjE;Q06_Z9=Zo 䇊Qi¯~ 8j=T'-)#sfXhnCeH]8V$Vf endstream endobj 97 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/hhh4-plotfluMen.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 107 0 R /BBox [0 0 720 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 108 0 R/F3 109 0 R>> /ExtGState << >>/ColorSpace << /sRGB 110 0 R >>>> /Length 8870 /Filter /FlateDecode >> stream xM,QWK{ASK G@,0[αAHz*#2"Ds皅ɪs:+7w^I/?~|g|?_?|Zy]ӟeGjEa=7'O?ͧEn4fBx{^9,?oӏ|}ӏto?|ViU[\]L4ߘyW-j{1yh~UǓ5?~#S(׾R7C~>˟hfh" Oq=Ao| *֯>W~wOPfhoO'y .CX?A>˵>{xvh[{|JXs'~P⫌!4/iá'~zFo4z34 rK]_n?4wx]@_.CoX?A0f>O4z34Ӻ/Z{:z34z@CSp}3zGʃ MU5xF5܊{*V`+8,Ek:$>]9¶o ղ0yF34UqG:k]Iw`*V~T}V8PMVc𞣄xJ9z;4zjz344nq{nhj ȗxK%myݏz6ݓ 2{ћ]F߰~N@G ͧ`#Fo;o ~u0sS/wCQ!H'۬XM#qCg!(A!mX87Ao맸p- ڦ|m7%84f C| "8 ǵ4!Aд-8ic8_0r84S >AOAPv>.?꧂HA_l[Aj[} q=XFpc G}ӏ A_cf3նݶ9ʄc j]pa[6ǥel`h*5YzVPG~"528}3^iu3xFdT1T<;e=_:µz <w!E! UUagt `史u" M_*qO:A_l#ۅ#?MD~Jr5QCC7Aq>c:c`mpa;(T,k7D8{87r84S\wC!h7AF0e!x-C S,7xvh79hO/tFphN) phM&8wXݏ}!}.CX?AinF?lpz/qpv9OA>~ B9>Byd} nphK[ ! o\:+?8}ҏx}}=5_NAo6qV (r`*n#꓊%lׄ(zZYǃyqN<,q}9E{\ҪgtHP˭g-ؘ.Y^3:?qfVu*xFjo\(t$&ѡ Q[Tqtjpn(w#i,"~. oEEUrhvh*mXy}]GBA*kOB`5E8tzEqPŚwu}mZ)!pkZmۄCWEqa٦FlCmAﶋ!:~`mY}o7kvٶ C OCZ=>. FlѶM8d}]AsSphP<eG84b;( #v7Oj%` מkX?A>[}Ή{8|sGo_#`$>؞.C)qwC84h%yϣJ{ 8he?4ȷr84bKۘvCo_BP}'w~~ FmpHz;4 4`%wK'Am@S= ̭>~ +xc?8}qu~ o@W/q=xOb{0:4Vd%] ѡ۞ Qk_n^ E, `҃aȁԮ:T}CAKWXRW/]bCw㭦C! QJ{Fl Kţ=; _+PZ }Tjpj{(MPn}=髱t]#F߱}7ЇPn="(7xvhIBp`bA> 845RHe!8_0FmCPlA/!6N }Rލ+P?E[8T}~o~]p??\)|o>Jv29jn~Wo?~.ś.^zߠ',ݤK״쮵,!l{\iէ3np>h\~1¹[ ^zLsL\pEs=d4 =ogz,/\O6vsur^?ij;8-̝.ϗe;ErƳ.hu? e6_m*$Բv}K\/6D lTEJڂ_wϿEꮵ&? u©D?Hp)&D9vEVH.r`¢&9qhcpC(*7ڸt~u)TI҆EQx};/E~EI!ŽREQz)8H1:@(Ξ0aâ{$BkedthXIž҈EQ;8.^_D;hQ>)h3:@2(L72Bwa)Ţ})z3:@V(kRgtbU Ιb=9 #ך8[MĞ2Eb`bIƢ8 < !9SHgtTcQ STgtlcQ\?C ǢsPlg`nugtcQ0OM<$"iRPgtcQyP(3:@ (SPgt,dQTwj&?سTtWG82 MUT(3:@F(l38TIf KdtPͭJǞEGP<{(=%&{FL CSzU@,S= A, 8Y)W)ٳw Vz7( 384O~6C, BY:k DYr7f1ʢ;=gt(eQChdaʢ#q8ct8eQ|q8ctXȎU!< yȎVսs8ct8eQhzjG2 MU Nycpdqsct8eQxdW%O7kRdʪYpdʢ8G1${Fd=Àh姂=+B܈C3dtxeQ8(.ٳw0?=D,Bg="=,B?(43:@̲(<*K, N,՝Ɋ(<ٳwPAɞE!rQgCSr"=.B\fbE!+3:@(dϕ+E!xw0̂EaʞUσrQgtXMV}Oʞ"UjU!̢8[Mʞa`5Y!(V38ء }@ʞ(kRgt0fUOQgt8fQQ(^3:@ (=D2Bn%PIJgtPfQB=2B {{w0?)ܑ@A˞ѡa5YNKAQ˞™Eq–=3Bqˎ!B@(z4? YzD[vDGPf)*D[v, qˎ7KeP Rܲgt:-q7!4BσqˎTzU YzUKD4Bg="=4B:QgtfQ % 2:@P(tƑ(xٳw0?]=59 _TPgtfQSvgthXMV=G=QBED!̞bE34'latp9o2D7Bg♢=7&1{FopsgtgQ/g@Fp~* 8B l[!JXfA΢й|nՁ,S}a΢8Bdt8gQ\. EYlFtVPg`@=:΢B1͞EWG Yz]Ϊ}_d3:@(N)3:4&+4FaJdtgQf1Ϣл1ώB̳(t׀g͎E͎Eq77;s@z] Yz=:E͎EgsfQϢ3rpctgQfQϢ{͎Ts`7;QϢУqpctgQk YzEi Yz?w;Eq^=>BϤFΞQ9p } bEq^j>ahB=D?B)k38t:9{F^:ów0} sSgthQ Zz ]bEGPXgAТ8IΞEw-l#ðޡc3:@ (tWVs`} 7 y - 332:@0( Z֒Od#CB={F^W={F~*(3:@D(8:sdtXKg1Ѣ8էgtBz]С:Tzٌ- 9EϞE!Wz3:@`*t3t DFl5E@{FV>tl^[M1О7l^ :Zr ֋GBf (h0;% yFÉ=MBϣ|Afp7- }t#Nf?ҍl5B} tZ:ȉ;:bEqb=OB1=DOjV1ƃy*(N3:@*:wٌ])3:@(tX(T38ء -=yMʀE- = EK{[w¥=QBW(^3:@ (iԢ'.pĴctPjQiагpĴctPjQuLS1k`3:@(sGS)38TxWV>BahB\ Z+GL;Fި"=Ro> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 118 0 obj << /Length 1491 /Filter /FlateDecode >> stream xo[5OXgӈ Z;m F1͊;>>?v혘*~>G(^4$ˣn<* 4"J R2*$MV;cIV-V6S1B {a} c=fUoO( um Mc3P6SJDg-my1l롁N vJ%GD=b<#.At|~#DEX#}!o(6%HK-үZmI\fOJzݝ 7 S89HC-ئ^_@8&8g%/ac))5$%9apƩف|i }nm)k"&)A1ӵ i{fA GZuUM3vEwSvoS 1 mᠡ)9 DZJ ŭC/ZYW\K!{uH/9 Z@|u!]@|saz'bLf*Ö4cEnmPUшŅ,J'eJArB@Cd/?}96ف,!!m'B,4~2@w#|nQ`qmDsK ƖZ7xCk5#~ BXC8:.] ?ӄH/c > ~R4ڧ(L$8*$f7eל>wt ,F+)qߏM4iIp2bh?viʳ},%4<ᢽ~Xg7O׭ln1O`S^ |55v7N,C;ͯ[)3lIg)o.<AFAds[JFر/}KɃ¢G#OuL9n=*#1T֓c$ᅯ{]ꝃx3Oyޠ:`Ujh J;JRVY6Qp5зAE&ca_g}4MOL a"!( jn)d sj\F%!A/'Á~ayJx) J} :%%- f?a"g}R=h8'4ĥ`='qٜUK=XtsyK(f&K&b=w=\/$aYSC|\X4j,FTdC\J.J]v"vmC[ !rD!T9CSHXU,ԟv_,@:yy{Kf ;!yf2IKS'?%yn8%Ow G?΃ߺ3YƢ}:zUԭcNISӴ@d{⼰L-ˆ}GDnvQfDd-;:@eV89h\YNj_vg! endstream endobj 114 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/hhh4-nhoodByBw.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 121 0 R /BBox [0 0 288 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 122 0 R/F3 123 0 R>> /ExtGState << >>/ColorSpace << /sRGB 124 0 R >>>> /Length 3415 /Filter /FlateDecode >> stream xK€U~gyHHh)Ĉ VD~~jカϡ& pծ]o᳡ |+|ww/cqx/qǼP[ďeo޾Ƿ~7yc??|7vW`rCڼO?x:GO׭W}.>á.?},ϰe_}Le?fr/Hݾ/oe˯qK>{^?kЖVcaȏ{Y዗Z2/ߘ[7Qs77֖2o=|~7鰸,!:R#?Z!˴ORS'lkd47/[ճj5c.ϯ?xlvk~:}h~GLvNΏ|:>>ǣ,Yi[c}}r@OIb_)@^!`۵)TCދ 2)@~ZdCImo!. [ԈOC(:3pJzhj'/Pt|(5NO( qh0q^XFoN羂^l}D,V]GM@U[ ?l3=F*( iFNPeV= eunei)u+#9-pݬža*["騺xsZK5쇴]+q+ӵ>^CQkBHW$`߶.צ C"ojJe`` }x[fw>-X׈6Pv[+|$x[fl'˲ v:+6<<ׁ:LXo4ua c,ۍ +Yl*m&*ϷNH*p4Q֞c.V}N U=cT^PuE-4yMUuҴZ{|cew ZAynZl#)kSishQ(Nmi* iΩ<ρ՞*\ulu43KU*j5}~*_|+s* " IuZ9:Cwߞ(SiUyN*SU6! ?v9Uw.[sU^Ab9Z-wq#ǍP5*UuIU*T$TD^9Bo\;sT j@Ŏlea #'qv{ 3:C*b]f|s]Ʋ:KD3g(Λڵuw1et_Ϋ_u}Ȉ:+˅:n~!y<\;^bLBRUHW04EoD\sb* ׈+jQ*],0oڵA^=yh=6Ifgĩr=,P+Oy;T*ZM)P+}yI?/;XHPQTALTչy'rCE_AR z_Xv}׽ Ug^|z *TAAQVϿN;TJ joȁSU}Su:CN$UP5rBq{ZZ9W!TPQ^KRHy,TTBkf\cmvZAy. *rQ}DoQul3UʳM "~T'<3rWB{ZAy ]wjBU<ꏠ.Szx8Q- UWsog(U߾ؒF{]i铋T\#h/T*Z4"V7%uG}IY}*r"։>udH(3Ukz_ZSm[ ʳTBU?C Uu} ~*FC 7RjCy{TiV)m]G[{3U U6,(gTPU.TP56ۨThKJw%>g}Pu<+jly~EUP1<'fP5<+է7RP9PqRy&o8ҧot_}_I *PUШJZtߠ9G:|5W_Z) 6XjnP`CUv{j3ß̊6Pu \o8y=Ҟs2 ={TCyU{<(!ԩt@O*_S V .6–߰njj(`I"PU8–%fO=NAT\UJST5;BՀ*:T*]O ft*WC }i*5*JTXboQ*O@b.\Y?+8T(*bXq炑B]ET( AH |aV@qژv LksdNTU :oq-PuSB ԍ{*ɡb(&+5vSYVw)p=͖UbȖ^tU(o@G{tF'T51/b|9 K\@Z@ѿ-O.'є@uo^PeM@bN3ĉF^"jhI}b+*`c/&: P\2Gyxo*" 9 ك_]P  j6TE(,n2&PuB ^5@> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 134 0 obj << /Length 1163 /Filter /FlateDecode >> stream xڍVKoFWDCh{0- SMRTHʩSRTȂ<ݝ؋8JRnk?<g-$ԫvȪDiMi axoůs[Δ^˷J[OQ[=(׹([_|[40 Z PC7Hax>5dƏR*q ,sm>H9Ot5R॰oޥsAs0ݖ׫r}(dEW$d ='s:ÙRɊS626Levڀк q&-ȇwy>o[Fx׌v7D8ݠD^0vu1nvKPqk@9.;R Wr {Q4!twS-ϴ6VeSw枩878I%}쎯sZ[tkBHay9v*( 7mwPذ4' EFUTdCO_b endstream endobj 115 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/hhh4-plot-flu-ByBw.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 137 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 138 0 R>> /ExtGState << >>/ColorSpace << /sRGB 139 0 R >>>> /Length 22895 /Filter /FlateDecode >> stream xսM̒_Kkb2XXx^ ȳw8$3U|> V5̌'_m1埲}Cj'm?οw_h|]7Pd_~Q,d??+| 2^O/UOC?>qr\0<~g{2~y)PǍ7ng]xxޤQ'ԫv|^~ݾgyK?[9m'﷟ȡWL,Ewޯl퍼#ԠycAd|.o?q<_D9M-x"E.>" Y*ԊO/|?FA7'}1]y}^1QMVLcļqT#0s} OX㉩ ri9Ɗn6644/*􎻏-C!B׻ohK.b)1Py'CSj[P Yvh~Ƌ_^E[u|S@cfd헱wHۦǀIާ<䘾0fO}['W(sYV=.<ĤNۢ~91cxXc C#ƍa0є(j*%[1+E*(mr+>;tlÿ_s)~ 9@䅄1㭆Y&la B{2C+:{orD=W_v=:Wy,1^&Gl!]b6d/[FY6zh|]ur#yg^C;< F1V8ƥi1t1 1%x|9Dp @ꋛ21N+;%(~+U ck)cby:09|2X0碩qtxQ4m172{qajƱsVFK {אe/a*VŲCQ84|#c=kf_ qCt35DsLj}j}j4X7wcWMk"151b_BPDE.b`!Vup^{, ӞStюC= [Yo|~DW9mԝI H00`Pl?zut m Krl!R4j`{ߧMN'ymx ;Éml@EV+ {~q? NyIP( cX- ߎL@iodLЮ€D$VyEq7rfC3?3 tЎ.},dg0Wm@*$?4qq㠀wo>[}Û ogZ=n8|L#B׻C( 9c)_6|rNlll=B8%u= -bߍM  ͣ$H\JOAdzS؛Δ^Lmg/7彩]*̮_/)،@a?6͢xc5Ny|0xHb|s\9ǿ7ˎ!"g2u|^s']'}&>%ߟ6Yovf6K.ߌfgCh~>?31yit4k2?ʒ]d80ZLa3j+Pu h\5#W\v;p5څCr֚&#ۘǎ֛%de+c:_90S"/Ttq'ch+ﷲ5Kn؎yG yWT5nexḿFyBV-ri}2Nܭ\m#AV<ڜr>4Xh=F['3V_nj!Y/6j7G8m3,/ fډ3pG|)Z.[r.:'b}O0`oe4DPnr-IY'n|,ɘ[d&v _Zd" B#C)<A0B z|ۍ}ˍ kS`n[z곜8UU4|yёi)S0G9QtI‘9per%Rqg@ 8 5k 58>@{ad8["Ȅ SLDx?_.>wfZ*dvO Փs~yY~Gl0L՝qZdjE/"ʓ=w#c2rEÊ6oE!5qt u.2M~-N5A}y/{ޫ^8zKz.)'Y7A-`=bº/1; !I 3Z1CsQuuߎ`]B1asHrbFA‹&T Wj,x۵ BJuw4\Nzo'Y E*95x? wd[-'cN SB Ub]@3D=xfp=$Aym<>q`¬Ip6/29[Ey`-y?8 jgI+ %ԼɌFq s`F!r%k X.5DXx %',F(5(s?*-J֕,[e@T6HZbLH,JpYXd [.?w<55~*8WrM5G|f:rSK4Jl.5 gY4[p' iB16~?/]Es*8H}xxx;Q8ǐ'! @LarMT}NILh ^_ȞXOk;ͪjbU^dlHWes4Qi-|Ma׊wx/oϯ;55&ۋUJ'le^hΰ x9Kلh257 k'ĝ 3%Lk?`*8u 3eRFϖ~`='#Fb8#AFV:u͜L?թ_WWnNO*0,)h 8VNQ'5<2x0#, ފYrROe:U+8b0Zkq+ OBbRk>@#_4 [Q/Ta M5 Xf+d/ Y3L.RlGD(̲oa1em?7i-r掴))Ps VpRaN᮴َf SJQ 2ьq0QmG#V*DQ L̕[~ N8>Ε ~p0{]Ĺ[R5Mx f0 eq9ŴA`$j3_eAg`\5,*JII"Br*r#0dA2[mV5(%yR7zBgq& X+ndAmVI oRL20TӚZWJ+R _J9|R JERARy…A K_&}OXD%2vn&=,XBj;})thgxB`OGs+|8Å;#YrGu?A[U]/? 46 )kel &(ꇞZsCےEq0U%3XhЪ'5$ƪ˜$0YPM)Q@b]n2m'"N3>!@tr澤mI|ϐ2@խ%]LͿXƈW!Li= w 2AgI>o"3AK0LLNF(K5ˁa[ML>lZfYpm OMR(SOP;2;_sTrNg@i(A+pĉ3L n.{>_39B渐=z2HGI>Of]S`I+`%aKr)3/Nt~XAA4"(Tc;/zE2s[T&#)CgH3K2 qP&d^*wIܪz$V=REjӊj1 FCWYN,%]K&&K4ԚrmV2d"N>&Jlqnb@p xZ4z?ߟO'בA7z'<;r³ dhPw! u$dt!!IJ=Brh zq,BAK eYeaȋ=zgp7gFL~pƬr~Z ی ž,x(,YAXKB.8,0-'&x-+26 <#@U"V\,Y'l,:P+@ 4-7="{~8~)I P2? UVhv~rFyvƊ,u&%_F%3~@桬QD 9Ye&z r dA:=CB=d b:O@=C 8X@͸9kĒ M"N ȻpsPo|E8aXwQ:;B 4oҹDB]GRH#k$wHH4/hl#})w:#J h zo8N703mxY֓Ţ9sbT'0yoI+eqEJ*D)9I@O|F98P80dw9p6ii_TN8ZV#+A#3VkFkxϘfXk~Q 1A35ys(O __Rϻ{k.~Y JYɟDq!?k`c(gFSO!˻)e$;OŤ)3?bEy=Ͽ >kߧ੘_#TRZKM})ci|1cM/,I+j( کŠ=Kq\_ߥvOQ޿8Nne;Z=IָLUbpn1›kcUrC_xS84.%kI\2K*}ɥ/ɜK6ߗ ħ}IK`+2a#%/9h<3ok2Q?0V%jlt06ZX}B'JE KVbHpx [vқjxIE&k@2KLI5~ Mp29N"1#ćݪ&yu>\}Yt'cKȬH%N*w nBJ>CR>d d=mHڒRdFh~(YXLu7 +xCHod0$RB,*jO)aB^RO)J0f)Mڭ_fgqQ%w.G,~ "z =`TBninVD+l:˻Ta 6N{s9.3|X , Ptu^5!f+F$Q:1jHKQ,ZF4*ħhfaoyv{\z >m̹RxQmYEZl2bq_78:=ЅvYkR~p =R*~kҸ dzPdͤbuPRcRkfx)g9H+K U ;g܌ݔyGxG2{,x`yu_ZUYE-EZwFtM+ Y4  ]$jd:]baF@&C7KmD&gϡB|$^$p+ ѯT"Tz+ S7#C,~ 3u{ *9}mNv#@X^2fg?/MsEt#(2^ϩw=xOݲ%-쏘bd\=B/H'=e+guTnm]-In1 Ho/zެFMԘ!LD,1&+Ͽ:܍؃dU,sQ!k;TV_K_f_ B.^zii75ihQ{r_:^YI{$4EJaOą&>QHy"9; 4Ԭ*Hlin5-͜|k\2(IM a%5~ڰJ GQQ9mc }n^|Q i gYhm~㨤5/x7\dҷ1KP@3tݻ#ϕ9 -V(&öQiIV)2WXk88/2[ًGÑ5ƾ0IM3^"ZgƆj?3-jkp g}RgfYWM5hp_xǟ?u^|uYg|s߼76@_YyGŸ@wa|O뾾տx_?To AQ (GzFvkqr7>LIy8nU@E}\H=E~%0U mc S$֤t23(mA v9+!Y^;9.Yؐ^@ldJЉoI&q(Rj|mZ?אdol\r>ac̴T{UW_.w]]hݥv,$ZCfZ$X֤.٬w%oڟj\͑ӯOy?^rV.Kd,-/?\9{cƵ{/Q"_8K7`eFxK{#T\CxX?L2ȅb!%Lv&\e9+u땭R Ɂy<}n؅Kq.\sz[DžX}UR:޷͝|=k"tI@Te6 Piv?lW)U"2,Lx'Ris[3V"Kʿ"+F:nv' q0*pbVFl5YpMΊxY!"Wzy$Z:rR&FB+fJ٠j3&)\Vf)xp[$<#,Ɣ?=d~ֵr2xtD;2Wʰy[*_罁<GVIOD*"KGt0LOٷQ,6̾MٷymFOdȞ,ٓ){'rffN(KS܏dncĠ|JJAcк]{}0)?WKX]^j=A"2JD1{zTk x+~;dϨTn |MI, 0;s\{"|$}'',0BߠHZݾ՚:':[^UV#L 座dO!Tr!%dC.C.d,n@Dh)(@O/)4X%ߣq,B5k$Zez%umdQ Z0: @O}ڵH 9] K6* ʡj8I,jGPOn #%ltef)~*(6ӝdHW׉]E ;)q#V>̵\̇і0fZʣ4'+پdD_BNԳEbի{QBl+^.kZKMYW{gSpGdRUuRMc..;x?]MX|R pN%n@bU/ Dϙz?Hq'u߼dGlO$~6C)^,ܬ\B#OYu/Rl+f ![>PKE XT־k4v  }/D+R|q._8}z}J gp5-E( ?ǪNʪʴ+΋"Fj g {ur-'iw%!6tZLVS G%,i /4ƒxJRX+Zo%<\D6.N$b;$\f+-s9CY%쒞-//~i ]*{ʘמ _] ݺlKvlj|5t4; aw`]Ǜ;Bzv;~Wda@4[[?ְ˸Rf= -=. *pu0 3b-,mmayYޙ{xݼ7^{_I\5ߐmiض6t7Y=Sv(L}o_??uP ~+(+=8@'a2r(vZxe1d3_MNWkWjE,ycHJL DjE-5I1&YJ6O Zvdc5V ҅fZ|Bc9$l}"L'h%z'd+Fi;s{O{#T S`~sE4GUDz*$OC=a$ aGQ/7j;lg"-@deOjKRŹї:RH_*9儍,{JAAQ7HxnֵJf)I˄tR>4>w|D> UyN[-|0R) KZ}N/Yys>?><5Li=fҏq唾r-μ+K~"= <:chm )ml}*kQ[X,-.| "õ-6-;ۮzۙLQg#$[+Aꔥ'-|֚@5ezNJo/PF,v'"w9Nr@%bz02Y,oxK[Jޒr֓e6wAlgYjkM($Rd%ޕ֮s^=О{wh]ЦѪ+uF:4zy|?SO_^-í e;[z9{1kd;ʛ>?Oeu)ev.}*մ~鄟KZ[VؾUoڞ[q/}+?h7sցzp.+~ e@HwJղד9񻲜K9XL1>s92OkH%#Lstjע4Qk~STY$l^d"UN4'#[xo\.TK)+y* ZYfS$+yCV@!DXe6H^Xbja'hW'oQ!lƸc诬P|_hI'-P?G:J6$Hg[_I V9-{,U !0av.8nN6|Ͳlj{)MG7мxsơ>,Ɂh8F#IS?&ViݸWp!7~R%^ٺG8V6ƙP,&WȘWg$oJ|h=`.|O8&MF)vbuV‰d ԳO" :s*T5JFn)fl/JJaz=å&xc_FѳY4y'ĞJ|S{vݷ{]wGg*BIM\&Ë{i̍7\[.q7cq-ł9>IN90d~s c iI]]r*q-ʮ|MVɋXpV V JH6KƔG.\㐅el^ޘB&zXQQ͞,l]U5v25lt(_b//G"WZgb9B%w҆LᶚzI Ex.bڌ6Jٌ9%h`>w&8_eO ='\!dw %тoB˴f"JfߌnG|HLy$D,k%kq|rh<|+b>`${~̝\˒q&E#䪈F9-;,ó"K2Z ZSO! 3= oD4p,FƯeuױ[zt!q*gxY9I5zDHaؚ7X\v!82>G~,raÞ2DLwu~WuDrL=f7&TcA"69R]~ӥVSQ/1f r\d.'y k^ٰI4옂 KG/{FUe;d,Bl")׀LqIQFXp63?:w3ř~X"=;o#K Zn1@[h1?ŸW_Ky|\ KR"_jK|/ez?iG˖42)I.]2IRCτ3M4U<%%*ᗀ1]b`T .]qo,*P![9{u~9̦F76B]\`}?xPn̡yiE^Ң.mfyumro{n>Opt_sFϢV7'A/|x^#5#,'YWP^ISY.c TnU_޺呋Lz,ϊ<1ό7W>G~/{ы| Nr!ǁ'IU'YUŒ)xlڱSXYWه}ߧ|)ݰI8S]On[KLt)PR4fIV"6(a)SIRK$| /%O%ė4{ϳy3ϊ56W {̕=fktaNL3 ,D^,O')S;m,s7!i^y ϳyv=Ǿ=.gSi}oNηj,!+:KL/zDXY6 ]~YnM=EZRyQa&B!DoNw>xHȎ*azOջ%bړg y\:WzDLSwEҮQkݠ$=ҡ,= sAizCyzGz2('5I]TE=g[z})GW*J0 ϝw;`|^ST'xV7ZD%9" b鿔h~{lE)M|?*ׯ@3j;"kⵖė<8GBy\С=ѥI)I82o;f@ƱGVřүzYt>{ЯE>7KFu^ $8(MTq:ZBM GPb My9 s =s?s9?*d*Zy,^񝰲ĐzTHjP5ϡw:iau(=,\ ox?CcFR-z/.Z1qk(19e7]E޹RԷ3 q-EIq.GVgjRs IXXLn,d_F/y%P>#C)*Ls>?~0_eQA魅 ֋ibZ]p0%N3,隬-o$l0(r=B h AT/uck ٫f`W 'vk)H(hI;ӰMx}bw:@?H&؃E,V2簽O$l ˻qԋ!;3M/2qC5߱)gC!7ͅ-2aH1xD4dF9ܖ䋥%Ӛ:5hK.E]CKS(K)P*e"2zA=@֕*^E%PXhdd]N 88$Џ[Q//R(13%K}:Q  >>DŽ/$瞞烃WJLO bڔVƹ#XVM+e;K z?+upVy_G窤XJxA8M.YON`{b0] &.h;y>$&C>CO;S(ʇ[ aV}IXWB,o 5qڨV4مJ[RSȤ 30/ ao%IH+#Zxf^.7ss|YX`Q -VWdEZ ?̐$.\:̶.B^rs\@q V/-;0Y[cᰒx{V upnݾ}|qnJ<:vlV7@j{N,dPHfPƔCR8ˠg4Ѥz,sΣkJ `=Kd-U\M vZ? 2 BW'/4 1|UF3M8Fes%ǻQUr_QD:F|Ur_'"Q(Lc. fq\5}E$<x*\ 1H(ӘW@36_Q.EԸ_Q1WQ쪌&S:FI^|&S:F^m(/(U\5&S:F)&+݌2J4MܮZ5n'\(m>ir4,.6yUFWMU){Mv7J]9v_j:J7]Q&xdJ(&-%Q쪌 S){M~7Jr/WMt55f*&rdJ(^[MnƎ2JjrWMtRh!*IۤUU]59mWMthrEjhhQ|E)}12JjrگL% X?(USj2c&(s3v\QUSj2cxo](_/ӹ^QUSj2cto]̴U%_59&S:Fɫ&~hɍbWe2ir4]j: )W?cvUFi&Imym*&ɔQd6*FwL;y{u*&Jej<;zUFٯU)^~򞓛㪌U)Dz?f*&ron*L_<Wek&./_l͍bWek&-O'ZrUejǧ(&MW[<>&n*L_<6y_m{p<3#2y|m}㻣Y('OW[=>_e<=>w'﫯[E"UeIT/YwUF<>y|} ~*L_<>y_}x?ŔQ2WO'{齺2WO|"xz2y|}}$cG9('OW_=>ObTUe8ϧw̷8ӝɂwfnHFir\F07e$#wW9IK2䊹<ʑ&PP)6cnHF8ʑ&'P9Α& |)܎&GP.Ymr2!#W9RJ>fnHH4RZg-_}BSxFjU49!L^H_{JDc*#]of~W-nGJHsU䪹#9*GD cZ&w |)ٖʑ&'Qj/Z& |I"(HU49r0mnHv449]rnwU49^|97uON\|\:7eF:rɑ[t&gRk&Α& |I~=r2ky|r;#W9RZg-_Jg)O#M/ZYWRߜU)N%^7i'zH*GM\}=7U4{i>}=;i>}L bi{W9}LV9Osʑf3gϴzzt;RF<{y>}@2/ᴻjyy3o$C|麫i>}7IM1jw#g<{ב$:c*G<{y>MR辻ʑf3g&Sў w#g<{M26}qW9}̳o2vMrW9},oHUVg2{&s&s*G2{e>}> ;ܙsW9},YVL%r,Yfﳬާ3Gi>},ɽߙavW9},YV|ʑfgϲzKO}:r,YfﳬާF@pW9}YnP Tggzge oP*G:{u> %c<ʑfg׺tiʑfg:ҮW9}Ys{Rŏfq26ϯi7/_?㆏~ endstream endobj 141 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 129 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/hhh4-plot-measles.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 142 0 R /BBox [0 0 720 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 143 0 R/F3 144 0 R>> /ExtGState << >>/ColorSpace << /sRGB 145 0 R >>>> /Length 2299 /Filter /FlateDecode >> stream x͎6F)a_[I fdqڀ. ODVHv{u%$]ng?|~fm۷?xfibis9#lwof=o fWWۏnpݽ}wSdøLٟovn.j5pb][0[oooSx̶xo[~Gh'#n~u۷nv{Kؼ쎸o^f}P,p7C;LG@cչUYRwݚ:j R=~^?W˭7xrўYTzܵrMJ sNڃ[crM<8^)P8^)߯ˆrsNڃrn׍w KJ$Oۧh_tzcuxcӫ.h{0=pNXtz:BcK2(a*j\m͑л=$dqq3JʮP} Na:jKw9LgW큱-O X=t䃄 r3rήW6(a{\%LeWa>q3rήCG~Kӫ jFQӫ׵L1(a*j\T&3rή竔vj]o`K8/[t[n=Wb{[+9v?]w"64?< _x\ x\ x\ x+}Z _(8heP|bo(O2!{iw|IEqM2qZv3]uW>.B1Ѵ̾heP$j>7keP|:3o8B/D_('Xzƾ :x0q +k(>}gz$Bx?5d>4:K/(}gz-B>ѻ Ň@a7Vu|/&}Cyʾɰo(~lդsc;7u5}Kol 'c_xuo_<.)o_~jo}:Z/=x^Ai?ic'*:QDv/6sx+@އ/;\n8x,Aۯ~_M2&vo]Xd[YrΧ TX endstream endobj 147 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 162 0 obj << /Length 3791 /Filter /FlateDecode >> stream xKs_*O "3LNNgڙlĵkY(f=@޶9R]ԋ^닯w QWm݊r-l+zR,wwy%\v v9F.?⛷aXֵ[/'\l]pE]J@ᆷ8[uO#|z~_]|`JO`RYxie' <fzZL`=bn[8_/jRQZUYTtwaL'J|)R/lOP^&0geX3" _V ŕD:hOxib5.HIo-aBE\rY=S)B YGo70G\fG<0l5s% =1ᗩW+uxį E|}Sŕԕm-4,,73WFDJÎĥ0 YSdjƵ9.'<*M 8&۲td9նlzqp w=Qn9W {:{[ ^l!HŸu$27mp*Iw>uVn}߳t(YHEqbOrNfP[& 4;Wy@GZ:.Z:j9WYHPEuy`=TFrkF}kUbZxZ)3M ,W?$TXo(vLLjCSmsE/Fzk&my<amK{ZYk%rS T&R‘1 iw#?f8)q% 5s1'aM>L2vhJ׺bFR,}gj)>O#uK$^7{c~U zW E{Cdμ`1#iv܂E+r0.[+<2z W¼Gf0'CpMsďOhuØ?w/i4 d#0*^HpFw5ꀊ.N~>CA|ɶ!4~ f%\N) I^|S25qwIm!Gr8(S'0pÎ L =YFX0q]'ڟd@(L=z6) OxB ̼.ԴzbaMzа)LC'Z-t\ H+ #M 9>Qqy ժ'2WF*D ^ ͥl˾'`t٢Atd8a?q=PfYJTGPhL3Q< uOD]G;䩪w^'[6iI$qS bt*{e4QkX(;K$ag]?sk}sVlhkG !u>P> Yq8I@ӂk˥ D} iZzP晤{+7ժ ]|w}^’|ڪxjz հ']( ,~\`>~506HiMi40>\hŐUe\y4\ 97ћo:n={4YC`V)+!yȀw /(Y`] Pp!Жvkgĭy5_[y'͌OχJ{$OeiNH$ixO{Kt6@)b߬"6mp:bAqQAg,#. Rm_Z8-3?$yxlЭݪ_9*NV./lYބO* 3}I΅z|mFXIIXH=P\giYmlw2B6 n;>f6~mUVJ?jzʥ񽚱r},K $Ge<2%)E{j&R!ts5FuS8@qwH:> _!kE\CRQY_e J uN VAiCbliBK.f`au+5J_ P"<7Ϩc?!|Kٔmڔn~2|&׎56ɹX Z{|Gװ.Zױg1<LbȼP3$ 68kkVYA\+pjyMsi,"LJYc__wQJЩpa ~b%?dI[X&;@C|N a t,m2VxxS,h$U0}Yf6E3Fo>D,]l:HJ9ȕQמtV=Ѡg^Ҡ|]s w\E/zFjmbt 10[@@*R4}ǹKAe= 7&nfAj]U g"As0/YBaLp\R,gHI<}eᨽ1Gej\3im`Ore92;\ \4\&"L[=U忻h|A{~ eF0~Jq_F϶ɚ'ir ϨIpL,8Oю(3$Ht_ͰrRv؋jjrCU֬|R[Cs7\XTOD[SKrjOe}"aeƩZlc "7=05F8pHzȨ~; Kҷ= M Mn5{P| KgӜ j9qPŴC1TjϲX3M7ƘGdϪ^[Y2nlV=mt$|4ZӒԜ$ Ȃ!D18SDV։Sz( N/Fg mJn曚%$ އ7b4FoT)jQ$3e&8%[F{JRȏN=A1 N~K24ėU+sĢ7݄W{)Ғ3SA^7ybQ~e"m57<>ܻ-`g$Ar0BDu~҃罹!^hAUzNzI'w79Ѿ;ʠ=.m*lKF#3 / endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 818 /Length 2532 /Filter /FlateDecode >> stream xZYo9~ׯc@,fb`@nԶ{R{VUSC+bfdwXU$F /I'HFFa"E4~B[3Шy/J0P)Ѡ1*VXBᄵA/7.E$Lđc^'a x3Ee-%gP @[5hbf#ayv UA8tOZ^/(tmiE<[5$E,:`fO)0GRRBH  ɋD^2@c!OLL 7`M]$4 kB̀h?O;;5Qi z@Mpϻŧo%|L4 P,pW"V3 Q]29oa1 0`w&ýa53Vrsaras<ͣ<ͣ<ʺzxQO v: xYOxRVFIkHzޓ.AY#m>׹0J&vx#5%$ (V,X,:oZ=4dO22g#}4e&7V[R;TiՕ r[VlOwN)6V> ntQΛK@q>({mWҸ`e9oZmS$8 K@'3< xuJmΫْgVHWv I'-;p1I;?*(D)JXg2( %.#bcyNKxk G㵿Uub͵_@F́lƛ̛dcېےrjk<+m_wѾ-=:-zͲXhQMy>"x#J a>.|Z94 y^@*~ DsyBuu3y./U`:C3;2ꇹWͰ3Qc9}WQUp"++6~Mm*Na sHr.3N-ͧ:HKƤ/HK͗֌,){2ٔ9Kj>O>Kw٬'3D5g0};u5J0-/L<.^O|XMp+sj*5k_Ҡ7 /gUeռzXOYg^4mF8z\y?ɳɬ^}>OO+m1'H}T矋Q fuq6-WE9wU1>]`KBt)CHB11Ŭ0N).)/_'gt>nyWgzW KovQm5^*Ylj{gw@x 3%& I[3Gi ji3?tad q@HPg3VOLH7~~^v4ohkTHkmtju_If}s#iuWvFј>h~y_Ç'8#{4ݤwvS>}.0" >oW^GVKk J8e=.zh}w |lD8N (eZB Zrtg*88g(1f۷ot/s7ML ghlae҃7`>z;h=-n^-^"N;-2H"N2ɶjpt)AӄD[DVxAhM{r2:#%K@%$]Kڜ#A1kk4H}^#n(W@YN@d!l+3aw`wq૒Va(I{HK> stream xZI۸WȮXפ*dCj*ChXgxΟ{ R[-ەCXV3>+tLp9fk&T=_]މnp^,[[6;/iKx0|s}siw0aóuMn; h09rjpoi/8N1|;ͱGi0LnҚmE&E_a\ nFbAjW!xFz]84bI鬰O95Iwo(hYSkDy~$MB 2EB3J[=?bbEPQ>De]ؓףY^cd愦,hUOH.D~)1npOQׄ:u Q񖶎n ŧHT~Aa2]!jf !T+2&vE;RO9/x*b/x/>C6=qy9&}%>Qz3آ(W]S— ƜdOD'64G%u<[7 ,'6pXkTDѹS.L ZHL nJY0$A[8w7ً*5&ȤDa 1Pi udp0ǘ=DE1EDOޝvXGVBQn vniH\a`|+dI26kc Y.' w1#I~x\>FAD0nŐP믒MD d_I93 =]N sC+  [q9w=%rNLˌy ZSPg sA2KD`W%n4u_WuQ1{ a}}, p_ODuQ=k"A*ċQù X/ESEj $.h8, 5%9UhMQ Kı4_sTTVǔ*Jh(<$M`,_8oIK lcA\E(zHHf@i 6 ILlj~gȝk9ZN7HUnWUק%1ͅV9΋f (Ca x rN:eh2m?'EAzS̛%  TtRMy 5m%nҢ%(99uK5N(OiH>ֵ.P@LGYFL+( ?Ap)G|vRFJ^yF?Pxf6 6c e 1FxWe qyL9gü։.hϩAELCIgNE"coe?;w8,bgR:}cu~ c@M׳X,xu~ljbEô9f*=b8$k!8^DvT Sy^'!NC!̊Yu7gu c#@p0R ΧJU@ 1 %j%DmuDH]pZBW?R{2!5Vঝvc$e 0/ &-$2*ZGCt#|8E᱗6Sm_e B-"*& i@c"{55lYa҆ \'OFI-CϺ<"S!6YK7|ܣyˮܗ}~ȥhZi޷X&뎱0$=4 'Sk}ĸ鼉m}`xFv@c\pzPEo?VQGRLRbU0lU^AWmNE?̠ ɿK/82|ܶ +ރCHmO}ޫ]_ǭ#W>+=b2p9U8],X/knjK=eLZy5V$LM ޗAF3TBwCV4@Х0L)u4G>S22kc׎U endstream endobj 196 0 obj << /Length 2771 /Filter /FlateDecode >> stream xڭZ[~J `Hz>$A(\I\ҮA{nsE:Ɠ$~7Ei69og/=t6)2z5Q* ]LD*&ɏogT'LMx9-w_[hʨ4|wLK^/T9hOΠkj6O,~ͽ+)s"j ?L(Xгs1VPڙiI+ׂZDy$CP'=sѝc fCxQ׃<Һv]>ǍJe7#݈[ҋud*ORY VpϰA;?jHm o*6!|7/U>ֲNQkq\FNǡl¦vAu\F<ʆ6 T_XH{u x-/;&,S^eX |P&H>/0 a`]gネvF5υx&`;'[l}VwIEK^kI8duVFb:VbQH} M@k]0Ɗ:ЛA|J Z[u0r# 'bٍs-._(䴀ґ?o󫧸@y+1_]U1޸TTXFilxD7e!l!%*t!SWp/!;IJE&qEJPu=˱Uj֡V*ʍ㡽CBzDPbsrӢĆgZPTjFdHyT?1I Nsh)f#$˘d+)8TWxLX٭y6 2iH% ,y8hU\NQGVj[MGl|LI|vbjR)7;A 66%\܀(HI!ʆ{DƮbzcc]#krsOi" c]ʘ>Y%.\~.x:Gʋ 2E)܈QZ8RIҌ(hxŵK(Yy+B˧2(Ulr<5XUesb1&20k U=Q2FĔge܆9\QFk4}OX!h-X2U.b5xo_!sstU'9I삼~A1rFy?AS `y8k=}Ɍ-p? \Fr9Z&"H<1 X|PrNf.[/cRRy%u[7 N~zWQD6 ?-5/~Վor5,jFEGR]&r-1u➪t^L߬(= ~݉H8a`OHzCs($s ?o $*"hvqwwCTקOwƼHZ3pHgL&u}R< U *ۖBi0MZɜLmq,&u(J#~ ! 全_Qʬ0YqVcx?eJ(N_V^"SN@ fcīXM]seEKeZ. Za^/ IX0^3q_4[v/ cWn4Ql >G~c=}aoF$FYHX4랓ypzP6p{" (ijF+T<8>fȕr9G!vukT?7rJخ9+."jk%o_9\qɃ荑a'H^+%4ݑہ]HW<¢2hfo:J[ 0pن*Z;et#K)f̓[ZFI;k|yՆ-w@oae3 ia3>t Tr7oyiS2\tu҅3 Q-[֏%AThk$*fSG)Er=ü!ZI=v6> stream xێ6}"/3-1sGmR'@(;I*n>lj=7BP5j{k{/Un˳gg^@x .˕'DRz br齛}s?|~y#.."bx`A"z#cQzuEȂ0>axI`2_Pq`ʀ.׭9-aY+.f[b:5$e(tEG%4 >NGbO߄azjyE)MY=mxA &"B^?AFtAԚbqO!HZo F ;b4TWōRB {2ԇQ<G) j|m/ ED, CBhWZi+Y3($J?c3G{.T/Ɣi * ECi~x|QQ, 5BCF]VM/dV1+w@I?KB#4ڊ{=Qlns0j,V) GYoH6u=d*kKצub@ANT *yF/E(iT1W4qp}pCm++C E*FoDڍm1D Rd>ܖb&s7 .Ncĸ"?lf_9ѻ}.% 8Qz̿L;L;I,Jz3d<ꗰƟ0wSd޷ Ħ:X f7f8c/䒤3pY1M/8(Oܸ`zJadv1pTѱȹxG ,MF$έ>>x7Ziw __EE g-xϽq|Hs\@G)A8 ~o1=ۢ[꠬n4p4}[(?ˀ0)iI5+^( uLt˝Hb RdٿpG endstream endobj 208 0 obj << /Length 2309 /Filter /FlateDecode >> stream xYKϯP9*x3ʦv;99p%jD[!=h/QJIMQ$F_79|v7ox+f3ϽݮfBI7+fBrE=ٻUYyr\>˕ ;˅bFR y@vPHTžQٕO}J<8a ,t(no P =$Ւa |*S]?8&_Һh=Np5d4 6##k$_uOi" *41O !Dy!=!6ʷ0$ߣEʇȰ:=uqC"]'h B 'uclcdTռ*y&!5Z/>x&TE)kZPE$BuqL/")iflt҂{&> ?iGv%P–BLӠ ztV_P%;"61aQndsM%!* ʪ46eNh[B eXL$D"E}s$)4M-e$bǸ É:L'造ȉG* 3M)_'ͅuGVw6>Lldg1[ʵ۪ 8fÔƹFYܴ]IUg=b8sF:*ұ")pݹpY1vHrB̞ [5<İ0)SȓR1㦧Әw1)\.=}^a&pL ma/79Av?yx|:IyOH*IbNrŭ{Ss{$g.$To׀nc p1e]<`phl鰆Q,gt@wTUI\gA# K&Děi4.i9e3;T-r X[elXA=ΐ^iA ֶ=Dut G1ΚTOi XvQanwԡ^gXs bO[P[Px𴶐4RCuXXEv'H-rPJ4ge6EjQ8,m dSyl~_R/*IT7DߝM9uujT mUQJg"wpwE f]b;~*vRn:~z41?lUƐ~*M@8:/ݷr^{=N`'V Z}P?Yo&_jhS02|)kt$NoCco.ːCmϾB7meýuE+gpaY<"v('O1}F+7)&ib%sqwaY7#A9Ǹ#]?>N 1/cyjS|b qbP9s'A?)G endstream endobj 221 0 obj << /Length 2138 /Filter /FlateDecode >> stream xڭXY~_A}h^6{%qfK䄔^?!Q U_Mi顣ᄌr˷ƙPeMtS(o}TTG>{IJuҨ2+*Sfz3cW LƫҖM[sۜW4ֱn/:5ǚG]zƠ/hUm6 .zޘI\Y&<q  =Oq\rzY3„Z\}x'3qDUD*mZ}u1-TArw)l;f(C󉊳IBDX[υv0WCO%-A{OeG_uej#ȟT&ɬ){יrCઆa:,v€TòًIy}qGye \asP(_-䛟6YM,d<sFb=02Ϯ%013ۙ8g˹_2p֐$x3ZQ=$äp+ʫݹE0Bz&`ntLH{ f al$(_\7=ʋE0kfXѕ)1x@i0U+0cD4TaCe}@_vxeqcTW|i/Or$1Ԍ%Wϲ=r9jM(fy@{̴׉aߚq ! W2AM)<8{C+)JǾyu3RzNd P.$K3ϲTnzj=Tu{dHYXѐx"y?x|X#.Vm<61z3PGЫdX ([Kkhm^`)kXD$7Rre?+0 _ 4]@quK].Tw5R0ZL.?CUhI.XvZ//zHCY,`wQ֎iml6mz.ccL0NftO˰.ea0c0[(2$ÜwcFRxW]=u*|9lt 1 t&RV t^\|,ÐNtJQUآaA^;hNZ]^>v,x௓|w&[q`N|&CA,@u?܋:NfLl-VbX Nc1a7E˟x]*A]aEb fi}2$88RF 8Ն|S-[d h r%1W endstream endobj 212 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/hhh4-plot-fit_men.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 223 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 224 0 R/F2 225 0 R/F3 226 0 R>> /ExtGState << >>/ColorSpace << /sRGB 227 0 R >>>> /Length 7271 /Filter /FlateDecode >> stream xMqWKi7ork#  E,@$S;dObQ{˟Oݯ/s۶~?K߿G῔_~||ѷ_˗&y>}¸~?]o}l_+^]^xXUK?>؟_pٟ;1ka/kϺq/[>zI(s{s4jߟx}x{vΣE\q؋GUq~9\z=X-3b*Uwi6|Q>>U$ϭ\{}*u8\R/>Űض"'Omh<ԶCOO~_nz!5B<~:[R kK87Om۳H}Ye ֵX!,VegZ>sEI=:uv㯌CrH#̝VWFNS{4rܘdz֪}|zTV4;*ڭX&7sVp8^Sw+wUNb=p-]J+:hRc)ev^CRyqZڐRznriq];A_7R%{|ozZJe9Mzz[yYz4H(K\-R>}[|6d4rHmv2j~74{ł]En-.No Q[(w^Ͳ߰fY?ϹYE$oha3{~F/Poie'X[.cYyD=-lZo9 D-#>vU_mEo]Qno)aaD|ex배6/--YXea~GG=4" xWe xZo6UiaYon[լ|XUv>56=2Zo]揪>>oj@]mZrx}z`3R_oonƏDoΏU&x6⽛yrxWq?_̗z+-oK4ޣj[oiUv>,޲ Ʌ42Lq2H tX"T c ImXBWh6>8oS}ުoLkZom fSNn+[af04 }@u5wղ|`iuku`L~1>2hU??b4޺5ޢU@j@-esUƛQkE&'f@]v k>qLxWG [dc&~oׯB[[[rX64~4~7djn>Z{5zc~nMW7iUwia*|'vFVd c2gaP= vMQ_ݯ-oO_eޮdZ֞~ݺٺu5v|_ 5w~cm|Ze<~ ퟅ9?ݯ?t61 V7ӯY<-k -kǶܯ &-+}.8e5?m_kw={qf0vk{_3}Z|5ݯpzx;ܯ5oo|~ Oܯxuk˖-ïkuZuY:Ju[/{1kmd~ Po~MfWkzk~a>|؛_s}~Mݯ5?s=w5M~m"_Wܯ~[?~~~Y5ʜL;>^>ݯm>^5?o ?v~dk&[_LZvְ~m/5~~m#o;ïͲݯ<⳻_狾ïɴפ[wa~MCNV0I75&?5&=פynlk &â<׺csv~mB_(ï5A)_ۡQ¯ZG_sVysT5ok gG fnTkG kל/~hצö~m`-՟P~M·Z5:ܶkt5Mko_cWkwV1~x5c5_~~_gY˟_L`];!uX׽_  s ?SU !ºEunbM ?:wu;9|sX?X Xu u'NXCOX8BXuuKNX:k֡puXg_u=a]%;aNxnޝuM'Cu'NX֙u,N*A'a].{uCXu6CmXΝuoo:Xg:8~:a ]uXxs: '\;a`a]uEX!CXG֍Xn8|vXCub<i7a '`]Y&ӗG8>hNX7up-֟+;am8 NXg 8}X8up.`=L\`|{6a:ֹ~.k: u?a]#!*^ss+Xm/alBٍZ!~놿%VºltXԀkpAxnb> X3X s߆u6]a 묽'kqXg:|P>a 0^.ήu(ήGX~.`?X̀7yנ ;_W<`nx:[ֹ~5uoº;\#+?:ꇰNbㇰnvXgxwX6^`]0=a(֩3AXW^k| X:~ 0ן uy'0u~MXx|\;aʟ\?Xx4^ *~:X7|.\:5:\?X7?uo:U֍Wf`]`݀?X7|ןu<x<օ~ &#aca]cu}:+X X8n_]`꟰umo:?a~/vuq'| Xy|au /`uum&\{/sºxH߀uO۰ɂb8qX'anz*dκkú딿]29L/DXu vM8_3"|sXoyDa]ŐNpGf&u<a]L+ºú-ajpxa: :\59uxn7ka.`]g&?MLsXWO:Mk/a+~u /9HX0/2 ad6mʬwn\2u aECXGQ6u aCXGQ:uaCXqXqXqX!~օ~օ~օ~օ~:a]a]aιk{n\?\?\?C\?\?\?uaCXGsQ?uO:O:aCXGQ?uaCXGQ?ua]L;?ꇰ!~:ꇰ!~:ꇰ X=:aCXGQ?x>:O:aCXG~:ꇰ!~:ꇰ!~:ꇰqX9~먟u:ꇰ X!~먟ugurn\?uaCXGQ?uaCXGQ?uaCXGQ?uOB~CXGQ?|sQ?uO:aCXGQ?uO:O:O:apk_2\?\?\?Xs XG8 Q?uaCXG8 8 Q?uԏúЏúЏ:ꇰ!~ֹ~먟u:ꇰ!~:ꇰ!~ֹ~:ꇰ̔\^:a] ~CXG\?\?uaCXGssks2N̸kUf'`3\?7Q?uaCXGQ?\?\?uaCX!~օ~օ~օ~k~ 5....㰎!~:'`u:ꇰ!~|uu:ꇰ!~ֹ~먟u5zY Xט9~ƹ_sss#$sQ?\?\?\?\?ua]d9~ֹ~ֹ~:磙uof֝ǻ_]V=v|y~+G.΅vl?H|vm1tUAM=Q۾T.SL7nk/N$zt=r},ɤ[ [?0IIkʒU>N}>z-YB%'z]x+I ϭ9)n{Am62+vߦ~OHɉ^{mOm,,jb| ZVzUOj~Pwzh"T@ݹܢjI/3?hsz`fWВy$eGw]q s +<۾j61&HoT+oTғ=?lfGblreW$z対lkMz2q۝G梯#f~}Q/;O+1|sfb QwtNzc⮯n,HM:=癩tiJ?kvdm̼7OΚs6nn\ܬ C9OZaKyMpEC7J1ۜѤnَT>' n-3ꆽʮHTJ- 5JNyMhjVHMVDs7n؃<@k.Y{{a5u|׭ ifMYshop֔ۖU3r^5W%7K%W]L4lw.+n$Fi^4S <'~;o&ey%n )ɸ?lTsb>j>iZK0k.ɞsܹ9{ fݹş_]O2.IWװOlko.3ˎ5i3-z+%U K^!),툮ASsS]&3SECfXͷvy~dZ^,΍԰֑'l) hFj~oTl3,5,1n6=~#\}ZvX1at[aYXa3Q#U}YXIHh۲0ݭ"Ua~_|o o#;,]aىn|~'m[?;A۾}֏o}nǭ0dv =,xesXzn2@zXrqׯCK~ҏIW/뷧7Vuܽ[zX]Ց|fٸg:}Tڟw1T2pt "kCf/7U`뼳@[9 L6x~o6 Nm@7@']aK+~ܸ^[vXҌ:'#aQܰ>sΣnrpճp#7LP7ٸAAqճnUwh7yֽ(, auu~BnXӭugvFqm8g<=!ν#7,VA7${;/uw-[7S9$q 7,caۺKͿrÒ1-{l K7aGf7s<[؉DwԹul{ொ?|eq7\=7,Jd/mmuߣ˺MRgT=jlL|;_VQG֝/NUwny/5G~Ywպ4&\T0uue{n /,{q+/L74e1?\|DZ)M<_V~mѷvKG[[x|e=ٿC~O^Qz(xȣ1K=vzY-E9(*Km=in;?/kR;nP齶j΁|~meYO/E endstream endobj 229 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 238 0 obj << /Length 1998 /Filter /FlateDecode >> stream xXY6~ϯ0miCWh[I,֖Jeɐl9(Q-,p8d\m~A/Z?8}%dH,|" R.PBŋ7?{D)siyzښfk8|nzF/azN1Bzk<3.DtDkj~"^Jw_O *}#˞%,5 ,&P]O-4b)nPy*&C )A޲</t.LTeK^(q۪Y3OGO{Z2˜ 2(u+ffeh>٨u5y}vα%G69ǃgD9kb CHbgݵk7~,0=WL8k`VyC)X$A;c4!k_U:hЮwfuuZ˦ۦnUQA ^5[-bw$?JF&_s6/E*%c]"hKP,WmiOk-v,9__ՌB I&zrE }W|ٶ c6 ͒WVl]d@ 8[*:̆'}z0~" Gm4Jp@e,; ?pw%LO# 9_v R f))"Yt`ՌFGռ}JQM!>TM CDQvhb0kX8^}9J GX3p؅3VV82!2鄎LgPhWe;th]&\.u^_m>K*,r4u͌D@˙ 86?FbN۫EfM﫺-sNQPkה5r@'hOW06s$$?c[Q26 k45=.XXҖpizwl#uC9xLt ըnEP3YUirkleY䙒ڀoK&8Z:nA t{h=BȮh~ Tu_P58GD?1k7tt'eik [KLS.ͬع2 bHa9@4]ATKx0j+YyꢲAyU$DSSI1d9 :[!SӐE41lqRl 3fS [.ΊDA+\K9]9xiRo}8Q^F2̼0t] 9x\f"tCY[r"€p윶 Dx_ 善Z%DoIxg5)%j͡pc_g>M#Ztހve5gRѰkKNAbG+'P) mIL'PJDؼyb&5C/cQr/Y[)SkJdҮqGr!Vp>S`By/LkN030Ge\_ A+Y`j=*3js똓x!k{a>x$ \7h6%A--wh`1rW|.pLn, ne|4&ucwM8{H\hގѱddMXHGP56ІE塠YDiL!i> stream xڵn6}˜8m vf Mva:-;Z!ٙf ﹑"PD~#O֓xM٤o͛Jg"*,ܬ&JQI'2f9<,f?S %<ZGZ2+nmGvw;Q:qeE qntN>S`M+kVWrca;6#a/$4V/"Nc,_{%ӇG0(rO"l{`G` e7.ZٵahN zCC\ݝ!Oyy;n#Pї, iC6 řɀr R '!g̱ipDQ\)HRD^,6 XFV9mru(k> mXHIk t+)롖aEΧ gUgDE/yYK%Iž@[^4k.+E4\bx%bO1Iz>_/yKFy$+NF]9oC_, D*ӂBr~* Դ(!+S_M9*cW-Ois8R@H5՟93FCC:`jI6bcTU)h8c̴:R=-+- N}[_`Yɤ&##6tVQ`AرR$xy3[1{L ȧl+0wHعM\wa)JFAA Ň29t-zI_Nе| AKpRU\DR@rܺXP 3|We`vnOcA=vhr.nh0_} 8/AE: qQKՙQdCruLCv'*E_栃.ˢ!@m#Cʂy6eBMvR6t\'}ɑ|ǘMIMYiuʺQ9/dۉtTA]:5lFGй4Rk:Y NG;ǮiMpϝ]V?U{8TjAp}*jVa}l V۪vډ-Rؕ^,ˢiiT&;?cRn6r2tW\q,YROu$e)F0ihJ60؞B֜!057=A׍ j*1҃n4D!ch= v bC],f;nn/Fz;> *AO}eNcD%dz!8XٹÓAlڡa;u.KQ~->^]rA^n턛`ɿ Wr3ΐEД ֻ58 Pԕ輗-tZ.L\-?}?/mrdA-,kKJi}r{+f$.ڰ]8 oH a8C+f2.F/pgY v|oG$TSx[餋1y`{~ƊwFԼUow 7b04H^lB'H>d }!?gS7wz6W~SBí u*;IT轏A~C]V s=Fz2U%uxt >s#ac3d\O]p!$rJ\ kJ*,۠pl_nu "T+'!d4&cbL7OYcYY/B8QSƃz"D'ót}XF!`331"̔Qjx~$ endstream endobj 255 0 obj << /Length 2622 /Filter /FlateDecode >> stream xڭYKs8W6TU!^|x{VmMfD8>_~$eڻS5 h?LGwtt&ٛ?H;e]fFH\Sfbď'Z7N==9bSUhb-xڴOɓ0%>3x=jfU.,S6-%X-Wױϒ.pu9Ϊ4+ä{F ~kUonP'ނT.O,IsCʜ*|^?7`.Q&_D?cBr"r֣ʻfw0GV,=[)uGw+Tl,O6:肴BC0 o U.p's-pλ6VĠj; n@,uHi_3y+mp#75隆zs I6Q&Z8HP݊j~ U5#Rab·ڶ{khH)!I6^A"EeR5L^# bƭ+q(M:rVNdjB6Sw$)6DDL؀/m>s?p35tSB4QIhd% ϝod0eԷd @Aʬ탤gkwܜк7u s>0)|=};@J*Nf2BuErAY|V<%)4-e\Y}:0#-B*v[zfA{ ><''&YE{Ы\7fz^+M're8;m{&jz(J"9B!BW)}2c"Xղ3DžK|*idM8(bkFp#N/D/[Xp\ڇ!eՋG0LB og/4d`!.C⹶ϐ`{:6> 8q@ F8B4FL l ƞQjcvȗLA.uj`w|y"D]δqii䂶8SĥGBD۳Cͭ%Y$j !N7Ե.*iMOy"KИ{epכ7tv0hĥOգXҠ%9xc]0e݋Gȁ[sW~(P":ҝaطVHzs2̄ސ}4Ys? FwXO(˗`3U,R!=Er8Mc*+4MYKOp4s(j)>oX;9VHx$'۞A7zb#,)a @@ ~ tK xT滼3m^DTsy:CnD\B u iԃ2+bPim ݄&IƒIzQ?{C0VY Y}OxϗkL'%]@/Kb8b@tP*Y /ya'(kVB6d}L d_+.Q`,rb< 9_~Ay8:ǕۘD&C670>"1>!Ǿ;Ci:%yP,&:r@,t&rұyCXWO.+,Smd{*pV$P:83+Nm,.vPK3k hzO{_T ҅khd'~.VM{67eߞO0]MAr8ZD/ ͇g>,ʪFp/\S kWQWi^A1}vp5Qǻ};2U҈G!Bc_(vtgA ]ąaxEOn2T&UR[+~V|.MLs(2;$sd tk憹ƤpAþtR9t}kr]!_!+վS99HzjNѠdM;t/*m%k('[Wwd7o2Crӓ"óS;IH?S?V{lg&vLvatQ:z/; *0zW”z1{Hg<* /xqda{QpCL 1r )!]6tPf ^0\JN-Q6G"®s/!qDJ9E]cEKY(˸<-Ijn^4Pr7 RB2Y\w4'~),T[JrK_DԵܼa(\G|fx]VJM ?Ai 7fB6az_Zөx~!A`M)ċįCujUjO6 Q"Nk]$GTk*ߵɇٛL endstream endobj 261 0 obj << /Length 506 /Filter /FlateDecode >> stream xun0 y %`VcNuCڃg;MЬd;GRr\؁ER"R)qWQE-ӺVRjYݱ07(JO=:zTyF(l4aC+LwFށaL<.*cYKS\y4FH n4(_ʥuJ'+ eiUmG54ͱۡekYH[K[}W, endstream endobj 167 0 obj << /Type /ObjStm /N 100 /First 894 /Length 2644 /Filter /FlateDecode >> stream xZr7}W1~0-JmW&)[Jcr$sM 9|Aj(6%ҙ \4OJh9^$?! .(ǜ-eBpHh}x`@?@)TL2Ê7Z*VeHBeJ!y @,uB|ڮreN:y]C ib}b+n϶zIZ3=+_lRRRhKYU\kt1.QW:?_N"S9ET Z2]S* sm`SqV9m92克EQ$ۏ: P k8q_ sЯvjk&5"rQ2DO;ā%OUP~JGC!,Ļx\^w da lwX@xexG@ɷ5;;Mn޽rQcu*19掷.suŷg9pJ:Z:.G@dLl81,CB/*;d-{0 @e5z(@؟RoU^Qj@A MǨ v](>Fac>X͚u\)})C)6 7y?np5 cUlq;y}~<\_}2Z9?Kǚ'/ԃyhW建]<fizPc:]>IJ=vl2߳Ջdy;c[zݴ3>.7O *O |r6彀j4,r^lzlj8WsՎ'ٴz7oPMVb1^T5j.9Ʈpɤ|^դ^r6m>TÚ[\Hw\9(\acki FRHO|N4OIdWK!gt9x E[%A}F*>/2q]g{ʫKJIL- 1b<E]{W5?jƷ%Q?ɸ|#6BzA`Ivi3nOEd&lp)3./E4J"',\FK_h鈖/O6( }" Vz>F(I{ f.$an1]Ã%%Ňq6)Q!!*$DTR G%%2s|B$}eDhDOt8fa `F `zIqkHVEP# P(JP(2ԋ@О $a|D0>*-jR GZ>:p]ykJn C}2ë:evP O]d{b٫߯.ޫ.0ßU:jW3wLzגunwwΥCr/b!|y0{!kճA_G/f`Pr ?$V.wF#.K endstream endobj 291 0 obj << /Length1 1704 /Length2 11583 /Length3 0 /Length 12668 /Filter /FlateDecode >> stream xڍP Nw`n=Xp .=8w$_}ޚw~OSkhK[C,A gwvn.7^^CE!/jg#- -(O M | q! (, lkR?&+f ۟i' Pہ^*Z+0(]D89===9NP3nAAnoAր?$ԁNqtпwObp[/) 7Ku* `տ ; 8ζ#FA˝ t#@˗?_P_jvqr@h坭e!NN gw('vY7upx:ـma© v)bB\ /+;? xtra~qؼm@/?hP[o"4nn5` ; 0z?nL_&?[̩f'#22//; -|y_N?jݿm D{2^fVP37z?X_~@'/j qZh}J vuPZne /`g ssqY9\*З^wX{a!0LNAn'_i/R/B/_ /̐A>ۿ 3_Eo|/sc^y!V75d;;쾋nwXȩܮSGzqV.}Z#Z5wоO NI PH=;v)zaix+z -hV ?ͰƚX|#Arg@a;ž˛|RNdE?kgBMJGjDB76+AxsB`TRh7=R Rv .|Q۪iSSW-ǩ0ڇnGD#@gn YbʅdGAz5(ʬ(hOoU :@&(gbzIJao?䚄i>Juqo')2*gxB)tGJs2SZzIs^ROIe@s|Sv00)g1 ŬKO')}e_7YQ+@0>Meb:e?h;?dj bl5wOVgQכ[-9.&¾"&_l]* k;&ly*emϞ߬_L]KN{RDs-d `ǰ|eHb-1W}wDӇ)k/lHF<^9v~Q ct@ZcOO|PO~1b .*G>*h(=zZ7 F6wIP`Wj!98 |ϖ*{))`Sk0ɢў&uqB!S8*{T)|/Kj|:σշu~t|,RPe4M Lj0tyߺ[ֲQjU e!1^3y tKRMv^EQލ+ےato.I*$!3e~ᘂ?@ ÂsYآJh;!fIOAݘ'u4QA]1Q-U w"T Z4 ? pj"V'O=v4q!N*I ŏf`=":?dD}p9!h&L3XUX<_Tg\KZq@dgrV1zFv) \Lp_)CWJѮom%8'8&+( Q)8 5Fӽͳމa墚ܤ{jQ |5)|~SQx,Z)N ˑ!m$@nS|]pǤŔm;pQae Pa1nEmIfט[w?ck"K[2A5AbȔsëwS8e<|?pº9-Oom xW`8]CzS)E+ݓw1aD`cI\1 n{=2 q9a|Q?MV},M۲6ڊ)|w=8HS X>T) ^ud,X3l$~>\UB͇ n+b{, _>|v/u2$=mqXarI<]Jhje6/fApRGGJ`sB0]Qƅ}A[]9ni{q:j'A@=R\/:06rQ~j-;6_ zuDY1hpV>t*" ץZ)Hߢ~eFzT*/ vA`,|- /NrY(l JN\IIHwX+ܴ-MĄJTV9Pm}{$Maxy HbAgҢ.Q <7K$S&*4>*<CY |/8r1 zߓѾe''}*O{ޞh8 '>U-k﨣cpiJYCr|f^=چO늧4~ڠe œ\ˇ h̃ucpuk}A+7:,2{܏L?ֻ^Tl?f30o%D_^!GmMEldƪiGЀd= G>LDC0a 7I_)Xt7)tt6`rU̬i~?ip 1 Fx~S|$uK5^iFD)z.f\oPHX))o7M6Eم7.dU.WȆ!@:)Lp޽87ԼɄgthӈcvMQzu,*'ޣQwÃ+[`'*1}YCt$[V0TN*GoE>AO4 XTdu]aRBh' $Zj1PW$עW¤2<+j[=9:b3$yA[| lS.h"pi(l?!}3f>[WO薫1 MaRfXwiAq{u<_ЧK0TѬ50Dv|$gVddᐂ|}{aC7fm]86pӀM"Y%}؝jg!|dƐ@ӕk}#GŪ_𣧆?m0G442+x/Y{5R<ߑorp>yOs)Ŧn]¡iѠ(KbC|҄NmXWfgpTTS+VZ15q>78QڋɛYiT|`,eF"0B"o9(]+k&hy2]QX+sRK2_Rx?^PL@<"YƁ)hq(x040fe6A!qzYJ,qWx[zp=X1W"*oD^Y}T8,miO6@>A75w|tYc_0R0L?T8;&>. eVm[_VB Juuǩg\;~9:&]Mn4NeemٟћFPK)恮- MRkpp-4=GH٨ f{W;%3kBZ{/q\t4 a #:#)Ra2| 'kMVs1>kIX'L6"/hpa;chqꦝ}JLmM\j#|ƿR]S[~6Z06,L. :_bqoQfj2/SB 6kҬmȍEyHrt+4i'(yfwŒmE3rMY 1_60KQmjNn|=[^-ERxkbt/aiRa_sۘN`V:?78nPuXw@ǴSʦ}dq"?kibZfV%o+M!|zzxsِKv>tG6,N懿֗JQgi)O ɵjWcxj6Bc܈)r1tʕBedm[G~)=P,V ڠugfU_o'υ2vE% @|<يakw^֟K~_Ƙo:47R_琦=1LS:!Xj#E&ݏ%Ҷdqn,8U|] "PGV&%ms~ڳBy>JR!5VWLeTN ce@"t*Z1#VaYu؉RVk (9ޙp**W.E"=Ms8} ʐe '-7Sm?O ~>,K^QX!,K8 G=PZ{FC1Ϙ!!Ur*2HtI)[3о-+Fs^u.NVtWBh}gm8ުcqvd'Lgr!(!ݾ/,ߓ4]-6qO&2 ŗKݾtȠGֈWLo)ļ'˅\?{Wjqr \쫅I2Hk&|VϽ~ClGr&Q,%Yms4xuis&vOzu]?uuW(B!ZE?Gy[)M6)Ed*'Rc /kySc\ ٲ9JN} [ #5jAyM\%TsNgm ٜ"\p+kњ FL)[w1VkY/|)-V֚4kۂQfzL =|]qG1Jcj^ WSzN?PQlLݖx$pN% (X(;;i-GeᾲAaz>dV8.TB¤M#+5ut [s-WL! ApE x(L.V' qR[\ \'7:-\`b޿*SK&z"#<a#*7@;Q_+Bd[]h ֹjDR%mH oՀ\㰣K,'R+=h9P|X1weȊ}K&=o>i2 eK>l=qt?p}i=+OTOkd~ch]t-Ǔi=2'W%"oǎ*q=5Ce~ː_R/oVmnp6'k2+|+4#S׿aHH'}xL{(x!7D5WfcnU]8On9\೓su<[SvɆ*d(:=4#7wq: 2zun谯A X2olO)?iM1ˬ* 3~/Y +1K+%kw)" >8C^%2bπ]7 ljG]r,Fa''|KO󦓭[TÇdnp]r{w׻;qk݂kA{;2YV{BJk|ׇSXZO"W,l|57 vߢ{<(f!hJk\z1δux#vd( Lk!0&:+WtwczWqiaCepHCʀ`!:ppeImD w?>hmJ;l;$m("dhPMTOom;:ko1É!nQ#hql?RVԆp 7hN2`Qyr)Mjq.:N3 e010ߢ/{^y@AX'A`и=(5;DKm!4oi+$yfoA@5Inȳf79:'zAke[Eă-=/5ɲ}ŪBUo Ж@w60Ͱl YuX|x.Ӣ%]hD2 seu$T1m)z= x).M03YXCH5M bX DҾT&{A 14.2;)-Yv&';M9yFWcYY,n6&1?XT:áPBHwtwku7i!J%yE`ġAlLtip#;f><"㆒|*!|,hqKaJ Q.j3?|]ݣ&DN{sS*ޠBwf50^"4>#zgQ캲i)53-hz%< h%jK‚(èVn)ս?EUN)t.tÑV9)gQ-x-G Jx ) 1{W9JqWxRdu1O#(KԍOf6g2۠ra?o͠VwЀo!j^X%К2ܱ~+W?MOT%p U8KR ljfs4s&a8M ('_rBwKd*x)#Ϥ endstream endobj 293 0 obj << /Length1 1784 /Length2 10574 /Length3 0 /Length 11696 /Filter /FlateDecode >> stream xڍP-  ]0\%H-Xp BGv_^M3wURiJX8d졬lB)eI=N.7 -9 l`//>ˤg=@ pqpH],l{3 %9~,$@+s=@=G44̭@Pr l :  DYnVPKqY~ Pځ* eiB uB@g9?LvoF.$@;+[} e _.σt_<|!ln;B jng mAjV+'oQq~*IwH{s߷B @xq>;@M ~H zfj o*vAN;_-o`+.;<]A-!e /& >gzv@ oDMͯgQ{j3}~SF乣.77 c~s-y ܽ ߕ} CF p$bٌ:f{l\Xn?ۊHja/Mwe8&QNR\EkD}J?1zBt ҿ$Ak`dZ)£YJ֑gNJ]VLulFܘrSx:zXljPAy@ ̤)C2Տ"EtU54nP~ļ[~>P'qrƚ29!H\ <Ϭgi[Hu:QMv4{sm%`Yhwy|@& 7䳣w ֗m%@y݆$;ˤ2)-k^ÅL;l+K7V*f:B閂4*".\LD50BG x~XEieXjϢ*ǥykqEY-rJK3139%Y$0 O P_)}!ƍ BTAJOt-ܼ$0ͅE֪\}2G1` ב"%/+9)*c4o }cLB?6ZR*Y}4fP;r=4oa1|#t܀M4vB]wA(oֲ%mxmMp*5Υۅ϶OfRs%$Z B$!b*?ZkTN~(/b0X&1ʜ-ѕgaa&BZ{:p@WI*L悬 >ܯ^[mq6vaR-6 WJg'G0.Z)Ԃ%ޣX΍2Ιal~"MYU+ZY!mDWO˻ΦK**ػsLNZɠe4d ,ٻa$/SɚƘ4sKbh+24fNWsɯoްZZgգph4_SfSl nPs~}wʟS)2AaJ H&n 'ײOCV&[k+!.f=$OhҲ*Nɺ{$m6^P'i9\nkȵ)QTShPH108oK0&:gdU퍁5Cd _]T I9rT38875.:{ 4M͍TAjF-xY8)ZMABx S]5tOOy&bΤՖH"ƍӽΟzGM ߦ½{@Nv)$2kfOZ[Q1,545ܞt2ų g:Jjc.WnI6nk TD:t؜v+lRDRCY1o N2[5]ŧ7M{P?XdB)YDc'+d'iud?)c{T ^;u. )ʖdr*7+Ke|e LՁ5ۉЙIXVK jg|c؂rN =ceg# 1# @~rc"3q@s_Ph{nzvK.l~޶mrV49գ<,)rsJC |.uSnyhwqR!{*-tߥ[L^t9ĤW.v﷐ `Mb= rа`[)H])JRooPVCh!AOHpU]Ҍ&HjRD"]vmyη('Z>32I>kH r aY?j:b?OLWyԠ2FTENW8ePe "Xf<1Ko1M+2➶T>S7'I50) l}t 6Q;>TL\G M6 R`+djK2VhR"+DK渑mC@+BW'Y9\'?X!XX 4aOrg;10s\F/\2fE8F񦽀dT2 P66oK ~#| 1W=Ba[mv*Ɉ*TFMWny]>pĨH%do1]W]RCE1L0E#A$KAaݑ yJtǟoS !o.޿ jcCu 5K+3t`*ҫ}nZlR azR8؉|I/j~woZVj^s'߭U Ba~yUoOr#)~; d i6H:ԘW-xR>5Y=j>vHsާw;vŗ|;_ubE%*%Cl)rU졤RM=CK NY IWBQ}#^n DiO.Aں 'q5R1;4KO_sH_7E rlJ{DPĩջ&ekTI e۠1נxy5uc

yA#/91\AR扜J-VُEHߞi u(i"u @+ x =^kf ΫODu#l F/B>3ڋfe-t8jwξ%YHV)I<9d;-Lhvy[DPcxQjJ Dpm5k{EDp^|kOx.Rd!I_[; $* P \t ũ{M_q Mo░2;Nް9^U;*SK"BevxK6>Ml#}KaR_EBiWm8P><&Q|>پ&?{Qa+>[ɂ'-CIvvϖ( 5\Q|%ZC9X)?Zݐ:m̔!JS({J?Kk(p~l:?Yg4  g Շ~;9yA2o7s,d܇A.lm~9z&fSKq)BrCPd?v/x?Esmn7<{*"Vo]UsBH[$TDDr}-jDA ]DTԹ1%>fHM+4.-6{їj bGzY_>[5|\̖O}h/Whzb9EU8Lw濮"waaT5X.zHؾ^ʮF5EE}Ha s.JSDjPGW'%O$ƙ/QHJWVg,mBi͏,D?f2tӢL~^-iuIP2dudU]CꐿD! &_oBM8r{5 IѢ'NdnTsf6IC~$L &4LרUfNek]GB ^~Xl>; ǀx$sqȲTQx9Z 2<.i!1SptLO k+$WfДbc$k|n-VwV"ҝ7Nwo-=.[Lkrdo4q;ŁxtA(83*5g'`8 !m ?GWz݃07چC U/l=jQ?(ڱǥ(PEy^DC[\sǛVwoD=fXkm^2BdG,5ڼ jzU)R38 )Z6n&?#8˻448FS?3&朵qH3C@YnZA@B4m&h_DXLB45\tWvhi]n1 S*I@?Dmd'@eN7~͸zDv`\Ii7bQxsٰ12l\qk,6(ﮯqH=  ;1KOffWds͹2YODb)UG.>"艊yN1qIRL .huK?{k{>:w2a:_T5CJ':g<#B#I uhk6`И2B>tZJ`Cq\nDͿCfm3wrRY9Ƽdy1򵣟K![hsi.:pxzHU|ʸ]92r-OoaW"io)R\"װLDrt ;x󓚹$5 Wد^í| 9 N0Y-21c_0S@g"I|* ;^.ttY}x&{.T zH3[sl&ס By PAN12\HKqHi;Tc۝>ފaݗ.JX84!g;N0# &bτ7lϛ(,f*6n ]1@UN :l`vef-u{.A^5xa2SzX,x,WzKC{b *9{{zbE[JJi1µd .bK#xDzنHN^~dlDzȍ1%A@喅T;PGCn†Dnډ剽O {79_b\#Rf)R5hVa?M DixVQg!{$wZKX~_#93~ }.sOҗ 7{gL2]1iIvx)΢@>NE==%[\-U> stream xڍT6LwJHʂt-ݍtKJ#]JIwHtK}svk暙{9gqJ0(G )'ab҇;p nT_y70~oS0(@ E@ @qa.n;{}l^QQaYgh` '{'="zzzrݹanvRlO v!6_M@zaCl 70Cc<6`7}y@ tܼ3W"w0zCv[ s@P_D;>A@Vgdul wv8j+60gg0| 7ཁݯ# B6p@!`U?I&lv`8@GDXv큿J{;yulCl?8 w_ XV`;f^n/Ͻy<>?ߋu:JWNp xy Pj  Oq:lЂk `gX?/?_=o럌 qr/jhT#k x8W_Y߳+A6O pk?Uܧw@O`_//W~a@{}0~{E5J @nn o{=#{y @n( ~o` suB/o$*@0F"߈^@ h/x/xڶpso/{qfa!5!mղԞ\[i|\ϰ'-23>*-*=sВsZ[Ni׎*~t9 ,aRQ#"HOh:m>1'y2+ i. 5Ѕ7[ o Pdo8oF?Hzà.'ѳhh`+*P u'VQ2\%.B|}JD͇RN-?0+ppZi4[jPZh)̇ J)q)"Ў}iΎ&(O-O1e5!>bC hQ\J-Tq{X^.A%Dv#E4@#@+UZs.r,xm~1բF%3rsDsGJ3%Xɲ }B^K\<1a8֜Eguw݄XVOKDG .`j=<;ƌtBDȦ+Z:?+aGbf{LíBMtT],4ddDQ5?Ѯ l%-̢*Xo_dR +).2K.ޚf:N !3y:e2Ŧ閎a_7?m{[ ;Ki٤aP>pD@6pI‰V-it)m = <:}7;&܊ThS|؊ W8ӼqV ΢b&"<qxFivXXT~܀"vk4܇AnlY=10!c#?={1q٨?elYJ8ȸYy-]\ B/82gd)`vybnI2в~oy%"@X#]^e8"U4 >kJ@9.suU3/AS=Iv{ӖX b_uNE!خD xr}!h'6 &DsMē} "5IJoM+@kUp"Lyז Qލ֚g|#@ ȧN$ox#P^KkP9qQULԀ4E1R@*|)$:Rr2mb2`^9=_sa2ڢ'Y ex@#Nݲڸ@jf5"ZMvixྙW1;;6v.7rϺL-ʣmC-+#BԎJ[M%MJ`wsiuPy/-̰͹5!؀ t]WgH\ԑ ymm,??;hj.0`ś9]-²cv!"±;mTi+A\0\s.[QaO%z3pꠋ^9vP.C5VIȾaL}8>2j!>`l}HֶkSΜ@@ˤgo^qv$oBy _oJ|EyGu}'/9 x?}sB%_lw|B-p)ld/\m~z!`۩/gXT>,4BQҫ Q =,~t"sxsdt X;Sٙ nHןiS 72jn!i_bQb4qi)CD YJڎgm!({$Dk=@- 6JG~p1H秃ظs-mNL];ִ? Lb: KJj]Dz"ƍihM `.eMm klg_EUm:un$&8^Ȓ4eV3\MmǷn)~~=6sR Geҭxݗđ u̦ygJQeȄj+n7g(؛CGVL+x_o_{B _1<~ĻKZҳ=U2Am.dͷ|}V27c .OkE^W@,e)Aг^©Vu{"dxwаvMe %/qpBFz1WֈU\ ybho{ݧFbI{4QsFoa[ݟEVe}B}Q6Urw)۶yVa֥~l~qڄ' ̙(EMC̳FHEѳ-WU(ҕF.sƄV-PGG+CV`^Y'I^I t{3Chӻ֙PJUQQ1B?YxBxJD-f``fC2jx9Cd32hOfůk%#fYqۀo"er|J͔:]33²DWC? vm W"%h19DsA\$ Er\çS2*߹?i1sYՊhErǓx У³3Zbs:JM_GO?xGJ6ަ%])rWRRkPdW].Gtܦ;~e?(+ؓ V;0wt> C?蝚+pcm:`?)JϿi%Dفx_!7`[WDi]l'.ąp &Ii!`:U:>.ᐫJEI$k`zɆsWp!1}\|qq%.e: Rb.V~2aj`E}&̔e;GW?1n!.N\5!:ͫ5sϮrZÊNH)BF(U Zqׇb%N-}Yޅ[3U+:Q#H_5dYV '?ɑ^h?6> Oqeu-]ժU+AcL|'7 kŒ_1<в L4@:Xjv3MiaӄN}:kt[3/5hǸ"'6F,b!Yjl﬇(kx35 :ꘐLHelJE`'+*]Ùx苐LQԾ*BJ7߮7̏Lvy{ d9u.oɿ["2wKF=(E~ւH"s<i@׼ԞГ"/^kemޮ'&c&TN|+“LhjS&R^ט8Hidr|o] ?"D5Ro* hcn / @νL̢Cql|R*٪Ƨw=r -^3"LuF!- ?m~M1TtS&W_v x܃00+-)LdF)CfF%hW(%dݢam&@D+e/9۬1m;V:Kc{|ԝQ'zݰoyB~hеnd)DXJGWh@6u؜vn>WxsmܲkF (b{z5԰>4fuN  sEz>a08xMfP-9o|Dk 4{ibo<ke+g{H$ [շ1q:Λb8'9!fKVů:Kp~SLȫG1N_"Kw:+ڔN1~H~Dy,x^tv>Z #KXcI[%:izq]Q%҄YVȟ?ިgGfހ~bO1yy,TXy-}4Qy:YhDp.Cեz(FBeLW}*bKx's\1”$?;PGH~%_;0vaӳ٢nrїʚ){kw7<2(tqϟv;̊۲ڰMNw,G,BeCSz@;^ozSc (>2~]D2.y(:ׂs!ҫ caSkc^$sŒ.X.J+>y*5s~,pJf{Qٯa0)lw!e$YjGitTcyWMas G۩koIO&GKԷ .RcBF8ݩ݈SP+bѧͺ0I^ZdPXglvc ;_1y;v)L[{apo'`7'h Y>K8)V!8-[)eC!u_fn"::f!Mf9/"4h=.cIUO.;>$lԖߢ0QV!7Gxd|St[T:_lX-0|j5c{C ៹Eh_rC #~ 0 }[ +I~)&Nu|,\`&Hy2?f>DgG:e+$&p*$]۱>I$|5ȊIkrũ^5n%"$t\\?&FmԖN:`܅Eۃ6 ؍K#^>milROLGִNK*hgXS ݜ%L _gS?@~ <,&OS<#o[w>[|Si;]۬՛12;v5G_D7VU&o73oܺFV MBg?a 0=~[KJ&ŎVCA9_bg?~00.DV+vTT+|t(Ig6ˏat`dx3 3U2+Ǫ tn0< |$E4gpig  ;n) dRU!sSCa&bз%2us{ȉۘ@]Q&gU[G[Gv4ϝ"{vDP7uSdRxvٹkzW)3%bDGL\•\H<>_^GT{M<1fslZ,Lkco/02.?,**OU}]r+$FZ·^{8.#r/ٓB،7p]ۑ'ҳY/&a֥pI0U^W j186d" L^O*YBrp5C(461}] k码ZΕr%K-bԽ1.hĩ_$`rPyECx!z}]KAU)7( C얰2Z:͓xb)[/Xۊ> &f°?ꈣTjV:63M|F`~ŷ!XRv9Qgs2[6Xu--d@?159욾|I_7PZmJzÞZz9r>KrȦ 1LhѺ7;|!:)θ3 ˽9zn զP(_^2TvL1  IsZBE{gpn*3ӱlHAxUȽ%+lxlvDIM.InYHN.=#]1(tdc~'앐d)grWD@f(HY+0=yG CF\宋Ӧ+^|\\T/HGc;>HV6MeDr391`~RT53P\OJx]kݦ1689V0cEOAWrlZ3Jx&-1JW3GO#ۼ%{JN=Mk' }$P7d2ۨ™(0V-=^V%fd鐚wq_8g Iu{SZr-W~@gi\B Ȍ6?Rz:g+5+fktDt ?}T'sEu{k'[~ F2Cŷ˚ۡ kU9Ybw ,GHr햞|D`+ _uc6HiF~ #+J~~M7\kRiY<@d":f: Y?~ubJC-hdӹdM߼ljvXXf)ҚXڃZ2;/2 QY٪BaW 2-#( ִW-Q-jKCpFL-ʯJ֗.^XcS9x~-Rrb*^(M;6 ̏e2/~6k}JF5Gʹ4hD)ɕ[x*hN4Dh[,ծ`JdUٽu˖(b}tf CsEY$dD}p  ]1]lik;/3BI]+fل̫3R!ʊˋ]sx|J,|bY#j>ˊ8bs6=۝k"lkiCaa5Ѳ@]rnLF"tqXPG4 endstream endobj 297 0 obj << /Length1 1539 /Length2 6849 /Length3 0 /Length 7878 /Filter /FlateDecode >> stream xڍvTm. ]CI!!]C04"%H J ȏ9ky}]{^oįACp?P@Hf  ppPп&P' _ $PDťBBa!!4@ tp'  stB' JIIv(A00n;A#E+ .-(#r@ >0 EzC!_ 7ic'_BBW uCH#Mm;Y/Or@?x v7ww8\=um/C~A[7 %>:d*< vmxWs@!nr{xV7o# OXLB"A~ſ]s nou{p@ ~TT hP2 $@Jr"o( D | c <]A~{!o~m^sP_(`apn^tׇsLnc4?`7YGRפKj\Zp۞_^>6l'|_8oxhيKDOo@⻨MZq-«Ić V38(~F<#;ӧgSo<%x(R`*t1\e,CNgAˈyJn^v,I7 gơ(gbzDQKQw&# _}V@p0YyWtਉIi},$ (̖Hȥ[hJFX<5 h$z.*/\BW>(1'N(]xo6!%jRFƍ\_\2Utܛ|B Ր D#$/uN5'3vOwէT潟{hhDn\](gvĀTy1+#wu/2T>akzfKe!ـEj¡5'rNME~/CW4)O:"9pOlW51Kmi3&|?);-7L7D:KN-7oJw6[ks|ò%o8ѵ9$Ob3{2~?Ώ=MtwA@yTR$tpM>_~Թ3o_r_?Wal~PlwNыQgJͽ=9W/w՞WK,l2_ Yf T3ysl(F:(5PިuWAeT^щkH_ nPμ#HuE,=&1n ohJ{ 7GuMM3%Q#cQ3|0swP=kohx úl5VRK>o/"k0ݓnUcqmbӡ;}MP~l8bQf"?ꔻئRMf)UGd=c2ˮ#;KHRYnoO*C%UL4#jCGce=b*H.eύ0'Pg)sɫ^0{Ffx;ˮZΫuõ8?,)xKS|)ijd~πjťm=]8dbpx;u?izG8{c考Tk"$G:Z)!g en%L{Q!2倍Bbf' K^VDV\r o+ 1٭L?^N0㷜Fw*MP3\%%1|3fͯ)5u6Ce=o=WZu>k(9ؗ3Uh#~w3ݸ7t;)WXjBs;0ּ߭͞>v4#]') "/ B&ox+oxS>dr\Odt%pk%f Kg{űSK)U|6J7 8 G[u"e̖^GMg*F,#M+4B/rܑ(W{jCZSOUq?-k uK(^NME.bްQݙ3L+`-"wUEy׊/ |sP.OL~:6V13:A_Ҭx̆]6עxv GiY"SN8ttfTM畼tNgBK-C5>1i$[|ˌn8QqL:Z; (c"108#s,Ӭ:wY_py|m}n7tߠ/,#Z"PCmG-Ayï8& caZ<GA{$ H0 Ô'C?>uK٘^ ]MB;L谯eB.'Ҽ X:t? kfIQ E3CΗnH-f&knDNQ%$lZ0~Tv.]wp>u՜X=Q!c:t J눶hhF@ˍ|32T?!ݯY:yasõXƄ/ӻ6BRvx"L-l?5nkmmSKH!4q7m =:ZttBT uz#>"ִzӥqW|rC:aI:*c+ڙֈHGƢ~$IَiD20^.?UC' U4"#HhkFV;\cOe܎azZ![=FE6Gi|̆3)-?^[XfHo~486ڔgpAtE][P}`w^׳At!Gz$ž)f^f|~ӡF>x@Zfdm?E5$ݺ)k;ETC(E9 jUϫ sS[w%y%" ~XL "g))8=O~! jG6_;PR3E3Hj Qe?I?u.3<5uN!e` ?a:^;0;/\4ԬEegwi6w.,1*#Ŝr-QwԞDPAl(|*^a,_dpOhYv l-LV;c'>YϸC¥8 h@"ăE%i5/{Ox1M r x@5ms$h ,o`3nc͈lQn>k29l~k36s1j{V.3*汝Eq^ѵ9 !]RK.R2V%j}]}8;.X>c.?a^`68̏»fQoʐ)&moL 7z>Oc1q]Cs~?aH֫1wҏ {W_[$ydy7XNShtg+' ƓؚhCzq*}tRۙ{DLitCĜwYwSW@mRDxf6[bsi *KSDeԑ RG)9 z3,y_@ ʍzlkz/Kjk#gLUV#6lM۾S@&8ワu\ VMuo?&M&%/*xLb㤮3 ?) ˈ a Nz/Supu [?gMf/=AuBXJ{UCPӵT$Le;q|܉:AH?x]B^ˏf09HbӥGwİ33Z~dpͰP'_ɥ]BYp?qdّyVyWbT }31^j4뇔*<,5B_s&nEt=g74'f{kmGUV5RYgsUUS^d[P8b.CH E[FTt8qxKrq2)S4 ~>0]8'ir^=?4IAiǸZg1*P(b9^}o8g4-8/ ;d}3+k2oO>mDCq^MOؐzblo(d?p C_ >Y L,OW%ܚ Bw@\c7iMAVV(WJ, *(jBս9jkS{nÙCvt_y)ž{XHc9׿AviU JPzF Q֖dmՈOrR%uhHц_cOÈfDi_.7&LF'8E m.y_ XC]0^,3Ԙgf̲\t1}23Wme[4E [&F-)7aP̕Zo'ƺ79!3=6=0msWB/g oŵ}|61gL'7ݳ&gEd\c}( S@W3Aw^  xF$s R0" pw6RF]R68] $^G$7"yUN4 kL'ˊ*oy]AC?Q/T[yb2Yyr؜+ ^ z)~ 2y*R3[U?kn'D v!iIt*nڜ=961;? hh*'QZPՂoOcP:sB43 B/΅dM_iG{QGޛWvC& FG-he[iulYǨ3Mhߓ'&?}D}9Gؕ^"οYIYs~8zEBCΗU: |l8 ?եz1D(MA z%p^B;vGcPƒϴe9b] sĖGBqRWʇÙӥ,qI-Cri2FA1=e՗z=ǣYLJ\+rleNA+_ qlj'73 Ѱ_M]Fi'wq6Mz+RO\¬lC䫄[fvjBNgr_4`({CF0'O)R=ظ$/-ejL5Z糕[(.>=J6cʠ'bSa̫ʔ {3%/2" ƜAZؗjx-l8MpAx,lԓlC75M ?N36 QsW3a O_3.MkBͲ?6ܽk^uYhM0dfl :{Ee]Bi0; v+kqm W&:N`}7Ӂ w<}5vkUI*3H/ش jvn1A>Ū.ES S)chc*=QTV7f;(y`/Y`1[X$hvn k4+ILw*ξ|V"fC%O%uC̡%QܹIpsk0k%iMǒ8M~oqv2o @7ӱZWۥmW(ZG~PдZLGqBY#ٮh`*Y.^<8jeW|_y g^ԝ"ݖc?nz|W(^,|w:NCK~9!=. r+9A8鮘VKTswKBucw&MN8åD^ٲNNq;\$YU{u5B$$%}W3 蹩4@1tĥ_AeC|I #T fHQ nX4׬ܽj?4bʽUw*1MSąwh>֚Cx>*.f{\е,xnxJ;j{fx4$_{Lb};}/k䉂oS%1R*5nOE["{f4r"r>mw{={E(:Sb6i-g0ġ! Vڌø}riliZgME2EDK_|TL95=:{W28Sn'Ë@> stream xڍP-J KH]hqi585Hp;w.33WuouUoߔ*ꌢ ){#+ @\QQ†DI؂#G9e! B^d@ȋ=@`cca tr $JqGOg%4fV^^n?v gX^2mf`BXA |L@;&gK!Z;bP@ߔJ@;_Ԙ(V`?w3"]^\\A΀uY#Oc? pyhf`[, ڛ6ں8݀`[R ÿ9!.L.`y9fI{sq;;=w}`g˹{2\{w{ o殎̚`'W_6/"d r<̬'td-~x[^~]n o#$VV9 0Y"Y_ 購+'× 3w3+kJʪEo `ep)Y eRRFJbN7?ν7H=9Iv-IL?>_I&$EoN#+vR!D6SDNS"-ڦY]Kȫui1xGnmA&/~^:04K(uJ$ZSvm*-r`y6Vj&$"q G,97;|1= LӀPⵋVO:Xg:PyυWTYCʯ1naЭ)Y)l?.]фhYi-`*5јv u8>Q-8UE`E{-dݝ27Kr[X3Ts(j1N[H}^Z{jD1 ::h/dm0Sm@zXz x\M.QiBƩp y8X nck~rsvC-ېC}v!9;}C ɫ. H?f{M}@FƲ-ϦRcENGR@F~sO| wn8fqtK^ouPmo TWN\[1w-cT -6ͶW?)/( 1y7{sn4UX'qs#bgK-xj|i [?ʭP: DȻ1Tzw}ܰ"$YcX=cz=q& 1uQ3oH{ΧV23'HȪŝo'dmukuidϷXY.lFmk(q[CWfbs˫JVX(}ߚx[rEbEKT/za`sIUaG0;?amX_(xfBlo Bۃä`!v;ςyrGl8t1B`Q@mGNU6=vwt'Yoʹdahn" eJalf` Ѩs7*+#.  t nLeEosȸmh ݽ 0\l,Zոc_G:#Xll~ Tp)HIiCJe#f @۳.hhwQ1 q~Rl-Jib9^h8ZU$DtwTGG%O!mػgȣVPx) e%9%,16 TU(ߦJn@ a\Q+3=aq %Tx7Z}P|o{!C8h? ~p }N2cH2L&j \VJO* ?0)j\+=@<4j.'RoM sݢiMbՃnDuqG~4Z­ZArxķp$6\}\9 Ye} va6kS6>Y3~\Rm7$kVs%,EX4sf1K9i1VW.C@dD\bSGFL/-)6k_+E~RouNwb!0Pf$a*b:cO+O#tEyD/w^+mL(iw\iJ}ӌ'.]4Sۻ?]01lcF~ WYDIwE`Ql{-q!^`hK%ƺ"ϽJ. ,+nz|,>umh ɠ"#2tKΌ$2 nÔ U?t3yUa)]GH?%l&k~rPSH%HAѮY[YQgRPzؐ>1~S9*F5lc֦*c:#bC)> uX^ԱuՆR*$_m">] C ?]MO+{ud3g^;5Xl~r0qKXku6(|8>SYe]| \Ml6c̹ ܧA\ yCM9LtD Fߕkl'< /J8%(͎~ ۨG:}=*vvAn+7d2"-i5C+&8ZI`qC74@D!jA>DꨢƧc MtaY-]󡼇{O7cH1QEއ I9pmx$6UB"rr _;=_ kc^.&.{\Ep]ژS7;BЕ$?G261}u$)hy6hɎ]Q?syq.K٭# *F8-niXhiąp_2kmG}J)!qy T ,9qy{no2!s,;$nf㰐G3qA/;n 3NҲVPҔFM ir~sD9FՂ⧟owc ۜ^$VE0C{wK-c[nߊ R\8xGIy7h~IH*F c*1~bL[C*)ºX*sBiT1cYpe kɅI8G|F GFXgNw\ҧUv^U.Y+IBCgFB/jlQ&2^%9jO}թH\=[4mVa>4 E|  iQGsrkl.gWDz~1?f'c}"FXۓt5܋[I'*D<9c1-op5]ڭ\v0ireTAfܑ"(RGt(\<Țr (& 3fOJa!'^E ~KҡU8siUBo?geڬWe#$5nrsD_L f"^MrJ[ NAٶ$/5d5國;9d p8 ISn)'_NIO `v%B5ehP*^yFAer0+T7upBCPxlvLorZ^!m 'D|-ŃHVKas9*PT NyC>T O0Z'NGF(癬aI oW&]qJ (@ zF-(2|NxOR ygi aYK\J2{k Pᐝ- /1PIvE QwZLYU0w$QÑ}PTjSt3\(tgUd9~DfFUr@KƫE:.w)256ڎ[NjSkȂYnq|u[g.iпfWh2R6-J_=9 2נwPJiJjc[)V$Rl/HB4h.Gu#t@X/ɵId^FqP#<ݏ:ͭ^Xz5t"`-ɿ 9͇LuEk̜c/ALLg;0 iz蚕Ȏ}f:@ <~?Mw&wi$l%wTԕK:tWM`6ȂbtR]?"U>:tGBG'|XҳXwXEp'_^V}ӘgW2)g-3lwT+yR=|-{䃑|%PQP8wd w„Xtw|gYN =h[9+Ux^qe \*4%7ʦv*_aOѿpqH(L_ [Ax b/$ UXEIp֒QSmD0$y.7='2h4ǭ^\=SnR39lFP@DUmP=;}JzLO6 W+j]+1Y W *SzT c@@:b>ʱ5m%?Q|z(L*Cz^ A+iח[>|r[t:<6!y-LF.,`檇$<)>Ry{I`wa3! |J vX,C,>./jh'\#gVզ_D#oRc]T*הzARU'Oǹ}3B<K׼^N}&3ugFSmmEg܆S< SLT{ SI:Gپ._#e (X x( l\<+ĘML"`6)9*fuB~J~랪\\DKbpF9B2PH_Pяx."בD+`>oZsl*Q&=Y1YjbE5?QB#%mL4a`ld7h_٩Vqlحopm;?} /X xaunxv̘Р`.ߜ[&;c/ʬk&U}65|LfyWcRaUf \8buYxÐB 6"~]v.zC h|31cI;75іW_b"? D[pǡPep)~=X?*j>9pVW*GQԒץF cqϡIe?rĞT;* n,M (z[e(mN$nޭ/U_&@TXvzj#VùCBL_ ȃ\,|pJl%%M%_?Ԉ=}4]EH$ܕΤ&T,q^]p`kb!dv59w-F7'}" 큝H㝀woX.j 9agW]L~Y[Y|: ޽6#7F0*FL_1a J=x>Coo#Z`rAu:u{ O5=* - k0񎧽&4 Fm/FWEz" ekGC;{%o9Gz\!/4T7i !&Y{BȯXDF=@9Հ(^į@[RЏHcpjQq7g2 l~}(e)۱īo[oP­UP n:ugl[澲0"VRr`Ǒ%&R*/21K^;jGoEj;Ҥs:$ۚ*)ePwuBpQUvBej+CBM}0|>mkNŊc[awᜍRP@B}9M7x}K&Z+]Kx*Rf(G@l7[MIm6Ԇ)D=Dƪi"&qf ;E2mD"A?tBPbNNsԇ/SL kb>Edz|J"3ci`j#ϷSSLU>iwS& DaNͳN}DIgAKPתcʪ5 H`𕺲ѥ>j?{|JZȱ:9:_K+OkleXTK LWD^5I~4u xd\:wat~Y<\A7Ï,nZyx~mt2/>*cU f7pxea^xjTN\UL,,IF>|[W:|v[#&Ԥk%nuOc(4Q|7mi$%;<ԄyTȳqI‚c?#!x+֭]ǽdE.ZAiGqxd'.\SYI\`Q_Y7xuW[n۸ɰ)i;{fYX?ٲc {~k煍{݆;j=^G}Fq6iS6Y}敗V'Ԭ{|{UeG~iu][sfƻqkꀋC 9vYuze -R^TZ 3{ihHDŀ'0f^$&UEöc4DCH&m{-,v$0jc~H9,p9;2nc%xҤfe2f zcz~xSoLgDҀ8w;r%06u %xujfMJ:)ƅUH0\?-oRߖ[ОSkj RojnE\IaP"3`.#1jLZWsY']3P;:X󫋿}ۤcMl`|.-9H؍yẠGzŭYehpUeQ{~JiyaXGrÉiZw&hTTF;3x r& AU-ۣ]/!d=.ߩ{E F o""3/źi񉋫_2`& 7˽}`#/`!uVu75Hpsd{V͒(ymޟKB\X_yY# g}n޶J^e:{-&u.`QZ3uS*|uI80;lrMEiB)JAP$lNHjčnڸ9Id7%h m!`Z\]O_S.FMv/Vqv(&b߁]E9I:!LlZ>ǥ<أY.oLo{w4#t_5;lHnYφ:@>#B,KZwNQ >OI*du3(걓]D1M#pۼdzi\9s8p*bJ^y~:FV~z Ne *5g^!gͥPNTr__-_غ~цZl}ԡ/;jHUA,Q21O,m. y|d`9V[>=0._p3"Mǒu/Ήt ]aCF<\uq4gz,lf(Uw$6c Ɏ3fډyRB ϾlAk$w{Wͥ{Iv~>:1hR5{N*oVrq!%&ƍcAع૊-Wd, 7(jk:y]b|~ .ͱE浐)E}--`J'FeRA!+QD`f[~ ) F/0 /66-^j[$?X&܈yAY\v `.ÜdnM^ϓ& {7%%3ankUJ{';J.CQpIt'=z|YLlNgq GecُMKɦ3ӗ*Iweֵ[3Nᆟ-f'}>N>&1Ot_K;(B(A dtf @rh_o( }0>E+HhJLG{Vy|d5eDUv-2coN cawȂ+F?J{<9 #fw4K붷ỏHO@ǝr)J KhlfDeO^'X6f,f\W@Ҩ SM-NWBuc F32< `]b̝G◙pi.j1*{yMד<fR EITVF 4w/ sM %T1b򆍲xJq荡ǰrFE`0pi |&]n,*$,] Zd6#է)Y]DyUZ@5!mr$7վ㘰V씖9/JF:go=GxөPϣp+Lf}Po:DtRÜ`Rpc)Q:lȶ2QδX}F˞U#8w- endstream endobj 301 0 obj << /Length1 1519 /Length2 7253 /Length3 0 /Length 8272 /Filter /FlateDecode >> stream xڍt4]۵=zQF/3Ѣރh`F]%.D EA%G|<}_֬uϹ9\{  x| 1@}3O7t@#AE}P:Oz8DJD䡞6 >*C>v(6-֜5Ѐa.= (?ɇpx90$f uзw@Cآ0` #p;9@OE GϻW#b5 qla-Eu>7J:#z'jN}r(@QFEC:8 6r$u>yw5}Ӱuaowpv㳃AA ^;F#sEl `0 =`~ElQ+h7=|woc{`^6?˯'g/#coW`z6__{OG-'/8 '[h"d8)Fg.W} Ega' uqp3eZ:5`6.UAAۡ9  w@*:xlP0YpvôH_O ZvNg!(Aah pk/9 @Pwwh ukMx?BИw_cF_Aa 6~g?p zzo_0=8/yì gᎵ-2^#F#xn d9 j]`Es6MYc:zS^F-;Fę[S)~gt3$o1 2wchǒKuIk?̥x-S|Ѣ^]~N.U;{ޚKB8'Yj^U+}d]!X#Qd }tBU?J=w(i0R;2k>`}a֗{Dpƅ 3L$#o9.FbIQ7l<3aX3GAXJk^G.r./k;%pwnwQfk=LΕzƑ%]N /&g^GG^Cdv},ݽQ|cSe(Y(ҌI 3{(#r ՚4grOc, -gU{/$\<5+eooHQÄ/X~ ST.\n)8gr7B,[k [*Vx?Op,y>_Eih8&Z4D`l JtneC${_9i»OɚaK@]ie_YIb`S~>^} [?0q9PQӨ|b%],!FFmn|!lxCE\ЫsS-AHMZˆSG|vL2i 'G=fn.(>v'tv >(H٤Ktx%\ZM[.P[ne<UMOqվXQ{zKYE|)}?#ծ8; :LvH]@=]CUCٗ|z lqœ_v̢uR5. ½fŨ,4{ %!;RadC Ġ]}5.Ky,- #1ʨ6)[j4oQPn,^hѽK.3RWDRgxj&o"1uD`ͨ57![o%]49m#yM0 \"ܻT]0PмHͻ8v&l+v/:d^_FTgXV} SmJɚK.BWel쪍%sj@e 'V$^KO} cϘlC8h 4z…Q2>a.v/W"5eA ^ZPg>ZCn{^b_^&qk.:qDߺxZ467p\ڂ sWI=&dYqugGoak-NuEnbPLM'ʔmЄ4iH.pKx )݊"͕qR;41!ɢ*S_!G,^-,Cؘ#O":^=%8dyM3`Oo2lfooևG ѡ?Gij4wѿ^{zTGcV8LUـO9^J|USab=Jq^':n舺5`;dS6tTa)a?W *e]޿AezUVEzhPWjAd{qt4l^@8°P"pԍDfɆ2l*SC9%vAc@>m({Rщ joj~7J`a uHˋȣ"LS:[eۏV_7וx8~Y1(,]UKcs Z Ye_衶I".٥B(Ur _ȘI7(^#qqo䟹fg2%&F"ݽZE_p/Tܔ}}'Ӄ!D}ϙg- T8Śxl0*~Ffc7 ާFZf iG▨*G99iI:~r)2NO VO]v†^u$\d=4ns-'\M5d<$6(?7ax3\NAP; jrx1OlēTJt7x|a02!'J"ޔVw[E؁F17"L]gbE<8t}.mWOJޑ!UZ'XޗL"l̣Yܚ&ޘtԧwCkdg 3dWqB{EI@:ՠG*RVYbRʕ[vt|E4&q/i^-+՝``Jo/J_="܊Ӆ(&u/7Ƥ=[{cY]^Sꅊ .'ҀRO3bϲ.BjEl_90s-aK'6 7\2JeB`D7D{9->Hr~1(Rx}ν`[ .5 F(^̽eؗ{aŀ3tgV{aY5d'ەKB_#'=[6?,s5ޞH-!ǾG6ukzﵟ"8}A _33!m)$JDC+}rP. X G*0KKN닓'w*cnT 97uP]Hib6~;t/k~&M ge _G._}H+:# ׮l'z3怬FiFm1Or??/%I-}O^5-Kqj4Ҋ+=2>gqnHHeV;6|X_+<8ְIɛx&9gל?{zY9bUZ!"GڈCGgi4TParcY(w|;oXPl/b&=ZcOqduPY1FetzҐDRuy]ҽ߈>!Qީ[q؎7 c\/t~ #q^9s- {9ԵY_ RqX6:^O=*<BnrL%x'ƭwGQ̌[DBy3^aPA5@D-*C=BF{>Cܵ%S@j^A)_ǩQRߎ8ytV0r oímw#Ym,BKk]Eo:MWjFJ3X)y+}9G&$J_i瀚CI- MW1ɩL\m*?Q ,wbRHVmskIm q~:$|BD&<)X)+I"Aq=`H긲cPe2_J JIM)ϸ ςX/z'"& Viٸƹ;DF>|ye4\u{hl@alT#?;uF[q=cr!jG{Vd';B^L!X8ηdW$T9}tiEBǃZHZ?N6tK-`g:\=ԏ[?Mx('$hvŧ˒:@´L#\>&Gr˸ukxgb$QwVAUR8F ۿ#kQU MtƙwZ\n Uv:`x?d+g)8 g=rY;銌CSm")tL ]./;T ξďx|kPQ ]2|au͕= AT,p݁yFU_a-CÞOd5$ r֞ kۑzgfQٝmQvb2ʃ,B>h؏V꓀M{azkoe8\$Gf*2qR Cqo?3x00l,4iQhXU`jW]~U6P?%MUR I4QFں{dp$/]p*;#Z'DxcbiE%զ9s_n&W:tr_ %5sfm7S'!J)lf)g\\Z8:=* JpaM鿑`:R*= ʿj$3VIGZ*,[HR sѽ&Cƾ(>w@~F s+q{XȶZYZyokf_>!М _ endstream endobj 303 0 obj << /Length1 1449 /Length2 7065 /Length3 0 /Length 8040 /Filter /FlateDecode >> stream xڍwP[5D)*^Az]@0@ $Ы" (Ht (U4i"R>go2<{뜽2p +0p ],kAHL%1C/ñ8$-*q L} `IY,d"b5'`p9*tptG?TPvcPqw\(r@':(8D .𿴉?VL1w/PH(@XSm=+YE3W!$w2 ŸB>HDz"BA0O$P6@.%)"]q"8$H2笎b\\hwԐX8}ݯ3;D 0/!0W4'"wHdDp7+"|" @\  r?pz Pw=&OK#,` @00hohb`qޭ4 %¢ X, |w/Q#QQPqy|)s8;`.g$@/SnnIM .Hϟˡp4>&Z 5mwȥM. #qHo8uc!KO_15.b`%*! `˫$~K޿Ac/S,A pbX GGxYwVX쥖r O@o9U5Tf^99$XQg\7QU)ol_;[ҁmM4#? ސ]mk/9}i0:Tz'@/䶿:YS )_ݶ5ḇ bZZ*T^)h( 8t\IRIeQF= ^r(gFBd)J~Q@%fm+O.6ѥ+'n":r콗dצ-7<Y\YcS>)W`b. XqKULeu|z&q;Ym\\̧`,pN?+|r/Jb}̏g\F GeuZ]DuBy{K-u${AWm6nHDu3u IT;gv98*xH=F\[9r`:~?͊YlVXv iFv֚ ?=[2gv vņ˓A"CC,"xJ#@vd8oOPӏ5bG.Fv~iUQ UޣvC;tIv>&2A I^2&s؆PԠ Q_8AB6=L[ 2{O+^*`ڀw2t*̬7OZh%U'v>zLW޴ePU)o˻y9rY/X gJ`#) X XP:o1ϪЭ)X۸>^cG~W Ss>&z hv"f<#sO%''FĹe5[O ` \o7nㄯ})pjW紗.A XiFs*ZnP*.Zfsj ALQ$6Cq[ a=Tmm [hw&&R^ LP|UeMj.]R;՞D[jI9*#'&ܫVXM0e 1@˸ ISЃ3ʺc9pҶg .SgG: ;%0O>dw#[ç1tXȀ9i4vq/^!K I1fDh:VTV—p3wˉRYVsF(Od4סi ϫG ¶1KOEKN)yxK6;m5j?:<:,ihRj`Ip;j\`mzLzz8,;꼂Xa1C?m5Xޘ ]19mh٬cN?u<|CHU>Sh߻a RIGT%R$f}0~˫ۭ?9x O׸MIsdF[ãYuQ57v~}]޷N{hyH_oّEn=`zAxv"DȄWĎ'с|_KUnhzeuw|S\.եgǶC (*&VZe["Wγms $;QU7i] N{k ;oKHz1߫H7òɟ*IM9BH\kȿfdQieIB eθJ,ux[B4_mm bF'8$]cMreK'ӲN (_L'A#/c@mT`6S럡k1>^3N\S#A#_?e>{R Z8-FeҸgr8:~d=)d4l[qܮ2,^ >X۳}p{\26s{%M^fT4ׂ=⩥nޘx% ~'χ^6d5]rg3V!H%w<~80V$ǠpmfW|J?'[(zU~Ǚ}}T7+D A}>SM-2teFzUǎ& =)M(Byo׼l'fP j0"nWY߸i88۪>^v /l2 JDVPm&.s1ٍO/SŬŗ2,j4|#s %wwp FAt;TVQJmjeǮT#1qVKffۏ5֛k^" .\4iz^3 'yB&)'wǍ}ԇ$dv6F 3X/9]Ȗlt&CO7e&aA`EU_PWûYǛ_(.'{xֻg͆zV8sĽ|0&FWQ &Yj_F)q̅Jk9]$ O Lԓ[ϟnv[5OUKr &OƴŘKE 7;X2O6U.0oq}qJ7'[Wˍ߱ ]&R.zGTeZr<2[#;uͬKJ}5#' qA K|!'ZJ~laoA6Op>HY\nnw'90YPOn6\]_b9$ ~.?^CRj,6 :z(n9 J6е|(1]9Yn:TXJ\I40J>:z0 JO'k=:dLu)09.͓#Lj*D/r$:dg8:NM Ӈ m\mb-֔$4lC t94V'Eеș*W&1|$a hԌ__9cH\V 7םdDu|B# ?/f s;·/V`~o)G5ܾăY?l?{D:H :>yJrrɄ8/XNQѰ .`p9s@X"wD4 <,\e핿4^NKng !ޖ+f?#iZDml>̒<\)3JQ;ت\oon=2Ӓ ڭZ;jn=>_Mz` eezC@{{"B M0mwUtq;ۨIV'<`t Sʉ,'&˦=Nj[ٯX9&%<·NV?laO{{HَK,FrQzxQKWlhVRtԃkJPwg2F55Pf s$n`C汸fD_䚮MqF*zeJ7@V մ3';QȸYs0&!^hzƥrJRcGr)bX҅NC34CGC$ " Ի,{MɆY RbBud?l ESkzܚ l*_XI7OGXcm?r£$C43[wŃr EGZ+@X%6w.zjWϦgBfWK=^ u>zs7)N]qJvjkcE?Du<)TzwEڏJHRp;IDw:U9jV(;$OQ2L5>4CqELT_,d=tE% 5:CWGlos:Ẃe )f *= b?^X\:Bn.y"VwWQ'éBi`rFǷv? Pw)ݣ\x*H:|w7˰{rX,QQ+')Y廤<6Ɏ#cYA) a1QkI~*Oe"睕?,ֈΆj޽I6{_+iodNWH/ 1*F"%ڔ [+>,|3һ7TPLԮ[O;~Y<&\gr7p9$BymV ?5]9We>A4OT9}x÷ެS6Ė*_X|Mv%rEiתa St gB$7_^&}<ȸ_;8G ]C,L>~kZ!wo&m WmmC{~U݌0 NxJE#6M_ش PۜǓ}xYr}(~f9gx ]ck`R@ Q-[ʖ< NJ I.'>W@&-IU a O yY|_+lOaZ`J>(@UbWp{bЈ1{4u)@V\SS9n7rI$[2͙Kj tMk[|_ixI~/E.̩o ;dG0s\2UOO~NDt:^u,W{S)0%ֈi׏h6dݗ:#ߚ(4SXfnx)D[UyNN n[WV{ĤNJs IKDuMb.6N>bhN)7[)>x7`tF/c>ԥfJT_ߦYi_!^= 5A kT )^wbg.|vNgR~nF!/Y+֍ϔC]N 2=1۔lSY)g*gwWG뻆 }BZ9HNe ^/^l! yhI`"N]BT08<4btMBc(:d Mt"Ei"nl ev|+Vs|["S;GM |T'Wяjpmr)#!F.|=# Ǹ9Yq\{>|љOq+-xc漡uKe~9&O87u^r9@y* 2D)}q}ȹQsU3Id}ңgxWIi\̌&jk:Ir𓀮2ˠ.Q6CxşDž?u.XpvoT.,lhQU)}8\!:}`88^o:֗eCRN|E숤۠<*wmfL0롂 endstream endobj 305 0 obj << /Length1 2583 /Length2 22480 /Length3 0 /Length 23951 /Filter /FlateDecode >> stream xڌT ҝC3tw#Jww JwJtIw q}o{koi(5Y$- VvAv;;+;;' #1$/)7X&mSq=\^A>Avv'; ^vVV3D#fgcNzK_ '9ba tg4wh:[=|' 7;(3tZ~ P5w]+ @o8YA`O NTPA+m 7Vw ;_斖N. _; PUf`~;;ͽ-17JhS;~wYd%y#'mݗ:Ak;"<]شAv@L"?2O t},m~u-W !{n@+!qp,=@;ҟ`1o {?d ^/+g&-%wIJ:Y,<KaۀTrv]y럵dA@7bar%$/*{zB|k UVvNWa> h.kR{3pxG;Pc`g~PKY:[>?liK`G?Ltv$ܿ%NN^6?t%q ^$sw?DzOp@oݟ$\ן6wtWtͿ ?l`b ,e/ÿ .i<`W b\\_ Gss#usY=?C7_;B.pzWOgCw_O ; _]q ^ 0?i8__Qx yk>N!t;2焭J`n߈/?5G'kt<2M|3ہ870Yr$EK|/5@' "M'?zwϧ]z^%_UYZPy"0b`O+&2!slp&W1eΫj-ЖK,'0[mtB*Z$XOĩ_} 5@Y;v4)y Hʜ yYۥ #,0 pߧ]V)`lx@SDg]kRPۀD3;u47/?G|V9&`M)˓B3:5YCxb"y,p.{eBpǡYSbΏa뵇!?f ]!~Q#񘼗XFGlk tS8zҖkm %  $1Zw= 1joV06Sh/xe:iJ>{{/uy^[p%tJw}%U% r#J1Rry_H}Wbz9gtxԩkZY7 fqDJc 46)~wc̞A*5}~?<2 gy:P{P_MT+Y2Nm{ҊUn'L]?എ$uRXIfL,OrR([}&v> a{7$)"pxBԭ_@}0u7BWmz{&sU:YLvPT_ a1 rȗ.kT"@ģyM[r4>OB']s/[Ǧy5,Z.]sYO>ݹZZU  XG#d6\/42d: l{UxD3cr'Bj0"_W7#5?3`PAX3U^i%$Jj 1V @GGhsm[kU(.Ś)LʒSU -Xr?e&YNQ!LA2.Ij[\a=c )*''㕨9sp4 sGz{{!.A:)1Gys:Ҙ/ 54*1vMR-5.U_VϣJꮂbA5z6N#dPqdPGz8wWeBV/5=O'I;c S#ݻޣJɘEn|H-uVҷ5L] 4W睺A@4$v-۲jJ`J 8u8J Z$-'7V,vZk.ZY>ȸn/,[o;Ę#bYƪU;-UiYxI&'v%Lo2 J c;IPJ&d!e^ޝ(w͡˿kl4@WX)yM2`v@xO7bYN-xv= d JVT.CFOGj/BmV%Wm^_97qȶwb\_lb^]+kLy}};#:I=gd͘!Ry7~sc!;@!%Eollai㮞aE2mt[?1M, %-(u/3ĠoW8i_Ht~5l'ϫΛ^=Hb ~¹'h% x${]YD}q_M㠋|GgÚdD\/ Xٔ0JusØ0{u܀𺿚Vq0)$y~oQTsMdX Tr)vH>_5A~`F5Oso $C-`̋C[`L5|hs[F҄􍤹#O <*0{+8g Ol%K?RNiuIBv5ڨ<Jj;XI.AniǠԯj=$TaYQAiqb?LL#Wlp ś}:Pq ܽJ^؊$rM%1(x+sCs%[&!IۍbOO2r#B+P )ZtmyBy\A;Rz}qt$ą>率b;qS~RL]$Ada(Mqdj4呈TGfjv.*306wey|ZAL=gv 8m4h~OYHY݊|B%Rclɥ1cM8;L;-ژFm>nXۋ9@E]_rnJL&r_/.R'$im}>'Q97eXZ>c 7g5 iGtyjp!nٱO6Jx9%_Y`XѶ%wi3B~(`س,ٷB_g T =$:'Zy"'y-o`D^k uoۄ`cT2ޗ&DUk3AцXb= WPg7G7^t!NXt=cK Po>;6|1ˆo^({B`{7?uc$-Ǵg]e#`KMXi,~`hMNV{fGLZ"l]γ&gmw,}7CR[VdoJ(G,UqͫJm& g=_4 #0*wm?nA(Чvc(W)tY6ؒuQ'IoakO|Џg\c 8q7Yҟ1x E<iy/ESsL;sД5`K|ʖ;df~^U6kX?aL^q7Q791Jߞݥy>Va`3ϰ𙻠h v#?ZAU\Vh> 4P(,t۰{XhǀѯI#֑L+_D9S"/k#vM_7I$[0)܋ZU3 5ds-iB>k({2ˤ{Uܘ}rrW4'z0Pr)^Q+Gy/FY},A@A:ɺ2gzu {LO< c&ET/%&Zײ>Y= *)%E꽘omXX"7iԼ^DZoV_'OŲ!&nzet癙qk^J6LZ+]zao!m<<EHWzpTEumvT:cD__6':ҊszRnCZCCPI)B3J3TZ-hwFDw&ФDB]?P=gy_52r5,|Zȹ5-0OVhZ=DG ^OsHt~le:n6q}qa_8%+J[AmWkԠѭp)?;~=E%%x"({ ׽ \a;ۺMV '-(MiHw33rj u>rX`_9Ww#ϋ'//A Ε 0*4Q/"qi/ \ {XC-DިW0|G]Pwn;:+aeOUVc :\&-~6@c*jq`pXܧ<פ[*b]5Y#u~\O0qUb/Oxd$x!F=sLdK컽uM׽)z0+@"^6EN!)WFDan=A1K[ՎUIMOUy}9l;vL,*uVjpc%oGR F⻥ IX)Hń" yF/ǞcsCXtK5w$V?M}9\WƯ';fiƒQI\0|Oa|I#ѶmkI}8v1xjyߪ{:'3[?o4WJDt/mSCETay읚sɳof-8B QrݪT|d&Sn7a+v!aB^b]~c=-7KU]&Y}VռdibGri;jy湱[^48mq3GwH$޵d@4g9;UYA**4Q})In9nl20嗹A*>t/OryDH7'M!a $-U>VU5$ڶ&9O~:r c};{41&ia(C(TIR=NY1LޒB )Vg&-S>JhNj+ }.z jRܜH$y1U(iҞ~IssK~;Đ/G'BӵTA /^^*Z>`3O'{ 5 E,!F됸9.UjNH@7]rΛ h3X9nOgK:zq@_ZE ;/eF{NEoܾ[4W0XB9A-t wNZKHL&׈زAшddmh*0BDy ߻]:>k6d{-wias-{oKaz&vٰ9㬍ՀĦ8^h]T!:1=Ǧxta\>hM@T6>#S=Пf ( ܢqDeDøD7\ fʺn'GHҵo棱NޔEKTFӠ 9|§ϒkApپ ?;P-XB^6EnIl,ns4 ̙5]+3+Ev \t,(.{*?.I0D"g5Rh.:BiR$'n}6/*'8y 힯>nzF1L sf0O}ʓ1lh>~: 5D]G6LNXn0 k69 dl2@l@BeM`3ڙ}s|ݢD,BΪ[0MaN9érԶΊBsdȸC+7:',G o`\P|k៯X\^hA:p+TEkS-wN\G՛ Gvr@W "qjȷd`%cđ__aʑtĨ&3҃l!j뉩_ ()n\~0an!.Y|wn.[NHD(l5K"u~9ç@#()@oNᝢm x7엙PAx?C3{z3q1̶Z :w=bLyL0[tKFˤ{~GD3<~܆^T*tH9"LƻC~-T%k#;rh55V]֜3> &w.Av~HL?/q 0Qc\13^H&P.B?t?DvL`+3+؇!-P;EvHװ]~(Ȝ`W]҄-jl1KJ%9IYFeJ 3;rŬY6j-w6_HM"- Ysӗ1֞}/H8_ߛlu~fb5 „H l0phmDžERjQk^Ͼk㼁oo ;@Ju*94k>*=XHn' v>9''6QQ5*W_AS ٫aJD𮛝k(9\> A,RKņp3>yYߣMU`6bMHhBT\P~dl0*EDtOhwK2 qiE1l=Bj@='{: u93x_su!Ja YmznUΰr4mh vY_xj,;=W(pC({@KҨâHZ8NxvtO[XPv*_ =La -[6'&6_X ǏjMJn6rme&!?oTH"6E^ `QLbJye ØѥxsP%C}t=Nآd-0(8QpI]"k,iL޹ZQxRPqCvFT#{] ϸȖ$SJk"-Ac?#s=*,HE_Ⱦ̳LeKje5y[M r(g%kaj}vx߈;uXd `"O^dªEjEC@Szk&%6zVp 6 ff\Ř/$P:zOҏXcc&1 +ksO%2R_܂%.ԫAEM_1]qfJ~ږbTU8al*f>C'JY8}Jzۆ5 k5rC/\T$MD7)_S3ƾH-J>\f٘B}b=e=!(ƈ޿H%O)[xFM,ASCO3~! A@X&@goδI^ aU'N5>&PaD?Mh&$4߰ב>B+͈חoq>1OBɠdxX^D(*=ũL,y0_:F-Qfy}T4 y.KCo1;:oY yNH`nڍU]9y43P}Y&g t4#ى,/6f Pg*Ox '!< c1I?si>=bDsS+!x;QjOvObtStmWc&ۿKZBgCK%mCYV6k"ف@8{V;4طH~ߪ]Ի2M$JXv3Mُio!ی U"yEP[tyadAU3)d W- ~7 n` eʍ6We4NlW>JBY+S8w7=X' sYta;n+K>'k #%tQLRK&JXP^ t#K#?+"(T=ΰSFxbQ.dɣ" _FctSLVzɟL'] .)u;M$Dc%bۇQg90BZ:Ws|$,ɳzDGLWVU_Eae!qkXR;W`Ń>2i'J]h9vꓧ1Ѥ /[^"X@%(uڜ O:13: {iSKSPÇMXd?kt髆f9{]Z,`Ȩȱ>|:@ RKKq;pHۋ]FXD 4v,\?0]]sĕ x\f0ʹS~m~|~\7 3$lhv&|k`nԘ d,6{{b%k~,ҨLe쾍m-˄|-8]譺.s$9^K*<S+Yr/$ʒʻ/AY ~u =Ag/pNjHh .dCݎ!,Lz dNwXH Sș-!e7A}7,FG::s 3Xw;.y [AOrJd<9{XiqNt=tM"Nt雈w[Oы\#cEVQ(M>GOS)\chRT6uڷLe τrK^.Ț]5%ɼn[LE&,*$^_iBPC|;,&͡Rx4Lt*Zj@O7Jr.:e'A,* js@Q5 "\Džȕ/;^ Jdd^GX dehy7|<"7yRY,g +p̲\#2Q@=z (CO5;h~ص ѻ2Zi[/Z3gZM1.*$c9TL")e']Mo  eVtEqx[7I? ;BR &!7_jRY&E +,PIڈ0=T5LJE,2>dy% !оI^=䰨\s,MMMPY F:,tCׯgگmPNFً~;hWj&L)wD KbkCeU^̧o|됦hږҗ,tſMڴ\[@R~)d ]& Y< DBKM1[SѶOŽU ET:b^‹biLL^W0 stD/`j%)CF6kk-tJ^% uHae+NHf/N*P;n U~6?TSi}?BxYj`isrxYVaw3 +>;vSv8(L9I_aЍj:z#OP4=wJ 8ض *' 1 I ҊUd̈Y=紱u y5-B#J<-*/U^$pOoS`h62?Ŋ!v\A&h oYeK'.i5ʨ$yc`I<z R[F<թ˥':G/bF/60} Nckb^zGv5> iHE,ܪ +/"\cO\lJ!=9 Y5־aA>{5geeǙX{1X%vWbR(C3"lժ՝}>hru9&]G^S^%HX:`L[|͔['!aa%%FČ.N|A\>oOE[34`^xeybQp?(~y<\rK )]-}WŶ$HW֦"ť!"I-~yإ3S]$^OgY'"ia@ &lZ-obtLyJ"H'R=~kBRj]C#kt\Gk湫6 F; T$gqMZ-- gpiijnnz5ZbtWSݹ3=p^[jS)=7}i qz;]`<ˆB]~aayUXoTw#p<1DLV3Waq3{7 ҏPY;hER_WJHS2O$5BX;Kn.H'S->mgLԀ,J0~:^j !L/QȚw L:@1mvPU/cѰO…_}(z=YDĚ1atCQj8̎jK?Xe"бeR}T߰*gHl~dBM#$[E ąfݚS8>$z}#DBzЂ$ADӢ`t%bAt;qdct penZ8;mz{u"E{~bт4Bk-Ww:ZsF:깂Yn?Q$"x hsֹJ‚u ,kO?35"A^D,{U$KN|/<=W9}kh!r8%^1!s3ۨa ?u܆ftOPj.w2KgwB00nȾ{%MdKٍ̙5hHf;ґ YaBFOaڜ,OA4Dc/o{%[#K/&r% =cju*eܗ=CC qv䕢ΰ-GcN e[^Jnͨ$ˈpn7%9(}3A8*ʽ q>#̼_JJ}鈔2v^\qIQufsI,lDn-CF\kWyҤ2t:rӨk=E!ffM;AGO2oT{pU Rӫp㚆a9pCV|?abيH sXlx_5)'W/rM= iltǺ>5#S_sهQMA:M vR b{g0Z7clA%m9$pA3NJm|K)t MQxݗ!!<9f[[~t3_ SZtmw}!bm耒=L( Ŷe`ygk {594hAI(0tZn)Jt3,@Dnk2 ]nqY")>%rj9h.?/Qj܅h^m!wNLKXJo&51)آ/Gz"C kd$H(ai=27QOZgsm$0 s/kD31+޴X?@j(ܾOr3`Di[N)ڡ_".,d.l?(퇔G^WTE*uh4( c߭~d@#߈GqND(9j,O`[hn7 KQ'f$ 8P^"v@cYq<Ut=i|n Z+%\0fI]7I1G2 Cݯ8~9ib &͎(o A(윱Wj.O ˅ٓu v+M~+J/ƸǰHe凸@ a%9`=SN^r)rw5;=eG`:L];fѵgJ*C򴒍1EE"vgo#̗rF<l@GJq؀OR8# ǡVm{3Nևv?6KoFva:͊kḤZe[䢈XXu4)!Nv207_a VX7(נlu{om>&{=ѣ ~e6b>NY)dq=UHā6(16e8MUʒ9д)6wJ*)U] /tC)ñ7Y!ꊉ!z"]V;/QgM6|v6 ܽ*){n +Q<,zR0tCcm9k[3,%vم B'⠣nEDYD5|<\H1rĄq~{ɯt?=ҽ6UBwj9jSh"~Qvgi/B9]BB6Q+тVD)0q:ᥪFW؊&LUef,1y8VcG۰Rf]ĕ[=co;C߳Xf=)$ӉC I "Cw:5{#E4WyT?'hmXZ'̦ZKz3^mq[kd-+ qzY~i.R ַ9߱${v , JAW<=[jj.}+V`3u4:ȽwvE-PEarץwxёQ9 ޯ}4l~Õ^s5 ,?ѢWk“7y-I(ѭ!4nԌrșe6Ͱ?7D[vҼbLx٘.xYͺ<Ђof)WIcUBT%0}N8>FaM)IJ _Dxx yBrsxP(%Y دc3na@  N(ܡ}x_nJZnU{b#JٮlccC5[?N,JXWոmY֫IU L~pKMsWKmY߹CUz&PJ|v‚1xL[BKbZ*:#ۀY{k_R3(#YI:+,Ëɔ--1:8[!O+ޜNz" {Iu{O܌$ @֙ۂ{j#F1|94j9;Ldž X93}u*J?o{R겶c Rt|,zPE !K9ɹ+' ^[i|,`[W?$X$+tCd`\`q΀#X6So{AM\UY{|yu@8:Ufwz/g 4H˔Rk2&Җ\t?<,>׵#bƒM<Lq*T>#uDEwͨGmS݊rk4 FB{cgjDľ^vX```>F @XXIz "ίTkż9G,GT"i/3 K&CѪ\_lÚ/8GW kTǫIDWur3ɏXu&ӆBܟ+kPZ[˅"^ܯ?l^7#} _@CA+ b]v)՘Ƙ]%5c/ =&lN\,*2y޺ 1%3Yb`m\TvXb ݩLv\ ZL׻~ K)Hssjʯi1h<#6Z~6rS?-6ͩ ݹ`gۋMvUw9pKn휴QcM"53jYuD%v&!8)_?Pe !ri6>4_'COZD?Z.UdDEȞ4c7_.?\F*CyNZTMeۓ޷ƦLƪ4'0`'1*{qD4ϻwwEN>BbzI֯܁CY@ZեeK~Y^7sY_B@\!`*'mJ߮-OXXj0Ji4ʍ"JZܻjo"ZjQscpn$teŲ>DowYCX]dDG)Ҏ}b!p"9B@˃L+th\z6{&I:O+2Kr}ȫmJIeXi^ExO-mf{k.)24Ϳy%KIemކRY#}pa׌+|pWa-e>\/_t`( #%DbgAVr> Q 5<kM£3<?u ".T yوxҲ]8$ mv`'E5~t L}>JҤH‰d>t0!-C (NmG %, iIKߐHnjr%8֊/E/vYԠIg ` Q"d,?]K+_-7kZ@#k/6Q2g2zb6jS zŏ>YvX۞dv͵ Õ됸GLDh D)wTM =ۅ -: Er>8Xp+uaT]Fּ=BF^i"pҜvfswDYF뫎RR qEAo:,Njߚ#=H: o|]&\EF1""x-,/5 $ZsLbj qswرVJRzMf>FbۥLky |]bv9|e񓊄U, sXc2lo2u(-r',\M/Qk -*I18_c#UXZ+-qjؠ,_fhi{9ǚntn`W@A6 BN7/|@ Ur=/wsPfvmk3EBsY"? ߚsl, hIT;[ep$Y=ћkM/m5+-#Cݹ ,O+9۴+oAKT8Կ-=s͙tBB>Аw=dA^wW[mRHR $K)TvIm0E S %r2[oX ygP_6U9ˁ$%}zߩFMU͔pAyR |3M.9HzG ٟvuF %:JyWUݸዕ% 2*i64Vcm^VoYvepVWF=Ѥp킏vN_ě5}vheMIpXe%? ?TWe~-x0ȶO !_W(3U3ÿFXnO-oǀĤX5ԠVAIt+J_§9sd?u%Qę?~;VUv"C1G(-{*"z D1^1H^1O{N Phsc7 ϘmfeY\T\ܔ(I<׍ra1ܷM^kC[{_Vlƀ|̘a>.ʓ)s"q9gn ٔ;W WD+/EXRqfbY(ON̘,px1l)O= Qg%WudSsĬb[Tb;7x4LESWľơ_˱i?N#iX\|6ٙ 8gRlDDPrfkiGZy(# &QAL@R~Z,e:g{v;ȲIX )sm^F*zOI hV;@NgeՇNtɐWb~F0ajB'ald<[$%ciӡ':Q0#$TogC- /0fpu& ȱax[wR|CA6}[;M0ܯ >-NɍLЛVdZiho÷Ѩ@כ2ՊO y@'NƟ^\BϜF[8#se/Dk-i|rZauNM;*Ue\rr\]|U*D}-J0DNan U?ibvZvz.2\chaT늩}؅YA<C˨>H퉼Xe|&'إDxr_Ie$rPFvDLS p-;`$d< ?Q٪ endstream endobj 307 0 obj << /Length1 1895 /Length2 11796 /Length3 0 /Length 12961 /Filter /FlateDecode >> stream xڍT%j60ٶɶwngۘlsd&75Mdc{}k׍* P Waa03123SPYShA2sč]AYW[ C{'^@ k:S;x:YYXO) Ow7vڽE45ڛZ]<ŁݝΙBnb P:܀f? (fi\ xZAo 3-8@UFe,=XY"+ПƦv O+Pctp04u7v356y33sc2s6urpqftD?h޺,2\O hvO&kwy ̭@fartʈm&-8x@GԒz5OJ?oz;;ߊZ߾ཝ݀'WYXfV.7h~@mX|^f [ΗIBKBTNщ{ ,nn3Y?)U2;7߄2 s{_%?e_ #(ؿ2@{9M?.km7!IW[??jc;+[Ͽ 6*n.YhfjZYF+gI+_+)ZJV5fѽݛ{6?Us S{?`d ^o5z&F˛ <_0! qA\l&߈ $Y*LJћo`RYFoƿo`27b2d0YLooIY E| m9r_3}s/[hopMFb6x&w9w|K_-o/ߙz2uurz{mi=K|!!" f(v5i\`Shj֝nERFnKP/?{5†')wy2LP_t$0@G&h-KʍT~/0P26W|!F=Z/t$gƅ-ڹ Z+lq [kÜ׏J5V\r\B)JoуTYu9Mdj]{KJ ^j\&H ҉v$09竲2\m&V\ *pBJ]5!?0Zy$ۺ,z ^zMGnb_fv;P45 Զ#j!tiÇƋ!KockRB2ԯ=Bɪ9pQ^*RSϝ N6."|sKjrW| -|S6":J3"f~r UQdDdt\xX|>>A!}y u_؂]iG/TZ}'V#|:#J7.PۅXuD,qC%=kWf̖ v0s'cya~Ag`E)Spn.psRgCLk1]f>0/z1^h(ѢسL~`&+*.8,G "ooę._ˡ#I>U/!Zs{)BknaDTMd9jHVom[67A$&{zEn?LG%F&zd3Y  CyJ]%:sg{z|U*Fzn)Wڱ"MU bHU0 >^ c!ے)V tŃFP~$f$6bw&\[6Yod*M+$^_")䓕8Gtziv3s2Zuii2/XgM:s˶SɇFc}" M~Z69=Đh>13 [%01w4M4-Z6;<`85 #5]A ';u"A')`(wڒʡrz#m\7^<8!oZAs\SL^<-eâӖG&(?9FBp,vXfwG}j'\R.dIo[×R5$͔Tž,j&f~W s^gv58:2ʘx! 'XAqR =`wgΎBPk¦vݡkh<(27ᵻa _'Y1L=8^3bՍkVG m*!_n>'RK;.1Zaт#q2UDZn){\,<"59Qߥ'e>n&\rb^QMЪ!6SWCPYd:%asҊ\-Cy)pnTk4,`d\yD 1s-Nن:Q{4JG+5wdXJytMwcw"t.ZtI/AH|tR!(?y/ShX-֏N6mp}28Wt 'gGd6^vcV,%>j\ Zr֤"d[`96q7'Pm òC^,y*en!mj⩵UF_㵰*$l!.I\iIz"i4bF"gwjGȳ@hDAᓶZ{3BG%0ЧD}A[ ʑ`YZA G:u5Gn<4cbYG(tcԭpsJ4>&*:o1gTssTjPP&Ff" ՠ'$bc7Q j~R|3d_"Al^tM# Π 3:.M-$HP5B-x Iu JWzlcܬz1 m6݅z6_Ǔ7]rWzH Y3fNOfI—t ]Qb+^m7 ToCfcsˇĵzxU;,rhd;M=W/}̘ Zh tIRdXf]Fyer aaF8pvg{.Z~hBU2 RRpLeQw7H'aݏc¬\s@7^L}̻=0|9cѓrA)!(l4(6U`4DUS%'OC(swjN-~ 2Dn;NH :l)6~֞08ٞiGG9DD^dpxn*]r3q:(}-AIV><&^Í$M08P6VM`M҉.W4XEHAZc,M졠b X "7x-8N4 <Ǩ=_s%j{]Q|ebGC#+2IqF ֠H}%1z$YTJ:c1 o%@wDfSjbzkσUì/G/mbJ4|˒ȑ݀τ>Ѿ]SzTwBk GL&t旊gg}Nҍ@c@|VJv0Z'(*=02bg6ki܉ y9@TF=aҍ"M PTqb? JO {=X+}LRYvjt|qomg ɖGzrcwbMRA` U8R܊zo&5ni,=EXhp['{<:Re /~2u0pWLYNձp7li J%1ߐUCաY tʣAC>`B"tL}ty/S{-\/b\ kl$_|<3F:>&%slIJc銊A~k+{%`NJlj ƁǠ}wBta#;kZ;pMAQ{DMs}\a7ҕ#@Zg}Q+XHUEY q]aY.foU쐚iB$M`w,o罘K.)&X]+^|xtycl)8,[MH6Q%O |z70 tBG񲌮MiJ`)<2ܸa4RD4{n!3x, c\~` 6c<<+=.HUk'Kmq[CF~Ɯv(+&~Z Ǹ{5nJ 4Y#%u(x>ŀ_'<؅]ԾY8O{Xj0ji!JUuAFgF^/TYgt߰O]y2zme 8 9kǶƠo?~/LPYN7?ƙFxܭLzH. lA#N\˕0W ȄUX~7pn&r&REKS,LD 5zIL)ԩyZ_ͧʕ9kCS>Ju_6> /x&!?p6 Xh^2gѦDfMD d2Uxϫ_6Ω͙F y1j)ZGᛤ4mS 2rwJn~$|썲t"#Gx1SB$&]C*xi <HF "K#M oXn .ؒHYmaZλF%ft1}A鏌61g`Â;<0נsb'ENu[;o* PS".HK|>ߨh;q™ZUWګbN)o/߻$\ G6ƁXv- JFncMe) += iTNƫFl/OWGZ֑Ol//粮 U3a膱){rL4 H ֊0N:m~:f%c`Ĝx/jQwgQv0r4![Z]^sttP3}!ى1u;DtYe"0ݝe7_I7?n{pSizs F?dRS` w1UĨ󗴒MqFyZ(ק*~ HzB(9}x}|†'>;x)Gde*0/U)) e~x)Z5_4#rqwe{?? yW O.yjY|;F%,ڕ7­4&R?ډ@t5%-SEABWlXEyUD/NUc\t BjشI~p_bYg[Fs [rxmrq2l;, ۊ1U :G[%=>۬ =rm0m2D&(#}-5t0(eTOmٙ+PgnOm4# qA{lNqx7Ǧu?EURQRa2Xng>D2!B~~.硡K NA}C'\Y>_ Vm$7)`ZΗGi[[-*OcDV9b#qep>9|Ya +I7Rq PC8Em+y?ڒ}%hRĉeYv0gŽ<7c-SSIs qo=c\`SpXW]cu`tZ=ƺ]y__>Fv}p1;zc@ XNW^W!\,"$JHR>J-O ݨ-*A@>4SC!b۽'.MhAq)Ъ1հ`y髰&jA8h)^Z&Mz=9}&6M/R&ƈaN)BS"׮$NR?yg֓CEx2Yom3eHժJ/O!ks3(4"VkdJD{,g#xeet(&?lۤ;/!͊naU e0Zn.1mJ lןYFo8FoӯLO"i5HD",vs7݊ጢؚ,UCb^a(r>- [@Y\ь~;O0x΁"k ;.}„*1N QdybR8x9XCg|k A1#ӂw 4; [Y$%^6Lam\Rd)! >Dc*pg bRpL{'S܋h_v6:)Djj=&mV{T 0*s{U'./^=J/}rWrj> 2?DWj/ry=] ^ i*r}G,9 \(' I ıTgҧZ5Dߏo]#,ދ#ސFBf7sdWGzKuDaWU@02o+~S-klIH=ZW-ttwrX!htWJhw0_j9BT9AV+kPftX[: s= KAnrV}OD6lQ4wL=ʆ%jYSqOQ5"/H99#ESqStW1=\84,24R4Q%urSQJ1B{7urF;EwrAa7+"*MZ`Z:P9\`ٽ5  bs^ ?g]KX(p7TlId{66}\Q.mO))qjW~j]q'u}ۂC%7> ,̔I8Wr.΋gS\қ{CX kš(-%=h:qɸˤEe빖HDN;ɽ\._4>: tXfn^{n DlrV"s*6k6[7:7X!oi'gM%$&p}sR=n_"MJhٽ/MV-# '6M& Q1R~+H.L;ߢ`;˖%4uX޻W_E Hf̙DxzYƚ_1[ǠѠK++aUEv\2tOK6 J48up㪺7/J WQzHcõ xiڌ0aS\!z{}  xGC4NK 7&j! %49Z@#AUG JpiU&t60H~㈸ܔ{7YҎA@q>0F/0n8OyCf](ԉؘS=M*.@4P3~g4&򄶟@30mmYltE%XL! C۴@ObwLog YR#j g\憄qVwhp@VTP=}%̑UwAPSd|'ߌl;e!'CR0 z[7}{ؗV@hN5qð: ?[Ϣz[(w~}Vt߹m~p{Uc#K¤*4&w o@QV,R=w,*|/YLeH:H$u-In4^V!Eڼ7 .yH'~\PDs"&z,IbNhMsS=\x;чce[èj1>ia,] bp {/Q9= SHUˠ44oGoSaՈfZsB^ oJU9=} 0&h5h.wZ:ʡH=&߷\E){ g9 zS2XP> 秇 |#ԃ`'x.__[o&ĝmzw"@_q mˁTFﮗ>ڍ^^k-v<`G#]cf{v:Gq6s- T6 ?n#d;se:oz|1,0*U߃XȋA8ݼ\/y , ukT9pt>Y C$ܝ%\8)i?bHش KΙW9n1PGueq\Jvw.Gjt&߮ Ld>uA~>=8w:СyH(cH5? įDNo1:Jx_9,%{<μەOkɹ`bqx;sOOILaNM&[쩔6J6SE<vH·tZB\snUVX i=R ɳ!vK bj1^^6,Լ;ºCetE}aX~gHI㺧`[q!2uH%ڔ}50w]enK"%(½"t:WȮ&Qdu/5 _Gmp2(~_=+Kxk{d֪.?\ KSx#{ӎvNgt%3ԗͯXr.Xw2m%ߘYvQ/D6uKﺅ!ЖđhꫫpN${eYpB*\H:8fx#>7:*;_@nLb D}R^x7S*|QPev% ~ -(NͧGB{wwc+I+*Po KsY1e˄?^Ph${ouo*m?tJ%kּHg;Mwizk˜Y%,^s,{׉0IsǵMh Qش81L:#[[V|Þ4̔Fk_=\vzǾ$2g |jWmMS sC[[UYKHvm ٗ/%6 M1\+`F3<*o&+,i쫝lMM$urT endstream endobj 309 0 obj << /Length1 1732 /Length2 9750 /Length3 0 /Length 10854 /Filter /FlateDecode >> stream xڍT-Kb)R݋ @`ݡ"bšS⥸kys9|s^svWZ, YG] `gbegDCAhuA.`G\@@M}Sq\^A>Avv';]@w%@J9:ym@oc# r[! hA $ tpeute`x6M+d M tɌmvӮh{h)(Ԝ@? `7VG2 CV`{@MV e!@w hG@L/z.`'++7EewYb)@]~' vYKGF<o#Oߔ ɺq^<+ <*ϳP=П9W | v{,P ?%Sx.o] ;>q}>?\q%e 玓tqz?ˋ< ? `c8BSV.hO'iloP6пs!o/?_y!Nll"m^l@vۿr_x؜ {o+_?Osܕs?7/ܤ*c?{Y-9ZֆTKzlLne0,a!1| ^sHڍ)C)Hs=rDKFiv+ڷ%?%QXw|}u?~Q-pvR/¿X īP1kT:C[h;KLe!Ga;ĞTLbB;zc;RIBCb@L72Gr"ѼOfa΢G\(oM{|lǔ֣_{ۇwPNeۤQbv.ў{G ևljHZcٞF懵ؐSfYJU!m+$R;\z;2Mqa_̡dZ)ׁLE#\u/+M%`-zh%d^tX'[}V|'|ftm3Q,FPvcKѮ~u^&i-dؔrX2{h/;M /eM< YT= '}m7W#ŝsx5*O(24EWS.{(U[dBbKvH>WPj,ԍLB5Tˏp+,ؤχ?H;^iTm%D,14$+ש()t4MXq>~k#O0?=x ьtW/T> ԘKGMuy}L/f2ВrHQ(e Rli{z2n7"\gO+(vT7ֲs,OiFtŌI00_6 . ~!il?)Xdw 6Dj?(P8[t &ïLU*1MR܏/ߙ೉z7-=* 1Gр'7;XG8KTu>l E/&10T02/[3ix'HЛb|1a8fʊFRJ6+-9SDNCf ALX!0l}*̀Lbc60ey)c7aY7l7힍oU"(oRug³ɂGUt.~HBղYd˜Lw*"zDh|'XZG*Dar4k'WNL[M_XZk:^jD})ң0SaYs=6MztLwL<"]N#kԦS/"FFH1/)K1TQgEh*oe1{Rct>/4_'5#[R,S)]L^#!UMg@aRAcZOcN,VIkC6k[<51Wَ :}{ռplEYd9Mh`%Ka@o[9':jvc3Mt1d.7{ g$=5uTPʱN}eUԦ@Tw wQ*B<&Ԯnþ/1҉,|erGUtbB޶o"֌r/(B 1-H *zq J@zod)/DxVf|%߭&,_K-H@XՈt"Q/;IX?(О.ժYr+(ON08)RNMֲΒ4ٶwpW tABk8N}U<5o_P^|qN ECkoan1_9uY dFP~9LD>l|y!*Ys%,HcsD+pK>֬ИOFk.'QՋ!zUQXX {!nJ4D߮[^"k )2jH-Q_*qfs#@]zңQL"ts | C 3B5lIJ?F yLpJK6t>m!+shKҧåLfԡO+rR/S4>3۳FA 4RG\N\#A AlrWHI8Օj@@{L}146u8nݩ';smVaY^Qzc02.:Nc9]J7jͷ> ;0;MẀκ)YZl[4}2q߱`eoQ&~b8#tYˁ8}w};ÉMb¹7W(2;. ,ڼ}G9uu^CWb$ ]Oŵ ɘ=E6up4fEJMD!GX4#喬Y#siPoPAvr\,Yc%>dl L!txBMQ֟@<(?tϜ`.$! ;Ĵ41~}OJBqlhN'kVwc[GނId3޵ݩLdu"ך Dm8J!~VC25dXoN]ŊZn= VRX6A>R:hyV)5/o3HpLvhnC7wX`JX@ IN9V$S~4aIa?3 mOizg 2Kͷqt~"GN;޻GcFB'@?M;,U5™rNGIeڎעƚlB -,׍(=+dֵ|ejN*c2n1s^.B tܺ(A^&HҼ9IGFS1 8%gY}a!NM*zYRWƂ1|?^9u'҃J1~ŌƁ9XG[ Ъ>ei;Ǒ25)>Uj:j4/wjh<سH%3bU7q4CI#~^B z:=tHӽ`Lzïs*y"FC;=jݸjŕ x][ udAz`lx@hF6$-@cGH;zEœ^N{m7-Qwܒ΃L^vV$y_iC[;N/WF?%3Yˏi(3L~ ؏^]w4N[6-n)G+"{D՛yRm&qķҔMNJ%DAQ:-pe#jȇ|pw6ְ'Z>AƭG%.(I?P[r,^~A(TX\.{e=Ϊ"Aؼ:-"zӻJT#cDp9C1<*N tUB;6}TrN6#ٻĖ.J ^LziSuzj.ʞ,+7DXT>cǸ%PLG1杌e KZVuEv~&sLzvK5+K#0cA7bhnE*JO Tw<B^#uVyf4178:Q> 1=c}IwQJ);G#^&SDOMH)s"4vc 'j;|;˦$rQ5ډȒ޸x*'M(8M+G o0VY( RV`o]%ƽ:i(_z}K3< <)㘵mɒmzxh~GJ?+C/Gg&]5+G~ly̠1+۪g*w,F~93sB&S|Umm\]omÿҢܟG)5tU.ï~ͷE Ń_BQf( L̠L_# N"O= g E}3VNxۯybFd8HX޹o8ے0'<]˫z6,.Tg1G-cYtZ1 ,$8~. ݩ<搾R6).DU"֍|d[zjqUe|b1+lA/3h#*|O`A(AܳU.6r+x*+a1kfO5Xf@Jywݞ nTzK"/ea,QUG8MħoJX m"5c8.,%,\ K\`SyBil0I`}&nT}i-vw._i֩Z#/}Fq%Oj UiP&=F!}EK37z+%?A::h\ >n<8 \Yg2c7d1fܒ~G^fya^k?Lh|C,@$渲y&#ɷJdMb}at xm[LG%d(&b4iF`bz.NRqcfa8xSD/jB\&ud}/_ ]%0*YRb jEU ߀qxܬvҼ.Bש,ahRaܢxFC k ճ+qNtUTV~I`fz iiAPd /Hjxނxǥ< dg_eHQRP5L}퐊z׶[MuEHfP&W87sEp&?!vhc}o*PCɺu -u@':ԛ7.TC }Ͼutɩφ8:둹؆ \VKPL a=t֚7b Jb/-kc&Rtpr4THR54qavN>fc tI bdH.+ aNp<42H"դ:V!s R/6Ms1殊r41(A?eޙ^HrYȔ2uR \9 iێGn<`5wեNmk,; . 28;|lO&^v&Uhj&/E- `~OJcDf=;e Cz#qoetO106%dBUAgA1pG|ܿG0{˩ֺ;mZrXy& {V{p }ݬj>xMks7A3qDž/筞ڲ{.sN}^HʥʶH7G9h0չ|b 5{iHrQqt{T6G]Tr*mQr=E(! =\._+V;^8O̰1swM2{%y:{k4 ;:-si]h' ~G,%i}?XƎv0uP(s#Cj,=ɽj9)xkj:Y n$Ǭ9]̩|H%Z,BjJ%-w}IOci.=4'_$!nimե-~ oWC[|l {0pmF֖_0,¶Vr] G*ĨFgej> A4&cr c]D&{IAX_jpYq) ɊK p1l𻪛 ҂o10NСUlh.ucN4CL[fÞ92":525hÚ0 yl$Co[kHQɒZ +NRq~U[.;Yj穲T]燯|^hJHvM0zOqw_zZg#jį ={mWR9ooesrDTȋ}JEU`>o0JnYB>Zg$͎B .0,\לwN(*8Q$6 Iғx I{VӖ/˨ऌH𻪗=ۀi0 Q 8Qy-=S QJ8ʭ`D{h//xtZ\^mULSEUfmR-5V9 `q5G}A{q0ْTlyN+J1'b"!i ٬m!B LIDQ,C%U"{ڂ?:+IDBjpm=EOď-vYvͰpyȪB]W#7-g# bk 1A~83k =yHF|ܧ{u7"9)d}N SJ(/uz4&qqYֻf[9N z^vփp /7FF#66m(!% #Vydc-=-h9(!͘1{pgt@^&Hf|Jk/oX%`ݸYP܏2-So9[&'dW5END'&<;4/g 92z42)[ѤpւJ ^r&Xk{S8-"'%QSp6 7(8KnU9gy} "-k/*¸,:˶-ᡐ*]r!ٶRQA,dN-ZM>yFU:j0eGcN_Yy'5.H,.1Yl8nD4qnNOLN]U&vva4{E7~6i 2uxYiri%d+-*[މ0&+"vԕi5/(j]ЍѬ7`[tYo8?66γGx,㇛.4*'ٲ^a$Dы [3ShXedǂu-+E2ߩ5cR%3yh zl6ϐ]wuF) 7ڳ41BLk%X@& endstream endobj 311 0 obj << /Length1 1379 /Length2 5945 /Length3 0 /Length 6881 /Filter /FlateDecode >> stream xڍWT컧S@QaF0 ƀnAB@B 4P@Ns=;g{ߧ{s06VqB:40X$P30@" hGR-a(o8!j(C83$Rr`i9 eD!p'@ySՐXee~T<`(8@Ю0\F(`ahB)ўr~~~"o$E_GLa0/ . L0w{!6C: ('pCao rtF0l ,;ܟ޿!P(.g; `/Ơ/C7!8߅C*&ߟ輡('[ 0&k Ԑ0ڛW}p :VXH?Dgg8'OQ NDH@ iY @]E7z~+ĸ<gXh,(+}Np(s#(Ü&c6 Я';w?濇+jc/*UU$ ,I`8@ww6?uHp s]` I_Qg=>|C cXm40'juf \n"[9P? p1Av {JqV)5Pӯ@P(7xM- Qs(__BPe=x\ֿ73H|ȶZ~˃ce3W>Ԥi5የ*i}};<`~#?MG_RL3vm<ws@07]` q!ݱ[-w'MVj(G,mJǁ9̜$hd04GǮ ]& Rm%X/%LWywpX3$eCcfQBzVR9E7Go!t=QX NJ#ƻ+# Jhy-xey}7FfiW ? )mZqX{-8}}e$~ dF*v'H>u2Ś샖ThzJZku;-FnZjZGYI2.OLH]] 4K/h&z$^d.{GX1{hW\5w~oͽvW59,=EkM4Dnǭۧa=[]<W*~eqy>/2{6Sr_6GJf )zu3` V"af~qnmYLgIBѫi{k}:}́k a$yy!!y^i1$xm4\zBSJ2 27ْ[Һ1лL FVne twS m+`'*& NL3>oh9+ )Min kfKD]ͧUczOG 0 ~eÇ(Њ/+Cr`) Ɏan]d|k ֙ΛGZN(V[g~Ay6ukFɎ j䬴C-ԥJD8yo0ί*Sbb"cQק~r{+MUYُ\k7.Α~L,d{!>܅*ak#e_΅ęk<2,#S; i1x}#&$by6W?>q ؠ#mVCڜ?VWl[D*#iXy;o Uzo#F}v{!IrFB -e: 6y$J!IxQaQAZީ0ѽ9AҗM#lsͭ3/ނKX,kilߞRTqu$Bs=I5PQ<4~ 6pqXy{-FM+~^T[bPRڐT]~E0qgb*Oa')7ɤ3z_C< LZw`VaFzmquzms8?+/RmS)-{nܩhSQT gSܙ .',uķlEOl}%ì(_x`sJPvKt>QI/OIq$$> ۾W5-*2m^Xo粎ꁪH,.]K2vS~7}jS >ן⥨ cJo4UG|Ч6 W\u;W4$ϖY^-A]ݑqɃU]u2ߨ2XQAwbd~э?y`ձàZ)[9|?CWKw-{-­̦Fv䩦݃8l:5'2&RaQ`NbUjxY @O?dHiƶޠWM:!$ՐJ)|rW#UZ}Bvuy#i!D=QwntHvu\Z3- /d AmrJǒ7~0͹>ʷ%-x b6/#=Q?XLNiavD^ V-4,2f?Ӿ;@ʥ8,s]ڒuxRoOm®-]R 0@XԡBf-7N!lcx\T𓗸 };toUP~*[<G. = )L)< ihˮߪ ݍ>$X"ՒȾP!NF[g7될[fbk׊_ċ#tJ]nXJEBzT^&tVQB ssX %=N$*(sPa[e)}lIAt/>%i,| /1ӱ)61фpL%g{3c^شbxOTҍ\weϙu*73|2h/4(FWnw8f|82;xckd|5}Y< ws K,fsTzUy^y:"5^4}ysvȌN8#92^ I`GwN%.iN7S֘Mm*2)6{;om?DwUEڡM fE6ff~B2#m }nb:m޳wuj$.㒉ğvM *GgŔggcP 4>$|Z! %V#}F'R2*;+K't<[B^cѥAXW]{!;]6_|":'%&_6XNOÚd1nzn׀cXKivWܸTloh'97G g'/dڏ)|ƅXӍ 4 ',rJ`m+|j}Tj_{ C}l)M*>"ٟc;V4T2 :LvZG E廒>&z+$c7SQP+p}w'4} S4\%=I%S| _j@{pЋI.rQ+p_ݼ!5{"` r v{BRL>J$b.G١>5^}l gc.}Cj69=Ssi* KT_@OJ1TlT!BkG(qcgws6#ԷK/\Xcއ)|ZliՎ r5(VTT!+sܸszv<pYiRг|P":eu?ʿ?L Y^IubKYvv1[s: m R:tLdNqMsr5zSM!Zw_!^ø\}jgu)MSzn[sMD<%ף.9WCԜ9HD*a{VTMQ#C韃* FYJM m^*Pj}}y;WۻU֞&Мj rt;_U,'J4$U>|:LjxZT C X-?zc@h^M;"p7N*)!A7`[ѢT*v>9}]aE^l$ T͋))) qYg3 #M9 0杦@[33s!V #P[/-LҞuU\Ajiq_!`zTbjpB\/at80n>BAyID A˗|1&&h.II]HB^BKrXșMLhg0/L|X1nam0.XSVz5* uG+[w{fo? endstream endobj 313 0 obj << /Length1 1535 /Length2 7645 /Length3 0 /Length 8658 /Filter /FlateDecode >> stream xڍtT]6%%] CHw LC7" tJJt7Hw)|SZ߷f{k.5py:"^^~n^^>l&&= ab:,\ur.fp@Bb@a1^^/_pg1 P@l&Y3V+6PTT;@ r[Y.v V. rW'v..b<<P7)'b!@n k/ (71nl&Znn + `+ q 9*4A?0w?~;[XY0O0` j.. /C ~ofXX~@AZ`qOv+g b+}aֲp(sA`zduuOeuam0k_]ya`'Wܟ*t  //(r8oQ_x\a. q\ri+WgE)3{@ ++W?*ܹF$&%qy9^a$\q>ND!z&5Ow#vӵύyV1ܯ4X\zR>N> m*LYN"xZ?ܻ=Bf˅TOpEGL1L&g@wd'::;$Sݏ6Z勾Z*CS<0"A=#g}hֻ0oy(iex zmipn4*JA΃JҨ-GH?^TYP.`ԌiB̻Nlǫ[Bۉғj|]ǎ{KIQuD~ ߋ w*b5EcH.SeŗV-6›SCf)s|x?wzp:N=HIhVD_yZRNIh6[Z'Z0는eW ךI6:Whj;BC jdIU{߿k7VF +-g;& ~-xbLHJ-V4,~:<-J<Ȩ:2P0Hyկc( h>q ?K?Xc*?R_sukNz!(c#jQ7o"+52 {֥ ".0z=u [V]u@~x:P΁Jb908.* WÜn' rGutWQHg ~8c 8Gl6Fϳwy*VSL2o$h~?Bdyv̐2y!:L%x{9׸].bE<'o)NՄP}ױe|+.v*c/U#hgnS1MAWU g6%m!O('%{(_x_r~OQ{9^^G}3I(ܱ@ƇѣOi0g#/WJ8:?uL(4tzm:Z@:Ct7ݾDD{5>D70>FdtqZ~l~9ߕм*Ua#D&R.ITz_lMK2B][pmT|ޮ' 57䫇^9ۛoƃYA_1G$[lp$O:wi,y*4MMZI/ER~s /Pkls5 j2E&/M@P~LehȩNڭ_ ^X1cbϻ1Eӗ8 jKƜ/fOeVy0`jsw^הy46}y*{t ]F#8ɈUw BS}ˠ%w|ם5#ಠgH4Ha.,@hDUʓ'm>FT$a"@#1]N'pwMt]cN@ak35 YMTv+ ~ds@M.C9T8o4FMQ; ᑠ lY9Nѓ/Xԙ (FU0VGJVR ']]GԟBNcs֧3]TKHzS:0TN3'8xV1rW,ZERRm<|fIWaʦE8koÈt $r)K1]<JU_>Fon&юs*匋kF(>Ilq@1s{3t߼RANOi5F:E#4iĂ+Cآ*}Q }g3ؼex7):̱akm{u`E oFb^V XC1M6r 0OڪWvj4HbgT r1AeMh~ ֖P(qJk >#aEf755{Y_ӀZ ,i=Q(g) eCKɛBaJii؇(IANGs7ː̇6?[V:%Rd&g&<Ǫp՟b/qv XtaS{%qSAR;Ajzws~muhM_@P^eȆGYr/^L E*Uڧ1~Y7jR?<[И (uy@PG/9ӓ׆`8 [k&wu6)䰶X􍾯5ۡCb~M]kJ-O6V}T_Ɋc6aF] Kbu&qo8&U3YoP!LQ[#q`N,}I -zDdK̔ߕKSGg+bk/DWޝz@~bSq*y땻KTF3B$mFrMАd, -.(nZ;B(;tj UL}[^>|Ŏʍ\kk6]x'όboڢXJ]n]vci|ܠ-RH~,L02^J#7obHqfu$^~ 2ad6O~F ѬKϧ*DxsICۉA˴i鬭y)]9fdό&#|m2]kYzi+}[#xfch Lu)E@zJf`5,%E'c-*$7\"yt)##d){0N|7IR|T|FK]^|r-P3lA:]<1MK0=Bf\>9`2;) +n|G2y@Zw]]KѪk,^񘘷<]'OѦO%JJji~>0զm(+M3PM$iXv4z!_?T >~Is :Yz0@#Jr)-K!G;3YpSV1cxөI06*~R5.AY?HT<RTReҤbs>bO0n5gcHf4tK(R;Ȑ+&Җc~RZ"^E./b3~t(%*'mיR%Ƨ&JmP;s Gn' ?ޣd//(2ʟUwE ;,᜘ .&UB^`s$Aܦ|3Sָ|Nۓ\\pq >WϛoLYƾƿGѫ`eq^5e#8Jq/aBr`7y|sjwpI5ъo?2*Qt e%[dp Ymf90aI*!tY IЂ|s"}ů;4'8NB\J`*<}.`|lycA}@<&%͟Pɫ|HȱE]{NE$h{{:>aHZ#Z˯ no=;qzk#qG†"?bYlf !_y'ʺIkiwyO?LȽl xvǹZrie AaưC$E3]+!> 2bmOqob†r(#ӂS|N}'}r3RAO$Z !hyeB=Voڟ>xy)z4$OvWt-8^Ϸ;Wflqj̱`էq(se2ZYm=<9U! CU*緵ݮ6" xq!.e({+ |reҥDsV_؛+/xw0O8Pa2x 9}aϮv<^KeW]بʑܼ$L(k!f s4IȘhֱ rZH'_mt>RQ%ޙetnDAX;ɧ"5q1I!S\TE`wmS cgsx6ފbIꌔÆGCۙTJRmb}&)!NeQdT"\Zv?4:koN5R%r'* ޸ Ҡ&vb ">3C緔v_.~(R)dd Af'G!J7GSz7rG.IyIW}-^*<ʟy3j$+-HF"k ¨;oVrԓʞt,H|Cg8\!h¤\c7*"Pjw؉L{ejɋc6>C5%|՘4q=[%Xˤ5}f0Qa_di R6%Ob$;fm>1@5W9a1Hm#WD3p4[~¬ WxbgmYы 2gjBgӉ7ng7j>yMEG˺aܘ}Bd!4[Ordh~ZyIy1#73縄k|?T%߿f}_9G|T捼??S endstream endobj 315 0 obj << /Length1 1647 /Length2 10174 /Length3 0 /Length 11238 /Filter /FlateDecode >> stream xڍT6, 9Cݡtҝ -ݝ84H H}ss[37-6$rqUl\贴n贺 W0" $=B!%w'7O_!/C@+:4lc_G%#SP;@B@7[SFK@j yW[77'!vvOOO6+F vh\A. +o5#16tZk[_bm'x8-A'wPwA2Vˀ88o߁?@KK   mtp>=`œ9IM\-]Nnl` ydY4qsE] dtjzB|:[!Vֿ)X;@ E-Dـ\3ei;ko'%oSNP'? \AT7BX- 0?џ S]^#pd4[VP4]AFAYW^_VnA+/t(/@ߵq'" 30;iA1/Ӈy(zh~?Z#o=m*i/ kkUAV`w*6CbKʁ@V`7Kۿ_=x 4 tOfi>u JRb s\| OV ?s `g@ݞ\OPKFvГ߈W AwVv? nT)?Sj@ΧDaDNO\uɖ..Oϟ%xWY/C-گk%I=Ya30wK.PRkBLYݒeX=hmDy)Y,Qk ֆ8Ie@Ķ߽n=B+\mF޵gWCyv 2]4kNqp,mE1+9*܉G DftXb_ 9\HhH .qG|vӔ|ˊW,zS>gI_eaʬkEC{s~Kѓ~\WތoBNPfVm"l-S.lYp0O\<'slM_ ;?HXQ;EeB[k;{ŗl#zfku6+zz?VM({#\fcƖn#!JNYcыp}NHD]C(jumFiOp*ۆ25Av" Obh 'Pq DU4o16 S_{Z_CQ)Q:ixd2#7'{ SQI S/<ƃ1"~([Q ì) '? ^vl*wV1 3 /7׼f4_"Z)~Q x$9y\<޷{)CUrFm=F;u ۊBqdRHoq>s/Ք*Z %Qc5Hqb2W %Θ3},^+YLTi]n4!qNR Am_KM g4F]բ0|Ȯ'nEUa3bQaJEEw HwB0og4-B׈!%3xv}Ķ\w@i6>H,Mk)'dpAMHN3]iv4'g?bM~nfQx=hIREٹ")՞N~4mGCg8I֦ WlR gD8SQ 6^:w19KuBlۅ=5/&i:I5EBӈsk>(mVq4j DR?@)kÍɈb{<Pm׽LZ7ZCnhQ<I謽:tNv`yabXm 'UXPeF+TL!6ekL5E|p59dַ_ߧu;mi{*yMh9=1ȏ޷4ZLOpڐ]b>xQ'ii]gm|x>N !6ǛjٱҌzbʉWI5=@ȂA`^rX"u׀w3Wh7bY ph]|R8DvٴN=o P }O6/ 4(-Z ǃΗoJJ]Ls#g/VE>ʂ>RwiHNfxUd]fzc= z YlMV od?:4]"ɗMxI˽WGAMK$/%WZZi-Ij} umMܑ<rPfM2f%…+)+[ WP) N})l`<>]b)3#b9*eY#ҹ6H)bI_FFca8x~ɉ1 CWeIVw,-EH'n' وHb|'fN5+B&ĈL',M 'v(,{4vQP2\0QCނ{hkBSJ De[Uܑ_.-]FX. ;ce0`c'4f旜 @~usֻoeqqwJ])oȱ!_K+A 4&uu9Gʫwͨ%v;V*q kݎ~=3J ݗ"< :佊>7i^ _ 3+d(W\R~y,fߑ'qL@<UXPq&FU-KnT+.gF:nwa ~-9הD(~a! ? ߞ^oFVLso x91S3k95~UfVggQ6: w Y`{=>&8Hqy(lgΤ?-#T.K⎁.{ǘrg䪅Beo5qL/C:M$'3P,rޜvz PFX yg- bF|(U6 ^q5{(RjjWs?&Y D/qE>/1l4<)J䯞K#Ma @cL+b@0 LbF}򂻍ݖlHKUdƔ&e,½- ML' h/ӡRXIڡ%_͡(7Ց;rR/U8 4jMYԕJ6b~L CmڼvI9JiCx:s$ _w=o 45ۦ= Xpj#*#桯"sƈD)V߶hdB΀z9v`O24ѹYHyri`ʪj5b)a%ѓ N5^bng3+zAz~bs@GjQ!o)[B]鹅{Fr bTX/ձ?JGC_xY }~1ΠrQ6"6` `y6j N|4`n@:prl ̜- uKC +g11=`AbUAvk$)Dq>"uRnL׸(}륵vY,I*og޿A*)-\t3͉^>p`wdm|lU/.8;79ͫyۂ`{>Nw@ٯYsSN(F(p}nܘZ XjpG;Nc:!CjTɡ@TThF:=y{ަ1on4,_[u LށloX[=1?֬/N.Đ]0gè,7]l^Qhy" 2z-g5x<ÝH%uHay/uOt)l ÕH2a/UE|`&x_l"yH5>*Bkn;x4GeK.TCr6ّ~ڕE.b񹭡zHW:g_II73ߢ~u(݈*NHݯww{-V}8Jo:B`6಄Tm;eݻ*= 8#x䡫jR4szkED DUsJP&F:ֱ 4%&Eujk!`ׂӖe's?eZ-ۘL۫z{%#W;y|ҭkUW?-Z^ާGN58H<cfΏ] Sf/9nу?<s{CP0qt.ttZthh/T$TmU WvFdS W`Ď$@j .( x䜷I;[>Y=AP dl5#]'ymwJL!Le.c B@*9}vwr"-rx'׌!诞׵&MJDD}VʮRg-Z"Z;,$N3E 1Sq\d my`)24EA-,{.L1Yi.ϔȽ4k;ɵdzRV"5[Ŧq,3ؽs0E %:&:vzxQQA}r-_\jVT<^&`1TS !%١%&)=Q㝎fePE0#ƌ&{N`);nRjȀ=9݋ȔӱDRVK-]U>4+vWՠbh~=wJF7'> !>S+ jȍwuZ7Ğ=LjXϼ,?v ~Pq*x}Z0~v8yQTVӛ+i*Zsq$3µV9mK>|ݒ?tU:ZsPcus .|b) ܍a)Ay <\I^Īhnz#..rN=-T[tKzA]"EyzY yp[5;^B*Hc;۬t2y&m9 mzxfa/l*bg M0IGOYS :]i'?@.<(JjZ$h~ 2_u(6LJ3{YJu7DG*pbWJ/})nUfiޑ>'VM6Lh #xo&_`BY cD?*݈ι_^ mk0 &Z-PNJV}GܹB+_֐ WƓZjVwTb*[/+3{Og3ڗ'tv%PՒӲhqj/,]q;y:+R\i.#RƸsWҧ^YWF|7~杳zQHl֬֠(zۢ-`\ج5ڏhL\K:ooF-"ɂ.K`CLBΘBV+<+o<'Kb{Oo1=6$;O]4 i>];N`:rk~3Œy"}/`c4rWv {u{NiQf(^!Y+.R`ú6>9 Z-.4N+sȵ>L05EOXD%=CFr8V[{;V僔W/i+d /En*hrhTwWG7jv+2Cr\𣰊D#?,W 3 ɅUQw$~E;\QNwoioe6gô2|6:dd;(>UxAZ5V" 8*\1ʫ=ɠQV}cگ%Kx@J1EgWy Xge/NbA JfR"N; !M=Ưi0NjjNn0+1R᭝${tH@񴆽|Q2P]9v@uG''p/KWLWb5p Q0ܼK%շ^}/.m~A1ӂ J|ם2L~[BVuT=Cw|mR5Y_$ h#s>ABo|jkd$m{0|>8}Hen/w3urowӸB'b%p_H VI&(Pq{H̛0O}n|Jh }h4z3%jrVN_9fF Yᜆx|rq@fTUI+% z=V[}R-z{zZ۠ԴK{0fZJ&by* b-W]%I4fi#c֌XnvJ2նg;k_uBi>j<˭4n#Kı:atTW16a&;V9?!\nC/@"zo&ȟ_dעW=.fSOk-gߣx0&l2f`s<[7 >_<,RUx篪,!M}cX' bd9/k MLvՔ`}YAR7i2/T&r`~[Qԭ(:4ᭋjTZFEBbw7fHY<ۭ9tXIz`s+S&RzQ ?KFkuG;Vm4s =RZXe!IK@cj,^;Q& _xWk7$w7Zn(kcI᥈gqK}al1t/@4U'<>Ĺ=Dh+m,K#@M>?#s$"WA9;:e];$ʥ+Pe_@|uN TꐑvG`' EӾ)nu5)ks`-u?=ZV xl{ӳc(xؗj8$towOZBaVF4jZ#؉fp;-e̻0mV(iZmWHT]_)1Lw>Fcu7Qrz*НڠnyPcPꨏ"Zk* @uhBߤy /XX=ђA2>7 endstream endobj 317 0 obj << /Length1 2687 /Length2 17610 /Length3 0 /Length 19140 /Filter /FlateDecode >> stream xڌst;iƜm۶3mAc6Nvc'm4j9{5ke5!'VT27۹13rDTdUU,䪖.6ru2"N@#M$*gov0ع8̌\wYv@gr{O'Ks PP8hV,MrF.@[G#%LPZ8p30:;S-],@gWy#[#T-,a؛9 jg tTd @e<&zG/Cv+:yZڙ,mqYzZ_F6 }#7#K#cąF3_Y2eTh1;S{[[3_Z:M@dvv޿_:0Y:D#"!]l@ z:f2E`04܀'WELLSK1uhM@4Lƿ>͙o ../#No=ť:f;-hd0(egf' Pƃ?C_(o.# ][kc oL66KPW%adki`D*vWTnM-]m/W,Bv栁gel,n4Ut1{xK;_M@k! j, h׫_0rr2D`3 @@ogR2;!Zv6_;A70F߈ /`0FL߈ ylR<ּ[/cU:rab8ܭ;a>AHFs#]QN_1GcxI^iLcLOkE`xmQT. m,d)f{/XT||V*FAj:{) =BGW6GH$El!>T'^̰<)p%)cP37}qx}x煤o.[(ρN s2F:>4ӔcG2ۋ~b:LFI &nzڗUaSr3L4^g3 nS,zAB8d| BzK8椩(G;LHsྭڽ`oeB㔞PU&4PMtuqM_"Q5S9 '5JWŤ/;nғbPğWC^MaV!4cC~@%“V4rK]ɇÆp&פ1;N 8S /Ƶoꦿ:V͆eN?a;W .}s͑ӻأhswmHeE!V=Dt~uo1_7D<6A]k'pH2i${DzN+HHuv90԰֞'=` nlFKw"Я%7ͣGE4u)zB7U-)MʂEs"u iqֳu(G_T_䅛3?y>5{¼s ;lMylݱ}ԡ8+߸etFcЅ)כ>MuJaq-NYG'B7Q3%q˄hJmAZŨ1!FXJ"ɛ$ Xye:&`&fA9^RRP3u]%.D;"*ONYϿV82)%Qw_5VD )h@c%3at2i|tb"յKW 8`֮hB,nl1j77XPBy<݌MVF!`KͿ d,\XipR;l_RN#Ξ{O))W}d̥F$HݣP|ϵvcjعM"Gq&!̙6rDl]1Dzcҥlh L9s mp)dh 6  QBj7?=K  A֋g Iܴؕ>&(Qbyoҥm0M;F5ܛ"7d$8iÔ\(=TCaof#1z!@܄Er;Yb*o-mp MDy':Z%l11#̷O:)I?>L~~/ +ATWn\|s <+Qr^º{0lrEw4;f4M\Ss!9X84X!G!?\G F&Mj,inKs%Ep4ӳmHkSmBOw14kw.P8Qp!B#}ȫW(D`P e'gk {\VѼ37f{q =!eXQoR0-$-ba`6p&5z|kD% Oq?'҆|c\z#Yҍ^!A˝-dhj T܇'Nq^5d\7.~qyLNO޲u#[kpPDiD*?t|5;KVd,F+EE˺+Z+~l o$z {]I6l8q?Q; t-rz`V4'vP{,G't 6Q$WUg^N}$xD`t(׽܏Rk{Rgs4&_ 9^]b"_F!u-'ʘ)GKv%C.O cI,?p ^{e-45ǁ{O_+U2''Σ۪߮u:]QoY5δo`TOI\9lL<Y`i_dmWYՂk?ƴE*|ƅg_YJ>p2B6LB~@xT6} $U`bj6zU<޹Cs)Fiߤt뫀 z8݇y(Xp'4nT(-B!akbU C$h6]y3H ː`OvƢ/BM} 7 mb c}ۃQu3:Kfg{֏& >@gayN|?3zFҤc4r:]fi[T0+t8:M7u:m7O;@ŵl)9MXzS$`.kD 21(k.|HHh#uԭr`'գ>PķD2^ahN$therL &Of(vukO96EUܞM*D̢=ef7dGx`޺ԚW\74'B t<'0lߨIN{imxlF^2dp8` 8Noyf hbu=НζGu/'Dkݲ9Pi dblnl\6 kc)唺{|P;.ébJҭ* I USc/|N]ٜSKW#Z8G3j7tFj֊>Ʃ;xHylf<a ʂBSu Stpf˞&&w1!82ب64*ܧF7s[6j&)7C T714Lŗc~woe #] S׿A~=b &-3.j(CTٽ )\IݟxXLƀRL/LjBd_:"*9|_i1*_`ĕ!A)0͐ȈLx=a,qzX{'lYLS CHRh77gM}D\/a}{L[#ِnn_ ~bLg*C9m!$W=#'yIEos%M6'٘SS$ ɀvMcA'"ꪹKFX߲T="2A;5db8{Llɺ^AlTp~(]8'WC͗;gN{TƉ@2=i,.(+jgJJ` ~X:[ʱ kc+t|wsM;"~n b~iߒ7%BZ:HwGpJgP5z >YU DuUuh'R<E_7A!72`2˛S–²8˳FAH}&#nCxhg͂r yҰ69e4߬;RWg[PooA 'BzO!g,%fDq"9rą*+a\Bعoi2'BPҙ*1~7eƶ*G:QME)j콗ٚs/:L3Xg:GhEVg*чW|(rddNjvk:$ ib鷹'_`  y?_XGQCLaWJ`17+WYBpT*r_r= )*z=l^| _~Ė*)sBׅޏϬI+ܶ=y,'=3=Qty}iL!?y<4f*Cڶ׏I<_a*B\azBj{ < B>i}kjύ3.*^7$yg,|v-p=4KJw>H|`$MmӴ-`$rgV-Ӛm Bplqh4)HhMGMaC*Mt SLs2xl%0ՙ,.K~F/}?+T 7bfҜ7ʸQ#-j7HƟ([ JGpavEU;'nuס5:o\|Sxh4Db8^~)qV@PCFA9?իrSz'5CkN!~ :F:9&;C>pD]\oo bxdҬ~̡̒! $mڻ,$cvpUS\Fn-X-X:慎1rSsH]"]uD~V'Cx|vG?@5Mh ޘw WliY'*B4cna;PLaP:ŠHNhkGk4XOAEj2Ub6bMoiWҚwZ(*z,8$;G+P2"JT89^|ϽtIAON=\f+\@]R{T Tq"URm$q{ @Yk|mwolpjkY^'1 'Ahjf#OʡYק; iv#{9X.$00S<}#f=X+7qͯO{NEPO|Πy*qnYga` b+qɠ_ykڏABdVf15$:M/}3}p:|Ɂs@8f q.;/ P&!- qkYv9K3 ,.凹Eu}^}-j|=_70}Y(P3x2 \Jw() ?;Es'Y}|S;3袅 g!b'L"G@\hrVZ䂺4;InC]fQgGKcmиq;HR:q486紓K䆁֞ů eDzuQ4bT3&tВME)e׺sZts(&8bFG.yJ5\8{-),I}+s&דQ0r:\Hޭm҉-=!J엮={Y1: 2d9ټs1y>R3-LX3h +Z2Ԁb;ͫ",qZ?2lH7i47WUK #8e1"*VM\-ʣc> ŰI6H^;~Э_~V$SƠ S}gD6;U^e#t#ެW=R-gt~Y֬q\1s@avcUw4 lP mGaeK׽uʦ6b<8'Gs'okFa[ g -ox"; ߤ4 @-|'ċé LXHLF(ˢO1XܺN%֓ͯ'm8ꠉq2[,Ks:ooZ˼AsɩJL`6}⻓ru8'M&t /eUe$!tMD.aVc9+4!L@aKP}pOBGs+3a\;' pEfb,(e$s{ Ssg^&ٱvDY,>OM1R01 flOYDž;W9r>|^ngbzŏUyuD>!$3E 5pNQZT+;}O Yc=JI$a kY|4cST LMt>r/CG^(xz]:L/F mcs`x)/L)rdT tzs_ZOc.D㟷֗*3Ѣ$">L]H_dx󊒟P|gh#V]_e6?R/,dXy3I G] vk)yDFM[ A6v"t{O>]@p~T8fԲ@Fy7=L0*=ۛ=2Ա }Q+ (?ԋC` G:cbt@)" C*2\ J=&2Ě@ t ڐ*(3=yAK&HE3ЊO _%⮭@:!4̨5JOL&7 $~#w5jz(ƳgE;ִTA/8rE7+<ˆf“qr7‚Pcۃn6vl@ycehFӲI:\*_͝v͈ښ8٤ң`?NFтfnK_ܤ&T!@n=.YaRrsWl4Zf)Xg#[ u"g%Rja2meZP.W2zBs22]:Kj:3T*A`0o g\=,ǟ@[ --' $ϴ⥋X,?X+(@/]b?KF`j~>:4V|#] ]Uz{K~MKO|!1Mu@ 5ܯYj)viϞK|*){eY8_0c Ph[{n6e`:`Spsd~S!x 7sd&?$AcWJ Jr&VD9[X0{F||zHԤ;I7zMq[OQ3$k"mKWʻE*Ƅ'4깔_v fwa_C=7%dGde\pdp1pa6p&ţ\sdtϠ݀[ߦ[x-?ܹ!nmҠ&6Ù\U/&l *>Ld+'ʺ7Oh? \eB\$Vu55EZm XQ[j9 }g~eB3} bG"#I>l U0.)ǹT(F Z]wJ@$gQIo(S&+Ѩ,i>C`cFOJW pq?T=Dw*N 4Jvʊ ֓-ᔖ`~D}1e .o5&}?l2AetV#yyC.Yd#iFӋ*'\Ǽ>;4'%]¾X Ϡ)Yy?.I`p@E᫁iq2К϶n5=X<flu;HLj>Aa<+0 Oܞ];|PXW޴UEQ5&Kt70Z.w&}ڏ,fnP4?YqsAt*rQ<>L4>Z3U%x 卂)g 57?K4]佌Z=g(oՎ}b,!G2\J~wa0벍xn kDHx $(V#DY3&ڻl Ha\bZ ,HH,p>sN!gr+j<:tKKE1,cxHJϭ>~[UhxۡZ-Ɖg{bbڊn'6 nT%ulW"FTڮ$Z!nO#Y*~c`Y(l8IJ1i3x.'L['Ba 8=p^ _"|0T47q5.|>9&3F:56}Tw3 ``l[sbCS܄R]73. $hjՁͯ,Eo(`*6Zu${8%Ue;ȶyHsܙ ` sSyl<$ewaqtc|ivњ#kɦh.O`, 4ʲSԍWQ@l5^+Ш=3ck ݤ4t΋7?:o:LL5_:P֛\ibܦQ$yh&Қb`ጌ9:8l]!30H2Ysm(z ]١vXa/lH ,^ hȫZeBS6d/fgk:_y񣌺T$ 4/mv(6)4(yl8$ de}mr2J.8 &F]_$GzԘx|+~uՖwUSlyP)R YQPrprtD-taSRĺ[3Ч ؏a"c\v|[Ԫ'CJ{v9;t }>U2{Ο7ܷC $sVhJ#埱eͬ;-՗BQ_St-O61G6:i}$zpD*598d-KAiH"++>;R{1먿LvSawe @n iuGA+ 8k=WkWm#4 #xT¦:b@SdyBϦO]r!6DqK;N 9}e@KdY<݇bkhŹ I[DB)U<-A8zw%JA$ Xd@?FzJ enbw8 7{{qynk&XV*8;G4F̫$mljH!lu8Eu7-~k4K\HO8AWs2HvY#/S)5=ae9_!Ӳ'#ΡXjH8R?|A4SҐ meԅ܀'Y[1):<'S,1uMI+oR)mҹiёzS@z8;HjB-St9}eoY(H& H&u^FF[{SK.`=s6ՙRė*n};7Y8ltcYGկP6@T&hxRhxcmpd ̞ј;dGFã94m="F wV 4^x1T6B2^u[]>Q8Ne=ҁq+'Q/?&2Fχ"$NFo UEdR 8<ȡ!ɝZ[V|b(A0[[pBK݁& 'I$HBo1%I:$aVk:'6L+$1b6z'0|_3!S8&tx-@V0N#CB,4к'%ls4O6ſDJvd;2*C;Eh{ $TndOܯ3E^BJr-~,:=Waw #;N\Wnz[zNLy#rTOO2qe5Jh-/!}k_'bo>L}G*X?ҭ Lj96voa-M?~rπ|+;ђVX %,}2RPيj+Nt[xu=Nr;ok؊Ձ!z@ %! t|(SX;9Sv{OjxƤݲM ws!X`|5nR/@^c7As@Crh o\`+T:9v7Ӹ}÷XuRwqwg|ףĆ!nF0'U"Pmd>sUsK1wzmr*ÕgB<.tty&ZYsD$~/s2cWf9gմzĸ_MbDf8G o'ė9 I\rd^a5`PY30 V P@6E,Y*X(!LWk37}\G/U/ٛ[\]`(}U˅§ޝgoMHWyaVDG=f ( !kkשm* ;!m:8&'(PiU',"9ȩu-@z*:2 `%<50Esy`i`659F-,`9'AQX+K@%j8?82̓PGfL](C"fb"mk;(Պlǝ\"v[?!ahR{ʯhnr44\RQQ_8i7 IuRۦ^).TJ>g;'&Ƭ@E-^Q>xOKh{5ߗ90~ᏤPOJa~&ijS[lv*3jZ㰌hOQ?< J(khgW tsة~|קԘC&:OrI:#7ӁE=ދj^%mZX&|gáIIߤgn<,7;\viB L izt-c\5;,)1R\P쬔xy Yʓ<ܔW-F/$Xo*zU8G2 <DVȅΪ$>P>joBbC ʴ!V޽gYZ/KPP$/QVrQݓ.)2t]unWZ dCLK2~@%R)yGf*NSθR2᳟Wr҂Hv?<^m8M`ycIiy%a$= `HoSڟ;:ZcY迷&DU -+a)}A&(8[SsFƀ+!2P@dO(=)6Ū]EI[o*]r&#uqIj1vV@-\s`` eh3L{s W9$fwyDϯond{n zM}/\cnaL yV}oǿ[[2F.Ov:yNV1BHΌy@l\->2ECRƫGU`Z9"ihJиe1JUQ$J;os#hp-1q(BG!]F~Nv'O0ygNIOeпy[vb݀ԙR-o`pf3ҍm X0ҐQ1'z[l-BxiU@^vl\287LV[=:LgmR'z1[ȕv|>/䇫9GaFʮFUjy<ޤ~Õo';;c$R1\@8u5/JJyv.q3m|:*:FHDضbl*Enk9~U.ج6 AɗJQbm>RҴ9v'ҍ@~P|'?D!ӂYjׂJͤχ ..t1~مޛCɄjv-Iyvo~‰ѨP2PЦ'rQwl[X'wQh>\LJZn G eP~jIIJ֦ݦd[3gm=\Rc6Zmz{*Gќ/)80sǎ3ymG,r&"pE4OrТ/R$ 㢍s\kE=y=nOtGBmZNV ˆ,(%hRVMFoKNl)GWʟ܆DV9RG]E;Ӑ, IBkV;l+ FObѶN%Ԓ2<yRE"rAO)85 P2OCXZ[njc./$Rx %&0%nPiwc!Q,Ʈe1Y¶\'?nhOһ9LyX>ض{ TKoe8Ή?ؗy9U8Ado>\VEaKNT<iD393b<\Jŵ;݉0 Lw(A/iv zPJAMR{;~:!u`Cޚ&, <7 ~ClQJFsnMsŊ8LDS:H)ؓtºO3LGQLi) IMz-K4`E$8^99Fk 9DƎ9e#F(Ai1 h56h鸞ig.]6 ^kxkdӸM㟺~8iOVd.]"$j~&[:u\E4%g1asZQd +XaZ"9%]┙%Ok1knu;n~HT]|YDیVi.v,*t`3d-=5MHdlw%!BО<~+X*4ǻ- 2PogQ#(G u>-rTߨ_u ~8 gZs+3SW|߶ŝI,ͭ3t2x˹!=⃛>SYSNOkObRVO눺ecCz,ZQL+vi΋A3>3c9g5,uZ7Yi5)쀋nB|ϔڤj4@|9Ք4I@7 tv 1{(n¡btG@FKV3*pg\F?>q* b_Kb!+#$~,iAv"]L+S"dMT;݌E 4jϬ)ީ$L-k~LJʯ̷WWt3 \ UBV]B#GIF"(zZ{SKr Býؠ.Z|ʂ+ʕKD&ƍ‡xS3jx,̜dyd$kܟߪ"x- Hu_k@RޏH HksQ -|f 3RT7fݡ3 te: AxuW,PIa4ǽq-A$98z#isZA:*yb3ҞYMw^?۔ t4#x]B!Uڈqr9겑ʴ?^<9]+k 2,k,B6TqvUO_7`gXLf3(9+PfyoZ_][K:XZV&os\P }qO}k`' endstream endobj 319 0 obj << /Length1 1392 /Length2 5960 /Length3 0 /Length 6901 /Filter /FlateDecode >> stream xڍwT6R HC7 tK 1%  ݒJI H R"ݝ7sk}ߚf{k}_{YkXxdm%8 5A$  ౰Cΐx,w;DHPT=~A_D_T@ pw @ 4xU8 cC:?6(p@ 0₪hv6P)إHW >>///^ n/ xA.q(`jx,CnCj!P!0[;詨Z_`J'W"(w0 @ah)"f vFQ`O0l:P(!lܡH/#߯46+l..~ Pw >|{>Aavhz=A< * 0(޿m$ @ x8* eFqsv({B$?<P$` euF P~}d0[8#S5R5C_N997#qqq@TXg5o`GByT&o٠[_Y)y8;`j=(ihQ75 P (H(B Ն"mڢJ A7%:'[oTmO@X}@ Q*x^nGBkb/?x4{ MOm$kZϫeixV>b/,E'F #Y9x4&ge[A9=U12Où{>m֙˦~M<,P "Ue|,1K*'|*_$7ލ7{tNNNv'F46F[ ɻM8bp%ּ7Ҿ{CBStlmzOc汔L_#09W+ ȯưSX}DI7|XYáƖ/L񒎹8,$2t=뺸{PyQ`!!-~,:p( ݾwQ,(F[} beAH -<ۮ6 OO,. D[{Wl|h0>|>d| }g\nc{viQZ]rFF i}|`*+ZHdU=.͍8э\]V{GʂN! 'QX,V\I~/B#5-w-6s ;Z486;6W}Z3yZ?{8V?:vnuVJZ-MƤ'p4 !)νNwz 6[w??]j6=QKkk8HJNoD+Gk }ZZ6XBHɹ1$[qK 9BaVu`X1K&(`+hI2|Ò!*#k&z*BZkG5#uZY%c7LG22"mPQeܮޠEiN8M:^M<QGi/̴OAsxG#?^adE#Ь>G xޯ19ݧ~5Ժ0G@ofqID@x_~['z|GYKr p3ruTOzKMX]sEkmh#H¥M|lvHa2C1@vY@LL2_A%B눂4 )덆e_ ឯHRԐejaPH@F9q1)nDzpίjzIEwCNĴ^Hsn="H7h %h5';I%?_sQ,%P"=!{;!{МT6m(F^- &U+lYBIB@þh𲍆 \5TQXE*穑l2'WDĒ\<57cqݟ•82=c)!H 7weaR/qͽxU) ls PwIRs#Yh>=lmZzQlv8eZm{(:AU/? MeIa;'3>Ʒ~mJ1V'؎ޭHSբOjT)#7Cy$2]kIڻ}na9׉f ZjO_E|<p.HQPgx冷=mYz\B%)ܛ+eså/QӘ Da1{8TIu/I(0#1p: l>O|TL*dD#l\!FwbZ(Tj ^txOӧáP&HW$mh3ģ3 >BXK =9z8`g(38mv>X.O0BOV_P zhݭo;]2FqX{kqQ Wwd7{k>NLopv/DH\߿樘nG^lV-)@p[3+tvʣܽ0ûK3Ǣ!>hzJ]hEǧ肫\D{HAx'; ۩Ө"M6B׻$gDhnxà/ت×aLznqr'ȌiIg7AX}N=[m(7a-~ΩʞxMFv+UÊ woZ, `Xo3kkX^OA4DhǒӪ`CI,_ ءUU+ ;9CQtZ)R_w( n}^r (ptnd~R(JL]6"xE.xqX"@ϪWN>ONZu„%[ OI"N7m-ʰSd1~w[ ы:/ Tf( sk}}F'm*_?r ]8e˕JtK@@B_jU]t~kwӾ|2p-.Ȯ J8@d(ui<Ůbe9/^9ǨH8<Թjnyqv~]ꡒ k{?OJ\4eBk>Dfz=> M$?=soPgeICk44P)ew+i) oe}mݘrq{̏ڂ꧿)mfƩr.ιqK_*[װ&GXY011c Va^!H}>O5B6;еتXx<Uf,]ږE8k7?x_te}4YzbGA 䩺F,7}ZRWM?7Hʨt͓UG'kX#44qLuܐ1> Vk ^OW\ 4Z|ƂB> N?p DŽQran cC硧BL@FC%XP< ]8׍͔@﹛=e;dk!w 9{ b`)$Pѽ!s^/W,&<ڡTy}u<< +iNxn+'Kol7"IwޙU,wUɟRt|ʚ?OmIzIE'#"DyɸfG-%v`S7ITSAдںlr^W7y+{QdA*Z9_'0yS/6ux9K$ҏҰ o8tGf龉Jڀ„xf}me<1%1*i8]c@)ĈmM ~ݰzI{ !CK=\_9}`]+Md R r Jv>a4@xk =KNto2{rBӭ7&_oIO9NGiMUbRZMwe"m?BT\y\}R%ILl:UjTtmqxF<.d^|lh/N`/zIG,R*S78)@GS.s'lU6ۻ=[9+|y ҉} Vy{3y=`T9,_li0Y8V! cƜ>C竄90`fJ; Le;>7be*3zJB#"er,zynU|ӈ ȮwD1^4<π69BC6^ٙ9M>bO}mrzީNve^ 3 3-_+DI=_K$] M_ :PvW͎ Y$"!c 4ho̚TQSmAG3å= P`jAA nrY];P*z8M"h"h>^hTo:Fʓf+;wZ8L N,F<^d)-havʣ1q50U.},^ʟJtz~9˳NUw6q'݄21y@6{U`vA?W`Ͱ(7F5-+ީ5n3qbVe7q'@-g#uG0Hd3B6 VšO?~Jy|X^NA9D~Cȣ IHe>kεOς̖X?<9d纎^UѢS|wEt3 4Td>{A1zc3hv?IrogXab#5-Yҿ) @%JA*wL\TM0:.?v=V :yI/d͒ &/ Aw5ghЦF'|*zHmixɂGLI^cʝU-Î)%m/̚vۦRk;@6f.,¬6&ꚩD$UV)J}htʋwLG&D~XXml0: b8 VOK^?YxG]lǕp^v.1y mҴollʹu}٦q04m&>3[[ecM$ۛ}Ev| 2˸}BȻKGD=3,u?MnxԂP9%'g'%(&؞pЍhm6 b}(W$KW9ItSFw֝%a3?+}vp2-Hq:0,7w2`79ޗx,CE\.-r%}s3kwoA-S?Wu.CG U)Ptycد>  {#n/YY^ugUtv _Zoѻ1o9>~i1JhV #ڈrrj:zlD Rq2&\3ABLa؏h'~/Eo{AM-Ķh@:bˆ}Ws8mLXx80Y:tvN/6Ԝt"^pTږ6?v,dg,C_#)"%}*&sė)OQ'.){NLn%$QۺUP[suäOM*~ͻ!R];f CPʕFhL%—I9u[mN0C~GGz۩ircK\}x|7y3& K36H B"6^-Q[>o7V FŹ|dH L鷝NsvvX%+*pM޶Oqr TY [[b endstream endobj 321 0 obj << /Length1 1507 /Length2 7034 /Length3 0 /Length 8050 /Filter /FlateDecode >> stream xڍT[64H#-8 Ctw#] 1tt ( %%Rt =}k֚yu׾}{f -!ܼb9 =c /Iq n8L<$&o@:jaU( xy|;֞[7@2]| d 6PTTw8@Y3" Ѓ `ϿR>q@ \xxݹnl/ vym(4q2 v/k70 @! 0z*-0/g8OD`kb v(΍Fpapd5jmtuk?w+ `rpgg0 k70y><{^A`vhz `?>H?=7ȁW}oo!C@\?wkO0oÿW@ Bl#a_kd S^_̑ à>qbU ee?1½~\|.Q!^ oTgwQfEyz ?cwM8R`o+ Bwew[;C>5`[ZU#u +B/- d (ֆC~;(^!G䄼[ܑ-m#'u` XY"\ Y{8G CH; x4AW@^>5 ! Կq>^;g(?΃OٔY(Tmr1yTE'`u,Ԙ^~l 2Iye3O ~~%+ s{IT[Mqc1'W G)m=pCZD콾ݤw* jNK V mH \<'@Tq_;E1Z~U&*B Ҹx#k<r,OͭY (0cޘM1{+P#KE0#mə7H>KDBgcݖQҶ@-Z&-URub]yH 6VS/s~w8f\Vpٝ0aZcII@z/K9,"Ɋ6K꫑ ϤYz =paOy %m{akdAch:NqdX[x=~%̗i&g8Jxu}_} wX>Y藕.6;p5g"w泲^c9f捴9N$F-FZԍ] tI|,valW4ӏvfୡcN͉Ei ܛûy-زP*'C vn<,PqeOd% =aKYUY m Ϧ.Hy0Ǹg9?ܻ̆-Y6g>k90/z@i_|MUiqs|0Ӻ,|GjQMt JcYuN4Q`}@rӝHs&t-^Tg9@'COޠ"N-?4Hq:N놛W~ʱUb` *ߩM)aYgx ;E,[4\͍xPxhL'4 x#ϪMn D&@#g 19EZԖ2aq/}ZsZjZqIabҰNN^!J^J}5"C'e 3{w@qɎl@]W^U֏| LD27(_aeT:[-dU>/HS>z>"9L|Oחv-Yc`oꂖ| F-WSpAI(x+?ϼX C]úl8{TZ Uyw-@KH76ʗgqwZ$ܿ9Z݀5^j3J쨺kT M2hGm)~F!3h`pYB]qHJ+e 0vi!n(v.P IB{-2Y$iG?;.yKkɨ0UYBWK=Q_-( >D`KRfF C4vmbVyܱ@۱sX3W%*~cr٨<4n_sybCbgFǧ˕K2ޡ)OF`8|r0V4V?IWұ %型z1޳Wnx͕389Ӄ}nb27: 7].醱ܓQ}Na;P_TQ1)KQvk=벧:_|g(U6/.GuFyo5mc..ՊjW2=ܴfla°DثiľulKeڡő&3[';sFM~IQc 1RA]2ld]49Ȇ;_7ߖJܛ>JwtBRzkZ|,r_Ƀkǘ bv]C.o%~f#jkbglnrػspvK;V  |K>JnXxHGfy0 @MI9rz ]Oiy+3_CS]WY9#+I#iaq(9ӟ ӆr;W/D>8Q&a9"TeΗhtR2{ g/꧸v(N['wHu>`,tVc2ۙ|a  }uN~jvxB3tʃ-ULŖ72aw\}^xuڊ_9 Q }]./wݶlG##SG{-q:J<:+k+b#2/N'؝}8Į:kQL!7v|Ebj(3wZDځ府Yz z]lBY뜢- u̍×r[(&u^~Im-5Wy9^T<ϨUfpЪ6Q6m&`Md׋;avp%B|;%"3,V嚱2 0aUyЯ+lPx*%bteSCj)S,+L=Jj uM*ÖQr+v88OfScoBY s,mktq0 C>k9Z=T_֟zv-=՘YᗚO+85.JgDF᲏qKHTĥ_Gs'G00|,1esw6Y+&-X!#Qb#hߎ觑q-4^ݜ3;\zV,@^x( |<NzY/-dz}\`TjX+O"w 6&9DzL8/LŔ^ȉו0o|9׍'y AB:JwU]71uo|Rco 0G"3bk:c>)o.eTcjxn:R J6V'q~ѧϴ c_WvPLf58>}"] xDxL#hUlP+u,b$KN->uO6!tl~e*`i@JG-sSܔh3>Q۹mjOYGB'ސ`q3TܨY[rf-&ՃH]H3 89} qzzTTX֎:bT?I*K.{.֊nUe`g&LƮU.Q2-:ppBtM=:}M4bNۯ|O8Љ{kL'rkT ʴ_3i$|G7,xbE̚Q7lLj* pR{**iP@4yxΏlRXQPR0q7pȔlF=!5ޘm.(Dz)K9 {ܽH9f؁CfIg(Μ+Sz\OMHU)Y\Kn.{inE3^i jo{ZNF+ЫGO0XlM}w孵S`was8)ʍlh}?ٳ".qIkZ-UKWCybyXtSrgIMޙ^8;i)6`02o*HE7[y`zZ4i~ FaP0v[ 9Fxzϊy${X>xoːRʆc[+|ZEtCQUw]]aHnP^,PW: B~Juꇍ|"ҞzB;{؏tϽd'nn[rˡ96͵*>f #.nNx1{]/2/}L!l;<.W+] |  d+Sj%2?oD鼥>?у;_}izO LO1Igw~;Mω+I:y:m ˹&ZK^Ǥض*v@ ITuf#Pf<9Lni ңH{&@FiNwcsZ6AIKnbU>Z5f+ezO%tB B_|vF=!\稏?_Hޥ#7m6 L2qG6|0+*o!bLKY #fWITG dć:j^8p~c^|A| H{T*o(SdyOArV3` %1RI !nxk?x/w;H.J$M_+dӀ[]\_%"lpe蜙25':QF˳y޾ꮊP1ʠh4P/*f<&l*W><`Y(=; |y=0N3m^S"1JZ%ڨ.VatY_M/cl/6g/f!8aѱP\"y-DARaJä Y}WeË> stream xڍvTSk.ҫ4!${oR ! $"("(](MAQ{׺w333{m^.#SQe(BbE@<@UJIA q ^^38 QHPE XM QH,K˃eA 8$7AP>B0(wŗ (Ɉ(#`h# Ї`]`|EGaqJ!źˋy{{! v)(c]&0 ~@?̀38a CbH( j a?`?_gIWDp`# AHg 0b}" qà/ 9l E㈆c1@ E_i𧬎?58?v؟κ"QHNp$ 9 V 7QcsaR 9iiIqt 2Nx @`,^Q( p9ÑdǛaN>^{`xyAQH7?474?>OT *')@FV,7V#ItBP4R_#w^0?ʷI7d+K! O7n ApJB C-a&Y{"۫CW(Xcc4>0GG_ 0_|_>9?*|~`w]u# kĥ45&.% -oCx'W[%b 3/'ſ 8z|׿G9RLOB׆(y. /E&XuGHa>fjyC+M= gvCg ܬň09"D8FVP~@q) t}~Rb boHL`l%|~kд:ibKQ7l*}-jyàJ䌰E疗PQ*(W|r5a\RI*ZBZa+Y.^*h%9Y-;>G_MVmrQ6Y( %u EQӴ9aOT(%,wF{If"02kGY8H1̣,#mFP6yO=. z{ZDGYp;?->'@qa8bWb~rm c+7zR\[Z9upx}mS~&+n9K)HzZ=d"ݣ0O #fzUv؍e u jƞʾ丮VHhTM ,=H$d3~2pǧ: #ۗb(DjHnwh2~һHZV[9u}X=K5L0Pi !X~Pdܦe/J*<'`Y=͓I^f5X?*Ke88\>1RբMp;fac}\׺sƾ} }sL!Bqz} *u+uUsٳ$`wRnN:I R?Mbw^{) zNNSJPyd UӚk)#!|ږ-z])ᘔ\ϼl1H:٥rdEf5m&/ .S .i&y5)s~Aj#7\~c;;-qÞnlmk`b[q%Nk_z㜳71 M,[>iP 3@jR7uv<z/{N6gy4c1,UqR!R+ \ZP0DU%fdLLCsy ls?Aw}Q­G Ac}6畅UU?Ofx2mVӸ[AHmK$IJ>_wYyW!>a2R't,yWÒu_uW73yS  we[s`4njU)#̝O駖}7$X!2}a,dR%i fRpʼZSD/5-EԄ~d 9{۰^kvǭ0>46 gn] tN'۬א̕zr>%%e$v჌"qQg}/'iDmp=Li7roG0jL#\]Sy$_ uˤ~:QS *N5 Dd𔐸ȴ.9rAlH(=0H>ߜ0f#P7tmV5xnokb4,(kk}~(]{^r8¾0^7o|Yj/CeG{묫䓄c][r{ZrX,ݲ+hNgޱeX _H, Sn4F-T̬eC^ [fa;s+?SA H R2lD;W.- tU \{cnB셮c>"[\9a?KQg޻̻Ǐ>!&b~MDM11-V4K :;&`: 2UErhf 1yJ]m U( _rHJzWyeF2%ME,Z_~ZTp?F*s2U듢os|bV飭* \ݥbzPza ގX7e$UIPfY2Ao>̷"yZP^0~^lǪ_`ig.ֶciF:aiF%B#\`>^exYgCZ-|d$A{gdwέ4yąz_ǩef.4> Q\O+ ]3aJJ-/;;껛A.}d}>j҈\ [~'2tH%n^ޙ}6M>}'bҵUBtfU>alo|0eɝ$bN./~rKKXN/sAͿm˲hk׫|ˇHnϳO;im]+aԮjLK`/Mp#-)2GהdH*8[L:go]TgU@^[X@ʩ 'Z[ƇXMԯ;ղ;fiL¾}˼?fv& Hۧ>MAӪtwV|ߦuX}4<6ݡiW'Ρ}'2٪ɯMrrW^_qGC;9! ?LGV+/=„I2 P wȇIv[YW~j.J .)O &!zÕEk#j}aicXssѩs*׶}O4x_;*#mӉ:S8sSC*v$voy.e3w (_C̷gy3W.,c{Y!I'|lђ1'@o54 `zOF61ߖ%:!#&Xi`V 1JY4ǩP3˥yģ9kHn7$g5N;9U,\ltd+lQ6E&BZ<^yfT%rxDǛ]yֽhlyH@S_9"9,eQ$|DrAoڂ9 G;7rղ8.0; x 8mrhI[fer"NRVʛa)aӫC7 eT!v7?tmZp 2$|xSGtt]5,iTEl/MŽw5 9؉x.i_KW77£,j~`\EoL 1M _ ^)Z:7ԎJmҽ$ 픟ZJ9e$ ,qִJI(t P2C%H /M\ez'$,zJ$7L7nPsG`AQ}#C r?v9GYb:VQU޳u.D ޷+Z^Ϸ:Oքئ63*_S&[hvh%oakџQ- m*ؘs9^[7bmSʳߝwd+؀)cMIIOzʱ&5lz5uH}mi1_+τަoϤf{҂ޑzcn>:lB㠵Kknk #>J>|~#@ x93l0N RR8YɌra)MBIrFvmvɼ"o͔4s?pZ1=:_ʢ'10iqo9|sllLxT*գs&P8ԡV endstream endobj 325 0 obj << /Length1 1466 /Length2 6308 /Length3 0 /Length 7305 /Filter /FlateDecode >> stream xڍuT6RiPFww4H )% H4HH(Ht<=;g~Ou'*BbEDV2@q!1' pZ@8 )Pi< JɉJˉDDdND O8h E!: 9aqEee~UP4 B @X'(" 4EPϿZ(8anr^^^B F) X' E{B!_wAfBN7E9b@h(P$W၄@@@S}'YO _ 0p!}H zc $W"Ճ~J>tqQn5/+|u;ׇ3(1i+sw!IF夲 ~f]xeh "䄾#IrU ~GK$? }ԅ^//s@NGGH- ݬ#{6 F{akMZ=WB t?PV+x@9cmnܼeg{= (}DOU6dZA)R ,\iP*d۸H;3.6BZe?sjֹϪCg6l@fw֡c<>\qI]Q״Eۓ_.¹C?طHMX QmZ!~X(?ifJB8S(8L,>!Ɨb ڝw3dNǯY^9X q_vVꮦ"瞉9~0Dy/KѪqZQ]Ƈ.M&6DƱ̸%şb1E-]8lXl[$QVK݊vV192_/nh@r{'eta*)Q{X4UIJ  -ukI 9Ԗzw5qb {?3ʸXM`;#S]~F(m109ٝ}D:Oh!&5|RSz-1Oɦ Fewp5eYm}0\F]KT?|_Y09 ayJiz\LC3G3cV?PqUj)y͚[G|Zn7”dz=ՔbQk<:0!ewq,w\Zy|lw2Oilٶ~x=meZĸ~2Xr0qBG(Wͭ:Uf@!鋲rz5x؍)W&+m}Ir D1ט [%@~ Gk;\HCcβ^OS>=\9tzD0Մfn/]5},)IEij {+/V߾siw0K=JI^+߂3|ӻ7zU9[X4 ͙$n#,Ԥ5M`_ ,Z~eG`CbVޱa9>Y\뫯>|1b&^|FBI.TX~җB`4p^zAGlJٟOJMk or[嘜XW2}U9ޢbqd/-8v6@; uN?H c+zh O;U+b&]ӷ=.͚60PrHMp"YEb!Z|Ƭvt][c&sbˌgTI3THj2} w#rD+Jn3E)%R>L6g糑ymG{HjV~vf`3*YJ縆<9,cp Hiwe2;؃F"DfaW. +S5'Cճz7XN= n;1Ȉ]k(Am?dnlv:p^nN3O J$[t>j8\-%Jp0.4Re~\mB=)lo1йvfW],G4H)~+SMfb_`ûiԧˈf۰2N l+άc20rQҐ |G|(L$7&WЏ~e[F>5,jm*lx)=A죋F $o>z( ?wy]тֳ+Lݥtfjnb!($؁i禁CzVc:)KL_)5%=b^O ~`BF0g}GblEn䒶+eM({7?g30\̠F\6]s5IPc6QNC* ʯ3zr4-tϬ,j[274>L5gKTyQxuCU*)ЍJ{ 9G9;1礑HPӦ, #j O+[䧾uv.a<7P']mr0c%eMz b FIMxoƍg#D=6K \[nl40w`P(A\ʝ&˂F"RB%Q4. #`TږPd|Տ+ݶ{Wd4YIjg~JXe~W2AvLžhUFu#PHqxsj `A0>N.Zn$Ij 6  qXP Qg;OI xӹaLQ;9KY}19yҙJGk4F[C[};4YAΪoTSB 74CmT27x9'J?|55uE>g]3[+Hk}To= lA>/? oڭ?R+̐s|X {o 7_Uo攫5N3kZGaW&ki zc 3>ޞ|a2lKK mk0dh71w-8RL7'^9H&\NHܗ7:7P̮|PID5QX8bh2x }ݘ+LXGJL&8c#T׆уe3) u5~?*F U8bu9O8_vg5qW Dw5mZX]]QMt%\Jv V'(Ac|^6Ph7DvZiM5C:[f"~=)` }!}뷕Wu&5zJis7G+,¦s;珮FUv۝, Oc6xPY+(gI=*˞ TB7UF b,Ek$t}_[Se~BJ+Oq鸰؝Vw 3e7l^]mӫkv1 f3^;f߮K]Rӿϳr`Ǧx̍(b]4Ž3 mz.I{Si=4J]#Hu Tf hd\BJK9x[;$[^׃7:6ekaCUռ=75\9pYgά%ɼ:|pM† ]~7{o/]I~S~vaYucSR0O9Z8%gN Y3g+dp~iܴ=_A6Wm m|݊a&D OCjpuϫ?w䭿șhR,ymIW;"j:6{M?)Ov2_ZMG]z2vy55|!Xy`28U5<4Rq?cL:k~9tCʭ F֧ 8Ue$xD o#s )")עon)@2^mrh"_gP2{;ou~`mˠDvhwDnsÉ+mykDd6'e=^2ڏ'.ʑٿtG*b9m!PڠY54|\F5ŰOo8ʝcRe{^#F,4|ϛH&$%xs/^rexmƪ=af;M̴ZBE'MN/ڌCHwBTVjXb?h[6_fïPw ] YsJ;Q8՞vWjf=žғ}M^J!myE2VY%3\S0Q8y^:v돵^n(sPӱWdi5a <QWj&+ +P&]P ءlF}k ˞~޸GdzO(/qkWjX87_〲O~ByCŻ+sLI&QId&YzHrdNWS-t˭[4o):au+=C:̗[AOwѯ c぀EiPpw6&Yɹ^λ3dw?Ϳ}5I{O{tEkc'OR-7l:cXGBHQҀbB'5 pseε \-c6xh E j"KW`j(%P&Re+L  +t){Ta/ endstream endobj 327 0 obj << /Length1 2120 /Length2 16569 /Length3 0 /Length 17849 /Filter /FlateDecode >> stream xڌTmgۜvmkɵlcmۮɘ&z[{}uȉU腍l 6֎ L<Q9Uif&+ 9%?r8/@{3kX?dbr6րNfV33'?6<1}g3#್5\< ܜtf9}GSljC33utadtqqaзr`79@{g/y}+࿩1TMP1vtѷ>f@k'k#=t,@h/c]3@f;X[Y, YGWG:_6fV07?C{3[G3˿82F6VV@kG3~ݍ͵q2662-PZ6"?2# ] M:@//[[ 1 ApwzyS`df0Y! cL}1aF6֖nn14)W)"b geг3Y^fm"QqdP{m{<T_%uoFNe׷2t<;9~솜džX_SuZhddҎ;"lm1l Ll9H M5Kif@E/&X=Ce[,}{{}7 @]5=FkG/=_`0 %0AF?(_ `XR+Qb0~>bq1??OO0A m,?  _+?U O*5`Hp mO0&I S7[S?,>dfY~gX?B}G6xcC#5< (UrR1b?5?Gpu+,ǻ@W!҂!oym@C0  U 8󾒟(5k^pMc& ,& ϔpvHc:)4cY'2]]_XLΛ]nf.%(++Lϡ)O&"áqX:;*Ejg:&N %SXطK@ͶRmenҏ~rMfw{qcnS8T$͐ޝڍV6iH݌!؄r5+n [JT-pge,-+D痀_> eBQuH̘M)KCoTTbʼn[nkgj@%LɕĐ/"~y[޴"\o9Xbo68r7N!8]Qy$dTH gQz0]' (8qah5ސǿf!ø}f&?Ȏ!ڼ1b+42v7TȧJo=N$A1n' o^X yBt fpuX  aZWᶤ"AtSARn|9vp>,dQ1Le[~< _}x"6'cyE]y0EqeM!!z^+u+,Zyr( r qdN-C0bgX[GӱPʘ4囲j'6_Pkb۳i·6Tn"\Xg1ǫC]B d%nF%m6(%K<' E@&^ 'Hi0 yVrĨ kLDsɅ(BM$2~7۪Y}_ìzTǥ<[%-B7i)ѩCV_"WY,HRE:ZҚ~#+U5)=^ltz1t<שu{-aY==IY=r}ȾB)ӷδia9Ly߂ڟZR~_X <]%m~VOg@g`wii.UQvxO*Ig ]iF _+. Lv7eOq.G"Դ#[ 8Ϻx796'4M3$ `x8İubկ"Ft AN9ƌ6޿؊z'*RkU및EY"a"I2jP+Ƨ|;%5q<7w/t?0GEܩz5bgJ<LWsM`;dEc~0 6?*f$uJs\lu$u8׃Y#i Өk3\$AX!+ט^0BWӽ~Ӯu]mOwv;`|;,Q)v \do]rJEeDSC_[\jxElyƂK]OD]4yK }8$5G4si u.ur,z[HH߅Uĉ CٍuA$N/}e{jt!`*x&Dƭwe qGs.dgs1 ~_p;~u&}s1`~LgRʌ֙G~gr#ث,( 6 2{ױ02C>Ruphhʨ0`xrBF]r: wihj$/*Ofj‘_h@fȆżo%o_2ƲȃSM qҦUi8]3s_cT:Z1l#6ڞC=ak'Uƅf (:!U@^29ܬR٢M#w= E!ŭ޼v[?2d&ԒN:##;84xd=\ri *S~0ShKܘ:V7p ʴ_@de"1nY`uEO* c~La$YHدYyD^ uAb_\@ϑ9D(]%fU"-5ᗮ(H#>!] /ro`rVI foC~-hYɎm5Mg[IIWtjt4/@1V.ȥ&aC}tH@chŧfXT6RhT7^9x5bw!Y"69_d ɵ}QcϭhE)8 o|h@f3xY#W{P_R'&q"'[Y3PII}J`=U w#L~xf#!UlsgI3=1yls1E쑥wr6p6[B?Nu8JD.=~T{^)n6z4,礚wGŭn9تx`Թ;2@#gzveӪG{hզ Dҋ՝or96&U\i]'Eg|XR3ĄL`OA$] h59RMk`tK(KE嗀P+Btn>l XE<i ؇2,Op0QN.T/$֭ݴt_uxܤ HI?Ϳ;6C3tOf&z!ެ!xOuT4$r['f0_uྦ70i$V !egCJnJi Q(zRZf5Tf2\aMś~n4R_a%Z5xWMd$< &vr&/RsսZwqM 43jmy\UH 55[~'j6kL:T'2;jb:j*ANI+tȮUMLA7c)c5l٘huT|! UzJRK+4V`1Yv_٭ׯӲ+ n˕ AY@4M)Ea>UCL"a [鎍[$[t Rg*q^crL1+` W+]f~>m?>ynV <'hE`0j ݓR>ta@!N X *sv܆äeɸ )FCLIc]_]*c|.IKD/xR- 5t )۹Vָ ʒ;ACuBO8i@%kL3#fn"ܸmoP+bg.#Jt5z*ĝ]Izx:3-jg ir :Ȅh͒g@CvS #tA<'O5]'*l:vy/#$4~_皆FMi_Vb3 DE2eŖQzWgTT&@l BaKRUo}nE %R`WOD7@ zna~A-6Ok˨1_E'0jZ8 uf3p_=)@ U}υ;mDjv<­-;Ġy%nelg7l$@c-jUcLЁ5TЁ"guGC"]3|9/mOO1r)EV)ێ,͉Ӻ[Xy`Z1d{9lC#;_7b9S.NBU)? Vz3i1g@=UoA|8o+qU xD\ ?5ȅ;ÛB$6ΑK%z-N}H^ :/v7Fe|K`B=+LI> QVˣ(sd^rl9Q6W` F _Njm4{lOI~DZ|nrôs_X.?>>μbR;H 0-XfI?h0vJkv|gP̵!4wӿ%W_ۤ&DWN,l(հ"_KJP <۹"}Juľs8nQDV.G21UZew:X!!Ed'O5l0>aH)G̈́$>I P?V y+ =LoЇqm[y67|à踚s3[$ pϕF=g媣6n`KU*6;V@򼬉t)&)8:  <ЪēӲ7nCA٢el+'7l*0V X4_JE=*S֜nR˄O8 ܢ\;"D%c8aߑ3 4 l2N@b|W\)+ᕲYs|#j/ 袞rk۸!zA;Մ\ 2iY?zȃ{Q\CCi>I[,q:i};+'[:*x-拽b6Ao41"efz+F&>_I,$0^en@N5.  ĕ+g\+;o/"ѣRTG-[ SH/gyԍ6uYW}Nn~xC$ۨ;پrLVfz/bͳZǰ_;li`h2neP^Bj%޽zsszcqmAdPq7"oS9xZ+ 1:,`MW㜙(hL~cι>YB}E0L#\_72y? wEBLg.V&*_r; ̊s`F#|L˃/GFƼwAFa' G(0tK6)sDPzS/\7}*:"&Bc6 JǏ1BV.Оs3[`PB;›UQ bM6Tڐu!2w32&2_$q;y"˻~>L>>Q6¯CLEv~'uvy?pK[NڼX3p.qD3ؾ'yZ6d s4 2;5^7A`+tNj9Ā >akדiؽYWCOP*{]E0iEāQd6ij~%޽:뙌q[|y$2 ^V*%XǞSs?=οȪ`.%W*D\ nTddR UףDk|( S&s;w:^v9պ 8"HeJ<T7\ݻ9atՠ`yN#:׻[AƺYCו\+wi?9w~C@09;ÒelNd)c gU.Z lS7 7јֹ͐i@[Z>rʊLz '?`'Wk,%Dt  bR)I:^3 J=k ڎJn'VM0:"7]*\jGU$t Y,f4S;m@۶S%m(j]{=({D`IT.3ݖ´gbŠD1BҌNUsT55+p^P~K%&NKˆ#`v,p?!>ݠsO%D(;U)U6.Y D'NjE=gzqZgY [ǎO+ZV[Wze\y ̖B@Ivj)/=D ֪oyO8o]s|ēutyo%2A9 ^ ǿ _ kGnx?5 4#JӶSjܰo[(uǘ: ec$ÎsC *K}]ˆfK5r:g<ׅ=%Dd\W#f̰m!)o@}qKF4xP0VPa>0Rs֊F+5[ۼ\撝txC&7I,ܘiRv[bŪN^21p.TTH ǃsUh+ r.!oS ᡞbfv9 ̏`3hnԫ獟55\[. q/-~2oZF5m5W? ˧1qMQD6>.o{;% *3g)Yg 7u)xDUpŷXgc쎝4W,a3L1&hf.2؈A!"vjkO<YN*R]|qd+qh>tԱQgޯ@_MT-7s)rԎg"AAIW|qPz1d%V0Vcݱ]9[*կ1+G;F,G{젚:㈱VBP2dX[g\^AO#zٱ\71}9wIk)0) LY&æ`\, W\&NЉߔ5sۭ 7rO^RW2sPS70ZzW/O5噄mSϿųʦpN( ˃}|+:|QV캵v=zRF}nH-wҵ씕Ģ;"N1*9Q6#tns v|7W}vphEMb8FF\ڜ:86Pqn8ق!ӈKYr깠ԯaWY ,a\,CERY̒.6 "a;|/ 3%MUcPc"X"7ntU !l9[QBca^{̿F@uZNyx!Uv쾖`)b29`c$G(wՋCT!Y|)Ѩ8qO/&T#2Q9 ؜ہ3]rrtu_~ft$s3 7 Pdž`yԨ6Xq6Yk t6]%xHݗ7Rl\b`@!lY`*P]_x)Mܥj?NC/-??0he ߱Z^ԁ~/i>9h[,}c%tzsueR܊]6"Mu(')eRBe4{Br3o>goTd ގ+/ʱ@ *!N󗘶Ng 'cmkr d$(_tqjM8qXeJƄ)*%d/`ͱn_sCRZ#2y." YcD]8C#dpJ'YVblSص7ե[1kE}ƫ',< Ր^lPMdR@HpLkwvb-q{J뀜j}YVfkE']u]~,1M jH\WfjI*qzp?Kw|sM@&}'jFL+m2ݭPCx5[ z _WjCmXl5VNQS SG 9b4Њ v,1x l)m_UyIO ,)W>a'ʝT~93cl#jPwKt[yP ße|=-ld.:&d]4EFPυʪS_rcy>1hd)8\(kElY֫UqQ[KP݌D}cbZ#%V 5UOF=xwa8uG2+>Cȸ0#gc*}f:]r!HqlkESJ"Tkjr')P>lN6/݈xFf9tmm%ݒ-'Xo(Q&9!zyeK-P=jMT"1T`Kٞql4@XQ,( ${<]6Ȼ )7ʗLMȉtpP`0tAsnxa[ L0ǎ_-BF {Jrطk`Wǰ'G謲DI{&z100n?h#1jOFfMϴ5ƨCL +aGBCtq;qkGnF)wTheQe nLTVnYQ6C>btAc2y ള+2_Xc<5`2ӔrGܲ !A^b{K)81Qg7mp@AV ?ӌ |+XI=.=!71*w \Y {d/zcH X(#h:恕nAN1Iz)S{|dق)";Ygv٦VOĪu$VK,<80Y .2VhG)$8+4TqSIr{Z 7f/J~~8QuNR/CXjM4nޱ>+ G=zRg|<+޹3?`{RVE!y;-flh7c=cG"GFz|RY Fo6Oέ; Toɇį5_KTJZkg9F6չ|11B5N`'EO9Bo:v>c_)}; tfdx2O .\0pgjt@Kߋ-bkr_"umqaU@crsU[4J.NJzVx~CaZ P[moх1.6\xK`Q6-pMcbf2KrK`.e>?5"GʝNM.&yI> r(H`omHB;VzrQ̖ {uz3Dm,U.T_p WQa)Z%Hpk!FYݑ o|3=]\Ol"k(Vu:{F 辵:rk#Kx$ںz4UTT2BU jddc]iv>.tb??`Wz'6O= vgcy\,Z]7b"DH݊(eqǰ ?dlnrޅP?5^m Ƨ)4#c.?KYzX t2uDK=m = n۬K#49d̐&FGl59a7`bY-L6uRnU?.D%-!`cb#S61S8_byB,hELw SKɲz*JO`_?alH&$oBelsfJ"ub1^Zr+HKnkjoq;ZiH뮔" Se,yAD4օjE4䩺gL[*>(YD;+ML`_"zEeTe6: )J $ $E,`*!U͓2V2i]n&;<8nf@[ XVi*Sg(PA!ޚPc\+ ~嘈==V1hQ E0GtDv4ET<.I_@e~m|Z*P8VlGwX_}GGYUm-ٖf iLo0oa\0[=ܬTȍ<'K ;y5}kgOJ XmPD (hzŏ1jp1=sOsn`gzm7%Q(9ff9ygnV=0c␚S&Q1&,&.J :|2sndIuՇ{LUN)ie41s'(&VtpVzAPc:HI۶7}6yggc {Gc%8'D{ 9H/ɽzKG(` g&9ka]m!t?c,z,8q" ΰ6GW[c!-AV|'= 56QrN9 CBkiAZtEVGNJ:ls[bF&(FЗ Fs <!e4J@)E\Wvk0 @a!q>ES=<9l_Ikb֝ޭ4`/V6s* ym xLhg;lz5[B~mMo~/FUȘP"M*9js=Kr](14o ($ Vvvaz ԝ8j,2+ރ]2Yy; ]A*ᘥ:'2> q]ϼuS,EC9NCxV&9DUMQ.D=Nr w<2xf٬S4n@6@ Nma{ {+o<PZ.cpY81 3" ba\ gwpA6:CD Zė6P\=H͊Dh՛\'մt"P.}o_@N]?Ueyu7ZN:?Q(I2g"+lYh40./)5uU{ J!? $AR!S wmgX8 &-B3MX]onثO^Pn@wEy8#g!lif}($O^)|R6=)=JC>ኔ,'pb[N{&x^Zۤ`<2r kr^ޘGvN2]s-ElSDȤH2#KGհꆓ|vX_lV;{I*ݘCMa62/=^BAEtr=LǟԌHϤ(GS_2[ֽqs.^.mP. "Q}RhF;-D/) |, kG=E~3ިTWB_ƽ1I endstream endobj 329 0 obj << /Length1 2193 /Length2 15043 /Length3 0 /Length 16348 /Filter /FlateDecode >> stream xڍP ,8!H%H sޫվzwME$f` vwabcfH(ijXY9YY4]l#P}a!$M\ 67??++? ~9@ `tFppY[Z_owdmfbP2qڽg43h8Y]<'#? ;3RnbP:An@s_&vScFhZY;K`nf@{wW{s !PqX_7p+&ffv& k[ @EZÅ`boûߥ& dlmG¼Y\hW} {=Y},-aȢeo ͻbee`@3+hz:V%~x x;. W?f.S=Ÿbſ=`f`o#fPb7*<L&vQ?Xēp{CsA率oeih GV.V/++ߊ]mmGobgmoivuy %j\L7DvZY=19@Ug+ѽ٧;V73Jٛ9z\}عl;j{,..wv _G `K/ `,RE<? "X(E~;EhAQE|:?=ni_3s}o$Iiw6?BNl?)˶vw<xYN3zuX${}~/iZ[}Z߷{Y 9މ::MQ/ۻa{';Ug[g`q]]n-p߽={Oq3s}-~@%3obLSBTitLA(t5A[>)U/jO>F 곻+38CӅbDL{>/N>?AwS:c޻xM-p+ >1j| ,Y3Z#qa"Ǹ@]ș~#O`@=(akRݹ_cb[ Ewٻ8fSh9lsbg__QOfҷ%P >sWؑe]Z&_xpo$.`齷FFnZkLba{Y|C%K zǧ&ֻfqcCsB09 khM-&GvS0tZkN{yzi O^DIr\ͤ6f zؕ(Q_xr Fj)D̫EgۥO'z),M[SodtYVw  JMOQ!q,"IAųrd_I#<:vU#'bPVo9/1WY$tS?A7 ^1@mjIC jݶEr>PU߮Y%fqY Xã!yyzE=T udf.fe7dh~aKM }ԏo v$/vY ݄ ~r8aE<8h͞XoeKrkEe/6TIaJκ+v 5${gtgd)ikh.gh) ]#i3!{.E%3xw69̨^ϖ:-֏]?ZXPu;= Z_x-֍Wji3hx%.g ٧z|IKcN1 {Ss`$WxJEleh>O pmdډ-0~X+H0! 30DAQuC&m2N]=\Hʰ녏ZtAdXr}H4Vf2U|P 8k") tB<2saYCcyGbDTydLʌJQ2(s~0],K0;YC\=O|Wr,1W Krԝl;iy pLs. J4h_ۉz(ϽAal nO+C>$M8 {H|īwK;iRLjMZ! ]ֽۊ\RGhM*c"Z.@B0:t`luu|PNhSνfvEHٍh>W`s%Oln9J:+b6d~:;&;l/+M&Z# U#X:x[Vk(o@@,Ř!uQ\ur@ϫ }b<,Sk =+dY@[m@~2 HOԁ>&} .+Vǡק^d4"'IΎuX_Fݓ}Ce߼X3di(C"(M76NgӻFz:*LOc!'zoo ^-7>-NUN],A[~()q>|˕"=:̮#2RO=E⊟>)4zYYZ>3TPw(,PFwQ7 hO7V4C`۷(ΤO|/1T [:RY+ **'z *l&ri r_Oy6JQO+x^h^FOQG.H0v2(nOYnfx-X>#r }G>U1)ܩ0-ހ/^y?D!>(D TaZ2֋Btja<3jA=OMҭQ ؽ486G( 0Zut=tr=ц/34_N䙤]чn#VixC(/O&s$a^#}|]FVM7~icѼ'US8@ּھI/*dhry"q“@j4g%xwԕ̟ƛ]XkB,66Z{3aa9mvYaSO*R̚z苭~_э8>74r4]l 9ɧ~n֣}9U 1W/ qҎ3I¯Ywƥu#'W!I<\޶S6kK/E^K{^j2\0P6@NX? o!>Q|-yޔih aME+zb'Ti\2=!@^4x)CDBR#xT MrokoFn*k8ap0)9AV,yߔgOE,%ΰ+(|u`#U'HaU?Y ik~)Gyl2:v"Vӛ#&$ Ոnr.R4kR#ECNC-$e]a@ PEQޤ}.zL. :C5ěsŚN/ׅ;耯kRU5G>U_Ն7(nFaK.ljJv>FJB4Qp.gdp⺚hiP008y&iSA9 9 :F .IlytbK(ޛ;fr*JTR5wImOqWL1mF˰ ;]K X78 Y6.]-.i۷EF1l/>cn%oqS$I-ف}y@ueïAM?h+,e js&6f(Ї/O+q f a<-z O81/ly|;OS/4Ĉ,u2"qgאX.6XVI!Uf~7Hv{fTWyObY,DGkg_|o51:w#X9\c18 43L}HٟzxM|Cs uTXh I.;!JI/y-c)od&=}e3qDסNƳH+>|y dq5 A9DCdUOJ0A bk< YP'l79 맠L[%+pI9 a*T\3fswAc)z'7[J*V'NjN5YÎZD}~`0%gq.MM6 R$px_Үu~du 9+sƔDPߜғӂ S17.ŤJrL¯8Irg`l|grqAϛMf UaJ꺮馪AUn_D,>q9 8l`"*ͩ <^x^i<`A˭L۱4j!ŋ,blbS?}n Y2Oˢ? # Q f`YԹAna萈ST;5.77IbUtyɋD&0|5=LM?ЭtW9|aڝTjmꠐ!g?BhI|őػ든D,~QAX 욁HtѦ^щMQukWaM)2;R,[ Byd|ybi]vHwSCث2rSNŒzc{}1 ڢZˡbC[Nz#tM S 6vX!oIU $F2T4YMpۂz`v5Bj|y"p3fITyEm $!اapbuYpmK(Ցи+!#2bِ'i{*MZe>Q3.V6uY`S)Shiv\g-D:{ Jy(5kА/gVzҴ4w D{vi =f쒉ȑ4!ɀϼ= { M?\_WLg}iOUO"TX!rLW8k~ ڌ3yc\E>HI-=[TFabdŧ8荠B_P>zŘemLFdHX$O$8u5a{eb:-S͍۸JR`6J`g ;]Y}zZtK)Y8{4*=_G4\m/'^s!bqnD%6ی&F @ԇ2ߞtiRRU鴓vsPMoLE#UO%6'!p6N`7'YK3~4vwG 8 xm\o .R<)P*4V m@7dRҊEfdh z坥ɝq%;^͠il+[l˶:7۹(#blYHۓl_Z4˴]:7s Kbq>QS?5fp0Qg0wR-nL3I-j[~mۉ ^B@ ×qäW-oT 4>XAJAȉfl6oLVo^+V^U^p ֜I2c9PfOם l{-J{Rxp]!Q,k; $mu( ڞgR~.;-X,9S¾Qd^pv@yvsx5MVUUC:dFA>ԩ+GĮbX&cTZ;O&$ZCPxWE!UsxF@o 7Sg+cgF>6xh#G;il?P"Xy3 x7"poڧ l@6LZ-;!Jy N~$ϑ?2vیW/w61WEwbVYNnKwϼuFm2LP js]3 Ssfww:J`Ȫ$jt׻-]n4j esfp! F7uGUćyDV1ֲBtg&`Uf}?s$9VkG:t&*ʈW>E_}!D|$xLY>jU(O4=~p"_*IS8dvɨ$ymr~dNgb Dž,){9HfRSn2~Dyee!ڷ䭳pv h->}χ/_h(PՅv,T( -/0֓Z|O Y4J{5ſ(c [0qWK=S"`4GJ)nS K|af[ǔ<7q>xhpWs.5:)0m(w*4jtY)ԡ-xswEk^-ÆHǏY0<6uu]o}Q9 >3D[bcԓN4a'sQPtq7$-;yf=K"V}z $>h9'f81`p H`lNaamШ''͎n06sSy3#dgB#B;f܏U` mb(xDpl_=;*o{:OZ'fk}ްJl*(HW1x;2- k~нtm.f2".Ru9@jZZY\Wɧ?L)W&|۠,MA}b~~t_S/UI:׶vThQO3v'rq~֨-B7:9`%ڏFa-4%jd26I,6)>B gc=đJ }  Czc:Tӽ#ԼFd-gjt*jEXs#b`'GǑErc=4#0Ck3Q>0oĻTf%]-ctW#O9Fl)*všc6QknCjcDxx Xgdz]͙D23[cG?Ζ'e9nEDRjx ?K\neyT|$MC;ciWU-K$x23f$^t{Wn)::x)^D"YTc%xm< g΁Y,RĒdiCI?eP{_!9һϸӉ%KI)}o2|b"{o:`JK&V^TM8b<<4~0U]Ӌo;V>"3j@0]H;5-ks`R|ȁ 1"4'nb)Sn<ɻ:wZ"$oJtvNI}<pO`2@y4Y$hW8jJmOAYIUHrOLs7 V~Pi|w߮y (|A ipJ)֨H4>,q>;C"@`ߕ >]Wd*b{ !S̋Yr+Dˎ]qҭtu> ILJ#()+xfOflM=\Si]Tj?`h7O;J^p(/c*jt[ݔxyۅEeb( QFs@J VKH=m -[@M,SN,q=۷Riإg{͘]dIW>NYұZzS6F>V `]h˯dk4b傿4:2' Dtar\n}b&T)^r2 S#}]Iոxy +I>'R걟+f84@j:;eѠ#CXܲPLw~is~/d㵱>4G ս{5ق\+F@>uMs7Q*7RE`=]XءoFw*XaQsŃñWξT-O5:R 1 78_lqL9-ß쬔xj%!q[$æߘ07 waŵ.Ȣ|ޞ7dGSpJ"KG ˯y> 3%ӆ"O i_|1E<y9s{R4]cHK"(M<2Y4aK eLJV WJu|Dն,Gk}OpOB׏_lqa²/D͒~L\RU@ju@^צIk`53*pq,]}BndY[6U&oBXBPB4n fјɾ?^¿ⴶA$@ Pfju2KMp!H<ӗQ ~\NEfvvt%y;jO9w54A98ؤ^J@w%0_\\mX I0,Jܪ53+^y x>9]2Xd+9Zb6X`0M1>ISŠ⦃is9}Tp?,%"B0M*ᑊd|{}kr0է E R {+w(ls[ m1AӠdwL|;ҘKzhp]މ(kIPj'޸gVCGgăOj #ҥ{>:Z=k2ͯw >9η qW_AEr=E-c 6C-ؓ\uNwõJd Ty|}R"wQ6^HcݾƾKnX:b~ݕjH>;k8`˸~C>7V >K+H  K@'pGeAL *u* sǝZ,y!9}B5u]<ͼYC3"9Bapx2聯DЀhghXxQ 9@[_ECطU=#rJDQGu%Dt{F9Lǒ=;Rz>UbΔ x'b#KX@ٛboz/|]Nrpdl7*r}nNpeio8al=}/')_zN<tnqjC;~ s% suiSF͞w>WGq| N&4^卝LjeAwCcӜMF'$ܤfYGHS[IH>'ۖ˯fIcL)qyFğFXH%Jh#oSN*Y'WJӔ01Tf"AsOH} ,>ޏb.evyH?PDOC|5Z"M: |qɦ{s6GP^Yv^>6M%PFha !@qMum['nuUQ*xPlS+Wd y-U/~Q2 !JGav%ɬc6/%"e .֫¢ GHD8ͥ]Ɔkz&L(KW6&f ܢY8Ӱu@p(Fgoab~tYc׼'Oas/aEGLuG*U:WlKsuëv Fq4ؠD,}a% H lF}B߽W0Ӎkuq9J9\?q=KfvBwf`wR ,=~SĴ#Ŷ3Ƭt>Yu׌za<]b(ᕪ@~«YaCbɨbLC1 XG8-]{8cM3hASemg qxu% endstream endobj 331 0 obj << /Length1 1738 /Length2 9351 /Length3 0 /Length 10454 /Filter /FlateDecode >> stream xڍTj-L R"C RCHKJw 00C %!! !ҍtw# %!xss_5k~z~^fzu-N)+DGrpD2"@ 03kC0f. #l`]*Try<w V+yx)wBPd% mP\^ V0]> -~OKiwb uDp@a(r*swrp+tO ;vOnp{ p+_$\uP'W!w&6(x' ҖWymOGoo_oG#j x @+O# jZ@lp;C=F;A>37rk()(4) E]۪=zpkP/wGnaw5ĝ!@o Y}?wU w~Y?nw]wK[ AZdUHrHm`#ER"-m?pWC._/ ݶY߽&.wW[(DX:^A  ݉W@sVߺrsȻ;_5BZLC"@nBV@ 7  Aw`IM=N)p7rc6K!%-$NżwQaԪ| eޙw$mezSabEv BqA;KČh8SkP9xmW"Ti?߮b.i%ޤiK=8vգ@LG~r6?&p]M!0Yg(¬8TjjaK2#}|Xe;ej?ÛΩ<~v*SN]k?qgCV\e-:"oSL |o[ 2 M u>x dhG0L= n~U D[˖o%L8+o3O~2 H>;AT4fK˫0ܐr𽋁v/I5uZ1T<7l3J[!pjb[ߞP6}_~ewZ^FPikט2#:We²w:σo=%?40d%&w1Q#~NekAM)Q$O*Mp< $7!Srkzs|LtƓNFdz% N\Kfƅ%J%b//RL!nn9 :ʔs, g_vlrD4);֫Mq>=5q*+UT|, rmkN>+d Ǹ"'qg{r𰧈?APtZx^DW=A ԌN_W.6$ΜHDsv\7POrN׌ewŀgӠ؇&hUj&L@ޥO ?~:bwd|8dW>A"]*pz[a RKMdl3y|Q{3L.Ik ã\n{M&iZD)2HDa,yl/Vz ,4߾BJOuqA{ YZvĉnE~zg~X@| BcM&ZSo>.&m #yzVi!T}l N䝗W@1wg~y ȼ7K1|_Rot5xֺ9סZ`77  7Ugh12(oDɣֻG_)(KF:&HӔ{Xs1d0Y‘ȊhMc$_O݁e@KS> X&@7gg/4Ri[idO6,ZۆړV+_^FQׄSy9Y_?aW=_̘P,eѷqA\EqlT5(44z>Yb+MNDI뛷Wje/n琙奓aIRoJý5م4s'^t,GXٍ@yӀ/\Ý9%<J;~AS??JB6ְ<> ԏgbCH!U# w۶҄kɦ)ùx I+,exS=FMmC& _.auK v{(,Z 1U߭.1!g3HpS\G[4ҦߺI$6֩me_3^3Bf*g2=G6UÐp(>p+ӭcGX$Z0"!ϕ #5;oRQO};/É9>e&f~M: 5MxpCS$7:Gҏ54$!^`3])sjQb知aV6&<8|C8/& .!M,4IN( tmޭo iNε"w Т7}l|ytG`:Cπ2sJ/N>kȭ Fq ,S냶}4VdEE6'yν%9O0]1&Xb@7M- /*@<&c8E1i9/dzxI'U*n R ,k "&p0iqϺ}- /U3҉pEKP@"j&f է9|suW*tB8\ ކ O)nRt9ᗚ3%bUЈ߸ϫI P/V7(~\MZ3[y1lWKUxOPW!O(\Vs n#]vf_Ks06 Ŏ~Rbp0Ⱥ@]q!OǢopR.t6"wiw3Y¸pv F-bluq_ӎf)-.4ia }VNY7"H%}dBENx?.U \lau繉f5%5&xCXaE{[>-8哶'MThf˒^~&٘n"UѥI':Ax֩|@V^U`>6(la6L vRlin(5cMYPQfqiF6zu(7C-A͛/?"rI|^dA`/^Gi&oujh2taRzVW}FQ(A.WZ2?e䦮/:n}| '[[!דR Sݢ)N?u#@a5hh ,3SG+/7@!b;CzkH.7b\Q ćsg7蓰Q̙1Db_7oH7}I8%┢O٠~"UAM-:+=Uc3ǏkX2='O ry<|۸ u0&$̄ M2 [sњnĤZ[禅a)Q3hn摥?'9E7OW@hxNdט,.#F1urhbFʄf\v&ͦͲg0Ob&GVЇ)#TZfƟ۪n-ӌK|RDu2dE7ps@K.$ch>^H۸Ń#V 46x+K`1ʽ{W>(w]Г "1Ȍ|cW!I! Y-VCh9Ұ1 e,WЌRC<t9\nN^f*33B*T4`jt WrL30*}2RC[@wa=&`svzJd=o8@cj ' ;AM.pMUFE8xPK)'!H#^XQsoL8 Vk>l_-/$, QzF[mK}| $IzHӴI-0ۼ1ݖERoX:!ȝa\Z!&bDb9}q1'm4[݊!@ꪁmDW1 ǐi})B`4YS}I( ]ʆrBU[,4[A6ys7=3>_Y6sǖ̼FwWz^&}hye73M ʏOSFI+qR[m^Ո6N)K$ohęE;t9U!>+N4 =#,0X/6П:HIvϜ16F(TS*Ӎ'!`nEX})$b&$aCqsbK 1S%[QBgipi;(\NRrxb6Ր/}4/~^t0 Gv4He[E\MV0FR-7V8v57aШgyKOwl'YtmcfPnv;b KoP*UEl:eåRgYv9 *yVյxz}Ͷ6,[.g"DSHUx a׳ n2&dqZ_v 2PwB])CS#h͙Pc0^0bs||I?Nu13IzH > ^:8{Kv=ͯ{?W^I$5m@jjFBX<%; =(&>96ݽ:0LeO%\}Yh0en!d/ 2 2gij\dyk}YkCЯC'uQۚA4ȓ iGY}#׍O诚P,H~nΒ{oeD 07Ii8 uCL0dH{1^=$6osE_]¶H^Mb&2<_f4OWi]R<ƽTkf[:fE}D{<%@NxU>!I"3,+1mOs sYiY^ LRVA[)g| <,)I8FyUא6>[ B|T~n>DkZ!>2#/kbQMwV)NIv}{1Jyh>9f0zqgA@$14ˡo(aS'\Q{JKlR+ tvPՎ"Ke_R(6v᭯M ϝ nligoC6[1s^6&`Կ LkTQw\&'xbY5\7kf;>3\V4 cJo^cx2x4e"F=22-`l|UHGC,`:-pJhFNdou#뮜FldNrX*:`ĩ2KsLg)J@cC˙ ?)+{181RN,\>'z~sle:T36<{ ]Y㪕ef #~{%Z띱6aqzJ5*T[tD%\`EfUg[(XVzpEQ^咏D\Pi<[ƊDie 6NCt!2` A޷u̅͏<%VJ|T Trew*{^,FX[?y+yԾMZ ç-V1KzPs;?$4|n } AqC<x &4f Zmm㰄&XOg;sk]ɦNF>c.u#[YͼgU ]O/ݓ餩^4jBxq=UUyYzPcEQԺ a8r\b'|i M'B\BL8QI4[0>OWBY{UE23R-͑ ͮh.Gud}GȀ"֥A;@8˽,g¢pYCiGIhL~X>~3W1BϦO6{+z$sv`W̉^,l^8ZPNCZ#G~3<_֢㭲.^1;,} vKձZk/\?*IBH]ψ',mu! ~AuZzz:qt.mAN*'m;ojgl@ȴ'>l=2gBXx4Q|YQQ4tsNT)=`1(uܼT/dԭ ,aSmF)ڕ,ʤ4TV BPb6@R?P}KԸ#1r׷/P jG{5P ϥ~Nn:I ${:IٽG18#mTg/E)sɫ]]oQAANoʵ`p$ibEFGL/L+ h#MkhlFΊ|GMm}Ż.(DRE5 [UBOauY\E|G=iHr9;֎gSַ[t-)Zgc۴O2:j= ?}qef@j -5,y=HMlhO+s`G[n.hrHj\e՚VRƟ 0*o7W֥} ;;τiavΰ8GdX| IN¸Px='`5q$T Qq-˯Uo"[VT#ZлtkۺOlVzncă*נ)W{`Z+&&qQ"s:b6wpɃO[lqҝUp6T{/`Qs}?H8@ԏ !s)u?lY endstream endobj 333 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 335 0 obj << /Length1 737 /Length2 974 /Length3 0 /Length 1544 /Filter /FlateDecode >> stream xmRy8Tk%"]_I0cRYC11fq8sf:LlY6bhQUe) (Um=ZF`nbL>A(>by ( bJtupVٗv(j=D9Gú91?:SjuK\/ǫ22!MkR;TJ4Nw|,"e .6?Om29vr|S`au;OT@-\JlkXRHT_hr~BԨJPXaY?^P1N 𧵙nnPF#+oEX>xJiso7I+o8w5}iugzpTGwУ±iMHDɅ{:;%)OZɡ!p6^*-9E{UT5kԸ|:JC%ŋ¬EQc]t*}l<ƆTN rƜ;cY 4+(U9"_]KǪؕi'{Ֆ[N%ܑOkݑ4U8rSUCf8su}}UBN̉uq  N$Id];R_zG3|_i R=' F~) ջؤ&=@-~-@pkKpS^VWhW>5u+O#AҪgc?^R^z찳Cn.FE1(HlO3Mτ_Iz|G5uyJ>;*lH=)h*3i ]v{K޸}]Ե ӗ >i"0d> stream xڭteXے5 .!4ݥqqw \www@psܹo~̏ݵvUHiM쌀bv ZF:. Y‘ ; Av" @hpa;{wG 3sBUI_|x:Y>>\v6@[Q́S k @X^ASRN@!.   d,N@J#_9}p : N@c71/`tprX8 mA=,lMJnjwBv7l>2;'=UADy Avv7M쌝*oZ:@@7_ '{kCddak h@3CGk_WRv,@N@kS:8FƠfp vgb.@ǿDP~$ahbgk0ف>B(g*߉ 'w#߾s3,ǖ3ֆv3s3vo:߿Ò Ïښ}CDDdl05vU[-Cۿo_"ښ{r<a1 w{ ?¨ڙ/!!;7'-#`do"M! @_'53krA&`cgG~En@c;c Ԍ4P fvO#@}IJa_]ojgKu0][P5yg2<ϛ;uz?^1T=bNfRAm{LQI=K;{$㔺( `h5'd Gw}ÃP{1܆>I'D wǛz7'vmn@JĖ(!f`'@X{~%iڴovL9i(ϏpArryQw8fB1\ieHl1!6oa1D;qov+/Sn<0QbY_zضaaaT3;.gϟd:0]͈jQ5'JthU3I9<򝉺?wLx`O]cC3 `V3xsZ]K,gj# U ):́؄d*M)/J]xkF[3\' H,Q`!+ j xP#9*:_=pDƀW?hBqB(Y޽Zf Y=*0{Fփx @l|좵 L1ʡ<afH$:W=يDmb)2(ˋh:E2%@*NUqTCȆAVs*$Clv+2)_"[E"Xt7G+Ȧ9}vz`s,A}uQہeq:dyMu_yo+ Y7?Me\9ip{t-c5TJs uCˢ1v v߿ooǀT6^(46Zh-3HifoR1-}u<3X'U>~IYvIc'P=50-q)B%/r %@j;$a`Cպ{DS;tr{Y=\pX:`xK{gLl^'~rATv8^r!,Yԇ_IFb Ba2r;mYN)&rczm]rطboc[a/Z7(^+˜zLBVjSN={M{כhٳs'h=ړrgw)3Ҏlɗgs"~06YIg奢 AO8PKj ߿bѪ{C;YfgEL`8jU%K'8?.I( nGib4XIY$/Zx N+UZ9_ 401uaFb7HO3lv jdUWcҧ=!֋#٧7 %TiHbp7m{&&N:I%K gm;h׸j~>Vtb>TrӅB1t.f9IÐ]=s:w+)BܐEHM'6_kCi 9czw+,Lr9[2zeU2dFfG:"YV""/xrg9Rf![!]Q~5?7G{EL6"t3zLzڡSN,v=;H0` 7!tx`+e3gTݽN:M,hX¸*uO^X _{3~I"'[npUȒe?n}?TOyX!DҠQēDBuʔw{SB};1lg=יYRG6!Cm5j smR8RVqP(Bth?kHaS/H?Wy܆{pvK0̑G.cŮX?^nj7{Ϫh4۰iD5y 8)A~}.5(@ $5R> Wn ?:,6 )BDJˏ8iXCZ"'2H3s2ot`0a@taWML2PќxCxy;@66vm D=OQ1@E$YM2[mi<ȽoycNCrF-|wѵR=+ڍ.YAl㲜xgUHe-Nvr'p&~D薦 ;!;2m;2ڳofgMM ҥ7=yƢ2a//#ft7Z{|XC'OA!te?ujqZ*ɄohV3;NOTDIHͭ0[[DB)ΨHƯ_-|L8YR_oČc}>"/ėЙYSCAJY|owZ=KHg_t9kx} o{ϝ!/B.&)"m cohj6 7hJX$(Kf&̥ݞv$ >]@X  16^<@ ׈F?%_N2Y'כjkQTj)>or}-0Xs` Ů ?u_,>=uXfL j3y[-Oa\)I5Ԇ^Sq%"s$ii(5Y0.R>gơzUNYJ|;R!ti}6fsC!I\8u3-7 ~N4 |&ZcKa<,i'K!8 I -0$lH&SSO -=,Y?%pڝ+x~1axHyWq*@9_<-D9@7,I)mDm-̦[|*$)ozESyd2یdMdդ"p6JђoTzQ_\h^9=rv>1A(5L*JKh;-/Kĸ]zP/6qsۭhzS'yk)G>'?wiPqmy}(jAY!OE(9O LMڦ4@Ջ*y27WO#6QRڛUΤ,(mIEx$U\rǦ N*BR#ZO@l FZ`AEs1H&>lH5Ru ^0z}cDK| )g}|0pzNZ 33^JBBHz'"e177jDG,;V%@삘w*+Lpjއ&XjڄiNz,wW$%ZIȃyYV%Uo ĂUh9 ]7W2:)ч _ K0bU{B;4__=Z|iC,*$fOz rEWpf%ђܳ<;`4p{} `)6Gڵo[L]-7=s3d3>q&$F)uQ:X7Rb5e}&X_;1U_;M*B+*YEuN>xߔ:sMq9d2izpxkiXX>逧fMqaz?0/g=!| 1ֹ*EmJjZ D-zC=9bj&j**I09@FXK# vKTm1HYFӿi -_$j)oȋdE*rwv=Ҁs+~EX2%naJu+ů0q\,hHȧ;uQ&2KE69+)iLoaQoJK!2~|Ycq̧>xVf9#Iu).h3'7ߋɮ&Ac(YH@{";-Yn'b{Ȝ+D=X!Y(_&CoDTcfzjU>:OXv8vHn. 2RN ؀J!vw unHN]xJXwv/IGYZomrE QV]T؃+#V3CxW_?;aЀM$k.ܸ¹2lw&Yj3n8(QUCzpu eDD)#2?^vSץB~F@Zj.oZt8ʚֹJ3_̨nqۮzC0D$z^0aL'֙HW P-g=<1Dhi;t-Ene>aVVe2yHJzK ^)BUy-5qݻg׶ a/"}?H,|&'Ɗ^Q^[:F$Z yrd!/+Ѫ]?ȕth]6\qh:ϬsA =R˦u@Mz2K -sE,d< p |8fJ 9(=xq yf>Rj!b_rKjYx1 OMXp U|Ġoai?F}?+۰Ƿ$Ag7PنXW#2qQcѶvBOx\\fzhQ4;2,\$XAb?ƀ%_ߢ8gl&ů =z3SDu^TͨM*33PyJd;]k*e-aWpa?@N53 Q^_o;Ym`=c6U:qveUv 1WyRq.LD 4v)ހ'#q^Bo҃PtɇLs) OKlTFgy %UۺO+>XJ0t8-]" =Nj`0TU.5νHuⰑˀB S6rIE>g3uxnhf֩: $7d;Z547GX25 iAE_a2PDggQ &r{q !YaPc6XLvtWtFjϸbջXX-QtߠTT\~|{.$2au78gj揪n@%7V]Iò`[(K9r¤sbYxa5FwRXFLj d\ϬN{b1풏kg S͉/{~JLix-17׎UC ,i`l< 7D ǡAS¨at6[ \.!Q^#̽e v,#•ġ6WcW!,n}!g֝f_ LOlf}Û^da\) z? 6GU "VE݌;[eN) ݸ1eL@g97gBD !fc3)1f/Ovj_hgl6}Zfg*$,=o-%$z}6T)5۳7qͥ;DXxP<0(o޲\W/vK6˻!=D;52)~C9Lӂ*T򯓳`D E6D[fPSls" qY)Z9Kn;oU@^!e6>1&:~{ƻ P%{Œ_9nd K̓ ,LdDY~E-"$;3\,*bݤ4Ŕ=-F_sG=*Ytӏ6_)}@ h=U2JͼM2 XkBޘP 3U*<;8Ҹ' {Bg2[GGj%Z'wq<̿ .P\ ^u"!|͹3>V1Gy耮6:Q}j2dQn{=+T+7Ft|_z G EJOФl y5,(- 42j91Dڬ#n쾜TG; 4\z85E2D%viT[Rt+ܞM%/( v}x^ͶR1䐁S!ʒ:t "]M+ʈy\@h]z;ާ H r+Nnis*juC$M\diY0yTko)KP}DvX@)Nc]pV:@Eì[MJu%4Y65nt##bZ 78AjtmEL{ Xp~e( YbD9Hn7iL)R) tYሬitoGQV" ͐bf.qb4Л7aϫy1`gl/vJ6` =v4r:Za Yn0׎mh1@IIfqt b7ɑvPB?'O~2e#_[*4՜ ƥ TCS1UtItKv>d!}n`SBCIqgaua]s=>\7~T-^oClߴR[e]qy\n|'ΕHdtQ^ n 2$tCۙ }H3籦0a-A}tL"H`;E(~8B, ~  AIk޽ hiP)ݮ%BYdܷ? xôfCN\*kߤ=Uv}#ftͨ#"B"PQ P1h ʼ}% t{_nyӳm=: Yq ZLF}+($ӥjH[h\ 2'V{:B,8Qcman 5JA]d^$}ILTg#rދE0.[39r| :d_hhCW[;XJa#6h2*99哳'8[!XKQccy܅ ,Ɯ{=]FH^аPo pm4W ` ͱnvas̀A4N8Q@9|zfjU/g%Eq6-:Q(ŒX7PFx_4.svȽ;! = .7RM$z q,M> yY -/|i(g`g|CRQ=I6J_=,knqf 5XKP,Nk]1lώs#Nj%A>=ô /EZ4KYh̟rm'qL. ֝-W1_4 7,lV- dVMRJhcPM ]6 ^=Dl_kl‘M/ȍqFO\#b{SMP[TlT<:lcIpUKR_OJx\%%{}s qm M,ѧ)D^5/8U`rka#WvF"J% M횃 Omo1_,I.nPñFɌ]aS2Lgpz6b0KBK dbP,3Jp=F 8%[-)-[+`Fusº-e3&8wQg!qMvG BuOg4 4n!-naYه%ќOxyŚQqVڢ]k}];r4CуH3Y\b%s8Z=|t5MDAq/k2v}*K}z6u %Kg9sq aTxBRƃdq@3]WjLTM5( i{B}KBާN8 ]zHocV׋Mwz LjDeY[.?ˌIkmL٦;qimE4@d>;V,S'1H1O5rRh.jQ\ on71Ilq##'9A!>4Nx4l?O> stream xCXH!L(: :ACG2ZSuRvƀ#I\  $l: "vTᄖ؁S3[8+\8 o X〔(OУ8v%*„~KÓ^JDh )2NB )#P%P2`v(qv(4`Z` vh vC#PhcGg,-`EVh ; vX/ [ N+a+pJc8A#^. L8t`@^z.to<q ^D+A#l ր6,$pqB<0!b'$C5jQ4`TPu@^ с02Y!zIІHb y\h[W|0>K"*ׁ{Au,ؿhG(kX?z (4!)`Pd0)IPL1PD^8,&p<'ݫ!h̢aҲc_T-QD/0`WaMfhb y\RiRiWS., ,(Y1)㕤OJ.mEi@HYty(w(eV:]&}0_՜px~d!A ñCQўv8:eV,W) *IG 0=ǐf] Y)GQ&6rrd8Hn7V 򽾁YIVtC& C„JSCqp (@A ocdĘ&H=6oc~IC5:!Pm #72o\1BD9M+IIڐQQ)49Pz(4HW)uxPAfdI+GKvj++3 oZ|Ԭu4,OOW.29I H TjC[ TT[q X&,Yt)OxF +.r5A֎.x" G! o2%&Z=25RM8:<⽠̛A qq}MJh +U} [1:V vTkp>r?A93 \54J#b׬yc)j!E9E)Ar5XEbv)GX]NJ8 #Ͻ>GYȶ͢$bˎ1mr< 4J SC%|yTF'x$Kpx&7Tֱɂn/cKϤG-$ ^+4\cdL@^^D+h 3.-_6"\6cի0~ɕJCmRGAP.^P%C!W/L_)i)E6qL]ARzD WTuvFJ%/)uzL;T|B,%E"Ebe.U'kE+OZ< ׌,f5^lYԹVWCڔ畎o~?^YY cܮ٤BXT9 6R-<\ YY5U~GP?$f~׆ju GUVi*@L;UziȂ< 6%ڐOհq~G'5ETbaeiU` Fx+qOQMT*bfTI?P;X ǯm72=GxGU{X \r|N\ˣdߔo_]703r.հT )+T`^M5ܔ7_o;R? at0Ujh>-,glaM!mZ} l2%FvޫCg׆]| ii{|I{ R;'y],g^aF===M|0{l{l~sB%D uԮ] >ڷc/~e WY@-RF7E~㍴kb9$xK jv25#$Űw&/i^x$4kB{Bs}P۽ШIModю>Bv7EEEʐhE3>64+:N8n^fމ}yNw^誂.^ &8G5kKn<ƽ~-˞0qɭ @Xx1ql+@q9T|Ȉ~x5OLV G_@CPj#gGD|H%B%ns~ByӦj#|rDU'[-omu" lxYdx궩H;BE>ϨD mӤ.|H4I1gMNI :9A^ORPC62to~=G:>~{I=:VrtG93?;fImdxgxOxÍffꔳ芙w_g)̐vU@odONޞX mV> ܦGn 4 }þY|4UYwɋ3LDWq h;iYĎk!MqCo_?Iu=s14~yBYsˋݶU8VYCyhaqoHw]tجڴWX(0{S4!F[}ֆetZfJ":s4I'D"z2% v9[8˒+,By "-B`(sQXDq>{$ ~ًb)LJ5.K6}_ һ@AtסkjmW)N۾{]b71Gd^o~mY[m5~g7}Ez1jk颗}olb_<.]|nsW]3 ީw/)VVxu\;NcoZ=+]*̍U.%y#_xvtt7PN^-i]P#wb].]\vU|IrP;.uQ/iP0NyXTGn^o(|N#w.eCz?ʮMgsq1h= [BLrJ=[uCNvp]M!1mނ &nhx "s{H Ar?7GCq.p>Daܔ߂%mU~a{g#9I@E OQ6l<[&&ϓs!.B l-iڪʬijv*)띵N;[!DM-ӿӛ2h1@e'kٯЌLrCkƻ5@LD-id W-` `2{VXV^|gwY#&p9˯v5FfwpFb{24&_pE"[tSY!X39:tSWsMDqu3ҙ8.Z3?j![p;9M.G )$ >9O>Og|_km]BOݳy5 ٬[?` ghL?;+Nlȟ5J|(V~qfYy+a|Hp>ʩlp(=_֠>Agt291p. dhDYf@E$tfC1=[ҝg I|mM~jك Ad L)HvЕ?u4ӦO|yƇC|_-EW01-*H'dfĠmUUOEP澺%nL,- endstream endobj 353 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.12)/Keywords() /CreationDate (D:20131119122954+01'00') /ModDate (D:20131119122954+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 354 0 obj << /Type /XRef /Index [0 355] /Size 355 /W [1 3 1] /Root 352 0 R /Info 353 0 R /ID [ ] /Length 859 /Filter /FlateDecode >> stream x%KlUU=޶BPoJ@[PJy!&Lu`pipbb"qjщq4םos{RJ,,)3:6T ӻEUnѻIU b; L,jO:ZL[uzV v@#]a} ZtA^TJ>6hY' 8g`&a%63sI;n}00 ]J5qӳp i xuGRK/;'x8(5}%Q8 8)Mv.֕fkiP>Tg,L9RZ{J?T32ҫup̜wLKJ=pC3.-, #[go9gR92?" &Pp p Al#}m7eoQM5 APB:u (5Mx R"=\tI?y' #잇9c@4Š40,p8f:@TQ ᴴtԋ0 S#O09iM_{y5^|sp2K[و/ UPͰ6pvA^%'#^eڧGWq_ٛojQpU_qզPe*Wf;TzN>\ut]u+uuPſ](^Tz}ʟwWQsՀU> stream xڵYKsW`9ӹ$xq6*DB$!!`@RR9ga,ys=U8[]b4&eX&?73ç}f;h᳃Ⰶ~3YV8hnZ/xZ"М̕iyV]Ѳn}2w4hJ<~eEyeM]7:&HZkbx]|PIe*H$77LSVdVMТ?\䌇dJ-M ])%fаMѥZzfWk6Fq$xd&R2sH&}#oIǣBSFP|-; kpaШDbU$Yqd7$Jd+^Mbxb!rHFLzQ\DT`?B:SXȩ˲#y>Oa%' ]v B-[7-vHe 'P;[Qy%#\yBn%Ji}zVc8bdrnY#M:/.zh)|cM*A>2w\mHPns a[rmF &+m8oє#fj1/Ҝac#B)7|ulwzER?e6GH "QzK_m;Qp02V; 'tνV\=uLhp1eRs 4z@'r-2R6Ջt\^ r (;m^,5t2[!>f iq`hLAF 3#N`ϰpn 6\e/?qM@&i),הwO0Oͬm$Niа:RS&[-`Iݭ~D:FN{PBEƌMsa8.3`WOea/.pӪHl6>. (S"1\Ɖ't))~0Nx5RVh,x"/$O*0 IQSX g$փ-56Hp?8I7VtÛ= 229&~)Bv+[C]݉> \Q!<%Bw_S]tHF@ZfY.i.@}2K@e5&(^.z}O pTG_͔QbM]xhEk'uxg5Q*}mm<(עelkQgv$\S}詄ލoM$vz/YJkJq4VCE?=΀x/  W5hD 3ul8q 6R)CSFwZ%=/m\fP {sڡn"hku'.ī#^#gM˯th,+sX^kiN_'/ >uq[ϥ6[c*!ߗ a\b#T\r>ăxXNtJ~mѡlҺ zYstei&Z@n^ipLeA|%2 0~שnƢCp"3f$@$Ǎ~W1I3'-Tưb7F.>7^sxڡ(_ecԎ* C?yP+Rbk+S;:Jb{OYIP9?-7y M,LSU\Bdu YE䟠Ij%Hj+gSg 1^2j1 ٓJ@|H[zMP"&6L1>|?x_o\h &QjE.կ.>G6&w(g׈uY35 endstream endobj 68 0 obj << /Length 2983 /Filter /FlateDecode >> stream xڭr`Uؙeצ*Z;8YW9@$H1" (ӯywS(`zfzz v_)y{ͻjUZZ/6 ˴2բT6Y[/ntrxY"# T ,m%agIシF/< šMy p =N~#fŪ|`YƉ ah'vcHpr2 r'Y;e" $oe#Lȫ\RC6Xkg;]]&uJCQ ?#FJ-[dsE~Ȍ#Ϭx!(|DORd#s,BK>fSݹfd!b?{^'8)s]!>ȮyqB:2|.kS[ lSi' aw>R:%g:;Fҷu7|ޅ٧Vd>. p֕ޡᥒ+&>:@U9G Kz<,I ˊgpTNj"T1Lׄi8&uj:2(l'x(o97Oshg88s^Np#ϺpJ+Y0vGI)MYKDb|k%a ϕLe2#g gMCddŭhy . /A={ށ3%Mlw-N"|MOuXS!蟒!99OYK`]WJ0P!ntԙ$> CȬEbz/-~a)BqK!GBmX$G}|cPlPpIZ%3jΌY+x3Ϊ"I=FSif [6R\3 P"QJd׸gP.2A\-j,3-/䑶;M4*.%a}ÏI4EKg* ݅וX7nn1 .kFe;%[·HFSbXfQTi}͘ЁT9g-'FCcoġK SFyAmi=T}T)Ԓ€jJ9PM~т`ܲ-Ҵ8+J)V3,9 +Ʃkq9rpqn2_8 5P]h ɥ[ႸrJ3U:߈qד$O2K% 2p{I aћlZ*tXfrr8ՍCaa{5oA{{a`7ˠLe \쉪6P:B& $s aP|_ vegނI23|193R= {U?_ia5\P|``gUXvĞ_V1E8j6e~FGS{[ 2Nc]/4pօ{q&6%inXb#*K p1HHh VeZ|SY඙gR xd͜1/E =e%ܶܥ|+$o(I̳"1/CMgH]PBBLaP]Q]$QW#MbiҲ^r២lq,+{M+ ݆U"o\6V>U㑃4rM&MZ>%݉l%(wK>j>S/Q^>ĩN<>vd*rM(02sZ_ 9_eQ`|>|*|9C#Xh}WV(9;,Ni[q !,m ~{>ț7.`GϞ& o 90,+9}.+L=-8DO }-X`!F͚Z:,3kiYQk^(jO(՝̄&YVh;81 :Jm97Im*Fi^dyY.H}4 p8%)X .泱ΐqej)v]X~֋ V]R~_J;RQbrKWȸ{Yy=PW7&оo'#xV<_GٽyƊK/ Jc_8mUOS]'B.X<-B^aRW#䥊 endstream endobj 83 0 obj << /Length 1273 /Filter /FlateDecode >> stream xڵWK6WEF\IME^m>>^Q[r-{Ӟ;ÇDr,P,hQǙo3\-3dK31f6S$JLaN"OQ/,\av+OE,g6cdnYhBf|v?ebZimUO*WKX[N`FU0OHt+y?kTGO(\89`8N/^bR~ &0C~}ŷe_j_DqU0L}5=ii4=@8ZG3 \RiSZbȄ>pKRe~ ұB4JÅZ`ds=T^oS2b?O9/hP+k`d@8f>cvc(f6"H8tsƼ]yg$ P $|@f?24d%n,Tq5q1a-0ӭF7)ccHg9\*u X1܄)P@ p/@ "Xp @G"8T> /ExtGState << >>/ColorSpace << /sRGB 90 0 R >>>> /Length 6415 /Filter /FlateDecode >> stream xM%mWܥP?6bCdax1Fîe`*VwU>cx|yXncnS?^ӻ*yP)*8QA~D J^{]s(uqt+EY%9Tn$ѰCMԙ$4L nhȡH {FEDM1%@*qf JB6¬zNTr x͡HJgIV*YkaH%;ȆD Jmf|/f1QUNTdC)*U JBJJT:%@* ّz JZ*¬9.(L.dY+?NV,ՑE$c7QUG%ky(qإܣM%ᐕJ1VVN~ 8'/,%o*9QIqR74K|[ R%<,.d;M% %oNVĩJbqM%1\]|݈R܂ RT|TA}7RUr Q꣒I*>*T %M%a8Qf}T:7&[(**ב<QÔ7<A*>J~Tj&.T:7<(Qc>sA6¬(Q-HGJJJja"oNV,օE\:C܃|T9Y3o*iab r'}M% >*iZƝS4ppz Jruqpd#n*ye?G% S棒<e" dY+'>*];n*9tSc\gN|TrQ棒{T.ėrŶpҵsޣ/* )(QZXzS3)Uo*)(Q-HGJ^6՛Jja>_1RQ9,\;Wo*y Q7'G%Uv$Jk7<)JA=~T:k7Yt3=*)ƍ66t+7)(Q4-7&[m*y"ԣO*y RQޣÜWT:6<)(QfN|TruJBCUҟ6)(q.TXwh*];m*۾Z%w!e>*EJ(hSym1#>*Q:,.um*)C7oz|ûO?$"&/{ u<;J 8}x]9 jJ*izVr?-Y'lwؠH #.C鈴9 s]1ktD(v)JǬ]1vc{(9D!E阵KQ:RYc.E騋c.C)tKQ:j!EktP:fRαv)JǬ]1ktD(vJX s]LQ:CfIQ:¥(vJX{(;(r)JǬ]q )K_@阵ұC1kwc.E阵KQ:fRұC1ktX:9J JXrYc.Cvc{1kwc{(;C!Ckt(v)JǬ]1kt ¥(v)JǬ]1疢te(k!CkwccRnP:fRA{(;C!E阵ґC9StdQ:fRY {t4{(sұ=E阔KQ:fRAc.E阵KQ:"Ekt4 9JǬ]9R.CktB1)tڥ(tڥ( St쐡tڥ(cRY s[9JJcHQ:ڥ(v)JǬ]tLʥ(v)JǤ\1ktkP:~RαvKG=(3=X:(v)JGP1wc s$\Q9JǬ=2ΡrKGcQ:RYc.E鸋%tLʥ(vP:vHQ:fR[HQ:&RYR-_@阵ұCktLʥ(vJZX(c2HQ:M2αvc{1ktұ=C閱t@9.c鸁cR.E阵KQ:n!C薱t4ƛ(;|9d,tX/tC!CktX: &J)JǬ]Q 9JǬ]1kt(v)JǬ=nt쐢tf1ktX:z^rnE1)tڥ(tLʥ(v)J-(snP:v1t^(C2P:ntd92rYcJJX: "G阔KQ:fR[P:c.E阵KQ:brA{(;(utC!EhRαvJX H9nG%Y|h OvuG";.<_ׯ_?.K|^ w0]l'#Z,!` x kx pD`Xy/y!j'#  '^0[z`֋`4X`8Xǽ`<[2}t ?ke0p| @6`#Ь@!"h8v>D@` Z3fGΪp; 3D 3g 4ϜU;v"Pf0 ͞8` ZŃfx+'iCѨ!h<+vwۉ`և WN HiF`|#gx+'# qx ƨ^<Ԩ5|]gҪOx;(4DLCiվ0`h0N94<ÕDjmDCD#mk-n뫿]\i^4/\+S]s\DS:cR1,/f`&kPh2?-_mK;o?{_vQ endstream endobj 92 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 78 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette_glrnb-004.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 93 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 94 0 R>> /ExtGState << >>/ColorSpace << /sRGB 95 0 R >>>> /Length 6955 /Filter /FlateDecode >> stream x͝Mq+f)-m=|)8 cJ8>`\z8 . OAStkKG @KR~`k'ˤ }jr^4hNjopyÜ$0$NԼ'&q~D59}X;MKa)&IaLTtD59rD5dJdoI`+S`0OM4}yjzS8Ox_`f[#S`0O([e Px0MMbv`AZ`P|a_0KMR`aO}TRlo6BQO'o- b*v34q`BWI 8UqM\%5U¹2+J@W [뙊[Jl4qCq+0qx0[Ĕv4q`S+0qf L\%ܫbW`*XiLjP L\%NTIL\%bUR]\e=˩{5(~.{(.*-.X*|(!pq`GW IűU5 ڸJHr6q@W gDŽFN7qr\I6:XUbųUbųI>NWq-~˄.τW*qůUWI fq l]\%渎*qŮUR]\%58Ubۄ.{(v.l*q.{(v./Opqs+pq1]]J8UBK+pqp'Y]o=K+pqa3}T.]^]vtqp]ʈUbŰUDWINJE1,pqKq,pqüm\%K1-qpN.)|\%\˲v)>,>s(/JaG''yŋildh$[@WӼM$[<6qؠJj0l6NwtqbW*.c 8OÄ&NT L\%䘆 M\%P L\%iU.[]h*43J&Sq+0q,Jf&IEq+0qdq+0q'-J졸JpT:W T L\%6H#Jj0;n*WI=h*bW`*XW(s&niUP L\%5Hh*v4q8bY`*qŲU╵h*)>#Wgu1-0r`C'WI tr0Qkq-pr0uH$[|C''yŋgY*1qE'WI vtrWXJ`ZIFg8Jd'JLaNh$[|CW{(>*ABWI vq8 ŰI6P.Pq@W ΰڸJW`*_ m\%ظJLrUCůUbu&ILrU._ĉ*~6h*1cBW W`* m\%L6JmM@ *iĩaiS%biS%J> JLrN8UqaNƩ{3q$gZT9̴ƩG1"J8a9Ub -rĩ^Vtqx4ZT ŞhS%hS%5ENJ*XȩJ*XȩzEN-Nk$[8UhS%NNK*-qIi?hdJă7I1&'׾1~{?#w2w 4gG~o_헷O?|z|>+Y*->חra~q|YGo_|O?>}]{?@^` 1wąBy!s=By/1w b By!sP^!1wEAys3wBysGP^!3wEAyt׽UBy!s=By/1w `B掠B2;""sk5ca/Aw;>t9az}0wQaA!1wEBy1sP^1wEC(/d{C.dʋ;!d`1sP^!s`L!2w}s "掠3wEv2wAA!sGP/a>(fʋ;^02wSAwBQtb!1wE1wHEAytx!sGP^1wHBysGP^1wd!2w/1w d;"aCb.bʋ;"w3wE!usGP^a1sP^Aw{)fʋ;"R;D"掠=q!sP^Awk5;_#(/`1s{;aE}&Y?tֳ8L P>@m41DM:H{<1jl1hٿTO2VyԘ}qָj[1Q{‷wYU`/ f_es޳8lzlR=!]el}zYv6 Rwܳl}Y7N6S5˦/Sl0ӳlMYN6f;C6+es'%fC%w٤a6`celY~)gv`R P`z7L1D,4{ aQݛi2.,Ôm8L1Pb&A$QL1VCŔm`L&-DhL&Ù-DpL1^yL&-oEL9ݖ,C6-OddqLxh7#fqPxj+N&3o;Kuwjxƹ^5gQY5Yv6e s[GalϞ%g|pS9ݖ,7mSD*-QYq*ے!bL]9R_t*ےQbXNt[8TN%OԞbhj?=cSYñogigն< $aYO3zdM~޳뉂z6| 2jfZOJȦ|y| G3Cxf}g IW{6,=f' A  gbX )#r-Y3,Y4,F>Êh㊻07,wcpX,A䰜nKŖcbŖt[8|XN%c1''nq|gGG(n:B,,!{ )nq)nq)nq)*,"Ì#<0G,ےŁr-YI,5f}YJ,}0K,ےr-YM,<'{dq@qDr`X9W;3o5jp1}{gw ~h0vOplf1ƹ Y r6wl}8Y sØ8gqbgq $lGءb3A,lO:f{L3}g{3}/ 4ehC{41=fŠg,F=yf1ٮM5qv&;Y |2[{/@;_0?^Ϯ^~iGQMűB6bg~p~ 75CfK ?δu$ gZgZgZZp|xqǷfqnKGdqxGfqnK}^Tz^q|) |z^ka8"l*7:C6z =W<~px>ifq ox1B"oN7gա '\JX1k*6ŀ|bDݷq/ے!bL/s/۽AbT~YŰ>Ÿ)sb`V{12G"*39;y'pDWW#\i6,l7}r]XMϳgq5ogSFҶT&=| C;+y' =Ԣ=| ;z'j}{H%i6v,0Ir?peXRrinKW$V\$ےU'dqIbKv&$&+P_J-L\t5Y\X SρKt[%EL\tMY\*&Yjq|UxW$VGeJbuL= S_eK-+Tm*t[R%9ݖ,VI+fڥ_U+dqJbL滮^IɮDW$Vd*JXdIg5KbEMv/wEKbUM=SZ+krْX]S -6%9ݖ,rIKbM{]+n>xIfU/7ٌ%&%' 0U8| &'+aq_\ XAELbUNb+sc2&uN\:&B>\$Vd*ė:qaSI֩k;qiSųb&j>ӂN,I|W7Fwz&9ݖ,I|78Vמ[_-{o}8>ϞY\5XU.#z*+bWP%Vqg+Jw.WR%Vs3*UU]pUXٕJuUbW}ֹJG'Y\iXUσkt[*꫞WW_UbWr}XV?.\`%Vg+ė`qUc\8<+35Vr-Y\nKWe% ZS]8<+_UW5eX\uUk:OU䵔ɫM]T<XOpr7)gUZ|*U?d/Wi:re>)Ux9˽*-{ڧ!{!{cx*!{ nq=^CZ|-4yO*{nqߦ *x+w!{s>| )J~YUa?,wڧ]rês}_}kxg|}S{iܕ=w]ӫ2x.Uy8 0,#|K%]h]o[qyҸ ]ojk#||my}O/zOU;럚01GWFfwG3 2>І 6czr%w}qGHΒBYy"Ca^ڵ|;4k~М^պ}=\dj ɝ^V͟%*kDtrRӿOo?` endstream endobj 97 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 103 0 obj << /Length 3195 /Filter /FlateDecode >> stream xڭ]sݿBӾ7Τ34$mϴ3<$ZRNQ>}_~)wރMX.v f__)yBQ^.ԋJf)zY"ktY3=wr4UJE['㵩39\o齎^[CT <_G:u<hٚdzpkqxzafG8~+Hdm\.ۘlgǴu'{O~-qKKGJXޫ.tȯٍjtmL=W;@( 2=m8 a]b~vJ6KW#ѽ ڴ)(MsL!"{B/^7DI_F^TyS)*sWy^ڊ5CM+kQuHUac'' zEh]u2U">tf7cP2.}jG,6yY1;g{ԨwY=:1ZV ;,#9ÏaT0RO=?Ai:>h7%iOe:C~:R|ߝ\8LA)9tU9hx )PyASމiٷ?c\{(N}IIbTr81`uӵS?Ei_Ѫql.N 452>Z`ޱeha}1Krt^:A5#:n^_.O޷W[E)#>]O/FǾgߑEk4ҧI}'VcxUX{"˷8AVu X4נr'l@f ~A 4ொ:2qʭc ťb.üK")$i&H]D&/*64IIHȁLT VeLV^Fw 4h=sp8CV6dг46s+GD lպbnRkC|Z{Yt 5&L WU=?YQb!=||bfω0.Y]}usl [H˅su^C[~Y-ְYm^| ¢D`_xkf9U`K'B ,7UU2#@MJ|-?FT@5Ѻ vn-,"}bB@}J> Գ&rO[11?@d7\x률.B\1s3,hLrb"KN$¼L7bto3RU ]8UBAFO]rGOˠM:>f@nV͇֜eJd;FÈS [ gԵ6$&WRe-矤졢y~Ц-:)z6?R\uRsԂ@rE|8EHS+{֌4 ܌EEK[iki\Ηdc}/`=ǁloYnrQ+W}^@cʌl5km()M[㈁\͊K3P-M Rf6kM 5%V̏P K-ʑ qs݇ߦ23:8A8r!|19-w668YL7#AKD3\bò67TX]g_;{6y\Kb ~`}X(bg@\ư]nZ(4nL}[a5:&k6zBAb2OK>P Y^su2ewDɛԢ3f9LսqIjhdح/+\KXQMV_$@{, \+_9PDk+0TMX͉tCg?\!U@]?g?@ֻΌ Þ*w- ]L|oC4iCЕOTb&Џ#9q''QV| Y05u,""l$@پ5_GAUɪ^#ƢӘ1,}ÝxdINar՝Nz?$P5$TGM[搪j(rCz E81ϖo#1R0α lP`ic9MBI3p孿'n?$Y+؟,RΨTJ9-xYy+O͜FIRGz]z'JѭfS\: ֟@Vf h祿p" dqG1r\ iT rd}֧H4Qhb0VЮlobD43\,WQ%> 4BER$ԓ-jo( +*`F0gɴG=6#Ƅxr\9o4{`% fcęd9#6{to-z, ^% #Nh#/ű ~re88Jq|qIE%Ŕܼ Q_2u32U7 =t+P콏D1|#+z.zJi:,s5>o;{ B#yh{ XFP(1G0Ǖ[=uJh%?t0d牸£3oF~\cGǴCj,h /ٟL]a[y]<% o8)ŖHd%8IN֌-1bY 7?RJÏsGAJRJ8mAJ;qQQvu/1H_#_;{IL> stream xڵYY~_XAlsy: @.H1̓Fiq{']EJӢbn֧ՋB/4faL*[-|^+_E{Fʙ(!-}2-|; Ks0ͻѪֵYnɮPڸz~inr8Osf}}\z5{FR:뻯ztJ;il(U]j"UiQjU>hp$qn,W˕n @+[¤w0,/kT ?. Z^ld8}\*xdbU@oJNCXa>g<~\%s]rk\^x0f_+ ¼pj]Id֒U/la\:_Hf9_xH=)^H8Ao:mPQctpd5NgSr]JRwmI6mN{ /b=n;$tѐSY[X;%O՜ aHg\{) dwC47"!]br{"-U>)ȃ(Zv`Íև<+;Z*5,!ҐL#.L.X5W+n-SK-FԤ|jwΚf̴0,y{kbt1 ܢRuQ!V\}~)ϝ/i U/_KV=kCDy!q=\- a$%SE͘ V6aC fڕ՞꭯$J?X' UYuZp);ccoej2au^]\twu^-™ʗ9C +ej DE[:0}|#'iuE0;\e\(g$#%,!l[<39 ~%Wm@}0bB )0ȇg?;pHl( Ym{)pkf>řU3Vғ/ 7wq16VV 1 ߰,ߠS PKѕE9@V޸J̑C }G^E;^osh,kC\U&\c]w͚)BgrMuL!{ Kl3 C0oK{{ GtL 8`XEdu{ϯ7Lj'(H*v3eq+e},t.-os\%De?FD ᆕb@'r`hBw (e`z(dz|̝O\ ^RLOjzrlymA ijw+1ԩ3+On=/H3$I7rtQ'l50|D|1l\ض|:j.SW>pn@+[9Ghv4L> /ExtGState << >>/ColorSpace << /sRGB 117 0 R >>>> /Length 6114 /Filter /FlateDecode >> stream xMq+rf! SVUr$YK#gq$͌*nlnoͽ)e6^$&sm}|]o-ԏnq@sO[4H?wtBLNM[&ơJ8vaD4w!6h0tXa)> :ct[7P !.,8EF.v1Be u, y H9]cQp',r۠Yaé_ S7ױ(} H}X`,2bKFx,p=a_g"#:u#EFa]"#nNfbo09/)lĿPd80H8q(a~A8iQP34CpC}h 8 baENX'ș?nP !h S?|9p 80 80Wg ę&~Al3 # Cj9ou( K7.P !41.H5p應_< n cXge a̜cXô/}S ̿Ա(9swb~xȈMp柠0 s f bsޟ`$2b8x 7bFS /}s`so` sL0 '-0MH xq>r҇9o0980.h ,.5pYG^B90 xpS> W!:pʇvAS>L0S>Lx8u(  )5vA, QNC>L})9~A N"#Ķ qkPiZ9/M |k@BT ʉ .8 6&A,v k am0g\a4DS?L}9x 8)`sڇy_N0 8}Z+=V\\9 9/Hh l8 bÌ`GZ+-pڇuA> b Ӏp#}0]5pi 0 N.{>, b0 bai ba]Xq]O}Xa9a$3[k>9ZA'=׺ |FNqPN0qsuI8_2N1\,{5{BN0OO xXq #랐6]㊳#'_'\ rO(5F럐/L*䜑\R7s՝3ʆt'GN|nߞp߇k\m79¤߫jodRN[O';9o=h4;9s=yڧN]OwN^Oo)nmaԀ_ԁ_{R ~=WbOzIMk'u:˞ ߚS|_i'g'#>{R#~ыvrF{R'>aVzjOů=^{R3~ÚI|ɉ*=uv{R?~~9I-bܓzܓ|8=+uݓԷݓ-e'继e'g'u~X=5ZI'5a|>Ԟu=?ߓkրOЯuX>Ea-=֑K;9>IaM]֓/q MߚSܸ)?K;9>O_-'5q:#>Sbtw^ڊ7[k~Wvrf|R~mú~IHasĴ3:XG>eZI='5,r|R~mźImI}Z3:':5ԻyIk'u:;ԾI'5~X>/;9>_YI=֣Oj⯭X>a]mִ ΦOo])n>дqX>/;9>Z{s?o9V~ܗHNΫOj>:>y78w?gvrn}v~kqNNήOo9\za_밎}RK[ǚvr}_vr}RWu7[/6ǟM;9>_p}_vr}Rs^g'uNνOo9m~I $ ZuZuT_ϗL.zF_am>zOwNON~_vrV~R=Z'5cf~Rq]ܟ;N;9;?߿O:Wzk+OjuXS?_ֹImk맻e''5Vs鴓[Gvr~kOqVG￵NOwNOo)n봓[;/t7e'g'}b=_ǯ;Lo5{zWNHIg. 叏>^Cɟ䒗{ҕ1b…қ -O5^Grx=kaN[xt{");@)v=. w\&?6ɟ_GFzâ9 sװ(0tK|a?zd yG~3/kx^-c=~x]g~6^rW{ -[W k8I~mɤӳpI}ǃc=Mkxg:dPeGܒl'} 5e w<:>%5IOyBt)O6Rk.apM xL`X;GzFC2ʡ|W9,"7,%}xbHxgEvgʗ\ }r~[E2g{!_/8m˜_p3s_<|-`9Vd, k+w鎗ޕ r/V!-#l ~p}8 0皘R[D7źw/m&k}ңW<'3/|woKy_̕ endstream endobj 119 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 124 0 obj << /Length 2538 /Filter /FlateDecode >> stream xZY#~_?HgzH^I=QkvE6E$<4GXLϾ{͛/U3Uk3L+ͬԙ2ݬg? 3 iny/G-eYowL [ṇg OKF|J+Ybv~K[O^88XWC=m3=$d\*Թi,Ct?c^瘴!5hΪ/3:b`2WٽY$?'&W %%煭Hp{G$܋_DqpU+@#i'KtDh6\|HN|{v=@HZUk71jWTQ.,ە`L{s84Q\f0_iU U|[WrY5{љ Imrʼ`8.O0`O5dmux~{z.^r"=3!Ša#6_UӾ?n+g ŻJUTixi=f0ZvǐOV 5χfKAR:,%LdA_ߖ%HSC83bUlSaJK=Ƨ?ƷI]$Dutzg}3X=KY6hAP|0}s.=%. 1c m(ω6mݓ:P}5kB"VUY䴤ѓUkFr:-fo"'m Vrx@]L,f'j!k"39 ^W*.N ^< ^{v*|J:\ HdIx{ OŎbF9Cn*|S*ZՆq键$fHįVcEtk'dqXG:oQy$U \,^ٻ[CO̮K-R|"_حYf8WNk:DTci xǀoy\|58V6úm˰:<(4tvÉdQùjG0"tJ$N?: {$[Kj5_bOze6MwƊ%p"tJYњXl'`e[16wj?׈ۨ4bΔxV X>#u4|U1n"j t,,;ɪT#!qJee1=D>2I?p[1€ev%;@dV^mW?끸|}píDַ)3xVo lN287a\^XޞlSTsF;=RW$4Z".ehQd4)Z*!F4Q»ÄjrϘnD.d*83Ԏ86L+f dMLhDOɮS4XV}J7A*Q0TBGn'jcsS*$*:8K䆡"cO<77nI؛,j5eHG ? *W R+,Bjh9$[`c 4¤ Eʌ#msp3V \_RlteȦ*.5=k/$V?Q]HvV`ndu>]*)`^õ_ᷪ>I [Yv,y<_KFₔgFDR"9X@ԗLKce}MD4ڑ\CT|RQ1sL }/=RwX)3ko#;_?uŪ=3ŽY)M|O2*N)"UI> ͿrF endstream endobj 129 0 obj << /Length 1340 /Filter /FlateDecode >> stream xXIs6Wp<=P %it.nHJEig2=)2Vxѐ-9s^oVw0P69y'Jpzױuf:{|,tk_$6EH|()+GyPxち\T` HBgH,D" Pիq^V1͚ĉYNثρruOD2j7bJLzV\CNKc;OzNĒSB&#Lgވ̘QXNC89Zې۩ҝ2Sqz]z++LG"'>uThn[9>ν'w_1C1t"fg?~^µƼ;j}{JK tO5*N;M{\XY2DEYnڄfR! Х%50㯕-S9 v{ ɼP^TBkRDf:zQ(3xx} 6:2:I܃UG !xayy+= ,2-Ԥ-48TzV]] EZ`Pw 7E T1#(p_-6ByOkז1䏠Ek KdpȕKMaNTӞK j (3+Ya/~M('>Vk7=r36b,פ:F>d> /ExtGState << >>/ColorSpace << /sRGB 134 0 R >>>> /Length 7691 /Filter /FlateDecode >> stream xKmg9ȩox-)3@Am2SR뗒h! w0]dfSG[H:g?RyUjcyo_ßɇ.🟟_^7~=_\:;5Ժm}й9]ܗ sz4][5wuYkVȭJ}nP5s;W(庭.p t>u{s"ףwa=g](. kؖ sHlbK9)P9$އ}}0!M0N͘YK*~ sH,뱽 sH|Gzo tMN&0!i'۞{aij8 sHC^9}=eV`C״H^,%v=a0!%Ueg4; sH09NJ0!q5f.7aCi=f!qF0!M^]aCBeiyY{-PK涤vf.MO(%X[0E(6^ t Os[PKS,7q`Ckn&m0! [y0! fܶCf.(4ζ]b.0!L@k`?_`C0!YN0!qyIZ`Cb}F9$1 FrUaCmiA,ǻ >vU$n{A#EvZ@؃ʎ  +?"qA$m4M  PqS$<ʝףB.a t e! ;nh[@ɕ!MlaM0& XþP{}gOaij A$ sH|`CN DbxAZ`C0! Ni C$ia λgV搦@H$6QD90JÞ11rU7w7n8$g7D?"Yԃnt7؅=8)11r+&pF6)o"c90 B7pNHǚ0MrHS>ߌC[M$b;1} >".>"qA&;y, F9$>">qH$>CHS c&v3#oo"qA&riA#6옾42o"A#?"z`&/H+ sHA#k74τHSCG$Ԑ8G$Ԑ8aggM`s]b Afւ >FH{ٔHb&,0!MHĉ~lD>"0D>"@;QH0JÞ1i*ApHc>0MrHtN wMpY}Db%a#P1{8߃k'|45dD7X'|8G$Y0{ 5d^Z$!sHS a&f^*fo"A#ٛ~b#f #=a&{^1pяHS`M$$݌>FH#+8=\B#S=یiHlW#|v 7=ڌaHEěym"rੵHc)A&[L6@¨G$vVzDb^ oi xhmg zDb7#ByHxS=zDB S=zDb~ o kάE}T#b&wE="!.[MļM$<©="> ^ o7S=8}T8#c&81o}THf*QpwZ$*Ac'LDE x=G$3=HD2m"qB/H8ӃM$3=8M ="M6gz4*=F6{]V {DB*H9ϬE NzuìaO9p `&1k3r3<"a&T^ 19̓M$jxQH#HD&m" 1r+="^ i >Y9̓jqHĤMd{ǡT6pS9σG$l"aA&yrg"a/o 4Ͽ?q淯4,^>^97뫿7~~#~BCo&__o~~o뛟Zh-"x{BfhC-$̉6DB hCцmP!цB hC-$y 6DB 6D"kfhB ofhC-$ mD"o!3*&y6EDA" }3$ h$$ mEDAޞmX $X 6D" k}ц3 D"oψ6B hC-$ڠD6D"k3&ڰmy6h!&y 6D"gO6D"oψ6,hψ6,my6Db hC-$y 6B hC-$7 6D"my{FahC`-GD"o!ц<3 <#ڰ@H!h!fi{L!mED>i.<#L'HC hC-$ڐG 6DB h&B o!&y6EDAB k6B hB hNPD6DB o!ц[D," hц}6D"o!ц[H|6B hC`-$y6SCM h3[A !цh# !ц[Hmȣ=#ڰ@D -B`1ц3 DD!" mȣD"o!ц[Ha!.mD"oψ6,mDmD"o!ц5Dt!y{Fah-&X 6D"!msDA" +6C DDA~ !ц[D" ҆h3YA!fi B hC-$ڰh3YAmX!LiAD"mV=D"oψ6,my6EH !цB hb hC-$ڀ6DB gDxHahaD"ofim(b hC-$ڰhC`-$y 6!$7{FaGDRD!6ULb-Bڰh ~ ψ6S BڰhC+DڠhC-$ڐG{Fah3MDH "&X 6DB k61ц[H!mDhψ6,mDL!h!7*$ my6Gb o;>"o]d.?e&?Ȣ]t_2.l}셋E ۯEJH/q립n$t"w`l9c)6밈}ܕE V,Ew"Gyb`~X̋>uc_~"z`:wEq) 6eHaيHiSK{`"d^@a/R"l_HE"e„1_P쩅HSK}ba")6gH0Y.r)6b/R6leHyO-EJ9f/+9~8 "b:ZG"bЊA\0RHL 0RJLH11``91KuE#f/,Fw"Gb: Fʊ~X>E#f+#fO-FʋV,F :,Fw"G"cY$cLyh"bn{vHOK,$6峋Fʍ͑Z.`yrrbn1ˉ nb'Gc rcH9R ]ab0+9> ӧ1RLW@G"d39D!ӝ1b#fO-%Fs)G6[)H6[)I6[)J6밨)KѱcHa2bqW.r)N6Hy\,/F A#%f?,1Fw"2eˌ]AcTlRcXz\1Rlb1dȆ2ˑ ;e#v8E#Ef-:Fʖn1pEɺ|"]c2 ;e&kv>Fʗt)`u0{2RLCHيeH!YSf)vPE"#H,FFʙZ82RlaA2RlՒdEHYYeHay,LFJ͞Z78}ܕOFw"g89\!eټ)#h-TFJIE*#tgsX}ܕWF ~X#Ӵiǟ]h>[G"jA#ef+A#ԠN-fa](4򘚅҆=ah\@4RRmӒhQ5 ;jLvCY0m:U},yX͢inX5 ;~o",k9EJrskRvEK#YL.r`)m82>EM#etul)oF^ڰ.rt}ܕFʯi$4R 0)Ojۼ_Q#etp)6洞H)KblsSrHA ]ȑj(EHY9˪lji6ˮ ;~"Gls$W#f?-F AX#% )6[)6)6Gk5Rmb5+9lkXn>E\#OY.ry͂lÎ_gȡk6KuA,6숶YmثaFw",6ٜ;znEN;TS.R;3oE}絛c~i?.ryNns|T-kv}EN;  ]rrrynk:-Ws[,ݱn--}1u۵_ozikJ-57e?GxNyg{Oަ ~{ 砏E飭lqjM ~-Jy4Tzq?=4 =m3y=6/X֖ ÃyӥWCw&y6Q/+'!vAnm ̨Z[З/msx[{~~yӍSdmr`p"S+G,1.W?pzOz-=+y$]zW9읭ߏ$qa>[\'8D{|V0ϗ6s3q#Rhief.6ӿ_O ;ۏ?ǓH|]C^bG~uӹ(Su>qGYsJ׏;HMn\M]wtp_vz>^qy%pXG!'^ׁm}_p3Me_Gx ֖ ޶ gKֆtNv2z_kMOϚ6]; __p@t_V4{}#ijOa{QvtH"Ԗ<"ʦﵛ-n0g*=s`A 7}ډK?iS3v<X[E{rW:ys~ogM灱O\H;\h/񢴏#uǻ qLx Jvuެ{v=xR^xD;'1ObC?I<<'ݏߘv||OvLҶ$UI:-8x}x}Ou> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 141 0 obj << /Length 2118 /Filter /FlateDecode >> stream xڽYo7Bp[`Z }q9ISzEC?4 K+e/zU~3ᒻliÙ<~j"'/HՓg/DIQJMBI5)e&TZL|Jsv~N Gt곖85IM.i~V~4Ej ^DJkYpnj2AܥL~latZN;s֦Q+j @ m{ (C5TxNnJEUScwij7aTnQ;2}ָ`eA5UwHE@Վ Mʵ=7oX(A\hq5~ǪkxP\?:*ځ;ЁqkKSWd#r6y >t}B@YrŬGLSf5r' XAx2n-?{0#:WGcԾ􏉪'(8]EuGDpgdgy~d2 O|i*V%+|kF]Oˎ, lw44-E&w;jy5Oc_@o8({Px%YO[ /+2>h|gP>VGfa醣{(wnν$9t OOX↭XgV/;^݇r:nwo[nN7:(q"mܞ&B># q#|g\<7 ~UL uP|F OG*vK{~#q3D(HQGJƴڛA S0D-iYoY#qH+^9} ZK`b#J{黰T5ۑVfuowZlsS!© kC͞dxep P."nyMjv>&=&`?|V9g#=s]nxhu.{:bbf-%MyR/|}jUY:8׹v7A۶kicIsoefB^yU;+L|k(8$WNr9@ĴM/-ťUE!*at^p D&s*0V ٜ9L2;,ֹtJQiL롎fH[f!gs^K^ g#JTY/sSe[+!H*wELX0GJ38fCB.x&E)MÎ8Uo#- ͢OuV cm6a'`uPƏ.^b ^e0踗,M֤K<#\,W`4|K'A1Mk_#(kE|x_7&ot@dL:~0<@vᛀ9"xFG \rV~֑T5z*ngLǜXq[sdlBVT8jF͙CB=H.X9@,~ρX"h13H$ )U1>g> stream xYK7ϯh97~q,ؓSCԚZRg}!Ƴ! r!Ez|U6ѷWZ^_cʨPez*MkˢUs"I 7;-|Ϥj!d-|p>)|R~?5|wfѪLˉ(QC_@7n`|++oe z3ȿظ!֎d]I{|J}͟nğ4ۍv~re%֪Ҥ^$&р(Q"cд)3\DHK$6U, 7E"kP˚g5*1ܫ2X-(aM^ր* NFtF,87ш~aXv;dp "-PS<~gNI9aWOZp`;:0#b/Lpc{s&:2s@4JSr]FϿh eYmG"UV!$!~ Aᷗ66>MUH(Zh*+/ʦsyz`j%0Ѩ DU4zTSةH&+Dc[@.* L)^X'O E^ x8$! "؁ 3 G8v:e,H7-F "ȡKMX,e~Ş皣2#ޢl`YK*[de٣s0eiQQ J@Iޅqe''ldqSe2{y:p,/SY[|v\0|ׁ&>uhDأK״Ը+"XGLh?WظOBn#ȢM8t܍]RP{2cO֓RܰIhO}X0$ݱVih(tOB@ wQQv%U;*)Uh4B>DhPQ'H'ޒ<-v^*2` 5$^HEё@I*X%lEvK7ػL-7\=8䀡 C9@@n_0Ipn~-o Vw0.N#gxʋ L~ 6r6$ip7ҩY~y ̚ 7/gi6qs3fZe66ԩa]:R$ɳZJn7~SrnGEX:Sb+~XB9vVU،-4#tA)Lgw}d\bQ%B.vn֦U#]#ݰv} $j=BL<%towi}ʿkvq N}rJ Pf2.8@hz/$Vd-psO x_bE$]} /{C5 8Vݻ;ˆ#.xej˳}y4k)JӪ qx'I*4RaR$#f~y$o+s^glu=XwI™F(Alhs)ƓCPwD0ZnǼ뮖a}es)Ov+D_"> stream xZ]o8}cP\ɶSSvvo-g[^p 'e37}`f%NElYŋQ? /QƃZaQvZ4ռ ߊI3n'9\dL#Sv/g ݝg}&M7&}?ze]9mIQw<9{ݝ|ƭ8Od -5fJIfV^u˶WUq5-Ra(IbARunheޭ݄NFJRg h3г8zRb+@ю[J2R&Z@4X1P+-@1^zxV+"P.kY򇃃Û[8Kp CZzN=/1:wX з`@h8GbY"_w1OeC/KN*]dR!ȾF0FziHM"A.-5<ٰ6HUmZ\dyWp89qsjGL=y-v=n[׃{[O6M?WS,|CFY.yEL%h˚er\a#zi`mLaIBM) [dj8d`}K`uq{́Z&b\ &Ib}V0tɕ!i+ {HF0ҩ8pD[ryi\ {Z#`" @D*MA1ѬǘH{ŘGk(j5EY. W$&%h& 8u t<.z~=mV]Vls|\b➮edRȦm5e(+i8wz3ÁNK\ڶ]Xu. ISPyޏsgPF>g B?z0*;Hxw,yπ] ٛ"j0_Nɏ&|˧Vyׄ{{[DyN<S(n&$rAu`GgR[c]9oEҸH,` L5>v.l`AgEJ:{U6E6?h}ʚ7QEK쏖K]Jiج4;\ &87XfΡE{I= Ū7CÒXut)5|\?h_p[ۿ᲌xs^#JMLsJd!=JBrWݧk { &H|WGf]DJSXb:A{,xn!P?wA5%|적O ߂IOf̓*^/d’ΝWh[?\UvyL5:zN n. endstream endobj 166 0 obj << /Length 2018 /Filter /FlateDecode >> stream xێD}"#5SD@PTT+@y&ݰ줥ϹxZy3sf|q?^]_x^\y׷ m2.)mfG|OWUUV"~-<'z-)il+$vܨ9Wk681s6wdk6\Hkp;N($) FH:Mr76s=WYǙįm'*)$y@tv.9V":OO,1`\ƌ rpImôhͨ+Xv!v!X,3JϓM2M2@& ȍӺ^T.%^Uk~ ڔ$^.ǒcwbD <Zޟ˹˂8?c 93+:']vƎ;Yz+"&Qů/7$n>W?\_i<_<ҹ^Xh= 4WVVW, Ƌ h\%3I葲-)ıPct><d'-έM)MBGv6fB+_l['=.f?+k?l l' aI廘WׂGRbĈ5<08 ץ,$Ŭ=bܝ%IG;-b=gL2_[Mgf˿ڢgr;X܄^`$f I=Pl&y?.7BP6swJ!2'8 %ZեNyy&}EY,CAtQa񘔓uҍ 漱SL z!Oz I^C'zfnQ􂉇 @7y@q6<&&}jY9;U/c5OgGʕ50iW>WGK|Om6f;YmFigqNB{؞;uCVEӡ*d)TNhWq$ bظ.$*J؉^X™PO5~@+Q]CKBysARۏ}ݝGVt=2gܸ:F~28L vγ^ ;Xv7ğ-5ԶPV GqR  b͙{5ŪWR9k-Mb2e@܇a97-C˰`ƽl QT(nB ij%^2\ei٤FS5JNƀk}o@ap:Wtg$_?W:]dŚ 8AmO^>dek/B (0U6 endstream endobj 162 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette_glrnb-021.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 168 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 169 0 R/F3 170 0 R>> /ExtGState << >>/ColorSpace << /sRGB 171 0 R >>>> /Length 6021 /Filter /FlateDecode >> stream x\Kqrf!oٮ8eU)N Y9RD=fJߧ kM) Io>o'sS3v0]׬amA}Ok~t j隯o>^ 4L[c-<6{AԎ[F}e.s1GԏS$snn3ЎG o~n Dh l6A>L;d=Bl`.&w[;v>&5L ]vڠ@xMƸHkv'F232>ΦK` N` x0#Da(^TD'׵ b i> "AprCe(2nn Dh l@Xۥt3~%6RЮ+pVX`ھEpaR Dv)c02-RQÆ!v*c!.}C0 b0 }| ?CSuq40 b !3EXڷLkX~>N3 ECPc7] > v&!tax8di?NP Bȩ@|Lb! LYnXG3A= D?! L?C3# v3# ș?H$Mp!dFb' 63V"CS`n DMLCz~ P B3P"C3 c 6'8C~8 ?`(F;F"A# .&h ,! LvaVi/Ð!q?P Bpo`F;Bil#<d!3ěY?(!0- Yq@k; b !34B8$.pa 4vHgh_' GNF;"A60 B K:CS`u]. AK!s>ɾ |Xagh ,^Nka! )>COC -5vx#9;CS>3n3F~"A,F\dg 뀋 {N}>9B?C N+ E؉m5vck i„ !3&z~uP BX"Cfk  p5v~ ~]30g]]Kl}vcho`\309:Cay)hq!NF;}Z=.3rڇuPi@a!6O&[kb ay!ib c F!3^a!l笜ak-Cxӊ N WN pa!콭ak-Cl>,343iVC>~2Jxak-Cxak-C&+ Y'ݻ]|]|{8w_7tMO#t^ Լۛ_|͛懯W_|h~o݇?4|o/ۿ6>|}p$'ken6?|U}oyy߼i٫6oԩBRy`ۼ TypoJ^yKD<AU:σDPA" Sy9R/1j.vwxG 8q9IyC =^{H$[eÓ<'OxD%[pM ;;gBmw8xIJY7x;a¿gq:c-/vZ~Yb<_bspooxy߲p:m#L£lwxOD|4r>,v2Mg,^axG>9O1kw4_c`X#Dz9K<_)5dj:c 7:%Ƴ|9d{|GM: '|䃉29ƳG>8dg|G>8oes>;<˾ d[ˎpWVƜx!1a>cM쥎gAs>3([5y -wx>e*-`xGg wpk,z'<>ai]׻y,%ƳͶx[8zqa1=>"zg1ƲSڝOr׸޽B;)Bmwxk%|/wx|*[X'mAH;<5,1a’mwx]x ;9ƳG<nd^z#׻XE;#cOxps\ȧ` ^޽Ɠ:|^Xs>3q{7t49s&NV@t!O;9mx!s\;9qy*D9j'N'/XBU+$;L' 2U(*JV@*a(JH5 ~[bE *RU)1XBvr2RC) r J(H V@e(Za jrFl~+N@gP?^NN@we'X 4dNN@i)'Y 5pRUCU-FtR]Cg'[.*V@*m(~Xb r?xTݠéH P/Za RU0JJV@^` niHE +b rvr*2+jvrdvr2R-c :h?TPZJz+;9)֡b VڐxNN@v(mX5=ܕTPzb VސxNN@x(=RCJH5i =h9Q꡴bU fd  m)H+m >=uRCÊHn ?h49ya 8])H%:N@(~XbE*RU9AXCO&/8yU=D9j's B~X=ܕҁT QRZ|HvBXC*niH;WCXCjsS;CXC9W;9y=U?${0HNY"a⧕WFXD#vrRipWvrRq^'~ UGm<Š!Ͻ }wRD* H%:NA(j HEp"RDVA*(~XN JUB]I!HV A*(}bRDvrjr +vsNNA(=zR )"H%:Ü$T3QZRDÊ"HU[ MV,NNA*(Xa=ܕ2t %I#k'R"P6xJ%h'T"Q;anNɉ#V,\<~ª%G (N:Bp z+;9b5EV2x:NN$A8u* RE$HuzǝNTHɍPKLp>lGΤ)Q0~( K y{NNA*ge\{(&Eݛ( xk?H" &Hfr.UQP[NNkB*F)bR5:u! ,xV 9l''lSJ_|RKvrږ' L{̝`Mi;9͍/nS_Dҙ7XsTNNC*)sJvH5=4;o7e3S{jϟ9=fsX3g^ŎYFWr |!BBnWuNc>~n %Oo}/z{?qS붼n9͒b'<US^8'2ɏ^S? y#e? {uOs,eC9E/8eי߲?OGמh_n9żo~>|ذ8!:|> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 178 0 obj << /Length 2271 /Filter /FlateDecode >> stream xڭYK6ϯP%T @abt83*K"JLR5HPñ[h4~| Y:"tg:S=sT.7 ."jTX'ϿWO/L-E篋NUzvu=ibv\uRۤ]v9ǹ05O5?A% Hˮ骫;m'M$gnnam8\##pcPmz XLvSeN,1i긅Tm?sjx#jb'|C͍M,F)z?Uvs͇|otz4#ɿ, T ?SwUJCdcF+]ǜThp:}'U:s4%t h=p#wlH [\hDl_mf0( &5L|IB{b|aAoj9;{/mT`^,#YylF'HzmGnY:MG*+Xl9v$R.5S&̎e+Y^LH՚G[s'H~䎖 <2]o[gw}dnZ>!4Wɿ ɋ/ p34tSXX8ݔkw'͟0>P` 7Je} *9SK8Z+|l{'rr=ze ?4|j?@ƂZ=sA휱ل("P‰{lTW.Vx~e{8+)@*&{sN]Um_G.ǡ.ae}󕬯#Xt$^Fj AS`,gB=!U|"/1)GZ'My;z%#@,{YJ:Nް%zUHL(i=Qhbt@-e*L_(%x&xZn(*m`}DeHL?{RPYJXĬNOqVà '=ծ|<L| VC!^W^!l endstream endobj 163 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/vignette_glrnb-023.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 181 0 R /BBox [0 0 936 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 182 0 R/F3 183 0 R>> /ExtGState << >>/ColorSpace << /sRGB 184 0 R >>>> /Length 6273 /Filter /FlateDecode >> stream x]qWp97lWs',)3Ri&xk.SB3s}$No>o'sS3v0]׬am!}Ok~]|O|5_tW7RkٖvA]mjǭXꇾļ\ .s3^)>dv=Ch@Cak &0CW|{X8amp8,}K(Ms;m 9. bv0b Hɾ ̰aiLD؉зLD߆vД3LEuCum;eX6!Ch9tܡ2 C7} 8$.uk#;v]!aZKe.8 KqH9vRB0SA#3:G .}0TB l a\dUK;\d0,~u q60b !3EXڷ!. LvB80b LhLq9=8Lv @8ywȑ!Aȡ!AC m8\  9X'ȑ!A#q1C~Xf _ ;ȑ?LdUpߠ’9Up`&2*`*2&[ an*&܃CXG~Xa$p8$%p\88$fȿ%3.}G̅@͉ ag #42C,#?,~}µ/'sLd?Ld-฿Ld}฿A34 }F vn Ll_c]0g}Ǚ4C™>|}ƅo`s, 8O+8v~M`OyǸRp pЇU/~ 0uQy@k;C38âhB,{0 |Xq82 [ $|c 6pȇ=@&V@0m?\daM@&}d ^n{)>,}c>,}8W ۆ{laa a *z~u ,S!8[ Vс#?ba Dpf`x&f;l׾΁pdk8a{-8l609úw}X&;}8Z-n aw-JX9#8$h6\~eo`x&kk&W%=@a >>UÆ^ hM < i@>a6с=,{X}XmGk h@q؇#q6p؇/p\Ƹ<}8Zϑ> nrmϲ?7? w w7м[ld<{w{76y?u?/߿|~m~~R0cI7 0yslp N<`Ce6l !1vp@G6$Wa pv P Թ DDx|p kuSZ[JeAbw!6KK!b (9a<$v n+~ē%儵xl8\ NpÍk<-a rP*PF(<񄵸mpm [9(θC2l+Opm j=\F<:@r@k8õ] NiL;|}(ä|RO_ʰ)e@lfROįpIpWvrYpWvriy'Ml'Oɯ2ISKom>i.;\}d~e%]e듦vt}|O_j eiJ.e409Ienm>iV)f퓦2l>i^)OinشK'/u}6?CKNt^WiI#w@| _ɉȫf ٍj?S \V؂> k-*j|&i|&QOc3n\`䤯sE6oYu_Gvr+vXΓ%x^7>OOb YUPvr: B!+ `xNt=BD!+qd-L5:?󱹝TTZkEG2"VuD^dEHَߛɎtG¤ +KeMv /]/"|iNEU4]RuJVE*qu.RW]ʯRUv]Ξ0q옮w/#@p=[NNDF^ef5eَɩ̬,;9yU=̓xVh*wSBt~2^FfkFfkn>US]Ikڬhdn^Gccͦq~2泈;9uy%.NNGӻHtZ])H%t+#Qc~cO90xr=NG+eX=`O H{])H%{8IfOڜ&TWjPab^yʾޘе޼!mK{xYS/"8em70&4xyfR㙈k/T%n{7^}%=˰o:9=Ie/o#fm b|e;|{Ek:P{.9кO%6Ǯw/|>WǼ9}Mz1/Au״MvJ~LLPRg6.?,qTK۽egՂ_Q^L2NOģ2)> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 189 0 obj << /Length 1417 /Filter /FlateDecode >> stream xڭWo6_@Ő)Q}Zۭ_k!1u$Zm+F_(ɉ$R>w<&ɻgzKT2N*.)*/2-}W3.y1˴)O"m~cb&ɤ0.e2phG.0g!!&}^ǚ6,\^~Vj TjaWiַjdQo!ϴK˸vaP_OfdF"WIr0 rjBPF?Ҥ96]#݊A ,X5Q=Y]k1e|؄3]OP)`E#@l{ƜOCK%Q+2r|=,fVvf!z tEf3VT :/\AUIf \VEdVN(|(\ _0ƝW'8Zr3#@KKY"@Æ1:za 69;K}ÂBxsyK /^EJUߠKgn0si1 sn["sۊRO*dbʄ ֢!c>)ƈ(#rߠ kxBš`̣4YD b`{*- -a#sR;.VM,1L:| , }pQأУZuQ5F'g~v*GaW8;P],k?06Bt>s9 XnwL^ɴCOa~ K| ;&+y]8l]g3cU`ףh9?F&یQI s5p@EqT&og΄*bTa AbjmKAoU)YJA'ƩTdPNOuP.8 ]hpX, ݌6 G|`یw-e}jx$!ji i;vѕ-K7KdqS ױҦUzAק~.KGEXObJ͔%tp\ar,Avcˀ:6S{1e_)ЍʎDhSTzǖrF*(&LqѽhBʆtd&f[FT<1T3ic&9<(8[BJ0> +#*uHҴw%w.TKA!=:K7!rw_W(,Z=zu;LfHù*5vP`wjːiC*L7(%FJǔT&,HEoNFҪB=2p,qWH%vDagncXƺl^JBoυ> stream xڍT. =twwwHw 0ЩHI7HH)R)4߷uΚy;뎇R]Ub8AY98ҪRn6.dZZm[o92.$/ iW0,B U!N%w'7O_!!U  N`7dZi 9G)(;@j :TPsFقA ubgd:A\YP&  P:ƆL жuSz]g-d vWo {A ;wmU$;cӴ;zi _o+3߮^I&vc.o2\J,R<5!$jݛkN"OI!jK=龱 ۡD.s#U[4:[ɧr_2emE !+(+"Ʒ˫iOJܟ| ׹bnf|Vʴ:h ^\bLJ(}Z揈X|ד0KDNU4#H'(A4E -J,2" y&JЇdEy|K(7H~%ٞw8)2 fzQ5ԨV[t]QS._v/>CWzP,O?|ꈳ4½ 4k ߚr=r'6xǢE 4K`@)mcэTNoBRtW}!{ 1wfB4{t@QR7'BFbDC#tS`n,O*b@ TE$BCH P[fC#X~G$cȩ[&De}1ᥡrY\/Y$ljGAU.*JfvuGݕ9טhD G\is r u4i;rľX؀؈{꾦( h5l2*%ƗL>&>;J]~%3C BGd{X4LJt0͙jc78fW uxw8 N\Ed%97t ~AY݉u߭P1D,wHt_GнOWjJ&6Rվej ;^<KeiU9cN?j1 {uq0ʋ 5w#E`AKxY&$]Ǯn[ԫ4^!e+X eR:.!(E~ S"7~ L5][nK{}۬cL\#fnqϡ Sf,IZ`+<4j^ȡtGKZEJt|VndB?gۋ/ & /O[>洚 40b"l6L~0 Cz/9R M6RuKYSJO,N|{#Q nizjm6 k9;L拃ٹ= $Oc5e_f*ʺnNG8oY~a&}EGAU]neCQbVW]V|{G܌}5$:f<+tSW}dj

OvT6ӿ&4O33у 7GSj;tW|`*͐1vD횞L$}ޚX`yf.h j\I ⲐBtvrhcRc)^us·|0Ԑ̜ua!ma6B\(*4RJKK,qRi5MZ%r~08*dl` |8O_S䖈 TX8W}~KK+AOoo?\P|i0AX'nKsfm=wc3brc==40>>b%Vdf^Pǡ~n*">88 -fjKExp]ǒT$})!`S/*yaL>M "sH1n^66 F%FUthX] a"Ĵu3LE鈴+R duC撡W*ۭcEdKp)7ޑl^S }v%/+Rd (Yfun.Ɉ2~cuFk/~)E4XÈYÖSy;g66X<\Iס~*%e~/G2WDK?Y=~eSj0]w2%()'kt>?L"ym)`(gp8i)qH 2I樘* ra@x&=Ga ,ޗW^)"t ]wh@t.bE{,Ht .G Ln9GZ$-v,t0':tcZe%$QiZ[MwӏV&mp) x_2 ^䦝ZJ _WRK%מNa]d0:4UJ>)K-蕧GN_վ2HfP~s?B@՚jVYut=?rGlqıֱqƜpU[eNjnHKiJs#">(K|@D#' ^A>$F;ןx )!4tNg-5q6CDsH^q]Um 8" =F_S3ʰ eUZh^qL77!zRci 3lnq/m2ֱdz^1 N &Φvi|XMDZed~iU)-4\jQ!u:d'#dڧP8hFV )V~L=L(%ހefhU6\ɦ[Ώ%sFh>6f]7bR-}qυX14p=5ef㸀*\؃ƿ_KmxgV·IVpfhBF3)NGOE^P/]8FjiZQnގfl{D4w[B\dvFR {$[gNr~Z_aj]BL(suԊ2X(s bQ9p !yA:^-%0F'V(R/{(MSy\yhTȞ'wY 1A[$ep^0c 7 q{═Da{kBzծ7ˤ:\8ˢufmhfRU~HڧvY/1,DV>~i 貔cW4cRP%S^wbQx9gyY.$!.TmThƐ+jc"/ﶤ(UCɒac);gDf\DI:~\!G|?M~_?9w1՗)-<&b1.^3>e)4ʳ/~ $H *qA7=j_[@bں$zJ[=fl=r≚"lK=M9U,H:!>*2ٻQ,k8RNVصV') ;;7dF@ +fh^rybf$_4~pNij+-%XekͬkhpݐmzY^&ɛC0qVT{Csʽ Kb_; *ņ۫,;xIW6I]0^L; B>LƽO'\&ei}f:7qE< Gxp AasMRʔ\%Ub_e74/⢌yjCA\J|Y%== :ѹ|\쁪.bCwp| p'_]jqy"al ~*nTvvx_VtN^mjqԶ9 uƷǒ?؂\tS~v,^Л<}NVɨR. c'q0@Kj%0`Rs(4f'7g Y#O[Ja:&@#K}1y.Zj3 ,D($@hݰ䥚~r%dS$g8t$VzK. r9]|tn*zs`1tdwV!qi9-Uj0s!itf%}4WQSMTkzt>2}RcDLiWaAVôVj|坤5?Tl9ġ&\ ИC,V :CYO3:L1ŤG~HrX"LZZp~RO ՖjV:sr+qMRAxH kJ&35P^3 ;X}Bĕww0CN_o*EL59)l1PN;3 /O+" l մσU^l:Xu{(?f"^P%}䵗 ||CAkE\ pn3\By=Cn*,30j&I|VO˫3;ΌAus\|.$.HJ@FpvTr!% &vzt-~3n*_-_}{UO/MMwӢavnm]<o*Z2<~X`O6Ի.VBkӳuå&[}yܕ;W3՚Ĝ& }c :BO%9Iq(DS4~86cE/30a6Y{)*>9>|67e5~%m$aaEFG۠Zb)ж"Z6X!0冢avk}}s5:"Knx-wq~yrv?v=3+`Z "e;Wk ˇ69]x| 8A3, [La^o[a8Ԣ|sRV-|wP$5_ӍU4k&ǥ0v_؝E8.[3lp)934uMcgL< |&{Դ3I{f_ hXWlK7'?abo D"haMH5}Be$l@!ho;q8X*?nRW Xb1 ő0_ӆlOݬTiFhDaR!lG7L];p쥃٦'u);vhC~C]܃AIgJEChGLZ::&^8 Ia["a0|~4Skl~OoBt Za岣ږņ9Ci Q6WtE0' n $8Wpxۗ= c=;R'oCJ|;č;?UZoi.tg`@v&>GE6Nz2 nGS|ߊFrJFqkO{* ڎrʼZlb& 2bCӪ䤕m:]hTgxڧ~WLZ_6f݄h* CheDS)5Lc>;|}oo>sJ,~rs*izڀm X|1?{.#`+fԁ^8V|i6G+咸&oU&eͲU)Pi:k 4)m$f6)l1RンuKt k0kv DԥZ9uckKΕA 7Ii Hq$F  ؛^?<70z}iU a{z40Mޝؿ^@!1Xo7-ܓ=g]2 %1i11+m}6v6/wS#%\%.i )?.v^۵_wNهTt&wt t[VkW -:+otfɧw&b7b6K_"qHE婹xk]HﳿR\qp;bYu _{Œ@Y9=}lWA%W8MbWDYm]-ጜXukVZI3L@54^S|4 .T@b`zڹSeL=S)э4sr;\>bK]Uȋ~o `Eu $Bw׷`KdIJy'A hb\3 ^Nmo摶,nx%DvO[#E.Bi:S+̢/ݥb^C 8VoPĄph }H0߇.⃙wv`#)0,,T<^xLڣ^G $ߣpqIz^ҭ|xƷԅW6x&Uk|sCU\{P*k>s 'Z< Ý|AI}tg6bM}Cbxނrz9Ӥ@r͜-|U9y6>j fKPLacB nji8ۡ~I> stream xڍP- !w . 4H\\Kpw& !@xdf{Utg\UI $qebcfH(벱XY9YYّ5vؑA.`"$A@$%PwqظxYY쬬| tpH%fD- v}Zs:1{3(]A/́v s0J Z:xxx0]`Wk: PڃƌD дpt:/;99^4* ȟ0re. 47wwB+%PVdvte!v./@w hсi15_\̝..`Y~yBquA}>I3e^,]-d XXaȢ;$y1!cXYYy 'ܚwM/GN~> ?% :|o@V`?_ ?;=/cEa;bEy%1yY(w0qqعll|.V{aUtTX:$2qK ;(;G\/?H??lWċ\_vCeC s,' |1cH=A`Ws?E[x)nT\+^vQqy?\Rs߻ :;X_a{YR 0C\_R/Ho"'Hx,2 ?E#^V?7{XFX t _ /!V!' r~yx_ rl7?_b__hl/\_RΠq{𯄗1ݜ_?6E< 'ie\ ShǏZ1"I9=t:&Nh)t57oRF0VwhoD=6GWk}4ITkGZ*:$A$f}risrES-1 Y?Xu<|qOm[|)V+0+ ='f3|"I,G&{Z&K>> [Ty%ҒxKfNtgy`7 rxsmjov]y<gL \Ժp?8 ٺGd'ّЊuF.q/ 4$=&.=QO^𛚒 \k kNCPG٬sLOst1mbg^)،mw{=+|1ܿEy䤹lQn˴Sxd(5H>7TvSS FDX]S%l)}͢F"wF|{;%)[vžHnyf\ytMFPg|ZJ89(!Y6# ZXcƦmT(rW^N [ )bǰpw6, _>蓨bqZ.28ꚼspīS ZI{w]bB~YPQ.bKi' C UlAUk@w)cLЇ4q'F μw^h~`mn`34pwA o}5"cŅV#u[<#n*BfM$D.a5Q]>6)*-wQ(t!|;h _RD\^&湛ґ1Ks(P`"ft9>eήgKoΩ?G/Dm 7`?I z4Tjx'|۱ly-ѐ+"rg LoWaWؘҚQD:dA+m-ؕE3hk;{#U%g݊Tdp!~J !8 .l[yKKݭH;mVn>{tJG`ŽV UoJaj=w:\Wzh l~=CY fJ~pCqckl]f<?l$c~Nh%6ZeXwE+Ky"ȅP& Um#W`N,du g΢c\ PYKg .8ˀ Ra踥a`{&A)s7ѫw2~Ś4_!=¯giZ^JPRLtOS#jkԩ|^MX1pE-:+֕p~7/S5hy IqR :ڦvY3Ulrk [wvyj6#6 Hl۽GtוC[>[2Rp<ܦV 90SFoBRśE!b{եjs5Q|h ަSm%][w=+=,P'H}Nf{ؽ9NT_>44#`/*&olMP2TuyU1fbnJ ´- 2Ʌeh~j|Lr5fYpT#Ǜ)*/O(ltau]` jN)O-ȡ"F_0p`x^pSu?ɯPc=.cy&qWa1ڃ0t뿼\)w&=RС4[i1; W剑ș̣qz _3.Q MQ[6xY>NbPTtk^69ɟHIf5ap~ɫ m/^w6~@: Q *c,*e^tc[r9 M=&uը|kSIRډeW /}u_wsC̀A?J>uKl¸aCG.U!z]ՠVۗC9 9[#hH|OY$P'fIֶGPu/MdŬ`\!(| A>d237lUD3( wzXPۏnr7 ϋe xU}Z7*RK$BCdy3aPov3n}|cɘCQNy>4#6N,Pvt+/o G nӠ`ăWvMU[;= ,vy30awLy]ʰtpt۝㧱Eňi3ZBR TkPc+JL+DJ6Pr"4SA1,Fsi&&PRiHoWM$A-Z=>V9)K F*`yy2mYl#i>z `~NDY.gĹ_̇E(bwL\$Zk-]'e>?Z}Mꉣ^maC{*Um937 +8HǞd-cKrPRqU5f}A[zaĊx=4?8Mx$uLӻ)evŴ\$-PY6`z_W8͜|Rm!B&}k=;aY${ h25rdӓe3Ŋ-8x 㰅F웸V])?aa v\;;2,'8CihP`}!|ƣ>̯meju58cI~RU1BoDur)H _j,ŀ޽-9+HL;u._"<ܫ,g~m@ ǚnei Sn5h`#{m,Dc{*LU7Clira+T/̂,eG/@]<hho:4b27,gT$q ~y;ŚozQǫ5bp7ZkNqo}*CV9k62K>|F.ػqDq s?mCJ&b2"2_ps)ftٙܺejxd9K/:晾TP3㝆SU2U88=Vn ?F9PM ;qXoAƢF#7'jRuDc/.$˨ w'/6x lx]NXOyf8q109) bW+Dp)[d8 c%fWǸ!䏡}:,)}CDiRlgxFHJ wSw9] r-%x?ٽk_32vw⊼nO jc#׉A:&4c8!55+54:]PNKDRX?p5\W]<{ j?Xd& wAcm1CuQM+r0YSUbۧʆSYF|b~.\+҂qcV>z@1BGyB6W(D8_>Gf|\ջ 5shY NH¼Kc&qE6 Ů%nBGm0ӻ] Dxhp9偸AI~1iÍox=nXkOsT&XidqyuB nJ Jp; 5IX2\RwR cb[![5W`DgRBZ5ZЕu]Z_z|GbRP 'A#ȇ"hwșQ(BE #_Q&mpy X^V?0pLVkP]&pʙ#l$%+Wd'K96<{mh EmZ)Z`>F?&24u&9I.@ ._ό_HK>08K>8"숅݀ad* \>EA6sFN/cɿ0݋fJg5&5NpX Z qV#5 "9fz(bY qCx9!X Eg0#ϲ:/!S1#zm,:FŹ}0c_nj՜ hԦF%J߽6NI߅뢩c5J4K"N=xT]Jk}rP'Wg  cn4 ve7Zxl~*`KL_mqj :Y%+`LDm=emn.+BY f?omšV*9F vpއ(4Doj5#qtw&>en"gTad:ɫkvc$ $)e{Jg8FSgo@PgH.[~x_8aU9,փ?U{aܒu}ї 8X_UakLo%|&t`<ĈU]CGoTs`s0iowo.$"p CS!RmW/ՠ$NE!I6VN*hkTimWmM2[mfnY7!=eO3EÚ AP.|'R$'W5 21wOUOjeՠW\ dS67mKX-WXSPua[%ZҘ}hk(_i(c`/l֕hqޱ/%g3[y[9ߒhjk/B[5yjG9"#0 `;6Ęb;ʙogAv'5e/ע!oa9+ax$̅r ; 4PnlB2{)-Ϸ&*Ewh! 휪U&CG[JOW+. :7lc-AZ}~lpI*L7 L"I>U?Ya lGXxH;[LƛXX5VFui}Åa)wc@@Яg,9HJC8pIV[SNA/O1R'@@H |O ^HS&>6̼̍pTd@7ۓ5izX&ŒRVgjX4ۯ0I^o٭VBubyhh4]`LWLN~ެ3+DpN$r c#otqϯM_ǁvϫŃG{AVׇZ0h=91Y3*#N`^vK_DG*8[:93pGNz!1}Ks@̀eAe: ,NFk}ڭ&rdB7tq;K5Ǖܔȇ8`۵vtUIE׍2< .F4L)h#,+B>cm:CqKGٞK ^hjcr@-NztS>7]{ A(Uuy+sIq6&xAN`d3y!"A}ܰWl!$.qbOJC*aV0im?zc|LjjOgD?g-u+Ido!(sZ)V֩+GF]CuN7gi-ٖ!PSe|%PFTcRy-vu lMh妮Gz'G.>|C>ß`t'a֌مSEw`zc/yHVlkgN42Nvk_ K#_X4zy̕TN)ğj[CZ~rU+Ee.3-dP€ av`:SB EXomZb>lʉkc S$7B⽯Sx(rx* uFlj.lf?c2Π*)IB)oG)yd6_6lN#9:7L"It`ЉnQi'xnO|6!t-Oy^Q(![}0K˺JyX E׫p9`WyqqAEUĽ$ZgyK|QὸD1˖K9`衴^M|/)J uU@~A|5e-`JfMwAlIQ5g3 vw,2y;|+Pj3ؼPQ+Na8kXgu"4FItlBJk6+O3rOEQ~c[j5*l"MaOVim_O U *6,Yukzmx̆׳ݤ!lʜM㺶aF.i> WKUS9+}=>dr̊Ob.UgǚPF)|L/,9y ^~:xU@9qFh)S78(ʳTTziiN7";[g'A3tչ pSzxR-/׆V7ZH'2,˃W[H㦤jWnFGq],VC_ 6{7}`Mh˰^L9 c `5#\sv'aM%Z 5^UᧁJ1lX۬`h@\o)d5ᛔYSdaZ&}3W'ߔ]Zcrf cqKHc"w;hӶ }oj]Kl(9,]e̠x/t⚫֤ #Kh@@D?m\4O KU W^ؽٮN4VX:wUY7X9 )벾hdՃ ѻ𾺃x|R{W ggT F(Kh@~}&_8~Ib<ڒQSVB*OL6 sYyqEA@i) #+oɬ:"cj\Zׇݰj̕stocf+bc:#Dk5)nunuHU; g(\]"^׸EEɝ,Xt'Fҡ/X,p^."t/ؒ@g9 endstream endobj 215 0 obj << /Length1 1519 /Length2 6574 /Length3 0 /Length 7587 /Filter /FlateDecode >> stream xڍvTk6)t"Cwww# 030 9tK+t ҭt - HH4z N? ؁^Hw'{ Blk=wf_!3x~=|Yu- skjɨ(+  9y"< ?@H@[A?_!Uv0_*o%ZܰAv`ߜG=]o+{Gοqr8a5n84`w#oB<\UADjAB!`[m>w!P6pyx ;{Z!T;fkx 8{W S[psAa;< nk8 CXC!B5Fr&_0%k qwu}w' MlkZϪezqJ|bZ7JgD<.RX2COeRVXN鮑;MXI:-~Wu[pg(?<ԗv3 vBoBPeu&'=U+!bz]gJP t3 ?AnR K &\oNNZWlʮ,'y! PI,+gI#'&HFrA@=f/y!|f}Eᯄb(DxhYȮᨂ Go|LQ:=),o& xt2*m|qVJrz݅*؎93YQGY׷ 0_l{,:0yClعQAAwQ5vzO6'$ώZ76:>e;# Y72^ )p 2y+o`fE: & ^EI>%+bq,{. 4u=銊U]"u.EԐc'6GIr:pE#ZSW,g"L3mB֮3 K܃e_ !:GIBs{?U|*y_pqD/d䃍"?53=9= Y hZTsU-l=#ƃп-ɖ莄q۷ۅ I1{f 2OS?^D q_W{'L/NkGnSq<;ZRG1$ i2W2,x ^kW&|lnTbkbRWʴ=7zx>tIH3k'ℵi Ӆf&ەt<]B.y+;L|+,+@;[<V=k"+4* 'jS[V8ܜMK><=l OI9#)Mӭ85<ϞYbٕ.X?r3.%ڌ L?ѽAV~^hdф $X:ZRͿ_ުȡ|`deS:O׀$ݢd#i__;|BH#B.&'=h'ۜ ,<5ϹTZDG m٣<[z\tjh{ܕ4FXuMxWz%+}xmI` n1rۙ:nBfgjX۠?IHɱvԜ+~p 9؀Vk|!$ai<8;Ҿ`&e~`e%0:6Vj=nJ㈢LNy|rtt?w`4sc Z!2-Z2O. ,NlSVJ0- 28satcjGOrx:JHɻmԨI%ƈ[ƨ@CU u_m` &ӼE31ʊ^tCʶu^cODgyѩOϡ3D+hSY޾Ұ!jxx3?6|TMð!SS0p\i|.y?:#5Xm-#'m0JFgKf-6\+M!ɂv̜TƋTf)zO7=#}8DO<z\PhDz\]PRQ/ ;)w3mjEhgd/IJd$e4Vg0&Of[Vat謁2R1_;08~&dM&2b8mu`9aFP`-ʒ< Pu,q24:b |N/PCOP1H*0,kPXF\OSYt@._ si[3~٘^@r8 ܣ9_飯4IK͘fU;qjt╕ SL5 j~;AeKI0"Xz[kZ/2ؙBk+Ң Y☈Yce/y}[T+c倽jGY U8m{2 ɰL|1yQ#n2 `77G j:nϔ>FGzqbXeW>ҚMG&LjuBȂ:MpHl_>%܅iU]"ڳ^BRҍhM1[D/mx %6~;@I9#2~ŏݨэ}MDybu\X2F*g-NW|Z>wMloE=ȝ۝Ku(*x64$>šج7B 83^zz"^c!0b*୨ìVvDyHd˖P6Wݾ zL ͑vcVgÌm q9LJGdxb1$R ,ed}LNBys_ˆډpE[ekG~ SwykVc-}R\z:Gt(%Պ6#UVR',~ί|A|q */Xėʹ^FpVG6;$ߪ~qL dd WjR&2x9{kbY*e0-SjBKN8)яԨϡOU |)l/o3<ي,NQ/7ʽ7ގU)|/iv:*j*N.6{uw0#X{fHh5Y!#!g.K}o-}Ֆhr,:~quy@"Yl9J/&kTKfmKťVH!Fq1Xd_ѯ:|)XDT9,2"-Փ',>Y)Ⱥoؓ*-?} ygJ`,UoEK)WZھ>\NJV/M1TU.?}qľx+_(#0r M"0!~kW&D9s ~A5^r;̘o/&P0,C6VJ ̋EZj$dN~?RiΕJgXΛo[iP+j,=͖?NŨ}8]Jo$(.O8e*L mq:cȜ N݈HrXJ<3FٷtNU5fͼ!xK7w"ARsh='oAh9gI-15E ")%UG@G# !<ySioHC9!je{!3\|/&VNq=^M/ S`.H2 ), Qm,2,qQx+g"!DW-K<.2UJ|+f&HfLqEI>-#g*pw#CKŵP#K" ; ,+]FDc^jpwZf'l~Ѱ#+D$cX ÃY";(C8V(:_ endstream endobj 217 0 obj << /Length1 1716 /Length2 10026 /Length3 0 /Length 11142 /Filter /FlateDecode >> stream xڍP.3 ! 6 ]$8w.ݳս5Ut?>ow50iqXA,@''(@NCC͋Ȩ9c`4!Nbȹ'<DԀ8T<|AQ!Qnn/7Q<lB@r T?fKG lAO-=%0Tà qdaxa]+d- t%o vӡy]@'dr)K  st;;5+8YAAN0W,݋;A<|NVֿeXA n 8O&l6 @[XOXr<-m~p6?iB' ?5 \@~>v7X-a Of.`O ~2}0+??Z%kl保O/W/ zz<a:ݿ28YCKVt}Qh07,. yh-my Y'Rtsp':b< i94 O+T#П9W|Z'AvU{0K??xviC\__'xb8 \G?|Cbz?)iZa$_=tsqyjԠ?^ 'V҃c{B8/Dk4ؠ´F^n΢{ů<5eVN}h/8hwlh-/g}.½5J-uӦAc}^%كLQH5C,GJ.bD[y7͘WYĻ1;80j7CiW,ӢsMS,AzòoVۛcu1r5Î*G(6|;*$=Y@9M%B\fAYɧ!H{YP;>B@^XpFppA+/t@U~G{]6V.B-Pg--i\[?%87D:#I12gm,3uXeAh"?rl()Ns$phMh-!f?e nތ6==$Gj[B^*j%3[yh~Q<;8hqXc:ئ Ǣ-G=׼6"8҄.g 8!+ [rB&?kv cҁptIt,$]훖jlg̖ Ӌ[so_:")Xs,Les`vhmjw ɑͩD^Pn15Wb"de8oyXN֟g*^.Y55Y~e߼q'Tg]cL"@Z31( tUiPc M]&JDY5SaouXe4;sd0.&P,_g " r*S\F vXP>Ӄ1"WdsQӚTV~ȑĞ(F8M6=}/ }Eap3gXȺ_0a$=ݙ^9vZ;6{ rC}$gc *k!k~oKV?|lI%P_{ȿ) 9@^Kw7IA|bTAm2Ԡ[s,ĩgUj00$>C$Y[?x~0dLP %m7Vz4T!Ed6sxv ^ykj n\>JSrTcWYk﫳/ƑME|MQ~KDޑ?v4「wyԂ kI&>Ġ.s Er&E =8Iz$l[;NI,ۂ^^G&0kW:kI~_5yְh'Úmn3Zl9'i~98. s4F]u; XÌvPTik-4IͲ2kX{jseMs_Ѓ8ԍ _8g26nG"0k_XObG=pAzE&@#F_ji+{d04x* 壝5Ԙfn}n ZѬfJHQ3n AR+ Âz5F_eeVƛ%T;:/d]QgQ^g+&'R<Ý74(l#q댺@kkr  Ǝ_x﫛_q!WPfrѹHh( 'P㒜'8 (z"M]`/40#QזJl%Քq1>^L|uި?W~Ox'd$E1jmtKY3 R܆tȠްnAwԓh!ioƝ s˱?OǸb v鲊VHs`R΁Xyrp\ݙR>P"S+*h,9`~u)P2ozM<#,7=?yl=}LJ4j4Վ+ҫf2Ͽ/l!@cg;ʛ VB~VDy,s/(GUسL2.ZE:q+;dڸ5_1 ^찹V(&)ˆw76~H^L֎a"U zBeby-wN;v~`r{ǣ4\ۀ>`&V&bʮ}>閵WqE̥$rhlGZl}2~Kq')*:±!Wt ܌tr"?&8>OI8Sx]aež& .l1x%S31 wL2,e]ͦ"r$6;8Bw:+@K{HkH {rΧLa/Uf3\:_-5V1wOhw"J|ɱ F+o3B͞ڣO15"_E#XNxT55ZyK쵷BL7Û1U1{(h|ORWsdOmJ L;R"jJMih +id~. ׻9k論Xvh2䃾ŷnNޔ.Ɋ5OgfR݄I)q 5)Ǽ]JD󙩕%+A;+ b5_ކ9rjؐv5wKȋz*MdWpjJH#\z2ڀ9qxTYţ{wt>\TF Lw2W.aJ1ez)zK"83:Z' pxXj-׶T ${0$A#~$tP/љ>K}JIyܩQCҚgŰޞ4>"QޫY"u*kfrrM$tGP\H&-#(9}2l[s`tZPN gB:\4VsI'63VxkMEJmozK5 gQ={Ul$K#JLL]I=~G*onyWȫK‘2Mk1, t~4FRV|  x=[`9ȼ:ׯ ce'Y7Ni&]f,-mFV,>$ǺZ9Ggsh]ȼ| _R~˄T;<㣓pS8MIGcޗkmY}JD]ؼv+hISo8rw}3leShN.lFN-ĊK”y Qs3Jw&2Wm'@tʓv ul 1#ʣw5l"W & 1\P.oo+X \2UCÃV+5BɅ}鸘nbS^R$~4vvWSlBDJ30~o22\K>ÎņW4\0 ?omK7} 2r" pB~\"nqOF#&-'e g?$.#їFJD?Z8FSN<ץEò< COG(/iD^c2=[zʹv8W^q%k7;3$hc :nU?vrpCH3}<$6 %' uL==g'aj>Vlv#~F߰d?'n&M9.*;->L)qƑtȯָ2s3 ᗣszVڦMt9˄Wn7kzTL^Er)כbe<Պ0.;TU9E [F.(Wf3kot0C'7Rz13|9j-BGr)o(„fK^ԭEuI2 U'gLu; 7vڪ޶-*d}f%P[N's r;6~r7lN|KJH|Qֿp )YhDSHe'ze*@SqcnsQ\ 3H?Tܢ շNèsjy2x&ywrFXM숻.hr(XtŨ)]n^Gs~eAŽd&Q#㨁D&u+ɘp5ll[WGzoH [C3Zeٚյ`]ĴfHF bo dk%aTll>DEZѥٺL3|ޛGŭqN2ls0KNܠO Dvp h]οa1U3ܼ|zɟ,@4x5 Z $M@\ꓮFzܸfzq K`ת-Pm`DëQ_9yĨ.:DqJ۱~/CxÄWdx4(m)[Ѷ><](4:y2h|PFT" fg33)>+yc^S!Ov~(fp+'u똅y\N1Ua[$c~&~A)P(+r]6b~H|IMڃW^6뇼EwAU+ wL=g9GW&KI&JR =sc]0[xSXy4CD:CHڜsrlOঅpwTM}E< 6N4b47f'9Em(VefMIUk\ (wChR>aFJ4JJģ_0% +GccJʂ]ʢ\<9=|txa"C& 4gJ)~ǁGYe+I?2S9+"afYPmMCQIg/{C>0*CCl5lԸDR?ӰĜck*fQkxz/?ǟi 6~V+{a&H/e>rQ#=|iγL~g4{ /fv!oHf^븮*6DQSZ w2bS(՜s~!L|3{Ըä{p~>zQ▖a1fV9[s礉aM!yԁ 7m}d'Qbv8݋h7r` =_g2oj xmbFmsÞ.I?9G?iǢg`@g0GŶ#1I١~ 1%yt])j ĥI2,S(8o՞Z :b@.#˃5 {N!/5gUb$t4> Z|~+%*8;U@՛ʔ6r/bq`"؆:}A; CMLư&q+"X!g*hIyvfԜ8̣;)1SPaѸ3VR2D}__♰:T5(vڹ#Jo۩4z7j x|jjzsb= CBܰ"*93e~@Vء^ubHz94J!st>jgX?q:eF(쁦=cHKګ3g$LkVB *F@"֗+quޒsOA`w =ԯ[GFaLɜxc[ljK41ENu 8Ս>&.Nz@}-[@VbүCEK04 %!P{O*n-c=[7j*Q^,x&۞C,C-HD=lz G;w)]& )+.A4؏kv=fg;b" ن7vf}ʶ ߆0ZIn0eF@({odAA̾(5r8&+΢sDBߋS/aSb÷SpR!~hJEk9TD:C̍׭AEͦ}>m; >'j@hiEபIXCYWɕZK8%k &pA?~u~`jlǭs=jA]?%C.OQMxnˉ\|%SCz ?E)k3[d`8#G\oJzgѠ>w55󸚦m҆2qoֳ]$cVyy(y-i0Y;E~h Aן*i 6Xگ<rHOh# z_g;`d8gPOZ5ŴW JҩGwzRf7(6H.f6"4)*Oﻉ'bS."@-S+҅Uo@*l%uܯ]ؽQI57B=sLȨShȈHw .,M8J3f:g~3XlbMv09 [ԑ9݊%k}huHEd%zn$ R!l/1Hg2i#7fM@ ,B8 Ϡ|!m=Tjd MQ:"M 0CX9%ϒ37A߈W-r(BղYwi?f_L@] }~ O}GvO W9m.Mvqr yxZ!Jm-kSYsj7[w$Y4D "~ t㷀|5x^wcڅ7=];s>vjdR;-yBXT1ouy\Z3\HI7 (1HG1!e 3>)ХÜT؛9':1#B1,_WơcT2j}yL3֬k P4YM#{W{sW+V=岉`4,fhJ\vk8M35[k5T(إkB)uJ\ۭ%(b&XjOQY̸b6-)':ZxޒJټgO pIբ22H|.skJM+Bòo{)RnR˭i:! Җ"͎7?p_}8J*{d<.s>ApIYQCD; J/jMly8り2A/K U_^~۴9ebr7Nھ'hϑ kx=qc;@cV5"f1N$Szظ@/ U~U2M }7‡K >ptˆ*di#cRVTN Tð8pn:k^z=>?'AC 1[y,Tӻt®fg{^oL=r' 0$[jf@U'i=mW|rMm(udy`xg4UmTHF(5&Et}ok]|5KKy[UgdWU, Rx Mn5 @.ɈGTē6d=۹u1ǖzr戣 ػwڗkȅѿ %$͗y93 #w endstream endobj 219 0 obj << /Length1 1521 /Length2 7290 /Length3 0 /Length 8307 /Filter /FlateDecode >> stream xڍT[6 (-RJH81 %5C3 %(-tJwJI |Y}׾ktye60%$ 55UE $@.D@# DW hL&Pt`a11 (@vM>CnpG4f[NXTr+n E4hG+fG[ @i }ՂCv惺R<o8C<`v_ZPWd|D@#ǯG{C=`n C0;9@_UCIn`>Ujktu"|=VCyPݯD zA.PLCJ(_Pp74wW-+"䑮0E| p-}LFev@y"0UR0.|04y ("`>~nH7=,n^0߁[D`0nc0?6fpC{`?+ ϗPLL>^! "msՁ:蟎{$7 /^pNBb p}sd߸Rtqp߿0\DctĨư?Zք=]7b!pp,㇣>0;8f8D=9*b:cfbBPFe0*9H_rP_" !0~>)`0Dƌ!/o " ()wzwĐ_&/SX0nbAۿfKai+T|Z%Kͻ>"~j";RhIQZ~"k^LC7XҩMK4Z:_cJmfOgHSJ4B>đUAY [3^>\ e^7-28M' 5\p""{!vkM_OKA.< )'0r*,,GI|Vtb`ϭ)׌wDnKd1۬_0 b-%)ğgCLj%CKi͆|b̆k"rĀENGcwyimm ~0o%MSktdԛlDEDv.sVs34v3^<^Konv}Hg8ol΢+pxmuhd= vv9K-K9}r[V=LlXr+2LS1kTp΀寅X6EWʒ7bTm𬈅yJ/ yƴT5~z!ց}y%}plLħ޲W.I аncwvY>{{#Ywa#ʂ~Jz`?Zvabv`} N5 0?ycI<@CWzfl2 g!gn&ը4kwYs|f(Erpahb"Lj[S,=#1r_/5eS܆S`|wϹ,L^J_H0c5FF`9芰>5WLo6J,Pݞ;{A܏5suwVp]rBBs"9ؚRM)EW0(rPJEG _a+r@x`8y"&߂>GYcZ8if*,])&xHR'vƻbr#ӯAF}5֞e1nRPT]7Ҝm!ߌ,iH>pSx5q2 &L} b^b q<_@/kVTnp|ӟ mΗ+W ѡ?G:Eyd./EaŒ ME=!x 93ĤQ RiN/@ѳKCrmOך]+Ma-`[Sv4CB%~0%ϡR$.eY޿AmNUz**s-q#XZB=j>қE!aڥ=Wt! $όˮN /eJrhg? ɢv]}oQ'߷G =|MCtɜ݈p{T NqRѬAk̻L%#wx91ɸ Y?|s#[}T&Z=~c 3 I.ΗK9@LM7񙢎%8`3]qO 86_ߥ׻E~jezc2k oL ."<,rQ5K)i£gޕCEcv)\M'_B(HJs35%ǣ*v"t8OMEfiwMq4/;b$Eu CzcGNZbdo630āAJmvĦ/8݊7fE&G3Q?rt;G}[R2D\dVpd|ydp-}HԞ %7a4m{S,<©SEϙ'=!|̅{6T\Z)ٴj<]5v^K )ۗ\ 0"G?rn SE0an~1 >z ]:~6Msd'@"ZS)-c(?+\H볨xy '|_$&mS&އ- TwZ %^MT w0^dڄwZs.?%2 6lyhwcɺvĞIy'>⫣|ġ"$L(g {{qn͑c麛u[i_5G;^(Jt$ns)'\^a掠K$6,TLgPZd 'J:ޕIwbD (ώÏ^"Y~9{_>PU!<x0&@S`7*sQ?wK{ I l[k-^4..Z7l *ύlf֥5–`gv< 豓JX!o"'2n\Br7xxf8<>+R"vfOl#g&"Lǂq݅' bD=ZA]}~L+EoQU[i'^XZR> L壦=̹Isl5/T!;oߺvGj*lWiJgII:@&հOb[KJ<ߍ]`;myhb0-Zd?Ħu0\{ꋅ# poXt/*D|R7|}Lƫ} kjD N@iwf'P1yxAH}Mg)Zh%%RGQ`ہOEW"D2P]'mkUa\zHʜe&j`3KϾ]@V,XG2yҽ&\;mR2?>d0p2dJmfOrqJq\5 }[XؒFHdPEʯ? f]ܰrR93c!{ɪqj39A_&U}7-9S޹ܜ<+d=Oa2S{q[9MK 1!2^h>,詝V`1:;>r@PD&\ؔ #r^x6 =~l,B߃pTH7LԮkAY;)^ݓ'|К4#m[!^,Ho}wfeV~M`3E)!xKX\B:m2‘UmuOzEL*5f3׆FdLk.~ۊ!,`Ob3Ad\Q|V"_]tQb=J 2SE\PvfEYǍV R]O պ&5;,布객]StOibDa)EK`lߙ3tBgb.V=-WW?7S>Q:d*91Ɛ2.28aϤzMe%ٸ\")_D+Edߎ-yEx"g^ʭ64=y+2S[مQ[ ֒ [Øyu.] (^2*S6/첎gk@S_LcEw k&'? 5XMwa=:ևZ0wTdPvb]%.{er 4~BUഈ| DeGw3hIdt$O~B{c1ʹİG6:kOPd\d\>8/c8;8LQ<bS8=\Ω=ST=[yz*|<n-NEAC>/ΙM򪢊}S #3qE{i;) 2'墐y#?3GdoǽD^%ݑz2K76=H}K@TǏ YH̦M+yT9Z{Z="`}ĹudмvH;6V"Ƶ_Q-+FGF!Hм26`q.w-*R0PQW7)gGs4לVlSyDqZ[| Ǐtpc+{4PaҲ{,Xop{Mo@q]uI$tSQo{\ULdhљ= :ނ.eoȐAƈ FrX^V~;4s<';])L tq5s6[ʃ'gw+hk2)&pfR얲έw,/M~>,b 2[slbs;bmBc_9=8E.6|h-16ҶO1Q| "*,mӝĹV ;e&߭A] UꦏīOح*ϸhvG-F[Ǧr/]1KSj{]1BUWVߡ6 ª5.@HW{EtZl?`Y֠(OkB9{֯Te'8'.V\]9̊͊-/4qYŁBԲ 'ٲ<^2-[dڇ<=B>W^6mٗĮ}IIJi-v$oXh{i.+ݑ`O8yэ ﮱ(V̴zfP/BY&tIQ|ۓV ZOOlsdpӱ.y6ecT$45յT^|˃G$S絞Qiv^FADO2Q?N#y(ɷðwri mSo&GPwnK%gB`h$U{, F5d}u! ڳ1nVJcn)4G%6N\vr59TV9W+͊@:j *R#߈~Xg:BKqvF ;v0zlR endstream endobj 221 0 obj << /Length1 2596 /Length2 21997 /Length3 0 /Length 23483 /Filter /FlateDecode >> stream xڌP )ݽhii͢iKK:zcoϜ3~jr%UFa3{=ȅ *`aagbaaCVr+F:9[كx0ueb.`;y{@`eeaމ ffeg؃HԢNV.03p lt25],vƶU{S+P[823393;Yп[XT@'7ூ v*cBYZ9#W7wq7v[+S  2:rE c  tzEdi[rL.. mnV&`37H+[3_%2E8LrqF+?1+')Ld[*ՁYd ,B-8XXXx@GԒ/z5OJֿ |"V@$ogc7 ++`!f`<,cO2z6{*: T_= גq?/*[ s{?5:] O ^}=S7moBl=5 ,NYhfj.YVV@3%+Sv?SZJV=6F|p6§d9 v/oZ${>joNRnyy2LPiA+:KH̨&hC:ѕUνG[opn ,S$cz^`4uI > # [s_7Scd2 H1:l3^+jlT:$п0'hESeˊ=rQ}ZfDggˬR5t׺ /nBhj (qjZ \jm$"+7֟y&Q-;Wo>5 6 muj [ԍ\^$[2ա Fkt!@ȺY¢ 9L|ʑs[Uо>1g뎩̩jy%QV]~x8Ze *\&rO2M~Ғ;sՃzAF_'YW uQX :)S7/~zkgzͻ߻fJ7|9VӷkEȲFR^^>Wr8͛s ?yV8AN:9[mR[iYp䐬qdN)j,mX7"˔ƧjNi%**ǃF$ui`]?! EIW0A;W{?J|Uiη-oKPzP>O-[)M59vwnRE#X;sS;roKm3Sm,]T*d v$3"?f` T{pBΒةouOur?~@Scb}cuM߾{ Pm,(mu?_Ta> |6cq@"R/Pt)g/0.)Vhpm-_d:y-X\"BDDʼ}"Fgݶ9u$b ZI1g]+7YPzօ($d%M5cml-;M&bV+fRg~m<Wf2̳QX:\ Ht69)p6z%t"WxbW8!GT)GKrPIY$ [ml9=!e$/ewFc’W'm hwhF!4wi: Xe/8VV &9]H=^R3HLyM+.®Uoǘtγ'3\ʋNb_W{)I?1p9{`joJ"pW,'`.7JnБ m8e5Zvere8Zx;5X7AdR=1;@*1v:i `bS~c"BSe'J6IXB|oG*Ph(CKm7ĸBtȼ)Ž$@:8hHbʮ*}%)[X!X%9:6NEF %3E`~|F˂B^7qpVJ3bлΤwوfƧ/{i';hg[0نWܰk6AV8ë_sZƅ3EvHK Hw\;B~PU"Idn, AoVN׌u#<Hk>-IbkcQ\s,\=mHQL}օcMM?1Pp`iywf>nAw]E@z{$Iҹ1LG&γު mF,JGEĀDEǑ7ü9lޯ50kKgX-UhDeE 侫FɧGb4۳ZMTpRk{h.EU3L B NǠ.vŧ-aXF9Pj'AXU\% zܾ8#/'e"d5 H??Ow}Ͼ/dW%}cwFZ`q:!f%eGd5ڦtxG"k(kVcc\dqvԸ*Cqk)pJmLPH-T=i3pPyAC RC߽4j)Z4U5FGo^u:`gv!=44´NT.,ixM1cai}U8[T3%갮re6NӋ1@^I[|f&X|O7*T# qem.+A9;aPL:} 'c9iK`q|&SmMj %bƗK`<ĶWQC`)M*+lk) -DQ[{e\%Lٺ{1ŀcJ^qd2&2qܗ}-5gIdy*F4M}CvO}rH?TY+H,(䏙 2n_)+ЖhE-9CTIZN~~JF0 `N7 ;ׄsh(\2i{[/BT5J=ג=R:N.I;0`o8oyhmpps2u*ԱӏyE&U]dKe^bh]!P1DBqWuQ7b+8'4SJG:NmekH'ufwZG낭v2wS!$V[sRBc6*LGh0iGTZl=p hVkwPoFҕP2~ͅ9ze=fxiZ*Pᣘîy%CY/ЙѼd g"mi'32vs5m +ʀ˶ILm'_7q1f*+$a7G7+-7xtK]_Tyd B0zdˍ-+nByD9zHӥZsȕVHwXvP%xmbuŻh0=Wf_vC AT.Ge,r2xN<c D֌FMvvڵ37(X{>}zZc+Su2%и}B(7A3P}&k$0+2J-8]1\!@Dg塍2PՐ{ ĘRuV+Cx:tn,ϕƊqP7ߗIed]ft;f\-NL8+J@5U sQx3<_;R.W}z}?Zz' 1F{s|}/g!)7aRhܱ݀f2^+DE -3#3w_~^H_h[5Bu`o~!&3Y wT)rOm@x`*01Yɗ6bUfr4A-UAo`: /P ":`AK~E:[amqD",0zE⤱E U~,^?6þ]w/\M-Uy^r8Yмޞ+2V K-%},\`{& ˸%ojP ww: 8㢐51*zsI=.'//Fqx~19>QZ!Bhzd!{7OP3%(n~W*9(+F*=k*rV0mT }6 ۓE^mvY maUehDm4bA"G狭 HQ4)ъqmfwo+6 ) Ů A~7j+J7* xPCPҙ 5|v6&s$iÀer 5\+E1qs\Xl5 }+hYٸcsZs09H *cPB&k~Y*p ̞L4췛-|U>|4a^U(gmK.Pno)LT{ ;U7I:<,xhô%;7vg#7h㻘;߭YèҌv-5iz؇IK0)Eaf?rP@RʲJh l-0on)7E4UD)2|=Ote]]E=j|z&}ݫm./  DxiŪ"J4wk+u›ͩL.LܿWߺ-թ= 7)wVi_W㷁lꯇR-^Ik75,(Oi!Q"ŕ^nZF*Ɲ⸌]m7Fx&ܼאp/KU+n5NJ iRIˆ]qG["7b '{?h!9#$ꙭvK[N}q[%1ڏfN?hF7\daw$*(˨b?,{QZꎃBL$-E{BHKժ/J,e.:rJ BlVBޓJkk)xlvT 9 #C;~3j=865`=VHѬSG 0WGސcu)5d߷bה4|ڀhKv#{iH/h>Bol %C)DaUqL;Vȹl6@ظCYyP'`BdE` 1ArgP kZ`|⹛?t5QV`D'|@'SOy_8$s#]WUNA#B:`,/ʳUF~Srgh3BfD!7f,Q~)R2GhGtν'^km}XMvEԖqtT(uéz 3}!R]!k I0 L]>o}/L6X{N)y% "/|R!Io۸P,rSzt%*!)Tx2De7YB7ݒF w2a.Gš瓦myIq:&@GK5y H{y-O*=i5Aß# ,=4m R2Mģ2('' Z"nQԥg-!py& 4l*1X u^yC.85~QvC{}~t:ucDq^{¹Ya^t{ogJtRU\mVrX_t"Wsq|55dz&Қ+asd9J&-W_$mފ;q)s~&۠xbl2HO;!wEQ_Jc֨-S:694snE!LXD9 !4ך "|"Ӣ=Non̛n+4, Q ns-aIQMzؠq HT7Tg_55(*^yR]sK-`*~><٪vj; El.ychnjcI XS y+a<4'>O`Jb}w(I/Ecу i1_8[Qqf_ڝAڮ4:e)a?L% F2%lvȅj,o NtZ 3'-M5r9A SdLt0dSI:,ج'K Rr!9 fYޫLtim#dT`! C jMSe螨&K (0ZbI綫0w6#㋻s<\~]}K~WU31sD_>_Z_>mMM: qImyzĔ b,OL%iJ) 1.ʱ"ױUJ.Kex=]-݈l|-m8[a8{gπ4tˢX۹^(- xCw)R᨜4%D^y-|H6chËxUT8* O!Ggǟj;(圽EHRݬ8G)?lT?h!Ip/4!.QE=ݯͫ!EYIVĉA PJ ա8xa26We KD󦂧viҗm%y]%]#_=_#-\.c6x#4Ƥ Ċ[ |zX6ՇޱÜy{33iW|6Dz_ԃ!U0{#؅s#Hn5>L@d~$*T17j81l-uVD'AݙC4ig]ִNRr]ΩS=bU7iʩS5۸xϵ89ќ< BYxh΅m9\mL$W{ mr $ؑҎO{?c$%=\$bA[ϦIc.B,W}{'p;3u4,Wҫ͐0UȺn@6F3US\u)?>* B'٭kBmNhyz=މzک@5da˾.2KfηRQe?Wީ"C ;]c鴕t]rrISH _ZeDVQy +BH$hpi&ox4kpR.tM:MQ#r{jң趸DvODt@?o{)Kb9gDQ9詙aq뱧RY>l O3;HbD5}no:=DP7MgE{t1{ aUPc&G ulh5/$[fJy%\662 3ߎpD=H8;] T/hĞ6H;zA).nXcA+>mUoQ6BRӪp ybޓsj2Vq$O}'W2Ų2#ըݒh07A BE~na𴝰 |l̶񩎩:`g]g6-<5 1pr\D U߬_vy13@dUovE- S}@3|E.\75wO. oJv}`h턖MFO]MݩWS1> ):v[0~r{U`_޴&ji͵{M8Ԗy]qe/:Ǥ mϑt8)yVtw``dc:~73d2EDzimQb"{k2B$^H[e4l/g*JJeuqbcJ/t<̞L)AF7aY2H[,e7:f5qs`)fm2"O^- kԈYSNW*tM&10->Ŧ{2Zuґ`jƑwl55,o:kҭ4̓|,ӟǫ'r RיqqȨdk6"yuJk೒9۹h>[wKR3хrh'X|i4>bMaDQW꺰X7]D2-O&0Ն:weN_~WvزN} | ks@jY]2jyוnQ|Cĸ!#ɧQ0 ZRJV"sAemGn,EP*<bxC(nEzfEҐt?/5Ojz'07i1d&S)x 22Qx>o)WSY#YF>{>=gLW<6%`؞bțqNɠu,)@m߽kO ,6 -'޶"Ñ%!@s]#S0>6NA,t>/.]אPLplk*xf=)/ѿ^3|wGp]QytKktXWG&!Vy%Q&n2FٲP- ,u/ђ_ǨYbR`n#{VqpS`InAn\^,/SlH3>ZOG,k A زl.l;tZُ8WcXgZ`x8ptgNo'% h-% E75[AftY:#W(&5:ZV!\ j< ?(h(X>9ʊvC%]/)[lrSԽ0N5NQUQ).#j~6.r7^1J}m|׾Rp_.(Dd_ 0߂MhF|z" +|I8e:g Ëua{Tsr#" evb|vGL9HXR;:n2%.}MNFhVUw,hD3$AAda޺6-0'~9Y8ʨ/zZTitSaywղ$yo'[sp|4-_`BaY)0U'r{rTCCw·a##0oZ4m[}ӂ;jU ll{ Ƕe/Emj٪d6NڌD1N5 ϝ7JQrQhJ}M\^:GL #z â.)G :6" mW*ҟNwkR.Y2*xMlS( ^2_l~S="ey"U{~-PYN=pG8ZisuzTFoKE1mC9"~0$·!\I7ߓ(\a>PUGxiWtg4 {ip1nJC! -dAį)-*3QMB;G vt s*4-rmDK돟5}'蔪)Ȓ^eUnӬ=~r]~v%!GIk_\-iROYf9asPæ[=& GʧHuto3.v.4q?P}" d )VC!a5Vs]Wbe2UƭnUU]{W}_Iju~Ycrj%O\w6#@RF5٥-ܬ%{`g:!ڧ+jOއ΂53l)@~^&dGuUMYCz`?h\MbɪfMGbn8Dey=v!VbGa A0W&3?\Y@6:Q~fM/;Wb؛}-WG:$U6Ͽ$ s Rnݽ,]&D\=O"|7Ʌ&~$ؼ'LUt0,U}Bְ ;Cŏ?&Khϋ3mPG&5!w9. b@A:&zB1@:k8N~5E#TڣJ>BAH%\#Ʃr3$?T<`e"NȄ=4[ޝ ,my3mA-BS;-[awےc&ԝU}R- pύTeL rF밇XJ28s8ZDT͆4Ҕp -LŊ~F(R C&[1T>Z3FERɴdJE/K֗H᎕fa*AFc8 "g~i\36>A-[QSB9c/:w26}+N1< >粶ṪE~;1jN_m&k_9W?E0|u;z+.5G& r*`QE;bvڰ%6;3ӭmg…Gc#xeU6.ێcs˂ҫ,.{1'i|j$C֧16;?{.;(o;#ƈ :ҕ>M%nA ʓj 5[O1pj4:ˆ;F:>#//l"h}wa3-HyFQSm$wP0WW߯<8DKRZĘ"ڂ%33' dʋU%!eA-_-H>=uԈ7~}@GZzOI!Rt-s21|jbӋʐ5~ϽrX˖ȟGbw0z3ՙWsJ+2_oٹ?j=H5 /}T[%:{s) ^=s Yt㣙gȜy T/LnY 15eTLjqgӨ=,Nk|/d}R猪Aи!e+vA0%ƏM05$wFdHW_:4Lx2]n@n;h(.dKeq|=c9,+Ƀ%a9 v$c.5Wx?ﻹM{ovpWrvE]S({C'&~*V, 6ϐkӞPmws-f3r* +о@}oyE)5NCE 2Uo Zn4=g),+rt@ 2Z f5W sN0ǹrmP7!}ɖ;'z}{ 9d;dR)eqLH:lwkXT[}=ؒHLߩ)Ҭ3)(PbK:pG0cίr E *R.lx8hßh4؂.+4>/Ƈ0N7dÉ0}[囬;'tjʱRߖ\[{{9%5zkJ@ InD&,r9BjX%UkkAԆL8R<mK#\b]2SBYn-}fjx:&,@uG/T`LU{\B2V10e_7_I4>@h6u!ִ%%ib_gO|@ fWx3MnPc˾Rcae~[^\-*+`?p%3|kW;B9+Fgs1؄i-!QtHf?ڛ=)וjQ^C^@q?IY]PՑU3@v^`8sm1#-N̚[ZFXod8A*RE6.-ƂphkShnO8Jg+\{R{vO36JQQ x7iN0'ǃa߇ڲtBXn\_`$m^Kn"λmncuHZEII7پDrmLFZB["DeP KOFE+}⭂ \I h GLz$譃o r`KI~C90ūVkaqgZðYCdSaWf 9$nΪHd&]gn鄻tr#˓|m{NLJ'a:-O֑V_X=> +r: @ WLOgKRy(d!ڡ݆ 0+k;kStvKN6/-aʃ " ɿv{1~m f_ɣhL6HRfFrJ#F(w^εSg-}Xf4Ts~R灐|rbʁ qK^^EV J1 ,*s=-K(qidw 8O ]f!UV~<ݶc,3<' z/pH_"D s8KmR›( Io  OJE SƖpieIZ (k;W :Xɂ n`65<5sYM4 t q@M-!Qqb5⮨h,yJK#jm)gډݮOQ#qS 72D,ZYVEp38p/W粐 {D~+//6xaq Eb̀HkY) MJ_MX?G'*q!Cl 0I?|aBH stǫ V}?kCAVU`Sq-ICbDs h+1[$;eb̚Qs]OfQ%y%*6R25s|e^_I#d>!.rd* N%"3=y>#h:klXǡ3TUF'nܚ%)Ff/ 6Pz.XT \B:;=qCk='evkѩ0J7ݾj'E]c[e/P+T6?ssL19WZ"wa$Rd\z͠d}ܰᫍi𒵁4Ǟ?xXY86ʋNߍ0'xdpgtmƹrh5,R5_?HY ÿbR_ĐGZ_ Sse߷-[ѱCL R?am FQ9i4p:=ĆOԃ6#Dbp+WٝNv4xBD?o]JqStO%.՗1.4[9F, w.o:d=u%yu'k ըÐN9y+8=MC6(t,, D@|S@@8.ᛀ" A15( ,Xy'Ҍ}brs8_>gn﫹zE;u"SUk^KIMk05lLZ)#{.:{j##a={0x8z#|6ܣN:OQ[߻Y37'}D,RP4Þ&yݕ *q1"dg8bêR0"nAx꬙ r3.CaDf Q~4[5Ԋ_жfztN=v!(58 aoTu'Ewʧ7̢ƻ|p.KYH#RP0u~>Ryaef #e[' 5Y4x5zш(I g53W(hQ;p9)8yFc!$_7Q['D*yqOB$2gM6)U,2֘pu qݪRh-I%DMԱ_ uP4Էwz~D@zja uɔ Jw`RI@% V܆)F4\qe}[UTU?iz)΄Q Gds.d "|(Gj4ֲs ‰iPkv%#%gbb.Ϻ>Fof$Rv2܆j_燒 CԁྛؓMf{W%?q6 2a#YN$>Q 0w7'xYP`H$K4=9X͚G,n vccm~Ëa!- /EJ1&\ ]t7"-YG}""8I{N~Q詉pI|>Ş{$oɮTKS%@ {3GmXOxGSK6>ӬJ̭+Ꝺ 2n|َ*u)+XM0gHv*IH.;i'%bsf7`{%Wh+,```9{ZAGs0w?̽Y[uح*tuPS* *ݫƅUM{5jHP`{aƮfڵ"?b+шλd"_懈?%j(Mb)O%Qm@=;dlMI/u'xL3@Yҋs k6|j/0;qL"Ga4oG+t`lh !]lX)9'1x4˱ (/\!!UN(Y\jxHMMf_sK+N⽛1x8C`>oڎԝKw}>35-5<`e -UH* .љyP,|>v$AdtCUC{w.&`UY<Ћu`K!Bu}DbjVxPWPoZOaAIDLWJWaK%aA`+ > zrp))ٿA~S{q)*%lbkAh\NcQ:- PZ&}-꒝9<ضTW$kV\ G@CM):VQ;Mˆb*B"O58(wB(UܘNJ/ ^I._RGd"bW :1 jT-s"#Q]c;UW?m;ωӝZ֝6%l> *._텧:6)]| &R|kO:E3ɚBXB(b4 7 i2bwA]1 - ^lTec1DR=e6.ҾU1)]f}#jON9b5tUۇ6VX)*X_yV3{;7@٥GԦ{uYGZ wӐҽ0Yӱ=k%l [(F{RG]ms ͸"?"/#Em1%Jf 0:eEb ;ĸanh*LMfҿ$ocaĤqզ9[8}#OIgeLÛmrTUӁWD:ߐL}/!+3m ByQp2l}Z6P](#8ŖdFzOhjHvhͅx穇ܛ3. VnY!9lȺJxv1tZAE&:PRb|DžcaO7@`1 6c&] |-O3補ۣ,aP- Ovo]'FC8ʨ|&fzjuPQ u:?Hcow?$m*kJfztRʭ\M5 S]iҙ|n+ endstream endobj 223 0 obj << /Length1 1980 /Length2 12723 /Length3 0 /Length 13939 /Filter /FlateDecode >> stream xڍT.L#]4HwR 0C4Hwt7HHHtwJ\v>׺w7QiJZ8^;@\X98\n6.T::-o1* v@ =eԕQa?:))7+7 ( wR5 8~X:ܻp{+&gPqx^err??](߂^fSQv'ϳSz>N) 1wx@(^\oyv6˳ /DBv?'o`g?7]7kF|v9?Hf _7zeAAϯogFgJQxMm, >h/\o\o_ #鞝K\os0bt-[ו}f|._]|odw~~5vw9Pt%1[am&`3"iMbFZN3wZQ>SzNk;޽u' 9FW7ׄdqG?2=r~l!Vb)b K5Vx27XQb 3k'p|ɴ_NmpDb6I5꽏 zݻ~!m`AaOAK&<8BEmJM*Xߘ~uό=.줻P+޾wI0Ado#ߍO1pkcXt)tL)Q:1# Yqgq87Vqo`{S i08>*'LŖ!A)tAd1AmڟFSFdygkU!٪ RSB|/l{R&z.>oSGikp{l(0ƒ)ra r9)eNZDȜ\4ޕ̿U\=0Ǡg)4^OomV)( 7J#t)eobHj7 C?гXfx)R0mEѣ]+kqXWc{̪S]]];;/#0/qfKWyo:$[q v@Wb YLY)ao{PZ(ûE=y/ ?4idk_7s2$Kw`Χ]^Ҁ'ׄ!/ҁ9^?+R+SY`O kpKco/~co6=p9JGs7Es>Sݔ G*Vv0&ߢpͭώ2XuӾHiצCǤ߄i2SI+JD.#PvN 6OE#̋JJ᷑&E HJ&}CJAx!a'oc=PfMX38Mx$ֈy3͍#C!hS;Ls8 u ̉1J84ޤ36Fo`uh_=-HT>!4D+G@W7DlZ+Ky5[yO#Moj̼zM3¼ Wt $RD/|ǵ=Vmڋ]kH2$uTהNK] pE!RӢݐi3zk'tZ 60Ӝ%_!zakMART`)Ur(q~VIE!Oېpr [q'*bԻpK+T+ydЅ͒vZmwaGpΐD{ԖY QV7,.FIjng!Ddb0:cɀsx}S6[1'2;ɒ=*6 )Cm,tYSYخl r.d1B\.ssdSE1Z_)Obz^NܙW髌($WAݣqĺ]Tim$\З lNe{Ufqx/9<Ҙ_#ǀڸ닻,pƲzhlCnVt@z{l:TzLA?5M[d'32Kd qr`GI-GN7uȽuti̧9H2xݤfUw:%.I<ּe9rW| $kc8vyTO*{4@!U: _ [,13 e8DY˓TS3 eąV YN˱vx-ƙUeQxc1H:[L`oHi)YQ~ͫ;b.m#'GztOo$c/n{N44&tJCqY5N^a79/,b:p9d \^ <0A~Ul^NX@y/8c.A% NFI%D/p`闈ҬVw9v=$t?gR,tRp&{,5ޅ&$ΌXf#/!8QU.n|T*åQب?<>mp$" Ì()(ɼ'^XnsOٸt3 3Fg͞GFG K bɭ dxd|}_W*ر-zҡ(ăld&lKŪ$yNP6_1Mz%iNg),\vx961 >Br*? i-Be OmsO(zu b,m;Fp1b.:aʁIG.u]Xpaʱƨoi-d o'mzW>l۲fp-νR^kiui\V'p|ث #f泅8]RNL?ɗ+SzVH\"E4+5QA"+^C]caFD,Y?ʪy"l_ih)iTăpˈ/|a^wvjq kEPBԔ?w[#43u uȦa*L0J0W{>ճ'ꚣ`lr&f{ ԒL#鴬W~}lڗF]l+ɟ]};/^Ofٰ / #(Ol #gb.[BAYJ긛o#ɉ&j>݋mC+􂹫QVFw;#|+A덍jhDw6 4>x4 m#@]KKZkP|z:$w B,8bp-UdDX;{‡lڗt^=0" |o7j.o[k'Dդ}Ml.vAog n"9-[P"~Qg5pE'.5 !|cv61mxNAç 1iec;P %)&F^z7 XS_48|w=: **))ז=KA\U_\qP:<<Bxmzlϔqw|Y*lsZ%pW2jaؠY6᮲J ]gWnUfQsL.ODf%lI=57JBTWnrhY_!-.{ͦ- h>zVҬMA[ >m'Z]c:1 ͞`g̼1#\gY%:zN` rLɍ1~sm,I[בW^d^J|P+I M99#X:q}W#Cz{cxoD"G".3*is]+vr9KΙݢ DW~ %f:>+Mmrf6}gokV,-4ԏ!h c4)8XՐTZ_S؉Hh!ͤad->>Q#?WYz *RrX 'D:%z|S4sv?_ϑ̴C_Av 織=H׮[DUo0<I)0Яt+ӑ! w "Hvt}>w.W[ qys6O8(M'ޛM5b:K#Uub;6I[䟹b!kT Mk֟?o3!܎WENb%~rC86%772gl CdT&hn Ν1xDrZ8>oAPm9R40=eqT%mŤ~W5̓8kU1SmBk0.Qr[t+R6;20j.ZP Ɨ?Kn.C;'aB#Y^&l57H'|3}-SmWfdt9Q3K&I5^Pdd1%] "ڢ9ͶŲEczorga%.IOd\C5.jtce#f&f!R^h<j;Ǧ,u\5HE5f W8QaA_= kw\,*A/C{̆;:i(CFuʚ 2߇ Dq[w/ rh ObeR?S5}D)`5ljL w:G]󥆎2ł&ԽDRuHfvuҙjJ|:>k.¹i x/42Wi ˪Ups_U]Uo0ma<#2St: Tq p捞H b LCb j374]ɥSY.t#vq[ƴ,AZ'QeewBU8S0q;?3u )쥵g]3VDëP lIf66dBYIȬ N Mv^)w-Ԛ;f5?n tdh% 3Rt94.W^ޝ[UD~w_"(KY%{w.^n[ v @BX^{s>Ylo`DT,Ce^E9,)FZ[BcQn gg5tl\x~yR eb^[Ԁ2zl4 m< r N)\AƪUXIgJ:jXA%k$/62! ?ɜp@Mw ?K'>2½d)_YPL$1p;/}% 綣&,W_8 `MRu!Y?a< ,TCQ=] :с3_ZQLZt zӰ\2W",K[)noW}ؘEM"~0A"4gfZKHe!yhqK v~yg-03H[컊,>3.㶡kW--nQj֚ה}&!X1}Ḧ́Rٰ ɮ\U?v}'I<ی)T~1T"^߻7A^YQ VF9,a)| ꀂ3S:o$gH^q<s=F2N&<{^BL6j 3?촢)cԢ~B!O"׮^Ufr6AO|U ؉ATĺ]Tk-^PtIO IWTԦE c䧭^?zO,l$,į U~d==&ʇ~jlFSe7 ~^ 'H.n~BV6}͙N.A_~`xGnɱ'fm{.AJm]#twotG"'ʾel[+%<=V?n{ "I*>D`^kնu,]}S;i 2`J6QGl-yrpi.e@m+J ʭ+Lm#y SW2nft"ea&>3;d\Q%{!v -WԨ'1ǑZq[;E;X !Rbhx͌G@cơуD3v72AÆ*aF~?2,#zV½C7b*i>v26Ic@orW({I5UU/n~U'\qqxhPkav+jBKkhWcOy?3dk۲hYEw;L9ӘCJaa1qd(w&?lyl=m C!mU;z-(/PnE-SHb0f} BN>a{މRdhOQ)kF6 Vx缲fEez}hKANZ#*Wy0KDcaaÊ͔cFQEin A?Z/,돍A|2ꑎQ0lKƯ#e6O8Şl{wKuݤ-[ͷ6y{Ɖ;^04Dg`xU:m7 lFgrgdwK]泔K1RA܋ҷlZoԛ^  Jt F)x\:g~U.iestd,m6LO*<'T}DB]Ro>lߘE@ TTIC1+b^BxC9'%@GԼIs8f@c@%B dZ`{l=ZT<A-aKTX~`hQܩmxkQp[sPNoaZkk NFFuR VpR 8d{?jmm;Qz׹&slj2כLRN_7kęTet$N'Ud$g%t?5#>*mBgntѤ"0<t_P)lep.ZٸjX=Us;[GL62ކP׶ 'ɥ46iWj߽T?qM2T86);%3h,N?vt<~ut3$鰛ME!Qz@o rcWP,cXO8Ûw|H"/͚F_̓X:~0 :'J1FVGR62xYw$^;3߄5Pp)pJWEWy!WdٲϨnw,3va! =;^P.I 0}C(3. a7+GTZX,61;Az"yZ[spW6~s!Yѻ/0ظ.ibX,m@\bx&9_\81`h}0fm"D "1NjtQ-yx)JdDQIMŨF7=8FPn>V΢~ڼQ)(tL 9}^F* Y!zNҺ"<~D !Q.x7{D ꯜpn_ZnmYg%_~OruY t[MP]~4HϡBσtNOnWf BE=X!q$c|{ird:p2|X g gk|ۯ6p+y85(,~vz849CVNE qlףm֟d qq]*=`?ce: Q.P7]\'k||>[Kah1S_9[meNFt@ajC$<\8?;N}IÖPk+ 6[ƀ1IRj,Y3GDa&so9 st[,kYtn,l wv4sxacaypwWX#Zz-~RbAE13nʊ ,niW3^ę[ϋr*9fMfñ bl _3qޛ&~2 ( R|Zd33i А-<!;idW(Ȯz0YK+n%P{52Poǔ^u"ـKu3w}e"f,Ϩ_ZRBYyd~}J[p9Cfæa/a+>.3tvQC쇙TJrL*. KN,x Ӡjtӗs^<]q %^@r^nc+7d,s}b WSX`|sFu(b: OF˃`N&ڜ lvx?+?/l}߱RMeѪϕG(]uMXϩqj-hM$w>K| 31 ߤ7hRʩQT"U4~0v㱧juj>iSɏ${}olpڵw|bt}y#|g.u&*NS:\:H&yQb Qe玪3 l6 l[z̤ DžUt(6?i+fAɬV̾=/w Nu{1J7YKmM,,LyCV7(!F$YG/|2K^gZ79FXDcK/kl٨ܽH;߉ IÐnڮes&Erȹ\ڙq*1!n EeqtIB~0e ǪzC9`5)E('_t7c[3)-#‹fP2VU'}VY yG9[`¼YbLRہ.<{n8sžN*f=l5s̋f9vo+1M&(;+6ݿXKFm֩ k h̾V*FyR\)ŧK(siѳ 3h,>suJL&Ky2vp}T #S!6/R5]Mdyl>D2e2Id6 yC$hCE+ڡHg x#6=ݼO M, Uc#O^}+6BF܋]_ly ~΢b-2?5 RYž~2].ۺ)ݞ׮U~lR;,J-gVQgs%gW$ֵO;i?K Y ,}MR)!_UdDo0۔F2Ed/z@GqjtTeG|]+F wb/_!̾Hݴ)Q 3^Prk{!w5@ti'4L 0g$q,/7#OAd,b\+;. <&8bkSE.ɵ fE1 S}.t?ѷhԙǚ*CԾ)~jVaFd׋ctU8aL?57:Y}{][6ަ/U(K6!bęji_rw;v/~> %;JХtkrBHuVmއG>u#9itĔ$r$1I }sp  ~oIk<\!a;|. :6;a8G8^oS Yav>>=t>y, \; 3 @DxIE듔,7 kZ맔kшBѷ3v&<:MVk&Iiȋ54"A\OIu ,&d|.G J=hzO品uѠ4Y ʷlXs3[^yWJ{n’arz?hLs@x,b7gU2jV_pMmr^ ʺ|ir-RGuAP~.ѳ*?’"Dzje)T+\rjk^7;9;݋Ň ^%s33O?Wgs@~*(#CVx\; ^(/R@_/aQF5KJa10Fjg.rSnޟ@ltpEI쮷ypcN_1^JfiXI2^e~N ݷL*̣23P 'd' 8ic5Z|@4xYi45.&*$XЦZpCVRBhw(w\w[qi\xMsBx<$oV(Z lL.O=s_:{K>bKN%ʁJq1KCIx56CyۑTp= xGaG;mg#Y׶@vƼN_W!gv@ed$ rakgdi?&+̧HVLjED?ȼ["boW G}q]EƁƾx!{NiCTh4L;5Cw!|sm[̰X!`2/+WVЩ6BH=3ǔ~jR%,^{KI8{!z5@@T+7ᕂ@}Hw^W3#v.a%50<^|Vnv7 endstream endobj 225 0 obj << /Length1 1725 /Length2 9645 /Length3 0 /Length 10746 /Filter /FlateDecode >> stream xڍP- ]K;w@tn!@!'Mp13sUUkOtTZlV 9(č(V@ *6N B p{X=ǩ@!%w'7O_p d,)) y]o۪n7?!P?47*Y^\_yV6u{N<XC]PO8F?Ha7|V/_ 7_ۿd9ll_"mF;qr>Wr@pzos?m >/\- >׬,]\߰<&D]Z Ն_WKz펉N3.tb"2Ue\Jbl2^H,Q>#Eh7KҜmC] p Y7@BƦ-O7Kz޵gW@׈]oU|heSlot⌃g_Q##3šTJbA?|]k3ZMLKlHDwuWjoXfh%*Fݠ>_1$ˍz/PDȷ D>rȱ zD[5Ƞ)8/ /gݏ&3 0;Zb_2 %{i-|iS ;' ec>-*TaY=k5[yi{1aL99mqݢ4;ކ)⨴7Ӯmsp 1.|?=pHF]]Gh֛ݿ ޻dڲj_l W|%Y$WF`.GE {jN\_#Vθ_u?#ѶF$a%Sa*/|d #֊{{Tϒgc1yLV䧣|PS fIE$ ހW,ܘ]t{֗hup65UكK^Z )6-̬-DVl.hu0 ]i{JlStC]cOcD}JM(?:%=Ms%&6!7@);dDdh$^Oy L.՞H Y+ؘWY5df,XI} tO'W%aX=~>@zÇ3;I5@,eEM^Eu;dBR ǝ2`'N&r'<l@xr"$Bpɶ(B1x:?Pϫ>>'TH Ę[By!_q> 4qgsSG "p3ёv2V9F4z*a3sgUJWXM~\+g/~I;PgxAڧ\0 T(G[ 9[ў =I۱Fa ؠf%T3)m-+^],?8EK3/N-Շ+l#cE (-^ "To; 0Fj&-9DQ^#ge<ە,!Z y'uW.tf^qmn|89סF$O^3)7Pµp׭mʩM)qb>tk1,ry,q!jk;Q[=U՝eV9s}m ~OixyԄ<4;֩ZחUetX)sC.X5vP{xɨֆ )ȍ&h?k:,jӸTܟz=~SgK~:pdH;AhpkaL ">3.Q=Bz@ZyŲc1lO0NS;|HMn'ϴ*)/<]pe!te&NKkwe}\u(D!jm.暊}d[ YoK /vU\WׇПK|u9Y;%/p|/rLߥTMuX*4x`{1e!K5Idۅp7B3>T**yR hS[xnT?l,O@yiۊnmnI^°)3.85(ʩɩa"c<+bӁ(fY'J"+~>=ol=hD YeYm{ @_[#L Z<4;w9~{7BA&#&!w1^atk^GXW~jDF8}%"@ks~ ڑAwxhgoBN݈P |IQUq3&sPwupE~DZwޢC oe[m6a~`Y8ӟڪplߨ=2Zy0kXF4Y0mkaDUK&Z6TЃecDDU6.ݿX+.~)>Z9PofO2sU*/0_y>BA8~zL+ռL WXa%kr(B7>^= &OW@|6HT$Ն94-r7XcvG%􁬳ض Д~1zk0+ RtQPI^{ {p@Wi$$F.<.X2uSf^-Z>;iob 61a 2lP~OҭT5(SDn)!'Ӊ] b ¾{X`~/M=$T}'t{T򬌗`g&2'S7{>m_= εxv["2e2,Æ; :f M!]͏Xj?B J IZ3M?w).'1% CSwL-.j:!#MO?iP׈).Vl^gtkg(; КEq+ LASCdY-thnԗ!^w $zb>42i+tI:sYq$;?ęO=/3&uFQc)؇7{XV{s;nku.Vv)xuiAӖơzV*Q,t蛱+َW--Ȅ:Ecq7斑lW~vv6~c`FRt@-T/RtoBk%搣*g*'n!m.VGS!`iɘhу |l:B/,Z4A·4KlHEDAg\i$|Pf;)h&'i̠zVF jHG'F/nmm`jal 5JS -a ;Do-ȶ* ,KH"Ip:OV>zRs&:uLѫNϖ\Hz4 QǗ,C4i5]1|k޳4b!^9S1E4)R8rU)Z~|#;~8I0R9$h,-`$#W)5z\o\%:<ȫ,NVRWf`*]T_]@/'μFr =I;ʥaX2FVrb*Oz)1 c ;0 ,gʹ3v vmxr>OlWfOxЪi:sUR=_!zB Eۯ;(*X#z)40j#ȗpR9#cX'fq0փڬ!Le>Z mdglsF0b/"qԟMQ*RBFِ`F~MV/aZǏ~=@zTީս'i7+{µmk5'Ŝ3swﶲsc$\OCXKG?L6IhD]KkqyOӑ4g6<+瑸  UȐ`w_St Vi }xHo*6mŷΕMjՓ[n/ÞH.jdíԀDTLڐh:a_`:6_j@ 'u'*eTUB``m[Aiu/dŌzERVr_(!1xSU%!X4ow5 4Q bR Dq;0EE]Sآ䣵f+5aHnC[CLJЍ]ʣ:ߡV 7󾠠ǃ@3K$T\}#V=0mS m Mw"L@-|'R7Y#W.qJnSfM4h4 %hC秲X,W颉uI[؏SgoKTLMZ'{x$>S ^>t;omM)C?Dvh]Q69_d}4[Y (?7'W/:iF\,jPޔPb:EcoM=Д6wk^xƐr磸Pb䣸_׻~/H1 ۜz<Co;| GF )Ԯ/Mg`BL/ʋwEkM~46׮3HRJ Ly{5>dB9xyܣ1G /&,̟TR'_rTP/~<3SV3,̊W8c_IN$sVBӈ+M{cP^1_q|4=qKbC䀣Y٣A v]2Cc7PTe뇢ضD->‘2^E6kA\6#FfN.Zxfnp:!lb"(A4"̚/v?dRHr~ a0,yc_ē᡾,vwBw:k?lYe'cd޻4X(l/9gYUwJ"ߏ18+TG'̯Uf M %K-0m U#t*mS9&#MM~ֺ:W׭'a˭ג٦evW'`sIʻtLu.2>:+Oྼ}kg}-__,eoi ~ bd䤎kFȉLRY]- *jiFH ڒڹ#I+Ez$._1B׊4&ߤ}~ £վrLA.ENEm;R͈4k/%6w-KIh赴z~4e'AjTݤ&;w϶j^ ?(嫱 (*8f1eG9'?nh 5Znob[\O՜~zr)y;ynLE'}f벓&G~TZn ]^.CXc@Ue.FX o7zU%]j TvsbȳmO1uԶ6rUurKzh=xQ1ע+[=M]ZacLni<ޘSw"]Nx+-Nƌ RKrڍmn ^68QěQ3)δi&z2s1 qsp! _3m ާ?\i]Z&&eLfQ{j|iR Cw֌}ÆO׃KCokP#J @rۣ-njp OֆWID]MP44>aYavt429brM߈_OGC8HkR.1B)r+NVU:5NY 'c9ƽ g1h#sN cƵ콭՚`³:οY9㋫N):af1O8%*P%xf]eOx%ZKV5p_IP3r>") Vpn5]j2p&G2ݚs>q433b5E i芶5] >"(ߢ;U}c)DY)>.X#_(YFFIE/jG9UAҶꞈbyb6>!A?]c>@d[ETɏs~rE67,i2eXolRRgL>*n௱O/_JP؊Z0R9j4Ta$æ7/*U>P>G)4nM+-dU;C@LQW+!M3jdܱ~1 ]ʥ +dH%?5??q%xas8:}DwD  Bfw4TܷUJM1Me^oBn?2;}\*L=%Wξ(CsA> stream xڍW4E(#]{SD) kګvڳVU鰷j5nߺ{s~-͝M0:UT)E=FZT F&HsWz:awYgT WDFOnޖ$F;鈵uC$(3fg+D^?3>Lj Vzu9TT/r(]xҊu"6+$pVp꘺]"Ϧ(2]:}!6'eH|3u^|-p _x*>h'%o Pb=ʣ8#۠BҘs3?\PFaAUS#[fIeDzl$) ]6E?0:'nZ ӧĦFۑTӤ@]^%y< 814^3o-Fmwn{IRF|s- 2Q rC| E!O TNCX5Ω Ýyaͅc,ͭ3q|)Lf95K6oynu)Y;9[y9$Gd(+Hs>c1pvX}{VMK^^e^s_tO'ʟym V~zE~ 'ߐ+p%L-hfSI=ĩmh,6k RQaW\_; kKTd^bdO7? ӌ\ٚe̜'EwW NqA#Ki`Uu6m BSճ]ڐ;F,D|s# L^5r4|Hgy7RsNc`2g[vvXgGR:ky=Xާ$5W=ZZϖ#lLvvصIV=H=,9$#(h`|d]D=^`3Bh ~tӳOZ{EnWC/ - &6uW^myG]0vco]5xc'UUfmOrw'L 5#Oi,Ww Zm.Q (ЫXnT^/gnAQh*wD}f0ZvChgt3L1N"w ft:c_w/]gOify6~׆6'x_xj_!G }^71-9 ;=F) w*(X:;Ҏ`Vdd.A^{91y1т݈O%[YW{i>hqpBlŕ˝ZDZη$Bz˔_).pV+,J7dJzxUylDk^nv 5N_WX7ۇ[S݁{e* ЫY ^ĽǴ1)xq7Iޞ(S'6#{wc$f0Kfghz@`Re}ةh7kഩ1?yYFF j2^ag ֿX΄\6w5U_Loc؛8dޣl[M8)S-c*}~c '2 Z~̡T^.rr\|=us Q ;PC>Ԣ`HjRfyRqoEzZNW>p ýjq9rSQp{(lƽnƣMtw2O->m;Q7LPULׇ6V/76gQSaʨ%:"ԧ#>VoqMvl9Sng_,yPIrϭ3 H+w^8c%Lb#[~uRXf5k>w1z]?$xtt0{xX~B0GK- ?(/[QRAS`^aμi]R/i㱡ւ"#zߊi봞妛{w ò5{2zW|VQ'f -[GҜ4Dg³TnyɎ42渌=&q3NCbnܘ:}3SQdlVS%ľ:D-zsWr:ك6irK“Om-٭zgE{Oz|"B0Jpg?qOCEi pa%Ƽ1*< O PKj!"l+ʭ7GoҿzԵqC:sNz$;Q6XY>u7<'[ݘ96GEQ;4^;x*k +< 5}\T?=4Y+QUt"x}{d,3uhD[\iVe3]!]yKvЌ,NS3;j9*6L[a6Rѹ{co'/XwO3 lVOaad b@-\$}NFzESlոI"o݀Vը%!_#b4)!IYm30WibsT&"Yekt|Yo*s$Tԋj hZNZW8\\urը.4Q&!}ۺV+1:*,ʜO Y"0Nb'dKz;)t!"ǰkHjfĞZ͏)&Wh?$tG5KӨۚ):8#l|&cUqƠZzQ~GN8C\WRAlI?w/ a^Ƌ%eІ/q2MgR:6+u0s1>5ӞĄqTEo~}Hd的*0b(-m7.r?2ŹJ$lpx*'-.泂G5rOSK·EnY9ީE[q=M^W:p}]*d/<ǟrJFTG¬;B"NNM >Q^ҳbyJ:*^\ dq 3XX;FN0[|)Fo1wk 96OVzB]/BB+q&sYvb U;,:\W륯GR\$teG?h |QVJ}78s@ %U_'jQ B?C!Lj=VZ/`׆7ꎖR޹d,g1fMy+oQĂOsMamb$-DEޭepԵCcAjhق/g.֤6t+ڹ&zX49fΑ%~N%OeȠ J<A9(=9|D$U*qm?o=ޯHBQ*7%MD٘Yr .<TJ, P/UZ[x;j;B*#u}.?lңYK0[&uw-7Ad[J-^S}]+=RGTLeK*PҙA0\1ZM esF%ţgxs{HvDصW;M Er>?EKFyD7TE;='D552v7?#tBhkt9<-cum(:dy O;<:Nm=' .[IoYf׬$!>@Zߊ XBw4Lt&@M,~ӝ`igj%)}+hbc=Ȓȥ0J>+~ 2^ɖS2 '!{)7xu9RwZps|/F endstream endobj 229 0 obj << /Length1 1509 /Length2 6998 /Length3 0 /Length 8009 /Filter /FlateDecode >> stream xڍvT\.]%H7 "ݝ"= 03tt !-%- t?ݻֽk֚9qs{F p;* It %BB"BBD$%b7{" p+yAH4 Bt0& @ i!!ߎpOi2 ha`De JII(=! @tOAFp{);#҂ 77t`O/]. ; O0 @!`9=F=w0쏳>_O IWD`=(-A@0_ (y PAU/v{O;!@1*0%D2l~u_eua֎/ (wAP 91!!! ) ; Jnm w8)!`? =Q@mp#v`'hg'`! -8 h=43SM"/"$Ef _w7CvK\ 7?OЅu p+{K!1!{[Co!* me? 7/;Z($#t辀C&;@Pnm@Нs*A;5@B``}8kBBeC+z Еm[?T~8 %Bk DpO_;_o@{eٿ{!;z`G(/OE0@Dzu=AN-=4g '}}UX~3#4]=%I_@uݭSS6?1aY%ul?$2d= ld2wY3(p7N|Y8|oXAFoNDŽ}L94᯸LiђPm[*巡kxÚ}TNZ#&vI=٭^2苃ϚK>?$|zɐ=D MXVf{u HJ: /hG9ʭ~]~ *gΠB}*N(=哤/?pzo8La\8΀ߎFkGRabiZ sR3:.547R̚{r_gD5HrQřwu9,XCv*!w@TD޻ŕ0Untݛ*u3$\&3Rv5݃|ŭANYv5qE$!xX~+ 뭎!C?g$H~%y%HCCDTK)Lf T'Ƹ7#xMgtf+I` ;3'zvaUm.wvL CHV#$'#sTvF'r[‰+,12Phen4B宛~hd7@,-'5PSЪv&wtSw?bK[P0A4=æ44oc a=Y%\j2b|56WL$\sMKdnNsmT䣼 j9ʷG|C(iq N-[)tD6n:qaF"&qvdZu u*̎!d;pl1YFfʸ_Ob,ٝ]ToL> 9 G7 ~8=b 3juko=u)pcCI7QφGCT47O叐mY~|c"|A %`Ws[RQKR:;y<>S&Љr˳AI\acj)%[S{_]jèw(KxD&I`ٙR}Z)ldl(9<ꎉﵱEr!>Uh849 =I,d&mrYݓ-[,Ԓl4#bpډ{j#$F4'e.-^Μ5kl366Z@Ļ 1}3 6Ϗ#)z4gsͻjzv{Q]O_Ox{q[J8-ىitꉒf[gnzV|Ʃ1a}L1sP]$1<2`9> iπ c._W޶^RJb_;ԸЉ6miz964G c-=Q{wu3 }Zm!A`|4QnM)픳yBm2%en%k)0?['>/HZ[ƹ#ʼn{'-s"Y`E{jŝ@6hVʄOM֊[J}&v7V$Ͳy9DO\2hO[oݽíc3I|؞u$'oJtVɮ0x\0DDnH 2•?3St 6 nPrkK.`ڳ-΋\.)*(Gv[\n,<=yУ0Fՙf1^KTJѝ5Pqlًz=+W6F~vNpW&g124'|}jAy#+]UC<;<f< 2h#GTtsF*Nle3E['pZ9o(TY3؀i#!JahMH#+NKQ& :73Iu0pj,~ܸd]ҥ`Ǹj|3=|i4TPOǪ7 '^mi__mȲO6}1"*}uaZP^,boK>3p8]xb@1]1ɐ^ĕceV3/XmSEJsS6f}\ "Jҩ\6Dްvw0WjN)bUHΫI=/nmJsE Z|Č^װKQnH'xdM=1 YX}U4 ōJAwcH"TfI 7+!njC^JU`4K=H*P>E ;_:/NtbP]8e:{)GFgRg\KƼb]D* |=ӝDwHn^|jط~xc`* Lú9((i(\B쒵GZ7 R%qhJE4;눁&RF9WOg裟T4e*<q&/$fNSQd@$VN0 4͖M$8 %\\p]v{>Y a}u9Vϊޛv * &3{c#r'z$\|XHViWZ+ir'*BS@mi;cx&4z|w^9ӡPV%(fYś!jcg9&M2ێ/Xs\=Oc3Up>^7"vZ{+3!Nx8!/`%tyCѵ9cĘSCԄZ@фh %6 pY`ƥՈڌڊO VKM}q1>OR\O'd3g@.J tU=E=cV۲Axܹ1I6iB>>L,rӈ{)2")m 'y,N3uL3NS}UI.V͹Pj5]cDR&qki/jb,Gw][ ]1OE]5_镍iZ2ĥTJk69D5rikUXz_yegqШ)YFw q#ddEYw9[h+ynWwX GW)]YGWIJ!6uKinC-&Qf1p4Hkέ>Q4ff[> Rl?j.]2 L. qgӁ{xlaݍZY$yM^KLʴ~ oN^P5'A:3lW춒$_#1~zi,-f!eП(16LqRd`Rl!ĸE0FKa.cҬݳ缅ށس9*pEn}h uj[+[X4p{0lv4lR.)lI~-W u [XQd{mM^iQ[ٺ%+`Cћ~Lłƨ%ao/+oTx^1~U`7P̗{ձه'%m1Ѽ4vC 8C#DC|8G#2˙.O\5:CI?o樂Gav 'aq2m"%&4\ũz~Rp(E,>fD7% 4z,'3WĤǣ"n31jE%b|\ =4zR~$᫨,F߽{OehK\l^1K:z@x$UH&!ᙠfwVC x~7LgNk *YAPN'Ƀԍ+߿l$.M^{^+%zqt >Z Me* 7}"`Snغ]iqmf[a"eAuHؼg#շ_;ig&Dv [@Dsݲ'.h$ʏ-2ۡjRxG{t),#!{aRrbhб]b* txjʇy8"5yU)'_[EUeg7.n\w(zwJ~, tMoɅʬƜ..jgFsH#N%1=l;$t8ꋌٱXq HW {oɫ]Mp{QͰdW cK$V&"k#q;ݑm>(k̦T63?Ҕ@bbP蕯_2'ﻹUf) ۤMUC[!hإT}ZoG.!DM25 ꦦLt S1ZQEH↧=C*R40=uVSCK(E4*RHzWJ~^AOۧkCcЉޖmOonY\XJt6͙AꉙZ< `QO]{vi#X{Ki{0)SF[%auI4S F4+t;$+U Hhp !(\:?7s ^-]T)vh{iH[ŭlͲo9UVPZ',iY%D醑^rh }Sܽ0EnS ]O eo:aRэjDLƴ6ޜOk lΛz)S'qf]jK+6Ґ32}h+0$w&֧-]6$gZmJUV_ As-' Y?W)57 !y?_LI&EMӖp^ޖosa}|Ů-v:LR^Xev:\'HWsi :$`/w,s9+uzouHLiԳ>4;<q`82}%>QQ#r&t!} n-?Vb U\r:)r{Y}QDg"(puVCtU+?ʄd7K^OrHCě(qKHјp%PqǩO]e\f*2n:Ғ P k}}Hzr$bmMY7^d}_i8Hy1|V7sή}k4t*ȍ endstream endobj 231 0 obj << /Length1 1647 /Length2 10174 /Length3 0 /Length 11238 /Filter /FlateDecode >> stream xڍT6, 9Cݡtҝ -ݝ84H H}ss[37-6$rqUl\贴n贺 W0" $=B!%w'7O_!/C@+:4lc_G%#SP;@B@7[SFK@j yW[77'!vvOOO6+F vh\A. +o5#16tZk[_bm'x8-A'wPwA2Vˀ88o߁?@KK   mtp>=`œ9IM\-]Nnl` ydY4qsE] dtjzB|:[!Vֿ)X;@ E-Dـ\3ei;ko'%oSNP'? \AT7BX- 0?џ S]^#pd4[VP4]AFAYW^_VnA+/t(/@ߵq'" 30;iA1/Ӈy(zh~?Z#o=m*i/ kkUAV`w*6CbKʁ@V`7Kۿ_=x 4 tOfi>u JRb s\| OV ?s `g@ݞ\OPKFvГ߈W AwVv? nT)?Sj@ΧDaDNO\uɖ..Oϟ%xWY/C-گk%I=Ya30wK.PRkBLYݒeX=hmDy)Y,Qk ֆ8Ie@Ķ߽n=B+\mF޵gWCyv 2]4kNqp,mE1+9*܉G DftXb_ 9\HhH .qG|vӔ|ˊW,zS>gI_eaʬkEC{s~Kѓ~\WތoBNPfVm"l-S.lYp0O\<'slM_ ;?HXQ;EeB[k;{ŗl#zfku6+zz?VM({#\fcƖn#!JNYcыp}NHD]C(jumFiOp*ۆ25Av" Obh 'Pq DU4o16 S_{Z_CQ)Q:ixd2#7'{ SQI S/<ƃ1"~([Q ì) '? ^vl*wV1 3 /7׼f4_"Z)~Q x$9y\<޷{)CUrFm=F;u ۊBqdRHoq>s/Ք*Z %Qc5Hqb2W %Θ3},^+YLTi]n4!qNR Am_KM g4F]բ0|Ȯ'nEUa3bQaJEEw HwB0og4-B׈!%3xv}Ķ\w@i6>H,Mk)'dpAMHN3]iv4'g?bM~nfQx=hIREٹ")՞N~4mGCg8I֦ WlR gD8SQ 6^:w19KuBlۅ=5/&i:I5EBӈsk>(mVq4j DR?@)kÍɈb{<Pm׽LZ7ZCnhQ<I謽:tNv`yabXm 'UXPeF+TL!6ekL5E|p59dַ_ߧu;mi{*yMh9=1ȏ޷4ZLOpڐ]b>xQ'ii]gm|x>N !6ǛjٱҌzbʉWI5=@ȂA`^rX"u׀w3Wh7bY ph]|R8DvٴN=o P }O6/ 4(-Z ǃΗoJJ]Ls#g/VE>ʂ>RwiHNfxUd]fzc= z YlMV od?:4]"ɗMxI˽WGAMK$/%WZZi-Ij} umMܑ<rPfM2f%…+)+[ WP) N})l`<>]b)3#b9*eY#ҹ6H)bI_FFca8x~ɉ1 CWeIVw,-EH'n' وHb|'fN5+B&ĈL',M 'v(,{4vQP2\0QCނ{hkBSJ De[Uܑ_.-]FX. ;ce0`c'4f旜 @~usֻoeqqwJ])oȱ!_K+A 4&uu9Gʫwͨ%v;V*q kݎ~=3J ݗ"< :佊>7i^ _ 3+d(W\R~y,fߑ'qL@<UXPq&FU-KnT+.gF:nwa ~-9הD(~a! ? ߞ^oFVLso x91S3k95~UfVggQ6: w Y`{=>&8Hqy(lgΤ?-#T.K⎁.{ǘrg䪅Beo5qL/C:M$'3P,rޜvz PFX yg- bF|(U6 ^q5{(RjjWs?&Y D/qE>/1l4<)J䯞K#Ma @cL+b@0 LbF}򂻍ݖlHKUdƔ&e,½- ML' h/ӡRXIڡ%_͡(7Ց;rR/U8 4jMYԕJ6b~L CmڼvI9JiCx:s$ _w=o 45ۦ= Xpj#*#桯"sƈD)V߶hdB΀z9v`O24ѹYHyri`ʪj5b)a%ѓ N5^bng3+zAz~bs@GjQ!o)[B]鹅{Fr bTX/ձ?JGC_xY }~1ΠrQ6"6` `y6j N|4`n@:prl ̜- uKC +g11=`AbUAvk$)Dq>"uRnL׸(}륵vY,I*og޿A*)-\t3͉^>p`wdm|lU/.8;79ͫyۂ`{>Nw@ٯYsSN(F(p}nܘZ XjpG;Nc:!CjTɡ@TThF:=y{ަ1on4,_[u LށloX[=1?֬/N.Đ]0gè,7]l^Qhy" 2z-g5x<ÝH%uHay/uOt)l ÕH2a/UE|`&x_l"yH5>*Bkn;x4GeK.TCr6ّ~ڕE.b񹭡zHW:g_II73ߢ~u(݈*NHݯww{-V}8Jo:B`6಄Tm;eݻ*= 8#x䡫jR4szkED DUsJP&F:ֱ 4%&Eujk!`ׂӖe's?eZ-ۘL۫z{%#W;y|ҭkUW?-Z^ާGN58H<cfΏ] Sf/9nу?<s{CP0qt.ttZthh/T$TmU WvFdS W`Ď$@j .( x䜷I;[>Y=AP dl5#]'ymwJL!Le.c B@*9}vwr"-rx'׌!诞׵&MJDD}VʮRg-Z"Z;,$N3E 1Sq\d my`)24EA-,{.L1Yi.ϔȽ4k;ɵdzRV"5[Ŧq,3ؽs0E %:&:vzxQQA}r-_\jVT<^&`1TS !%١%&)=Q㝎fePE0#ƌ&{N`);nRjȀ=9݋ȔӱDRVK-]U>4+vWՠbh~=wJF7'> !>S+ jȍwuZ7Ğ=LjXϼ,?v ~Pq*x}Z0~v8yQTVӛ+i*Zsq$3µV9mK>|ݒ?tU:ZsPcus .|b) ܍a)Ay <\I^Īhnz#..rN=-T[tKzA]"EyzY yp[5;^B*Hc;۬t2y&m9 mzxfa/l*bg M0IGOYS :]i'?@.<(JjZ$h~ 2_u(6LJ3{YJu7DG*pbWJ/})nUfiޑ>'VM6Lh #xo&_`BY cD?*݈ι_^ mk0 &Z-PNJV}GܹB+_֐ WƓZjVwTb*[/+3{Og3ڗ'tv%PՒӲhqj/,]q;y:+R\i.#RƸsWҧ^YWF|7~杳zQHl֬֠(zۢ-`\ج5ڏhL\K:ooF-"ɂ.K`CLBΘBV+<+o<'Kb{Oo1=6$;O]4 i>];N`:rk~3Œy"}/`c4rWv {u{NiQf(^!Y+.R`ú6>9 Z-.4N+sȵ>L05EOXD%=CFr8V[{;V僔W/i+d /En*hrhTwWG7jv+2Cr\𣰊D#?,W 3 ɅUQw$~E;\QNwoioe6gô2|6:dd;(>UxAZ5V" 8*\1ʫ=ɠQV}cگ%Kx@J1EgWy Xge/NbA JfR"N; !M=Ưi0NjjNn0+1R᭝${tH@񴆽|Q2P]9v@uG''p/KWLWb5p Q0ܼK%շ^}/.m~A1ӂ J|ם2L~[BVuT=Cw|mR5Y_$ h#s>ABo|jkd$m{0|>8}Hen/w3urowӸB'b%p_H VI&(Pq{H̛0O}n|Jh }h4z3%jrVN_9fF Yᜆx|rq@fTUI+% z=V[}R-z{zZ۠ԴK{0fZJ&by* b-W]%I4fi#c֌XnvJ2նg;k_uBi>j<˭4n#Kı:atTW16a&;V9?!\nC/@"zo&ȟ_dעW=.fSOk-gߣx0&l2f`s<[7 >_<,RUx篪,!M}cX' bd9/k MLvՔ`}YAR7i2/T&r`~[Qԭ(:4ᭋjTZFEBbw7fHY<ۭ9tXIz`s+S&RzQ ?KFkuG;Vm4s =RZXe!IK@cj,^;Q& _xWk7$w7Zn(kcI᥈gqK}al1t/@4U'<>Ĺ=Dh+m,K#@M>?#s$"WA9;:e];$ʥ+Pe_@|uN TꐑvG`' EӾ)nu5)ks`-u?=ZV xl{ӳc(xؗj8$towOZBaVF4jZ#؉fp;-e̻0mV(iZmWHT]_)1Lw>Fcu7Qrz*НڠnyPcPꨏ"Zk* @uhBߤy /XX=ђA2>7 endstream endobj 233 0 obj << /Length1 2410 /Length2 15256 /Length3 0 /Length 16671 /Filter /FlateDecode >> stream xڍct .v&mmO$415M۶:_|ߏfgh(T5X$,A@Y + @JICQSΉDCifAڂ!#4sӤJ G;w{WO._A @ xr"H]lm`p1K t0s(- [qssdcd5speX20cl\m9O:< |b@C6؇]? Z6'}i7N4Gs8ԕ0|~xH67?z pmuC'zX+C>-z^@ 9P]]H}'W;97{mVʈnUmD !ey~`ł$:aVD9G`!&Hz('FQqG#*5'?pV#&(r0 [EOMnfS.(<]W;}䦓;oXs<3arHnuze|]6;!0E_1 -*B'QQE&KΝr~Qb):>"8fhx\d#;'x0wZ+TԈ).Wxay R :Qև'o񻲼& zϳInhH+1OȰ.*Ӧ HN?2Mg ߜ4oh5Jڦ[,0?ܫW`/9l'2 FF-!a4O8Ox1  qG ״棚'Z/\VjJfm^\0w4-Dd JhFzӴv^UXwF)O3Rw=%A=mcw7&$T4dޞ [G$Dl|e-H:R0ɉ P6(>ݧfQSЫe)6s5cVJ3$b*^369]#lJ$K鵼8"ڕ*E-Ъa33HU]}&fPrwfNg"KP4pVǷj!D.֋D9>ݜG~z;uQ jIl1W 1֞&jF\Ve)PiIyw7\' X)r\SrPaG;:O.t 5lxgQ,q3 OH0@A=.xX>bikŌyh;+N_E՚\ltk,I]6'Tlef'/Iק]n;%|gc,QAaM&[nl/~kO0(W?w$H VZNLF{%gd{XIG}603 Uv(~QsxV85m i[YZ&kR$v3APF)/*lO~5{f;YaFe*g*-ͨdR?&|LːynT6cL81ٛȗjw1/7{%裦zQBfƁ7hqe}vwAtVd)67Z9d,t2Z1Yx飤bn͍fQf&ժ13L=UiQŒ k#Wo!&Q iMo: ]U:An@QͣЫ29"jJe1g#5$C&G^2Wߢ~ֿ+ɿd/]juP3mʃ\P H#Ř3ڙs%J./-Ru`.ż HCN˜D` }a\Gg0W#&< ]ҀaDzChLi/yJ@2DZ/hF ]p㢬\ tPWkpg[0MׇL%E-/ 4Ë?ƞt~|vA6}MVC'9{o#bO>rKhvͭf@clٹ-I9zzfSCB!q&Cz˄Oӕ;!3;4^N/zk!fmCm`j+B.fϊ;勏-?ە|6o%!S hEt񰗌gcCg:®V٤U⸝q8wrK.e;e7AB-L9yQalvwL[S jJnȩbĜ|\|H:\PiֻC%'"2&ܑIcl.z6ɋLWJe䐥u]YyȃyX֡&:R0 TNkb߈xŎ0e |5-q#mBF 6 }'X'{tB#`(-l<q8l2)+Y$ ҅=W>O͛(\X4eZ=#TPT-Juzj~ yc8!BW|0qDTDqʣw X5[cܳlgB"qؑ) 2/EXIs~t"A+Ql21?knȃf"Dkݚ W<53WߍiS $Xj2 (0a\4+߈}WHo\h %y$b&yMr@UOʜ& kT՚NAgeE-~$۫Ca9?q 8 Y*3}Hl(40Va{eGa=fi0?UV֍Kdˠ+T2(+Pv×^vc#_>-$4_aPjn[(4^Xmuhs ;y:.(926zmv!FDk(\'GkDN*GُA1I˅Dd p9-YEmW )RyHg3~"TV,ʟ~i!Qa|w5Pcz:f_? p>k/ք5""\`^5$\6߻.T7qewTFnMvU$l"p򮶬%)]@Y{۹WLp=%I Gq(򎻵$aEy|KS"@4Y9Ϫczv&l,:ό%Hz]$2+Byr v%a^PAVř^Ib##65ȢW2fj䲿dv>8Ezar}ZEnD$] fa &R>VTM35K/n/!b 4t\2* KuM( dOɕ'g͂PȯFШœC$5)s%U 븶KT0] pهR͋gΣmXj:~UZrf}Tɝ t%mϘ5q:>Ǻ0II׆||FYe9CQrI@5}8Y>v"eBJ(8v3)rQ'9cZ_6l&j KBԘ 376gC_a-~{O&ɴ*faR+KǘHp9;RiƯ5Ebl{0:s̰^j9ݡ.u,Ey92#"HCI>~u-}szbji:Un{3@R~~DX39u.;w{X'qL,K hII\[qM@XA7T֛87dCÞrj7oDž?qSXb̨yt!L6+PVM9bh9j#M1H)֎3'"s/" hEkk&KQxĂvk}~pD@+~{1sq7+5}utɟn} Ie=D;NP,b Y0~°^m^Uӳ} gQ32Ăy;=ײ- -tR/nClei~Pr|Nܗ#Ϥ˧W.k'_s8N[1F@aDoT(Z"K0A-;2yo[/l_+|4(A<ƃ}[Z#9j{"$jU,]n|~^ /'T( }Ȕ /G:"?Ǘ8LN@w[1_ķ΅"cl!96v#rSQD>|(߾_CQ. 9zn貿z&*BѳXr2gl[ |)%E9L!nJZyNz}dqe}W7c=1,@޿ϐem?^Q (O&k۷¨]%()uSp< _g3*B$WZ(y/Tlkģ6"S]4òV RճӑoURȁ8c%A !?w`BDq'Pm{-ϐ 0yW rZO _~xO6g~H?ZNҷܞj҃B[YJqN lSb\LO"/߲SHEiȞ Z\6B-GX=QeAYiq_=]~c}6J0L3O|9bGq3/@}RbFS%GX(>o_N#_i(%Mة1I^@([VwݔME㹯+’xԕOMu]dJM+o:?px*H XjщBbW_mNʫ~4!ܪͽ,Ͻ2`îcpS࣋e_g|l@l֨pa&xr%ÓkKiN1W;`m:]UB_vsL)jK9E;.Ur&55, ie8kjZ4f2YmˆX]O% ~QptG(<ǂ0P8^ϯT ktۃ.1EH'qx368sy:yD!lY&}Yf|k;>R؆.Vrm ׵Sİa =PXȴ W?tv()GCAga;3Ҡ\Ѝ0o`)>`m)C\ur`PXb4 ?#a Q2&-XDƁ^0)Q.Y {z m3'!LC^ mƔJ9 h^NN+0Fv / z~6$FڄB>}Q^m?8")+% "맅ȯw{WĦo{ۄ}SЯMxd0vfB T~8'9:S\sV;7C!qY=xر/L)Z[n~nK/5Nej-J&`Xoq`2q>i -((xmZo !SUw ZaŢ*ң55D傜K1vHrEՠfp'掶$x])ȣ)nIb|3,v?іQ ЍZI~>R73)ifez(7h`˞hS8΅}rk6LG& JTg/C'y9铫 gWsW{|)#HBI/ye>"OT#j2XٱᮐIz O!8H}|kEH}OI{9PXvgRcT`H?m0~ׁ05n+ݏ]- 4tV3fѿ̹i!AȖJ4&buU^b UbY߿M1W 0KVM&)#3C1Iݾ9+2~<ׅ@GwNBG3i>%,Q7ǎj+Vf;ܒb+**^U"y'.nG_۬JAf&n]B9G O?~Fr,]\Z;tSIDVD+W_W<b[eCl&rl7~q, 6AO]bc+hI/ˮ#.m%]bӛ)TA͎F7S܃ͤ:؝H(7gK-U6; ICl{wus;E/iNzg r.PfÀ7f|xsq=\!Cg\#ͭ:dI@5:_3#CHUpg<'ůN<.q1lJt%MC uh=6J'/x5&? v]4ԭa-6s~v!3bRfŏ3qXw+{,Z -Řj :U'_RZ/]Lٸd͠)mGj19NYY17ч«^)e &t{(8Z]6oN3艍HP%*2Ʊ0@WZqk>S~)ݝA/b̃ߓǿNtaƏs㫙PTۮ&̝RN3<#nb`䞨XeyСe"3o wre:@"(şԴ[%y1Ojn. ?H|zp{Chm3pYV+DvY娠qE qgDNXFe+dnZx*$'nqpQ{jρSh+a'z3MOyQqQd+0-ϋ ݰ GJc獂Txܑ½}%z;kJKGRo,<eG*["Qꑓә4_D"V8(L ϩSХOy g<%D6N{s-W900oZ{DҾGuMo<#1l./o$wfxA!m;v:(<Ϳeu:TP OlGCFZPFC[G".*{͂ w?rS0mQ=d&[ tRn yA\j(t2>Tg'F_P5jS+t,Ru$X7rin|=w̐🠂 8nxr#NTĹm+ JzX\ ;|]Ӷ1_hjƣ_|Tcm$,ھ×SȔzݕ.׾|¹DB %%9V ,PWH xmʼNJg[[pv }nxRl9w-#ä}jYm"#`P> ֧fњ}X Id_CzkOJɦ$q'ҘlK.-eb%x)OxHy,]oӸlDZ*ylj7z7:EւxpP}Aqaxf8%q7VС/u;:NѼ9>E-.։w>">]]DprBLdԄ}2I 0{)`d@MKBLW:[kޗ[G 2uH;Ȼfk#j#C"6p+] s!">ś=tQC pj݄r ۶JI֝GIy$$vx24B2}Y܉{w$gX&uKĢ0?(]/~ :p4VSNPkǔO^fŵU͵^>*B;S efV+ݡr&F2Mb͟-)L~K!Sz?8\@i%G\_q2ӢOrF0<:Z@iz4:ÏTd.[Fm ŒNSX,m Mc<o=ܒG՗lK_>;L'+!g^9ve" 8gyE!ek`eLP"$dnSz{h;4mB~1`du0FFZ{pszym9ۘ7;чnRrvCK[zn^WF(թNb~,DK1}4J }5uk'hiPC|Oot .ѺK?Y_ȋ'9XjDOqjzX:M%Ŵ*:7YH5[IXV6VwYGK=&%EPk`*C=wO&@YU:0Q0ET` .ZBY,L"湳* ʣ4]^F-,+޼zɱEJ.'_BCBoBJqna3P# %MOĀj" _5ǵ4 :w,΁i6WfjjfeCɜq,u*S-OF[|#cB!v;*q*_,>Gw"d*Q2-]Xk ƧbhF%I9.#k0l tyq&2U12ӷ]${⦠9O"Ilu2 s 5 ȉ%RV$qC.0.#Ѱ21 \=(ǯzA_U! >SxSO>޷zyJӝtܽ:uT}d}3&Gnbh}IjӡRc9,/ -Y"Cjr صU5|˒=@3ARz|_EG&zd/GURiDE[~g<.&G\_30d唧p_d3N.+P+jf nR%p_0:߱01?rZ˄"%{WӥA"?)ƏMt0{/rcl=iw<\e܌WlgD/8~CبGF>PKGѥ?+*69P pLP=B,AcCPM9KV+?04#!6bqݪ"YуF3U72ȲnnE|dY]G"5|ch4G946oS(sFΝ EoDwڔ߳ZL)|9j){4ܮ,V&r~:$]|'s?,fN,l}96}9`k"y sݡG.9&-~`s!Fc2nj>rWgiG:À~( :_j]/{e6PM1;JM^aYV9%PkFjA%{/^ 2|Xrguw,Ł^xFK4Ai9wͬϋmW*pg}.[vk*utr^Nbܒ9 еf'Φ͝6)525͑T40 .4\Z<{m kPJ Q,A1LIf4Gd1Z5u͜hK9-'"W_ q Գރ_{m1q$-1k:(?Zj]>걝ƗHz\&싮#jEc%LOSaz}Z8O)HsЍy٠N +&Г.yNtOc rF Ō0<f=o&AKtI (^̓$™ G_y.?}Z8cHwը Y *]8&w,jJHpBn/ZDIQNa֛I+@KB=|e9m gwP2HH}frh}uaoi%2l3-Q׹Wm'=?4XB3jfYj]x"ԫX=]GϋP\8?O+ ~RҒ1_]_fD\,1B& ەrm'| $!9\Lq_@a^V$Y!ryG>P gg(úC* -Ʂ**Zf7EwB..vWP2_*%Bp=P^ѐqķxsO6}m>j: Ot"u/AKN3`{!sxb\qH(y|ɼYGf.x9-7yI[ZTSNI|)[pb-,kӲ冣 C/jdado}KfyJ|oυ چtDSHk56s1[v[,^_vnFm,'_Fn] ts٨і斜|;J9RƼ,nݥ79:xʖb-: W5u漊6A=h2ROfBY ;JG"ǵ>2=@xC+\@) k܊KJ=2@Xtskt)XG5a}10Q,24ſf˘BAƨE=q=Zؽ3B\nE9&c[y>pTW<Ƭ)F۝S/7R`㙑IzFeHlqwFW 2Lu#Н\eˠ.Ey>[m` Wf!r++ v"xS,l"詂ѥW"O-Y/n:}+=)qB}@IB<*jJY)ɺ<V;+GEdւ3he5hqxB:?I| |y_ҿuD/?cglc^۶,OML*T.ܪ#Ps>q.ݓƻUt&D:oQj!3R.G%7n-F=`JL5U@aCF(6>37mY7-~T?z|nT\F\r(#?$J5zvh*y*iͯ>& շ235-FᏂ_/\VEJvv[#B3o kT_3S8Z*?8*^rLm6)=֎nzH-NuxWMl1@ :+HL]W□%0290پ+S.mV‡&)XHyc4܉toP=4v yY^Ӵ#m0D:M Nbїmo/[t J`cPό//HXAGA =9f!x xrX07%O/l/.w(lrezUOiިk$IN7f7 CE^c+ne C͎}<q5y۲ηm]Н3oc#}FN]-|SLxz=OlON;#6c(opa FɂkZj*?ۉ3̋-%x wE|lQE.dDk?xI<4a0F dKa620A`Rm"'MҡzK)B;fȢ3KTݨ1=aV.t!w=Y /mfKmzhC=DkwHP Z1}'L7o׊i8F6ߎ\exdK1m gBYQ8O8xF:=X`uWM4L65l ƌ1A_~A endstream endobj 235 0 obj << /Length1 1515 /Length2 6840 /Length3 0 /Length 7858 /Filter /FlateDecode >> stream xڍx4[ zCt ѣ{7Ø1:k.Q z!Z.H'5kγy̬ac畵GAp/(7@ (@fE lF;_ y$lQh&P@8HDbHq'PC!l7$ #<u `[8@qEg0WGN(8?;(E9 'K2@G AEBhCh= @gj '_ζ`0;0@[Iz"h[O[(Mu[.>w0rs~i}̊p{y+r'?(F^pWP/npc"AbB 1 v FksC2 P@!= ~Q;#Nh]$`Da8?%5145#+ @ 0@DD8:?_U_"Ч?glΠ@3 7v()y`+gz64 7@kBmUE٢gDs^C>ÿpbE꥿!:w{ =z`.o=YΫ#0!@wz%g|p @k 8   퐶` e *8zh毩݉$dzFѠ+B^[ o`~s~vY#KŻ1h%b}礁Lyⱜ}ݡ zot<bo.G=qT$#z0Iۜ#x*\[p՗M3]+9'۱Ԕu5hjAiaj8z!Kg<>kӧ9}'=Uj̹CTI9jo1Yh\#ؗlD~L& z48jj?Q^:gmnSrӃ V9j{jAX^65#c$Tcc,PA/cw/m%,$a_ ݆?^=JPбQbi1;x e/„)~m;z@5hlNU)r#nEaT,Ӛ+!7a2P//[CYLFln%H4߀|@c#S T<\6h堌J/$C$DOƎn)%ծvmh<R0s)PC=L6&^məN,ZS>su0D. 9fCY_̷c{=i* ϱ(YŠ` B- l5ΚϾ/$Ym5h(,C1.&V.Me@UXC ɡ`&`לiS ywe{(Zj/BDx.~7~#=xii^!D'riDyi#k5kfª2J{r`ֿ̓A|yXAbI~Vs$ԵLOj@ rL='+F\H%h/잧4"an>S]L{)*Pek:$L\{`"Y0wX&%:?g{p/Gq($4|nR) +Tpb,[]*QhiXe2Qْ,]$S+9( oÂ[c3q۞zisE9 N$2rrH]P96eU/u0벼Q۫p/C$2 9 Ӆ Vyv%7cl`ΗR HhI#^Bg>z'M鳺]70OY{2iLVՑ`ZFCKG82Y+(2e$?L{KSm1+rųG~YYriC;3 8pȟ,X|%c fMӉ<rK=ꡋ$M̌! tB̩,nXq.ۚ@XͲa8=$%qof O\]zl.Ȗs`~n:]%_"a+ C?@V$KXN|eWP;>~QFaɏ357 73(ɭ2|`a~_9VYơ\FV!uFN۲gg[0OPL'2᤟Q%8zVX:̺n]Hዶ.:ξu9F1"xd7 :5@3>(gLH/̲S4 [?SVmpP7?ۧmsTlt67Dw-W]ѽ+ }{6:mEPcVdkM/6re~}36In-˾E@a!چWx皞,gv _:PHj/ք 344݅q}G[ru.u =zGȀW{a#0P-TUa>)S>z29yX.U?z+Yow꜁z5uy1#_uɢ,@TG|kʗI|Yùl4}\Z  Qw7]BYKPf(8a (ۓVqH˿X8;cp!/[c SJ+sM](XGu9AfCN4w ,ءc]K^i%n00w\_c$ s'tS׿H#/+K>8&&νmyvKvAR ;ԓ̈% >|s9s~ K;Pclơ`E/qvh̴}»$ Vay\O/bRud~h3ū#xh q"Ы)-dEA7|{H(WĔ0bK6=>b2Woޞ3'c &`ݛ~u^A>F=H=CrN2G˃6wU_. &EV2F4QOyx]HNV4{)UR<া~ldp ~zD?r']&J˕;4p\Zpssچ_9=Y s.c?}ٻaSrPq5Q[^Kאָ%)>H,IvMcqk.ʕy{N[tS"#39.V-[ܸqnrpNs6.j l!h #~X=x!!Ѩa^eD2ZsyUYӌZ:,#<m i`g9ԞF XNSUXͫ6T_dT_X1Ua45yY?%y@Ut*]EaĈNgx:(ƃeN~ZzgW'uҝjJ,†|5@M3Eu0 -dŸn~7Breו'Aݡ@!ա:J7UoDb C)|k+/tt\5yG&5!2#ݿ&3I'9܌jMύeNgTI2x~m9b٫n\]+ _#|=L#_n8B6ߵ(HJ0[h>pAj#(̲2G9FbnvmRT9lYmt>_;PI& 8e~'*w=SҺiG) T&*b4HU6ťQs8#>gyW"R.] 1L9B_0SRu?2,y= w^p%$"ʺOOw>0IQ=Z˲SES-SȦM*n k[94R qQ0rH({ |x&lْ\QRR q jR#)3UBHąj&>[ JƃJ3jw"GJksJ̈́c>Xw56@5vMŠd:[Xx4륶вzWX"0Y}I0zljc1`b͠x/E}Z~h7x-_͝ALRUatky,~箔St0k&5Q{gz(fWjZʾN%l]1Ej8¿Q%j} a3E9Ð9n''=-aDacM%fv3ɚkyNuFm\ڮHlNG/Kbn' oیVٞny~0hZ>DiwԻ\Y~okg vדzc;sKZmֿnf-eJ4fL[(ډvCh醰}! F_|yϵ4@A"$Y|{ emsϛvQΎjaw{tdKAO(}-(c6.wpA&%5i\j~υtMR),-/B'=n:uV_-/͍R$HI5U~h灬|PuY)&?GCL ;_t+& fZ%\YaЧeS @v|P+aT J|Ue)m gˮlu-xԀ"=yq'ѹJ&}eLsܧ^7*f(Dĥ<7vP3a1)-Jӝ`0+KE&'saJոpeCi^tD=(hC—I4RSe}7Ue-] 8Q(RtTv {MEߤAXl>Pp#ή/;pլz'%`L\DV-ŵNCBēɮkDUdDthNC-Nn>RS o?hf/uݚ"e ^ZP.>_Q$OkT~쎁/I3Hn w#L#<KSۄWT'O˟?6:>tk76\f~X;d%*dGz3Ҵ\~i_|^~'Ңeْ%\{J cj"DI٘#;)F>xe&l{H:[Ϲ7REpufECojS!gs3^<^bb+f!Qxv'wHF>Bs5IE-:EyҞSU/׎y[w^[ʱ7Ji'fO-̟xQfm>8NʓJxOʾe\س3vo^63xns[LpɬܫAt6Bt9UaRǯavUn&7C#6N4_,5z=D}$HB$L4\5Qy]4L;2p·|mCW9lsxz< a=J(EıR3~t8hـBXKKSՓ{ QM La?C^s*u/o&{t4Aڼ<?eTgm"& ŗ3a64;W{ػY5+5 FX[YUpzs*[~JSZmEC\#oYtM;MP endstream endobj 237 0 obj << /Length1 1399 /Length2 6085 /Length3 0 /Length 7047 /Filter /FlateDecode >> stream xڍvTSk.ҫ4!${oR ! $"("(](MAQ{׺w333{m^.#SQe(BbE@<@UJIA q ^^38 QHPE XM QH,K˃eA 8$7AP>B0(wŗ (Ɉ(#`h# Ї`]`|EGaqJ!źˋy{{! v)(c]&0 ~@?̀38a CbH( j a?`?_gIWDp`# AHg 0b}" qà/ 9l E㈆c1@ E_i𧬎?58?v؟κ"QHNp$ 9 V 7QcsaR 9iiIqt 2Nx @`,^Q( p9ÑdǛaN>^{`xyAQH7?474?>OT *')@FV,7V#ItBP4R_#w^0?ʷI7d+K! O7n ApJB C-a&Y{"۫CW(Xcc4>0GG_ 0_|_>9?*|~`w]u# kĥ45&.% -oCx'W[%b 3/'ſ 8z|׿G9RLOB׆(y. /E&XuGHa>fjyC+M= gvCg ܬň09"D8FVP~@q) t}~Rb boHL`l%|~kд:ibKQ7l*}-jyàJ䌰E疗PQ*(W|r5a\RI*ZBZa+Y.^*h%9Y-;>G_MVmrQ6Y( %u EQӴ9aOT(%,wF{If"02kGY8H1̣,#mFP6yO=. z{ZDGYp;?->'@qa8bWb~rm c+7zR\[Z9upx}mS~&+n9K)HzZ=d"ݣ0O #fzUv؍e u jƞʾ丮VHhTM ,=H$d3~2pǧ: #ۗb(DjHnwh2~һHZV[9u}X=K5L0Pi !X~Pdܦe/J*<'`Y=͓I^f5X?*Ke88\>1RբMp;fac}\׺sƾ} }sL!Bqz} *u+uUsٳ$`wRnN:I R?Mbw^{) zNNSJPyd UӚk)#!|ږ-z])ᘔ\ϼl1H:٥rdEf5m&/ .S .i&y5)s~Aj#7\~c;;-qÞnlmk`b[q%Nk_z㜳71 M,[>iP 3@jR7uv<z/{N6gy4c1,UqR!R+ \ZP0DU%fdLLCsy ls?Aw}Q­G Ac}6畅UU?Ofx2mVӸ[AHmK$IJ>_wYyW!>a2R't,yWÒu_uW73yS  we[s`4njU)#̝O駖}7$X!2}a,dR%i fRpʼZSD/5-EԄ~d 9{۰^kvǭ0>46 gn] tN'۬א̕zr>%%e$v჌"qQg}/'iDmp=Li7roG0jL#\]Sy$_ uˤ~:QS *N5 Dd𔐸ȴ.9rAlH(=0H>ߜ0f#P7tmV5xnokb4,(kk}~(]{^r8¾0^7o|Yj/CeG{묫䓄c][r{ZrX,ݲ+hNgޱeX _H, Sn4F-T̬eC^ [fa;s+?SA H R2lD;W.- tU \{cnB셮c>"[\9a?KQg޻̻Ǐ>!&b~MDM11-V4K :;&`: 2UErhf 1yJ]m U( _rHJzWyeF2%ME,Z_~ZTp?F*s2U듢os|bV飭* \ݥbzPza ގX7e$UIPfY2Ao>̷"yZP^0~^lǪ_`ig.ֶciF:aiF%B#\`>^exYgCZ-|d$A{gdwέ4yąz_ǩef.4> Q\O+ ]3aJJ-/;;껛A.}d}>j҈\ [~'2tH%n^ޙ}6M>}'bҵUBtfU>alo|0eɝ$bN./~rKKXN/sAͿm˲hk׫|ˇHnϳO;im]+aԮjLK`/Mp#-)2GהdH*8[L:go]TgU@^[X@ʩ 'Z[ƇXMԯ;ղ;fiL¾}˼?fv& Hۧ>MAӪtwV|ߦuX}4<6ݡiW'Ρ}'2٪ɯMrrW^_qGC;9! ?LGV+/=„I2 P wȇIv[YW~j.J .)O &!zÕEk#j}aicXssѩs*׶}O4x_;*#mӉ:S8sSC*v$voy.e3w (_C̷gy3W.,c{Y!I'|lђ1'@o54 `zOF61ߖ%:!#&Xi`V 1JY4ǩP3˥yģ9kHn7$g5N;9U,\ltd+lQ6E&BZ<^yfT%rxDǛ]yֽhlyH@S_9"9,eQ$|DrAoڂ9 G;7rղ8.0; x 8mrhI[fer"NRVʛa)aӫC7 eT!v7?tmZp 2$|xSGtt]5,iTEl/MŽw5 9؉x.i_KW77£,j~`\EoL 1M _ ^)Z:7ԎJmҽ$ 픟ZJ9e$ ,qִJI(t P2C%H /M\ez'$,zJ$7L7nPsG`AQ}#C r?v9GYb:VQU޳u.D ޷+Z^Ϸ:Oքئ63*_S&[hvh%oakџQ- m*ؘs9^[7bmSʳߝwd+؀)cMIIOzʱ&5lz5uH}mi1_+τަoϤf{҂ޑzcn>:lB㠵Kknk #>J>|~#@ x93l0N RR8YɌra)MBIrFvmvɼ"o͔4s?pZ1=:_ʢ'10iqo9|sllLxT*գs&P8ԡV endstream endobj 239 0 obj << /Length1 1442 /Length2 6546 /Length3 0 /Length 7527 /Filter /FlateDecode >> stream xڍwT6-Ni!%!tlFl QB閐A$?y9{vζu36&=C^(D`xJ:@a>! Ph8!P00)1X?$ I K $vD`w8D"`h `  JJ*8Ppca؊ 0^J)cH{xx|H,0; E Ì4H[b'8@c#P -48 ? @.`a;|O r;x;: TU.4"4[VA@0 ՟2`݋dH_[8jͅwui(傅`$ yB7r6 |\.@[, 0 ߆@(ca3v('$՞ PoVXyA'/?)*"=>@^IQQ(P\\4\z`_ ' {ypK "Z9#}KQM{~t+Kݐo3oa;ÝrJ ] $v9j :0(0v=vX hU' @Q`k80=$뉃/v ا ;&v]WABmBX aU#]S(󷾁|$r"Q_cXp#v ql=~ a1'l30W7~jBa+OL"!ҡ5M'U >}YlJ4ŰO׾6Z~{ Mo8|tҗ{dӲ=+h>UG{Iq7tvOZ"~1t"LCxb%j! ,8ŔʀSncĺ7O=s30ċ+6ҝz-gt juVSQyk2e$Q?ҬG+)$2ӽrgww΀$1`kqOTU@-cP?9AM9mu:ox>[;Od{ȈIs? 6x6;4+A#yYJJ?gFV$" 30W撳34~Oʹ:T>{xYWJj-| 'by'cg%@Obh!HS0@/rTX֞ԳۇB swS[7R/3[r妈^ԄIka!7@HЧ{(ۮ!2 S'_Œ}x7Y$ijn6+C%S(!;IQ~(khz6QFݞh`DnY-~rñw/=b|}:[_q}!DxK&<~t:OE1m*g2b')EwĞƹ"5C vf~+R `~|GU{r(9bL#P%]s+yzwf; pӘѪ6AnAeٵOnqx]k;u.tE/"LK~$>.vG(L?I7t1C$sxV4G1s@MANȹRDg 8=$IO ˱z> fC7Ieh&Q˄1@E@=궃(%I1E{jB Q.牌e\ڲH`/(l|XGԲ{JWK՛Ym4Q[D^-v Ddn޾eeYG軝<+yJCQ6hեt5THldd,o?( lX<:/4Cݰr;ų̂I&ۋJq:@ٽ&|WV'ِ¢b x퉨obæC)λr3ԀP$ Cɟu5 |u-o,/1VVuaOQ0 [~%tSԓ#婊sj=}{43AwT$ER\'/U>(k?f@3:wKivq%-up^0!"l2NihzzDhIp0-m_8jVx1 2Dԗ0̊Q(w{*F ,\N~";"tsvR#rol 3趈Ms}T2dg,p:#[$-;<\^#1r| H NߎU䛡Le*ؖ$"UETriJ[:U;48FMy [yyGxv_[3F~\"t׻.'zυFHe"ǬZH}zTFU|d_#ږ 5"UcԹs1M #dF*D흅%tFꠥՏvh{޼PLݨFCēý)f -/8 \x8BO!'VM>oeVI}ڭ2,r ۜΫ xgPt^2h@s!LM2;VB#?tz݋;JQ͠ϰph1yΤ EmGt殲/<g~Ȫ,G, ЖF76yE?!CƈS$?KY7o1̗]v8;ҬVr>Xm)xI8]+l"^~a#&1ժ: HrϬpHyڭ/O}aȑO6mGնQعѸ)@;+8GdU-O3/X+|[ьXF{U!.×#E Pe .JL>z+qVci3'vͽSB>fL17i/gGn6VZA'w먲nʦO.ːy5ev14\LtjFz-EÇJuqʟ_w˽}VXҝq T8E}|[g8>$>ח4|A32wIE7o׀6 j%`M+9a Gݩn9\_jh1vT'Ws%$)u. 86WϩZM OIfmER9C(u^}~^3QYBXUa"~}~O"rs,O<|R)MuY9!a=M%:Ivb5*8buVԁR ͤ%HA8L֥yOid;VmnV/'Y|A/p,Rݓ`iIʖ%>I"zPuἐ˘78U+V*N>gguuD[' 6kJZ'pCUJ"& g)'9bNʞ%l}ôv r.cJg&\H:ta ?^JP%]* kܧ@AnG|nmc<9cʽ4%YM2󀐩̺AYAJDe€>z+엾{խzZʙne/js2Axe6U?1 C~4￷$KK̓ΗTadoj[C7Dːlȸ@G w`͌~mgm'4q蘻ZP95YEXi荂T2>g{s-]2nBnM(|iZu 畛Tn3G>7hEv'Ik/XJcuJ?B#z9qdzT˺)G>rϹno}_ڻE*( O"<ؤ7_WvQߤ TCKs4{ϵ;8t7t6nks&.<P|zp/bEkz]%6uݓ ePlד))\Egi)x-_TdRMfNzOINCUGյi-Jwe-vx3/cUj\:ybFB+8@ Uվ_T"|l !mIsGJwOrWH9tOQ ,wh_mͮX%$]UgZ%\]Y"> SnQ\+])8\g$Y{t7ك /|-\nL8T. $nSdKt:fVRz1V|Z)L}f'OgۂGG8t{g;#Pæɾ__Bq.TWx +ǻmr7pOisg6mmRrqmcy5nygy\c]>.,?Kw>g u_<}^pEdtm E6Fg|E+ʫǡ @rWԚ7{"Vh4# I MyӜs_u'tgKAE܆oe}|q3q: h+.Z*uEaw M"T]/.#{X*ݳ0!}G۩kRFOYG>b&ZJ_p myL\C5_ji86e3N#k-VOuDtÅonc􍒍Y6J>RI{9~%I 0q=]Qbs֑c?DiƗ@~3H"xIhO:Q>`bIliT endstream endobj 241 0 obj << /Length1 1848 /Length2 13187 /Length3 0 /Length 14341 /Filter /FlateDecode >> stream xڍP\ nKph$H#s"S`A`&6fV~+JlJbr3&4*v67??++? g~@ r QI=moy50:ۘ:L@v ?!h`G~wwwfS{f0#l P݀?Z(n imBd v7uv6@7W 3-;@CNtX/F17qdhi`T`Fv.7S7S;S7?K7HL:?sgG =mR {{$mosdpm@A6aȢ` M pN5 4=*rX y`gW6`ob_m<X`'7Y<1Y$4uT%nJqq `cc=oN?)U5Esjmziof6t͠ z3@ XX߾?/.GWߊ]e7ϮPm5J@ W툘ϙ8Y9۸Hx-Tmq? rybe?3}[\ގOm79d:;z"1 qv', G_%鏃zc7E`Xx8,7K"^v?_fizi_@vo䏉X Xo,2Y h/֩Ϳ[2Jo2_fvKV?!:jq|_rAR|O?0wuv~;7yQ@sy@ڐj1BwqvNԁ+)|= KE_QXGůM8F>Q8Kmfی>XBG.:;M8,pNpet:ߝ8^y[a} Oj<: *],RFlfCBt8X>r)#V*!UơnI Nڠ@Z3Q  L ًh9uﲃ)_6Ųɨ Mv#K Kx#^l<@Ḩyo5(n䎦LExV{-Qo|ꤒIL9`\)˙mpא:AOx^O5m^ӓ2tR^CjF-"|'rCE˓?ՍpnDkt֖չ]S&]ԑSת|FM#^R9XG`(+.u͇,7Ūu˫mIRwݹ[C1$T olu1lUdN`,i!CVi*T.@cL-{@ '{,|V}Z9]7z.G0/Kֺ/Z<\P~J^{ȝ[I Dp+* 8){bwg=|J[ۓ{j悟7+"XOM%+v7cNΗPXot3 Z P-m8N{R3Pr͡0'ߞĘ,|(X$RsnsBZhJxBGϓ:b3My9mUf/0}fP1j#aB6=EbNu0㐃6TÔ_uIe>uy6zX IkC6V5Eva*DdFQ*sE]#wWפ"9.90Uʀzpޣ2od?}N2`EɤaecI^}xtk~+B5=Sxf>fHIsҶ 9b>|) oO/jbW,S6)-iy\1"M1 n8a7_ QpyFwV.8a/q:>.n0-62ɢJ<㙍!LfY)i"> H> f^WG$9)Zg|HiʃKDd^nɼ Hkӑ`ʈ͋j # QkIMkg;'YxH(kNe1 2@U>EʇV‘4.RP. "Dˣ$tG8`?w EiNw"AzgЫ@c SHBfah`Xh |0̗.뚹P3Ѵ̢gOcE~ߠ:=K/Y,W3k i_o`UZŸJ)ɐ9dsǓڟb78!H1I$+4;JV\4 sa?X魌*}RObў۪DXax[®;? Z%v.zgM\eԁ$1FϯԲ-aލ2Xk RkZ)-6>\{x> ׬^2-Tb\:WQ%-~HS2f9KÐ$ʦ.יi`*gک.M81l06ae/L&VBktH R2at9W iB+nҸz4I= _ӬKŝ Gm3$w͉ymN쎫z}|01PJXVhRiU ngjf $6>g0͸ybsAG$IRc)hDIw}\I-%n±dT8'FvQӉN!:y洩O Ӟl44{{ŇXJ`~@}iCDy`:"i6k >֪np 1~ĎFL-pK Ƹ,Xl]=5v0b}mK^'אZz^:BB#v *QWF^QѰ Ȓ!t]'WlOOD%i2P[FaQc `SNt+G򹍢SI; !$mN~2.n$SlTY/ojAd7v'y&h2RjLa~;Yh} ~c274Zy:-ck>~u❟Sr;`MBzr+ǓOHt6rV]#""GcXHTJbFvsD$O^vc*:ajj/"9xj4v-S<5x(m2O@!KE1&#*H䦩`U-k4S5G+񐓡#b_XAe~;kPZΊf fp{m,~Iu׏MC/-mٵνɜ %n g:D&쒌Q AUyjioܕެItt=lrE&=*=yN-^W r ' ;d{?Q i-+UkG?=>}ڏ ὏zðgY>ߨ 6#˅vZat%i9/}+13^qm ~JjUUv WTq`vZN./[L@<8_/މ帨4)͇ueWT"z(W1ĎC4 mWSB=aTeD2O^T1NWJE={8q\ =2qtM)b]OTwۣ ?ф[1J;\zZ? (yjòQӑ̽Ý2tM۸Gx|K'?DZC0@hjMNyg۝pvuGޔkM%o$qBAW+b%3c?*3_A^ 𤕨 NT M Cu0hOUC(7ՌhNbC= PG⥮]۞`I/CE1"=SU,v֨3`E긋]>:2qʺ[m"JzY{"=lb~ Z[?w,AjlMm(շɥ:Qgtzilݪ&7Oϧ#`IK-\/:jaZLܕ9$%Ih[v3ޔya|ZQ*$4;`5 I5$>Z k0Xim;_N$G)ʐŹO>6,y|6 +W _T/>Ϳ{ًvN%m~a L9a|P+Ck~<:vn7CVs3AqWXfn2a8o:<҉nݯpV^h L?+S,- A3׵`2f,sΧR̕OtfV~ ֖@  )L*Q=?c "+] T.Fnsv䲰~r3zW scsS޿x O$OjI:Uiݯ0#gic=")Ȑ+c!ID6#n9rPlPUb:IհH dotsR=ӧ YbAcˏ.ҨFpDa4nM*q2Y5h:TGSz= :l{9,z`юlf>{w^52Kj/; Dqyq_o>l@9ᩄl*~cdky.a}+#쬤wr ~ 7La4ٙCeeIly($OPUXb܉ JքR2foZ v\qYԝmA)ٙx /f>&ODiC.{2˳;^8msg\S s#Q7??*\t$~|ΡKQE*,mȀۤA&|跉p8Hx`NmJE$+.`ߓ m3AW^6MqͻzcrU&jK*oғXƛ}p xo–Q3Ihi?5Nq}|Lc +`Z Us; G,8[>MrsN,"-mAt\]^gS %X(D`|rL+i:.#>}`N'fm,W\wt\l>y 35N苊u30r]e\ lr\fbƦ߾ݻ'u*{\,8hg0C#;vZ;+,>>pk '˾[8 /䧏(&&R[!a !m^ϷawA$E'm5k3a\O-T, 3E  rIffQ4D餸fe4urKZ}&5 \ŝb* C'L5G`#X4W!uC5b[ Ow7dQ]J7^t3gwaGSGEC#cFK>*ioIbIY'6, b yμ\k:=B_J5OV3kOd,x;~YZ?Nz Houu=tjq'$P=J)8RgՖm90XT6Tabu4y1<.JcәtRjL؛N11;3F\߬d醴C>E_눛g\ lq 5dۤHtZғ2Z$ZL(ƊI\$q,l|2eI1߀a6үh?VAN)*DaꇒL5٫ψ s˗NV'բz搜(?W6eq&L)?L RX@e'^ZSqUk xP{5#ޏpr|d*8 !B}ݨq_IF̠[Q"Ȑ<00&r}Bgk ^nnDCY KpUml扥hGgWLTz@uv<$$QJ= ݶ=p=?Y-hZG2 I.R4q݄'Tsg3L ~YcLDQUE!X^S]aO`o"a+Ne| F^̾TF9WܠWmDe%F֕qI9%vX>;}gdk "ei D4ʗ0u_4'riF( OMFWZdCA;]ETz MM]lJvm ")vO6zrddAi!+A!.R sDf/aKiʯ9Mɝ@[iND뙘 _=Y\ZSŲ`z߲&ve08ؽez]Sv+4~ wP^eeT~d53}"/}GqG;f6lTtP3,QYZ\레ļJ5dXv3o|x.t?ߋ Dg<ǨMj3"Z;Ble"p\ڄS=ؒ,9ѱ6ĕ(,cIy'xØ)ffKڑeBNs9 temw I+!fBZ@:4੊(~_ſo95^tr fYˑ\p굠T/iҏ@l6+u겴ʛb Q5pBmn@\kS]ܲ: 'WQP)5'Lwo _<NmL_͜ ;E#Sy^/q1˚8O+$W,&B7zE[`[ޣ|lÔ^ph'fR^נ;{ 2 ~c@ea{^6NĸR!bUUn^ЯR"WTUӹhkUd>O:6X,ކmGZ*-O(/>_V9L򡑝H0@Q?h]]wIѳaa\45Ddz-Inh6%7MEvQkXR:-jǣHbm Q卛ɋq:Yǐ9Ʒi\1,|i7f(U*@^va-(l zϖ*>qg-iv%4ǧمrV‚"5y<{D[;B+wtW`,C ԜC؆F+,ܪ<*י_Mq;En[Wm2.5@0Re4q JJTmxhf -^è%az,}B0+L!$u((14v:;VLDO`B]?@-dD^nE"lحP' {`%VʧH׮'#|YSb0sg6vHf p!&w7@$ġڗnӳ1com/,W^5Evn%\Ή_Ӯ` -5Q Tagoݦbܸ]5/!F%Zd0P:9B6Dh)y-(5&n{߭qU\0o$\ bpOjdbiR7L!RFv0eRBжf_?min C(s\AJ/nrr b9ҡS+1-G5:3Nɞ]7SXwϺe{YqTl=d]ސtZyhRb"ERtak1tfw7()4x5SijR<_=|>^8iչM$chiyW4Ow]=֖Ce][sW7rżcTq'2*9jv E6SJxn2r‹|909;=sH$~m0epO8l("^`?/ylb<jΚ/sfh唳Q_U*T4B~voboPdvy2/#s^ȷ#qZ}ZUPx`ƔMY,th@-zXcrBꏙ䕥 R6l 6iyJX.:v\oK%&V0"-6ț&3m?ăTLKDKgE&p&IPBa{6O?(@8~U @q,\|_Br2X(|5+|ٮ,|-J*nյ$A_HT=CNXu:,կf뷆,AZ;MG4->~lϑ{MeU:&[h>NHLUPrLHLzC3ķN^rOT?;c,Utϓe2uѓ-vV%6IxbI0=ZG,i\KKGu'SIc`goĻHd kG g! \9] awcp9N^T7>^!N|w(0M3n:|ʼ(j9ĝv2RrǕh+QGْ"sx;0EWpK1{K+9EeR~ׇ4=xa/9RX:KN ++U I %qH}H\rrnD*iHu +BڲjnWl"{ ֏[mJڥ'. ."-62gu(n`<ۻO[)p-f1BغE2Iuʇiĺ9 Mv N Kf؆/a˕{м`1Hpȇ%Lβ7 "o\HLt-l՝$VcP-Mi9JntMMkDXdm󻿟1~ kW+a @"ڠo!vzNVef!kN^HPeS - ڐ"K^o1 {f鵋01;QpZL_sh'Kie,!P|Z~rY+Y†}Y4pa0VH.%E,dss}W8uIi;c[2-}W{9?K|N1JOP'L y'$q?[|B Eќi!e-}oг9^T(ߓ%Sǐg6+@1FZNWysA# +sd יִ@U]>gՂ w xmދ ,t%k< k+JҤKFC+^SGlczh--4#"z}%|o'2Y+ w.O<؎BbQ&R hP?eŤfh7l.a|wvȂܱNgxT 3~Io|c9rER+8Kd-N?Hv[K󾰢Z3qj@ gHu;6m5\/V4i d$ 8$8 DhL1*'+ si n8t<ŕ?{WWDφ~(+?.DZ{4A\SCd֚Yk5eɕ<}1iajx#^ Do'5&N/dY+%5,xm@Ҷ^T0ks=- VC\rC xzDz;AՂ@+zj"7`Aq$b$Ђ>~۴H e \4 ˄˝/ƕg{51 ?kh)Wg:CS}v]Ӌ63nu%!3!Z3mFMY]A9dԤ7|}ֿhC{r4+q?OyJB7RJ>=&K,(ۜ~ ;4w`|(υ4sPWyo^Ę,KJf877%7rQ7_w|F)R7[sSQJ>k {7ID#Y"԰vL gkMONQ+M:}lK W"O^`03o}3ډQNnZKo+P; 1#Xa=\q9hA8v"zbJ9:+ Y!&DlԘufFwuNq~b(i]'JucGKlo]m%&X&*8~*x!O=i@P]|GXTl· jd2j{lXbaXSjsbI з к5VՅl󱯈3 *D#1=Əl^-yR8\b)\mqn ;Vd#"2G_F7K6M׷` 톫ڌQl7Q6&p58Hٽl[1ir@[Gx=z(Mл Hud~'ոi*mn.t,nlٸiENA0qACIq k ދM_\x{ܺJnNI0Z$O5U86|y\̕"J϶ՠ,@a*;z Mb > stream xڌP %X5%ww ܝ̝;꽢 zm_}MFB'dbgucgȩ21YaT-Ò,lq:D l.&;77##뿆vQCW =@K&bghafT&..ڿB6@G cC[9=5@?!(y͝ mhneh2@5zX2*vn@hbktgH쁶1- _,lv64675ZX δC[ ] - . .0|g?'cG {g'z' 82b&"v66@[g'ؿp݃õs/251= PJwo : %PdK`Nca |d 8;}T/ebX;fha|?&_?~}0;[k1?U ۹Xt,,6;;*ZSlM\޻pg.(Y*f{f bdc4~yv7E[z m,=xf͐{k:M,\lV}Clͬm;D1G*9Yu}匭[|ߨ(fklg1  =`狙 &@G@okxg0sH B b"Fo` ;A70F=¿=oS7b0Fj=ƿK3t2xﱵ _9+_cp^9guf ?\,{+El﹍YA}@L,L쬭 x7KZ6x'n|wL=́X,5Xߛo|';7{ o{ l~w*L.6F6fT~2=o{H΄`t|0e[fa=v ü7hbGޥ;X3;Y:awW'#7.޻{{s8w./݁ưˋv,^ڛ1 kN8873^)XK^%EQ|K9T c]D':RX֎\> }vU !.aӘK|Qh)pHc" -ᵷ qFIݔ税mf5їPt9(=nRZ>˩c9=wob.HhMd#7h>Ts|C3"b$\;S :iH8D 1=6#`qLDPIL1\]~Y M/_١-ͩx7lZ +;ub:cyRp wQ?RLu*0GF/{̔eJu'xUZߐb+ nʶuukH>khu  Չ;$Gmm[!kVy1Y[$l\݋;tkviYӪJE?^EwE7bf,==b4/VXɲ[%XÊ\"hrb#q?! we!}%N\fH! *Ъܓ"b=OZ\(EfmO]}倖ؒK9aWvqRE[*<{oѬƠ .:nZR2rv;tgGFSVF5d _GemR/パ D3ù.JbJfKEbA=68#ϛUdfM\u6Zr|KFF Sev:-~X{ʔ,60ۼEaN:q=e" h,(0j&3}|V.O5? =f›7ϯ#(چč}l-;-@-Ĺ1G?ߏJfExqnjD0]/]=L=(z*15;&⵸ T *]Ct+USfRp]n3OMv܉W /EşAjBZ~H AUO 3a[*PS_\iIm Kf"^NY9LPB텋ZdF`HՑ`Bw1-x(ȫD<c¸j~HR0U6x>9dqEc?ʌHerM#> .Jئ<-܁W 2 M=Lh 7i}wZOe%nUjr\P?ѥf܈S;GUg@*EF5t}-  J!(v{ 6zUUcm%Á?|H3@]]O]ZP؇m RAk1ݖuT0+?$F2Vwi"Vjp5r4ڋt1n/ y50NDNzGDgnH|7qͤXF#\; z&“ʔ:t'DY3Z r/p0'rhB$~ĦxQWb~_p%̲~G! T †Ȧ)DXmarߘ6HI1}5x7,w-9_H;Yk5 R]Z|UVK Fѱ FĮu*8'@Q) v?E],o#ʠ]mRIى;F¹SKޫ?$r>InA3mTjNB1 pobl"c:mb %Etu<3r > sGcxpK`c vO8A, ;v! JAĮ#0@^`jPVc/qCF`v%+NKUZgZH&SrlgGM;t]cVzӮx%L:fnU54W8K&L-xu9H=ZdL*H)>7dԑe&N_03E@=3$>O~m#MPA#vt<)w 5Yi`_\6 T/+%0@9K1m[Цk:arf}1K's. )آ5jKX|Mvi6 D^5r2%OҪS+Ǫ=h DžiRHM2 -LΆn(iY&L4a4LqDVS\džopf֟RٴeUv/t C-H:m<ݬb 1\nE[㭹Mzɏ\fAt""B]tjFyF6CѴI{A!8իX9NXdЮrPiKۖ\R ٢֐>%F<%0衭6Sy."(6B̄  2XUr<O +&OZfb$.k2PܔLC69 NQ]>It9 'p ?X{X:+g PfaƐޞ_#?s28,pi&r_Nb%-0F9w'v8Nhe{ X yR!,Aq0zMC`2H!bXpE#jU냩j6[>f9o[>zYOĔL%QrcT_^H4VkBMo-=r$훋@1866K~M8u _ڷF,.ҩ`Gc~e4 O;~n/e'NZqpCx v|m],7o\x'>ճ,:H|ߒD.`AҚ9 l9bF5q9K3aj4;~dc%ba4S XۻTdXg"b x7K|T9[(S|KV hVq!7tb#.\eЍ!J9~< UR`I`L"d|p>J9Ckn`XD)f:y|{́c$쟛PVs^}̀pjXCWC| A(Y(m۸QQ֨q*UJǖ kUx0)0WX  Fm2K9;1ų$^0C f?D6f\ LE'*RM*N(#RQ 󮗨|V֤ޕwnj`Afv$]=/3ρa%CR6rujCs ^ C#vEDW%0;f:eNTz??1ְ&ˡHb.$I0dJsKłb6ۅQ@iJ*1V5lMB|\ҍ*]3شΚ慀8k"69"mjDLY<-a<=T1!3xɣJ~o ]CG Zpp-}i}MyC4Nx"˩!..YL"9TC/#;L= \3KhxN|rR=PE;EO?t-U͆#u7-C𪾾&TPs!ɅAӈqFF̕n%cLiN/J6-i?jێdF) k=atHr_W+!s)-XLaYDDxG]y}1C 氇#n}dl]| Yo6:*!u-c:oY1yY˛z|ڲ9x7r2ԄW69&̻A^^dϺSB/3bۻffYN(EqZsL;j޿(N"'S%NvJkA> TK-^N \Z[!> 7]ij8pjHkS+l0ۑlVmo"DϓX3˛^G5;Qن{ԋF)dAyCSe"wg_@h?:r[+s؞Qv %itD,v7(*xK#Q0#$q}׏vT=,y}Y>B@3w4D&٦lXCV~nD]ͮ Ia,ka%\DO8x4 v,3uA)IGC`fޣ5E = [5va%nG={!=2=]^MeH<F+#pmumlnf>g3;!~UI \{]fp7Ƿs{iTŀ~9)nSvO4v )53G(pHRIN#?dZAcNo)TYm+z_1[e CZ-E:kqp=rhvِA2~}S(V0Cy࿯HsejXY#ϔ Cl4rTk=tǽG?]+IBz4G$Y/oܲGv> X,5sw'"3Z30%h`&wDo<$As|bd(/cXow؂]TX7cR7T4 1xӟXM>,XC=jX 0ٰ7P¡:Bxʶ x:Xe vaΜ=iL=% po#cmK&q*4LSɧQoNte)õA4WVG:I/;2(ZLP+$t*slq+ʾlp̚n}d7h@AcehdRǏ/ 1NJHųj]Q]$dQ1mq8keXʧrW2EG_7%#/0wɹQ/"#~Y]ijm3'fl-\R`~/&-Ǩ&zggu&7\-6bAW4=;JavUs!Sg՗H2Zܖ@ ˳!f\e0 ^Rq'b%SZ*Md t(e]Dy@:(j-܂dLK^&,x;&ɳOoK_,De, #pL͛7 gUZöMr([}b#9R惐b]/,אDdmMs$MIuټ waYb\hZ::jj:ho&WR9==~+}l&AUJ,WSs#*1!eM dJ$Lo`kB+1$#xy zS (QJVdW^k&mnMJP'V]60ױ+sioH.-8ں|heɾ]>ޣBq+~P5.7x#1hAKM5 -FvG6X 3D۴˜d*d6L5͸XNXqx%{8|:lOGӸd.ni @!ƭtNX"HYr dHe*N/T&CR2:T*SB(PP*I"ҭHIY03MU'2)~kǫ_)ZDV-Kj^ l& 7j[7Iōō8=Ȥa /(+im3,:)q{pXpL. N4x޵sB̨'CF$H/A$AVEbY ;Wm)r7˩al%)7d݄UĩW٩xJıyA8'T[9_)i+qU^u- }(5L*xSVFG}>[Ac}.;ysBkNs,Fh6ba M a15 ȔIi=9qDe_|k yR]> `k\ CT̅suץ%ջjyd(K$XͶfK,ezJx7mAup!/48CLnK5МwG-((y(pw%b}m˓"ȓ!:%:' E.BТ j3HXUN` [Z47gvb>0ەt EZss55}]Oė8|SeBb'o(VDjdĂ^3GuILᓼ{L~\WS\U&kYY >.vԈLix>.|Y>FjOkD]b@g\P^ד[L8u˞~]z1ș'ml=mG4,kIޘ&_8q`5] bI>;趮8oߐ"yXP9U4%2︒aAAENy$nZ.PuA[w{qKۃwɵ7zGQY րw5Fֳ6\'q Ϣؽmc~+ɛ4%wϕ )5?pb6-JOJaWGQzU>ԙ-U M/Jomc|*V2|!@CJXSjJZ BU"T?фUj2Uhk]Ժ~ ܂cI;StQ3"}ѓp@E%_/7`48+ ej*5-[ko2LjlSAٙz؅CU[M_f]<#6V:P{*&\ui HD 4{L~+Уu@yɹ®oC2d)#2i %vr$33UE=>ߓ Axn>DyT{:N=h>C?r.둡{?>1hBRM`]-yЮѦdl_jێBGQ0b&3χkEGӅR1ϘIC״Rl::M{0{a&z5vhWqP/ a]Yȩd_qdOf\ʝ2mBP# lݡ/wTPV4eٟm|\8 $Y[Kˣ"#ٰ^Q"[ˀi,ٶ*%1`4#Q*^_?'&(7*?#vlR}qxdv>W垕'ֲ=WUT9l%lhYVwZTcnBUyۭCSpQkWy,4OT?\a!.@P13t-p&_R1_q3Pdp-&L(̡X_YѷNﴝIոT1ۺnf)MiWqAF}㦋QK ua{СGFb_PVypcmCê wo/~̕PUbJvɣMkgÁg3h-i&s=3 0Nޱ/dD̿ =O:eG#uFwbST;˞Zቻ2%Jy²cE|K1Na<۬J V;Џ؞VFhD_yni5Y`b<:[$u~B& nx \g;s!zrtaZ*8T?%Bf%{2\6"6,$Nhɑ6>Hޚmwr/#xgQ.Mj 4t% #`. Cc5ù]DT]405oh;~Lb ^G@tm_)EŒWNW0]o&QuUHHYX};Y2U'TO~k, b8 zxuկZב-_7A3V1R}^<45b#Ԯa~N8?1O [㼸l&/br[f2j㞸ۿNԐ ,8p]YD%L1Lg͍="; KCf5,Ֆ!˕S--d?}W j،~2T y}*])&!٘>G4)C 2!߇K>v Tb-IkJIhq^DBon6|s 52X.O%ZQ}4O82u:TbPGakruU'tUG/*PԚlAeυ\3h|=ߋSQzK {8A際DC8b`=}Gre `/J?[NGj [/>|k q "H} fzВU( )gἡzmjm] HcB.GEVσrߔvm~nR-A\_~9o85#!SY0 k @ӿ09uc=_WKʼ_4L YJw㭩\HVEu ' {L=Al,@fɲ1Y!Le/|,6$&/'+7Zys>*OO0C? WB TcM2F4 _;@7ŷU_Z١a%DCҷ%qׇ3GҾyA}NEϕ[! MZ" GjS3hJr[Srbxn9M)6B9C0Y95/:Ţhahb" yYRN9~Z# N Neb"KquSR~7Bc%%P'%3kur39l3Y֖XbX)O?Е6uMoLhLj&svtgvp=oBKW 7yBgB_ Ԑ'Yx>säZB_eCRkQL[,5SA(If-!X2%4NONiαRֽmFqQ<1y}smiU e\ÃlƷo͘k8y7snI044P\ V_eޟq>474o>?Jęb차-4A(Vi6a"n/BݭiHLQ g<_oM3ǡe g'#,p63Aao@ 'O"bU?z:ǣlLHۆ h_#^T|gTrgUh7`t'Ӳ6_ ß?έ3*wU}1E`3\ZhmhF#OGV_!k ܝ~Xٌ)ݳ#2hG6:/Z%]ϙPx4ySgNsLI4U]o| iLp0{ʧгӕ5@hma*lgT A3x@{sGH5HUk+BI?ij/Pt'ؠqk;lLk >9i|9Axf7DV$cf.\ayLJ&Eue 4^{kXiDeE WZ~*ob>PqM _ZKun2{{p" A`{e?,%δpG'zL\<+0K+##-&z]NT]a'Wrɵmpu0[dz.%OBh'ieܓ+ejS(2ºAn}Coy{Ju:fu8jL+8l̳Z%%%OY&킋5@'/<`;S,(dIf+jT٦itt g756V9v#d-B2sdZ]w0r5IXK\TD9v?m%`15 67{.>YM-j͉5/ (:]mx&" 15DOis'M% [Y\JatN `-ݫ>_ª;ާHj^OR5l}QьXL\c, jN(`ja[͵[QS~@$*ő+ do:Ƌ c0\2pBMq9lzTb6QXZa@V?̀;:"OqPYԴbM6/:cۓS߁8QP% cFܠ)Sdxdv/<y7JYjosqˍP~bKFnW2_&t&MoEF.(ˆvadJuZi% i6O\H(34\Xĭ<#ƷY%)YG 8h5 .SQPye^>i*SJfw.>^;IIVah4܈K`kiQou0 !\,嬈ogq~ c^b2_B,.&uWih4?3w 'CgJ ` v?GoZKYEx&y>^❹yxr}&k"?lĐX߂iTr[ lWz@ڳmff})֔&na'3x]l(cKtSzxKs Aahc{(Ls>*ݾI?R;OD(JAU ԨBibНG8I&cegjlHQc!},@\HZɾ98 ycG2{7+n 3pf 6uAh2psͧ΋;几1Ҋ|||^m6ĒV5tބ~ endstream endobj 245 0 obj << /Length1 2383 /Length2 14333 /Length3 0 /Length 15742 /Filter /FlateDecode >> stream xڍP[ .à n- 2[p$;!5w;GޓsfݫQiJX́`G+'@J[A7[N ; +@hڤ 8e#@ pqp/"6sY `G+dm F ?˟  l:@O0h-@@(^@ NBlfl`kQFb]܁?T)cCe[A<\dttf9Z]JU'_J  9lfavp2s9Z@@0s# 7s7ٛC +0 [ C"4.8ZJW?-mbkv`GnNZ g7!Po5@O ?z9ti*q;"~ + ;qq_ Y@@k#ovh 0'㏿Ah;Kh1$`p~%GiU3]o>yG+0@/OKa0tߋoa?X$foOdwt K ^ "+-An+1^ Gkry-@ ?Cۃj`WO+'Aoi ՟. 2DG `b]..^^'zZ=k;#M@.h ./`W oڿE$Ef N.hP3 W|Mԛ}L4&'^Kdۮ@&w#Y[8ϯ|eSZ1A%3tyYDHVr&O˫iܜgJf4X"5Y/o\;i/qG&}$%+Ǭes0;vHZ_Qq1OTnC,a\.S'* jUGZ,9ۯvU%:-_7eY;S mV= %trihmf򧦰Elxa`^Tgˬ4]SRoۙ֎Z&Ω|fb0m>VmGx9K!dK/Zӂ7W E4F?0S4RJ _~ޥ~)"Im9{i@pUuI;ZisIsA8ime%Zn5C^X_Y"ve C_#T>OX4 ĺКvlWeݹ\]-t~<ߖ7OIȯ ϏK}cf sjk/JV DikKwȚFRXN]ɳ^g)p|g"R`j-dzm&mC BG"s|O[ k ;"tdZnnS{\qN1#XB_dv#^/ˈ3M*L{8B.@zW󅭢kpcIOsܵ阆:WsD6Ʒ~zbukY "wjO#hC9/{4O#&(vUHũwe A},h2$[yxyZhV>rK|ƫȑap>A.'QVn#^ +}D&6 חW _ERhܗZVaRkwk y<^7 mv^~lݛ3kiRK~.nm[3:l#sCuWƶ h$֑q/"1?u$FDZaT5̧-z}U䍸gpOK8I4Xg/wCs agISqNǹpJnR>! N:5)7*cmCRWOOh! _1+^9ŧ5y<K ^c~}FN/2mJkHiKh%s ޳@)y!`yIX$^r;0WyR^ ڭFCu[o(O2"Pmwc3ޘTq;'07=l.YATPè988}_|2Ht`09_^ã@tEiL7_|fJm@*eH܈G<`kQB$Jp/;⛁6!bOؗ9Mboj[RvU+ tYj(RWS0ZAA#]zC{OT^/Vd2m+mҤ^ya=M3OL6Km'/qO)ܣR]~NfuyͺƁua}#Dm ҸBNs96% R 3EHuSGx!g`5uLH(6ӗ4G:cdÆ1/s®E6[oli]gM<[QEX% 43v5x{jkjȃSaPBЀ_7{+#8ɧ%k}?:7̐#d= Rֹ) XI! Lr2!OC:7ީn9t0EĉWrw@r'Z߾ tə i j0xsw.Q ;#F;a%V؞wx6 o`{J?ݚW>\G|:9!ˉz#U'(p"Wߴ ?X÷+QFPNE ߡWP~YZ< rYl R_?N7uw(饚v.Gib^wFap.+P] J[,FXO4µW32 MY&ߡn|5f@nҘiX/q<ʡ/v c͹Vki r/:@Ɛ̰ ]yVg؂yrkcGQ?j~jsFڷRB}UN @UTYd&W㕏8W a>q0]J/EMaf\izR= A9J_u0S, #'PQ/,J`|KzCZ>S $Չe6#'gզyXhr`dӮގ<,tjR0tb~HuOlO>''4 V/袬@- efLl=(h\ LU=6m OKoME*DSnpO!)vT*v.FCՃ`'fx.K|!5v{I&#Ð#;WgI*q{~`9H{[QsXسҏY8"ogXϟGޔ17`w^}$ȭG_B^"#sacd_{4iRMH!^3`_Is7HuΜU6yg҈-B#KM뙪M{5iĆ #鮊.%DJNţ啅eCM6վ676aH#Uwi4xw>LyJy YcQ8-]{zb$ bzk|#_:8\;_UWKPd&zUL{P 䶶ov]N ͼ-g'z~rڥP$Lf:{n72 ?8«_%MجuGoqZ܏Ovhe\QE׀fEG6 xӤ\O 4Wu 55- &3_P!BG7v,$b &^8]7~/ X/_os'L}<0ɞ.s,EjZ7|1u0=?ǿ+1_U/q˨Y]%!lUr+DŽ;0z>#[x,nHD{p#:"G%J~9RVFvJ^qqxN &9iwpl\QUB!@RN 5Z7t#],o󔑸ƥT9"I7pnAI&X>I B4g6Ρ2Lt/oƾyJoPPKn|mDD˘~X7M(I:'L̬_WY,WʼJg2 O䤦 8AybQ:oV/RS1mtzI˒u<4t5u^/rP@bf5>( =⭪#oNZw8d*ȹe[:ΊcUP';$=M09&bKa~Z9h/tKeg4@cvz~œ/.ͭ.9Ъ ^pUB6F[ڊU1ˏ{"I7U0eNy,e::YT;^mY4FYl^=Sa ^pEfs,E╍͖74"ֶЊFͳݟѡ;bAg۳QTe),C/C?UL%~&v~좉#hBաӳlI(^,Z_* Q:FK!֬X3Sc0.Ef?4PoB!]Vzm}hbƚe% u*zD.Aݯ0n,et&?W -q_j,=Y m{v~UOF)*'`})99zLIafg &ETmy"*'yD^^fWPgqAջpjK֌1 #Hj+٥bܨBY{bt%THxbʿM򃗙:qc(Hz:Ixg[bDX`raEoe`J=ةDžtΨRQ*69hq_tF%;-ij}-%oO³ֽ1FVFkR+ޓws*Am 2kR !:>m},fxIAnDaiscII0W؈*hSCJ4 j.\yy|!+δL2b4eBVq#/0tmVV0@]aAD7 ۤyp\'S +BS ܡAP0SJ5DxP@F!%ڃ;\IN7Fu$sdO;D&MqF1cqqqO10g3ÈڭB8SX:6@ <1y$m"Gu[T1*BW'< &6> x~> =9 @ F,-(GlN6Q]-3o,H*gmKYxcXm\TfgPJ_nG]ͩN:ȕBekb!Nw#v%7#3yhT _J7'+Wy;UP$)Z#ѵWbPJtHeP#o7Vn!XI۟Vʼe,J&Wvx;; ӝ% Ҷ^+qH󰦫LsG3b%'3H 3? }N:l<Ӌum41݉z +Re~.o'nNd/Џ]C7e~>׆7)Y~)q"ۢ&S免R K~xW*f5RzY൦aN/ [я3iRrOxDx^}C-njv#*[(uj6T)qr R0T !iߘ#;hVIb3h'T]U[-=?Ӷ&;9GSiF8ˉW&ʧݓ;CbѺz|Q;(X5x8IhN0jNF)[.*i)o܈_cu64yMDA.tgjSn>0# SjgkWgXsgaH<{li\_I-N-Yiq9*>HI2Lue+3Rk|QXzxF_&Q%M%Φw6FLAxYX6piZu#"*U_Ȅ&Jǟ(쇽hQa<kܧ3WD+=ěq£Pr.`̏gYX?#Sn?P:њ줔fM`2ÔɭdŒWŒ|28K=$޻gv@44!x;uGaL%**4YM2,A2ڷM ~G ]M/2CE/G*tuw ¨_ؾؿY:DcU<@/ [S9x޳FZ ^dh¸kiJJX4h0m9jٳwNG r6eiMD[\!.iT5ޟ&`n!A!}8G9ϐS/c l*$Q-fss~ZzMAN(u"/A(0ux@(r.@BHHiX;sք,ijsA`PWIe*.dz'/tΡio8g|xb]ylfcfJ@T=VɘǴڏHse?L eյ !WmɄH8H{ayrBZ9&I](#w}l-n9e;A_RA\!J:~>} tq6 j8ݷN/{hh64!:95ֻC0,95-#'>Y"E*j1lx!^Zjݭ+Bk?W>R{/%|dnC%ɂ.c*yօ,)r9+Gִ;E `3?T ͷx-#0xzo@QC~vf!~k^o d3wؠU6;QG%IƠJq諻^]UA$7&j,MT^vS(}Ru[I SFZ#u5(@/5vchRJ֤{Ƈh0=\y *mK9>K=\.H#_0Ku),cVUb{D0 waFMTDȮ6y @4 Sy'g`L>[Eui,2:^k--oUPGSh~~aw5Ds?~`He k2 ڹk# Y9;`ʞO9(;͉*_Vр"l2JvT'|.kI`JFd^މNǬU G'%H'}J3c^2vil8_I\ːԖ4msW2ܡ5Y&_˒Nτ!!l+8[O,-v?2jPJfړqet1?IesNʓX5-t!<\~_hm "Y`_!EA:lW`!g VbW"`WKo &c5դa8L*6Y!~|D`t S8ԏ 9I63ՔWtXP1v3@Vh|(OGR6AjnB:#PB52U—eLuS/_+Y< $)//5@^rɆ yc$']>_&⭃<>#@xf}zl]Ÿ}-I-FhgSO&N\e1e!#Ѣ˗du!>?ohUlǹ,0>kMcސPy,拐j3W>|H,T0!Wdl ۗ;y ?a1~FJĎ 2 sķuaJև6u6y+4Tw VsN$\~>IfE +ZQ`wa$Xx_m/rtUbԴurL_\W^~)"4}lUVA:S+w<0Nn^U tJMʮBKO :3K4`5 E'9:g<7i+bq1Y+" F Iv ;o;ʄEasj`fM]鏦p10ڟL|&n/gzZ&XQ<THk#c4JpfF |`B\2_j;W|o~6֛s\-eF;` >2vR<~pfCޖN.*TO͹AœUwQ+T4f_g7 JxmSl3^XL6Cr|iz20Ɇ"#EN~%tf U\k|߷h(v\uzNũ3(ἈfXjg,w6B،9V, ]ҋSByF:+z>=٭>O12/4|X=-=qe!}?Zybe`L9%X~{R}}pv͵?Rj w9(O\YMu`2 -YM1CUGj.C0J7s\ dkXM={X2IsP@h>f;D=r-Zү&F|=d:X띄bq7fsxZXIK![>y 5WӅEjYbsv0LeYÀ[Q.F#'{Y=k-﷜ h0.nsˢ8zK!R~^+$>r_J㮚M^n]+Um7$Eo(t$QjSf(q={DT._`ǥ6 \v[r]#zj })DPK>EWq:[^| Q<ތyZ ' ]ؽ龲k$όٖ7c<_"fEFiMZ]WYw'cwt 7:ك\:CA<JRl&2CdϢDQ__ (k?eµYt\5ŕ%J 3b#8;"76˻O?1WKèZ6߾#06$*!%Ṙn6#4z@i EG4+NWe-pdcq(`Ra{@*_JAX^KhMS4{~/b%iqOY (3- Xhuτ{__78G%߁8)% P/¼3>ȤА;DGMEVqSoMjѡ4sY{|8MTeUSl \gDTP_u+Rʞb+jS2Ky^@Z4&(b'r&&W A)~E6|SG@;8et;0=Q4x|40wR~nzj_ԿK ՠo(lq9HW %gBzr G:YG]ͷ[;G~D5D&@/1D:FٿrJYqB)V^ێ}&Xh +XH!g3-Vb4z {5cG%{$' aio_y:'v;zA0)v^ K/UM'VT\+rNjO`ng8Ec"❢; a yNŬM?!#lQ$E4e؉>z[o endstream endobj 247 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 161 0 obj << /Type /ObjStm /N 100 /First 906 /Length 5121 /Filter /FlateDecode >> stream x\Ys~ׯǓ:`nNxH@ScpIo!)T݊1F7{36U!,? }(8KtPxG.!B^IOcT:VRWy"a$qhЬ@pa2aOKY4BN,aI*ZV㨃Y1'VۓZu'm6Մ jZWX:GUDM$N"Ҥ`@?%>z0PXE뒑hpJkY⨪:J.jXQx[%xR0UV,#)HId%iUU Y*Ia(5UA*2DhҐXhk!Ri6FkƢK=B@= a,J  Dh2B.ZcpPNvb- #j=qU]h<'/3~1}Y=T\?8 YTqݟȼJSFhhK<?XB< qT?Ÿ֤_ڣoJPB RńP *mteE2 3)7.mޛ ƣR*_#kB|# ]XΑ]tIWZǣ/1Y =dvqΩK˦Oib\AJ&⊨7q&Bg6=qHG)`t<)pzY z3F[¥#ozBz,)~'537@M>)Jr(6;̆tx2]] |v5= "I6q?S. =w{7YFi= =Ө?>9aۣע|t0]xvx)gZZHXh4n ~I2'q9ͧ+o_glL|N||V`ҟ_~l0D|ӫ^0UUr2'P"`-_wmkEg6 _ٳK6u/aͨQ{ 3`o{776 KU4UW%h؇6QږePJ4OJ 4T)BmII&;ORHZtr~iOk2xȌ! '99rRUVğ`-V4Tmk+)nk('Tnҙd"|2ї''e)dOoZ(GhZCiKwMKu4#0?G% il6 % ڠЅTt!㦫'DTBnj) (1￿򏸎Ԙew6[ﺘӈ7('ep->![\5py:;VbR1Ô7:(_C!Ar##N2Pܜ+ []|FE@m֕)SamZ3^vɁcqKȵerpm*0Ʊ#aOY14E@]x.qw1BCvācUuRkz|_bX,eqۡD4py3ȑIc$i􀇴^r&3 \")tdHb7w88B\e\HYY⊑_4ő~!gR}#GmfC:\H2Ux#`ž dPdKgY2$%@3Hgwnny Qn?m \?.XU+ yjoU'JmDG艳lV1l4ܺǑFxI@X]<>m&& 50qy86g,JC"n#U#gY|چRxW.l>" M#B'J0,zs{VI9\1nUS  }yyqJ= o)yy/w9M?P( ${ 8p ,q옺u/W :97לIbTs.ϣm%lo,ahFhrJ7\MS g0/RS&Cζ yuGk66iﴦ\* a k^biq1Ah\ 2q(akp7\ $YfIŁC eTuTF" PK \Tkl(Zlڜmis:@N<:?o=5|p~j{Fmp<Į UM0bXJv& 7}g--;(,m tdÇ X42Ql;5.Y`5'Y R2|)J>(-qQ!,sS0~;q6KsMx|8dYSD89sjgO2E:l;qė-,B6x07(8l|PVg* Hg4gK<ܪ-/,=6Ɛ񩬧\4 d +nxR}Tl(44iX# #d}wd04 U,q2Bn)2+Hy㨞'xELpw<|yAVtc;&A𷿏+x"k|?{w_ep{dpgpПw|h&QK8.z|c/"?GLb,&b*fieOIy*/~v6Tc=~|VqNőx"8=y_1OĹ^]#1Cq)FĊn1Ե16[.lyĖ6*2~PۻǏiǛnЫx].ō{$fq"N[\Go<<VOՂ)zt֛^<9: Fuㅮ=[Bﮆ-=weU‡MAZMt-?>NNSG[bV;E'^7mR !tzVk/ᰞrMԮyV/uϏ[b&[Xr/zͅTlv1_{n76'uI^N{x%ȇ_ؙzK=tu\{b;gZ[w@sVץn{.;sԥvFqw×.5ӱGSv>_S:U^N}DѡTNe]jg]ҷTNʹwpjK~MZ _x)t.4:㼼CibҦ4۝v<_S:6:;!]۫~ig򝔹Kw]wUد4Z&BFvgϑ/߱VyKlM_V_Y5ɣGү+܁LNW>Y(߼| DDŽ6);s^gCJ 7FbH$DJI endstream endobj 261 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.12)/Keywords() /CreationDate (D:20131119122951+01'00') /ModDate (D:20131119122951+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 251 0 obj << /Type /ObjStm /N 14 /First 107 /Length 555 /Filter /FlateDecode >> stream x}TMo0 WXX"@޶uCםDs vf+Gڎ'AN)(@4s2 h%FHҚ d\C rڂFr*)HU]mPy@I>6@W:Io"U]y($.褓E2'sED"ѓ"=1ywپ\P=ne_m˺Mt^}C!tBok)b/E@ʜtl_j|+Ù8~BYN6 $llXS`Bt-z TS͹3Ks¢+;\x gշUJ1ŦQH#rXոq5j& QwaW5 @5N/P5#+DK?7;S28M[ endstream endobj 262 0 obj << /Type /XRef /Index [0 263] /Size 263 /W [1 3 1] /Root 260 0 R /Info 261 0 R /ID [ ] /Length 676 /Filter /FlateDecode >> stream x%KUQ=ZRӼeVZZ~fie D &*hQA9 g5APāra޽~爈 *?RB{8Rp㫍jd s~غ~6Ȃlȁ\yvB>@!R(=P%*A1<`B$\ pfa g.|*UJ/8I>{/\mV%'^%8 Tf|Ns8U5#P*9~Q8ǡNe&ZU^;Y۠:xU? AJ֜_75.>Ϳ?W{VYQ=1oש_rjIBF1з08ZeICo:<5Bhʗ22nd|Xћhw_Tk>Gb-SIyt#薭Z<`#F-O/xbK7o U{uV:C$Y #F,XX-#F"3Rgxͳ֤:5.dxբrūV߼jSիv U:4܉o) U1݊VLbYIDmKt> endstream endobj startxref 315216 %%EOF surveillance/inst/unitTests/0000755000176000001440000000000012242645665015771 5ustar ripleyuserssurveillance/inst/unitTests/runit_algoglrnb.R0000644000176000001440000000524711731650466021311 0ustar ripleyusers### --- Test setup --- if(FALSE) { ## Not really needed, but can be handy when writing tests library("RUnit") library("surveillance") } ##Simulate data and apply the algorithm S <- 1 ; t <- 1:120 ; m <- length(t) beta <- c(1.5,0.6,0.6) omega <- 2*pi/52 #log mu_{0,t} alpha <- 0.2 base <- beta[1] + beta[2] * cos(omega*t) + beta[3] * sin(omega*t) #Generate example data with changepoint and tau=tau tau <- 100 kappa <- 0.4 mu0 <- exp(base) mu1 <- exp(base + kappa) #Generate data (set.seed has problems with RUnit) #set.seed(42) #x <- rnbinom(length(t),mu=mu0*(exp(kappa)^(t>=tau)),size=1/alpha) x <- c(11,5,10,16,19,25,7,11,11,2,13,8,13,12,6,11,10,4,2,0,3,3,1,0,2,2,1,2,0,3,0,1,2,1,3,4,0,1,1,7,1,5,1,2,4,1,2,7,8,9,13,8,1,10,11,14,9,6,10,15,5,1,9,3,26,3,1,8,7,2,5,8,2,2,7,0,3,0,1,0,1,0,1,1,2,2,5,5,3,1,0,2,5,1,4,2,9,4,5,2,5,10,21,6,13,14,19,22,17,7,11,13,17,22,12,13,12,10,4,3) s.ts <- create.disProg(week=1:length(t),observed=x,state=(t>=tau)) #Define two control objects (should be equivalent) cntrl1 = list(range=t,c.ARL=5, mu0=mu0, alpha=alpha, change="intercept",ret="value",dir="inc") cntrl2 = list(range=t,c.ARL=5, M=-1, mu0=mu0, alpha=alpha, change="intercept",ret="value",dir="inc") #Run glr.ts1 <- algo.glrnb(s.ts,control=c(cntrl1)) glr.ts2 <- algo.glrnb(s.ts,control=c(cntrl2)) correctUpperbound <- c(0.0933664,0,0.001387989,0.4392282,1.239898, 2.983766,1.954988,1.722341,1.586777,0.7331938, 0.9337575,0.7903225,1.104522,1.425098,1.241290, 1.633672,2.033343,1.788079,1.397671,0.9081794, 0.797097,0.7270934,0.5248943,0.3093548,0.2622768, 0.2301054,0.1595651,0.1484989,0.06889605,0.1504776, 0.04138495,0.02219845,0.0231524,0.00957569,0.1504776, 0.5827537,0.0357062,0.005011513,0,1.390972, 0.3167743,0.5717088,0.1053871,0.003442552,0.0005934715, 0,0,0.05509335,0.1375619,0.2449853, 0.6840703,0.5427538,0.05675776,0.06656547,0.09036596, 0.209314,0.1392091,0.03494786,0.02621600,0.277202, 0.01762547,0,0,0,3.564077, 1.410190,0.290548,0.3740241,0.4269062,0.1296794, 0.1298662,0.6322042,0.2115204,0.1074570,0.9366399, 0.1379007,0.1509654,0.03392803,0.005775552,0, 0,0,0,0,0.001143512, 0.001637927,1.021689,1.965804,1.830440,1.017412, 0.3033473,0.1689957,0.4051742,0.1247774,0.1460143, 0.03590031,0.9459381,0.4189531,0.2637725,0.03925406, 0.01374443,0.2283519,2.535301,1.406133,1.692899, 2.021258,2.951635,4.25683,4.77543,3.90064, 3.646361,3.680106,4.236502,5.522696,0.1221651, 0.4054735,0.6761779,0.803913,0.3913383,0.1261521) ### --- Test functions --- test.simple <- function() { upperboundDiff <- as.vector(glr.ts1$upperbound) - correctUpperbound checkTrue(sum(abs(upperboundDiff) > 1e-5) == 0) #M and Mtilde arguments checkTrue(digest(glr.ts1$upperbound) == digest(glr.ts2$upperbound)) } surveillance/tests/0000755000176000001440000000000012242645665014154 5ustar ripleyuserssurveillance/tests/createSTS-objects.R0000755000176000001440000000320612136244225017554 0ustar ripleyuserslibrary("maptools") library("surveillance") ###################################################################### # Create influenza data for Bavaria and Baden-Wuerttemberg ###################################################################### # read in observed number of cases flu.counts <- as.matrix(read.table("flu_ByBw.txt")) namesLK <- substring(colnames(flu.counts),first=2,last=100) colnames(flu.counts) <- namesLK # Load population size from table pop <- as.matrix(read.table("population_2001-12-31_ByBw.txt",header=TRUE)[,c("id","popFrac")]) # Make a matrix containing the population size from the above # with one row per row in flu.counts popM <- matrix(pop[,2],dimnames=list(NULL,pop[,1]),nrow=nrow(flu.counts),ncol=nrow(pop),byrow=TRUE) # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table("neighourhood_ByBw.txt")) #map <- readShapePoly("../inst/shapes/districts_BYBW.shp", IDvar = "id") #Read the shapefile - use system file instead of file.path #file <- file.path(path.package("surveillance"),"shapes","districts_BYBW.shp") file <- system.file("shapes","districts_BYBW.shp", package="surveillance") map <- readShapePoly(file, IDvar = "id") #Create the sts object fluBB <- new("sts", epoch = 1:nrow(flu.counts), observed = flu.counts, start = c(2001, 1), freq = 52, neighbourhood = nhood, map = map, population = popM ) #Spatial plot showing the number of cases in each region for the year 2001 plot(fluBB[year(fluBB) == 2001, ], type= observed ~ 1 | unit , labels = FALSE) surveillance/tests/flu_ByBw.txt0000755000176000001440000035352611765400003016427 0ustar ripleyusers"8336" "8337" "8315" "8311" "9262" "9172" "9163" "9776" "9763" "8435" "8335" "8327" "8326" "8316" "8325" "9275" "9189" "9171" "9187" "9182" "9173" "9175" "9764" "8436" "9780" "9762" "9180" "9190" "9188" "9162" "9775" "8421" "8437" "8426" "8417" "8317" "8237" "8211" "9272" "9271" "9263" "9279" "9277" "9261" "9183" "9184" "9177" "9778" "9777" "9761" "9181" "9179" "9174" "9774" "8425" "8416" "8415" "8231" "8115" "8235" "8216" "8212" "9276" "9362" "9278" "9274" "9178" "9186" "9161" "9773" "9772" "9771" "9185" "8135" "8117" "8116" "8111" "8236" "8121" "8118" "8221" "8215" "9565" "9372" "9375" "9273" "9176" "9563" "9562" "9779" "9577" "9573" "9561" "8136" "8119" "8125" "8226" "8222" "9576" "9564" "9363" "9376" "9373" "9361" "9572" "9461" "9663" "9575" "9571" "8127" "8126" "8225" "9675" "9662" "9574" "9474" "9462" "9377" "9374" "9371" "9471" "9463" "9679" "8128" "9676" "9661" "9678" "9479" "9472" "9464" "9478" "9477" "9674" "9473" "9677" "9671" "9673" "9672" "9475" "9476" "1" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "2" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "3" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "4" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 3 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "5" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 5 0 0 0 0 4 0 4 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 12 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 2 0 4 4 0 0 2 0 3 0 0 0 0 0 0 0 3 0 0 0 0 6 0 0 1 0 3 0 0 0 0 0 0 0 0 1 2 2 8 0 0 0 0 0 0 8 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "6" 0 0 1 6 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 3 0 0 0 0 10 0 6 0 5 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 6 0 4 0 1 0 0 5 0 0 0 0 0 0 1 0 0 0 0 1 2 4 8 0 0 3 0 3 0 0 0 0 0 1 0 1 0 0 0 0 7 1 0 0 0 5 0 0 0 0 0 0 0 0 0 11 1 0 0 0 0 0 0 0 4 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "7" 0 0 1 1 0 0 0 0 0 0 0 4 0 3 0 0 0 0 1 2 1 6 0 3 0 0 0 0 0 6 0 3 0 0 0 2 0 0 0 0 1 0 0 0 2 7 0 0 0 0 0 0 0 0 2 0 3 0 1 0 0 9 0 0 0 0 0 0 0 1 0 1 1 2 1 0 9 0 0 3 0 0 0 2 0 0 0 0 0 2 0 0 0 0 3 3 0 0 0 7 1 0 0 0 0 0 0 0 0 6 1 0 0 3 0 1 0 2 11 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "8" 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 11 1 1 0 6 0 0 1 0 0 0 0 3 0 3 0 3 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 3 0 6 0 0 0 0 2 0 0 0 0 0 0 1 1 0 0 1 0 3 1 6 0 0 1 0 1 0 0 0 0 1 0 1 4 0 0 0 0 2 2 0 0 0 1 0 8 0 0 0 0 0 0 0 4 1 0 1 0 0 1 0 0 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 0 0 2 0 0 0 0 0 0 0 6 0 0 0 1 0 1 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 2 0 0 1 0 0 3 0 0 4 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 3 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 "10" 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "11" 0 0 2 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 4 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "12" 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "13" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 "14" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "15" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "16" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "17" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "18" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "19" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "20" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "21" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "22" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "23" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "24" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "25" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "26" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "27" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "28" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "29" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "30" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "31" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "32" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "33" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "34" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "35" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "36" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "37" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "38" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "39" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "40" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "41" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "42" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "43" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "44" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "45" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "46" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "47" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "48" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "49" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "50" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "51" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "52" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "53" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "54" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "55" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "56" 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 0 2 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "57" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 6 4 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "58" 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "59" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 3 3 0 1 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 5 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 1 1 0 0 0 0 0 0 0 0 5 3 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "60" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 10 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 1 1 0 1 0 3 1 0 0 0 3 0 0 0 0 0 0 0 1 0 1 6 0 0 1 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 3 1 6 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "61" 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 7 0 1 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 5 0 3 0 1 1 1 0 0 2 0 0 4 0 0 0 0 1 0 1 6 0 0 1 0 0 0 4 0 0 0 0 1 0 0 0 0 0 1 2 2 0 1 5 1 3 0 0 2 0 0 0 0 8 1 0 1 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 "62" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 2 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 7 0 0 2 0 1 0 1 0 0 0 0 2 0 0 0 0 0 0 3 0 2 0 2 1 5 0 0 0 0 0 0 0 3 1 0 1 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 2 0 3 "63" 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 7 0 4 0 5 0 5 1 0 0 0 5 0 0 0 0 0 0 0 0 0 1 7 0 0 3 0 3 0 3 0 0 0 0 0 2 0 0 0 0 0 5 2 0 0 11 4 0 4 0 0 0 0 1 1 12 1 0 0 0 0 0 0 0 7 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 "64" 0 0 1 2 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 4 3 1 0 0 0 0 0 0 0 0 1 2 4 0 2 0 0 0 0 0 1 2 0 0 1 0 0 0 0 0 1 0 8 0 0 4 0 2 0 2 0 0 0 0 3 0 0 0 0 0 2 1 1 0 0 6 1 0 0 0 1 4 0 0 0 4 1 0 1 0 1 1 0 3 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 10 "65" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 6 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 10 3 0 0 0 0 0 0 0 0 11 0 0 0 0 0 1 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 4 "66" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 "67" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 "68" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 1 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 "69" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 "70" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "71" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "72" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "73" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "74" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "75" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "76" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "77" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "78" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "79" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "80" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "81" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "82" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "83" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "84" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "85" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "86" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "87" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "88" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "89" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "90" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "91" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "92" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "93" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "94" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "95" 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "96" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "97" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "98" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "99" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "100" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "101" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "102" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "103" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "104" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "105" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "106" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "107" 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "108" 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "109" 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 29 3 0 0 4 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 1 0 0 0 0 2 6 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 "110" 0 0 1 5 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 9 0 0 0 4 0 1 0 0 0 0 0 0 0 0 0 24 2 0 0 7 0 0 2 0 2 0 0 0 15 0 1 1 2 1 0 0 1 0 1 0 1 9 0 0 0 12 7 0 0 1 1 0 0 8 0 0 0 0 1 2 0 0 0 0 4 0 1 0 0 5 3 2 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "111" 0 0 0 2 0 0 0 0 0 0 0 9 0 2 0 0 0 0 0 4 0 1 0 2 0 0 2 0 0 19 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 14 0 0 0 3 0 0 2 0 3 0 2 0 3 0 3 1 3 1 1 1 0 0 4 0 2 7 0 0 0 8 16 0 0 13 0 0 0 12 1 0 0 2 0 1 0 0 0 0 2 1 3 0 1 5 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 1 "112" 0 0 5 1 0 0 0 0 0 1 1 10 1 0 3 0 0 5 2 11 0 5 0 2 0 0 0 0 0 26 0 0 1 1 1 1 1 0 0 0 0 0 0 0 2 45 2 0 0 11 0 0 6 0 5 4 1 0 7 0 9 21 3 6 2 0 0 0 5 0 6 6 0 0 1 22 51 0 0 12 1 1 0 30 2 0 0 1 3 1 0 0 0 1 5 14 1 0 0 9 6 10 0 0 0 0 1 15 1 0 1 0 5 2 0 0 0 4 13 0 0 0 9 0 0 0 5 0 0 0 0 1 0 0 0 0 0 3 0 0 "113" 1 0 11 3 0 1 0 0 0 6 0 9 0 2 2 0 4 5 2 8 0 10 0 0 0 0 1 0 0 37 0 2 0 1 0 0 0 0 0 0 0 0 0 0 2 47 2 0 0 11 1 1 3 0 11 7 5 0 8 0 16 0 1 7 5 3 0 1 5 0 3 10 0 0 4 21 57 0 0 7 1 0 0 14 6 0 1 0 0 4 0 1 0 3 4 8 5 2 0 16 18 13 0 0 0 0 3 0 0 0 0 0 2 5 0 1 0 2 9 2 1 0 14 0 0 0 2 0 0 0 0 3 0 0 1 1 1 0 0 3 "114" 0 2 7 9 0 1 0 0 0 8 2 10 0 4 0 0 0 1 0 6 0 7 0 2 0 0 2 0 0 32 0 0 0 2 0 2 0 0 0 0 0 0 0 0 4 23 0 1 0 8 0 3 4 0 4 2 5 0 26 0 4 2 1 9 2 1 0 0 0 1 1 6 0 0 1 12 12 1 0 3 0 0 2 15 16 0 0 1 1 1 0 4 0 0 13 4 3 0 0 12 20 9 1 0 1 0 1 20 4 0 0 0 2 14 0 7 0 9 34 1 4 3 7 0 0 0 0 1 0 0 0 3 1 1 2 0 2 3 0 0 "115" 0 0 1 6 0 2 0 0 0 0 0 4 0 0 0 0 1 1 0 4 1 3 0 0 0 0 2 0 0 30 0 4 0 0 0 0 0 0 0 0 0 0 0 0 4 10 2 0 0 0 1 1 0 0 3 0 1 0 12 1 2 0 1 8 1 1 0 12 2 1 1 6 0 0 0 3 15 0 0 3 0 0 1 6 2 0 1 0 3 0 0 0 0 1 0 1 0 0 0 4 7 12 1 0 0 1 1 3 2 1 0 0 0 2 4 3 0 5 8 1 4 2 4 1 0 0 0 3 1 0 0 5 0 1 0 0 2 0 0 25 "116" 0 0 0 4 0 0 1 0 0 1 0 0 1 5 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 6 0 4 0 0 0 2 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 1 1 0 3 0 0 0 4 6 2 1 0 0 0 0 0 2 0 0 0 3 0 0 1 6 7 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 4 0 0 0 1 5 3 1 0 0 1 0 4 2 0 0 0 0 1 0 0 0 3 4 2 3 0 5 0 0 0 1 0 0 0 1 10 0 1 0 1 0 0 0 0 "117" 0 0 7 5 0 1 0 0 0 2 0 0 0 1 0 0 3 3 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 2 0 1 0 0 0 2 0 0 0 4 0 0 0 1 3 0 0 4 0 0 0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 2 0 1 0 0 0 3 0 0 0 0 0 1 1 0 0 0 4 0 1 1 0 0 0 0 0 0 0 0 0 2 0 1 2 0 0 0 0 3 "118" 0 2 2 2 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 7 2 0 0 1 3 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 10 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 0 "119" 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 5 0 3 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 "120" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 "121" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "122" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "123" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "124" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "125" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "126" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "127" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "128" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "129" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "130" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "131" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "132" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "133" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "134" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "135" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "136" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "137" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "138" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "139" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "140" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "141" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "142" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "143" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "144" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "145" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "146" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "147" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "148" 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "149" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "150" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "151" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "152" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "153" 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "154" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 "155" 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 "156" 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "157" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "158" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "159" 3 3 5 2 0 0 0 0 0 1 1 1 0 3 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 7 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 "160" 1 0 5 10 0 0 0 0 0 1 0 1 0 2 0 0 1 2 3 1 0 0 0 0 0 0 2 0 0 4 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 2 1 0 0 4 0 0 2 0 0 2 0 3 7 0 3 0 0 0 1 1 0 0 1 0 0 2 0 0 1 0 2 0 0 3 0 1 0 2 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 2 3 0 0 0 0 0 2 0 4 0 0 1 0 0 0 0 0 0 0 1 0 4 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 "161" 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 6 0 0 0 2 0 2 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 3 0 1 1 1 0 1 0 1 2 1 0 0 1 0 5 0 0 0 1 0 0 1 1 3 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 3 0 0 2 0 0 0 0 0 0 1 2 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "162" 1 0 1 0 0 0 0 0 0 1 1 4 2 2 0 0 2 2 1 0 0 0 0 1 0 0 0 1 0 10 0 2 0 1 0 1 0 1 0 0 0 0 0 0 2 3 0 0 0 1 0 0 1 0 2 1 1 0 4 0 1 4 0 0 0 0 0 1 2 0 0 0 0 0 1 3 3 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 3 0 0 1 0 0 5 2 1 0 0 3 1 0 0 0 1 1 0 1 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "163" 1 0 0 2 0 0 0 0 0 1 1 1 0 0 0 0 0 4 0 0 0 1 0 1 2 0 0 0 0 8 0 1 0 0 0 6 0 0 0 0 0 0 0 0 1 4 1 0 0 1 0 0 5 1 0 3 0 0 5 0 0 0 1 0 0 1 0 11 0 0 0 0 0 2 3 4 9 0 0 2 0 2 0 2 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 3 0 0 0 1 0 1 9 6 0 0 10 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "164" 0 0 0 2 0 0 2 0 0 3 1 0 0 0 0 0 2 0 2 0 0 2 0 1 0 0 0 0 0 7 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 0 0 0 0 0 0 0 4 1 0 4 0 0 0 1 0 12 1 0 0 1 0 0 2 2 4 0 0 5 0 0 0 2 0 0 0 0 0 0 0 0 4 0 1 2 0 0 0 0 0 1 0 0 0 1 0 1 0 2 0 0 4 0 0 1 0 0 0 0 5 1 0 0 1 0 0 0 0 0 3 5 0 1 0 1 1 0 0 0 "165" 0 1 1 5 0 1 0 0 0 2 2 6 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 1 0 2 0 4 0 0 0 0 0 0 0 5 0 2 0 1 0 1 0 0 2 0 0 0 0 0 3 0 0 0 0 1 0 3 0 3 1 0 1 0 0 0 0 0 3 0 0 2 0 0 0 2 1 0 0 0 0 0 0 0 1 0 2 0 0 0 0 2 0 0 0 0 0 1 0 0 2 2 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 6 0 0 0 0 0 0 0 0 "166" 1 0 1 1 0 0 0 0 0 1 2 2 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 2 0 0 0 1 0 0 0 1 0 5 0 0 0 0 0 1 0 0 0 0 2 0 4 0 0 1 1 0 0 1 0 8 0 0 1 1 2 0 3 1 7 0 0 1 0 0 0 0 1 0 0 0 0 2 0 0 2 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 6 1 1 0 1 0 1 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 "167" 1 0 5 3 0 0 0 0 0 2 0 5 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 0 0 0 3 0 3 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 5 0 1 2 1 0 0 0 0 0 0 0 2 0 2 0 0 1 1 0 0 2 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "168" 0 2 2 2 0 0 0 0 0 0 0 10 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 1 0 0 0 4 0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 "169" 0 0 0 2 0 0 0 0 0 1 0 3 0 1 3 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 3 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 "170" 0 0 0 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "171" 0 0 0 2 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "172" 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "173" 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "174" 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "175" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "176" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "177" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "178" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "179" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "180" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "181" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "182" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "183" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "184" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "185" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "186" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "187" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "188" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "189" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "190" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "191" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "192" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "193" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "194" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "195" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "196" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "197" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "198" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "199" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "200" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "201" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "202" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "203" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "204" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "205" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "206" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "207" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "208" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "209" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "210" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "211" 2 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 1 0 3 0 0 0 0 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "212" 1 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 3 0 0 1 0 0 0 2 0 0 0 0 3 14 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 7 0 0 0 2 0 0 0 0 0 4 0 0 3 3 0 0 0 1 1 0 3 0 1 0 2 1 1 0 0 4 8 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "213" 1 0 0 6 0 0 0 0 0 3 0 2 0 0 0 0 0 2 2 4 0 3 0 2 0 0 0 4 5 12 0 2 0 2 2 1 1 0 0 5 0 0 0 5 0 6 1 0 0 3 0 0 1 0 3 13 1 0 15 0 3 4 0 0 1 3 1 0 1 0 0 2 1 0 2 10 15 0 0 10 0 3 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 0 1 1 1 0 1 0 2 0 0 0 9 4 0 0 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "214" 9 2 1 1 0 1 0 0 0 4 2 5 0 1 0 0 3 1 2 2 0 1 0 3 0 0 0 5 7 26 0 1 2 0 1 4 6 0 0 11 0 1 0 1 1 10 2 0 0 1 2 0 0 0 0 10 1 0 27 9 1 2 0 0 2 1 5 4 2 0 1 4 0 1 0 12 24 0 0 6 0 4 0 0 3 0 0 2 1 0 0 1 0 5 2 1 1 0 0 1 3 1 0 0 1 0 1 1 0 9 3 0 0 0 0 0 0 0 1 0 2 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 "215" 10 0 4 4 0 0 0 0 0 4 4 11 0 0 4 0 7 0 3 0 0 2 0 1 0 0 0 3 0 16 0 0 0 1 4 4 7 0 0 14 1 3 0 5 1 1 5 0 0 2 0 1 0 0 0 20 5 1 38 1 5 3 3 0 3 5 4 1 0 1 0 0 0 1 9 8 32 0 0 21 1 1 0 0 2 0 3 1 0 0 4 1 2 7 4 0 3 0 0 4 2 4 1 0 0 0 0 1 0 4 1 0 1 0 0 0 1 0 5 1 10 0 3 1 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 "216" 5 1 8 9 1 3 1 0 0 4 3 5 0 0 6 0 8 2 15 1 0 8 0 1 0 0 0 7 6 38 1 0 1 2 0 7 2 0 0 4 0 3 0 4 2 20 7 0 0 8 1 3 0 0 4 8 11 0 19 0 5 2 6 7 2 6 9 2 1 0 3 7 1 1 19 10 33 2 1 21 2 1 0 2 1 1 4 2 1 0 0 2 2 3 8 3 6 2 0 4 5 3 2 0 0 4 0 0 2 22 1 0 3 0 0 4 0 3 7 1 10 0 4 2 0 0 1 0 1 1 0 1 1 3 2 0 2 0 0 0 "217" 10 2 2 6 0 1 3 0 0 5 7 6 2 1 33 0 5 0 11 0 0 3 0 3 0 0 2 7 1 37 0 2 1 0 1 4 2 1 2 6 2 2 0 3 0 17 7 0 0 22 2 0 2 0 5 5 8 0 18 0 9 6 3 2 3 3 5 5 1 1 9 3 1 1 28 9 35 1 0 21 3 7 0 9 11 2 4 3 0 0 0 1 2 4 13 5 19 2 0 6 15 10 6 0 2 2 0 3 6 16 1 0 6 0 0 5 2 6 18 1 10 0 4 2 0 0 1 1 1 0 0 2 4 7 2 0 0 1 0 0 "218" 4 6 1 3 0 0 0 2 0 2 4 4 2 2 0 1 3 0 11 2 0 4 0 3 1 0 0 14 0 35 0 0 0 1 0 3 3 1 2 1 0 8 0 2 1 13 1 0 0 11 3 0 0 0 2 0 7 0 28 1 11 6 7 2 5 1 5 8 0 3 10 6 2 0 25 12 40 0 0 15 2 14 0 12 7 3 1 1 3 0 1 2 0 5 5 5 12 1 0 7 30 8 5 3 0 6 1 4 1 7 3 1 5 7 0 3 0 7 26 4 13 1 4 5 1 0 11 0 0 0 0 2 3 7 3 0 1 3 1 0 "219" 6 2 3 4 0 0 3 0 0 1 3 7 0 2 7 0 0 1 2 6 1 7 0 3 0 0 0 21 0 60 1 0 1 1 2 5 3 0 0 0 1 5 0 0 2 11 1 0 0 16 0 2 0 1 2 5 14 0 17 1 14 4 3 7 1 3 3 0 0 8 6 11 4 0 24 6 29 1 2 12 4 9 1 7 5 3 1 2 0 0 0 0 6 2 17 4 13 0 0 4 9 0 5 2 0 0 0 4 10 9 3 0 8 3 0 2 4 0 12 2 3 0 4 6 2 0 2 0 0 0 0 3 2 2 2 0 0 1 0 1 "220" 2 0 2 3 0 0 1 1 0 0 4 4 0 0 0 0 1 0 3 2 2 1 0 1 0 0 0 2 0 22 2 0 0 2 0 1 0 0 0 0 2 3 0 0 0 4 2 0 0 4 0 0 0 0 1 2 2 0 2 0 7 0 3 2 2 0 2 0 0 0 1 1 2 0 13 7 10 0 0 4 1 2 0 3 2 1 0 0 1 0 0 1 3 2 4 0 2 0 0 1 6 2 0 1 0 1 0 2 6 15 0 0 1 7 1 0 0 0 10 2 5 0 0 5 2 0 2 1 0 0 0 0 4 0 2 1 0 1 0 0 "221" 2 2 1 2 0 0 0 0 0 1 6 1 1 1 0 0 0 0 2 0 1 0 0 0 0 0 0 6 0 17 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 4 1 0 0 1 0 0 0 0 0 0 1 0 0 0 2 0 1 1 3 0 3 2 0 4 0 0 0 0 3 1 2 0 0 1 0 0 0 0 2 0 0 0 1 0 2 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 2 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 "222" 0 0 2 3 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 2 1 0 3 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "223" 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "224" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "225" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "226" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "227" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "228" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "229" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "230" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "231" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "232" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "233" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "234" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "235" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "236" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "237" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "238" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "239" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "240" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "241" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "242" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "243" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "244" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "245" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "246" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "247" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "248" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "249" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "250" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "251" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "252" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "253" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 "254" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "255" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 "256" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "257" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "258" 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "259" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "260" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "261" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "262" 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "263" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "264" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "265" 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "266" 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "267" 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "268" 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 3 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 5 2 0 0 0 0 1 0 0 1 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 3 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "269" 2 0 1 0 0 0 0 0 0 0 2 0 0 2 0 1 0 2 0 0 0 2 0 0 0 0 0 0 2 9 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 0 3 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "270" 0 0 0 1 1 0 0 0 0 3 1 0 0 2 0 0 1 3 0 0 0 0 0 1 0 0 0 0 2 4 1 3 1 0 0 0 0 0 0 0 0 0 0 1 0 5 0 1 0 0 0 1 0 1 4 0 0 0 0 0 1 1 0 0 0 4 0 0 1 0 0 0 2 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 "271" 0 0 0 5 8 0 0 4 0 2 2 1 0 2 0 5 2 6 1 3 0 1 0 0 1 0 1 4 4 14 0 1 0 0 0 2 0 0 0 1 0 0 0 0 0 4 2 0 0 0 0 3 0 0 1 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 0 2 2 0 0 2 1 0 0 3 1 0 0 1 0 2 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 "272" 0 1 0 1 3 0 0 1 0 4 2 0 0 2 0 10 0 0 0 0 0 1 0 1 0 0 0 0 10 14 0 0 0 1 0 5 0 0 0 4 0 0 1 1 3 4 3 0 0 0 0 5 0 2 3 0 0 1 1 5 0 0 0 0 0 1 0 2 0 0 1 1 1 0 1 4 2 0 0 3 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 1 0 0 0 0 "273" 3 2 0 4 3 1 0 0 0 10 0 1 0 4 0 7 2 3 3 0 0 1 0 2 2 1 1 0 8 30 0 0 0 0 0 0 0 0 0 13 0 4 2 3 6 9 3 0 0 1 1 1 1 2 1 2 2 0 3 6 1 0 3 1 0 2 4 22 0 0 2 0 0 1 1 3 4 1 0 2 0 2 0 20 2 1 3 1 0 0 0 0 0 0 6 1 0 0 3 2 0 2 0 0 0 0 0 0 0 7 1 0 1 0 0 1 0 0 3 1 0 0 0 3 0 0 0 0 0 0 0 3 4 2 0 0 0 0 0 0 "274" 0 0 0 0 11 0 0 0 0 4 3 1 0 1 0 23 1 6 2 1 0 0 0 3 1 0 2 1 10 29 0 1 0 1 0 0 0 0 0 10 1 3 1 1 2 12 2 0 0 2 0 0 2 0 0 3 1 0 4 0 6 0 16 0 1 3 0 1 1 0 3 5 4 0 1 2 4 0 0 2 0 0 0 13 2 1 0 0 0 2 0 0 0 0 3 0 2 0 0 7 0 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 0 1 7 0 0 0 0 1 0 1 0 "275" 1 0 0 0 4 0 0 0 0 1 1 0 1 1 0 8 0 4 4 0 0 1 0 1 1 0 1 0 0 15 0 0 0 0 0 0 0 0 0 2 0 0 2 0 2 6 3 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 7 0 1 1 2 1 1 0 0 1 1 0 2 0 4 0 0 1 0 0 0 4 3 0 1 0 0 0 0 0 0 1 3 0 1 1 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 7 0 1 1 0 2 0 0 0 "276" 0 1 1 0 2 0 0 0 0 0 1 0 0 1 0 4 0 3 3 0 0 0 0 0 1 0 1 0 3 5 0 1 0 0 0 0 0 0 0 3 2 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0 3 0 4 0 1 0 0 6 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 3 1 0 0 1 0 1 0 1 1 1 2 0 0 0 0 2 3 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 "277" 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 3 0 1 1 0 1 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "278" 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "279" 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "280" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 "281" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "282" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "283" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "284" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "285" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "286" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "287" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "288" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "289" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "290" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "291" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "292" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "293" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 "294" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "295" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "296" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "297" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "298" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "299" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "300" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "301" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "302" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "303" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "304" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "305" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "306" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "307" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "308" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "309" 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "310" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "311" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 "312" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "313" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "314" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 "315" 1 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "316" 1 0 2 2 0 0 1 0 0 1 0 0 0 0 0 0 2 0 4 0 0 0 0 0 0 0 0 1 3 5 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 4 0 0 11 1 0 0 0 0 0 0 1 0 0 0 0 0 0 2 2 0 4 0 1 0 0 0 0 0 1 1 0 0 2 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "317" 3 2 2 4 0 0 0 0 0 0 0 0 0 10 1 0 1 0 4 0 0 0 0 1 1 0 2 6 2 11 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 2 0 10 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 10 0 0 11 0 1 3 0 0 0 2 0 0 0 0 0 0 0 8 0 6 4 0 0 0 0 2 1 1 3 1 0 0 6 0 0 1 0 1 0 0 1 0 5 1 0 5 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 0 2 "318" 11 3 3 14 1 1 0 0 0 9 10 2 3 4 0 0 1 0 11 1 1 2 0 0 4 0 0 17 0 43 0 0 3 3 2 16 17 0 0 1 0 0 0 0 3 6 1 0 4 24 0 0 10 2 1 2 2 0 26 0 6 1 1 0 1 5 1 1 0 1 6 7 0 2 1 8 17 0 0 29 6 2 8 8 1 1 1 0 0 1 0 0 0 0 8 4 5 4 4 3 1 0 3 0 0 5 1 1 0 1 1 0 3 1 6 0 2 1 2 1 7 1 4 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 1 "319" 9 8 14 7 2 2 0 0 0 6 17 4 0 3 1 1 11 1 7 0 2 6 0 10 6 0 8 13 17 84 0 0 5 6 1 28 16 0 0 0 0 0 1 1 5 15 3 0 4 15 3 13 5 3 4 2 23 6 20 3 1 3 5 2 3 1 0 2 0 4 3 6 1 0 1 13 36 0 0 37 3 7 7 10 2 1 0 2 2 1 0 0 1 8 30 5 7 5 3 4 0 0 3 0 1 14 1 2 2 18 5 0 3 0 48 2 0 1 3 0 11 0 13 0 0 0 0 0 0 0 0 0 2 0 1 0 1 0 0 0 "320" 6 9 8 17 1 2 3 1 1 2 27 8 1 3 1 6 12 3 5 5 4 19 0 19 9 0 9 17 5 109 0 0 1 13 10 32 9 0 1 3 0 0 0 3 17 39 7 0 4 17 3 8 5 6 0 2 18 2 13 3 10 0 2 4 0 1 1 0 3 8 13 4 4 2 7 21 33 0 8 12 5 23 4 13 4 1 3 8 2 0 0 5 1 7 15 4 7 7 5 12 4 5 5 2 3 5 9 7 2 9 2 0 9 1 0 6 2 1 7 2 17 0 15 2 0 1 0 0 4 0 0 1 6 0 7 0 4 2 0 0 "321" 11 10 8 14 0 1 3 3 0 8 15 17 4 5 2 3 12 5 12 7 7 8 0 11 7 0 2 41 3 52 0 1 1 14 10 29 13 1 0 3 3 3 0 1 9 21 57 1 9 15 3 7 6 7 1 18 14 0 22 1 10 1 6 5 5 6 12 20 4 11 12 34 12 1 27 19 26 0 10 17 2 13 2 25 9 1 7 3 0 1 0 2 7 9 6 10 19 14 4 21 2 10 17 0 9 10 9 0 38 6 6 0 10 0 1 3 0 4 5 1 31 1 18 5 0 0 1 0 0 5 3 1 6 0 8 0 5 9 0 0 "322" 6 6 3 14 14 3 0 3 0 10 10 5 0 2 0 15 12 6 7 8 5 10 0 23 13 1 8 3 10 29 0 2 9 8 14 12 0 0 2 6 0 3 0 3 10 37 8 0 4 15 3 13 4 7 4 8 17 0 11 9 6 1 5 11 2 7 13 9 0 10 9 3 5 0 24 31 19 2 5 20 3 0 0 17 8 1 4 3 2 2 1 4 3 13 18 11 13 5 1 7 4 14 18 1 3 3 13 25 35 17 0 0 8 0 2 5 6 4 8 4 18 0 14 1 0 0 0 0 0 4 0 3 14 2 5 0 1 8 3 5 "323" 9 9 6 1 10 0 0 1 0 5 4 3 1 0 1 10 6 8 0 4 3 8 0 11 6 0 15 6 13 14 1 0 1 9 2 39 0 0 0 3 0 2 0 1 14 20 17 0 1 1 4 3 7 8 4 8 5 0 4 2 8 1 4 5 2 3 5 3 0 16 8 14 4 0 5 12 14 1 5 4 0 2 3 16 6 1 8 4 3 1 1 1 0 6 9 15 10 6 1 4 3 9 24 1 4 2 3 0 16 5 7 0 7 0 2 6 0 0 8 1 8 2 5 1 0 0 0 0 0 0 2 2 8 0 0 2 0 5 0 3 "324" 9 2 5 4 6 0 1 0 0 1 1 0 1 1 0 5 2 4 1 2 0 2 0 8 3 0 0 3 3 5 1 0 4 2 15 26 0 0 0 1 0 5 4 0 2 11 2 0 0 2 2 3 0 4 1 4 5 0 3 0 6 3 2 2 2 2 5 16 1 3 6 3 5 1 1 16 9 0 0 4 1 0 7 7 6 0 6 4 4 0 2 1 0 3 5 19 2 5 1 4 2 17 17 0 2 2 1 3 2 6 2 0 8 0 0 3 0 0 2 0 6 0 4 1 0 0 1 0 0 1 1 7 4 2 4 0 0 4 1 8 "325" 5 1 2 2 1 0 1 0 0 0 7 0 0 3 0 1 1 1 0 0 0 2 0 2 3 0 2 0 3 16 0 0 2 2 1 8 0 0 0 0 0 1 0 1 3 2 1 0 0 0 2 4 0 3 2 11 5 0 1 0 6 0 0 0 0 3 17 2 0 3 1 2 1 0 1 4 1 0 4 3 0 2 0 3 3 0 1 0 1 0 0 0 0 2 2 8 0 2 1 0 0 4 14 0 0 1 0 8 2 6 1 1 3 0 0 3 0 0 0 0 6 0 2 1 0 0 0 0 0 1 0 0 7 1 3 0 0 3 1 1 "326" 0 0 2 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 2 1 0 0 0 0 1 0 1 0 0 6 0 1 0 1 1 4 1 0 0 0 0 0 0 0 1 2 1 0 1 0 0 0 0 0 0 0 1 0 3 0 1 0 1 0 0 0 1 0 0 4 1 0 1 1 0 3 2 0 1 1 1 0 0 4 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 1 0 3 1 0 0 0 0 2 0 3 1 0 0 0 1 2 0 0 1 0 4 0 0 0 0 0 0 0 0 0 2 1 0 0 2 0 0 1 0 2 "327" 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 14 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "328" 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "329" 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "330" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "331" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "332" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "333" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "334" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 "335" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "336" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "337" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "338" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "339" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "340" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "341" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "342" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "343" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "344" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "345" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "346" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "347" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "348" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "349" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "350" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "351" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "352" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "353" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "354" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "355" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "356" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "357" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "358" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "359" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "360" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "361" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "362" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 "363" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "364" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "365" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 3 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "366" 2 0 0 1 0 0 1 0 0 2 0 3 0 0 0 0 0 0 2 0 1 1 0 0 0 1 0 2 0 2 0 0 1 0 6 1 0 0 0 0 0 0 0 0 2 4 7 0 0 1 0 2 0 0 0 0 1 0 2 1 1 0 0 1 0 1 0 4 0 0 0 0 2 0 1 6 6 0 0 1 0 0 0 6 0 0 1 0 2 0 0 0 1 0 3 2 0 0 0 4 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 "367" 3 2 0 0 1 0 0 0 0 1 0 2 0 1 0 9 0 1 2 2 2 2 0 0 1 1 0 1 3 47 0 0 1 1 4 2 4 0 0 0 2 1 2 1 1 9 4 0 0 2 1 14 0 0 0 1 1 0 13 2 12 0 3 1 4 1 4 3 0 2 0 3 12 0 1 15 13 0 0 3 0 2 1 19 1 0 0 1 1 0 0 0 1 0 0 4 0 3 0 3 0 2 0 2 0 0 0 0 2 1 3 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 8 0 0 2 0 0 "368" 5 8 0 2 6 3 1 4 0 4 4 0 0 0 0 28 7 6 12 5 1 4 0 1 1 1 0 7 9 58 0 0 0 1 3 5 1 0 0 9 0 4 5 3 4 7 34 0 1 6 1 27 0 1 0 9 11 0 22 15 5 2 7 1 2 2 6 6 2 2 3 12 21 0 1 17 27 0 0 19 0 3 3 22 1 0 0 1 1 0 0 0 1 2 7 8 1 6 0 7 0 4 4 1 1 1 1 2 6 0 2 0 1 0 0 2 1 0 0 4 5 0 1 0 0 0 0 0 2 0 0 2 0 1 1 1 0 2 0 2 "369" 10 2 0 2 6 1 3 5 0 7 8 5 0 0 0 13 5 1 14 8 4 4 0 4 2 1 4 7 7 76 0 0 2 0 2 5 1 1 0 10 2 4 10 7 2 21 40 1 0 2 0 28 2 1 4 8 7 0 16 9 6 1 8 0 3 8 13 17 4 11 4 23 31 0 4 29 23 1 1 11 0 1 3 28 2 0 0 4 0 2 0 2 4 4 12 5 0 7 1 9 1 10 11 0 0 0 1 0 8 7 1 1 5 0 0 1 1 0 2 0 6 0 0 0 2 0 0 0 0 0 0 1 0 1 3 0 0 2 0 1 "370" 6 8 5 4 1 1 0 1 0 6 5 6 0 0 0 4 11 4 19 5 6 5 0 3 0 5 0 9 8 28 1 0 2 2 2 4 1 1 1 5 0 0 2 6 10 25 7 0 3 3 1 12 1 2 0 2 6 1 28 11 11 0 3 0 4 3 5 11 1 8 3 8 6 2 0 20 48 1 4 6 2 2 1 8 2 0 0 1 0 5 1 2 1 8 12 15 6 4 1 2 9 7 1 2 0 1 0 0 9 7 1 0 2 0 2 2 0 1 2 2 2 0 2 0 0 0 0 0 0 0 1 10 3 1 1 0 1 2 1 3 "371" 16 9 8 10 4 0 0 3 0 6 10 4 0 0 2 5 1 4 9 6 8 6 0 1 4 0 2 6 4 69 0 3 1 3 10 9 3 0 0 2 0 0 1 4 6 10 9 0 4 3 0 4 4 0 4 2 5 0 24 14 11 2 8 0 13 3 5 0 1 3 3 12 10 1 19 12 35 1 5 8 0 1 0 9 4 0 0 8 0 0 4 5 1 9 11 12 5 3 1 7 6 2 7 2 2 3 0 0 11 8 4 0 0 0 6 0 0 0 6 3 9 0 0 0 0 0 0 0 0 0 0 0 8 2 0 0 5 3 0 0 "372" 14 7 5 2 4 1 10 2 0 4 6 5 3 0 15 9 7 0 17 9 2 6 0 11 4 1 0 3 13 46 0 1 2 1 8 3 1 0 1 7 0 0 2 4 4 6 10 0 3 2 0 11 0 0 4 3 2 0 13 9 2 2 6 0 5 9 8 10 2 9 1 1 7 0 17 10 31 3 5 18 1 2 0 5 2 0 0 2 5 2 3 4 2 3 17 7 3 3 10 11 1 3 10 1 0 6 0 1 7 6 2 0 11 3 4 1 0 1 4 1 12 1 6 0 0 0 0 1 2 1 0 1 1 1 3 0 3 2 0 0 "373" 16 7 10 7 6 0 1 2 0 1 2 3 2 2 8 11 2 1 19 3 1 9 0 7 6 1 3 5 10 93 1 2 0 5 6 3 1 1 2 13 1 1 1 3 7 31 5 1 2 3 1 6 1 7 3 11 0 1 15 14 3 12 4 2 6 11 13 6 0 3 0 6 12 3 20 17 37 3 1 13 3 5 0 5 4 0 4 5 2 3 4 4 2 4 13 12 19 0 4 4 1 15 8 0 4 5 1 2 10 2 1 0 1 0 5 11 0 2 1 2 20 3 2 1 0 0 1 0 0 0 0 3 3 1 4 0 3 6 0 1 "374" 12 1 3 2 10 0 0 0 0 2 2 4 0 1 1 5 2 2 4 7 4 4 0 6 1 1 1 1 5 42 0 6 1 1 18 1 1 0 0 13 2 6 0 2 4 18 6 0 5 2 3 2 0 5 1 6 2 0 9 1 1 1 3 0 4 3 8 11 3 10 0 3 3 0 2 3 8 4 2 9 1 2 1 6 5 0 0 5 0 0 1 3 1 1 9 10 6 3 3 4 9 5 20 0 2 2 2 2 7 8 1 0 2 0 4 3 0 3 4 3 11 2 1 0 0 0 0 1 6 1 2 6 4 1 5 0 3 10 0 0 "375" 2 2 2 2 6 0 3 1 0 0 2 1 0 1 0 2 0 3 1 3 3 4 0 5 0 1 3 0 4 31 0 9 1 0 2 8 1 1 5 8 0 0 1 2 6 14 8 0 1 0 0 2 0 0 2 5 2 0 8 2 6 0 5 1 3 4 0 1 0 2 1 0 1 2 16 19 16 1 6 9 4 0 0 5 0 0 3 1 0 0 0 0 0 1 14 4 3 1 1 1 4 14 5 0 0 5 2 4 4 4 1 0 3 0 5 0 6 4 3 3 13 0 5 0 1 0 0 0 1 0 0 1 1 0 3 0 0 1 2 1 "376" 6 1 7 7 1 0 2 0 0 1 2 2 1 1 0 2 1 2 0 1 0 2 0 2 2 0 3 1 4 21 0 1 1 2 3 2 0 0 4 1 0 1 3 0 1 8 8 0 0 1 0 0 0 0 1 2 1 0 2 0 3 2 1 2 1 0 2 9 0 0 0 1 1 0 4 5 7 0 0 5 2 2 0 3 0 0 0 1 0 1 0 0 0 0 4 1 2 2 1 4 5 2 1 0 0 0 1 0 1 5 1 0 1 0 0 1 0 1 1 0 4 0 3 0 1 0 0 0 0 1 0 1 0 0 4 0 0 1 0 0 "377" 4 0 1 3 2 0 0 0 0 1 1 1 0 0 0 0 0 1 2 2 1 0 0 0 1 0 1 0 1 4 0 0 0 2 0 0 0 0 1 2 0 0 0 0 2 1 3 0 0 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 1 1 3 0 1 0 0 0 0 2 9 4 0 3 1 2 1 0 2 0 0 1 0 0 1 0 0 0 0 3 0 0 0 0 1 0 0 4 0 0 0 0 0 1 2 1 0 0 0 1 0 0 0 0 1 6 0 0 0 6 0 1 0 0 0 2 0 1 0 2 0 0 1 0 0 "378" 3 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 2 0 2 0 0 0 0 1 0 0 1 1 0 5 1 1 0 2 0 1 0 0 1 0 0 0 1 0 0 1 3 0 0 0 0 1 0 0 0 3 0 0 0 0 0 1 0 0 0 1 2 3 1 0 0 0 1 1 3 3 2 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 2 0 2 1 0 0 1 0 0 1 2 0 0 2 0 0 0 0 1 0 1 6 0 2 0 0 0 1 1 0 0 0 2 1 0 0 0 0 6 0 0 "379" 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 4 1 0 0 0 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 2 0 0 0 1 1 0 "380" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 1 5 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 5 0 0 1 0 0 0 0 0 2 0 2 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 "381" 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 "382" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "383" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "384" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "385" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "386" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "387" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "388" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "389" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "390" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "391" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "392" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "393" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "394" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "395" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "396" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "397" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "398" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "399" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "400" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 "401" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "402" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "403" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "404" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "405" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "406" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "407" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "408" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "409" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "410" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "411" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "412" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "413" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 35 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 3 0 0 0 0 0 2 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "414" 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 1 1 5 1 0 0 0 0 0 0 1 0 0 1 0 0 0 2 0 1 0 0 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 "415" 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 1 0 0 0 0 37 1 0 0 1 0 0 0 0 0 0 2 1 1 1 0 4 3 0 0 0 0 2 1 0 1 0 1 0 2 3 0 0 0 1 2 3 0 2 0 0 0 0 1 0 0 2 5 0 0 6 0 0 0 6 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "416" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 15 0 0 0 1 0 0 0 0 0 2 0 0 3 1 0 2 5 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 4 0 0 1 2 0 0 0 0 0 0 4 1 0 0 0 1 0 0 0 1 0 3 1 0 0 0 5 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "417" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 surveillance/tests/population_2001-12-31_ByBw.txt0000755000176000001440000001527511765400003021132 0ustar ripleyusers"name" "id" "popFrac" "pop31.12.2001" "LK Loerrach" 8336 0.00955704642962118 219149 "LK Waldshut" 8337 0.00724420011321107 166114 "LK Breisgau Hochschwarzwald" 8315 0.0105990592491612 243043 "SK Freiburg i. Breisgau" 8311 0.0090836619332578 208294 "SK Passau" 9262 0.00220966550402911 50669 "LK Berchtesgadener Land" 9172 0.00438828082276013 100626 "SK Rosenheim" 9163 0.0025864978792549 59310 "LK Lindau" 9776 0.00339502377170787 77850 "SK Kempten" 9763 0.00268222141398706 61505 "LK Bodenseekreis" 8435 0.00876330426303345 200948 "LK Konstanz" 8335 0.0117248901250817 268859 "LK Tuttlingen" 8327 0.00583787093414831 133866 "LK Schwarzwald Baar Kreis" 8326 0.00921566883058548 211321 "LK Emmendingen" 8316 0.0066702513931154 152953 "LK Rottweil" 8325 0.00618217039050841 141761 "LK Passau" 9275 0.00817051610466703 187355 "LK Traunstein" 9189 0.0073625135299438 168827 "LK Altoetting" 9171 0.00475447240414782 109023 "LK Rosenheim" 9187 0.0104709772348066 240106 "LK Miesbach" 9182 0.0040435016584811 92720 "LK Bad Toelz Wolfratshausen" 9173 0.00512048954629225 117416 "LK Ebersberg" 9175 0.00525131897872801 120416 "SK Memmingen" 9764 0.00179240683418067 41101 "LK Ravensburg" 8436 0.0117995937310025 270572 "LK Oberallgaeu" 9780 0.00646798909056973 148315 "SK Kaufbeuren" 9762 0.00184234006756032 42246 "LK Garmisch Partenkirchen" 9180 0.00381184634344819 87408 "LK Weilheim Schongau" 9190 0.00560573591119647 128543 "LK Starnberg" 9188 0.00552047873105917 126588 "SK Muenchen" 9162 0.0535510160649821 1227958 "LK Neu Ulm" 9775 0.00702597661990823 161110 "SK Ulm" 8421 0.00516109028015815 118347 "LK Sigmaringen" 8437 0.00582936702103999 133671 "LK Biberach" 8426 0.00804810336571798 184548 "LK Zollernalbkreis" 8417 0.00842524100961945 193196 "LK Ortenaukreis" 8317 0.0179450446608073 411491 "LK Freudenstadt" 8237 0.0053065289992159 121682 "SK Baden Baden" 8211 0.00231498319713989 53084 "LK Freyung Grafenau" 9272 0.00360012071195633 82553 "LK Deggendorf" 9271 0.00508307232861562 116558 "SK Straubing" 9263 0.00193261237594099 44316 "LK Dingolfing Landau" 9279 0.0039779997226416 91218 "LK Rottal Inn" 9277 0.0051942337363752 119107 "SK Landshut" 9261 0.00259535067084972 59513 "LK Muehldorf a. Inn" 9183 0.00478543536982428 109733 "LK Muenchen" 9184 0.0130778408957106 299883 "LK Erding" 9177 0.005143733575455 117949 "LK Unterallgaeu" 9778 0.00588383567474408 134920 "LK Ostallgaeu" 9777 0.00577345924357911 132389 "SK Augsburg" 9761 0.0112441791805019 257836 "LK Landsberg a. Lech" 9181 0.00469280813165976 107609 "LK Fuerstenfeldbruck" 9179 0.00854181003391971 195869 "LK Dachau" 9174 0.00572793060109147 131345 "LK Guenzburg" 9774 0.00532536843748664 122114 "LK Alb Donau Kreis" 8425 0.0081550346218288 187000 "LK Tuebingen" 8416 0.00920419945034194 211058 "LK Reutlingen" 8415 0.012174856153039 279177 "SK Pforzheim" 8231 0.00514604489542803 118002 "LK Boeblingen" 8115 0.0160409967109481 367830 "LK Calw" 8235 0.00698258485815037 160115 "LK Rastatt" 8216 0.00978207305341068 224309 "SK Karlsruhe" 8212 0.0121923436871746 279578 "LK Regen" 9276 0.00360744716017273 82721 "SK Regensburg" 9362 0.00554708071565444 127198 "LK Straubing Bogen" 9278 0.00418806818132262 96035 "LK Landshut" 9274 0.0063017921015655 144504 "LK Freising" 9178 0.00677679016092892 155396 "LK Pfaffenhofen.a.d.Ilm" 9186 0.00493274931074694 113111 "SK Ingolstadt" 9161 0.005115910516157 117311 "LK Dillingen a. d. Donau" 9773 0.00411829248402355 94435 "LK Augsburg" 9772 0.0104025098318318 238536 "LK Aichach Friedberg" 9771 0.0054294650558947 124501 "LK Neuburg Schrobenhausen" 9185 0.00393465157069456 90224 "LK Heidenheim" 8135 0.00597694262082752 137055 "LK Goeppingen" 8117 0.0112361113655017 257651 "LK Esslingen" 8116 0.022037781795695 505340 "SK Stuttgart" 8111 0.0256055876378397 587152 "LK Enzkreis" 8236 0.00845476485153912 193873 "SK Heilbronn" 8121 0.00524028569659259 120163 "LK Ludwigsburg" 8118 0.0219457214850711 503229 "SK Heidelberg" 8221 0.00617118071818381 141509 "LK Karlsruhe" 8215 0.0184448567025227 422952 "SK Schwabach" 9565 0.00167976269285349 38518 "LK Cham" 9372 0.00573102689765911 131416 "LK Regensburg" 9375 0.00776668925654867 178095 "LK Kelheim" 9273 0.0048371129956364 110918 "LK Eichstaett" 9176 0.00527813901237734 121031 "SK Fuerth" 9563 0.00485189672150164 111257 "SK Erlangen" 9562 0.00444436303946426 101912 "LK Donau Ries" 9779 0.00568388469217143 130335 "LK Weissenburg Gunzenhausen" 9577 0.00415060735383518 95176 "LK Fuerth" 9573 0.00495102182147713 113530 "SK Ansbach" 9561 0.00176235967453126 40412 "LK Ostalbkreis" 8136 0.0137521357904845 315345 "LK Rems Murr Kreis" 8119 0.0180090638630791 412959 "LK Heilbronn" 8125 0.0141314539249266 324043 "LK Rhein Neckar Kreis" 8226 0.0230170837072875 527796 "SK Mannheim" 8222 0.0134486115072336 308385 "LK Roth" 9576 0.0054496127884898 124963 "SK Nuernberg" 9564 0.0214258053205714 491307 "SK Weiden i. d. OPf." 9363 0.00187831816148015 43071 "LK Schwandorf" 9376 0.00629594838691671 144370 "LK Neumarkt i. d. OPf." 9373 0.005552052234087 127312 "SK Amberg" 9361 0.00192829500467061 44217 "LK Erlangen Hoechstadt" 9572 0.00565841656265727 129751 "SK Bamberg" 9461 0.00302634643110391 69396 "SK Wuerzburg" 9663 0.00566556857163042 129915 "LK Neustadt/Aisch Bad Windsheim" 9575 0.00432417440086661 99156 "LK Ansbach" 9571 0.00800972673220349 183668 "LK Schwaebisch Hall" 8127 0.00815359549807201 186967 "LK Hohenlohekreis" 8126 0.00474998059363419 108920 "LK Neckar Odenwald Kreis" 8225 0.0065454401145717 150091 "LK Kitzingen" 9675 0.00388580858258521 89104 "SK Schweinfurt" 9662 0.00237970015638478 54568 "LK Nuernberger Land" 9574 0.00735666981529501 168693 "LK Forchheim" 9474 0.00492084383239529 112838 "SK Bayreuth" 9462 0.00324975949189337 74519 "LK Tirschenreuth" 9377 0.00348023734203436 79804 "LK Neustadt a. d. Waldnaab" 9374 0.0044064661138687 101043 "LK Amberg Sulzbach" 9371 0.00475708899279653 109083 "LK Bamberg" 9471 0.00624086919586125 143107 "SK Coburg" 9463 0.0018664126831285 42798 "LK Wuerzburg" 9679 0.00694752257025759 159311 "LK Main Tauber Kreis" 8128 0.00599669786512532 137508 "LK Miltenberg" 9676 0.00572897723655095 131369 "SK Aschaffenburg" 9661 0.00298121027691358 68361 "LK Schweinfurt" 9678 0.00509685302883219 116874 "LK Wunsiedel i. Fichtelgebirge" 9479 0.00371895744641881 85278 "LK Bayreuth" 9472 0.00476432822139131 109249 "SK Hof" 9464 0.00220901135686693 50654 "LK Lichtenfels" 9478 0.00309080173148393 70874 "LK Kulmbach" 9477 0.00343095825581689 78674 "LK Hassberge" 9674 0.00385563059350336 88412 "LK Coburg" 9473 0.0040207809470481 92199 "LK Main Spessart" 9677 0.00576547864820053 132206 "LK Aschaffenburg" 9671 0.00761326994211234 174577 "LK Rhoen Grabfeld" 9673 0.00378171196417716 86717 "LK Bad Kissingen" 9672 0.00477518706428348 109498 "LK Hof" 9475 0.00474230526693129 108744 "LK Kronach" 9476 0.00329070910424576 75458 surveillance/tests/doRUnit.R0000644000176000001440000000415211731650466015662 0ustar ripleyusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE) & require("digest", quietly=TRUE)) { ## --- Setup --- pkg <- "surveillance" # <-- Change to package name! if(Sys.getenv("RCMDCHECK") == "FALSE") { ## Path to unit tests for standalone running under Makefile (not R CMD check) ## PKG/tests/../inst/unitTests path <- file.path(getwd(), "..", "inst", "unitTests") } else { ## Path to unit tests for R CMD check ## PKG.Rcheck/tests/../PKG/unitTests path <- system.file(package=pkg, "unitTests") } cat("\nRunning unit tests\n") print(list(pkg=pkg, getwd=getwd(), pathToUnitTests=path)) library(package=pkg, character.only=TRUE) ## If desired, load the name space to allow testing of private functions ## if (is.element(pkg, loadedNamespaces())) ## attach(loadNamespace(pkg), name=paste("namespace", pkg, sep=":"), pos=3) ## ## or simply call PKG:::myPrivateFunction() in tests ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path) ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(path, "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit or digest is not available") } surveillance/tests/test-siafs.R0000644000176000001440000000121212200711662016336 0ustar ripleyuserslibrary("surveillance") ### check siaf derivatives and Fcircle testsiaf <- function (siaf, pargrid, type=1) { ints <- surveillance:::checksiaf.Fcircle( siaf$Fcircle, siaf$f, pargrid, type=type, rs=c(1,5,10,50,100), nGQ=15) stopifnot(isTRUE(all.equal(ints[,1], ints[,2], tolerance=0.005))) maxRelDiffs_deriv <- surveillance:::checksiaf.deriv( siaf$deriv, siaf$f, pargrid, type=type) stopifnot(maxRelDiffs_deriv < 0.0001) } ### Gaussian kernel testsiaf(siaf.gaussian(1, F.adaptive=TRUE), as.matrix(c(1,3,6))) ### Power law kernels testsiaf(siaf.powerlaw(), t(c(-1.5, 0.5))) testsiaf(siaf.powerlawL(), t(c(-1, 0.4))) surveillance/tests/test-nbOrder.R0000644000176000001440000000114012144012767016633 0ustar ripleyuserslibrary("surveillance") ## library("testthat") ## context("cross-checking neighbourhood order functions") ## generate random adjancency matrix set.seed(1) n <- 6 adjmat <- matrix(0, n, n, dimnames=list(letters[1:n],letters[1:n])) adjmat[lower.tri(adjmat)] <- sample(0:1, n*(n-1)/2, replace=TRUE) adjmat <- adjmat + t(adjmat) ## test_that("zetaweights(.,maxlag=1,normalize=FALSE) is inverse of nbOrder", { nbmat <- nbOrder(adjmat, maxlag=Inf) adjmat2 <- zetaweights(nbmat, maxlag=1, normalize=FALSE) ## expect_that(adjmat2, is_identical_to(adjmat)) ## }) stopifnot(identical(adjmat, adjmat2)) surveillance/tests/neighourhood_ByBw.txt0000755000176000001440000012031011765400003020312 0ustar ripleyusers"8336" "8337" "8315" "8311" "9262" "9172" "9163" "9776" "9763" "8435" "8335" "8327" "8326" "8316" "8325" "9275" "9189" "9171" "9187" "9182" "9173" "9175" "9764" "8436" "9780" "9762" "9180" "9190" "9188" "9162" "9775" "8421" "8437" "8426" "8417" "8317" "8237" "8211" "9272" "9271" "9263" "9279" "9277" "9261" "9183" "9184" "9177" "9778" "9777" "9761" "9181" "9179" "9174" "9774" "8425" "8416" "8415" "8231" "8115" "8235" "8216" "8212" "9276" "9362" "9278" "9274" "9178" "9186" "9161" "9773" "9772" "9771" "9185" "8135" "8117" "8116" "8111" "8236" "8121" "8118" "8221" "8215" "9565" "9372" "9375" "9273" "9176" "9563" "9562" "9779" "9577" "9573" "9561" "8136" "8119" "8125" "8226" "8222" "9576" "9564" "9363" "9376" "9373" "9361" "9572" "9461" "9663" "9575" "9571" "8127" "8126" "8225" "9675" "9662" "9574" "9474" "9462" "9377" "9374" "9371" "9471" "9463" "9679" "8128" "9676" "9661" "9678" "9479" "9472" "9464" "9478" "9477" "9674" "9473" "9677" "9671" "9673" "9672" "9475" "9476" "8336" 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8337" 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8315" 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8311" 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9262" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9172" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9163" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9776" 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9763" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8435" 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8335" 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8327" 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8326" 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8316" 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8325" 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9275" 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9189" 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9171" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9187" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9182" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9173" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9175" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9764" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8436" 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9780" 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9762" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9180" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9190" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9188" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9162" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9775" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8421" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8437" 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8426" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8417" 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8317" 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8237" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8211" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9272" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9271" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9263" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9279" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9277" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9261" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9183" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9184" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9177" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9778" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9777" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9761" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9181" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9179" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9174" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9774" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8425" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8416" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8415" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8231" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8115" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8235" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8216" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8212" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9276" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9362" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9278" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9274" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9178" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9186" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9161" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9773" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9772" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9771" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9185" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8135" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8117" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8116" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8111" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8236" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8121" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8118" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8221" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8215" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9565" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9372" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9375" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9273" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9176" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9563" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9562" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9779" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9577" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9573" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9561" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8136" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8119" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8125" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8226" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8222" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9576" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9564" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9363" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9376" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9373" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9361" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9572" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9461" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9663" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9575" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9571" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8127" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8126" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "8225" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "9675" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9662" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "9574" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9474" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9462" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9377" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 "9374" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9371" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 "9471" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 "9463" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 "9679" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 "8128" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "9676" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 "9661" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 "9678" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 "9479" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 "9472" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 "9464" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 "9478" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 "9477" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 "9674" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 "9473" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 "9677" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 "9671" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 "9673" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 "9672" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 "9475" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 "9476" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 surveillance/src/0000755000176000001440000000000012242645665013601 5ustar ripleyuserssurveillance/src/Makevars0000755000176000001440000000030111731650465015266 0ustar ripleyusers## Emacs please make this a -*- mode: Makefile; -*- ## ## Use the R_HOME indirection to support installations of multiple R version PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()" ` surveillance/src/stcd-assuncaocorrea.cc0000644000176000001440000002424112242645665020056 0ustar ripleyusers/** * File based on algoritmos.cpp and sv.cpp from the TerraView plugin. * C++ source originally created by Marcos Oliveira Prates on 06 April 2006 * * R interface by Michael Höhle initiated on 12 Jan 2009 */ #include "stcd-assuncaocorrea.h" #include #include using namespace std; // Calculate the number of events in the cylinder B( (xk,yk), rho) // (i.e. represented by the boolean matrix MSpace) between event times // (tj,ti] // // Params: // MSpace - contains for each pair of points is geographically // B( (xi,yi), rho) // EvtN - The last event, i.e. t_i // EvtJ - The first event, i.e. t_j int CalculaNCj(short **MSpace, const int EvtN, const int EvtJ) { int i; int Soma=0; for (i=EvtJ;i<=EvtN;i++) Soma += MSpace[EvtJ][i]; return(Soma); } // Calculate the number of events in the cylinder B( (xj,yj), rho) // (i.e. represented by the boolean matrix MSpace) between event times // (0,t_n] int ContaEvt(short **MSpace, const int EvtN, const int EvtJ) { int i; int Soma=0; for (i=0;i<=EvtN;i++) Soma += MSpace[EvtJ][i]; return(Soma); } ////////////////////////////////////////////////////////////////////// // Comment: Unfortunately, this function has not been commented in the // TerraView and hence it has been a bit difficult to document its exact // use. // // Params: // ev - a list of the events // RaioC - radius of the cylinder // epslon - relative change \lambda(s,t)(1+epsilon*I_{C_k}(s,t)) // areaA - area of the observation window A (also denoted W) // areaAcapBk - area of A \ B(s_k,\rho) for all k=1,\ldots,n // cusum - return Shiryaev-Roberts (FALSE) or CUSUM (TRUE) test // statistic // R - array of length ev where the computed values of R_n are // to be returned in. ////////////////////////////////////////////////////////////////////// int SistemadeVigilancia(SVEventLst &ev, const double RaioC, const double epslon, const double areaA, double *areaAcapBk, const int cusum, std::valarray &R) { size_t i, j, NCj, NumTotEvt, NumEvtCil; short **MSpace; double pontox, pontoy, DistEucl, Soma, UCj, fator; //order the event list ev.sort(); SVEventLst::size_type n_event = ev.size(); //create the spatio matrix MSpace = new short* [n_event]; if( MSpace == NULL ) return 1; for( i = 0; i < n_event; i++ ) { MSpace[i] = new short[n_event]; if( MSpace[i] == NULL ) { delete []MSpace; return 1; } } //create the output vector R.resize(n_event); if( R.size() != n_event ) { for( i = 0; i < n_event; i++ ) { delete []MSpace[i]; } delete []MSpace; return 1; } //Populate the spatio matrix with 1's if within radius rho in space //and 0 if not i = 0; for( SVEventLst::iterator it = ev.begin(); it != ev.end(); ++it, i++ ) { j = 0; for( SVEventLst::iterator jt = ev.begin(); jt != ev.end(); ++jt, j++ ) { pontox = (*it).x-(*jt).x; pontoy = (*it).y-(*jt).y; DistEucl = sqrt((pontox*pontox)+(pontoy*pontoy)); if((DistEucl < RaioC)) MSpace[i][j]=1; else MSpace[i][j]=0; } } ////////////////////////////////////////////////////////////////////// //Sequentually, for n=1,2,3,... compute the value of R_n by //by summing up all contributions of Lambda_{k,n} to form R_n, i.e. // \sum_{k=1}^n \Lambda_{k,n} ////////////////////////////////////////////////////////////////////// double LambdaMax = 0, Lambda; SVEventLst::iterator it2, jt2, ev0; //Loop over all n for( i = 0; i < n_event; i++ ) { Soma = 0.0; //Loop over 1<= k <= n (in code k is called j and n is i) for( j = 0; j <= i; j++ ) { //N(C_{k,n}) NCj = CalculaNCj(MSpace,i,j); //N(B(s_k, \rho) \times (0,t_n]) NumTotEvt = ContaEvt(MSpace,i,j); //N(A \times (t_k,t_n) ) = n-k+1 NumEvtCil = i-j+1; UCj = ((double)NumEvtCil*(double)NumTotEvt)/(double)(i+1); fator = 1.0+epslon; Lambda = pow(fator,(double)NCj) * exp((-epslon)*UCj); /* //Alternative estimation having the desired property for \rho->\infty // N( A \times (0,t_k] \cup (A\times (t_k,t_n) \backslash C_{k,n}) ) // \nu( A \times (0,t_k] \cup (A\times (t_k,t_n) \backslash C_{k,n}) ) double iCount=0; double jCount=0; ev0 = ev.begin(); for( it2 = ev.begin(); iCount < i ; ++it2, iCount++ ); for( jt2 = ev.begin(); jCount < j ; ++jt2, jCount++ ); double NNoCkn = ((j-1) + (NumEvtCil - NCj)); double volCkn = areaAcapBk[j] * ((*it2).t - (*jt2).t); double volNoCkn = areaA * ((*it2).t - (*ev0).t) - volCkn; UCj = (NNoCkn / volNoCkn) * volCkn; // Debug // cout << "----> k=" << j << " n= " << i << endl; // cout << "t_k=" << (*jt2).t << endl; // cout << "t_n=" << (*it2).t << endl; // cout << "N(C_{k,n}) = NCj; // cout << "N(W\\times(0,t_n) \\backslash C_{k,n}))=" << NNoCkn << endl; // cout << "vol(C_{k,n}))=" << volCkn << endl; // cout << "vol(W\\times(0,t_n) \backslash C_{k,n})=" << volNoCkn << endl; //// cout << "mu(C_{k,n})=" << UCj << endl; //Lambda = pow(fator,(double)NCj) * exp((-epslon)*UCj); */ //Summation for the Shiryaev-Roberts statistics Soma += Lambda; //Find maximum k of \Lambda_{k,n} for the CUSUM statistics if (Lambda> LambdaMax) { LambdaMax = Lambda; } } //Depending on the summation scheme compute the statistic. if (cusum) { R[i] = LambdaMax; } else { R[i] = Soma; } } //clean memory for( i = 0; i < n_event; i++ ) { delete [] MSpace[i]; } delete [] MSpace; return 0; } int CalculaLambda(SVEventLst &ev, const double RaioC, const double epslon, std::valarray &R, unsigned int &numObs) { size_t i, j, NCj, NumTotEvt, NumEvtCil; short **MSpace; double pontox, pontoy, DistEucl, UCj, fator, lambda, lambdaMax; ev.sort(); SVEventLst::size_type n_event = ev.size(); //create the spatio matrix MSpace = new short* [n_event]; if( MSpace == NULL ) return 1; for( i = 0; i < n_event; i++ ) { MSpace[i] = new short[n_event]; if( MSpace[i] == NULL ) { delete []MSpace; return 1; } } //create the output vector R.resize(n_event); if( R.size() != n_event ) { for( i = 0; i < n_event; i++ ) { delete []MSpace[i]; } delete []MSpace; return 1; } //populate the spatio matrix with 1 if is close in spatio and 0 if not i = 0; for( SVEventLst::iterator it = ev.begin(); it != ev.end(); ++it, i++ ) { j = 0; for( SVEventLst::iterator jt = ev.begin(); jt != ev.end(); ++jt, j++ ) { pontox = (*it).x-(*jt).x; pontoy = (*it).y-(*jt).y; DistEucl = sqrt((pontox*pontox)+(pontoy*pontoy)); if((DistEucl < RaioC)) MSpace[i][j]=1; else MSpace[i][j]=0; } } //do the calculus to find the output value of each event i = numObs; lambdaMax = 0; for( j = 0; j <= i; j++ ) { NCj = CalculaNCj(MSpace,i,j); NumTotEvt = ContaEvt(MSpace,i,j); NumEvtCil = i-j+1; UCj = ((double)NumEvtCil*(double)NumTotEvt)/(double)(i+1); fator = 1.0+epslon; lambda = (pow(fator,(double)NCj) * exp((-epslon)*UCj)); if (lambda > lambdaMax){ lambdaMax = lambda; numObs = j; } } //clean memory for( i = 0; i < n_event; i++ ) { delete [] MSpace[i]; } delete [] MSpace; return 0; } ////////////////////////////////////////////////////////////////////// // Shiryaev-Roberts space time detection as explained in the paper // by Correa and Assuncao (2009). // // Params: // x - array with x location of events // y - array with y location of events // t - array with time point of the events (on some arbitrary time scale) // n - number of elements in x, y and t (the same for the three vectors) // radius - cluster of the radius // epsilon - relative ratio of the intensity functions to detect for // areaA - area of the observation region (also denoted W) // areaAcapBk - area of A \ B(s_k,\rho) for all k=1,\ldots,n // threshold -- upper threshold when to sound the alarm // Rarray -- array of length n, this will contain the statistics calced // by the function // idxFirstAlarm -- index in the x,y,t vector resulting in the alarm // idxClusterCenter -- index in the x,y,t vector containing the cluster // center ////////////////////////////////////////////////////////////////////// extern "C" { void SRspacetime(double *x, double *y, double *t, int *n, double *radius, double *epsilon, double *areaA, double *areaAcapBk, int *cusum, double *threshold, double *Rarray, int *idxFirstAlarm, int *idxClusterCenter) { //Create SVEventLst SVEvent e; SVEventLst eList; unsigned int i; int j; //Fill coordinates of event list for(j=0;j<*n;j++){ e.x = x[j]; e.y = y[j]; e.t = t[j]; eList.push_back(e); } //Array of test statistic values std::valarray R; //Call SistemadeVigilancia, this calculates the SR statistics R_n SistemadeVigilancia(eList,*radius,*epsilon,*areaA,areaAcapBk,*cusum, R); //Debug purposes //cout << "Size of R = " << R.size() << endl; //Move values of test statistic for return for(i=0;i*threshold){ controle = true; break; } } //Advancing the iterator "it" to the point //where the alarm is generated. if (controle) { unsigned int cont = 0; SVEventLst::iterator it = eList.begin(); while((cont < i) && (it != eList.end())){ ++it; ++cont; } *idxFirstAlarm = cont; //Determine the cluster center of the alarm unsigned int num = cont; CalculaLambda(eList,*radius,*epsilon,R,num); //Index of the cluster center *idxClusterCenter = num; } else { //If no alarms, then return -1 for both alarm idx and cluster center idx *idxFirstAlarm = -2; *idxClusterCenter = -2; } //Clean up (nothing to clean) and done } } surveillance/src/ks.c0000755000176000001440000001431612242645665014372 0ustar ripleyusers/* * 16-Aug 2012 / (C) Michael Hoehle * This file is a modified version of the code ks.c available * at http://svn.r-project.org/R/trunk/src/library/stats/src/ks.c * The file is copyright 1995-2009 by The R Core Team under GPL-2 * (or later) as shown below. As stated in the GPL-2 license * the present file is again availbale under GPL-2. * * License: * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * http://www.r-project.org/Licenses/ */ /* ks.c Compute the asymptotic distribution of the one- and two-sample two-sided Kolmogorov-Smirnov statistics, and the exact distributions in the two-sided one-sample and two-sample cases. */ #include #include /* constants */ /*#include "ctest.h"*/ static double K(int n, double d); static void m_multiply(double *A, double *B, double *C, int m); static void m_power(double *A, int eA, double *V, int *eV, int m, int n); /* Two-sample two-sided asymptotic distribution */ void pkstwo(Sint *n, double *x, double *tol) { /* x[1:n] is input and output * * Compute * \sum_{k=-\infty}^\infty (-1)^k e^{-2 k^2 x^2} * = 1 + 2 \sum_{k=1}^\infty (-1)^k e^{-2 k^2 x^2} * = \frac{\sqrt{2\pi}}{x} \sum_{k=1}^\infty \exp(-(2k-1)^2\pi^2/(8x^2)) * * See e.g. J. Durbin (1973), Distribution Theory for Tests Based on the * Sample Distribution Function. SIAM. * * The 'standard' series expansion obviously cannot be used close to 0; * we use the alternative series for x < 1, and a rather crude estimate * of the series remainder term in this case, in particular using that * ue^(-lu^2) \le e^(-lu^2 + u) \le e^(-(l-1)u^2 - u^2+u) \le e^(-(l-1)) * provided that u and l are >= 1. * * (But note that for reasonable tolerances, one could simply take 0 as * the value for x < 0.2, and use the standard expansion otherwise.) * */ double new, old, s, w, z; Sint i, k, k_max; k_max = (Sint) sqrt(2 - log(*tol)); for(i = 0; i < *n; i++) { if(x[i] < 1) { z = - (M_PI_2 * M_PI_4) / (x[i] * x[i]); w = log(x[i]); s = 0; for(k = 1; k < k_max; k += 2) { s += exp(k * k * z - w); } x[i] = s / M_1_SQRT_2PI; } else { z = -2 * x[i] * x[i]; s = -1; k = 1; old = 0; new = 1; while(fabs(old - new) > *tol) { old = new; new += 2 * s * exp(z * k * k); s *= -1; k++; } x[i] = new; } } } /* Two-sided two-sample */ void psmirnov2x(double *x, Sint *m, Sint *n) { double md, nd, q, *u, w; Sint i, j; if(*m > *n) { i = *n; *n = *m; *m = i; } md = (double) (*m); nd = (double) (*n); /* q has 0.5/mn added to ensure that rounding error doesn't turn an equality into an inequality, eg abs(1/2-4/5)>3/10 */ q = (0.5 + floor(*x * md * nd - 1e-7)) / (md * nd); u = (double *) R_alloc(*n + 1, sizeof(double)); for(j = 0; j <= *n; j++) { u[j] = ((j / nd) > q) ? 0 : 1; } for(i = 1; i <= *m; i++) { w = (double)(i) / ((double)(i + *n)); if((i / md) > q) u[0] = 0; else u[0] = w * u[0]; for(j = 1; j <= *n; j++) { if(fabs(i / md - j / nd) > q) u[j] = 0; else u[j] = w * u[j] + u[j - 1]; } } *x = u[*n]; } /* The two-sided one-sample 'exact' distribution */ void pkolmogorov2x(double *x, Sint *n) { /* x is input and output. */ *x = K(*n, *x); } static double K(int n, double d) { /* Compute Kolmogorov's distribution. Code published in George Marsaglia and Wai Wan Tsang and Jingbo Wang (2003), "Evaluating Kolmogorov's distribution". Journal of Statistical Software, Volume 8, 2003, Issue 18. URL: http://www.jstatsoft.org/v08/i18/. */ int k, m, i, j, g, eH, eQ; double h, s, *H, *Q; /* The faster right-tail approximation is omitted here. s = d*d*n; if(s > 7.24 || (s > 3.76 && n > 99)) return 1-2*exp(-(2.000071+.331/sqrt(n)+1.409/n)*s); */ k = (int) (n * d) + 1; m = 2 * k - 1; h = k - n * d; H = (double*) Calloc(m * m, double); Q = (double*) Calloc(m * m, double); for(i = 0; i < m; i++) for(j = 0; j < m; j++) if(i - j + 1 < 0) H[i * m + j] = 0; else H[i * m + j] = 1; for(i = 0; i < m; i++) { H[i * m] -= pow(h, i + 1); H[(m - 1) * m + i] -= pow(h, (m - i)); } H[(m - 1) * m] += ((2 * h - 1 > 0) ? pow(2 * h - 1, m) : 0); for(i = 0; i < m; i++) for(j=0; j < m; j++) if(i - j + 1 > 0) for(g = 1; g <= i - j + 1; g++) H[i * m + j] /= g; eH = 0; m_power(H, eH, Q, &eQ, m, n); s = Q[(k - 1) * m + k - 1]; for(i = 1; i <= n; i++) { s = s * i / n; if(s < 1e-140) { s *= 1e140; eQ -= 140; } } s *= pow(10., eQ); Free(H); Free(Q); return(s); } static void m_multiply(double *A, double *B, double *C, int m) { /* Auxiliary routine used by K(). Matrix multiplication. */ int i, j, k; double s; for(i = 0; i < m; i++) for(j = 0; j < m; j++) { s = 0.; for(k = 0; k < m; k++) s+= A[i * m + k] * B[k * m + j]; C[i * m + j] = s; } } static void m_power(double *A, int eA, double *V, int *eV, int m, int n) { /* Auxiliary routine used by K(). Matrix power. */ double *B; int eB , i; if(n == 1) { for(i = 0; i < m * m; i++) V[i] = A[i]; *eV = eA; return; } m_power(A, eA, V, eV, m, n / 2); B = (double*) Calloc(m * m, double); m_multiply(V, V, B, m); eB = 2 * (*eV); if((n % 2) == 0) { for(i = 0; i < m * m; i++) V[i] = B[i]; *eV = eB; } else { m_multiply(A, B, V, m); *eV = eA + eB; } if(V[(m / 2) * m + (m / 2)] > 1e140) { for(i = 0; i < m * m; i++) V[i] = V[i] * 1e-140; *eV += 140; } Free(B); } surveillance/src/twins.cc0000644000176000001440000025036112242645665015263 0ustar ripleyusers/******************************************************************* * Author: Mathias Hofmann * Michael Hoehle * Volker Schmid * Daniel Sabanes Bove * History: * March 2012 (DSB) -- changed long types to int to be in accordance with R * (we observed bad allocations in 64 bit machines) * May 2010 (DSB) -- modified from Oct 2008 * * Markov Chain Monte Carlo (MCMC) estimation in the Branching Process * like Epidemic Model. Instead of a slow R solution this code * provides a faster C++ solution. Can be invoked through R or be * programmed as a librrary. This code uses the Gnu Scientific Library * (GSL) available from http://sources.redhat.com/gsl/ * * For now this code is quick & dirty. A more OO framework would be nice * to enable better programming, but this will probably be speedwise slower. *******************************************************************/ #include #include /*New C++ uses header iostream (without the .h) followed by a namespace*/ using namespace std; #include /* Replaced calls to GSL with functions from the R API */ #include #include /*wrappers to what used to be GSL functions*/ #include "gsl_wrappers.h" // Dynamic_2d_array class by David Maisonave (609-345-1007) (www.axter.com) // Description: // The dynamic array class listed below is more efficient then other // similar classes that use temporary objects as return types, or use // an std::vector as a return type. // // It's also more compatible with a C style 2D array, in that the // array is in one continuous memory block. This makes it possible // to pass this array object to a C Function that has a C-Style // 2D array for a parameter. // Example usage: /* Dynamic_2d_array MyIntArray(12, 34); MyIntArray[0][1] = 123; cout << MyIntArray[0][1] << endl; */ template < class T > class Dynamic_2d_array { public: // constructor Dynamic_2d_array(size_t row, size_t col) : m_row(row), m_col(col), m_data((row!=0 && col!=0) ? new T[row*col] : NULL) {} // copy ctr Dynamic_2d_array(const Dynamic_2d_array& src) : m_row(src.m_row), m_col(src.m_col), m_data((src.m_row!=0 && src.m_col!=0) ? new T[src.m_row*src.m_col] : NULL) { for(size_t r=0; r LongMatrix; typedef Dynamic_2d_array DoubleMatrix; typedef Dynamic_2d_array IntMatrix; // Analogous class for vectors (== 1D arrays) template < class T > class Dynamic_1d_array { public: // constructor Dynamic_1d_array(size_t length) : m_length(length), m_data((length !=0) ? new T[length] : NULL) {} // copy ctr Dynamic_1d_array(const Dynamic_1d_array& src) : m_length(src.m_length), m_data((src.m_length!=0) ? new T[src.m_length] : NULL) { for(size_t i=0; i LongVector; typedef Dynamic_1d_array DoubleVector; typedef Dynamic_1d_array IntVector; /************************************ Globals *************************************/ /*Setup params*/ int overdispersion; int varnu; int la_rev; int K_geom; int la_estim; int nu_trend; int theta_pred_estim; int xi_estim; int delta_rev; int xi_estim_delta; int epsilon_rev; int xi_estim_epsilon; int xi_estim_psi; double psiRWSigma = 0.25; double xRWSigma = 0.25; double taubetaRWSigma = 0.25; /*Priors*/ double alpha_lambda = 1.0; double beta_lambda = 1.0; double alpha_xi = 1.0; double beta_xi = 1.0; double p_K = 1.0; double alpha_nu = 1.0; double beta_nu = 1.0; double alpha_psi = 1.0; double beta_psi = 10.0; double alpha_a=1; double alpha_b=0.001; double beta_a=1.0; double beta_b=.00001; double gamma_a=1; double gamma_b=0.001; double delta_a=1; double delta_b=0.001; double epsilon_a=1; double epsilon_b=0.001; /********************************************************************* * Compute sum from 1 to I and 1 to n of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumIn(const LongMatrix& X, int I, int n) { double res = 0; for (register int i=1; i<=I; i++){ for (register int t=1; t<=n; t++) { res += X[i][t]; } } return(res); } /********************************************************************* * Compute sum from 1 to I and 1 to n of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * This is the double version * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumIn(const DoubleMatrix& X, int I, int n) { double res = 0; for (register int i=1; i<=I; i++){ for (register int t=1; t<=n; t++) { res += X[i][t]; } } return(res); } /********************************************************************* * Compute sum from 1 to I and 1 to n of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumIn2(const LongMatrix& X, int I, int n) { double res = 0; for (register int i=1; i<=I; i++){ for (register int t=2; t<=n; t++) { res += X[i][t]; } } return(res); } /********************************************************************* * Compute sum from 1 to I and 1 to n of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * This is the double version * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumIn2(const DoubleMatrix& X, int I, int n) { double res = 0; for (register int i=1; i<=I; i++){ for (register int t=2; t<=n; t++) { res += X[i][t]; } } return(res); } /********************************************************************* * Compute sum from 1 to I of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumI1(const LongMatrix& X, int I, int t) { double res = 0; for (register int i=1; i<=I; i++) { res += X[i][t]; } return(res); } /********************************************************************* * Compute sum from 1 to I of a vektor with indices 0,...,I * of a vektor with indices 0,...,n * This is the double version * Parameters: * * X a vector with indices 0,..,I of a vector with indices 0,...,n * I "length" of vector (true length due to zero indice is I+1) *********************************************************************/ double sumI1(const DoubleMatrix& X, int I, int t) { double res = 0; for (register int i=1; i<=I; i++) { res += X[i][t]; } return(res); } /********************************************************************* * factorial function *********************************************************************/ long factorial(long x){ long fac=1; if(x<0){ Rf_error("negative value passed to factorial function\n");} else{ if(x==0){fac=1;} else{ for(int i=1;i<=x;i++){ fac*=i; } } } return(fac); } /********************************************************************* * logit function *********************************************************************/ double logit(double y){ if(y <= 0 || y >= 1){ Rf_error("y <= 0 or y >= 1 in logit function.\n"); } double logit; logit = log(y/(1-y)); return(logit); } /********************************************************************* * inverse logit function *********************************************************************/ double invlogit(double y){ double invlogit; invlogit = 1/(1 + exp(-y)); return(invlogit); } /********************************************************************* * inverse logit function diff. *********************************************************************/ double invlogitd(double y){ double invlogitd; invlogitd = exp(-y)/pow((1.0 + exp(-y)),2); return(invlogitd); } /********************************************************************* * Makes one Metropolis-Hastings update step, log-scale *********************************************************************/ double updateMHlog(double &par, double parStar, double logFpar, double logFparStar, double &acceptedpar) { double accpar = exp(logFparStar - logFpar); if (gsl_rng_uniform() <= accpar) {par = parStar; acceptedpar++;} return(0); } /********************************************************************* * Makes one Metropolis-Hastings update step *********************************************************************/ double updateMH(double &par, double parStar, double Fpar, double FparStar, double &acceptedpar) { double accpar = FparStar/Fpar; if (gsl_rng_uniform() <= accpar) {par = parStar; acceptedpar++;} return(0); } /********************************************************************* * Tunes a parameter *********************************************************************/ double tune(double& parameter, double accepted, double samples, double& tunepar, double a=0.3, double b=0.4){ tunepar=1; if ((accepted/samples>a) && (accepted/samplesb) { parameter *= 1.5; } else if (accepted/samples0){return x;}else{return -x;} } double MIN(double a, double b) { if (a2) { REprintf("Error in the twins.cc function invers()\n"); } for (int i=0; i< k*k; i++) { A[i]=ergebnis[i]; } return; } void mxschreibe(double* A, int a, int b) { for (int i=0; i= gsl_rng_uniform()) { alpha[i]=alphaneu; acc_alpha += 1; } } return; } void erzeuge_b_Q(DoubleVector& gamma , double* my, double* Q, const DoubleVector& alpha, DoubleVector& delta, DoubleVector& beta, const LongMatrix& X, const LongMatrix& Z, const LongMatrix& Y, int n, int I, double taubeta, int rw, const DoubleMatrix& lambda, double p, const DoubleMatrix& xcov, int ncov, const DoubleMatrix& omega, const DoubleMatrix& omegaX,int scov, int mode) { if (mode==1) { /* b-vektor des Proposals*/ for (int t=0;tgsl_rng_uniform()){ gamma[j] = gammajStar; acc_gamma += 1; } return; } void update_beta_t(int t, const DoubleVector& alpha, DoubleVector& beta, DoubleVector& gamma, DoubleVector& delta, int ncov, const DoubleMatrix& xcov, const LongMatrix& X, int n, int I, double taubeta, long& acc_beta, const DoubleMatrix& omega, int scov) { double h = 0; double c = 0; double d = 0; for(int i=1;i<=I;i++){ h -= omega[i][t]*delta[t]*exp(alpha[i] + beta[t] + sumg(ncov,xcov,gamma,t,scov)); /* h ist h(beta[t]^0), beta ist \beta^0, betatStar ist \beta*/ c += X[i][t]; } if(t==2){ c -= taubeta*(beta[t+2]-2*beta[t+1]); d = taubeta; } if(t==3){ c -= taubeta*((beta[t+2]-2*beta[t+1]) + (-2*beta[t+1] - 2*beta[t-1])); d = 5*taubeta; } if((t>=4)&&(t<=(n-2))){ c -= taubeta*((beta[t+2]-2*beta[t+1]) + (-2*beta[t+1] - 2*beta[t-1]) + (beta[t-2] - 2*beta[t-1])); d = 6*taubeta; } if(t==(n-1)){ c -= taubeta*((-2*beta[t+1] - 2*beta[t-1]) + (beta[t-2] - 2*beta[t-1])); d = 5*taubeta; } if(t==n){ c -= taubeta*(beta[t-2] - 2*beta[t-1]); d = taubeta; } double s = sqrt(1/(d - h)); /* s ist s*/ double b = c + (1 - beta[t])*h; double m = b*s*s; double betatStar = gsl_ran_gaussian(s) + m; double h2 = 0; for(int i=1;i<=I;i++){ h2 -= omega[i][t]*delta[t]*exp(alpha[i] + betatStar + sumg(ncov,xcov,gamma,t,scov)); /* h2 ist h(beta[t])*/ } double s2 = sqrt(1/(d - h2)); /* s2 ist s^0*/ double b2 = c + (1 - betatStar)*h2; double m2 = b2*s2*s2; double a = 0; a += betatStar*c; a -= beta[t]*c; a -= 0.5*d*betatStar*betatStar; a += 0.5*d*beta[t]*beta[t]; a += h2; a -= h; a += log(s); a -= log(s2); a += 0.5*((betatStar-m)/s)*((betatStar-m)/s); a -= 0.5*((beta[t]-m2)/s2)*((beta[t]-m2)/s2); if(exp(a)>gsl_rng_uniform()){ beta[t] = betatStar; acc_beta += 1; } return; } void update_lambda_br(DoubleMatrix& lambda, DoubleMatrix& lambda_br,DoubleVector& xi_lambda, IntMatrix& breakpoints, IntMatrix& breakpointsStar, IntVector& K, IntVector& KStar, IntVector& Km1, double alpha_lambda, double beta_lambda, const LongMatrix& Y, const LongMatrix& Z, int n, int I, double& acceptedbr, const DoubleMatrix& omega, int theta_pred_estim, int xi_estim, int K_geom, double p_K, double alpha_xi, double beta_xi) { /*update breakpoints of lambda using reversible jump MCMC*/ int newbreakpoint =0; int removebreakpoint=0; int newbreakpointnumber=0; int u; double v=1; double a; double alpha_la; double beta_la; for(int i=1;i<=I;i++){ if(!theta_pred_estim){ a=gsl_rng_uniform(); if(a<0.5){u=1;}else{u=2;} if(K[i]==1){u=2;v=.5;} /*K[i] is number of segments of lambda*/ if(K[i]==(n-1)){u=1;v=.5;} /*if(!theta_pred_estim) max of K[i] is n-1*/ /*decide if new brreakpoint or remove breakpoint*/ if(u==1){/*remove breakpoint*/ if(K[i]==2){v=2;} KStar[i]=K[i]-1; a=gsl_rng_uniform(); removebreakpoint=(int)floor(a*(double)(K[i]-1))+1; /*generate breakpointsStar*/ for(int k=1;kn){need=1;} for(int k=1;k<=K[i];k++){ if(newbreakpoint==breakpoints[i][k]){ need=1; } } }/*while(need==1)*/ /*generate breakpointsStar*/ for(int k=1;k<=K[i];k++){ if((newbreakpoint>breakpoints[i][k-1])&&(newbreakpoint(n+1)){need=1;} for(int k=1;k<=K[i];k++){ if(newbreakpoint==breakpoints[i][k]){ need=1; } } }/*while(need==1)*/ /*generate breakpointsStar*/ for(int k=1;k<=K[i];k++){ if((newbreakpoint>breakpoints[i][k-1])&&(newbreakpointn){need=1;} for(int k=1;k<=K_delta;k++){ if(newbreakpoint==breakpoints_delta[k]){ need=1; } } }//while(need==1) //generate breakpointsStar_delta for(int k=1;k<=K_delta;k++){ if((newbreakpoint>breakpoints_delta[k-1])&&(newbreakpointn){need=1;} for(int k=1;k<=K_epsilon;k++){ if(newbreakpoint==breakpoints_epsilon[k]){ need=1; } } }//while(need==1) //generate breakpointsStar_epsilon for(int k=1;k<=K_epsilon;k++){ if((newbreakpoint>breakpoints_epsilon[k-1])&&(newbreakpoint> n; // Rprintf("n=%d\n",n); // int I=1; // //fin >> I; // //cout << "I=" << I << endl; // long **Z = new long*[I+1]; // for (register long i=0; i<=I; i++){ // Z[i] = new long[n+1]; // } // for (register long t=0; t<=n; t++){ // Z[0][t]=0; // } // for (register long i=0; i<=I; i++){ // Z[i][0]=0; // } // //Start @ index 1. (Z[0] is not defined) // int t=1; // while (!fin.eof() && (t<=n)) { // int i=1; // while (!fin.eof() && (i<=I)) { // fin >> Z[i][t]; // i++; // } // t++; // } // fin.close(); // //Return the result consisting of Z and n // *size = n; // *size2 = I; // return(Z); // } /* Calculate the deviance of the data we use that the data, Z, is a * sum of Poisson distributed variables, i.e. it is Poisson * distributed. * * Z_t = S_t + X_t + Y_t, i.e. * Z_t ~ Po(nu*p + nu*(1-p) + lambda*W_{t-1}) * * D = -2log p(Z|theta) + 2 log p(Z|\mu(theta)=Z) */ double satdevalt(int n, int I, const LongMatrix& X, const LongMatrix& Y, const LongMatrix& Z, const DoubleMatrix& omega, const DoubleMatrix& lambda, const DoubleMatrix& nu, double *xi, DoubleMatrix& eta, DoubleMatrix& eta2, DoubleMatrix& varr, double psi, int overdispersion) { double res = 0; //Loop over all data for (register int i=1; i<=I; i++) { for (register int t=2; t<=n; t++) { //Use the equation derived for the saturated deviance in the paper //calculate the mean and variance of Z[i][t] eta[i][t] = (nu[i][t]*xi[i]+lambda[i][t]*Z[i][t-1]); eta2[i][t] = eta[i][t]; if(overdispersion){ varr[i][t] = eta2[i][t]*(1+eta2[i][t]/psi); }else{ varr[i][t] = eta2[i][t]; } //calculate the Deviance in the Poisson and NegBin case if(!overdispersion){ if (Z[i][t] == 0) { res += 2 * eta[i][t]; } else { res += 2 * ( Z[i][t] * log(Z[i][t]/eta[i][t]) - Z[i][t] + eta[i][t]); } } if(overdispersion){ if (Z[i][t] == 0) { res += 2 * ( - (Z[i][t]+psi) * log((Z[i][t]+psi)/(eta[i][t]+psi))); } else { res += 2 * ( - (Z[i][t]+psi) * log((Z[i][t]+psi)/(eta[i][t]+psi)) + Z[i][t] * log(Z[i][t]/eta[i][t])); } } } } return(res); } /* Calculate the deviance of the data we use that the data, Z, is a * sum of Poisson distributed variables, i.e. it is Poisson * distributed. * * Z_t = X_t + Y_t, i.e. * Z_t ~ Po(nu_t + lambda_t*Z_{t-1}) * * D = -2log p(Z|theta) */ double satdev(int n, int I, const LongMatrix& Z, const DoubleMatrix& lambda, const DoubleMatrix& nu, double *xi, DoubleVector& epsilon, DoubleMatrix& eta, double psi, int overdispersion) { double res = 0; //Loop over all data for (register int i=1; i<=I; i++) { for (register int t=2; t<=n; t++) { //Use the equation derived for the saturated deviance in the paper //calculate the mean and variance of Z[i][t] eta[i][t] = (epsilon[t] + nu[i][t]*xi[i]+lambda[i][t]*Z[i][t-1]); //calculate the Deviance in the Poisson and NegBin case if(!overdispersion){ res -= 2 * ( Z[i][t] * log(eta[i][t]) - gsl_sf_lngamma(Z[i][t]+1) - eta[i][t]); } if(overdispersion){ res -= 2 * ( gsl_sf_lngamma(Z[i][t]+psi) - gsl_sf_lngamma(Z[i][t]+1) - gsl_sf_lngamma(psi) - (Z[i][t]+psi)*log(eta[i][t]+psi) + psi*log(psi) + Z[i][t]*log(eta[i][t])); } } } return(res); } // Calculate chi square the sum of the qudratic pearson residuals (z-mean)/sd double chisq(int n, int I, const LongMatrix& Z, const DoubleMatrix& lambda, const DoubleMatrix& nu, double *xi, DoubleVector& epsilon, DoubleMatrix& eta, DoubleMatrix& varr, DoubleMatrix& rpearson, double psi, int overdispersion) { double res = 0; //Loop over all data for (register int i=1; i<=I; i++) { for (register int t=2; t<=n; t++) { //calculate the mean and variance of Z[i][t] eta[i][t] = (epsilon[t] + nu[i][t]*xi[i]+lambda[i][t]*Z[i][t-1]); if(overdispersion){ varr[i][t] = eta[i][t]*(1+eta[i][t]/psi); }else{ varr[i][t] = eta[i][t]; } rpearson[i][t] = (Z[i][t]-eta[i][t])/sqrt(varr[i][t]); //calculate chisq in the Poisson and NegBin case res += rpearson[i][t]*rpearson[i][t]; } } return(res); } /********************************************************************** * Estimation in the basic epidemic model * */ void bplem_estimate(int verbose, ofstream &logfile, ofstream &logfile2, ofstream &acclog, const LongMatrix& Z, double* xi, int n, int I, int T, int nfreq, int burnin, int filter, int samples, int rw) { //Model parameters - start values double nu_const = alpha_nu/beta_nu; double lambda_const = 0.5; double psi = alpha_psi / beta_psi; double x = logit(lambda_const); if(!verbose) { Rprintf("------------------------------------------------\n"); if (!la_rev){ Rprintf("lambda: Ga(%f, %f)-->\t%f\n", alpha_lambda, beta_lambda, lambda_const); } if(!varnu){ Rprintf("nu: Ga(%f, %f)-->\t%f\n", alpha_nu, beta_nu, nu_const); } if(overdispersion){ Rprintf("psi: Ga(%f, %f)-->\t%f\n", alpha_psi, beta_psi, psi); } Rprintf("------------------------------------------------\n"); } //Allocate arrays for all latent variables and initialize them // first all 2D arrays (matrices) LongMatrix X(I+1, n+1); LongMatrix Y(I+1, n+1); LongMatrix S(I+1, n+1); DoubleMatrix omega(I+1, n+1); DoubleMatrix sumX(I+1, n+1); DoubleMatrix sumY(I+1, n+1); DoubleMatrix sumS(I+1, n+1); DoubleMatrix sumomega(I+1, n+1); DoubleMatrix nu(I+1, n+1); DoubleMatrix lambda(I+1, n+2); DoubleMatrix lambda_br(I+1, n+2); DoubleMatrix eta(I+1, n+1); DoubleMatrix eta2(I+1, n+1); DoubleMatrix varr(I+1, n+1); DoubleMatrix rpearson(I+1, n+1); DoubleMatrix Sumeta(I+1, n+1); DoubleMatrix Sumvarr(I+1, n+1); DoubleMatrix Sumrpearson(I+1, n+1); IntMatrix breakpoints(I+1, n+2); IntMatrix breakpointsStar(I+1, n+2); LongMatrix bp(I+1, n+2); // long** X = new long*[I+1]; // long** Y = new long*[I+1]; // long** S = new long*[I+1]; // double **omega= new double*[I+1]; // double** sumX = new double*[I+1]; // double** sumY = new double*[I+1]; // double** sumS = new double*[I+1]; // double **sumomega= new double*[I+1]; // double **nu= new double*[I+1]; // double *alpha=new double[I+1]; // double* beta= new double[n+1]; // double **lambda=new double*[I+1]; // double **lambda_br=new double*[I+1]; // double **eta=new double*[I+1]; // double **eta2=new double*[I+1]; // double **varr=new double*[I+1]; // double **rpearson=new double*[I+1]; // double **Sumeta=new double*[I+1]; // double **Sumvarr=new double*[I+1]; // double **Sumrpearson=new double*[I+1]; // int **breakpoints=new int*[I+1]; // int **breakpointsStar=new int*[I+1]; // long **bp=new long*[I+1]; // We would have to delete the pointers manually at the end of the routine // in order not to corrupt the memory!!! // for (register long i=0; i<=I; i++){ // X[i]=new long[n+1]; // Y[i]=new long[n+1]; // S[i]=new long[n+1]; // omega[i]=new double[n+1]; // sumX[i]=new double[n+1]; // sumY[i]=new double[n+1]; // sumS[i]=new double[n+1]; // sumomega[i]=new double[n+1]; // nu[i]=new double[n+1]; // lambda[i]=new double[n+2]; // lambda_br[i]=new double[n+2]; // breakpoints[i]=new int[n+2]; // breakpointsStar[i]=new int[n+2]; // bp[i]=new long[n+2]; // eta[i]=new double[n+1]; // eta2[i]=new double[n+1]; // varr[i]=new double[n+1]; // rpearson[i]=new double[n+1]; // Sumeta[i]=new double[n+1]; // Sumvarr[i]=new double[n+1]; // Sumrpearson[i]=new double[n+1]; // } // then the rest (1D arrays and numbers) DoubleVector alpha(I + 1); DoubleVector beta(n + 1); DoubleVector delta(n + 2); DoubleVector delta_br(n + 2); double xi_delta = 1; DoubleVector epsilon(n + 2); DoubleVector epsilon_br(n + 2); double xi_epsilon = 1; double xi_psi = 1; IntVector K(I + 1); IntVector Km1(I + 1); IntVector KStar(I + 1); DoubleVector xi_lambda(I + 1); IntVector breakpoints_delta(n+2); IntVector breakpointsStar_delta(n+2); LongVector bp_delta(n+2); int K_delta = 0; int Km1_delta = 0; int KStar_delta = 0; IntVector breakpoints_epsilon(n+2); IntVector breakpointsStar_epsilon(n+2); LongVector bp_epsilon(n+2); int K_epsilon = 0; int Km1_epsilon = 0; int KStar_epsilon = 0; LongVector Xnp1(I + 1); LongVector Snp1(I + 1); LongVector Ynp1(I + 1); LongVector Znp1(I + 1); DoubleVector omeganp1(I + 1); DoubleVector nunp1(I + 1); if(!varnu){ for (register int i=0; i<=I; i++) { for (register int t=0; t<=n; t++) { nu[i][t] = alpha_nu/beta_nu; } } } for (register int i=0; i<=I; i++) { for (register int t=0; t<=n; t++) { lambda[i][t] = lambda_const; } } for (register int i=0; i<=I; i++) { for (register int t=0; t<=n; t++) { X[i][t] = 0; S[i][t] = 0; Y[i][t] = Z[i][t]; omega[i][t] = 1; eta[i][t] = 0; bp[i][t] = 0; bp_delta[t] = 0; bp_epsilon[t] = 0; sumX[i][t] = 0; sumY[i][t] = 0; sumS[i][t] = 0; sumomega[i][t] = 0; Sumeta[i][t] = 0; Sumrpearson[i][t] = 0; } bp[i][n+1] = 0; xi_lambda[i] = 1; bp_delta[n+1] = 0; bp_epsilon[n+1] = 0; } /* Fuer Saisonkomponenente */ int ncov; int scov = 0; if(delta_rev){ scov = 1; } // determine the number of covariates and allocate then // the vectors and design matrix. ncov = nu_trend ? (nfreq * 2 + 2) : (nfreq * 2 + 1); DoubleVector gamma(ncov); DoubleVector gammaneu(ncov); DoubleMatrix xcov(ncov, n+2); // bad, do not do that: // double* gamma; // double* gammaneu = NULL; // double** xcov; if(!nu_trend){ // ncov=nfreq*2+1; // gamma = new double[ncov]; // gammaneu = new double[ncov]; // xcov = new double*[ncov]; // for (int i=0; i tuneSampleSize && (!verbose) && (sampleCounter % (int)floor(sampleSize/100.0) == 0)) { Rprintf("%d%%", sampleCounter*100 / sampleSize); } if(0){ if(varnu){ if ((sampleCounter % 100 == 0)) { Rprintf("alpha\t%f beta\t%f %f gamma[0]\t%f gamma[1]\t%f gamma[2]\t%f %f lambda\t%f\n", (double)acc_alpha/I, beta[2], (double)acc_beta, gamma[0], gamma[1], gamma[2],(double)acc_gamma, lambda[1][2]); /* cout<< "alpha\t" << (double)acc_alpha/I<<" " << "beta\t" <<" "<< beta[2] <<" "<< (double)acc_beta<<" " << "gamma[0]\t" <<" "<< gamma[0] <<" "<< "gamma[1]\t" <<" " << gamma[1] <<" "<< "gamma[2]\t" <<" "<< gamma[2] <<" " << (double)acc_gamma<<" " << "lambda\t" << lambda[1][2] << endl;*/ } } if(la_rev){ if ((sampleCounter % 100 == 0)) { Rprintf("K\t%d\n", K[1]); } } if(delta_rev){ if ((sampleCounter % 100 == 0)) { Rprintf("K_delta\t%f delta[2]\t%f\n", K_delta, delta[2]); } } if(epsilon_rev){ if ((sampleCounter % 100 == 0)) { Rprintf("K_epsilon\t%f epsilon[2]\t%f\n", K_epsilon, epsilon[2]); } } } // cout << ":"<) superflous. double accpsi = exp(logFPsiStar-logFPsi); //Do we accept? if ((psi>0) && (gsl_rng_uniform() <= accpsi)) {psi = psiStar; acceptedPsi++;} } //update xi_psi if(xi_estim_psi){ double a = alpha_psi + 1; double b = beta_psi + psi; xi_psi = gsl_ran_gamma (a, 1/b); } ////////////////////////////////////////////////////////////////////////// //State information to file if we are on an filter'th sample if ((sampleCounter>burnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << sampleCounter << "\t"; if (!la_rev){ logfile << lambda_const << "\t"; } logfile << psi << "\t"; logfile << xi_psi << "\t"; if(!varnu){ logfile << nu_const << "\t"; } } if(varnu){ // Unterprogramme fuer den Update von alpha und beta if (I>=2) { alphaupdate(gamma, alpha, beta, delta, lambda, 1, I, n, Y, X, acc_alpha, taualpha, ncov, xcov, xreg, omega, omega, scov,1); taualpha=update_tau_alpha(alpha, I, alpha_a, alpha_b, xreg); if (sampleCounter%3==0) { if(scov==0){ double asum=0; for (int i=1; i<=I; i++) { asum+=(alpha[i]-xreg[i]); } for (int i=1; i<=I; i++) { alpha[i]-=(asum/I); } gamma[0]=gamma[0]+(asum/I); } } } else { alpha[1]=0.0; } //Update fuer zeitlichen effekt mit RW if (rw>0) { // update_beta_nurrw(gamma, alpha, beta, delta, X, Z, Y, n, I, taubeta, rw, 1, lambda, acc_beta, sampleCounter, my, my2, temp, z, theta, Q, Q2, L, L2, xcov, ncov, scov, omega, omega, 1); //update_beta_block(alpha, beta, gamma, delta, X, n, I, taubeta, rw, acc_beta, sampleCounter, n1, n2, my, my2, z, theta, beta0, Q, Q2, L, L2, xcov, ncov, scov, omega); /*hofmann - no fortran update_beta_tau_block(alpha, beta, gamma, delta, beta_a, beta_b, X, n, I, taubeta, rw, acc_beta, taubetaRWSigma, taubetaStar, sampleCounter, n1, n2, my, my2, z, theta, beta0, Q, Q2, L, L2, xcov, ncov, scov, omega); */ //taubeta=beta_a/beta_b; // taubeta=hyper(rw, beta, beta_a, beta_b, n); //taubeta=720; //if(sampleCounter%500==1){cout << taubeta << endl << endl;} // for(int t=2;t<=n;t++){ // update_beta_t(t, alpha, beta, gamma, delta, ncov, xcov, X, n, I, taubeta, acc_beta, omega, scov); // } if(scov==0){ // if (sampleCounter%1==0) // { double bsum=0; for (int t=2; t<=n; t++) { bsum+=(beta[t]); } for (int t=2; t<=n; t++) { beta[t]-=(bsum/(n-1)); } gamma[0]=gamma[0]+(bsum/(n-1)); // } } } //if (rw>0) //update saison //update_gamma( alpha, beta, gamma,ncov, xcov, X, Z, Y, n, I, taugamma, 1, lambda, acc_gamma, P, P2, gammaalt, z2, L, Q, omega, omega,1); taugamma=gamma_b; // cout << gamma[0]<<" " << gamma[1] << endl; for(int j=scov;jburnin) && ((sampleCounter-burnin) % filter == 0)) { // for (register int i=1;i<=I; i++) { // for (register int t=1; t<=n; t++) { // logfile << nu[i][t] << "\t"; // } // } // logfile << mu << "\t"; for (register int j=0; jburnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << Km1_delta<<"\t"<< xi_delta<<"\t"; for (register int j=2; j<=n; j++) { logfile << delta[j] << "\t"; } } if (sampleCounter>burnin) { for (register int k=1; k<=K_delta; k++) { for (register int j=2; j<=n; j++) { if (breakpoints_delta[k]==j){ bp_delta[j]+=1; } } } } }//if(delta_rev) }//if }//if varnu if(epsilon_rev){ update_epsilon_br(epsilon, epsilon_br, xi_epsilon, breakpoints_epsilon, breakpointsStar_epsilon, K_epsilon, KStar_epsilon, Km1_epsilon, epsilon_a, epsilon_b, S, n, I, acceptedbr_epsilon, omega, xi_estim_epsilon, K_geom, p_K, alpha_xi, beta_xi); if ((sampleCounter>burnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << Km1_epsilon<<"\t"<< xi_epsilon<<"\t"; for (register int j=2; j<=n; j++) { logfile << epsilon[j] << "\t"; } } if (sampleCounter>burnin) { for (register int k=1; k<=K_epsilon; k++) { for (register int j=2; j<=n; j++) { if (breakpoints_epsilon[k]==j){ bp_epsilon[j]+=1; } } } } }//if(epsilon_rev) if(la_estim){ if (la_rev) { update_lambda_br(lambda, lambda_br, xi_lambda, breakpoints, breakpointsStar, K, KStar, Km1, alpha_lambda, beta_lambda, Y, Z, n, I, acceptedbr, omega, theta_pred_estim, xi_estim, K_geom, p_K, alpha_xi, beta_xi); if ((sampleCounter>burnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << Km1[1]<<"\t"<< xi_lambda[1]<<"\t"; for (register int j=2; j<=n; j++) { logfile << lambda[1][j] << "\t"; } } for (register int i=1;i<=I; i++) { if (sampleCounter>burnin) { for (register int k=1; k<=K[i]; k++) { for (register int j=2; j<=n; j++) { if (breakpoints[i][k]==j){ bp[i][j]+=1; } } } } } }//if(la_rev) } // if(la_estim) // cout << S[1][106] << endl; // cout << "test" << endl; //Loop over the individual X[t], Y[t], S[t], and omega[t] for (register int i=1;i<=I; i++) { for (register int t=2; t<=n; t++) { //Update X double binp = nu[i][t]*xi[i] / (epsilon[t] + nu[i][t]*xi[i] + lambda[i][t] * Z[i][t-1]); X[i][t] = gsl_ran_binomial( binp, Z[i][t]); //Update S binp = epsilon[t] / (epsilon[t] + lambda[i][t] * Z[i][t-1]); //hoehle 9 Apr 2009 -- protection against Z[i][t-1]==0 case, leading to binp = nan if (Z[i][t-1] == 0) {binp = 1;} S[i][t] = gsl_ran_binomial( binp, (Z[i][t] - X[i][t])); //Update Y Y[i][t] = Z[i][t] - X[i][t] - S[i][t]; //Debug //cout << "i=" << i << "\tt=" << t << "\tX=" << X[i][t] << "\tY=" << Y[i][t] << "\tZ=" << Z[i][t] << "\tS=" << S[i][t] << "\tepsilon=" << epsilon[t] << "\tbinp=" << binp << endl; //Update omega[t] in case of overdispersion if(overdispersion){ double a = psi + Z[i][t]; double b = psi + epsilon[t] + nu[i][t] + lambda[i][t]*Z[i][t-1]; omega[i][t] = gsl_ran_gamma(a,1/b); } //Write state to log-file. if (sampleCounter>burnin) { sumX[i][t] += X[i][t]; sumY[i][t] += Y[i][t]; sumS[i][t] += S[i][t]; sumomega[i][t] += omega[i][t]; Sumeta[i][t] += eta[i][t]; Sumvarr[i][t] += varr[i][t]; Sumrpearson[i][t] += rpearson[i][t]; } }//for t }//for i // cout << "test2" << endl; // cout << Z[1][2] << endl; // cout << X[1][2] << endl; // cout << Y[1][2] << endl; // cout << S[1][2] << endl; //Praediktive Verteilung fuer variables nu for (register int i=1;i<=I;i++) { if(!theta_pred_estim){ double p_thetanp1 = ((double(K[i]))/double(n)); //(1+double(K[i])) if(K_geom){ p_thetanp1 = (double(K[i])*(1.0-p_K)*(1.0-pow((double)1.0-p_K,double(n-1))))/((double(n)-1.0)*(1.0-pow((double)1.0-p_K,double(n)))); } if(gsl_rng_uniform()<=p_thetanp1){ if (sampleCounter>burnin) { bp[i][n+1] += 1; } double alpha_la = alpha_lambda; double beta_la = beta_lambda; if(xi_estim){ beta_la = xi_lambda[i]; } lambda[i][n+1]=gsl_ran_gamma(alpha_la,1/beta_la); } } if(overdispersion){ omeganp1[i] = gsl_ran_gamma(psi,1/psi); }else{ omeganp1[i] = 1; } if(varnu){ a = 0; for(int j=scov;j0){ a += gsl_ran_gaussian(sqrt(1/taubeta)) + (2*beta[n-1]-beta[n]); } if(delta_rev){ double p_thetanp1 = ((double(K[i]))/double(n)); //(1+double(K[i])) if(K_geom){ p_thetanp1 = ((double(K[i]))*(1.0-p_K)*(1.0-pow((double)1.0-p_K,double(n-1))))/((double(n)-1.0)*(1.0-pow((double)1.0-p_K,double(n)))); } if(gsl_rng_uniform()<=p_thetanp1){ if (sampleCounter>burnin) { bp_delta[n+1] += 1; } double alpha_de = delta_a; double beta_de = delta_b; if(xi_estim){ beta_de = xi_delta; } delta[n+1]=gsl_ran_gamma(alpha_de,1/beta_de); } a += log(delta[n+1]); } nunp1[i] = exp(a); }else{ nunp1[i]=nu[i][n]; } if(epsilon_rev){ double p_thetanp1 = ((double(K[i]))/double(n)); //(1+double(K[i])) if(K_geom){ p_thetanp1 = ((double(K[i]))*(1.0-p_K)*(1.0-pow((double)1.0-p_K,double(n-1))))/((double(n)-1.0)*(1.0-pow((double)1.0-p_K,double(n)))); } if(gsl_rng_uniform()<=p_thetanp1){ if (sampleCounter>burnin) { bp_epsilon[n+1] += 1; } double alpha_ep = epsilon_a; double beta_ep = epsilon_b; if(xi_estim){ beta_ep = xi_epsilon; } epsilon[n+1]=gsl_ran_gamma(alpha_ep,1/beta_ep); } } Xnp1[i] = gsl_ran_poisson(omeganp1[i]*nunp1[i]*xi[i]); Ynp1[i] = gsl_ran_poisson(lambda[i][n+1]*omeganp1[i]*(Z[i][n])); Snp1[i] = gsl_ran_poisson(omeganp1[i]*epsilon[n+1]); Znp1[i] = Xnp1[i] + Ynp1[i] + Snp1[i]; if ((sampleCounter>burnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << Znp1[1] << "\t"; } } if ((sampleCounter>burnin) && ((sampleCounter-burnin) % filter == 0)) { logfile << satdev(n,I,Z,lambda,nu,xi,epsilon,eta,psi,overdispersion) << endl; } logfile.flush(); //Tuning if(sampleCounter == tuneSampleSize){ if (!la_rev) { Rprintf("Current xRWSigma= %f --> acc rate= %f\n", xRWSigma, acceptedlambda/tuneSampleSize); tune(xRWSigma, acceptedlambda, tuneSampleSize,tunex); Rprintf("Corrected xRWSigma= %f\n", xRWSigma); } if(overdispersion){ Rprintf("\nCurrent psiRWSigma= %f --> acc rate = %f\n", psiRWSigma, acceptedPsi/tuneSampleSize); tune(psiRWSigma, acceptedPsi, tuneSampleSize,tunepsi); Rprintf("Corrected psiRWSigma= %f\n", psiRWSigma); } if(varnu&&(rw>0)){ Rprintf("Current taubetaRWSigma= %f --> acc rate %f\n", taubetaRWSigma, acc_beta/tuneSampleSize); tune(taubetaRWSigma, acc_beta, tuneSampleSize,tunetaubeta,0.1,0.4); Rprintf("Corrected taubetaRWSigma= %f\n", taubetaRWSigma); } //tunetaubeta = 0; need=tunex + tunepsi + tunetaubeta; if(need > 0){ acceptedlambda = 0; acceptedbr = 0; acceptedbr_delta = 0; acceptedbr_epsilon = 0; acceptedPsi = 0; sampleCounter = 0; if(varnu){ acc_beta=0; acc_alpha=0; acc_gamma=0; } //Fix seed of generator to reproduce results. // gsl_rng_set(r,seed); }//if }//if sampleCounter++; }//while counter //Write means to logfile2 for (register int t=1;t<=n;t++) { logfile2 << (double)sumX[1][t]/((double)samples*(double)filter) << "\t" << (double)sumY[1][t]/((double)samples*(double)filter)<< "\t" << (double)sumomega[1][t]/((double)samples*(double)filter) << "\t"<< (double)bp[1][t]/((double)samples*(double)filter) << "\t"; } logfile2 << (double)bp[1][n+1]/((double)samples*(double)filter) << "\t"; logfile2 << endl; //Write accepted status to file if(overdispersion){acclog << "psi\t" << psiRWSigma << "\t" << (double)acceptedPsi/(double)sampleSize << endl;} if (!la_rev){acclog << "lambda\t" << xRWSigma << "\t" << (double)acceptedlambda/(double)sampleSize << endl;} if (la_rev){acclog << "br\t" << 0 << "\t" << (double)acceptedbr/(double)sampleSize << endl;} if(I>1){acclog << "alpha\t" << 0 <<"\t" <<(double)acc_alpha/((double)sampleSize*I)<0)){acclog <<"beta\t"<<0 <<"\t"<< (double)acc_beta/((double)sampleSize*(double)(n-1.0))< Date: 8 Jan 2008 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, a copy is available at http://www.r-project.org/Licenses/ Atm the only C routines are concerned with the GLR computations in the algorithm algo.prc. //should check that these really work... void lr_cusum - intercept chart with known kappa void glr_cusum - intercept chart with estimated kappa void glr_cusum_window -- window limited intercept chart with estimated kappa //removedvoid glr_epi void glr_epi_window //History 17 Feb 2009 -- added LR scheme for negative binomial (still experimental) 08 Jan 2007 -- added the files for the negative binomial computations 21 Sep 2007 -- modified code to get around error of extreme strict (=pedantic) MacOS compiling on CRAN 28 Nov 2006 -- file created */ /*#define DEBUG*/ #include #include #include #include /* header */ /* void lr_cusum(int* ,double* , int *, double *, double *,int *, double *) ; void glr_cusum(int* ,double* , int *, int *, double *,int *, double *, int *, int *, int *) ; */ /* Helper function for x^2 */ static R_INLINE double sqr(double x) { return(x*x); } /*====================================================================== Poisson GLR detector ====================================================================== */ /********************************************************************** C implementation of the LR test for the seasonal Poisson chart with fixed change in the intercept Params: x - array of observed values (pos 0 is first interesting value) mu0 - array with the means once in-control (pos 0 is first interesting value) lx - length of the x and mu0 array kappa- the change in intercept to detect (here known in advance) c_ARL- when to sound alarm threshold ret_N- here the return value is stored ret_lr- GLR value for each n to be returned ret_cases - The number of cases to be returned ret - what should be returned (value of lr-statistic, cases)? **********************************************************************/ void lr_cusum(int* x,double* mu0, int *lx_R, double *kappa_R, double *c_ARL_R,int *ret_N, double *ret_lr, double *ret_cases, int *ret_R) { /* Pointers to something useful */ int lx = *lx_R; double c_ARL = *c_ARL_R; double kappa = *kappa_R; int ret = *ret_R; /* Loop variables */ register int n=0; int stop = 0; int N = lx; /* Loop over all 0 <= n <= length(x) */ while ((n < lx)) { /*Compute for one n*/ /*printf("n=%d\n",n);*/ double zn = kappa * x[n] + (1-exp(kappa))*mu0[n]; /* Add up */ if (n==0) { ret_lr[n] = fmax(0,zn); /*5.11.2009 -- Bug fix. There was a small programming error for the computing the cases for n==0. if (ret==2) ret_cases[n] = (c_ARL + mu0[n]*(kappa-1))/kappa ; */ if (ret==2) ret_cases[n] = (c_ARL + mu0[n]*(exp(kappa)-1))/kappa ; } else { ret_lr[n] = fmax(0,ret_lr[n-1] + zn); if (ret==2) ret_cases[n] = (c_ARL - ret_lr[n-1] + mu0[n]*(exp(kappa)-1))/kappa ; } /* Find the first time that the GLR increases c_ARL there we stop */ if ((ret_lr[n] > c_ARL) && !stop) { N = n; stop = 1; break; } /* Advance counter */ n++; } /* Return value (add 1 for R/SPlus array compability */ *ret_N = N+1; } /*********************************************************************** Function for the computation of the glr-statistic with time-varying in-control value Params n - timepoint n where the glr-statistic should be computed x - array with observations mu0 - array with estimated in-comtrol parameters dir - direction of testing (up (1) or down (-1) the function returns max_1<=k<=n sup_theta sum_t=k^n log f_theta(x_t)/f_theta0(x_t) ************************************************************************/ double glr (int n, int x[], double mu0[], int dir){ /* For the recursive computation of kappa_ml */ double sumx = 0; double summu0 = 0; /* Define max of the GLR stats */ double maxGLR = -1e99; /* Loop variable */ register int k; /* For fitting and summation */ double kappa_ml = 0; double sum = 0; /* Loop over all k */ for (k=n; k>=0; k--) { /* Backwards loop makes calculations faster */ /* Recursive update of the kappa.ml quantitities */ sumx += x[k]; summu0 += mu0[k]; /* Calculate MLE of kappa */ kappa_ml = dir*fmax(0,dir*log(sumx/summu0)); /* Recursive updating of the likelihood ratios -- See notes on the 21 september printout. This is fast! */ sum = kappa_ml * sumx + (1-exp(kappa_ml))*summu0; /* save max value */ if (sum > maxGLR) { maxGLR = sum;} } return(maxGLR); } /*********************************************************************** Function for the computation of the window-limited glr-statistic with time-varying in-control value Params n - timepoint n where the glr-statistic should be computed x - array with observations mu0 - array with estimated in-comtrol parameters dir - direction of testing (up (1) or down (-1) M - max time to go back in time from N Mtilde - number of vals we will need to estimate a detection the function returns max(0,n-M) <= k <= n-Mtilde sup_theta sum_t=k^n log f_theta(x_t)/f_theta0(x_t) ************************************************************************/ double glr_window (int n, int x[], double mu0[], int dir, int M, int Mtilde){ /* Define max of the GLR stats */ double maxGLR = -1e99; /* Loop variable */ register int k,l; /* For the recursive computation of kappa_ml compute for (n-Mtilde+1):n */ double sumx = 0; double summu0 = 0; /* For fitting and summation */ double sum = 0; double kappa_ml = 0; for (l=n-Mtilde+1; l<=n; l++) { sumx += x[l]; summu0 += mu0[l]; } /* Loop over all max(0,n-M) <= k <= n-Mtilde -- do this backwards */ /* for (k=max(0,n-M); k<= (n-Mtilde); k++) { */ for (k=n-Mtilde; k>=fmax(0,n-M); k--) { /* Recursive update of the kappa.ml quantitities */ sumx += x[k]; summu0 += mu0[k]; kappa_ml = dir*fmax(0,dir*log(sumx/summu0));; /*Calculate sum of likelihood ratios using recursive updating (fast!)*/ sum = kappa_ml * sumx + (1-exp(kappa_ml))*summu0; /* Save the max value */ if (sum > maxGLR) { maxGLR = sum;} } return(maxGLR); } /********************************************************************** Fast C implementation of the sequential GLR test without windowing for Poisson distributed variables, this function can test in both directions (up/down) and there is the possibility ( in opposite to old function glr_cusum) to return the number of cases at timepoint n to produce an alarm at any timepoint 1<=k<=n Params: x - array of observed values (pos 0 is first interesting value) mu0 - array with the means once in-control (pos 0 is first interesting value) lx - length of the x and mu0 array n0 - number of burn-in values (number of observations, not array index!) c_ARL- when to sound alarm threshold ret_N- here the return value is stored ret_glr- GLR value for each n to be returned dir - direction of testing ret - what should be returned (value of glr-statistic, cases)? **********************************************************************/ void glr_cusum(int* x,double* mu0, int *lx_R, int *n0_R, double *c_ARL_R,int *ret_N, double *ret_glr, double *ret_cases, int *dir_R, int *ret_R) { /* Pointers to something useful */ int lx = *lx_R; int n0 = *n0_R; int dir = *dir_R; int ret = *ret_R; double c_ARL = *c_ARL_R; /* Loop variables */ register int n; /*l,n0-1*/ for (n=0; n= c_ARL */ while ((dir*glrnew < c_ARL*dir)){ /* increase/decrease xnnew */ xnnew = xnnew + 1; /* put this value in vector x at timepoint n */ x[n] = xnnew; /* compute the glr-statistic */ glrnew = glr(n,x,mu0,dir); } /* save the value */ ret_cases[n] = xnnew; /* set x[n] back to original value so that we can go to next n*/ x[n] = xnold; } /* Find the first time that the GLR increases c_ARL there we stop */ if ((ret_glr[n] >= c_ARL) && !stop) { N = n; stop = 1; break; } /*Advance counter*/ n++; } /* Return value (add 1 for R/SPlus array compability */ *ret_N = N+1; } /********************************************************************** Fast C implementation of the sequential GLR test without windowing for Poisson distributed variables Params: x - array of observed values (pos 0 is first interesting value) mu0 - array with the means once in-control (pos 0 is first interesting value) lx - length of the x and mu0 array Mtilde - number of vals we will need to estimate a detection M - max time to go back in time from N c_ARL- when to sound alarm threshold **********************************************************************/ void glr_cusum_window(int* x,double* mu0, int *lx_R, int *M_R, int *Mtilde_R, double *c_ARL_R,int *ret_N, double *ret_glr, double *ret_cases, int *dir_R, int *ret_R) { /* Pointers to something useful */ int lx = *lx_R; int M = *M_R; int Mtilde = *Mtilde_R; int dir = *dir_R; int ret = *ret_R; double c_ARL = *c_ARL_R; /* Loop variables (n>Mtilde, so we start with n=Mtilde (due to -1 in index) */ register int n = Mtilde; /*l*/ int stop = 0; int N = lx; /* Precalculation of log(mu0) -- apparently not used anymore */ //double logmu0[lx]; //for (l=0;l= c_ARL */ while ((dir*glrnew < c_ARL*dir)){ /* increase/decrease xnnew */ xnnew = xnnew + 1; /* put this value in vector x at timepoint n */ x[n] = xnnew; /* compute the glr-statistic */ glrnew = glr_window(n,x,mu0,dir,M,Mtilde); } /* save the value */ ret_cases[n] = xnnew; /* set x[n] back to original value so that we can go to next n*/ x[n] = xnold; } /* Debug*/ /* printf("For n=%d the best GLR value is %f\n",n,maxGLR);*/ /* Find the first time that the GLR increases c_ARL there we stop */ if ((ret_glr[n] >= c_ARL) && !stop) { N = n; stop = 1; break; } /* Advance counter */ n++; } /* Return value (add 1 for R/SPlus array compability */ *ret_N = N+1; } /*====================================================================== GLR in the Epidemic Poisson model ====================================================================== */ /*Helper functions*/ /* Score function */ static R_INLINE double score(double phi, int *x, double *xm1, double *mu0, int k, int n) { register int i; double sum = 0; /*printf("[1] ");*/ for (i=k; i<=n; i++) { sum += (x[i]*xm1[i])/(exp(phi)*xm1[i]+mu0[i]) - xm1[i]; } /*printf("\n");*/ return(exp(phi)*sum); } /*fisher information*/ static R_INLINE double fisher(double phi,int *x,double *xm1, double *mu0, int k,int n,double scorephi) { register int i; double sum = 0; for (i=k; i<=n; i++) { sum += (x[i]*sqr(xm1[i]))/sqr(exp(phi)*xm1[i]+mu0[i]); } return(-scorephi + exp(2.0*phi)*sum); } /********************************************************************** GLR detector for the epidemic Poisson model described in Held et. al (2005). Parameters: x -- the data (as array) mu0 -- base means under H0 lx -- length of x Mtilde_R -- number of obs needed to get good estimate (typically 1) M -- Mtilde < M xm10 -- observed value of x_0 (0 for initialization, but known if >1st round) c_ARL_R -- constant determining when to signal alarm ret_N -- the return value ret_lr --- GLR value for each n to be returned **********************************************************************/ void glr_epi_window(int* x,double* mu0, int *lx_R, int *Mtilde_R, int *M_R, double *xm10, double *c_ARL_R,int *ret_N, double *ret_glr) { /* printf("====> begin glr_epi\n"); */ /* Pointers to something useful */ int lx = *lx_R; /* length of x */ int Mtilde = *Mtilde_R; int M = *M_R; double c_ARL = *c_ARL_R; /* Loop variables */ register int n, k,i; /* Init return values up to the first position */ int n0 = fmax(Mtilde-1,0); /*hoehle: 25.9: changepoint can happen at position one: fmax(Mtilde-1,1);*/ for (n=0; n-18) & (fabs(exp(phi_new) - exp(phi_old)) > 1e-6) & (iter maxGLR) { maxGLR = lnk;} } /*Debug */ /*printf("For n=%d the best GLR value is %f\n",n,maxGLR); */ /*Save the return value */ ret_glr[n] = maxGLR; /*Find the first time that the GLR increases c_ARL there we stop */ if ((maxGLR > c_ARL) && !stop) { N = n; stop = 1; break; } /*Advance counter */ n++; } /*Set the remaining values to zero */ for (i=n+1;i begin lr_cusum_nb\n"); #endif /* Pointers to something useful */ int lx = *lx_R; double c_ARL = *c_ARL_R; double kappa = *kappa_R; double alpha = *alpha_R; int ret = *ret_R; #ifdef DEBUG printf("lx = %d\n",lx); printf("alpha = %f\n",alpha); #endif /* Loop variables */ register int n=0; int stop = 0; int N = lx; /* Loop over all 0 <= n <= length(x) */ while ((n < lx)) { /*Compute for one n*/ #ifdef DEBUG printf("n=%d\n",n); #endif /* LR for one NB variable as given in the first equation of Sect 2.1 in the Hoehle and Paul (2008) paper */ double zn = kappa * x[n] + (x[n]+1/alpha)*log( (1+alpha*mu0[n])/(1+alpha*mu0[n]*exp(kappa)) ); /* Recursive CUSUM as given in (4) by Hoehle and Paul (2008) */ if (n==0) { /* Statistic */ ret_lr[n] = fmax(0,zn); /* Number of cases it takes to sound an alarm - backcalc'ed by backcalc.mws*/ if (ret==2) ret_cases[n] = -(log((1+alpha*mu0[n])/(1+alpha*mu0[n]*exp(kappa)))-c_ARL*alpha)/alpha/(kappa+log((1+alpha*mu0[n])/(1+alpha*mu0[n]*exp(kappa)))); } else { /* Statistic */ ret_lr[n] = fmax(0,ret_lr[n-1] + zn); /* Number of cases it takes to sound an alarm -- backcalc.mws*/ if (ret==2) ret_cases[n] = -(ret_lr[n-1]*alpha+log((1+alpha*mu0[n])/(1+alpha*mu0[n]*exp(kappa)))-c_ARL*alpha)/alpha/(kappa+log((1+alpha*mu0[n])/(1+alpha*mu0[n]*exp(kappa)))); } /* Find the first time that the GLR increases c_ARL there we stop */ if ((ret_lr[n] > c_ARL) && !stop) { N = n; stop = 1; break; } /* Advance counter */ n++; } /* Return value (add 1 for R/SPlus array compability */ *ret_N = N+1; } /* ====================================================================== Functions for the intercept chart ====================================================================== */ /* Score function for intercept chart*/ static R_INLINE double nbScore(double kappa, int *x, double *mu0, double alpha, int k, int n) { register int i; double sum = 0; /*printf("[1] ");*/ for (i=k; i<=n; i++) { sum += (x[i]-exp(kappa)*mu0[i])/(1+alpha*exp(kappa)*mu0[i]); } /*printf("\n");*/ return(sum); } /*fisher information for intercept chart -- its minus the hesse */ static R_INLINE double nbFisher(double kappa,int *x, double *mu0, double alpha, int k,int n) { register int i; double sum = 0; for (i=k; i<=n; i++) { sum += mu0[i]*(alpha*x[i]+1)/sqr(1+alpha*exp(kappa)*mu0[i]); } return( exp(kappa)*sum); } /* Formula to compute a single l_{n,k} for the intercept chart */ static R_INLINE double nblnk(double kappa,int *x, double *mu0, double alpha, int k,int n) { register int i; double lnk = 0; for (i=k;i<=n;i++) { lnk += kappa * x[i] + (x[i] + 1/alpha) * log( (1+alpha*mu0[i])/(1+alpha*mu0[i]*exp(kappa))); } return(lnk); } /********************************************************************** GLR detector for the negative binomial model described in Hoehle and Paul (2007). Parameters: x -- the data (as array) mu0 -- base means under H0 alpha -- fixed dispersion parameter of the NegBin distribution (see Lawless87) lx -- length of x Mtilde_R -- number of obs needed to get good estimate (typically 1) M -- Mtilde < M c_ARL_R -- constant determining when to signal alarm ret_N -- the return value ret_lr --- GLR value for each n to be returned **********************************************************************/ void glr_nb_window(int* x,double* mu0, double* alpha_R, int *lx_R, int *Mtilde_R, int *M_R, double *c_ARL_R,int *ret_N, double *ret_glr, int *dir_R) { #ifdef DEBUG printf("====> begin glr_nb_window\n"); #endif /* Pointers to something useful */ int lx = *lx_R; /* length of x */ int Mtilde = *Mtilde_R; int M = *M_R; double c_ARL = *c_ARL_R; double alpha = *alpha_R; int dir = *dir_R; /* Loop variables */ register int n, k,i; /*changepoint can happen at position one (ie. index zero in C*/ int n0 = fmax(Mtilde-1,0); #ifdef DEBUG printf("Length of the data = %d\n",lx); printf("starting at n0= %d\n",n0); #endif /* Show the data */ /*for (n=0; n-18) & (fabs(kappa_new - kappa_old) > 1e-6) & (iter maxGLR) { maxGLR = lnk;} } /*Debug */ #ifdef DEBUG printf("For n=%d the highest GLR value is %f\n",n,maxGLR); #endif /*Save the return value */ ret_glr[n] = maxGLR; /*Find the first time that the GLR increases c_ARL there we stop */ /*hoehle: now >= */ if ((maxGLR >= c_ARL) && !stop) { N = n; stop = 1; break; } /*Advance counter */ n++; } /*Set the remaining values to zero */ for (i=n+1;i begin glr_nbgeneral_window \n"); #endif /* Pointers to something useful */ int lx = *lx_R; /* length of x */ int Mtilde = *Mtilde_R; int M = *M_R; double c_ARL = *c_ARL_R; double alpha = *alpha_R; /* int dir = *dir_R; -- currently direction is not supported?? */ /* Loop variables */ register int n, k,i; /*changepoint can happen at position one (ie. index zero in C*/ int n0 = fmax(Mtilde-1,0); /* Compute x_{t-1} */ double xm1[lx]; xm1[0] = *xm10; /* used to be 0 */ for (i=1; i-18) & (fabs(theta_new - theta_old) > 1e-6) & (iter maxGLR) { maxGLR = lnk;} } /*Debug */ #ifdef DEBUG printf("For n=%d the highest GLR value is %f\n",n,maxGLR); #endif /*Save the return value */ ret_glr[n] = maxGLR; /*Find the first time that the GLR increases c_ARL there we stop */ /*hoehle: now >= */ if ((maxGLR >= c_ARL) && !stop) { N = n; stop = 1; break; } /*Advance counter */ n++; } /*Set the remaining values to zero */ for (i=n+1;i #include struct SVEvent { double x, y, t; friend bool operator<(const SVEvent &a, const SVEvent &b) { return (a.t < b.t); } }; //STL is used (check its use) typedef std::list SVEventLst; //Functions provided in sr-spacetime.cc int CalculaNCj(short **MSpace, const int EvtN, const int EvtJ); int ContaEvt(short **MSpace, const int EvtN, const int EvtJ); //int SistemadeVigilancia(SVEventLst &, const double RaioC, const double epslon, // std::valarray &R); //New version with different estimation approach int SistemadeVigilancia(SVEventLst &ev, const double RaioC, const double epslon, const double areaA, double *areaAcapBk, const int cusum, std::valarray &R); int CalculaLambda(SVEventLst &ev, const double RaioC, const double epslon, std::valarray &R, unsigned int &numObs); // Hoehle wrapper function to create SVEvent list //void SRspacetime(double *x, double *y, double *t, int *n, double *radius, double *epsilon, double *Rarray); #endif surveillance/src/backproj.cc0000755000176000001440000000271312242645665015711 0ustar ripleyusers#include using namespace Rcpp; RcppExport SEXP eq3a(SEXP rlambdaOld, SEXP ry, SEXP rincuPmf) { BEGIN_RCPP // get arguments NumericVector lambdaOld(rlambdaOld); int T = lambdaOld.length(); NumericVector y(ry); NumericVector incuPmf(rincuPmf); // Create long enough vectors for queries about dincu and pincu NumericVector dincu(T); NumericVector pincu(T); pincu[0] = dincu[0]; for (int i=1; i * Date: Aug 2008 * * * Header file containing wrappers for GSL related calls * to R calls using the R API. This code is used in twins.cc *******************************************************************/ /* new definitions to replace GSL code */ // Remove the dead RNG variable (DSB 04/05/2010): // int r; double gsl_rng_uniform () { // GetRNGstate(); double res = runif(0,1); //PutRNGstate(); return(res); } double gsl_ran_gaussian(double sigma) { //GetRNGstate(); double res = rnorm(0.0,sigma); //PutRNGstate(); return(res); } double gsl_ran_gamma(double a, double b) { //GetRNGstate(); double res = rgamma(a,b); //PutRNGstate(); return(res); } unsigned int gsl_ran_poisson(double lambda) { //GetRNGstate(); unsigned int res = rpois(lambda); //PutRNGstate(); return(res); } unsigned int gsl_ran_binomial(double p, unsigned int n) { //GetRNGstate(); unsigned int res = rbinom(n,p); //PutRNGstate(); return(res); } //hoehle: The original function assumes mu>0, which needs not be the case! //This version handles that part. This is the log version. double gsl_ran_poisson_log_pdf (const unsigned int k, const double mu) { double p; if (mu==0) { return(log((double)(k == 0))); } else { double lf = lgammafn(k+1); /*gsl2R: gsl_sf_lnfact(k) */ p = k*log(mu) - lf - mu; return p; } } double gsl_sf_lngamma(double x) { return(lgammafn(x)); } double gsl_ran_beta_pdf (double x, double a, double b) { return(dbeta(x,a,b,0)); } /********************************************************************** * Log version of the Gamma pdf with mean a*b and variance a*b^2. * **********************************************************************/ double gsl_ran_gamma_log_pdf (const double x, const double a, const double b) { if (x < 0) { //This is problematic! return log((double)0) ; } else if (x == 0) { if (a == 1) return log(1/b) ; else return log((double)0) ; } else if (a == 1) { return -x/b - log(b) ; } else { double p; /*gsl2R: double lngamma = gsl_sf_lngamma (a);*/ double lngamma = lgammafn(a); p = (a-1)*log(x) - x/b - lngamma - a*log(b); return p; } } /* Seed random number generator */ //void gsl_rng_set(int r, long seed) { // set.seed(seed); //} surveillance/NAMESPACE0000644000176000001440000002626712237117221014230 0ustar ripleyusers### Load C code useDynLib(surveillance) ############### ### IMPORTS ### ############### ### Import all packages listed as Depends ### (for utils and xtable: only selected methods are imported) import(methods, grDevices, graphics, stats) import(Rcpp) ## although Rcpp is only used on C-level we need to "ensure that Rcpp is loaded ## so any dynamic linking to its code can be resolved. (There may be none, but ## there could be, now or in future.)" (B. Ripley, 2013-09-08) ## sp classes & utilities (bbox, coordinates, dimensions, overlay, plot, ...) ## (we "Depend" on package sp since it defines essential data classes & methods) import(sp) ### required generics for own methods (that's why we "Depend" on these packages) ## importFrom(stats, coef, vcov, logLik, nobs, residuals, confint, AIC, extractAIC, ## profile, simulate, update, terms, add1, drop1, predict) importFrom(utils, head, tail, toLatex) importFrom(xtable, xtable) # if we wouldn't "Depend" on xtable, our # xtable-methods would not be useable except if the # user attaches the xtable package himself ### required functions from utils and stats ## importFrom(stats, pnorm, cov2cor, ks.test, formula, rnorm, runif, step, dist, ## update.formula, terms.formula, rpois, rnbinom, setNames, ## na.omit, as.formula, pnbinom, qnbinom, qnorm, sd, glm, optim, ## poisson, ppois, qpois, predict.glm, summary.glm, quasipoisson, ## glm.fit) ## and many more... importFrom(utils, packageVersion, modifyList, capture.output, read.table, setTxtProgressBar, txtProgressBar, sessionInfo, head.matrix, str, flush.console, write.table) ### sampling from mv.Gausian for OSAIC weights (twinSIR) and iafplot (twinstim) importFrom(MASS, mvrnorm) ### disProg-specific importFrom(MASS, glm.nb) # for algo.glrnb ##importFrom(msm, msm, hmmPois, viterbi.msm) # for algo.hmm() ##importFrom(spc, xcusum.arl, xcusum.crit) # for find.kh() ## (packages msm and spc are now "suggested", not imported) ### hhh4-specific importFrom(MASS, ginv) importFrom(Matrix, Matrix) importClassesFrom(Matrix, ddiMatrix) importMethodsFrom(Matrix, coerce, diag, forceSymmetric, solve) ## sparse matrix methods provide a significant speed-up in marFisher ### twinSIR-specific # for use in computing OSAIC weights by simulation #importFrom(quadprog, solve.QP) # moved to "Suggests" ### twinstim-specific importFrom(spatstat, area.owin, as.im.function, coords.ppp, diameter, diameter.owin, disc, distppl, inside.owin, intersect.owin, is.polygonal, marks, runifpoint, shift.owin) importFrom(polyCub, polyCub, polyCub.SV, polyCub.midpoint, xylist) importMethodsFrom(polyCub, coerce) importFrom(MASS, kde2d) ############### ### EXPORTS ### ############### ### general exports export(surveillance.options, reset.surveillance.options) export(animate) # new S3-generic export(R0) # new S3-generic export(intensityplot) # new S3-generic export(formatPval) # yapf -- yet another p-value formatter export(anscombe.residuals) export(magic.dim, primeFactors, bestCombination) # similar to n2mfrow export(isoWeekYear) export(refvalIdxByDate) export(ks.plot.unif) export(checkResidualProcess) # for twinstim and twinSIR # spatial utilities export(discpoly) #export(runifdisc) # CAVE: spatstat has similar function of same name export(unionSpatialPolygons) export(inside.gpc.poly) S3method(scale, gpc.poly) # redefined method for gpc.poly in spatial_stuff.R S3method(diameter, gpc.poly) export(nbOrder) export(poly2adjmat) export(polyAtBorder) # randomly break tied event times or coordinates export(untie) # new S3-generic #export(untie.default, untie.matrix, untie.epidataCS) S3method(untie, default) S3method(untie, matrix) S3method(untie, epidataCS) # intersection of a polygonal and a circular domain export(intersectPolyCircle) S3method(intersectPolyCircle, owin) S3method(intersectPolyCircle, SpatialPolygons) S3method(intersectPolyCircle, gpc.poly) # little helper: multiplicity of points export(multiplicity) # new S3-generic S3method(multiplicity, default) S3method(multiplicity, Spatial) # Spatio-temporal cluster detection export(stcd) ### sts(BP)-specific exportClasses(sts, stsBP) # generics for sts class defined in sts.R exportMethods("[", plot) exportMethods(nrow, ncol, dim, colnames, epochInYear, year) exportMethods(aggregate) exportMethods(as.data.frame) # methods for accessing/replacing slots of an sts object (as defined in AllGeneric.R) exportMethods(epoch,observed,alarms,upperbound,population,control,multinomialTS,neighbourhood) exportMethods("epoch<-","observed<-","alarms<-","upperbound<-","population<-","control<-","multinomialTS<-","neighbourhood<-") export(linelist2sts) export(wrap.algo, farrington, bayes, rki, cusum, glrpois, glrnb, outbreakP) # rogerson, hmm export(earsC) export(farringtonFlexible) export(categoricalCUSUM, pairedbinCUSUM, pairedbinCUSUM.runlength) export(nowcast, backprojNP) ## auxiliary functions for farringtonFlexible: ## export(algo.farrington.data.glm, algo.farrington.fitGLM.flexible, ## algo.farrington.glm, algo.farrington.referencetimepoints, ## algo.farrington.threshold.farrington, algo.farrington.threshold.noufaily) ### disProg-specific export(create.disProg, readData, toFileDisProg) S3method(print, disProg) S3method(plot, disProg) S3method(plot, disProg.one) S3method(aggregate, disProg) export(sim.pointSource, sim.seasonalNoise) export(LRCUSUM.runlength, arlCusum, find.kh, findH, hValues, findK) export(compMatrix.writeTable, correct53to52, enlargeData) export(makePlot) export(estimateGLRNbHook) export(algo.compare, algo.quality, algo.summary) ## outbreak detection algorithms (old disProg implementations) export(algo.bayes, algo.bayes1, algo.bayes2, algo.bayes3, algo.bayesLatestTimepoint, algo.call, algo.cdc, algo.cdcLatestTimepoint, algo.cusum, algo.farrington, algo.glrnb, algo.glrpois, algo.hhh, algo.hhh.grid, algo.hmm, algo.outbreakP, algo.rki, algo.rki1, algo.rki2, algo.rki3, algo.rkiLatestTimepoint, algo.rogerson, algo.twins) ## auxiliary functions for algo.farrington (FIXME: why do we export these internals?) export(algo.farrington.assign.weights, algo.farrington.fitGLM, algo.farrington.fitGLM.fast, algo.farrington.fitGLM.populationOffset, algo.farrington.threshold) S3method(plot, atwins) S3method(plot, survRes) S3method(plot, survRes.one) S3method(print, algoQV) S3method(xtable, algoQV) export(test, testSim) # FIXME: do we really want that? # if not, then we have to prefix all test() and testSim() calls in the # corresponding examples in the Rd files by "surveillance:::" ### conversion between old disProg and new sts classes export(disProg2sts) export(sts2disProg) ### twinSIR-specific export(cox) export(as.epidata) S3method(as.epidata, default) export(as.epidata.default) # for convenience export(intersperse) export(twinSIR) export(stateplot) export(simEpidata) S3method("[", epidata) S3method(print, epidata) S3method(summary, epidata) S3method(print, summary.epidata) S3method(plot, epidata) S3method(animate, epidata) S3method(plot, summary.epidata) S3method(animate, summary.epidata) S3method(print, twinSIR) S3method(summary, twinSIR) S3method(print, summary.twinSIR) S3method(plot, twinSIR) S3method(intensityplot, twinSIR) export(intensityplot.twinSIR) # for convenience S3method(profile, twinSIR) S3method(vcov, twinSIR) S3method(logLik, twinSIR) S3method(AIC, twinSIR) S3method(extractAIC, twinSIR) S3method(simulate, twinSIR) export(simulate.twinSIR) # for convenience S3method(residuals, twinSIR) S3method(intensityplot, simEpidata) export(intensityplot.simEpidata) # for convenience ### twinstim-specific export(as.epidataCS) export(twinstim) export(simEpidataCS) export(siaf.constant, siaf.gaussian, siaf.lomax, qlomax, siaf.powerlaw, siaf.powerlawL) export(tiaf.constant, tiaf.exponential) export(epidataCS2sts) S3method(nobs, epidataCS) S3method("[", epidataCS) S3method(update, epidataCS) export(update.epidataCS) # for convenience S3method(head, epidataCS) S3method(tail, epidataCS) S3method(print, epidataCS) S3method(subset, epidataCS) S3method(summary, epidataCS) S3method(print, summary.epidataCS) S3method(animate, epidataCS) export(animate.epidataCS) # for convenience export(marks) # as imported from spatstat S3method(marks, epidataCS) export(marks.epidataCS) # for convenience since its a foreign generic S3method(plot, epidataCS) S3method(as.epidata, epidataCS) export(as.epidata.epidataCS) # for convenience S3method(print, twinstim) S3method(summary, twinstim) export(summary.twinstim) # for convenience S3method(print, summary.twinstim) S3method(toLatex, summary.twinstim) S3method(xtable, summary.twinstim) export(xtable.summary.twinstim) # for xtable.twinstim S3method(xtable, twinstim) S3method(plot, twinstim) export(iafplot) export(intensity.twinstim) S3method(intensityplot, twinstim) export(intensityplot.twinstim) # for convenience S3method(profile, twinstim) S3method(coef, summary.twinstim) S3method(vcov, twinstim) S3method(vcov, summary.twinstim) S3method(logLik, twinstim) S3method(extractAIC, twinstim) S3method(nobs, twinstim) S3method(simulate, twinstim) export(simulate.twinstim) # for convenience S3method(R0, twinstim) S3method(residuals, twinstim) S3method(update, twinstim) export(update.twinstim) # for convenience S3method(terms, twinstim) export(stepComponent) S3method(terms, twinstim_stependemic) S3method(terms, twinstim_stepepidemic) S3method(update, twinstim_stependemic) S3method(update, twinstim_stepepidemic) S3method(add1, twinstim) S3method(add1, twinstim_stependemic) S3method(add1, twinstim_stepepidemic) S3method(drop1, twinstim) S3method(drop1, twinstim_stependemic) S3method(drop1, twinstim_stepepidemic) S3method(R0, simEpidataCS) S3method(intensityplot, simEpidataCS) export(intensityplot.simEpidataCS) # for convenience S3method(print, simEpidataCSlist) S3method("[[", simEpidataCSlist) S3method(plot, simEpidataCSlist) ### hhh-specific export(algo.hhh) export(algo.hhh.grid) export(create.grid) S3method(print, ah) S3method(coef, ah) S3method(predict, ah) S3method(residuals, ah) S3method(logLik, ah) S3method(print, ahg) S3method(coef, ahg) S3method(predict, ahg) S3method(residuals, ahg) S3method(logLik, ahg) export(hhh4) export(addSeason2formula) export(zetaweights, powerlaw) export(ranef) # S3-generic export(fixef) # S3-generic S3method(print, ah4) S3method(print, summary.ah4) S3method(summary, ah4) S3method(coef, ah4) S3method(logLik, ah4) S3method(AIC, ah4) S3method(fixef, ah4) S3method(ranef, ah4) S3method(confint, ah4) S3method(predict, ah4) S3method(plot, ah4) S3method(update, ah4) export(simHHH, simHHH.default) S3method(simHHH, default) S3method(simHHH, ah) S3method(simulate, ah4) export(oneStepAhead) export(scores) # functions not yet documented, but used in (dontrun) part of example(hhh4) export(permutationTest) export(pit) surveillance/demo/0000755000176000001440000000000012242645665013736 5ustar ripleyuserssurveillance/demo/cost.R0000644000176000001440000002100511731650465015023 0ustar ripleyusers################################################### ### chunk number 1: ################################################### library(surveillance) options(width=70) options("prompt"="R> ") set.seed(1234) opendevice <- function(horizontal=TRUE,width=7,height=4,...) { #This function is not really necessary for the demo session. ## #pdf(...,width=width,height=height) #Do it for postscript instead -- who uses postscript these days?? args <- list(...) args$file <- sub(".pdf",".eps",args$file) args$width <- width args$height <- height args$horizontal <- FALSE do.call("postscript",args) par(mar=c(4,4,2,2)) } ################################################### ### chunk number 2: K1 ################################################### data("ha") plot(aggregate(ha),main="Hepatitis A in Berlin 2001-2006") ################################################### ### chunk number 3: ################################################### cat("Info: I need a writable figs/ directory in getwd()\n") opendevice(file="figs/002.pdf") data("ha") plot(aggregate(ha),main="Hepatitis A in Berlin 2001-2006") dev.off() ################################################### ### chunk number 4: ################################################### sps <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) plot(sps,xaxis.years=FALSE) ################################################### ### chunk number 5: ################################################### opendevice(file="figs/003.pdf") plot(sps,xaxis.years=FALSE,legend.opts=list(x="topleft")) dev.off() ################################################### ### chunk number 6: HAB662 eval=FALSE ################################################### ## ha.b662 <- algo.bayes(aggregate(ha), control = list(range = 209:290, b = 2, w = 6, alpha = 0.01)) ## plot(ha.b662, firstweek=1, startyear = 2005) ################################################### ### chunk number 7: ################################################### ha.b662 <- algo.bayes(aggregate(ha), control = list(range = 209:290, b = 2, w = 6, alpha = 0.01)) plot(ha.b662, firstweek=1, startyear = 2005) opendevice(file="figs/hab662.pdf") plot(ha.b662, firstweek=1, startyear = 2005,legend.opts=list(x="topleft",horiz=TRUE)) dev.off() ################################################### ### chunk number 8: FACDC eval=FALSE ################################################### ## cntrl <- list(range = 300:400, m = 1, w = 3, b = 5, alpha = 0.01) ## sps.cdc <- algo.cdc(sps, control = cntrl) ## sps.farrington <- algo.farrington(sps, control = cntrl) ################################################### ### chunk number 9: ################################################### cntrl <- list(range = 300:400, m = 1, w = 3, b = 5, alpha = 0.01) sps.cdc <- algo.cdc(sps, control = cntrl) sps.farrington <- algo.farrington(sps, control = cntrl) ################################################### ### chunk number 10: ################################################### opendevice(file="figs/farringtoncdc.pdf") par(mfcol = c(1, 2),cex=0.8) plot(sps.cdc, legend = NULL, xaxis.years=FALSE) plot(sps.farrington, legend = NULL, xaxis.years=FALSE) dev.off() ################################################### ### chunk number 11: CUSUM eval=FALSE ################################################### ## kh <- find.kh(ARLa=500,ARLr=7) ## ha.cusum <- algo.cusum(aggregate(ha),control=list(k=kh$k,h=kh$h,m="glm",trans="rossi",range=209:290)) ################################################### ### chunk number 12: ################################################### opendevice(file="figs/hacusum.pdf") kh <- find.kh(ARLa=500,ARLr=7) ha.cusum <- algo.cusum(aggregate(ha),control=list(k=kh$k,h=kh$h,m="glm",trans="rossi",range=209:290)) plot(ha.cusum,startyear=2005,legend.opts=list(x=30,y=5.5)) dev.off() #Extract coefficients beta <- coef(ha.cusum$control$m.glm) ################################################### ### chunk number 13: ################################################### print(algo.quality(ha.b662)) ################################################### ### chunk number 14: ################################################### #This chunk contains stuff the reader should not see, but which is necessary #for the visual block to work. control = list( list(funcName = "rki1"), list(funcName = "rki2"), list(funcName = "rki3"), list(funcName = "bayes1"), list(funcName = "bayes2"), list(funcName = "bayes3"), # list(funcName = "cdc",alpha=0.05,b=2,m=1), # list(funcName = "farrington",alpha=0.05,b=0,w=6), list(funcName = "farrington",alpha=0.05,b=1,w=6), list(funcName = "farrington",alpha=0.05,b=2,w=4)) control <- lapply(control,function(ctrl) {ctrl$range <- 300:400;return(ctrl)}) #Update range in each - cyclic continuation data("k1") range = (2*4*52) + 1:length(k1$observed) aparv.control <- lapply(control,function(cntrl) { cntrl$range=range;return(cntrl)}) #Outbreaks outbrks <- c("m1", "m2", "m3", "m4", "m5", "q1_nrwh", "q2", "s1", "s2", "s3", "k1", "n1", "n2", "h1_nrwrp") #Load and enlarge data. outbrks <- lapply(outbrks,function(name) { #Load with data eval(substitute(data(name),list(name=name))) enlargeData(get(name),range=1:(4*52),times=2) }) #Apply function to one surv.one <- function(outbrk) { algo.compare(algo.call(outbrk,control=aparv.control)) } ################################################### ### chunk number 15: eval=FALSE ################################################### ## #Apply function to one ## surv.one <- function(outbrk) { ## algo.compare(algo.call(outbrk,control=aparv.control)) ## } ## ## algo.summary(lapply(outbrks, surv.one)) ## ################################################### ### chunk number 16: ALGOSUMMARY ################################################### res <- algo.summary(lapply(outbrks,surv.one)) ################################################### ### chunk number 17: ################################################### print(res,digits=3) ################################################### ### chunk number 18: eval=FALSE ################################################### ## setClass( "sts", representation(week = "numeric", ## freq = "numeric", ## start = "numeric", ## observed = "matrix", ## state = "matrix", ## alarm = "matrix", ## upperbound = "matrix", ## neighbourhood= "matrix", ## populationFrac= "matrix", ## map = "SpatialPolygonsDataFrame", ## control = "list")) ## ################################################### ### chunk number 19: HA eval=FALSE ################################################### ## shp <- system.file("shapes/berlin.shp",package="surveillance") ## ha <- disProg2sts(ha, map=readShapePoly(shp,IDvar="SNAME")) ## plot(ha,type=observed ~ 1 | unit) ## ################################################### ### chunk number 20: ################################################### opendevice(file="figs/ha-1unit.pdf",width=7,height=7) par(mar=c(0,0,0,0)) shp <- system.file("shapes/berlin.shp",package="surveillance") ha <- disProg2sts(ha, map=readShapePoly(shp,IDvar="SNAME")) plot(ha,type=observed ~ 1 | unit) dev.off() ################################################### ### chunk number 21: HA:MAP eval=FALSE ################################################### ## ha4 <- aggregate(ha[,c("pank","mitt","frkr","scho","chwi","neuk")],nfreq=13) ## ha4.cusum <- cusum(ha4,control=list(k=1.5,h=1.75,m="glm",trans="rossi",range=52:73)) ## #ha4.b332 <- bayes(ha4,control=list(range=52:73,b=2,w=3,alpha=0.01/6)) ## plot(ha4.cusum,type=observed ~ time | unit) ################################################### ### chunk number 22: ################################################### opendevice(file="figs/ha-timeunit.pdf",width=7,height=5) ha4 <- aggregate(ha[,c("pank","mitt","frkr","scho","chwi","neuk")],nfreq=13) ha4.cusum <- cusum(ha4,control=list(k=1.5,h=1.75,m="glm",trans="rossi",range=52:73)) #ha4.b332 <- bayes(ha4,control=list(range=52:73,b=2,w=3,alpha=0.01/6)) plot(ha4.cusum,type=observed ~ time | unit) dev.off() surveillance/demo/biosurvbook.R0000644000176000001440000002072712237205241016417 0ustar ripleyusers###################################################################### # Demo of the code used in the book chapter # Hoehle, M. and A. Mazick, A. (2010) Aberration detection in R # illustrated by Danish mortality monitoring, Book chapter in # T. Kass-Hout and X. Zhang (Eds.) Biosurveillance: A Health Protection # Priority, CRC Press. # # The data read by csv files in the chapter are found as data("momo") # in the package. Courtesy to Statens Serum Institut for making # the mortality data public. # # Author: Michael Hoehle # Date: 13 Oct 2009 ###################################################################### #Load surveillance package library("surveillance") #Load Danish mortality data (see book chapter for CSV reading") data("momo") #Create a plot of the data as in Figure. 1 of the book chapter plot(momo[year(momo)>=2000,],ylab="No. of deaths",par.list=list(mar=c(4,2.2,2,1),cex.axis=1.5), type=observed ~ time | unit, col=c(gray(0.3),NA,NA),xaxis.units=FALSE,xlab="time (weeks)") par(mfrow=c(1,2),mar=c(4,4,2,1)) plot(momo,ylab="No. of deaths",xlab="time (weeks)",legend.opts=NULL, type=observed ~ time,col=c(gray(0.3),NA,NA)) plot(momo[,"[0,1)"],xlab="time (weeks)",ylab="No. of deaths",legend.opts=NULL,col=c(gray(0.3),NA,NA)) par(mfrow=c(1,1)) #Monitoring starts in week 40, 2007 phase2 <- which(epoch(momo) >= "2007-10-01") s.far <- farrington(momo[,"[0,1)"], control=list(range=phase2,alpha=0.01,b=5,w=4,powertrans="none")) cntrlFar <- s.far@control upper.ptnone <-s.far@upperbound cntrlFar$powertrans <- "2/3" upper.pt23 <- farrington(momo[,"[0,1)"],control=cntrlFar)@upperbound cntrlFar$powertrans <- "1/2" upper.pt12 <- farrington(momo[,"[0,1)"],control=cntrlFar)@upperbound ## plot(s.far,ylab="No. of deaths",xlab="time (weeks)",main="") ymax <- max(s.far@upperbound, upper.pt12, upper.pt23)*1.2 #par(mar=c(4,4,1,1)) plot(s.far,legend.opts=NULL,ylab="No. of deaths",main="",xlab="time (weeks)",ylim=c(0,ymax),col=c("darkgray",NA,gray(0.3)),lty=c(1,1,1),lwd=c(1,1,2),dx.upperbound=0,alarm.symbol=list(pch=24,col=1, cex=1)) lines(c(1:nrow(s.far)-0.5,nrow(s.far)+0.5),c(upper.pt12,upper.pt12[nrow(s.far)]),type="s",col="darkgray",lwd=2,lty=2) lines(c(1:nrow(s.far)-0.5,nrow(s.far)+0.5),c(upper.pt23,upper.pt23[nrow(s.far)]),type="s",col=gray(0.1),lwd=2,lty=3) legend(x="topright",c("none","1/2","2/3"),col=c(gray(0.3),"darkgray",gray(0.1)),lwd=2,lty=1:3,horiz=TRUE) #legend(x="topright",c("none","1/2","2/3",expression(hat(mu)[t[0]])),col=c(gray(0.3),"darkgray",gray(0.1),1),lwd=c(2,2,2,3),lty=c(1:3,1),horiz=TRUE) #Median of predictive distribution lines(c(1:nrow(s.far)-0.5,nrow(s.far)+0.5),c(s.far@control$pd[,2],s.far@control$pd[nrow(s.far),2]),type="s",col=1,lwd=3) text(nrow(s.far)+2,tail(observed(s.far),n=1),expression(hat(mu)[t[0]])) alarmDates <- epoch(s.far[alarms(s.far) == 1,]) par(mar=c(4,4,2,2)) surv2 <- s.far surv2@observed <- 0*surv2@observed surv2@upperbound <- 0*surv2@observed plot(surv2,ylim=c(-0.05,1),ylab="Quantile",xlab="time (weeks)",legend.opts=NULL,main="",dx.upperbound=0,alarm.symbol=list(pch=24,col=1, cex=1)) lines(surv2@control$pd[,1], type="S") lines( c(1,nrow(surv2)+0.), rep( 1-s.far@control$alpha/2, 2),lty=2,col=1) s.far.all <- farrington(momo, control=list(range=phase2,alpha=0.01,b=5,w=4)) ## s.far.all <- farrington(momo, control=list(range=phase2,alpha=0.01,b=5,w=4)) ## plot(s.far.all,type = alarm ~ time,xlab="time (weeks)") par(mar=c(4,4,1,1)) plot(s.far.all,type = alarm ~ time,xlab="time (weeks)",main="",alarm.symbol=list(pch=24,col=1, cex=1),lvl=rep(0,nrow(s.far.all))) ####################################################################### #Negative binomial GLM modelling using the population size as covariate ####################################################################### phase1 <- which(year(momo) == 2002 & epochInYear(momo) == 40):(phase2[1]-1) momo.df <- as.data.frame(momo) m <- MASS::glm.nb( `observed.[75,85)` ~ 1 + epoch + sin(2*pi*epochInPeriod) + cos(2*pi*epochInPeriod) + `population.[75,85)`, data=momo.df[phase1,]) mu0 <- predict(m, newdata=momo.df[phase2,],type="response") ci <- confint(m) kappa <- 1.2 s.nb <- glrnb(momo[,"[75,85)"], control=list(range=phase2,alpha=1/m$theta,mu0=mu0,c.ARL=4.75,theta=log(kappa),ret="cases")) alarmDates <- epoch(s.nb[alarms(s.nb) == 1,]) plot(s.nb,dx.upperbound=0,legend.opts=NULL,ylab="No. of deaths",main="",ylim=c(0,max(observed(s.nb))*1.1),xlab="time (weeks)",col=c("darkgray",NA,1),lwd=c(1,1,2),lty=c(1,1,1),alarm.symbol=list(pch=24,col=1, cex=1)) lines(mu0,lwd=2,col=1,lty=2) lines(exp(log(mu0) + log(kappa)),col=1,lty=3,lwd=3) legend(x=20,y=100,c(expression(mu[0,t]),expression(mu[1,t]),"NNBA"),col=c(1,1,1),lty=c(2,3,1),horiz=TRUE,bg="white",lwd=c(2,3,2)) set.seed(123) ###################################################################### # P(N_c <= 51|\tau=\infty) computation ###################################################################### #Number of simulations to perform. In book chapter this number is #1000, but for the sake of a speedy illustration this is drastically #reduced in this demonstration nSims <- 10 #1000 ###################################################################### # Simulate one run-length by first generating data from the negative # binomial model and then applying the LR NegBin CUSUM to it ###################################################################### simone.TAleq65 <- function(sts, g) { observed(sts)[phase2,] <- rnbinom(length(mu0), mu=mu0, size=m$theta) one <- glrnb(sts, control=modifyList(control(s.nb), list(c.ARL=g))) return(any(alarms(one))) } #Determine run-length using 1000 Monte Carlo samples g.grid <- seq(1,8,by=0.5) pMC <- sapply(g.grid, function(g) { mean(replicate(nSims, simone.TAleq65(momo[,"[75,85)"],g))) }) #Density for comparison in the negative binomial distribution dY <- function(y,mu,log=FALSE, alpha, ...) { dnbinom(y, mu=mu, size=1/alpha, log=log) } #nMax <- max(which( dY(0:1e4, mu=max(mu0),alpha=1/m$theta) >= 1e-20)) - 1 pMarkovChain <- sapply( g.grid, function(g) { TA <- LRCUSUM.runlength( mu=t(mu0), mu0=t(mu0), mu1=kappa*t(mu0), h=g, dfun = dY, n=rep(600,length(mu0)), alpha=1/m$theta) return(tail(TA$cdf,n=1)) }) par(mar=c(4,4,2,2)) matplot(g.grid, cbind(pMC,pMarkovChain),type="l",ylab=expression(P(T[A] <= 65 * "|" * tau * "=" * infinity)),xlab="g",col=1) prob <- 0.1 lines(range(g.grid),rep(prob,2),lty=3,lwd=2) axis(2,at=prob,las=1,cex.axis=0.7) legend(x="topright",c("Monte Carlo","Markov chain"), lty=1:2,col=1) m.01 <- MASS::glm.nb( `observed.[0,1)` ~ 1 + epoch + `population.[0,1)`+ sin(2*pi*epochInPeriod) + cos(2*pi*epochInPeriod), data=momo.df[phase1,]) mu0 <- predict(m.01, newdata=momo.df[phase2,],type="response") #Correct for past outbreaks #omega <- algo.farrington.assign.weights(residuals(m.01, type="deviance")) #m.01.refit <- glm.nb( `observed.[0,1)` ~ 1 + epoch + `population.[0,1)`+ sin(2*pi*epochInPeriod) + cos(2*pi*epochInPeriod), data=momo.df[phase1,],weights=omega) #mu0.refit <- predict(m.01.refit, newdata=momo.df[phase2,],type="response") #Results from the previous Farrington method mu0.far <- control(s.far)$pd[,2] ###################################################################### # Simulate one run-length by first generating data from the negative # binomial model and then applying the LR NegBin CUSUM to it ###################################################################### simone.TAleq65.far <- function(sts, alpha, mu0, size) { observed(sts)[phase2,] <- rnbinom(length(mu0), mu=mu0, size=size) res <- farrington(sts, control=modifyList(control(s.far), list(alpha=alpha))) return(any(as.logical(alarms(res)))) } #Determine run-length using 1000 Monte Carlo samples res.far <- replicate(nSims, simone.TAleq65.far(momo[,"[0,1)"],alpha=0.01,mu0=mu0.far,size=m.01$theta)) (pTA65.far <- mean(res.far)) #Run CUSUM kappa <- 1.2 s.nb.01 <- glrnb(momo[,"[0,1)"], control=list(range=phase2,alpha=1/m.01$theta,mu0=mu0.far,c.ARL=2.1,theta=log(kappa),ret="cases")) alarmDates <- epoch(s.nb.01[alarms(s.nb.01) == 1,]) mu1 <- kappa*mu0.far #Show as usual plot(s.nb.01,dx.upperbound=0,legend.opts=NULL,ylab="No. of deaths",main="",xlab="time (weeks)",col=c("darkgray",NA,1),lwd=c(1,1,1),lty=c(1,1,1),ylim=c(0,max(s.nb.01@upperbound))*1.15,alarm.symbol=list(pch=24,col=1, cex=1)) lines(1:(nrow(s.far)+1)-0.5, c(mu0.far,tail(mu0.far,n=1)),lwd=3,col=1,lty=1,type="s") lines(1:(nrow(s.far)+1)-0.5, c(mu1,tail(mu1,n=1)),col=1,lty=3,lwd=3,type="s") legend(x="topright",c(expression(mu[0,t]),expression(mu[1,t]),"NNBA"),col=c(1,1,1),lty=c(1,3,1),horiz=TRUE,bg="white",lwd=c(3,3,1)) ## demo(biosurvbook) surveillance/demo/00Index0000755000176000001440000000036411731650465015072 0ustar ripleyuserscost Run all commands in the Computational Statistics article. Requires a directory "figs" in the current working directory. biosurvbook Run all commands from the book chapter on Danish mortality monitoring using the surveillance package. surveillance/data/0000755000176000001440000000000012242645665013723 5ustar ripleyuserssurveillance/data/m4.RData0000644000176000001440000000037711765414544015166 0ustar ripleyusers r0b```b`bad`b2Y#'H<ׄY$ ļ@|xH<#:FꙡY3&@7] %EX -ʖby bvZN4Bb@r6r@w(c -/CQ0 F  0Ac(Cּb C@ r'$B9,iEHE%F&$ÌQ@)E@?Ÿ surveillance/data/foodata.RData0000644000176000001440000014562511765414544016271 0ustar ripleyusers]ep}%$BBOJgSBATT(ł/ BPA4AHW Ed(#  {מg>Iֺ=+s@Fۯ\l_ZdV([9N?ޟe]ZpkO+۽tZN[^xinC.Z#>ZQ͵Zku笧Z^ZkݬnYwZNۭ?ֺa+hnSo5춄Zfylo3ZkݰOֺa?3ѝֺY%Zkݬ;/L/xNkumkZ7Λ}>}Zs~vZkݬx}SYGZkw&Zk??|Xku~ng8zZZ\}in֝YZ)c?xNhnC7Yp_kuܖZ:AkuwG.[zZ7*<^|Zk Zk_}YkuL ZkݰpqZf=tYi&ZkYkCknC/~ͥopZfݹyyLku:'auin4?ֺa+/inO̻o^ͺskqZf=ͫGZkݬ;=d xs5Z7_\rӣ?M <.ֺaOڟgZ7롩↭?Mkuþ{G|`׵Z7#ՏzOGku~ckLku8z%inOp;n~ZJk/d C:SZkݬ;/|o]4ֺaOGxZkMcF}kkn8W7Zkݰt̴?8\kuZkugʼGݘvZ}O']1o_Zkݬn{sin֝W6OZ}Vv쨟ֺa?3_Zkujy{z'O\~s sO\)Zk~~tZ}9 Zkݬm]5Zku~;]kuzn'ZEOzӵZ7n{3wZfymaֺa[}KZk[YRkuzOZ7/ Nz=VZkݬ;pߝwCz/ݳ|Sku<>a\|Zf=rpZfyt>ҰZ71ֺap^) {<ֺ̥a?ySOn %6tTZfy#G uZ}ᑯxGinCw^|{Iku~S[GڛZkwB?ֺaO;ח]Z73ֺa?poorZkufa#Z7|`kֺYw^9|Uysz777IZ7.}Zf]/pIqZkup“Z7I_{υ?_Dku~Wۮx hn֝Gzȟy.ֺa֏lZfݹsuwֺYi5SZ7*hyZfy=>;rknӞaSֺ߯a?zo8t췵Z7롇v ֺYw~){|Vku{˝"Zkݰ]쭻?mZkuE=Zf=ceZkݰos_<> {yx/knӷjn֝)<_Zkݬ^w.[I |/]ZΧ\?Zkݰ_^o߼tٯZ7_&:eZkݰ?_?xCku~COswhn֝gvХɶZkݰO]ֺY]g=|YͺsmЧ\$Zkݬ;~S.Nkuuw}ֺYw;ߞ:SZk1KCwܨֺYw{3nͺj|ɘ~Zf=agin֝Wz&Zk?[>ֺY=>0WZ7αsouGku ?|oinoDͺj kOhu<.=3mδ?Z{ q'Rh~/Vw~Uߩ#WSUo|_mm;PK߷j[e׍?ÿZGo/vUD?Ъc<㸪h|Z*J_9~;_-}crC5']M_)V}jR VU|jTO] |gNujb}|d5b7piE5[ tՈsF׉ՈigFnxOݶN5r^s=F1?_djON>gͧF޸!y_y'Oqďy\;[\jݎ]mޫy[; C|>̟W>+~pj>[fc\ 6~ߊTz}cj3.g&mp5߅gwT=J5jѲը7ޯ>իQ}|T׸ݬȦ'igoVu"kj̻R^UN8ݫs=fWVZ.[}CnFG?ug5z$T{+7џ:wfj?/}}8va맮4TcZ5yVcÛ_~5fs'Tc>vs^ȵ;Vc\1a1\4u1Wg~j 槯ƼvwڤZ`OmήX~_\\-۷T :; W ~r'sFs?sE/X-ԝsPw>KkW uk/sPw9[;g u>Ppwy[;otm>6[Z-ҝEHwۢ9[tW>ilhwb}.)beNbؤ/tz?}#{$|<Ӗ:Z;ybӿ4zO&.M?Ǝx#N_;k=dj>glɯVc/4ej|k~kܩ{zM5N{hj\ׂgL|7b]ijܸ R[1;tP5nn^򀋪q[=fոvܦոykW|ZOո78,Q-^KY->rj?{7{Z%?:lߙ|XҏWz+-WK o_ݏXޤZ⎡s~fXݼͦՒ,ܣZת1[ uroܗWsڝ^Z<; ~=o7?~۪ Orǽ^mx}g 矷c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l==j`=W=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=c{l=}aX5~BnZ""+MUk_̤yvEDfteyhzu[DzG1쬈Hw4_=gYDoO=s,">MwDE4zδOKsED{̠U-"2ikZk=sv?=>oizȬNZksg~OZk=[^XdV=Zk_̦/ADiZY49""Mt,Zkֺ[4i,"4I݌Eh ZizomqDD?"kEDmܜfhs"2aWDD{uGދY""3{6XD_ŮM AZDf>M/Ed~M-"g섈HCZk-"8M`~=w{gM=:4GgEf#MJ4/zZDf]ֽH?~)[4)̠yeiSD?H7m~M?Ȝ@{{cwm""3hz4ZLʸ""Ag$"2{g ȻO{Ȭ."4=nvKӽEd֡^h_ZkZkkMZk""4}hZkOh_kZkZkO_hZ떈MZkZEDDDD/4\kuKDDDDDkZkO7%Zk["""""W4\kuKDDDDDDDDDD~ZkZkֺ?-""""""""""""""""owhZkOs-#Zk'M-+~Zku?YDDZkZki M?ZkZk["""""""""""""4'jZkOa -iιA~}+oP~'8/,uhyZkg{GrikV=#k-9huoSb\s[Z+ﰝIv>]W~Y}uooAk3~[w\ሩ9huUDžW^([w.Zw]rP֝9huUШ_o޺kŧpZku}3Znl{YsZ뮫xGsY I-Ak⟏ZC.{c=rZkuOA֝Gh砵]Wнuwo9huUuoݙz6]sZ뮫Ւuoyh+AkW6SѽuY>v|>B[w6ttsZ뮫u7޺ĄI9huU>7޺guoy􂧮Ak=:_ӽu-;9huU>?7[w&5nsZ뮫bxvuoݹMֺğ. ;O_tg'sZkuUl޺o9huUqۋ޺3m9huU3_+>Q֝xdAkʯ޲1{3,q 砵]Ww\u {޺3s/?7sZ뮫{_to|8x\>˺5 UZw] |iuv{ֺje toݹ[Zw] LYzZ;g.q9hu\c{=-5i"砵]Wsm'u;w}w>;^ytoݹ~*-AkxG;S9fS8ѡo޺/_ֺjبgG[w rZku5lx7?;S;ΜZw] ۯ?C֝G8v|o=uo: <9huհX{^{ogLsZ뮫aVW{3>dAk+ﰝ;n<ቜZw]ͽ헞<-Nֺjv~g;<^vֺjgo{Γ<ֺjkuѽu-h/9hu܏+g@֝Ow砵]WC?v/޺tk9>XvϭtoݙvJ8|wtoݹϭAk;7;sZ뮫[;g9Sֺj'>ֽu牍_^Aki“#K֝'c<j+O޺3c?砵]WÏ=fڔ ޺sukpAAk{]W;m"砵]Wyq_f[wܮԽu~m2砵]W#vvW^G֝ɷ~ֺj^]|etoy+9huՈ: սu羱kZw]8b:;O|ɜZw]8 K[w;}zsZ뮫|=8]uoݹ{-ֺjĹSCuoݙ9huՈ˗_N[w^xуZw]nOzz{is?砵]W#nv7޺3eԂ#wֺj珎ܮ{}?AAkFLO|ig[w.5ZZw]xuoݙ9huՈwnYp޺3?^9hurU$΋l슈ȜDf?k.Ʈ{ADdƎxADD{TDY쇈#O"""""""""2;?=~{JyCx{xϊ7vZDȬYq9_q?EDf칈=x_Ȝ{&2ྋxOED@^{ADDf'DD9Ȝ.""[""R} """";-" ;!""2=/{;9/"a M"""2ߟw$FDDSD쯈?.Ȭ~IDDVDt절Ȭ""""~yxȟ"""޳",""}(""""~DDf/캈);{}~SI{̮=GDDzox?\Σ w?EDf/캈xωƮߋ~=/4'""ҿxOY}~s9_cDDdv{NfGk9Ȝwq~EDDuOEDdNND"2aDDdf""McDDdv{MDf 8""ҏx?H?}$"*KDD=yO""2+%""s{""\fGk>~IDdbWE ""2-"2g`EDDDDf>~]yx_cDD,Bڭ_e]y 6ۨW?~_}_'n+Zl/|vOg^{#ǚ?aƿڕ'ͳ³<|SƳ!xYos x~#z9eFfmn{~3m~6s6?wfg⹒%f9m^4潴[\71{fڼv>oy_szo๑_|ُv9o幓ޱ๜sTҮ ̞كvc} ~͜y/zn#q}\ůo'5Ѯ)<9s5ocv|v=WEރp}z_ROLלiifmخϥ>Gv}fwͬ/m֦CmҦmisfmv+`M]#YZ7mf7`zhgvm6g0;h׻P|צMm;v am:ڦm6mj6 ۠nw\͌ib}mӊ6wK9e]nsInWzn3>j3Om6wEַ4]bCA+6;Ӯ[}ݮl6os߶ia 6 nms6isgK_3 hSlug{.A42}С x}دysVI@ж3 x/O/Pf3+^w= . B{Ȝqr!nчt dCiنXyclgwC<]gЯ9 93 ٯ>3!?dgC"dBf9dzsҺ(dB*nLӄfu'hHAv7@/: Y KH;Bv=dzvҟ;*dBfz2a}2[Ȑ尞c0w3wOHsC?!ҵ= 뙬Zr&!32!{!mmZ'!;]^B&dC!;!3ҕE}?sW}=!ݐlH7zB0 w^E}7佇z~Ȝy'!ya=t,#a}jK*Y!'b31! iH{C*!ֳO##KT^f,=G;!gyzViH·t6dB5w!=xջQ+;Q[Ӝ !AȽ]GhHH B;b7BZrVʐV) ݐ WȹVT/gO+CҨ)!m GB\s!X̄bTwe]Ҍ*!^Ƚ4%1g!w[ȝҘz萻5dzOcCސ=񈽎.Mu;z>w}ڐ;+ BO{с]azƹB|#C6!ѼY!D+ګ$<45[2b"7}GN_;=G]D1̈7b#v'"bVc"?"f8#>oD4*b"9b/"f!D|g#b/"'=G45bV#ZqGDu^G 1c3︞g{ip̹ǜO,n.WD"iOL#sn<|+1{yc*GhLb2fbv!f&cf2><=f\;1h̜t$fcs̬ŜS9n=t>fbs1Azhs̽p>I1wO}19yN>.1}O垉3 1縞 zp 30 /#;y't af6gt/s1mbӡ'wBf"a*|>-1 lR'ER?b̾$<3 0 3ԍ1m+csi1{ mHD~&31wILc6c{-K@R7n; Khh%p'~^%FBc_1 42a L؏9J8Ǥ>+:йyNŤg»M|$%;Q ;Шn$Iw?-LӄNs't$1 ЃN&gB#= ^3wMs&p MMh~ž& {pw$xBzfK :йOК%rBsz0 ;0 { wLl%x^$<ل%4:[IZ$i®'t"ϖ%aw}I*Kp=܄2 I8τsME®%p%\2C ̈́{/JA.'E IصKرqք9MN̈́{#KƄ8>NUB{ШMhSR$\'- g½pO$T\'> JheBv0 С.&| OJ&k$x®'py>)3e'S:҆YJy')ssR~ϙ放QZ7t=eWSZ)H9IyW)2Sʬ˞*ݥRҟsII㔮t1efSz)mNiNʮt%Iُ]OٱRqURZsl) W)LՔOӔ]K9۔\MhFJ#RZrSʎf^\ʹ8eSf=eRڙpߤ4)S)MH٫t0_);2))s);r)KZ~Ĕ7e)ҤL٫aSO;RvDJS9?){2)wj=)ҤMÔ/)Lk\47)ZJRv3-)Jkʾ4*)3 HTJ_Sڐ)LiiOeƙeY/)LpfDVҝ͘asJ#Sv3ݥt!9)MӔH' 2>oƌeeV6<)Mٷv))NՌ8ߔw2f6cf2SYgYȘꙥ))NFgʘӌꙤm)KsRrUi#e63f!登))؝1҆t+Q)w\JzؑȘ]ؓ'czVYJoRZrGt;o)Nˌ3όΘvd|dpWܟ)wOJRr.sѕEgt(c3f={]r;IoV&c3я=_F3{r/)w@V3 )sF2 YMdt+Y*ʔ;0c2%c2f7Ygt3;.χNe9?7syy3c73)c3ڞOY}v4'-ʘьx׳I3Uƌe$1mEFk2xY2g1y8^ϘwO3;癱mȘɌ3_=L0wsϸ/2&e4'uƝeXƻyF3$c3.CF2^e%yhYƮdDgsY/eݕ1 دfiƾdxƌg܏W 6Ѿ6g*h_F3Ngt->ؿcF3ጻ3c3*}hC.giV=Vfu؃$U]{? wOƽ͌nfuٓ꽮 ڛqd-c'3ѕ{9nG~|9/gs*gsf0\r7gs6smsNr']cNsr_Ns3gs~;gvs3伋;9ٱ]ٷ}9șϜyٛ39{9皳s93W9iu9T{ٹ39ל9ӳ|Nr>%9 inΝ˙YϙȹcrppNs9Ϝ=كٛFNs:͜%S9͹3s|SșÜ̙ϙ2!9˙99w@st4gr?9{9{&܁9]͹?s#gs.599wz}9sܕ9 ͹s:ӄ=͙͜i gGr:˜ܿ9mιr9;s'9=,<YԿ/;P0S3HEy*9-+xTзى.>}"gsvgV</x\ tNKzkN4 f`zibN7stn` R0GsY0oZ0c))wg.uoQ7{S0=,hE_Q7#9gνݡ-\ԝAs\e%E3G QpF_Ң>O>gA *x}(dA YФ]/h^t=DYluA#8/U,k{Qg8}*|Rע~OLA{ [Ƃciǂy.=g6M[v-޵z\sɜ3]-ؽ>wαd wH~t=gT0%(띦ISfY* [`O ZS2%(nI=~( vdf z]І{n* f`KR%*)g _p?t+ZpiPɾlICJ:UҐ;UлulQ6+\I7 QШ4eKVpG4>/[ ςuAKfOQKeW2%M-]r%ﴤ%)%;_Ғ3)y%RO%d^Kv% %,i^Ɍt%sQr%Y2%s_[%*ْ3(inIJv%ENiɬgəےY+{I?KZ^ʒjIsJUҋ9%wIIJ]+y%Sْ6]ɮ|I#Jv%T2%=,ْ)ُ3.%M*9-9^%)ϒNG%-+9*ٯ6%m,iDICJ}ezQ2%Q҆mٖmIJVҵy.Ւ.xQd_K%m(Y`Jf(ibK%FɝYV4/%{RҗdKvdnKvdJ̒;u%{X2%wf}Z'%m+ђF %-)٦%ZrOS%{Uƒ%]-inZ` ԟn$`j ;>jw3kФ 3>`&~zfn& ~׽%<ssy{{d pvdHյΝ=5%(tA٧喇'm;Fxy c'<ON>ױQ'^pIsONٯɆ0~Һ7N?iډ_hJtG=Em'.sz0~Ҙts':iIKO' ?ϳ{??msv;v;x Μ;7;}r8tvۓ֜4'.|[{OxҤO8= qcΟ9UOZ~o'~v3_θ:g89ae'~+'m:\i_ 9iIOxl4'=9OsҋSpϿstdNzqIN}S4CN}rsVϸ;' ;iIG8>chɦdN<s3O8ف;iƞ9;Γ=9ٻ6[v g>S}=٣)Xтs4LO;}9Vֳ&~Cl~lI#OH;ғ]=ـޝ.lg:cd+O gNevFIOr9{Y_~x#{=ceg98kmY69Y/϶eg?۞36ϸ;sF縷={s6l|֚֞쌝36϶l_:u3ϼ:kSg<۞3.:qgu⌻:ۣͳM=Yvg8kY;w5ݳ:3Μ>ֳM;ssJ>;\?۳Vn9|ց3fOz98ٳ]qDG]H'N]mOQvHu?.| 7N,q wH+ѹ;&"s—ě%&'qkMIt+ѣ'*U%Z0a>Il%)~7DJp>\K.qs:$Mxp#Iӄ .'p(qF$`1U% %اv&:(ٸ.%)p.Sbwp5 N'XK4%~ %zBb$O-w# H8hZbD$<ѼIxf|'IowAD糖u>YyS9Hf&`:pߨ3f'p?҄' ΦHqm(4D}I(ѰDN'N4;g}xS=M8hZoM.iv'V'Zp=- _ߒﮩ{nG':؛$7 8r+c$8ě%*>%N…p\oR&? *l)SL،~$3 omF)fR|ڒmʏO)R>,[%Jt*h{)_hF&hkbO )RNڔKN%9XOyh`b;b-I4N'1Xb/[r>հo^cO6-OjbRLqFmkb;{Bթќp%()S|nzԿ6uKqLCZ2Jqz40E3R]Ib6e9)OSqo<)S;g/jn4TS~\H?n7TSJQʵ4vJ=n[74ՓƤxNq:Nj3R]Mu%T_SOA=H|ZڈTKR:r(66({+b)SlL .M5,d%RMr*lnآTh RMNjGS63kTSڴ~XKyrjKSmMqHTRI!uMMImaŔ=I@4|WΧᵦΧ:ڥשs4~v9y;fZy̷e~Cf-Wی{fv2miE.2g/dnq=ӓLs3Nfnl o2Tq3ӕLK3?dL2M# 2{ٕ&3dXK_pKdziYt;f3dv!Ӓ[e<+Kf2ۓ{Ypl2I773>ez.Ӊ 32i>d|- 2f8xisƫ 3}t;p3=4:.2e'xƿ cd3g47sFgڗ٦̖d3fdzQdih3~e'A.e4/YpL+2},xiTƝFeڔiSƙL2-lTƵ2[ن^.~_r`C\^gδ7W.ӆ v/[.sō/<hO^dvNo{\ 6/f6$x .._;=/F]%njC2٫L.ft]} u5ӟ]LC3lU?gZپLG/38 v/ؽpۈL2t 4;~d6T/Kc2t4EͺDi}hEK.nf*L/x6mzixfc3K4H/r^gv\=|E/xk~\ I}h /o=s7ʃ];xhE/<;/h}r_~ ֽ%~̹S=hͅwn{qrnvݹ'8hE{/rq /pu xo{ۗ]4b .[6]tb.vYO.:|\t]E+/wѮ /`i~]4;vp肱e/PWy˱] }͵/מ皛?ל-ro7{ܭsJùڐFΫ9oro{˽A\Ss7y/,םE9s8ͽO˱EnOnKrN<%xݜkX$\sQL.51܆庒wn7r=mP1 ;p͜81{ۜ9Nr-m]k}ɵ+K9r1c=rIW \}U+{հkEWgzu+O ^uyWq٫F\yx]ݴ_"Ww\uwѾn^Wnv O*mz٫F\\  |q]jUG |ڹF^+W\q;^ІX٫^UW^"8қ\Q/ݺ_un_j|Mڤ+ׯQX"\ѭmWhC|َ^^Њ]qZ`Й"Ք"ѫͼpWyWU --K͹ڷ-+[^/E.{ .0ZkӅ6<*4p.CÅVZK <X+4B .t@g m+t~3 (tЂB ,}˂#> [ea ;Phb*4Ч +\NEmx3-8\`P,лV†:Zqu 6:^pnB m.B /pZpB_ |n\`|B Why.SؒB{ VhT^jۂsV6QhOv8-0^В ~:SسB{ m.ttB XL)ߊ -_P]pa7 [TE )4Ǜ7yϛt 7^n7<zy2<ִ"zo8vFM/oh-7ɛٕ2< ֣=z\r fnvfo%Ji`GٙG%74 e ΕVҒ/UtŎW*ݨU\e7*tNيnTR~޺]+8Q{:C+]:!TzX{wZXiSwux+Eoaj7Y=`ܦTz_G/-5knb Fk#Zws0vMw-kݷ}w]]y7wLu[8+w>5ww wߵwƝw߽n|7n|uꮟwwpwozջ1{3xY}׎nw7۫w>u9w]cw[q׳ǝwu;xMwۙ;8ǝn7v䮡w>yɝgwqw]uw[zwm]n?Zsnw[{ןޣavnzлy׸qy=: w{w}ɻVnvKwn1y׀让wMw]{t?Mw֝7>xx׊y?7k]x>fᚖmCq}~pv=8p~#<uan{?lû?Nx#薝xpGpȻm܃z̓K=0#v864j;!w|m]{a{pw-ۏV?=bʇf{|{|ؙGmG<>l>CS6[-yz'Gy?u}5~gm?x'~ؠ;=}3~}S3O<ӿm|S~3O>Ԅ=S;:w=-{S觾>q3ϸ~uɗojSZՓ Oyj&S|.{hܓO<ɍ?5i?zbgO^?g=ϸ .ȧzڥ=iZ)O|3|jf<OYOԼ'zԭ'zO<9O=z[zԿ]{jS7Ч.?S۞x}b1O>u}zriG\SOS:S?Ԓ'iϟgM~̧xwO?qO/tʼn޽^Xzg˛p /waۧ~<ŝ_ҨfωnޗtK3^rӗۼK_rWR3^Z /.-Zrx OŁ?_y Ӟ/|jK_zŷWbSe_Wt//mq>_zߗ6/yEK#_ /xٴŧ_ٿ|W4Bs_K^i+zc^/ܽi/҈fte_҃_z /=|㗾Qi#K7^;᥽aF]0 N3/hFu8czKZ_vӈ`]N8/}}iZ.ܰk/Ҭ|GmΎO?;>w3e_ve^%{a}N; ^/q 5e:-񪋶ـnwN:vfNۆ |EW lK_{ޮ7sFkd+:Lk={\ݸq޿a}z={5׳^;pMn۠^'{9sz=Nzqڻmގ\kMo z-R>Ǟ{={>kdo{cUoz?ަd{m^og{\uF6[=zZC^z9kR޶ގrozM5׌^zX9GmNo{~zכ㽭חW={-5׾^| rŞ=xg9מo❴l~?{M9<`}nb=5ĻjYɁvK{9sඃ qǀ[ qk]S7ff>L n;|Ā!A <kf]~ջ̀ 0p~ףC0cmJo 58ǀAS03oles~ <ҠUC4>vwО!^>5[]mA?p5k׶hܠC 7`~Р'CtG۽Gx1Aozk1n6|а8} r[]5hA7 :<`px~߃Vx>Ƀ&x4``Њ!ϝ!F 8z1mޑ#?Giı_.&3iӤK>M:id7& L>١I'NyL`NLZ6idG& &O83 On'1ޤwNprnN>ߤ7&M0d7'M>VM6'mt`I&{3q{ &5٥Lz0apClė)ٻIC'ݘgd+';iꤽ=tkGm4bjd;'Nܙ?id/&ݤ~NYf홹Z5oq/K3_gNXkˬ7 g\3`z8̱ŷ,nvxxwy5s{vs~5z &,-|Z0'o[qOj[W߸kժ[VXupU'V̮p|U{iUWaW߲jª7ZzZyjVkEVXZ9˪]+Vw^zUV-ZyҊ5ך֬bl窝ZcݪA+oWY1zӪYyy>x&+7VNvcjV>[ufU{W[qêCx^G[m֊k;cVڑՍW_ue՗+نZ+W;ڳ+6V[5{ծǫv[1ڻk+V|jVZfհ+WX^cjwVYaj;WZj۪K+VXcjW.6d[ë6b|ՈUVoNV8uՆ-+gV>ly|^5{5xזU3V}]~ j땿[QCV\u{nՖUV p- 6`իU#NB6lom4hf>7|n5]pi[pëts 3[}Zo-xU7V놇-zeXue vډM#p__Vڢvq~Ʒ-xniƝMV{iɆhM^m͡`MW[q`ӭM?6oMYjVrkƓM6>o\ޢivfM6ۢ7h7^mڳiզG^nxj>ڃ6k ?jWڼ{=Ż ;m.~V6Nl<4jFn{ӜM7m4w߅=~7^7=y-7g:!7n~|-mڸaimڸمoeM6 eӌM[[űM;6-pq|~lھif6o޼mqk-noy 4jӳM6oxٌM+p[I7޴q-вM7ߴd N[w~fS6mشvi6=߆M_6l];{>jmnkw}><ā#?xwDl|pDSl΃:4 |?yЭ6h)=8}DSn/w?nw|hL{h䡽Z}a:8+Ý\~=O7]]-;8}pÛ~>=~ߡq>9q/zxwb㎟^=;8|Й|}lx>.n|ؖC[n~;qO0hš7>|xCݽ?Gρ>ріZshցC_~³x>4Њ.shaǽ?`/CwÆ:.<=t#QV|GxDkla'q؞[{؆:¡a;qC?tCS[t|ڏ|t[omG?~GC?юf>ќ~8',}0ѷt~xo烳77G>Í>O{~9<|4ǻ~t>S|~x]G7>mǍ>oG>~t{t>q>n?ѾF}}4ǭ?xpf0ǎ|^}GS>*4؊؏hG>[}Ѹ>ѡo>G>؅}8ѾO>6[3=`Y=ҏhG7?\؍^c7n'_}7nG>$m/ᄌ/ֿZ{b\s󣫟Suǯ}}ݾ]nկV߸~_}1=_bXy;WnΏ}x [/_<Ւ7U߿#_[ז|u/ϿF'a⟯}:l׽nmh_^|K;_~Wj_-b/^r_}/W>k?:o[p_Xb۞o0lx߯|1=_ڪV~Ր/_cS>6k˾Z^ڠ=گW;xׯ}Ǹws~n?wr˽ny/.:_]Zկ~?\yrQ_櫹_1u_p_bV?}jė_j͗_}zoaS`7x_ 5;_ڈo8jW|jW˾}lWWkWs?`v|[6_Mڒڟ= _/F|5k0pן~__4/ڹmW/Waˉ~/cg7_miO~᜖}ӟn_4|FxaGj/d6?xNnoMa ?iO;~s~?-a4?7n?tO~iOiO=;qǻٚN0s}O)?miO~zG?x{?F~ϾO/~fZNp?ِ iϞ4W?O?M-i?c|i؏W?ӿ-كxqN8ӞF0ӽٱiO_~~8_?[?-iFl?Ntg~ʟ6gq_tN~%?|x韮8Ӵ3?^l&wşϟ0?opǻ?$mO_wagy?oX?wfHzSn?ȟ]_y?FO/hَ?id#[l>BB&rz{ H+?(P)lmÓ6XkҸQ fwox؟FClpx ~x'\74j0[XhoS-`{7KZZqz6-Z7m~wc4Z҄#6XcG4hm6XsVZwoE~5`uזg-[h{6XF[hкW>C֝Z5-FZ-iu ;7vM6pJ -Z[mhކk:ۆ{vMt[F[:k [Ճ67=o{cm&|W˝676Mx6v~476nowzֻc>Q:-鴼h>XНN:tӠN';;qә{wZٕ='v:{{]4sמ }ﵡLω>ѕN;[ٜ}u6N#; zc[==wxq;hثN;{4Y^+z<]lZC=^Þv٠N :kC=}tоuY>={udeufE'uׁ>tgK:[١c}fݮ׏=^ݸg^zuX'un0S]5螧}~wOO^zqM._^zmI=c)Xibo3z]kn>kH}|ؤ^z,uרޖ6=` }.3 ;_Qwoz}oxx=W{<'\:C={hz-^gz'e>X| gI=GR=hRýn6u0s=:'zԇ co޶ח^R44صC-mvҽOJOt8]ߗ.a#qiI~~& ''Nڛt8ş}oO%is҂.͒& Ozt'#a It85q=:ipy҆y$;M]ҙ%%Mڐxt+[eIo%K*ii_I&$'&J:t%9H҈SoL!3 qv82d}94hBx `pW_m-?cn!f:ڟt>{l#V>hـsn. E;zUN}0؏A#}eӁw7 Z7pmpǁ. z7Ҡ3CV pРAo1rn7>Fao=،[ fA)̎:C5Q~n1ۑc#NF΍Z1/k`c5e#vǸFZ6` ``]#sp܀{l`;3؛A 9v]ˠ``?{:آ( dߠycE@;3`Nl=NڳZ2ttwf#OGތy9G=5t>#Ƹ#Fkԕy:jר#F7x?jG]3jGo?]#F9Ψۣ^;b};Gލn1cjQ/Fmm=Gf7ȷQGy8ntQF4j∙1N1n;>#F̏6bԕQcFΏ3&Fy6j#gGNn4bmv#FyQF3ãFq6j%#.F2ő#OG_Z3ڱz#6GnQsG;>і}G֌mȟ;NMn0o׷wN⿉sy[Nֺ1qԄQ_'=aM:2a|-?&Mudҟ{O~ o;M}ҸM'\Nܙl ޵iڤ'o;˨fO:7qq׀Is'0qr tgI+'NOK4{7VLZ:τMܙbr)\^ۀI{'M0E5o&& MMtx҃ _h=5j'pFLm̄O'6i䦓&MqWNgҞI{N؜0qg.3pM&6Ϙۂ1x=zҡI/&\M:?ϓn6L5i^bwzҿI'q=N3iwjv9Svь9]O' wwOf99O6b8+kW-4v̧3gl}l֤&g|lФM6|9|0ɯ[{F̺2{9&36g|Z6kg&5ɬ6jYgݞm̍Fz;׼q7٬׳ mɬ3'f3acsܛS3g^4vցO66uv9x6?kά)3wg0shYg-u{Yf6t.h#3wf|\mì3N]p9M;fg.%f6c3f4۬vζg֚ksp%3Ogm֯ٿf͞s6:1ۗٮd+ߺxś-[p]KwXv,]킥.ph]Yh^xrx/mXt~ѕ3./h7/m!ozf]0pcƒE{~/-npk ΢ >Yh򂋅 _۰hl[¿%6,6b Ytp./\psE}Zv،-hނ˅[-]ppl Z4pECv,hɢM,_`x>.\[0Ƣ--\rѰE]\5 \բS ct+Vf:bmu5֛ WqE#Zpz+kܘ.oqS+_Vz,սV|X3lnz Zl.kc/ָ,gu+6\m_1q3=Zlu+聦-:‡E[hآ WnrhսVl^ry5nkKt.6cOK.6cX9۸.v_rn zf-\^)f.ڽʗEKh梙f<\s^4mՈUVXMviO+` {+W\jV]unk0}^rڸ֮g5ڡFXyrgU'V6tիU'Vbr]vuՖzj;WUW[ڸUV_5zVmjntv7|lݴo567{ΦS7ݰaӿM7ݼ6߻i7Mߴl{oln8ݰݼ掛wrM6me8ar'77pnM7Mt{Ӳni6ٴv7np冭Oohmܱcaה;v[Eu~;v~Γ{8bv\\ߣsksmݴ|Վ=i;Ow ujncvMۣ!sueҝ:;͖m}M7;oo]nm`;w g׶]wsguw]w.vG{残n<5wkvwf*BvM]/v*cwup7uv]KwsסqS`IGw5w7݃uk{%G{:MNKwkο+9˻nvkݮa;w3.2vn -_6jkncw~d~g|X5|oOmƮ;>hFY}g0ĝݦ۞]#wsm̬mY2^3'rm;Ƴ^dۍ]v}m]ع 5w5-m[֜}222e79kL֐YײFdm|ʸ1c&{YΘ?k_֤ɬY˲ ڗ7gew;3{YW6f;B֡9Mo4w%s%s*B̡֨Ygzue ڐw<-=0su3knYG2?yxzx_GAkzu7y$-9#رYs;L֨ZqpC[>:~`ͳY_Hи6x>}=mY' 6+kׇrЗÇ^:p#6#گ:x9Ϗ蜽;{E̓k}9xr؂Cg:tC߳Vv'вC{bt]9zpӁGg4'ޜ9pA~}C[pۡ}M:&Zz؈C+}=xpha;;rhSvЁSh `'Տ9=V~ɩ3h'oΝ:lM?˃s=:֝;>lzϓo'Nz۞|SNwԩs~:uzӛn{Noqbfu=OL:z'N?;Oouo>y{tSOv͓'7=9ybt38uSNܝ{rS{O;b'O:{b6~6tSsNL}ӓ۞;r=Nw:yurSθ'N]9L_8;=mΩ'NziN<; OiNm<˩է<ש :iN65''Nޝ;o(O;y|Ɯ7M9mɩ['7N:yjȉSN3խ++O*jUببSZmR[>޹bY{V6rO)LUws ܿjOվͪT|S9<Uubjw ՎVժ5XU*ͪ6bbǪV[XgVTy ` UVRjCwEU#+?=zW =6ڙVW^[mAտmzQSAjc>zգ6<ѫ;<ۏ?ѐh |>>zm|qׇ'>z؇'?x~^>`݃G><~xG_>=x{[<8|pGc3G{7|0pdž=Zh|tԣM7>ѯf==8hc{^<&?pգ}{ػǾ<Gcx4]xc{؈~?x~{G;ç.>|} W+-x붯x}_o~1ߧoh<߫_䋅/_=y &h_~4~y yˉowyfLڂG+_x1 >W[_؂G+_~ ё+ z7\һ7xW_xIڮ׍_ο؂/`f=6=_xk=}tuox/_bڝW^mxڑ/^,\~5z؂W/^|l^ض>Z؃n%rاǎ c^}|շnᗍ͏y_~_޽rԵW^MxՉWm_zξ NՎW_ywpb &ws Fzb۾pM/_x1j寖oQp!ԊWw^-LJߏ_۾ ֵ7 /q '/W_zȫƽ{՝7| mϫ[]nzmΫo N5=~ڝW^'xmk^] 8!}}E_4y/>8o7k^jk_;j]϶˯\f~66 ׫=zzqӺO#?}x4ӟ7p{?qӡ/n_.~[]N|Ч_>4sc{{4s>|70臱/ |4N8? ?{yc_?||g[>4sO>~ӟ?}ǻW>8iϻ&~ ?wOF~6Ӑ?~8/M6ǿ}lǡOk>gw>8ai?>}4Yw?֧~z؜O?tӐO ?t_?xOg?O>a?}ӋO{/L 4]~8_MЦo~;n.?wϟs_?<47pM?wqǓ_|:ͻ~{?y8c?|ON폧? xǏc?~pӡ_wF~vlŏpLhȧ3xOnpwן?l֏c?~ /zݿpݶxә_8f'~8?x϶xs~;??]?~Z pt~0 mg~6ӟ'ٛNg{~\pv;_|6g~\vᘖ'謭Ϟxo_>??jN surveillance/data/n2.RData0000644000176000001440000000047211765414544015161 0ustar ripleyusers r0b```b`bad`b2Y#'H<ψY$ ļ@|"  $>Ѐ %Ę@p"F V @ @LPsXg`@MɭqV:f$145HldA3B qԀAg eF>^f03"g@2fͤcQ0 F(+J@ a H'(Cּb C\I9SRS`KKRB$t#saFa {Jfq@Q~: surveillance/data/imdepifit.RData0000644000176000001440000005222412237173740016611 0ustar ripleyusers7zXZi"6!XTV])TW"nRʟ)'dz$&}[ jtƆSg'9+?nWK_2'a 6⨫urilr氅32*" q:7~G[sY&|b 2̼bV:yFExVW׾*tMū{BOD/  +Q~-V_4%%ӳ7fղی}F9Z: %M7 W#N:˧$pdt {W7͕qɠly_`HrmdyM(?bXR(ЂJ'28RI?Mfvgb!OǞFN~l5RأHAg|“0IMi%,j7ObM/J' 8o޷jVDҚh΂+b>XqEZ*BaXg2, z{M9rr5Oܵ~,dMD&$Ύh1Sߢ>UTS;NF`f^f섑hO%)3+ڿX:O^(~@a H[!^*tTX-5yz6k/ȬK+0(-q5fDq{rt9;ʽt33հ]`u0MLCc20?u6q: )c͠MEYl3Z[%LA4*i7r#sFҷ>ʇj6ϲ\i=o cW,svq)a: UynAgfG$5c)${o%Lt@B np1NV¢I7nXXU={ul^;.Ʊ`,&QZ4 :m>:ﮓ>BųYaj~pL7->m!NB׎SH$ozx';s:3[v;_#3kU*:CgX\(7vo/h9:*Z.B3^dBRï8(1N"Kl+ThW\n0eA1)5&? Yf`O> ;2ˤVL`gecVl rPuʻd"SO%D*sPe0)*=gdrxW<3~2)u"0hȭ푐~T,9Fk[پsJ^)ډs!5;!aKC~ݧ~,c+Վ=&5[3-H!^ ̇|k@K-{T;'xNp>a{ CZβ=Ɩ4ow-9; h$1yxa}1{xO.Vr‹Uz/Hx_zύ);Й"qяxq&x vȺ=iB4Y;$ *Af? G-<>CXrh媫 l&x'p}n!ถ}] [q3%՗H뱫%j@ǖDf .؋}BjI*$60:gWm*>Yl*^4!,eq.84뛰l$t^pr3\Z2V^x X[4'Yx䇸*Oao:A;1٤XCr L~T00N;$kޯv=[%VR꓈ɾcKF O4YV*jZ||q]P /_-SuNg"?lCMiyڷ *-QRO>^\QlW'EC#VSdʭʳD2Y||Di .|J0[X YBXGiC҄PM\oVY`Q.Ub #";ևVy%SAE\ ͕nu{衝=w_,"%WmtAFi}MWE*2hEZ?xQ]U;rpbm5xD!n- D 8vBtP ×j(Vb~9z# f]mG*殤T~J'selt&59UkBZő v'~IG z5˘N M}6 Å+)~RbWGgz o0GL.v_$\3}xyɚH *FP ^Jl$KۛYt %ݗ޽BIGӗyא'F%?vҨe-"kQWZ.hb)N($9w}Ŝ<z3~$Bf˶ȝe'O8s,IQ?W%o8HtgH@FWnW&hx\ڕP0t(lnED=prnJcF"ɉn$^ӟJ_gߙ_@^V+lNks:q}pg54 JQc.`r$~M@h;Uv#X!w7Q)2Lu>"<۞{ORd{vy1#-`C\rqeuglj&y <)bX%_ܦCvj[[z%95t@pF=4)95]o1ʓ?]8Seyk~C99p8Rm—v `iWN'5H*k 8l]L]ʌ} ^(`?M$^ĿFc3(T/f OŚ)c1lR*B@ԦRexd0O;>רJ0a/zlov)L97u<wVxqT΃topöD|kM ;g$E!)LAu*ʎ9 K:0^WS ,d.XұA5FH%\ºqcGW!ḳFZASNX71pšd~`Uδ/JL[V7-]u`aӹMIآqz(!oO?W]F?m]+!)X= -|JI_f++@CǙw`Ƶ;R,(ϋٿwt:|cK6##"PrZ /ZЧF9|՗ =j=Cc': ׵w2&'Ή\/L=ezۑuƖ")SDqGT2=VDq +%V'JeyM;s@;X7~`ϝV?ȍ:/GGҿ?w--0R %,UGw 6-rmKg˃IA#OI#f>#>]MZE?ƌ.zQպ,ydWCNũnO7XJFƒ88RO@X}+Fx+,19m)wGix=L reΖ\¾/[w4q9>19,DDeiQ-1K5{| m{ޭ(ٺ+19+3"]_ 䤿-! J[qB$0hLvH*>/4GzXeXbjQ2H@ $*U46{2|ߵvw1pJy;0?::;،l蹆Q+_]⎟n,>uڋ}:it 2eR>V,/Fy ] S~e[] jͧ/?u+4]oNiϐiAr]:(%*GΝLRNgd=zE)PTY&OطO\Ϝ8xRb_a-ay&)|[ )d]`g{Shkj '+I2CIiN`N􏾐Sɐw{w&V߮OQ@_ zmDA ,ܬ fZ49jۧ "x֊E}C4O杀b>ukўBEaFN}N9|@59Ǻ71\d+AlȨ}fݖS~>v'J _#ɀ%ck@Do'Xu4HR[:u1* _x<)Mֶڻ1:kxhsR~%fIUʉ4@:>d S(L+ ?ӽIZZTY+2lRh~b&197c9uG3_lFEZc/" p8aMz7XLFŜRCQt9 *oR1T7Yl$I;MPfg(k.VplƤTurHRJWIDOѳ1Fðy*>(A_a @=4UA_?qS.֘c]崿6l,Rvì ?[k"kPQetQv?h3|x3. ɽ!‚@B:d$%Cf" U5*єִ{/Jts2`:f ǦP=ރj]fL2$8hK=H¨RGո_?Z|A*I3j=AU0,F+\j)Q71n̿2zs#_"7(;6&rOh-LqXkN %N$fI0/44GvR!^xL |gJBK.vhj=$X* W<s Qh&'BU /`YЩΡeG YLYPy>L8u[*Dm'8{$^"9)-eRH#Еzȧru,(AH7Ȭk|HXe7yTtH~BS]{vo%%8a:SOIe@cH~UA iomCdhE#Ma3<"%Rqrj/zss"\._I~:~ϼDd#To31ݏi &`ZnJ~dDWZ H4#l,^֗r{!cְ.*jj74!l%,M5˄ d/*oWڦk]0OF9}WPw%vz:a]XфקzqXwej\f+9רHc1ZAUb>{Oj\̂Z^L%]0s.?8ɷ' $#^I DIWpgA]E1ov-ҷ>,C[ i&Y`,)c " M0gLZru0]ݺ@-c+h9 H ,2ΒJRmF_4}~2`N^Kzt (5c}h[]U3;|:c }7xbp>gU[ow7KOnJl9=)8pkoMkF*aG d*Jg:}ǚEou8=5Yr4J R.(ɣv~ؽ7rQ!+b*1`hma<=Y_B |\HDgʷVm(Z|`mZi2p-ڶ7y<s/&)ewc켐(C =ël;߳M޵K\zQ:bOd͒HzAKCYRHM-Z [80{s_R&\R u21aeNO~0tm5s"Xg^@;;Jp.YUS>@`x ?%cӠ7nd|vA]=U\ޔC.|%c#K%'mU+Lc>8{I4o)}"6lD-t{J0,F|ˌ@ҒSgo솔:Mi5 b^Yي HQx4&TM[嗬Ԝ!/l5@ja *3AN$)ihV =T|PgVU/Ư# r4w'6yenHG܉1SnfZ~@)yceD/nU'="]~64yp/۵2".TaK{2^nrcDzGo:(1P-T sgWkkc2ϗV/P9 YL kYsձG{8hǀj»[|Kߗ(6g̺d⍅wCpPw8lrjݤӫ8#ESHGk fb]ړH^3}h^PģFş(U(!`k,Ξ/H6ɷ6dbM-֠Mvvi/A@YgҡI;_cÙ!mHe @񁶭P򉛚caq3bL9%a5 ӍPBbCFEWrd;]b.wAߟ;gKe #C=9 wlWj{ Tss@0)WԸo7,/78M`[ϓJh(KHvv1\AK^Z&.qq+/V";SJ#V#B|3A!tПux+RыLݻѓ pJ.~"*ѣ*ǸQ*R!CU_<#BNE9sfGOj!, 8wkSTVK@ĝG9Kg6Jt)Q S)$9V )*E!gbW/W@85]I-ΏR"%ӈ?^9p3+F%$s~#ѲdB ̶sx# ԽfhFSt~۟"DhG{^QA%T7W~aGF#2Kfc]@d [DJ>|BƃF4k`(l$_`B]Yc_y/c&)0| *H=͹<¦d:&Xd<i4_g } "@ \E$+#wjhJsmωngMʒw,AcabΤUlM'<5bp3: 0R1㞍h3wPՖbVHRpE;P#K7dv4- Vk3R0;aFz¢0%)$rz죛xGF:XoCB8!O/dB'OWfqϙAS6aC8XFx@٫ϊ@=zs<"Dm:3n J=CVYn= }aM;Oer,VKn-3:co\ŭAa;D, Z(c8  h˵W6R>0 JbzҍRZP `/ޞ^ycs͓`&xore.y8$ S6+r2yf5bR/>Er&?Zkߋ wra{'Yͭ>L>߫,@(V ځ1^3{)z̛O,Ҍd;ZEKG !c-yQ$ћ3',f&>Z%`6຤+im@1jAf'?#I^2Pd4ԁ=yơ}6 yz@m,8?Vߐz?2 I(c@Y#eSXW/(@rئH`=B/1{7reY~cA0eI/lv.c956 ֙S֔ / {1^F$i=7*#rV wLv6ܚ8ޚoK $Gʍ?״pb0foU(ޟ}rtL"^b| RҨ׊Ņѳd%ǝ<-#p^d xDB gRw0C{_<ɟ36k(Pli!%;> &Eb)/4ƍ$&5<eW4#Y:^'եQ"$6_wlS~8|H 1j8*#x]tp ѬB`]I=TkIܶpNd\ha Erf#EdeU񔎠2 shW(%L ,p~w0 -V+ȩXPg}ԉ%ӘƁu̠sDŀ =KW<=F)E-mxn;Ͱ/CkyN|=숮g?6fM0"}9`JkJ;N_Lab6&w):u}Rr^Q*z8Yǽɰ?k'+$Jfgf́]C,ݓҟև`Is}DYbpIb,*4c]km bK6JMx@=5Y:|$CG% MDeEZjO!嶝'f6(1Ju3ug|\BuNgR.aQDt=8^G!Th ).wS!G}xLTx4'=w=tT3_ƷM_ {v,2&sX D% z;bMx&gy5+XW T;I=km&VMX0A+CW^` Cjʔy qBqRȀ6J1myu\RFłk1yBmIăDrGI<'SP%_nnU!NB-F;A I-BPm4g&ϫeDnL(gu\`L}1 @媼)(i[:gl< `,w`BOAimwMf-{|/m(MP@RZn32 E0EQY8kMH)|ܑ~l=)d{f' ]ɟV!l%g_&Aߐ ^1źd(gv8Ӫ&4bnOKq+i1$++EA/I訋?sMpo`Z+eQO\ 9h` y};I"!IJ z^Dg#ϲ]{^hvemVR*i,X4W}!_54wr-4hp%gp^P:nlܽ/px>J`AvD0U萂پ"&!N%i0len< EzwtP#Y.؄xYVuik ~<\?+ʘ.xP{hSؿ#~jS6z#ɿJ[iNx95Eoc7|XdQXB𧘮jB; =t6hM>S6[o!~ lLOwS?x$U|WMm$e+50jK 

N%u3&Fs|k,rpC0)~(z-R{nUhZUXLڜ 0z}R%ś_KJjT>+F R!edCuOorbs+y48!_: <`T"}QĚDn!띾1L2sդXCÆ֠Qߑh#8$G`,l$*xJD8ct`IƐZkiD5jMRDOS#$%'GY/Y`XV\'vl̘햾8RԔ jS9n8LY|^fket@e`}:>y(_؋SbK lhU lttX38t7N L;m$Lk'=86oj )RZ ez ӑ>q ѵZDh350l;*3gG C gOjտNu߰5p2(j b c¼mcF-]K4Ÿ*,IRG&(VꮚkWazf;7h~F9U@]g[f7{&m!HͯvY f YT >҂ x${A|A<$+eƮ D1j#wneo`jT<ׁKX[>\wb 峈ux$x1V!VPIVcVp:' d>"9qNr#q\(̵ 1l詓'4YrZ5d+7KHU&;JFw` 199*`P85-ũxD7QYU (dh7&|NRSVB JErC@BkTNNIs]#Ԇ*TZ)hQ) XYxTO=',I6уG|w$jG̓6%x u)l1<ֈ7_ɯ=j|g h͖}Qf%j~NGZn.# }H ðBuz <], ^Z-1\ɟ UmgM]{@ܭ6z򂆱| P ^]T"xA< L=B8S ]>1Q83ҍTri 1hx o)~W6C/CMhyOk~A&rp*6KnOz7l:ꩢ>*OEՈiLe#R\] g&3p[6[GbڗH{8ɫ.:}H r;UE ǫxvj7/r,ig;LRv9pȳ/* _< [uߓ;[/}%&/2G{.%=ςw!aUDJ3HG,^q3{?-`,gI \:+pI@ p.ZY4adŅ5gP:: e}Lezg d_ h>#ڳl|U6u#&'?`Zlj/kmSm( VrͨH.v5!/޸_j4㪅L['3.gH1pa2vr 獋z"}}KPr] Q?i,H#[qfڵ{H/( S4mu܄ڽrP SJRY/ hMC݄j]a}*~|"<"W(9"Y2dUGk")0e8t"VT66:+zxƆ:h}c<0^Is`C0藃&g0 Del_QugsKyf29}іAc*L+  ;\vR{d$vћSKQ{ִSd ㄻ[ E? {OաiB+wXڈP@L^X㥣(<47gU}%q-|9 +2x;za:9\KMXvGˊjC  cMgp+,K+ -ѷQ`"%b+ "JC,WǴ9ֲR>%wrzf>d q|b`3 .pX[c^苠5,V(Ͽ2*G܀o-M m_KN5m]j)lYP|Q "E>Sꇆ%;F wCN ZxNqyO䅸^F! L|qM i7.T{A;Giy80AMODN4ShN,KUq%\ s_'l `>*czi=B& ]xjC &KO C>ɶleو+Dcɐy?JUJp W}RՅ?Dr(IF'#>TvI]mn8_*~G|zftRӳs޶]EZ.`f9.b)0 Ez} МiWV#DRˣ.dۤKz6yD$m賳|BE:, }B0/Nw8%U ǥgP_)VNA[#f7|=<\ƪ/T龊DWosl>kt|XWщ+vpQG[枝L6 ^s[zI( DcT@IA#vmBnƭ]?P@](jR#P>z-&V0^UO}~*^WXylN⌜٩ ٓ/}~fN'F kBRtHܧo݇ޠ[ @\2)P'$n_ma_r=xwi8k=Juظ_KsOaSù.gjR uZEJ/@\blk?U+7%p7w 5L!}Tm7_nޓ#y1uT LITbU񨒻tVId.>URgyWY(Q]swbp@Hh "kO)%A$N*o SdK12xSʯe69=Q<S3h*`Ssi0(V0eM2^@i8V%:yo0*=p«ɒ]{[j5_f$/AM8^ipBI!)zzxӍD`&,#2..xUV I̦a.3X8O˔pk^YP+;#;޹IXy&1 Y7GW"6=J~soOXS< 9K@WѻArc@Q&8խ֏(6erzTgqd|׼{qCJO@`MJdC 13I_\lC-I'u:LT}-;`70cLUά\PO)RSGʹ1.~{3x%Zba(:zڰq:UqAD36ϕ-_WcrT!< /`Ƹdjs1cX$ A`{=^Y8qÿE 5qytTP/4oHffg%:D*^ؖ'[tO* ʿW~&S`bԏo^97`H턚ј-1v-Ӟ|"P\hKPv7ό׭^d2tzV1$!.rBvs`)%X+*#=ee؜Fe->꠵͑&Lr *d qF:Q:0zЈpx`A:yhMqvj^p!gEG'j~iNԄؘ_?qȺ8(ی.!xJ+uW$ b6A(JGN"s5ÁS$KpiP] q 13Nf_*]>B rb~x4]dJ}̀Q@8+zTϮ҄p>;$=AUrJқmK'v2*ڪ~Î-/ 8r>]ħ` -yEo_sdj)y\H|/ꭝÅc@=fAl,:ߗsjaG"2,qόnkWnCfPɇb;8pX`asľ2:1v 6Nj˚JPb F Z/Y.KdZ*gV)6oa CҏW3@ɋ]^ ؤ?ԖHJMό:-Sib~4?5^R}0| Q&$bAXBG:QCOfp2@ fֵŹ+ȀUbEDW1b"B:pS)Fj5 ͏7Xܪy'3l 4qnJ+Zk%Xj2lN$%r5*./IZh$,q) ^wotZhO*rKC$P>a|xe#fzbք A@bϓSc59͊'7gFk+׏&MI ء{! Njk!*@G*M]>sq{6X8ar :9D/o}(cw!~}[RR*0"h _t3yIjz2$\+y\*?w3Vv辯C;Qnyv6zt0&ea|W6 #=Aɘb)mw.\|Jdd>ӈСz4eBm]όxx9O։=Θn; s-HB z}b9K2|`PȔwl.P+i9MKwp0vFtBn읨7S 1+5#H^uflJR9]w# TFMⱴvL[1 SiiX.k+ W|iݔrZf;Ƒ|cƊhu3_D@岹aSKywQ,TރI+qKlӰ.iﮰ1(q@+4!U _A'ODa vH9=̹1ō[VQ37Gr x'E`pccsIMCB{'^|V,+;5So̭(ʀs@rc\7D&y6"7t (PE7m%6 3f|()f`/I Lڰؼ\ij;5O(x@ҟ!ʸ'W#766X?] > 6%~Leґ45P82IS{T R+Ųq1v;,r~҆UBpfD,lzWbݣY]Cגm=Hiɖ4vPJ$VYu{/0 YZsurveillance/data/m2.RData0000644000176000001440000000030311765414544015151 0ustar ripleyusers r0b```b`bad`b2Y#'H<׈Y$ ļ@|ah/yXXXz 5 F,cyiC`:P}gr %!k^bnj1!n 9SRS`KKRB$t#saF@)E@?3/ surveillance/data/MMRcoverageDE.RData0000644000176000001440000000151112004001241017162 0ustar ripleyuserseTkHQ>l4Qq2b4lGt:[3rg^D~"(GDDdЃGE"":w489N]Ubq8Ji̥e^ȃ4ukUi.9U ,` I!s^DR9#GBdZ^TnD7ra1`3^>U.,h&PƓD[vӃ:։ct}1ᡒQ?h1ݖW4[h[6ޤQڒFs!i3]cb+:d- 516@ih`Ch׻K.@Nn40w1hY v@Ήk~D۫dt4qssqgc?x?:o-z~3ԡ{IBg^4~[֥o_f[яNݼ)'{1Sn9Vq܆fd?t<DD}f֫*`&v@_6ЃVtW\~^녋%K#{ 1 KZsc.LvTL^߯}z&YY40. ~- G %Vyv5B{qǎ!S:|Y|0 20X wa`8FQNppƀAPc`x< 'x$x < *3`&ɠLς`f` 怹U5`> @X` X +Ahρ*V` x ^ 4(8X ZN IRx <6l7f&x 2.x`+>)v]`7 {` | oapqpiѓJ"u\ 5Ӟzb65#qݜ8oiNŢ EWd@KZΖ:UK\_"ZoVI,ѥuMN5 o[g~ƅZ#KھBڼoi>P0RK?D+Di~L!:A\5?7P@ϭjj=̮_sroUǝ8jyN_Qฮ@O_`G3qgmUs]u~9w]2U>?SO=羏^`8ӿY=y;:GfGޫwf}yΗzqp[7|L2~u.&Ͳ@(u\~.s):+үq>#\UG.3-W-0y~[1#7r[շne>2w{&6fC-3Fp@.HzБñ2ǵU=7j`m-龛&4}#A+vz%.v{ݿNnjS9I[⮄G7(Y_r /ٵ7VРojΗ+TuaڻJ oq+Y/`o?B5HvsdW_Tt!mI/ScCP D^:HD2i^>Q`surveillance/data/q2.RData0000644000176000001440000000030011765414544015152 0ustar ripleyusers r0b```b`bad`b2Y#'HЈY$ ļ@|apF$g`FQ1 4hQ0 F($P}gr W!k^bnj1!n 9SRS`KKRB$t#saFQ A•t ; surveillance/data/salmonella.agona.RData0000644000176000001440000000065511765414544020060 0ustar ripleyusersVKN0Np +V@C6"W'p&<(wOS%"FXu2ܷˡnݮitZ^ vs=H~9ڜb՟P|h Kgu.VsmF2/_t\ 8jz5/4$'j+ȇ5ε>ن@x%saaT+S>xi%Fb\k$/cbc|sZw`.I!r.aMW&fI.jJ~G3Ŝ.o C>F+sL2$UμfhlVa ǟY<4GFаk߼ߧ/m=2X߆w+ surveillance/data/momo.RData0000644000176000001440000002520011765414544015605 0ustar ripleyusers wUF323ԡIG,`Pc5]c,i 5`1Mיּsr^e}:Ý96=s4KcQAO*D!k׺TaY kg ?peNd殗=}Uj0HG?> ~:|:|6|.|>|!|1<߃_>Gk?K _0| 1f4< KWo?9Bx#xSx x+v>J`0A1CG?> ~|:||.||!|>>>>~|ToO τρ υ~!?~M_o/8|#|+|~8| ππ ? ~| |w/_ k~+? _<~|1|߃_ >kk?  fS4|w߂{Wi"x#x3x xk28?MOSi4?MOSi4?MOSi4?MOSi4?MOSi4?MOSO©i4?MOSi4?MOSHPg3 ?CPg3 ?CPg3 ?CPg3 ?CPg3 ?CPg3̝p ?CPg3 ?CPg37 ?CPg3@P@P@P@P@P@P@P@P@Pp9????`?????RgY,?KRgY,?KRgY,?KRgYL8?KRgY,?KRgYmp,?KRgY,?KR̮%rI=*/Z\SFcoLc>۸qEΝVLi'{3 31zJfT#ɱ)(M _KMOg1"%SHo& 2Fc"sos^9>ƌJŞB(:Jh7?z~Ş~m#86R\}<1|}~K׶8v5ny53?[SmkFXlc}sک͇ڬ:bq]h{́Ƴw^/rИXM\4vӣa:ŏo/ӭ\5S?0Fqy5L5:<1mo1յUm&g/'ll&~58EXj=KbX5bL׷Uѷ[u5\W~u:zz>ߛT1Ê\t/k/Eޫ5-=JxحyzG[_梭ĻO-גЧ;h {sb$[6MEijYkk/:>jkQLGz}c[C[=@)Zۘqs@skuLoF+:xz4Zs߳{rԱuO=ۿ_3:Ϲ>Skr ;ǔk8Nw^;_mu5%yhk;ǏgGjYmc!:Ϲ=bYsSϗ7o_7q6%a?VӾ%nO ]y831\G'~u7k\m۞_''#:{Gwݓ߹=koθo~{oOk-5ſ3w?eͿ#\ø_4>}Ԗ~ܜ|ͷ7XӵbևJ~9ns<s9}|ȷ.ݣ/3߾=3sc:v\? /?~|oCT E湦x}s(:^_k>̯||Yֿ+nzK并.r{+>ρs{ǂ<}c:bЮx_/b}ωχ }{=4~?k%߼-tű>W?X^Ob׵CZ;Ӈ\ϭo_v?bo.1ϟx}e|YڷkhS|L_E1Mj/ta5Wۛ^?75|wᯙx C4FX7}UI=?yU_8OG~\;9V8~X7?N<&s >@mи?"{b׍6ﵾ XbG͏/9߾553||k?umc;z90&;53>o㷑Y-VA$Q|{H!KMgc%ǡ/v2}'v,Ag5 Co>Byvʘ5]h[xڗk#3]Ca4mO5sѣǡSDt Ř^E~}NP/<=u8%=~8>\^!<q{п+qHc\`~Cw=s> 1orothԧ|]eK^:xm{{yOA.?j^^Q.Ɂ KЮ'՘uA^Y. } U3^]/;6WαEs7׻ETOWEJ9Jl5=\{__|W.]\9Sa9s>v|~Mr9:o74G\47z.^\`S%u~q]4+Ex1ޝ{`袽w}tuEkC5]VZ ^탞nk+m˽~OzhmE.^9+i_5ޛq5Ol9zįvZ>]hTW;y6tb]4G ;y>t7h~J/nҿrt*B.}7/'e۸>ou:Ћu脎2Ϧ2 ೮WG7ܕ,[32ktrWh|:ui;gswp耾vN*h\hurѽE{K_1<;xh|^u(_o=B7X7q~m[f͞zb%Y|;h3:r[B7G 'W-HډN6ص1|Vx7>ѳ]˰{c?<Mظ{&lW|K3=&gl[lb?Pڅub{^r|lNYέg|K=s/15/6G<{ѽ_5~?.tV[ *1x8.h ߞGbNƓA[Iq D&r5d%y{"Kcmze.a|k⺆vwe.C|[=n"mvs]~ʛ I]47VHnÎ'k}~1\4 /U=;ɳnGضYxcqr?Iاy[g=¦ ش\.^GnEK.;xǟghskzڭtѾx]w\iEkmD:lP{}^.lbg#~B]o}Nwǀe[ϱY ƹi ywzi־{6!y-.Z-}i06ߝo\۷ņY1_` m{1qgԷ{6mfku/Jr5Y_ZINj|\͵Mqum꾽\=Me.܏r^~ _7_G5yY7`bW83!8,5_ǰH^,T~|Z~scq&SoߠENO>NcA^A|Ocw957V*Rs':}7[O Y}nT_tKߖ!ZHT[-_oi޿/l|#[)ߘGn'bǤ:øaS 1 %+Sa*U&Į}Ms}7_1|E̊ɯ_ȯ> ?ڕI}^͍#}w]Xɋ檄HbWc so7)>HCYK|w?ߟq&gb6;rmb6kƑϘ"o>a̟Y#;؝%b ލ?HQc7b>V@{9p&+~m/2o$e9< _i4>h.zv=;#| C>k\ls;g*9xaӻohEsر{?[G|&}ۮa 忧>gNWVh=丁q,݁o[ߛ?4/៌2ZրNhu'6h~I^~I?}6m%l.z& avᗮIC5s[[E|׻\_н_d>˽X>]b V[96T$Noy^~O1.zעCznmq;J*46}is/ :{x}3\ӺՎi碵}Qju2ȳϯx>5!Z9ue0穋CbnyC,1'!N qTBbz B1-y!;uE!0!f^859!n qy%E Y!¸Xc3Bv7߮+vfLBB?~G.;7DT8Rὰ [`j6\܈˰|_B.[~38ͣ*$M>OqR58M q&x2L6%?O6ĆIbx\3= y+XȟG'mtVbt|; k1XĎkRsrJ:'o̝cCx[kPOq*c'O#O9Eظ|,GͩpJRxߥ~j=;O%Vk<b)~"<]gOi7\nҶ;1 KIxOJT~rý.7֒u:K=[.ß:O;>1=r<1CȚHN$GJ8Jg<~%C#ms;˻syٕk9?cl2OnY/rϹ5} cN~F`4$ʼyԖ1;sݰ+9{K{pm>ιA\r6s!vd.샞\-9'w[.fݤorC#2WObs˽oA^Kz>*$~:9s4y;E~ '#|vm=Hdt§{˯]n^}E]Ӷ#m&IӈIg0&yuϊL؟侊8k|'^|˰Bt[]ߜ}ڒ)]y֏xuu>Ȯnrl[~?9<\7mw$jYޗWCj&yp6k )3I!k|2:Եޏb_)b'R֞&.-ſ^p~nX_MVeCp~ y.g D6FdߐZ^{!vY2q~wrڃvZoOMoCb=\^<-"OD2^=}('? GSb~03`8s.l.Gdo- 9J]Ts}t~'~įnEsT|s/MѤf=3K{.~w,g'vB({&{DVs#sLU`Tqf;Hb?_Y Z|&cW̧2g8NA#s[}_ε!\cd Nu8G0ڜȟOב.NG|:E&'b{?|F\x1XZ8dZ[Vr$DG Hėc$GMŜʹY^瘜{Wd>;$_(/ij-j7p#/{1d>o2dup6E-=<|(Zu{v:?N nA.z2Fq$wnAr}j9{qz5'_oܳv:EA0daw1& % eKN/& & JnJ (OzjaBN,dw% MR㓅¶BӒ0,,|&yd=M?QrdQ&B'kL.,)Y<;Q(|gWʗ?OMDם6G$YoNN<\=:YȾ(dḣmN6><|za_,,(<47Yd$ % M_,LY,$YVdaAE$7ߙ,l,|TШDhĻ„daӒ +U Cd„AӒKԑ$ '-Y8uE0I.I.9'Yd˯Nj,dᖋOI{I.U>vhC'%{ua.,8?a՞5x⺹ c`c\Sw"ן:Xj Zz' 'sl]53ή9sN]5^X;g.X.vy͜UGx f, m׹xAYjϫV_njo*#Tͮ FHhwšsk?ZF3j,4vƜq2ӔKۙd j6wŁE֦UNwȂs#W lsurveillance/data/hepatitisA.RData0000644000176000001440000000203111765414544016726 0ustar ripleyusers[TUàaFٞ0*b#L"3Kھ{X;9Srr~=w澚r\J\_Q\X"ʥ+MJfboX0Yȷp՛Pqva8GHq X1'Dy8q *q*4,"ԠKQeXXUGk֠ hA+Ў:tb=6 эlB/6L>sp."$Џ "-0R[1mEc؎ a;R\qU؅ \kp-؍p#n͸6܎;p'ݸ>܏ x1<=xO)_k|o?g_?^vGe"k-nb&7)_YWZؤ|+ߠw+_k,+*KxUfK_oZI;vD8^84Ev^˷xWԼ4z^z^U^X:kxWzzͷ8ϫy]ObO8(O+Q;բNu^EOo5U~l)_*/K׹ǯݢGֺwQשK85\>QWvC hyu}qh>jOW_7F=t|.+(ݿ~_뫨yx+L ZlyEEfPd4-|6̶r\IW(&3;a^sb|}7F,'mA^(}*(F1Q~諸돻 _~>qdr_al.K$S-v}h254ܟ Ӫ:k,=6>ȥңĀ?DV# $ 3pnߟܲ`nsurveillance/data/n1.RData0000644000176000001440000000051211765414544015153 0ustar ripleyusersVJ@ JгŻ=I<$D-f3M|qf3K6K^/;e33b:\ @BSK|.+uD2r@m]}4Ǭs ١(lOȓ(We޿q=9i/{P>HhP(`;܋͡{ߢP-KE֧aQGqDD Zr [6|9;7l\u`hMi~-Ұ (8[n}H_fj ?_8" surveillance/data/ha.sts.RData0000644000176000001440000001761211765414433016043 0ustar ripleyusers\Sf+(bDY`N݈n%QZ(V:jm݊V8q m= }rϽ·ߗp8z>4 Z`y(u_'H00j o7}1FxHFy2E^mDZ@bC)T@|TF UjHu$HMF u' Wi4Fw ""DH)x"HsiF m/⍴G: NHg tE!ݑ/F }~Hd"G$Q H= @$ G"%|(DD#d02 C##Qhd 2G& Idd LE!ӑL$F sy|d,DEb$Y,E!ˑ${dYF kuzd#لlF [mvdم$#=H هG /ȯAr9E~C!ǑIwr 9E! Er!WkuDA2[mrG2CB Ogs \p\.?Es\n^E .?Es\.?EsՐ7:)@"]3\YԛYZRk [,<_B5H'`>S-i)}yBimyoQmyPqԅtb}Wcϵ|J1>g bKg K֯tc},ƷKwvS s ]߷ץ$s{Xok9~2%=VQgϩ*k}yzUNƜƹ͙*y5cWRQ׫ss|RTq,Bo=?|oK=RjAxW57𮱤83UE<_~̹-mJh:mJ1פkޯ(_ }x[OuxL? $ͼgg{լ#jX$B{U ^<@{^˃!j5{^G#U: ?`*ô+kjU =V`-J|D"H$ҿNx%H$D!D"H_("H$!D"H_("H$!D"H_("H$!D"H_("H$!D"H_("H$PޏrthqiUXo~ޏw             /CtHO@OAAAAAAAAAAAAA|G3P)UJa:O}7%Qt:y:ZlCTry6Ȓ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%K,Ydɒ%߷џ[Gr m8 lb^GMUGfsU|uB*ztŐk 7XGM#UP(*$"HGyyUAQs\Tra(,'x4Sq-5-rݬM"Ôꎪa[f׶E _*R:׼'+k[z_X?ӣPNTѡr ^.s5j9[b֟ĝW.q=㽛ⵂVI3Q?7 '=n@|^0{ ^@M?r󤪵3@Rmœ] O}+%ݿ4;?b$^vėv)]x[ ┞j@h^NN>Xm|7nSg=ʫT z=hZhM0u3țUι8Vwe  K h̶?vؕ;6$<S/;+L/ݷϣnnW`5l瀉J#gT`ⴿôX5VTcAU*W1CLC"?gs ,䣆TP7}!pXJhbMMIxJvB Z $oLH#= *dlv}A}݋An7$í:g= .mmnɪ滚ɮNv ^۞ Iq=Xf~E JqO. vIĖۘ[r|7bn܌]yW^qN%q|C{% iz|JM|w q>QI 7v4h8wCH:L^rf5G2#Ijǁ;׺;@(/~74'=,nU,8ڴ.1\f. L;7-I F`/[; x=g kuG+vxm sm5`bkzuz0$y1mBZO榋ʬ|: W*e ?q޵z 0vu`;&8}僪+deգnPzN׫u5֝u:Haw~xĻF/mX.r#+麭AV"{FW7I^>}/l(4Jœxf3ŠLc}@2e A2=6k)~A/FQ\=/Bm2|C`? rotg0PD0z^2N5js7MNr$ms3f禘Q)\p M~w/O65 v?q=t=q,'gL V2x衫vE6=U<ܪNJ mk+;qUwwOZ-)k]u8GqϴeGnX5GR6e^06y/%^ ;$-k^َ13uw d|F(̕6f s&[w]Wn6>$ÖIWs ܈J,wb˭46b,7cS$)6FM6*QooJ6h~^ ?3M.:el;Ʀv41=^Gw Pyւ@8ywp̌'A8,; 9a<_l@a͸GE6JQlTe,[Qg+lŝkV voA|pz lgAx/*wA{CaB0Rn:0LN!wfc7ӋCrak`:`] WJeީ;ŞN?;WRb\;V^qGLCq^Q׎QV}}V?N67CgүI _|#AʡRNy%,e0``-ܤVJ6æz bSC"6u],ϳz#[dl[B[.dtZ ^. ]* =⧮/A4)}Yζ7+QW0)-̣*hs"l!]_,<*Yto{h Hs; ,3H-K5 ).S3z>5 *%[tya ]lHLY9h {ݪC'{8Nw.s$Os@m[ǛɊN&~~l*Mm.6Ŧ*cSgl*M;nS`-8v[| Wg78(/Z9ҪkCD vFë4FpldϫKA0[Xxیx,.7ZdU5#7;I]qo1 ]kzݫw쁑Nn^=r_4Y#nqOOd/r.;ON˲yn$dՋ({b5nLtK|e>e-ˎW>o1C A~w5.+^<}jW#۟Z/A2?Wr=%?p/Ч?^utҲNuvPWpy\A-֭?.,<{x'];&\ :(ۺZh EHX<__kNXʽsurveillance/data/fooepidata.RData0000644000176000001440000026443411765414544016767 0ustar ripleyusers UT4Kp(%y'%%C!972!\G _t% H9j>kgNjkk=|>N:w몽b ;[1J!zA.9WU5=(e-"BQTT$"HŎD2؉TT!";Db"RQTT'"5HEM"RQT&"uHŮD.؍T#"D؃TID*HDb"R'"HEؗT4&"MH~D)hFD*'"͉HD8TDD*&"-HE+"RњT!"mHE;"RўTt "HE'"RљTt!"]H!DP"R "I"Rq8TAD*$"D8Tt'"=HD'8TKD*#"HʼnD$"Rq28TJD*zӈHEo"Rq:8T!"gHD/8TKD*#"~D"Rq!;OD*H@"Rq1T ""ˈHDb0T\ID*AD*""WkHŵD:"Rq=T !"7HD"R?Db(TFD*Dv"Rq'T "#H]Dn"RqED*%"HHh"R CD*""GHţD1"R8xT%"Hx"R$xT'tqJ:NMGt8=gO:LqV:NGtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAǶJI~8k >kvٞv{ :_z]޺qWsqWrq\Nc/q\לp̾8}udF8*v8k|}68*8?Qg8CwkZ_/U#8+W588jpG8u\qj{qxC0pIWu7o8yuČG_q/}~px!]F'q\6?dlUu~Nj?:߈W8'hC8|}OY1bʙ]qyߍ:U;:h޴!+{87xnqclN8ھq*5^7pyrzك8KR]ON'ާq\?}^tq\uq=nq\C_P8't;98Q9:?aצ:8'G7q^8|S74q_s8zՖ`su'v:o^|:8~]ǵq\]\g8|iq>hNNqOwtq\=醷qcnj}:w^%:^WC?q\E=/;su^|<Ͼ7uq\^98'9zT8|VwU_p]8zN> q}a'ODpo<>80qJ7?L87s[8) l:muKwVrߣ=,:o򄍓8'I88k|Sxdu~q|<:_{8o={̥83`Ή86 8oߌq\?oe]p^4q\Sq"uxqi5pGrfWuwN·Ϟq\#o8yӪ87,~>tUq>|.qynjp#u~:}jƩpx<~a-q\~tǫ8O{8| z?:u0ZtMG8 uUOq\<;l\gu^oq_>Alq\-q!:쎦n:q=0@uW{r5^{g:xVpyє*6C8󎝧5u~š&= qtm?uq\/q\ F;շ8|ӗ*'8}jTqyާq8<1? qw5b8!MNz3:skg8 o]qxGOQu08|vꅚkj8& z/vjwu~x.Glp\-5 8g[p^Xs2? :q?dz},S4qq6aP'q\?{mq<ۓ;n^cOq\Kﺢ[8 wn8UN8k)wL{%8#5cl(5^nq>݃Ο^8ӯ?8|xgq\Sq"uxqi5px#FL[9+:qPjq\͛6de/u>}0:;j?psJ8|C]q8kL8]]*8ÇM;uT7N]:ON4{Tu~Iq=Vs8뛎8k|n7M8| ju~n<q?1ӑ74q\'tUGu3 qO|&f8ZrN5^ڲlݮq\͋/XtRu~ïֻ>_8q/]88N876:y옱q\}Kq\33Kpx_uq8뼨e~΋oyrqwqc?཮8+u7GZqO]Ҫ?qxظ qWaQɇ8/̸qOh:?'qy@F8W_ u}1u>M罍{jCq\{=1=q\_q u~0 q➓9q`J/:×q\k\3cUug5c91u~_>qM918|獿 :kpq\Cqp3k~}u`cq\{2::!c8;^ٟp7盆8|~#^]οأ8?fVnԩqٓ8| `u#wZqŕpχλj3ߧٛڥ2:oMn6}SpyQm8u/8ُx5uɗvqCq\N_q\Hu>wu^[W_Vcpxʃ[\8g{87 8?]|8:]7q\Mg8'{⑓pvΗu^Ƌvx,q\j:/rBq58cuޱ&׾OXӤ;8NǢ8SA8|cqo[Dc5oVMj9:?xq'?Ǘ_8F;u>)5Voq\w.xLu_k#o艳:>5[qNPsM 5ޤANovمpߒ l?`uٞ<` kNq\uA8rxo}f8󷶜Gp#t3q#orFu>nu~K[#8g{^[#8g鱿xU#+qxRYeJö˳+W>ʺ}<j+ ڞ|ՃoWҩ'핷| m? >| m? Z_Wz6Kz.q6Kzr4|l*o㮼iW.MGSv.y]nkOi_y]nkRQwQyrBôokRQwQyr;(ݼ>)q|ʸּVN >Mzm夶>lz!]u// i?|N//#zyHG~˙a[/_>rG~ Z>-#?y-nG~*|&7>7՛e=L*->~ۃ`y-nG~ꕂ5c|˧0s-tk{#h9>0n혔qjo{/S{֎IiZ >r/7>l [~ۃpyvLp\Ç#\r.|n/﷽ö>r.|n>|Ǧ >mr|y4>_>/#r.|<|>c|[^|mGvM`#\CTN | >-p‡[y[oj6$pk>yzl뙖7 >|k>ʛ;^\u-o> nMÇ[vmM`Gvíi}pT>7 >څ·M᯽UVuI=pe[^z4|7$|(4>\˛­t<Ƕɣp3|և`í\<[m}6?_|l~iak4Z>և`í\<[m}6>3| >͇rA :?_pí\<ϗ#|p+4Ϡ%7>3|)| >ڇ`pí\<ϗ#|p+4Ϡ%7>3|),#`Uy#̓W-ǯ Snn櫾|-[|k'j~V|#|pU-r:Nnډmz#X;Q|-[|k'j~끏`DMo=o^V|k'j-V_XGí>WGnډmz#X;Q|-[|k'j~끏`DM|䧝 >ܖځ5r[;v&p[nk>NnmG~ډmO;Q|-)p[nk> S|m(Lr[;Qv0U^>և\|-)p[nk> S|m(Lr[;Qv0nmGa >ܖځ|-)p[nk> S|m(Lr[;Qv0nmGa >ܖځ|-)p[nk> S|m(Lr[;Qv0nmGa >ܖځ|-)p[nk> S|m(Lr[;Qv0nmGa >ܖځ|-4|me-= e~Y >rOGٶ_ւQ헵#4|me-= e~Y >rOG|[>Ga>rOGIᣤooQҷ7۴|(,۴MQi03%Vi}(, ~Ç#|[ڂpGni >­W->|?_햶wXRHqPFJOPt(#BۏSԸZ>!TxO/rKT/[1r|~C('PYB!T~y!!Tq,!) Tb|GKBHBوB%q|B 1B8\b|!JWgB6q@.8A@!ж(Jb<0b *|ʷ8 B!ʋA8 oKBh{?ʏ!Tb# ]B!PYP7 9B/qG!BۯlGm+qAe!b!P~!B!B!(B! EWYD!8.GPYb!*O⼅B!B'ʟ !B!Bv!B!BxB!BB;B!B!B!B!B!B!B!B!B!B!B!B!B!B&?m!B!BB!Bm!w B8/ )E_pB!BhF,V<@!B!B!B!B!B!B!B!uYB!B!B!B!B!B!*~_B!B! B!B!.c"*_⩻^Xm~^X[O|uxjøOֶ[jիͩY_oO]؉O^dŮovѡXخB{&Μ6}~Jͺ9 OW>2#UVp{bFgէEjwum{{R?Cߟ s&k<*1v |d77NiXȫN[?:'ybfjYÞkej݈׫z>WiEu6sk}䃷,2X=S^%{2Ռ{8Vbw'qKf>{y$_X2q ̚X8ꇵ77.g}MjeK,?0OvnK'gSj%~Ɛ~YvLĚ/uG,O|_7>2|OW[^5O1g}ymz5=w{Ģ+W^oظUV8`h̔Ưkx &ϸh5 %׿pg=cj㢝Jx8x/xE3_\C^7~ƜĔ_q>թ 6xeeۯOOC_{Ok,1㳃&'ФɽS4G.jpg{D˾0[^}hSkng\XVS8-,nϓ\谦ՏΛ\1Q=/wZԪ=gإwoWmod#R~nX>+}}ͦԏjY SyWZ\Jio֨iѭ$m-\ԺkvQ;^4ڡuLVXUjXyST|85cީݫ帏'g]?:u38I?|yS>ūOZ7~-.`%tK,G4g C%V:?߷{+c9wfbs,[ZFYu_BFZ}eKvͧ^/ }'zRjQǧ~q_?_+ߎy{|_8;߱Yo)ך5ZwZxަwN}7Ƅů;5ڱrIsSweٟ$ޟt?IZ`֤ }{O~'g?==u~jmY!1 /yj#NԷM^!B#ՈŊǶ*cԴ]3ɵ\Cڞmvηw啯 :\wUqn>ꅏ`|kupo|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnM_^y‡po|.pl>|#wy|+g/ho>Ç#\9[}A};6$]> '|ہ&G//WV_ryGr vmI<| >•4OзnMҴS#+-_v7vZX{k_K◭ӿsدFIlz~]R3NK+p7'Z/YůdŅޚ JV:՝'&wlI/|:s:}d-'+?wє7^i:_tmɝF\ɝ~=IVs}^WGɝwᏙy׏j[r-%ֺoŏ{LKV۷Wzw3gߣMVMۼOrvO˜\==e_.j6'Y]Z_^=Y}R/,uAQzuWNcMq.d'j&kL|5YcCǮ'yeY^sB}<1gM{ɚ5{Q5ww-dZċcNO:dSu|>dZ Z<Fݳ|q=_LzWGT1k>0Ykߜ)YkGdW~a񜏓wQ2ӫ^yL瞿_~ԡe['C3Lo|mf63nfbI 3`oǞy$32+Mgd;g|jDK5Gޙ[zzfBqcfO3V{QOkPq~mLݾrbg[lc^뻞*2E_ZgZq}2QgfL_,h?6w;+|U:NuO_Y_m_~{gvZkygWY-ώ>KjYiFf[ˍ ;ˬ?qU^Yo#3ck\o:}em3,^f_,|΋z>kf_`3ۿd+L+9ҿ;Vdfo'4)7/e|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||jbc2WGiAsïi'_/_ֳw^5^4|~G9*m>ݿ~整SL :.d~7d,z2/[;~92aǔk~l~\I֓./]ҾCcW9mϒ_ݰ?woke~r=S;r=%Д_V>1LOjʋM<ܐwV^L Ӷh_+Yy]|CHr\og>ve|id3_|T~y޴CC)Џ]𼾡8$CU_yCsh>Lq IlG}1m[Mq- ̇㸇Q>rЮ7oGCCyqOwU^,7Km+>Ly(| L&_2C!5rȇ}97|VBM?RV> h~kGY_L퍉 'm|~76~T9r{,;~+ڿxTd(/Y|K\M#6]IegG-뽬yF/W>"$7^&>|Y~į_11_il'&\nܟj?gG\dk\w/91!SN~ˇ/+U_zF>t|V۫1lqC7ɇbI9QyP۫!(yO?v=u G&Q8ޛzq1\|Դ}O^>5-X?j;vʇ^;1~$#&>~ijBhlX/.ڏlǛ߸3q3\9|a:i||qkG>Uo=ɇV۫Ǚy2! ʇḗմLAD=~ Ebyd^j}gִo=3=ُ>\kC^PM6>t3oyTWWLW>ZO"Ň/6>d09V8pC/_ GRr*gC-7!aiCw=ƆJ>Jq> {}q>J{fG7Wy!/9?NM|LO/=y.|;[[O!Ig⣱pپ^տZb=9΂|l|Hvx,oC>_h.tzqPfb<>![s1-0?Sq"fkVry_fzO/WV=4o:Ukyr&>pd~q3' ʇ*Pvo9|O/TX>8;{Zć4|`䣅p-JkyCQޕyG37䫖pɇʇ~ ʇvi=θ׎[ܟyI>d?L|S11gj||l|}q g![%zn -7Ɓ~CGu壅~kOn|EAןzeŇ;[r?LUSM~eysOwyPZ|vJ!||W|*1\ۮ|H.j,dC| _M|yZi&>uk?+5-϶sϖ^{*֢VK> ϟv$3|[nGCƇo&>d8/L|y֠|io^~m%ʇ׎<Ήbo=ɇ'Uj%1lG\,!Ǜ9^!튋<]aL|t}da8*j~x[!W]oCۈ|BOE9y'Eyy5Mbo*oqCޗOdjC~7!_ޟh+P+7ԴN4|5o9nڈr8PʇkGo=ɇ'6>Z WڈJX,!Ǜ9^!z[Ci\I>ډ<Ը|Y\$p_u(C!j{]h+VƇS?j}?L|'6>Z Wڊ伱XnC79Lǫ| s!W)|ra0]?~ ʇy7|d}T|qʇOaJ(MMS|ćh7C[v^{*[]7W>'|cW>[/j;\PƇ=?|*4]C'sC~7XZVIW>? Y|6>la0}Ge{|?U뙎~uƇ<t}vs+W>e_V~uJ^[|.o|9K>d6>OK{\oTv;#:zK>u*ƋojM|(~T[ɇGKWɇMU;uy}\A?ly=[V珠/;j;8)+>susC+Fy壊a9>qWnUɃGvC=#|Ƈ!\W曮yeCGP>LW館|E#.1!?,*/;mŇ/|!V|-ǖiw^M!Z.۱=*۞_C^߷t|!JQ+E򡶣XnCY>RyCPM|ix"Pʇ|n⣅ah($&>!-->$C]+&>Դw2PU9C5\|MZ/ϐ|vb=yPMgzNc? 7P2?sj}C>j'Mur*/9dCW|~%;{!{ɇ'8/O4]_q\>ϕƇ<~3}j{~%ӕW"//_|㤜oXnC^_qTGP>7ˇwz$>~ }򡎫2O}b(m>X+*o])妿_9ᣤG|C??*|/>j<ەEUIA}soyT|֓I&T~q1Ƈ /&>LGߩqCʇ<0}_"kʃ!/l|߱ϳw:߲+;%Cy(~/C'qʇ\_ŅUZy|az~ećC'!\/U^6>L?u|!#Kˇ;.M|d|ofCOߗG5m|wo/֗M|?9|!>\O]P>P|!{e՞;#͇˫Pa;c ʇܯr&>gr%r&>D~^J>%{Ÿa=jO~GT>/xۣܕw%&>.ߓ$j4˼u/ɇćƇO6nCw+$崍yܲ!ǯ\.PAW>Lߙ!ǭW'Q+;+UNIlCɇjƇ|K̇*mfXϕVw+y7}(0}(+Ǜg[!=}Z_nCͷ!ć|?ʇyܗC.;Hws3C|9ws^'>6aZ_'^jbC[Q.}΢>W>uQ[QNYlӴ_jći/JU9UӸ|Z.s2!}_>4Ml|+qy}(Sg[vPt-%CG-1mCgCM?LJ^_ޟ뫸XO> z}%3L|WCmWqJ>#0C^_绶ϯVg2ݟ?!Pa0?La:C_GX>Ly!G<(I>dafbaz~%7.M|PӪ}\^WswL|lm7oW!ۑŇ8{yvMŴjZgΖ=w⹷=]P>;||+zr;T;rܪ g:_H>5>$r{b=Ri![r}%y#M}!g|וoa߷5mH>w%C᭧Ƈm͇?/>'7(j;azʇO!{w@&>v<$PmoG 1ߕ=Q+ySۯ|_y\ ˇˇ6?|1Q__Z||aCmć K#7=Uy-->=@O|!C߹!ǝ<Ƈ9R&>~rܹ!#0񡖗6|ݠ<^tNluy>G9H>C#ćZ.=ć|o~WyaCϒ\C+b{F>lҪ~ɇ+ȶsC/^ClՎM#Gy!?l|aCˇݜ݆Cp(Y|u0~}xo|}eCwϵU~#ɇUӪ=ɇƇ{h-\U|뫰|/aM|ޟPtWyJg?z0]_|/!CLW&>lG_>dc:!+uPi:ㆉ;GgP>LƇ<%2|LA0?QtnCʇƇZSn*ˇ~Wb<~-7ݟqc$| ~J˕_Mϯw7>Ƈ㓉\0?&}pxy|1.^]}*ojƇj?$q_>ɕɥćˇ|]Z|IEɇ|.aCf_>\ۊ+W>?U_g\./rq*ߓ!O?$>/nX>+keO|O׹jΓ:aPy|85]Ň ~P%|㚍|W~){}9>M|'W>g%Ujo]oz}% 9YP>}x|~?(wW/'K9qC)k$r<'T{rg7~#(aCm_T0?盠|5>!5ćtOa?wv!0]_I>bC]_)C0Pmq>Jlgp?/o|Q0ݟ~)ɇ|~J~O(+Oڞ1㢜Uyw%W6>w&>+{wM|Aqć|u>lߗ6>LU{6>s|ʇ$|rEKsW>}|虜l%{B%W}_\3}~Q*L|7}C~e~ƇV7]Y֗C'߃v}%;am)9!|T&>qQ>PwD>swPG6l|}IX>L%o\?~/eCO}{}%W's+`?KL|H.wUAŇ|ڵ%>C/++j?C(yNv|_>L|H}nnK)G#]l/%T< k%zJ>Uw&>$WxlC~%ć?L|}]ɇj_,0=V|r+~1]gPӲUCGEqć]C |/ʇ|~P\^~eW>L'0wɇp!,>[@~}Gd%YeIdk,-fHޔӤM1mBmʘ2sRnʐ6e̜g;ߓH_g}缰{0>q'|?JJ >|[U#rhW)r ϑR.RyD;`~x)>u2oŪŏ|p|?#}5|8;|żNߩ`_C\̳j3D|p}9qhya^SU|/cy+g)|p}Fgÿ;cEA}?>ύJysS*>8>E+~|^*~}}A觎cv|*|F tFS|cqSeʯ]|U+7?O˜s_y >7p? yp>H@g>(/~ogO yOқT+yK~R~ <^Z_&><u&#ʝz*:=5 Ň] wZ㪌3S`A/>ӮC#ԋށer/Nw?RO#w!_ { R  e~?/=hscwǪ`i{ćJGTqjg1CX2>xic^s)|p=v]C*>L+;|4/e;gq\ʟz8S`(si/\?'Spa|/>GM=g\Oqϙ>̻YU|W\'mqpU/WC}í?AG ̛G N~g~&}=raؾc|ym\\L>9?B9R^)s=~>>8/dp$>>Jpqk1`_|8U崋zs AGZzAíKVGFj`_(~VJy=1n?v\qÿ;GJ|P>Գ A>6>v㎢QCK<7\}o(O7|cSh.G#aU|Pf}/;|3 ~ J=%~Qh5<&N>vq}1|D>o|`^{zG.>8^v|~]|*q e7?ͯ:+v.>Wԏ/_=>RuJ)|<ʋ~AI]|Ua}*>:&㿳SڡÇ7F+.>>8Rc>Q؟ P|}HU/_>RíLWŇMzNqV|nA=?;Spv%=Cn-ڹ0} )|p=,ccww֝S  ]|pTߴ3TG9?qy<`U|8~>8}(>8/n;,i| {/CA9A;xw8\p~:JpΑV׏#޷%Ww>hw\$>US#17|s@G 答s`sOzl|PsoqtD9‡[v_W*ymўrp+[#GGz,>HNjˬ/_qơ]^3/B<0q},|PΏ>uƧp|l|)|sn0qP׏.><.ae;S.r绪un5Apg@{W W)|;|P'> tֳ>*wwKکke78]\pk~Q/.k^'GQ=?t9|8QX|POU8KLzX'xP()|2$> 'SO>ȧ]q.}OK@7/ppztM+ƥ?rN?Ώ>>}8}t9no|E{$>HO1>zN\AH9'n/휝3_ #\ !>YWW)>j(?>jx?'#G?MW>ώwΥfW)>\~{\AyF{yKs|Ϳ!=Na諌wpO9pNA>ܼkޗo+}f>`)|0n9UKqp-mWRޔÇ캴+Q&>hEƇ=2vQ.{~|A:U?$~Yn_ʯYow|8.EܢP||,.}f%}හ)wg|&(E|=;ŇR.?ZzQG?w .ޱ=\7_`9#{*|8{֧\c#ý5n\)|.>\V֫{O=nL|{Ⱦ߳}=񞡾+#$>2w8|ť>~>.`>zCuq`9wƇ'hYq<7n\]j>QG;qkَaM\y'a|99p ɏ[qO ҉~*ô{t|8;}$|e=K=̧3<Ws#ߑ/m|C|p*rwcWjJ|$X^/w_ >__8\gs;$2>L Ni _TƇdhoʩ|#k˟]r.Wٿqw~vbA?q]#7Nӏ:>*?GkNghPd&.:-[p-o{r>zl=t8&~#>R~G 7?B`+9Yc'Nuޟ)ܧQJYSKH#ϲo~ܹR'p\ٵ'QMɕ:#P|_> 6|$+D:굍{Y|==6>UGõw^xxH=7>JH_/oP|8f(ew*_l>x+eǭs!q=8n8]V]I^\K-..gR֎OGW^[z6>L;ڱ=ߧJR?t+P|zmc+[Sϫڕ'SƵo~ǭޕOrP;H^~`vj.]6~Ѯ-U!]Uۧk7J]vv~mt=UnөS?XyS|t:^ύv}.9xWzh~8+N{۝>56us]߻玿w_WUz౯^ylRry藞G>t>P^sW):>uݣ_+7ϔ~S}gq>=k,[hN; ; w9->|YNI|&;_` t=+sw88vewS H9gXNʗ]\wxIrK2GW/}:⽱N㥳;3e?hwǿv)9&x^g1џ+ơȿ~33wM eɕrJQjʣ(/;{A觪=seCSI?vtN[Hwԋ(SN'%OYϵ[] ?>{?w/vǏGQvq@2wKz-Opʗre?c='O#Ky>1/Eԯ??!޻^CMS/NL{}PXQԯ9S񼆲A9=UN|gQ2E\L{w/ڭ5sr /"U?6Oωhe)W|NzbU[E7N|8};|M9D'ӿ*Sp\>\^z_Q.Op~rwtgvA|9:^ȷ/1Nfz;)|Dyt;;2-q\CQsO;N\\AU %;^D2ϩgtl>s~:|?hEeo6p|X:#Qp/\^ CM\)=f ϷPx~QGy[osvD~ig=qL|Q.2ϩ'qAڽ/CӿҮWQxz[(8;o7?mPE;'{I'1BP.Y@}K=ѮO8Oʤ~r89xOy1獔_S^5W1`<`5m:Az9Lɑ~qPo/7.QoԣicfF~7ć:cca~B|:v 9?4e΋9wzv/M>ϏPv;U._<@=;5=ċO)x?/QǸQ~Qwc'_'(x2]ޢ]K|Ɖ iDоSkb#~;WQx0q#k/ {a z84!iA_v@\Я}6Sϝ\>ȼ sH\' zS9<o IEv_zg'>|zb<)>%j`eAq^C|=gxv.agozG{;7D== ^2\ϸG|慌-_ OP 9ψ۹yMUs޺(_wcꝙw3sr>" Uw.3 z.A'qHޘN(>?_NSQqwUsBpxq'AvhW_F;1x܉ω UAq|P?#1\f>y7zp?C}/F=ο>!eaevWhWg@?ω+ʝ5Ӣ3w8>(_'#1[~5񃏰kQ?Qy83pE{YE>WkysA{gwWʓ^xLs=\q/8qsPS8K.^>鏜cq_a&>8'qhsܗrq[˨mn%lv7Cagݹ^9qԛq]?r|4V^|h+seG?11qOz\sB-QܾQ|wz.~y%,!>x*>\C>;~Cu)1?SGK<04~ĸo7BSc_<r2+#uyƨ2?vsGH㜢>qr= y^sZYK.l\"3w/<7Ўxf(wwzΉ|$ϩ=5Qo݉(xGȍn>0r43OYsY(#\WuG7uy8vt4|xQGVG-~p_k[h 3~Pn_S!ϙֳ".!NgqݱCq?>R/db|ܷ*\>xEzi'\Gb?^G}|)Sӹωh\oֹJhG)z L;\ q*\y_!;uxʅ~v}<,<΃/!׸s:+׏^Y+?9#7r?\kQ@Ϲ >~l,usq!w!ws)<= !NG;܉w%|ڧֱ mw')|Ю>QȣRf>3s? 8幒hO\?CD [oCo|uwޣ}pƝ8!׸%]Ao>=<@;o΃xl$+s.]ȣ^޺SG^^].~0p5sG/|O,>/Ө6ߵa5 ~O^3~/gs_U<}Mwnԭ_q$0".'4=n~,B>h@wpy^?'s~/@~̋oDK|]; 5㸾:F|p}7QɴGi"iw: -G>=_< Yo3I]}iÌs\W %~yI yy^Y?Cu3'n>vjqn0zd|{ѯ;sW=,cN/ퟣ}g|;?Y?"|;!i(Q/?ؾYϭp!Z7bϸEy܏?}wvUzi7QJGpȼr(s?K p0w؞n.+~qb eTy0qt:3]_{KzmNw:O=O9:ꠃ yN\ 1׳P>/nx^ __:@ χ#qC/m~J~o΃'絸H>iQZ1Ϲ,}Fȟ۷ 8̃KY,ӯs6Q)|89?NH/6Oz8;~A%|aMAIFQԟ p@|1ߟb}ωk/3Ohu\2\ a;?h!(>C>yE>8= =Ηg3,A?wC}d|0ės{2?KWr-3~p/s7XѺ8x._W"AWϊtQO\< ZB.\+Y쿔?s݋,y eK*bH8Qzn]R:Z ~\~E=+[3~h~7ԫSίsyvU5~Z9;1[w?UJz7eDҼYlyގxtfzI|4b|ߢU湛[: ,z[>%Mi}e02n|~޺Y9$Fa1ns Ѿ,yw>0~߬X|3^{>;`~bq: =y~Cb9y0}Xyq7qߊwOgjkK?hyno+}b݋O81>规zr^!o4t0w9;d~uEȍ8\2\*Y?]KvzZwSu0k|_ t0qA>cܐpg_luKQ,yWh)S,aO/>Z+00޹8C=v\?_[?l[|4ڋ0~ G{nQ[wczJV<-GaO&2xOiyvΠtyCs(U/xϬY~ۺs,39/n`(_}#Sv%|~1~yO?Zw>5.V#1ۏ+uѺߢ^ 1.#׋](W;ːS*~4Ў/r;mGUi>,)(_Gy)ճ"9>Zž-~kk7~UqU#Af ݚv?~I~ ?MCz*s4))uߠ N\'yfqhuK6*]yF؛}\(fuU|U?fqܐ[7Ə.H|p]nQy#Q?J:,A|ۍGI|p~^G:>hljr#_l=w~?H?UyYl_qY(\'>g\`cѺ?4~{;?Z] >7SuVh׺Sy=?oj}H??JVC{~a2~2唚s?OSN=x+?btW|?(Y^k?b\{ӎWY}OU> ׯ"O<~x~x^Yb9Arݏaħ[ |r=a˝mʗxf>f/tE".>7O\J/i3,ssVG_%|?[ҹss8ʗ\vKx΃1Ƶڅ_>ͯPj %U>='x\.WOxj(WYޠ>Okv<s%<]%G?ОTpxǏo=%>aQ}QOUp~ <'w]}>0sW{~7E{Q?= \m.ӝK]\`ܢ\>8/<;(tQ.f~ nst7}x.|"׻>W|{K@?ףJHO*?Qp?_"9>Z?{nГt۹h?ʅ~zs-sܨG?4?GFȯ;X5~uRhh{~ێ".~.b}G\(W?hć?x|'M1̋M#ܢ>/p31E'Ry,‡?JS֯??n'?<͝4:ʋq8+:]ržO\|z9 )1>_rW<r.F;=S9>uOJw=n>~yUqgܣ>Je|Y\觿f@gMm񩧐W~x>ZωX='Ƌv> ϸ{r\7s=.`<⸔ixɊ=10_~O)<_ z~h;EAȋ3i<Zϓ%|yL{AҺ\~>b๵7?J~| /\ߌSϊM1+啠/z#;4? )y'?Һsc@{yf5\L|9/ŏfqG!wƏ>j8nnAGs϶<YӞC?ѯÇAc`@qz yߋσ9|G6~;-|B!3~y2ѣ?Ə>O)~S<0d>Y_,?rfE8.w Kt2~%|;ʝ_9ʉr| Y_Mr|dEGz<a<&Qc|/||&8g#{;~y}AΛೄfθCs̟(_E<]\.WYOS`>QZa_ =yx x΅wހ漝>"w:iƭ_qxKy;*??*3i7E{!>~E94@/q?+zGA_*%eM=̝֯y"'#/yc(7(ŏUv:Hj0LkaƋvmۥK C8~9<;g+\:rYvI|d~Li_|q6sm}UGVl'ҿŝKK}3!`'"I|U8({~~#b<)#?7%QGex%oi?wp|k}zƏ|nG G.~?9'9p}헺swNv1tD/%kϤA=qN\Gg<g? /#C=ɥ])Ns](3q>͸sgaEfRG>~)q_~ew>?0fEz8okC=qxuvxb/}0v_O<21 zЎhϼ |4qi zJ߫$>!ΑzoQz J=g?Kw,~@{a+ŏ=?z?" tc{?T~ю*ŏ 6Y!΋ڎ'ugek)~vSQJȊ4Z{u}sߦ E>D=A>"_wKHhOy7%]8,w}3_-Gy΂R<8O${n=ϩG'/;mh%ܾK|4] w5K딆?⣴ovA/q@x/c/~8|ܴ`y4clϿȿGq:ܷ`XSOW,Kx=N9E{qdƧ_.θ|Kxo~w(^>DZ~y;{~AW Lt>TZuc^Dqe~Ӄr#K^:Kjh'n3~>3N*>ҏ3~P>\?,iPY??H/Ec.>G2~`>Ezݺ{̯@*~D:K}#?Zh3~D?|3+QjHWRH[5~:JnC.8v'_1NOo_:_rѾwԣpc'y0ۯs GIwin^Pf|:G^qَ_ hOlG;"9u*2 9z(Gs;8A:~˺)sݎ~n]g|p|'|5QgKz|_0q|)GO/(78A_[)qzǒ]f^0EB9<8\H'|9{NQΞ,ڥ>J9:CS^1{z˕e|j4CI{v~q,=$^)~t6~4Jvv'cS5~y8n2癥MxO?Cܞ˯8C/Zs7"A|p?D=~nP~|Ny7&4?89IJ[zNZ`r0'>=U+Ń=`w'pP~Ϳ"<ܭn3{n ul|e_u){רEOA|P%|/։ܼ!e?uA^<𒲟:G?U<S/)u))P{CgG~?oy(/n'_5';9#?Ks֧-;B 53ayX) .`\L;?z痜''/152gs!7.s =֧=QOn2ǣ~H? qp tqw~b s:|8|Rl #GDQ>ˎ35_~yzzο|8TD;tT%)~A)RHͳP(wa9A>_ gn觿$>z)o7_&>^\Ff{>>i./!(/ӿ:LKh/l2坚g_lG3&],o>/y5GnhΞh){t~|dʔ3GLyH!G=Wʇ ;hzvΟ9}r> >vP:%\SOѮi'M7aKvJYv{p){rON\Rr^i?cW_U2c)}1Q7?d;7sqj eig!/ʁ]#穔'+岃2\ٟ˓(_U2c)}ԇn(/翷p.o]ӯ <'ξ\E%SB=|X|8zI?=?PN.s"s^٭h_;ӯ !%WK9|klS>,/~?z(?/Svb)~o:t|õϔ\/qڧ*;`q˦[rG8IW;7)e?Sԛ\;/?G?)_̓Hxr3痜]o<:ʋzH<-w~iOoiKٓUES˻7iw)i/痝?٩7|q|hWSqp9wwʟS5s~ɃJ;Pv)8WvWýjg_^깓8U_sݰ_W?=яL.x)>P9}WGW7ߧ||x'NfюqRN;=P=2qpt٥9S~&eh'NSqᣖx@~];Ky9<}Uq5Y)~T_np>3|#rt;|\\sמrrt/̸~2<%rwF*OKSc߈7#.2wy$QA:97{ǯ+g]ǽOUGԸ~ȗ)=8ؿSXJI埡W9Hћ߮?'?zV)Hw+gn]UoWRv@~RvЏ.EWB%{rvS8VN(NKrNɽ~*_jq~}IUj/Oڍ{]n3_U9oWzwf^5VWڮ)]Ui_?Nqv8ab\W{:CvqR;N<SK~xU۷kWjvqO%SNv}]K?{l:]>wT󔞝UzGujfYM=??˲?8?| Y>J QH(FFeMB,S7gd>bMof럕eߕeSlZ,{{f̡>>fV}~C͉Z[ϲ;je{YÙ>gْ^f_eoʲ?I4,eƦ>s/̲q}-/iYβ}9P;GKnYvOeg,Ͽe/Ͳi}~?B|β?:nX},!?ݧǒYנ>쏔.n{~;H*?oD_!ݽG2Ţ>ȥt1d>K累MHWK/ѿt!x+ [W.#[G:c}6B_~+}o>D˲hXNW*7J>ItG#6 B|ngJ]Ѱ&]HNdt;}$cX~OBJpVӘD#]5^2_' ΢tJsY]o_85a}E?҅p>6ߖ0/IsGzUDo?*}H?!]HGt!=,飾Oe/g쿐>"Bvw!_7\IW!ZXn/.$l_#]?Q]=~5N$}^=mO O- Kl{}џp:&ƅW L^҇0\شdf_5+͍#S >wߐ>lC A(񗄭enE~`EiΚ[҇.[(G)&=}]ݞٗJC}(Z%#{,˗^֙\.$ K͕lo>߮ }CV2lHtLR.|`l[vңxƞKN}OrOPAA awHF$򹣲QΘt>./a~B4V@{-4)lOOiaFrf-C6?.fk-}|BX,>)҇l`Q:[].#"̯5ah>ۏG)yn)6nm}}wCv'KaP>P6zQ1}NeϧOI ɥ0stYEߍy,]w ɡ!db3mt?+ <}ߑ>$ae@z~!kFd/~Tnj s+R?xIŤƙo~tfY'}'['3/[ߚt^x]d(,-_҇>kk׺7Mz-Ӟ|"}H(L#ſ?@S33|Ŷ>彯]ǟ%]0us;axIeW]3=&-Fz^Ł^' })]A0/dCa53"_6F%1anLM҇{BwGXTSʛdӒЬUjwc^>t^~&k{܂pA }/O.ﲰ"Қt&yG۔^7%-aiKޖ vwޞcO}_8P;O9FEˉT?}IW=Fd˗{]kɩ.U-7Un%;ِ7SN֥\u˾gZԫ\OGT_^͐߰h-(VK}T>cL>|Lx dӯw>')vJrZ9훿AѸ;'{}+v楻y[S^^v1>Hբ䴤MuHWoȇmJ[ϖۖ(N wOsB@}(r$lKDzTʷeхRv%TZVn{n%[œ;I>҇R,{8ޭ֣Jgp\/˧ {/!vX/Q0"R{TqoL>r\/y@r=)^ku""Y>u ZzooV6|Rh]캅^^sɽOr蓼Sd;꿐!`XrV,~)_R1Ųq+Ŋ >'kd[S Ӿ_3ì4'V~|;De5{^2[_ ]-ʗ/, #VV%UmM._.|ol~S%9m/lG#Ů)p|(;R8Ҹt!9QKgɾeKKŗ+Zw-{o4 #wN5$OT&4vpL~[-z~t!y?~KV}]d/2dPr/s!aXȽ.{TS+|ɤ=Oid9?{?QLx{?'{'K#j>~_xNTPP;9ܣ?mŨ)WTljBe҅|٤bSF>`Fxgf7I5N5y~sK/E${X/bԊ伪6k֚.>|T |-%]==48P>ԿD˱x?nNDlT㜉s`KKs%o$[VINwiCvCfS|Y}ΫynbflG2==?/}%2(;; aŜaܰ\|08&l+Wm4yIiIГʹiaeZ('Lf߬Sl{[Jg^2/۪ɿ4y6 Av(L,*WXDòrɊ*,5uŏ|ŦR>x-8#+}ѹ/;f$CŮ#;ޏ%lWI\.\Oʕb(Sml|Z$.gOBr^a|sɀAA;$+F +f>"_*S^IN4ǟVԸ)i՛V\y<#f[D̜pVS9B&[C~xA/HGKKgʑWTEr_kkۺtLeSuKrܒvd;]~O_i_t?TXө|Ιع۹tp'}G\KuFVOHwCX2K9j3ax zDo{.']VUo@qrPqbPqHu{5]^J&cT._ɮ'S^_\eR|JtNK虑Q99oS)o}5IA[T%,,UU&\ GŋنbѦ{SeKۊ%;gr=}ׁ|h=GXsaD}OdA K+JV^QW7%7Q;;>?iO]dL>[[ꑼz{+]l_ 7ʀ08\|raa#|˟)](os\+~:'dU&)2%ާ%7t9+>g%9>' )nSMd'_P\ ,%%RwE>lU}ʾߺx(~T 䴩8-oGȗ Wr YH#֑>OdG'8τs% KaJ]i{-ÍxQ{+'_{';n(7z^&%>SLnŤL|s>ŀ>/+$AbraŌa#Q?q+3!~&_k=x:%:%LM7t:fUgNr}+V)N+_Iv5^4,$NjoIv$;Y~t|`U{M\mُ a`C:ߔ>7-p[y̎d')ܗo9P~r ?v(y 倧T1L:8WBvt)q)~%ڮeouJ]rw;#ʣ> ogx|[-YH=mbs}i}=wP|PL}Xzo#D>U.Ƥq}%JӦؒ~k;}v%D5; áHyblDqT9;<υ w)_p__ˮP]Fׅ;Ȇ§BX蒮gId}Co|[sdei@|j9(yzC[d:"旲Q{L|x&4NJ/S)Œi<#~fgess[;v^|ϫ0Uy;|EfIXZR,?1V$U-kuS% ~ec[ۖh[ޑv۾}@r89_?lj;Ugwx!^ȇ\KJv}:u >n$[Ű[Ş;POOf]]K$nn_p+۫\=~A^HCajXwDyK~Tr1-$W_MDݤMLi=3|Ь4'>Iټi 弄iA>H[-,VZkUrZSκ?JeKm*n)ٖ~t#J{/r C#Xypvs#;e/Ry-SWFVv'96rO/]O3h =]Vx}Hi^WސlaX{)yec㲹qJ5q(yOIDS˴F9Ԍ0:9h>Jy^Ke e |loIqgY""_u.|7nަҸ[Ow]lW}I @F>Rmggwy!_vXwxJZ4ԅ#罒xi($[ΔCt.y3EQ=ezOzSՀ/$!tHuǗQ_ʯʶG;Oe_ k׊哢kJ~qJv5-YQ7]3fqh|ټla^ZS,W<[ .>(/$%bYZ-(*]ߓ.%Ϗ'7ߦM%?-X#ʦv5WړEÁtP9 +SwO7.W/^jq%r-\˖r]F/Gvt':ϧ'/RgdݲLd۫sOv'˶dŠ| /!vXqtX(fTջ1qmB5q%Zu&egSwJ8oG*{'c\EjI},+/"Bͪkk벑6 zSmKXV_cGqbW*Nn{K**) 'w*wǹt{!TJ9ߕkr].y~odwtuRڥ#nG9Xd߫I}ToPX/߇䓇eÊ?#/Q{LtɗeeW7);-;~#{~#{Q>3{[G soew|˼{^~yAvAX }.ʦ~tXaEX\ճ >҆bxݾwGg~OJ6)9>NNEߙr_,}V/K•J6-[7ʣn[J>]e3a[~G>G>Mޯx/2 A CkH6=ψ|K{6'ckLq8?&d3&SM֦$iœixFgEco뷲wjN5xVy/-jB}/ʎ%e,OͪleM>c]Q9Gũ9[p-H߻ͮK@>PH> hN~"3Ż3[/d%.kņkɺ+ }Ϋ9ޝ쩡>dSUrggsHoz\'lˎdӃʩ%}+4,(O|)9Jc)ci\_IkWIe;|jJqZs sFr?soN9[ww'OM㽞-`Ex[R,%rʧ˟˞? ŐManSs-a~[rږݑqiOܗl$ϘIO'ÝS}&.l\H͕h߭+.n{>rO?;MAKvڥ[ꖍH?HT~̓llP CɐraŕR$1ŗqqaloB^kIIɩ3XuZ:xg3ӌd6+_1+*~NwjyH'?!}(N} (\R>$Xȯh~*Io]9G~Jo [mSeo;y}O:ݓ({(JgG.{N* *=.$K\Iײkb͍pxѝ~'7TrL|eW|3nœj=W_υ>_گb@9 }!<:$} + }Geco ^ބbkФI6%ާ4^s3٬llVzUVI^mMsZ~P_E$-,S+kU_Skk^76$M-ŭ-Bώ>;]'{}@4HVӑ0}XSb|Y8 K WO\KOג{]oD׍]މpؐ/$D[lKr|&Z+{d=ErgF>_rWAy485$z%9/t0&4.;.o|~&K_K?SsWJbd0+҇Vz}+N:fkOҝ6qBofOI$$,M&i4iT\@e@=QA7pPDA܎A<qDT<tFdA9|7?_/_KF+QyEaqE9:Nc $3ɫR?j1kd1bY/Gō[/"*ɧl6÷;z*zWE=tP:5Zmg¶v5GvzxTs3cyNx7bfܟ zYR_YYolĹ^wY8ث'n0;Kogg^#_B.iRGիŜgBsRW u'zrOyz/ʍý9B_{?~ӛ~]WO>+/;yY4c ^K<."~}ūxp«"0̪׵rt{̕7=4[4wJ+N~[8WRout[5x4+³ {M.GuOxޓkbng<cz pQ a z5#xRζ+YZ?{7|6.w徽S:gi~_0η3 < 3Ǐ.&K?z__oFK}]xZ8}}Olඵ׎Y-=#oR/<.{%? _ץ/+Ux6Q9{G zK^h+mfˈ%7eyas4W`}yEX[sp.+oFzQuX6xҔgK-\{˶yJG]Ox3 |C3X|c{")y gz> ka~W溥YrE+r 2lqCw[E{y䧟Gޗd;x9.͕}5Q5G# y%?Sv]Z>5ey5p"/r=?/I/? >q{W{GyjWv/xg~$~SH9w 3j.oozo s^k%u-3߲t{s=-UKUY\Sǥ6լ)yQz4Ӷx'=כzӀo L#~8c}s gp\ ^:~ VY!.=`Ck[N{7;|~{_o}dNǜ~r>*+_UL75MWSOgh<ˮ/9զˍުg>Eu/̇ˮ t8÷ r:C\0?ECSk͏}˶>бVG]|Alj> /n>;_a6 9'^;K;hxǞWsOL/AcI"I:i˨SFY~MK9=+GyS g[sEQ>E=$rN'aA8ZvTK??f,}!ǦRә%GZ~mӵ}OO }`5P!<n&[{m]3wۧ<H#G>._o~t %:io Ы.FQxcg uO18%ƴ3{5o]gr,sCTsQmJf2>zgF+Z 3/>0czٰioWKzkμmwxsNzށehg\HIx槮{L3{|axW?ٛy`OV{޸[{4)C9/>o{3 /p Ϙ}7U+q`m$3wH@i*×t/q?T y3n[qW›2N9g*V*]xl ?`Z7&hf6huy'`'X7#C/ήj15cҔ| 4S`n_ao|e)%YC5=Xh;~|OU vGã TWfU⍋7 $]ՔRӴze4 Ӭ?5'<-[7=^ܺU"(SywtOIC]ÿ_] 7̧^8[}^m~qmn]=p egtC&aS{Y1BN [lzJ]|>Ysg # /:/9;g3ٙlcF/-bls ĉ=%$II>2ӥwě1dh& k.ro lq ",Rn-Ζ{?b@E\UY5~PxK-oGԱ^{ ϊS}i_ٞϼzSc3LBS煩YŜ43O6ׅyվohܷ4pjNf6|w83'/{}[Nl3}C?xA|w>!+ډvqI9ߒ8roi}3߶Ȫ9('ˋ犛٠y/f~.:O5xj~~PO5hS M|mmfG]亞ԇ |&eL #?Ac:U&f) b^{B[ 뾪_}S%n/ce]]9j-n^Gy Ky7.u:ѯ8.sA;UQ68pIi\jƧܲz_^r}`|"3X8Pnx=.T[Q*AA/a]-MqHm>ܶgzZI=[oĀl5^b~-3ݹ^WYc +8gO#rGzʡ6zn3GS (ζ89]z_IifC|nF拑ڎ |&phjy_3ܟa [+ 7-ڬhdmwu6꾑³pOq&/-oI]{8|iv}T?Õ?fݗs=IM? 25[dapmur!O ϸsPzE+1(s*aUܮgkafL9%G?;43ߏo O,z.߅rA -* ϊ!Ac8Cmy.徇'~{<+|c>5{k/x\/g5Q\ʼo,̑ٔzf3xsV9yx4uqݭnyfQ%9̽x+?B}ilӬ2kVϵ0r?3Gj;R&z")L๯ഴR+\ |7#pک'|= C7|b?яocQK9F.bn h,gJB0cH.- dNESMUou7ָ(A>%3{W{z7+BpAnu= 5t]+hhc:٠^_ׁ@1NL^/x3z"|7Ro+޳Z<#lx|{?Y89KMڷr%gu9wf 7\/k銶p8#q%䟤$ƿ4/ȸ''fk?NyQn֟,xxY^w>T Xz[p5IO-}TGgvx6;bOM330|W͌3HmD-&82uT` ™ia'y{OOS?:}/s:d6;YxT/}ĚQ+zyIޔt^JtK[Nwi?g&S^,n`zNEZ\SvfSP'U5I?ȭhOg4O?#ojDv}6O } lCy=f0Q'X{JK/rQO9.̩;{lNTσ3,eo|;l߳Fju6zi"9l^a/oz2wWYw}?6f-w~S='N~ށ|N,ֳ/>]å#zoD5Wi qk'̚ ԟvnȈ9+,\syBFkDQJjVvO|vo V?\VoClK,o/u.=W}x{Wϡtfc;5G،7͜:/W׿-ܥV w#ՖV|p;?E8'}S?z؏/¿`F DqW8W2 9&,SR|7efL,Ï30ˆgE)93'|xY ZE3jJ^e3]œp|^Roj@ujȯ56Mti_==\컧o5t42;|_,+9OYl*7{ea!lpq 3ε{q|Ƽ̍=#_/>͟O3}q/pTK|m_gRM|. HLڌ~Y+˿6+Wy(8KXni(z`Z6y[۫ZxNG jw=86k>0ӇO C{^25)Oz `L[w 1ߜ9gE+^{G:7p}޼I;{ӗyILsZɄgwyݵ9rjQ Rzk(@In%ϕwDZ ]UC5yVn4]C-q>6]ס xSkŸϮml'0s ͜5ȹ޵ϫ߽bXʽkV78)[h|G{AއߴrμοxvEy"liJ c8pMRwA#0j/]Z r4y- [|~E/Iq;sŽx+B#UVxxJ4[S-ڡ5tzWzCwrt, -Nt"69[8ޛp~|>Zxnx5^;Nlv8E|[9Hz,~¬~ gmWjÉK!ܛ>ie`g]3aǻBwV݋fJjP;^pg^euA՞5z ֯MC^MӢ~^^vog̡y3F45)cL0S}3FrX4+{7.+|Z#k.>U6hl]߁'gr7ovI:[?0ūl3ʥ"8Ǖwe=.ބH:ɠuI8 ?KkY8]s愼9>7xtˣn݋b/Cw~oTW*XwM6o׷GzvԳc.}rf}үzoϾa`!ٟ#~= bc'ыf3)yi|aX6+}zj>!ߍ[W>FSqN0_S][8f^:iۧ^WOɽwրg ʡ99 ͠#8<7 .LEL31\|n7zYVzÚj>TӰV;>WO<4q4eo|[ds\o` ?fYy_װΙr/Tny+[տ eyn~+JU?zuu4&mGާm]է:. ?r0t1<3nxL+cT/ pps^}oPKq.>tuvJzwS-/z݋=g;W.v @|CgbdyJ+/f1û9ӛ޵4- GX}g~{ufagOA-%oOu.e?ֽ ^]DLzŕu1|?&2:Ŕ #Yy\u9/Exo^J 8p+{OyjuR} 86[z#O~yیt1Of'ã g3ܞG ~9ҋ9f19LfW΍K׬qxm{w~^5'msvo&'9cx]7/=3;ou=_R#߯v c<9 &`W*zs̆F䎷๷ާu?~~/}'gǏz=/x~|"b+W$iP8LbN fq*怬q-|wgnx捳-"Ne>uߩ=T}kY?džsQCMkpEs86uۥDO=r yP 7HBQy]¹1zXBHäs} fi& ˌsQڼռzyy|p[2W=EX•2s'{ujީ胞 :OlgClҐ>yc3XOÉt/"ܺ o`VzJx~Fݷ꾵N _5<sx~8gKq_Q^K1$K7'jQ ey5=h5ǗUP߂noy-<3ZZeyO6ʽƇkzy}ÜP&/kAKmE𜮹K+OÕfāu?rNF<ōsc˛w{{OpHG=KRox34?KBF+@L1S_,ᬐ ה4 Zd2kk}% u^M 0(F+kKmó}+踧=.cͼu~`%o=^ Gh$:8b["W$q5N)J.f^ Õ܂=oucC1<wf;x[b)^5}`[{_~ZzW'?Jvy/~wO홱yl6͔#׌IXDz 3\Yǫ^{pzIKܳϵ|6^[ްO+w#omkö~K`3\nhny/XNh{/x= ag [WuR|+9sO^xj[jf4s'_8'u: tޏ>tp רx³ñ8}'x2#UƜU,];]CN/͛g @7ﭚa_Tޗդl=U3hk<v uh)scCh˵g]u˧z.m44rHc\~Lfz0o n˺W',Ե{L7g[}OɷzӑGɗ}dF;3_8oU KQ^5o]Q v17&WΦ)ŒƋ ʚk]y:'aA5𬏼r,,zg .UwaZ9^{kMenx# x|˃7Xohg\znn{Sdp#Iq:Sټ^Rg >9:2,;>{_U*j8]sus٦6•G{M:bg;Ofߞrŀ2TgZza=AO39 yzߥx2[to҇6rihig}A=]P9b-9,;3lqӊ٥o5~Ss&}~=|empO V-~ T><'==wl=PC3ݳ8NM)Lgzɜ,YfWvK^³5^wI3eHYƹ2K'Ys_q^juC惢ח}w[\Zë<#5<<_M=-9>SF:t]a?潡?gd>焖z YoFs:Zw[^n knVpMme[M{gq+ k49g/f[=G.oIO-ޛZ:VPտN 7A׵hGСkOO3#ɏ3˄M/4.xkxV~)_>{Z Ǟwr+եX#b'++ pL5)KB2׬:].'_ox獘nqve~rG5XٻyC_𜍵;=r;{Gz^E߰Kve~7~_>q8={^wyA9˗^樓t~~_X]ҬGFp#F1Q&?vi&s5s9szzcY(K<,;wovkU]ŭ?yX҂c7mNaW-zRlzzo߾qcg#9ywS}syB.|ķٕXV5z~ņfN{WO|OG_wOx_ze<#5Dy2qJX??&⯩ ʪiŜ3gRb,syzEqDoe2|/{ʃj֭t]-΄V||OpKzzPqYG棱Y`,׉Mn/YoN#׿ 3_bKٹ~>6V^/Ou#/3Cΰ?~%}Gp+"(қcg\J@ɀI!,^B}On"IK, ;qoVw]E?#R>&iZzcy6uԢ]Zy==~ӓs_/XcH#4rn{T_gù7>G%/,|5o_Wy XcK׭vkz~Ɇ6–ž:7~z;#˟x~¥3>g?k yK ߑۨ5ïgޕR<- ˪EV | j{Czj^Vf;u϶["YȻeo:\Γ?jk~૗<5"/\gc|*4w 3]RIקM2̊?rt7oժ?+þLwjquYQcWL3u.7}ziߥZ fk}˻z|6ښ3wfȝ?s^x>x~ͫN iYtN+ixYf3O!ׅ޿0CYg+x,w}Ü[>U>X?HoG53)9Yδ +.]8hm]` V1{yeޓnAiFfk)/μ 8~c~_nYC 7JYVzcE߮EU-junUCOmQZ=@xPO}g`!܇8𬧌1͎bM2aZ8wpi%XgMk|}Ϙ >nŶUyvo'=QDo'z&?^gp#"jqW8WLUS^RzN2$/յ}s|^gny@zE+2-W=nWP5'Uyk`Xzt.M7ӢGضi穮5'|y4! F0A5<^aL89s}{a? Ywi^ڵ>;q]o+[XoŰ=˧#Ux#NuRG~^{.9BQJb8.&C^RꞶwG2jw_Zsxg%{[25*Ukt+Uwk[(:С3 }8C\3Tg=xot eM>/}n9~,Лz-ly],?{nxyNx1ǫ'|o:9l.v9c]a<5״ ΄5\ҮqZY/WsA-g渒-;*{jjP{p.hCM\ioďGXw?̪<{ЇUCghu=ao^Yx=sk/9M]zRo\m}.}lCxn;gxN?=#7;'y ~ߏ^#t~)-D%*9J1qqJΤ8SKnZ3blxV]sx7+ b)+7j~_/ɫDeLSwrG`sVa_3WxCxpj©?<#nsS=H~}g4GC?s1~/ASk|Y/ové#?zZJ_V2_;Sч*^wMu{6\Tۦ[kdZ^]A=ۇ̀g5c^?>1 9_&%"<Ė5iS{e! kȉ%r/@A~7t+[Yc J8[v{T UdMO}U jE[f<6iu]wi =oqjHϮ5# Ohjjifs,ĴPW{KXzҚvaiFߪV;:ީ'.}GxrsNfsx/{{a#ʚW@O\ \J_ W;4cV}xqC}; ==gי\{g A#j>07|16rs Oޛ-'-FQOp7?:2o]#_"<'KEAp:/Q"|PIW*<+JGg+΁r zKZVmnyvK/3BYnw|B(Uxuð;< K9;f.}LoG3!>F=,1NL0_"3qxٜ땦x2+}p5yÇzmVl[7o}S:@GϷq34cg/hҹRLU+RX {&%ivI\8+EGh1w IZO+%ߴ3jQr퓷^ou[*S2־3݇+6*U5Vբ=AMC4tk;|#mWZ]|gOo>2P!>gYg 9Suu& nニ< m+vD;=Z~G5;}7]³cN1?5W/ K.xDq&ᾤZ%G*Wig웥,csjwO_ <0|r/»Ժ>/`zoNb*Թx>e]mxs˹Eomw'}垚>@_3]<ތtlN hl9nxBxio|aߖ +֚~YQuوev;\[?yQ;ȗ|i?xIY޺1WxN5<+*ǚ]ẘzNZkY>mVG^]' gBx@+!~ƭg^8‡p6N3<[oC~Kof7\}i+{mW\Iw`/O.wa-iG?x?^Q>w/C-"85]Qf8/K-ڤ7iZM>ř>q쑧|܌w-կ(Wߥ㌹&Zdq$4W*8ݚ=(V9<3wΏR]Ta^կjj7zQ4xFEKn'm}nu G3ف: Y9?=_'j5 -8+̬1 pkx+|f9m->Ç|6-lwỵW0S|݁8%/3ⷜN|2yϏׅ}.K7BQ]9Sw:I&q1,Q1{phޚ:/ۍ[t*â;=?ȳ΄x䃟8݈yQVG{5't'zw=y 3~ͣ&0wOq/}^qU|å{VzZ\w/^K,ɒl]e[%ْmɖd[%K$@v ;d˲$^ҥI2$!!BKh0-R0L)C;@@ KZ(m4ts.x^ۏ`V5qi;O/+s,` @K|]怵>Eř&=ki3\t٧uװy30{Ȍv+[<# 3QGߣylJg8=}Os&s\` IJ䁫v=yӳ^1#6z3b8%8 Jc׶/R8gF ݅]碬shN}r8u jg"_)Z2V`j٣>.}~~HÏv~NնW[E[ަg~.Ǝ\:م_ʥ&\lO_iM(1 mC3[qg=liɘ?ӄV<#MC  u_TΣ+pNuBT7Ľ|+fR۸"ߒjmÔӴ7wvv: 9T fy9{KZ_+3<#4\3anƬ[6q0&alVlGui1wľk,dݛzZvAoJR2\WSoU=kYS}g9HGcx;6g2O-zԒ_Ohؙ;[w]tt䒎\ɯ=\=̓sa==[ <|kc#,J36hFx&t&8[%qsGBJҌmIHΌdv;|`e(+97<(o`6%-rYYƪ\־qo½I1moH;2;pC/wYsOܓya =ZNEZV?%+HE?ޫ]͙}gϣyGC I)mit-j.|9ѓ:xе\Kk]^=kvCnr@H o{xĽ9nLy(Gs.g7'؟9]X/@nK^\gWQڠeSc-}݂8$uBMa>ESξi3XlWv}uY<>W-(ڿhJ|6Vi}&ž>nM0}C8iнcvb;eԯZm38ǻ<:Z]RW==z}cZs>EFWwtg,10; iF~kֿKǫ1`͡Sf\Opi3R=04e+ڴv]ߞQ/1'D% SgLog` fmm94iˎv`|WYռ~OfprEqeZ=U ge?p&:!Y|РCr<'83 6i<ٹzug]~v!K_WS~ ƣyzC~5^ng}Hѵ1a'X瑏Oif6 = ļԳ%OxuE"|'+QZaM1r,a+$IǶ6)5K#/2uGwmW0~^y8+chҞ_5eE:싵N?wC>27x{XN8ׄiEn\O;ށ.>uyׅ.C0;]ݞ:@OpZ_oQېN G g+Õ{F>и #3ړq` p ҹsk9q?bҹ &oڢ)[m 1$\RmOKV3j.dq0_悂٬{/MJzWeخطUx߾^R@f8,<&mg6|X+?x g+hJ>Z~ f{CV`N]3c>ޓD OT OSқ.֫3_GL~5/w.}pG}\k9܈g`L a~n^^=X指]uz43={̺O᳻ά ^i@;C_b^g)O3 <{4jF[ ?nN~h>nC/'uGiȷνǴDf؛fXoeǵbW.jyE;37Og:ϑa7y= c5nÑuS3L>Ox6J'tji%|h:|NT"f(Dnmۦb4jK=oB͒MӶSA/'2RзS֙#g,[P=9)DTQ*T[s]Džef^]u(CZp sL3 ) j[KfԶZݹ\;.^ІK]ѧ+Y8֋5Qρ|#xny'{X昖#xt43pfNq*mϥV[^X^`*JD5o6-1s'$6嗦k:~FJꔥٯ l a//lɺ%WW\5™G2gН8 |)9Zgh =Ås9u#p7~)+COouCso`|HgFj{Wwf;9 6z4C<0Sz1'zҚKYsck{ƭgQè7xɆ7y榙:Chj]IuOaS'&ig cb:/eN9ͫm!*g=|.ʥtE8VűZ;[{> f#y5ODNt7q#>gs.ywvz=r \7Ɨ 9{11mS2?\s_X70xT}|egL̲8qG gMG^q3Nœp_'enIBZ5c6ۡ8ū,p$OjQ=5(ʡc%P2]S}}ܗ[m8xS4SiZ -Xi9M#_.]ya}3yVx<ϡ#{.LW#x0CLp1m*)aNw4'z)菱WbX;aY^` [F~#66v[|zq3mbMms̶uJ=.Ѕ\?xc+}u{7!F4o6}7c>TnS5/~,8fޯkyg{'FCOo&x 'NfmI6 )J2NAgś_рQ=Eg̒RZ 'EPS5{Oi}9­FY30qx}OMԾmi3:ǥs}I_µyî/=]w zv#A z#-l߆?K=kJGfcSO4~.e +Z8]{C6i~p̌%~'hT~m>=L[l1.MY8?ovӾBx.A{zS 4~Ǻ3w?⭉LouUC=24pq8ĹTNgS-k Gg;s{upo]K]ɽ}7QӁ߇fϑnsO9+jr3Orn֙Յr `oi]ѣ5{=FD8pI/cp 9[# :I{lmצp1 ۙgXf] YŸ]iU8X.YwU{VS×~̺!>QYgXC/^%r~FJlM5oA N۸xթV\ʺ=i?y G70vP}Fr.ޛIt`vᙐOM^3}sҜ/u 咗p>i mVo&Dl3[?jۤ&fgoW Ӽ>SںÇva-YY+O+q/|&ΟE1`^eg8rG Nj:8!^͑cyN'?&L7ҫ/\ށw{a˰'y?=gٯ+F7O} u^w^]0Ɓ1MydlЮx4" 9{哗[A{[ı=K+s\X*}L@^;T#nЌI\NyHSx߂9{7]\=+qV}cn+#ڈZrO]7\;,T3= bsZܥ`p]{\F ̱Mz+1klx;[E"%%r,2ӦVF2uٕ.mr4,\yj,UD#n0Zod͛G4 xLgO4"5ْ_ˌעg<瞇zvU عX57рn i/#vK&kp'#; ?_ \ |K9gz /r]3&!M>ba?[qڜ0%m盔$eKs3X;px{5y,ϞO%=(^*jVqMUk_ӧ}!}9#~ˉ5Nbk}K.m=P׎8:uO׼}t~=si5Lu`Gfߑ=o_{Hc]c̏|kg}M,R/uh+,g~1EQ۰f\ ,zK} XJ#iڶoy!EOuF-vgwgss ǫ򼪠{pkf8J8^ o* pf>ݧu]`8T#<_C-i ?8r8CZ٦m5= aCߺ z7uuWk|1o8# P#o-.݉ɗ=}sa/7-ԂW,4@ iP5L=R! TܻE<+.XbHҍmxHyt dܷoY}Ϻ?GsϛU ܳ^_3%\)^gqzx瑼3 NhשZ7ս#-uhB[oyOvg`N/+W.D.5j6zDCFr[w7tm7tN[3=¾ | WK^5LqЃ(Ln+f3!$%ab[)y {{el yǵ<_.=-n%-bٙUlĵY}@x󡽎-h1Ogge-m{[-;_手pƢx|'z̋+}t͛F~x=ĿV/oiZ{y 8 5S1̌?YcPW|g'k׭ּw"ֈ ~MuVZBꗄmZ2קk&y{G:dŔ߼u4o{+aQJ|,2LVP5TճW3 xW7;g3G >6iy庶^5qt|uB⾤1W{=:Ñ}aZ oxN ]7nq;kߛMǴ?Dlx9uv{O7"|8_J_Wpu!ㅶDp+ʧ|71m}/|9?<;%4l1 fiOV91;B,є"-mIe>V W jjWuQ { >p匲Vg˟#k66q9Fıμg8ĕm5K4a+;|u@.Yhp_inwJ8T2gἢ!Rg jVuzT5̴jw qBKO]\³SV]U u_W{嚞{|Oװu7z?03 G46,' 懱^ ?YfGOns峀  [q匹Iky@^ЛM n lB|"fJZiek'<]߅y$Gsx?n_[D/J,<+*Xt<=t:ޑ79Opg|-~K[#Y"?~G]qvyκW<=ڧ{7ֺ͔C- ߅_8xo߱wĹ~f8gO8*0,幢ksVi݋"t'_Q~ۛMZ1߂y&a>Oҟ$6` i=ŎzǺš|r缼b.Ԟ9")}YʸR͕wޫ~ k#k4٠z{L?NT^MkYE'WmscYgK}.>_2no=y=H\#Hg^mϰ~3q%}ʯ~nt ifp6 H:/%釹,4g rFeu}zoy`a%_wY+ZQ*NgϽϞFb=Ӂ~9!؟'zjhMZ27qM+xӹt_W^qϗֽ2{hrOO7\[50 ?҃;5ry׃&;53~='uzrvt_ӵ]ӀAs]q ;z;Ri=n\#yS|Ҫ?~͝=x=K*<{wmgHou?mn+<1}k&=A_fmKPi?"|We垃p oERҳeحSoԩfW:>#w ==Vc14w-k6џs^GOz.|pc=eO}qCj?C=ߚqsOg];ރ<Nqn*f=< hܳ]ky mkEA7i&nŸq}qsgBbJg[m(isl̗;xk Kosf-{]}3a]"%)aE+V5nf39fC;#-iѾ6=sϹX?̀]uP ^\F=q} 3PF[s<߉^?<&x2^P_~r\Ls,`*г,l++X^γZGz! }ċM\ў󩸺%p+aN? )Oӊ yzf>kƜ=`ݣ{("]֛ /Qr}8|:佇 | :q{'4DN)<52 &3u?ǹ:tK+.B/o]ёHiӍ{n1C ́#g[ޅMMz +z=1>l6S"O{!@sV]ϰO" Ϩ7eb-sd\?M.i$lxFxY347kvxPVYXu{s]QKխ}`8CX8g#-.aE0k0"0կ {lgsa 4# P}-O] Gv8 yEzXW W4U3P9#ޚpNaf䁖Mɓ\L f~amfK:ԿWpM'^ioބb2/Nx٤iOxz:gLSβꙃn]W=߃"ޗeE]*Ѿط^&P }d8ҋ)5iy-ߖK9?=G]޵ޅϥyʾWGf>\ @Ck3!<ҕ;xGß]_&fGu{g0 =. 3B}-iRV}b})/z߈7* sР.l_z_vZ=3U_V@V8vXg5}3\F`갩Ǜ48[1~@-3I|c|M+2]ݥeٰ'zs̛w+ݞ>i[ѹe*[uEUf /l_<7Զo qDާg&h{w 3tk{igOMzj7Zoe`fP#<Y`FhlF}4b g)-?{{s5Xaׁ3ޒ,V"8(M{'zӖu= mӻT8U3!w./u&?gNΫmf 9̉;?Ǣh*YDʡV*,TFoi> jco8R׆1>_-{veuw᳢cz8ǯ+j=ɽ%/Ȳ\+0S#Uk>7@GDmODzT޷g @PupkF ]K9_YG}ܨ /csG5=ֻzyScyzsz3R4~FӞxl:_~ڥ>j.Ќm`~ܫAͼ/}`:qGxu|pF;Vc)n@Zrlz3E ͸pԃK^|x5ϼγ#u=ӽv Kc?'#]ɩ\fzWE xUC_o-g>["3Qn=ބۢq׃&=3iuLӽ ہZ>#,>o>̛Y `pk ʮ+Y%|Vu9ug7pX񄆝&mVL5\,<{X&Zх.K^:]'>듼0VuZU/+\XgD(?f٤[1ڶqiTBmΜIm+œt*s귃op YZ8^BQ"-{YMpXiUR5u<ˡ}?cz4儎I,iwmX:x1tBt& r>]Ӕk`d?bN#q'tc<{0=urf|k'O1lj9/;gaeeZeg拚G% Qa ބocq9'+ lV\gpfGOwźK)}+8_sgJ\R:WETVÅ@gM_>#y5pFsNujNoZW[-6/:s>/^Ҁ+s蹯|5x}·>#Ջ;h=<Ę=Qo֛>ѕ9̝b]^@[Yo-Yn/k?`Vly|`>[Ok[4'ŻΓuF;SlAJxSv{PwQ9 }o-ا֫},uCsőlZÉ5SӾ-|h˫m=í3{.N:uyl_hZs>R/rʀ7RQ( ϸ{f~6GS؛<9[ad @n/Ͱ#_[Q 5ĩ-:mv~$?)$nӭmzZ^1]kusfzZpMAԬPuҜ<Z]uCX: gaD&nѦj:uWWps)K^յ_װwC;o3GC1 Hni-/}p7QGSؚ`O ,`+pN}sVj5o{Ʒ5 O07Ñ{m۸&?wIn6=N`92[;0C#vZ7'<Ի`٢;%ZRƑTԿ&U}e_pu>KKzw'p{J[oqK^-~զgb>累cnL5}K}W4s}<5QC H,;z~ϋfԱ:=Bw&fGNiȌO ^7w¾ +[gM٬(DMk'FϷp$qXKg27$fmsdʚi=ڑ.]U,Y3/^x^*?KTn%nV߬ny`F@,j~3t'9 0~ GZbmϸLέwnFn;)ÅY2Syw}^ؾFޭ-f֛sV38 >VR5=Ӊo?g1 ƫqJ$]H\R4?Cw.d>W93X ν34h*ѺʰW?~թ.|5N >t'uBKNiyS-Ͷi5μ0҅ {+r}g7{du,Ҙf=Z>3QG}zs3 X쳤K|[ym>XӴgzB#(MbxCqg%EI6op$^ig N7+Þ){ 6eU*-}ɾson理#[4X|'x)j҄ZzߖL9ޜQti/y~^zf\5p{f9vd5ީN1.agb&GLxsgZSpqnM/q=ŕCf/FoIuqXKMbL3E)ȨN]]ǽ}^𰢺`?e^VotS53>i߁y 0k3S}[8Іzy8SG煳^}Oz0^]ѐw#u]9:yo|z oxTG + р.hW8zu݆yam/ƫ`jK]OЖ\&Mpfq&- }vŞ~ F_=ݣEzPe(IE*GMß%kX0X`=;šSܦ>ц\Ncʹ>5vMW{'=؇>l]ZEo`cCsn^x{g{>0gc={P&y]S{nO[{N᳻KZίg={o$7p6z^1lM6OvJq}v`uڻ5'Hw,1]+ңlaخcUnYׇ:PGjސqL5?>SgS݄j˻Mv/1w3!n].iӕw}\Vwb{z';߻3}Lv"G)?F_hyok `gI'd> GӞtKuҁo6C/Ln⮍iB_rNɶ;|L KviP69]ף݃=(Z$oŬWqM>L >}/7ս&m{ٙÙLۡiwK]LO3G777{l|ڟ=}g- "Ay`}?E_xm|WW}S5}rpKۯN~Ӄ~׾)=}ۃg?+}a0z/0Ƚ? r3AW? Oo Yҏ}{3g~{7ۧAg ;yuA·EP /?_xW`o~c-{՟t^}NP JO߼%(}&EPЇ!(}|W_K2 ʙx/~EPnd?A{cӿWT^ķ_ *kG7(|w~;/ *?_)?A5ǟW~2~Ƈ~~>|ߍ-}4=%A;~O~`"ߵ}s~ڏ|coGA__y_ [WП0߯tPhCA_w~!|7C48x/3UojAp5o_~1wm'Aڛ~eM`9ΟW9?`[opyMc~7p[ o_Oo}w~o}:_%:>({f]o}'3s_򞷿ݯ{#;4|o7 E&]L&m)gǯ%wͷ>5vWm)ߜiw#70?l*䵑ݫ3surveillance/data/hagelloch.RData0000644000176000001440000022524412061371536016567 0ustar ripleyusers7zXZi"6!X!])TW"nRʟXa%>"UjkTSiK'F =!myndV,LJd&>VyfY \ yMpLȑS[LͪJ9}6ppk̄)ڐ !>C4c^0<-rA!(Y\̓ '`?RnZÿ'9ycA ʤ0W:ۖ6|F1Y8iŕ_9<>xƏh-g(teƔ?MP"yZ[~K6ai7.I$Մ}KAk%"jzLQY"X*xj;L( ܲ݌R=% U] Idm*FgeC77&bVR3_5 RMJj0]oXulb;WE^XOp4|{GYф8 0]a. Ǻ8N3!CZ׋Hʬ~Vr ̵֟@{ۺ'~g^eCeJp'+9N,X"W'L22瞈.B+92<=M _" X’.֗ 3SmA^0]D5Op0 @[ 'ۼDoW#q0cM , ',]vf'itT՛ؚHH &א~;mHk僩D%P宫{IGynxSJkI\ϙf@A5m|.U;;PD +_vP ']LKx0GN[ޙ$8ͻrWFFC)‚kdRG14i@){$3lo V{%Sʲ ]BSZ|$GÄEanʴS`` 3V0=1[0)Kgf#q<fU;r;=gmh=U)yMo  ]X 0u9rQ1!CS*Z" ˞޲1jм i”*\Ւ+2cɊwX{|ui;u%O@܋](n^,?si a=<8 |C{q6|)j驿^zΰqS$ĠC]uֽx J[6qYn,z¬fqxP[u{=lGZ41#gpVeB8<`oS=ۿ{?F ^uJXyWE(3wo{8.' iV?9N}rGt:hvDmB~ҹ' NB1TqZ\\$Wi"lrмFиƗ$ cX b< ,+=pP!XIL mNU㐸lq%q%8{>pbDlA- FNq:lM~̖%LWWZk"/dp٥ 6$@ĝq]^eB GaM0L gaadaoic"bƕ]q| B^CĨ7 vLLp/7-9űĮ[m4aq`([ωE5kZh{_l!h$&GqmkFtOvto8Xί€lLvZ˞ `@Zl'*9hf攳.1 (-lMZ6(Rŋ!wV+vHfDM.Z$Aw܌eZV5k +HzL3 so 0 Zc)x!MSѡAP9AXv5 ؞׆ͧ2 iCeT>]I?<"nlnrt5k)Z`db朹9H&is@}K 2~N[BxޘxbSj*pZP $~ yU'(4%WN3"۵P؆; ;C x_$>`ݡH''P}m[<Y)kEj Ez-eQZ EnSۍ 뎔 ;;YI80+!fV(ލS _qRg4\8 LI#KG8;C8y4Tv+$ڇhzQ]Zh37S4΢r(MF$ YLDvW:'lXg4T}vd OnxEMp XR7k0=;)Qq9OB?o^:sn!Z {__ԌiIwƄ9"zPS4t#1_0ޥp˰y,Om T'rTUb͈9/C&;.!Ԯ|OaɎkd]dBv\@Z /gn@|%er'9d&x[pۂ$-N^+5J,]$R'Z?v3lTu #;bY<4Ajϫ~LUZ#?E'z%94qۘO򩸭|%-kTvWtU"s3Ѻ?fW9"J|r0)hlLu(Pl fh/E/X 15_Ҕ%dg`Pϰ Arcq>A7!bAt=/BӶIԙ12`y;;aX-NJyc̩JBY)s@@+s+ުF@~Tp+?'P"m6vY٫R*Y Duz pc×4uji6 iAV0,cVdjpi 7gf$$0S0y#^;xH^l w+(z@s;"/\ >ݪe O;ZOIl 2jBXkw24 vLh%XxeQruv!U}Ƃ>&9(V|}8krul߮0"dĒYO7v5MlRJU7ӏA dL/a t(f5~]tM0`C 0E_|"_|EJr"UOX^pVT%AxiќSpp>4bq!ʃ!)^Z&< 2^BGeJ]t9fZ}|d0Hаz1uK0فt2g_έq=mAz>:|O!MrV/Laׇ? Jȃ`B1W vBٶضIOfCHo׸+o#F8ѫ֋˥9gQ:0[MѴy3DogP@(+KV|"GZa+8nIuf!"! nO@xk5/tXB*m;Q3 @~ᄃv<ƨ8Peywe7u#:LLƪ9cU^Q5zJ+}XX$.tT}(2,+;F65UEL r,soe< Gk2?_(=)ָy[޵.y@20{}p<ְ,V=:g/XhJmk ": ~joU-*}M%U:#g;i~/V"Pa7_W;J/[8-`/n:`M( 4F0b7U87V  FvΔG̴"OA!kIm`r Sx3 5bv& &, Kwng;yä&͘Qjȳth\@%O3Mt'1]1vB "l hF?j?SE Ygl`(Uo%A- ॴ `8\#_U,礠[bwXQ%ttO}K3uJqD%Ⱥ/ǢՇ5d cH> ,e:P5 IŦi{R6O^21cy}qXw墤v9d^UI_eMx?HWTuw7˂;rB*:;/`5U+3Ejذ?c  Mn*>9-BmR8*e#Slt'x@.T}mvAkDroKs˒hjx5XQd φяA83n፪}僻 k$1SuD㝚k/n`,XP{bfĖ[c=uYT8$;-cY |K.:7):Fu0O{s-f7lFVܩ$9f76%A7cb0P/xV_N*B;TTA;Eθ*E@NqWa[_rQ`p5\)Gф=^KoN y4S8qy9;j@^jEh1[&up%f7G\S'57)зƬi6Ѳ2eV1Ԩ;M?[^-"?$Q,+a Z@Dg<%r@H+%eí\gWO^=3w'ert>DL]B**Ӟ(ܜ6-ix㽄xصe\o\SG^tQUhӼf"!s-a Iux,rgЫA1ݺӺKlyA@㞣x-n @pd$L"`tkXZrLWu%e͡ױX%:2KAb@2_J*G~X/+Iͤ` V>J"*?)yt'K7!!*;[ ^;Inr s2-)P5)za#jLkU!Yaz)Ya']`p9=kOyF#7v?ll1"yFBN%}0xjPbH8vU]'˽'CE7\`kw̜ LkwgvwPrPja.֗52ʌ5^rXr0bCu/\ndEU%> .`JI6B o& 2;ѫܝkf-&Do-CQHdg} *4L#}Gjq[)Z7ڴw0 G޿c(G<>v^{-A˜8;cf-{ug`V=jW#;j#o#FIdiJ 12SI4VnPj1;~4'Q_|n$<Ԙ#*}$%kf{dz: vjfqqU*|e/hM!z}j| %z|:9%.Jb:.blDF<w7OM'fnd9]9z!්2mul#ݗt#\?N;<8F(UOÄX]6Tϟ&٨"-V=% Kxbüq6in^! gue7 k$uۚy\rO)/g3C:Sp]R`@{u*F7Pm=GϭÄdp>?![`&°:Yz3̝U?HfC>B+aƘ3Tz.Z%J [5X7|6+7x27}p7> fM DYeK &P%o" %#ᣆI))XQ%OiƾyQ ^NIͫ;_@8}zm7d9l2!0A]Fb'gs@do>=V?#lbyqW$XzJtT\ݙ|٧<7Z2Mt{v"Ki4U?B7m+$H@1̛ \=9_Cuhb ^dJ/=@MR=-a_o]Pߚ)HOl5hk5*\Ve2QQ`K3[S\%9F7ujHnW7ocVtT\|O 64S.1 A&Ϯ{ Xyn{N[K Rpm#uaL1 V`'wP·\)TV\]5yW % N}CfS#qn;ژ>/f̪G-S̭M|Dy@k!ޒB{;/U@aRŻC+7M@eiDH{^hK1~gO4ѡ \34|tl/Ů.}0.kq:%(}O;p4i[:$q9PB~WhjdYX/dgZM$~]WFÏy tvdnifo0 B9 [9Đcg}ΐĻw#{+4rk2:$E A*JBB*s_K6̈́)ibg0VE3a2nXIKњ@+aGolR9Iyyl)OR'lA`+̏u~'nG 52p#75_È&vfFCo)ε\+BuuJ%ځɫ|^M -cJ+ }pڟ7ର)Js 1O5:#P}Q{'3DnukUmjŌ%AneLNJf>$̾xD:wkgG\$ bM6g9"ckC'fN=I+GNRVDFTu,0PT"_p;27 *Z&r 9$p#_(˅ѕ~*5w"w 2Auu˶n]40J<5X "B6U+$* ~Y+xorc3nZ~\DX-t[퀒$#kslvlˉڸF!H٩!jBZm5b|>q%I=)Ɇ1I?FEmhG4RWtxkW{!6r2\brw$ơ@дKXuV¢lBˈ?\N&(q=$p#_(˅ѕ+G:sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ь @E[i"5Ǥ0KlBˈ?\N&(q=$p#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭ2l)/ft>&@ZU9ὢ>Ve~HtVn̽芭-.α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._<{ssS|1du;f8d ?΄T{-|+9Dݨ= 4 (wCL Oc@ݳЂC$릟: 0zyZ TP8Cռq5OoC(Ԏ>sq%u2ZrI_W6lDG-%xY (F|0.Ve%S61opMG ё=v+zlbM +,:d 28*.]fs Z)\{n4>LŲ^,4yyO\: 8J?%m~?Xgx/X\)`iGT%eP úY+0PkQMHQ«W4s.[{3s^|Cvv Y%yÇϞROfG`H / Ҿ|h_zÂGLK:%<".x@hVEec4_g}m]m#j9͂%7\ggI)@Y>¤SFW+1ˆBEBP Dr  rtAJ4{I?yrը ݒ^W+25zzzF T(>csA^:goG) le3zGk& ,M)ҬO՚쬖eys@r$L31 yx"I]w+ 4h?n̶wғANcn*G A[j%%iﴌoe#"74a07br!~_ YΡv4nͧ.`Ks]Љ v@C[ br+,z.E>[bbzIAeQi , dɖQg1 .D@`#z̉y$"evO4)3.#?'IzYw~K6MiIk ٱA$:Wid;+ cfEpc[zY嚞,ѿ„R)"p'%@wpml3ߗ!pč˞5LA5XDX'p7vf'|m"ZLls X@XgKY KLmfDjR:LĜ3t#jY N7:f"d}}N֧hmP=eWTHrNd)n~3գ+JxmJd)m<ƽ~׬&2 LBfͱ:& 4q9jGpF':-5!;4ڤ?ʪk("QI@+{ Ulx4]}t5˗ϒɜʹCȯY uD?4}M/< Ct]S=kEF*OÕp 4bwy^LeI(: xչ9OLf_޸n}.\}owpmԥh w~Àm: 0D,'*L2uwPln]wzlԆƺi5u[7[YO^PyTHVܡI7 -4 >ZC'ZP "}fyE!(iA,DY=ƿ) ^0P6QN)،@>|vtϤFiD:;(y;{x+F#=wPzS_ݳ*Vhw~ǘWS{H n=GBa€1AV{c'e@6Lsp^}~]?ʽ໦4gaO$B(E/LlVIHkc\=W1u6ۀy4QRR(bC?TBj@}g#O'"h^pY:r3S|nxbf3Xć\Θ,-OfAlU쪃z]5Vu g3ؕ84՚EukhhO(Zw7 E ZV!ceT+d ?51-Z5KwszTtrD怼+ݏ]_y9O3BO0dF jRH nN׉1sdSGSTkT f!:/UQ2_H 0w*Zj0obqd/Q)$g+*YU3ٓrSbvY[ڭR+t[ BS=)d ;ɂMYŵJ`!)(oie6,UMM aA7XUlTԅ@Joz$R; h7P#ƑZ>r$r (xcfFe2qij'{>c]Kg|O"oAvWbjH 1BD!s(,.]/Z5 j/\\Cչda厧{Dtt7lB훇U( C -0xb$l_XLW2ٝ8Y)13T)2ᬽz7\J) vuoᘐf%w@hadP=)Z_WʍA4:N1cN"e{JIP+g$쳏&D) tW^q6c \MWsmy!3b}ZQbtI\mޥBˈ?GJ{J*"zNt>Ire w`r&,%1?n 4rOpʳu7tcu+O9T?{QI]ڂ"WhAo|rPy1N- ä`4hQ`U!gtVn̽芭-.α'\YfRXvY[ڭR+tɢ2ȴ™0X"zظܲ-$_u7Nuv7ZU\Ԑ#TYv+"Vi]`_,WZBRrfBP<:[dW\ &88h|MIP~-:!N6wC ڟ5|U{IFo%HY]:DҎd7 .T<,+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG qbqsS|10H sWdZfh24"Wp 1[:$}ƓS;ƀ[W4O|11np#_(˅ѕ~*'uMدՐ%SF0iau/r~@Bo>|HBL܇|q%Ϧvz+pkQ+dޏӘT8 |$4#!lM{:I!J9.t霤zaGAD#7\P:fZ 7 宔tZ Xjo^17Jb_(%=(/[ƀGo?mKfY:AgbM?28eutoJPРY6nkۈݓK=j 0mOMoجQiSI8heCY; L %{W-O-p]rK`"كR ^GM@h7!BmHU#~LrEKYkoxw @,7аV %pWf}U!t~qFq#mW4O|11np#_(˅ѕ|Ə|AEQOgHX>MP g?H.`9.>=QV9:Y]hW\7MCү LҤ19 n=|"%w|r$0>Ve~HtVn̽芭-.α'\XlƟEsS|11npLXF(bU/&P.t?A/ M}6;Ѯ7jüǜ)( {3Zk"8:vs?α'\YfRXvY[ڭR+t[ BS=)d 6}H >;ӷleQ@ȴ0*Pڙb=BO`x-7Ϥɾ裷0qGv B &WPzG"obDP^CŎ3?BғWHR Bnw?3tOV_ 1h=م&ηɒIm1k|MioKlBˈ?\N&(q=$p#_(˅ѕ~*'un.Bw[Q,zzW(b?{NcB[!FgGtu[V +weVWjJtI\mޥBˈ?\N&(q=$p#_(˅ѕ~*",XVIU -oB ߄ikRzSbvY[ڭR+t[ BQ>8CsS|11np#_('QNk܅uh+^rK&i=>1wi,Ӌ%!8(SbyL2]\VKgME S xɛ ׈h߼a9Fk3d d`XTNsMMGE] )trk]d<|!& 5BmWFk3`:N]Ix5ӄC[и`L8"DQF\GS MǜP2@YB=m_ЪYg݈zzb%%59&\̨rOܗ7B {u˭G1|c>NW8 F4y΄)KgL`W0c%`b3a<Y743;UzTo`(|' `d %6n ,5Jç$Y;mJ5Ԛ4 U8-rm{ʧʻ' N0ڑpĢfȞiz5ldSg|\·5OeaγӀH$De 6>ԙX(e:5/HVF /^Ek n[ʄ#\{=lǵRg&y]!Fi 1G`:z*y&SQ[~I{—ۢ d&jۘ=bLwM$ AU|~ dU;j:㍝X<*"09>N?X".;AsJy9A *w@t$nh14`(@aCtK&uH 乱Ce?.z0VAGbDش}Al 0[ȺA"sb3:+hmQH|Bl)ɲOgڷ5(K3|; gσ]] ܅];(̔6E͎_9Du2{!;oD{0AIi2X|7k9(A޹0$'ȇB~_"6`.D+BDȃgo}I)\?Yx@r&SlDiJ4˅WxS(v(_) m5NjrSh/G2 *2™V'%qo1]B'l'jn1{J @$NtҊk35ehf##N(3mq~Lu\6xK 017K\phF9n2$(;ݜT =BI#ȩU_W_%dm<Kəu6 osZX^980, IJD[1~N_7er-h*0+z}FRV.¥ث^ajn-YY@ ql$C༕6JJH:Jb/gbJKqi~. zພe4R*6= ۦӯґ't;B;Xf<?Evzpr`-]6PF~i4[kft; ^C7#*Rs`ĶdVWD@#yRf@ GlY^9|)ϹUŽGic3 KˌfZbƣH'd &Īd!T}]9QvCJiug hZ5! q$DN]xєgq_zy,b>%ځ~׭zH/ͰfPu >G0ԻaJ5^96ZBFɉ=4sJA vXћ@C6>ۃ慺ԋO6\a9.4"ҤۏB:KAAͬw&o2&|>=1|v][jtJPaf$2|I!(@?E$!E%BN<:}+q7`|i&KK&^z̮|)T)h/;:(jdGKs|eL)U CXr?]qf3Ozar` &,G2 ` $T"4/Y/Q+5=v"a[F EʻlIqDs RKH j {%xSdΕɒAMHSwŒB>k+P\SlkʌG<-1Y<s:EDEhV<|- Z`LWOF谎 J Rl /:&=Vk6q+zc}hUJzМxznQ4b(Mw_\T uV,T{*GDž!~7 g*$C/s3i{h阸hC]{q̻]MA\]-jޒԬYXՖNޘ t5&ݵh ͟[F_8`3e3 _= K\ʹw% 9"&yUK [pfAZWLcc+M}({о3Nw$Q&V! Z 4"L1׫b۵i|MY5 i un(Tܫ ӎ jʌg6!9W +L/6;]ħcí tclהjqJ;19~|b##t|]&AD1L#-0TI, 4ٳ@'#]k ФxIT' 7|d=kr, TI_cި8oP-9!K*~3>u?nԫ]]Qjq|V$ +h1e쮜U k={DudJ{MlmXw o }餚B.C2Q{&C`.:H0;uբxv? xfmA]0ﲧc6/ 8-=*ݏwzL(lj RY"`B8_F-ꆦzn^9u-4FJM^ؐK?],DZO8̈́7ѼFXb7VQHa2\pfJ鉰S0@;p^Y ]*ٍ:ʨsuYifj'&ƹ"}-ߚm7"ƌA8cnd|s059%]= 5=NJ^Kސ^{vQv3h;xK#é_(,l bP/$r|??n|x5Wٰsjgyސy/;z^Hjm?W <t RA%myݰD+]Tbǎ/'||^3SagS;U(tDž #ݝsj/n.'I!|9RbV3pa}SkKKUߐ15ޔAI tQ/',Њ'j1x뚶j2+8lS\rdRl" ,ˬ9;jݓ{-x@'4NI<|'ڗЕX"pYW)׾p xk\|bwOuB F1Nvt+p(oY7-3=aԆ0J k^Y͂(J zu긗Kهʓ҇ծwJlYzE('^tۄl"S2ЖAQ&n[\!?)B6gSn(k]?D?>BZט 9|kJaȴ>dFڊB?UPJ~0:9B㱃r hYdԞmM8 DOy[@j>Jaᴅ(q 5k!#cIK ƹ8 LHdTMPr=>>̰a2՚{ˤ;֒!XrG"kTzJ[x1CCLgb[:rĸhNkH>l=ǖ;,8ɘ@3ADfi:Ÿ/jm!D-/.xNEDrǔ^˭UgTb[4po |Wu=(S k?,GJT,_۹[,^c̸'lPVG)gj–G/\q䝜(hԅGtL)J,~',Iќl%P@u$ 7>]=aLʉC,4qN*ykLK^ft;ڧs}F`5q 4?s.:u#>/,@ln^Gs=6?>%//Q{z;c-=@6Ō{]M"͍f@{YIF5ZyrMHݸ.DfJ)w$!|5 0ٌdh<ɐ`"+,)3 V#L>ŒAMSfhd?`K4}am3b`!sN, HkOcP&;5q8Z'mwl?weī5azQXjN# CO+[N&>MU8 W`,7"@#l:ԫSVKOPgk%+zB8R-eY@~% x3@i^z=R6ǙW࿬`6P"'"*I^tmH`m 哺Z96a`bU6@;oyP8-%goRӚ#̴!T]3Y5¨TEFD'0b0g Ru26pkKx3DL0? Y8ɠ=C "R nZ[t/26$$f@].ayϏ#ڶE{Pn57ǪȌ4y;7nS=>d~i"rb*z՞}p81+%um S O<ږp(aw|z,®kwH:w8XQh_FgH5=ʓ')Yp#XB0&M{/[Ћ%Sa&MVGofNE5g\GPW/~{o-R.jCXMIC̶POhw7pc<^llo*Y XM>'=am&Tkd?wQƒQIi:nZҁ1:rr(d351Uu]v d?^Z=;TL[;X+S7:?b~xa>MY{)j7.[xnM -M~դ="aG,؂ 5@}mSg C.+inM氞 qo'H!Hs6v{JwL\8S::52匜촌M|Ž8[bigF D(7b3&{\[K6.91(' (T«ruƕ{ ~%ɮ֝:v]B8,И"Ё1F:SElC Y8UqʤO[?0^Nxӫa8}tVc^Nm>{N؜vwaG(ͫ p 8lNMLf+ҞV:fvrKհ~ |=E oo [۾ʰJQ:y23 z~2l݋/i^rz{)+DSXc=HRA*1}Zn;` 9v}G |ܙoAT' |wGi$üJwjg$w!m J#{e]¸^1H8FP+r|`H,(x[ܟP\jf܃*"ǡ ZvWge!Ç %tD=6#lyIl $EڢhŷvYִ5O8kiлyo]$i:S^HŢƘB ǁ}"cFoj ƥ f^i̧ymԌ[x7P\2fDml+l"f^A8%هčkfѹ#m]mR7RuT1f1ouR5S1sn{~'Ƈ\W+3ڏkنEP_'),{H6#VK~*FFOmY*]8;`wEi)jld@v6*}GyM-h~߮=bk-MsChi2]l܂%H۹4+*7?Mm̂2L 0O@fQS.^ܧNmZ_}w ^>/c#=!Y1Al!,.+.5DaE`+_A?IVX)Yh6aaoE )a$"TԤ+d9 NAs(zyW>ڋtmoU jU;ދ/qI ׊Š%*Hs- 2/ťd⋌ w"JiU[?о#E'C96ʥ5a$At1wHaeLUTؐ~^μ_۠H1Lb14{+<(o.`1zq[-w?؇ 8}rU(rb)P<j .)^veNaV@z|A'J1j –w&7Yl90:K0RFI5ˌwx%WJF*Flc.H_,J14m jQmy@C5"oUv3ھu7w&qjoaB ~Ihl67P c+R DF;2UR<FFNH^" 53:yq"&'pNa?.}sgˁ-^hޟ #S7p*&:3{Y$,L#~@RqyUzX`u7YZt:<=k1'8SWbt6"56.4g>Q+ G. e&K peeF7vLǗU}ohN}ZFu6*mQ"O ruķ̖SőYZ?>gs~a<.6M*lJSA Vae:a#W_*$O>O h'Ow%UA*Z[ph̥ⓚݠ*' !AƋ9d5>gn{4Ҳ]}R: \sj:bO p$>e#&YgAjʄaΏݟ&Ӳu$Ͽ^"*eQ~ökkxcXǕ!eq&2K7bi $\-N!M/O'23Ea{CwwbWd%h (kE@rbU$:2YW}7I]3KFxy 1+H _!lfI-0.:â1)9PS-Nq9y0/>}z"%0V87d´7|>V ?AݱEMjj.GyO Cv (fFQm) J9Tۦx8Q1sj)8փE1 =V4/e1'0~q2z&ۆZj`h_WYa7O:\+ cS}b,xZzɩmlxB|oiUTa at!޿7LgI䑩B u" <^MNVh m|՞9-tԦB8"tj;3O(=ޘBEfFKF) PǛ{%|:ewX Ψ0akFϛ:c> ǒg=ҭ"#5v <+nyF@ͥ8yA4q{>ih^`Gt7 ip[k+ S4{@ _{}&$EZTyȧ`#[yW er9t1˪.N[ ]x2R6ZXUR.5mewq w~쟭|&=IkPfa(6*X ɒ}G:wG t)~PkγFQ7 n 3L<$ eUj>1‘dw3*aZO=ȴ{&̀߷Cm |=QOG/i' p߀LίHl ~tꪯS Sr R dn'2⹳rՓ߆Q=8APyrcT3G N95MUc$.Yy48x7J߈#X^ޙ`'?c$|K/?#3'ӏt B#6n -a Yl 71a<gr^Ǫ!Yۍ7e;Yc{"5`,pnm=sux#:VA¦OX(P֦JN aúP)ͫc#j7M+y# fgQ)Ք|.#K:?%bW))xDD]ҲSsRXԜN1ܝd`5eaJ03nw;ɄJGѳU9a1w?16&Hq?< $RYZRf3܍&6N ѯʉZCrG dxx"\GZR);c"OJ݆D;nc)c`Sw$Ph9Ny&  T'[gF9& 숞/2uUx0`q#![YYVW<ܵ5LQYTZ:QhF#?hI?+DdYN). G8"#d{E"xf>fO*!Wp8%ő->#q2oyrp7=\+CO*̉=DhWF٢ ][WZÕ սKAZC" ?9O[3<*k [O '>OY~uݨa^\ܻNmj Gj?]+^)|+VSU[hp}V8׹N50(>+sZi+}9@?h;W6>)ܵVqG{h{cH Oi[, ,$8׹Da`?ʝ?*Tc-n_.ˠIq, oH]"R_9i~ڂb K[b:+$!֜E!ʽ*M6fMhX)`/1p 6}vt>lIӠn檐MT7a:,4Roś`EE"Xbx ߒ<ؕ^VOIl4!6rFAń LHֱ-j/}#C#k9*wg P pJ*5|/p'0 82@,@2f[7.XO5a~Q(Z2^ӑLTDpeUurHE抌 'FKr $]RCEASTk{[Twr 4qy*Do;6{LY&ސiW^xZ[7b^WIBTC7p˼0Hiyk@$V D٩ nBfyh9\YR * 4rKe.5|70s֪C$!%eqcO=f& O7+ :F+gx_hm9KW6o O|g' sRzuWx=ibPksDuHn2"K!p)iN3+ [yĄ6涤IYLlTT$sS]$"w.P~àrԧMU/L@i1;NS/p ݁&$TpK߬&R;! 4%C8]L0Pc|-K$MO^WFޙJàaŨv&5B50Ef e+Nhl3dq1ء| } O /S6M:L]mcµ$9"5QS_ƩWV,h9u -Yg" TL5#%,is*TMb k~qb$~q:<G2rK6W"_g` L6h E5E0f5[܌W_'U6p|^W'ŋ߲ޑ{t>i-NCAn9>ՏSt9qfIci>S(T/ͳyt o;n)ws^SDP0dcNa  +֜kɗ }&Ghʸ2ix]CHQԶ<4I4yP4mMUذ c )/fj`WSqS&zIl^e=C ˜)4ry3- Cf]u,'#~b%Wq;j]Kc@5/C e, ى%xr1cGbYxyVp*f^ngYDŽ!'c`TM(xt Jqޠ 9iܣ}zD*4?tCMuۨѝtaz%^w®9fu.Honh=WPМWjR~Pc˟a;#V&B}G ~#'/N Qj)|}XGdo*o߳WTE$G6VؽOcv+WoE)1gU!#*UUhlmb߉8^[|4LR.8c#veD(w-}=1 =N! C@zv\˰2C!Q5yV|TvQ]*WD!AI1xϜ )M`a|O?C3a7"`~o[ 7Cn@^:{GNB{Awk,`nF8FRa81H[yEQZ=ϴ4QgQbxqS4@Mvn WA|@G:k?SmydXJyE$@~N cpD)~80(IG}wHY*#LEI8^u/OpkhqE<}+Qn|ہ*CՇҮ ?t{-8IԼҭ#`o(,lL{.#n%n1VȜ8tQ8>qE eK W3Ȍ%BAA竝2S-*3פr`$AWb"zF'st~E!{k=޷1xaHAPޕ}'El%˩X2aΒ/p:%h*(^YA[Y뵼F:`ܲD%?t@ 魻k@fV(xZ -naO2 #b8guSh%1\XNE+h߆嶥Qs\ u0VHW ~_ ?Q39KTצ0Dy'F.#TXPLZQ2[$vC;nPe7&p1C`] &nd>k,pb~]ۂ>Kh}j@>k]?Y~K˨?fO0͕ުo1YoѼ}ݵzԋQ, 8x0$3Ȇߎs640MvLɒ#q|G!2T-SDev9rvȯ&K3Jzsb D D/ N$&]S,t Wbw<*$a? N1'}+m SXaUz瞲4+jPCMT`["ɎEK& rRS|x ׇk1e*epە| 3%_Ne6ro%Gs5a)L"StLP5T@2udo%OA9먏ϓ8G:a_K%%4LN SB(.4~qS/Xa-qBG&: s,RCbA虼SB~wPX@8vLE|S. c8D!i)aO؀tQ)fgv+DZiS$M^SmV&`j :}8D˩`bgƍV o[{(QiTۣ{aL|˦P-XFahDᰉ |ݠ))_v+=+yhjk}t8al`-DTe[I 产#PS3I*e|Eb=F>& WǂfFjc(Ӿٞ`Y6jx^wo櫸㐍‚[Zٽ CZ' nۺ%Ywjl4ChR noL0Z^T[vV#P:~ bNz 6,F /N ΢dV<7ޮYPQ$ɮ .aob#{晵7WG4y ЎY!G&X-$~@ڊZ+g9(@~џpL [(ԞYzA@}U񺖆dB4ks@$I==j&i<9''ЕkÕ EMM#{)pӇx=k5^H6W#qZ:XE2B),Z}|.V&__LH Nz4Fk&_gETk~WWB;BM.K !eOB|ˑ 5޺Wy>zaNY B;i9%#.03-q(XPQ\ ?m& _h4]JeZ V݁pg0c|;9rd%CW2@₨\"kͽcmB~.YEP#[mt6S#bֲm{ HF/^!p ~rKll$J9Yw|"!1>;s9{Y@\6Hf͎ r.O|Z% :!pec4c}9_ tU`H"Qgu)) ֥TEgmk%tΥs1^Dz5$I!2΋Y _߹|ky9kS9{Qfkd<?X^:`B F&,P(kxɕˀl#k qgXՁʖKXe?j9bFmӸλoHX==I`K4Mw HWTv7l)`v=βA&Sn wA" L&:ȼGH*+Tu?rVwckS )@v$BOW$&6*x"!R ěASx&KltZ>$U@IkR9M^2K\c**#NfGFW/2A?w䢙)Z*c1ɷO2"%67MJg" ݈W-IA_kFnsѿ9vѸәg 6D8ֳFP"q^ IQq4µH{J6y+[f;Q(:0*&6}:jRP+ rȦ z.&*&zG?{Z@=RY:d:,F.XU7brC WxPvb 7.q0BB&ij3T1to#s!fp1sXIÎ H{ȭY(ƿS]0/'w+b?k8̓4 GkI0#KESD(6R'] R9}CFVUFi<2IJ~|09G*FvW<ƓCieOǁծh_&tYR֓*yA!qivfqc9z1ƺ >I}Bgu 03)ؙzv|Kۼ'^oq=/&v#QȃuO.>NOw4Pp~ĸBZZg.GA+72tKAA:W2Uݟ~f R'QROp=oӡf$zn1ň)ס>` ]B]\iǾ+lRo@A~T I-şd^90y@;bD`΍zTx-v/aaxk#Yt>ZYBMf 3Ȕt44d~1|/hkko%xl,K ̇k G\=JTφtT}+{fmPB2fY[ģh_ܲ/ѦȒsiN"^gCzs; ժUӄO\=G' M9Hz{釉KaB68f9g&`eUWM,ڷ(8phs.Bi{ tlV{Ar)&P/J} o;k+>X-jH?SZa.)w_Bn%^p6Zm|_uS+N hŌ N=ؓMQsUװ-B}p, GŐ蘗7=; `rr},A}5L=UHmqTA< aY;T$>UB{ߤ{|z["ܝZeLf}=5aJLoQc~j&P,[ī@N@/G$'ya[Afj/u(*mNΝ+Atz*2MK /ZxBahGfzܽ靵XU*sUIԤXM.6ކ:q{vVInq,V#샦NbQ9 VC^-k=UD_}`jn4i n$&ANH|oJ t} 3ֹ GӓyK" 2cq؂a^F\FS+۶L]$`!L8&lq!dXL6BG-B\,,= z0rY^jK=vc;~~YݛV;Y:E 8=a7o ,tcɪq䳆t6f]'B0\OQ98 fY;/@:P@O ҩC; R ;]dJVm:Q{dr1w}MVH<5/P2(g{f=,tǻӒ lT6)``R5e&:,}.%κ NqLTeCcsd.SGC0BL*W&dH-i2^ݤMݤ)q1F$jXͶE d~tlQM8w k.]ť&\`_iwCSڃ'zQ?@ԙյAHRwn,?nzbPcqjD ܻJ+^d=lOT@AbɜZa!.U 9aA%B~B9+.yŲii1?ujL<>~܇úts|xKۅ@E5s^tXrsVMT%ye昪w0: `sv[A+sC&ݙ%J[bJ 4?>i $me JuAIhe\{=IZQ4o&ත^aw_lUZ.u=+e/a8&nnh%6s$Puhj\귘u )nv+Jak#%~yY$rIF=Ȧi:Dz@ꀩ͌?]1 S& #G ='(e -{]]6/ N[6IlUxL$ +ExCweHs D4ȽL$2.+|܊+JdH:ڟDN2ێr{cͩŵVAG`zڟ*+`v-]u;XZ?$Duc09g]{2I8GNDkÒ*m+bT30>ze"*ғN>^ d'ˬIQ(>tPLapsCq \ پ: P`ǔvWVD ]̻bgjJiyޮpB,\}WWE'x4{NVKp< )L ~o:anwŋG lj(kp&AQ)ȋ%uTz73%DuӔnXE0l̼YIڄ Rj.C?ԞV.ּvԳYM ڛIlJ5b.,". `0鉂`~u ԨZ}j>䷧[vItbP406A9! s\nՁ27!+||Vlʕ|rs{WgCo]7cc.]u$@89ջn,vB/(*3/|-@Z])D 9{Jc_x)HCzWqT7梠NNr/ 9ttꔇ}a',XiS<5_1得QN}҇"6X -p2~gIJJ&X-2R('ӑ|Oɕ80=5"[?jAbDqy 61|/J E_㙤Ly /?.'yaL!uҿmAQ,]8P̰&"nnBCQ.㢈_TNOFB ǩ,XGVYQq?b۶a!kqֶIO 0:(y @[+Iؤm;Ԇ"S):*<_`O/8KQ- kU)^$q˺kXũwÙ`CP)~/]Arp3!uw6;ԮrTV֟))UcY)l>0Qnb{yዷnߕU˥p*YޮxH"azf C6dJg7f^sEęի~,5[.rzN"jcC?[\$<5IePG]CK 2뮺2Ӯ4KlWVvߖFfz,;TeH(/H-̂wUt-. ԍfUI@< FbȘ'7!Y\@!S+%z_h 7yΠ/"E|?&OH`,Yߊ5{ßˢ, Zq ?^h`0N5/br; W~W8#`":t.Bp N|&$e ࣵ+Lk}B^[j1{LVWv&G,1lYxC쒡NmˑP,tr^$ou0Fj-ixG[LrI*S3mg^`C#`ςjc,crltpS{2h@_D $܃".LբLbըhɲ@z[5R?~t˨@M+Yŵ!Yw)D޶#H~Le j ;i13ll>WPZGbpaApa$.&"I^,7$ĶZte',t'ԯ!1ocBd:OQ%Q( %5'FtKtAcqjR$6I6c x3OڶهRWve]u̽İM$Т_nS1V}GS]Ĵ'\x(gMX q65m PIۦw1E R-ECWM txT0+^#䚴ޑ˕}^93$,XT<;K|ͿŠ !<նWb"}On)Tiߣ=S_9sH N wSl7LZ vX)SXpŶH/Rʣf`&^Ж9kxn!!RFrl'M1:xt>a5Pp/ fTPm՞xM-VA]m!q`>p%qPAOR@hdžKl]Z#IU=}1\R(`Vq AuQ(!xԟ7WbTSZ1z_0ƍ:˦E:Z8fδ\`%f'S**0nk \o~\Tբ,74t|vwzʿ5=s#t<[+!O 7&P)(cjkV,;mFB{!ʲQGǭ O{ȉ/_4&Z5WԕDĞ$BIvk(Au %©N{/w56gMtcѪ7\ ٟ,OT%d8iĠ~VqlY}B SxsY*okQ}Sx 3c Ы9D~Y7*w2ٺ/zajb1?v<6 Izrf_fȚ[[No7srmev;|O:FZB 2y O4 ԚYp=H2F29l̰fD!r:9n̦"4}M7Ycv6/^}vd('Lv(SCX 75VGYMbaZۆr,8LlY["/ݒߑz-w9&9%,-24wDKY+ D'fR&3a@SYG3@vCܵwkn9̟_VbVGi/fnY y9I" ܠ K&#HFYSD׹QsZkbQZ!iE-Z0=c>Xۈbu\cƖzIj5V0KήKbp؟x^~eQ3sa!.]B Ӻ?JpTK\7U\U DaOX<W5;WYֲGx 摃:EF($GL:3k8)sGܜZ[*wY*Z::\ wglzb-ܲ3JTnh[y3hU؟[%?Fwx,RMnWCUc}v-;aٲQ/1nRp}Y\[1ei=il_߹6$% #~נ iv9G΄ @K?"~vfsSO֏frIv&6.M MhE@Ψ`}k*O'Nlc_;#KȷnDŽnL'j[ԒC`CI(S"k 3LJh>UAZy-8:{۬x_F; x@owEHh<w-Ev$ԷBAh̉_>݊Q6WSqСjx v FA>Se0 3BkVH9`ZHR6I. ՊBګ/z*313 lK{[K咸=qΝAw>\O#nhQ(ֽjBst8鞿He&E_RPΒ>>p?QՙJc8fZ="gX T$1IWI^2rHɈB_씊fr\ Ɂ1g@ >JS6Mo`T<̈ 7xk!ː4 *~ɭ®hsQ845Y @eOI.!/ Io5[mj 2f:dmZ4bb%HSJ;uG8J .1 aCo;BLE+XC}(siT{KFW1Խ,Qxug)Pd&a .:xXcP>H$UVΜ9p T(TZ,zlUo[.& pT,d Ie&{ k03j CҬS|nF#m_k  |{>PVMJhnTދ]* [g22B' \Uɚb!D:ʐɧyV_QA_[qIRF`E",xM jvwǏVI;5G ޵OZ40}l9EnH[$!xO?pB |osqfoN|w$ugjX$:ac]#.}9tS R|+7B ]+'`$,7uc_Si `#9e̩0 /Bv – d5<{tY"5 qOE6]n/*x5 #Y^n#tV q{NZTQYJG\-T6}@M%]TH av&EQg _ CA֒JC6|fZJPO9||xf%1 !8Zhd{YQ@1>m^:X B^M< %4'EDc@i o֎.L6,LѝL, E؆ mXLe8N΍7 tWxJoN횫}]M{(mϺԟZLq3DtqҺF F]&N71( $ڿW&ߌFuk:UX@gCsvc:Z'a Puj1!vYri,_x⎊]h=j+WiNn1We[aؔu _ABr?8 ݢsb&2)O6MZD:#!~C.ì~f"8RY )|CmæEpJ=J F;PRW5tnH<4!_NP6PCvFJXhl*!j}`If@{ M&*Bjxu=CE ŠpjSRBFHDbX{yk!ԗ]Qn?GvRI(5xz"ԩ}4O;q+a׷ ¼~щPy?k]9Bs!߿Q|K@I[NЬciR4{k􉇅G >V)Y*HѱGy?BڐuhP L1AdFwdK! o0F"HcRu]Xhf5F}^폪AFj\ Ϙ=g7-4m'gu*j} B[Ǣr1Q; 9<}H#>:3dXX~Ɵ~eh@*j\Kڈ>Zs G  /SXkR*@lVSX&hJrp+b~ H]Tݤl4j=v-h?46El<@"|?% mHMNmA36u(ӐrwV&Ng)HɶEe.H6Jx+B.@Kc(q5x<4N%u0?~-}wN4#;^pN!,iy.m5{WrnTB[%w+?V^g(G*zсW/˩QFF@1ab.XⵘnEێ2T&ss98-`a 9c+ ާy״^iD2^AY^4ZN!e, 6ilēqQ< n-^Qu ':0 |ȯ.ViȗuYHe~FK#48Y1XxHp!.YroeCqϺ⨱rG #Yjջvp$H3bb#o"dXmWw+oxޑ3ǡ1z+dMݬ_tupΠAe cI|Z.J<~q~.Ĩ[Σ }wk;vnٯp|^vREwS+SK3Õ}i'9yjx6?\|doK-eBUopldk7NU0sИ[/ϼ^~Zpji#p) l(`6";hZ ("R-ɘ_G͢p6o2r)ߪ^攮$tE씕vȜܺQIB:ߒNB@T($Ϣ33VIN[mܮ9Ҍ_+,l~m$J}汪g -cjh V"AN)w3+$,n7ܹ;W_)V-Y;0ՑO,|]t#:,nIU&t2nfåU=dJ=`b]58/LdT9zպ7eN "Wz`ӓ=(ه/xӥ˦oj)jUN{TJ*EyvtP՛i!՜DjpAhV>Ld< iſgP AExx굨x,zTxjcJnquBZfKNZFpqi2 DTGJ77@UAɊS }ipm`m5sgtҝaJJpZJ}lq Xj .N+"xkމaU% $z(o"+Di:p#]aE:Avh9qIk&8!?۹7yat'C|*OuokάP;?<8- IWtOʝf076*+\u`)M Y,(:0QQDԈ}5pU*ܯIfDZ$cxptf_W %+(Ѝ:M˸6ϲܟbVI͠qb_""80b ZI=X٢mV3_c]YK; ]3f\hZvzB߭y»]NSrx= {LC(v 1fť*|Й*an8n+)C)LlԢt}3Z)G h-eE`=f@qT;rucr-c]LI#- x.W1:,2Pػ,"oАIDu9dqI)FNG~sVy-,8U0X@`5>1Oh\qA)ظZm~=.WxpY|MZ>jI)#sh%veT}$hE&ؓ[lyGHh3ʪ#]YT+M >:F .\NPƄ[-i7'nO< Qq,[XM!W=uU\?Kw?I@jH?5(RK_*nx"1k Cg*':ipƠ4➠Iqc^0l G^a&@OB\oG)`?$Z92#˽fCw=0 uDЬ+ vr/Y励 H+ʗQ]Wtv>kZdDd}kOQ:EZ3<;?|ݴZV=`$²?[Ո7;C5h `e$a0%)f, J_M5! ,7MyOk)ws^d¾}x񁸥LM}wڃzh ӰX- P&)}hKg-+*iMF]I=ƅSC@R#4v!t%PxniHއ`E]^ Wװ %=1~7[wb v '|Ξ_}9]~;ȆOD+rEuS>S7 $ `ǧ1u *|lYi!gB_O% |ߒop?KY :C _wBXŽHDtZ^ۑSG%XitgOܲzk8٬5XgFnobB]+V-d}x28 *0Lmq#xTuSvf6:%22u6i`&Z (fgeŸчX;=bHUբAKJ{+;t G2îŎ:6 ^#S]| A-W6ub}?=V,E]%Qo!7Try+okqë5On9`^y_{Si{cEt7D,a.|ɠEgO|!Xdk(Pb(:|KgT K!mUޡMۣ@Pa*o[DX8/lD$۝3Cwe(^vЭaF:0a(8 Ïs8餦Ds`g(xRՇbΚXmQV&JBL5JMnWs fԃf,`x +lTeLA/2N.Z$.FoJzmłU ;P)ST(lh}aJ-)CIz҇%WO\6Gz!.YbKR/}[NLjݿ>29/,t3U ! (D4 *c̸'*!FXs8$2ΛO77T)xLԼ.&u>x#/ xfaY?`eEtܨ&8 OHJNm2* q{L(R5co6nN4㲻r9[dHpKͳ;B?d}]NPQPJ2gP|98UVž@9BdvD?^="U[k t>I5>YvH }<*~Ap .SA yǸHXۍN%Ta`ſc`4f_3A6νzTPTCbx'Z z=;Xzҳ^aQ Qՙ\*iQ{[ K_0^bԔ,,n% 4ץaU4*vɇJu;GT+M1i\#mMmѺ=/ _ Aae,XMK(({wcmNueBQ.2T]7] F{fŅoR _39'8= #|rp'*-7ȃj_m@n)'oNBtH4qgwjWVwIOLR4!pL`k4S dYz#\悥Sn,= AKoI Zϭ&V(şxP4_ηPK\ĈUl'3w,Zvu `K+>~6 nZ5ls|-E= dż NZJ!TO5cq²g*!D,KB-d0 4x*0_(.nb4;/vH7?:-k$gF?RʸBoLts)>zђ6w[. |p~^گ۞R( 46Ss.Jk4H\oΈ%$e%X?j0Ҙ'ŭJm^xjG:&=jCfN_fgAXZylS0;ꢮ 5x[bT욱e3Olk M-֧[(Ci @ yY;G\+s%56 j"/3RFKúftR[ & #o2>'(a{w* 7),v;3B3]ȸX=g]o{% 2T48B/it&6Y>0kq9{G>0k, uJW&t.PYg {,WӎUMerC'Ph1M/)/HZo~=E𛥰(6]DqOe4LT ݑCdS{58, s=oсx쯲䧩܉) ]w9rJe"P c6~l6̂l"|±a]Cl's7NN~Cֽ1aKY޶%v C{݇3y*V 3q׭.LPf};϶'w{3suAK R蘋.Fz vÏ^9xn fE}bmMR2wW9B~$d .,γt&Np0 S?Ag!)26Xz]}3o| vP1\Q1Hp@RlK"kV<KĬF.HV^'}`=@(D&uUpuf5E\-| "u˚ʏ}x)ɲdqBG~pQJҺk~"00úuR-$vH?6NQj CmIA.s &.ȚC. cD^/˰3M%o X swnɝED.cǯ7}CA[Nt EM+Y[LD} ZZDOUb;y&kT-b /bo\w˾Zp|Nx#rm1vm@bv -p Ŵٍ"F//7CޡA堏 1Jgx( <' O[KSv_JO.dI;-Z{/R+ 6)!X?~7 mg5\(K&n4!zDK#{ E¥7GHfRNWqC0s-"T&+Rp(L hu°o 6?͜A/ abKvhuc\ XvΏW&YAL{EmUCXGe#E&̚ߥ9N[ eÕFe 3[xݿA/r 3~s]th$nW>bc iebCt'wXH&j; +<WeIWtGZ;[] H 9f]e=NIWSX QJ[NCO3cW-%kwIUH_،>BFaP0 ~ Ԓ'BCa[7ʎ ˏL9hpbd.bRICҏP1/Ad?Oŕy *xP(K!+< pQ*R Jm\nC켮?ShJĦa0YIkW}; pu>Q^&# ?}w!nz>SbvY[ڭR+t[ BS=)d ;*lߵ;Ľ._<{sS|11np#_(˅ѕ-4ڂyE>~fd*1',PRK*cH*/iT sQ+tVC \C{aj}U97i'վ:w 1Icz<#dv}#.q[qe7twZ$噙Iަ1qZiDjX?l+9G+T䡂pB~dk򇕛[YP Ǚ x -D='N,vS,t0q嘐#XS#مjRXש^ X4aěq|ג#6W\q<]*-Q+?ڔ]=^:݌({O ;GiIAhHR~2'wul7f<}O&׍g]PҰh~w)`8qύ:iv0E?MYTSnͥl^dA \?CR#'c#~U̚ԑɩbe K5t /ee>-Pܘe-hnUzI P:ҚWf)> u xXBBKotwVCn= ԙ *㑳(S218uZ- "]>0cvHfc p9\bHc?UOhSv$S׎1#^[毪 }d#Υ}Y3`'3к#a?Ws̫_=#"ϟP@a~V{0}m1r3|WWS4f|NB[OVp&΢3.!MGC 0[a9n'v:mXb0]#[ya"_X{3tF3lS"Pp|+d A+S^t>$QM_z YqΉ٣G#h/-f %H7 Tv*fy [xN.lh#Ț+tjYMpqms2_Tŧ#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0`+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?A sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=t^#_"ުEJOUou/EgCzMw˧;%w`8#?ä]{Af|a9i@,vM5PLU`3u/P5n|8 JT",+M߭F=!fO MwKfBqxY ajdaoI "AYNt7]HClej*C㠶ry*gO5j-uݺ8YWevjM 5`Q \B)!>2M#a<'H؇r}LXx@%;(P QWBC߂ A@AC:DEm : %馮%4d(,a[JCpxDutk?wx\}FHutNmk$5pjgV584 L\sCA 4:m.Ž@2饭s)Ne]p]>@33y,Cԑ@eݬj3RHI}|k?^ЀP6=Ud#*,W$FoVGuK2)63# `o@#EcU rrWbw4}whRQ*8y:Xa4nEU2v۷jin=9 _^Mu9Т^.-]+Ҵ5{Gg9Ai9,8̴@xE8uD(YʴӢ  N6啌ŶxsE)6:=Q)gpJ[r_F)M,D$MÌT=K'EPaU{OT*`jjd6G6qꁖDbu6Z,SiVz3%FhQ$Z2ӟǥJc쿒-lSYť2|/k_y9 4ZEHcvӓ!!Yj8h _`'f?[6c[V ~Di %Guxip!STkr(dW֐(!"vIM@їw`ґ^Ý*턎֨?iUkD|y={/kJ?I4 knU#T13&\uxT^>cNn43xT=ȧ*^>us fl .>tQLTE<*r ?IHif!Ot/' p]cMӿZLO;k4 q ${rnJ9XPARI>cSN+չ<ػD&q64PŦ#܍8VZkkhcxBx4 ^귿4M*G 4[iɪ,bHq6d.q+\|wn:?=G |8`ůYK|̾̈dM[r;e&7o;.>AFߥ?H:H{ɤ_4x9z,%@ d D}rbY(<`#Raro512u-.uR:" H#!l Rfh4Ɯ B#˸8"(8䚆E/2MWsmy!3b}ZQbtI\mޥBˈ?\N$\^rtw|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+Z㽟+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?+sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%Q?Gx sS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'q/DߴR޴H2kOT:QF+6pkp偣)a: JLl=Y^;?8 Ά庋}X[ȺHz\J=my3yZp "orN&Ek}ʳ7Ҩ.VZLT3'+=S3G=J5I 㭟֋ag’^pXAn͎ }J+D ڠ(Hb4_ 38jî twnSؒd2lSj\.ц7AA۩ Ʉ;5Ԇj׎Tރ7mjkm{ /p{Z` ?dnؽ,?i sSd eq\^2B??YW?=*j\tܾuXPaAFfhFy{^>L5v  }@{2Y4ph2hfDΞ;w(kT*/y9B FGp>?`hjc/ø; fE3IE]!"Rq&g1Kl@9OXV_Ow,%Bu4 W%zz݄MiVwOtD:o ;)z%ܐM%-^2[ÛӚkB !:IJB?ǤPX{p;YNi%rGR/cZhUd`G' .w8{33@UI׆M/E֬كMcZ2ks"0<[gJ˖4t$_M[hCA+C~ЮMXV ^vL 0jmn9$oLbIƊ|qT 5CÖ`oWˊח߯]>ut{2l&5evL+~ wyX9j@x6dq3lSv+Z"itz s2*"Hku4"2~}!WNZ@齙'p"o3NlVACeY)a@}r#G$Zeg!6:Z{_J|`TIw`y!Mam X7a"Y?¿Cf DA4N 﫠#fCoMa T;3s JXo*^Ҏl;V|$2{(yh]O|!ȞP{t&{Ш6u^wKELKJS5ѫ; øyeDmRәrW8g>)"ˋ5#ג~vgD4Q"8\xOvpGr>ciJ8AS4@,25CvBd4$`.ahy<(biHۼݗ(-G yHHzb`ݿ)4xDblFADf\V-s9,qBXMo >Gp0zF:0,{fh< b@3#XxT!lrҝyvQ\+[,x ' &6:=n|PUy~q@0m*YX)բxArI6btR=3f0=&S&tny7Z D<|hfJ]G:!'aPe\ lj0d9-dھR` ԯ&,rJ%I2Z9d֛;JY!l/b.>HlEFiaN!WO)'N 0?u?18ܯZǯ2![4䄖HW`_JBh+dHGv$AV)LBr6VPk~(Ic!̣pșXVDk8vkjEGt~V3desVgK7-^ 2uN"1ΪAq#W6Pq#I(`+ՀYt"2_6D.3Ԕ:n氓].:O;@d5݃ohl%qƼu]ùəF'I cTՄ|+ Jd)we ']p,+=. iqa9,9O!e oUɖR_+lYn^L?t ge`%vs>슨;#̚_I铱dj~(F{)5-$XE8-[7! bvxW%`np±{^i;¤O!YEW?(Cp^h#DJU ZUhCpYTF=Y3  3v18PCU7/~ݐXzi+. J0PF!^F#9aHi?o 1ŷXN7w:?!(|n#x;<ޖչjW[:Qz0[(|Ħ8:d*;tW "('٩:r26+Mx;ŗcX]̛T㏄݊- _^!7-IKu֭5N ޻:BNa3a< fó9\N0`><^/ava^ {^X W¾ KUjX 2x p :XC p(GQp4q&UPհ `N1p"Nx i N3x' 6ûLx΂A 0|> y18V\'Si |>/Kp1\ep9\W—*k:n&n[+U n;N|߄n|߅p C<?~?_/Wk Gw{G/Wx 'ow< _oOץ//_пA /_пh@ /_пA /_пAeA /_пA /_пA /-cDƭ="7ae_N5A)W4i\kdNʼ!Q(_r&^K~<>kLMƉ-wSB\MO}ט;+hyud syw|̢Aśm.Y}CqY׫ݭmTkټl14D;Gk{dCc;5;LbD պjW1M㵞YۇY}}/&T4{Oq?=S,3+MKWh,ҸgϙO:MoOKVV0JKyݲGS =$ l3ΆUV)?hi3)Ț{SackXommmQ~Kn ̯} Q~!j"Z66vFGhp/{wXtk۬nghu+RhϛxB#nvFW5-'KG4n3ƬϾm=ѽ|ʖc1X5/vX׷dc/FDsiu}>̶F5 s:͝y{uD}1\̴K} n53d-M>|W=O!s֟ڬ}q}IgsIVS;+/UWk4bY}ѹ2<8_RJ)RJ)RJ)RJ)RJ)ߒ˞Si4ݺ׾Nt{ԷN0Fm&l&l&l&l&FQM-aHjweOT F+#+`to}VG*'{#kUoZP0>76X^64P J2zNh6yia?FQ0  0A/!k^bnj1O*N-*KM)*.I,IrXҊR $JЍLI, jS2Ӂ p4 surveillance/data/s2.RData0000644000176000001440000000032611765414544015164 0ustar ripleyusers r0b```b`bad`b2Y#'H؈Y$ ļ@|aA`3;p Ue? w08(Qz(У` @ a HO(Cּb Cܐ r'$B9,iEHE%F&$Ì@)E@?! surveillance/data/imdepi.RData0000644000176000001440000133377012237161033016107 0ustar ripleyusers7zXZi"6!XQ])TW"nRʟ)'dz$&}TZuё> RL ,(]# ?%4Kze'aM{?-= 9?*MsB,7gBvkHsZ70F J`.n#E(ᚉʁ%0XQ^gtڦʂMmhl VEt]Yɳ+BHuIEA#]˨JDg+ۦ픞I#JQrss?Ŷ30ُt[ÂTpi9Ӳ8SvE0a¸X;#v%EviXsHRja]*BY#k`?HR9;jP*<,o;3ϬjԙJ $4xt)>3wӍ 0둲f[}j{q_;z[8)p[TtckT/_D}.A0@L4?n xt=dUQAQ*Z6Kk-"qxǛ7/)N =| ZPJfEF)Ҍ/V,dc=5$&}tO ;XU *ILǼ*[0 9'LXwZə 7N|;mNsCD_'5#WoY531w<Xtwv#N0QrwpZbvWlOyM`[ Eex[0 梘e&2UY'g}=x-:?m|޵p ,-:G-GR"/H&w9eUa󆟳LD.{~(Pd8^V ҇m_/{>RoF5Co6,:ȖJRFL̥TyO ˷8d _FJ 2$)xOZEZ]G%{r(vA>ØLUUAs6ӭ}efדּ6[.1Ά9;:zc3> OI3ŻplhEv2[@P.[ߖo B[wBW7&Ӟ e7 /Ϻ#MiXJ-gxRDap<9L~'Pc"9[&_UOTҝČ48RgTոLZ0ޭr*d}S>3c )*Zۀ*L)٬< )< =$\ha|r}*+V*זURA)}e>w dx?x6F e9fdz%=Ƙ}O9eIy+,"De;!t^*zX@fzA|(ew `CD.]Rq_`4`(% !z$G0 2ǝ|~bDm_M_QX@Q6[ѩiFV^74~5SX,sMAZ@L:?h` VZG꿊}!zިKE ӂN{\Jn^92O<[ڏi}G0j(ȫA*z.8'. }e^͇zs\[|X4Kp-^EE&z!tT~ %EUoYD>A𪈞(&8\7=چVN?;Zr d%GWVG-%7#;4LDu,*8(gJh-pp\r!"va3'ێ"~Afr(&뷴z:M*zu#7HcOa!IGYԼk|}B[a_ s1 “;٭cW`,W{´6 V3]^%]Ay$ g[@,Kso*g })ؘ'J,xFrzn%ehlmԩ 1h2 :ZKrq8Yꁤ`vK «ˣq@Q_ut %A?(2di@!42a 'y|bzn½<$% scϱuG/eA9[ރiTMB') ؘ- pT?;QCSE">}F CT7,U8W vބb9؜343Cbb-g)!Zk9ڔv;˥RJBӹ͙?1L.s2Z(،p$/j=Xci &9w /m!=cAY{ww5:H*6b[ lȒ&P N/۽1feSܻ/5M_'tE:fZ~YI2ㄽIK"=3zTϿN^5+$jXCJ7NU[,knr#HdRv&u7!'&& @-ԠBJ9R5?04j.kB27MG<4|z($Pnv"D-h=!D) UXuOp%ѥ3p?̾uhuW!5OuEv%L`a-lYP|.g#tR1*>u# L-Lrk++t5.ҥ`lnC,5f=>|<S:x_rSH+]m:̯\&&Ւcj;la6 CMr?V7 ը#M4ĵdNwK@8n8g' 655jfؕWaolMզoۼC*נjEq &V{I&0h `)(e Bn; Az-(wfLEpF.=)Fhv7ڗ##nj0GŶ]MjZـ~XYQ5t(99xӑ EDa@wSZqX5tE&: [BV a_rFGD>b_BpJ"ׇ=ZiTpGи v'3 mUlx /?6]j W9 'dgƧvP _|kjbMlYfU}٩LYe ~(Icu835d_K-@Yx9B$Ce!n mB>S![oZ)8<)V*:OOɝx^xRi&C&Iˊ6]Eg^>Rb 7ɡq\ۢ,wU Ϫ{5 qc= lšVJ| {B MF@LڐvX8TBQKgmv4S1( Q nHO9"ZV׶ȩx/51:ęL;މ+;T)"W ֡n2(4m912H5+8ӆ*"cy s-ug2]!07 v0U4 ,>Y{ \M'Ү Y')4uv"QUD*VY03M3׌Zu!k9 f./8^Z8mJOfy,Ƌ), n`=cF ,Kjy)7q257* Ub/6f}a^|8?ǭq'aB̡!0+*<O#2Z64Ed/ea4h7{E`5/OɚDcPx*GFFmA81\ >& Q h5J)W=BT3"U: ŎXGA]Kzkݗ,EO 6c|\Fip$"*z.?rnm_ z>sfBk{lf3ω~&OSbܿjmb_ ]-5y.M}.]qRH{řj:Jq"%`&lcu@XKTÑ]/E JI) `EdH7gK@r 'Wz_Ql7vJnfHQl1i2Nn}/zR~#{1}9d`Z[yݮG Ŕ[g}/c.G26qb e[_4b _G nK.0ӏ>V$ @ufx/{P{䷆y2-ԧj}wP\G\GcKV BZp vLɫ̪ʹ۴ ޔ%$hފYv|Amt:: .@ lHy8]޳3´fy .MEA?vAG,pw_[ s]?uTʨ8N[B',6 {Nq,|W;t%qrT 2dvIn jcEZ#q% Y: /^7lx,h jo>r[ =KS1 4~ʵK@k5iBWoe'W{g<0BTψpCh.qoY/E_=9HMP޶FyAo:@;y'uI/CMƻ+u, ېv??eˌWz8 b%f/Hg˜j~yƴcC./9FK:ď1 \~c{m_[9KjsFPNz&-a[?d3z+9eΨ^I>bthҹKO)wd5i=R/Ffn0T_(ka6G@xa_iFHPl=tF~S V#|5ՍQ CW (MpK7gdKT׆2mDۦjw̔4zfSHJz4_[__&" کj$% <½:43#r, 2,rNƓEJ b*~66n vl.PoR%fÈÁ3O.؃>/,88c&lW[S0~ #Pc cI20 K4cbJi~58j^ "=^}0$NQp,D}BМ-hOrٚ0f3N3A2e 1ztln|v{#bkDϟ=|V{fszE#Oy X½uY#˚q,@u<7x>P*o@kLLEfM9#46$Aө]h4gɅ^ž(CߴiU0dk|Cs?›(?fžlff( ޯޤq{A|ܸa+HCKȹ_ݯV IP%lgUXjԆXd{UWӊ(,*}.ӠJFjG&#,γKˣ"'i{mA?QmH5N-1q\l/3_FLN+c\O┵,,o 8"An|ں&#țU{o4c~)b@FR;S\HJzULq.r[b_Dg<Zr4n]I6!w2ޅ\W G0еϿ6gM~ZFԱ32M'RR+ 4`3a>ӊJU dA H:#).%yG0sr$hmȑSdsrԮ A|] 7>}U##i(]KRFdcAMk%`CDms'%g%|#)oי{Bڿ ]Up.ő{wp¤;&nLEBWt6b%W ~mY#|RaD6>ma/:iچl#y[v.7% `#ԽpjiLaA"`kzC^38¾T+C:,\ 0!G]9!Pocĉf+#ޡ wbGܸTY +ѠQp/ZV0 ,e`r >~vP'XS4 U-6B!w,W f{*Dc%Ӣ7:Bc6XޝZ3|ڝ2@t;03,AcvsS}]|SRs_C3d[h(S7qօ/?Ĩ_ <8"|l%k `$EЕbgExA1G^y8iU>~ Lc|\=bPD4U`n:=A 0UQ|ޠOx\Q!o*IȳW't G LaD/!{jדQS92E W/h(3 7dtx;W '!j ׷~U|m1iLҡC M7H}:?PKDR2kP#(` 4@`%IQ9rF1,nP`+[,4Ť4=i8oQLZ2]OnMˀ `Jw>dO'oߩJ#zb˔1I?I7zMK~Lhsu?SU Cр%Ȫq"XSftO3N`ЪOr; r6I@ao;PJ4JD!_OG(<]9!Tdk`0r_ 7JEŻ<ob$vT0&-w2plzyLg `b(ŐF j}^8oIEGg Knd~%WpXÝUCQWoAi.c5s+考3%5Н.+G͉nC) &8[+嗷l^QP$/x6QOUyq RT O,RMY_o{ ǫQa7W/Tɇң阙;ѻҗ~e$%aEqE#wqY,Y^5sVˡR 'm2D8W-vl+QM?>Na4n}Sg3' ֳY(0[f5aռadF&LKlCCU FFd3_< ,TVV (G.>ME#Ӛ>^ *zw (q\أ=g`vi;|LAZTj:g:҃?l g R&|D6Pa +fC=戚ҼI%|rce4ѾU􌪤@¬WQs5ۙOnH!q<޹RMΏx75jMr:ƕlr{{7ν j'ozf @ 9/\J}>?ծ[(W]PE_HJEQ7e!ZC3vcSȕ"Tܒ\[=+H?l֍\F5~ ᎻcKqK@ڤ:}WH܅[ީmIm=pŋQFsIMnIJoa:cn1p8/N{Ô(D644$ȑFH&%~R$C?:uM\meauUamб/\"#N2A&qva> ;YXߛMA,=ez|7&6\vpi! {2Nze}d|O١"Lpj\f]ao2*,Nj ]k#b~/dq0ULU8r XD{Qm> X%FeMXĞs@ 6qHŁ0QZE#1I>ebR{q)û;مys>sFeJ.>kSb.rp/Q' mMGZIw&5`2= O[R_Æ\q :ڨCܺu^(bΘgĜdlNwLF`$Sq9b^jZ5u}mM8}|5-`DkE+l T9tE;4Ⱥ %[K}~HE;ꙑ䥂k~KaGk˹\ß3z`AAV'o=߻ _59~hkEsMo`av5Zġ]x}NV:{smMQʾ [4 APĕ;[v[챒Sc9-C>{lRxW)\6~e|aZ1Z7V/#\D:QPb<|fq48_S{Qg8F9lV/hT(i]B]:=({ť ]؜ B9u`TZGI-t'G6 k}i>uuoiUyS^H&Yߐ>a"<{ ȴYQ5pK:2RQWw*5q6X!sAZQBs{eqTiOg,NB@ toǡʫKF0\/eM\1$k|YOx?W'8*>Jx)L LL s9(bV^R5:fIZ=W?keA߁n4ΉJ):$;-{v3D y/CJE`WQJEV<0tKK?+KUyNJr~;۸:381Tc6~Z#*x 6S#)۩zr7 MNJ~$nZ}Ekܵ*Kτ*#rwkV=O+Xұ[: #,\>)Իr6)E1dr&"JҨΪA:O/MxzE E ܳS&OLGDwch v[o-.0WFIRV'& Ð\(Ru -J҂t=tJlR4:wۡ>+zΐwKB k;T==LBst?] >g%5z]s&|jǛ14rDtKNn.Q3{Q0b2|ɏ,`PB4Kq\Ps!rN8V%N\Qb"}Xkj\A&p-nTm1 _7JNA BR=lIl   A)A q)*#ޛʞI:(LX왺f6+mw R2Xdw.2g32nK[Q cJm/#tT)\ybǢpjb7 rg-qУ㈰LB7v-Wh0=LAjy-+1 $ -qd/)]4 ieÓ^"#Q\X i&\\<@؊vuL6RL4͠kI⸾ϸB&!aDzD~1~~Ts*ݫxb#~W"h8 ZPE9rS1JѤػʔj3N![Bv6BNO!u_T&^ǪtwugDWZA#~P#7fs.[Z]BtimglO??K%-6n^b@νVQ1d_OH`bVA9+^2J<u0m-Iyq{+: /!5S;@RqvGZrZh}2xK>dh2Yb8^Ҿt~SZe0dpA.<694Wi)5U24 q>W8ᨨL\U[2Y4 M/壇fVD7}1soӦ',> H A -]ps& C@,kc;%#FsGFJR#z4@dsJ6OgH,-8 F-s@l CD~Z(C)i2N!ej ʢR< smW5Fʱ6lQa3?Ҋ"q'#G3ne.ğxM 7H:EMcou_By/)"g_XS6pf@Nm= DBe2FX#8Y|:c34򊭛{IU9?}1JYcل{{-ٹmD&GZXvpry?gPwhIeNVq `0sXh7x# ot3vBfkѻ8#įWǔF]6\F,pAgi`r L=Bke4B]gAz꾉,BWúȁ&q]8ѹ2}uqw6$d3wQųMs ˗㛤Zt 0)OܘW[XS#:HuA `W3l _bK~r4=֏3 ytI|"tk zp2`0il] Ҥgf m2Y1b`TA;3-KgBnjwk/-eMKR2{WP͔jn/ .EL>nSܹF{s7!E<"xVW͇MDJwǁڬ^B&d3} 3AŲz d]S0~wG9!R;iWֳ;EL"Ru95_sFP+$aO?64֭%E88II5_HHAEX0-aP]<'A@C~}?D0B#e.xc^VAۨy"nai  LY`CyUV$rgXǬnzh/rPMw̮7n&G= s^տ$.;ICE$fe$ڏlS q+xj:2'"L, o&( ev;i[5ZޅWͅ_vyH4Q EBu_J.xO#a#[pKe2#7{_Άk7r=җg=JHQ#AYu(yk ՎdHdEeWDx (3~t΁ 傂^o>Fsq&^2kWQ]!\eڌ}Bw'8[twv~O1ه=XX tMl) jRusp`6;Z֪.*7PB( Q赈oX\01" ]`m֒i(ݦ+@=cL݈+<"6!~. ȻHcLu .N"qmKъ5laDo?UL[OɕI>osxXSosVis`m/Q9DF6;CIX* 3Zxyl&ANZtI'\_42W5A?T.?<ER 2ؕ.1;9bzC㩢<\<\i)-iv-9}:)QtF*'-5XtRCrCgDcJDge5.JE6Q/a|w!j.9e5QZ+-K'o]"LbD-Ib娢]5U@Fer9xMv%pw,wQ<I^S 0쳋ٳ?}6 9Ce)'iW̐s%7ɼje2Fk>vv8a3#| Jn^]joQv,L'$CM+$s/dq.~צCnaG|,`Ww6O*+Wlr:V1YDp3GNL5s&C4#_Ć`Y4 <08 ` lFspu#vu)1}uKq"}$L@&v9OyLIy$#Ύg%ʻ.(Lr!oM5P%(HAW6^r5c"]{_od n{RPR.`lG/Ki3cOZ  OURN?ۑ&Z v;#[d9Jrf[pSxu̪^ț9M/fhIX "iA6 ЎO$bI/YL)kLG.~.}L'WҴ(cyi>1(}QԺÔ\CZ5 Rt-1?70\<+*d .4Ekh.m2 ?,bд9]3Ć@DrMos̍s(q37^=R0N,]u1Z[]K7!.M"jQ-٠BNy?Qn0I 0dyT#v sC=LCbu\R(p 4h|lU]D"?̯5c,].X췠+s|_{SLܐm=^0g^r RNui(xu2(bNW9P`+H=~vԬNiS=1k*QTNqu{m6$ LrƽW : 7vGÎ'5c*>#æG4/LCg$Oqy;F\ƙ,GGWPF"),,`Mt󫠩?8WcxP&Cu :(~v2'KDh2a![>];oqyJKUV>B<|T4lrxM6KyLp{"l.۹'BiKp4]!pk!LeE"JWQ[!MKEL]fj֜E~$ѐͯtu'RD :k IojҐϤKt^%NCNY%D4-9yIoA$E#a*vG+N5^IsZ~V9LHU9ќ55cl|u +@L:}'TR 8)Jir|XY57гQm`j%NV@zi !9cBdr6iICyF5~njnoȣn1&/C`|}>"uXi 1zy~<9`[Ui^O } D,F(Rl`OC@9>&5;R C Ӹ#ry y"5L"WWTHi}jH/^qSӁl)g\Q k {^`A^kڛ$f#q"Z=@BD*C\c+. 4Ҩ解=}Pϭ >+ߝfǕ Ɖ6g%*|E憗 ?۵zځ3փZI3N7\t/`Gxa5 6u mqzt ;^ݐy)QiXVP$J>[/xe7/%-=ljB(Ruإ }Nqbl~6+< r5<3 A|yTR@jRynne?5@&~%uA-f S/6ʄ,Q-3 wkE%ig7g"*xz8C:+|Ls$ϷQllO4]% .ze|w`@98TH?067Q:H|1]b,|4a0UG=@?#}p;W Q, v^_[R$;QFoA 3L4cwD|ѪbtE=tE` gm_e.\|+ͅǘ¨oYS e8N޴l$ ˕^Y+b"躏¼*l_9͌L?-ھ]Â(T{|#Qg6|aX)ہ,U0efD%s<)X r:֋ ΧL'IX Ln3@cmM]_SpAoqvUQ4޺aWѣfڏC˜p'^ٶ|lh **t`h/XLFLܾGe?ҁ֬SV GUoZ<-a.(hf-cZIj󀺲re/.JIFS}4Z a[O&Q7#V Wc~:IRSk1 8$ܺwm韙Wy"]ov&bq'p9`mB`j`ZK4yBm $BJ6YB"Tu = $!#o,nf&kɸYD+BrZZ٥^<#IC3FE+n(V*hc'i=h 2W<5\텚tV+39T] 57C?AqQɬAЪG4O?jfVW?Ŋ=уVgfǂU\WA L/'SlG}&xqoو*? &$/M؆cKHcTEB4`ϋ7+v& VOBJ"}Gj2e7y)o yRP~t%(E>U -`%QJ)pڗ*yv*IG/0NxyR e#bIb>}:p JsK169j)vV+hzN(xֿ*5qI1թkT'mW)[*n4|f=1=SPQ俗pL^u|q%gqCUv V>P6x7\!Mo Dƥ'7 lUγD=%_lsAr~{@9 =F>bP[3Z14~w 2B 7u%Lg/|ҤHc/1[foxФ,L y;d L$WB$ ulE#ؒ^qL!K C Q ձ__YМyP&$R ~O%:,:P4) YkMm*̖߭:HVWm6M IPCڤhgu@X-kV/DfdP24)YYQYo Q#i_J{r+27npKhIF9[ 6a>u%ͭaھL`: rD|Pޠ$q$ǃH 5@ zpry 7$Uw[~֞K/2BnITVb溧W]?I?{"t@Ds6 "ռ WEgdш۰BP@j~lPm [*c𳅾塲e߱ 6 $s Qmߥ\1VI?^Ei ^:^%1CYb_LtK€Z }P<@"AcޱjTUQσL &WtQֺ(mLWtcpAݎ'Z--5E:bż0=+B"><_ C)hK2v⚱:k) QPCU.H-:2XyN?Adm2]qڥ2W"xwpvy;j„8Eͳf {Ķ&"Z X-Ӯ P%)zC8Іr=ȸikeblN6%.,%[Dҵ W%M*vQ"npƩAO(7&oR .]Wlu~ql9"EVD2DXQY$CAzndԜEZt6Q2e{!LÍGkgBcȯ֫xvW-xj(0 5J !Ρs yx?DJSCIj N&~l517CUpy(AAq&9xbtOKrLIp.t{axS`¿131!{%Fb?LsT{S22@"*Y#\"sRNsg^!O9G|LP Kozp?G"B`zk7!frO:r2FW,ʷDu YZED8;ru}!lcPs[6|%)/;uڱr \"CNb\;DEophzm;Pc%Wz>,>En #V3* %CI+aZw%m";[A>4; ϵ8i !ugRSS? 쀪yLmL>r#7xEzp!ۮr}Q4vY'"!vS(VyD5%N%r:rV}Cyʰ2[f o|PՏ6-u<ً;V!&~F7C2W4/I"(Ca+ԙ1A*N)\pJĨ5nޜ@r!E}֧Nr'3XXKh5D*>vF ţ!6q 0(U\o"n|A7tzf2Mbk\ @S;|7wi.Xӓd9w}@ʆk) da+,7c@Zu<9)lƧJ_Statn'SqVǩwﳛ衹|]i^$FH+=N0zrb+9z` \ycApߵc8m]Q*bڍfKijc!]\ {zoO8gGbLZQm[gC;q5*ܛ8khh9sTqˀouG#l+9]4t $4B_)oG`|qǽF#Nc%;MC`XoAzu?괡U,=bE[Yiј^=ɌP/uKsM?g򽽖~Bι0 5*pѐ5ɯ;\E[, wK@y '}j_ib- b*E$TЁ͟\(!A%;1XLh]Yӎ*W#פyH2祿O`Laajo*$&`{xhfqO]-*+$,p-#;}S -nSP楒5_l)m>}ID2dDw Ikp{լڦrH ڝKb6+0>w8:3WπR6j"{bԚ, U&uf80g4METl )%(޴%˘y;m_ZRP9a0WG&kG02Ԁ  ~?_x G!E9EYq=-=(2gL-B7?\I΂Uo$d8"~ױ&oӄYӚA[૪ә SE3w #~`f#q~~>ltX=# ;QbgS\؋eow<%.zK1 wHO"hlWrs j.ZK^otC|(b,n ɏiE3J@r+"4'%Ȯڥg ?U!= e.۱`N ~=\̾U6~B"|V{}OY/Z @HSXtj1 ϖ\6uѣ O&՝um[^jJ-~BQh+u}7R\GmEɡMǎ@yԵDaVa(T K.-pwz^Nz -)~ yZ87>/6b3RpGHKHc8mj0{s*hrGeӦ:eL? ijo7N(SJ׋D7+/Bm(>oθ/g9?FD7%tijÉ,يvr5*~j V P }O쇢ĝڲ qmz:'dvSԄO w x׽22.· KQ@%*Oq:!c~u<^w*&E4K0^uNNsXdf2ө&)%^v|@Sjd9:g=VƲM ! u 2pmPD]>FVeգgx&5!VܕxIØ:vA,p6h+ -_=/P[Ab>Br2fp0Ǡ' y@QC3륀#Czoh&]u<eDM!BSyJ 6j6/|8.sݬy32A&,jw<³*}4\.%Q2Z09q`Z N)i -"J275Qͥ*ı2IOyq{CjV| %Y;+]);OC,<+if .zs>Y{ CtBENZ[ :TDb,_=~j8 !!"sB|xp~hieIx3{T5GzdiX7ҦQH&Ni9_j0ixDEZ7n%␄D2"'XCRL F4Oټz8a.Hx!cyN P2*Gm9j!Z(?>WP#&`2:dJ<'ҐFtՔM \>G^WV3,LY!Z3N|xOQŃh&?hU1jTWFJ43ʋGΦ鯗uC FpX$K0 M{:)S65۹crKU7bh0SORhʺ=j+X?k\ ۽L”n FW.Q7grY3~: ̨@ G83GKW9(>p\ 9)e1>g#Psd6}=y˹_wܪPH)=I^ y5donK'%b)3gν++yk(ᰚb&Jl3y"KcGTHI ?R]œvҮ NJU\#f`:8j띈7J1q#&9Bu,Ҏc3-ZH`"4.>jLԔ#5nwe&ahefB`Fhً!7ϱhu9\އf&1c.{$K5!i?Tpt CEs9IK &{9"r[J 84!Sor$DUe-WjcIfSү]jM[ / zzv1Fc @@h'#K h@*>l:AL|^l٫Yb'nߺ-;܍Xʥ ͓& emJY9,iAné{ rZK)8Օjw灨F :s␠x?x`g '}#}Mg!#t4rvTgY`±BYףKԸ(>q/}[y 9+bh| E }bX$B0-v W>Xg镸Am^vjaS ]DLlW}kz٨r3FwӍHIMs9 VKkB 6=rWw4}6sq@PCYCV6$:zY.Z ';͌7mvΎ6CG*%0Pc1{]2FrrmDݺBՂqƱ۲/Mnk7cߗ[z }\N .O@"ZzĊA>=tmTֵ k%"XYdf0ԈyCल&HcC)CڃSwj?yF<'FQ?уs;=d<%MwBv^v 5F6$aHZE),'ѸFa@bgQ~.I$D3|ҔX[K0&ޚ8>|ڏǵ+YK!?(?N ,MZe%KfL:ĹDw{0 [0;=i=Նy"9 idC4S&Ȓ~Jb AŘwN$3qoC˦ ;|[ψiIhY-B@SX/t{uq18(.f]घ{v6-h}hU cDU8|5.6*C9R#}p; %,Yy3Md&[~i6lߥJ3䆯9=G^܊L.e8g95kXQv[3ʭn|4FlJ\{Դwe{'Vj<^PH==6\BfDnqV}^UR'ch/^Q2EP+N|Z.Q%FmQʒ)shoʦ<P$억g!$ƸL _B6@fǠfK -Y^n惴[NfqMp4'4 23@&UžAH, Ų{%1l`rp#Q1<G2n1ZDG7?<4‡vS\`=:Ɗk!b$o8qz]*;60Fng 8'm#fϪfi,T|iOM#独,399gJsae뱍heֻV)cN׍*ѡ+d>qWP8Sp1n^ȼZ*11.2+~Dwmm'a ID[Հ™և&{H:* j\~G4rW\eg´z[dY`o{E-_cF4~c\$|Js5 MtYe[ ^PA>t/9ӯb@]H?˳^%} 8n,ء__[r;N|f"[)֌B;z9$F6X`UeMMe!Kn٩=r|{K+L䑰'<$:9? <,w"$4S10a_(f$qlx;Dc4.N*ҮC?UwHCdžgBQ`n:,VқUTYqZiMAf-sjF/.ƿ/6ejO"_nNf`(ޚݣi.qn)0G:!ǤIJ ;fJb-׭H/{jD8-9zד h<𔪇sɇp2{= pq}7M  faAS3 7aL9$$+JS6iꘄFmаo9 X̜T/مOmwj+R&ʼW5`f~J^ס>U0w+OϢ}# ߐuKD)ÜC'^}%)l-Z8%=@NwK_zRRWՏ%x'EI-B.=E,%DІ[ݩOqgW4Mu X@ԢejGT45BF $OsFCP;vi $!OyDz-#!!]'֍?!3!&X%zm(ɉy's4FDr7ȯCK!}JxO8:~ W6y]u9wtk.Jߴ#6\p΀. C}kRs(I 4Jrlxrؕ;^a 5F&HnW?Y[q5O}}-_ڨMⒺk]I]}mh55P{h^84XK-?H>e ёUC=" _ޏ|pKO9΅\'kLHX"ҝ{fB!2!>֢qr?BQdY#B56x7-NإG۞QiBfȯK`U 1G_k)h!NJTPSC3S_+A!xgyᛳ}^tbO>9h=Wi lk`Oϡ4;Y gckXJ$ZAG$=;+P"a+<{'g۝I:fDoz]g[*j X W5*_* 9mqc3sfD[T.+rRo`2,Huȇd+YP{ m{ { C(vk;GwRL%QHo]Ӎ p)GIt`8 % y-k.l;E(OK*ٮ{=;c\kHK)VQ4a-\a*bB_Zt>ҾI9źnɌl0l&2BHs7b镃 :TC-Ooq HwILAXdIE1h0>`K#$Gs0U#? J7?QI{P1i_m ^Zpb̷aF)L*|< 8>M@֧ϧd3P@i۵}Ad2@ Uv\XA[%][kir#S`­AVEu~L?š-TN~Ё"x h3s՜r Mm2{I6HckN?}$A53Ehp:r\:6MUrsR: ( u =wGC0k4;o'^WIAoL.uMW^# t쳂r,l|*gI7k~bX!զTwbn,m=rko>Ȼb)_yT5l,^FYND| '{W87 k+Vf7M(} DLZP3ITc[ Z"wh~cFkiKoKTnnS5l ͘U315[lE甆N:1ˀ}P@@hAD#k0_3ubb7Bl$/y uHVX- -ꁐIr&TTFcMK>1櫝&oð;mn v:#6T{ f\G#Dg֥?fjA7yoHw|iv!+ԗ0 ΀'61.eƿAOؘn]وg2%XrU/^Tx1 e85C5vR?M6 qӭKi5%1kZ]~vv4C#Ӆ(t+?_-p<_t@r3j5Aws}tN"{239k?YSă,$ |Ȃ ~^^~#'<4V_W,"_8'-栬:r%$wЇGyp9F.|=Dy2_bPInAxI+$1U| ?sIvQm]{_ޅ|q|mfBفv} _bE^ pI?oJ/|)q&8f#xz u!%1ٲwhLUxZbw׍=lB2OKwr7V8~,mֵZXhqn(w;}RnaUZ|*f̹8%Rd]-,aВS^#ҐiLiy|UQqi?2YDUz"o_/z{8` 3oG+/*=PQz8BMwe2hN"Р$ٞSىT2KPY PuR&z#~5p"1,Kʜz(Lzj/Z fSw5;G4s و(0s:uB lm)jx}4ζgk t>S}lfK! S«/9BD;e7q_4h3l}d!hؤRpob=;ږoFKڮF5zT%KzWs^d3<;8).Hi6O$jL7^Ά+z˅Z»ٓj̮mRǙ%zu ZPCNɤjM7 ⬝+Gc!E+zJד AyK ǘ'|+66Tq̟ršq_7 X;tׯcghqԜ3  W豵-ٯ2'*/jЕ Fj8s*VggE]͡脿$Gb> kG Θ*k]B gc5jo9l #yK2a;xdlQ(Mk|M ܠ c]H9YEѼy#8I4JK!/pGtAt ŴhY#`F 1NmF79Hǖ#B}L8љ JʢAu4֓д 1I_Iʆ0qP!~>J{m W ST}E`hv&&"p0zrx@KQs%}fjp!<,{NZM}gӝ ~_6dFYW~D%&ٯ"h9݄T{A۾8g-8kQvyvWG

28O;]? 7ڽ"+)>nG!qϵes~UFfPͧCYU, pZ4qKg=ᴘג K3UjvP1ADTf5ǎV' >q%YA'CZ n%79T֩pO_۞eHѤq#C94Xx mn42!f[8pԵO b*XoBʅ5]Xέ4 CW<չ #Bz)>;BI{jN\|ε㤝h7yN|,m8`v5ڹ!`(fzDUh.3ulm` 1 6S`u0P%㇨#yJn^|2e vH1|6ԗ0lꞸD|r.V$Fbtפti1(? ˔QZ6#b\g95N!qE;6{^]˹v[~'*_Bc/P-F;*_e92 U芬ᘪsFf=tҺ3C!NӆN 9zD- 鲅w$-^ xY@o>PFNDtFu;Cl@P U|PKd\IܩC&igp`{8yhτ@ AbBUGiF? tk6Y@Hy n1G{O_C47To c7-ɧs#p%ŽɏFnUP%נB oys߀ֈ`脊vtP6q#H0 )Q PMiI|5OKcM6'n;*܃mG~Nf{<WAX=}u*jr\ }ē6>|\ yTf!gN᡹-\|疷NR_`zPǭ v Bm{WT4mJ GOذojg<@'(EB4])Ʊ<9M l=i\ ,QM~x`8(FɺgQ mI]&4 xUO})~a+pg]95&}QNM$%~y5<"[SXEZ~؈Etؿf0QfZtM)NJ 2!e2RI:B`` V;EaA-51lɠa⎫-GK*=̛f2LCd]pcqlP=ю<Ga>"p&v}0a e,Py= ^k?.o iЯ<L6&s ۨ tƛt 4#Jy>k`Y)})%p@+1VB@,_KE.@~>8 S3vܫ7|] *Vfqz_Z$u0Q+Y:&вk\lkrUq>tjFMD ~%zjx6;ʋATSI^u MB)GB `6]GqYpKE&z|@IoXn*T& 1XԜcMsPx)Wc1Ca@Zʊ|e%iJWGby@К }Æ)0In$lS6:56}Xd;6q1n5ƉoFWϹByo @ pWw 3sjiKh1Ruc`*X˲2wz]gWC7|3*pBĮ- j6ͯJ5vz׾Cٖ9Rz7ɒ&}vz Rnr˙>aD,y_;xqZ;v[OTDw҉ 3AJ@A<ЪtFlJ<.e@k4u#esaسwm@"IŠ"WnO&B|C^cz%8=~/ }$)%+q|Ber 1`Vg'Qz3r^0eYm0`P}8A(_8e,/EdtgRONR0:Twx3ڙ;"h b:?lC{`JMӀh&+ ,+p!,4l'vJIUJ2V%L;ip *UC&dM-XR\i0&0l#cJ/5agRCCau:onX bł%<@ik)ȡ)l,?e݂Th?3*/S &CTZBY+Y8g'n$E!0 JQ<4C]opUp4>km[ox-w bR[q IvFQ뵹oD gE zW;kO)uvK/7A5c݃!фZ9Ff; +pNeWtUt sjNY+l+M22dFf"L\ {EuE#EE^"?_cEs @U5>>ױ`QDEaW6 ֝MEl.Wg&J#;}Xn;zJNǜ[XmR#z$qT 1gaWzg G~ݩ{Kkx>Lh w+u}'|ɮ_~o4Z~Uͧ9TբMZN@iyrduvP.jr}:zn_A9O1?dyB u<P x)/ j0W%&󲧧:c "!n& |YjhfKw\w"PiDtngMZ3^jkhRڗ6CɌ!Qop:Emp.Z* Iڿك`` Б HDN2ت;9Rwhd짔ߦtw0M!ӚQ R6X57jujp3BcLVi=o[6>SQ.٘{m@-pE~Ge"t2ɐki3b,F4(62^S0 S.NzPlV +)[=rE&b P1Ŀ(5cM6cH@> ێ>x{<*xho񹍹s]_T:z*.%ctΫ>,gm`e F(SzVgZ&쵖,+.><CW۝LQ=26fmeVwg"ZmNTBÞOD?Ev,XdLyv`&>Ӻ`+`&L^k \leGFc9u"&^-^nй+"zp_u'*Q ū䇪2rWP-ܗVoGiޞW[Ӌ /x%L~:nj*NT$7} 晱o2qX/`:Ƭ>٢S$M ?P#SIˁr!Zh2G@_K?I*o)hAmHLb>3 -5j u 82=x5˦Gy4nu6_ɲIvVk׳?y-n͜]i[rMj0B|6 uwyxڛ~x{GQwJ.{q1sI[6vݗ+)D5*v4d{õ_Tbe;+ۄyjy& BVR H#7ARu-3ab_Ҝ[X5QxYmlmmc}SE,i9x|v6f@6Ե{1H\*(C"9[cYK$^/~uaٹF3l.`:WӀ^6rqN{XWnwlݎAba_E kEOi{R ͌5XM`je/6,c r(L2Q3H+(=ZP10\Ԩws &6H6gY&~a"LыŜU~ }$fnCޥd.K{R")U]'ahI* CUu =3&׬f<{;*qlE AlK@ʾ [TE5I^n\?'ɸuIFLN+BjbwE/j@L-ٟ%th67,v8GrNkl*xw2 y=O\.5\[D/P\L =k)`u31e*8 .nDusdDtu4ݫ!cl w W`Ra"lT1mx¬rKS@'Y"B$g968M%&ѽS .pZa=<(HׇE?֪sUĚɸf H2徥x|uˢʙ'Si7nD䠠4JS'ҝO|b̹P&Xt9ѳŁX}U][2Uk{: (VVG~԰^iSt̪N;B1]I:__WUF 'V# nW# Z]e*ꀣ3[Lnm2 W?Q4] Ku^댜hqi^5[o$`C<(p 62,:KXĴS .ۓ.@bI ~m4빂ScC0 }ovpiBw;0"E@]ٴ "*FZa3C=B.spŘ0\݆6hU; GQXwZTY "^Nrv;XQ`w p'܃*W#`.d ؘK> b'Smov Źj,#+&RuE >O2L7AɤA1` /nA-J֯P)9w Ų AfXgEГiyyg+sYXTf-۾\TSPh3")Y6YKgL~d}-<6/Iɛb` [El')Yy&% e#0K8 s  B3@L&eẌȃ6NIoȖqO>z')4~S#S?B(&l6vSC3g7p](S3 Lc \ʰAe$ۓ]\xMg\I<\Q^#^9!%ܫj3*bwRT]My3 X`6qu?r@6ZYGXٺE|k,l꿹A}!SH6|]!*^5-gVQ ua}yE6/FUG`%u6V;CR G$[2ObtpW4V;q7Fy4kG(4SǾ%2PsxHqTM+{YJ urD-"׬ՙQrSyb8ip#?7tvoaBx.@/>Ѐ+m4\H%{_GTAstDypĨR~&J2Emm07sQhG|aݏTSrV8gĴ.͗69?EΏK/|>tdsm+#V,yY-ܚLEC94nF2 vKW=7<õW $`v62f=˫7^1XkN> !˸c1T31[m@33!vF[jq}ѡ!Ij@3U@ @b^aQH؄,%i>D{2q2Lc\?/ =dI$4$пǿ r@ak {LH`GXݥ}zp(T@_[x7"rJdH_"~g-l<%Qר Ճ}1GAy$TO,ۭリɏ٦V)4kf# 46(Mk IT%O3O3 yfaeJ+^u=u`bZ5g) @7̯ZүV6NJwp#kM+Ue7觇SSn_Y1(G0ngR %Fu&;~~4$X޾P>0.6ӛ(lEC: 9:`'Y|x,3V6j&ꥄm7pY/_Q}8bE=$X0-w;BT?W1AhaSO*` ٭ +Awi,t} .}ҭ1/?v&jg^චն30'\_ڷJ;]{ Y|jAź$T`ߤ?iS.P`U FG-唄@y3epz|7<9DezR8 tn叒\'|ztS3*H6rErptqvD6=IJحU!m 9[&bEX6YM0NgDx:iNj*g?nqh--v&*J Sbh ^CO9,{ySyo^m}"D`-I*.DP;|&$Gm/gq VZ91<̤m1\|5X}; +O_Yzk$Βsyu)X8/G|^ +!&PBS|uթeG[x{T!Bpj.cJ҂J: \f6Hv ^ܹڌh*fcE޲׬5K).qkpj{L:A~ ~kl&LGϺm7ѡ/G{ }gGרwJ3:_8kGh ɕ aE"ܦ5&ri;* 't1%}DxgLzfCjri=舱[y'DgHJX$Pf|{\pW?>PPμ5>|Zy g=;_0mF#[UH;8\7ƸU2kQLJSZ^s܎"hX;Ozz`h_gX1}샙$/kB G%N*فRԆi6͎FrwLfߣes-GCe5lۚ[\yc6LӘ:4୼&gڧMI#DZsU^kYD3Зh6t1LԬz^&O{‚;w/ϗĘPnEra_W?oPgPaWM_q6-[|pDRZѳ3Ɇ%A"3Py{< V&lٱ*΃):1(FZ){D 8CZJf.ºxC8hh~[t3* J:_Odk6|ߦE~ձPz\VDsSki+_{])6vl0 )aѡgy ئ#+W˫-+tPbU:)5 ?R+\WRTi*0UV£"9;-@C}C[KxÄ]^@?)OO1 )2 %9V؟+S`ޯڣ7J:/nh<='58Af Zh11p/j;Jxu I@B>j6|оAfVN4?2ƮcT[3W!#ɺB \e>RM% scTbtcMnPŤNCq~:C!)UnYRYj96O['LErb_HM4 ;Qb!e>)_nZL3DNR `ִ&#~K4TjCIqaj2UڏUI ;7}SQ36{bS \- ىa\ ǻDVQ0_^1^~> ZQ{&BEW3-~%獯(UmiУ:u~phq˃s0o8VU/֌[B Y/sts<[yRj6J@Tdੜ]?{0q^$W֣izB2r"&|j2rC{lK 6ߩ4Su#=&6/LqZ3h"e?t,O]ӔIc߷x^1?Ɣ1[sтɃA ΎY醜?_';Ӫ{K}B'K鵃)/AtZdЛ;"M{)#4++p8ԱTղ.ƣ?)%FM%ёLroɒSeF2cH"1Yi#5[N6mkȗ kz*5sNo2QFbV5AE[OV^q]kI1Yct mK %`Zȶsushq .38U* SۂR'&7{1_\#.&Pm vo9vC_1Kg5K.7t1#7/$+ xlw0Px=s(FXڝdbW1|V->bn \E4Rkq:>sɹޟ5yxo΃$5hj ㊇~\σa=Oxo\gvAn9 @էξ=3?pV@2KnB |#5m5EEj8Z,hz(~pN6WD#GzMo4R,&hz9As K푰J\WoגokX Y•;uaeѾqE%l}+Oe̡O&D6}I%M9%/#xY7րp9QԪbd$8uen$="(EZ'-2fu?84u<:[r˝7`(j=7GF_mkӺb sLQ+_=%0ԳR2ЗčqMQZ룽o'c@2)mN5Ѵqi qS ג{9˞\-WbXӛdB,$h=12Y'%jϾ@rO¨ 6VfCM\pB)M '8ψJO9qU~IӼ^a{O~kUo ZKv<:qWv-칲nj5vBVvl 6gWD. }jciRN+4}C F 6 !"ƉXM]6»3$:ry`v~6Df7ZQML <LxچR&r*S"脕XS -S}2 6Œz s6 4i_EoGe@o$9G 򚭅\H~Lac`Ww]vHzcۆp| '#Aс Cw-0Y(tN ,1ZEiSߒCcF"a[<ꂵ$5PtUEx X3zwcK1@h840Mt<*0P#_m)lXv^Ě09K%,G\5s>3*lU) (k}7_n "aiՅr1zcvM%彲1aAs5Qf7?F}0U`tʹI9vmX1ՙSx^@\UR!(nCn3Ի2LC ~}ʑK/fia/#+&8cp=kN*j,^M*0diQh;yxᤖ $U$pSfLV3Ґ[&yrhZ1!З'慧 @ĬRZ\#6e^rr7wsOK!bwQy3C@Dz0OS#&x0V[(Kc-23x.^4V‹UDN-3=B㨓oG ᵚbnYk[*!4`RF8f2׭&g0EBT1? nk٪ j@]{cpyظvNN=mzgYjI5 d0Y:#Փln/t/cR#3sPsxl{!ҽoE(l$*!C}G[_r{_l(g'$+T/1q*DQa%B:yȢ\0QR2fCHj͒Jnت!`Ww㿏 o%oao"ؚU\uZh)r0b!U%y@2`uԫx 55(a7: I|D>#C eƭ.X OlGDXN+h{*peGE0800gKuCںxvN\ y[#W<" d @Nn Uqc[My_y>9Yb #'e,W'q}%(4÷Ȟ"/X8xf9c?x2+cXβ?:x_@#bcCN2 vb'#1lsdG(}-8fd`kS`5],ۻ/Plw@3(>麘fµQLd)!d7sSPRV6ESlɸ.߼t46{يb$_,r,=ِX+B~:.=ˇ R1Ov '9axL ӆ삊;J_s5Q-UdM+ }&7d]!0T2?.O]D9x-t[h5•S!m?:7-OϾQvq|"W#iBA8A3@t 0_xvwfp-&ubԜxO)QE #.j~, 3\9rl/5 g(zQ)kBimttڄY ٴTkY1퍛>{"y%DL`?T[ 74C܍\yW eb=jP"%iEZBZn+6ݒ\s^ߙ]x4 q )ApXM8,~.[fAT,"^o.5zr.#]DW-e%zUmKDF+ Ft3[5&?%61lKHMPkF^d"H(|c;--+i$󎰡f#0v&pdH&/@-nIyG-:"d|C5DԶhu"3lfĬ0’x@/22# c"?jJˮ'̚7[|oW/$l W>DlEwtR *:|1 (oקI H#Q>cJ`kzS^v7Ϸ @]s&>Xz( {PlR-x$Jdd7Kc:ӎ8J)LXЙIkfw ˆ+' Z8ϓ)\H9TGLJ&1b3B%~IõO Ʉ\P5|`g^zL+xsW7Z"B?*K8"eUw4hJNB$F~u~gŐl|օd^/.e\ >*~ zˉ?- b<^#>0䯤Pk`myYe .\ <<Є0ֱUS ͊73sh4UdQT v9P`[a|W9]e3[۩nVqH+?-XDY\Ṋ>@4ln$!Ad9ڗm&^)eZYnɱ < `;Ϣ{$ݡi"I`bZz܈tJj4n}[W&S:2%)T* ROS>-.Q^I\/I-D׿0Xɞɛ$LttI` 'tEKzNѨq&ޡV ,r/hf?ZYÓ-NiD`]̝ܳ)/=0w6׬ q9? ]~?=~\D4%I{D׬Ը.|b+.EL$2سS`W:o(jܵAk+zϬ[= C ʜAT|?A,>':#ܡ((+HI}֮;}H=uMN O:a%*YLnu6N { EZ"4ZYp 1mOw'ɓ;|gv#C>;^kicԲլF&o|,B foEi#y]GC}!O'n0W( \F7 ?J#nK gעeE._aBW*guL /fn4>Ew[vUv΅"d8ޥF;.Ь'6$ {x,`.c3VUxYx{7g*P3%7y)3QFcqỉ+ƙi4_m/`WH zw4WQ]n3i@}:g΂fƸF{F>bA7)Áԁ'T UJAVKf~H/t@0faNAb];u KMz xAd8+3R|1TWIǍc0r/QUP/a4Q Wn`lM`PzOӃau(|ۓU>LԷߜ>G~V*FW@dd:̱[GiF aJ}*]Qz5WΗ/ sp> q3g,Wb _J Lًu~T .2®k)![3FMǏ=&=_Kl@W } \k١MZɔ&` )NN4y6+Z[n8~cid16\ U(vBNb{5k [ѿ*λٖoV܍[&()+.y H//kk!ЗD%@wY&]3."E@QW1zM|O;*[ӑ4&+.2Tޅ~x?hDTsu-(ROs hDݸ,37 H :pAu:E%8{~y e>uO5Ͳ=A lvh1V^n*bHM5Mv\8a햠ko6[9"{BGbCiǑeڨ37F"N5&sgkKS907lVH-@/QRNʊGCE&!y'mc}UqK2ı&ɊدQ_,ыLHRft*k`d3bQnhxLMĢ7IIrvnOu~>_5(\R=z"P+_\~d#{,+Qn^!JeFHllU /)-d'7T.]a.[]Ԭ#[t~N]@o3N$/5xp'H"DFSBf$m9@ :kZvBQ;kVkJ<2LFT'Eс(t)|rk-\5ʍty*Ri,ѻ"J5cuAB%<+"Ь!c1CsЉtc[68iD&1?Aat=O} \wb;n?s9` r"2#e8Y, ި'nR+z5$ ao8X[i˸;h\B<`>^vD]˃ELP|e!l* Gj*#[+,;m0]OZs^ׁeBLP)6'+<^Z~R9 5lG]#_vճd*&pxTYQݠ [i7gk.ZfՉkϟ<`E| |}j-eRUa97EU<ܐsvZpcŸD%KÜ|Qhetg'=V0PAQQ(BL ׃6wI"禦GUHxYG*H9^Rc콇,FQVkf&80M߸M 7elo[YEhC6:j? eGi \4@ qGIr4^iNyT>r13!S™Ro%#W5sVk_NQp~ ƿ[`4"QAflb `ҙ nc}G}qIO|WHFx㓱qG{ <` mq_\k5oDZVy3G29t93^MD4R(!U(gr6VܺHqGOMUP? { \||D^>T\M]ڹa1Ĭo7wG5/?"4;F"!/s4w?0[!X̥R\Ju YoХ3|gl2dxf',sp 8?(< yl^;on,Z+nb o?&nmdWJHM$xkm@Hșq42_҇W`p( IfYa&mc]ap1lJAS#N~W(%+ocף@w+kF4p1{c sbQ̃ƘHa\%xFYrwZam5>=?W 4-}Y|9<- !w~y~)ߍ+7f<ɑ WhWA&ے;᳃|N&4"#80MlXU݆YY|-A_قYt2 V- 6B:^ ̽F@4e1h9)&FBP<ȟ KU=H DL_]j*.lF(Bׁ (7}fhc?CϊÑٰ&QdWĉȖA&3GFYGR˜Bha67Z4J U}4g%pOU8x5 5k4 x-3-ѻ`D #w&|1c'_V]0oDzJEze7pn#ҪPEQ AJ}?d?ϐ=z_|&]ꇍt߃eBu)@9;H yBg9`ȳTSv+g:0[\Q$S61ov|3EtBB&F#)νXz.OO; hZ`vԠpMpR!1Ō.p-tDbND2M(=fYV<[*hxAiX,ԋ8ry5oˠhNͯD=o߷ܽ@@ 刜b1<-8bңW? .ݼSF^#!*wr? 43]6c/.΂. -&u)|P$DvB Lz}:Kjec˗pPw!T-Oj=.l͏Dh8G@{GB'>'~-& ?5bF)2æc ļ\; /l8~ZROd0r (t0qю­EcHC)˘&d{QN$^,Wv"XJ0#q&ǒ>=kEĆ ōobHk/n^ucb,ϭ7z(GwdF%[p=-ҬеrAuc"m=7W%'b |wx(G'V͕8>A̧0|Pߊ#x* OcΖ\pvɄGk3y1 oĊIAzUAϦi14S|U (X@`F(@λ ~B0APueOg%qɦӇ; 3Q vVKq:i:9̿_1ዩjObTAY}euʭmD<+Ng{WY2F[GD$n <WCUWcח&S蠀D.q'5)^zk*_4lo6W%$3F HG NlbMɓw-n$%tfS^0T|*BKy6Jqgpp,t!kpHeR1uh}4/804/͜g-ΌGsǕL{76j+X9\b'0U b#1˿J$OZ7 )i33/cٳm12Mj˼{p64F+MIt,H jJO*;9@B+ R/jLl-qt]ꄍBCqb"L~!rމИ~ԟX7BiӻQI,IĩhИh.=ײ`id6SSZݴf5>-go}g{m#"Dn<P$W'fG sqlc;'_x|0_\ExM4 v|O*+k2QF4[g!rDSoIڣA#kMr_o1!GN+Spny1!RGFzoK9JX`4%"&RkˡI.bP-@69|9# (+m/\uK`֟ixAwnS l!?ڻ*hP}ݥmP@Ƹ+F\ī`P{y%ʜig7/#X(XaR.j(̄BBzm^1"l3 i;Yjtb_˘YIU ǥ[cP4 aϷRgq lJਊsH: %"LW Z 0 [',[OH~oR1Fa :hjpY&i5>NSX^]J,VyḊd&0Nf*.=F;tJxm9Y!Cp"v1d:9i6IUwH5n)|$,kzR׼sǃP`f y4`w)qj|)-j( uC'!J>B88ȲD7]׸;/xM`|ou5+=pu"ϹE/Xc.:$?lks,M{Lt?K=b7Gfw"H pɏ? PYO[ۂQD3l@d,ITWlOv̓Aoq*m[Gjy1!pIށ4~͓[P#x0.K>4!b9dPh8C}~\p?ys&gMGcSbI> @ Ya]$kլSSXg8IAPwP[Df8fN ȁ8D#!V}d#BF2G"6I!aBi'z\렚t@R7~S0礑> R_a g|(r 1"j SqbJ0Ȳ0+moj<{K 6KZ*φ괶n藉'hYB$@2,eObcy.bVpSyXN\,#x/N׫~Lˋ`ϵA]I^y"kyVdOZU|Db.̳ș}'9-&a\VQ.A%oZ8׊rT$h eCoTsP曛@ o/KPϿU?)$Rb^oY4 xNp'jCm)$}ĬkQzJ#MMɎ|Q|r*M:fSN*dxǸ4]Y!VH/b DxfqJZ5㫂vUVxocюxK=ŰVw? ;\YWg%&{z@|͕41E@[I>W!̀&5ؤSra!w`DUOؕ(>Gx""nS< V# Ph:D3zu/`ԱEIA[Qofd&TӰ(*ֈcSS$\Z%Q 0a{ 3&G@ua-RVGAܼgZZ2^$ ~Lc`3 V 45E+* N睞5QBT#DxW)u>R176gAH,x8L& m2R(#1j餇G_Cp?YGIAi+8g'|{)8hTT,<5?C p݃ju6@$]cF]'7ec/]9-2!+~%ŨI3?AO R֒ڿx%L82;> i&Pkf}X$! qsN"J9H `I8h o+@~fv@1yAQ'f'Y?hXuE'^ )4i=vR7oy.]y aW~.я܆r͑ȏA)ZTnT]Xi-|O-W|'86aK Z.-t0sK҉x] Ğ(Q3rOa:=k 2M `~ sF;K@/fiA bOHŮtZUo8:J9Jm[0u,n$R, cnӘ[8t=+<[D-G@*kN 4WT9Nu1N"Wufql:Xk͌Eet]h%HehceQTE9t-!H"HC_>1Zi/]@'l  l{@2}n:Lgnθ@."/9vJabf:ʘxJC mS <=p+ >Lbw;sc7iEXLNw[[V%_慰NBf0a P*hia5ϗe- q>X6ZǰD5fa *=Two,޿jW9ʼ֮#Ya0/p>戩gjy%h9n(oj3IF9BɾVwCE$g.*:<;~aaV89E;[hGI.G"2bSl< +q\r׺3ʗت;XY03]XIH7)Fn @`5E[ |rˆsdA;Y:-.L36NrŢ@ JVh hJTXw׃ʐ-:ԔHw3 3IXeVtC@|.pi9+}&GFB3'U8wktئE0>_npkN)$ 'ݰ;p]șgjz"fnB~O\jSʙaRATstct {w]Q.ӻNbɄSyz+tjyb35F@wϫ4Xb?Oz4{*72ֵ&|u4 yP':EneuH[Utl‚F_ܞbPS7FIR_m̝ö ^?\1.̤M: vXDrz-ge~$d( ʶT(HadwƈaXo0mPK{km`fP=w' u]KV"M!Qf_5e/@ v @ݢ.70S98 (DLsM,ʹ`Y!4_JfJڑhuZ!iJX>LK{!#'$4KވҲ(ќ/k8B%zWK񩰿K &Mxs9"ӸX÷šXN8q&[xK(!P,`Ԥ0TZUE&) ~#$%Iz #\g9$z@kSa5rBn!_Z,`5:Gu^INY!}58n|el 3EIwٔuHme=7M':r5xQf_nj zWEgp"c@=d.c&X ߳!5=hII9\.s*LkQAj_@^ 5w”P'I|9~(Qv(}/?L!j9YD-ߞ: ExÍH2tUx/hUB)WG]SfSkCmRcZV?4$RJ`YJO\\-}^4WBuc- '.\4z`yw DuSGmvp* V;:1eJ0?X9w|ZQljg~>O\PBoܣ#|_+`e*]Ͳ^;BJ|_.VF!q{\=nXn=eue.pc ,oS{ ɤTm~MXXKrMm[$xiWz{~bcBazneO6ӂ*1ĸ!0⟣E`s}6K|*GBeݭvk?-H*?@l_կ#.V 1lr!aY\W4VoIȐH/q.L?ӜBWbWڑ{8<E36mxÊJ"EU1#+V" Y/@$!W/]+*! 79Of7'  G$d$w#;|g7׊|5Ok]O,zAQI Ԣg^z6Wh[ }WB&o`lm$*ޙO%B Z|0Hl];:6kΣ ^#,g18S,pbl|tJ}>wVex4U:hr) 61H@`3F6nrۇ_;E1.&zjFd`q(ӯ=L=!"V/[8+#[RG CExoJ%*y}u_9K^f@`?oS">Ҭt0AѦT>ݧ[ s7E9dկ{2 tetu=AMŽ.n0DymvzcwV=K/0OEw>lu`]&LPA_^ H1{6z9ށmyx:^~PL һ&J# E߸{4\}NtN>C|hWH,j9Ӟ?V)‹5,N'ݫ+F-Oql$xrd⡗f%yy J9DŽ B_FcP$:JpZ': T0 1? 1&{9J9: N:Nh ̠ EL1Y,:xRX{ɴ\:L>I Qr镎`ܭmHz|C?3F:3h䥦"AJ峗 UW|r$*e?o%D#oE ϔ:Q>Խ OoV+ 2W8Cg2OLhlk3K<AXŁM4d [k>i*F-4\bv?E,]̤%`}y[)G rKkWmS1EKh'AзV9h;_{-tɏ)"=-uȻ;i pPt肙- d_,w䉽zSN` wȒ[]q$t׺M0LVו`;^^gG6C q3.^NmN+FYk?'<}K7XBUWe^ϾFJ_Y EX݄|]L/?ax~ָ@T:l"4`( %qz4c][P2U =d6ireԽ.,Z\w]䫷C kҊMwbEVf14ߑqX g44F3 7X(; 5elO8F{ E-eU) t Ta |)q=^+kVj˥ &=ۂF8yI%{Gd#$ ?e`= TZoߠlvq LD_!7\&Lz3:^Et(ZH0 v/o;bpS]_i {W:$g/*\tԒ?Gścd+q:&zlb[xfbN$* N kW7ŞТ7 Nr~i:/ l7qD{BOyFkAi/ԕcFcSC}&-^$ad \RxaMÑ ط35/%F-FXc )%r IF:i#}6E\vDQn|| +wrխet8,4Z.IkknF:/W?wy)<#ͭɈݡ 88pWXtJ,j9Bv咞et{(Ű W9 }H4}4}uK !kNBWkoJd3[e4y'twae\E\|Qnj#o1D$A6Giٱ1ڶt!pumj%3\;q>sY.<"XUt)rӓ3DVi/oy.֞l ;yVLk+_$vY~3p6'h#mB>LG*1%tL,P49Jtq[U#( &"f֖_Sva^N:<ߟq95qAxY3$@d r. aup&PiY51A'q'h8 p11^[ حk"Vs&i!mU=8Ҭa[Ӊ3aunAۍZ[\G_US@@SUI}ZF5G.RŸebI@UGQcpD9T)GQW7{msdH`YBB Sb@ᥐo6 <,9ܬAWס ݏܙq6;lr(XzF#; 1_6}ܫ`&e~dri[0vJĽ>VL2G}b SA[M3>ۘ=BC ʝQZ\"7*{t Gc8mKݞ- /}=3/̃p&(Nx/mGܬ.pzW,4 ><= K*dvN!nUQEOw>uF`|h m@69}mSA& Mi'b&覢GHg&(/&y\ 6bk{CqMW<׭8͌}CĊ!̓jtEUz#Еǐ!%rjm=pceݾ% nTZ5HԻtt7V ,0hՓ|PR;wĢKK`jH烀RZo=G 6n~K^[j;`2]tkDSm!]$캡~Ez`ID!k*-$Hv eȥUb kAAǸ@^kxvzGVFD}eg`n8[8y?7o<دCP&>bToTMd4TƩ1˷jZXO+<2+YQ&jn*O+:: g{$~7 K!_}|m~P̱k$NͱG3 ;DLtZz<3hJWc`i%&1&}b>,bL4 z7ر 3.jRHÚ+<&iս2}3_%ΓT,qdڊ j%.>d ϡsbakJI9'?rh_3#`%va|Fy8A]1ih>Sߊtf>R o- > >Xߢ2s*IrmUH+St Apf |RF}8hЀ 'RaX`a8ABƾJK. QgYBѕlŜ 3zWq2Vȿ:Ζxχ\,L$: HX:MΑb?M_N*!.,S8Vڿ U:TR2;یfv1M24Fp}A2E^^,fWs64z<-D6:Wȫ $v*29Dr#8>5Io.dwVV-j_;xw`h8 ֶ<6#V6e[KÝ~X$Gr䥅6X&˜Ś3n9H [*VBcSA]p0ʶ]F%sɕj =E1xJvS@-AgʃC![xZȼ}1ݱ6TF=7 QiN*j|MeT@iQ3x7N%XZ˦bM>NƩca`vJ%atg0L؆:z[X "Js{8$ @"^>hԮ/S.xD S/.x*7$Ίr H%HI\鑡{;JMV*k{ʱOLwo (_WtGՃjD^?aaeǠx2""vѐ2DzMMRı6 2,S'\3H H:SXg<QÚf)$]!F=~;"~ ?sr?-0)ɨDD<.8Cc,#03mnp׻W RxR! /qMٖdZs 75H?)hw+#A2$8Sk_+NQPQrfBX>!f1x z!.PD 7ei8/}z I?gBn|VGS{R J@=O7T%fnc;O-7T&?$Y5V2ˀ~y{@\MN*"!'/Pwm*hAx#6@_,_ iptI!w_ʗ&ab^Qܭι ^!?I&ѽo[|0@$ŅPp-Y."K9g{t+~ZH7P b.AszGoȆ'tN+D+!~A&%q{xS;n<ҥq~!'pjzSAZͫ Uf=Zv't'T6T>V" -ڼ3Nc^F*nYvoR[b ^=V#o,:&bp{(ь[Pf|s}*BK,׈qqy)kLmXpR~KDu[ BrRTV>]G) Rj3`BE$LeT&'$0pfoLHPTxU,XF5 DݸuaZ ÊſrDyCv(`H,YCxyMoNpwGQHliݞ\3@29ȻL~Wq"pϽb:w^j={[25HyhhRA'lhЖzYR$*? Oe^QP{j|\w??oE"k$ZAZ"1G7Ͷ>`P6oN*첖a`Z ᑹ4[-+j:t$[&l0.fp!k4Dg7_i?3`|Rpƽ6[H kzx4v+o(;!OI=1_X йֳ]ֿ+_A]*(ah'bVHЏvEv_4bzr )⿉: 8dz Qdm+$"OC0%] 34)8RtN [L0 `M>TW[L5o*Մ™ \ {#q|8p C=:*ٰy[>|_gI蝒] g㋦xIW0:?wN.4|mʀ_´ij%B"ciPp~G٨+eܽ~@+r4 ߥ68hSCKw*{wHOYxG蹥܇; M1M =+0"FVY$vrE+XE2g@zGGHo)kMڿ.o3$$f]8{JKLDjZƮD'RQilF"+Ua]q9㦅F6ii܇OA#B]4 ;Jy%wΈ^1:œLQEpvߣ%g"y#C~R9/&*#@<^J<8[(~by+mM;ԫR};1S옘`^-A.=kug8f/f+(Teĕuq F*A휼mR\,GKFjEA18<>?A nLkFөpp~Y&O\g[CfqT}Zo?j;4:lkcטl[6/hPw~/}l^( ަ\}P ~{CYS|.?F9MU2{rxCqcVz}e5J4a6ohwщ$$(hes $u>.B}K>:r(m?Q&O\bznʯ0x}qЀ~ރU {4#'m_9UNB!3= {a^7} |]P3?6V{^E !yZ{Cg=  OOc{fN5v )2QS<_N)m7dKӒ-vb*3~JNd.Nԫށ]pr0q h7}PkK@wlemaT=ƐH Hbh_DkRjV8b?Xr5]r12H$J+Z<]!cJ PIbmF0iwϓ\bS6P>;|{ܳ[@dma=~A&񽈭:6e8a_s@& ,X hK.DZ)a0!Yu7GYO1z7q]k,>ް;NaW[쳈b~VTve0ኒK CgPb9 9{5d R낿C,`d; ;P`I7 ^RPnKR`+SC1x)Ul9`t5Bg5I ,Chm~: i#6nԼå',&ls 4/ ձ޼\B@w}."I>a ӲGaun{|y֩bYrOy9@æuA`cMb`k:f6ENsrGjxAgQYWg# j8A[i@42&Kj;_R)7rmV[C5WGj()4,s@r=tûjz{eOGV0uXd"JOY'꽚[g\1Vnb_O_Ye|\O?YLJ jOD()C37#:ZH[+OqGVZv2oQŌOIk3*t~>]R 䀽ԑՏFtXWDc>Ÿ\f ~`67c?$Nkp9g`A*Ovp#NԒ"JYڨw0uXQss!˄F ;iDn0:a>;exe/]bs>N>e ب2IJȩA%l~=n.4x gb4o*LR@h:a G!$ Gq -+g }/M]2Pi~X^)iA2>^W'Bkn1c3b 1 Qp=1hpC S\\ M*!͚DuȑvX[nƖ*{>[e3ߧ6I߭3\C0,w0'C Ӊ{33 w.GvVv+D9xU(8O/61حY6Z!;A$!ϔk)Vޔ\mu!^G9)QgjFTkdTW*f:i!O ߪ/n^  KNUsvTǗ.IЮh_sqZw@|EKEnS1ܜSK7?燌SA-PgsY(@vNh2^h+%GD jE/P0GE{Rm3㟇j/ ZrvOv* `xn\8K쩰P 1AY:W[LE{r!1@יA8.À5Rh 1[,789#Gz36rczMDs8x{ q"T+v-%`2XFCHKxqv'exOu0iyc1R[e p<'|栲L6h@psރ}&:)8;:沌hal[M{+$P&sճ]~\Գ/RPO.uATE67Qyzt.9'qo ŔNm\ cp,-J+{!'PWvKmAek C|5 /Ӻv_}A2WhP.MMg<3d$mT(_(ѝߥ3ui[[ʰOtAܬ+ʢx"!6g&͠1۩@r5ն !$[JGm8ٕ E!I߄=CJKW-w`]}QЫ3Mzm_zGmS9۫ 8ā uB˦ҝ58?`ؑB;n  7p 7!Y=YxEV}S0o/B׺ɱ;xw,TL~.YK.} FwBnS_"|$1j9ā<(L5$5[k"| Bcx)䀱ivk%\RfͰ29x%[ȭs&j~ܬ`,T Oxq %K(IPyla[w]`<φ4;͏gj70ЛMCG5`'_YB# G㒦^yqh04RHTJ++}<`aK/#>=X$99 7 zO{~.kI/hJeT7۸ic˛ƑXBS#s%y5e'~J# r4@guU)$<ٖEf E|./!_Vɿt:@SR3#h>+/ĿpT8}M9{üMrPoɵ¨ۨsW2d_tE9KK῰.ݚ~yNq 7r9B#콾QA˄4ĒHE V va /g=Q61mjҕXY~qЧ_ÅҟN%`[uB/zs(Ef$:ʞ0efmd|(+_jJ{du<>z0הђnِ8NP}`P H-z ՗ X"F[RT7J \dLTRY;v&H!I_&w厁i%տ@fCQjXmW1{ E%ۦamqmQɹjomG4%6FV'R"") lZS%x;X+`^[qա\]WA >SҮs퓅bI0C~:=tw𐧃 MڕD Uq->Gμ8`%)H¦C8.Wc9:@@.NJ}k͊iy՝p!.>k `BhE߱u.4@nPUؐs 3ѲYԙ5{7(.h/ NF<{Qi8,Yq+.-U}uEn )xwn.̷Y0b1o_֏;h]2@<b*n4)g7 lʊ162z{3P[Н'aYM&x;C0罂_AY ۽ef]")ϐfn(MQl&2\2s˴2V =z.=q ar( E= fBv'GN9%@cLkF`0a?_nV_ B^z&lxu|W(H B˴睶y1>'bbw4SXƝ}.ZbF}Ē4WG,$-Zht|R~c:ϯɑGq-̎Jt+dH\MAxk=ci?ٮݛK]b#:='(1žT4j\sVFs2 Y-yX_k/*H$C ̨&"j+&/6 ֌2jH4Ʌ6< u9nPŒ~+U@BGEZ~{ۼ9W#6$u1䪳wDin^**\Owiګ8$i/|ȾU.sĈn=p99SQ q'}߆@%ys9|?1x$&XSQ0'8j$XvO0G&^:\ ϓ}LB#eX;/=Go.jnr ^Qɹ uFmquY(}B0iV;縷ېʼnԷniOfi:%}d1TfQE#E,a3Z ?rau2āHPBʟh['eO}.18wV7Q>H$+;@g4V}λq`Q-#6QLG:r8C &sAS-V(63 H$u]E-dҦp5>-*=HZ4)'/?J~7lHt|P@ #3$ǘu* 6c1w{7 uȿ~My3UeAX#/#ShBђ. }Wk,I-GlIЎ(AQ + Wd%k^ԁj) v9C9擴l9֥5LjM2ٚxEhB6xho.Md?&١N/lX)녈Q?xw^}PNñBNs}e>xZp:WnO`{eA(i;0Vz$pjUZN RX`xͬM=dG{m>|cN]X֘Iq}VD@=h|}ar iH`{h9N xO=oO _& nǢ܀ OۇQ|)/t>X"?YMJa4^y0__SBMuP k=t[TqZK'ТPݎa,Ae;Y)fa!<`e‚!@DtUA[ݻD/vWiUq)O! J&ZR1 UakJ)v>ۨbR$3A@Ӊ@=7Wu_'%j ~fTmG\`~.v|H0*Ȥ$ 'Q)3x7&طfxW#լ<L5e%=W(W? d Ac6s?@~ ː. J?hǻQ5lJJ{rSW4찬V9`~rT%xTd8G?6[)XtuR@Yg+UR2{-pl٠>ӎ~64|ױqsPՀk3x- HdK_*"7*xY_r)M%fOϣG5Eq~̻/O(+,c UP>n6u{%H%6sW[NOfB_Ax97PpŌ~L28zyBܼb!VBZF;Dio/"3Ir^˶u tIنؒ*{TidSq ﺋēk(E,p.ij[O|:cV*fZx KfB#<57C[эk0an.UZ}ǡ J)STW`,H=SHi*H~$ee sP\Hhu\N{** IAS!Co|6 XybǰU] u=Y:0%vOgfh!ucUYGnbUcT4[T"dKLhiY=[3?¯wkƟ럼J=⭂}nC^H^Y&xW>,j,ƿ XkG5_ooj]^c'JNf1@QuM}讒(,wU„C{]O%JDG U#T':VDÚB{bn ̃QS$\ۄ2<B/c35.ˆ[rf~n=!Rs9y4CWȌDY`%P#-\}SLgjKcFVc o|wi7я*|>(¡L )sDEg@o$KRAa⵾AS'N9r94DtO~Ƴ}>L yq>ܧ2WUakQ9gO ;w):VjE,b@=Ƌ^sbA:dc+ ]lh=:]soNAIpQ,R7I">#n=ܟDpI^EjQc0L-[bO|muVI!B{ദ[6j#C !K><1K-f3[++ȍ9N;P#l~ܤvYNW͔ T^7([l%B~yMd[%@' 7)8)ȵ 8hB6@`|Bf?99θ/4n- O- Na0a$ MB&G8.eˣ0˲Zby2]& mR؅T*e7>@S<{;8q9Is(r3t$9>}&?6w<+,q(Gߤ!FFfk,\,|"nA2b1?ẖ P0!RTf8-"2abā_~xB@i9A mPV!#0/ W~P e#6IY+C9:*\,:I<>O[B9sKBĉz3HG/Ia7vwʂ*kum/\+#g)Q⹖^[&k[Gꛙ-hid>O1"WE5<6dbO Ģh#vvSmbPſ,gO25uOz+vbӔm֮7D* vZ2`j'9i![8.615ok^huGr~^IAna??-_r!tsu̒l뽩͉yA]i;ES靤A+Wh19^@[D6A>ㇶyb B{p9ξYe-v[GaNϯi~g6V[23C\C8?q' s++nP;XZMD\V,# VuU2  .m?4?~ ?;w %ƌ2 3AA<ΑAJޙ)ij;>AL?[IRm> H~} //vow ]z$W{gS`,\}¬2QQLGKp.T[cOiaF$!a5+4[ bkҟ>= V=A0r3R}-!}(N{ݿ8NDjW$(2L&VJ\V0 }5hLբ3o^u9ߧ>!1 u滖^V(}SzVcQg!eZGWIt}o1KW:geob:mςI(CP:wZD[!-cBYa Ǔmg9osٝ|^"!'qJX5|q N!̐k@(}#Bh<̍oNJ050zbt渠(˜UɅ'L>" (75Bb#\w\ҊOf9o^2H\'li距PvO}]* SˌMn*S$Oj[<| gg\>WTk0́XlBA1] ȅF󱲷/(@ؽiBN4g\͈#y/ELB܁@x'(@X%Ͱ).9s!DpᢙUSPNl(AE gl@͖#шWbqj'&hS{fbTr8C2qop9̖Z8˵9[8`>hnGUcIa2M0ʕ#l^<ꤣd֟G[ T&Ʊփ::E(J0))hn&/b0WRRIdGc 5/ `ToLop~(]%8W#H\O_=-UOS@@hc4br,p " v`iċ[P4>oo j84TžI-$6_-F(ekp3NT4[FS3 C;*,ʈ.F A& }k=Hט}\D/wF4G7;>V`ݳJGD e̼դc^g+z!淚nc UXdfgTPd8H\ 8(ƈI-X0[d"n街~g)L"53"U kx:K1͸N& 1ʃ&sIL>r-ٞs~ H;?qmWw [#}gd+|ApY[؟6dztݷ1st QOPJ\-~ `jwc5}3b0>gIѵP:Hn[K;2amHt~8P`1,BMyoF(q"=?o|ؙl|ľa6^L+uGj'ޤL68Vfo F[B;;KP'b<]v ,Lu+v5X/W3u+]k)w_eye "ЂOv8Jۛ҃w>xK cuL"9\ɑc41v|q  !ݵo=V`^5PΒ2+oɮHsĞ~S3'Ҿf!t8uD`_AwЪg brG 8SmZ@TT4SOæ`T8; ]&pqq& *NxtocRa.3_ -G;ctK(unvhNܡ<,a^JFJWi Z{F,BYac#F7.Pz "Wx&I-ܛh@7驤`}H߷+ ,J@/)- 9WL yF8*=rm$T6(e@3j ) QwsOdbf(]֮pzIZ㝀3Π" O3(g$/#=T,BXCu*fRL+ k@u* #vmH{c+ 6ގ..Ts7=΂q؟eD^yBt3e-5Cxu[ Y- òf2Vn1$Je 78dYv6̵08nsj]@`:`!!+S:ˊ({6f$3 >SsJ|c<٠nX1wk0\^־=X-_ē{ƄNg`P8]ZٸI|BS:6l`eς ʪsWv%Ÿ׶M>bmá f`.Iu=8dfVcZQwϲ9/Rf*"ҢVy`uv%tB vD 79"<6OLcy59&@92!5qy+ \l,$:Q++,)NXJ"fzCAGw4}J(vGg~{ѫ!$p Fq䑲w+5CxE( FAu'<<3&_F*.|l"TG&;QٵCK/k-luI?lBna; \ Em8v #}TV3:tmL"A/ן`]}޿OIŋc# ҕp'L[h 8H˛ )j`15 {4&a SZSi jĩmlF1[[(dݾ?T2Rv,360qiXKfdd"B6W8)fL1Q:;9~{{te&(ʹ483T5T9ծBjR{]8E"F[tY){BNotqkI#UH#BFE<07`Q94ƕ ̓&A )Q>s`|DmB)A*!+H%ƇA)@#gㅔ&*FTdQ`J;BOkp@ E8dէo߻i 0kZGaKСڣM㋺8gq;o~?ˮaQN,!vQ/V۶gV)* y4V_rGO,QMf&uprSXIRm{#$yCyƀg[ӒX$,K`<=!HAP'b禰g7sY2'al%rqBDs|x~O\|n/A2 bG@lQeEZ,5ɗbi}c7X+Vɮ~<8oPA%37J Q[ %S6ppJ1*ܳ^陉u: |}P@<=b*(+B0`\f""+R x{H>mRQ^&3>PAi6ź*@mViu<3@hHn$WjyՌ /zRSua ;'`v*{mp.RJ:ϖa=7H 7}iQgRʓq}rnt{te-ټ]׹ cڐv}tD S&OV)dE|GpUb[{z%0$ۃ00PpLNL!e(B:{-Cݸ >B,dR: ~ߗq) 6zd#C@T͕,_X9+n^i4 e%WlxJ4ɅDEqă8u-˭Hit ;8JEgRFʲ뵈8]gNWrwN*W NqS Ix7vG:eі7$bKS&uE̸}lB[9Cga>.ADm2׵>ӫ;ܘuSO TUL鹬 X0h?儦=H4eO{ZGӁ+pV"aO\YuH54 }\:1u̵^h+EŒKgSMHvJ[+=!>m;VG?OpN?W![`R`-Z #:+j)գ?b,Ks[{8&sEm?}x 3 ai7K7f\-ƌ, Hwr>cHԵ r#RA>Ԧ @O#݊Ya t:*wF*Z(`Y&#+/ Ec8'BícS0OLi#1ls nL'LŸrO s#CLjA8EQbѐ ˆn.F:2)H9;ތb'r]c@6!- ӅQ~*I1:I> mpQ谎dO&1`F&c dD<^/bFx1#FB|&,+@(USͼYc-F`ˆmVxdu,?|lAu|@``g1@F1Z@=$^;]cb36-#;omTOSY_N`n%%2Apы_P_-nEsДJDQMh0}"թ=ʒy-`[ [-Qz֣B >NR7%BNlitۗ H7.tOMOTD2$yũ<* H>$ݷ4ΧFG[lh))FlvNP"z j3w$7}6PTۓ JDp,e ft4jLo'Mo$6>~|-**mY|EY;HJ#PVC᫽] T1. (AR|a+8;U3^AAH Wh6o p#l/f(2xhV O4 abLqΚĹvO28Ym8?27M{o[*[XWoWl8fcC}KhDc&6avO{?[5?9`Maãtj{GoT)+BeQ9pNU^#6D}u g%lM!:hj5 ab_C9P镵 7 @EXD=Lf$pg#L>G$o` wplO ͺkA )Ʉ P(~wwd}VC)XzU;a#zX]Ra)\_4Xㅻ㾚fiEVFQ=nh|=Aϯ3⯫Dftm;*^X/P3^N>ԣ\NFeX!y;@#=U}Z7ܬ8*&h+`n Jl yU8=PdDmMbN5gHի v!Y6^<<;];漼gU@M\<'/L0JSgW j|/pYh 5apHTJ^+Bt-1RNNWud-j+|܊ ҞOP~bX'}}N!OӁIOF>3}L/ʘk'ZVSTobSZI=/TM;A@y<(#w.s9r5ojs|[U[;%4( 7J8^L̼p_$'Gf8Y%wZk&VB^E%qJN3IB Y3]фfD+Ѓ awSA7JsS~P ՜n MuS̄)Z`]B7$jf^hӠk]8=YbI=kԱ+y,LJXl "#36W̶=bT'0"[@,yປ(?֤-q_e= PQT''v` 38O1?ibYc [ @D"4j _vk[}GԈ2IeFYy9eLxU#"PnK+FLR@!f<jq2*yV ,_r؃{8IzVDdN~rE{Cz>^V d|@tI9YϤ~E`o"Wr;Kwq`t>u̕+![e>A3g֖Hf_346㴸5(H\VtĦuhrԢnkC@  eMӢD,, sԾoz*&8=Ҩc(QȜ6Gm\5n8Zf7/r7m J{kMZjKo 7pKO,XDȒB+0TNcIBfȰW wDp;'6,w_}Gid@6.,ާ-ntpH<-o"20p ¢RG'Yi| ,O[a\^XGwpK [z'~ކ$ȤNF~]wSs~>Cw֏a.#tI46+vN/ -"23kZ1"UϯO3>嶼J/JZ@]0˷mp^( AN~c/{FM߿VqSirYRMV b:<6zEq0"f}Qt0'7>ۜ2|rnQw姗68xՊbm[}| ,Y={Tӗyby}M.2Rn{Ba/`?[ .EX`p>}z~sfSqѳ!GFbjYF$_~⋉nWҡ<1 jU1! .QP܋w@'_6ԙtksP#!L&Q*^eVxPkß^e봸vѠ7&q| I啿Fϭx:y>1cUtSܸ~d~1}d0.3űd{s9͹p(.`Q-q$ڻ)S7_3|Rg3"07d& ^Bp|UTԑQ>Tn>'>C<3Ax8cngyZ#=atD;! !P^csJzzSK\PAn0Qv4lFj:;|[Q}8sFЍ.7eo=^7Ju8xdD g1]jH@̊,ϞdڻܜL gPaձtqvj c;@Czڱ*hK,#6=w^^i ʡaQWvJ얰1͕gJ_?nSW]Ն_ £'-UA$;p,^aNAjl$#Z.jc^Qfc@pU(o6H c+ARoLtpD/_rI@lKm[|ݙGcs ZizWg:8j7jm _,٪9>9.g>jj"8$(LJ燬t+oxa,ɃvJxFalD_U^9o/⨡>9𯁷8tI{7>mXm:Jd+@+5@=Z5+/Ikw'(Xkv\4!oJJf=\j^ٚ |E*G_ALѲ` %-Nb̀H:Ed7~yܯ 5wHk579 |ExP U\"xV37Ya Bsg- #B1{y Wj@:i󵊿k]i肥uX%QFfXps@!l.3;,jam.ca#SX'_T?pl:r~9\NQ\E|ZeWm@櫆!M D:W.vt0/yJjb\ ΫbRKϔԖDٯr}{:9/>m#Ħ)깄H+ȃՂelߩ<@տ‹0{K Oˬ`НV*]yiu 4Ydeum=椘~2,ٻ:{Ds 7r;߼^ֆf(g\!o&¸I-W:%*0uDO&5:)Z`#H&Ll;E ڂɚ2 &\Jb\ET5. i+~\-/8>S_rI/1/~#mlnhF/9g_UUl6!g #dwT\zW=&,1tYPnGRxG??#HD:-Ö6xOOyw!&5R[ 96PtW"mj-b+RBV5CŹA)+Y^ E.grTAJݬJHB*iib XYOVŷ=+xq,Aa]1:>dKT2bH+U"q?I]L!$n8<-k ިމb_7}dNՕ/f~Zo?ɓ.31aG֓H`C8y5CabywFWɣZit.|;A=[捧R!!cн#`Vy;[ STh!$Y;/+&|fPgƟM$?fÃQzT7ԻrF,EKNS "m(K$'vh|"bਸ਼\$m K}:G2Q?.'Om/S #䁽4Xw8 Һ523wѕ_ޢP_j2 ĄN7CvX85ͽ& dc2 Q45tc}E|{BfI!g:pFqyۼKۭ!ƻtƓ uˮ >p t  n;e\YKU%J>; vUVij(4`~=Hd>*-wkRPrm^l)ׂu F+ b^d] GKPhne0Uj::"A3~R wc?AE8R"\l\<4gA_F4"p˸>x o0w]e >+ `}Fn⾨#t?i @(ϛ3s=M/M z-L z&EMR>:dzW I{Ty GdZWW}V&јbLq|:k 05ߙp}j0̪V41_Y,j}(Od 4dYB .kU1}2 N"{5Jb__^+8Bݚ 1>YJ0_,!hFRrw)'2#:Q5e׿V#QVY|߾#;v˧}[ivQCSm%R4: +g-\>'Eðslv˜rU a fK»($s9!;[Z37? 4[X_²`4g@L""ݨgYO|dԏF*:mWNJ{]TXrs% ۸EWFNRq I?18!"*%օ<䭖ϕl̜F4_@Һ"ZrraNG6oWZȅ|׬ u k F DGdx M> .hųBDJGhQ_ Ī C.ڮ4ڛ{& ii&Aϧ FmZ0ZZ'ǦDULHjV-uaU8p bqGb63K7(}u[Kdl`jLsE},<`&ǟ&̃x{F⛟t6{/2)>rhoNρ̩zx0ÚZ{)2۞B9=)_Rm8*%V{ dg06?TVĥ;N-=D<-_R%ɗ[l>MSoFKh/K~|dk##;)//_4@okS$5* *|S嬞=yq{r],TSV-ngMp](Ȩz̪#;^xϰ3ls-?P[f9"30{0ؿax5 s9%N0yK=,p`=QKI>3\hlW!)k,:R'(Y{4z¯-J"ul$N\#Jh Z>gxYkݝmq˥)!HhU&2\Z~ ݆6`+dU+뮥wf|l.ݾWlqzZw~v32CZVhΐ63McwHWuH1ߏ8"~7$GY9*峡]b Lo(j%\wQP;&__QY] Trd~aycY%N{w Lf@qPaRp zK1< &ެnLB-GvU˞;VH“X!/+}{ TdrI} .zE%<Esr}t$n)+5K-ub!kgx_x\ P,cHY;#@[WF ٲ ɯXEy}^j+hm@4K6/M_I."ׇPUq(QRs>5uU\[zg3nLȭGoY=u&qZ&Ef3((1_dc-j e]CMD76wtyУAHw$|gxsWKxޓb ȃ#:|GeJFWv_"eohuFU/_ǬèkfO /m'4wJKl7`VN0{FBcyT|hn hHn& Xm~1.N^-&EYYpoQ+T6Q]o# pLV1˔2thjHzDCe;8?z(j!e[ڦF+%s]%64~hπ;Hh2]RҌ`𞻮dƾ"Ûu08ةeނb64ǝ7-e=eZ>Z@gesD *W\s ;[`(ፙuQUCN;ķ;bR@WDvG$=Q1Jǃ302@^ޫEi}uހx +``cZD_f_50Lvphkr\d0/˵ Kƈ⡒U! \,9M+pN,$ɶ$(x:Uo$)\Qf%LKEm1zkCa‚InڲxhZ+.; pĄk )c t7uPcct,P3AVqDJ!b|6'o^)/}3-(Is"ȵ@~|p"ӣ lXz{nyj $ԥܼmZs.5uO$BPsx`ԏ+rs.x1w 0r?psKL"'?g榧wؘmUw1~Mm. q62%5upKC>t y޵QqÑST,_A5!] 9C`(x<id[ZDPVɍX8ŇpFA6z2PUeiL:u0b苑COTHg>d-&Ol,>u16/H;7^3_ n-}^)wOD txK}lI_sv3 u,nUr6@fkы֝Y%:6+9 XfSC@DMxf`;J5.T;ToVh=' :* pVGl=҆]#[$RWhm_i_RN,D-Kǹ~Z ӻ߯P1o .6s@0&$2KQl5Lݖ&)(Z_[&DAS2.1 ]~TP?Wjc'F,B'@%)#u`D1m[nNEb*v #6+{O (\ua;|qRlݗB-A0ioC:DyƆ9%JGi +!* [W⎞3 6ͱ%󉶁]&pHQ͟v4#v^7@E3.Hd{Y -ntwYՀBE{hX%9 t=ʖ\KW9=)w< &q4?jnǵ`-1FW?7L;JeP"f1ކDy'yH)~C@*|cps $ a:, 0Rvwt&ZI<ϭكhDsWw4i"Iw5 KX!йEOJvBk*53,=7Bltuj{a(~@!d Vo;mZhuto&",Lvr3z #(_8a"YGJ1lm pJPvN)hn0"[ĵFoG>P|c9j&^ n]֧t+9bʙ <:έy2Q0/Z{fФx{O Ww{L_N\d rR7O=utm'oҟ NWTq>Hq be_&5 |ڟg| 0ʞ>>m/NE;Q[R?";4t_cDbM#=Dh5M7VrqB'()WebK3jp87e90Jznp-b'0t q`j p-,.~Hrxc9C7T,=A4RP_|PĞeZB*v[m5 (G~ ͉k)rQq~C7(iE+R~#,ƜUU\R6&Qij&l;*L諷W8`^.U l+ӺXU-zr6$`H4>}F&DZ3?xLv1 5g5\ғzqu7dە/[k!SWn ;4wZ^~eLCo<[e,BHK0+3aO+[۶#&P1&7 QhV$#%ρ ^m+]JZV,c#}{MytP>y>"5VT.0vC M;(*o6P,+%{A/XIf\+;$*^F2FVYKf,9֍0xyHȜ&hO ]կ?lFd+c޴tEgcKmEv2 tZMB;gc^ZjBF* IX}g "K(+Dyr3oaL,_;&| k7Q0M$`ʀ!1% ËD鞧;J'߇6}ί\pR,:Aք k-huOHmdG#Hcʀ]EOl,Sz@2^ABQ̾jKs6UfA堹S⅍OQ;6$Oq\+-+7Q>Vf98 $uxxiע}hi1M sTPygJ- ?ֳ}]xtrW[D/,GwԊzX%`\..ΟÞ=U!;) uNX^Fl/BڬZzGyE9J*lͦLY"HR8Vu'cM &MfYမu/v?pI>xW/cD&͘M/Ee|W,2eBjT)"JȚ2$ԀK*;?|%HT2,Pxv >Ί/v=|:8~=e*yO3xPPCȣ`._KC5Eih/٪ٚ+AoY);H-iF4,Fw/[5f)d ^&fCq*)gEwUјtl~tW` +M )7Kʦkp9)m^3yNHbRn ;vH *m8<+ s;nj_`#Y9[5K=E[*S,U#tӀN@FrbLhh+Y wS4/P;4lUk:\vAF6 +CHBjz^F&6) = (\xE b1jr7='D^2*vl5ZRs}+ Ofw^A\' N8y;_`yKT*"fF}@ca/Lm"Bw1.( )B9=>}.b]o?BV(,Q\@lphA0jfՐGMk>#Xc{c*`vf6t':bٷdѼ#rdj ⃎?6e zXd 4D:[exeΣ27f'.XPE+1'mWvoLD |B~$Óy,ݦN(vd~]p m*~,i/O7 ^3ǖfS qׁ/~=&۞umbxKؾi{0~KQsDUS%A8%liG uN.c>&B3锛1tH|שv 肸R `o쯭N"eV <ip A47/hcmCQiBDiughr]@ oҗէyÞ񒴅=͌NGZ~[}?A¨j;7Ftlg|{?=g.mSfťЯl8Լs;0k+ H/\)[8Ь3@Al8[ПfT|+՚LrV]ƔD^U'зRWI,#>:DX.XAѼ܈F"zgAmz&._>5Cnf*y!Z}w%6ӠrЋ5-y8 Ɍ p2 TKߛǒhmw.u<0\X^ _B@eAiQhB7hMqyk֏$ZzӅ ~|8fxu{([?q)7rO9[h!-/T4>h;&G_qk·9)s<A}0έ:0(Duѣb\z!ሙ{j  #!7gEj١I}3/ł/LmAԦ(c*d%oe¯<*CGӶ1钳En= $_'3-Q#>_Fx/{,R@ktMAțASs7s"j0%E161`Hm0O4W>k}ê\wX61O[t߁r'8c >}"8LGb2w2EV"07;"ů J.+\-oҳֳ2H~0+ QCМ2WV!SUu7iZ=<.9F`5B.,V`A̡!=[T-f 10!.oW#_֯j&n3 ȑz0KO<.϶,@> &F춿jIqtNt&-6,fHn`n U_sQt|ddɊjX$~9BO򐣍yOS7Doj}0Y,^gnzrJ,Y]kHf*8Q/n"Yse==N.6]n '̌QONA̶Nr+`̋&`GlOsn6A{\XD[@VGVij50ﻏ3p)*1iV" p^_.(^i.PiQv-:nڦb5]5A~U@(E}͝h}z-g4گ֝q6ڊ*2&c*znfD2/c{]Mʂ}=kz穵;]C m3X hLMnΙwC[2dL݄3|kFbDHY0fE穊w(kӯFódrEw ❷@T=0=W eP~?.viEP>jSFYTR^>sYܪξb΂ы}- D]uq+kW:e &]'X/1rt(ZC!Tis$Bab C)hlq'XKE%^K*/@d`$NMyzT3 5Eb=+>dDz , i IըQʌ 6rTGXTzcp_P5q}{g0{" ARz}׀k2,ڛ%9WӚ{|\ig01>kNuX*S^6k0^5&;^hOAݙlˋ%79,Ӆ))@2xpD:w׷\asEEyF*N(Ԭ[w>8|< QylE(y|r9~j^EB!kKx'43.SAثәOC.qgQn,X EA αe \4pD6bD^&b4(S"+c VRjGԼT~`a..Oyߕ1Ko=bS☾ɎI%I: 3kު9p ٿF\ǖB-+^4qZLQcaC)@C(~XrG4q(nTKUVk\ki:Y2vi^q^U{Ү<8&%J˥%[W&C?ݜ>E/6-Dy ,EKw|bչ@,Y :.FF去 T NأR!)HlnbRP-pSā0I20|$Z6?tDjgBdB\v!|y#MrN Zl3 ipe?-_Gf+XzO-J>(-;{2>tAb|ȹa1kV@%H֬K p)"8Q; |OU*AMjьʤrTh^)WꞘ.UF PQQ]QC)dlt7_r.,Ҍ DwAw? >#8 f^IJl}r,2Mz̧ r/⣐MJ'{}uI /X"@GQfnB#* < 1h򢕬ۅ(X(̃;Pz2r[4^&K { k^o2ѹy|iQ\._!s Pyâ42 ZphRLVF2Yr1t;ϔiFI9 3A>zP7VKx"ޏ j)߆X͞/ n3@'Jdvx:''͈t!\xWoKf<$K+ (ns4Fq%`Z`eqU)}f5wOslCiF&TvA=9Yi U!ͳ&:[upw 8)l\f/sʷ҇"=kҗJ.,扪28N zI#;][Fy4JPqAw^,пz[V_+ 0a>a秌 K|gq~] 2K:d҈%l61F9cD>i9kk-$L 'hN /Nj T/28a\~ r5:YMyJX ?RϦa0Vp൙h k72ϋB{>@i6w0tJ)\:<L徶$SK-23|Kkc^tlnXt||ċ)E]")Q6pG.UE(DpE>S^N-"-f ~7 k,yqn2w,RN6K'^Tqa8G֒(u)EAȃն(j4u\6V]FO>SA25Ob/w"8$8nOhlwp-TZ璞 37 >e͹+HV[?`{;4|1]󅐣 m{pY\r|\=Ϋ>RQ>z"sQ9lO!Т&܅=WQ e@ "o>,<t K&YZnq> N23~N "p/;/H L]BdMHe)E_xd4}JTbaøPlXFIрxne5Ւ^s E|ב:E.`%4/'x m:nH8R˪ݾt>a. fqB='Gz }g?FYedhĐ@!^w߲鶡ZtXqN4P:nsۂ*w6rNI_gy> gBNl뙣5Jb)H4_\m;&&GlY܂}c$rhZj>=iH94bN3,IR&+h`BXf6{lHXӱcHt>ꪸ<}KXiAP K! fbQT#o./m$&K_?@'"yU,i>:%#v.]|j؂q%vA o{~Q_MjS(8kңGeإ"3A)D>.f߇fɿ upq-/Ig )( ߣ"/ᬅ8?.~g#Jzjyv0s8L""d$)btԯ{c8?|A]*>#X,OZÓ/QzR>%H-&z%0=[ G6%ekuES OV5Ie05ACWt(V1Y˂]dn()%c0esW'h^32FR8= jXk4ۘg% GCt#m/k}e1Zpnإ݅T}||>?Qƒdɥ~g)Z6Näcn$ ݂ľ:<}dcOMUo^R\ `L:e޻& 9ǷL -˲M)l';(cΊkx"!9( nglҷpD1WC'#y։',bgO[,a$"J-|,.u _ mwPnJ1!`*c>5݃e3 UVz˅CjŒdR=Vpm[ /[G*c@1B[KBj&dv'Q7Ef˾CSMΦJN!m))}fA(D䏔BZ Tjr3߃+$DO/7m"n!J]GVbiz~@LmE A3-x1|ol4do8Vg"ANm/(Ad;Jz3 #]f^Y}";A2Wf7N䮞iΔk EAT8&\..a wnjoZqvY+.fw`Q܅\{Z)LXf[ԍ]! %y@,R"maAuRھ/ռ#lk^1C06ד}բÁFذbp v2Oey6Uln jXd: hThOU1/53Jw$o^FmZqKmaO0G- 1eނlhZS:iS'9|\EHk(U1c4UsVҝJgP훀p 嶦y}Zח vsoD ?0q5|En )f6sCK?[lWg]ɮ-ޑ LY9NF;eo(ΐ*K}_=[oD |&\a$@7ǎ5T(n'6+L˯R7/qn Ƅ Ϫ (-$WOhwoq7pɀw6Y@n(J%33i!iym/uU5C7rK@ۄZ4NylC8'XY6cu?yB0'KZkj̓eQhMWY9*'BnHY$1V{rSPF\q6^,p4L1@ܲxDfZ)3 o^!*Hp&IsEc#J M(X$KG"gjnʤ3;<>$)s5:hB{c<3Pcbʻo-@ _z-YG2{섈m?Fpt[s KTu`7yԦlQ>@s/&\ K\_+jɌڨ`uMӍ)cVi%v@Kzh%6*QMF6.(8Onv*?W|04r 7獛v 0֒[¯ l.X鐔y],qO@/$?wZ$>7Zj6K*XAۮ0A"Eg2qĎaMձ1[b{ihWGLǫG"ae„]; wt|lǺ |09Ilɍad() Qi0ժGZFxjEޯd@uMg۠_Vڌ$놨콎ٝYb;eLwٞ2sGa>\KkZ|I ^S[!k` ?w]2+y/3sL я (QO*>;|B]d 6 Q`dMfե =<9LjNa/B_7! 6Oq$P:Uq x-Vż֑zVП_ a\QZyyǓك(4I艑_U6ͱJm73~ch//GK]g\{?j-!UƒO7*Y-<Ջ)NbK7߲敏Z!l"뎡¥k/0P78 ۞֞ _"X+־odsn6ElR9J؁fc83Kd5 'z;_'W,fcEX]L1I7DG40 ZɬOXx@=ާ.}$b.%J/Od51pMnh*??$fu&鿜wDmEֿ愼齻J׻1MU]m/A_e`^/۪ h47Jԅ 9ޅGVs`y `@Hf.;@ 6|XV^bftq(@nQ&\11jE=ӪG1 gV}/YsK$xwT>zU&F3᮰|ՙv3˶cMg;WR]U3j)XYa9IdҦo ɣ U1\2s;tq{NB'Cգvdj +P#yV>/}f^ o*V̾oUZ%NZ]DC+ì_J6[g%mOm RɎD )bqH>Of +(j K_].񐃚O˴^X)9?&oR8=e#_l TZfP~DXg6HxPo%WWWa9u_Yai|fu9"%8!?1_UsMBػK!0kB,Gb&sU"C1id]q#o@/@C46@ZB~NqaZyj#XJvMB#Squ3Owv2GXB{YSnd+퇘bsE"C4\9?y., sykD[YFL;?_1!>7B@1k 67pt8> m^V;#ŀ\sFhxz{E{9?KmaU@ZQ=XtϞ퉥BǶځҌ5yEU8mFVȏes;:d;Uq,8%DZfTw濟;Y'c 7a"VNvMˠXN{߆Ku;;bRK.2xHDiXHd!DI(O.vx;)cL8`(W2f/C.roW_uNM  >W.%Rꈍ/\bF9w 5 Ů<͗mqn]g:\@jOOl;AD"[,:-CT]^ٿV`f^#3IaI0Յe8/YB? ="ܧO*N./3Vfqw|m fZ`xjT9.@Xcz̡p 6,+/BU&q9n:~/woVŇD&K;#Zz(z[Wa I)) i뻇JC]& lBkI.&?wZ0Ĵb*ڌnbh.7nbn*e2"]|hAkJ&~#YtшhhY,MjSiX^y}L/raJSSbJCQj%_: W֛zҲ_ݝ6uEnP7@5FG%TL^pgGYҍh Zŏc`k:#eD0:a&pH@LH5\³ .zQG,-"?Q>^Xid6psxEђCAj8@LF+C:CtPD˜Iͣb.E_qz*%9_˟'fi˴X]m  =ޜҖQ],\//B>vXm¦i)dZby͓Pq1ϥ4x*10`eƋ~pt61A_}*7De}b-yg *-EJ%}sjف gSFX_c%yVn{^F-UG=箲>^يh44Ey MʛzpgWAOgr3GfO4psm,$R&ip8z9sƑka1M=q4Cøpw 3@-͜Fi< gM-@fs`;$_:( s ~8cLstF'}./|mv#CM, n}JTg`Ґx4AL&hș>O*m:'gscxX_WUa9 p;8EuKuU3_ O~Z ǰށU?j 4sY`v-(NSI.ېd$I$j=S0okJ'f{]`E>tD;R[=#D'Q]8D؅ˁ,ESNE9443}6ʗeKlW~ӧ;ت)8,wCtnqk^:|@b D >g!<oeIVPOջ)[ɡ9 w~K&^EXl͌ F{V!$gcH*RgJ^NҏA3`pI=,{9w9,lʯY+GȟJao! +ꅘI~bpls4aJSߏ|R)`TvhF:UV랩)Ot×/301lFl'H\w$4X 9@Ğp@A%:3@$Ϗ;l:w(RtO*р{B|5:z)PX^-n#1 r|B\p*Ɏ}cH1D&bgɣ<8Yx$qa/j!gZaOo8X4sp**@õSM.'.Vő}F/8[e0OL <H/w\Օ nŖ|i|r7{:)2FG7yVuبKplpX7@b~pMQs|J]Aa}P_jS.hJ(-MJa~BPsu75ƁŌH͙zXxW^]8!;%H@q35 ٌzdĂk0TiR _$p3d(ڽ5opzPHy[o7&x4=HѮ,.=iLZhGgEO2'Q/q]B/[>}^&Xa0lPtԜ^6-a@S{ODo8n#7Kwj~]шGw8p*F1ΔS'(َKP _O ZfS"H:sw먇 ԟ^[ }!9yȆ~r5T癘BcZ9GԌTTvbXiO`A:"5V 3;&%(yl7>G26dYI6 EB`\ &z D>kYY*Mͯ)1\zB_HUK'_ÿRa8Zɻ dVJ ^oHxʖXi6y8NYaX4KVȐm&)  if)V=9'!|~M:7|T-ьP&|f61 hl͗H=p|ȈEn/*eֆBbx!LONdd=/Ude& cs_.0gN0|cR#Hxs PnN|&]@lzQp?Gf9As'tmZ'aǝn(qwoK$m>8+k]6F]"Tl:r rpHHm=G"sBVk&ƺ窙a N0kZˋD*$qmKyd>α:>V$(d +9*[}$%A_B"_{ ( 'qz{ f D`B)_RxV_h6=Ej97.XgjҪH m{u6C͘l4|Kv*Bԡ\6)ЉHMT1PZ43-3W ٲx,2tb LtŠ>ӎ~yNPe]azbbeoA$I'y{ kË?TV"CH_^nTa r_#&+HcU2؟B2DwXüOvG./<2RM?7&Vk7[cGt7|AڒKm$ܑkbU?%` v#(/Q2|(!Rx*%T #vdG\t[^5.<^%Hu(P`)JA QOΛSDw ߘht 0]ƕdu wSP?ΜeK0l9Zz&ZZC6u0M oGM@>ݚ('nQE@4דrP2!U\>%/B$F 6S/ |~4 _!57=$qBrRY9>M+eU9̠}fZ*35%m͵7uk)ԭp%4!'΍A&4Y.POd }@fW!?%5kRY ; ?Nk^JFL`O]b=f$as%@a$n S: &Y'c!=ZLmh I/ sň H‡o^9ԇT/r#3XtBP|M]`d^$TLFYiV,fUߢcMi3 K3Wr xu,mS0 gg4PO )BK&(j4] nU.To>Z&+3m e. D<3 &۠EV>+Vˈ@bAC aZlQIuvnNZbT:4W$n]o!JhʄUԚUR&!/8YEYӓ y^hSɓ0uh3y$%vӇp'2(L/T^qS8*y-}0qBx,fkǾJ{^=M";Y#k C1_BAq΄"Fg@>[^k]\' Q=4ɏ³a ck5>.e 3jENߘ|7fy2<}5J|y o2TCqfyC8kNF*fPj|~9IGw1Rݧ`L'[c}L$l'w|{ζ(FHFڸZ x*L$mα2ڡܸ b:8sYmm;wvh IV6f|0|WF8S^e|pdVm.,:ʫfslM*.em)"/U0];BO)+V@Qvg`ԆuɐC{8һ^ 涰C..Jj)\=8&M [_Eշ#ږ`-ȢdЁ{Q``'J=@%{I?[ᩭ)HB2B} ΍ҮnZ7(v/i3?R9\s(:K>UP^\"f/}8COq"+u`7M"K +w0$V_B;!w+B! 2cy[zـ3]$<s*-h|54`r qMs(J?;/&Zu? j<4Xe˲òG`3d2:\w [Yΰq%8wqZ[;}.Ӿ8W63 <+yܩ:{IS:\=dN-IwKo{d׳†Mp2BF'r}eZ6&Ҿi E 9ʰT7)|'_=7()8TCQD!fBXTߟy0@uvPC&ډ +5ep& Xh5\zf鑆Pz3V{WDm@},ZUo^%ʊI"U puwɀ3lu^ ݔuj^86.ES}dQ?zw+8K;F꥔ /Vt&7HY RcC L9蜣{)އt@7*H1Iz,Bܻ~ l:89;VR<`F~¶Y|mlB1Έz>c3Wե5hzObM?/fʳw^4|x^tPXŏ926:|Y"j "CånS.%>2ͱWRO޷ 5u Љ3Ŏ&ρDU2am(1Rȼ*0h$Eet`d[ްbsoGLmr& |$y1TmB>G 9,b2fs_8cH( G~<2( w3(Ddjg߉UåxR4ar<2%*IZӾl_>LZb"K6fJȋD M#fo._j ӆ.ghW1R߶؋U'(&4T"s^fi/RWWnҤH0z"/ tq687K@HGC>G\zPY҈\MN(PvvMysr%SDl@L;u6YCDi9a宴Z`BJs"]L{gA 6Icu¤lU}5bZPL ycU_bH7M<"J#nɸ,:Xb2'u!AVJW8|tzle!fl@%?KuFO;rf 08sp`r2NwcjBf67[$q'Dp܁$pgXsy?jH-J}B yK+d4?/Ha'fgӒ)E eP!#4(_bqi7 YU.킆` 0Ur~^f50gZ+[y)r&]Q ]9_jkiiꎺK #MDjd$ٰFemD|!$,J()uʉR'to@\y'>{ʨr2i)iކ(> TW[crbvvHL6S=|0k;D0M\I^E (TTVQbʑ8*>.!sz!n /Ǿ_)(oZ/}f:+/S(CǹgԼ8 ЌMyxqRY {nIj̀a3O!>}.hǘn仳Fl<}>O(mbNc, x&)QK<( ۏYs|4!{ŔㄉOw2?u]劾MI%5#OUyƦ/uR6޻%/jbvF8Х}΂!FŸ_P텠W=!֖E@"y+\jRDҤcz vddQ9l >]SȩK[ԶX=/1guTUIaF)?хk~ x!mPgg4"_ny''5]Ά̓ukmel$w:Doq,ӎ(̟B;[5W n۽OkȻ-W߁oL*6uH@cRS\x:H`@E`q/d<(w 69]w⻰{]<$\442)kj74q vJG)YZ!@3D,j*=Ɣxt^0^&)’3ƅAX.@J`Qza98Z8JQęL:C#"ڷ#_px`?h+|0DiIňS(5\ߐ6ZJBq𜭳('+'%%죓˰|9LlS ͌oѪG&2FO@cJ$ 5,l"tU}JqLB 9jjxMO@3W gWgDz=!ʱ'o[0$bk]RY^iYr?qXH @MVq8VXJXMg#p+,h[VI^m*, _rNBvoms9kj74]pZ=lDl%*l..nE 9FWKYGD=nyLh{ e;{i7kdeݰڤ+:S q5n%~癳D3rd {u `=ļ8qu,Y͎p{L,+zh_WW-/s': r Tzvͬ0H{ VGU" u5Vs1@Q wʲ-6'3t~xzlv%T$#d`S SDzCL1\re؀uRweV e*Fge4-v;_dʹdMeh<\+X[22q$("wTf^֟> Qmay+8!\͸S/.mh˃v|5"JCl%.mN:|tRFMkFiBF&d(C0 ."v>_dz{iĖ"6W}pMӠOJ.5BQ'xz(ɶ'7uWЉ訥9 ={a}M[0R6{z,~>^7Wruh9*Ք rKrqpRE FjV{<. ~F 7WNۍh!Zej܆`y<@G诅^1so)YZkd+p,IQc}L/F0nN6$eK}gي Ң9lyOp,N3}"3,# s[">*l&k!-fi<3/ꚩy#G:o'1KYTNw@)C\Vmk#daIMV ݟ^ni7kQBqw6͊寢gJJ5P9 }3{8|^Jڗ!rekC0+,8AԪ_6ei™}O~aAx^Á "`Rx DfW]fA@Io&u z67"m.)`oXIR48E-ugCJ *M( :0@4T'Ռ8k <ڐLrb$X9;FvD"cs< H1LAajPy;hE$(6BXq׹^n#\ pk"P>;f>+76҇jp<Ƿ> 8Փ*PI0pTj~uр<ۈ;g9d+UTm:gdtw`_7v* J$HS\X{yEbj;0t}?piA^.9бz0Ax>T *QS1/?F)o܌lqL}DVw]?!E>T|C\<:xJ&DRlX1wӪ~zoWlUݾ_U9@$V޵aAB8$- YE.¾ ץKd rc3ٸ s=#)^sfK `ۺ-qaE:G&f;K_<['PDӔ6u^V>uwL<Zu3E,8 HuC+9#3ɑ҇mXE,#P -/μ͑2XP~+XP~-R E@I*GNʤܠTXvsk=(El6 fC B"Q;e'(؃]quĆÄ\0 LƞV2՟ LyGl6ka'(xjT7Pѭɥ | e:!N$ *Iˀ5x*.~[S 7Aq&am40c  Q MMx/O8hhLVٱr.d=5L$G'#5ɶsxV _^=v0pr 8R7C'S] NܕB>{_NZ1ǿ?WL{ ?5aPK.!V?l-Q>XHjMզQjtcS_4FS#+,eŪf*yx&?w3hdD`DpLNd $t+lhu ;g< 4!x$}2&| bF$9HltLm [~; =H#TidbCC `tnQ}5wKF3|_5%Hɛ},4kr/>Ry.gIxuv=z ^9&TW&콞1 ڪl%YE|ÓoH2mfI0K1xXsũx-33ED H>Fk2o^~"ǵF2N;[K\ѥ[*t02f͢'G <1pJںV5Gx Eu)UJgȈUb]B.XxUN75ctV=[UN7KHH76t:')]zCl{f&- mr7(B|ii>gj'BlhG^qW޴GL}PV xC{rѰSh8]Ez~] ZL '$vIez`\ybFBK,z.WOܝQQJb u+A[@{̣s<IJbE3ܽp "axyڻ[|3DYH Y+'ӀqA@tA|”QA[qJ JɪQc&EPJ kf Di7F38TYJYl4RxOzCUæI bO &2f~.w -z?'4|r?1T8UkB ~g۲<һ8B_|z:M~dK'^;$,؝E&W2jd4z#o_;Ƌ]! k^v0WO4q##7j9 ҵv| 1&~3Fa<m/Ll.J? w׎|Bw'kC|ЮucGX~Xo5rHC 64țq a65%db1W&@Ƨ6`{xTaNi dJ5JOhčJa$Lo$=FiQ-ઐ除+\t,ðuJʟd]vM:62&z`( 6 :U&;,?i2}ȷ_BlFss˕+S;<6<n^4bpX c]a{Bu3\% IuHtBߠOY@/9B~v'9y}v Ougp2KhZr [h=Eڋ2.@?Uw*}J?yC&lus J{rCN5Y }Ȝlq8 h8r BvO֭VqSj"d:{#5 y?Nr\k+}U6#5ltȉeܓ`k+ {sp%`+s;qMha^_F`UG`M O\»ʡw KMy'zz#-}j@8IpT10 ̻NP|"ʧᨂd5Iq9,o4z^i]eI: nфeo]*<$sTZq%g`xϮ^/EJS0(Y-" YŶBϗWmF!d)>)+ $ZlYԊaܨ.H%h /s!-:qTn.)r /R]I)fWn!Rߑ%P5⛇%YN% ˄3:Lw9%/僌B7x>55ܓ&{O\N,-g6j|Ո@4&1DLH7yb)Ldn]hȋ:nјQ )m&P*OAB_ :7Ұ]Wb#,5̐Q.cSVO2Ŝ=6"%V2;LV?_dv_˲rD$ k#^K A_$c84 '߬ ˖)n H:Iܱ2͖feʹ/a֭;hiN$ivJ>U$ЧE}}T-DPU; ךDs#޻qaXR*sPƍm<7 bIDa/ s3vN㺺ۦ /o"gGf3wS13$5;Q q: N6fjq.6u;kJSByhNo,~ys PEb9Xs"|'I⼤36wo)-OS~{[7\ߑ`rG,^ om$ԃ,f5m9Ҏ&Hʺ,(>ߩ=%%|)"@؄q@3*!Tf20'+hɽJ-SLt k}O*7v8#5)(SS H{A[OLBJ墸~wWr,kN 'W5p8ߩpm9愂&=x 袿#ԤH Pvr\#0٠<\P6wi5GGŖLK "4u$RYFi͛PoIH*R[ᕫky|j=s0q!ې=#QCIC=w߱>jVJL-q'rdsr-R-:l9>aVb-`hnP t2wN ^q*h!Aَ(%Ch8Ur^d]#\SL*MմHshKZʠѯi#~qŎBf;`@]uEҥ9oم誅[56/]%G+le ^>vb,uWDIՖJA7^@(z/h E7+<*2^&Tu/C?e'(.$WYtaj4aIn e[M-Y$nw,Rfh.tAPӾ66cV;%3Pe>oXF.7Y_W?=߬2hqu*C0BݸPEoHSM؅C@b$[+sprاeKSXĉҹ=)pKe5=Yj$l5|Si 6ygy~?B!nK:IͳKis0y] Z58S`V'VSݥb4fk>ue\$?Jk֟h84BJPf$bJNY1`1zm^FNy+ YlbKl ”-6PK@CC]O\ i$<$puEXCSi-g7G5._RϴAwL(bIX(w=`aI}k0 Ű%V{Jq 7q#(G?<>$x+pF1fz*}3$', y;#k{?ڜJ,-viR!y lM9IM5{6Iد-S&f>PLN)[Faz+^ hw-ujن/{KM,ݲ.B#uU3NVK}7yKS Lz{qʤk>߰աoP"uߗj2L(Yi/]1D\Ҧ6rCJjC#  ~m?rTk#]9xK/ K0T:dco<7HE3ܡ4o%ɱLCf =r$Tҗ$pg6=p VX"9y}2f*<+\M?1q ZB01>ϰ D|؎_M< Kɐ`wym%4́nZodjI_Z) k"`c[`+c9TO[}^A.}k#g챑 FH= X_38=r& )ƻEȤ4u8]Qbɼ_OntV~,9xDgU leos^. ߌ\g[ b.Hf{I@WRIfMJ v&> iZtW$

*hdM2A#m2di(n"bn4ICa~{eqvOOCcdd6H clVH;暛P>JN!i]K~!'bSrR\#h`杅,*UĦQPFŀH{w' g. iJMpQ5&kGqȯmjH-V\L\_61Ewm-sP.c &(٨; To!xz/Ó{Myn>&*\!?P#Fk/؉T @yշض@z$!ci ˰1S:ډsQ_۪6 X:R^=h% rO"wp,5toOgG@а GUqqa&Ӿ#͆QzW Co^1˜s H_h,@b"ጡ5:_u8l:=s̢]quZ-V+ EcQ6>;$Y[ 3 ^5ا9?6qĉA2dSWYȧٚ>he%PS;Z _,EEӜ"T[,u[CSEunch/EՊn)gdw""'b02xaH3euvfJO0 KaM(v%6% h(tJ!o* 8>,AT5ܢYKO,|r(oGQ'` $wl.qTI;Lܸ??>p@\6US.1x =t@rv}c|@<ߤOQG)V_(=!2xfN9P\7q_8nR2Bxz`k[pg$K0;O*s AX\lo TMzGCD=KxF@iAmkyg :3Scj;?\I [+}[ #;(k=HuM_l0M'45nf.{PkN z1ҕ3)7 Wo<΋Dv>=7*>/^T<$g4ҖmZdMU`8E-PX4E5<`qs`|Um<$.1Qg+2FQtKO:w~kdv<6+>nL, vau1\(Mى>AmR6{ME1# _$9~F]E:@`V_iiżAS߷2+>lf6c7g6y?Z)wHz+`|,mltBHq 'vYv+lzCcLd<< b.{Rf9{|393idY b12E}1G/#it$rЯÈEni6xmtwhú{;S' k|O dv EZ-.x\X.bٔG'mX›t$^DT9ئŵ#%&9;i,bj9Zwm6]*9:j gf%|̿rNl9T\BňJ-ja$!q=@W,.!w8x=8[hpP]iv\?b.!K,1|mJE?y9%L*A Zuemw>r櫠BBbw!Wf]o&*YH^uo2&uFU?@Q/d ޼-hiJw݀q}D'ߢ-W+A16MbObVtaHuEBMZ QL!UDJV̡ Lj\!|և!d@I?c| u)rY􍱥$òEY^sH5tyOθ$kиQzЏ".Rb {,e$K;nz~v>db㲍 ѧE,-#aVAT╲w9VNWy 6\QnzYBN@ՖmO !iLo!dֶb(Z +kE@GYGć-p5n*=p}d4fy¬^2~yAh^9R) 3XSHtrL\c+ul&fMUޅj($zrQ-ao̓_ 7Cч{%D ཎH.鱈\1l:|.8'Mq/gV͵6r9u"f{.%JCx\&fJwɱ1zFkUc'23$`{ T! Bo]u15NizŪq,CnhpowSYƉ+5` ϧ$,<)b="Ai*ô$ '. 1=tG_{I"iN~74K.W ܔ2ɋ_ dޔ7ݶe;)YJ~V QNڏ: ӈ23=`Bm3bgLlEY~oS/6Ƿ"茓)ޘQxEańsS4gI:I)(6}幠ah~ν}ՂE]5egf_LD(5_0pOaUURz7LGjkNi6੐ԧ:fY%b\k;N%=H|b(hV]uDH [ΎJ͘hƜlým_V3>k6ҝRƇ$2r'CzBzv9$'~NHfv 7q<|>Q|OVmzԵP ƹ Zn(ڛ JݚoY4BOdW7GӿQ]Pam˗̖ѯ+6Tʞ2$1ڙ89-0yVyZ#w PMjF4 j]_γm@]3 В 6{ThdvcsJ~YY x`p?&4(` ʽa!y.x}`lTZl> Xk^\j޽6;cRhL1= @Q3zT~ѿv [xr̔e()-U1TwLe( *@DiB_~ Tң\fH"D fK 8Js߄L{V2rb]<^5c=1̹R%M^rnŴQ̽k)D[ ED]"KTry.5O{?]",Ő03T@Udܩ!z㌵oGԈyMp3`8nLXx )PZ#)žx=T6pI=wtrZ#C|+%2#`@ײAXe&W5;0#H-alH9A:jC sa^J\֔m#Uٸ:B;1K/!=`x#-:>e)te˥E$3Zgdq^©?%]_ iY}n Һ7%!W7^'F/&-TVOY:UylNYMi__u"M)zH:%y|&UTx3m碽)t*M[;Ho UI }Y)P'er::_Z Y՗7cD}љl5ѿ9] H,lLB͹hr(FL^̦5N֐zi%& -)`7A[jWxt"aBɡ4& I)J~[ QЂW2Ub@t{]%qu]IkxLUy#ޡ~&R3%hZ٤FC J ozG/nH4S*W˼~CKLU{o%k"ȁTQwϿbkc'~Dbc 3 qF"&\DH Inղtk.N;P}( Zl%%HuQ-.Pt (&v{-9KtɛI_7*~{6?1oir]rYミ~,1^޴> ZwTU~"Vu_m=X K@HZeo X5M,Y?_ShEˬijτ`#EkIjeR&U(B"m[Xסą:1Zts`;'nl2j÷(.'жjeĪ`q!O! Y+[=;Gcɋhpę[}CLZ)}_cv<w/"̨BDVMa1mW:,]|t7:SrhV"_{ V^d*D&1Ұbѥryr*.dS\{2OeJ'5Sq,bЕ@?_6INXLvK/ھr @T, 5+(S(_M T|o YdC @`/$FjTü%$NuiXqԠ0 qXDOq7rcѻ*Sd;K4P:L|vp^&,{Ӈ1GiGO@.p󸮕w,M'mAh A)]AJMҟ`qV^YVKz*T|¨qKlģVz d;1 2Z&~WNwkWuQ[uث}?K:uE{auYay.UbuAjV4׼R^ L'i>lX1Al> KCR ^QY 6)~5WMWhMF`\~*Aצ0'mYaSO%9~ݜ PQJ/57Q@>čQ{F &tR׋x@/aXn h5"HJL#dE+v4<WL؍b'y^M2wCTUfpϵbNv`j1na>Ad>9Sш5K|0a4IVʚ 9*3QVR>.d:zD=ZKx 3*Q nW4 6pfWN߄^,茲7RyDJDcLUci txu\#>4=r#mpjHH.טiP&o'8^S_ɴ0yפHS(|Ǫvm͡B8; úg2O{} n9SDNpJz*WLkB&J1k,N0AWBLùm`7tf7pM<]Wt >T!Čhx̆~$W4tmy#` VsUF'79OߩᶅMwqNq*f;2~Ϸ{<sv 2`.O_7Q~O֝59ڸ]Boc͉rPmUݗ0ƝŅڋ䩍Rn:{W(Ӟ\x׸xKR.-CbSEיS@0\G;N-+8fa?YԓMMx6s(܁GvmXMgC<_S#^dEb |kf}}AROp+S8n=ܓL\%whe@֥@mO?HCڤB+"/m Y d/#i1\`tx2}D]̐+P -M5*Yy!"IEK{h!՗c%)X>vBf'yyOTºYh*HRKwɡhP^DM ~N+B;78\$XVtDXm)u%)w*ΰ+eQkC`ǟ~aϢʳݘ"G=48TX"53"1_emƹإR:pʞ&,l^XXb<4ƃks*9pN [W '4Q/R J,I'p%}ץ”A5|bVRj7ޏY:GC׹ì#ҙ=IQrd+,[~ZOeek)j&__f}f-d+~YP] ]FFT;gǝ)(&YI,},ϿfL}ԼF1E5JmM۷&8!dN. V+gzys3%,BYJj 2]J&G0`m6< vT_enO82hT L fYSh/,"Duto Xok#DYG'ԿuN+m]{]Ek$iۤws-iĄW@3ݦIXЇ%*>ݒ`\!< @q^$μ9w= _5>|ZRRF&6l2;cu~SV:sHƃ&ToTܘE3SeTLru&`ϖvCЪjPgzSn̉ cއI1o&S6H 5祕-È>7X8V^u0qbn#2Y1[aU?uojw8׳'3F|ԈV#Y;RxϪh/"q961OsDz%7,fuWEX؏O5m YY_]v}o.G 7qF˸@Yu8twE$dX/IBؤx:?{g:(}㤇}-_ses"8W좷. Wq**sSLyK?=3zoc7{zROК 𣣥rLNJ֦SSk 1O{]܅=M ҭo~qx# xu/c2 r:^\;*\!ҥ<IJ>Bz Jǁ%ю[xܬ)דf"n*9{I Ι!ƭ_8U@[O |V]1o<-1E\Z@b1S^d8[1$J)%)P5klgZDxt}vXWZIM^^IΛbN`g=V^/WWFf;zBrg^!b Z +ҩ/Z36)#rkFoh0:)l߯[&4'&|SD '=-z[LRkD/\H]]gKHqWwȓ:[ ɴv 0/Sou2q\*"mC p<ݗ+N#?BW`f>~]Ҵ!pϩn3ҢXA{WʅGR1)O(Ɵ-ہTƆ.$vgQ-B7\lgUӾSj-pNӌM8xe3Es74eKX7sX8|ZSE؃`3%}.h:͖/~.-qM*aشHrQZ a;ri6\\ z ojP" /|߾(;\)U`"g'o-4q`HuA(78kblG.5Ue)Ou5SjPxn_LV9);)*< !#U$ vt|:.HSS}}ew c  F&-q^GaH um7ӧA9`vkOe]JpN@uN%J~O93eb lpse)/-KKְYUaf@0C,|E1pOB墠pн q۩w{E|wyꭄaTJw&J"_ֿ U 14\)vC.i[m#念"+of:c;X{6𳏾7`_+8jcrQZ^o O30㔫l#5Eex<L)0Bsҷ^b'ZǍ vLyZޣh^#'ƵJf] 8O=.3Iq QNwgkhgNꌿxřȝ./;gNTD9^j] 0m.7Z7Q"煣ɡ!5hWwO|FZvkN9G{A}UWI_!X'A|+[2D'>es(z?G|9SDZ$Rb!){ i.j+͡IRWMJ1>+gi}9!8jʿTjCVW/ۜΙ!f$cItφHzQ8FtCnpI<{gh]`#-OԃE}t[FYaw#U?dg3{Fo8LJ^e6xě>v+0*D¾ un#.O1LB족 C{qo.dMcH6dNǫR3nlɚnQLpk"X h{̐9e=_hKա%9q 8t&F fH_-?w#M,'Νj6>>q7OdMųX? Dq+FqXmGz+sbD-7.Eu_Uh/,\] P _" c,(r8nG|o'6?͗mRy}C~BGEPl8x/(FD?ggx _z97݁3 @a1F. Vy6# rD5wٕn

snaqmEǙV1o$i5o0uu VauX}ԹMW-;24+|5o[%7X^aaX\#90=F@Qi%fal5Λ&,K}sۦ.GTY/5GjZEosYvݪz9jwY6JݬU>50eߣVJՍ[IwGr>KK튫g9`r="7m~Xg29f 5,Ηr@OdS_i9ZN{Z_I3.m_4GT^r:vhX1G=aQ /;;Ny"/V%l2YSėzxwK A^@Ky"/]d!sz|!c ;\ojݜ66lk53NCЯͪ[jY)mZgq.jÞkKmw:L/JYncGYٙK$Kh&ۜTճBvDl-5_Gnj9M)I@I\f`k]|tW*hT7jo& o?9ٴnLT t<Ε&vKUaK]G Lc!e|Iλ u+e!TNoo2uj}tX0"w:aLRٜm TEHMo9ӧ(;,K$gU?MshFj0Z*C#ۊSbB]*|{2A悠PC4# n`ȭH;=Gd\-[%)Ot#دv"|s;:H-fIDVld^%,pФW2KC9N@)k|K>J[=.5{@Tz M!XwG~/ 7j;w,Qb,JrѢ)?CQHn!x0nC ۚv 堻suL=QઔAlN{@Օ9:〜 O;R [;18t /ю~_<7nq1i;]qz E܆e)h93?d]ibzYLOZRe'$DjE E<j Ү6<'UʉyP觅Vۭ@4Y@Xy3Bw7-<{֨hm=0Jw-*ӑwUg%iϡͽJhd P#kݽޘ9в: x>Jn<nvv< ^r낍2U@sxl.Z0_^b}gpf`6kJ wkTMpp<2M0T. )&w.qeL w\lE?Ky5k$ 2#*~S}&=(RZ.1e%f_EŸi)St!M`|"<-U79Vl&8z'QP)Ŧhdl|&LhaRo({AbI{:]}zg5zvÿJ/t]jO~-.9Y=|M">+|U|`Qi.鿌7AJmw>:iO"vf̝Vk 5DVSӕ$;gq-M͕[[lڮޑi [y Esۨ),viJ*\ FO.-X }, zzdy~pR$CM?)w!={ʲ!crz:b掰( ?b.֚S ܛjdžn-ҪAlb[T6I8k 4ݧ+az,[zv1I3 Tcn%kƈ& pU]"!EʪS,^*;N3ȃ /}r xn9D̸D+.\p*5DL,>qb\nFf=_Hł1_ .FW=D2j WG]Qw ۜ@ؙׅ^P뛛ۯ."FVEN؀L| 1Qy\{jBRl%VkY%UKy-U8XĈY=*\K:v}9%`<9 =x>O(II])ynNF9x]:gItSK ~YcS#Q6é@B(a'Ŧ|[&P kBA820@FIg3hdF(Ӟ;( Sπ5ζ|sŅJRh(@[8K׌6wpfNd "4=kac0$ x}'žc5:S /=QK©jś ۡwjPj4Q1¨tasޗ9,df&k.]>{6L=FJFOx?u``j}W¾YvF zs43Mf9RKcn9NcZkCʮIiӨ=QI{Ȑ{Ư84MVm6SFmP=Z}\E!~k @`s< 5/zظ[5<]dhJ4GMrH'Y#l[cTco4FLGP:A11^s52ZNFpY3+䢧 BDƃ@5w1_t}p"&=(_8d~+~ΕT/p`TX?ҍh00i5XOY=h$Lb./C5I [Z6ƤE^%Q׷A^tߚ+$ h$Ϻh'߁)QJ.S9*&0 ~b{ RWYwO7認5@*oWcE8EpqLG;TNi$F(  <˅lbŧfN"2Fs`6:bIimJ$ O@l?pchûO\COWe$!k.j_;h~,SXtS7.+5L ^޳)7NKjj:wnKRѻA鎀>^5elI9~n mn{FRWrJ괆T5 v8@ /qO.ޡZ kTm4w '? yxWvQ{3:Tf-"Hjoٙ"JR^@opuvDqnS"3<8IOV=:#ܶ}ЃȒ@ibeO]!X/Y# }fCג e&xth<90d:6e];[bD ~ȫj1qW'M] "h 49t +N5i% ]0̷_pc^JR6s^ZBgQ8 els~(9pw-C"0O5! @m*\ĈǢkTJώ%_Ns|ۤV9rﰹ"%MDncuk-:E~LlpU'-\~ rw\łb2Z_zq5tILPȘ Ge5ǷU^x7%|qQ}5ZKBaҳs' odSh=@< ]Tsg'sQ!/+hvF;1@UiݫE(Əv "c#4c^J=iLK:A,5:,Y-y1K~-qAJ}8 _OJA<*pIhYؤ@ fruonÑr43$0w 7(}#s.̱'I˯G T0* ^GZN fE(7 rVrFf#Y}g1*ݼ]c+ꋸFxS?Yzs&%;zc:YPSK0O+_|/{(AB\'\]`tte8Z~k9vkLbg&á:J@qC&qLZFp:-BӀ5)xkdy>;UR$SM8{MCв K"ЛM(O+q93ƕPF8nM~TqUoChN\ ^L'z8Č'}s; q\2(P户ITm`P h:6]d)H4wpL( n'+,  K! @qF4ucJS\YFZŻz*L24* @ i~(yJDp-A;:rG,fvCԛH fPEӢ7Y=o#c\'?^^:ֵ~6 E97u v'['E\a%[25KcJrFcSAWb!t]#Bi-z?fb>H%pt9_oHtcE%ڲ~,b)TF:,8joApVFtE2q N)WBS'a&{:gBI˥-'[?O::V>(N~W+w3>n;_'$@<4E>AU~MvaS\'!T#sNNæglG˝.q'Xk\sn4n8- 8V-߽=*W=R>x]h笞FiG&ΠT1&!^iJkj'l^@Ҋvreօۭh"#}cL>]?;61OVѻE~"|20)xMY;,7`diЊLFF[}pR:BDB"D(Uqmuk:x]*qvXlp,Ny7MsBRcvw;܈"C-5#8bᙼT.GE¬\Tfx Q,КH /J"¨ɰ_Rl4m+(Zۂ3__NOo@,#K@qϺ`!I) .^+^y|Ŷ%b3.y}t8_IHK6!-jt<ȖHx<$P/h88ؗiT`Tv&U 5d!sD&j8"a/ So=vZu@@+p2uú_QB$p ~rSD{`iRL$`W.xgC/OeZڡZ ߤ#DʽiڅL+xB +XFYR6pdF1hiԗ:U2t\jg rl+Ղ\/>MlW Zjm*_T9P! t&9th:AOh {q(Oc(j&l+xw;*[UUFRJ:;Ԅ`=浢p=S5w/k@=v= sԹM&vd-!1*Xc 11GV:T񲱾ÔI! ,7jOI?ǴHW"<ɨ|izL1LJeơh:C"IGib`UE"Qp#! +.%物#I}n9w>[)]L2e!766;7CJ1;^2 a9X事 ć=BКAA];Ն_Y8 ƛ:U&oVPXNU388Bo >|IBmъ&rƆ[Zz Ǻ[6l=|(Z728r; A%Wo V6SvベN2z`(e[JmSbf\-as;#2۫sboX!FN+>ٝ``g{T8C)}"1wg]wm7xU(~ڕO@}E`Ol 76mhEFgþ)#"zk)\jMpu=ϒCC̔dJXϹTn#OV 3 & j[/p 0-vWSzȘwZKyY*6N5T)F&y3(MPq(69%%`)@ ?̯ ti;<^rL{?&m2#gPZ^} tW6PRǃdhiD.;![2 r簈q%(*u#ao'^+IQ!#i12<4IVqQ|ꁠ6>Sl=$5:!['7bt͂-G8Z~K'[ r燋Q ?5W1gfA?j7W[E(3lI"T(K{CD#@Rq;ղЋl`:UiqyZ )Cka6j6)UKi5D'ۻ]ߨa^ĿOaјVjF9U&ӡ Ù _nwXb[a Mk1|=x],o3Av[Y2lDh^l&$kjxOP8H^Zy>QwQw V&t#,d+T **q]3 ѩI0XSwfgE*D@]{Z(N Od"A?:D)0'NP)Ntp?OKQn(^01y厤ϝvטh$r3*zlQc|#j6)rluYA j'oà2qøHD\{\˼'~-a`QS߁Ύɳ1yd^BLY: d6r>ZmSC?JxGsVr4Q)k5|͚Ի]@WTyrpbLD1H Įe ڝ&mq JPvבi] ^3ý1;E3cfIAUQ( U{Ai ?<QpKjӃš͛Oкgu?./kۈGA-@zSVOڪxk ':xDܥnYwZD]6vY\\<3FEOBjJv3vk}:A/t=ˡ?nS$WNBS$T:g$*2(eW NTfس9?OʽBle~FdRGP ?T w۬;dn0/KCbxjDG7E(7|m=dТFR m뙤lyKeud3]ϡx@].@CD5V^)$\tT8ܶʵzGXTR0RuH3_C{\`qnݽ.޽}]E>Z=]it.nጙB G.t d6jW6ޛ;8Ũuۃɂ>']L X/SdEm\#i WP}^e= ;u]ОVp gGmº/hf*w#o9lI\n:P8  jMK^ch^rӟ{0JV^3r"ZHT#=Fnsm/?9y9(+Jrw# EeG}&ѵ{[LOiSpA2 g?lȭoGqVyJag|9дFr,Uƻ$eZg}DpT*9_k ThC}aWpqEK%a=EݟjAVjtcl nF 5xMɢJ{{<C%?Y lqQ7k#0izLw+9 )(t?X>ָ yن,ӕP^,Xm<.zX_sʩvrVAmh4g3ݨNO7vb3Z6;لN( ɼOu(x0; ` V~~WtH{A t!Dco/;oj SyGCfPm 'dPW8EBؐ1b/ } !䗦Y弯-!F_7 jl*_!}hfȡ X`V:Oȅ6;?ܶ y3ʄשqB ]{69A./ӋXmzL.q@Ώ:&sGj<׀'IbJ\f7n$qݰdA K;y=` )=|&*ZF=cjr3`֪n~*:!aۂwDdH8k (}%67)-' /0Ȫ<]銊yGAwPWPjL|QP{Ff6@ v6\L]уjm)YhN=P uB@rNd e5LcKb-O5eD#zhrw $p0zXZknU TgIC*_+T}̐+%ݾ$EqF'iJ(W 0'%ێo#|+WՏlnY\Q)/&7UOV;=oׄ閊 ?iNpUF'ECWwu{0ժ&?8LN>trܨ$ oJO NKDI"TU1$;dr(%=џGH+ h$~1߿tt0OqƸ7(OBWd"Lkߕ%K+䝸P[4L@{*5X$s Xr5eC0>6 wmXLW&PdHöQ. @<L`BS$:=aw$od9%L׆w7Ky {yv{ݽ*rfw9N9ߌiT}.osȵPJx3%U!xGAyts!~&9.a#&73{\_Fk\2{Xm$|:Yz?9,&1X&cSs>IVI) COFziA޺I= e΂P(*@&BOiTq! @8D X/VT&h!'Wp(O fs {p_J_`P{ⱛkk׿b\A O:3):PTwS 2}?-"k;`A&q!ϥOKV4c|큙+쎍wGw}_}5Vs3[h-v-Rb,=ä>`rIlY¶Ũzm{&/Άz_0 ǫ&[l2:I1f~d9LKLx!5m٪~4!; H= nc@W^nTse\$wTŶee"V#W3tTc* zX]L]sj*B: ;(Q+u[; MxiShH7̎Prb 誦 -m}lQ`{^Yr6X1xje[.fXD|=wUrV o+X檰adP&ZnkG ݊aH348}JeP$=y73.G,d:q)cWXϰoBv!qQXo[fh"D^hN@/f nZΥ?[+*V[ 7aVnu/oz ޘ~^K!%Im⥴ǯX LX \Wq:bPټ%Wߍ! 9fJqkwY龂,hGsY:mY'lUl+*Hv,ZQzTcZY~A#*HSnj  =$,ԐmUꛇWTړOvZav\ KgJh]Gm<ڰ.c*Bw46m0uGbƾKLWTB1Mح8ZhO'k =fv1o%<'i@(~*^X+7w5כ_2@(53,#(Di"׫>%V.h( ۛ65 QW&TBKo2oYBuf.Łn p= lI!c6YEsF@7Z쯴݉͹:-K/^jĖZkYNL<?2_'zQq}RZrKvf{T%]tϤ.G)e@0ʓHmd Y}e(,,b}b]h9FJi] 3cKoYVdlps-#RqVvp >Efva.8^7ӢTiw&l75Iػjº0~Jh]&Ji;p(W^%c[a'HFZ䜁B\0{Xkphy3 ژսضݻ5U 7&ˈ Kc%tHK Wyy3ol Hn(銶@$aѰq[(W/VjA=Ϩ;{Wfv 2mZjV%"EP F0ݑJ0y8,vMZ(sV7`#MXǙhy6(& t 5nB ЋNW2U#u6v?m9$խ늤јFzBgKuk)O;sepӂEFl*\$|x\w%v9m1;.4~N@ռ䜅e2 h2 =~Ps|V+dДPXujSp#ն"Xm^o20YǵxsIe;Y%Kv>W_+l ,4&qݯ-jkWN%x[Bэ(wk{h#%k`z2xEwj(\UӒZ\Z3lb$5G/r@do3Iui=̈́Jh77[Q]>.R5~ Mk ;WN^lOA뭩Y _ _Wˠpkbe3#XgB^:~XAJ6nŪ3zYjl~{\ϫ62޺eIox~D~ʬhǝl3FXRN=\aN81BUjvdU|[,?~V ve#N$Q6W@/>!03ZR!{@aPe B/Ҕo5mY}9? 8!ș Y{@Lx(K5.N z% ़RÇf5Ӥ^^v#. $=э۽!6񳇵ﮄΑwS5Dz/ g/zz76#P{I߄ͽd ҅> L 9 Nin~)(:c٪ i܈Uńg_i٢뷾C ,?Vh1fx_. uuyr{Fxw8aRR!g?n^BEb愗iӌZ7oѲB%*7˂;`hSVl6|*n]e wMgs *t&*p-' |y{/8~eJ!.OMKM=R=UK*B#Œyc{}:-R/ǟ @xWo.$WATLlEIa>sIyt] VDrekmmpINa0b?Y,-e+<0qv}f G&61r΁]}3X+ܶ%Fsгu-Jх,d~{(kށ! H.ƹTO >\@JK//ByA] ;Y̫,&5w:o'4\.6dN*!5C>bzzvF>ZF:ٮq=lN;0ĝem7skZMvz\FRkP;gC&na"Nj06c7<[I x*:$*5dP ;5q s 톥Gӧ ս`bDN "mZaޔI?NY{1iLm[~ִT0H$0|aAg(*oă $0N<~Q;xv@a׎[QX,uJiȾmlֶqMu:]Bс]M XS)6Y@]Wn)%zxF2 E{~c 9aQv]k(@l.AI8IZn6ęixM+%4"}II0e1k|cF}܋R[k1(rH9z6cȒVDi{ȫ~xi7#08 ?bTV6G}+OƒǬ.pkx!'OY][Ձ" Kl!x;7a=PX7wF~eOm,`JqpE{TK.Y7\l7ӥagIj#j(){ςxbbJ$I 2YL O:/~~֡ܶ6%͞0^'yd0%$@M[[a;-=M77@>P.d,Oz^,rb>7-92Ry> }wk5 3r)COwQUvG:Zۇd51UyVs8oҘ۷<]RUJ-j qiQ|c!.zŻ~b)ưD;r;ӳ.:eoCAȀAky歈̐c1^}]u:i dw~Fʘ氓IQ`u[_WWq LQWfU8sUbk>Ll|7g6j!O[C➢E*r ;HLr-Ň-,#*,+8[¯ o?yRN"#xz|'Wvķkϓ_y {KLv ЯjAVZȭП9ž4o*ՒѩY:B:O?džUTXqP:Ѧ*LBlHYv%`V- _]Z H4RB5\o]A?!^Dj:mC8PR!~F1ގ ±q ;3{EjQl)5n#z]LO\9O7Z"u:`DJ3,mBѵB*D!n`P=&#J޾^c_44u;8c='{baKS|QؔG.tn%=~xRv4kq8Jh3o>fU0P$2pN=H =+im.Rv^g9𾰄[0ZOm̒<1Ox[|/ %Rؔ9jޙ4#h+ lkv8B ?%<|jp;0v|%is۠IOgBҦ%ERR)ܼ W$@rMGjV={#!LDClm\k[l2p7_:Ԡ麀+P@4툝5:P.Vq md#SճBQmMg5n62Myz~ j>5IZUPk@bO B[nӦkYUb.]d?#Bw^OlZd'*-/ҌKL:?D VA ^gmI)jhP|1!@1FSdY]ssA&xN;#F=6ѡ?A'5[43Vz+p9K:;Ӟ9&YFAir*KREb+rPރQ\g2!;+t3~[N;{*/p8 Cˆ~c l/jXz'(LFl:kZf*1?vVv!RąARqY\Eu췷LāL00-a:"'*ʋ緸M?8 d31$9>/|4=LM{GZ;GL[ttf~&d?qm>n]J5!tX$|w t!n!Vn ȤlT1em^<荷ExX ӝ _0PB6#~U 3o̵Q8AFxF":HCU^bG lVNHti(ԽW7bLGևX;u與S+@6-< 踏NڶxeRG%+IJzqrs VdqC0o7NE^tLbB@ȐeN{md6p>*V!nQX [[u;CX$AlL.훐Ʃ RXԬFq \DջFݫ?yn!իK Hif#uD#k9ⱪIV_9S=E K(zVO䃘xJ2,Àfީj(5^$2Ht B"-J^ HI@LK'6OOW#7ڧ w%TR滉4-YRRDmL݌]EV5 %ta,4\Z8 <-$oCvQ0(oHs"@>åX7VSDLlĵf(LEΞF>^S6횤pܝ#by."7i\OiAAjcCcK7Cഉgä;q<U`Uir3bG&9.ۡeE!0S'ͻ}d;+8'm{TF =.')MEjzAvE~5|/?hcPZ5-GJ⋼;u2-oc8SA Ɯ?LbUtsxJTKޔ8O?хޮ{w3WI ecUkTz.&sdO}o0FضW3Atͽ/ߤav>⸆h3[OlCXD LΚVߝ*.m!ag3㖷D7U, Jܭ^/|ʂhwJo@I Sy=jY͋B٢;dقH2Iepć ^AF[-:QxHW;Ǒo#9܏)^4k$t0G=kY (mT<;U I[jEuNE2+`5Fd}:ɪvV#yCmi? (X@/HX 6Uz . Ahf("c ewTV{$O/`@hUFe# r!W}Nss.&n]͙qG-Me' Fg[:,<'4_:. Ы~u9 '`%CҩIOnGԧb[W&R ִYsn4#GaULTNBy⎗{rMBiRD]]^_q^ q{qma9lT\* WCj?*-\Թ}~`YC@)v%iGFQ"pw0` űh JA*xUH.x~7 U8Cw- y8,I}Ys뛑{)J[r3@i#f !E4;.  T'컷tQҶB׭Fɲ'[ L=ɯuo!൅oL8bs+w;}̬#R1De*'A`D#`O>Tݜ^ayA%U^*~!XU#ihWGTDNF1{w&P OC^Xm_;=|X?ECd~_ iIؐzLjkEoS\<D]Llͼ2DL``kt RQֲ?Ee3*Ap6^ fBEM@IDC[ ,D``OP8!#bIMA;nl`s^P^ˆV3&݆OL{ACk!/~~yAAl7o O1yMYv=`zlT&֕Z7e&Ic<#7o"?ȋ{fTH0d&X\]S@,DO,ctLa"Z]ͥBxȾ}x$`R_Se-^xTl B:" ³/sE WEwv8D$C 8s-< ha8I9 x@,[oʆA"Cѩw:z3~lحJls3><=Rl뷕ܯeJ&xkpfd]?  פP.vpօ99'$V 'OkD` ' R@3JZp"ZnT7rlirv40ΎC K{r[bGUXUVPl6I T`#ly. s8lCV@ta*գ ^[N)ꭓӐaGV 7cOV|Z5ͱ#=+sk!r~IlMVby'RΙXhls!Y.݃>}4d]{5pSwpչǐiܟ)Z 3GëiGtb!Mƞib$F'޲L)8F1>>?5rK#RS}CLCpsUJ\N+C[FVY?X Hv%jq5 m[G%;s҉ry @>sݮ/[(- igRF7=TQ۱V5nJ"7͖R 5_+6/p}܆l}u{Z צV$OI$GOh즣c-oRcQʾ=YÈk)wu,gv6М''΍H Jlݟގ۷YWmv [&J`K*9|g0́XQIiM,'MmUpw%w6O=wdXP;Ň:ۛ{ޘ왥C[,?=7bT W39%q̯sLGk,[fK *;J=3wXws'zynoM 73&~| } ^<{J `ih y[-hi2ɻٸ 姻c-q A$`)DF<[0KV˱]|7&$9lV`\Eca+S] /s=({h2c"8q%kŠlQNpݘq8|1/Z;r|o .@SpW Im؟du L.*wM3Mne߇6Qf ,abgTajYGW}VH;| (CWWuy}[ D1mKԬ1(tHd{i>ڤ?7-:ed|W`K ƬiϹ#~̚Q`e $8}xA ,#%G?og+d4pp9^6滌C.[3$ dO5fic /~N4TV@'%WT![Tm/_^!%`ꄝ19DqjF'Cul~O!ӌ#;xEֹ1"xC3n@JV%]ł8ᾫ_G &6耢7CLaql]u'ZjUU"D&EAAft 6nnXU$%Y յؓ} /;SF6ߠRFz\35]c/Q[߬ci#E|zjU@}'+ u첼}[ٱ|@@ӑ'jgxD[|$P'Ts]ImI#ϼ6y}s]>35=Mۚ帙P a65*l5ܕӷ7h@,ָǯJ[Whv3=>8}DC%?犄 pŚ&.t , 9s"9 |Ri *%8/̔(,'o'k 8 {zpaT*МQ :OD Ӧ&x<9GUqPiE5i͐N] +zӊ6Ӕ'xu*ea@ 1xZ%Rt5s('IY*%Hfϑ4lrs*8C_FEC{&,pLNX{Łs՜%SyFMlI$֥6 yB^a큢DYZY  |5vIϜPy0ͧ ٚ[mmE -Ɩ u[}a=N2iX{wJٲZّӪM`@xBj O_,2E[ 48~s;]4keA\7\v9Rut!OG{87J~Ԣh{x @t"j鶢=bb N^GV5(Q!EԫtT'7&&>@KX\#gQ 7q,01No ~l o߹!I_!y|*v  KM4.ł U}.I=ZQ.6שhySӉpTQׯS qd7Pc% /SBٰ^?q(7V[S#;vq.Zigݗtt(6^$$G _8aYѪT%1us~ncmzܗI*#su޴L(~ԭ&`_::[-'͚|tiHd'UMɱm&Z?}8(}tH—զP Nz"J;{RAstlY7IznI'KPv㈒mfJ>C`PInuyCqK :[^tAdn yV#/v\NRi{3Y kSfxD_̖X{U# >bQ!vvާ;0;P,e~ 푂n i(NJvɲaW?XǬ(ܺF$KvlLX>~^(L'gY"^thZ"E obOf1*XLos諍?f#o]L*8,ݿerK`VOKp"Ǥ Ә1`ڝ`e`% T%BV-뷼b~QfTJYGμ+!ML9x ;PQtTo/G#h,t HoQ4=_J&^Xg50"< jl)iΆS!Ά/{XGKF/vqnQBmy AmdZ>}G18("+BC<νeeYOHCtnjJ@1 JG+4̎yG/SF0,+*vxVⳗ n?0!zx[A6sE8*ܣ8V5Rn4>bָ%_vw/c?9rE+m3v8]fuih hӰٔ%֏0p˳ٞw 'K!o/'Utv&M+wٺd6xr4(|5"Z{))ͨˈK~/SW% i]., B4/L:\Zl^Ba:&~&@q1w|:~c ƙOq+Uޠ^oQtG Uz:rwM6х?'hr_Ň7F~<6fH_44LBJEm"dP j:'ز$^ he1mp~yq Lt_dm̀=>0@:N]Ƿ.Cz7)>1ysmȧgqa_1Fe*h sŏrXQȻj5V΄bWNm[pbonK# OMc-!gI_|Qv/[>pqذ&^%P 3B'b(j Fz0arUp>1JTw8M\՛{$ڒ|W&mͲ -MIϕe*Y`(9pQ5{HB2WdE@Zu@ں:udVeBI6EsS$U8Ctn$Xbŝ &ǭŃG]]-8:K?{=k2) ?~#vp2r#%4(z|X;n0ȸ[fڍkNyOun>թe!~O">A<]=-K|8]>Y:S` ;nWOW\$X ) .)vˉfmjmPXzU 1$pW9Q;D;9 ޗ)xqBKB2Tzw@n<OzBmf?.jË3胧huH_})$gQsDcԟ +A|e=dhe̪_k:0giT,cԆ#% %K͊?&a_(ȶ\$O%F;J||2إ rBU/y+F\Tʽ?P ܴLP|{9.sW sxnU$<}ˋHrκQC7+C$ a/l) -ڛx1E pw5`<qKpJQL0>lD,m-$)jj84T]u)Fc[/6IGse}5@ ճ}v>UruДlvFX}ᅢ$C>P8.T.̱(#z܍6N%?>Jc˖꠶ ,{ á Xu?&hi(՟;%TQ(խ" No]mB1N<`;hG}זI!bdQ6?Ҿ=P!PN}@A1 鍌e'pF'(V.1^EhzeFkJe:NX⿝.Җ,~&TTC }R.# 4שVu  0ɘ(z^' TemXneVRZpK"@_Xe(jsrTJ (J: M)+ GˌOy{)YV0z~hٝw U*1EHap1VSv ϵ|횃R61)DoxAމ{/@ l(isF z C8ȣ_L*ŴkwMڍ\ nxUZbJ;(xdjZg0\'y,iʮܴAB@ Qbkcd+❷ΰr'nA!Oi· E䬯۾xw4BxWelk,S[(!BI+E(;5/#$ HkIg$\bޢA׏6#bVHaFd2!aLv O#oWȸ,;ʀ)>4Zhg cL&37ꄿ9sbWٓN5huauFGڈ>{q8DwvyHljٙPwu 2 43̹.1{AN 45j.HykQ`\ioi6*/B(-x;\=B8k/@"j8h M?RkLxXIj1.<(NN`auRI1')2NMvgs^bCVꭆ4[!E#%_E&T-AX31Vhy 2`X9nl^LM_77f uV`_Zh"K|FAg0 |+yPSpJ5YSx#Exy Ф^GoTzcOSBE7)8?+ [34<\zeq5Ev\KP?H|zYuD!E7d\)Ͼx9%U7C|2*}c96Ɛ/&3De =܌t34ˇftd2^E%`dI3ls-@]x_N+}~ouW2Y@VSQqn~LH|l-=@Ax])̘R?%yjV 04ݞDl{buIIq٤dTGjuӜK Z%_QI#iE̓?7TH!hUP^N˹5u!y`V4kɤl ))>6ElaW?K[i T$Fba;[V C[jѹkըAm(]NgTt#XD*AV2bv 4Q{Y bXaF~2~~>&+3%d>#xG#]np=8 kNXc<ۓʁ#Q8Ta6b8ITŮ %+pY4dBSYR2 UU:k~U! `i d/ij?FG1.߫ÇNc<qMb'm)*!f<qeF;0Ì6b갭Ye"nb)k0ށupP"cȤ0B]8:LO~ MUIva>( ;"xM쒜9g#.%adhvy&12O!WR#FJ{3qfۡYTaW(XU\29qP@ޱٟ+||~lݙSFSUj+UR5m#φFz?x_{E7| Ƨ@YT u>W)6!_ 3{@J[i!*n #GSC%g*ESjX|l>#{UeW[_ۈVNkNX1, B />*(V4$o,Y晡L6au 뻁TzN+R![ZZ_ӏKDE ST ׀AI_C9o޹(EFZq+6r Ӟr F }aILE'Cj` i )N9inV{S$" cVϻ `宐!X`8FU#uzG |M[n *b1LSe 6'c`A=8)(1XOv9XG/0*8/6CESu學y -xk[mރ:wceF٪٧:iw=ձAQFlh2'1V/ <ѱv 3)Gg[{+ƿC7#a:O\9Y~[\;Sev4ˆ? QY+ZԭVŠ֙K~ڍيh~:!r caݱ% P7c<I8WMw,0ѵk{V0 d2׆p@a~9f4קѷc*.g-s$Z4~r|ݠnUb/fR5:t$|Us 8U=W91\I¹ I^4*a3`NW6NwA lqdp[C|!X.#uG&YKcJ < +V(ƀ6iķ !n-Ҁ711Y֙ X#POԥ)A&n@%D<, |MSao Ɔ"ڈw10^,m$ 7sB/[bvPL<Ѽ($a܄RÌɱC/3gۛGɺJ6Xù&+R56Mm;P|] e?݄{ݔSNc숝S ː/.}4L7"4X[FԈkw^{vZ_RVnfbhEatu$GT1ԉڡ gv8,шs: 7t9hPi23R־pF k+LqHWBV-@_ $5E2~`}gSAI15qSC>_+ JKs Zre e>Gr d:"9oW]a֗ªÖ*V26NCH)4xwwf8O*8N|!X:MZ聲 z| ȋE:;`x)勨95o.3"C 2Cmv Hs<(T`lgv{tȵĭ~Mx>rQ&wkND3!fYaB?È>~:Њ`]4TJ-һ:~TЄq:[Vo's=VJ}qPw;~y*Q!XƈY$t/h} F*vEgHUʌ|خ h)_[Bxc+qN `j*A@|X)TҴi Am)zHkj(bWqܵ eTwf@sQ,L2.; \gKe:!%62h*3%V8Œ0n´:OosWvmb<1FPZd^<8ybXLfҚ,WKd\eB6!jp/X|.em.}\рd+&hpYTh*}""~+WŗU 7>E2^rb?*Gh}=LXCթ+¨dThehndfMn>M1'w2 7ߣty#/dJ6zKsv'Z&ObQ86KY6܋3xvɝY~QZn8$&wB)* ul5z2vnʿH|&~`X p1p!8M7xpr_i9-.je-Ŷr"5p +!uʭ}k.8lTDKd7;VR%}#pK͊!Ӟތ>2 E1JHG1>-b_JK2=Ǥʣq.XE:OGktȻ;UXBUۘ_wi{R F&+.-cJ˩?=O]C^ ח)'3Y+.e97mU{bl#5M<{rp{1UY)|Ù- B"zHz>.B[eKC *hTW,⬶О@rc4I" )l'cd^R=,".uhpp<(^aRͥLNf_&KcЊތCn3[s1Ew8eۊ!qyQbat"ۿ=,R(u2Y6GgAR,hHF ǃmcA i+va#ZRρ JN#DhFr>Ms;W$oW)ȸt_|OH/C{[J?@ɷL_lx[|pM=)OKo Cd;P!7X|뱋ЄN{gBU2MOˊl?[ (E4&违/cF# Kqi9U%>ҘLM@vTز4 2+??euIl_ɮ*ϙmqʩr]PaٸA?}-ar ɟ΄*O+SQ $׬I)e-D{8N82,|hzi Űč DCal<$Bfr6 dٞ/6?}$zcs'b L][$4@3x>/ ib OguX֏[zL_T@W08 c{zܱL,w;'3Lѝ ށXؿTR wٻ%蕜E]eg8C/IN,7߰'J 7%G p,E`INx==tJ%GL2C+Vq>NϠC/`1懸O"<&;dLU`;A霰ݍ$@ J3Ud6 aKINl\"w0"qWCXŜdn` XeiH±,2`ǎ!B;8 >&gkM6 (ɷ6SЈdc(nHaS`Q e\ DY[zCk$&is+HR]O¯牲lz/4:͂xEAE*`X~r+TB둏}NY! +( hUtb|1ۆf $!Jc8OW2e)Sfgrr;(`72/&pyHriAj.Clrm)+6d&LhIRnίH}kޯ zbE!Hr.;>o2}ښ"筇ko7pW=؆D;)geΰɲ_)yRyuI*2 T^#z`P/E5%3?],.`xs^UsV 졙9zy2w/}AU3ŝŗU%اZ sA\t.TGG~ oAx( xt^~zw݇ u˂R$oצ1Guࡒ Twje}*#2ͣHдx;]셢gӊ.k7CKND 9,Q} LŨ/x>ab \B"rGsJ#O;޴zE*s 3 '47g5jGb'á0jsйd3qM*@qOE=2r)y̹Gqeꭏ1ٗZFz,Aym@F;Ƕ'4%^f9 f2@hsa E<8¡5i XEJ NߒkwFG%.@Ay"9 z\ļkmjf̔_;XOK6i0ۭ*`zWQlb~ޮS1j:t+eCR37$lPT Y6 K>c kj ZPv^E܌nn^1;N5^|i(U<wəi̤ /1fa~xǹ$CzW)u]2!w*w7(i|$ ,C伐.E89II_ma6%/Z='csjjTIP3@māO1o@? ReYVO T!0{y)G4WߜU4OCȀbZdH-.Ɂ ePGm؉n5MP>-?QYcŠn8@u;]/r)8Lzvz_3!Ks:WX8:d͔_5'=;b^HrJ3\d'rz\'ii=qMi.S .[M%U8CY.q((^S:!\'T;,&^%aPB>I 5B=xIC6G_gyUvKRa& Ql9`OU0KqNh\]ck~1ۊP<ϳ{Ū@xF_J-W]˯wC:pN9PC #fIf =FӔow\)P]]8(bq%~%xڜzz>2R!k+m?^i,PUC=)7".pD[pziI{_9U}?~A3u qJ?\YeW|a&8hI==\PO8&՟XQHwKG`Č_VRX (N=l)y+iJ4|Lh7HʫCdP?rwX+,Ȱp\ĩp6`gsWh(+J[PM |@Z_** (a0YS=ozfdVX%IGnG e?C \BuEm]iC6(bpG%" ʁ!Nq{>p&-2x@& *9`#GʭwRV hœg73:vF^~S\r؛w<YMR ܤ%JoZ:+`l(v>d"4"&diKTxoMW Ow@v.kE5Q7)?NM^i`q9ɄDM=G5Խ^Z,֛68`,WeZ{w mI*-BN~"P&dGZF>y·Gy-Oz %2ƷA'qs+%[TBg25\0;ȇ ].Su1*js'%Iփ;T#\υ_w/'*Ht,cbάO{=WS mXIJ\JTڿ{D 7u%(j~%mV ~ zT $:c+[Ӈt>-|SU뀊\13A(x“+]M48L{fhk\Me-D^H"f?PR~^ Key.z%F^ tLDa=͵Umk:̉ad;(d7s鸺۬ZUz42U[<d-~_a!15.wlzPRi?pLʆ"2`/ϰEZ'2mc;p1i*6Q۽ߠ'vccR U͐"fhJ [nYW\ǍͰS}H]Fru"k}x"*A[dr0&WHSW|y`8t0rshmEʩpLvD[Ă7.q}Ϟ"r+m3DVB=Qn-dVOP)D./7 ogXʅ'K) # 4-p?,f rgiens/TMP @4 14+5z%5 9p RzʌQxaa309(?8`rf-#z=kl/8eC&DtUlOs -g 7&QN |R9xQjz\dL=ژ)C.Њ3WlߩjCaEvayVl RZ*e؟I0|)3;c1K1ۊ 23'K)Zףtbs>0_V]- .6I1s 9N5l>^p,TIC>Jv<n 3o# %X&,+8Zkaz@5Σ?5 PVa 4Õ5##F \ "zָ켦! ጊBvvMy$qsD :۽jFMU>ʒEE֧NEK(BJ"Za=  NH4R 8OUֻv v~;]H [cGTfiF z=D![,&W>Q&!/|xMrPKnɆٵ5En3)#0'n#dqJdm.bTE8Gd:r0KٱHfW>T k]R8Kbh ~b(Bg󵠟|ӞsU!U ˃hȼȈ'Եe_F=/S^QvJHZ3`HSU@.' 2E$!ƃ޵Wfb cs幋v,>Py9bbCo+eP%:u!d;heB觀Wq,)htN`e A29hokfB$mtBIF\/A'^]fZYSD?cff 2 %/E 1JMdnosrBxџUt#7MO|΋$:'0ʋIz(z2!&֬کCշ'D6PFK->[€7j DGHߛ ^0zY5BY %/I(Ykط:S:IJj8}n9{hݷh#'f-!/qc~į#`I'7;D(2r}q ZZk_1seer$__E1 ^Ax"|ك5Ș^e *K*@Ԭ uuҎQ3-M  /\$e7sMG*Nf+vmcF MVY}1V'`dh,[& N(ߔ1)+ʴ".Š̝1ykxW6kVcp{2zE}e\( *ȺdK)Z*P꾨Mإ#QJ2D e!=/0L"5r?!uu*@6KtdZeCT⡧o7~I|DY3,ytZ͢a"5ji1-X!#WD޻7,)S̚f[rI! |92Y#& φdD2=Sb_˭\?o16}:c"4!ļ݀=B<غi"fm."8$u?'n n>:BAD? IQ9~V9 \lS죪T\Wp |ޗ, ߀1 =5ѹX܈Iڠ"U,9q(BOc10 /k?.+><*b֚MjtZzlaZrB° l0 FBhJB8_ rr",}^due0\*i-iNh p *9ifY_Lj qޔjAXK7>g" O޿Qk 3Y$&_7@3p^I]eIizȢ3y0dMX ޖ3qMy!Ƕ!9N|'A N CbUO/On {%_ ͻ}0> qpލqiZ_{iCC!'>bpJ+l$MHQdrv؟kd2[Kì祙 VNN2-‘w45/_a:g[a}z7ոSoέj+B,U_aEu4T;Kcŵ-9&_G^b]iiulqYvh|GE#jxܿB,ҰuzJE=893P/~TG>8[R&\æ4蚯HXW;N߭.%ۤ22CkRYZگM,g[A)B&b.̪"xw4׭4EZ~/~K[[MB;%o JbbЫ"PWTlAvŌrt$fO@O!X1K(ej+'8c%S=~4b1d)ꓧQC>Дsn TOԬS=7m{(ն݉KlX]PTUx=5P-zђPtAIAu ֔<ŠVG_a7).?Q,2/#r>yt9K?!+r%YfYcrgsQ3lb> ҈"repdҫ\EQa= #$hkAbP p=M*>$8c{|:"w2cb-_v)k) cӍIQzYs >Yz}$hl ۑv~~FɼM@JiEee4;bZ$4gĊ4I;zL 8QIM:\x}d" *vy-8:k6g3֢EFT45fѡZ8N56Wm <v? SnJ[4Fġ䈝ey}IG)>o%Q!Jj@J^A8Q؊HԃجۘYdǢʘ ^ 6V靳[ekP7 'Vf35og~OrJ`$U~Z. ;bJYJ$qJ*Dn]J&?|U TZUcsa+ᾱb/+Sr_8N+\& ^^ߊ]ŊiQAՁ퉛yo9hjC؃ {[90l崴@@GSZ)J> '8뽸u&F"6]A$s ƹKtî0>-`C.dޖR#)}>b5T1aOch^sOj!tdArmTzE[gƆOآ2s=EF@{5Ni JE:Cь~7NXK$h:᜴J Ȫ7|GƳ"4\<+oVZȁ:g^j|;{9r=&N~m"3,\AY`De,AO&T!)jUq@HWl؈!P=kɺ%GJ|^ ::6`e2Ƀ@{8Z8lP,0aSo 򩼙 ETsN.?!GI@ӌ-0-#K~Nu؁~<#ت{kP>/?mĽ-Wm99}Ft0*9M{t&c+TKoߎ{f\y%J (V\ZKu^F(O+՜/Fu(Pv|CHlg,xc~fLT<޷XIR; I9o(8||{Ğ#H5wNM'ߜ 9B hAVw|ԏճ,Ke`F= Ľ`u%5 g$7S>\ m@Q" ;)<x+দ" <.'o]H 'M\>vqm#hhФ^^B%=I <7 U'zzAyۿk_hFIg@Vo/ie` ^+ePPY|*I; ЉF3 )+'N)1sZ@$嗬=:70 %d5lQS 8[)cnFA:MC)4RZypI|IκluO ͒*]6Yr#e) B}#k l,JMоgPc254=:5Y6tpČV0N~!! zٹ! '}-/}#ۆoz#S~ ~M(T Hb: OL::h;زLJIaZωK#^2HkeR \ݭyL&>_;ϮIGsƼ?lJ3,xGYsV̥Xj- Mb$,c6 (K U7ej2Er3׬XXeHWAvړOtn肹,7++qXE15 ˴ UՅYV޽"! mC.ry( T jiBD]*9JmA:^֭@wk ɠ ?Xhm6"bYF>34da_P̫pUX: ^E`AWac(bBL^WW)QkLw+Az.,9s:o FY7_}W/m_^5 ڢρzdJ%&PG { # DrײbW5^ybAsj}4vŁt4˨ 3@X#MCrcFB5Q>վ;1L>/8M(P R1a b  w5Nl]}s@ E:M5UQ(R[P*R:sNژ91/!{^j\H3lngmѤBN(~!>ߎ)uJ& DPghk36UӺtt[1_ m_L̈xXYTpBpispN@p5z%C򏫃T!]E#-d@%0&Э B3ͷ`2 kpf^6(n@ 8Hl_P(QE5 \Hе»SzFD*[~d|D:E`Я  Nk*PVaicn߯NkDka۪-` (P`V|t<a>$^wVNw/&h*p}4 $BjJN9ge MW?4טR!q)Wlmk&91>7Cu@86u%Fb< J(הW~VlT@cٱuGԛdu1 1[CF$<Ğv5\wSoogJ u`gvgϜе,FBENYi˔&}fx&?lH(Vkr$FN+ 06kew̢( \v2 s"[xh6>9y 2oٽmL$x7t\n<2 F[HeˠKJj᜚@[ZwC\ޘ0u)X X#Ñj9&PYmaN!U΁hn-7YdUJs O8HP˝U+Frq6zt,?͆H5,+?&fSC`t ?O;T,*@d@“Oa6jFڐ=\n&.1 {b eNC N[7"HC=&!Tw-c~;*>Z4l]G{@>e\W嵾w} 9=eh\߉ 6t7L`\E14M1d)v=u~K8hL|Υ9l>=(D0^gaܬFfeYǴќ]ߘ@8q IçW]nf.9ɡZ 56 bS(w:.~.xY(96 @Z+X8s_a"52^qa' @eaI%S'ٓ6K~C|m׃yvrzÜ/&v9-e;F0 mBE|hIh7{h}NOeUh˗?if!1 IuoN d, kDIv2CqjT7-TYP篆e7Qi\mt@`e j 2Q/?NPSkseK/ySIq'P?rReE:UDv>gHBFjsuRV >BdjѬ<{ʑe dR,ț+Լ?譋 zH=C/glXCc޵ għ:iH89Đ8j+SRMϯ>h6Nq"_ (Mj}F/&J wӸ!:乃TpkF (ҧ̓ kb6{ HA-ei{?#P0K\Ӧɩa5sc&(vKbIh[pC|u5Bul$%b{Vvf\[tadPAgx^C27X-zA p5=QiMԜtUbBN:QئD#[9z.|cH$L<vͣ!I@U$l#란FbC|:Rse5OS&/UBJ>t{4*J`-A|)`R^=[WEXMC7Xiko1pNMM{ϐ9 z+^WŒ$?Uf %|F`.Hꏏ .sJ)YÄ_Na=A``, mD0P-f쁍Pi"tt{U5}*פtB<_tdsCs?O=0g85"tݹSjS4seƕ%i*qk 1,8T <Ɨ(E2 &]a9g԰YT=T㦸d_ 5/SŧEv3C}* X:];vrPӳt5/lGA8T$QܢZl o{d#=a(<P&fK>QvWMUGSHՀ|^*C#%8Q/¦13m#X:HM'7Wla`GW1+kBD|l8\Ǻՙ׳m( R zj=m[Ŀ䥸)+GB6W| kMQ7{L~<|=ɚBg8A,:V9WQ w۾0"+waVсWxV"8*w2[LQ RkOw nپA?8S 5S FVf]K3oڲ3}/N7!){mXlX!=fXξ"9vIIP|Ra,9D"~Ħu[/ 2vo8XT^cQ凜РW+vţ1 X LVjO:2p;  8o 㥱,d@ܗ <;F`n̗7l^/ vN|^:M_q9VB3G k{ '?Iw /Q]afd~ﱹDMB|2yxwZG5t4mRح{Oq6 !N]e7~-g@װz~X 7~[Lb3C ul53+@f'gk(1v/)~f_U[xehen$i%$uG:'qlÙQՖ9kb Fζ^n"Hɾ/ISǮkC^o2FTխ容͑GmC+^P}< |.'c:w5)E?~!j uq6"‚e d_ Gƹ[?t'* =rM1#Go~6[?y KZD|$Ǹ`"EؔY mR#_7R,>?U~`Sr3 ;ͱCjLsc`IDu)KxKV^,qAmc#$wia6>3Fҕυ@\ a'X/nu/דefaȲ_kJk _ӛRpq$I]$ܭ Gwn;c# ba'0:=E"QV*%CzVWs# .y]0]vw&f0-A%pe{nL8# ׄ)dm[mDb6WH:)d˞KH\QʞIIߡ\A׫Y)fg:e[(GqWRTD<~.I™!2ݢ;ȌMICU'b >j\܏E֔M;;}eȤ W216t4.M*En(nHN @L1G7%&SYQQ{YϜF%Aroy L T|T<`TD֩< Ź#\t_xE?Uu R<14w(/eEg+An FXBT/6MsJs$iCAQ,$/k"wcYAJ?WC~Qmi|' 2i0Mq9݊ -O|*}˥0J%Ǐx؉' &knjz~,.I#9h54㏣o\Cˆl[X z23~^رW|]ig>3 p[ CJp>kaQ4ZcMxZF#>bl)2귽 ( 3 )+ihϢ>ˋ݅ xfO5eԽA7hj0iI-`|~S=*(Pj>#]j?D-c8$4X@NG=Ջo5JR2 [B^Γ({S53/ԣ0\~!0Ba_@Zz Š="_'z Vv6رA%PHuG2Cl w G,\5*~H1JX]54Ua-IwFu?ru/O#&TP]:W'Z6}yNxWkz>Љ쏵j I<GI>Ev`=}Ay^K \Kg mmިnv!KXK}A"It*=Z_01`- G$apqj*gcBйXG Spwk* z!mTCF8R7$C Azx*W;ht-J3۷\5]XBc&?Sq}ژ[ 6(pv0<&Y7R ]G9u.<ٞ2Pk8<0 /}} \*~LMXT}F ԷoK{'߈@b%Po+S],P@Po<.rFsSfqo 9 >/XCS츇9xr,*Nf롛\Oo;Mo8+bO,Rh$UdWpΒt8Aiϒk,7{Ef#-%"PXS{D*ݠ<&P濒K j>ML$-*WQ/A+܋~!| J&7T'9Kg'G%bp*JTNXu׸ ?6 ݳmaNZMf́!WBޮm\&L|F4W?mwr-쒴lTcym P;OP$[Ez&~,xqo$ӳMGQ ,N!_'I 0Qx堒V+!)|tZ ~P! @sIcoЦ|="~,bzl趃sBrf+K?ټ<ɳ^MT@~00X虥@?ţJ2='< N0<摴e3D#IoH=a$>_|?Ug(}UuzO|:tkDD)8ea 3\tfv.:&Q90Q gGt$~,u]jx8&GݵX.J!(d'm?eeD24<ƍ<^H:1\ň`_@zwA<,[{Z$y#}BN.p2n &g jjX;yEhs/obtPPRLU7Ǖ^ (Es[ޮ~p޳gƃd6Н|r<}zB&42(}exCY1yZ?: 'V\d+ K4 ̞nf78=O%cz>^&WeÂ~BziGؤ.07*.Fcz߄HI}yzKg2Xa4_Ji"jwmY|I-F] dw @3kdQHxtQk\EQ쑴A岖fmAEe/돌x& Lrx$~A&u$LrREInMJ ѲdtHaJTK"}RKϭΡ le|&D5t۩F_՛ ոr>PTZ/7!A`jk&Uˤ,L&5'IecbSiyaڗ+c5o ?*#cƻ1j|%84Z>UE&=p=`D27AX1Ġ:mBgW"w{u)E<$P;e&$qkh}Z;cgWW]zLMNjZD-Le|E;r`7}c>%He T+Q\NKŏEZJi~jw{X&֓5SWkI_n.7rڭϖŸc]BFj{i(FX!56G&9wTDwӦyjGQC݆mgMLiW\I箹,xY1*R>؞C|(ZB_"D 򆝮^0gLA"G"|d1N݌*p0'e]-# Ԡչ d\D:y<ㄭ믁VWQfUeaxQw kKn6`@-kfjYGq3] )2%_83b> 0]/3 xdxڼi/bci9 4X_PPQVlm^zk;=Hzxt$PfVg۴؄aɛtF|6(\yO;m(pk*jSyJ<\oD+mow>='z1ZmXľSlz}0^|]5"{6܄7$,趇EtIha~ #(rm`:mƵ Zlٰ`87/o",) 3+j>6e6WM!N tokz({!4j4drʂu~ {ݎhZlƠӑ hW]*ͤf2(U%:H]_ybyu/ή!c\MRT(C $L|DIA,at~; S 4 &^D9Pf%8_/;2 Γz(ˬR4آpx}SI؅ss8h=Ct#|]&߶f JǎB)IG0ۯ|bN].ۡʜͽ ķ+WhQZV^&W~?}>3;]qflIX-th.WLY\TekF=/:[cYOM_#6d1]7{|Qi$}/'bR}.dõnߛB(W S0G9#CࡡjZE-3ޟq G \AW{e 7V&JR-29WZ\~1\uq^i u flTn 'Bv+Ji _N}xc:xn8]+RdlҟE~ʡsfM!,cD֊mK*f5 Þ~LxKB; 4ƯJ1h\Lֺkϳjձ:8św׌" x'< -#銺GT 3w ʻ-ND4`t!(q(T74Aݓ P嚠&ȶV繛J Vn98U3vvn}^#MEt-࿫nUC8,d^d6AEʶbp']%9&#pܧuKd;*phO' g9*Q32%^'IXY֖(CRzCa![ݎhW\d uݐru6HcHk$<yھ{Ʒ+4tx \%E+TVDct[ֺUfNڬVۆoAxH 5G fA8 ~X*B7=C#~yf/}.I'!!;@|d n_^1PzKQ#CDcS:U4:ÿpFߢ6N@*{"3 eM3nX %˧W0uל ÄMѻXo^;\Dֳ@42qԀ>qJ%vh=_-@ɣ@8Aybe3>U  lX,é<'=j1>k=ĉX)+a}%e)=b`dW22(<Au5/MxA.ͪIQ_:"+Q?)oyw`dp E~GbsZ`yYlGӬx(SU$7& fҢ4`u5MSSkO? N7]-[L9pG(RY\^ y s5:UK&3_'OV)\.%.<ו#,)5l5;'ސN}aKb[ h&<axBe:B}tF>`3 I^ՊBĈZAO4Gݒ\fH#!&*uβp*XYqA2G/3,GjoUiЇ msHeSyu#U} \L_#+b~7-xw"˲9fTS,.Zծ/@O%GnCiSthc_8'H[[eqU$nqD]Ϭө,mO3@ԅOoC8u* J*?/%اbD8-Iv?b'Vh= V-7SΫ4#&$|UYc9|&T/[' r*rյS91r}|K|sdzRxLJ&2M6&$ UY3bHr b>(K f7nH4AUXQ|j p9Y=_?p9"Ι+~T7R *%lT3{4tCHPw̽+zbƿ\SMw[؛f-AZ,ܝ Z\q,\KV|)ЙB6qQ-FB줚E!~Tdik b½ޝA8e/,דQcC~PpCA !^a:xgd\KFYCrER6ziTs5U'TQ6+K(Φ+pyd*\ƒy̰jЃ[2To׍%2 XnjXtzf H=%@*6 SHE,ݰ]h] +7~LKE%> Qv7>w-[tn-i,Ȭg?}י2]@<Řw]ENx c%Hz$NQQ);?Lwl7,L'J6/D*^&3%`>X $/9 ˗oՋB*ʛ49|vI] 5rSliP pe1ڭwm͢3W0:L7Y $SԴ";7NXUAeT_ t ;7T5SB9\&ݝ7du6Xsyuj*ue.Mc@g|\,AhWQeK@1.RQ{ijx4k)cY J?6ū)|n dPAQnG(+_*%oEnfO ]7  DT&J A#5jרL&Z닔1փ?h_;!njUL]XG[u"F!!i:[9dwt۞\ ٥VJ1vFm3৪(\޵!Z;ڂu'рB-2gz,W?NBɪ~292C!m$jL.W&|^~DʹJ!)9[Ei8>&:dA |ܫjA~<HZC\OקdO!Ieާ!O "eYoUE++~dqUօK=:4j+oN^3f ٚ0wTǬ]|Xv4ȝ#9>Kw߿gڼ܍*ZSNaX)U{aX4hP{#iL'[N]?9f(p/AMgu(I}#-cO%ĺKy ID#`&I-䧉Ŝ,!U;z;154ݪT#5,C7.M @0!Wo lHliXf@U2̀K_iK'nR,a~b7>pDSAoeCyrL>Tw,(V<e4|,{ڿ3cɋr3wbzbADCWp]&~D)_OQyOp/;yq!`ƻہ3]!aSUe#v ?Mh6jcufc#W yޅ)dzP0&yg5F0ç4u䯲{={uZAOkY㚙!wdGEY4U %.:J$t.E6UA7%?g}m0z.:]g~ X}#%JfSglQRPئȓ;ѮUGk>Pp)}\ E塎3tFUYoWA9T1Rys( *,ĭm82D<:3V/6Z2xc]ExS|{\CI(xxSȱwR$ҙL8plmwҏLpwU [dC5 拏*Jbs 0S5gTXS 8H_-ɇ=f5{X0l$Jh>nG.a}H,DF]\I5mB7蕕 K MX/gsf1ϡbaVv+}de]ɕ4"hnF{*#4QWzV-; U{ve>;13qr'5f-U뮹C[&@707d$1Z 9E2+6jmյbbaKF.ˀw4na@Qu1aW;F4DK̉0/,2SX@?WLK9@ڂvyե[ 0T1 })g71:H ,7*w@/E ~z4J!ǽ[qޙ{NV?~d8gx7յ Q㶈VNWkvpٱx+&\QMywq99rqMS)HK*j9y^FhOT*3,j{-A IlzB5S!6:'0z ,1Od˛UHe:՚Cg@b^B.Y G9ޣLgƔ'GEF& l8Z +0'CzPɰ uj<,ox }jIޗeD7357WkqHz`Z3Et J룒'qyg#)h&+N> u:%Qoce1iR62eJoCi]cD:-&okêMADmV l78i' #'l|n+o/Y2j@ˌ55h{,$k %oJ]CIf"qJFV'#]gB1MY;0f\nـ)9f9B8U|wWݗGm"`м${͠DbTa^Lq$c_s$L t tjhaXdN!n3qCAmW`x۸4a`*d5/`x՗$ t[ .q86%\CUXx-ef?l7틖: ޜDMVSrה$r+>8w{ A &mv ,Q=4emO>;EcI!fc^ZɎ=ptd> o~wQ $p*qG5*z2 'zlqm!cVMǥѤd[I-'Xȗf.U2g1T$t~*qڄˇSV" !a9̀+E=-~dF#[vb+%4FE4X""H3e]_,"NHoQ'hX=g^SBEr-x[Iu!lrY ?yI־4Cs:X ApB:}4xGuT ?[}ǩybA$lsvWU~CR~Pvʅt t"~LqѡIgpcNb̓TPu  jNYo&EQf݇3aG Q(uk7椉 [gWEGȧK|/ U2kJrwNm}l -L|M]T5#ދNu۩AlS z7RFVɎ9ij}-qL"C4Tm8]q1TUy5/sS V'!1o(ZSX k$]7^_pҁ!qMP-m?Բz`y6x 0n ΂B\v_e;_hr^c҄M9RnZӄК(>A) N4ꈙ3B"5x4]"Oߢ4p%ҳtlt|^fixvV}v=|\]tQFad_67yakEV͢wk%75s0]n^(8*<|>20j8b0f]'b0WM, m3@8q`)0B+\RRACR@tXB 3`Eqn(†=OaB;}:!K ^"h}p\^E:[X$aP@Z06踩l܃F6V_eq@l 'yAcJVcr!QCR7GM[^=H]vN:(Bs-nawzt fln%QξT؟ZC~:oSh?E~J5u;~zxv2+J;Y j [̿~4B*f/^:-c)"t(<bb59-ks#C <6(zv kHE+#4]c|U+te\v̬) Фo.9b)CX'0Hh㑰N+Sc&x8FeJѪ ?k9IkrG52XaN$.Q6]YwĊk3~h3FHz)LNnFRe*rX Bu^hӂ. s&; l m{Ήшz7Y-h l1MN@:.$;;ƺcuy+AAwg6 N,I YԹ$D.}9MH<cxRj>{Ģ;mNB NBZݥPC.4J~9[d8dK EiHC..*:#b=nŚ`3=*t#ubaX -2*낔Ve˟$7Vc9uc09$樥jD]=>?=QVZ" koى=3Q>]\XP"CfIlԽY@a\@-EV_ Sb;=4 UR@Kn'pl:`1.ZI{0n&"Q@.#J{`"e }=Iy2hK-ő,"vqPiVTlgQ~7%ѷXjgK'v+o4A<١:,u8r-6ŃL-"q2:j7vkeFak\x+=9s)H%a;o7R`pKWbT!yXП.?|\iiϚ%9T;f5P%ڱlK(74C=b,. ]HH2ZA`tt?S^* -Q4׫s]cdA Q@YZsurveillance/data/shadar.RData0000644000176000001440000000224011765414544016077 0ustar ripleyusersڇeI RjP1TTRB\u6$)q/{{.7~pӻw{{I- 0DLZL_#c}sd"kL`a Ê-ײ}~x~fAb1xbq,%Q4A=rX1 AVP85b% XbVHh15&Xb= 0Mac4cǦ c [cLĶ=v -`Wݱ^HmH"hGSЉBݘ>WC=b?p LCp(8G(cp,f8p"N843p&8<"\Kp).W*\kp-7&܌[p+nw.܍{p/x!_+|o-?'_+~/0/_!_!_!{nB /俐B /俐B /俐B /俐BK 俐B /ċϦwa㼳4F~c}ԱF.0Z?j7qLvz>1ޞVE[W޶t~dKLvE/Nx?zN_g_ߟ,+ݏ* ug-Ao}wOmۢ-)Q+Wߑ<\y뾰Q?U=o]r7<ϡJu巽=Fyζ?J9>>@~ }FGg1zJW-կWt%Wvbئ*?ӚKe5 KX%,a ,,2ߔ]Uy] |"Wa Vbz01a cѽ+x ma;4Ң3R)6]PXRLO#-ug{:tk|6fǜMMټI[g"ggbl?y0E"surveillance/data/meningo.age.RData0000644000176000001440000000246611765414544017036 0ustar ripleyusersYsDg^{qpHp&6B !enֶ^b:k; gS*^x灯 @?x%M{{$v|pqhdšOƘdi.j5[`å+jƪwE' kr_^Pkw8<l ` .[p) \[*p5 Ap-0\F FvNp F=vw=^p<8x< x<O3YI0 0yp̂9m0X` x+x &x p|>O3p|_曇6ly+y1su2?C͈nVt3rl)OE$ ]-d4y寎?@ݟU10q^([/+h7l{JцlxjuW}c:MW'_TkF9_^j,kUܗb'9fceI@$}(ɽ5^~ Mr/fNdxzə8t~b 2m&\UOY9Ss}%%uN۬_9`&Y\RHs,e5ދhyoĚnK\FWl}FgfqTm[e[-Kme>QoqwA3oCb|~X%c~:=j=` ?vuX3qf=,P.痵B; >299sjguc}N&΃܋\cp}e+T^F#~=˪I30^Κ{ak_@!==ǘxe̬+sXg~w~i~C;9ޓUq^T?hLbOnΉ{لJ*\d_SD,=K$(;$p620MuWWJ\s5\s5\s5\s5\sm՚a0kwn=r7qۘon't5'^9N:䚓?>uI'\sSN:3ֿ>Zso;?M3̀?ؔaw/ٞ\:iްX_ҊRgݦFu=4[_l[{;)߉*Ŵ'Szaͅ}vC"<'%^{ 7surveillance/data/s1.RData0000644000176000001440000000050311765414544015160 0ustar ripleyusersVN1 v~@TbX*/@NLS׃Pq9:<o lHT_bI%v|wgbQmhSG3 7PlȚL`@8rM`k1IGK9y#OCde#Z6nXӶqK=qiMrQK\]>#{Mm5u>jԴ/ݟҳ \q4l=}}`\>9??P68{;WA.k PPiǔ%gwfOӅ surveillance/data/s3.RData0000644000176000001440000000047111765414544015166 0ustar ripleyusersVN0 utI |; qڵw&/@$U,^i&$/_c-қD:?hyȞth?Hހ3Բ}xY㒏ikXQz7+h`1m ؛}5{}i:q*'=u^KȵPSUVgNϙ}Ve=>8K&L8\~u"Gfu5y|V/ͳYR96o5ρo+mK=5AJ;>vݯdJI surveillance/data/m3.RData0000644000176000001440000000042111765414544015153 0ustar ripleyusers r0b```b`bad`b2Y#'H<טY$ ļ@|8E!a PM 6ıabHvK"<K1(d@, 3@aÆvV(fڅl'es(.@|^KQ0 F  0Ac(Cּb Cܨ r'$B9,iEHE%F&$Ì A•t rb surveillance/data/ha.RData0000644000176000001440000000330711765414544015232 0ustar ripleyusersYsf4MܴbگL/zUnCcǤ@/4=2輄, Ŝg,}$Ы=\wqo8=iOqn>i9-ȃFuҩ':zi4sU*3R2s(Mפ^J}CMޖzG]ޗ@C>DSt9>BKF[菉AG~:r I>>>۸>/$Yq{0<'n k&Ț0k&7MH;W;hikhjik::SO:E۫콊eF1'Wqz̻}eۖ\%뺏0xМEǒ<UU]:=,;ݼy\WMXw:Ee^Ӭ~z~YèmyoԵokK_L.O>5U$[vGewuaN?nuwì?k?='3YYWswzY?F<,_ 0 0_]0 0 cCaa:v>daƮcCaa:v>daƮcCaa:v>daƮcCaa:v>daƮcCaa:v>daƮ|(gOߒc:jMW0}ܼϝOׯ|NWC>ɾw~0~|0g~˦8|{5~1LN}ik0/IcfWtwGي_ݥsurveillance/data/deleval.RData0000644000176000001440000000142511765414544016255 0ustar ripleyusers R@mRA[6Yh#>6RVfܝt䷛_69t-#q 1h6٬DmwV0y||B;*DHn+A.Vۡ `7쁽80p 8 4~8 < p . :܀p pF`܅{pCx )?#2f02.|=(Up/]gDR7r2$JP}4YbtEYM-eM~surveillance/data/m1.RData0000644000176000001440000000034011765414544015151 0ustar ripleyusers r0b```b`bad`b2Y#'H<אY$ ļ@|!fb~ bnPq^8b>$sكF4LmG*nǀK$ԥG(`XPL]D=:dKM-2 D G~RqjQYj LQqIbI*ÒVZ$QTndrNb1HPdO,(O20 surveillance/data/h1_nrwrp.RData0000644000176000001440000000043511765414544016401 0ustar ripleyusers r0b```b`bad`b2Y#'0+*/*```I1/_d@F ccˌfEӋF6Đ1AM6w2"ɀĊGW˄f':B=> . sC7T-{ aǀF(`X 0AJ5/17`7 ԢĒT(%(Ib:$ȞYPda o surveillance/data/measles.weser.RData0000644000176000001440000000311211765414544017411 0ustar ripleyusers]oU?s7nmA P,TAJ.6,xlS/AbG$O>H1>vηәvml~ɏ73g9辮^saB!2a !.sa_ B͸8X*(p{MA VZmvR2 ֻx'.{+| p%!U5G>|vMt0 |p iV`'m.snv]{{=/_< < | :0<}q@H8MxBD9s sIku[jFqNFm~8sW#>bⳠ1}eQccjDLQώTQPpQe}?Ê`~o8/=y`V&mEAz9nT[ C"<2q}VQוUMj>K'j[5~u0 YNU9JԾ9>Գ~ztĽQ&hzp5L*ENF(4SNZli]3Zh3z;Zjr줵XuRek?0 `0 `0 `0 `0 `0 `TՐO9ǟ#BTJŊgTf$i_JJ$*.c9]W&ܯJӸ};ƕqŵfOzN=?s[AZVVنϵ&K#Vv]geeMԯWYYYWk5~51G Gʚ@?]\deeM _>}YVVz\zXYY腷txs++kʚ@?cXYYoʚ@nϗt_deeu`A*!PYJ0T/ ya C\*Bv)ȤȢȦ(CCKGyaI&yaI&yaEyXaEyXaEyaM6yaM6yaG<(FRʍI6m$HJf#)FR鐇Cy8ᐇCy8ᒇK.yᒇK.yᒇKyxᑇGyxᑇGyx%,yd#KYȒG<%Hu尣*hT9\ht ,;w\Z=o5?؆oV67u+~ڡ8%'cS|^h=?yj87:?]:7: 犪%FнbO!?< ݈surveillance/R/0000755000176000001440000000000012242645665013213 5ustar ripleyuserssurveillance/R/twinSIR_intensity.R0000644000176000001440000002772011775051460017005 0ustar ripleyusers################################################################################ # Authors: Sebastian Meyer, with contributions by Michael Hoehle # Date: 02 June 2009, modified 25 Mar 2011, 27 Jun 2012 # # This file contains functions related to calculating and plotting intensities. ################################################################################ ################################################################################ # Calculate the two components of the intensity lambda(t|H_t) for each row # of the event history. # Be aware that the function assumes atRiskY == 1 in all rows! # # ARGS: # theta - parameter vector c(alpha,beta), where # beta also contains the baseline coefficients in the first place # X - covariate matrix related to alpha, i.e. the epidemic component # Z - covariate matrix related to beta, i.e. the Cox-like endemic component # # RETURNS: a numeric matrix with two columns e and h and nrow(X)==nrow(Z) rows ################################################################################ .eh <- function(theta, X, Z) { # Extracting params from theta dimX <- dim(X) nRows <- dimX[1] # = nrow(Z) px <- dimX[2] pz <- ncol(Z) alpha <- theta[seq_len(px)] beta <- theta[px + seq_len(pz)] # Calculate the epidemic component e(t|H_t) and the endemic component h(t) e <- if (px > 0L) drop(X %*% alpha) else numeric(nRows) h <- if (pz > 0L) drop(exp(Z %*% beta)) else numeric(nRows) # Return the two components of the infection intensity related to the # rows of the event history in a two column matrix eh <- cbind(e = e, h = h) return(eh) } ################################################################################ # Cumulative hazard function # # \Lambda(t) = \int_{timeRange[1]}^t \lambda(s) ds, # # where \lambda(s) = \sum_{i=1}^n \lambda_i(s) # # Be aware that the function assumes atRiskY == 1 for all rows of X/Z/survs !!! # # ARGS: # t - scalar time point until we want to integrate, must be non-negative # theta - parameter vector c(alpha,beta), where # beta also contains the baseline coefficients in the first place # X - covariate matrix related to alpha, i.e. the epidemic component # Z - covariate matrix related to beta, i.e. the Cox-like endemic component # survs - data.frame with columns id, start, stop, event; "timeRange" attribute # weights - vector of length nrow(X) indicating the number of individuals # with the same covariates. weights are allowed to change over time. # Note: it is assumed that none of the individuals covered by # "weights" can have an actual event, if so they need to have their # own row # # RETURNS: value of the cumulative hazard function at time t ################################################################################ Lambda <- function(t, theta, X, Z, survs, weights) { timeRange <- attr(survs, "timeRange") eh <- if (!isScalar(t) || t < timeRange[1L]) { stop("invalid argument 't': must be a scalar >= ", timeRange[1L], " (beginning of observation period)") } else if (t == timeRange[1L]) { return(0) } else if (t < timeRange[2L]) { # We have to extract the relevant intervals sortedStop <- sort(unique(survs$stop)) # Find first stop time beyond t idx <- match(TRUE, sortedStop >= t) firstBeyondt <- sortedStop[idx] includeSurvsRow <- survs$stop <= firstBeyondt # If t between start and stop of an interval we need to chop... if (firstBeyondt != t) { survs$stop[survs$stop == firstBeyondt] <- t } # Extract relevant parts survs <- survs[includeSurvsRow,] weights <- weights[includeSurvsRow] .eh(theta, X[includeSurvsRow,], Z[includeSurvsRow,]) } else { # if t >= attr(survs, "timeRange")[2], we take all rows .eh(theta, X, Z) } lambda <- rowSums(eh) dt <- survs$stop - survs$start intlambda <- sum(weights * lambda * dt) # no individual sums as in loglik return(intlambda) } ################################################################################ # Function to plot the path of the infection intensity or the proportions of # the endemic or epidemic component, either on an individual basis or related # to the total intensity at each event (=infection) time. # The function works with objects of class "simEpidata" # as well as with objects of class "twinSIR". ################################################################################ # 'model' is the result of getModel(x) # if x is of class "twinSIR": theta = (alpha, beta) = (alpha, (h0coefs, betarest)) # if x is of class "simEpidata": theta = (alpha, 1, betarest) # per default, the function uses the fitted or true parameters, respectively intensityplot_twinSIR <- function(model, which = c("epidemic proportion", "endemic proportion", "total intensity"), aggregate = TRUE, theta = NULL, plot = TRUE, add = FALSE, rug.opts = list(), ...) { which <- match.arg(which) ## model components survs <- model$survs start <- attr(survs, "timeRange")[1L] end <- attr(survs, "timeRange")[2L] timeIntervals <- unique(survs[c("start", "stop")]) timepoints <- unique(c(timeIntervals$stop, end)) # need 'end' here, because model does only contain rows with atRiskY == 1, # otherwise would terminate in advance if all individuals have been infected nTimes <- length(timepoints) idlevels <- levels(survs$id) ## helper function for use with by() intensity <- function(iddata, what) { # 'iddata' will be a subset of survs, 'what' will be "wlambda" or "we" y <- numeric(nTimes) # zeroes y[match(iddata$stop, timepoints)] <- iddata[[what]] y } ## Calculate epidemic (e) and endemic (h) component in each row of the model eh <- do.call(".eh", args = c(list(theta = theta), model[c("X", "Z")])) ## Calculate individual _total intensity_ paths lambda <- rowSums(eh) survs$wlambda <- as.vector(model$weights * lambda) ## put individual intensity paths into a matrix [nTimes x n] wlambdaID <- by(data = survs, INDICES = survs["id"], FUN = intensity, what = "wlambda", simplify = FALSE) # initially infectious individuals (without re-infection) don't appear in # survs, since they are never atRiskY => wlambdaID[[i]] is NULL for such an # individual i but should be a 0-vector of length nTimes initiallyInfected <- names(which(sapply(wlambdaID, is.null))) #if (length(initiallyInfected) > 0L) # not necessary wlambdaID[initiallyInfected] <- rep(list(numeric(nTimes)), length(initiallyInfected)) wlambdaIDmatrix <- as.matrix(as.data.frame(c(wlambdaID), optional = TRUE)) ## alternative way but slower: ## wlambdaIDmatrix <- matrix(0, nrow = nTimes, ncol = length(idlevels), ## dimnames = list(NULL, idlevels)) ## for (ID in idlevels) { ## iddata <- survs[survs$id == ID,] ## wlambdaIDmatrix[match(iddata$stop, timepoints), ID] <- iddata$wlambda ## } if (which != "total intensity") { ## Calculate individual _epidemic intensity_ paths survs$we <- { px <- ncol(model$X) if (px == 0L) { stop("nothing to do, model does not contain both components") } as.vector(model$weights * eh[,1]) } ## put individual epidemic intensity paths into a matrix [nTimes x n] weID <- by(data = survs, INDICES = list(id = survs$id), FUN = intensity, what = "we", simplify = FALSE) # we have to replace NULL entries by numeric(nTimes) (cf. wlambdaID) weID[initiallyInfected] <- rep(list(numeric(nTimes)), length(initiallyInfected)) weIDmatrix <- as.matrix(as.data.frame(c(weID), optional = TRUE)) ## alternative code which is slower: ## weIDmatrix <- matrix(0, nrow = nTimes, ncol = length(idlevels), ## dimnames = list(NULL, idlevels)) ## for (ID in idlevels) { ## iddata <- survs[survs$id == ID,] ## weIDmatrix[match(iddata$stop, timepoints), ID] <- iddata$we ## } } ## Generate matrix with data for 'matplot' ydata2plot <- if (which == "total intensity") { if (aggregate) { rowSums(wlambdaIDmatrix) } else { wlambdaIDmatrix } } else { # calculate epidemic proportion if (aggregate) { rowSums(weIDmatrix) / rowSums(wlambdaIDmatrix) } else { weIDmatrix / wlambdaIDmatrix } } if (which == "endemic proportion") { ydata2plot <- 1 - ydata2plot } ydata2plot <- as.matrix(ydata2plot) colnames(ydata2plot) <- if (aggregate) which else idlevels if (which != "total intensity") { # there may be NAs in data2plot where the total intensity equals 0 # => when calculating proportions we get 0 / 0 = NA # we redefine those values to 0. (0-intensity => 0-proportion) ydata2plot[is.na(ydata2plot)] <- 0 } # prepend time (x) column data2plot <- cbind(stop = timepoints, ydata2plot) # if the epidemic is SIRS or SIS (re-susceptibility), there may be time # blocks during the observation period, where no individual is susceptible: # Problem: those time blocks are not included in the model component, # which only contains rows with atRiskY == 1 # Solution: fill the missing time periods with 0 intensity (or proportion) innerStart <- timeIntervals[-1L, "start"] innerStop <- timeIntervals[-nrow(timeIntervals), "stop"] noSusceptiblesStopTimes <- innerStart[innerStop != innerStart] if (length(noSusceptiblesStopTimes) > 0L) { data2plot <- rbind(data2plot, cbind(noSusceptiblesStopTimes, matrix(0, nrow = length(noSusceptiblesStopTimes), ncol = ncol(ydata2plot)) ) ) data2plot <- data2plot[order(data2plot[,1L]),] } ## Plot and return data if (plot) { dotargs <- list(...) nms <- names(dotargs) if(! "xlab" %in% nms) dotargs$xlab <- "time" if(! "ylab" %in% nms) dotargs$ylab <- which if(! "lty" %in% nms) dotargs$lty <- 1 do.call("matplot", args = c(list(x = c(start, data2plot[,1L]), y = rbind(data2plot[1L, -1L, drop = FALSE], data2plot[ , -1L, drop = FALSE]), type = "S", add = add), dotargs)) if (is.list(rug.opts)) { if (is.null(rug.opts$ticksize)) rug.opts$ticksize <- 0.02 if (is.null(rug.opts$quiet)) rug.opts$quiet <- TRUE do.call("rug", args = c(list(x = attr(survs, "eventTimes")), rug.opts)) } invisible(data2plot) } else { data2plot } } ### intensityplot-methods for objects of classes "twinSIR" and "simEpidata" intensityplot.twinSIR <- function () { cl <- match.call() cl[[1]] <- as.name("intensityplot_twinSIR") names(cl)[names(cl) == "x"] <- "model" cl$model <- quote(getModel(x)) if (is.null(theta)) { cl$theta <- quote(coef(x)) } eval(cl) } intensityplot.simEpidata <- function () { cl <- match.call() cl[[1]] <- as.name("intensityplot_twinSIR") names(cl)[names(cl) == "x"] <- "model" cl$model <- quote(getModel(x)) if (is.null(theta)) { config <- attr(x, "config") cl$theta <- quote(c(config$alpha, 1, config$beta)) # 1 is for true h0 } message("Note: the (true) baseline hazard is only evaluated", " at the beginning of the time intervals") eval(cl) } formals(intensityplot.twinSIR) <- formals(intensityplot.simEpidata) <- c(alist(x=), formals(intensityplot_twinSIR)[-1]) surveillance/R/wrap_univariate.R0000644000176000001440000001462011731650466016536 0ustar ripleyusers############################################################################## # This function is a wrapper for univariate surveillance algorithms # using the old disProg and survRes object # # An sts object is given and a pre specified algorithms is ran # by successively creating a disProg object for each region, # running the algo and then assign the slots of the resulting survRes # object to an sts object. ################################################################################### ###Apply other algorithms by wrapping up a suitable package. #Wrapper function to call algo.farrington for each time series in an sts object wrap.algo <- function(sts, algo, control, control.hook=function(k) return(control), verbose=TRUE,...) { #Number of time series nAreas <- ncol(sts@observed) nTimePoints <- nrow(sts@observed) nAlarm <- length(control$range) #Create alarm matrix having same size as sts sts@alarm <- matrix(NA,ncol=nAreas,nrow=nTimePoints,dimnames=dimnames(sts@observed)) sts@upperbound <- matrix(NA,ncol=nAreas,nrow=nTimePoints,dimnames=dimnames(sts@observed)) #Loop over all regions for (k in 1:nAreas) { if (verbose) { cat("Running ",algo," on area ",k," out of ",nAreas,"\n") } ##Create an old S3 disProg object disProg.k <- sts2disProg(sts[,k]) #Use the univariate algorithm (possibly preprocess control object) kcontrol <- control.hook(k) survRes.k <- do.call(algo,args = list(disProg.k, control=kcontrol)) #Transfer results to the S4 object if (!is.null(survRes.k)) { sts@alarm[control$range,k] <- survRes.k$alarm sts@upperbound[control$range,k] <- survRes.k$upperbound #Control object needs only to be set once sts@control <- survRes.k$control } } #Reduce sts object to only those obervations in range sts@observed <- sts@observed[control$range,,drop=FALSE] sts@state <- sts@state[control$range,,drop=FALSE] sts@populationFrac <- sts@populationFrac[control$range,,drop=FALSE] sts@alarm <- sts@alarm[control$range,,drop=FALSE] sts@upperbound <- sts@upperbound[control$range,,drop=FALSE] #Set correct theta0t matrix for all sts@control$theta0t <- control$theta0t #Fix the corresponding start entry start <- sts@start new.sampleNo <- start[2] + min(control$range) - 1 start.year <- start[1] + (new.sampleNo - 1) %/% sts@freq start.sampleNo <- (new.sampleNo - 1) %% sts@freq + 1 sts@start <- c(start.year,start.sampleNo) sts@epoch <- sts@epoch[control$range] sts@epochAsDate <- sts@epochAsDate #Ensure dimnames in the new object sts <- fix.dimnames(sts) return(sts) } #Farrington wrapper farrington <- function(sts, control=list(range=NULL, b=3, w=3, reweight=TRUE, verbose=FALSE,alpha=0.01),...) { wrap.algo(sts,algo="algo.farrington",control=control,...) } #Bayes wrapper (this can be implemented more efficiently) bayes <- function(sts, control = list(range = range, b = 0, w = 6, actY = TRUE,alpha=0.05),...) { if (sts@epochAsDate) { warning("algo.cdc currently can't handle Date entries. Computing reference values based on freq") } wrap.algo(sts,algo="algo.bayes",control=control) } #RKI wrapper rki <- function(sts, control = list(range = range, b = 2, w = 4, actY = FALSE),...) { if (sts@epochAsDate) { warning("algo.cdc currently can't handle Date entries. Computing reference values based on freq") } wrap.algo(sts,algo="algo.rki",control=control,...) } #outbreakP wrapper outbreakP <- function(sts, control=list(range = range, k=100, ret=c("cases","value"),maxUpperboundCases=1e5),...) { wrap.algo(sts,algo="algo.outbreakP",control=control,...) } #HMM wrapper hmm <- function(sts, control=list(range=NULL, noStates=2, trend=TRUE, noHarmonics=1,covEffectEqual=FALSE),...) { if (sts@epochAsDate) { warning("algo.cdc currently can't handle Date entries. Computing reference values based on freq") } wrap.algo(sts,algo="algo.hmm",control=control,...) } #Cusum wrapper cusum <- function(sts, control = list(range=range, k=1.04, h=2.26, m=NULL, trans="standard",alpha=NULL),...) { wrap.algo(sts,algo="algo.cusum",control=control,...) } #GLRpois wrapper glrpois <- function(sts, control = list(range=range,c.ARL=5, S=1, beta=NULL, Mtilde=1, M=-1, change="intercept",theta=NULL),...) { wrap.algo(sts,algo="algo.glrpois",control=control,...) } #GLRnb wrapper glrnb <- function(sts, control = list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept",theta=NULL,dir=c("inc","dec"), ret=c("cases","value")), ...) { wrap.algo(sts,algo="algo.glrnb",control=control,...) } #### this code definitely needs some more documentation -- wrap.algo atm is # 100% without docu #Rogerson wrapper # theta0t now has to be a matrix #library(surveillance) #data("ha") #rogerson(disProg2sts(ha),control=list(range=200:290,ARL0=100,s=1,theta0t=matrix(1,nrow=91,ncol=12))) rogerson <- function(sts, control = list(range=range, theta0t=NULL, ARL0=NULL, s=NULL, hValues=NULL, distribution=c("poisson","binomial"), nt=NULL, FIR=FALSE,limit=NULL, digits=1),...) { if (sts@epochAsDate) { warning("algo.cdc currently can't handle Date entries. Computing reference values based on freq") } #Hook function to find right theta0t vector control.hook = function(k) { #Extract values relevant for the k'th component control$theta0t <- control$theta0t[,k] if (is.null(control[["nt",exact=TRUE]])) { control$nt <- sts@populationFrac[control$range,k] } else { if (!all.equal(sts@populationFrac[control$range,k],control$nt[,k])) { warning("Warning: nt slot of control specified, but specified population differs.") } else { control$nt <- control$nt[,k] } } #If no hValues given then compute them if (is.null(control[["hValues",exact=TRUE]])) { #This code does not appear to work once n is big. # control$hValues <- hValues(theta0 = unique(control$theta0t), ARL0=control$ARL0, s=control$s , distr = control$distribution, n=mean(control$nt))$hValues control$hValues <- hValues(theta0 = unique(control$theta0t), ARL0=control$ARL0, s=control$s , distr = control$distribution)$hValues } return(control) } #WrapIt wrap.algo(sts,algo="algo.rogerson",control=control,control.hook=control.hook,...) } surveillance/R/modifyListcall.R0000644000176000001440000000220412060143477016303 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Function to modify a list _call_ according to another one similar to ### what utils::modifyList (by Deepayan Sarkar) does for list objects. ### ### Copyright (C) 2012 Sebastian Meyer ### $Revision: 463 $ ### $Date: 2012-12-06 17:26:39 +0100 (Don, 06 Dez 2012) $ ################################################################################ is.listcall <- function (x) { is.call(x) && as.character(x[[1]]) %in% c("list", "alist") } modifyListcall <- function (x, val) { stopifnot(is.listcall(x), is.listcall(val)) xnames <- names(x)[-1] for (v in names(val)[nzchar(names(val))]) { xv <- if (v %in% xnames && is.listcall(x[[v]]) && is.listcall(val[[v]])) modifyListcall(x[[v]], val[[v]]) else val[[v]] x[v] <- list(xv) # allows for NULL value of val[[v]] } x } surveillance/R/catCUSUM.R0000644000176000001440000002051011731650466014715 0ustar ripleyusers######################################################################### # Categorical CUSUM for y_t \sim M_k(n_t, \pi_t) for t=1,...,tmax # Workhorse function doing the actual computations - no semantic checks # are performed here, we expect "proper" input. # # Params: # y - (k) \times tmax observation matrix for all categories # pi0 - (k) \times tmax in-control prob vector for all categories # pi1 - (k) \times tmax out-of-control prob vector for all categories # dfun - PMF function of the categorical response, i.e. multinomial, binomial, # beta-binom, etc. # n - vector of dim tmax containing the varying sizes # h - decision threshold of the Categorical CUSUM ######################################################################### catcusum.LLRcompute <- function(y, pi0, pi1, h, dfun, n, calc.at=TRUE,...) { #Initialize variables t <- 0 stopped <- FALSE S <- numeric(ncol(y)+1) U <- numeric(ncol(y)+1) #Run the Categorical LR CUSUM while (!stopped) { #Increase time t <- t+1 #Compute log likelihood ratio # llr <- dmultinom(y[,t], size=n[t], prob=pi1[,t],log=TRUE) - # dmultinom(y[,t], size=n[t], prob=pi0[,t],log=TRUE) llr <- dfun(y=y[,t,drop=FALSE], size=n[t], mu=pi1[,t,drop=FALSE], log=TRUE,...) - dfun(y=y[,t,drop=FALSE], size=n[t], mu=pi0[,t,drop=FALSE], log=TRUE, ...) #Add to CUSUM S[t+1] <- max(0,S[t] + llr) #For binomial data it is also possible to compute how many cases it would take #to sound an alarm given the past. if (nrow(y) == 2 & calc.at) { #For the binomial its possible to compute the number needed for an #alarm exact if (identical(dfun,dbinom)) { #Calculations in ../maple/numberneededbeforealarm.mw at <- (h - S[t] - n[t] * ( log(1 - pi1[1,t]) - log(1-pi0[1,t]))) / (log(pi1[1,t]) - log(pi0[1,t]) - log(1-pi1[1,t]) + log(1-pi0[1,t])) U[t+1] = ceiling(max(0,at)) } else { #Compute the value at by trying all values betweeen 0 and n_t. If #no alarm, then we know the value for an alarm must be larger than y_t if (S[t+1]>h) { ay <- rbind(seq(0,y[1,t],by=1),n[t]-seq(0,y[1,t],by=1)) } else { ay <- rbind(seq(y[1,t],n[t],by=1),n[t]-seq(y[1,t],n[t],by=1)) } llr <- dfun(ay, size=n[t], mu=pi1[,t,drop=FALSE], log=TRUE,...) - dfun(ay, size=n[t], mu=pi0[,t,drop=FALSE], log=TRUE, ...) alarm <- llr > h-S[t] #Is a_t available, i.e. does a y_t exist or is the set over which to #take the minimum empty? if (sum(alarm)==0) { U[t+1] <- NA } else { U[t+1] <- ay[1,which.max(alarm)] } } } #Only run to the first alarm. Then reset. if ((S[t+1] > h) | (t==ncol(y))) { stopped <- TRUE} } #If no alarm at the end put rl to end (its censored!) #Question: Is this not automatically handled? if (sum(S[-1]>h)>0) { t <- which.max(S[-1] > h) } else { t <- ncol(pi0) ##Last one } #Missing: cases needs to be returned! return(list(N=t,val=S[-1],cases=U[-1])) } ###################################################################### # Wrap function to process sts object by categoricalCUSUM (new S4 # style). Time varying number of counts is found in slot populationFrac. # # Params: # control - list with the following components # * range - vector of indices in disProgObj to monitor # * h - threshold, once CUSUM > h we have an alarm # * pi0 - (k-1) \times tmax in-control prob vector for all but ref cat # * pi1 - (k-1) \times tmax out-of-control prob vector for all but ref cat # * dfun - PMF to use for the computations, dmultinom, dbinom, dBB, etc. # ... - further parameters to be sent to dfun ###################################################################### categoricalCUSUM <- function(stsObj, control = list(range=NULL,h=5, pi0=NULL, pi1=NULL, dfun=NULL, ret=c("cases","value")),...) { # Set the default values if not yet set if(is.null(control[["pi0",exact=TRUE]])) { stop("Error: No specification of in-control proportion vector pi0!") } if(is.null(control[["pi1",exact=TRUE]])) { stop("Error: No specification of out-of-control proportion vector pi1!") } if(is.null(control[["dfun",exact=TRUE]])) { stop("Error: No specification of the distribution to use, e.g. dbinom, dmultinom or similar!") } if(is.null(control[["h",exact=TRUE]])) control$h <- 5 if(is.null(control[["ret",exact=TRUE]])) control$ret <- "value" #Extract the important parts from the arguments range <- control$range y <- t(stsObj@observed[range,,drop=FALSE]) pi0 <- control[["pi0",exact=TRUE]] pi1 <- control[["pi1",exact=TRUE]] dfun <- control[["dfun",exact=TRUE]] control$ret <- match.arg(control$ret, c("value","cases")) #Total number of objects that are investigated. Note this #can't be deduced from the observed y, because only (c-1) columns #are reported so using: n <- apply(y, 2, sum) is wrong! #Assumption: all populationFrac's contain n_t and we can take just one n <- stsObj@populationFrac[range,1,drop=TRUE] #Semantic checks if ( ((ncol(y) != ncol(pi0)) | (ncol(pi0) != ncol(pi1))) | ((nrow(y) != nrow(pi0)) | (nrow(pi0) != nrow(pi1)))) { stop("Error: dimensions of y, pi0 and pi1 have to match") } if ((control$ret == "cases") & nrow(pi0) != 2) { stop("Cases can only be returned in case k=2.") } if (length(n) != ncol(y)) { stop("Error: Length of n has to be equal to number of columns in y.") } #Check if all n entries are the same if (!all(apply(stsObj@populationFrac[range,],1,function(x) all.equal(as.numeric(x),rev(as.numeric(x)))))) { stop("Error: All entries for n have to be the same in populationFrac") } #Reserve space for the results # start with cusum[timePoint -1] = 0, i.e. set cusum[1] = 0 alarm <- matrix(data = 0, nrow = length(range), ncol = nrow(y)) upperbound <- matrix(data = 0, nrow = length(range), ncol = nrow(y)) #Small helper function to be used along the way --> move to other file! either <- function(cond, whenTrue, whenFalse) { if (cond) return(whenTrue) else return(whenFalse) } #Setup counters for the progress doneidx <- 0 N <- 1 noofalarms <- 0 noOfTimePoints <- length(range) ####################################################### #Loop as long as we are not through the entire sequence ####################################################### while (doneidx < noOfTimePoints) { ##Run Categorical CUSUM until the next alarm res <- catcusum.LLRcompute(y=y, pi0=pi0, pi1=pi1, n=n, h=control$h, dfun=dfun,calc.at=(control$ret=="cases"),...) #In case an alarm found log this and reset the chart at res$N+1 if (res$N < ncol(y)) { #Put appropriate value in upperbound upperbound[1:res$N + doneidx,] <- matrix(rep(either(control$ret == "value", res$val[1:res$N] ,res$cases[1:res$N]),each=ncol(upperbound)),ncol=ncol(upperbound),byrow=TRUE) alarm[res$N + doneidx,] <- TRUE #Chop & get ready for next round y <- y[,-(1:res$N),drop=FALSE] pi0 <- pi0[,-(1:res$N),drop=FALSE] pi1 <- pi1[,-(1:res$N),drop=FALSE] n <- n[-(1:res$N)] #Add to the number of alarms noofalarms <- noofalarms + 1 } doneidx <- doneidx + res$N } #Add upperbound-statistic of last segment, where no alarm is reached upperbound[(doneidx-res$N+1):nrow(upperbound),] <- matrix( rep(either(control$ret == "value", res$val, res$cases),each=ncol(upperbound)),ncol=ncol(upperbound),byrow=TRUE) # Add name and data name to control object control$name <- "multinomCUSUM" control$data <- NULL #not supported anymore #New direct calculations on the sts object stsObj@observed <- stsObj@observed[control$range,,drop=FALSE] stsObj@state <- stsObj@state[control$range,,drop=FALSE] stsObj@populationFrac <- stsObj@populationFrac[control$range,,drop=FALSE] stsObj@alarm <- alarm stsObj@upperbound <- upperbound #Fix the corresponding start entry start <- stsObj@start new.sampleNo <- start[2] + min(control$range) - 1 start.year <- start[1] + (new.sampleNo - 1) %/% stsObj@freq start.sampleNo <- (new.sampleNo - 1) %% stsObj@freq + 1 stsObj@start <- c(start.year,start.sampleNo) #Ensure dimnames in the new object ## THIS NEEDS TO BE FIXED! #stsObj <- fix.dimnames(stsObj) #Done return(stsObj) } surveillance/R/twinSIR_methods.R0000644000176000001440000004150512205472330016407 0ustar ripleyusers################################################################################ # Authors: Sebastian Meyer, Michael Hoehle # Date: 4 Jun 2009 # # This file contains methods for generic functions for objects of class # "twinSIR", specifically: # - coef and vcov: enabling the use of function confint to calculate Wald # confidence intervals for the parameter estimates. # - logLik: enables the use of function AIC # - AIC, extractAIC: compute AIC or OSAIC depending on argument 'one.sided' # - print, summary, print.summary, plot (intensityPlot), ... # - profile: Calculates the profile log-likelihood (-> likelihood.ci) ################################################################################ ### don't need a specific coef-method (identical to stats:::coef.default) ## coef.twinSIR <- function (object, ...) ## { ## object$coefficients ## } # asymptotic variance-covariance matrix (inverse of fisher information matrix) vcov.twinSIR <- function (object, ...) { solve(object$fisherinfo) } logLik.twinSIR <- function (object, ...) { r <- object$loglik attr(r, "df") <- length(coef(object)) class(r) <- "logLik" r } # Note: pz is determined by scanning the names of coef(object), # thus the 'model' component is not necessary # See the Hughes and King (2003) paper for details .OSAICpenalty <- function (twinSIRobject, k = 2, nsim = 1e3) { theta <- coef(twinSIRobject) npar <- length(theta) pz <- length(grep("cox\\([^)]+\\)", names(theta), ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)) px <- npar - pz # number of constrained (non-negative) parameters penalty <- if (px == 0L) { k * pz # default AIC penalty (with k = 2) } else if (px == 1L) { k * (pz + 0.5) } else if (px == 2L) { Sigma <- vcov(twinSIRobject) # parameter covariance matrix rho <- cov2cor(Sigma[1:2,1:2])[1,2] as <- acos(rho)/2/pi w <- c(as, 0.5, 0.5-as) k * sum(w * (pz + 0:2)) # = k * sum(w * (npar - px + 0:2)) } else { # px > 2 cat("Computing OSAIC weights for px =",px,"epidemic covariates", "based on", nsim, "simulations...\n") W <- vcov(twinSIRobject)[1:px,1:px] #The simulation approach has unresolved problems for some situations (initial constraints #can fail). Catch this operation until exact cause has been investigated tryCatch( { w.sim <- w.chibarsq.sim(p=px, W=W, N=nsim) #c.f. (12) in Hughes & King (2003), r_i=px, m=0:px, ki=npar #as npar=pz+px, we have that npar-px = pz, hence the sum is k * sum(w.sim * (pz + 0:px)) }, error=function(e) NA) } attr(penalty, "exact") <- px <= 2 penalty } AIC.twinSIR <- function (object, ..., k = 2, one.sided = NULL, nsim = 1e3) { AIC.default <- match.call() AIC.default$one.sided <- NULL AIC.default$nsim <- NULL AIC.default[[1]] <- call(":::", as.name("stats"), as.name("AIC.default")) ## I don't see any easy way of using AIC.default while avoiding ":::". ## NextMethod() does not fit due to extra arguments one.sided & nsim. ## Could maybe unclass "object" and all objects in "..." and then use AIC() if (is.null(one.sided)) { one.sided <- object$method == "L-BFGS-B" } if (one.sided) { penalty <- .OSAICpenalty(object, k = k, nsim = nsim) edf <- length(coef(object)) AIC.default$k <- penalty/edf } res <- eval(AIC.default, parent.frame()) attr(res, "type") <- if (one.sided) "One-sided AIC" else "Standard AIC" attr(res, "exact") <- if (one.sided) attr(penalty, "exact") else TRUE res } extractAIC.twinSIR <- function (fit, scale = 0, k = 2, one.sided = NULL, nsim = 1e3, ...) { if (is.null(one.sided)) { one.sided <- fit$method == "L-BFGS-B" } loglik <- logLik(fit) edf <- attr(loglik, "df") penalty <- if (one.sided) { .OSAICpenalty(fit, k = k, nsim = nsim) # one-sided AIC } else { k * edf # default AIC } res <- c(edf = edf, AIC = -2 * c(loglik) + penalty) attr(res, "type") <- if (one.sided) "One-sided AIC" else "Standard AIC" attr(res, "exact") <- if (one.sided) attr(penalty, "exact") else TRUE res } print.twinSIR <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall:\n") print.default(x$call) cat("\nCoefficients:\n") print.default(format(coef(x), digits=digits), print.gap = 2, quote = FALSE) cat("\nLog-likelihood: ", format(logLik(x), digits=digits), "\n", sep = "") if (!x$converged) { cat("\nWARNING: OPTIMIZATION DID NOT CONVERGE!\n") } cat("\n") invisible(x) } summary.twinSIR <- function (object, correlation = FALSE, symbolic.cor = FALSE, ...) { ans <- object[c("call", "converged", "counts", "intervals", "nEvents")] ans$cov <- vcov(object) est <- coef(object) se <- sqrt(diag(ans$cov)) zval <- est/se pval <- 2 * pnorm(abs(zval), lower.tail = FALSE) ans$coefficients <- cbind(est, se, zval, pval) dimnames(ans$coefficients) <- list(names(est), c("Estimate", "Std. Error", "z value", "Pr(>|z|)")) if (correlation) { ans$correlation <- cov2cor(ans$cov) ans$symbolic.cor <- symbolic.cor } ans$loglik <- logLik(object) aic <- extractAIC(object, ...) ans$aic <- as.vector(aic[2L]) # remove 'edf' element attributes(ans$aic) <- attributes(aic)[c("type", "exact")] class(ans) <- "summary.twinSIR" ans } print.summary.twinSIR <- function (x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) { cat("\nCall:\n") print.default(x$call) cat("\nCoefficients:\n") coefs <- x$coefficients printCoefmat(coefs, digits = digits, signif.stars = signif.stars, na.print = "NA", ...) nEvents <- x$nEvents nh0 <- length(nEvents) if (nh0 < 2L) { cat("\nTotal number of infections: ", nEvents, "\n") } else { cat("\nBaseline intervals:\n") intervals <- character(nh0) for(i in seq_len(nh0)) { intervals[i] <- paste("(", paste(format(x$intervals[c(i,i+1L)],trim=TRUE), collapse=";"), "]", sep = "") } names(intervals) <- paste("logbaseline", seq_len(nh0), sep=".") print.default(rbind("Time interval" = intervals, "Number of events" = nEvents), quote = FALSE, print.gap = 2) } cat("\n", attr(x$aic, "type"), ": ", format(x$aic, digits=max(4, digits+1)), if (!attr(x$aic, "exact")) "\t(simulated penalty weights)" else "", sep = "") cat("\nLog-likelihood:", format(x$loglik, digits = digits)) cat("\nNumber of log-likelihood evaluations:", x$counts[1], "\n") correl <- x$correlation if (!is.null(correl)) { p <- NCOL(correl) if (p > 1L) { cat("\nCorrelation of Coefficients:\n") if (is.logical(symbolic.cor) && symbolic.cor) { correl <- symnum(correl, abbr.colnames = NULL) correlcodes <- attr(correl, "legend") attr(correl, "legend") <- NULL print(correl) cat("---\nCorr. codes: ", correlcodes, "\n", sep="") } else { correl <- format(round(correl, 2), nsmall = 2, digits = digits) correl[!lower.tri(correl)] <- "" print(correl[-1, -p, drop = FALSE], quote = FALSE) } } } if (!x$converged) { cat("\nWARNING: OPTIMIZATION DID NOT CONVERGE!\n") } cat("\n") invisible(x) } ### Plot method for twinSIR (wrapper for intensityplot) plot.twinSIR <- function (x, which, ...) # defaults for 'which' are set below { cl <- match.call() cl[[1]] <- as.name("intensityplot") eval(cl, envir = parent.frame()) } formals(plot.twinSIR)$which <- formals(intensityplot.twinSIR)$which ###################################################################### # Function to compute likelihood based confidence interval, basically # the two solutions to # f(\theta) = l(\theta)-l(\hat{theta)) + 1/2 dchisq(1-alpha,df=1)=0 # are found. # # # Parameters: # logliktilde - normalized likelihood function(theta, ...) # theta.hat - the MLE # lower - search interval [lower,theta.hat] for f=0 # upper - search interval [theta.hat,upper] for f=0 # alpha - confidence level (see Equation 2.6 in Pawitan (2003) # ... - additional arguments passed to function logliktilde ###################################################################### likelihood.ci <- function (logliktilde, theta.hat, lower, upper, alpha = 0.05, ...) { # Highest Likelihood intervall -- target function f <- function(theta, ...) { logliktilde(theta, ...) + 1/2*qchisq(1-alpha, df=1) } # Compute upper and lower boundary numerically hl.lower <- uniroot(f, interval = c(lower, theta.hat), ...)$root hl.upper <- uniroot(f, interval = c(theta.hat, upper), ...)$root return(c(hl.lower,hl.upper)) } ###################################################################### # Function to compute estimated and profile likelihood based # confidence intervals. Heavy computations might be necessary! # #Params: # fitted - output from a fit with twinSIR # profile - list with 4D vector as entries - format: # c(index, lower, upper, grid size) # where index is the index in the coef vector # lower and upper are the parameter limits (can be NA) # grid size is the grid size of the equally spaced grid # between lower and upper (can be 0) # alpha - (1-alpha)% profile likelihood CIs are computed. # If alpha <= 0 then no CIs are computed # control - control object to use for optim in the profile loglik computations # # Returns: # list with profile loglikelihood evaluations on the grid # and highest likelihood and wald confidence intervals ###################################################################### profile.twinSIR <- function (fitted, profile, alpha = 0.05, control = list(fnscale = -1, factr = 1e1, maxit = 100), ...) { ## Check that input is ok profile <- as.list(profile) if (length(profile) == 0L) { stop("nothing to do") } lapply(profile, function(one) { if (length(one) != 4L) { stop("each profile entry has to be of form ", "'c(index, lower, upper, grid size)'") }}) if (is.null(fitted[["model"]])) { stop("'fitted' must contain the model component") } px <- ncol(fitted$model$X) pz <- ncol(fitted$model$Z) ## Control of the optim procedure if (is.null(control[["fnscale",exact=TRUE]])) { control$fnscale <- -1 } if (is.null(control[["factr",exact=TRUE]])) { control$factr <- 1e1 } if (is.null(control[["maxit",exact=TRUE]])) { control$maxit <- 100 } ## Estimated normalized likelihood function ltildeestim <- function(thetai,i) { theta <- theta.ml theta[i] <- thetai with(fitted$model, .loglik(theta, X=X, Z=Z, survs=survs, weights=weights)) - loglik.theta.ml } ## Profile normalized likelihood function ltildeprofile <- function(thetai,i) { emptyTheta <- rep(0, length(theta.ml)) # Likelihood l(theta_{-i}) = l(theta_i, theta_i) ltildethetaminusi <- function(thetaminusi) { theta <- emptyTheta theta[-i] <- thetaminusi theta[i] <- thetai with(fitted$model, .loglik(theta, X=X, Z=Z, survs=survs, weights=weights)) - loglik.theta.ml } # Score function of all params except thetaminusi stildethetaminusi <- function(thetaminusi) { theta <- emptyTheta theta[-i] <- thetaminusi theta[i] <- thetai with(fitted$model, .score(theta, X=X, Z=Z, survs=survs, weights=weights))[-i] } # Call optim using L-BFGS-B. For harder constrains we need constr.Optim lower <- if (fitted$method == "L-BFGS-B") { c(rep(0,px),rep(-Inf,pz))[-i] } else { -Inf } upper <- if (fitted$method == "L-BFGS-B") { c(rep(Inf,px),rep(Inf,pz))[-i] } else { Inf } resOthers <- tryCatch(with(fitted$model, optim(theta.ml[-i], fn = ltildethetaminusi, gr = stildethetaminusi, method = fitted$method, control = control, lower = lower, upper = upper)), warning = function(w) print(w), error = function(e) list(value=NA)) resOthers$value } ## Initialize theta.ml <- coef(fitted) loglik.theta.ml <- c(logLik(fitted)) se <- sqrt(diag(vcov(fitted))) resProfile <- list() ## Perform profile computations for all requested parameters cat("Evaluating the profile logliks on a grid...\n") for (i in 1:length(profile)) { cat("i= ",i,"/",length(profile),"\n") #Index of the parameter in the theta vector idx <- profile[[i]][1] #If no borders are given use those from wald intervals (unconstrained) if (is.na(profile[[i]][2])) profile[[i]][2] <- theta.ml[idx] - 3*se[idx] if (is.na(profile[[i]][3])) profile[[i]][3] <- theta.ml[idx] + 3*se[idx] #Evaluate profile loglik on a grid (if requested) if (profile[[i]][4] > 0) { thetai.grid <- seq(profile[[i]][2],profile[[i]][3],length=profile[[i]][4]) resProfile[[i]] <- matrix(NA, nrow = length(thetai.grid), ncol = 4L, dimnames = list(NULL, c("grid","profile","estimated","wald"))) for (j in 1:length(thetai.grid)) { cat("\tj= ",j,"/",length(thetai.grid),"\n") resProfile[[i]][j,] <- c(thetai.grid[j], ltildeprofile(thetai.grid[j],idx), ltildeestim(thetai.grid[j],idx), #9 June 2009: Bug discovered by L. Held. as part of paper revision. C.f. Pawitan p.63 - 1/2*(1/se[idx]^2)*(thetai.grid[j] - theta.ml[idx])^2) } } } #9 June 2009. This did not work. # names(resProfile) <- names(theta.ml)[sapply(profile, function(x) x[4L]) > 0] names(resProfile) <- names(theta.ml)[sapply(profile, function(x) x[1L])] ## Profile likelihood intervals lower <- if (fitted$method == "L-BFGS-B") { c(rep(0,px),rep(-Inf,pz)) } else { -Inf } ciProfile <- matrix(NA, nrow = length(profile), ncol = 5L, dimnames = list(NULL, c("idx","hl.low","hl.up","wald.low","wald.up"))) if (alpha > 0) { cat("Computing likelihood ratio intervals...\n") for (i in 1:length(profile)) { cat(i,"/", length(profile),"\n") #Index of the parameter in the theta vector idx <- profile[[i]][1] #Compute highest likelihood intervals ci.hl <- tryCatch( likelihood.ci(ltildeprofile, theta.hat = theta.ml[idx], lower = max(lower[idx], theta.ml[idx]-5*se[idx]), upper = theta.ml[idx]+5*se[idx], alpha = alpha, i = idx), warning = function(w) print(w), error = function(e) rep(NA,2)) #Wald intervals based on expected fisher information ci.wald <- theta.ml[idx] + c(-1,1) * qnorm(1-alpha/2) * se[idx] ciProfile[i,] <- c(idx, ci.hl, ci.wald) } rownames(ciProfile) <- names(theta.ml)[ciProfile[,1]] } return(list(lp=resProfile, ci.hl=ciProfile, profileObj=profile)) } ###################################################################### # Extract the "residual process" (cf. Ogata, 1988), i.e. the # fitted cumulative intensity at the event times. # -> "generalized residuals similar to those discussed in Cox and Snell (1968)" ###################################################################### residuals.twinSIR <- function(object, ...) { #Extract event and stop-times eventTimes <- attr(object$model$survs,"eventTimes") sortedStop <- sort(unique(object$model$survs[,"stop"])) eventTimesIdx <- match(eventTimes, sortedStop) #Dimensions and zero vector (in case we need it) nTimes <- nrow(object$model$X) zerovec <- numeric(nTimes) # Extract the fitted model params px <- ncol(object$model$X) pz <- ncol(object$model$Z) theta <- coef(object) alpha <- theta[seq_len(px)] beta <- theta[px+seq_len(pz)] # Initialize e, h and thus lambda if (px > 0) { e <- as.vector(object$model$X %*% as.matrix(alpha)) } else { e <- zerovec } if (pz > 0) { h <- as.vector(exp(object$model$Z %*% as.matrix(beta))) } else { h <- zerovec } lambda <- (e + h) #Determine bloks BLOCK <- as.numeric(factor(object$model$survs$start)) # lambda_i integrals, i.e. integral of \lambda_i until t for each individual dt <- object$model$survs[,"stop"] - object$model$survs[,"start"] #Easier - no individual summations as they are all summed anyhow afterwards intlambda <- tapply(object$model$weights * lambda* dt, BLOCK, sum) #Compute cumulative intensities (Ogata (1988): "residual process") tau <- cumsum(intlambda)[eventTimesIdx] tau } surveillance/R/checkDerivatives.R0000644000176000001440000000455012060143477016615 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Simple wrapper around functionality of the numDeriv and maxLik packages ### to check the score vector and the Fisher information matrix ### CAVE: the return values of both wrappers are not unified ### ### Copyright (C) 2012 Sebastian Meyer ### $Revision: 463 $ ### $Date: 2012-12-06 17:26:39 +0100 (Don, 06 Dez 2012) $ ################################################################################ checkDerivatives.numDeriv <- function(ll, score, fisher, par, method="Richardson", method.args=list(), ...) { cat("Checking analytical score vector using numDeriv::grad() ...\n") nsc <- numDeriv::grad(ll, par, method, method.args, ...) asc <- score(par, ...) print(all.equal(asc, nsc, check.attributes=FALSE)) cat("Checking analytical Fisher information matrix using numDeriv::hessian() ...\n") if (length(par) > 50) cat("NOTE: this might take several minutes considering length(par) =", length(par), "\n") nfi <- -numDeriv::hessian(ll, par, "Richardson", method.args, ...) afi <- fisher(par, ...) print(all.equal(afi, nfi, check.attributes=FALSE)) invisible(list(score = list(analytic=asc, numeric=nsc), fisher = list(analytic=afi, numeric=nfi))) } checkDerivatives.maxLik <- function(ll, score, fisher, par, eps=1e-6, print=FALSE, ...) { cat("Checking analytical score and Fisher using maxLik::compareDerivatives() ...\n") res <- maxLik::compareDerivatives( f=ll, grad=score, hess=function (par, ...) -fisher(par, ...), t0=par, eps=eps, print=print, ...) cat("Comparison of score vectors:\n") print(all.equal(res$compareGrad$analytic, drop(res$compareGrad$numeric), check.attributes=FALSE)) cat("Comparison of Fisher information matrices:\n") print(all.equal(res$compareHessian$analytic, drop(res$compareHessian$numeric), check.attributes=FALSE)) invisible(res) } surveillance/R/stcd.R0000644000176000001440000000414711731650466014276 0ustar ripleyusers###################################################################### # Shiryaev-Roberts based spatio-temporal cluster detection based # on the work in Assuncao & Correa (2009). The implementation # is based on C++ code was originally written by Marcos Oliveira Prates, UFMG, # Brazil and provided by Thais Correa, UFMG, Brazil during her research # stay in Munich. This stay was financially supported by the Munich # Center of Health Sciences. # # # Parameters: # x - vector containing spatial x coordinate of the events # y - vector containing spatial y coordinate of the events # t - vector containing the time points of the events # radius - is the radius of the cluster # epsilon - is the relative change of event-intensity within the cluster # to detect # areaA - area of the observation region A (single number) # areaAcapBk - area of A \ B(s_k,\rho) for all k=1,\ldots,n (vector) # vector of areas A\B(s_k,\rho) for k=1,\ldots,n # threshold - threshold limit for the alarm and should be equal # to the desired ARL # cusum -- boolean if TRUE then CUSUM otherwise Shiryaev-Roberts ###################################################################### stcd <- function(x, y,t,radius,epsilon,areaA, areaAcapBk, threshold,cusum=FALSE) { #check that the vectors x,y,t are of the same length. n <- length(x) if ((length(y) != n) | (length(t) != n)) { stop("Vectors x,y,t not of same size.") } if (!all(diff(order(t)) == 1)) { stop("The vector of time points needs to be ascending in time. No ties allowed.") } res <- .C("SRspacetime", x=as.double(x), y=as.double(y), t=as.double(t), n=as.integer(n), radius=as.double(radius), epsilon=as.double(epsilon), areaA=as.double(areaA),areaAcapBk=as.double(areaAcapBk),cusum=as.integer(cusum), threshold=as.double(threshold),R=as.double(numeric(n)),idxFA=as.integer(-1),idxCC=as.integer(-1),PACKAGE="surveillance") #Indexing differences between C and R res$idxFA <- res$idxFA+1 res$idxCC <- res$idxCC+1 #Missing: compute which indices are part of the cluster. #--> Thais R-code return(list(R=res$R,idxFA=res$idxFA,idxCC=res$idxCC)) } surveillance/R/sts.R0000644000176000001440000011142012242431635014134 0ustar ripleyusers###################################################################### # Everything belonging to the class sts ###################################################################### ###################################################################### # Initialize function for the surveillance time series objects # -- see documentation in RD files # # Dimnames are taken from the observed matrix. ###################################################################### #Ensure that all matrix slots have the same dimnames fix.dimnames <- function(x) { #Make sure all arrays have the same dimnames dimnames(x@alarm) <- dimnames(x@state) <- dimnames(x@upperbound) <- dimnames(x@populationFrac) <- dimnames(x@observed) #Special for neighbourhood dimnames(x@neighbourhood) <- list(colnames(x@observed),colnames(x@observed)) return(x) } #constructor function init.sts <- function(.Object, epoch, start=c(2000,1), freq=52, observed, state=0*observed, map=NULL, neighbourhood=NULL, populationFrac=NULL,alarm=NULL,upperbound=NULL, control=NULL,epochAsDate=FALSE,multinomialTS=FALSE) { #If used in constructor if(nargs() > 1) { #Name handling namesObs <-colnames(observed) namesState <- colnames(observed) #Ensure observed, state are on matrix form observed <- as.matrix(observed) state <- as.matrix(state) #check number of columns of observed and state nAreas <- ncol(observed) nObs <- nrow(observed) if(ncol(observed) != ncol(state)){ #if there is only one state-vector for more than one area, repeat it if(ncol(state)==1) state <- ts(matrix(rep(state,nAreas),ncol=nAreas,byrow=FALSE),frequency=frequency(observed)) else{ cat('wrong dimensions of observed and state \n') return(NULL) } } #check neighbourhood matrix. if(!is.null(neighbourhood) & (any(dim(neighbourhood) != nAreas))) { cat('wrong dimensions of neighbourhood matrix \n') return(NULL) } #popFrac if (nAreas==1 && (!multinomialTS)) { populationFrac <- matrix(1,nrow=nObs, ncol=1) } else if (is.null(populationFrac)) { populationFrac <- matrix(1/nAreas,nrow=nObs,ncol=nAreas) } else if (is.vector(populationFrac, mode="numeric") && length(populationFrac) == nAreas) { populationFrac <- matrix(populationFrac, nObs, nAreas, byrow=TRUE) } #labels for observed and state if(is.null(namesObs)){ namesObs <- paste("observed", 1:nAreas, sep="") namesState <- paste("state", 1:nAreas, sep="") } dimnames(observed) <- list(NULL,namesObs) dimnames(state) <- list(NULL,namesState) #FIXME: If ncol(observed) is huge then the generated matrix #might be beyond memory capacities -> use sparse matrices? if (is.null(neighbourhood)) neighbourhood <- matrix(NA,nrow=ncol(observed),ncol=ncol(observed)) #diag(neighbourhood) <- 0 #FIXME: shouldn't we always define the diag as 0? if (is.null(alarm)) alarm <- matrix(NA,nrow=dim(observed)[1],ncol=dim(observed)[2]) if (is.null(upperbound)) upperbound <- matrix(NA,nrow=dim(observed)[1],ncol=dim(observed)[2]) ##Assign everything else .Object@epoch <- epoch .Object@epochAsDate <- epochAsDate .Object@multinomialTS <- multinomialTS if (length(start) == 2) { .Object@start <- start } else { stop("start must be a vector of length two denoting (year, epoch/week/month/idx)") } .Object@freq <- freq .Object@state <- state .Object@observed <- observed #It is not possible to assign a null argument to the #SpatialPolygonsDataFrame slot. if (!is.null(map)) { .Object@map <- map } .Object@neighbourhood <- neighbourhood .Object@populationFrac <- populationFrac .Object@alarm <- alarm .Object@upperbound <- upperbound if (!is.null(control)) .Object@control <- control #Make sure all arrays have the same dimnames .Object <- fix.dimnames(.Object) } return(.Object) } ########################################################################### # Initialization -- two modes possible: full or just disProg, freq and map ########################################################################### #Full setMethod("initialize", "sts", init.sts) #Partial -- use a disProg object as start and convert it. disProg2sts <- function(disProgObj, map=NULL) { #Ensure that epoch slot is not zero if (is.null(disProgObj[["epoch",exact=TRUE]])) { myweek <- 1:nrow(as.matrix(disProgObj$observed)) } else { myweek <- disProgObj$week } sts <- new("sts", epoch=myweek, start=disProgObj$start, freq=disProgObj$freq, observed=disProgObj$observed, state = disProgObj$state, map=map, neighbourhood=disProgObj$neighbourhood, populationFrac=disProgObj$populationFrac,alarm=disProgObj$alarm,upperbound=disProgObj$upperbound) return(sts) } #The reverse action sts2disProg <- function(sts) { disProgObj <- create.disProg(week=sts@epoch, start=sts@start, freq=sts@freq, observed=sts@observed, state=sts@state, neighbourhood=sts@neighbourhood, populationFrac=sts@populationFrac, epochAsDate=sts@epochAsDate) #For survRes: alarm=sts@alarm, upperbound=sts@upperbound) return(disProgObj) } ########################################################################### #Method to aggregate over all units, either the time series is aggregated #so a new sampling frequency of nfreq units per time slot is obtained. #The other alternative is to aggregate all units. # # Note: The function is not 100% consistent with what the generic # aggregate does. # # Warning: In case the aggregation is by unit the upperbound slot is set # to NA. Furthermore the MAP object is left as.is, but # the object cannot be plotted anymore. # # Params: # by - a string being either "time" or "unit" # nfreq - new sampling frequency if by=="time". If "all" then all # time instances are summed. ########################################################################### setMethod("aggregate", signature(x="sts"), function(x,by="time",nfreq="all",...) { #Action of aggregation for populationFrac depends on the type binaryTS <- sum( x@populationFrac > 1 ) > 1 #Aggregate time if (by == "time") { if (nfreq == "all") { howmany <- dim(x@observed)[1] } else { if (nfreq != x@freq) { howmany <- x@freq / nfreq if (howmany - ceiling(howmany) != 0) { stop("Error: nfreq has to be a multiple of x@freq.")} } } n <- dim(x@observed)[1] m <- ceiling(n/howmany) new <- rep(1:m,each=howmany)[1:n] x@freq <- ifelse(nfreq == "all", howmany, nfreq) x@epoch <- 1:m x@observed <- as.matrix(aggregate(x@observed,by=list(new),sum)[,-1]) x@state <- as.matrix(aggregate(x@state,by=list(new),sum)[,-1])>0 x@alarm <- as.matrix(aggregate(x@alarm,by=list(new),sum)[,-1]) x@upperbound <- as.matrix(aggregate(x@upperbound,by=list(new),sum)[,-1]) x@populationFrac <- as.matrix(aggregate(x@populationFrac,by=list(new),sum)[,-1]) #the population fractions need to be recomputed if not a binary ts if (!binaryTS) { sums <- matrix(rep(apply(x@populationFrac,1,sum),times=ncol(x)),ncol=ncol(x)) x@populationFrac <-x@populationFrac/sums } } if (by == "unit") { #Aggregate units x@observed <- as.matrix(apply(x@observed, MARGIN=1, sum)) x@state <- as.matrix(apply(x@state, MARGIN=1, sum))>0 x@alarm <- as.matrix(apply(x@alarm, MARGIN=1, sum))>0 #There is no clever way to aggregate the upperbounds x@upperbound <- matrix(NA,ncol=ncol(x@alarm),nrow=nrow(x@alarm)) x@populationFrac <- as.matrix(apply(x@populationFrac, MARGIN=1, sum))#>0 x@neighbourhood <- matrix(1,nrow=1,ncol=1) # FIXME: |-wouldn't 0 be more appropriate? } #validObject(x) #just a check return(x) }) ##################################################################### # Miscellaneous access methods #################################################################### setMethod("nrow", "sts", function(x) return(nrow(x@observed))) setMethod("ncol", "sts", function(x) return(ncol(x@observed))) setMethod("dim", "sts", function(x) return(dim(x@observed))) setMethod("colnames", signature=c(x="sts",do.NULL="missing",prefix="missing"), function(x,do.NULL, prefix) return(colnames(x@observed))) #Extract which observation within year we have setGeneric("epochInYear", function(x, ...) standardGeneric("epochInYear")); setMethod("epochInYear", "sts", function(x,...) { #Strptime format strings available as: #http://www.opengroup.org/onlinepubs/009695399/functions/strptime.html if (x@epochAsDate) { epochStr <- switch( as.character(x@freq), "12" = "%m","52" = "%V","365" = "%j") return(as.numeric(formatDate(epoch(x),epochStr))) } else { return( (x@epoch-1 + x@start[2]-1) %% x@freq + 1) } }) #Extract the corresponding year for each observation using setGeneric("year", function(x, ...) standardGeneric("year")); setMethod("year", "sts", function(x,...) { if (x@epochAsDate) { return(as.numeric(formatDate(epoch(x),"%G"))) } else { ((x@epoch-1 + x@start[2]-1) + (x@freq*x@start[1])) %/% x@freq } }) ##################################################################### #[-method for accessing the observed, alarm, etc. objects # new param: # normPopulationFrac - normalize population frac ##################################################################### setMethod("[", "sts", function(x, i, j, ..., drop) { #default value for i and j if(missing(i)) {i <- min(1,nrow(x@observed)):nrow(x@observed)} if(missing(j)) {j <- min(1,ncol(x@observed)):ncol(x@observed)} x@epoch <- x@epoch[i] x@observed <- x@observed[i,j,drop=FALSE] x@state <- x@state[i,j,drop=FALSE] x@alarm <- x@alarm[i,j,drop=FALSE] x@populationFrac <- x@populationFrac[i,j,drop=FALSE] #If not binary TS the populationFrac is normed binaryTS <- sum( x@populationFrac > 1 ) > 1 if (!binaryTS) { x@populationFrac <- x@populationFrac / apply(x@populationFrac,MARGIN=1,sum) } x@upperbound <- x@upperbound[i,j,drop=FALSE] #Neighbourhood matrix x@neighbourhood <- x@neighbourhood[j,j,drop=FALSE] #Fix the corresponding start entry. it can either be a vector of #logicals or a specific index. Needs to work in both cases. #Note: This code does not work if we have week 53s! if (is.logical(i)) { i.min <- which.max(i) #first TRUE entry } else { i.min <- min(i) } start <- x@start new.sampleNo <- start[2] + i.min - 1 start.year <- start[1] + (new.sampleNo - 1) %/% x@freq start.sampleNo <- (new.sampleNo - 1) %% x@freq + 1 x@start <- c(start.year,start.sampleNo) ## If !epochAsDate and updating "start" (which seems not really to be ## necessary), we have to update epoch, too! if (!x@epochAsDate) x@epoch <- x@epoch - i.min + 1 # FIXME: correct? #FIXME: In case there is a map: Also subset map according to region index j. # -> This only makes sense if identical(row.names(map), colnames(observed)) # is a property of the sts-class already verified in init.sts ## if (length(x@map)>0) { ## ## x@map <- x@map[colnames(x@observed),] ## #take them in the order as in the map to ensure x and x[] are identical ## order <- pmatch(row.names(x@map), colnames(x)) #, row.names(x@map)) ## order2 <- pmatch(row.names(x@map)[!is.na(order)], row.names(x@map)) ## x@map <- x@map[order2,] ## } #Done return(x) }) ######################################################################### # Plot method ... the type argument specifies what type of plot # to make. # # plot as multivariate time series: type = observed ~ time | unit # plot as map object aggregated over time: type = observed ~ 1 | unit ######################################################################## setMethod("plot", signature(x="sts", y="missing"), function(x, y, type,...) { if (missing(type)) type = observed ~ time | unit #Parse the formula, i.e. extract components obsOk <- (type[[2]] == "observed") alarmOk <- (type[[2]] == "alarm") map <- (length(type[[3]])==3) && (type[[3]][[1]] == "|") && (type[[3]][[2]] == "1") time <- pmatch("time",type[[3]]) > 0 #Valid formula? valid <- lapply(as.list(type[[3]]),function(i) is.na(pmatch(i,c("1","unit","|","time","*","+")))) valid <- all(!unlist(valid)) #No unit dimenstion? justTime <- type[[3]] == "time" if (!(obsOk | alarmOk) | !valid) { stop("Not a valid plot type.") } #space-time plots if (map) { plot.sts.spacetime(x,type,...) return(invisible()) } #time plots if (time) { if (obsOk) { #In case observed ~ time, the units are aggregated plot.sts.time( if(justTime) aggregate(x,by="unit") else x,type,...) return(invisible()) } if (alarmOk) { plot.sts.alarm(x,...) return(invisible()) } } }) ###################################################################### # Helper function to merge two lists taken from the RCurl package ###################################################################### merge.list <- function (x, y, ...) { if (length(x) == 0) return(y) if (length(y) == 0) return(x) i = match(names(y), names(x)) i = is.na(i) if (any(i)) x[names(y)[which(i)]] = y[which(i)] return(x) } ########################################################################## # Plot functions # # colors - c( fill color of polygons, line color of polygons, upperbound) ########################################################################## addFormattedXAxis <- function(x, epochsAsDate, observed, firstweek,xaxis.units,cex) { #Declare commonly used variables. startyear <- x@start[1] if (x@freq ==52) { if (!epochsAsDate) { # At which indices to put the "at" tick label. This will # be exactly those week numbers where the new quarter begins: 1, 14, 27 and 40 + i*52. # Note that week number and index is not the same due to the "firstweek" argument weeks <- 1:length(observed) + (firstweek-1) noYears <- ceiling(max(weeks)/52) quarterStarts <- rep( (0:(noYears))*52, each=4) + rep( c(1,14,27,40), noYears+1) weeks <- subset(weeks, !is.na(match(weeks,quarterStarts))) weekIdx <- weeks - (firstweek-1) # get the right year for each week year <- weeks %/% 52 + startyear # function to define the quarter order quarterFunc <- function(i) { switch(i+1,"I","II","III","IV")} # get the right number and order of quarter labels quarter <- sapply( (weeks-1) %/% 13 %% 4, quarterFunc) } else { #If epochAsDate -- experimental functionality to handle ISO 8601 date <- as.Date(x@epoch, origin="1970-01-01") years <- unique(as.numeric(formatDate(date,"%Y"))) #Start of quarters in each year present in the data. qStart <- as.Date(paste(rep(years,each=4), c("-01-01","-04-01","-07-01","-10-01"),sep="")) qName <- rep(c("I","II","III","IV"), length.out=length(qStart)) qIdx <- qStart <= max(date)+10 & qStart >= min(date)-10 qStart <- qStart[qIdx] ; qName <- qName[qIdx] #Find week in data closest to these dates weekIdx <- sapply(qStart, function(d) which.min(abs(as.numeric(date - d)))) date <- date[weekIdx] #Year the ISO week belongs to year <- as.numeric(formatDate(date,"%G")) quarter <- qName } #construct the computed axis labels -- add quarters if xaxis.units is requested if (xaxis.units) { labels.week <- paste(year,"\n\n",quarter,sep="") } else { labels.week <- paste(year,sep="") } axis( side=1,line=1,labels=FALSE,at=c(1,length(observed)),lwd.ticks=0) axis( at=weekIdx[which(quarter != "I")] , labels=labels.week[which(quarter != "I")] , side=1, line = 1 ,cex=cex) #Bigger tick marks at the first quarter at <- weekIdx[which(quarter == "I")] axis( at=at , labels=rep(NA,length(at)), side=1, line = 1 ,tcl=2*par()$tcl) #2nd axis # axis( side=2 ,cex=cex) } else { ##other frequency #A label at each unit myat.unit <- seq(firstweek,length.out=length(observed) ) # get the right year order month <- (myat.unit-1) %% x@freq + 1 year <- (myat.unit - 1) %/% x@freq + startyear #construct the computed axis labels -- add quarters if xaxis.units is requested if (xaxis.units) { mylabels.unit <- paste(year,"\n\n", (myat.unit-1) %% x@freq + 1,sep="") } else { mylabels.unit <- paste(year,sep="") } #Add axis axis( at=(1:length(observed)) , labels=NA, side=1, line = 1 ,cex=cex) axis( at=(1:length(observed))[month==1] , labels=mylabels.unit[month==1] , side=1, line = 1 ,cex=cex) # axis( at=(1:length(observed)), labels=mylabels.unit, side=1, line = 1 ,cex=cex) #Bigger tick marks at the first unit at <- (1:length(observed))[(myat.unit - 1) %% x@freq == 0] axis( at=at , labels=rep(NA,length(at)), side=1, line = 1 ,tcl=2*par()$tcl) #2nd axis # axis( side=2 ,cex=cex) } invisible() } plot.sts.time.one <- function(x, k=1, domany=FALSE,ylim=NULL,xaxis.years=TRUE, axes=TRUE, xaxis.units=TRUE, epochsAsDate=x@epochAsDate, xlab="time", ylab="No. infected", main=NULL, type="s",lty=c(1,1,2),col=c(NA,1,4),lwd=c(1,1,1), outbreak.symbol = list(pch=3, col=3, cex=1),alarm.symbol=list(pch=24, col=2, cex=1),cex=1,legend.opts=list(x="top", legend=NULL,lty=NULL,pch=NULL,col=NULL),dx.upperbound=0.5,hookFunc=function() {},...) { #Extract slots -- depending on the algorithms: x@control$range observed <- x@observed[,k] state <- x@state[,k] alarm <- x@alarm[,k] upperbound <- x@upperbound[,k] hasAlarm <- all(!is.na(alarm)) startyear <- x@start[1] firstweek <- x@start[2] method <- x@control$name disease <- x@control$data population <- x@populationFrac[,k] binaryTS <- x@multinomialTS if (binaryTS) { observed <- ifelse(population!=0,observed/population,0) upperbound <- ifelse(population!=0,upperbound/population,0) if (ylab == "No. infected") { ylab <- "Proportion infected" } } ##### Handle the NULL arguments ###################################### if (is.null(main)) { #If no surveillance algorithm has been run if (length(x@control) != 0) { main = paste("Surveillance using ", as.character(method),sep="") } } #No titles are drawn when more than one is plotted. if (domany) main = "" # control where the highest value is max <- max(c(observed,upperbound),na.rm=TRUE) #if ylim is not specified, give it a default value if(is.null(ylim) ){ ylim <- c(-1/20*max, max) } # left/right help for constructing the columns dx.observed <- 0.5 upperboundx <- (1:length(upperbound)) - (dx.observed - dx.upperbound) #Generate the matrices to plot (values,last value) xstuff <- cbind(c(upperboundx,length(observed) + min(1-(dx.observed - dx.upperbound),0.5))) ystuff <-cbind(c(upperbound,upperbound[length(observed) ])) #Plot the results matplot(x=xstuff,y=ystuff,xlab=xlab,ylab=ylab,main=main,ylim=ylim,axes = !(xaxis.years),type=type,lty=lty[-c(1:2)],col=col[-c(1:2)],lwd=lwd[-c(1:2)],...) #This draws the polygons containing the number of counts (sep. by NA) i <- rep(1:length(observed),each=5) dx <- rep(dx.observed * c(-1,-1,1,1,NA), times=length(observed)) x.points <- i + dx y.points <- as.vector(t(cbind(0, observed, observed, 0, NA))) polygon(x.points,y.points,col=col[1],border=col[2],lwd=lwd[1]) #Draw upper bound once more in case the polygons are filled if (!is.na(col[1])) { lines(x=xstuff,y=ystuff,type=type,lty=lty[-c(1:2)],col=col[-c(1:2)],lwd=lwd[-c(1:2)],...) } #Draw outbreak symbols alarmIdx <- which(!is.na(alarm) & (alarm == 1)) if (length(alarmIdx)>0) { matpoints( alarmIdx, rep(-1/40*ylim[2],length(alarmIdx)), pch=alarm.symbol$pch, col=alarm.symbol$col, cex= alarm.symbol$cex) } #Draw alarm symbols stateIdx <- which(state == 1) if (length(stateIdx)>0) { matpoints( stateIdx, rep(-1/20*ylim[2],length(stateIdx)), pch=outbreak.symbol$pch, col=outbreak.symbol$col,cex = outbreak.symbol$cex) } #Label x-axis if(xaxis.years & axes) { addFormattedXAxis(x, epochsAsDate, observed, firstweek,xaxis.units,cex) } #Label y-axis if (axes) { axis( side=2 ,cex=cex) } if(!is.null(legend.opts)) { #Fill empty (mandatory) slots in legend.opts list if (is.null(legend.opts$x)) legend.opts$x <- "topleft" if (is.null(legend.opts$lty)) legend.opts$lty <- c(lty[1],lty[3],NA,NA) if (is.null(legend.opts$col)) legend.opts$col <- c(col[2],col[3],outbreak.symbol$col,alarm.symbol$col) if (is.null(legend.opts$pch)) legend.opts$pch <- c(NA,NA,outbreak.symbol$pch,alarm.symbol$pch) if (is.null(legend.opts$legend)) legend.opts$legend <- c("Infected", "Threshold","Outbreak","Alarm" ) #print(legend.opts) do.call("legend",legend.opts) } #Call hook function for user customized action environment(hookFunc) <- environment() hookFunc() invisible() } plot.sts.alarm <- function(x, lvl=rep(1,nrow(x)), ylim=NULL,xaxis.years=TRUE, xaxis.units=TRUE, epochsAsDate=x@epochAsDate, xlab="time", main=NULL, type="hhs",lty=c(1,1,2),col=c(1,1,4), outbreak.symbol = list(pch=3, col=3, cex=1),alarm.symbol=list(pch=24, col=2, cex=1),cex=1,cex.yaxis=1,...) { k <- 1 #Extract slots -- depending on the algorithms: x@control$range observed <- x@observed[,k] state <- x@state[,k] alarm <- x@alarm[,k] upperbound <- x@upperbound[,k] hasAlarm <- all(!is.na(alarm)) startyear <- x@start[1] firstweek <- x@start[2] method <- x@control$name disease <- x@control$data ylim <- c(0.5, ncol(x)) ##### Handle the NULL arguments ###################################### if (is.null(main)) { #If no surveillance algorithm has been run if (length(x@control) != 0) { # main = paste("Analysis of ", as.character(disease), " using ", main = paste("Surveillance using ", as.character(method),sep="") } } # left/right help for constructing the columns dx.observed <- 0.5 observedxl <- (1:length(observed))-dx.observed observedxr <- (1:length(observed))+dx.observed upperboundx <- (1:length(upperbound)) #-0.5 # control where the highest value is max <- max(c(observed,upperbound),na.rm=TRUE) #if ylim is not specified if(is.null(ylim)){ ylim <- c(-1/20*max, max) } #Generate the matrices to plot xstuff <- cbind(observedxl, observedxr, upperboundx) ystuff <-cbind(observed, observed, upperbound) #Plot the results using one Large plot call (we do this by modifying #the call). Move this into a special function! matplot(x=xstuff,y=ystuff,xlab=xlab,ylab="",main=main,ylim=ylim,axes = FALSE,type="n",lty=lty,col=col,...) #Label of x-axis if(xaxis.years){ addFormattedXAxis(x, epochsAsDate, observed, firstweek,xaxis.units,cex) } axis( side=2, at=1:ncol(x),cex.axis=cex.yaxis, labels=colnames(x),las=2) #Draw all alarms for (i in 1:nrow(x)) { idx <- (1:ncol(x))[x@alarm[i,] > 0] for (j in idx) { points(i,j,pch=3,col=lvl[j]+1) } } #Draw lines seperating the levels m <- c(-0.5,cumsum(as.numeric(table(lvl)))) sapply(m, function(i) lines(c(0.5,nrow(x@alarm)+0.5),c(i+0.5,i+0.5),lwd=2)) invisible() } #xaxis.years=TRUE,startyear = 2001, firstweek = 1, legend=TRUE plot.sts.time <- function(x, type, method=x@control$name, disease=x@control$data, same.scale=TRUE, par.list=list(), ...) { #Plot as one if type = time + unit as.one=all(!is.na(pmatch(c("time","unit"),type[[3]] ))) & is.na(pmatch("|",type[[3]])) #Extract observed <- x@observed state <- x@state alarm <- x@alarm population <- x@populationFrac binaryTS <- x@multinomialTS #univariate timeseries ? if(is.vector(observed)) observed <- matrix(observed,ncol=1) if(is.vector(state)) state <- matrix(state,ncol=1) if(is.vector(alarm)) alarm <- matrix(alarm,ncol=1) nAreas <- ncol(observed) #default mfrow par.list <- modifyList(list(mfrow=magic.dim(nAreas), mar=c(5,4,1,1)), par.list) #multivariate time series if(nAreas > 1){ if(as.one) { # all areas in one plot stop("this type of plot is currently not implemented") } else { #set window size oldpar <- par(par.list) #All plots on same scale? If yes, then check if a scale #is already specified using the ylim argument args <- list(...) if(same.scale) { if (is.null(args$ylim)) { max <- if (binaryTS) { max(ifelse(population == 0, 0, pmax(observed,x@upperbound,na.rm=TRUE)/population)) } else max(observed,x@upperbound,na.rm=TRUE) args$ylim <- c(-1/20*max, max) } } else { args$ylim <- NULL } #plot areas for (k in 1:nAreas) { #Changed call of plot.sts.time.one to invocation using "call" argsK <- merge.list(args,list("x"=x,"k"=k,"domany"=TRUE,"legend"=NULL)) do.call("plot.sts.time.one",args=argsK) title(main=colnames(observed)[k], line=-1) } #reset graphical params par(oldpar) } } else { #univariate time series plot.sts.time.one(x=x, domany=FALSE,...) } invisible() } ############################################################## # Animation # # opts.col - how to get colors?? # wait - waiting time (max count in a for loop) better way? ############################################################## plot.sts.spacetime <- function(x,type,legend=NULL,opts.col=NULL,labels=TRUE,wait.ms=250,cex.lab=0.7,verbose=FALSE,dev.printer=NULL,...) { #Extract the mappoly if (length(x@map) == 0) stop("The sts object has an empty map.") map <- x@map maplim <- list(x=bbox(map)[1,],y=bbox(map)[2,]) #Check colnames, otherwise no need to continue if (is.null(colnames(x@observed))) stop("The sts observed slot does not have any colnames to match with the shapefile.") #Check for color options if (is.null(opts.col)) { opts.col <- list(ncolors=100,use.color=TRUE) } #Check for legend options if (is.null(legend)) { legend <- list(dx=0.4,dy=0.04,x=maplim$x[1],y=maplim$y[1],once=TRUE) } #Process dev.printer options if (!is.null(dev.printer)) { #Device if (is.null(dev.printer$device)) dev.printer$device <- png #File extension if (is.null(dev.printer$extension)) dev.printer$extension <- ".png" #Width and height if (is.null(dev.printer$width)) dev.printer$width <- 640 if (is.null(dev.printer$height)) dev.printer$height <- 480 } #Extract the data o <- x@observed alarm <- x@alarm #Formula is of type "observed ~ 1|unit" (i.e. no time) aggregate <- type[[3]][[3]] == "unit" if (aggregate) { o <- t(as.matrix(apply(o,MARGIN=2,sum))) alarm <- t(as.matrix(apply(alarm,MARGIN=2,sum)))>0 } #Number of time points maxt <- dim(o)[1] #Make colors using the hcl.colors function gyr <- hcl.colors(o,ncolors=length(o),use.color=TRUE) #Cut into specified number of colors o.cut <- matrix(as.numeric(cut(o,length(gyr$col))),nrow=nrow(o),ncol=ncol(o)) o.col <- matrix(gyr$col[o.cut],ncol=ncol(o.cut)) o.col[is.na(o.col)] <- gray(1) dimnames(o.col) <- dimnames(o) #Sort the o according to the names in the map region.id <- row.names(map) o.col.id <- dimnames(o.col)[[2]] #Make the columns of o as in the map object o.col <- o.col[,pmatch(region.id,o.col.id),drop=FALSE] alarm.col <- alarm[,pmatch(region.id,o.col.id),drop=FALSE] #Screen processing screen.matrix <- matrix(c(0,1,0,1,0,1,0.8,1),2,4,byrow=TRUE) split.screen(screen.matrix) #Loop over all time slices for (t in 1:maxt) { #Status information if (verbose) { cat(paste("Processing slice",t,"of",maxt,"\n")) } #Clean screen (title area) screen(n=2) par(bg=gray(1)) erase.screen() par(bg="transparent") #Plot the map on screen 1 screen(n=1) plot(map,col=o.col[t,],xlab="",ylab="",...) #Indicate alarms as shaded overlays if (!all(is.na(alarm.col))) { #Plotting using density "NA" does not appear to work #anymore in the new sp versions alarm.col[is.na(alarm.col)] <- 0 plot(map,dens=alarm.col*15,add=TRUE) } if (labels) #getSpPPolygonsLabptSlots is deprecated. Use coordinates method insteas text(coordinates(map), labels=as.character(region.id), cex.lab=cex.lab) if (!aggregate) { title(paste(t,"/",maxt,sep="")) } #In case a legend is requested if (!is.null(legend) && !(legend$once & t>1) | (t==1)) { add.legend(legend, maplim ,gyr) } #Is writing to files requested? if (!is.null(dev.printer)) { #Create filename fileName <- paste(dev.printer$name,"-",insert.zeroes(t,length=ceiling(log10(maxt))), dev.printer$extension,sep="") cat("Creating ",fileName,"\n") #Save the current device using dev.print dev.print(dev.printer$device, file=fileName, width=dev.printer$width, height=dev.printer$height) } wait(wait.ms) } close.screen(all.screens = TRUE) } ################################################################### #Helper function for waiting a specific amount of milliseconds #implemented using proc.time. The waiting time is probably not 100% #exact as R is an interpretated language. # # Params: # wait.ms - number of milliseconds to wait ################################################################### wait <- function(wait.ms) { #Initialize start.time <- proc.time()[3]*1000 ellapsed <- proc.time()[3]*1000 - start.time #Loop as long as required. while (ellapsed < wait.ms) { ellapsed <- proc.time()[3]*1000 - start.time } } #Helper function -- use colors from the vcd package hcl.colors <- function(x, ncolors=100, use.color=TRUE) { GYR <- if (requireNamespace("colorspace")) { # the Zeil-ice colors colorspace::heat_hcl(ncolors, h=c(0,120), c=if (use.color) c(90,30) else c(0,0), l=c(50,90), power=c(0.75, 1.2)) } else { if (use.color) heat.colors(ncolors) else grey.colors(ncolors) } list(col=rev(GYR), min=0, max=max(x), trans=identity) } #Helper function for plot.sts.spacetime add.legend <- function(legend,maplim,theColors) { #Preproc dy <- diff(maplim$y) * legend$dy dx <- diff(maplim$x) * legend$dx #Add legend -- i.e. a slider xlu <- xlo <- legend$x xru <- xro <- xlu + dx yru <- ylu <- legend$y yro <- ylo <- yru + dy step <- (xru - xlu)/length(theColors$col) for (i in 0:(length(theColors$col) - 1)) { polygon(c(xlo + step * i, xlo + step * (i + 1), xlu + step * (i + 1), xlu + step * i), c(ylo, yro, yru, ylu), col = theColors$col[i + 1], border = theColors$col[i + 1]) } #Write info about min and max on the slider. black <- grey(0) lines(c(xlo, xro, xru, xlu, xlo), c(ylo, yro, yru, ylu, ylo), col = black) #Transformation function for data values, either #exp or identical trans <- theColors$trans text(xlu, ylu - 0.5*dy, formatC(trans(theColors$min)), cex = 1, col = black,adj=c(0,1)) text(xru, yru - 0.5*dy, formatC(trans(theColors$max)), cex = 1, col = black,adj=c(1,1)) } ###Validity checking setValidity("sts", function ( object ) { retval <- NULL #Check matrix dimensions if (!all( dim(object@observed) == dim(object@state))) retval <- c( retval , " dimension of observed and state has to match") if (!all( dim(object@observed) == dim(object@alarm))) retval <- c( retval , " dimension of observed and alarm has to match") if (!all( dim(object@observed) == dim(object@upperbound))) retval <- c( retval , " dimension of observed and upperbound has to match") if (!all( dim(object@observed) == dim(object@populationFrac))) retval <- c( retval , " dimension of observed and populationFrac has to match") if (!all( rep(dim(object@observed)[2] == dim(object@neighbourhood)))) { retval <- c( retval , " dimension of neighbourhood has to be ncols(observed) x ncols(observed)") } #Check colnames if (!all( colnames(object@observed) == colnames(object@state))) retval <- c( retval , " colnames of observed and state have to match") if (!all( colnames(object@observed) == colnames(object@alarm))) retval <- c( retval , " colnames of observed and alarm have to match") if (!all( colnames(object@observed) == colnames(object@upperbound))) retval <- c( retval , " colnames of observed and upperbound have to match") if (!all( colnames(object@observed) == colnames(object@populationFrac))) retval <- c( retval , " colnames of observed and populationFrac have to match") if (!all( colnames(object@observed) == colnames(object@neighbourhood))) retval <- c( retval , " colnames of observed and neighbourhood have to match") ## if map is not empty, check that all colnames(object@observed) ## are in row.names(object@map) if (length(object@map)>0) { if (!all(colnames(object@observed) %in% row.names(object@map))) { retval <- c( retval , " colnames of observed have to be contained in the row.names of the map.") } } if(is.null( retval)) return ( TRUE ) else return ( retval ) }) ###################################################################### # Insert leading zeros so integers obtain a fixed length. Good when # making filenames so they are all of same length ideal for sorting. # # Parameters # x - An integer ###################################################################### insert.zeroes<- function(x,length=3) { for (i in 1:(length-1)) { if (x<10^i) return(paste(paste(rep(0,length-i),collapse=""),x,sep="")) } #If x has more digits than length then just return x return(paste(x)) } ##Show/Print method # show setMethod( "show", "sts", function( object ){ cat( "-- An object of class sts -- \n" ) #cat( "length(week):\t", length(object@epoch),"\n" ) if (!object@epochAsDate) { cat( "freq:\t\t", object@freq,"\n" ) } else { epochStr <- switch( as.character(object@freq), "12" = "%m","52" = "%V","365" = "%j") cat( "freq:\t\t", paste(object@freq," with strptime format string ",epochStr,"\n",sep="")) } if (!object@epochAsDate) { cat( "start:\t\t",object@start,"\n" ) } else { cat( "start:\t\t",paste(epoch(object)[1]),"\n" ) } cat( "dim(observed):\t", dim(object@observed), "\n\n") n <- 1 cat("Head of observed:\n") print(head(object@observed,n)) #cat("Head of state:\n") #print(head(object@state,n)) #cat("Head of alarm:\n") #print(head(object@alarm,n)) if (npoly <- length(object@map)) { cat("\nmap:\n") print(modifyList(summary(object@map), list(data=NULL))) # no data summary cat("Features :", npoly, "\n") if (inherits(object@map, "SpatialPolygonsDataFrame")) cat("Data slot :", ncol(object@map), "variables\n") } cat("\nhead of neighbourhood:\n") print( head(object@neighbourhood,n)) } ) ###################################################################### #Method to convert sts object to a data frame suitable for regression #Params: # row.names - from generic R function # optional - from generic R function # freqByWeek -- if TRUE use information in week (supposed to be Dates) # to freq (e.g. used for regression model) ###################################################################### setMethod("as.data.frame", signature(x="sts"), function(x,row.names = NULL, optional = FALSE, ...) { #Convert object to data frame and give names res <- data.frame("observed"=x@observed, "epoch"=x@epoch, "state"=x@state, "alarm"=x@alarm,"population"=x@populationFrac) if (ncol(x) > 1) { colnames(res) <- c(paste("observed.",colnames(x@observed),sep=""),"epoch", paste("state.",colnames(x@observed),sep=""), paste("alarm.",colnames(x@observed),sep=""), paste("population.",colnames(x@observed),sep="")) } else { colnames(res) <- c("observed","epoch","state","alarm","population") } #Add a column denoting the number of week if (x@epochAsDate) { #Convert to date date <- as.Date(x@epoch, origin="1970-01-01") epochStr <- switch( as.character(x@freq), "12" = "%m", "52" = "%V", "365" = "%j") #Find out how many epochs there are each year years <- unique(as.numeric(formatDate(date,"%Y"))) dummyDates <- as.Date(paste(rep(years,each=6),"-12-",26:31,sep="")) maxEpoch <- tapply( as.numeric(formatDate(dummyDates, epochStr)), rep(years,each=6), max) #Assign this to result res$freq <- maxEpoch[pmatch(formatDate(date,"%Y"),names(maxEpoch),duplicates.ok=TRUE)] res$epochInPeriod <- as.numeric(formatDate(date,epochStr)) / res$freq } else { #Otherwise just replicate the fixed frequency res$freq <- x@freq res$epochInPeriod <- x@epoch %% res$freq } return(res) }) surveillance/R/twinstim_siaf_powerlaw.R0000644000176000001440000001673612237174420020141 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Power-law kernel f(s) = (||s||+sigma)^-d ### This is the pure kernel of the Lomax density (the density requires d>1, but ### for the siaf specification we only want d to be positive) ### ### Copyright (C) 2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ siaf.powerlaw <- function (nTypes = 1, logpars = TRUE, effRangeProb = NULL, validpars = NULL) { nTypes <- as.integer(nTypes) stopifnot(length(nTypes) == 1L, nTypes > 0L) ## for the moment we don't make this type-specific if (nTypes != 1) stop("type-specific shapes are not yet implemented") if (!logpars) stop("only the 'logpars' parametrization is implemented") ## helper expression, note: logpars=c(logscale=logsigma, logd=logd) tmp <- expression( logsigma <- logpars[[1L]], # used "[[" to drop names logd <- logpars[[2L]], sigma <- exp(logsigma), d <- exp(logd) ) ## spatial kernel f <- function (s, logpars, types = NULL) {} body(f) <- as.call(c(as.name("{"), tmp, expression(sLength <- sqrt(.rowSums(s^2, nrow(s), 2L))), expression((sLength+sigma)^-d) )) ## numerically integrate f over a polygonal domain F <- siaf.fallback.F ## fast integration of f over a circular domain Fcircle <- function (r, logpars, type = NULL) {} body(Fcircle) <- as.call(c(as.name("{"), tmp, expression( fofr <- (r+sigma)^-d, fof0 <- sigma^-d, basevolume <- pi * r^2 * fofr, # cylinder volume up to height f(r) Ifinvsq <- function (z) { if (d == 1) { -1/z - 2*sigma*log(z) + sigma^2*z } else if (d == 2) { log(z) - 4*sigma*sqrt(z) + sigma^2*z } else { z^(1-2/d) * d / (d-2) - z^(1-1/d) * 2*sigma*d/(d-1) + sigma^2*z } }, intfinvsq <- Ifinvsq(fof0) - Ifinvsq(fofr), basevolume + pi * intfinvsq ) )) ## derivative of f wrt logpars deriv <- function (s, logpars, types = NULL) {} body(deriv) <- as.call(c(as.name("{"), tmp, expression( sLength <- sqrt(.rowSums(s^2, nrow(s), 2L)), rsigmad <- (sLength+sigma)^d, derivlogsigma <- -d*sigma / rsigmad / (sLength+sigma), derivlogd <- -log(rsigmad) / rsigmad, cbind(derivlogsigma, derivlogd) ) )) ## Numerical integration of 'deriv' over a polygonal domain Deriv <- function (polydomain, deriv, logpars, type = NULL, nGQ = 20L) {} body(Deriv) <- as.call(c(as.name("{"), ## Determine a = argmax(abs(deriv(c(x,0)))) c(tmp, expression( xrange <- polydomain$xrange, # polydomain is a "owin" maxxdist <- max(abs(xrange)), a.logsigma <- 0, xmin.derivlogd <- exp(1/d) - sigma, a.logd <- if (xmin.derivlogd <= 0) 0 else { derivlogd.0 <- -d*log(sigma) / sigma^d derivlogd.xmin <- -exp(-1) if (abs(derivlogd.0) >= abs(derivlogd.xmin)) 0 else min(maxxdist, xmin.derivlogd) }, a <- c(a.logsigma, a.logd), if (sum(xrange) < 0) a <- -a # is more of the domain left of 0? )), expression( deriv1 <- function (s, paridx) deriv(s, logpars, type)[,paridx,drop=TRUE], intderiv1 <- function (paridx) polyCub.SV(polydomain, deriv1, paridx=paridx, nGQ = nGQ, alpha = a[paridx]), res.logsigma <- intderiv1(1L), res.logd <- intderiv1(2L), res <- c(res.logsigma, res.logd), res ) )) ## "effective" integration range (based on some high quantile) effRange <- if (isScalar(effRangeProb)) { stop("'effRange' is currently not supported for power law's") effRange <- function (logpars) {} body(effRange) <- as.call(c(as.name("{"), substitute(qlomax(effRangeProb, exp(logpars[[1]]), exp(logpars[[2]])-1), list(effRangeProb=effRangeProb)) # only works for d > 1! )) effRange } else NULL ## simulate from the power-law kernel (within a maximum distance 'ub') simulate <- function (n, logpars, type, ub) { sigma <- exp(logpars[[1L]]) d <- exp(logpars[[2L]]) ## Sampling from f_{2D}(s) \propto f(||s||), truncated to ||s|| <= ub, ## works via polar coordinates and the inverse transformation method: ## p_{2D}(r,theta) = r * f_{2D}(x,y) \propto r*f(r) = r*(r+\sigma)^{-d} ## => sample angle theta from U(0,2*pi) and r according to: ## p <- function (r) r * (r+sigma)^-d ## Primitive of p: P(r) = int_0^r p(z) dz P <- function (r) { if (d == 1) { r - sigma * log(r/sigma + 1) } else if (d == 2) { log(r/sigma + 1) - r/(r+sigma) } else { (r*(r+sigma)^(1-d) - (r+sigma)^(2-d) / (2-d) + sigma^(2-d)/(2-d)) / (1-d) } } ## for validation of analytic P: numerical integration ## Pnum <- function (r, sigma, d) sapply(r, function (.r) { ## integrate(p, 0, .r, sigma=sigma, d=d)$value ## }) ## Normalizing constant of the density on [0;ub] normconst <- if (is.finite(ub)) P(ub) else { ## for sampling on [0;Inf] the density is only proper if d > 2 if (d <= 2) stop("improper density for d<=2, 'ub' must be finite") (sigma^(d-2) * (d-2) * (d-1))^-1 # = P(Inf) } ## => cumulative distribution function CDF <- function (q) P(q) / normconst ## For inversion sampling, we need the quantile function CDF^-1 ## However, this is not available in closed form, so we use uniroot, ## which requires a finite upper bound! ## Note: in simEpidataCS, simulation is always bounded to eps.s and to ## the largest extend of W, thus, 'ub' is finite stopifnot(is.finite(ub)) QF <- function (p) uniroot(function(q) CDF(q)-p, lower=0, upper=ub)$root ## Now sample r as QF(U), where U ~ U(0,1) r <- sapply(runif(n), QF) ## Check simulation via kernel estimate: ## plot(density(r, from=0, to=ub)); curve(p(x) / normconst, add=TRUE, col=2) ## now rotate each point by a random angle to cover all directions theta <- stats::runif(n, 0, 2*pi) r * cbind(cos(theta), sin(theta)) } ## set function environments to the global environment environment(f) <- environment(F) <- environment(Fcircle) <- environment(deriv) <- environment(Deriv) <- environment(simulate) <- .GlobalEnv if (is.function(effRange)) environment(effRange) <- .GlobalEnv ## return the kernel specification list(f=f, F=F, Fcircle=Fcircle, effRange=effRange, deriv=deriv, Deriv=Deriv, simulate=simulate, npars=2L, validpars=validpars) } surveillance/R/twinstim_helper.R0000644000176000001440000003165212237174420016550 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Some internal helper functions for "twinstim". ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### Determines indexes of potential sources of infection ## determine potential sources of the i'th event ## all arguments but i and qmatrix are nEvents-vectors ## -> determine potential sources for eventTimes[i], eventsTypes[i] with ## distances distvec_j = ||s_i - s_j|| determineSources <- function (i, eventTimes, removalTimes, distvec, eps.s, eventTypes = NULL, qmatrix) { tp <- eventTimes[i] type <- eventTypes[i] # NULL[i] -> NULL infectivity <- (eventTimes < tp) & (removalTimes >= tp) #<- eventTimes= t)) ## ~5x faster alternative assuming a full BLOCK x tile grid, which is ## sorted by BLOCK and tile (tile varying first), specifically there must be ## all levels(stgrid$tile) in every BLOCK in that order; ## this structure is guaranteed by checkstgrid() blockstart <- match(TRUE, stgrid$stop >= t) idx <- blockstart + match(tilename, levels(stgrid$tile)) - 1L lidx <- length(idx) if (lidx == 0L) NA_integer_ else if (lidx == 1L) idx else { stop("'stgrid' has overlapping spatio-temporal grid cells") } } ## Crude estimate for a start value of the endemic intercept ## assuming the model only had a single-cell endemic component ## (rate of homogeneous Poisson process scaled for the offset) crudebeta0 <- function (nEvents, offset.mean, W.area, period, nTypes) { ## nEvents = exp(offset + beta0) * W.area * period * nTypes log(nEvents/W.area/period/nTypes) - offset.mean } ### Really internal helper function, which constructs the function that ### integrates the two-dimensional 'siaf' function over the influence regions of ### the events. The only argument of the returned function is 'siafpars'. ### The returned function is defined in the callers environment, where the ### variables used in the function are available (inside twinstim() or ### simEpidataCS()). .siafIntFUN <- function (siaf, noCircularIR, #= all(eps.s>bdist) = all(sapply(influenceRegion, function(x) # is.null(attr(x,"radius")))) parallel = FALSE ){ ## the following variables are unused here, because the environment of ## FUN will be set to the parent.frame(), where the variables exist ## they are only included to avoid the notes in R CMD check iRareas <- influenceRegion <- eventTypes <- eps.s <- bdist <- effRanges <- NULL ## define the siaf integration function depending on the siaf specification FUN <- if (attr(siaf, "constant")) { if (exists("iRareas", where=parent.frame(), mode="numeric")) { ## in twinstim(), 'iRareas' are pre-defined to save ## computation time (data are fixed during fitting) function (siafpars) iRareas } else { function (siafpars) sapply(influenceRegion, attr, "area", simplify=TRUE, USE.NAMES=FALSE) } } else if (is.null(siaf$Fcircle) || # if siaf$Fcircle not available (is.null(siaf$effRange) && noCircularIR)) { ## Numerically integrate 'siaf' over each influence region mapplyFUN( c(alist(siaf$F, influenceRegion, type=eventTypes), list(MoreArgs=quote(list(siaf$f, siafpars, ...)), SIMPLIFY=TRUE, USE.NAMES=FALSE)), ##<- we explicitly quote() the ...-part instead of simply including ## it in the above alist() - only to make checkUsage() happy parallel = parallel) } else if (is.null(siaf$effRange)) # use Fcircle but only delta-trick { mapplyFUN( c(alist(function (iR, type, eps, bdisti, siafpars, ...) if (eps <= bdisti) # influence region completely inside W siaf$Fcircle(eps, siafpars, type) else # numerically integrate over influence region siaf$F(iR, siaf$f, siafpars, type, ...) , influenceRegion, eventTypes, eps.s, bdist), list(MoreArgs=quote(list(siafpars, ...)), SIMPLIFY=TRUE, USE.NAMES=FALSE)), parallel = parallel) } else { # fast Fcircle integration considering the delta-trick AND effRange .ret <- mapplyFUN( c(alist(function (iR, type, eps, bdisti, effRange, siafpars, ...) if (eps <= bdisti) # influence region completely inside W siaf$Fcircle(eps, siafpars, type) else if (effRange <= bdisti) # effective region inside W siaf$Fcircle(bdisti, siafpars, type) else # numerically integrate over influence region siaf$F(iR, siaf$f, siafpars, type, ...) , influenceRegion, eventTypes, eps.s, bdist, effRanges), list(MoreArgs=quote(list(siafpars, ...)), SIMPLIFY=TRUE, USE.NAMES=FALSE)), ## before: compute computationally effective range of the 'siaf' ## for the current 'siafpars' for each event (type): before = expression( effRangeTypes <- rep_len(siaf$effRange(siafpars), nTypes), effRanges <- effRangeTypes[eventTypes] # N-vector ), parallel = parallel) if (exists("effRangeTypes", where=parent.frame(), mode="numeric")) { ## in simEpidataCS effRangeTypes is pre-calculated outside siafInt to ## save computation time ('siafpars' is constant during simulation) body(.ret)[[grep("^effRangeTypes <-", body(.ret))]] <- NULL } .ret } ## set the environment of the siafInt function to the callers environment ## (i.e. inside twinstim() or simEpidataCS()) ## where the variables used in the function are defined environment(FUN) <- parent.frame() FUN } ### Helper function, which constructs the function that integrates the 'tiaf'. ### The returned function is defined in the callers environment, where the ### variables used in the function are available (inside twinstim() or ### simEpidataCS()). .tiafIntFUN <- function () { ## the following variables are unused here, because the environment of ## FUN will be set to the parent.frame(), where the variables exist ## they are only included to avoid the notes in R CMD check gIntLower <- gIntUpper <- eventTypes <- tiaf <- NULL ## from, to and type may be vectors of compatible lengths FUN <- function(tiafpars, from = gIntLower, to = gIntUpper, type = eventTypes, G = tiaf$G) { tiafIntUpper <- G(to, tiafpars, type) tiafIntLower <- G(from, tiafpars, type) tiafIntUpper - tiafIntLower } ## set the environment of the tiafInt function to the callers environment ## (i.e. inside twinstim() or simEpidataCS()) ## where the default argument values are defined environment(FUN) <- parent.frame() FUN } ### rename control arguments with optim names to have names compatible with nlminb control2nlminb <- function (control, defaults) { renamelist <- cbind(optim = c("maxit", "REPORT", "abstol", "reltol"), nlminb = c("iter.max", "trace", "abs.tol", "rel.tol")) for (i in which(renamelist[,"optim"] %in% names(control))) { fromname <- renamelist[i, "optim"] toname <- renamelist[i, "nlminb"] if (is.null(control[[toname]])) { control[[toname]] <- control[[fromname]] } control[[fromname]] <- NULL } defaults[names(control)] <- control defaults } ### Helper for iaf-checks: ### Checks if FUN has three arguments (s/t, pars, type) and ### eventually adds the last two .checknargs3 <- function (FUN, name) { FUN <- match.fun(FUN) NARGS <- length(formals(FUN)) if (NARGS == 0L) { stop("the function '", name, "' must accept at least one argument") } else if (NARGS == 1L) { formals(FUN) <- c(formals(FUN), alist(pars=, types=)) } else if (NARGS == 2L) { formals(FUN) <- c(formals(FUN), alist(types=)) } FUN } ### Internal wrapper used in twinstim() and simEpidataCS() to evaluate the siaf ### and tiaf arguments. If succesful, returns checked interaction function. .parseiaf <- function (iaf, type = c("siaf", "tiaf"), verbose = TRUE) { type <- match.arg(type) if (missing(iaf) || is.null(iaf)) { if (verbose) { message("assuming constant ", switch(type, siaf="spatial", tiaf="temporal"), " interaction '", type, ".constant()'") } do.call(paste(type, "constant", sep="."), args=alist()) } else if (is.list(iaf)) { ret <- do.call(type, args = iaf) attr(ret, "constant") <- isTRUE(attr(iaf, "constant")) ret } else if (is.vector(iaf, mode = "numeric")) { stop("'knots' are not implemented for '",type,"'") do.call(type, args = list(knots = iaf)) } else { stop("'", as.character(substitute(iaf)), "' must be NULL (or missing), a list (-> continuous ", "function), or numeric (-> knots of step function)") } } ### Construct a call/function for mapply or parallel::mcmapply, respectively ## args: alist() of arguments for mapply() ## before,after: expressions to be prepended/appended to the function body, ## where "res" will be the result of mapply() mapplyCall <- function (args, cores = 1L) { parallel <- is.name(cores) || cores > 1L mapplyFUN <- if (parallel) quote(parallel::mcmapply) else quote(mapply) parallelArgs <- list(mc.preschedule=TRUE, mc.cores=cores) as.call(c(mapplyFUN, args, if (parallel) parallelArgs)) } mapplyFUN <- function (args, before = list(), after = list(), parallel = TRUE) { FUN <- as.function(alist(siafpars=, ...=, NULL), envir=parent.frame()) body(FUN) <- mapplyCall(args, if (parallel) quote(cores) else 1L) if (length(after) + length(before) > 0) { body(FUN) <- as.call(c( list(as.name("{")), before, if (length(after)) call("<-", as.name("res"), body(FUN)) else body(FUN), after)) } FUN } surveillance/R/twinstim_epidata_methods.R0000644000176000001440000007046312237174420020426 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### S3-methods for "epidataCS" data objects, which represent ### CONTINUOUS SPATIO-temporal infectious disease case data ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### Number of events nobs.epidataCS <- function (object, ...) length(object$events) ### UPDATE eps.s, eps.t, qmatrix OR nCircle2Poly IN AN EXISTING epidataCS OBJECT # all arguments but 'object' are optional, the ... argument is unused update.epidataCS <- function (object, eps.t, eps.s, qmatrix, nCircle2Poly, ...) { nEvents <- nobs(object) # Check and update eps.t if (!missing(eps.t)) { stopifnot(is.numeric(eps.t), eps.t > 0) object$events$eps.t <- eps.t } # Initialise indicator of which influenceRegions to update ir2update <- logical(nEvents) # all FALSE # Check and update eps.s if (!missing(eps.s)) { stopifnot(is.numeric(eps.s), eps.s > 0) oldeps.s <- object$events$eps.s object$events$eps.s <- eps.s ir2update <- oldeps.s != object$events$eps.s } # Check nCircle2Poly nCircle2Poly <- if (missing(nCircle2Poly)) { attr(object$events$.influenceRegion, "nCircle2Poly") } else { stopifnot(isScalar(nCircle2Poly)) ir2update <- rep.int(TRUE, nEvents) as.integer(nCircle2Poly) } # Update influenceRegions of events if (any(ir2update)) { object$events$.influenceRegion[ir2update] <- .influenceRegions(object$events[ir2update,], object$W, nCircle2Poly) attr(object$events$.influenceRegion, "nCircle2Poly") <- nCircle2Poly } # Check qmatrix if (!missing(qmatrix)) object$qmatrix <- checkQ(qmatrix, levels(object$events$type)) #hoehle @ 16 Apr 2011 - bug fix. .obsInfLength was not handled # Update length of infection time, i.e. length = min(T-time, eps.t) if (!missing(eps.t)) { timeRange <- with(object$stgrid, c(start[1], stop[length(stop)])) object$events$.obsInfLength <- with(object$events@data, pmin(timeRange[2]-time, eps.t)) } # Update .sources if (!missing(eps.t) || !missing(eps.s) || !missing(qmatrix)) { object$events$.sources <- determineSources.epidataCS(object) } # Done update. return(object) } ### subsetting epidataCS, i.e. select only part of the events, ### but retain stgrid and W. If any event types disappear due to subsetting, ### these types will be dropped from the factor levels and from qmatrix "[.epidataCS" <- function (x, i, j, drop = FALSE) { ## Store nCircle2Poly attribute of x$events$.influenceRegion since this will ## be dropped when subsetting nCircle2Poly <- attr(x$events$.influenceRegion, "nCircle2Poly") ## apply [,SpatialPointsDataFrame-method cl <- sys.call() cl[[1]] <- as.name("[") cl[[2]] <- substitute(x$events) x$events <- eval(cl, envir=parent.frame()) ## restore nCircle2Poly attribute attr(x$events$.influenceRegion, "nCircle2Poly") <- nCircle2Poly ## assure valid epidataCS after subsetting if (!missing(j)) { # only epidemic covariates may be selected BLOCKstartEndemicVars <- setdiff(names(x$stgrid), setdiff(obligColsNames_stgrid,"start")) if (!all(obligColsNames_events %in% names(x$events)) || !all(BLOCKstartEndemicVars %in% names(x$events))) { stop("only epidemic covariates may be removed from 'events'") } } if (!missing(i)) { ## update .sources x$events$.sources <- determineSources.epidataCS(x) ## update types and qmatrix (a type could have disappeared) x$events$type <- x$events$type[drop=TRUE] typeNames <- levels(x$events$type) if (!identical(rownames(x$qmatrix), typeNames)) { message("Note: dropped type(s) ", paste0("\"", setdiff(rownames(x$qmatrix), typeNames), "\"", collapse = ", ")) typesIdx <- match(typeNames, rownames(x$qmatrix)) x$qmatrix <- x$qmatrix[typesIdx, typesIdx, drop = FALSE] } } ## Done return(x) } ## The subset method for epidataCS-objects is adapted from ## base::subset.data.frame (authored by Peter ## Dalgaard and Brian Ripley, Copyright (C) 1995-2012 ## The R Core Team) with slight modifications only ## (we just replace 'x' by 'x$events@data' for evaluation of subset and select) subset.epidataCS <- function (x, subset, select, drop = FALSE, ...) { if (missing(subset)) r <- TRUE else { e <- substitute(subset) r <- eval(e, x$events@data, parent.frame()) # HERE IS A MOD if (!is.logical(r)) stop("'subset' must evaluate to logical") r <- r & !is.na(r) } if (missing(select)) vars <- TRUE else { nl <- as.list(seq_along(x$events@data)) # HERE IS A MOD names(nl) <- names(x$events@data) # HERE IS A MOD vars <- eval(substitute(select), nl, parent.frame()) } x[r, vars, drop = drop] # this calls the [.epidataCS-method from above } ## Subset epidataCS object using head and tail methods (which use [.epidataCS) head.epidataCS <- function (x, n = 6L, ...) head.matrix(x, n = n, ...) tail.epidataCS <- function (x, n = 6L, ...) { # ugly hack for tail.matrix because I don't want to register a # dim-method for class "epidataCS" nrow <- function (x) base::nrow(x$events) my.tail.matrix <- tail.matrix environment(my.tail.matrix) <- environment() ##<- such that the function uses my local nrow definition my.tail.matrix(x, n = n, addrownums=FALSE, ...) } ### extract marks of the events (actually also including time and tile) marks.epidataCS <- function (x, coords = TRUE, ...) { noEventMarks <- setdiff(reservedColsNames_events, "ID") endemicCovars <- setdiff(names(x$stgrid), c(reservedColsNames_stgrid, obligColsNames_stgrid)) idxnonmarks <- match(c(noEventMarks, endemicCovars), names(x$events)) if (coords) { # use as.data.frame method for SpatialPointsDataFrame as.data.frame(x$events[-idxnonmarks]) } else { # return marks without coordinates x$events@data[-idxnonmarks] } } ### printing methods print.epidataCS <- function (x, n = 6L, digits = getOption("digits"), ...) { timeRange <- c(x$stgrid$start[1], x$stgrid$stop[nrow(x$stgrid)]) bboxtxt <- paste(apply(bbox(x$W), 1, function (int) paste0("[", paste(format(int, trim=TRUE, digits=digits), collapse=", "), "]") ), collapse = " x ") nBlocks <- length(unique(x$stgrid$BLOCK)) nTiles <- nlevels(x$stgrid$tile) typeNames <- levels(x$events$type) nEvents <- nobs(x) cat("\nHistory of an epidemic\n") cat("Observation period:", paste(format(timeRange, trim=TRUE, digits=digits), collapse = " -- "), "\n") cat("Observation window (bounding box):", bboxtxt, "\n") cat("Spatio-temporal grid (not shown):", nBlocks, ngettext(nBlocks, "time block,", "time blocks,"), nTiles, ngettext(nTiles, "tile", "tiles"), "\n") cat("Types of events:", paste0("'",typeNames,"'"), "\n") cat("Overall number of events:", nEvents, "\n\n") # 'print.SpatialPointsDataFrame' does not pass its "digits" argument on to # 'print.data.frame', hence the use of options() odigits <- options(digits=digits); on.exit(options(odigits)) visibleCols <- grep("^\\..+", names(x$events@data), invert = TRUE) print(head.matrix(x$events[visibleCols], n = n), ...) if (n < nEvents) cat("[....]\n") cat("\n") invisible(x) } ### SUMMARY # the epidemic is summarized by the following returned components: # timeRange, nEvents, eventTimes, eventCoords, nSources, as well as # - tile/typetable: number of events per tile/type # - counter: number of infective individuals as stepfun summary.epidataCS <- function (object, ...) { coords <- coordinates(object$events) times <- object$events$time nEvents <- length(times) timeRange <- with(object$stgrid, c(start[1], stop[length(stop)])) nBlocks <- length(unique(object$stgrid$BLOCK)) tiles <- object$events$tile bbox <- bbox(object$W) tileTable <- c(table(tiles)) types <- object$events$type nTypes <- nlevels(types) typeTable <- c(table(types)) nSources <- sapply(object$events$.sources, length) eps <- object$events@data[c("eps.t", "eps.s")] eventMarks <- marks(object) removalTimes <- times + object$events$eps.t tps <- sort(unique(c(times, removalTimes[is.finite(removalTimes)]))) nInfectious <- sapply(tps, function(t) sum(times <= t & removalTimes > t)) counter <- stepfun(tps, c(0,nInfectious), right = TRUE) res <- list(timeRange = timeRange, bbox = bbox, nBlocks = nBlocks, nEvents = nEvents, nTypes = nTypes, eventTimes = times, eventCoords = coords, eventTypes = types, eventRanges = eps, eventMarks = eventMarks, tileTable = tileTable, typeTable = typeTable, counter = counter, nSources = nSources) class(res) <- "summary.epidataCS" res } print.summary.epidataCS <- function (x, ...) { bboxtxt <- paste(apply(x$bbox, 1, function (int) paste0("[", paste(format(int, trim=TRUE), collapse=", "), "]") ), collapse = " x ") cat("\n") cat("Observation period:", paste(format(x$timeRange, trim=TRUE), collapse = " -- "), "\n") cat("Observation window (bounding box):", bboxtxt, "\n") cat("Spatio-temporal grid (not shown):", x$nBlocks, ngettext(x$nBlocks, "time block,", "time blocks,"), length(x$tileTable), ngettext(length(x$tileTable), "tile", "tiles"), "\n") cat("Overall number of events:", x$nEvents, if (x$nTypes==1) "(single type)" else paste0("(",x$nTypes," types)"), "\n") ## if (x$nTypes > 1) { ## cat(x$nTypes, "types of events:\n") ## print(as.table(x$typeTable)) ## } ## cat("\nTime points of events:\n") ## print(summary(x$eventTimes)) ## cat("\nTiles of events:\n") ## print(as.table(x$tileTable)) cat("\nSummary of the event marks:\n") print(summary(x$eventMarks)) cat("Number of potential sources of transmission:\n") if (any(is.finite(unlist(x$eventRanges)))) { print(summary(x$nSources)) cat("\nStep function of the number of infectives over time:\n") print(x["counter"]) } else { cat(" monotonically increasing like the number of infectives\n", " because of infinite ranges of interaction ('eps.t' and 'eps.s')\n", sep="") } cat("\n") invisible(x) } ### animate # spatio-temporal animation, two types: # time.spacing=NULL: sequential plots regardless of time between events (i.e. only ordering) # time.spacing=scalar: chronological animation with timer. if time.spacing = NA, then the time step is automatically determined such that ani.options("nmax") snapshots result. # respects ani.options "interval" and "nmax" animate.epidataCS <- function (object, interval = c(0,Inf), time.spacing = NULL, nmax = NULL, sleep = NULL, legend.opts = list(), timer.opts = list(), pch = 15:18, col.current = "red", col.I = "#C16E41", col.R = "#B3B3B3", col.influence = "#FEE0D2", main = NULL, verbose = TRUE, ...) { stopifnot(is.numeric(interval), length(interval) == 2L) with.animation <- suppressWarnings(require("animation")) if (is.null(sleep)) { sleep <- if (with.animation) animation::ani.options("interval") else 0.1 ## we cannot set this as default function argument, because we don't ## want to depend on package "animation" (surveillance only suggests it) } if (is.null(nmax)) { nmax <- if (with.animation) animation::ani.options("nmax") else Inf } s <- summary(object) removalTimes <- s$eventTimes + object$events$eps.t eventCoordsTypes <- cbind(s$eventCoords, type = s$eventTypes) pch <- rep_len(pch, s$nTypes) typeNames <- names(s$typeTable) multitype <- length(typeNames) > 1L # set default legend options doLegend <- if (is.list(legend.opts)) { if (is.null(legend.opts[["x"]])) legend.opts$x <- "topright" if (is.null(legend.opts$title)) legend.opts$title <- if (multitype) "type" else "state" if (is.null(legend.opts$legend)) { legend.opts$legend <- if (multitype) typeNames else c("infectious", if (!is.na(col.R)) "removed") } if (is.null(legend.opts$col)) { legend.opts$col <- if (multitype) col.current else c(col.I, if (!is.na(col.R)) col.R) } if (is.null(legend.opts$pch)) legend.opts$pch <- pch TRUE } else FALSE # set default timer options doTimer <- if (is.list(timer.opts)) { if (is.null(timer.opts[["x"]])) timer.opts$x <- "bottomright" if (is.null(timer.opts$title)) timer.opts$title <- "time" if (is.null(timer.opts$box.lty)) timer.opts$box.lty <- 0 if (is.null(timer.opts$adj)) timer.opts$adj <- c(0.5,0.5) if (is.null(timer.opts$inset)) timer.opts$inset <- 0.01 if (is.null(timer.opts$bg)) timer.opts$bg <- "white" TRUE } else FALSE # determines multiplicity of rows of a numeric matrix # and returns unique rows with appended multiplicity column countunique <- function (mat) { count <- multiplicity(mat) unique(cbind(mat, count)) } # wrapper for 'points' with specific 'cex' for multiplicity multpoints <- function (tableCoordsTypes, col) { tableMult <- countunique(tableCoordsTypes) points(tableMult[,1:2,drop=FALSE], pch = pch[tableMult[,"type"]], col = col, cex = sqrt(1.5*tableMult[,"count"]/pi) * par("cex")) } # functions returning if events are in status I or R at time t I <- function (t) s$eventTimes <= t & removalTimes >= t R <- function (t) removalTimes < t sequential <- is.null(time.spacing) # plot observed infections sequentially if (!sequential) stopifnot(length(time.spacing) == 1L) timeGrid <- if (sequential) unique(s$eventTimes) else { start <- max(s$timeRange[1], interval[1]) end <- min(interval[2], s$timeRange[2], max(removalTimes) + if (is.na(time.spacing)) 0 else time.spacing) if (is.na(time.spacing)) { if (!is.finite(nmax)) { stop("with 'time.spacing=NA', 'nmax' must be finite") } seq(from = start, to = end, length.out = nmax) } else { tps <- seq(from = start, to = end, by = time.spacing) if (length(tps) > nmax) { message("Generating only the first ", sQuote(if (with.animation) "ani.options(\"nmax\")" else "nmax"), " (=", nmax, ") snapshots") head(tps, nmax) } else tps } } .info <- format.info(timeGrid) timerformat <- paste0("%", .info[1], ".", .info[2], "f") # animate loopIndex <- if (!sequential) timeGrid else { idxs <- which(s$eventTimes >= interval[1] & s$eventTimes <= interval[2]) if (length(idxs) > nmax) { message("Generating only the first ", sQuote(if (with.animation) "ani.options(\"nmax\")" else "nmax"), " (=", nmax, ") events") head(idxs, nmax) } else idxs } told <- -Inf if (verbose) pb <- txtProgressBar(min=0, max=max(loopIndex), initial=0, style=3) for(it in loopIndex) { t <- if (sequential) s$eventTimes[it] else it infectious <- I(t) removed <- R(t) plot(object$W, ...) title(main = main) if (doLegend) do.call(legend, legend.opts) if (doTimer) { ttxt <- sprintf(timerformat, t) do.call(legend, c(list(legend = ttxt), timer.opts)) } if (!is.null(col.influence)) { iRids <- which(infectious) if (sequential) setdiff(iRids, it) for(j in iRids) { iR <- shift.owin(object$events@data$.influenceRegion[[j]], s$eventCoords[j,]) plot(iR, add = TRUE, col = col.influence, border = NA) } } rTable <- eventCoordsTypes[removed,,drop=FALSE] if (nrow(rTable) > 0L) multpoints(rTable, col = col.R) iTable <- eventCoordsTypes[infectious,,drop=FALSE] if (nrow(iTable) > 0L) multpoints(iTable, col = col.I) infectiousNew <- if (sequential) it else infectious & !I(told) iTableNew <- eventCoordsTypes[infectiousNew,,drop=FALSE] if (nrow(iTableNew) > 0L) multpoints(iTableNew, col = col.current) told <- t if (verbose) setTxtProgressBar(pb, it) Sys.sleep(sleep) } if (verbose) close(pb) invisible(NULL) } ### plot method for epidataCS plot.epidataCS <- function (x, aggregate = c("time", "space"), subset, ...) { aggregate <- match.arg(aggregate) FUN <- paste("plot.epidataCS", aggregate, sep="_") do.call(FUN, args=list(x=quote(x), subset=substitute(subset), ...)) } ### plot.epidataCS(x, aggregate = "time") -> number of cases over time ## in case t0.Date is specified, hist.Date() is used and breaks must set in ... (e.g. "months") plot.epidataCS_time <- function (x, subset, t0.Date = NULL, freq = TRUE, col = "white", add = FALSE, xlim = NULL, ylim = NULL, xlab = "Time", ylab = NULL, main = NULL, panel.first = abline(h=axTicks(2), lty=2, col="grey"), ...) { timeRange <- with(x$stgrid, c(start[1L], stop[length(stop)])) eventTimes <- if (missing(subset)) x$events$time else { do.call(base::subset, list(x = quote(marks(x)), subset = substitute(subset), select = "time", drop = TRUE)) } if (length(eventTimes) == 0) stop("no events left after 'subset'") if (!is.null(t0.Date)) { stopifnot(inherits(t0.Date, "Date") || is.vector(t0.Date), length(t0.Date) == 1L) t0.Date <- as.Date(t0.Date) t0 <- timeRange[1L] if (is.null(xlim)) xlim <- t0.Date + (timeRange - t0) if (missing(xlab)) xlab <- paste0("Time (", list(...)[["breaks"]], ")") eventTimes <- t0.Date + as.integer(eventTimes - t0) ## we need integer dates here because otherwise, if the last event ## occurs on the last day of a month, year, etc. (depending on ## 'breaks') with a fractional date (e.g. as.Date("2009-12-31") + 0.5), ## then the automatic 'breaks' (e.g., breaks = "months") will not cover ## the data (in the example, it will only reach until ## as.Date("2009-12-31")). } histdata <- if (is.null(t0.Date)) { hist(eventTimes, plot=FALSE, warn.unused=FALSE, ...) } else { hist(eventTimes, plot=FALSE, ...) # warn.unused=FALSE is hard-coded in hist.Date } if (!add) { if (is.null(xlim)) xlim <- timeRange if (is.null(ylim)) { ylim <- range(0, histdata[[if (freq) "counts" else "density"]]) } if (is.null(ylab)) { ylab <- if (freq) "Number of cases" else "Density of cases" } plot(x=xlim, y=ylim, xlab=xlab, ylab=ylab, main=main, type="n", bty="n") force(panel.first) } plot(histdata, freq = freq, add = TRUE, col = col, ...) box() # because white filling of bars might overdraw the inital box invisible(histdata) } ### plot.epidataCS(x, aggregate = "space") -> spatial point pattern plot.epidataCS_space <- function (x, subset, cex.fun = sqrt, points.args = list(cex=0.5), colTypes = rainbow(nlevels(x$events$type)), ...) { stopifnot(is.list(points.args)) events <- if (missing(subset)) x$events else { eval(substitute(base::subset(x$events, subset=.subset), list(.subset=substitute(subset)))) ## do.call(base::subset, ## args = list(x=quote(x$events), subset=substitute(subset))) } events@data[["_MULTIPLICITY_"]] <- multiplicity(events) events <- events[!duplicated(coordinates(events)),] pointcex <- cex.fun(events$"_MULTIPLICITY_") pointcex <- pointcex * points.args$cex points.args$cex <- NULL if (is.null(points.args[["col"]])) { points.args$col <- colTypes[events$type] } plot(x$W, ...) do.call("points", c(alist(x=events, cex=pointcex), points.args)) invisible() } ###################################################################### # Transform _twinstim_ epidataCS to _twinSIR_ epidata object ###################################################################### # this only generates a SIS epidemic, i.e. atRiskY is set to 1 immediately after recovery # length of infectious period is taken from epidataCS$events$eps.t # fcols are not generated here. these must be generated by a second call to twinSIR's as.epidata with desired f. (for safety) # tileCentroids is a coordinate matrix whose row names are the tile levels as.epidata.epidataCS <- function (data, tileCentroids, eps = 0.001, ...) { if (!requireNamespace("intervals")) stop("conversion from ", dQuote("epidataCS"), " to ", dQuote("epidata"), " requires the ", dQuote("intervals"), " package") ### generate twinSIR's epidata object from stgrid (no events) centroidIdx <- match(levels(data$stgrid$tile), rownames(tileCentroids), nomatch = NA_integer_) if (any(is.na(centroidIdx))) { stop("some levels of 'data$stgrid$tile' are not available from 'tileCentroids'") } centroids <- tileCentroids[centroidIdx,] if (any(c("xCent", "yCent") %in% names(data$stgrid))) { stop("'data$stgrid' already has columns \"xCent\" and \"yCent\"") } stgrid <- cbind(data$stgrid, atRiskY = 1L, event = 0L, Revent = 0L, xCent = centroids[,1], yCent = centroids[,2] # relies on ordering of stgrid by first BLOCK, then tile ) names(stgrid)[names(stgrid)=="tile"] <- "id" ### now determine "events" with respect to the tiles # individual data indItimes <- data$events$time if (anyDuplicated(indItimes)) stop("'data$events' has concurrent event times") indRtimes <- indItimes + data$events$eps.t indInts <- intervals::Intervals(cbind(indItimes, indRtimes, deparse.level = 0L)) indTiles <- data$events$tile # tile data tileRows <- tapply(seq_along(indTiles), indTiles, c, simplify = FALSE) tileInts <- lapply(tileRows, function (rows) { if (length(rows)==0L) { matrix(0,0,2) } else if (length(rows)==1L) { as.matrix(indInts[rows]) } else as.matrix(intervals::reduce(indInts[rows])) }) tileNames <- rep.int(names(tileInts), sapply(tileInts, nrow)) tileItimes <- unlist(lapply(tileInts, function(ints) ints[,1]), use.names=FALSE) tileRtimes <- unlist(lapply(tileInts, function(ints) ints[,2]), use.names=FALSE) # there are possibly Rtimes which equal Itimes of other individuals # => break ties by considering Rtime shortly before Itime (arbitrary choice) while(length(dup <- which(tileRtimes %in% tileItimes)) > 0L) { tileRtimes[dup] <- tileRtimes[dup] - eps } # now there could be duplicated Rtimes... grml (choose another 'eps' in this case) if (anyDuplicated(tileRtimes)) { stop("breaking ties introduced duplicated Rtimes") } ### add additional stop times to stgrid for tile infections and recoveries requiredStopTimes <- sort(c(tileItimes, tileRtimes)) class(stgrid) <- c("epidataCS", "data.frame") attr(stgrid, "timeRange") <- c(stgrid$start[1], tail(stgrid$stop,1)) cat("Inserting extra stop times in 'stgrid' (this might take a while)... ") evHist <- intersperse(stgrid, requiredStopTimes) # this resets the BLOCK index class(evHist) <- "data.frame" ### <- THIS IS THE MOST TIME-CONSUMING PART OF THIS FUNCTION !!! cat("Done.\n") ### set event, Revent and atRiskY indicators tileNamesCodes <- match(tileNames, levels(evHist$id)) # event indicator (currently in evHist event==0 everywhere) idxItimes <- match(tileItimes, evHist$stop) - 1L + tileNamesCodes evHist$event[idxItimes] <- 1L # Revent indicator (currently in evHist Revent==0 everywhere) idxRtimes <- match(tileRtimes, evHist$stop) - 1L + tileNamesCodes # (may contain NA's if Revent after last stop) evHist$Revent[idxRtimes] <- 1L # atRiskY indicator .atRiskY <- rep.int(1L, nrow(evHist)) nTiles <- nlevels(evHist$id) nBlocks <- tail(evHist$BLOCK, 1) stopTimes <- unique(evHist$stop) # has length nBlocks for (i in seq_along(tileItimes)) { .Itime <- tileItimes[i] .Rtime <- tileRtimes[i] .tileCode <- tileNamesCodes[i] idxsTileInEpi <- seq(.tileCode, by=nTiles, length.out=nBlocks) first0block <- match(.Itime, stopTimes) + 1L last0block <- if (.Rtime > stopTimes[nBlocks]) nBlocks else match(.Rtime, stopTimes) .atRiskY[idxsTileInEpi[first0block:last0block]] <- 0L } evHist$atRiskY <- .atRiskY ### Return final epidata object of twinSIR-type cat("Generating final \"epidata\" object for use with twinSIR... ") epi <- as.epidata(evHist[-grep("BLOCK", names(evHist))], id.col="id", start.col="start", stop.col="stop", atRiskY.col="atRiskY", event.col="event", Revent.col="Revent", coords.cols=c("xCent","yCent") ) cat("Done.\n") epi } #################################################################### ### Transform "epidataCS" to "sts" by aggregation of cases on stgrid #################################################################### epidataCS2sts <- function (object, freq, start, neighbourhood, tiles = NULL, popcol.stgrid = NULL, popdensity = TRUE) { stopifnot(inherits(object, "epidataCS")) tileLevels <- levels(object$stgrid$tile) if (!is.null(tiles)) { stopifnot(inherits(tiles, "SpatialPolygons"), tileLevels %in% row.names(tiles)) tiles <- tiles[tileLevels,] } ## prepare sts components epoch <- unique(object$stgrid$BLOCK) # epidataCS is sorted eventsByCell <- with(object$events@data, table(BLOCK=factor(BLOCK, levels=epoch), tile)) if (missing(neighbourhood)) { # auto-detect neighbourhood from tiles if (is.null(tiles)) stop("'tiles' is required for auto-generation of 'neighbourhood'") neighbourhood <- poly2adjmat(tiles, zero.policy=TRUE) if (any(rowSums(neighbourhood) == 0)) warning("generated neighbourhood matrix contains islands") } populationFrac <- if (is.null(popcol.stgrid)) NULL else { stopifnot(is.vector(popcol.stgrid), length(popcol.stgrid) == 1) popByCell <- object$stgrid[[popcol.stgrid]] if (popdensity) popByCell <- popByCell * object$stgrid[["area"]] totalpop <- sum(popByCell[seq_along(tileLevels)]) matrix(popByCell/totalpop, nrow=length(epoch), ncol=length(tileLevels), byrow=TRUE, dimnames=dimnames(eventsByCell)) } ## initialize sts object new("sts", epoch = epoch, freq=freq, start=start, observed=unclass(eventsByCell), neighbourhood=neighbourhood, populationFrac=populationFrac, map=tiles, epochAsDate=FALSE) } ################################################### ### Distances from potential (eps.s, eps.t) sources ################################################### getSourceDists <- function (object) { ## extract required info from "epidataCS"-object eventCoords <- coordinates(object$events) .sources <- object$events$.sources ## distance matrix and number of sources distmat <- as.matrix(dist(eventCoords)) nsources <- sapply(.sources, length) hasSources <- nsources > 0 cnsources <- c(0, cumsum(nsources)) ## generate vector of distances of events to their potential sources sourcedists <- numeric(sum(nsources)) for (i in which(hasSources)) { .sourcesi <- .sources[[i]] .sourcedists <- distmat[i, .sourcesi] .idx <- cnsources[i] + seq_len(nsources[i]) sourcedists[.idx] <- .sourcedists names(sourcedists)[.idx] <- paste(i, .sourcesi, sep="<-") } ## Done sourcedists } surveillance/R/backprojNP.R0000644000176000001440000003630012003566343015357 0ustar ripleyusers###################################################################### # Implementation of the backprojection method as described in # Becker et al. (1991), Stats in Med, 10, 1527-1542. The method # was originally developed for the back-projection of AIDS incidence # but it is equally useful for analysing the epidemic curve in outbreak # situations of a disease with long incubation time, e.g. in order # to illustrate the effect of intervention measures. # # See backprojNP.Rd for the remaining details. ###################################################################### ###################################################################### # Helper function: Replace NaN or is.infinite values with zero. # Good against division by zero problems. # # Parameters: # x - a vector of type double ###################################################################### naninf2zero <- function(x) {x[is.nan(x) | is.infinite(x)] <- 0 ; return(x)} ## Rcpp inline function to significantly speed up the computation of equation ## 3a in the Becker et al. (1991) paper. Created with the help of Daniel ## Sabanes Bove, University of Zurich. ## eq3a <- ## cxxfunction(signature(rlambdaOld="numeric", ## ry="numeric", ## rincuPmf="numeric"), ## ' ## { ## // get arguments ## NumericVector lambdaOld(rlambdaOld); ## int T = lambdaOld.length(); ## NumericVector y(ry); ## NumericVector incuPmf(rincuPmf); ## NumericVector dincu(T); ## NumericVector pincu(T); ## pincu[0] = dincu[0]; ## for (int i=1; i0) { w <- choose(k,0:k)/2^k for (t in 1:T) { i.sub <- t+(0:k)-k/2 goodIdx <- i.sub %in% 1:T w.sub <- w[goodIdx]/sum(w[goodIdx]) lambda.new[t] <- sum(w.sub * phi.new[i.sub[goodIdx]]) } } else { #no smoothing lambda.new <- phi.new } #Done. return(lambda=lambda.new) } ###################################################################### # STS compatible function to call the non-parametric back-projection # method of Becker et al (1991) for time aggregated data. # # Parameters: # sts - sts object with the observed incidence as "observed" slot # incu.pmf - incubation time pmf as a vector with index 0,..,d_max. Please # note that the support includes zero! # k - smoothing parameter for the EMS algorithm # eps - relative convergence criteration # iter.max - max number of iterations # verbose - boolean, if TRUE provide extra output when running the method # lambda0 - start value for lambda, default: uniform # hookFun - hook function to call after each EMS step, a function # of type hookFun=function(stsj,...) # # Returns: # sts object with upperbound set to the backprojected lambda. ###################################################################### backprojNP.fit <- function(sts, incu.pmf,k=2,eps=1e-5,iter.max=250,verbose=FALSE,lambda0=NULL,eq3a.method=c("R","C"),hookFun=function(stsbp) {}, ...) { #Determine method eq3a.method <- match.arg(eq3a.method, c("R","C")) #Define object to return lambda.hat <- matrix(NA,ncol=ncol(sts),nrow=nrow(sts)) #Loop over all series for (j in 1:ncol(sts)) { #Inform (if requested) what series we are looking at if ((ncol(sts)>1) & verbose) { cat("Backprojecting series no. ",j,"\n") } #Extract incidence time series Y <- observed(sts)[,j] #If default behaviour for lambda0 is desired if (is.null(lambda0)) { lambda0j <- rep(sum(Y)/length(Y),length(Y)) } else { lambda0j <- lambda0[,j] } #Create incubation time distribution vectors for the j'th series inc.pmf <- as.numeric(incu.pmf[,j]) inc.cdf <- cumsum(inc.pmf) #Create wrapper functions for the PMF and CDF based on the vector. #These function will be used in the R version of eq3a. #ToDo: The function uses the global variable inc.pmf which #definitely is dirty coding. How to define this function #in an environment where inc.pmf is present? dincu <- function(x) { notInSupport <- x<0 | x>=length(inc.pmf) #Give index -1 to invalid queries x[notInSupport] <- -1 return(c(0,inc.pmf)[x+2]) } #Cumulative distribution function. Uses global var "inc.cdf" pincu <- function(x) { x[x<0] <- -1 x[x>=length(inc.cdf)] <- length(inc.cdf)-1 return(c(0,inc.cdf)[x+2]) } #Iteration counter and convergence indicator i <- 0 stop <- FALSE lambda <- lambda0j #Loop until stop while (!stop) { #Add to counter i <- i+1 lambda.i <- lambda #Perform one step lambda <- em.step.becker(lambda.old=lambda.i,Y=Y,dincu=dincu,pincu=pincu,k=k, incu.pmf=inc.pmf, eq3a.method=eq3a.method) #check stop #In original paper the expression to do so appears funny since #- and + deviations cancel. More realistic: #criterion <- abs(sum(res$lambda) - sum(lambda.i))/sum(lambda.i) criterion <- sqrt(sum((lambda- lambda.i)^2))/sqrt(sum(lambda.i^2)) if (verbose) { cat("Convergence criterion @ iteration i=",i,": ", criterion,"\n") } #Check whether to stop stop <- criterion < eps | (i>iter.max) #Call hook function stsj <- sts[,j] upperbound(stsj) <- matrix(lambda,ncol=1) hookFun(stsj, ...) } #Done lambda.hat[,j] <- lambda } #Create new object with return put in the lambda slot bp.sts <- as(sts,"stsBP") bp.sts@upperbound <- lambda.hat bp.sts@control <- list(k=k,eps=eps,iter=i) return(bp.sts) } ###################################################################### # EMS back-projection method including bootstrap based confidence # intervals. The theory is indirectly given in Becker and Marschner (1993), # Biometrika, 80(1):165-178 and more specifically in Yip et al, 2011, # Communications in Statistics -- Simulation and Computation, # 37(2):425-433. # # Parameters: # # sts - sts object with the observed incidence as "observed" slot # incu.pmf - incubation time pmf as a vector with index 0,..,d_max. Please # note that the support includes zero! # k - smoothing parameter for the EMS algorithm # eps - relative convergence criteration. If a vector of length two # then the first argument is used for the k=0 initial fit and # the second element for all EMS fits # # iter.max - max number of iterations. Can be a vector of length two. # Similar use as in eps. # verbose - boolean, if TRUE provide extra output when running the method # lambda0 - start value for lambda, default: uniform # hookFun - hook function to call after each EMS step, a function # of type hookFun=function(Y,lambda,...) # B - number of bootstrap replicates. If B=-1 then no bootstrap CIs # are calculated. # # Returns: # sts object with upperbound set to the backprojected lambda. ###################################################################### backprojNP <- function(sts, incu.pmf,control=list(k=2,eps=rep(0.005,2),iter.max=rep(250,2),Tmark=nrow(sts),B=-1,alpha=0.05,verbose=FALSE,lambda0=NULL,eq3a.method=c("R","C"),hookFun=function(stsbp) {}),...) { #Check if backprojection is to be done multivariate time series case. if (ncol(sts)>1) { warning("Multivariate time series: Backprojection uses same eps for the individual time series.") } #Check if incu.pmf vector fits the dimension of the sts object. If not #either replicate it or throw an error. if (is.matrix(incu.pmf)) { if (!ncol(incu.pmf) == ncol(sts)) { stop("Dimensions of sts object and incu.pmf don't match.") } } else { if (ncol(sts)>1) { warning("Backprojection uses same incubation time distribution for the individual time series.") } incu.pmf <- matrix(incu.pmf,ncol=ncol(sts),dimnames=list(NULL,colnames(sts))) } #Fill control object as appropriate and in sync with the default value if (is.null(control[["k",exact=TRUE]])) { control$k <- 2 } if (is.null(control[["eps",exact=TRUE]])) { control$eps <- rep(0.005,2) } if (is.null(control[["iter.max",exact=TRUE]])) { control$iter.max <- rep(250,2) } if (is.null(control[["Tmark",exact=TRUE]])) { control$Tmark <- nrow(sts) } if (is.null(control[["B",exact=TRUE]])) { control$B <- -1 } if (is.null(control[["alpha",exact=TRUE]])) { control$alpha <- 0.05 } if (is.null(control[["verbose",exact=TRUE]])) { control$verbose <- FALSE } if (is.null(control[["lambda0",exact=TRUE]])) { control$lambda0 <- NULL } #Which method to use for computing eq3a if (is.null(control[["eq3a.method",exact=TRUE]])) { control$eq3a.method <- "R" } else { control$eq3a.method <- match.arg(control$eq3a.method,c("R","C")) } #Hook function definition if (is.null(control[["hookFun",exact=TRUE]])) { control$hookFun <- function(Y,lambda,...) {} } #If the eps and iter.max arguments are too short, make them length 2. if (length(control$eps)==1) control$eps <- rep(control$eps,2) if (length(control$iter.max)==1) control$iter.max <- rep(control$iter.max,2) #Compute the estimate to report (i.e. use 2nd component of the args) if (control$verbose) { cat("Back-projecting with k=",control$k," to get lambda estimate.\n") } stsk <- backprojNP.fit(sts, incu.pmf=incu.pmf,k=control$k,eps=control$eps[2],iter.max=control$iter.max[2],verbose=control$verbose,lambda0=control$lambda0,hookFun=control$hookFun,eq3a.method=control$eq3a.method) #Fix control slot stsk@control <- control #If no bootstrap to do return object right away as stsBP object. if (control$B<=0) { if (control$verbose) { cat("No bootstrap CIs calculated as requested.\n") } stsk <- as(stsk,"stsBP") return(stsk) } #Call back-project function without smoothing, i.e. with k=0. if (control$verbose) { cat("Back-projecting with k=",0," to get lambda estimate for parametric bootstrap.\n") } sts0 <- backprojNP.fit(sts, incu.pmf=incu.pmf,k=0,eps=control$eps[1],iter.max=control$iter.max[1],verbose=control$verbose,lambda0=control$lambda0,hookFun=control$hookFun, eq3a.method=control$eq3a.method) ########################################################################### #Create bootstrap samples and loop for each sample while storing the result ########################################################################### sts.boot <- sts0 #Define object to return lambda <- array(NA,dim=c(nrow(sts),ncol(sts),control$B)) #Define PMF of incubation time which does safe handling of values #outside the support of the incubation time. dincu <- function(x,i) { notInSupport <- x<0 | x>=length(incu.pmf[,i]) #Give index -1 to invalid queries x[notInSupport] <- -1 return(c(0,incu.pmf[,i])[x+2]) } #Loop in order to create the sample for (b in 1:control$B) { if (control$verbose) { cat("Bootstrap sample ",b,"/",control$B,"\n") } #Compute convolution for the mean of the observations mu <- matrix(0, nrow=nrow(sts0), ncol=ncol(sts0)) #Perform the convolution for each series for (i in 1:ncol(sts)) { for (t in 1:nrow(mu)) { for (s in 0:(t-1)) { mu[t,i] <- mu[t,i] + upperbound(sts0)[t-s,i] * dincu(s,i) } } } #Create new observations in the observed slot. observed(sts.boot) <- matrix(rpois(prod(dim(sts.boot)),lambda=mu),ncol=ncol(sts0)) #Run the backprojection on the bootstrap sample. Use original result #as starting value. sts.boot <- backprojNP.fit(sts.boot, incu.pmf=incu.pmf,k=control$k,eps=control$eps[2],iter.max=control$iter.max[2],verbose=control$verbose,lambda0=upperbound(stsk),hookFun=control$hookFun, eq3a.method=control$eq3a.method) #Extract the result of the b'th backprojection lambda[,,b] <- upperbound(sts.boot) } #Compute an equal tailed (1-alpha)*100% confidence intervals based on the #bootstrap samples. The dimension is (ci.low,ci.high) x time x series ci <- apply(lambda,MARGIN=c(1,2), quantile, p=c(control$alpha/2,1-control$alpha/2)) #Convert output to stsBP object and add information to the extra slots stsk <- as(stsk,"stsBP") #Add extra slots stsk@ci <- ci stsk@lambda <- lambda stsk@control <- control #Done return(stsk) } surveillance/R/intersectPolyCircle.R0000644000176000001440000000361112237174420017313 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Compute the intersection of a circular domain with a polygonal domain of ### various classes (currently: owin, gpc.poly, or SpatialPolygons) ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ intersectPolyCircle.gpc.poly <- function (object, center, radius, npoly = 32, useGEOS = FALSE, ...) { if (useGEOS) { library("rgeos") # coerce gpc.poly to SpatialPolygons res <- intersectPolyCircle.SpatialPolygons(as(object, "SpatialPolygons"), center, radius, npoly) as(res, "gpc.poly") # also defined in rgeos } else { gpclibCheck() circle <- discpoly(center, radius, npoly = npoly, class = "gpc.poly") gpclib::intersect(circle, object) # this order seems to be faster } } intersectPolyCircle.owin <- function (object, center, radius, npoly = 32, ...) { intersect.owin(disc(radius=radius, centre=center, npoly=npoly), object) } intersectPolyCircle.SpatialPolygons <- function (object, center, radius, npoly = 32, ...) { circle <- discpoly(center, radius, npoly = npoly, class = "Polygon") circleSpP <- SpatialPolygons(list(Polygons(list(circle), "0"))) ## ensure that circleSpP has exactly the same proj4string as 'object' circleSpP@proj4string <- object@proj4string rgeos::gIntersection(circleSpP, object) } surveillance/R/algo_outbreakP.R0000644000176000001440000001222012003566343016257 0ustar ripleyusers################################################### ### chunk number 1: ################################################### ###################################################################### # Workhorse computing the OutbreakP statistic. # Alarm statistic at end time n is returned. # # Author: # Michael Hoehle # # R port of the Java code by Marianne Frisen & Linus Schioler from # the CASE project. See https://smisvn.smi.se/case/ # # For a manual on how to use the method see also # http://www.hgu.gu.se/item.aspx?id=16857 # # Date: # 25 May 2010 # # Parameters: # x -- the series with the counts # # Returns: # value of the alarm statistic at the end of the series x. ###################################################################### calc.outbreakP.statistic <- function(x) { #Length of the monitored series n <- length(x) #Index problem when converting java arrays to R arrays x <- c(0,x) #Initialization (not all parts might be needed) leftl <- numeric(n+1); y <- numeric(n+1); yhat <- numeric(n+1); sumwy <- numeric(n+1); sumwys <- numeric(n+1); sumw <- numeric(n+1); w <- numeric(n+1); meanl <- numeric(n+1); xbar <- 0 meanl[1] = -Inf leftl[1] = 0 for (i in 1:n) { #Initialize yhat[i+1] <- x[i+1]; sumwy[i+1] <- x[i+1]; sumw[i+1] <- 1; meanl[i+1] <- x[i+1]; leftl[i+1] <- i; #Calculate mean xbar=xbar+(x[i+1]-xbar)/i #create plateaus while (meanl[i+1] <= meanl[ (leftl[i+1] - 1) + 1]) { #merge sets sumwy[i+1] = sumwy[i+1] + sumwy[(leftl[i+1] - 1)+1]; sumw[i+1] = sumw[i+1] + sumw[(leftl[i+1] - 1)+1]; meanl[i+1] = sumwy[i+1] / sumw[i+1]; leftl[i+1] = leftl[(leftl[i+1] - 1)+1]; } #calculate yhat for (j in leftl[i+1]:i){ yhat[j+1] = meanl[i+1]; } } alarm.stat <- 1 for (j in 1:n) { #Ensure 0/0 = 1 so we don't get NaNs div <- ifelse(yhat[j+1]==0 & xbar==0, 1, yhat[j+1]/xbar) alarm.stat <- alarm.stat * (div)^x[j+1] } return(alarm.stat) ## logalarm <- 0 ## for (j in 1:n) { ## #Eqn (5) in Frisen et al paper in log form. However: it is undefined ## #what happens if \hat{\mu}^D(t) == 0 (it is a division by zero). ## #We fix 0/0 = 1 ## if (xbar != 0) { ## if (yhat[j+1] != 0) { #if \hat{\mu}^{C1} == 0 then ## logalarm = logalarm + x[j+1] * (log(yhat[j+1]) - log(xbar)) ## } ## } else { ## if (yhat[j+1] != 0) { ## stop("Division by zero in Eqn (5) of Frisen paper!") ## } ## } ## } ## #Done, return the value ## return(exp(logalarm)) } ###################################################################### # The detection function in S3 style ###################################################################### algo.outbreakP <- function(disProgObj, control = list(range = range, k=100, ret=c("cases","value"),maxUpperboundCases=1e5)) { #Set threshold to some fixed value, i.e. 100 if(is.null(control[["k",exact=TRUE]])) control$k <- 100 #Set largest observed value to try as upperbound when numerically searching #for NNBA in case ret = "cases" if(is.null(control[["maxUpperboundCases",exact=TRUE]])) control$maxUpperboundCases <- 1e5 #Which value to return in upperbound? control$ret <- match.arg(control$ret, c("value","cases")) #Initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) observed <- disProgObj$observed #Store results count <- 1 for(i in control$range) { statistic <- calc.outbreakP.statistic( observed[seq_len(i)] ) # store the results in the right order alarm[count] <- statistic > control$k #Find NNBA or just return value of the test statistic (faster) if (control$ret == "cases") { #If length is 1 no alarm can be given unless k<1 if (i<=1) { upperbound[count] <- ifelse(control$k>=1, NA, 0) } else { #Go up or down delta <- ifelse(alarm[count], -1, 1) #Initialize observedi <- observed[i] foundNNBA <- FALSE #Loop with modified last observation until alarm is caused (dx=1) #or until NO alarm is caused anymore (dx=-1) while ( ((delta == -1 & observedi > 0) | (delta == 1 & observedi < 1e5)) & (!foundNNBA)) { observedi <- observedi + delta newObserved <- c(observed[seq_len(i-1)],observedi) statistic <- calc.outbreakP.statistic( newObserved ) foundNNBA <- (statistic > control$k) == ifelse(alarm[count],FALSE,TRUE) } upperbound[count] <- ifelse( foundNNBA, observedi + ifelse(alarm[count],1,0), NA) } } else { upperbound[count] <- statistic } #Advance time index count <- count + 1 } #Add name and data name to control object. control$name <- paste("outbreakP(",control$k,")",sep="") control$data <- paste(deparse(substitute(disProgObj))) # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj, control=control) class(result) = "survRes" # for surveillance system result return(result) } surveillance/R/misc_dataProcessing.R0000644000176000001440000001111012113474335017300 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # 'readData' to reads the data of a specified disease of several years # and generates a state chain using the bulletin knowledge # # Parameter: # abb : abbreviation of the disease # week53to52: Boolean indicating whether to convert RKI 53 Weeks System to 52 weeks a year readData <- function(abb,week53to52=TRUE,sysPath=TRUE){ #Read depending on which path is requested if (sysPath) { #Prepend the systempath/data to the filename #hoehle 2012-07-24 - this does not work when package is not #installed. Use extdata as recommended in the file package structure. file <- file.path(path.package('surveillance'),'extdata',paste(abb,".txt",sep="")) } else { file <- file.path(paste(abb,".txt",sep="")) } # read the data from four years and write it to a table #file <- paste( dataPath, abb , ".txt" , sep="" ) fileTable <- read.table( file=file, header=TRUE ) observed <- fileTable$observed state <- fileTable$state result = list(observed=observed, state=state) class(result) = "disProg" # for disease progress #Convert to 52 week system... if (week53to52) { result <- correct53to52(result) } result$freq <- 52 result$start <- c(2001,1) return(result) } ################################################### ### chunk number 2: ################################################### toFileDisProg <- function(disProgObj, toFile){ length <- length(disProgObj$observed) writeMatrix <- matrix(0, length, 3) dimnames(writeMatrix) <- list(c(), c("week", "observed", "state")) writeMatrix[,"week"] <- 1:length writeMatrix[,"observed"] <- disProgObj$observed writeMatrix[,"state"] <- disProgObj$state write.table(writeMatrix, toFile, row.names = FALSE, sep = "\t") } ################################################### ### chunk number 3: ################################################### # 'correct53to52' sums up and cuts a value from a splited last and first week of a year # # Parameter: # disProgObj - object of class disProgObj (including the observed and the state chain) # firstweek: the number in observed of the first week in a year, default = 1 # ouput: # disProgObj: the new disProgObj correct53to52 <- function(disProgObj, firstweek = 1){ if(firstweek > length(disProgObj$observed)){ stop("firstweek doesn't exist") } observed <- disProgObj$observed state <- disProgObj$state if(length(state) != length(observed)){ stop("state and observed don't have the same length") } # do not cut, if observed is too short length = length(observed[firstweek:length(observed)]) if(length > 53){ lastyear <- floor((length-1)/53) # sum case numbers of double weeks up for(i in 1:lastyear){ # last week of year i (-i+1 because the array now is shorter) last <- firstweek + i * 52 # first week in year i+1 firstnew <- last + 1 observed[firstnew] <- observed[last] + observed[firstnew] # delete double weeks observed <- observed[-c(last)] # with state state[firstnew] <- state[last] + state[firstnew] # delete double weeks state <- state[-c(last)] } } # correct also the first week, if it doesn't is the beginning if(firstweek > 1){ observed[firstweek] <- observed[firstweek] + observed[firstweek-1] observed <- observed[-c(firstweek-1)] state[firstweek] <- state[firstweek] + state[firstweek-1] state <- state[-c(firstweek-1)] } # correct all 2 to 1 state[state==2] <- 1 disProgObj$observed <- observed disProgObj$state <- state return(disProgObj) } ################################################### ### chunk number 4: ################################################### enlargeData <- function(disProgObj, range = 1:156, times = 1){ # enlarge observed disProgObj$observed <- c(rep(disProgObj$observed[range], times), disProgObj$observed) # enlarge state disProgObj$state <- c(rep(disProgObj$state[range], times), disProgObj$state) return(disProgObj) } surveillance/R/hhh4_oneStepAhead.R0000644000176000001440000001021312166543503016577 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Compute one-step-ahead predictions (means) at a series of time points ### ### Copyright (C) 2011-2013 Michaela Paul and Sebastian Meyer ### $Revision: 594 $ ### $Date: 2013-07-08 16:05:55 +0200 (Mon, 08 Jul 2013) $ ################################################################################ oneStepAhead <- function(result, # ah4-object (i.e. a hhh4 model fit) tp, # scalar: one-step-ahead predictions for time # points (tp+1):nrow(stsObj), or tp=c(from, to) which.start = c("current", "final", "none"), keep.estimates = FALSE, verbose = TRUE) # verbose-1 is used as verbose setting # for sequentially refitted hhh4 models { stopifnot(inherits(result, "ah4")) which.start <- match.arg(which.start) refit <- which.start != "none" use.current <- which.start == "current" ## i.e., use fitted parameters from previous time point as initial values startfinal <- ah4coef2start(result) ## get model terms model <- result[["terms"]] if (is.null(model)) model <- result$terms <- with(result, interpretControl(control, stsObj)) nTime <- model$nTime nUnits <- model$nUnits ## check that tp is within the time period of the data stopifnot(tp %in% seq_len(nTime-1L), length(tp) %in% 1:2) if (length(tp) == 1) tp <- c(tp, nTime-1) # historical default tps <- tp[1]:tp[2] ntps <- length(tps) observed <- model$response[tps+1,,drop=FALSE] rownames(observed) <- tps+1 ## adjust verbosity for model refitting result$control$verbose <- verbose - (ntps>1) ## initialize result pred <- matrix(NA_real_, nrow=ntps, ncol=nUnits, dimnames=list(tps, colnames(observed))) psi <- if (model$nOverdisp > 0) { psiNames <- grep("overdisp", names(model$initialTheta), value=TRUE) matrix(NA_real_, nrow=ntps, ncol=model$nOverdisp, dimnames=list(tps, psiNames)) } else NULL if (keep.estimates) { coefficients <- matrix(NA_real_, nrow=ntps, ncol=length(model$initialTheta), dimnames=list(tps, names(model$initialTheta))) Sigma.orig <- matrix(NA_real_, nrow=ntps, ncol=model$nSigma, dimnames=list(tps, names(result$Sigma.orig))) logliks <- matrix(NA_real_, nrow=ntps, ncol=2L, dimnames=list(tps, c("loglikelihood", "margll"))) } else { coefficients <- Sigma.orig <- logliks <- NULL } ## sequential one-step ahead predictions fit <- result for(i in seq_along(tps)) { if (verbose) cat(tps[i], "\n") if (refit) { fit.old <- fit fit <- update.ah4(result, subset.upper=tps[i], start=if (use.current) ah4coef2start(fit.old) else startfinal, keep.terms=TRUE) # need "model" -> $terms } if (fit$convergence) { coefs <- coef(fit, reparamPsi=FALSE) pred[i,] <- meanHHH(coefs, fit$terms, subset=tps[i]+1, total.only=TRUE) if (model$nOverdisp > 0) psi[i,] <- coefs[psiNames] if (keep.estimates) { coefficients[i,] <- coefs Sigma.orig[i,] <- getSdCorr(fit) logliks[i,] <- c(fit$loglikelihood, fit$margll) } } else { # do a grid search ? if (verbose) cat("-> NO convergence at time point", tps[i], "\n") if (refit) fit <- fit.old } } list(pred=pred, psi=psi, observed=observed, allConverged=all(!is.na(pred)), coefficients=coefficients, Sigma.orig=Sigma.orig, logliks=logliks) } surveillance/R/LRCUSUM.runlength.R0000644000176000001440000001277311731650466016504 0ustar ripleyusers###################################################################### # Compute log likelihood ratio for a univariate or multivariate # categorical distribution # # Params: # outcomes - a data frame with all possible configuration for the (c-1) # variables not being the reference category. # mu - expectation under which LLR under pi is computed # mu0 - null model. A vector of length (k-1) # mu1 - alternative model. A vector of length (k-1) ###################################################################### LLR.fun <- function(outcomes, mu, mu0, mu1, dfun, ...) { #Compute likelihood ratios. Both univariate and the multivariate #values are computed llr.res <- t(apply(outcomes,1, function(y) { llr <- dfun(y, mu=mu1, log=TRUE,...) - dfun(y, mu=mu0, log=TRUE, ...) p <- dfun(y, mu=mu, ...) return(c(llr=llr,p=p)) })) res <- cbind(outcomes,llr.res) colnames(res) <- c(paste("y",1:ncol(outcomes),sep=""),"llr","p") return(res) } ###################################################################### # Function to compute all possible outcomes for the categorical time # series. This is needed for the LLR computations # # Parameters: # km1 - Dimension of the problem (k-1) # n - number of items arranged (i.e. number of experiments). Integer # # Returns: # matrix of size (number of configs) \times km1 # containing all possible states ###################################################################### outcomeFunStandard <- function(k,n) { #Compute all possible likelihood ratios and their probability under mu #Note: Currently all states are investigated. This might be way too #much work as defacto many states have an occurence prob near 0!! args <- list() ; for (j in seq_len(k)) args[[j]] <- 0:n outcomes <- as.matrix(do.call("expand.grid", args)) #Take only valid outcomes (might reduce drastically the number of cells) if (!is.null(n)) { outcomes <- outcomes[apply(outcomes,1,sum) <= n,,drop=FALSE] } return(outcomes) } ###################################################################### # Compute run length for CUSUM based on Markov representation of the # Likelihood ratio based CUSUM # # Parameters: # mu - (k-1 \times T) matrix with true proportions, i.e. equal to mu0 or mu1 if one wants to compute e.g. ARL_0 or ARL_1 # mu0 - (k-1 \times T) matrix with in-control proportions # mu1 - (k-1 \times T) matrix with out-of-control proportion # n - vector of length T containing the total number of experiments for each time point # h- The threshold h which is used for the CUSUM # g - The number of levels to cut the state space into, i.e. M on foil 12 ###################################################################### LRCUSUM.runlength <- function(mu,mu0,mu1,h,dfun, n, g=5,outcomeFun=NULL,...) { #Semantic checks if ( ((ncol(mu) != ncol(mu0)) | (ncol(mu0) != ncol(mu1))) | ((nrow(mu) != nrow(mu0)) | (nrow(mu0) != nrow(mu1)))) { stop("Error: dimensions of mu, mu0 and mu1 have to match") } if (missing(h)) { stop("No threshold specified!") } #If no specific way for computing the outcomes is given #use the standard way. if (is.null(outcomeFun)) { outcomeFun <- outcomeFunStandard } #Discretize number of possible states of the CUSUM S <- c(-Inf,seq(0,h,length=g)) names <- c(levels(cut(1,S,right=TRUE)),">=h") #Time variable t <- 1:ncol(mu) #Dimension of the problem (k-1) km1 <- nrow(mu) #Create transition matrix for CUSUM control chart P <- array(0, dim=c(length(t),g+1,g+1),dimnames=list(t,names,names)) #Once in the absorbing state stay there! P[,g+1,g+1] <- 1 #Loop over all P[t,,] and compute probabilities for (i in seq_len(length(t))) { cat("Looking at t=",i," out of ",length(t),"\n") #Determine all possible outcomes outcomes <- outcomeFun(km1,n[i]) #Compute all possible likelihood ratios and their probability under mu llr <- LLR.fun(outcomes,mu=mu0[,i],mu0=mu0[,i],mu1=mu1[,i],dfun=dfun,size=n[i],...) #Exact CDF of the LLR for this time F <- stepfun(sort(llr[,"llr"]),c(0,cumsum(llr[order(llr[,"llr"]),"p"]))) #Compute probability going from c <= S_{t-1} < d to a <= S_{t} < b for (j in 1:g) { #from index for (k in 1:g) { #to index a <- S[k] ; b <- S[k+1] ; c <- S[j] ; d <- S[j+1] ; m <- (c+d)/2 #From zero to new state if (j == 1) { P[i,j,k] <- F(b) - F(a) } else { #Rieman integral assuming as in Brook & Evans (1972) that S at midpoint #P[i,j,k] <- F(b-m) - F(a-m) #Slightly better approximation by Hawkins (1992), which uses Simpson's rule P[i,j,k] <- (F(b-c) + 4*F(b-m) + F(b-d) - F(a-c) - 4*F(a-m) - F(a-d))/6 } } } #Whatever is missing goes to >h category (take care of rounding errors) P[i,-(g+1),(g+1)] <- pmax(0,1-apply(P[i,-(g+1),-(g+1)],1,sum)) } #Use matrix to compute RL distribution Ppower <- P[1,,] alarmUntilTime <- numeric(ncol(mu0)) alarmUntilTime[1] <- Ppower[1,ncol(P)] for (time in t[-1]) { #from 2 to length of t Ppower <- Ppower %*% P[time,,] alarmUntilTime[time] <- Ppower[1,ncol(P)] } pRL <- c(alarmUntilTime[1],diff(alarmUntilTime)) mom <- NA #If the Markov chain is homogenous then compute ARL by inverting if (length(t) == 1) { R <- P[,1:g,1:g] I <- diag(rep(1,g)) mom <- solve(I-R) %*% matrix(1,g,1) #-- no sparse computing #Alternative using sparse #mom <- solve(Matrix(id-r)) %*% matrix(1,mw,1) } return(list(P=P,pmf=pRL,cdf=alarmUntilTime,arl=mom[1])) } surveillance/R/pairedbinCUSUM.R0000644000176000001440000002213012236775520016103 0ustar ripleyusers###################################################################### # Compute ARL for paired binary CUSUM charts as introducted in Steiner, # Cook and Farefwell, 1999, Monitoring paired binary surgical outcomes, # Stats in Med, 18, 69-86. # # This code is an R implementation of Matlab code provided by # Stefan H. Steiner, University of Waterloo, Canada. # # Params: # p - vector giving the probability of the four different possibilities # c((death=0,near-miss=0),(death=1,near-miss=0), # (death=0,near-miss=1),(death=1,near-miss=1)) # w1, w2 - w1 and w2 are the sample weights vectors for the two CUSUMs. # (see (2)). We have w1 is equal to deaths # (according to paper it being 2 would be more realistic) # h1, h2 - decision barriers for the individual cusums (see (3)) # h11,h22 - joint decision barriers (see (3)) # sparse - use Matrix package ###################################################################### pairedbinCUSUM.runlength <- function(p,w1,w2,h1,h2,h11,h22, sparse=FALSE) { #Size of the sparse matrix -- assumption h1>h11 and h2>h22 mw <- h1*h22+(h2-h22)*h11; cat("g = ",mw+3,"\n") #build transition matrix; look at current state as an ordered pair (x1,x2) #the size of the matrix is determined by h1, h2, and h11 and h22 #Look at all 3 possible absorbing conditions transm <- matrix(0, mw+3, mw+3) #the last row/column is the absorbing state, I_{3\times 3} block #Is this ever used?? transm[mw+1,mw+1] <- 1 transm[mw+2,mw+2] <- 1 transm[mw+3,mw+3] <- 1 #go over each row and fill in the transition probabilities for (i in 1:mw) { # cat(i," out of ", mw,"\n") #find the corresponding state if (i>h1*h22) { temp <- floor((i-h1*h22-1)/h11) x1 <- i-h1*h22-1-temp*h11 x2 <- temp+h22 } else { x2 <- floor((i-1)/h1); x1 <- i-x2*h1-1; } #go over the four different weight combinations for (j in 1:2) { for (k in 1:2) { x1n <- x1+w1[j+2*(k-1)] #death chart x2n <- x2+w2[k] #look at all possible combinations of weights #we cant go below zero if (x1n<0) { x1n <- 0 } if (x2n<0) { x2n <- 0 } newcond=0; #try to figure out what condition index the new CUSUM values correspond to if (x1n>=h1) { newcond <- mw+1; #absorbing state on x1 } else { if (x2n>=h2) { newcond <- mw+2 #absorbing state on x2 } else { if ((x1n>=h11)&(x2n>=h22)) { #only register this if other two conditions are not satisfied newcond <- mw+3 } } } if (newcond==0) { #transition is not to an absorbing state #translate legal ordered pair to state number if (x2n h1, S[t+1,2] > h2) if ((S[t+1,1] > h11) & (S[t+1,2] > h22)) { alarm <- c(TRUE,TRUE) } # alarm <- (S[t+1,1] > h1) | (S[t+1,2] > h2) | # ((S[t+1,1] > h11) & (S[t+1,2] > h22)) #If one or both of the CUSUMs produced an alarm then stop if ((sum(alarm)>0) | (t==nrow(x))) { stopped <- TRUE} } return(list(N=t,val=S[-1,],alarm=alarm)) } ###################################################################### # STS wrapper for the Paired binary CUSUM method. This follows in # style the categoricalCUSUM method. ###################################################################### pairedbinCUSUM <- function(stsObj, control = list(range=NULL,theta0,theta1,h1,h2,h11,h22)) { # Set the default values if not yet set if(is.null(control[["range",exact=TRUE]])) { control$range <- 1:nrow(observed(stsObj)) } if(is.null(control[["theta0",exact=TRUE]])) { stop("Error: No specification of in-control parameters theta0!") } if(is.null(control[["theta1",exact=TRUE]])) { stop("Error: No specification of out-of-control parameters theta1!") } if(is.null(control[["h1",exact=TRUE]])) { stop("Error: No specification of primary threshold h1 for first series.") } if(is.null(control[["h2",exact=TRUE]])) { stop("Error: No specification of primary threshold h2 for 2nd series.") } if(is.null(control[["h11",exact=TRUE]])) { stop("Error: No specification of secondary limit h11 for 1st series.") } if(is.null(control[["h22",exact=TRUE]])) { stop("Error: No specification of secondary limit h11 for 2nd series.") } #Extract the important parts from the arguments range <- control$range y <- stsObj@observed[range,,drop=FALSE] theta0 <- control[["theta0",exact=TRUE]] theta1 <- control[["theta1",exact=TRUE]] h1 <- control[["h1",exact=TRUE]] h2 <- control[["h2",exact=TRUE]] h11 <- control[["h11",exact=TRUE]] h22 <- control[["h22",exact=TRUE]] #Semantic checks. if (ncol(y) != 2) { stop("Error: The number of columns in the sts object needs to be two.") } #Reserve space for the results. Contrary to the categorical CUSUM #method, each ROW represents a series. alarm <- matrix(data = 0, nrow = length(range), ncol = ncol(y)) upperbound <- matrix(data = 0, nrow = length(range), ncol = ncol(y)) #Setup counters for the progress doneidx <- 0 N <- 1 noofalarms <- 0 noOfTimePoints <- length(range) ####################################################### #Loop as long as we are not through the entire sequence ####################################################### while (doneidx < noOfTimePoints) { #Run paired binary CUSUM until the next alarm res <- pairedbinCUSUM.LLRcompute(x=y, theta0=theta0, theta1=theta1, h1=h1, h2=h2, h11=h11, h22=h22) #In case an alarm found log this and reset the chart at res$N+1 if (res$N < nrow(y)) { #Put appropriate value in upperbound upperbound[1:res$N + doneidx,] <- res$val[1:res$N,] alarm[res$N + doneidx,] <- res$alarm #Chop & get ready for next round y <- y[-(1:res$N),,drop=FALSE] # theta0 <- pi0[,-(1:res$N),drop=FALSE] # theta1 <- pi1[,-(1:res$N),drop=FALSE] # n <- n[-(1:res$N)] #Add to the number of alarms noofalarms <- noofalarms + 1 } doneidx <- doneidx + res$N } #Add upperbound-statistic of last segment, where no alarm is reached upperbound[(doneidx-res$N+1):nrow(upperbound),] <- res$val # Add name and data name to control object control$name <- "pairedbinCUSUM" control$data <- NULL #not supported anymore #New direct calculations on the sts object stsObj@observed <- stsObj@observed[control$range,,drop=FALSE] stsObj@state <- stsObj@state[control$range,,drop=FALSE] stsObj@populationFrac <- stsObj@populationFrac[control$range,,drop=FALSE] stsObj@alarm <- alarm stsObj@upperbound <- upperbound #Fix the corresponding start entry start <- stsObj@start new.sampleNo <- start[2] + min(control$range) - 1 start.year <- start[1] + (new.sampleNo - 1) %/% stsObj@freq start.sampleNo <- (new.sampleNo - 1) %% stsObj@freq + 1 stsObj@start <- c(start.year,start.sampleNo) #Done return(stsObj) } surveillance/R/graphs.R0000644000176000001440000000652012237174420014613 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Functions concerning graphs: neighbourhood order, adjacency matrix ### These are wrappers around functionality from package "spdep" by Roger Bivand ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### Determine the matrix of neighbourhood orders ### given the binary matrix of first-order neighbours. ### Working horse: spdep::nblag() nbOrder <- function (neighbourhood, maxlag = 1) { if (!requireNamespace("spdep")) stop("package ", dQuote("spdep"), " is required to determine neighbourhood orders") stopifnot(isScalar(maxlag), maxlag > 0) checkNeighbourhood(neighbourhood) neighbourhood <- neighbourhood == 1 # convert to binary matrix nregions <- nrow(neighbourhood) maxlag <- as.integer(min(maxlag, nregions-1)) # upper bound of nb order if (maxlag == 1L) { storage.mode(neighbourhood) <- "integer" return(neighbourhood) } ## manually convert to spdep's "nb" class ## region.idxs <- seq_len(nregions) ## nb <- lapply(region.idxs, function(i) { ## nbs <- which(neighbourhood[i,]) ## if (length(nbs) > 0L) nbs else 0L ## }) ## class(nb) <- "nb" ## convert first-order neighbourhood to spdep's "nb" class nb <- spdep::mat2listw(neighbourhood)$neighbours attr(nb, "region.id") <- NULL ## compute higher order neighbours using spdep::nblag() nb.lags <- spdep::nblag(nb, maxlag=maxlag) ## Side note: fast method to determine neighbours _up to_ specific order: ## crossprod(neighbourhood) > 0 # up to second order neighbours (+set diag to 0) ## (neighbourhood %*% neighbourhood %*% neighbourhood) > 0 # up to order 3 ## and so on... ## convert to a single matrix nbmat <- neighbourhood # logical first-order matrix storage.mode(nbmat) <- "numeric" for (lag in 2:maxlag) { if (any(spdep::card(nb.lags[[lag]]) > 0L)) { # any neighbours of this order nbmat.lag <- spdep::nb2mat(nb.lags[[lag]], style="B", zero.policy=TRUE) nbmat <- nbmat + lag * nbmat.lag } } attr(nbmat, "call") <- NULL storage.mode(nbmat) <- "integer" ## message about maximum neighbour order by region maxlagbyrow <- apply(nbmat, 1, max) message("Note: range of maximum neighbour order by region is ", paste(range(maxlagbyrow), collapse="-")) ## Done nbmat } ### Derive adjacency structure from a SpatialPolygons object ### Working horse: spdep::poly2nb poly2adjmat <- function (SpP, ..., zero.policy = TRUE) { if (!requireNamespace("spdep")) stop("package ", dQuote("spdep"), " is required to derive adjacencies from SpatialPolygons") nb <- spdep::poly2nb(SpP, ...) adjmat <- spdep::nb2mat(nb, style="B", zero.policy=zero.policy) attr(adjmat, "call") <- NULL colnames(adjmat) <- rownames(adjmat) adjmat } surveillance/R/hhh4.R0000644000176000001440000023254212242506234014165 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### hhh4 is an extended version of algo.hhh for the sts-class ### The function allows the incorporation of random effects and covariates. ### ### Copyright (C) 2010-2013 Michaela Paul and Sebastian Meyer ### $Revision: 671 $ ### $Date: 2013-11-18 22:54:36 +0100 (Mon, 18 Nov 2013) $ ################################################################################ # - some function arguments are currently not used (but will eventually) # - formula formulation is experimental and not yet implemented in full generality # - do some profiling... ## Error message issued in loglik, score and fisher functions upon NA parameters ADVICEONERROR <- "\n Try different starting values, more iterations, or another optimizer.\n" ### Default control argument for hhh4 ### This argument list is also set as the formal 'control' argument of hhh4() ### below the definition of hhh4 CONTROL.hhh4 <- alist( ar = list(f = ~ -1, # a formula " exp(x'lamba)*y_t-1 " # (ToDo: or a matrix " Lambda %*% y_t-1 ") lag = 1, # autoregression on y_i,t-lag (currently unused) weights = NULL, # for a contact matrix model (currently unused) initial = NULL # initial parameters values if pred is a matrix # or if pred = ~1 (not really used ATM) ), ne = list(f = ~ -1, # a formula "exp(x'phi) * sum_j w_ji * y_j,t-lag" lag = 1, # regression on y_j,t-lag (currently unused) weights = neighbourhood(stsObj), # weights w_ji initial = NULL # initial parameter values if pred = ~1 (not really used ATM) ), end = list(f = ~ 1, # a formula " exp(x'nu) * n_it " offset = 1, # optional offset e_it initial = NULL # initial parameter values if pred = ~1 (not really used ATM) ), family = c("Poisson", "NegBin1", "NegBinM"), subset = 2:nrow(stsObj), # typically 2:nTime if model contains lags optimizer = list(stop = list(tol=1e-5, niter=100), # control arguments regression = list(method="nlminb"), # for optimization variance = list(method="nlminb")), verbose = FALSE, # level of reporting during hhh4() processing start = list(fixed=NULL,random=NULL,sd.corr=NULL), # list with initials, # overrides any initial values in formulas data = data.frame(t=epoch(stsObj)-1), # data.frame or named list with # covariates that appear in any of the formulae keep.terms = FALSE ) ### Main function, which is to be called by the user hhh4 <- function (stsObj, control, check.analyticals = FALSE) { ## Convert old disProg class to new sts class if(inherits(stsObj, "disProg")) stsObj <- disProg2sts(stsObj) ## check control and set default values (for missing arguments) control <- setControl(control, stsObj) #* if univariate, no neighbouring term #* check nhood matrix ## get model terms model <- interpretControl(control, stsObj) dimFixedEffects <- model$nFE + model$nd + model$nOverdisp dimRandomEffects <- model$nRE ## starting values #* -> better default values possible theta.start <- model$initialTheta Sigma.start <- model$initialSigma ## check if initial values are valid ## CAVE: there might be NA's in mu if there are missing values in Y mu <- meanHHH(theta.start, model, total.only=TRUE) if(any(mu==0, na.rm=TRUE) || any(is.infinite(mu))) stop("some mean is degenerate (0 or Inf) at initial values") ## check score vector and fisher information at starting values check.analyticals <- if (isTRUE(check.analyticals)) { if (length(theta.start) > 50) "maxLik" else "numDeriv" } else if (is.character(check.analyticals)) { match.arg(check.analyticals, c("numDeriv", "maxLik"), several.ok=TRUE) } else NULL if (length(check.analyticals) > 0L) { resCheck <- checkAnalyticals(model, theta.start, Sigma.start, methods=check.analyticals) return(resCheck) } ## maximize loglikelihood (penalized and marginal) myoptim <- fitHHH(theta=theta.start,sd.corr=Sigma.start, model=model, cntrl.stop = control$optimizer$stop, cntrl.regression = control$optimizer$regression, cntrl.variance = control$optimizer$variance, verbose=control$verbose) convergence <- myoptim$convergence == 0 thetahat <- c(myoptim$fixef, myoptim$ranef) loglik <- myoptim$loglik fisher <- myoptim$fisher cov <- try(solve(fisher), silent=TRUE) # approximation to inverted fisher info ## check for degenerate fisher info if(inherits(cov, "try-error")){ # fisher info is singular cat("Fisher info singular!\n") convergence <- FALSE } else if(any(!is.finite(diag(cov))) || any(diag(cov)<0)){ cat("Infinite or negative cov!\n") convergence <- FALSE } if (!convergence) { cat("Penalized loglikelihood =", loglik, "\n") thetastring <- paste(round(thetahat,2), collapse=", ") thetastring <- strwrap(thetastring, exdent=10, prefix="\n", initial="") cat("theta = (", thetastring, ")\n") cat("WARNING: Results are not reliable!", ADVICEONERROR) res <- myoptim res$convergence <- convergence res$call <- match.call() class(res) <- "ah4" return(res) } ## optimization successful, return a full "ah4" object fitted <- meanHHH(thetahat, model, total.only=TRUE) if(dimRandomEffects>0){ Sigma.orig <- myoptim$sd.corr Sigma.cov <- solve(myoptim$fisherVar) dimnames(Sigma.cov) <- list(names(Sigma.orig),names(Sigma.orig)) } else { Sigma.orig <- Sigma.cov <- NULL } se <- sqrt(diag(cov)) margll <- marLogLik(Sigma.orig, thetahat, model) Sigma.trans <- getSigmai(head(Sigma.orig,model$nVar), tail(Sigma.orig,model$nCorr), model$nVar) ## Done result <- list(coefficients=thetahat, se=se, cov=cov, Sigma=Sigma.trans, # estimated covariance matrix of ri's Sigma.orig=Sigma.orig, # variance parameters on original scale Sigma.cov=Sigma.cov, # covariance matrix of Sigma.orig call=match.call(), dim=c(fixed=dimFixedEffects,random=dimRandomEffects), loglikelihood=loglik, margll=margll, convergence=convergence, fitted.values=fitted, control=control, terms=if(control$keep.terms) model else NULL, stsObj=stsObj, # FIXME: stsObj also in 'control$data' lag=1, nObs=sum(!model$isNA[control$subset,]), nTime=length(model$subset), nUnit=ncol(stsObj)) ## FIXME: nTime has a different meaning here than everywhere else!!! class(result) <- "ah4" result } ## Store default control arguments in the formal argument list of hhh4 formals(hhh4)[["control"]] <- as.pairlist(CONTROL.hhh4) ## set default values for model specifications in control setControl <- function (control, stsObj) { stopifnot(is.list(control)) nTime <- nrow(stsObj) nUnits <- ncol(stsObj) if(nTime <= 2) stop("too few observations") ## arguments in 'control' override any corresponding default arguments defaultControl <- lapply(CONTROL.hhh4, eval, envir=environment()) environment(defaultControl$ar$f) <- environment(defaultControl$ne$f) <- environment(defaultControl$end$f) <- .GlobalEnv defaultControl$data <- as.list(defaultControl$data) # since we will add stsObj ##<- NROW(stsObj) only works as intended since R 2.15.0, but this is required ## for adding stsObj to a data.frame; thus we switch to a list control <- modifyList(defaultControl, control) ## add stsObj (maybe overwrite an old one from the control object) control$data$.sts <- stsObj ## add nTime and nUnits to control list control$nTime <- nTime # FIXME: are these actually control$nUnits <- nUnits # used anywhere? ## check that component specifications are list objects for (comp in c("ar", "ne", "end")) { if(!is.list(control[[comp]])) stop("'control$", comp, "' must be a list") } ## check lags in "ar" and "ne" components for (comp in c("ar", "ne")) { if (!isScalar(control[[comp]]$lag)) stop("'control$", comp, "$lag' must be scalar") control[[comp]]$lag <- as.integer(control[[comp]]$lag) if (control[[comp]]$lag != 1L) stop("currently, only 'control$", comp, "$lag=1' is supported") } ### check AutoRegressive component control$ar$isMatrix <- is.matrix(control$ar$f) if (is.matrix(control$ar$f)) { if (any(dim(control$ar$f) != nUnits)) stop("'control$ar$f' must be a square matrix of size ", nUnits) # use identity matrix if weight matrix is missing if (is.null(control$ar$weights)) control$ar$weights <- diag(nrow=nUnits) control$ar$inModel <- TRUE } else if (inherits(control$ar$f, "formula")) { if (!is.null(control$ar$weights)) { warning("argument 'control$ar$weights' is not used") control$ar$weights <- NULL } # check if formula is valid control$ar$inModel <- isInModel(control$ar$f) } else { stop("'control$ar$f' must be either a formula or a matrix") } if (is.matrix(control$ar$weights)) { if (any(dim(control$ar$weights) != nUnits)) stop("'control$ar$weights' must be a square matrix of size ", nUnits) } ### check NEighbourhood component if (!inherits(control$ne$f, "formula")) stop("'control$ne$f' must be a formula") control$ne$inModel <- isInModel(control$ne$f) if (control$ne$inModel) { ## if ar$f is a matrix it includes neighbouring units => no "ne" component if (control$ar$isMatrix) stop("there must not be an extra \"ne\" component ", "if 'control$ar$f' is a matrix") ## check ne$weights specification checkWeights(control$ne$weights, nUnits, nTime, neighbourhood(stsObj), control$data) } else control$ne$weights <- NULL ### check ENDemic component if (!inherits(control$end$f, "formula")) stop("'control$end$f' must be a formula") control$end$inModel <- isInModel(control$end$f) if (is.matrix(control$end$offset) && is.numeric(control$end$offset)){ if (!identical(dim(control$end$offset), dim(stsObj))) stop("'control$end$offset' must be a numeric matrix of size ", nTime, "x", nUnits) if (any(is.na(control$end$offset))) stop("'control$end$offset' must not contain NA values") } else if (!identical(as.numeric(control$end$offset), 1)) { stop("'control$end$offset' must either be 1 or a numeric ", nTime, "x", nUnits, " matrix") } ### check remaining components of the control list control$family <- match.arg(control$family, defaultControl$family) if (!is.vector(control$subset, mode="numeric") || !all(control$subset %in% seq_len(nTime))) stop("'control$subset' must be %in% 1:", nTime) if (!is.list(control$optimizer) || any(! sapply(c("stop", "regression", "variance"), function(x) is.list(control$optimizer[[x]])))) stop("'control$optimizer' must be a list of lists") if (!length(control$verbose) == 1L || (!is.logical(control$verbose) && !is.numeric(control$verbose))) stop("'control$verbose' must be a numeric or logical value") control$verbose <- as.integer(control$verbose) if (!is.list(control$start) || any(! sapply(c("fixed", "random", "sd.corr"), function(x) is.null(control$start[[x]]) || is.numeric(control$start[[x]])))) stop("'control$start' must be a list of numeric start values") stopifnot(length(control$keep.terms) == 1L, is.logical(control$keep.terms)) ## Done return(control) } # check whether or not one of the three components is included in the model isInModel <- function(formula, name=deparse(substitute(formula))){ term <- terms.formula(formula) if(attr(term,"response") == 1) stop(name," cannot contain a response variable\n") if(attr(term,"intercept") == 1) { inModel <- TRUE } else { # first element is always a list inModel <- ifelse(length(attr(term, "variables")) > 1, TRUE, FALSE) } return(inModel) } # used to incorporate covariates and unit-specific effects fe <- function(x, # covariate which=NULL, # Null= overall, vector with booleans = unit-specific initial=NULL # vector of inital values for parameters ){ sts <- get("env",parent.frame(1))$.sts nTime <- nrow(sts) nUnits <- ncol(sts) if(!is.numeric(x)){ stop("Covariate \'",deparse(substitute(x)),"\' is not numeric\n") } lengthX <- length(x) if(lengthX == 1){ terms <- matrix(x, nTime, nUnits, byrow=FALSE) mult <- "*" } else if(lengthX == nTime){ terms <- matrix(x, nTime, nUnits, byrow=FALSE) mult <- "*" } else if(lengthX == nTime*nUnits){ if(!is.matrix(x)){ stop("Covariate \'",deparse(substitute(x)),"\' is not a matrix\n") } # check dimensions of covariate if((ncol(x) != nUnits) | (nrow(x) != nTime)){ stop("Dimension of covariate \'",deparse(substitute(x)),"\' is not suitably specified\n") } terms <- x mult <- "*" } else { stop("Covariate \'",deparse(substitute(x)),"\' is not suitably specified\n") } intercept <- all(terms==1) # overall or unit-specific effect? unitSpecific <- !is.null(which) # check argument which if(unitSpecific && (!is.vector(which) | (length(which) != nUnits) | !is.logical(which))){ stop("argument which = \'",deparse(substitute(which)), "\' is not correct\n") } if(unitSpecific){ terms[,!which] <- 0 } # get dimension of parameter dim.fe <- ifelse(unitSpecific, sum(which), 1) #* check length of initial values + set default values? if(!is.null(initial) & length(initial) !=dim.fe){ stop("Initial values for \'",deparse(substitute(x)),"\' must be of length ",dim.fe,"\n") } else if(is.null(initial)){ initial <- rep.int(0,dim.fe) } summ <- ifelse(unitSpecific,"colSums","sum") name <- deparse(substitute(x)) if(unitSpecific) name <- paste(name, colnames(sts)[which], sep=".") result <- list(terms=terms, name=name, Z.intercept=NULL, which=which, dim.fe=dim.fe, initial.fe=initial, dim.re=0, dim.var=0, initial.var=NULL, initial.re=NULL, intercept=intercept, unitSpecific=unitSpecific, random=FALSE, corr=FALSE, summ=summ, mult=mult ) return(result) } # random intercepts ri <- function(type=c("iid","car")[1], corr=c("none","all")[1], initial.var=NULL, # initial value for variance initial.re=NULL ){ x <- 1 sts <- get("env",parent.frame(1))$.sts type <- match.arg(type, c("iid","car")) corr <- match.arg(corr, c("none","all")) corr <- switch(corr, "none"=FALSE, "all"=TRUE) if(type=="iid"){ Z <- 1 dim.re <- ncol(sts) mult <- "*" } else if(type=="car"){ # construct penalty matrix K K <- neighbourhood(sts) checkNeighbourhood(K) K <- K == 1 # indicate first-order neighbours ne <- colSums(K) # number of first-order neighbours K <- -1*K diag(K) <- ne dimK <- nrow(K) # check rank of the nhood, only connected neighbourhoods are allowed if(qr(K)$rank != dimK-1) stop("neighbourhood matrix contains islands") # singular-value decomposition of K svdK <- svd(K) # just use the positive eigenvalues of K in descending order # for a the factorisation of the penalty matrix K = LL' L <- svdK$u[,-dimK] %*% diag(sqrt(svdK$d[-dimK])) #* only use non-zero eigenvalues # Z = L(L'L)^-1, which can't be simplified to Z=(L')^-1 as L is not square Z <- L %*% solve(t(L)%*%L) dim.re <- dimK-1 mult <- "%*%" } #* check length of initial values + set default values? if(!is.null(initial.re) & length(initial.re) !=dim.re){ stop("Initial values for \'",type,"\' must be of length ",dim.re) } else if(is.null(initial.re)){ initial.re <- rnorm(dim.re,0,sd=sqrt(0.001)) } if(!is.null(initial.var) & length(initial.var) !=1){ stop("Initial values for \'",type,"\' must be of length ",1) } else if(is.null(initial.var)){ initial.var <- -.5 } result <- list(terms=x, name=paste("ri(",type,")",sep=""), Z.intercept=Z, which=NULL, dim.fe=1, initial.fe=0, dim.re=dim.re, dim.var=1, initial.var=initial.var, initial.re=initial.re, intercept=TRUE, unitSpecific=FALSE, random=TRUE, corr=corr, summ="colSums", mult=mult ) return(result) } ### check specification of formula ## f: one of the component formulae (ar$f, ne$f, or end$f) ## env: the "data" argument of hhh4() ## component: 1, 2, or 3, corresponding to the ar/ne/end component, respectively checkFormula <- function(f, env, component) { term <- terms.formula(f, specials=c("fe","ri")) # check if there is an overall intercept intercept.all <- attr(term, "intercept") == 1 # list of terms in the component vars <- as.list(attr(term,"variables"))[-1] # first element is "list" nVars <- length(vars) # begin with intercept res <- if (intercept.all) { c(eval(fe(1),envir=env), list(offsetComp=component)) } else { if (nVars==0) stop("formula ", deparse(substitute(f)), " contains no variables") NULL } # find out fixed effects without "fe()" specification # (only if there are variables in addition to an intercept "1") fe.raw <- setdiff(seq_len(nVars), unlist(attr(term, "specials"))) # evaluate covariates for(i in fe.raw) res <- cbind(res, c( eval(substitute(fe(x), list(x=vars[[i]])), envir=env), list(offsetComp=component) )) # fixed effects for(i in attr(term, "specials")$fe) res <- cbind(res, c( eval(vars[[i]], envir=env), list(offsetComp=component) )) res <- cbind(res, deparse.level=0) # ensure res has matrix dimensions # random intercepts RI <- attr(term, "specials")$ri if (sum(unlist(res["intercept",])) + length(RI) > 1) stop("There can only be one intercept in the formula ", deparse(substitute(f))) for(i in RI) res <- cbind(res, c( eval(vars[[i]], envir=env), list(offsetComp=component) )) return(res) } ## Create function (pars, type = "response") which ## returns the weighted sum of time-lagged counts of neighbours ## (or its derivates, if type = "gradient" or type = "hessian"). ## For type="reponse", this is a nTime x nUnits matrix (like Y), ## otherwise a list of such matrices, ## which for the gradient has length length(pars) and ## length(pars)*(length(pars)+1)/2 for the hessian. ## If neweights=NULL (i.e. no ne component in model), the result is always 0. neOffsetFUN <- function (Y, neweights, nbmat, data, lag) { if (is.null(neweights)) { # no neighbourhood component as.function(alist(...=, 0), envir=.GlobalEnv) ## dimY <- dim(Y) ## as.function(c(alist(...=), ## substitute(matrix(0, r, c), list(r=dimY[1], c=dimY[2]))), ## envir=.GlobalEnv) } else if (is.list(neweights)) { # parametric weights function (pars, type = "response") { name <- switch(type, response="w", gradient="dw", hessian="d2w") weights <- neweights[[name]](pars, nbmat, data) ## gradient and hessian are lists if length(pars$d) > 1L ## and single matrices/arrays if == 1 => _c_onditional lapply res <- clapply(weights, function(W) weightedSumNE(Y, W, lag)) ##<- clapply always returns a list (possibly of length 1) if (type=="response") res[[1L]] else res } } else { # fixed (known) weight structure (0-length pars) initoffset <- weightedSumNE(Y, neweights, lag) function (pars, type = "response") initoffset ## this will not be called for other types } ## returns function (living in THIS environment) } # interpret and check the specifications of each component # control must contain all arguments, i.e. setControl was used interpretControl <- function(control, stsObj){ # get environment for evaluation of covariates env <- control$data nTime <- nrow(stsObj) nUnits <- ncol(stsObj) Y <- observed(stsObj) ########################################################################## ## get the model specifications for each of the three components ########################################################################## ar <- control$ar ne <- control$ne end <- control$end ## FIXME: really weird... if the array below is evaluated, code will be faster ## A complex example model takes 132s (without this nonsense array evaluation) ## or 116s (with) for the whole fit if (ne$inModel && is.array(ne$weights)) { dev.null <- array(ne$weights, c(nUnits,nUnits,nTime)) ## for instance, str(ne$weights), as.vector(ne$weights), or ## array(ne$weights, dim(ne$weights)) do not have this effect... } ## create list of offsets of the three components Ym1 <- rbind(matrix(NA_integer_, ar$lag, nUnits), head(Y, nTime-ar$lag)) Ym1.ne <- neOffsetFUN(Y, ne$weights, neighbourhood(stsObj), control$data, ne$lag) offsets <- list(ar=Ym1, ne=Ym1.ne, end=end$offset) ## -> offset$ne is a function of the parameter vector 'd', which returns a ## nTime x nUnits matrix -- or 0 (scalar) if there is no NE component ## -> offset$end might just be 1 (scalar) ## Initial parameter vector 'd' of the neighbourhood weight function initial.d <- if (is.list(ne$weights)) ne$weights$initial else numeric(0L) dim.d <- length(initial.d) names.d <- if (dim.d == 0L) character(0L) else { paste0("neweights.", if (is.null(names(initial.d))) { if (dim.d==1L) "d" else paste0("d", seq_len(dim.d)) } else names(initial.d)) } ## determine all NA's (FIXME: why do we need this? Why include is.na(Y)?) isNA <- is.na(offsets[[1L]]) | is.na(offsets[[2L]](initial.d)) | is.na(Y) ## get terms for all components all.term <- NULL if(ar$isMatrix){ # ar$f is a matrix stop("not yet implemented") } else if(ar$inModel){ # ar$f is a formula all.term <- cbind(all.term, checkFormula(ar$f, env=env, component=1)) } if(ne$inModel){ all.term <- cbind(all.term, checkFormula(ne$f, env=env, component=2)) } if(end$inModel){ all.term <- cbind(all.term, checkFormula(end$f,env=env, component=3)) } dim.fe <- sum(unlist(all.term["dim.fe",])) dim.re.group <- unlist(all.term["dim.re",], use.names=FALSE) dim.re <- sum(dim.re.group) dim.var <- sum(unlist(all.term["dim.var",])) dim.corr <- sum(unlist(all.term["corr",])) if(dim.corr>0){ if(dim.var!=dim.corr) stop("Use corr=\'all\' or corr=\'none\' ") dim.corr <- switch(dim.corr,0,1,3) } # the vector with dims of the random effects must be equal if they are correlated if(length(unique(dim.re.group[dim.re.group>0]))!=1 & dim.corr>0){ stop("Correlated effects must have same penalty") } n <- c("ar","ne","end")[unlist(all.term["offsetComp",])] names.fe <- names.var <- NULL for(i in 1:length(n)){ names.fe <- c(names.fe,paste(n[i],all.term["name",i][[1]], sep=".")) if(all.term["random",i][[1]]) names.var <- c(names.var,paste("sd",n[i],all.term["name",i][[1]], sep=".")) } index.fe <- rep(1:ncol(all.term), times=unlist(all.term["dim.fe",])) index.re <- rep(1:ncol(all.term), times=unlist(all.term["dim.re",])) # poisson or negbin model fam <- match.arg(control$family, c("Poisson","NegBin1","NegBinM")) if(fam=="Poisson"){ ddistr <- function(y,mu,size){ dpois(y, lambda=mu, log=TRUE) } dim.overdisp <- 0L } else { ddistr <- function(y,mu,size){ dnbinom(y, mu=mu, size=size, log=TRUE) } ## version that can handle size = Inf (i.e. the Poisson special case): ## ddistr <- function (y,mu,size) { ## poisidx <- is.infinite(size) ## res <- y ## res[poisidx] <- dpois(y[poisidx], lambda=mu[poisidx], log=TRUE) ## res[!poisidx] <- dnbinom(y[!poisidx], mu=mu[!poisidx], ## size=size[!poisidx], log=TRUE) ## res ## } dim.overdisp <- if (fam=="NegBin1") 1L else nUnits } environment(ddistr) <- .GlobalEnv # function is self-contained # parameter start values initial.fe <- unlist(all.term["initial.fe",]) initial.overdisp <- rep.int(2, dim.overdisp) initial.fe.d.overdisp <- c(initial.fe, initial.d, initial.overdisp) initial.re <- unlist(all.term["initial.re",]) initial.sd <- unlist(all.term["initial.var",]) initial.corr <- rep.int(0, dim.corr) initial.sd.corr <- c(initial.sd, initial.corr) # check if a list of 'start' values is supplied if(!is.null(control$start$fixed)){ if(length(control$start$fixed) != dim.fe + dim.d + dim.overdisp) stop("initial values in start$fixed must be of length ", dim.fe + dim.d + dim.overdisp) initial.fe.d.overdisp <- control$start$fixed } if(!is.null(control$start$random)){ if(length(control$start$random) != dim.re) stop("initial values in start$random must be of length ",dim.re,"\n") initial.re <- control$start$random } if(!is.null(control$start$sd.corr)){ if(length(control$start$sd.corr) != dim.var+dim.corr) stop("initial values in start$sd.corr must be of length ",dim.var+dim.corr,"\n") initial.sd.corr <- control$start$sd.corr } # set names of parameter vectors names.overdisp <- if(dim.overdisp > 1L){ paste(paste("-log(overdisp", colnames(stsObj), sep=".") ,")", sep="") } else { rep("-log(overdisp)",dim.overdisp) # dim.overdisp may be 0 } names(initial.fe.d.overdisp) <- c(names.fe, names.d, names.overdisp) names(initial.sd.corr) <- c(names.var, head(paste("corr",1:3,sep="."),dim.corr)) # Done result <- list(response = Y, terms = all.term, nTime = nTime, nUnits = nUnits, nFE = dim.fe, nd = dim.d, nOverdisp = dim.overdisp, nRE = dim.re, rankRE = dim.re.group, nVar = dim.var, nCorr = dim.corr, nSigma = dim.var+dim.corr, nGroups = ncol(all.term), namesFE = names.fe, indexFE = index.fe, indexRE = index.re, initialTheta = c(initial.fe.d.overdisp, initial.re), initialSigma = initial.sd.corr, offset = offsets, family = ddistr, subset = control$subset, isNA = isNA ) return(result) } getSdCorr <- function(x){ return(x$Sigma.orig) } getCov <- function(x){ Sigma <- x$Sigma corr <- cov2cor(Sigma) diag(corr) <- diag(Sigma) rownames(corr) <- colnames(corr) <- sub("^sd\\.","",names(x$Sigma.orig))[grep("^sd\\.",names(x$Sigma.orig))] return(corr) } splitParams <- function(theta, model){ fixed <- theta[seq_len(model$nFE)] d <- theta[model$nFE + seq_len(model$nd)] overdisp <- theta[model$nFE + model$nd + seq_len(model$nOverdisp)] random <- theta[seq.int(to=length(theta), length.out=model$nRE)] list(fixed=fixed, random=random, overdisp=overdisp, d=d) } ### compute predictor meanHHH <- function(theta, model, subset=model$subset, total.only=FALSE) { ## unpack theta pars <- splitParams(theta, model) fixed <- pars$fixed random <- pars$random ## unpack model term <- model$terms offsets <- model$offset offsets[[2L]] <- offsets[[2L]](pars$d) # evaluate at current parameter value nGroups <- model$nGroups comp <- unlist(term["offsetComp",]) idxFE <- model$indexFE idxRE <- model$indexRE #isNA <- model$isNA toMatrix <- function (x, r=model$nTime, c=model$nUnits) matrix(x, r, c, byrow=TRUE) ## go through groups of parameters and compute predictor of each component, ## i.e. lambda_it, phi_it, nu_it, EXCLUDING the multiplicative offset terms, ## as well as the resulting component mean (=exppred * offset) computePartMean <- function (component) { pred <- nullMatrix <- toMatrix(0) #is.na(pred) <- isNA # set missing values in observed Y to NA # -> FIXME: why? seems to be awkward... and # incompatible with simulation for t=1 (given y.start) if(!any(comp==component)) { # component not in model -> return 0-matrix zeroes <- pred[subset,,drop=FALSE] return(list(exppred = zeroes, mean = zeroes)) } for(i in (1:nGroups)[comp==component]){ fe <- fixed[idxFE==i] if(term["unitSpecific",i][[1]]){ fe <- nullMatrix which <- term["which",i][[1]] fe[,which] <- toMatrix(fixed[idxFE==i],c=sum(which)) } if(term["random",i][[1]]){ re <- random[idxRE==i] "%m%" <- get(term["mult",i][[1]]) Z.re <- toMatrix(term["Z.intercept",i][[1]] %m% re) } else { Z.re <- 0 } X <- term["terms",i][[1]] pred <- pred + X*fe + Z.re } exppred <- exp(pred[subset,,drop=FALSE]) offset <- offsets[[component]] if (length(offset) > 1) offset <- offset[subset,,drop=FALSE] ##<- no subsetting if offset is scalar (time- and unit-independent) list(exppred = exppred, mean = exppred * offset) } ## compute component means ar <- computePartMean(1) ne <- computePartMean(2) end <- computePartMean(3) ## Done epidemic <- ar$mean + ne$mean endemic <- end$mean if (total.only) epidemic + endemic else list(mean=epidemic+endemic, epidemic=epidemic, endemic=endemic, epi.own=ar$mean, epi.neighbours=ne$mean, ar.exppred=ar$exppred, ne.exppred=ne$exppred, end.exppred=end$exppred) } ############################################ penLogLik <- function(theta, sd.corr, model, attributes=FALSE) { if(any(is.na(theta))) stop("NAs in regression parameters.", ADVICEONERROR) ## unpack model nTime <- model$nTime nUnits <- model$nUnits subset <- model$subset Y <- model$response[subset,,drop=FALSE] #isNA <- model$isNA[subset,,drop=FALSE] dimPsi <- model$nOverdisp dimRE <- model$nRE ## unpack parameters pars <- splitParams(theta, model) psi <- exp(pars$overdisp) # = 1/psi, pars$overdisp = -log(psi) if(dimPsi > 1L) { psi <- matrix(psi, nTime, nUnits, byrow=TRUE)[subset,,drop=FALSE] } if (dimRE > 0) { randomEffects <- pars$random sd <- head(sd.corr, model$nVar) corr <- tail(sd.corr, model$nCorr) dimBlock <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, model$nVar, dimBlock) } ############################################################ #psi might be numerically equal to 0 or Inf in which cases dnbinom (in meanHHH) #would return NaN (with a warning). The case size=Inf rarely happens and #corresponds to a Poisson distribution. Currently this case is not handled #in order to have the usual non-degenerate case operate faster. #For size=0, log(dnbinom) equals -Inf for positive x or if (x=0 and mu=0), and #zero if x=0 and mu>0 and mu0, which is always true), we have that sum(ll.units) = -Inf, hence: if (any(psi == 0)) return(-Inf) ## evaluate mean mu <- meanHHH(theta, model, total.only=TRUE) # if, numerically, mu=Inf, log(dnbinom) or log(dpois) both equal -Inf, hence: #if (any(is.infinite(mu))) return(-Inf) # however, since mu=Inf does not produce warnings below and this is a rare # case, it is faster to not include this conditional expression ## penalization term for random effects lpen <- if (dimRE==0) 0 else { # there are random effects ##-.5*(t(randomEffects)%*%Sigma.inv%*%randomEffects) ## the following implementation takes ~85% less computing time ! -0.5 * crossprod(randomEffects, Sigma.inv) %*% randomEffects } lpen <- c(lpen) # drop 1x1 matrix dimensions ## log-likelihood ll.units <- .colSums(model$family(Y,mu,psi), length(subset), nUnits, na.rm=TRUE) ## penalized log-likelihood ll <- sum(ll.units) + lpen ## Done if (attributes) { attr(ll, "loglik") <- ll.units attr(ll, "logpen") <- lpen } ll } penScore <- function(theta, sd.corr, model) { if(any(is.na(theta))) stop("NAs in regression parameters.", ADVICEONERROR) ## unpack model subset <- model$subset Y <- model$response[subset,,drop=FALSE] isNA <- model$isNA[subset,,drop=FALSE] dimPsi <- model$nOverdisp dimRE <- model$nRE ## unpack parameters pars <- splitParams(theta, model) psi <- exp(pars$overdisp) # = 1/psi, pars$overdisp = -log(psi) if(dimPsi > 1L) { psi <- matrix(psi, ncol=model$nUnits, nrow=model$nTime, byrow=TRUE)[subset,,drop=FALSE] } if (dimRE > 0) { randomEffects <- pars$random sd <- head(sd.corr, model$nVar) corr <- tail(sd.corr, model$nCorr) dimBlock <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, model$nVar, dimBlock) } ## further model unpacking term <- model$terms nGroups <- model$nGroups dimd <- model$nd ## evaluate mean mu <- meanHHH(theta, model) meanTotal <- mu$mean ############################################################ ## helper function for derivatives derivHHH.factor <- if(dimPsi > 0L){ # NegBin psiPlusMu <- psi + meanTotal # also used below for calculation of grPsi psiYpsiMu <- (psi+Y) / psiPlusMu Y/meanTotal - psiYpsiMu } else { # Poisson Y/meanTotal - 1 } derivHHH <- function (dmu) derivHHH.factor * dmu ## go through groups of parameters and compute the gradient of each component computeGrad <- function(mean.comp){ grad.fe <- numeric(0L) grad.re <- numeric(0L) for(i in 1:nGroups){ comp <- term["offsetComp",i][[1]] Xit<- term["terms",i][[1]] # eiter 1 or a matrix with values if(is.matrix(Xit)){ Xit <- Xit[subset,,drop=FALSE] } summ <- get(term["summ",i][[1]]) dTheta <- derivHHH(mean.comp[[comp]]*Xit) dTheta[isNA] <- 0 # dTheta must not contain NA's (set NA's to 0) if(term["unitSpecific",i][[1]]){ which <- term["which",i][[1]] dTheta <- summ(dTheta,na.rm=TRUE)[ which ] grad.fe <- c(grad.fe,dTheta) } else if(term["random",i][[1]]){ Z <- term["Z.intercept",i][[1]] "%m%" <- get(term["mult",i][[1]]) dRTheta <- colSums(dTheta %m% Z) grad.re <- c(grad.re, dRTheta) grad.fe <- c(grad.fe, sum(dTheta)) } else{ grad.fe <- c(grad.fe, summ(dTheta,na.rm=TRUE)) } } list(fe=grad.fe, re=unname(grad.re)) } gradients <- computeGrad(mu[c("epi.own","epi.neighbours","endemic")]) ## gradient for parameter vector of the neighbourhood weights grd <- if (dimd > 0L) { dneOffset <- model$offset[[2L]](pars$d, type="gradient") ##<- this is always a list (of length dimd) of matrices onescore.d <- function (dneoff) { dmudd <- mu$ne.exppred * dneoff[subset,,drop=FALSE] grd.terms <- derivHHH(dmudd) sum(grd.terms, na.rm=TRUE) } unlist(clapply(dneOffset, onescore.d), recursive=FALSE, use.names=FALSE) } else numeric(0L) ## gradient for overdispersion parameter psi grPsi <- if(dimPsi > 0L){ dPsi <- psi * (digamma(Y+psi) - digamma(psi) + log(psi) + 1 - log(psiPlusMu) - psiYpsiMu) # multiple psi_i's or single psi? if(dimPsi>1L) colSums(dPsi, na.rm=TRUE) else sum(dPsi, na.rm=TRUE) } else numeric(0L) if(any(is.na(grPsi))){ stop("derivatives for overdispersion parameter psi not computable") } ## add penalty to random effects gradient s.pen <- if(dimRE > 0) c(Sigma.inv %*% randomEffects) else numeric(0L) if(length(gradients$re) != length(s.pen)) # FIXME: could this ever happen? cat("length of s(b) != Sigma.inv %*% b\n") # should probably better stop() grRandom <- c(gradients$re - s.pen) ## Done res <- c(gradients$fe, grd, grPsi, grRandom) res } penFisher <- function(theta, sd.corr, model, attributes=FALSE) { if(any(is.na(theta))) stop("NAs in regression parameters.", ADVICEONERROR) ## unpack model subset <- model$subset Y <- model$response[subset,,drop=FALSE] isNA <- model$isNA[subset,,drop=FALSE] dimPsi <- model$nOverdisp dimRE <- model$nRE ## unpack parameters pars <- splitParams(theta, model) psi <- exp(pars$overdisp) # = 1/psi, pars$overdisp = -log(psi) if(dimPsi > 1L) { psi <- matrix(psi, ncol=model$nUnits, nrow=model$nTime, byrow=TRUE)[subset,,drop=FALSE] } if (dimRE > 0) { randomEffects <- pars$random sd <- head(sd.corr, model$nVar) corr <- tail(sd.corr, model$nCorr) dimBlock <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, model$nVar, dimBlock) } ## further model unpacking term <- model$terms nGroups <- model$nGroups dimd <- model$nd dimFE <- model$nFE idxFE <- model$indexFE idxRE <- model$indexRE ## evaluate mean mu <- meanHHH(theta, model) meanTotal <- mu$mean ############################################################ ## helper functions for derivatives: if (dimPsi > 0L) { # negbin psiPlusY <- psi + Y psiPlusMu <- psi + meanTotal psiPlusMu2 <- psiPlusMu^2 psiYpsiMu <- psiPlusY / psiPlusMu psiYpsiMu2 <- psiPlusY / psiPlusMu2 deriv2HHH.fac1 <- psiYpsiMu2 - Y / (meanTotal^2) deriv2HHH.fac2 <- Y / meanTotal - psiYpsiMu ## psi-related derivatives dThetadPsi.fac <- psi * (psiYpsiMu2 - 1/psiPlusMu) dThetadPsi <- function(dTheta){ dThetadPsi.fac * dTheta } dPsidPsi <- function(){ dPsi <- psi * (digamma(psiPlusY)-digamma(psi) +log(psi)+1 - log(psiPlusMu) - psiYpsiMu) psi^2 * (trigamma(psiPlusY) - trigamma(psi) + 1/psi - 1/psiPlusMu - (meanTotal-Y)/psiPlusMu2) + dPsi } } else { # poisson deriv2HHH.fac1 <- -Y / (meanTotal^2) deriv2HHH.fac2 <- Y / meanTotal - 1 } deriv2HHH <- function(dTheta_l, dTheta_k, dTheta_lk){ dTheta_l * dTheta_k * deriv2HHH.fac1 + dTheta_lk * deriv2HHH.fac2 } ## go through groups of parameters and compute the hessian of each component computeFisher <- function(mean.comp){ # initialize hessian hessian.FE.FE <- matrix(0,dimFE,dimFE) hessian.FE.RE <- matrix(0,dimFE,dimRE) hessian.RE.RE <- matrix(0,dimRE,dimRE) hessian.FE.Psi <- matrix(0,dimFE,dimPsi) hessian.Psi.RE <- matrix(0,dimPsi,dimPsi+dimRE) # CAVE: contains PsiPsi and PsiRE hessian.FE.d <- matrix(0,dimFE,dimd) hessian.d.d <- matrix(0,dimd,dimd) hessian.d.Psi <- matrix(0,dimd,dimPsi) hessian.d.RE <- matrix(0,dimd,dimRE) ## derivatives wrt neighbourhood weight parameters d if (dimd > 0L) { phi.doff <- function (dneoff) { mu$ne.exppred * dneoff[subset,,drop=FALSE] } ## for type %in% c("gradient", "hessian"), model$offset[[2L]] always ## returns a list of matrices. It has length(pars$d) elements for the ## gradient and length(pars$d)*(length(pars$d)+1)/2 for the hessian. dneOffset <- model$offset[[2L]](pars$d, type="gradient") dmudd <- lapply(dneOffset, phi.doff) d2neOffset <- model$offset[[2L]](pars$d, type="hessian") d2mudddd <- lapply(d2neOffset, phi.doff) ## d l(theta,x) /dd dd (fill only upper triangle) ij <- 0L for (i in seq_len(dimd)) { for (j in i:dimd) { ij <- ij + 1L #= dimd*(i-1) + j - (i-1)*i/2 # for j >= i ## d2mudddd contains upper triangle by row (=lowertri by column) d2ij <- deriv2HHH(dmudd[[i]], dmudd[[j]], d2mudddd[[ij]]) hessian.d.d[i,j] <- sum(d2ij, na.rm=TRUE) } } } if (dimPsi > 0L) { ## d l(theta,x) /dpsi dpsi hessian.Psi.RE[,seq_len(dimPsi)] <- if (dimPsi == 1L) { sum(dPsidPsi(), na.rm=TRUE) } else diag(colSums(dPsidPsi(), na.rm=TRUE)) ## d l(theta) / dd dpsi for (i in seq_len(dimd)) { # will not be run if dimd==0 dPsi.i <- colSums(dThetadPsi(dmudd[[i]]),na.rm=TRUE) if(dimPsi==1L) dPsi.i <- sum(dPsi.i) hessian.d.Psi[i,] <- dPsi.i } } ## i.fixed <- function(){ if(random.j){ Z.j <- term["Z.intercept",j][[1]] "%mj%" <- get(term["mult",j][[1]]) hessian.FE.RE[idxFE==i,idxRE==j] <<- colSums(didj %mj% Z.j) ##<- didj must not contain NA's (all NA's set to 0) dIJ <- sum(didj,na.rm=TRUE) # fixed on 24/09/2012 } else if(unitSpecific.j){ dIJ <- colSums(didj,na.rm=TRUE)[ which.j ] } else { dIJ <- sum(didj,na.rm=TRUE) } hessian.FE.FE[idxFE==i,idxFE==j] <<- dIJ } ## i.unit <- function(){ if(random.j){ Z.j <- term["Z.intercept",j][[1]] "%mj%" <- get(term["mult",j][[1]]) dIJ <- colSums(didj %mj% Z.j) # didj must not contain NA's (all NA's set to 0) hessian.FE.RE[idxFE==i,idxRE==j] <<- diag(dIJ)[ which.i, ] dIJ <- dIJ[ which.i ] # added which.i subsetting in r432 # FIXME @Michaela: please confirm this correction } else if(unitSpecific.j){ ## which.ij <- (which.i & which.j) # FIXME: this is actually unused...? dIJ <- diag(colSums(didj))[ which.i, which.j ] } else { dIJ <- colSums(didj)[ which.i ] } hessian.FE.FE[idxFE==i,idxFE==j] <<- dIJ } ## i.random <- function(){ if(random.j){ Z.j <- term["Z.intercept",j][[1]] "%mj%" <- get(term["mult",j][[1]]) hessian.FE.RE[idxFE==i,idxRE==j] <<- colSums(didj %mj% Z.j) hessian.FE.RE[idxFE==j,idxRE==i] <<- colSums(didj %m% Z.i) if(length(Z.j)==1 & length(Z.i)==1){ Z <- Z.i*Z.j hessian.RE.RE[which(idxRE==i),idxRE==j] <<- diag(colSums( didj %m% Z)) } else if(length(Z.j)==1 & length(Z.i)>1){ #* Z.j <- diag(nrow=model$nUnits) for(k in 1:ncol(Z.j)){ Z <- Z.i*Z.j[,k] hessian.RE.RE[idxRE==i,which(idxRE==j)[k]] <<- colSums( didj %m% Z) } } else if(length(Z.j)>1 & length(Z.i)==1){ #* Z.i <- diag(nrow=model$nUnits) for(k in 1:ncol(Z.i)){ Z <- Z.i[,k]*Z.j hessian.RE.RE[which(idxRE==i)[k],idxRE==j] <<- colSums( didj %mj% Z) } } else { for(k in 1:ncol(Z.j)){ Z <- Z.i*Z.j[,k] hessian.RE.RE[which(idxRE==i)[k],idxRE==j] <<- colSums( didj %m% Z) } } dIJ <- sum(didj) } else if(unitSpecific.j){ dIJ <- colSums(didj %m% Z.i) hessian.FE.RE[idxFE==j,idxRE==i] <<- diag(dIJ)[ which.j, ] dIJ <- dIJ[ which.j ] } else { hessian.FE.RE[idxFE==j,idxRE==i] <<- colSums(didj %m% Z.i) dIJ <- sum(didj) } hessian.FE.FE[idxFE==i,idxFE==j] <<- dIJ } ##---------------------------------------------- for(i in 1:nGroups){ #go through rows of hessian # parameter group belongs to which components comp.i <- term["offsetComp",i][[1]] # get covariate value Xit <- term["terms",i][[1]] # eiter 1 or a matrix with values if(is.matrix(Xit)){ Xit <- Xit[subset,,drop=FALSE] } m.Xit <- mean.comp[[comp.i]]*Xit random.i <- term["random",i][[1]] unitSpecific.i <- term["unitSpecific",i][[1]] ## fill psi-related entries and select fillHess function if(random.i){ Z.i <- term["Z.intercept",i][[1]] # Z.i and %m% (of i) determined here "%m%" <- get(term["mult",i][[1]]) # will also be used in j's for loop fillHess <- i.random if(dimPsi==1L){ dPsi<- dThetadPsi(m.Xit) dPsi[isNA] <- 0 hessian.FE.Psi[idxFE==i,]<- sum(dPsi) hessian.Psi.RE[,c(FALSE,idxRE==i)] <- colSums( dPsi%m%Z.i) } else if(dimPsi>1L){ dPsi<- dThetadPsi(m.Xit) dPsi[isNA] <- 0 hessian.FE.Psi[idxFE==i,]<- colSums( dPsi) hessian.Psi.RE[,c(rep.int(FALSE, dimPsi),idxRE==i)] <- diag(colSums( dPsi%m%Z.i)) } } else if(unitSpecific.i){ which.i <- term["which",i][[1]] fillHess <- i.unit if(dimPsi>0L){ dPsi <- colSums(dThetadPsi(m.Xit),na.rm=TRUE) hessian.FE.Psi[idxFE==i,] <- if(dimPsi==1L) { dPsi[which.i] } else { diag(dPsi)[which.i,] } } } else { fillHess <- i.fixed if(dimPsi>0L){ dPsi<- colSums(dThetadPsi(m.Xit),na.rm=TRUE) if(dimPsi==1L){ dPsi <- sum(dPsi) } hessian.FE.Psi[idxFE==i,] <-dPsi } } ## fill pars$d-related entries for (j in seq_len(dimd)) { # will not be run if dimd==0 didd <- deriv2HHH(dTheta_l = m.Xit, dTheta_k = dmudd[[j]], dTheta_lk = if (comp.i == 2) dmudd[[j]] * Xit else 0) didd[isNA] <- 0 hessian.FE.d[idxFE==i,j] <- if (unitSpecific.i) { colSums(didd,na.rm=TRUE)[which.i] } else sum(didd) if (random.i) hessian.d.RE[j,idxRE==i] <- colSums(didd %m% Z.i) } ## fill other (non-psi, non-d) entries (only upper triangle, j >= i!) for(j in i:nGroups){ comp.j <- term["offsetComp",j][[1]] Xjt <- term["terms",j][[1]] # eiter 1 or a matrix with values if(is.matrix(Xjt)){ Xjt <- Xjt[subset,,drop=FALSE] } # if param i and j do not belong to the same component, d(i)d(j)=0 m.Xit.Xjt <- if (comp.i != comp.j) 0 else m.Xit * Xjt didj <- deriv2HHH(dTheta_l = m.Xit, dTheta_k = mean.comp[[comp.j]]*Xjt, dTheta_lk = m.Xit.Xjt) didj[isNA]<-0 random.j <- term["random",j][[1]] unitSpecific.j <- term["unitSpecific",j][[1]] which.j <- term["which",j][[1]] fillHess() } } ######################################################### ## fill lower triangle of hessians and combine them ######################################################## hessian <- rbind(cbind(hessian.FE.FE,hessian.FE.d,hessian.FE.Psi,hessian.FE.RE), cbind(matrix(0,dimd,dimFE),hessian.d.d,hessian.d.Psi,hessian.d.RE), cbind(matrix(0,dimPsi,dimFE+dimd),hessian.Psi.RE), cbind(matrix(0,dimRE,dimFE+dimd+dimPsi),hessian.RE.RE)) hessian[lower.tri(hessian)] <- 0 # FIXME: should already be the case! diagHessian <- diag(hessian) fisher <- -(hessian + t(hessian)) diag(fisher) <- -diagHessian return(fisher) } fisher <- computeFisher(mu[c("epi.own","epi.neighbours","endemic")]) ## add penalty for random effects pen <- matrix(0, length(theta), length(theta)) Fpen <- if(dimRE > 0){ thetaIdxRE <- seq.int(to=length(theta), length.out=dimRE) pen[thetaIdxRE,thetaIdxRE] <- Sigma.inv fisher + pen } else fisher ## Done if(attributes){ attr(Fpen, "fisher") <- fisher attr(Fpen, "pen") <- pen } Fpen } ################################################# sqrtOf1pr2 <- function(r){ sqrt(1+r^2) } getSigmai <- function(sd, # vector of length dim with log-stdev's correlation, # vector of length dim with correlation # parameters, 0-length if uncorrelated dim ){ if(dim==0) return(NULL) Sigma.i <- if (length(correlation) == 0L) diag(exp(2*sd), dim) else { D <- diag(exp(sd), dim) L <- diag(nrow=dim) L[2,1:2] <- c(correlation[1],1)/sqrtOf1pr2(correlation[1]) if (dim==3) { L[3,] <- c(correlation[2:3],1)/sqrtOf1pr2(correlation[2]) L[3,2:3] <- L[3,2:3]/sqrtOf1pr2(correlation[3]) } D %*% tcrossprod(L) %*% D # ~75% quicker than D %*% L %*% t(L) %*% D } return(Sigma.i) } getSigmaiInv <- function(sd, # vector of length dim with log-stdev's correlation, # vector of length dim with correlation # parameters, 0-length if uncorrelated dim ){ if(dim==0) return(NULL) Sigma.i.inv <- if (length(correlation) == 0L) diag(exp(-2*sd), dim) else { r <- correlation Dinv <- diag(exp(-sd), dim) L <- diag(nrow=dim) L[2,1:2] <- c(-r[1],sqrtOf1pr2(r[1])) if(dim==3){ L[3,1] <- r[1]*r[3]-r[2]*sqrtOf1pr2(r[3]) L[3,2] <- -L[2,2]*r[3] L[3,3] <- sqrtOf1pr2(r[2])*sqrtOf1pr2(r[3]) } Dinv %*% crossprod(L) %*% Dinv # ~75% quicker than Dinv %*% t(L) %*% L %*% Dinv } return(Sigma.i.inv) } #* allow blockdiagonal matrix blockdiag(A,B), with A=kronecker product, B=diagonal matrix? getSigmaInv <- function(sd, correlation, dimSigma, dimBlocks, SigmaInvi=NULL){ if(is.null(SigmaInvi)){ SigmaInvi <- getSigmaiInv(sd,correlation,dimSigma) } SigmaInv <- if(length(unique(dimBlocks))==1){ # kronecker product formulation possible kronecker(SigmaInvi,diag(nrow=dimBlocks[1])) # the result is a symmetric matrix if SigmaInvi is symmetric } else { # kronecker product not possible -> correlation=0 diag(rep(diag(SigmaInvi),dimBlocks)) } return(SigmaInv) } getSigma <- function(sd, correlation, dimSigma, dimBlocks, Sigmai=NULL){ if(is.null(Sigmai)){ Sigmai <- getSigmai(sd,correlation,dimSigma) } Sigma <- if(length(unique(dimBlocks))==1){ # kronecker product formulation possible kronecker(Sigmai,diag(nrow=dimBlocks[1])) # the result is a symmetric matrix if Sigmai is symmetric } else { # kronecker product not possible -> correlation=0 diag(rep(diag(Sigmai),dimBlocks)) } return(Sigma) } ## Approximate marginal likelihood for variance components ## Parameter and model unpacking at the beginning (up to the ###...-line) is ## identical in marScore() and marFisher() marLogLik <- function(sd.corr, theta, model, fisher.unpen=NULL){ dimVar <- model$nVar dimCorr <- model$nCorr dimSigma <- model$nSigma if(dimSigma == 0){ return(-Inf) } if(any(is.na(sd.corr))){ # in order to avoid nlminb from running into an infinite loop (cf. bug # report #15052), we have to emergency stop() in this case. # As of R 2.15.2, nlminb() throws an error if it receives NA from # any of the supplied functions. stop("NAs in variance parameters.", ADVICEONERROR) } sd <- head(sd.corr,dimVar) corr <- tail(sd.corr,dimCorr) pars <- splitParams(theta,model) randomEffects <- pars$random dimRE <- model$nRE dimBlocks <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, dimVar, dimBlocks) # if not given, calculate unpenalized part of fisher info if(is.null(fisher.unpen)){ fisher.unpen <- attr(penFisher(theta, sd.corr, model,attributes=TRUE), "fisher") } # add penalty to fisher fisher <- fisher.unpen thetaIdxRE <- seq.int(to=length(theta), length.out=dimRE) fisher[thetaIdxRE,thetaIdxRE] <- fisher[thetaIdxRE,thetaIdxRE] + Sigma.inv ############################################################ # penalized part of likelihood # compute -0.5*log(|Sigma|) - 0.5*RE' %*% Sigma.inv %*% RE # where -0.5*log(|Sigma|) = -dim(RE_i)*[Sum(sd_i) -0.5*log(1+corr_i^2)] ##lpen <- -0.5*(t(randomEffects)%*%Sigma.inv%*%randomEffects) ## the following implementation takes ~85% less computing time ! lpen <- -0.5 * crossprod(randomEffects, Sigma.inv) %*% randomEffects loglik.pen <- sum(-dimBlocks*sd) + c(lpen) if(dimCorr >0){ loglik.pen <- loglik.pen + 0.5*dimBlocks[1]*sum(log(1+corr^2)) } ## approximate marginal likelihood logdetfisher <- determinant(fisher,logarithm=TRUE)$modulus lmarg <- loglik.pen -0.5*c(logdetfisher) return(lmarg) } marScore <- function(sd.corr, theta, model, fisher.unpen=NULL){ dimVar <- model$nVar dimCorr <- model$nCorr dimSigma <- model$nSigma if(dimSigma == 0){ return(numeric(0L)) } if(any(is.na(sd.corr))) stop("NAs in variance parameters.", ADVICEONERROR) sd <- head(sd.corr,dimVar) corr <- tail(sd.corr,dimCorr) pars <- splitParams(theta,model) randomEffects <- pars$random dimRE <- model$nRE dimBlocks <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, dimVar, dimBlocks) # if not given, calculate unpenalized part of fisher info if(is.null(fisher.unpen)){ fisher.unpen <- attr(penFisher(theta, sd.corr, model,attributes=TRUE), "fisher") } # add penalty to fisher fisher <- fisher.unpen thetaIdxRE <- seq.int(to=length(theta), length.out=dimRE) fisher[thetaIdxRE,thetaIdxRE] <- fisher[thetaIdxRE,thetaIdxRE] + Sigma.inv # inverse of penalized fisher info F.inv <- try(solve(fisher),silent=TRUE) if(inherits(F.inv,"try-error")){ cat("\n WARNING (in marScore): penalized Fisher is singular!\n") #return(rep.int(0,dimSigma)) ## continuing with the generalized inverse often works, otherwise we would ## have to stop() here, because nlminb() cannot deal with NA's F.inv <- ginv(fisher) } F.inv.RE <- F.inv[thetaIdxRE,thetaIdxRE] ############################################################ ## compute marginal score and fisher for each variance component # initialize score and fisher info marg.score <- rep.int(NA_real_,dimSigma) ## specify functions for derivatives deriv1 <- switch(dimVar, dSigma1, dSigma2, dSigma3) d1Sigma <- deriv1(sd, corr) Sigmai.inv <- getSigmaiInv(sd, corr, dimVar) # derivation of log determinant # -.5*tr(Sigma^-1 %*% dSigma/ds) = -R (for sd.i) # = R*corr.i/(corr.i^2+1) (for corr.i) d1logDet <- c(-dimBlocks,dimBlocks[1]*corr/(corr^2+1)) # go through all variance parameters for(i in 1:dimSigma){ dSi <- -Sigmai.inv %*% d1Sigma[,,i] %*% Sigmai.inv # CAVE: sign dS.i <- getSigma(dimSigma=dimVar,dimBlocks=dimBlocks,Sigmai=dSi) #dlpen.i <- -0.5* t(randomEffects) %*% dS.i %*% randomEffects # ~85% faster implementation using crossprod() avoiding "slow" t(): dlpen.i <- -0.5 * crossprod(randomEffects, dS.i) %*% randomEffects #tr.d1logDetF <- sum(diag(F.inv.RE %*% dS.i)) tr.d1logDetF <- sum(F.inv.RE * dS.i) # since dS.i is symmetric #<- needs 1/100 (!) of the computation time of sum(diag(F.inv.RE %*% dS.i)) marg.score[i] <- d1logDet[i] + c(dlpen.i) - 0.5 * tr.d1logDetF } return(marg.score) } marFisher <- function(sd.corr, theta, model, fisher.unpen=NULL){ dimVar <- model$nVar dimCorr <- model$nCorr dimSigma <- model$nSigma if(dimSigma == 0){ return(matrix(numeric(0L),0L,0L)) } if(any(is.na(sd.corr))) stop("NAs in variance parameters.", ADVICEONERROR) sd <- head(sd.corr,dimVar) corr <- tail(sd.corr,dimCorr) pars <- splitParams(theta,model) randomEffects <- pars$random dimRE <- model$nRE dimBlocks <- model$rankRE[model$rankRE>0] Sigma.inv <- getSigmaInv(sd, corr, dimVar, dimBlocks) # if not given, calculate unpenalized part of fisher info if(is.null(fisher.unpen)){ fisher.unpen <- attr(penFisher(theta, sd.corr, model,attributes=TRUE), "fisher") } # add penalty to fisher fisher <- fisher.unpen thetaIdxRE <- seq.int(to=length(theta), length.out=dimRE) fisher[thetaIdxRE,thetaIdxRE] <- fisher[thetaIdxRE,thetaIdxRE] + Sigma.inv # inverse of penalized fisher info F.inv <- try(solve(fisher),silent=TRUE) if(inherits(F.inv,"try-error")){ cat("\n WARNING (in marFisher): penalized Fisher is singular!\n") #return(matrix(Inf,dimSigma,dimSigma)) ## continuing with the generalized inverse often works, otherwise we would ## have to stop() here, because nlminb() cannot deal with NA's F.inv <- ginv(fisher) } F.inv.RE <- F.inv[thetaIdxRE,thetaIdxRE] ## declare F.inv.RE as a symmetric matrix? ##F.inv.RE <- new("dsyMatrix", Dim = dim(F.inv.RE), x = c(F.inv.RE)) ## -> no, F.inv.RE %*% dS.i becomes actually slower (dS.i is a "sparseMatrix") ############################################################ marg.hesse <- matrix(NA_real_,dimSigma,dimSigma) ## specify functions for derivatives deriv1 <- switch(dimVar,dSigma1, dSigma2, dSigma3) deriv2 <- switch(dimVar,d2Sigma1, d2Sigma2, d2Sigma3) d1Sigma <- deriv1(sd, corr) d2Sigma <- deriv2(sd, corr, d1Sigma) Sigmai.inv <- getSigmaiInv(sd, corr, dimVar) # 2nd derivatives of log determinant d2logDet <- diag(c(rep.int(0,dimVar),-dimBlocks[1]*(corr^2-1)/(corr^2+1)^2),dimSigma) # function to convert dS.i and dS.j matrices to sparse matrix objects dS2sparse <- if (dimCorr > 0) function (x) { forceSymmetric(as(x, "sparseMatrix")) # dS.i & dS.j are symmetric } else function (x) { #as(x, "diagonalMatrix") new("ddiMatrix", Dim = dim(x), diag = "N", x = diag(x)) } # go through all variance parameters for(i in 1:dimSigma){ # compute first derivative of the penalized Fisher info (-> of Sigma^-1) # with respect to the i-th element of Sigma (= kronecker prod. of Sigmai and identity matrix) # Harville Ch15, Eq. 8.15: (d/d i)S^-1 = - S^-1 * (d/d i) S * S^-1 SigmaiInv.d1i <- Sigmai.inv %*% d1Sigma[,,i] dSi <- -SigmaiInv.d1i %*% Sigmai.inv dS.i <- getSigma(dimSigma=dimVar,dimBlocks=dimBlocks,Sigmai=dSi) dS.i <- dS2sparse(dS.i) # compute second derivatives for(j in i:dimSigma){ # compute (d/d j) S^-1 SigmaiInv.d1j <- Sigmai.inv %*% d1Sigma[,,j] dSj <- -SigmaiInv.d1j %*% Sigmai.inv dS.j <- getSigma(dimSigma=dimVar,dimBlocks=dimBlocks,Sigmai=dSj) dS.j <- dS2sparse(dS.j) # compute (d/di dj) S^-1 #dS.ij <- getSigma(dimSigma=dimVar,dimBlocks=dimBlocks, # Sigmai=d2Sigma[[i]][,,j]) # compute second derivatives of Sigma^-1 (Harville Ch15, Eq 9.2) d2S <- (- Sigmai.inv %*% d2Sigma[[i]][,,j] + SigmaiInv.d1i %*% SigmaiInv.d1j + SigmaiInv.d1j %*% SigmaiInv.d1i) %*% Sigmai.inv dSij <- getSigma(dimSigma=dimVar,dimBlocks=dimBlocks,Sigmai=d2S) #d2lpen.i <- -0.5* t(randomEffects) %*% dSij %*% randomEffects # ~85% faster implementation using crossprod() avoiding "slow" t(): d2lpen.i <- -0.5 * crossprod(randomEffects, dSij) %*% randomEffects # compute second derivative of log-determinant of penFisher mpart1 <- dS.j %*% F.inv.RE # 3 times as fast as the other way round mpart2 <- dS.i %*% F.inv.RE mpart <- mpart1 %*% mpart2 ## speed-ups: - tr(F.inv.RE %*% dSij) simply equals sum(F.inv.RE * dSij) ## - accelerate matrix product by sparse matrices dS.i and dS.j ## - use cyclic permutation of trace: ## tr(F.inv.RE %*% dS.j %*% F.inv.RE %*% dS.i) = ## tr(dS.j %*% F.inv.RE %*% dS.i %*% F.inv.RE) tr.d2logDetF <- -sum(Matrix::diag(mpart)) + sum(F.inv.RE * dSij) marg.hesse[i,j] <- marg.hesse[j,i] <- d2logDet[i,j] + d2lpen.i - 0.5 * tr.d2logDetF } } marg.Fisher <- as.matrix(-marg.hesse) return(marg.Fisher) } ## first and second derivatives of the covariance matrix dSigma1 <- function(sd,corr){ derivs <- array(2*exp(2*sd), c(1,1,1)) return(derivs) } #d1: result of dSigma1 d2Sigma1 <- function(sd,corr,d1){ return(list(dsd1=2*d1)) } dSigma2 <- function(sd,corr){ derivs <- array(0,c(2,2,3)) dSigma <- diag(2*exp(2*sd)) if(length(corr)>0){ dSigma[1,2] <- dSigma[2,1] <- exp(sum(sd[1:2]))*corr[1]/sqrtOf1pr2(corr[1]) # derivative of corr_1 derivs[2,1,3] <- derivs[1,2,3] <- exp(sum(sd[1:2]))/(sqrtOf1pr2(corr[1])^3) } derivs[,,1:2] <- dSigma # derivative of sd_1 derivs[2,2,1] <- 0 # derivative of sd_2 derivs[1,1,2] <- 0 return(derivs) } d2Sigma2 <- function(sd,corr, d1){ derivs <- array(0,c(2,2,3)) result <- list(dsd1=d1, dsd2=derivs, dcorr1=derivs) result$dsd1[1,1,1] <- 2*d1[1,1,1] result$dsd1[2,2,2] <- 0 result$dsd2[,,2:3]<- d1[,,2:3] result$dsd2[2,2,2] <- 2*d1[2,2,2] if(length(corr)>0){ result$dcorr1[2,1,3] <- result$dcorr1[1,2,3] <- -(3*corr[1]*exp(sum(sd[1:2])))/(sqrtOf1pr2(corr[1])^5) } return(result) } dSigma3 <- function(sd,corr){ derivs <- array(0,c(3,3,6)) dSigma <- diag(2*exp(2*sd)) # if(length(corr)>0){ dSigma[1,2] <- dSigma[2,1] <- exp(sum(sd[1:2]))*corr[1]/sqrtOf1pr2(corr[1]) # dSigma[1,3] <- dSigma[3,1] <- exp(sum(sd[c(1,3)]))*corr[2]/sqrtOf1pr2(corr[2]) # dSigma[2,3] <- dSigma[3,2] <- exp(sum(sd[c(2,3)]))*(corr[1]*corr[2]*sqrtOf1pr2(corr[3])+corr[3])/prod(sqrtOf1pr2(corr[1:3]))# # derivative of corr_1 derivs[2,1,4] <- derivs[1,2,4] <- exp(sum(sd[1:2]))/(sqrtOf1pr2(corr[1])^3) derivs[3,2,4] <- derivs[2,3,4] <-(exp(sum(sd[2:3]))*(corr[2]*sqrtOf1pr2(corr[3])-prod(corr[c(1,3)])))/ (prod(sqrtOf1pr2(corr[2:3]))*(sqrtOf1pr2(corr[1])^3))# # derivative of corr_2 derivs[3,1,5] <- derivs[1,3,5] <- exp(sum(sd[c(3,1)]))/(sqrtOf1pr2(corr[2])^3)# derivs[3,2,5] <- derivs[2,3,5] <- (exp(sum(sd[2:3]))*(corr[1]*sqrtOf1pr2(corr[3])-prod(corr[c(2,3)])))/ (prod(sqrtOf1pr2(corr[c(1,3)]))*(sqrtOf1pr2(corr[2])^3)) # # derivative of corr_3 derivs[3,2,6] <- derivs[2,3,6] <- exp(sum(sd[2:3]))/ (prod(sqrtOf1pr2(corr[c(1,2)]))*(sqrtOf1pr2(corr[3])^3)) } derivs[,,1:3] <- dSigma # derivative of sd_1 derivs[2:3,2:3,1] <- 0 # derivative of sd_2 derivs[1,c(1,3),2] <- derivs[3,c(1,3),2] <- 0 # derivative of sd_3 derivs[1:2,1:2,3] <- 0 return(derivs) } d2Sigma3 <- function(sd,corr, d1) { derivs <- array(0,c(3,3,6)) result <- list(dsd1=d1, dsd2=derivs, dsd3=derivs, dcorr1=derivs, dcorr2=derivs, dcorr3=derivs) result$dsd1[1,1,1] <- 2*d1[1,1,1] result$dsd1[2,2:3,2] <- result$dsd1[3,2,2] <- 0 result$dsd1[2:3,2:3,3] <- 0 # result$dsd2[,,2]<- d1[,,2] result$dsd2[2,2,2] <- 2*d1[2,2,2] result$dsd2[3,2,3] <- result$dsd2[2,3,3] <- d1[3,2,3]# result$dsd3[,,3]<- d1[,,3] result$dsd3[3,3,3] <- 2*d1[3,3,3]# if (length(corr)>0) { result$dsd1[2:3,2:3,4] <- 0 result$dsd1[2:3,2:3,5] <- 0 result$dsd1[,,6] <- 0 result$dsd2[,,c(4,6)] <- d1[,,c(4,6)] result$dsd2[3,2,5] <- result$dsd2[2,3,5] <- d1[3,2,5] result$dsd3[3,2,4] <- result$dsd3[2,3,4] <- d1[3,2,4] result$dsd3[,,c(5,6)] <- d1[,,c(5,6)] # derivative of corr_1 result$dcorr1[2,1,4] <- result$dcorr1[1,2,4] <- -(exp(sum(sd[1:2]))*3*corr[1])/(sqrtOf1pr2(corr[1])^5) # result$dcorr1[3,2,4] <- result$dcorr1[2,3,4] <- -(exp(sum(sd[2:3]))*(corr[1]*(3*corr[2]*sqrtOf1pr2(corr[3])-2*prod(corr[c(1,3)])) + corr[3]) )/ (prod(sqrtOf1pr2(corr[2:3]))*(sqrtOf1pr2(corr[1])^5)) # result$dcorr1[3,2,5] <- result$dcorr1[2,3,5] <- (exp(sum(sd[2:3]))*(sqrtOf1pr2(corr[3])+prod(corr[1:3])))/ (prod(sqrtOf1pr2(corr[c(1,2)])^3)*sqrtOf1pr2(corr[3])) result$dcorr1[3,2,6] <- result$dcorr1[2,3,6] <- -(exp(sum(sd[2:3]))*corr[1])/ (prod(sqrtOf1pr2(corr[c(1,3)])^3)*sqrtOf1pr2(corr[2])) # derivative of corr_2 result$dcorr2[3,1,5] <- result$dcorr2[1,3,5] <- -(exp(sum(sd[c(3,1)]))*3*corr[2])/(sqrtOf1pr2(corr[2])^5) result$dcorr2[3,2,5] <- result$dcorr2[2,3,5] <- -(exp(sum(sd[2:3]))*(corr[2]*(3*corr[1]*sqrtOf1pr2(corr[3])-2*prod(corr[c(2,3)])) + corr[3]) )/ (prod(sqrtOf1pr2(corr[c(1,3)]))*(sqrtOf1pr2(corr[2])^5)) result$dcorr2[3,2,6] <- result$dcorr2[2,3,6] <- -exp(sum(sd[2:3]))*corr[2] / # SM @ 14/05/13: formula fixed, marFisher() # and hhh4()$Sigma.cov[5,6] are now correct (prod(sqrtOf1pr2(corr[c(2,3)])^3)*sqrtOf1pr2(corr[1])) # derivative of corr_3 result$dcorr3[3,2,6] <- result$dcorr3[2,3,6] <- -(exp(sum(sd[2:3]))*3*corr[3])/ (prod(sqrtOf1pr2(corr[c(1,2)]))*sqrtOf1pr2(corr[3])^5) } return(result) } ### Various optimizers updateParams_nlminb <- function (start, ll, sc, fi, ..., control) { lower <- control[["lower"]]; control$lower <- NULL upper <- control[["upper"]]; control$upper <- NULL scale <- control[["scale"]]; control$scale <- NULL negll <- function (x, ...) -ll(x, ...) negsc <- function (x, ...) -sc(x, ...) ## run the optimization res <- nlminb(start, negll, gradient=negsc, hessian=fi, ..., scale=scale, control=control, lower=lower, upper=upper) if (any(is.finite(c(lower, upper)))) checkParBounds(res$par, lower, upper) ## Done list(par=res$par, ll=-res$objective, rel.tol=getRelDiff(res$par, start), convergence=res$convergence, message=res$message) } updateParams_nr <- function (start, ll, sc, fi, ..., control) { ## objective function llscfi <- function (x, ...) { loglik <- ll(x, ...) attr(loglik, "score") <- sc(x, ...) attr(loglik, "fisher") <- fi(x, ...) loglik } ## run the optimization res <- newtonRaphson(start, llscfi, ..., control=control, verbose=control$verbose) ## Done list(par=res$coefficients, ll=res$loglikelihood, rel.tol=getRelDiff(res$coefficients, start), convergence=res$convergence, message=res$message) } updateParams_nlm <- function (start, ll, sc, fi, ..., control) { ## objective function negllscfi <- function (x, ...) { negloglik <- -ll(x, ...) attr(negloglik, "gradient") <- -sc(x, ...) attr(negloglik, "hessian") <- fi(x, ...) negloglik } ## run the optimization res <- do.call("nlm", args=c(alist(p=start, f=negllscfi, ...), control)) ## Done list(par=res$estimate, ll=-res$minimum, rel.tol=getRelDiff(res$estimate, start), convergence=as.numeric(res$code>2), message=res$message) ## nlm returns convergence status in $code, 1-2 indicate convergence, ## 3-5 indicate non-convergence } updateParams_optim <- function (start, ll, sc, fi, ..., control) { ## Note: "fi" is not used in optim method <- control[["method"]]; control$method <- NULL lower <- control[["lower"]]; control$lower <- NULL upper <- control[["upper"]]; control$upper <- NULL res <- optim(start, ll, sc, ..., # Note: control$fnscale is negative method=method, lower=lower, upper=upper, control=control) if (any(is.finite(c(lower, upper)))) checkParBounds(res$par, lower, upper) ## Done list(par=res$par, ll=res$value, rel.tol=getRelDiff(res$par, start), convergence=res$convergence, message=res$message) } ## Calculate relative parameter change criterion. ## We use a weaker criterion than the maximum relative parameter change ## max(abs(sd.corr.new/sd.corr - 1)) getRelDiff <- function (final, start) max(abs(final - start)) / max(abs(start)) checkParBounds <- function (par, lower, upper) { if (is.null(names(par))) names(par) <- seq_along(par) if (any(atl <- par <= lower)) cat("WARNING: parameters reached lower bounds:", paste(names(par)[atl], par[atl], sep="=", collapse=", "), "\n") if (any(atu <- par >= upper)) cat("WARNING: parameters reached upper bounds:", paste(names(par)[atu], par[atu], sep="=", collapse=", "), "\n") } ## default control arguments for updates defaultOptimControl <- function (method = "nlminb", lower = -Inf, upper = Inf, iter.max = NULL, verbose = 0) { if (is.null(iter.max)) iter.max <- 20 + 280*(method=="Nelder-Mead") lowVerbose <- verbose %in% 0:2 luOptimMethod <- method %in% c("Brent", "L-BFGS-B") defaults.nr <- list(scoreTol=1e-5, paramTol=1e-7, F.inc=0.01, stepFrac=0.5, niter=iter.max, verbose=verbose) defaults.nlminb <- list(iter.max=iter.max, scale=1, lower=lower, upper=upper, trace=if(lowVerbose) c(0,0,5)[verbose+1] else 1) defaults.nlm <- list(iterlim=iter.max, check.analyticals=FALSE, print.level=if(lowVerbose) c(0,0,1)[verbose+1] else 2) defaults.optim <- list(maxit=iter.max, fnscale=-1, trace=max(0,verbose-1), lower=if (luOptimMethod) lower else -Inf, upper=if (luOptimMethod) upper else Inf) defaults <- switch(method, "nr" = defaults.nr, "nlm" = defaults.nlm, "nlminb" = defaults.nlminb, defaults.optim) return(defaults) } setOptimControl <- function (method, control, ...) { defaults <- defaultOptimControl(method, ...) cntrl <- modifyList(defaults, control) ## ensure fnscale < 0 (optim performs minimization) if (!is.null(cntrl$fnscale)) { # i.e., using optim() cntrl$method <- method # append method to control list if (cntrl$fnscale > 0) cntrl$fnscale <- -cntrl$fnscale } cntrl } ## fitHHH is the main workhorse where the iterative optimization is performed fitHHH <- function(theta, sd.corr, model, cntrl.stop=list(tol=1e-5, niter=100), cntrl.regression=list(method="nlminb"), cntrl.variance=list(method="nlminb"), verbose=0, shrinkage=FALSE) { dimFE.d.O <- model$nFE + model$nd + model$nOverdisp dimRE <- model$nRE getUpdater <- function (cntrl, start, ...) { method <- cntrl$method; cntrl$method <- NULL if (length(start) == 1 && method == "Nelder-Mead") { method <- "Brent" cat("NOTE: switched optimizer from \"Nelder-Mead\" to \"Brent\"", " (dim(", deparse(substitute(start)), ")=1)\n", sep="") } list(paste("updateParams", if (method %in% c("nlminb", "nlm", "nr")) method else "optim", sep="_"), control = setOptimControl(method, cntrl, ...)) } ## set optimizer for regression parameters updateRegressionControl <- getUpdater(cntrl.regression, theta, iter.max=if(dimRE==0) 100, verbose=verbose+(dimRE==0)) updateRegression <- function (theta, sd.corr) do.call(updateRegressionControl[[1]], alist(theta, penLogLik, penScore, penFisher, sd.corr=sd.corr, model=model, control=updateRegressionControl[[2]])) ## set optimizer for variance parameters updateVarianceControl <- getUpdater(cntrl.variance, sd.corr, lower=-5, upper=5, verbose=verbose) updateVariance <- function (sd.corr, theta, fisher.unpen) do.call(updateVarianceControl[[1]], alist(sd.corr, marLogLik, marScore, marFisher, theta=theta, model=model, fisher.unpen=fisher.unpen, control=updateVarianceControl[[2]])) ## Let's go if (verbose>0) { cat(as.character(Sys.time()), ":", if (dimRE == 0) "Optimization of regression parameters" else "Iterative optimization of regression & variance parameters", "\n") } if (dimRE == 0) { # optimization of regression coefficients only parReg <- updateRegression(theta, sd.corr) theta <- parReg$par convergence <- parReg$convergence } else { # swing between updateRegression & updateVariance convergence <- 99 i <- 0 while(convergence != 0 && (i < cntrl.stop$niter)){ i <- i+1 if (verbose>0) cat("\n") ## update regression coefficients parReg <- updateRegression(theta, sd.corr) theta <- parReg$par fisher.unpen <- attr(penFisher(theta, sd.corr, model, attributes=TRUE), "fisher") if(verbose>0) cat("Update of regression parameters: max|x_0 - x_1| / max|x_0| =", parReg$rel.tol, "\n") if(parReg$convergence!=0) { if (!is.null(parReg$message)) print(parReg$message) cat("Update of regression coefficients in iteration ", i, " unreliable\n") } if(parReg$convergence >20 && shrinkage){ cat("\n\n***************************************\nshrinkage", 0.1*theta[abs(theta)>10],"\n") theta[abs(theta)>10] <- 0.1*theta[abs(theta)>10] diag(fisher.unpen) <- diag(fisher.unpen)+1e-2 } ## update variance parameters parVar <- updateVariance(sd.corr, theta, fisher.unpen) if(verbose>0) cat("Update of variance parameters: max|x_0 - x_1| / max|x_0| =", parVar$rel.tol, "\n") if(parVar$convergence!=0) { if (!is.null(parVar$message)) print(parVar$message) cat("Update of variance parameters in iteration ", i, " unreliable\n") } ## NA values in sd.corr cause a stop() already in marLogLik() ## if(any(is.na(parVar$par))){ ## updateVarianceControl[[1]] <- "updateParams_optim" ## updateVarianceControl[[2]]$method <- ## if (length(sd.corr) == 1L) "Brent" else "Nelder-Mead" ## cat("WARNING: at least one updated variance parameter is not a number\n", ## "\t-> NO UPDATE of variance\n", ## "\t-> SWITCHING to robust", dQuote(updateVarianceControl[[2]]$method), ## "for variance updates\n") ## } else sd.corr <- parVar$par ## overall convergence ? if( (parReg$rel.tol < cntrl.stop$tol) && (parVar$rel.tol < cntrl.stop$tol) && (parReg$convergence==0) && (parVar$convergence==0) ) convergence <- 0 ## exit loop if no more change in parameters (maybe false convergence) if (parReg$rel.tol == 0 && parVar$rel.tol == 0) break } } if(verbose > 0) { cat("\n") cat(as.character(Sys.time()), ":", if (convergence==0) "Optimization converged" else "Optimization DID NOT CONVERGE", "\n\n") } ll <- penLogLik(theta=theta,sd.corr=sd.corr,model=model) fisher <- penFisher(theta=theta,sd.corr=sd.corr,model=model) fisher.var <- marFisher(sd.corr=sd.corr, theta=theta, model=model, fisher.unpen=fisher.unpen) list(fixef=head(theta,dimFE.d.O), ranef=tail(theta,dimRE), sd.corr=sd.corr, loglik=ll, fisher=fisher, fisherVar=fisher.var, convergence=convergence, dim=c(fixed=dimFE.d.O,random=dimRE)) } ############## addSeason2formula <- function(f=~1, # formula to start with S=1, # number of sine/cosine pairs period=52, timevar="t" ){ # return formula as is if S = 0 if(max(S) == 0) return(f) f <- paste(deparse(f), collapse="") # create formula if(length(S)==1 && S>0){ for(i in 1:S){ f <- paste0(f, " + sin(",2*i,"*pi*",timevar,"/",period,")", " + cos(",2*i,"*pi*",timevar,"/",period,")") } } else { for(i in 1:max(S)){ which <- paste(i <= S,collapse=",") f <- paste0(f, " + fe( sin(",2*i,"*pi*",timevar,"/",period,"), which=c(",which,"))", " + fe( cos(",2*i,"*pi*",timevar,"/",period,"), which=c(",which,"))") } } return(as.formula(f, env=.GlobalEnv)) } ## check analytical score functions and Fisher informations for ## a given model (the result of interpretControl(control, stsObj)) ## and given parameters theta (regression par.) and sd.corr (variance par.). ## This is a wrapper around functionality of the numDeriv and maxLik packages. checkAnalyticals <- function (model, theta, sd.corr, methods=c("numDeriv","maxLik")) { cat("\nPenalized log-likelihood:\n") resCheckPen <- sapply(methods, function(derivMethod) { if (requireNamespace(derivMethod)) { do.call(paste("checkDerivatives", derivMethod, sep="."), args=alist(penLogLik, penScore, penFisher, theta, sd.corr=sd.corr, model=model)) } }, simplify=FALSE, USE.NAMES=TRUE) if (length(resCheckPen) == 1L) resCheckPen <- resCheckPen[[1L]] resCheckMar <- if (length(sd.corr) == 0L) list() else { cat("\nMarginal log-likelihood:\n") fisher.unpen <- attr(penFisher(theta, sd.corr, model, attributes=TRUE), "fisher") resCheckMar <- sapply(methods, function(derivMethod) { if (requireNamespace(derivMethod)) { do.call(paste("checkDerivatives", derivMethod, sep="."), args=alist(marLogLik, marScore, marFisher, sd.corr, theta=theta, model=model, fisher.unpen=fisher.unpen)) } }, simplify=FALSE, USE.NAMES=TRUE) if (length(resCheckMar) == 1L) resCheckMar[[1L]] else resCheckMar } list(pen = resCheckPen, mar = resCheckMar) } surveillance/R/AllClass.R0000644000176000001440000000224612165246327015034 0ustar ripleyusers# ------------- class sts ---------------------------------------- setClass( "sts", representation(epoch = "numeric", ##this slot used to be named week freq = "numeric", start = "numeric", observed = "matrix", state = "matrix", alarm = "matrix", upperbound = "matrix", neighbourhood= "matrix", populationFrac= "matrix", map = "SpatialPolygons", control = "list", #New slots added to handle proportion time series epochAsDate="logical", multinomialTS="logical")) ###################################################################### # Definition of the stsBP class for backprojections. ###################################################################### setClass( "stsBP", representation(ci = "array", lambda = "array"), contains = "sts") surveillance/R/twinstim.R0000644000176000001440000015546412237174420015221 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Maximum Likelihood inference for the two-component spatio-temporal intensity ### model described in Meyer et al (2012), DOI: 10.1111/j.1541-0420.2011.01684.x ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ twinstim <- function ( endemic, epidemic, siaf, tiaf, qmatrix = data$qmatrix, data, subset, t0 = data$stgrid$start[1], T = tail(data$stgrid$stop,1), na.action = na.fail, start = NULL, partial = FALSE, control.siaf = list(F=list(), Deriv=list()), optim.args = list(), finetune = FALSE, model = FALSE, cumCIF = TRUE, cumCIF.pb = interactive(), cores = 1, verbose = TRUE ) { #################### ### Preparations ### #################### ptm <- proc.time() cl <- match.call() partial <- as.logical(partial) finetune <- if (partial) FALSE else as.logical(finetune) useParallel <- cores > 1L && requireNamespace("parallel") ## # Collect polyCub.midpoint warnings (and apply unique on them at the end) ## .POLYCUB.WARNINGS <- NULL ## .polyCub <- function (...) { ## int <- withCallingHandlers( ## polyCub.midpoint(...), ## warning = function (w) { ## .POLYCUB.WARNINGS <<- c(.POLYCUB.WARNINGS, list(w)) ## invokeRestart("muffleWarning") ## }) ## } # Clean the model environment when exiting the function on.exit(suppressWarnings(rm(cl, cumCIF, cumCIF.pb, data, doHessian, eventDists, eventsData, finetune, neghess, fisherinfo, fit, fixed, functions, globalEndemicIntercept, h.Intercept, inmfe, initpars, ll, negll, loglik, msgConvergence, msgNotConverged, mfe, mfhEvents, mfhGrid, model, my.na.action, na.action, namesOptimUser, namesOptimArgs, nlminbControl, nlminbRes, nlmObjective, nlmControl, nlmRes, nmRes, optim.args, optimArgs, control.siaf, optimMethod, optimRes, optimRes1, optimValid, origenv.endemic, origenv.epidemic, partial, partialloglik, ptm, qmatrix, res, negsc, score, start, subset, tmpexpr, typeSpecificEndemicIntercept, useScore, verbose, whichfixed, inherits = FALSE))) ### Verify that 'data' inherits from "epidataCS" if (!inherits(data, "epidataCS")) { stop("'data' must inherit from class \"epidataCS\"") } ### Check time range if (!isScalar(t0) || !isScalar(T)) { stop("endpoints 't0' and 'T' must be single numbers") } if (T <= t0) { stop("'T' must be greater than 't0'") } if (!t0 %in% data$stgrid$start) { justBeforet0 <- match(TRUE, data$stgrid$start > t0) - 1L # if 't0' is beyond the time range covered by 'data$stgrid' if (is.na(justBeforet0)) justBeforet0 <- length(data$stgrid$start) # t0 was too big if (justBeforet0 == 0L) justBeforet0 <- 1L # t0 was too small t0 <- data$stgrid$start[justBeforet0] message("replaced 't0' by the value ", t0, " (must be a 'start' time of 'data$stgrid')") } if (!T %in% data$stgrid$stop) { justAfterT <- match(TRUE, data$stgrid$stop > T) # if 'T' is beyond the time range covered by 'data$stgrid' if (is.na(justAfterT)) justAfterT <- length(data$stgrid$stop) # T was too big T <- data$stgrid$stop[justAfterT] message("replaced 'T' by the value ", T, " (must be a 'stop' time of 'data$stgrid')") } ### Subset events eventsData <- if (missing(subset)) data$events@data else { do.call("subset.data.frame", args = list( x = quote(data$events@data), subset = cl$subset, drop = FALSE )) } ############################################################# ### Build up a model.frame for both components separately ### ############################################################# ########################## ### epidemic component ### ########################## ### Parse epidemic formula if (missing(epidemic)) { origenv.epidemic <- .GlobalEnv epidemic <- ~ 0 } else { origenv.epidemic <- environment(epidemic) environment(epidemic) <- environment() ## such that t0 and T are found in the subset expression below } epidemic <- terms(epidemic, data = eventsData, keep.order = TRUE) if (!is.null(attr(epidemic, "offset"))) { warning("offsets are not implemented for the 'epidemic' component") } ### Generate model frame # na.action mod such that for simulated epidataCS, where events of the # prehistory have missing 'BLOCK' indexes, those NA's do not matter. # ok because actually, 'eventBlocks' are only used in the partial likelihood # and there only eventBlocks[includes] is used (i.e. no prehistory events) my.na.action <- function (object, ...) { prehistevents <- object[object[["(time)"]] <= t0, "(ID)"] if (length(prehistevents) == 0L) return(na.action(object, ...)) origprehistblocks <- object[match(prehistevents,object[["(ID)"]]), "(BLOCK)"] object[object[["(ID)"]] %in% prehistevents, "(BLOCK)"] <- 0L xx <- na.action(object, ...) xx[match(prehistevents,xx[["(ID)"]],nomatch=0L), "(BLOCK)"] <- origprehistblocks[prehistevents %in% xx[["(ID)"]]] xx } ID <- tile <- type <- BLOCK <- .obsInfLength <- .bdist <- "just cheating on codetools::checkUsage" mfe <- model.frame(epidemic, data = eventsData, subset = time + eps.t > t0 & time <= T, # here we can have some additional rows (individuals) compared to mfhEvents, which is established below! # Namely those with time in (t0-eps.t; t0], i.e. still infective individuals, which are part of the prehistory of the process na.action = my.na.action, # since R 2.10.0 patched also works with epidemic = ~1 and na.action=na.fail (see PR#14066) drop.unused.levels = FALSE, ID = ID, time = time, tile = tile, type = type, eps.t = eps.t, eps.s = eps.s, BLOCK = BLOCK, obsInfLength = .obsInfLength, bdist = .bdist) rm(ID, tile, type, BLOCK, .obsInfLength, .bdist) ### Extract essential information from model frame # inmfe=rowindex(data$events@data) is necessary for subsetting # influenceRegion (list object not compatible with model.frame) and # coordinates # CAVE: ID is not necessarily identical to the rowindex of data$events, # e.g., if working with subsetted epidataCS inmfe <- which(data$events@data$ID %in% mfe[["(ID)"]]) N <- length(inmfe) # mfe also contains events of the prehistory eventTimes <- mfe[["(time)"]] # I don't use model.extract since it returns named vectors # Indicate events after t0, which are actually part of the process # (events in (-Inf;t0] only contribute in sum over infected individuals) includes <- which(eventTimes > t0) # this indexes mfe! Nin <- length(includes) if (Nin == 0L) { stop("none of the ", nrow(data$events@data), " supplied ", "events is in the model (check 'subset', 't0' and 'T')") } eventBlocks <- mfe[["(BLOCK)"]] # only necessary for partial log-likelihood eventTypes <- factor(mfe[["(type)"]]) # drop unused levels typeNames <- levels(eventTypes) nTypes <- length(typeNames) if (verbose && nTypes > 1L) cat("marked point pattern of", nTypes, "types\n") qmatrix <- checkQ(qmatrix, typeNames) # we only need the integer codes for the calculations eventTypes <- as.integer(eventTypes) ### Generate model matrix mme <- model.matrix(epidemic, mfe) q <- ncol(mme) hase <- q > 0L ### Extract further model components (only if q > 0) if (hase) { eps.t <- mfe[["(eps.t)"]] removalTimes <- eventTimes + eps.t eps.s <- mfe[["(eps.s)"]] bdist <- mfe[["(bdist)"]] gIntUpper <- mfe[["(obsInfLength)"]] gIntLower <- pmax(0, t0-eventTimes) eventCoords <- coordinates(data$events)[inmfe,,drop=FALSE] eventDists <- as.matrix(dist(eventCoords, method = "euclidean")) influenceRegion <- data$events@data$.influenceRegion[inmfe] iRareas <- sapply(influenceRegion, attr, "area", simplify=TRUE, USE.NAMES=FALSE) # determine possible event sources (need to re-do this because # subsetting has crashed old row indexes from the epidataCS object) # actually only eventSources of includes are needed eventSources <- lapply(seq_len(N), function (i) determineSources(i, eventTimes, removalTimes, eventDists[i,], eps.s, eventTypes, qmatrix)) # calculate sum_{k=1}^K q_{kappa_j,k} for all j = 1:N qSum <- unname(rowSums(qmatrix)[eventTypes]) # N-vector } else if (verbose) message("no epidemic component in model") ### Drop "terms" and restore original formula environment epidemic <- formula(epidemic) environment(epidemic) <- origenv.epidemic ######################### ### endemic component ### ######################### ### Parse endemic formula if (missing(endemic)) { origenv.endemic <- .GlobalEnv endemic <- ~ 0 } else { origenv.endemic <- environment(endemic) environment(endemic) <- environment() ## such that t0 and T are found in the subset expressions below } endemic <- terms(endemic, data = data$stgrid, keep.order = TRUE) ## check for type-specific endemic intercept and remove it from the formula ## (will be handled separately) typeSpecificEndemicIntercept <- "1 | type" %in% attr(endemic, "term.labels") if (typeSpecificEndemicIntercept) { endemic <- update(endemic, ~ . - (1|type)) # this drops the terms attributes endemic <- terms(endemic, data = data$stgrid, keep.order = TRUE) } globalEndemicIntercept <- if (typeSpecificEndemicIntercept) { attr(endemic, "intercept") <- 1L # we need this to ensure that we have correct contrasts FALSE } else attr(endemic, "intercept") == 1L nbeta0 <- globalEndemicIntercept + typeSpecificEndemicIntercept * nTypes ### Generate endemic model frame and model matrix on event data ID <- "just cheating on codetools::checkUsage" mfhEvents <- model.frame(endemic, data = eventsData, subset = time>t0 & time<=T & ID %in% mfe[["(ID)"]], na.action = na.fail, # since R 2.10.0 patched also works with # endemic = ~1 (see PR#14066) drop.unused.levels = FALSE) rm(ID) mmhEvents <- model.matrix(endemic, mfhEvents) # exclude intercept from endemic model matrix below, will be treated separately if (nbeta0 > 0) mmhEvents <- mmhEvents[,-1,drop=FALSE] #stopifnot(nrow(mmhEvents) == Nin) p <- ncol(mmhEvents) hash <- (nbeta0+p) > 0L ### Generate model frame and model matrix on grid data (only if p > 0) if (hash) { offsetEvents <- model.offset(mfhEvents) BLOCK <- tile <- area <- "just cheating on codetools::checkUsage" mfhGrid <- model.frame(endemic, data = data$stgrid, subset = start >= t0 & stop <= T, na.action = na.fail, # since R 2.10.0 patched also works with # endemic = ~1 (see PR#14066) drop.unused.levels = FALSE, BLOCK=BLOCK, tile=tile, dt=stop-start, ds=area) # 'tile' is redundant here for fitting but useful # for debugging & necessary for intensityplots rm(BLOCK, tile, area) gridBlocks <- mfhGrid[["(BLOCK)"]] histIntervals <- unique(data$stgrid[c("BLOCK", "start", "stop")]) # sorted rownames(histIntervals) <- NULL histIntervals <- histIntervals[histIntervals$start >= t0 & histIntervals$stop <= T,] gridTiles <- mfhGrid[["(tile)"]] # only needed for intensityplot mmhGrid <- model.matrix(endemic, mfhGrid) nGrid <- nrow(mmhGrid) # exclude intercept from endemic model matrix below, will be treated separately if (nbeta0 > 0) mmhGrid <- mmhGrid[,-1,drop=FALSE] # Extract endemic model components offsetGrid <- model.offset(mfhGrid) dt <- mfhGrid[["(dt)"]] ds <- mfhGrid[["(ds)"]] ## expression to calculate the endemic part on the grid -> .hIntTW() if (p > 0L) { hGridExpr <- quote(drop(mmhGrid %*% beta)) if (!is.null(offsetGrid)) hGridExpr <- call("+", quote(offsetGrid), hGridExpr) } else { hGridExpr <- if (is.null(offsetGrid)) quote(numeric(nGrid)) else quote(offsetGrid) } hGridExpr <- call("exp", hGridExpr) ## expression to calculate the endemic part for the events -> .hEvents() hEventsExpr <- if (p > 0L) { quote(drop(mmhEvents %*% beta)) } else { quote(numeric(Nin)) } if (nbeta0 == 1L) { # global intercept hEventsExpr <- call("+", quote(beta0), hEventsExpr) } else if (nbeta0 > 1L) { # type-specific intercept hEventsExpr <- call("+", quote(beta0[eventTypes]), hEventsExpr) } if (!is.null(offsetEvents)) hEventsExpr <- call("+", quote(offsetEvents), hEventsExpr) hEventsExpr <- call("exp", hEventsExpr) } else if (verbose) message("no endemic component in model") ### Drop "terms" and restore original formula environment endemic <- if (typeSpecificEndemicIntercept) { ## re-add it to the endemic formula update.formula(formula(endemic), ~ (1|type) + .) } else formula(endemic) environment(endemic) <- origenv.endemic ### Check that there is at least one parameter if (!hash && !hase) { stop("nothing to do: neither endemic nor epidemic parts were specified") } ############################# ### Interaction functions ### ############################# if (hase) { ## Check interaction functions siaf <- do.call(".parseiaf", args = alist(siaf, "siaf", verbose)) constantsiaf <- attr(siaf, "constant") nsiafpars <- siaf$npars tiaf <- do.call(".parseiaf", args = alist(tiaf, "tiaf", verbose)) constanttiaf <- attr(tiaf, "constant") ntiafpars <- tiaf$npars ## Check control.siaf if (constantsiaf) control.siaf <- NULL else { stopifnot(is.null(control.siaf) || is.list(control.siaf)) if (is.list(control.siaf)) stopifnot(sapply(control.siaf, is.list)) } ## Define function that integrates the 'tiaf' function .tiafInt <- .tiafIntFUN() ## Define function that integrates the two-dimensional 'siaf' function ## over the influence regions of the events .siafInt <- .siafIntFUN(siaf = siaf, noCircularIR = all(eps.s > bdist), parallel = useParallel) .siafInt.args <- c(alist(siafpars), control.siaf$F) ## Memoisation of .siafInt ..siafInt <- if (!constantsiaf && requireNamespace("memoise")) { memoise::memoise(.siafInt) ## => speed-up optimization since 'nlminb' evaluates the loglik and ## score for the same set of parameters at the end of each iteration } else { if (!constantsiaf && verbose) message("Continuing without memoisation of 'siaf$f' cubature ...") ## However, trivial caching is used manually in case of fixed ## "siafpars" and in LambdagEvents() .siafInt } } else { if (!missing(siaf) && !is.null(siaf)) warning("'siaf' can only be modelled in conjunction with an 'epidemic' process") if (!missing(tiaf) && !is.null(tiaf)) warning("'tiaf' can only be modelled in conjunction with an 'epidemic' process") siaf <- tiaf <- NULL nsiafpars <- ntiafpars <- 0L control.siaf <- NULL } hassiafpars <- nsiafpars > 0L hastiafpars <- ntiafpars > 0L ## Can we calculate the score function? useScore <- if (partial) FALSE else if (hase) { (!hassiafpars | !is.null(siaf$deriv)) & (!hastiafpars | (!is.null(tiaf$deriv)) & !is.null(tiaf$Deriv)) } else TRUE ## Define function that applies siaf$Deriv on all events (integrate the ## two-dimensional siaf$deriv function) if (useScore && hassiafpars) { .siafDeriv <- mapplyFUN( c(alist(siaf$Deriv, influenceRegion, type=eventTypes), list(MoreArgs=quote(list(siaf$deriv, siafpars, ...)), SIMPLIFY=TRUE, USE.NAMES=FALSE)), ##<- we explicitly quote() the ...-part instead of simply including ## it in the above alist() - only to make checkUsage() happy ## depending on nsiafpars, mapply() will return an N-vector ## or a nsiafpars x N matrix => transform to N x nsiafpars: after = quote(if (is.matrix(res)) t(res) else as.matrix(res)), parallel = useParallel) .siafDeriv.args <- c(alist(siafpars), control.siaf$Deriv) } ############################################################################ ### Log-likelihood function, score function, expected Fisher information ### ############################################################################ ### Total number of parameters (= length of 'theta') npars <- nbeta0 + p + q + nsiafpars + ntiafpars # REMINDER: # theta - parameter vector c(beta0, beta, gamma, siafpars, tiafpars), where # beta0 - endemic intercept (maybe type-specific) # beta - other parameters of the endemic component exp(offset + eta_h(t,s)) # gamma - parameters of the epidemic term exp(eta_e(t,s)) # siafpars- parameters of the epidemic spatial interaction function # tiafpars- parameters of the epidemic temporal interaction function # mmh[Events/Grid] - model matrix related to beta, i.e the endemic component, # either for events only or for the whole spatio-temporal grid # offset[Events/Grid] - offset vector related to the endemic component (can be NULL), # either for events only or for the whole spatio-temporal grid # dt, ds - columns of the spatio-temporal grid (dt = stop-start, ds = area) # mme - model matrix related to gamma in the epidemic component # siaf, tiaf - spatial/temporal interaction function (NULL, list or numeric) # eventTimes, eventCoords, eventSources, gIntLower, gIntUpper, influenceRegion - # columns of the events data frame if (hash) { ### Calculates the endemic component (for i in includes -> Nin-vector) ### h(t_i,s_i,kappa_i) = exp(offset_i + beta_{0,kappa_i} + eta_h(t_i,s_i)) .hEvents <- function (beta0, beta) {} body(.hEvents) <- hEventsExpr ### Integral of the endemic component over [0;uppert] x W .hIntTW <- function (beta, score = NULL, #matrix(1,nrow(mmhGrid),1L) uppert = NULL) {} body(.hIntTW) <- as.call(c(as.name("{"), expression( subtimeidx <- if (!is.null(uppert)) { # && isScalar(uppert) && t0 <= uppert && uppert < T if (uppert == t0) return(0) # actually never happens # since uppert %in% eventTimes[includes] > t0 idx <- match(TRUE, histIntervals$stop >= uppert) firstBlockBeyondUpper <- histIntervals$BLOCK[idx] newdt <- uppert - histIntervals$start[idx] dt[gridBlocks == firstBlockBeyondUpper] <- newdt which(gridBlocks <= firstBlockBeyondUpper) } else NULL ), substitute(hGrid <- hGridExpr, list(hGridExpr=hGridExpr)), expression(sumterms <- hGrid * ds * dt), expression(if (is.null(score)) { if (is.null(subtimeidx)) sum(sumterms) else sum(sumterms[subtimeidx]) } else { if (is.null(subtimeidx)) .colSums(score * sumterms, nGrid, ncol(score)) else .colSums((score * sumterms)[subtimeidx,,drop=FALSE], length(subtimeidx), ncol(score)) }) )) } if (hase) { ### Calculates the epidemic component for all events .eEvents <- function (gammapred, siafpars, tiafpars, ncolsRes = 1L, score = matrix(1,N,ncolsRes), f = siaf$f, g = tiaf$g) # second line arguments are for score functions with defaults for loglik { e <- sapply(includes, function (i) { sources <- eventSources[[i]] nsources <- length(sources) if (nsources == 0L) rep.int(0, ncolsRes) else { scoresources <- score[sources,,drop=FALSE] predsources <- gammapred[sources] repi <- rep.int(i, nsources) sdiff <- eventCoords[repi,,drop=FALSE] - eventCoords[sources,,drop=FALSE] fsources <- f(sdiff, siafpars, eventTypes[sources]) tdiff <- eventTimes[repi] - eventTimes[sources] gsources <- g(tdiff, tiafpars, eventTypes[sources]) # if(length(predsources) != NROW(fsources) || NROW(fsources) != NROW(gsources)) browser() .colSums(scoresources * predsources * fsources * gsources, nsources, ncolsRes) } }, simplify=TRUE, USE.NAMES=FALSE) # a vector if ncolsRes=1 if (ncolsRes == 1L) e else t(e) # otherwise of dim Nin x ncolsRes } } ### Calculates the two components of the integrated intensity function ### over [0;uppert] x W x K heIntTWK <- function (beta0, beta, gammapred, siafpars, tiafpars, uppert = NULL) {} body(heIntTWK) <- as.call(c(as.name("{"), if (hash) { # endemic component expression( hIntTW <- .hIntTW(beta, uppert = uppert), .beta0 <- rep_len(if (nbeta0==0L) 0 else beta0, nTypes), fact <- sum(exp(.beta0)), hInt <- fact * hIntTW ) } else { expression(hInt <- 0) }, if (hase) { # epidemic component expression( siafInt <- do.call("..siafInt", .siafInt.args), # N-vector if (!is.null(uppert)) { # && isScalar(uppert) && t0 <= uppert && uppert < T gIntUpper <- pmin(uppert-eventTimes, eps.t) subtimeidx <- eventTimes < uppert tiafIntSub <- .tiafInt(tiafpars, from = gIntLower[subtimeidx], to = gIntUpper[subtimeidx], type = eventTypes[subtimeidx]) eInt <- sum(qSum[subtimeidx] * gammapred[subtimeidx] * siafInt[subtimeidx] * tiafIntSub) } else { tiafInt <- .tiafInt(tiafpars) eInt <- sum(qSum * gammapred * siafInt * tiafInt) } ) } else expression(eInt <- 0), expression(c(hInt, eInt)) )) ### Calculates the log-likelihood loglik <- function (theta) { # Extract parameters from theta beta0 <- theta[seq_len(nbeta0)] beta <- theta[nbeta0+seq_len(p)] gamma <- theta[nbeta0+p+seq_len(q)] siafpars <- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] # dN part of the log-likelihood hEvents <- if (hash) .hEvents(beta0, beta) else 0 eEvents <- if (hase) { gammapred <- drop(exp(mme %*% gamma)) # N-vector .eEvents(gammapred, siafpars, tiafpars) # Nin-vector! (only 'includes' here) } else 0 lambdaEvents <- hEvents + eEvents # Nin-vector llEvents <- sum(log(lambdaEvents)) # here one might have got -Inf values in case of 0-intensity at an event time # lambda integral of the log-likelihood heInt <- heIntTWK(beta0, beta, gammapred, siafpars, tiafpars) # !hase => missing(gammapred), but lazy evaluation omits an error in this case because heIntTWK doesn't ask for gammapred llInt <- sum(heInt) # Return the log-likelihood ll <- llEvents - llInt ll } ### Calculates the score vector score <- function (theta) { # Extract parameters from theta beta0 <- theta[seq_len(nbeta0)] beta <- theta[nbeta0+seq_len(p)] gamma <- theta[nbeta0+p+seq_len(q)] siafpars <- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] if (hase) { gammapred <- drop(exp(mme %*% gamma)) # N-vector hEvents <- if (hash) .hEvents(beta0, beta) else 0 eEvents <- .eEvents(gammapred, siafpars, tiafpars) # Nin-vector! (only 'includes' here) lambdaEvents <- hEvents + eEvents # Nin-vector siafInt <- do.call("..siafInt", .siafInt.args) # N-vector tiafInt <- .tiafInt(tiafpars) # N-vector } # score vector for beta hScore <- if (hash) { score_beta0 <- if (nbeta0 == 1L) local({ # global intercept sEvents <- if (hase) { hEvents / lambdaEvents } else rep.int(1, Nin) sEventsSum <- sum(sEvents) sInt <- nTypes*exp(beta0) * .hIntTW(beta) sEventsSum - unname(sInt) }) else if (nbeta0 > 1L) local({ # type-specific intercepts ind <- sapply(seq_len(nTypes), function (type) eventTypes == type, simplify=TRUE, USE.NAMES=FALSE) # logical N x nTypes matrix sEvents <- if (hase) { ind * hEvents / lambdaEvents } else ind sEventsSum <- .colSums(sEvents, N, nTypes) sInt <- exp(beta0) * .hIntTW(beta) sEventsSum - unname(sInt) }) else numeric(0L) # i.e. nbeta0 == 0L score_beta <- if (p > 0L) local({ sEvents <- if (hase) { mmhEvents * hEvents / lambdaEvents } else mmhEvents sEventsSum <- .colSums(sEvents, Nin, p) fact <- if (nbeta0 > 1L) sum(exp(beta0)) else if (nbeta0 == 1L) nTypes*exp(beta0) else nTypes sInt <- fact * .hIntTW(beta, mmhGrid) sEventsSum - sInt }) else numeric(0L) c(score_beta0, score_beta) } else numeric(0L) # score vector for gamma, siafpars and tiafpars eScore <- if (hase) { score_gamma <- local({ nom <- .eEvents(gammapred, siafpars, tiafpars, ncolsRes=q, score=mme) # Nin-vector if q=1 sEventsSum <- .colSums(nom / lambdaEvents, Nin, q) # |-> dotted version also works for vector-arguments sInt <- .colSums(mme * (qSum * gammapred * siafInt * tiafInt), N, q) sEventsSum - sInt }) score_siafpars <- if (hassiafpars && !fixedsiafpars) local({ nom <- .eEvents(gammapred, siafpars, tiafpars, ncolsRes=nsiafpars, f=siaf$deriv) sEventsSum <- .colSums(nom / lambdaEvents, Nin, nsiafpars) derivInt <- do.call(".siafDeriv", .siafDeriv.args) # N x nsiafpars matrix sInt <- .colSums(derivInt * (qSum * gammapred * tiafInt), N, nsiafpars) sEventsSum - sInt }) else numeric(nsiafpars) # if 'fixedsiafpars', this part is unused score_tiafpars <- if (hastiafpars && !fixedtiafpars) local({ nom <- .eEvents(gammapred, siafpars, tiafpars, ncolsRes=ntiafpars, g=tiaf$deriv) sEventsSum <- .colSums(nom / lambdaEvents, Nin, ntiafpars) derivIntUpper <- tiaf$Deriv(gIntUpper, tiafpars, eventTypes) derivIntLower <- tiaf$Deriv(gIntLower, tiafpars, eventTypes) derivInt <- derivIntUpper - derivIntLower # N x ntiafpars matrix sInt <- .colSums(derivInt * (qSum * gammapred * siafInt), N, ntiafpars) sEventsSum - sInt }) else numeric(ntiafpars) # if 'fixedtiafpars', this part is unused c(score_gamma, score_siafpars, score_tiafpars) } else numeric(0L) # return the score vector scorevec <- c(hScore, eScore) scorevec } ### Estimates the expected Fisher information matrix ### by the "optional variation process" (Martinussen & Scheike, p. 64), ### or see Rathbun (1996, equation (4.7)) fisherinfo <- function (theta) { # Extract parameters from theta beta0 <- theta[seq_len(nbeta0)] beta <- theta[nbeta0+seq_len(p)] gamma <- theta[nbeta0+p+seq_len(q)] siafpars <- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] # only events (intdN) part of the score function needed zeromatrix <- matrix(0, Nin, 0) if (hase) { gammapred <- drop(exp(mme %*% gamma)) # N-vector hEvents <- if (hash) .hEvents(beta0, beta) else 0 eEvents <- .eEvents(gammapred, siafpars, tiafpars) # Nin-vector! (only 'includes' here) lambdaEvents <- hEvents + eEvents # Nin-vector } # for beta hScoreEvents <- if (hash) { scoreEvents_beta0 <- if (nbeta0 > 1L) local({ # type-specific intercepts ind <- sapply(seq_len(nTypes), function (type) eventTypes == type, simplify=TRUE, USE.NAMES=FALSE) # logical N x nTypes matrix if (hase) { ind * hEvents / lambdaEvents } else ind }) else if (nbeta0 == 1L) { # global intercept if (hase) { hEvents / lambdaEvents } else matrix(1, Nin, 1L) } else zeromatrix scoreEvents_beta <- if (p > 0L) { if (hase) { mmhEvents * hEvents / lambdaEvents } else mmhEvents # Nin x p matrix } else zeromatrix unname(cbind(scoreEvents_beta0, scoreEvents_beta, deparse.level=0)) } else zeromatrix # for gamma, siafpars and tiafpars eScoreEvents <- if (hase) { scoreEvents_gamma_nom <- .eEvents(gammapred, siafpars, tiafpars, ncolsRes = q, score = mme) # Ninxq matrix scoreEvents_siafpars_nom <- if (hassiafpars) { .eEvents(gammapred, siafpars, tiafpars, ncolsRes = nsiafpars, f = siaf$deriv) # Ninxnsiafpars matrix } else zeromatrix scoreEvents_tiafpars_nom <- if (hastiafpars) { .eEvents(gammapred, siafpars, tiafpars, ncolsRes = ntiafpars, g = tiaf$deriv) # Ninxntiafpars matrix } else zeromatrix eScoreEvents_nom <- cbind(scoreEvents_gamma_nom, scoreEvents_siafpars_nom, scoreEvents_tiafpars_nom, deparse.level=0) eScoreEvents_nom / lambdaEvents } else zeromatrix scoreEvents <- cbind(hScoreEvents, eScoreEvents, deparse.level=0) ## Build the optional variation process (Martinussen & Scheike, p64) ## info <- matrix(0, nrow = npars, ncol = npars, ## dimnames = list(names(theta), names(theta))) ## for (i in 1:Nin) info <- info + crossprod(scoreEvents[i,,drop=FALSE]) ## oh dear, this is nothing else but t(scoreEvents) %*% scoreEvents crossprod(scoreEvents) } ### Calculates the partial log-likelihood for continuous space ### (Diggle et al., 2009) partialloglik <- function (theta) { # Extract parameters from theta beta0 <- theta[seq_len(nbeta0)] beta <- theta[nbeta0+seq_len(p)] gamma <- theta[nbeta0+p+seq_len(q)] siafpars <- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] # calculcate the observed intensities hEvents <- if (hash) .hEvents(beta0, beta) else 0 eEvents <- if (hase) { gammapred <- drop(exp(mme %*% gamma)) # N-vector .eEvents(gammapred, siafpars, tiafpars) # Nin-vector! (only 'includes' here) } else 0 lambdaEvents <- hEvents + eEvents # Nin-vector # calculate integral of lambda(t_i, s, kappa) over at-risk set = (observation region x types) hInts <- if (hash) { # endemic component hGrid <- eval(hGridExpr) # integral over W and types for each time block in mfhGrid fact <- if (nbeta0 > 1L) sum(exp(beta0)) else if (nbeta0 == 1L) nTypes*exp(beta0) else nTypes hInt_blocks <- fact * tapply(hGrid*ds, gridBlocks, sum, simplify=TRUE) .idx <- match(eventBlocks[includes], names(hInt_blocks)) unname(hInt_blocks[.idx]) # Nin-vector } else 0 eInts <- if (hase) { # epidemic component siafInt <- do.call("..siafInt", .siafInt.args) # N-vector gs <- gammapred * siafInt # N-vector sapply(includes, function (i) { timeSources <- determineSources(i, eventTimes, removalTimes, 0, Inf, NULL) nSources <- length(timeSources) if (nSources == 0L) 0 else { repi <- rep.int(i, nSources) tdiff <- eventTimes[repi] - eventTimes[timeSources] gsources <- tiaf$g(tdiff, tiafpars, eventTypes[timeSources]) sum(qSum[timeSources] * gs[timeSources] * gsources) } }, simplify=TRUE, USE.NAMES=FALSE) # Nin-vector } else 0 lambdaEventsIntW <- hInts + eInts # Nin-vector # Calculate and return the partial log-likelihood p <- lambdaEvents / lambdaEventsIntW # Nin-vector pll <- sum(log(p)) pll } ################################ ### Prepare for optimization ### ################################ ll <- if (partial) partialloglik else loglik functions <- list(ll = ll, sc = if (useScore) score else NULL, fi = if (useScore) fisherinfo else NULL) ### Include check for validity of siafpars and tiafpars ('validpars') in ll if (!is.null(siaf$validpars)) { body(ll) <- as.call(append(as.list(body(ll)), as.list(expression( if (hassiafpars && !siaf$validpars(siafpars)) { if (optimArgs$control$trace > 0L) cat("(invalid 'siafpars' in loglik)\n") return(-Inf) } )), after = grep("^siafpars <-", body(ll)))) } if (!is.null(tiaf$validpars)) { body(ll) <- as.call(append(as.list(body(ll)), as.list(expression( if (hastiafpars && !tiaf$validpars(tiafpars)) { if (optimArgs$control$trace > 0L) cat("(invalid 'tiafpars' in loglik)\n") return(-Inf) } )), after = grep("^tiafpars <-", body(ll)))) } ### Check that optim.args is a list or NULL if (is.null(optim.args)) { # no optimisation requested setting <- functions on.exit(rm(setting), add = TRUE) # Append model information setting$npars <- c(nbeta0 = nbeta0, p = p, q = q, nsiafpars = nsiafpars, ntiafpars = ntiafpars) setting$qmatrix <- qmatrix # -> information about nTypes and typeNames setting$formula <- list(endemic = endemic, epidemic = epidemic, siaf = siaf, tiaf = tiaf) setting$call <- cl # Return settings if (verbose) message("optimization skipped", " (returning functions in data environment)") return(setting) } else if (!is.list(optim.args)) stop("'optim.args' must be a list or NULL") ### Check initial value for theta if (is.null(optim.args[["par"]])) { # set naive defaults h.Intercept <- if (nbeta0 > 0) rep.int(crudebeta0( nEvents = Nin, offset.mean = weighted.mean(offsetGrid, ds), W.area = sum(ds[gridBlocks==histIntervals[1,"BLOCK"]]), period = T-t0, nTypes = nTypes ), nbeta0) else numeric(0L) optim.args$par <- c(h.Intercept, rep.int(0, npars - nbeta0)) } else { # check validity of par-specification if (!is.vector(optim.args$par, mode="numeric")) { stop("'optim.args$par' must be a numeric vector") } if (length(optim.args$par) != npars) { stop(gettextf(paste("'optim.args$par' (%d) does not have the same", "length as the number of unknown parameters (%d)"), length(optim.args$par), npars)) } } ## Set names for theta names(optim.args$par) <- c( if (nbeta0 > 1L) { paste0("h.type",typeNames) } else if (nbeta0 == 1L) "h.(Intercept)", if (p > 0L) paste("h", colnames(mmhEvents), sep = "."), if (hase) paste("e", colnames(mme), sep = "."), if (hassiafpars) paste("e.siaf",1:nsiafpars,sep="."), if (hastiafpars) paste("e.tiaf",1:ntiafpars,sep=".") ) ## values in "start" overwrite initial values given by optim.args$par if (is.list(start)) { # convert allowed list specification to vector stopifnot(names(start) %in% c("endemic", "epidemic", "h", "e", "siaf", "tiaf", "e.siaf", "e.tiaf")) names(start)[names(start) == "endemic"] <- "h" names(start)[names(start) == "epidemic"] <- "e" names(start)[names(start) == "siaf"] <- "e.siaf" names(start)[names(start) == "tiaf"] <- "e.tiaf" start <- unlist(start, use.names=TRUE) } if (is.vector(start, mode="numeric")) { start <- start[names(start) %in% names(optim.args$par)] optim.args$par[names(start)] <- start } initpars <- optim.args$par ### Fixed parameters during optimization fixed <- optim.args[["fixed"]] optim.args[["fixed"]] <- NULL whichfixed <- if (is.null(fixed)) { integer(0L) } else if (isTRUE(fixed)) { seq_len(npars) } else { stopifnot(is.vector(fixed)) if (is.numeric(fixed)) { stopifnot(fixed %in% seq_len(npars)) fixed } else if (is.character(fixed)) { if (any(!fixed %in% names(initpars))) stop("'optim.args$fixed' must be a subset of: ", paste0("\"",names(initpars), "\"", collapse=", ")) fixed } else if (is.logical(fixed)) { stopifnot(length(fixed) == npars) which(fixed) } else { stop("'optim.args$fixed' must be a numeric, character or logical vector") } } fixed <- setNames(logical(npars), names(initpars)) # FALSE fixed[whichfixed] <- TRUE fixedsiafpars <- hassiafpars && all(fixed[paste("e.siaf", 1:nsiafpars, sep=".")]) fixedtiafpars <- hastiafpars && all(fixed[paste("e.tiaf", 1:ntiafpars, sep=".")]) ## in the end, we set fixed[st]iafpars to FALSE (for free posteriori evaluations) on.exit(fixedsiafpars <- fixedtiafpars <- FALSE, add = TRUE) ### Define negative log-likelihood (score, hessian) for minimization ### as a function of the non-fixed parameters negll <- ll body(negll)[[length(body(negll))]] <- call("-", body(negll)[[length(body(negll))]]) negsc <- if (useScore) { negsc <- score body(negsc)[[length(body(negsc))]] <- call("-", body(negsc)[[length(body(negsc))]]) negsc } else NULL neghess <- if (useScore) fisherinfo else NULL if (any(fixed)) { ## modify negll, negsc and neghess for subvector optimization optim.args$par <- initpars[!fixed] if (verbose) { if (all(fixed)) { cat("\nno numerical likelihood optimization, all parameters fixed:\n") } else cat("\nfixed parameters during optimization:\n") print(initpars[fixed]) } tmpexpr <- expression( initpars[!fixed] <- theta, theta <- initpars ) body(negll) <- as.call(append(as.list(body(negll)), as.list(tmpexpr), 1)) if (useScore) { body(negsc) <- as.call(append(as.list(body(negsc)), as.list(tmpexpr), 1)) body(neghess) <- as.call(append(as.list(body(neghess)), as.list(tmpexpr), 1)) # return non-fixed sub-vector / sub-matrix only body(negsc)[[length(body(negsc))]] <- call("[", body(negsc)[[length(body(negsc))]], quote(!fixed)) body(neghess)[[length(body(neghess))]] <- call("[", body(neghess)[[length(body(neghess))]], quote(!fixed), quote(!fixed), drop=FALSE) } ## if siafpars or tiafpars are fixed, pre-evaluate integrals if (fixedsiafpars) { if (verbose) cat("pre-evaluating 'siaf' integrals with fixed parameters ...\n") .siafInt.args[[1]] <- initpars[paste("e.siaf", 1:nsiafpars, sep=".")] siafInt <- do.call("..siafInt", .siafInt.args) # ..siafInt is memoise()d } if (fixedtiafpars) { if (verbose) cat("pre-evaluating 'tiaf' integrals with fixed parameters ...\n") tiafInt <- .tiafInt(initpars[paste("e.tiaf", 1:ntiafpars, sep=".")]) ## re-define .tiafInt such that it just returns the pre-evaluated ## integrals if called with the default arguments .tiafInt.orig <- .tiafInt body(.tiafInt) <- expression( if (nargs() == 1L) tiafInt else .tiafInt.orig(tiafpars, from, to, type, G) ) ## restore the original function at the end on.exit({ .tiafInt <- .tiafInt.orig rm(.tiafInt.orig) }, add=TRUE) } } if (any(!fixed)) { #################### ### Optimization ### #################### ## Configure the optim procedure (check optim.args) # default arguments optimArgs <- alist(par =, fn = negll, gr = negsc, method = if (partial) "Nelder-Mead" else "nlminb", lower = -Inf, upper = Inf, control = list(), hessian = TRUE) # user arguments namesOptimArgs <- names(optimArgs) namesOptimUser <- names(optim.args) optimValid <- namesOptimUser %in% namesOptimArgs optimArgs[namesOptimUser[optimValid]] <- optim.args[optimValid] if (any(!optimValid)) { warning("unknown names in optim.args: ", paste(namesOptimUser[!optimValid], collapse = ", ")) } doHessian <- eval(optimArgs$hessian) optimMethod <- eval(optimArgs$method) ## Call 'optim', 'nlminb', or 'nlm' with the above arguments if (verbose) { cat("\nminimizing the negative", if (partial) "partial", "log-likelihood", "using", if (optimMethod %in% c("nlm", "nlminb")) paste0("'",optimMethod,"()'") else { paste0("'optim()'s \"", optimMethod, "\"") }, "...\n") cat("initial parameters:\n") print(optimArgs$par) } optimRes1 <- if (optimMethod == "nlminb") { nlminbControl <- control2nlminb(optimArgs$control, defaults = list(trace=1L, rel.tol=1e-6)) ## sqrt(.Machine$double.eps) is the default reltol used in optim, ## which usually equals about 1.49e-08. ## The default rel.tol of nlminb (1e-10) seems too small ## (nlminb often does not finish despite no "relevant" change in loglik). ## I therefore use 1e-6, which is also the default in package nlme ## (see 'lmeControl'). if (nlminbControl$trace > 0L) { cat("negative log-likelihood and parameters ") if (nlminbControl$trace == 1L) cat("in each iteration") else { cat("every", nlminbControl$trace, "iterations") } cat(":\n") } nlminbRes <- nlminb(start = optimArgs$par, objective = negll, gradient = negsc, hessian = if (doHessian) neghess else NULL, control = nlminbControl, lower = optimArgs$lower, upper = optimArgs$upper) nlminbRes$value <- -nlminbRes$objective nlminbRes$counts <- nlminbRes$evaluations nlminbRes } else if (optimMethod == "nlm") { nlmObjective <- function (theta) { value <- negll(theta) grad <- negsc(theta) #hess <- neghess(theta) structure(value, gradient = grad)#, hessian = hess) } nlmControl <- optimArgs$control if (is.null(nlmControl[["print.level"]])) { nlmControl$print.level <- min(nlmControl$trace, 2L) } nlmControl$trace <- nlmControl$REPORT <- NULL if (is.null(nlmControl[["iterlim"]])) { nlmControl$iterlim <- nlmControl$maxit } nlmControl$maxit <- NULL nlmControl$check.analyticals <- FALSE ##<- we use the negative _expected_ Fisher information as the Hessian, ## which is of course different from the true Hessian (=neg. obs. Fisher info) nlmRes <- do.call("nlm", c(alist(f = nlmObjective, p = optimArgs$par, hessian = doHessian), nlmControl)) names(nlmRes)[names(nlmRes) == "estimate"] <- "par" nlmRes$value <- -nlmRes$minimum nlmRes$counts <- rep.int(nlmRes$iterations, 2L) nlmRes$convergence <- if (nlmRes$code %in% 1:2) 0L else nlmRes$code nlmRes } else { # use optim() optimArgs$control <- modifyList(list(trace=1L, REPORT=1L), optimArgs$control) if (finetune) optimArgs$hessian <- FALSE res <- do.call("optim", optimArgs) res$value <- -res$value res } ## Optional fine-tuning of ML estimates by robust Nelder-Mead optimRes <- if (finetune) { if (verbose) { cat("\nMLE from first optimization:\n") print(optimRes1$par) cat("loglik(MLE) =", optimRes1$value, "\n") cat("\nfine-tuning MLE using Nelder-Mead optimization...\n") } optimArgs$par <- optimRes1$par optimArgs$method <- "Nelder-Mead" optimArgs$hessian <- doHessian optimArgs$control <- modifyList(list(trace=1L), optimArgs$control) nmRes <- do.call("optim", optimArgs) nmRes$value <- -nmRes$value nmRes$counts[2L] <- 0L # 0 gradient evaluations (replace NA for addition below) nmRes } else optimRes1 ## Convergence message msgConvergence <- if (finetune || optimMethod != "nlminb") { paste("code", optimRes$convergence) } else optimRes$message if (optimRes$convergence != 0) { msgNotConverged <- paste0("optimization routine did not converge (", msgConvergence, ")") warning(msgNotConverged) if (verbose) { cat("\nWARNING: ", msgNotConverged, "!\n", sep="") if ((finetune || optimMethod != "nlminb") && !is.null(optimRes$message) && nzchar(optimRes$message)) { cat("MESSAGE: \"", optimRes$message, "\"\n", sep="") } if (useScore && !constantsiaf && grepl("false", msgNotConverged)) { cat("SOLUTION: increase the precision of 'siaf$Deriv' (and 'siaf$F')\n") if (optimMethod == "nlminb") { cat(" or nlminb's false convergence tolerance 'xf.tol'\n") } } } } if (verbose) { cat("\n", if (finetune) "final ", "MLE:\n", sep = "") print(optimRes$par) cat("loglik(MLE) =", optimRes$value, "\n") } } ############## ### Return ### ############## ## ### Issue collected polyCub.midpoint warnings ## sapply(unique(.POLYCUB.WARNINGS), warning) ### Set up list object to be returned fit <- list( coefficients = if (any(fixed)) { if (all(fixed)) initpars else unlist(modifyList(as.list(initpars), as.list(optimRes$par))) } else optimRes$par, loglik = structure(if (all(fixed)) ll(initpars) else optimRes$value, partial = partial), counts = if (all(fixed)) c("function"=1L, "gradient"=0L) else { optimRes1$counts + if (finetune) optimRes$counts else c(0L, 0L) }, converged = if (all(fixed) || (optimRes$convergence == 0)) TRUE else msgConvergence ) ### Add Fisher information matrices # estimation of the expected Fisher information matrix if (useScore) fit$fisherinfo <- structure( fisherinfo(fit$coefficients), dimnames = list(names(initpars), names(initpars)) ) # If requested, add observed fisher info (= negative hessian at maximum) if (any(!fixed) && !is.null(optimRes$hessian)) { fit$fisherinfo.observed <- optimRes$hessian ## no "-" here because we optimized the negative log-likelihood } ### Add fitted intensity values and integrated intensities at events # final coefficients theta <- fit$coefficients beta0 <- theta[seq_len(nbeta0)] beta <- theta[nbeta0+seq_len(p)] gamma <- theta[nbeta0+p+seq_len(q)] siafpars <- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] # final siaf and tiaf integrals over influence regions / periods # and final gammapred (also used by intensity.twinstim) if (hase) { gammapred <- drop(exp(mme %*% gamma)) # N-vector if (!fixedsiafpars) siafInt <- do.call("..siafInt", .siafInt.args) if (!fixedtiafpars) tiafInt <- .tiafInt(tiafpars) } # fitted intensities hEvents <- if (hash) .hEvents(unname(beta0), beta) else rep.int(0, Nin) eEvents <- if (hase) { .eEvents(gammapred, siafpars, tiafpars) # Nin-vector! (only 'includes' here) } else rep.int(0, Nin) fit$fitted <- hEvents + eEvents # = lambdaEvents # Nin-vector fit$fittedComponents <- cbind(h = hEvents, e = eEvents) rm(hEvents, eEvents) # calculate cumulative ground intensities at event times # Note: this function is also used by residuals.twinstim LambdagEvents <- function (cores = 1L, cumCIF.pb = interactive()) { if (cores != 1L) cumCIF.pb <- FALSE if (cumCIF.pb) pb <- txtProgressBar(min=0, max=Nin, initial=0, style=3) heIntEvents <- if (cores == 1L) { sapply(seq_len(Nin), function (i) { if (cumCIF.pb) setTxtProgressBar(pb, i) heIntTWK(beta0, beta, gammapred, siafpars, tiafpars, eventTimes[includes[i]]) }, simplify=TRUE, USE.NAMES=FALSE) } else { # cannot use progress bar simplify2array(parallel::mclapply( eventTimes[includes], heIntTWK, beta0=beta0, beta=beta, gammapred=gammapred, siafpars=siafpars,tiafpars=tiafpars, mc.preschedule=TRUE, mc.cores=cores ), higher=FALSE) } if (cumCIF.pb) close(pb) setNames(.colSums(heIntEvents, 2L, Nin), rownames(mmhEvents)) } if (cumCIF) { if (verbose) cat("\nCalculating fitted cumulative intensities at events...\n") fit$tau <- LambdagEvents(cores, cumCIF.pb) } # calculate observed R0's: mu_j = spatio-temporal integral of e_j(t,s) over # the observation domain (t0;T] x W (not whole R+ x R^2) fit$R0 <- if (hase) qSum * gammapred * siafInt * tiafInt else rep.int(0, N) names(fit$R0) <- rownames(mfe) ### Append model information fit$npars <- c(nbeta0 = nbeta0, p = p, q = q, nsiafpars = nsiafpars, ntiafpars = ntiafpars) fit$qmatrix <- qmatrix # -> information about nTypes and typeNames fit$bbox <- bbox(data$W) # for completeness and for iafplot fit$timeRange <- c(t0, T) # for simulate.twinstim's defaults fit$formula <- list(endemic = endemic, epidemic = epidemic, siaf = siaf, tiaf = tiaf) fit$control.siaf <- control.siaf # might be NULL ### Append optimizer configuration optim.args$par <- initpars # reset to also include fixed coefficients if (any(fixed)) optim.args$fixed <- names(initpars)[fixed] # restore fit$optim.args <- optim.args if (model) { fit$functions <- functions environment(fit) <- environment() } ### Return object of class "twinstim" if (verbose) cat("\nDone.\n") fit$call <- cl fit$runtime <- structure(proc.time() - ptm, cores=cores) class(fit) <- "twinstim" return(fit) } surveillance/R/twinstim_siaf.R0000644000176000001440000002536712237174420016221 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Spatial interaction functions for twinstim's epidemic component. ### Specific implementations are in seperate files (e.g.: Gaussian, power law). ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ##################### ### "Constructor" ### ##################### ## f: spatial interaction function (siaf). must accept two arguments, a ## coordinate matrix and a parameter vector. for marked twinstim, it must ## accept a third argument which is the type of the event (either a single ## type for all locations or separate types for each location). ## F: function that integrates 'f' (2nd argument) over a polygonal domain (of ## class "owin", 1st argument). The third and fourth arguments are the ## parameters and the type, respectively. There may be additional arguments ## which are passed by the control.siaf list in twinstim(). ## Fcircle: optional function for fast calculation of the integral of f over a ## circle with radius r (first argument). Further arguments like f. It ## must not be vectorized for model fitting (will be passed single ## radius and single type). ## effRange: optional function returning the effective range (domain) of f for ## the given set of parameters such that the circle with radius effRange ## contains the numerical essential proportion the integral mass, e.g. ## function (sigma) 6*sigma. The return value must be a vector of length ## nTypes (effRange for each type). Must be supplied together with Fcircle. ## deriv: optional derivative of f with respect to the parameters. Takes the ## same arguments as f but returns a matrix with as many rows as there were ## coordinates in the input and npars columns. The derivative is necessary ## for the score function. ## Deriv: function which integrates 'deriv' (2nd argument) over a polygonal ## domain (of class "owin", 1st argument). The third and fourth argument are ## the parameters and the type, respectively. There may be additional ## arguments which are passed by the control.siaf list in twinstim(). ## simulate: optional function returning a sample drawn from the spatial kernel ## (i.e. a two-column matrix of 'n' points). The arguments are 'n' (size of ## the sample), 'pars' (parameter vector of the spatial kernel), for marked ## twinstim also 'type' (a single type of event being generated), and ## optionally 'ub' (upper bound, truncation of the kernel). ## npars: number of parameters ## validpars: optional function indicating if a specific parameter vector is ## valid. If missing or NULL, it will be set to function ## (pars) TRUE. This function is rarely needed in practice, because usual box ## constrained parameters can be taken into account by using L-BFGS-B as the ## optimization method (with arguments 'lower' and 'upper'). ## knots: not implemented. Knots (> 0) of a spatial interaction STEP function of the distance siaf <- function (f, F, Fcircle, effRange, deriv, Deriv, simulate, npars, validpars, knots) { # if siaf is a step function specified by knots if (!missing(knots)) { return(sort(unique(as.vector(knots,mode="numeric")), decreasing=FALSE)) } # if siaf is a continuous function npars <- as.integer(npars) if (length(npars) != 1 || npars < 0L) { stop("'siaf$npars' must be a single nonnegative number") } f <- .checknargs3(f, "siaf$f") F <- if (missing(F) || is.null(F)) siaf.fallback.F else { F <- match.fun(F) if (length(formals(F)) < 4L) stop("siaf$F() must accept >=4 arguments ", "(polydomain, f, pars, type)") F } haspars <- npars > 0L if (!haspars || missing(deriv)) deriv <- NULL if (!is.null(deriv)) deriv <- .checknargs3(deriv, "siaf$deriv") if (missing(effRange)) effRange <- NULL if (missing(Fcircle) || is.null(Fcircle)) { Fcircle <- NULL if (!is.null(effRange)) { message("'siaf$effRange' only works in conjunction with 'siaf$Fcircle'") effRange <- NULL } } if (!is.null(Fcircle)) Fcircle <- .checknargs3(Fcircle, "siaf$Fcircle") if (!is.null(effRange)) { effRange <- match.fun(effRange) if (length(formals(effRange)) < 1L) { stop("the 'siaf$effRange' function must accept a parameter vector") } } Deriv <- if (is.null(deriv)) NULL else if (missing(Deriv) || is.null(Deriv)) siaf.fallback.Deriv else { Deriv <- match.fun(Deriv) if (length(formals(Deriv)) < 4L) stop("siaf$Deriv() must accept >=4 arguments ", "(polydomain, deriv, pars, type)") Deriv } ## Check if simulation function has proper format if (missing(simulate)) simulate <- NULL if (!is.null(simulate)) { simulate <- .checknargs3(simulate, "siaf$simulate") if (length(formals(simulate)) == 3L) formals(simulate) <- c(formals(simulate), alist(ub=)) } ## Check if the validpars are of correct form validpars <- if (!haspars || missing(validpars) || is.null(validpars)) NULL else match.fun(validpars) ## Done, return result. list(f = f, F = F, Fcircle = Fcircle, effRange = effRange, deriv = deriv, Deriv = Deriv, simulate = simulate, npars = npars, validpars = validpars) } ########################################## ### Constant spatial interaction/dispersal ########################################## siaf.constant <- function () { r <- s <- n <- ub <- "just cheating on codetools::checkUsage" ## to avoid notes in R CMD check ("no visible binding for global variable") ## one could also use utils::globalVariables() in R >= 2.15.1 as follows: ## if (getRversion() >= "2.15.1") utils::globalVariables("r") res <- list( f = as.function(alist(s=, pars=NULL, types=NULL, rep.int(1,nrow(s))), envir = .GlobalEnv), Fcircle = as.function(alist(r=, pars=NULL, type=NULL, pi*r^2), envir = .GlobalEnv), ## simulation will be handled specially in simEpidataCS, this is only ## included here for completeness simulate = as.function(alist(n=, pars=NULL, type=NULL, ub=, runifdisc(n, ub)), envir = getNamespace("surveillance")), npars = 0L ) attr(res, "constant") <- TRUE res } ########################################## ### naive defaults for the siaf primitives ########################################## ## numerical integration of f over a polygonal domain (single "owin" and type) siaf.fallback.F <- function(polydomain, f, pars, type, method = "SV", ...) { if (identical(method,"SV")) polyCub.SV(polydomain, f, pars, type, alpha=0, ...) # since max at origin else polyCub(polydomain, f, method, pars, type, ...) } ## numerical integration of deriv over a polygonal domain siaf.fallback.Deriv <- function (polydomain, deriv, pars, type, method = "SV", ...) { deriv1 <- function (s, paridx) deriv(s, pars, type)[,paridx,drop=TRUE] intderiv1 <- function (paridx) polyCub(polydomain, deriv1, method, paridx=paridx, ...) derivInt <- sapply(seq_along(pars), intderiv1) derivInt } ###################################### ### Check Fcircle, deriv, and simulate ###################################### checksiaf <- function (siaf, pargrid, type=1) { stopifnot(is.list(siaf), is.numeric(pargrid), !is.na(pargrid), length(pargrid) > 0) pargrid <- as.matrix(pargrid) stopifnot(siaf$npars == ncol(pargrid)) ## Check 'Fcircle' if (!is.null(siaf$Fcircle)) { cat("'Fcircle' vs. numerical cubature ... ") res <- checksiaf.Fcircle(siaf$Fcircle, siaf$f, pargrid, type=type) cat(all.equal(res[,1],res[,2]), "\n") } ## Check 'deriv' if (!is.null(siaf$deriv)) { cat("'deriv' vs. numerical derivative ... ") maxRelDiffs <- checksiaf.deriv(siaf$deriv, siaf$f, pargrid, type=type) cat("maxRelDiff =", max(maxRelDiffs), "\n") } ## Check 'simulate' if (!is.null(siaf$simulate)) { checksiaf.simulate(siaf$simulate, siaf$f, pargrid[1,], type=type) } } checksiaf.Fcircle <- function (Fcircle, f, pargrid, type=1, rs=runif(20, 0, 100), nGQ=30) { pargrid <- pargrid[rep(1:nrow(pargrid), each=length(rs)),,drop=FALSE] rpargrid <- cbind(rs, pargrid, deparse.level=0) res <- t(apply(rpargrid, 1, function (x) { c(ana = Fcircle(x[1], x[-1], type), num = polyCub.SV(discpoly(c(0,0), x[1], npoly=128, class="owin"), function (s) f(s, x[-1], type), alpha=0, nGQ=nGQ)) })) res } checksiaf.deriv <- function (deriv, f, pargrid, type=1, rmax=100) { rgrid <- seq(-rmax,rmax,len=21) / sqrt(2) rgrid <- rgrid[rgrid != 0] # some siafs are always 1 at (0,0) (deriv=0) sgrid <- cbind(rgrid, rgrid) maxreldiffs <- if (requireNamespace("maxLik")) { apply(pargrid, 1, function (pars) { maxLik::compareDerivatives(f, deriv, t0=pars, s=sgrid, print=FALSE)$maxRelDiffGrad }) } else { # use stats::numericDeriv apply(pargrid, 1, function (pars) { ana <- deriv(sgrid, pars, types=type) logsigma <- pars[1L]; logd <- pars[2L] num <- attr(numericDeriv(quote(f(sgrid, c(logsigma,logd), types=type)), theta=c("logsigma", "logd")), "gradient") max((ana-num)/(0.5*(abs(ana)+abs(num)))) }) } maxreldiffs } checksiaf.simulate <- function (simulate, f, pars, type=1, B=3000, ub=10) { ## Simulate B points on the disc with radius 'ub' simpoints <- simulate(B, pars, type=type, ub=ub) ## Graphical check par(mar=c(1,2,2,1)) plot(as.im.function(function(x,y,...) f(cbind(x,y), pars, type), W=discpoly(c(0,0), ub, class="owin")), axes=TRUE, main="Simulation from the spatial kernel") points(simpoints, cex=0.2) kdens <- kde2d(simpoints[,1], simpoints[,2], n=100) contour(kdens, add=TRUE, col=2, lwd=2, labcex=1.5, vfont=c("sans serif", "bold")) ##x11(); image(kdens, add=TRUE) } surveillance/R/twinstim_tiaf.R0000644000176000001440000001333212137235126016207 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Temporal interaction functions for twinstim's epidemic component. ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 542 $ ### $Date: 2013-04-28 17:03:50 +0200 (Son, 28 Apr 2013) $ ################################################################################ ##################### ### "Constructor" ### ##################### ## g: temporal interaction function (tiaf). must accept two arguments, a vector ## of time points and a parameter vector. for marked twinstim, it must accept ## a third argument which is the type of the event (either a single type for ## all locations or separate types for each location). ## G: a primitive of g. Must accept same arguments as g. (_vector_ of time ## points, not just a single one!) ## deriv: optional derivative of g with respect to the parameters. Takes the ## same arguments as g but returns a matrix with as many rows as there were ## time points in the input and npars columns. The derivative is necessary ## for the score function. ## Deriv: optional primitive of deriv (with respect to time). Must accept same ## arguments as deriv and g. Returns a matrix with as many rows as there were ## time points in the input and npars columns. The integrated derivative is ## necessary for the score function. ## npars: number of parameters, which are passed as second argument to g and G ## validpars: optional function indicating if a specific parameter vector is ## valid. If missing or NULL, will be set to function (pars) TRUE. ## This function is rarely needed in practice, because usual box ## constrained parameters can be taken into account by using L-BFGS-B as the ## optimization method (with arguments 'lower' and 'upper'). ## knots: not implemented. Knots (> 0) of a temporal interaction STEP function tiaf <- function (g, G, deriv, Deriv, npars, validpars, knots) { # if tiaf is a step function specified by knots if (!missing(knots)) { stop("'knots' are not implemented for 'tiaf'") return(sort(unique(as.vector(knots,mode="numeric")), decreasing=FALSE)) } # if tiaf is a continous function npars <- as.integer(npars) if (length(npars) != 1 || npars < 0L) { stop("'tiaf'/'npars' must be a single nonnegative number") } haspars <- npars > 0L g <- .checknargs3(g, "tiaf$g") G <- .checknargs3(G, "tiaf$G") if (!haspars || missing(deriv)) deriv <- NULL if (!haspars || missing(Deriv)) Deriv <- NULL if (!is.null(deriv)) deriv <- .checknargs3(deriv, "tiaf$deriv") if (!is.null(Deriv)) Deriv <- .checknargs3(Deriv, "tiaf$Deriv") validpars <- if (!haspars || missing(validpars) || is.null(validpars)) NULL else match.fun(validpars) list(g = g, G = G, deriv = deriv, Deriv = Deriv, npars = npars, validpars = validpars) } ################################# ### Constant temporal interaction ################################# tiaf.constant <- function () { res <- list( g = as.function(alist(t=, pars=, types=, rep.int(1, length(t))), envir = .GlobalEnv), G = as.function(alist(t=, pars=, types=, t), envir = .GlobalEnv), deriv = NULL, Deriv = NULL, npars = 0L, validpars = NULL ) attr(res, "constant") <- TRUE res } ############################################# ### Exponential temporal interaction function ############################################# ## nTypes: determines the number of parameters=(log-)alphas of the ## Exponential kernel. In a multitype epidemic, the different types may share ## the same temporal interaction function (type-invariant), in which case ## nTypes=1. Otherwise nTypes should equal the number of event types of the ## epidemic, in which case every type has its own alpha. tiaf.exponential <- function (nTypes = 1) { nTypes <- as.integer(nTypes) stopifnot(length(nTypes) == 1L, nTypes > 0L) ## function definitions for nTypes = 1 (length(alpha) == 1) g <- function (t, alpha, types) { exp(-alpha*t) } G <- function (t, alpha, types) { if (alpha==0) t else -exp(-alpha*t)/alpha } deriv <- function (t, alpha, types) { as.matrix( -t*exp(-alpha*t) ) } Deriv <- function (t, alpha, types) { as.matrix( if (alpha==0) -t^2/2 else (t+1/alpha)*exp(-alpha*t)/alpha ) } ## adaptions for nTypes > 1 if (nTypes > 1) { ## time points vector t, length(types) = length(t) body(g) <- as.call(append(as.list(body(g)), quote(alpha <- alpha[types]), after=1)) body(G) <- quote({ alpha <- alpha[types] ifelse (alpha==0, t, -exp(-alpha*t)/alpha) }) body(deriv) <- quote({ L <- length(t) deriv <- matrix(0, L, length(alpha)) alpha <- alpha[types] deriv[cbind(1:L,types)] <- -t*exp(-alpha*t) deriv }) body(Deriv) <- quote({ L <- length(t) Deriv <- matrix(0, L, length(alpha)) alpha <- alpha[types] Deriv[cbind(1:L,types)] <- ifelse(alpha==0, -t^2/2, (t+1/alpha)*exp(-alpha*t)/alpha) Deriv }) } ## set function environments to the global environment environment(g) <- environment(G) <- environment(deriv) <- environment(Deriv) <- .GlobalEnv ## return the kernel specification list(g=g, G=G, deriv=deriv, Deriv=Deriv, npars=nTypes, validpars=NULL) } surveillance/R/scores.R0000644000176000001440000001752312167553213014635 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Scoring rules as discussed in: ### Predictive model assessment for count data ### Czado, C., Gneiting, T. & Held, L. (2009) ### Biometrics 65:1254-1261 ### ### Copyright (C) 2010-2013 Michaela Paul and Sebastian Meyer ### $Revision: 597 $ ### $Date: 2013-07-11 18:00:10 +0200 (Don, 11 Jul 2013) $ ################################################################################ ## logarithmic score # logs(P,x) = - log(P(X=x)) logScore <- function(x,mu, size=NULL){ if(is.null(size)) - dpois(x,lambda=mu,log=TRUE) else - dnbinom(x, mu=mu,size=size,log=TRUE) } ## squared error score # ses(P,x) =(x-mu_p)^2 ses <- function(x, mu){ (x-mu)^2 } ## normalized squared error score # nses(P,x) =((x-mu_p)/sigma_p)^2 nses <- function(x, mu,size=NULL){ if(!is.null(size)){ sigma2 <- mu*(1+mu/size) } else sigma2 <- mu ((x-mu)^2)/sigma2 } ## Dawid-Sebastiani score # dss(P,x) = ((x-mu_p)/sigma_p)^2 + 2*log(sigma_p) dss <- function(x,mu,size=NULL){ if(!is.null(size)){ sigma2 <- mu*(1+mu/size) } else sigma2 <- mu ((x-mu)^2)/sigma2 +log(sigma2) } ## ranked probability score # rps(P,x) =sum_0^Kmax { P(X<=k) - 1(x <=k)}^2 rps.one <- function(x, mu,size=NULL,k=40,eps=1e-10){ # determine variance of distribution if(is.null(size)){ se <- sqrt(mu) } else se <- sqrt(mu*(1+mu/size)) # determine the maximum number of summands as Kmax= mean+k*se kmax <- ceiling(mu + k*se) # compute 1(x <=k) ind <- 1*(x < (1:(kmax+1))) # compute P(X<=k) # Poisson case if(is.null(size)){ Px <- ppois(0:kmax,lambda=mu) } else Px <- pnbinom(0:kmax,mu=mu,size=size) #determine precision if((1-tail(Px,1))^2 > eps) cat("precision of finite sum not smaller than ", eps,"\n") # compute rps sum((Px-ind)^2) } rps <- function(x,mu,size=NULL,k=40){ n <- length(x) if(length(mu)==1) mu <- rep(mu,n) if(!is.null(size) & length(size)==1) size <- rep(size,n) res <- sapply(1:n, function(i) rps.one(x=x[i],mu=mu[i],size=size[i],k=k) ) matrix(res,ncol=ncol(as.matrix(x)),byrow=FALSE) } ## returns logs, rps,ses and dss in reversed!! order ## i.e. the scores for time points n, n-1, n-2,... scores <- function(object, unit=NULL,sign=FALSE, individual=FALSE) { mu <- object$pred x <- object$observed size <- object$psi if (!is.null(size)) { # NegBin size <- exp(size) # transform to parameterization suitable for dnbinom() if (ncol(size) != ncol(x)) { # => ncol(size)=1, unit-independent psi ## replicate to obtain nrow(size) x nUnits matrix size <- matrix(size, nrow=nrow(size), ncol=ncol(x), byrow=FALSE) } } if(!is.null(unit)){ x <- as.matrix(x[,unit]) mu <- as.matrix(mu[,unit]) size <- size[,unit] } signXmMu <- if(sign) sign(x-mu) else NULL #compute average scores for unit log.score <- apply(as.matrix(logScore(x=x,mu=mu,size=size)),MARGIN=2,rev) rp.score <- apply(as.matrix(rps(x=x,mu=mu,size=size)),MARGIN=2,rev) se.score <- apply(as.matrix(ses(x=x,mu=mu)), MARGIN=2, rev) nse.score <- apply(as.matrix(nses(x=x,mu=mu,size=size)),MARGIN=2,rev) ds.score <- apply(as.matrix(dss(x=x, mu=mu, size=size)), MARGIN=2,rev) if(is.null(unit)){ if(individual){ log.score <- c(log.score) rp.score <- c(rp.score) se.score <- c(se.score) nse.score <- c(nse.score) ds.score <- c(ds.score) } else { log.score <- rowMeans(log.score) rp.score <- rowMeans(rp.score) se.score <- rowMeans(se.score) nse.score <- rowMeans(nse.score) ds.score <- rowMeans(ds.score) } } result <- cbind(logs=log.score,rps=rp.score,ses=se.score,dss=ds.score,nses=nse.score,signXmMu=signXmMu) return(result) } ##################################################### ## non-randomized version of the PIT histogram ## ## Params: ## x - observed data ## pdistr - predictive CDF, i.e. a vectorized function (x, ...) ## or a list of such predictive CDF's, one for each data point x ## If evaluated at x=-1 it should return 0 ## J - number of bins ## ... - arguments for pdistr. Ignored if pdistr is a list. ## plot - NULL (no plot) or a list of arguments for plot.histogram #################################################### pit <- function (x, pdistr, J=10, relative=TRUE, ..., plot = NULL) { PxPxm1 <- pitPxPxm1(x, pdistr, ...) breaks <- (0:J)/J Fbar_seq <- sapply(breaks, pit1, Px=PxPxm1[1,], Pxm1=PxPxm1[2,]) scale <- if (relative) J else 1 f_j <- scale * diff(Fbar_seq) res <- structure(list(breaks=breaks, counts=f_j, density=f_j, mids=breaks[-(J+1)] + 1/J/2, xname="PIT", equidist=TRUE), class="histogram") if (is.null(plot)) res else pitplot(res, plot) } pitPxPxm1 <- function (x, pdistr, ...) { if (is.list(pdistr)) { stopifnot(length(pdistr) == length(x)) sapply(seq_along(x), function (i) { stopifnot(isTRUE(all.equal(0, pdistr[[i]](-1)))) res <- pdistr[[i]](c(x[i], x[i]-1)) if (length(res) == 2 && is.vector(res, mode="numeric")) res else stop("pdistr[[", i, "]](c(", x[i], ", ", x[i]-1, ")) is no numeric vector of length 2") }) # 2 x length(x) } else { # same pdistr for every data point stopifnot(pdistr(-1, ...) == 0) rbind(pdistr(x, ...), pdistr(x-1, ...)) } } ## calculate \bar{F}(u) for scalar u pit1 <- function (u, Px, Pxm1) { if (u <= 0) return(0) else if (u >= 1) return(1) F_u <- (u-Pxm1) / (Px-Pxm1) ## If Px=Pxm1, this means that predict. prob. of observed x is exactly zero. ## We get NaN for F_u. Our predictive model is bad if that happens. ## We could assign either 0 or 1 to express that and issue a warning. if (any(is.nan(F_u))) { warning("predictive distribution has 0 probability for observed 'x'") F_u[is.nan(F_u)] <- 0 } F_u[F_u < 0] <- 0 F_u[F_u > 1] <- 1 mean(F_u) } ## plot the PIT histogram pitplot <- function (pit, args) { relative <- !isTRUE(all.equal(1, sum(pit$density))) defaultArgs <- list(x = pit, main = "", ylab = if(relative) "Relative frequency" else "Density") args <- if (is.list(args)) { args[["x"]] <- NULL # manual x is ignored args <- modifyList(defaultArgs, args) } else defaultArgs do.call("plot", args) abline(h=if (relative) 1 else 1/length(pit$mids), lty=2, col="grey") invisible(pit) } ####################################################### ## scores1, scores2 - vector with scores from two models ######################################################### permutationTest <- function(score1,score2, nPermutation=9999,plot=FALSE){ meanScore1 <- mean(score1) meanScore2 <- mean(score2) diffObserved <- meanScore1 - meanScore2 nTime <- length(score1) diffMean <- replicate(nPermutation, { sel <- rbinom(nTime, size=1, prob=0.5) g1 <- (sum(score1[sel==0]) + sum(score2[sel==1]))/nTime g2 <- (sum(score1[sel==1]) + sum(score2[sel==0]))/nTime g1 - g2 }) if(plot){ hist(diffMean, nclass=50, prob=TRUE,xlab="Difference between means",main="") abline(v=diffObserved,col=4) } pVal <- (1+sum(abs(diffMean)>=abs(diffObserved)))/(nPermutation+1) pTtest <- t.test(score1,score2,paired=TRUE)$p.value cat("mean difference=",diffObserved,"\tp(permutation) =",pVal,"\tp(paired t-test) =",pTtest,"\n") return(list(diffObs=diffObserved, pVal.permut=pVal,pVal.t=pTtest)) } surveillance/R/sysdata.rda0000644000176000001440000001713012177710027015345 0ustar ripleyusers7zXZi"6!XG ])TW"nRʟsef,ť:~IL€Q>cw>pWh&Yܝ¬'v)hZWlg9M ^|S4/WVO@SG~Sc!- $hkd~q//ݛu1..;Բh n\.wa'&O @̭DfxlhDŽ_nCo k.C8!#i$ȀNh͒RQk!u++w(t_5ھA%2{)VJ\}$ ^a/.[ b̯c/'3r\j7]Z[@r)ܿL=O/\9l<.B"p$0*Gbz"#8~/=׃d^SKŢ[Dݫ2PZr4cchOayK`"Ƶ)#Zk6,*ZWR]I!NQ(k;%MeGpoN|-k7jr5W1fEv`7'QcYlf[)U+C096Eq&6Z"XRVOÉ¿n?c &V'xI!.CqF'*BTڱ@}1c1ZlT\̆BS vvyi1\OЯ V ޒ҇^ UR4$BK+hf&4ۆh?*^uU5{R5ۭqI: U';aϔTK/8 "gJQMb++u]]9eɕeRyNzrS< O2'B ۜ&Z"€٘Į!lV0Ċ 6g.*|EjuJ|gM'6&T_@+er iӯwUA!X~W@qը* وԖ{u~wH|Xb{sS_8W%wM -!sؒ O۵'5 rAHI,\"?ͳ/Qfcos6 kdQ(dYfWO:tD.$1RWHBtX{m|PӢ ^*Hm_ij;&30op%;es ׆|F)~ 2zpHP[&4q]v{j8Ձ| 9xWGGQ@񯻔ҕV@%DMX&Խs"'ҫW4(N?EUl-0]'Z?_2!.WQAq7i'!NAg=Jz`Bd8V𻵰W}&9ST8? l,#AqFedzUYs3/55ɫa`~03rPpPzK#~?fF^)G.쒸g㙉K(KF^/pQxxF(gTzP:Q(qDmSf6R!Y Okdu ng'qfTLL! %{2~ayjb{0U@~XkA!%I'8狯P*C,kHckj' `QFd"8cdf~(47C*p3X3V~YwI'԰ hjj彐<餚ó6p,g:L+ zmI7>J;Ҩ−DKZ%{^^;{& s[ʹ,:)w@O Z칵"%>O?d#l ݢ}xnT?09˨ŁVF)'p֠}vMWA(]7\bHֱa$u=Xp5>DL đ\Qp68LΊ]ax)v^x|rTbCz ;ټ ی|ɏ2@ @G TU[a _gc:}Z+Ai呁=>EqM; kWjt3.7z /Mh_G F?v?3gI=#jte'w cxY\X<ɟ=%*cAe, a* 4#V)1XIm>Y1W$6lCM')cLqDXE!(5psӒ3x*#Rw5`6iσk@*B#jKGYS_Eb`[ܲ0;g2m,ԛl^eJ^WϞQ%;c-jͱq}MHI2[6iVԅ臣Bag$>iO>Ko"ו0}"Aș(x͵?ml/;Yp~b0΃0 nٷYiDo'w1aewhKz R "dVȩjsk!;3S2r;w=ͳKov~#G A8rɋJ[*j|&^o$ߛ!Ző1k5hELx/Ku pBs¿etv>PgH2{/{]isvGOEtat]B.vk#"F`'/>d"y#֑w]uR =WnP4[5'pvΔ@ִ,q8S覣pJ_m-5ygj,reꜣsʓeETN#3.K~BM33 Syu0&eQ@5Z( 8a^ZΎ?$?n`̠rqrȽԟQ/:tcqB[(R"ƩLEGGG~'L^:8Ą?{)s_$w;n06tA{Qw^wkJv߽CV{Z$`G 7 r_Wt_9#[<3hS-,;;yc TqB2 ,;΁Lu<C$Mmqj/"v[e%^Ejdۂ3IzH(eg)#ր SZ[5X٨ețnؖ`#R=S/8`L{۠q^X }f‰ZQJCqb+R{Iqq&acF/gHX1qMnsbĖX*{z}G.,2hy~2kֹZ0RTyn4q:%Tut|(0wFwQl| u Wu xz1-0@{[`LNl$Z!VC•?[R,ol΍@m,1iuSq!o"]PB>_`$`BmPԜ\3]'bP'A- $j\J uj.9%g7'[)PH*}sBm\Cg2sVXLr399tQo 'jѻ wmI\E{w\w0[O?UE@MZ? S0R=D:x΢vh̛WaEl% Y2! K.|<y.%Eb\ԧeh?N鑵]B؛`1IzTM7c0YV(P!)\Lo8d/Z{|ȗ HO W} 1s_$XAWe~^:r)8|~lRZtF&g3M:"+F(_`|;PӒHlwuێxmHO.8$w.>)ynΝʃ0-8/꓈iךB>MѺdj?>]1x?qNVZnk^:æl}[OѰ";|0Ⱦ4+͓VPc2$(ËCjq vTjȲF*V,Iÿbڀd^P kCצlBL+ΖՄ!(0+zAU/= 5NWbEhzIeK:D;bVcg ^q4oR3%St%pm >g>; h;U D9ш# Wm/"(,7)yfuu% M;doqw9-1L<_ t Hϲ(h\S\byoe& |50]tU ̏ۛ )pOS R @,blI9jn'aމxVz@~ըQ Za*%ը %y!l/-r>`ܧ`oKce<5V,Q?t{X<{ $;7^AܗS:(̹2SO5y0=QhٹV@M3t֡BW`gLRC7 Dù[\#T.-P%Ge{p\/PGWSeI$`|V|rTT]&Z潮$S=-HQXy1MqfO[['CгZ  gȾIRrȠ\$p+2Ԥv&jϩ8.^ϔF*2]b2ᇚ]07:N8A8&I+/ځWOT3)s1ٙQ`:EkOko4[e39?0eNl=` ("=q, 'V/JК:TӓեGgM^CD̀M (v07V޼X:V^,LQ?ߵ+O˃?8:}]\S'\.˂}bdiQӺ4 6~vSjRmtfjlSMFl޳&2O [>oNz.]WI9OEw|NΘh?|tpnx! A(&R$wz&yt8ӰLR섅q9._r]`PrnEؚuX}괞:z[(%ZL,R+E"S\aF"2Lb*H݆tNswo2 SbAϠ(TR_FɖbI𼃻/ӑyz*ơVG,s!O%̤ˢJ<أ]~pF%\4(=^dޞ iIx 24gVDUϖK\}IP K|va`ꅡh{ ^*]a.P LCʒukHEhP@k8aRH.a'fl6& ˏTA&,/Ytp6b] O:;K}=8mMR+Tu\"Q 3K}Rg6A(9W qYm>|CI8aū7PͯZӃ@񍐄.' TKIꐧ}-BV1IfQǝʸ(ʫ~$T/ǜBh ׌Eiim&FpJ}<\Pu#\riu,4C'5,;bBNIy؀ W<*}/f5 ՛Q6( 3jg&^U@>Ҙ~>SB@o}N%SDS}+ۍ%,^VOQ-~?LBΡ̾ oQ^&hk*ɩwF*R*A?vnrp-'2VCa?TE'qc(Vf:eW${L+PIΜx,WS~|ߧ応(I3 8-QԍO)J a^b /TINnz$ `K33Wў}e& avFDpbtRyFvv5wZ8󴺑0GW\&ු5 K9ȪE/ [8/@ qk᳗|!3Ã1/Qɉ[ "_ލ,K߅j[{?Tq"Kpkn:oJ,:-$qj,0z̉bVvk܈j5V$07b.g6D*yAB;ѨS,{)(e7;,Q|.<>0 YZsurveillance/R/twinstim_simulation.R0000644000176000001440000014060212237174420017451 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Simulate a point pattern according to a spatio-temporal intensity model of ### class "twinstim". The function basically uses Ogata's modified thinning ### algorithm (cf. Daley & Vere-Jones, 2003, Algorithm 7.5.V.). ### ### Copyright (C) 2010-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### CAVE: ### - the type of contrasts for factor variables has to be set through options("contrasts") ### - if epidemic-only process (!hash), we actually don't need stgrid, but we ### want to have valid epidataCS at the end, which requires stgrid simEpidataCS <- function (endemic, epidemic, siaf, tiaf, qmatrix, rmarks, events, stgrid, tiles, beta0, beta, gamma, siafpars, tiafpars, t0 = stgrid$start[1], T = tail(stgrid$stop,1), nEvents = 1e5, control.siaf = list(F=list(), Deriv=list()), W = NULL, trace = 5, nCircle2Poly = 32, gmax = NULL, .allocate = 500, .skipChecks = FALSE, .onlyEvents = FALSE) { ptm <- proc.time()[[3]] cl <- match.call() ####################### ### Check arguments ### (this takes many lines of code ...) ####################### cat("\nChecking the supplied arguments ...\n") ### Some simple checks if (length(trace) != 1L) stop("'trace' must be a single integer or logical value") trace <- as.integer(trace) if (!isScalar(nCircle2Poly)) stop("'nCircle2Poly' must be scalar") nCircle2Poly <- as.integer(nCircle2Poly) if (!isScalar(.allocate)) stop("'.allocate' must be scalar") .allocate <- as.integer(.allocate) .skipChecks <- as.logical(.skipChecks) .onlyEvents <- as.logical(.onlyEvents) ### Check formulae if (missing(endemic)) endemic <- ~ 0 else stopifnot(inherits(endemic, "formula")) if (missing(epidemic)) epidemic <- ~ 0 else stopifnot(inherits(epidemic, "formula")) ### Check parameters beta0 <- if (missing(beta0)) numeric(0L) else as.vector(beta0, mode="numeric") beta <- if (missing(beta)) numeric(0L) else as.vector(beta, mode="numeric") gamma <- if (missing(gamma)) numeric(0L) else as.vector(gamma, mode="numeric") siafpars <- if (missing(siafpars)) numeric(0L) else as.vector(siafpars, mode="numeric") tiafpars <- if (missing(tiafpars)) numeric(0L) else as.vector(tiafpars, mode="numeric") nbeta0 <- length(beta0) p <- length(beta) q <- length(gamma) nsiafpars <- length(siafpars) ntiafpars <- length(tiafpars) hase <- q > 0L hassiafpars <- nsiafpars > 0L hastiafpars <- ntiafpars > 0L if (!hase && (hassiafpars | hastiafpars)) { stop("'siafpars' and 'tiafpars' require 'gamma'") } ### Check qmatrix if (missing(qmatrix)) qmatrix <- diag(1) typeNames <- rownames(qmatrix) if (is.null(typeNames)) typeNames <- "1" # single event type qmatrix <- checkQ(qmatrix, typeNames) nTypes <- length(typeNames) if (nbeta0 > 1L && nbeta0 != nTypes) { stop("'beta0' must have length 0, 1, or 'nrow(qmatrix)'") } qSumTypes <- rowSums(qmatrix) # how many types can be triggered by each type ### Check stgrid if (!.skipChecks) { cat("Checking 'stgrid':\n") stgrid <- checkstgrid(stgrid[grep("^BLOCK$", names(stgrid), invert=TRUE)]) } ### Check time range if (is.null(t0)) t0 <- eval(formals()$t0) if (is.null(T)) T <- eval(formals()$T) if (!isScalar(t0) || !isScalar(T)) { stop("endpoints 't0' and 'T' must be single numbers") } if (T <= t0) { stop("'T' must be greater than 't0'") } stopifnot(t0 >= stgrid$start[1], T <= tail(stgrid$stop,1)) ### Subset stgrid to include actual time range only # BLOCK in stgrid such that start time is equal to or just before t0 block_t0 <- stgrid$BLOCK[match(TRUE, stgrid$start > t0) - 1L] # BLOCK in stgrid such that stop time is equal to or just after T block_T <- stgrid$BLOCK[match(TRUE, stgrid$stop >= T)] stgrid <- stgrid[stgrid$BLOCK >= block_t0 & stgrid$BLOCK <= block_T,] stgrid$start[stgrid$BLOCK == block_t0] <- t0 stgrid$stop[stgrid$BLOCK == block_T] <- T # matrix of BLOCKS and start times (used later) blockstarts <- with(stgrid, cbind(block_t0:block_T, start[match(block_t0:block_T, BLOCK)]) ) ### Check class, proj4string and names of tiles and W stopifnot(inherits(tiles, "SpatialPolygons"), (tileLevels <- levels(stgrid$tile)) %in% row.names(tiles)) tiles <- as(tiles, "SpatialPolygons") # drop possible data attribute # (-> correct over-method) if (is.null(W)) { cat("Building 'W' as the union of 'tiles' ...\n") W <- unionSpatialPolygons(tiles) } else { stopifnot(inherits(W, "SpatialPolygons"), identicalCRS(tiles, W)) } # Transform W to class "owin" Wowin <- as(W, "owin") maxExtentOfW <- diameter.owin(Wowin) ### Check mark-generating function # eps.t and eps.s are also unpredictable marks (generated by rmarks) unpredMarks <- unique(c("eps.t", "eps.s", if (hase) { setdiff(all.vars(epidemic), c("type", names(stgrid))) })) rmarks <- match.fun(rmarks) sampleCoordinate <- coordinates(spsample(tiles, n=1L, type="random")) sampleMarks <- rmarks(t0, sampleCoordinate) # should be a one-row data.frame if (!is.data.frame(sampleMarks) || nrow(sampleMarks) != 1L) { stop("'rmarks' must return a one-row data.frame of marks") } markNames <- names(sampleMarks) if (.idx <- match(FALSE, unpredMarks %in% markNames, nomatch=0L)) { stop("the unpredictable mark '", unpredMarks[.idx], "' is not returned by 'rmarks'") } if (!all(sapply(sampleMarks[unpredMarks], function(x) inherits(x, c("integer","numeric","logical","factor"), which=FALSE)))) warning("'rmarks' should return \"numeric\", \"logical\", or", " \"factor\" ('epidemic') variables only") ### Check events (prehistory of the process) # empty prehistory eventCoords <- matrix(0, nrow=0L, ncol=2L) eventData <- data.frame( ID = integer(0L), time = numeric(0L), tile = factor(character(0L), levels=tileLevels), type = factor(character(0L), levels=typeNames), check.rows = FALSE, check.names = FALSE ) eventData <- cbind(eventData, sampleMarks[0L,]) Nout <- 0L # do we have a prehistory in 'events' if (!missing(events) && !is.null(events)) { .reservedColsNames <- c("ID", ".obsInfLength", ".bdist", ".influenceRegion", ".sources", "BLOCK", "start") # from stgrid events <- events[!names(events) %in% .reservedColsNames] if (!.skipChecks) { cat("Checking 'events':\n") events <- checkEvents(events, dropTypes = FALSE) # epscols are obligatory in 'checkEvents', which is also appropriate here } # select prehistory of events which are still infective .stillInfective <- with(events@data, time <= t0 & time + eps.t > t0) Nout <- sum(.stillInfective) # = number of events in the prehistory if (Nout > 0L) { stopifnot(identicalCRS(events, W)) events <- events[.stillInfective,] # check event types events@data$type <- factor(events@data$type, levels=typeNames) if (any(.typeIsNA <- is.na(events@data$type))) { warning("removed unknown event types in 'events'") events <- events[!.typeIsNA,] } eventCoords <- coordinates(events) eventData <- events@data # update ID counter eventData$ID <- 1:Nout # check presence of unpredictable marks if (length(.idx <- which(!unpredMarks %in% names(eventData)))) { stop("missing unpredictable marks in 'events': ", paste0("\"", unpredMarks[.idx], "\"", collapse=", ")) } # check type of unpredictable marks for (um in unpredMarks) { if (!identical(class(sampleMarks[[um]]), class(eventData[[um]]))) stop("the class of the unpredictable mark '", um, "' in the 'events' prehistory ", "is not identical to the class returned by 'rmarks'") } # add marks which are not in the prehistory but simulated by 'rmarks' if (length(.add2events <- setdiff(markNames, names(eventData)))) { eventData <- cbind(eventData, sampleMarks[.add2events]) is.na(eventData[.add2events]) <- TRUE } eventData <- eventData[c("ID", "time", "tile", "type", markNames)] } else { .eventstxt <- if (.skipChecks) "data$events" else "events" # account for simulate.twinstim cat("(no events from '", .eventstxt, "' were considered as prehistory)\n", sep="") } } ## helper function to attach covariates from 'stgrid' to events attachstgridvars <- function (eventData, stgridvars) { gridcellsOfEvents <- integer(nrow(eventData)) for (i in seq_along(gridcellsOfEvents)) { gridcellsOfEvents[i] <- gridcellOfEvent(eventData[i,"time"], eventData[i,"tile"], stgrid) } cbind(eventData, stgrid[gridcellsOfEvents, stgridvars, drop=FALSE]) } ### Build epidemic model matrix epidemic <- terms(epidemic, data = eventData, keep.order = TRUE) if (!is.null(attr(epidemic, "offset"))) { warning("offsets are not implemented for the 'epidemic' component") } # helper function taking eventData and returning the epidemic model.matrix buildmme <- function (eventData) { # which variables do we have to copy from stgrid? stgridCopyCols <- match(all.vars(epidemic), names(stgrid), nomatch = 0L) eventData <- attachstgridvars(eventData, stgridCopyCols) mfe <- model.frame(epidemic, data = eventData, na.action = na.fail, drop.unused.levels = FALSE) model.matrix(epidemic, mfe) } mme <- buildmme(eventData) if (ncol(mme) != q) { cat(ncol(mme), "epidemic model terms:\t", paste(colnames(mme), collapse=" "), "\n") stop("length of 'gamma' (", q, ") does not match the 'epidemic' specification (", ncol(mme), ")") } ### Build endemic model matrix endemic <- terms(endemic, data = stgrid, keep.order = TRUE) # check if we have an endemic component at all hasOffset <- !is.null(attr(endemic, "offset")) hash <- (nbeta0 + p + hasOffset) > 0L if (!hash) { if (!hase) { stop("nothing to do: neither endemic nor epidemic parameters were specified") # actually, the process might be endemic offset-only, which I don't care about ATM } if (Nout == 0L) { stop("missing 'events' pre-history (no endemic component)") } } # remove (1|type) specification typeSpecificEndemicIntercept <- "1 | type" %in% attr(endemic, "term.labels") || nbeta0 > 1 if (typeSpecificEndemicIntercept) { endemic <- update(endemic, ~ . - (1|type)) # this drops the terms attributes endemic <- terms(endemic, data = stgrid, keep.order = TRUE) if (nbeta0 <= 1L) { stop("for type-specific endemic intercepts, 'beta0' must be longer than 1") } } # ensure that we have correct contrasts in the endemic component attr(endemic, "intercept") <- as.integer(nbeta0 > 0L) # helper function taking eventData (with time and tile columns) # and returning the endemic model.matrix buildmmh <- function (eventData) { # if 'pi' appears in 'endemic' we don't care, and if a true covariate is # missing, model.frame will throw an error # which variables do we have to copy from stgrid? stgridCopyCols <- match(all.vars(endemic), names(stgrid), nomatch = 0L) # attaching covariates from 'stgrid' to events eventData <- attachstgridvars(eventData, stgridCopyCols) # construct model matrix mfhEvents <- model.frame(endemic, data = eventData, na.action = na.fail, drop.unused.levels = FALSE) mmhEvents <- model.matrix(endemic, mfhEvents) # exclude intercept from endemic model matrix below, will be treated separately if (nbeta0 > 0) mmhEvents <- mmhEvents[,-1,drop=FALSE] structure(mmhEvents, offset = model.offset(mfhEvents)) } # actually, we don't need the endemic model matrix for the pre-history events at all # this is just to test consistence with 'beta' and for the names of 'beta' mmh <- buildmmh(eventData[0L,]) if (ncol(mmh) != p) { stop("length of 'beta' (", p, ") does not match the 'endemic' specification (", ncol(mmh), ")") } ### Build endemic model matrix on stgrid BLOCK <- tile <- area <- "just cheating on codetools::checkUsage" ## model.frame() will evaluate these variables in the context of 'stgrid' mfhGrid <- model.frame(endemic, data = stgrid, na.action = na.fail, drop.unused.levels = FALSE, BLOCK = BLOCK, tile = tile, ds = area) rm(BLOCK, tile, area) # we don't actually need 'tile' in mfhGrid; this is only for easier identification when debugging mmhGrid <- model.matrix(endemic, mfhGrid) # exclude intercept from endemic model matrix below, will be treated separately if (nbeta0 > 0) mmhGrid <- mmhGrid[,-1,drop=FALSE] # Extract endemic model components offsetGrid <- model.offset(mfhGrid) gridBlocks <- mfhGrid[["(BLOCK)"]] ds <- mfhGrid[["(ds)"]] ### Parse interaction functions if (hase) { ## Check interaction functions siaf <- do.call(".parseiaf", args = alist(siaf, "siaf", trace > 0)) constantsiaf <- attr(siaf, "constant") if (siaf$npars != nsiafpars) { stop("length of 'siafpars' (", nsiafpars, ") does not match the 'siaf' specification (", siaf$npars, ")") } tiaf <- do.call(".parseiaf", args = alist(tiaf, "tiaf", trace > 0)) constanttiaf <- attr(tiaf, "constant") if (constanttiaf) gmax <- 1L if (tiaf$npars != ntiafpars) { stop("length of 'tiafpars' (", ntiafpars, ") does not match the 'tiaf' specification (", tiaf$npars, ")") } ## Check control.siaf if (constantsiaf) control.siaf <- NULL else { stopifnot(is.null(control.siaf) || is.list(control.siaf)) } ## Define function that integrates the two-dimensional 'siaf' function ## over the influence regions of the events if (!constantsiaf && !is.null(siaf$Fcircle) && !is.null(siaf$effRange)) { ## pre-compute effective range of the 'siaf' (USED BY .siafInt) effRangeTypes <- rep_len(siaf$effRange(siafpars), nTypes) } .siafInt <- .siafIntFUN(siaf = siaf, noCircularIR = FALSE) # not certain beforehand .siafInt.args <- c(list(siafpars), control.siaf$F) ## Check gmax if (is.null(gmax)) { gmax <- max(tiaf$g(rep.int(0,nTypes), tiafpars, 1:nTypes)) cat("assuming gmax =", gmax, "\n") } else if (!isScalar(gmax)) { stop("'gmax' must be scalar") } } else { if (!missing(siaf) && !is.null(siaf)) warning("'siaf' can only be modelled in conjunction with an 'epidemic' process") if (!missing(tiaf) && !is.null(tiaf)) warning("'tiaf' can only be modelled in conjunction with an 'epidemic' process") siaf <- tiaf <- NULL control.siaf <- NULL } ### print some information on the upcoming simulation txtPrehistory <- if (Nout == 0L) "no prehistory" else paste(Nout, ngettext(Nout, "event", "events"), "in the prehistory") cat("\nSimulating a", if (length(unpredMarks) > 2L) "marked", "spatio-temporal point pattern with", "\n\t-", nTypes, ngettext(nTypes, "event type", "event types"), "\n\t-", txtPrehistory) coefs <- c( if (nbeta0 > 1L) { structure(beta0, names=paste0("h.type",typeNames)) } else if (nbeta0 == 1L) structure(beta0, names="h.(Intercept)"), if (p > 0L) structure(beta, names=paste("h",colnames(mmh),sep=".")), if (hase) structure(gamma, names=paste("e",colnames(mme),sep=".")), if (hassiafpars) structure(siafpars, names=paste("e.siaf",1:nsiafpars,sep=".")), if (hastiafpars) structure(tiafpars, names=paste("e.tiaf",1:ntiafpars,sep=".")) ) cat("\n\t-", length(coefs), "coefficients:\n\n") print(coefs) ########################################## ### CIF of the temporal ground process ### ########################################## ### calculate integral of endemic component over W (= union of tiles) ### and over types for all time blocks in stgrid hIntWK <- if (hash) { dsexpeta <- local({ eta <- drop(mmhGrid %*% beta) if (!is.null(offsetGrid)) eta <- offsetGrid + eta ds * exp(unname(eta)) }) fact <- if (nbeta0 > 1L) sum(exp(beta0)) else if (nbeta0 == 1L) nTypes*exp(unname(beta0)) else nTypes fact * c(tapply(dsexpeta, gridBlocks, sum)) } else structure(numeric(nrow(blockstarts)), names=blockstarts[,1]) # zeroes #<- is a named vector with names referencing BLOCK in stgrid ### helper function evaluating the epidemic terms of the ground intensity ### for a specific set of events (the lambdag function uses eTerms) eTermsCalc <- function (eventData, eventCoords) { # extract some marks from the eventData (USED INSIDE .siafInt() BELOW!) eventTypes <- as.integer(eventData$type) eps.s <- eventData$eps.s # distance to the border (required for siafInt below, and for epidataCS) bdist <- bdist(eventCoords, Wowin) # spatial influence regions of the events influenceRegion <- if (nrow(eventCoords) > 0L) .influenceRegions( events = SpatialPointsDataFrame( coords = eventCoords, data = data.frame(eps.s = eps.s, .bdist = bdist), match.ID = FALSE ), W = Wowin, npoly = nCircle2Poly, maxExtent = maxExtentOfW, clipper = "polyclip" ) else list() # epidemic terms if (!hase) { return(list(matrix(NA_real_, length(influenceRegion), 3L), bdist, influenceRegion)) } # epidemic model matrix (will be multiplied with gamma) mme <- buildmme(eventData) # integrate the two-dimensional 'siaf' function over the influence region siafInts <- if (length(influenceRegion) == 0L) numeric(0L) else { environment(.siafInt) <- environment() do.call(".siafInt", .siafInt.args) } # Matrix of terms in the epidemic component eTerms <- cbind( qSum = qSumTypes[eventTypes], expeta = exp(drop(mme %*% gamma)), siafInt = siafInts ) # Return list(eTerms, bdist, influenceRegion) } ### function calculating the (upper bound) intensity of the ground process ### it relies on several objects for the epidemic component which are updated alongside simulation # t will be one of the break points in stgrid or an event time lambdagVec <- function (t, upper=FALSE) { ## endemic part hIntWKt <- hIntWK[[as.character(tBLOCK)]] ## epidemic part ejIntWt <- if (!hase || length(infectives) == 0L) numeric(0L) else { eTerms <- eTerms[infectives,,drop=FALSE] gTerm <- if (upper) { rep.int(gmax, length(infectives)) } else { times <- eventMatrix[infectives,"time"] types <- eventMatrix[infectives,"type"] tiaf$g(t-times, tiafpars, types) } # ejIntWt only for infectives, others have 0 structure(apply(cbind(eTerms,gTerm), 1, prod), names = infectives) } c("0"=hIntWKt, ejIntWt) # endemic component has index "0" ! } ### helper function calculating the integral of lambdag from oldct to ct ### during simulation; it depends on the current values of the simulation add2Lambdag <- if (!hase || constanttiaf) { function () lambdagUpper * (ct-oldct) } else function () { # old endemic ground intensity * passed time hIntWKInt_oldct_ct <- lambdaghe[1L] * (ct-oldct) # integrated epidemic ground intensities of infectives (from oldct) ejIntWInt_oldct_ct <- if (length(infectives) == 0L) numeric(0L) else { eTermsProd <- apply(eTerms[infectives,,drop=FALSE], 1, prod) # integral of \id_{(0;eps.t]}(t-t_j) g(t-t_j \vert \kappa_j) from oldct to ct, for j in infectives # we can ignore the indicator because t-t_j is not >eps.t if t in [oldct;ct], because recoveries are change points times <- eventMatrix[infectives,"time"] types <- eventMatrix[infectives,"type"] gInt_0_ct <- tiaf$G(ct -times, tiafpars, types) gInt_0_oldct <- tiaf$G(oldct-times, tiafpars, types) gInt_oldct_ct <- gInt_0_ct - gInt_0_oldct eTermsProd * gInt_oldct_ct } sum(hIntWKInt_oldct_ct, ejIntWInt_oldct_ct) } ################## ### Simulation ### ################## ### Initialise values for simulation loop # all necessary components for an epidataCS object will be build along the simulation # let's start with the events of the prehistory tmp <- eTermsCalc(eventData, eventCoords) eTerms <- tmp[[1]]; rownames(eTerms) <- NULL bdists <- tmp[[2]] influenceRegions <- tmp[[3]] sources <- lapply(seq_len(Nout), function(x) integer(0L)) # Transform eventData into a matrix, which is faster with rbind # (factors will be recreated at the end of simulation) # simulated events will be subsequently appended to this matrix eventMatrix <- if (Nout == 0L) { matrix(numeric(0L), nrow=0L, ncol=ncol(eventData), dimnames=list(NULL, names(eventData))) } else { sapply(eventData, as.numeric, simplify = TRUE) # prehistory } if (Nout == 1L) eventMatrix <- t(eventMatrix) # we will also know about the source of infection and corresponding BLOCK in stgrid navec <- rep.int(NA_real_, Nout) eventMatrix <- cbind(eventMatrix, source = navec, lambda.h = navec, lambda.e = navec, Lambdag = navec, BLOCK = navec) # row indices of currently infective individuals infectives <- seq_len(Nout) # maximum total number of events (including prehistory) maxEvents <- Nout + nEvents # change points of lambdag stgridbreaks <- blockstarts[-1,2] Rtimes <- structure(eventMatrix[,"time"]+eventMatrix[,"eps.t"], names=eventMatrix[,"ID"]) # index of next event (row in eventMatrix) j <- Nout + 1L # allocation of large objects for faster filling-in of new events allocated <- Nout ncolEventMatrix <- ncol(eventMatrix) newAllocation <- expression({ eventMatrix <- rbind(eventMatrix, matrix(NA_real_, nrow = .allocate, ncol = ncolEventMatrix)) eventCoords <- rbind(eventCoords, matrix(NA_real_, nrow = .allocate, ncol = 2L)) eTerms <- rbind(eTerms, matrix(NA_real_, nrow = .allocate, ncol = 3L)) bdists <- c(bdists, rep.int(NA_real_,.allocate)) influenceRegions <- c(influenceRegions, vector(.allocate, mode="list")) sources <- c(sources, vector(.allocate, mode="list")) allocated <- allocated + .allocate }) # current time point ct <- t0 # current value of the cumulative intensity function of the ground process Lambdag <- 0 # last point rejected? pointRejected <- FALSE # did we have numerical problems simulating from Exp(lambdagUpper) in the current loop? hadNumericalProblemsInf <- hadNumericalProblems0 <- FALSE # index of the current loop loopCounter <- 0L ### Let's Rock 'n' Roll if (trace > 0L) { cat("\nSimulation path (starting from t=", t0, "):\n---\n", sep="") } else { cat("\nSimulating (starting from t=", t0, ") ...\n", sep="") } while(j <= maxEvents && ct < T && (hash || length(infectives) > 0L)) { loopCounter <- loopCounter + 1L if (trace > 0L && loopCounter %% trace == 0L) { cat(loopCounter, "@t =", ct, ":\t#simulated events =", j-1L-Nout, "\t#currently infective =", length(infectives), if (hase && !constanttiaf) paste("\tlast rejected?", pointRejected), "\n") flush.console() # affects Windows only } # check if we need to allocate larger matrices if (j > allocated) { eval(newAllocation) } if (!pointRejected) # what we have to do in the usual case { # we need the time block of stgrid corresponding to the new covariates, # i.e. search BLOCK such that t in [start; stop) tBLOCK <- blockstarts[findInterval(ct, blockstarts[,2]), 1] # Compute new infection intensity (upper bound) lambdaghe <- lambdagVec(ct, upper=TRUE) lambdagUpper <- sum(lambdaghe) # Determine time of next external change point changePoints <- c(nextblock = if (length(stgridbreaks) > 0L) stgridbreaks[1L], Rtimes) nextChangePoint <- if (length(changePoints) > 0L) { changePoints[which.min(changePoints)] # don't use min() because need names } else Inf } pointRejected <- FALSE ## Simulate waiting time for the subsequent infection Delta <- tryCatch(rexp(1, rate = lambdagUpper), warning = function (w) { if (lambdagUpper < 1) { # rate was to small for rexp if (lambdagUpper > 0) assign("hadNumericalProblems0", TRUE, inherits = TRUE) if (nextChangePoint == Inf) NULL else Inf } else { # rate was to big for rexp 0 # since R-2.7.0 rexp(1, Inf) returns 0 with no warning! } }) # Stop if lambdaStarMax too small AND no more changes in rate if (is.null(Delta)) break # Stop if lambdaStarMax too big meaning Delta == 0 (=> concurrent events) if (Delta == 0) { hadNumericalProblemsInf <- TRUE break } # Stop at all costs if end of simulation time [t0; T) has been reached if (isTRUE(min(ct+Delta, nextChangePoint) >= T)) break # ">=" because we don't want an event at "end" oldct <- ct if (ct + Delta > nextChangePoint) { ## Simulated time point is beyond the next time of intensity change (removal or endemic covariates) ct <- unname(nextChangePoint) # update cumulative intensity of the ground processes up to time ct, # i.e. add integral of lambdag from oldct to ct Lambdag <- Lambdag + add2Lambdag() # is this change point due to next time block in stgrid? if (names(nextChangePoint) == "nextblock") { stgridbreaks <- stgridbreaks[-1] } else { # i.e. change point due to recovery recoverer <- names(nextChangePoint) # update set of infectives infectives <- setdiff(infectives, recoverer) # remove recovery time from Rtimes .Rtimesidx <- match(recoverer, names(Rtimes)) Rtimes <- Rtimes[-.Rtimesidx] } } else { ## Simulated time point lies within the thinning period ct <- ct + Delta # rejection sampling if non-constant temporal interaction kernel g if (hase && !constanttiaf) { # Calculate actual ground intensity for rejection probability at new ct lambdaghe <- lambdagVec(ct, upper=FALSE) lambdag <- sum(lambdaghe) # rejection sampling step if (lambdag/lambdagUpper < runif(1)) { pointRejected <- TRUE next } } # At this point, we have an actual event! # update cumulative intensity of the ground processes up to time ct, # i.e. add integral of lambdag from oldct to ct Lambdag <- Lambdag + add2Lambdag() # note that lambdaghe[1L] did not change by the above update in case of !constanttiaf, # which is expected by add2Lambdag (which requires the value of lambdag.h(oldct)) # Where did the event come from: imported case or infection? .eventSource <- as.integer(sample(names(lambdaghe), 1L, prob=lambdaghe)) # We now sample type and location if (.eventSource == 0L) { # i.e. endemic source of infection .eventType <- sample(typeNames, 1L, prob=if (nbeta0 > 1L) exp(beta0)) stgrididx <- which(gridBlocks == tBLOCK) .eventTile <- sample(stgrid$tile[stgrididx], 1L, prob=dsexpeta[stgrididx]) # this is a factor ## spsample doesn't guarantee that the sample will consist of ## exactly n points. if no point is sampled (very unlikely ## though), there would be an error ntries <- 1L .nsample <- 1L while( inherits(eventLocationSP <- try( spsample(tiles[as.character(.eventTile),], n=.nsample, type="random"), silent = TRUE), "try-error")) { .nsample <- 10L # this also circumvents a bug in sp 1.0-0 # (missing drop=FALSE in sample.Spatial()) if (ntries >= 1000) { stop("'sp::spsample()' didn't succeed in sampling a ", "point from tile \"", as.character(.eventTile), "\"") } ntries <- ntries + 1L } .eventLocation <- coordinates(eventLocationSP)[1L,,drop=FALSE] } else { # i.e. source is one of the currently infective individuals sourceType <- eventMatrix[.eventSource,"type"] sourceCoords <- eventCoords[.eventSource,,drop=FALSE] sourceIR <- influenceRegions[[.eventSource]] sourceEpss <- eventMatrix[.eventSource,"eps.s"] .upperRange <- min(sourceEpss, maxExtentOfW) .eventType <- sample(typeNames[qmatrix[sourceType,]], 1L) .eventTypeCode <- match(.eventType, typeNames) eventLocationIR <- if (constantsiaf) { as.matrix(coords.ppp(runifpoint(1L, win=sourceIR))) } else { eventInsideIR <- FALSE ntries <- 0L while(!eventInsideIR) { if (ntries >= 1000) { stop("event location sampled by siaf$simulate() was", " rejected 1000 times (not in influence region)") } ntries <- ntries + 1L eventLocationIR <- siaf$simulate(1L, siafpars, .eventTypeCode, .upperRange) eventInsideIR <- inside.owin(eventLocationIR[,1], eventLocationIR[,2], sourceIR) } eventLocationIR } .eventLocation <- sourceCoords + eventLocationIR whichTile <- over(SpatialPoints(.eventLocation, proj4string=tiles@proj4string), tiles) .eventTile <- row.names(tiles)[whichTile] .eventTile <- factor(.eventTile, levels=tileLevels) } .eventType <- factor(.eventType, levels=typeNames) # sample marks at this time and location .eventMarks <- rmarks(ct, .eventLocation) # gather event information .eventData <- data.frame(ID=j, time=ct, tile=.eventTile, type=.eventType, .eventMarks, check.rows = FALSE, check.names = FALSE) # determine potential sources of infection (for epidataCS and lambda) .sources <- infectives[eventMatrix[infectives,"type"] %in% which(qmatrix[,.eventType])] if (length(.sources) > 0L) { .sdiffs <- .eventLocation[rep.int(1L,length(.sources)),,drop=FALSE] - eventCoords[.sources,,drop=FALSE] .sources <- .sources[sqrt(.rowSums(.sdiffs^2, length(.sources), 2L)) <= eventMatrix[.sources,"eps.s"]] } # calculate actual intensity at this time, location and type .mmhEvent <- buildmmh(.eventData) .etaEvent <- .mmhEvent %*% beta .offsetEvent <- attr(.mmhEvent, "offset") if (!is.null(.offsetEvent)) .etaEvent <- .offsetEvent + .etaEvent .lambdah <- exp(.etaEvent) .lambdae <- if (hase && length(.sources) > 0L) { .sdiffs <- .eventLocation[rep.int(1L,length(.sources)),,drop=FALSE] - eventCoords[.sources,,drop=FALSE] .fSources <- siaf$f(.sdiffs, siafpars, eventMatrix[.sources,"type"]) .gSources <- tiaf$g(ct - eventMatrix[.sources,"time"], tiafpars, eventMatrix[.sources,"type"]) sum(eTerms[.sources,"expeta"] * .fSources * .gSources) } else 0 # calculate terms of the epidemic component e_j(t,s) of the new infective tmp <- eTermsCalc(.eventData, .eventLocation) # Update objects eventMatrix[j,] <- c(j, ct, as.numeric(.eventTile), as.numeric(.eventType), sapply(.eventMarks, as.numeric), .eventSource, .lambdah, .lambdae, Lambdag, tBLOCK) eventCoords[j,] <- .eventLocation eTerms[j,] <- tmp[[1]] bdists[j] <- tmp[[2]] influenceRegions[[j]] <- tmp[[3]][[1]] sources[[j]] <- .sources # Update set of infectives and recovery times infectives <- c(infectives, j) Rtimes <- c(Rtimes, structure(ct + .eventMarks[["eps.t"]], names = j)) # Increment next event iterator j <- j + 1L } } if (trace > 0L) cat("---\n") ### update T if simulation ended preterm if (j > maxEvents || (!hash && length(infectives) == 0L)) { T <- ct # clip stgrid to effective time range of simulation stgrid <- subset(stgrid, start <= T) if (j > maxEvents) { cat("Maximum number of events (nEvents=", nEvents, ") reached @t = ", T, "\n", sep="") } else { # epidemic-only model cat("Simulation has ended preterm (no more infectives)", "@t =", T, "with", j-1L-Nout, "simulated events.\n") } } else { # ct >= T or ct+Delta >= T cat("Simulation has ended @t =", T, "with", j-1L-Nout, "simulated events.\n") } ############## ### Return ### ############## ### Throw warnings in case of numerical difficulties if (hadNumericalProblemsInf) { warning("simulation ended due to an infinite overall infection rate") } if (hadNumericalProblems0) { warning("occasionally, the overall infection rate was numerically equal to 0") } ### throw an error if no events have been simulated if (j-1L == Nout) { stop("no events have been simulated") } ### transform eventMatrix back into a data.frame with original factor variables if (trace > 0L) { cat("\nConverting simulated events into an object of class \"epidataCS\"...\n") } preEventData <- eventData # drop unused entries (due to large pre-allocation) from objects seqAlongEvents <- seq_len(j-1L) eventData <- as.data.frame(eventMatrix[seqAlongEvents,,drop=FALSE]) # rebuild factor variables for (idx in which(sapply(preEventData, is.factor))) { origlevels <- levels(preEventData[[idx]]) eventData[[idx]] <- factor(eventData[[idx]], levels=seq_along(origlevels), labels=origlevels) } # transform integer columns to integer eventData[c("ID","source","BLOCK")] <- lapply(eventData[c("ID","source","BLOCK")], as.integer) ### Append additional columns for an epidataCS object # add endemic covariates at events stgrididx <- apply(eventData[c("BLOCK","tile")], 1, function (x) { ret <- with(stgrid, which(BLOCK==as.integer(x[1L]) & tile==x[2L])) if (length(ret) == 0L) NA_integer_ else ret #<- events of the prehistory have missing BLOCKs, thus return NA }) stgridIgnoreCols <- match(c("BLOCK", setdiff(obligColsNames_stgrid, "start")), names(stgrid)) eventData <- cbind(eventData, stgrid[stgrididx, -stgridIgnoreCols]) rownames(eventData) <- eventData$ID # add hidden columns eventData$.obsInfLength <- with(eventData, pmin(T-time, eps.t)) eventData$.sources <- sources[seqAlongEvents] eventData$.bdist <- bdists[seqAlongEvents] eventData$.influenceRegion <- influenceRegions[seqAlongEvents] attr(eventData$.influenceRegion, "nCircle2Poly") <- nCircle2Poly ### Construct "epidataCS" object events <- SpatialPointsDataFrame( coords = eventCoords[seqAlongEvents,,drop=FALSE], data = eventData, proj4string = W@proj4string, match.ID = FALSE #, bbox = bbox(W)) # the bbox of SpatialPoints is defined as the actual # bbox of the points and is also updated every time # when subsetting the SpatialPoints object # -> useless to specify it as the bbox of W ) if (.onlyEvents) { cat("Done.\n") attr(events, "timeRange") <- c(t0, T) attr(events, "runtime") <- proc.time()[[3]] - ptm return(events) } epi <- list(events=events, stgrid=stgrid, W=W, qmatrix=qmatrix) ### Return object of class "simEpidataCS" cat("Done.\n") # append configuration of the model epi$bbox <- bbox(W) epi$timeRange <- c(t0, T) epi$formula <- list( endemic = if (typeSpecificEndemicIntercept) { update(formula(endemic), ~ (1|type) + .) # re-add to the formula } else formula(endemic), epidemic = formula(epidemic), siaf = siaf, tiaf = tiaf ) # coefficients as a numeric vector to be compatible with twinstim-methods epi$coefficients <- coefs #list(beta0=beta0, beta=beta, gamma=gamma, # siafpars=siafpars, tiafpars=tiafpars) epi$npars <- c(nbeta0=nbeta0, p=p, q=q, nsiafpars=nsiafpars, ntiafpars=ntiafpars) epi$control.siaf <- control.siaf # for R0.simEpidataCS epi$call <- cl epi$runtime <- proc.time()[[3]] - ptm class(epi) <- c("simEpidataCS", "epidataCS", "list") return(epi) } #################################################### ### some twinstim-methods for "simEpidataCS" objects #################################################### ### wrapper for R0.twinstim R0.simEpidataCS <- function (object, trimmed = TRUE, ...) { R0.twinstim(object, newevents=object$events@data, trimmed = trimmed, ...) } ### wrapper for intensityplot.twinstim as.twinstim.simEpidataCS <- function (x) { capture.output( m <- do.call("twinstim", c(formula(x), alist(data=x), list(control.siaf = x$control.siaf, optim.args=list(par=coef(x), fixed=seq_along(coef(x))), model=TRUE, cumCIF=FALSE) )) ) components2copy <- setdiff(names(m), names(x)) for (comp in components2copy) x[[comp]] <- m[[comp]] environment(x) <- environment(m) class(x) <- c("simEpidataCS", "epidataCS", "twinstim") x } intensityplot.simEpidataCS <- function (x, ...) { if (is.null(environment(x))) { objname <- deparse(substitute(x)) cat("Setting up model environment ...\n") x <- as.twinstim.simEpidataCS(x) try({ assign(objname, x, envir=parent.frame()) cat("Note: added model environment to '", objname, "' for future use.\n", sep="") }, silent=TRUE) } intensityplot.twinstim(x, ...) } ################################################################################ # A 'simulate' method for objects of class "twinstim". ################################################################################ ### FIXME: actually stgrid's of simulations might have different time ranges ### when nEvents is active -> atm, simplify ignores this simulate.twinstim <- function (object, nsim = 1, seed = NULL, data, tiles, rmarks = NULL, t0 = NULL, T = NULL, nEvents = 1e5, control.siaf = object$control.siaf, W = NULL, trace = FALSE, nCircle2Poly = NULL, gmax = NULL, .allocate = 500, simplify = TRUE, ...) { ptm <- proc.time()[[3]] cl <- match.call() ### Determine seed (this part is copied from stats:::simulate.lm with ### Copyright (C) 1995-2012 The R Core Team) if (!exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) runif(1) if (is.null(seed)) RNGstate <- get(".Random.seed", envir = .GlobalEnv) else { R.seed <- get(".Random.seed", envir = .GlobalEnv) set.seed(seed) RNGstate <- structure(seed, kind = as.list(RNGkind())) on.exit(assign(".Random.seed", R.seed, envir = .GlobalEnv)) } ### Few checks stopifnot(inherits(object, "twinstim"), inherits(data, "epidataCS")) stopifnot(isScalar(nsim), nsim > 0) nsim <- as.integer(nsim) if (is.null(t0)) t0 <- object$timeRange[1] if (is.null(T)) T <- object$timeRange[2] if (is.null(nCircle2Poly)) nCircle2Poly <- attr(data$events$.influenceRegion, "nCircle2Poly") ### Retrieve arguments for simulation endemic <- formula(object)$endemic epidemic <- formula(object)$epidemic # we don't need any reference to the original twinstim evaluation environment environment(endemic) <- environment(epidemic) <- globalenv() if (is.null(rmarks)) { observedMarks <- subset(marks(data), subset = time > t0 & time <= T) observedMarks <- observedMarks[match("eps.t", names(observedMarks)):(ncol(observedMarks)-2L)] rmarks <- function (t, s) { as.data.frame(lapply(observedMarks, function (x) sample(na.omit(x), size=1L)), optional=TRUE) } } theta <- coef(object) beta0 <- beta <- gamma <- siafpars <- tiafpars <- NULL with(as.list(object$npars), { beta0 <<- theta[seq_len(nbeta0)] beta <<- theta[nbeta0+seq_len(p)] gamma <<- theta[nbeta0+p+seq_len(q)] siafpars <<- theta[nbeta0+p+q+seq_len(nsiafpars)] tiafpars <<- theta[nbeta0+p+q+nsiafpars+seq_len(ntiafpars)] }) ### Run the simulation(s) # establish call simcall <- call("simEpidataCS", endemic=endemic, epidemic=epidemic, siaf=quote(formula(object)$siaf), tiaf=quote(formula(object)$tiaf), qmatrix=quote(object$qmatrix), rmarks=quote(rmarks), events=quote(data$events), stgrid=quote(data$stgrid), tiles=quote(tiles), beta0=beta0, beta=beta, gamma=gamma, siafpars=siafpars, tiafpars=tiafpars, t0=t0, T=T, nEvents=nEvents, control.siaf=control.siaf, W=quote(W), trace=trace, nCircle2Poly=nCircle2Poly, gmax=gmax, .allocate=.allocate, .skipChecks=TRUE, .onlyEvents=FALSE) # First simulation if (nsim > 1L) { cat("\nTime at beginning of simulation:", as.character(Sys.time()), "\n") cat("Simulation 1 /", nsim, "...\n") cat("-------------------------------------------------------------------------------\n") } res <- eval(simcall) if (nsim > 1L) { cat("\n-------------------------------------------------------------------------------\n") cat("Runtime of first simulation:", res$runtime, "seconds\n") cat("Estimated finishing time:", as.character(Sys.time() + (nsim-1) * res$runtime), "\n\n") # set up list of simulations res <- if (simplify) { with(res, list( eventsList=c(structure(events, timeRange = timeRange, runtime = runtime), vector(nsim-1L, mode="list")), stgrid=stgrid, W=W, qmatrix=qmatrix, formula=formula, coefficients=coefficients, npars=npars, call=call )) } else { c(list(res), vector(nsim-1L, mode="list")) } # force garbage collection capture.output(gc()) # run the remaining simulations simcall$.onlyEvents <- simplify for (i in 2:nsim) { cat("Simulation", sprintf(paste0("%",nchar(nsim),"i"), i), "/", nsim, "...") capture.output(resi <- eval(simcall)) .nEvents <- if (simplify) sum(!is.na(resi$source)) else { sum(!is.na(resi$events$source)) } .T <- if (simplify) attr(resi,"timeRange")[2] else resi$timeRange[2] cat("\tsimulated", .nEvents, "events", if (nEvents == .nEvents) "(reached maximum)", "up to time", .T, "\n") if (simplify) res$eventsList[[i]] <- resi else res[[i]] <- resi } cat("\nDone (", as.character(Sys.time()), ").\n", sep="") } attr(res, "call") <- cl attr(res, "seed") <- RNGstate attr(res, "simplified") <- simplify attr(res, "runtime") <- proc.time()[[3]] - ptm class(res) <- if (nsim == 1L) { c("simEpidataCS", "epidataCS", "list") } else c("simEpidataCSlist", "list") res } ### print method for lists of simulated epidemics print.simEpidataCSlist <- function (x, ...) { cat("\nCall:\n") print.default(attr(x, "call")) simplified <- attr(x, "simplified") nsim <- if (simplified) length(x$eventsList) else length(x) cat("\n") cat(if (simplified) "Simplified list" else "List", "of", nsim, "simulated epidemics of class \"simEpidataCS\" (not printed)\n\n") invisible(x) } "[[.simEpidataCSlist" <- function (x, i) { simplified <- attr(x, "simplified") if (simplified) { x <- unclass(x) x$eventsList <- x$eventsList[[i]] names(x)[names(x) == "eventsList"] <- "events" x <- append(x, list(timeRange = attr(x$events, "timeRange")), after=4L) x$runtime <- attr(x$events, "runtime") attr(x$events, "timeRange") <- attr(x$events, "runtime") <- NULL class(x) <- c("simEpidataCS", "epidataCS", "list") x } else NextMethod("[[") } plot.simEpidataCSlist <- function (x, which = NULL, mfrow = n2mfrow(length(which)), main = paste("Simulated epidemic", which), aggregate = c("time", "space"), subset, ...) { simplified <- attr(x, "simplified") nsim <- if (simplified) length(x$eventsList) else length(x) if (is.null(which)) { which <- seq_len(nsim) if (nsim > 4) which <- sample(which, 4L) } opar <- par(mfrow = mfrow); on.exit(par(opar)) main <- rep_len(main, length(which)) for (i in seq_along(which)) { do.call("plot", args=list(x=quote(x[[which[i]]]), aggregate=aggregate, subset=substitute(subset), main = main[i], ...)) } } surveillance/R/stsBP.R0000644000176000001440000000415111731650466014367 0ustar ripleyusers###################################################################### # Init function for stsBP objects. More or less call-through # to init of sts objects ###################################################################### init.stsBP <- function(.Object, epoch, start=c(2000,1), freq=52, observed, state=0*observed, map=NULL, neighbourhood=NULL, populationFrac=NULL,alarm=NULL,upperbound=NULL, control=NULL,epochAsDate=FALSE,multinomialTS=FALSE,ci=array(NA,dim=c(nrow(observed),ncol(observed),2)),lambda=NULL) { .Object <- init.sts(.Object, epoch, start, freq, observed, state, map, neighbourhood, populationFrac,alarm,upperbound, control,epochAsDate,multinomialTS) #Check that CI matches dim.ci <- c(dim(observed),2) if (all(dim(ci) == dim.ci)) { .Object@ci <- ci } else { stop("Dimension of confidence interval (ci) (",paste(dim.ci,collapse=","),") is wrong.\n") } #Assign lambda slot (bootstrap replicates) .Object@lambda <- lambda return(.Object) } ###################################################################### # Coerce method ###################################################################### setAs("sts", "stsBP", function(from) { stsBP <- new("stsBP", epoch=from@epoch, freq=from@freq, start=from@start, observed=from@observed, state = from@state, alarm=from@alarm, upperbound=from@upperbound, neighbourhood=from@neighbourhood, populationFrac=from@populationFrac, map=from@map, control=from@control, epochAsDate=from@epochAsDate, multinomialTS=from@epochAsDate, ci=array(NA,dim=c(nrow(from@observed),ncol(from@observed),2)), lambda=array(NA,dim=c(nrow(from@observed),ncol(from@observed),2))) return(stsBP) }) ###################################################################### #Methods ###################################################################### setMethod("initialize", "stsBP", init.stsBP) surveillance/R/algo_farrington.R0000644000176000001440000005160012177702702016504 0ustar ripleyusers### R code from vignette source 'Rnw/algo_farrington.Rnw' ### Encoding: ISO8859-1 ################################################### ### code chunk number 1: algo_farrington.Rnw:25-35 ################################################### anscombe.residuals <- function(m,phi) { y <- m$y mu <- fitted.values(m) #Compute raw Anscombe residuals a <- 3/2*(y^(2/3) * mu^(-1/6) - mu^(1/2)) #Compute standardized residuals a <- a/sqrt(phi * (1-hatvalues(m))) return(a) } ################################################################################ # WEIGHTS FUNCTION ################################################################################ algo.farrington.assign.weights <- function(s,weightsThreshold=1) { #s_i^(-2) for s_iweightsThreshold) )) omega <- numeric(length(s)) omega[s>weightsThreshold] <- gamma*(s[s>weightsThreshold]^(-2)) omega[s<=weightsThreshold] <- gamma return(omega) } ################################################### ### code chunk number 3: algo_farrington.Rnw:136-305 ################################################### algo.farrington.fitGLM <- function(response,wtime,timeTrend=TRUE,reweight=TRUE,...) { #Model formula depends on whether to include a time trend or not. theModel <- as.formula(ifelse(timeTrend, "response~1+wtime","response~1")) #Fit it -- this is slow. An improvement would be to use glm.fit here. model <- glm(theModel, family = quasipoisson(link="log")) #Check convergence - if no convergence we return empty handed. if (!model$converged) { #Try without time dependence if (timeTrend) { cat("Warning: No convergence with timeTrend -- trying without.\n") #Set model to one without time trend theModel <- as.formula("response~1") model <- glm(response ~ 1, family = quasipoisson(link="log")) } if (!model$converged) { cat("Warning: No convergence in this case.\n") print(cbind(response,wtime)) return(NULL) } } #Overdispersion parameter phi phi <- max(summary(model)$dispersion,1) #In case reweighting using Anscome residuals is requested if (reweight) { s <- anscombe.residuals(model,phi) omega <- algo.farrington.assign.weights(s) model <- glm(theModel,family=quasipoisson(link="log"),weights=omega) #Here, the overdispersion often becomes small, so we use the max #to ensure we don't operate with quantities less than 1. phi <- max(summary(model)$dispersion,1) } # end of refit. #Add wtime, response and phi to the model model$phi <- phi model$wtime <- wtime model$response <- response #Done return(model) } ###################################################################### # The algo.farrington.fitGLM function in a version using glm.fit # which is faster than the call using "glm. # This saves lots of overhead and increases speed. # # Author: Mikko Virtanen (@thl.fi) with minor modifications by Michael Hoehle # Date: 9 June 2010 # # Note: Not all glm results may work on the output. But for the # necessary ones for the algo.farrington procedure work. ###################################################################### algo.farrington.fitGLM.fast <- function(response,wtime,timeTrend=TRUE,reweight=TRUE, ...) { #Create design matrix and formula needed for the terms object #Results depends on whether to include a time trend or not. if (timeTrend) { design<-cbind(intercept=1,wtime=wtime) Formula<-response~wtime } else { design<-matrix(1,nrow=length(wtime),dimnames=list(NULL,c("intercept"))) Formula<-response~1 } #Fit it using glm.fit which is faster than calling "glm" model <- glm.fit(design,response, family = quasipoisson(link = "log")) #Check convergence - if no convergence we return empty handed. if (!model$converged) { #Try without time dependence if (timeTrend) { cat("Warning: No convergence with timeTrend -- trying without.\n") #Drop time from design matrix design <- design[,1,drop=FALSE] #Refit model <- glm.fit(design,response, family = quasipoisson(link = "log")) Formula<-response~1 } #No convergence and no time trend. That's not good. } #Fix class of output to glm/lm object in order for anscombe.residuals to work #Note though: not all glm methods may work for the result class(model) <- c("glm","lm") #Overdispersion parameter phi phi <- max(summary.glm(model)$dispersion,1) #In case reweighting using Anscome residuals is requested if (reweight) { s <- anscombe.residuals(model,phi) omega <- algo.farrington.assign.weights(s) model <- glm.fit(design,response, family = quasipoisson(link = "log"), weights = omega) #Here, the overdispersion often becomes small, so we use the max #to ensure we don't operate with quantities less than 1. phi <- max(summary.glm(model)$dispersion,1) } # end of refit. model$phi <- phi model$wtime <- wtime model$response <- response model$terms <- terms(Formula) # cheating a bit, all methods for glm may not work class(model)<-c("algo.farrington.glm","glm","lm") # 23/10/2012 (SM): # added "lm" class to avoid warnings # from predict.lm about fake object #Done return(model) } ###################################################################### # Experimental function to include a population offset in the # farrington procedure based on algo.farrington.fitGLM # Alternative: include populationOffset argument in the two other # fit functions, but I suspect use of this is not so common # # Parameters: # takes an additional "population" parameter ###################################################################### algo.farrington.fitGLM.populationOffset <- function(response,wtime,population,timeTrend=TRUE,reweight=TRUE,...) { #Model formula depends on whether to include a time trend or not. theModel <- as.formula(ifelse(timeTrend, "response~offset(log(population)) + 1 + wtime","response~offset(log(population)) + 1")) #Fit it -- this is slow. An improvement would be to use glm.fit here. model <- glm(theModel, family = quasipoisson(link="log")) #Check convergence - if no convergence we return empty handed. if (!model$converged) { #Try without time dependence if (timeTrend) { model <- glm(response ~ 1, family = quasipoisson(link="log")) cat("Warning: No convergence with timeTrend -- trying without.\n") } if (!model$converged) { cat("Warning: No convergence in this case.\n") print(cbind(response,wtime)) return(NULL) } } #Overdispersion parameter phi phi <- max(summary(model)$dispersion,1) #In case reweighting using Anscome residuals is requested if (reweight) { s <- anscombe.residuals(model,phi) omega <- algo.farrington.assign.weights(s) model <- glm(theModel,family=quasipoisson(link="log"),weights=omega) #Here, the overdispersion often becomes small, so we use the max #to ensure we don't operate with quantities less than 1. phi <- max(summary(model)$dispersion,1) } # end of refit. #Add wtime, response and phi to the model model$phi <- phi model$wtime <- wtime model$response <- response model$population <- population #Done return(model) } ################################################### ### code chunk number 4: algo_farrington.Rnw:344-370 ################################################### algo.farrington.threshold <- function(pred,phi,alpha=0.01,skewness.transform="none",y) { #Fetch mu0 and var(mu0) from the prediction object mu0 <- pred$fit tau <- phi + (pred$se.fit^2)/mu0 #Standard deviation of prediction, i.e. sqrt(var(h(Y_0)-h(\mu_0))) switch(skewness.transform, "none" = { se <- sqrt(mu0*tau); exponent <- 1}, "1/2" = { se <- sqrt(1/4*tau); exponent <- 1/2}, "2/3" = { se <- sqrt(4/9*mu0^(1/3)*tau); exponent <- 2/3}, { stop("No proper exponent in algo.farrington.threshold.")}) #Note that lu can contain NA's if e.g. (-1.47)^(3/2) lu <- sort((mu0^exponent + c(-1,1)*qnorm(1-alpha/2)*se)^(1/exponent),na.last=FALSE) #Ensure that lower bound is non-negative lu[1] <- max(0,lu[1],na.rm=TRUE) #Compute quantiles of the predictive distribution based on the #normal approximation on the transformed scale q <- pnorm( y^(1/exponent) , mean=mu0^exponent, sd=se) m <- qnorm(0.5, mean=mu0^exponent, sd=se)^(1/exponent) #Return lower and upper bounds return(c(lu,q=q,m=m)) } ################################################### ### code chunk number 5: algo_farrington.Rnw:412-451 ################################################### ###################################################################### # Compute indices of reference value using Date class # # Params: # t0 - Date object describing the time point # b - Number of years to go back in time # w - Half width of window to include reference values for # epochStr - "1 month", "1 week" or "1 day" # epochs - Vector containing the epoch value of the sts/disProg object # # Details: # Using the Date class the reference values are formed as follows: # Starting from d0 go i, i in 1,...,b years back in time. # # Returns: # a vector of indices in epochs which match ###################################################################### refvalIdxByDate <- function(t0, b, w, epochStr, epochs) { refDays <- NULL refPoints <- seq( t0, length=b+1, by="-1 year")[-1] #Loop over all b-lagged points and append appropriate w-lagged points for (j in 1:length(refPoints)) { refPointWindow <- c(rev(seq(refPoints[j], length=w+1, by=paste("-",epochStr,sep=""))), seq(refPoints[j], length=w+1, by=epochStr)[-1]) refDays <- append(refDays,refPointWindow) } if (epochStr == "1 week") { #What weekday is t0 (0=Sunday, 1=Monday, ...) epochWeekDay <- as.numeric(format(t0,"%w")) #How many days to go forward to obtain the next "epochWeekDay", i.e. (d0 - d) mod 7 dx.forward <- (epochWeekDay - as.numeric(format(refDays,"%w"))) %% 7 #How many days to go backward to obtain the next "epochWeekDay", i.e. (d - d0) mod 7 dx.backward <- (as.numeric(format(refDays,"%w")) - epochWeekDay) %% 7 #What is shorter - go forward or go backward? #By convention: always go to the closest weekday as t0 refDays <- refDays + ifelse(dx.forward < dx.backward, dx.forward, -dx.backward) } if (epochStr == "1 month") { #What day of the month is t0 (it is assumed that all epochs have the same value here) epochDay <- as.numeric(format(t0,"%d")) #By convention: go back in time to closest 1st of month refDays <- refDays - (as.numeric(format(refDays, "%d")) - epochDay) } #Find the index of these reference values wtime <- match(as.numeric(refDays), epochs) return(wtime) } ################################################### ### code chunk number 6: algo_farrington.Rnw:571-769 ################################################### algo.farrington <- function(disProgObj, control=list(range=NULL, b=3, w=3, reweight=TRUE, verbose=FALSE,alpha=0.01,trend=TRUE,limit54=c(5,4),powertrans="2/3",fitFun=c("algo.farrington.fitGLM.fast","algo.farrington.fitGLM","algo.farrington.fitGLM.populationOffset"))) { #Fetch observed observed <- disProgObj$observed freq <- disProgObj$freq epochStr <- switch( as.character(freq), "12" = "1 month","52" = "1 week","365" = "1 day") #Fetch population (if it exists) if (!is.null(disProgObj$populationFrac)) { population <- disProgObj$populationFrac } else { population <- rep(1,length(observed)) } ###################################################################### # Fix missing control options ###################################################################### if (is.null(control$range)) { control$range <- (freq*control$b - control$w):length(observed) } if (is.null(control$b)) {control$b=5} if (is.null(control$w)) {control$w=3} if (is.null(control$reweight)) {control$reweight=TRUE} if (is.null(control$verbose)) {control$verbose=FALSE} if (is.null(control$alpha)) {control$alpha=0.05} if (is.null(control$trend)) {control$trend=TRUE} if (is.null(control$plot)) {control$plot=FALSE} if (is.null(control$limit54)) {control$limit54=c(5,4)} if (is.null(control$powertrans)){control$powertrans="2/3"} if (is.null(control$fitFun)) { control$fitFun="algo.farrington.fitGLM.fast" } else { control$fitFun <- match.arg(control$fitFun, c("algo.farrington.fitGLM.fast","algo.farrington.fitGLM","algo.farrington.fitGLM.populationOffset")) } #Use special Date class mechanism to find reference months/weeks/days if (is.null(disProgObj[["epochAsDate",exact=TRUE]])) { epochAsDate <- FALSE } else { epochAsDate <- disProgObj[["epochAsDate",exact=TRUE]] } #check options if (!((control$limit54[1] >= 0) & (control$limit54[2] > 0))) { stop("The limit54 arguments are out of bounds: cases >= 0 and period > 0.") } #Check control$range is within bounds. if (any((control$range < 1) | (control$range > length(disProgObj$observed)))) { stop("Range values are out of bounds (has to be within 1..",length(disProgObj$observed)," for the present data).") } # initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) trend <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) # predictive distribution pd <- matrix(data = 0, nrow = length(control$range), ncol = 2) # Define objects n <- control$b*(2*control$w+1) # 2: Fit of the initial model and first estimation of mean and dispersion # parameter for (k in control$range) { # transform the observed vector in the way # that the timepoint to be evaluated is at last position #shortObserved <- observed[1:(maxRange - k + 1)] if (control$verbose) { cat("k=",k,"\n")} #Find index of all epochs, which are to be used as reference values #i.e. with index k-w,..,k+w #in the years (current year)-1,...,(current year)-b if (!epochAsDate) { wtimeAll <- NULL for (i in control$b:1){ wtimeAll <- append(wtimeAll,seq(k-freq*i-control$w,k-freq*i+control$w,by=1)) } #Select them as reference values - but only those who exist wtime <- wtimeAll[wtimeAll>0] if (length(wtimeAll) != length(wtime)) { warning("@ range= ",k,": With current b and w then ",length(wtimeAll) - length(wtime),"/",length(wtimeAll), " reference values did not exist (index<1).") } } else { #Alternative approach using Dates t0 <- as.Date(disProgObj$week[k], origin="1970-01-01") wtimeAll <- refvalIdxByDate( t0=t0, b=control$b, w=control$w, epochStr=epochStr, epochs=disProgObj$week) #Select them as reference values (but only those not being NA!) wtime <- wtimeAll[!is.na(wtimeAll)] #Throw warning if necessary if (length(wtimeAll) != length(wtime)) { warning("@ range= ",k,": With current b and w then ",length(wtimeAll) - length(wtime),"/",length(wtimeAll), " reference values did not exist (index<1).") } } #Extract values from indices response <- observed[wtime] pop <- population[wtime] if (control$verbose) { print(response)} ###################################################################### #Fit the model with overdispersion -- the initial fit ###################################################################### #New feature: fitFun can now be the fast function for fitting the GLM model <- do.call(control$fitFun, args=list(response=response,wtime=wtime,population=pop,timeTrend=control$trend,reweight=control$reweight)) #Stupid check to pass on NULL values from the algo.farrington.fitGLM proc. if (is.null(model)) return(model) ###################################################################### #Time trend # #Check whether to include time trend, to do this we need to check whether #1) wtime is signifcant at the 95lvl #2) the predicted value is not larger than any observed value #3) the historical data span at least 3 years. doTrend <- control$trend #Bug discovered by Julia Kammerer and Sabrina Heckl: Only investigate trend if it actually was part of the GLM #if (control$trend) { if ("wtime" %in% names(coef(model))){ #is the p-value for the trend significant (0.05) level p <- summary.glm(model)$coefficients["wtime",4] significant <- (p < 0.05) #prediction for time k mu0Hat <- predict.glm(model,data.frame(wtime=c(k),population=population[k]),type="response") #have to use at least three years of data to allow for a trend atLeastThreeYears <- (control$b>=3) #no horrible predictions noExtrapolation <- mu0Hat <= max(response) #All 3 criteria have to be met in order to include the trend. Otherwise #it is removed. Only necessary to check this if a trend is requested. if (!(atLeastThreeYears && significant && noExtrapolation)) { doTrend <- FALSE model <- do.call(control$fitFun, args=list(response=response,wtime=wtime,population=pop,timeTrend=FALSE,reweight=control$reweight)) } } else { doTrend <- FALSE } #done with time trend ###################################################################### ###################################################################### # Calculate prediction & confidence interval # ###################################################################### #Predict value - note that the se is the mean CI #and not the prediction error of a single observation pred <- predict.glm(model,data.frame(wtime=c(k),population=population[k]),dispersion=model$phi, type="response",se.fit=TRUE) #Calculate lower and upper threshold lu <- algo.farrington.threshold(pred,model$phi,skewness.transform=control$powertrans,alpha=control$alpha, observed[k]) ###################################################################### # If requested show a plot of the fit. ###################################################################### if (control$plot) { #Compute all predictions data <- data.frame(wtime=seq(min(wtime),k,length=1000)) preds <- predict(model,data,type="response",dispersion=model$phi) #Show a plot of the model fit. plot(c(wtime, k), c(response,observed[k]),ylim=range(c(observed[data$wtime],lu)),,xlab="time",ylab="No. infected",main=paste("Prediction at time t=",k," with b=",control$b,",w=",control$w,sep=""),pch=c(rep(1,length(wtime)),16)) #Add the prediction lines(data$wtime,preds,col=1,pch=2) #Add the thresholds to the plot lines(rep(k,2),lu[1:2],col=3,lty=2) } ###################################################################### #Postprocessing steps ###################################################################### #Compute exceedance score unless less than 5 reports during last 4 weeks. #Changed in version 0.9-7 - current week is included now enoughCases <- (sum(observed[(k-control$limit54[2]+1):k])>=control$limit54[1]) #18 May 2006: Bug/unexpected feature found by Y. Le Strat. #the okHistory variable meant to protect against zero count problems, #but instead it resulted in exceedance score == 0 for low counts. #Now removed to be concordant with the Farrington 1996 paper. X <- ifelse(enoughCases,(observed[k] - pred$fit) / (lu[2] - pred$fit),0) #Do we have an alarm -- i.e. is observation beyond CI?? #upperbound only relevant if we can have an alarm (enoughCases) trend[k-min(control$range)+1] <- doTrend alarm[k-min(control$range)+1] <- (X>1) upperbound[k-min(control$range)+1] <- ifelse(enoughCases,lu[2],0) #Compute bounds of the predictive pd[k-min(control$range)+1,] <- lu[c(3,4)] }#done looping over all time points #Add name and data name to control object. control$name <- paste("farrington(",control$w,",",0,",",control$b,")",sep="") control$data <- paste(deparse(substitute(disProgObj))) #Add information about predictive distribution control$pd <- pd # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, trend=trend, disProgObj=disProgObj, control=control) class(result) <- "survRes" #Done return(result) } surveillance/R/farringtonFlexible.r0000644000176000001440000010641312177702702017220 0ustar ripleyusers# ____________________________ # |\_________________________/|\ # || || \ # || algo.farrington || \ # || new version || | # || || | # || || | # || || | # || || | # || || / # ||_________________________|| / # |/_________________________\|/ # __\_________________/__/|_ # |_______________________|/ ) # ________________________ (__ # /oooo oooo oooo oooo /| _ )_ # /ooooooooooooooooooooooo/ / (_)_(_) # /ooooooooooooooooooooooo/ / (o o) #/C=_____________________/_/ ==\o/== # Version of the 26.06.2013 # M.Salmon, M.Hoehle ################################################################################ # CONTENTS ################################################################################ # # MAIN FUNCTION # Function that manages input and output. # # RESIDUALS FUNCTION # Function that calculates Anscombe residuals. # # WEIGHTS FUNCTION # Function that calculates weights based on these residuals. # # FORMULA FUNCTION # Function that writes a formula for the glm using Booleans from control. # # FIT GLM FUNCTION # Function that fits a GLM. If it does not converge this function tries to fit it without time trend. # # THRESHOLD FUNCTION # Function that calculates the lower and upper threshold, the probability of observing a count that is >= observed, and the score. # There are two versions of this function depending on the method chosen. # # BLOCKS FUNCTION # Function that creates the factor variable for the glm. # # DATA GLM FUNCTION # Function that prepares data for the glm # # GLM FUNCTION # Function that calls fit glm, checkst he time trend and calculate the prediction fort he current timepoint. ################################################################################ # END OF CONTENTS ################################################################################ ################################################################################ # MAIN FUNCTION ################################################################################ farringtonFlexible <- function(sts, control = list(range = NULL, b = 3, w = 3, reweight = TRUE, weightsThreshold = 2.58, verbose = FALSE,glmWarnings = TRUE, alpha = 0.01, trend = TRUE, pThresholdTrend = 0.05, limit54=c(5,4), powertrans="2/3", fitFun="algo.farrington.fitGLM.flexible", populationOffset = FALSE, noPeriods = 1, pastWeeksNotIncluded = 26, thresholdMethod = "delta")) { ###################################################################### # Use special Date class mechanism to find reference months/weeks/days ###################################################################### if (is.null( sts@epochAsDate)) { epochAsDate <- FALSE } else { epochAsDate <- sts@epochAsDate } ###################################################################### # Fetch observed and population ###################################################################### # Fetch observed observed <- observed(sts) freq <- sts@freq if (epochAsDate) { epochStr <- switch( as.character(freq), "12" = "month","52" = "week", "365" = "day") } else { epochStr <- "none" } # Fetch population (if it exists) if (!is.null(population(sts))) { population <- population(sts) } else { population <- rep(1,length(observed)) } ###################################################################### # Fix missing control options ###################################################################### # How many years to go back in time? if (is.null(control[["b",exact=TRUE]])) { control$b = 5 } # Half-window length if (is.null(control[["w", exact = TRUE]])) { control$w = 3 } # Range of time points to be evaluated if (is.null(control[["range", exact=TRUE]])) { control$range <- (freq*(control$b)+control$w +1):dim(observed)[1] } # Reweighting past outbreaks? if (is.null(control[["reweight",exact=TRUE]])) {control$reweight=TRUE} # With which threshold? if (is.null(control[["weightsThreshold",exact=TRUE]])) { control$weightsThreshold=2.58 } # Printing information? if (is.null(control[["verbose",exact=TRUE]])) {control$verbose=FALSE} # Printing warning from glm.fit? if (is.null(control[["glmWarnings",exact=TRUE]])) {control$glmWarnings=TRUE} # An approximate (two-sided) (1 - alpha)% prediction interval is calculated if (is.null(control[["alpha",exact=TRUE]])) {control$alpha=0.05} # Include a time trend when possible? if (is.null(control[["trend",exact=TRUE]])) {control$trend=TRUE} # Which pvalue for the time trend to be significant? if (is.null(control[["pThresholdTrend",exact=TRUE]])){ control$pThresholdTrend=0.05} # No alarm is sounded # if fewer than cases = 5 reports were received in the past period = 4 # weeks. limit54=c(cases,period) is a vector allowing the user to change # these numbers if (is.null(control[["limit54",exact=TRUE]])) {control$limit54=c(5,4)} # Power transformation to apply to the data. if (is.null(control[["powertrans",exact=TRUE]])){control$powertrans="2/3"} # How many noPeriods between windows around reference weeks? if (is.null(control[["noPeriods",exact=TRUE]])){control$noPeriods=1} # Use factors in the model? Depends on noPeriods, no input from the user. if (control$noPeriods!=1) { control$factorsBool=TRUE } else { control$factorsBool=FALSE } # Use a population offset in the model? if (is.null(control[["populationOffset",exact=TRUE]])) { control$populationOffset=FALSE } # How many past weeks not to take into account? if (is.null(control[["pastWeeksNotIncluded",exact=TRUE]])){ control$pastWeeksNotIncluded=control$w } # Which function to use? # Only one possibility at the moment if (is.null(control[["fitFun",exact=TRUE]])) { control$fitFun="algo.farrington.fitGLM.flexible" } else { control$fitFun <- match.arg(control$fitFun, c( "algo.farrington.fitGLM.flexible")) } # Which method for calculating the threshold? # Extracting the method if (is.null(control[["thresholdMethod",exact=TRUE]])) { control$thresholdMethod="delta"} thresholdMethod<- match.arg(control$thresholdMethod, c("delta","nbPlugin","pban"),several.ok=FALSE) # Adapt the argument for the glm function control$typePred <- switch(thresholdMethod, "delta"="response","nbPlugin"="link","pban"="link") # Which threshold function? control$thresholdFunction <- switch(thresholdMethod, "delta"="algo.farrington.threshold.farrington", "nbPlugin"="algo.farrington.threshold.noufaily", "pban"="algo.farrington.threshold.noufaily") ###################################################################### # Check options ###################################################################### if (!((control$limit54[1] >= 0) && (control$limit54[2] > 0))) { stop("The limit54 arguments are out of bounds: cases >= 0 and period > 0.") } ###################################################################### # Initialize the necessary vectors ###################################################################### # Vector for score score <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$score <- score # Vector for time trend trend <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) # Vector for predictive distribution pvalue <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$pvalue <- pvalue # Vector for expected count expected <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$expected <- expected # Vector for mu0 (prediction from glm) mu0Vector <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$mu0Vector <- mu0Vector # Vector for overdispersion phi (from glm) phiVector <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$phiVector <- phiVector # Vector for time trend (from glm) trendVector <- matrix(data = 0, nrow = length(control$range), ncol = ncol(sts)) sts@control$trendVector <- trendVector # Define objects n <- control$b*(2*control$w+1) # loop over columns of sts for (j in 1:ncol(sts)) { #Vector of dates if (epochAsDate){ vectorOfDates <- as.Date(sts@epoch, origin="1970-01-01") } else { vectorOfDates <- seq_len(length(observed[,j])) } # Loop over control$range for (k in control$range) { ###################################################################### # Prepare data for the glm ###################################################################### dayToConsider <- vectorOfDates[k] diffDates <- diff(vectorOfDates) dataGLM <- algo.farrington.data.glm(dayToConsider=dayToConsider, b=control$b, freq=freq, epochAsDate=epochAsDate, epochStr=epochStr, vectorOfDates=vectorOfDates,w=control$w, noPeriods=control$noPeriods, observed=observed[,j],population=population, verbose=control$verbose, pastWeeksNotIncluded=control$pastWeeksNotIncluded,k) ###################################################################### # Fit the model ###################################################################### finalModel <- algo.farrington.glm(dataGLM,timeTrend=control$trend,populationOffset=control$populationOffset, factorsBool=control$factorsBool,reweight=control$reweight, weightsThreshold=control$weightsThreshold, pThresholdTrend=control$pThresholdTrend,b=control$b, noPeriods=control$noPeriods,typePred=control$typePred, fitFun=control$fitFun,glmWarnings=control$glmWarnings, epochAsDate=epochAsDate,dayToConsider=dayToConsider, diffDates=diffDates,populationNow=population[k],k, verbose=control$verbose) pred <- finalModel$pred doTrend <- finalModel$doTrend coeffTime <- finalModel$coeffTime ###################################################################### # Calculate lower and upper threshold ###################################################################### argumentsThreshold <- list(predFit=pred$fit,predSeFit=pred$se.fit, phi=finalModel$phi, skewness.transform=control$powertrans, alpha=control$alpha, y=observed[k], method=control$thresholdMethod ) lu <- do.call(control$thresholdFunction, args=argumentsThreshold) ###################################################################### # Postprocessing steps & output ###################################################################### #Compute exceedance score unless less than 5 reports during last 4 weeks. #Changed in version 0.9-7 - current week is included now enoughCases <- (sum(observed[(k-control$limit54[2]+1):k,j]) >=control$limit54[1]) #18 May 2006: Bug/unexpected feature found by Y. Le Strat. #the okHistory variable meant to protect against zero count problems, #but instead it resulted in exceedance score == 0 for low counts. #Now removed to be concordant with the Farrington 1996 paper. X <- ifelse(enoughCases,lu$score,NA) #Do we have an alarm -- i.e. is observation beyond CI?? #upperbound only relevant if we can have an alarm (enoughCases) sts@alarm[k,j] <- !is.na(X) && (X>=1) sts@upperbound[k,j] <- ifelse(enoughCases,lu$upper,NA) # Possible bug alarm although upperbound <- 0? # Calculate expected value from glm if (is.na(lu$upper)==FALSE){ if ( control$typePred=="response"){ expected[(k-min(control$range)+1),j] <- ifelse(enoughCases,pred$fit,NA) } else{ expected[(k-min(control$range)+1),j] <- ifelse(enoughCases,exp(pred$fit),NA) } }else{ expected[(k-min(control$range)+1),j] <- NA } # Calculate mean of the negbin distribution of the observation # Use linear predictor mean and sd eta0 <- pred$fit seEta0 <- pred$se.fit # deduce the quantile for mu0 from eta0 which is normally distributed if (control$thresholdMethod=='nbPlugin'){ mu0Vector[(k-min(control$range)+1),j] <- exp(eta0) } else { mu0Vector[(k-min(control$range)+1),j] <- exp(qnorm(1-control$alpha, mean=eta0, sd=seEta0)) } # Get overdispersion phiVector[(k-min(control$range)+1),j] <- finalModel$phi # Get score score[(k-min(control$range)+1),j] <- lu$score #Compute bounds of the predictive pvalue[(k-min(control$range)+1),j] <- lu$prob # Time trend if(doTrend){ trendVector[(k-min(control$range)+1),j] <- coeffTime trend[(k-min(control$range)+1),j] <- 1 } else { trendVector[(k-min(control$range)+1),j] <- NA } }#done looping over all time points } #end of loop over cols in sts. # Add information about score sts@control$score[,j] <- score[,j] # Add information about trend sts@control$trend[,j] <- trend[,j] #Add information about predictive distribution sts@control$pvalue[,j] <- pvalue[,j] # Add information about expected value sts@control$expected[,j] <- expected[,j] # Add information about mean of the negbin distribution of the observation sts@control$mu0Vector[,j] <- mu0Vector[,j] # Add information about overdispersion sts@control$phiVector[,j] <- phiVector[,j] # Add information about time trend sts@control$trendVector[,j] <- trendVector[,j] #Done return(sts[control$range,]) } ################################################################################ # END OF MAIN FUNCTION ################################################################################ ################################################################################ # REFERENCE TIME POINTS FUNCTION ################################################################################ algo.farrington.referencetimepoints <- function(dayToConsider,b=control$b,freq=freq,epochAsDate,epochStr){ if (epochAsDate) { referenceTimePoints <- as.Date(seq(as.Date(dayToConsider, origin="1970-01-01"), length=(b+1), by="-1 year")) } else { referenceTimePoints <- seq(dayToConsider, length=(b+1),by=-freq) if (referenceTimePoints[b+1]<=0){ warning("Some reference values did not exist (index<1).") } } if (epochStr == "week") { # get the date of the Mondays/Tuesdays/etc so that it compares to # the reference data # (Mondays for Mondays for instance) # Vectors of same days near the date (usually the same week) # dayToGet dayToGet <- as.numeric(format(dayToConsider, "%w")) actualDay <- as.numeric(format(referenceTimePoints, "%w")) referenceTimePointsA <- referenceTimePoints - (actualDay - dayToGet) # Find the other "same day", which is either before or after referenceTimePoints referenceTimePointsB <- referenceTimePointsA + ifelse(referenceTimePointsA>referenceTimePoints,-7,7) # For each year choose the closest Monday/Tuesday/etc # The order of referenceTimePoints is NOT important AB <- cbind(referenceTimePointsA,referenceTimePointsB) ABnumeric <- cbind(as.numeric(referenceTimePointsA),as.numeric(referenceTimePointsB)) distMatrix <- abs(ABnumeric-as.numeric(referenceTimePoints)) idx <- (distMatrix[,1]>distMatrix[,2])+1 referenceTimePoints <- as.Date(AB[cbind(1:dim(AB)[1],idx)],origin="1970-01-01") } return(referenceTimePoints) } ################################################################################ # END OF REFERENCE TIME POINTS FUNCTION ################################################################################ ################################################################################ # RESIDUALS FUNCTION ################################################################################ anscombe.residuals <- function(m,phi) { y <- m$y mu <- fitted.values(m) #Compute raw Anscombe residuals a <- 3/2*(y^(2/3) * mu^(-1/6) - mu^(1/2)) #Compute standardized residuals a <- a/sqrt(phi * (1-hatvalues(m))) return(a) } ################################################################################ # END OF RESIDUALS FUNCTION ################################################################################ ## ################################################################################ ## # WEIGHTS FUNCTION -- this function has been changed in the original algo_farrington ## # implementation. ## ################################################################################ ## ## algo.farrington.assign.weights <- function(s,weightsThreshold) { ## #s_i^(-2) for s_iweightsThreshold) )) ## omega <- numeric(length(s)) ## omega[s>weightsThreshold] <- gamma*(s[s>weightsThreshold]^(-2)) ## omega[s<=weightsThreshold] <- gamma ## return(omega) ## } ## ################################################################################ ## # END OF WEIGHTS FUNCTION ## ################################################################################ ################################################################################ # FORMULA FUNCTION ################################################################################ # Function for writing the good formula depending on timeTrend, # populationOffset and factorsBool formulaGLM <- function(populationOffset=FALSE,timeBool=TRUE,factorsBool=FALSE){ # Description # Args: # populationOffset: --- # Returns: # Vector of X # Smallest formula formulaString <- "response ~ 1" # With time trend? if (timeBool){ formulaString <- paste(formulaString,"+wtime",sep ="")} # With population offset? if(populationOffset){ formulaString <- paste(formulaString,"+offset(log(population))",sep ="")} # With factors? if(factorsBool){ formulaString <- paste(formulaString,"+seasgroups",sep ="")} # Return formula as a string return(formulaString) } ################################################################################ # END OF FORMULA FUNCTION ################################################################################ ################################################################################ # FIT GLM FUNCTION ################################################################################ algo.farrington.fitGLM.flexible <- function(dataGLM, timeTrend,populationOffset,factorsBool,reweight,weightsThreshold,glmWarnings,verbose,control,...) { # Model formula depends on whether to include a time trend or not. theModel <- formulaGLM(populationOffset,timeBool=timeTrend,factorsBool) # Fit it -- this is slow. An improvement would be to use glm.fit here. # This would change the syntax, however. if (glmWarnings) { model <- glm(formula(theModel),data=dataGLM,family = quasipoisson(link="log")) } else { model <- suppressWarnings(glm(formula(theModel),data=dataGLM,family = quasipoisson(link="log"))) } #Check convergence - if no convergence we return empty handed. if (!model$converged) { #Try without time dependence if (timeTrend) { theModel <- formulaGLM(populationOffset,timeBool=F,factorsBool) if (glmWarnings) { model <- glm(as.formula(theModel), data=dataGLM, family = quasipoisson(link="log")) } else { model <- suppressWarnings(glm(as.formula(theModel), data=dataGLM, family = quasipoisson(link="log"))) } if (verbose) {cat("Warning: No convergence with timeTrend -- trying without.\n")} } if (!model$converged) { if (verbose) {cat("Warning: No convergence in this case.\n")} if (verbose) {print(dataGLM[,c("response","wtime"),exact=TRUE])} return(NULL) } } #Overdispersion parameter phi phi <- max(summary(model)$dispersion,1) #In case reweighting using Anscome residuals is requested if (reweight) { s <- anscombe.residuals(model,phi) omega <- algo.farrington.assign.weights(s,weightsThreshold) if (glmWarnings) { model <- glm(as.formula(theModel),data=dataGLM, family=quasipoisson(link="log"), weights=omega) } else { model <- suppressWarnings(glm(as.formula(theModel),data=dataGLM, family=quasipoisson(link="log"), weights=omega)) } #Here, the overdispersion often becomes small, so we use the max #to ensure we don't operate with quantities less than 1. phi <- max(summary(model)$dispersion,1) } # end of refit. #Add wtime, response and phi to the model model$phi <- phi model$wtime <- dataGLM$wtime model$response <- dataGLM$response model$population <- dataGLM$population if (reweight) { model$weights <- omega } else{ model$weights <- model$weights } #Done return(model) } ################################################################################ # END OF FIT GLM FUNCTION ################################################################################ ################################################################################ # THRESHOLD FUNCTION FARRINGTON ################################################################################ algo.farrington.threshold.farrington <- function(predFit,predSeFit,phi, skewness.transform, alpha,y,method){ #Fetch mu0 and var(mu0) from the prediction object mu0 <- predFit tau <- phi + (predSeFit^2)/mu0 #Standard deviation of prediction, i.e. sqrt(var(h(Y_0)-h(\mu_0))) switch(skewness.transform, "none" = { se <- sqrt(mu0*tau); exponent <- 1}, "1/2" = { se <- sqrt(1/4*tau); exponent <- 1/2}, "2/3" = { se <- sqrt(4/9*mu0^(1/3)*tau); exponent <- 2/3}, { stop("No proper exponent in algo.farrington.threshold.")}) #Note that lu can contain NA's if e.g. (-1.47)^(3/2) lu <- sort((mu0^exponent + c(-1,1)*qnorm(1-alpha)*se)^(1/exponent), na.last=FALSE) #Ensure that lower bound is non-negative lu[1] <- max(0,lu[1],na.rm=TRUE) # probability associated to the observed value as quantile q <- pnorm( y^(1/exponent) , mean=mu0^exponent, sd=se,lower.tail=FALSE) # calculate score x <- ifelse(is.na(lu[2])==FALSE,(y - predFit) / (lu[2] - predFit),NA) return(list(lower=lu[1],upper=lu[2],prob=q,score=x)) } ################################################################################ # END OF THRESHOLD FUNCTION FARRINGTON ################################################################################ ################################################################################ # THRESHOLD FUNCTION NOUFAILY ################################################################################ algo.farrington.threshold.noufaily <- function(predFit,predSeFit,phi, skewness.transform, alpha,y,method){ # method of Angela Noufaily with modifications # Use linear predictor mean and sd eta0 <- predFit seEta0 <- predSeFit # deduce the quantile for mu0 from eta0 which is normally distributed if (method=='nbPlugin'){ mu0Quantile <- exp(eta0) } else { mu0Quantile <- exp(qnorm(1-alpha, mean=eta0, sd=seEta0)) } if (mu0Quantile==Inf){ lu <- c(NA,NA) q <- NA # else is when the method is "pban" } else{ # Two cases depending on phi value if (phi>1){ lu<-c(qnbinom(alpha/2,mu0Quantile/(phi-1),1/phi), qnbinom(1-alpha/2,mu0Quantile/(phi-1),1/phi)) } else { lu<-c(qpois(alpha/2,mu0Quantile),qpois(1-alpha/2,mu0Quantile)) } # cannot be negative lu[1]=max(0,lu[1]) # probability associated to the observed value as quantile if (phi!=1){ q <- pnbinom(q= y-1 ,size=mu0Quantile/(phi-1),prob=1/phi,lower.tail=FALSE) } else{ q <- ppois(y-1,mu0Quantile,lower.tail=FALSE) } } # calculate score x <- ifelse(is.na(lu[2])==FALSE,(y - predFit) / (lu[2] - predFit),NA) return(list(lower=lu[1],upper=lu[2],prob=q,score=x)) } ################################################################################ # END OF THRESHOLD FUNCTION NOUFAILY ################################################################################ ################################################################################ # BLOCKS FUNCTION ################################################################################ blocks <- function(referenceTimePoints,vectorOfDates,freq,dayToConsider,b,w,p, epochAsDate) { ## INPUT # freq: are we dealing with daily/weekly/monthly data? # b: how many years to go back in time # w: half window length around the reference timepoints # p: number of noPeriods one wants the year to be split into ## VECTOR OF ABSOLUTE NUMBERS # Very useful to write the code! vectorOfAbsoluteNumbers <- seq_len(length(vectorOfDates)) # logical vector indicating where the referenceTimePoints # are in the vectorOfDates referenceTimePointsOrNot <- vectorOfDates %in% referenceTimePoints ## VECTOR OF FACTORS vectorOfFactors <- rep(NA,length(vectorOfDates)) ## SETTING THE FACTORS # Current week if (epochAsDate==FALSE){ now <- which(vectorOfDates==dayToConsider) } else { now <- which(vectorOfDates==as.Date(dayToConsider)) } vectorOfFactors[(now-w):now] <- p # Reference weeks referenceWeeks <- rev(as.numeric( vectorOfAbsoluteNumbers[referenceTimePointsOrNot=='TRUE'])) for (i in 1:b) { # reference week refWeek <- referenceWeeks[i+1] vectorOfFactors[(refWeek-w):(refWeek+w)] <- p # The rest is only useful if ones want factors, otherwise only have # reference timepoints like in the old algo.farrington if (p!=1){ # Number of time points to be shared between vectors period <- referenceWeeks[i] - 2 * w - 1 - refWeek # Check that p is not too big if (period < (p-(2*w+1))){stop('Number of factors too big!')} # Look for the length of blocks lengthOfBlocks <- period %/% (p-1) rest <- period %% (p-1) vectorLengthOfBlocks <- rep(lengthOfBlocks,p-1) # share the rest of the Euclidian division among the first blocks add <- seq_len(rest) vectorLengthOfBlocks[add] <- vectorLengthOfBlocks[add]+1 # slight transformation necessary for the upcoming code with cumsum vectorLengthOfBlocks <- c(0,vectorLengthOfBlocks) # fill the vector for (j in 1:(p-1)) { vectorOfFactors[(refWeek+w+1+cumsum(vectorLengthOfBlocks)[j]): (refWeek+w+1+cumsum(vectorLengthOfBlocks)[j+1]-1)]<-j } } } ## DONE! return(vectorOfFactors) #indent } ################################################################################ # END OF BLOCKS FUNCTION ################################################################################ ################################################################################ # DATA GLM FUNCTION ################################################################################ algo.farrington.data.glm <- function(dayToConsider, b, freq, epochAsDate,epochStr, vectorOfDates,w,noPeriods, observed,population, verbose,pastWeeksNotIncluded,k){ # Identify reference time points # Same date but with one year, two year, etc, lag # b+1 because we need to have the current week in the vector referenceTimePoints <- algo.farrington.referencetimepoints(dayToConsider,b=b, freq=freq, epochAsDate=epochAsDate, epochStr=epochStr ) if (sum((vectorOfDates %in% min(referenceTimePoints)) == rep(FALSE,length(vectorOfDates))) == length(vectorOfDates)){ warning("Some reference values did not exist (index<1).") } if (verbose) { cat("k=", k,"\n")} # Create the blocks for the noPeriods between windows (including windows) # If noPeriods=1 this is a way of identifying windows, actually. blocks <- blocks(referenceTimePoints,vectorOfDates,epochStr,dayToConsider, b,w,noPeriods,epochAsDate) # Here add option for not taking the X past weeks into account # to avoid adaptation of the model to emerging outbreaks blocksID <- blocks blocksID[(k-pastWeeksNotIncluded):k] <- NA # Extract values for the timepoints of interest only blockIndexes <- which(is.na(blocksID)==FALSE) # Time # if epochAsDate make sure wtime has a 1 increment if (epochAsDate){ wtime <- (as.numeric(vectorOfDates[blockIndexes])- as.numeric(vectorOfDates[blockIndexes][1]))/as.numeric(diff(vectorOfDates))[1] } else { wtime <- as.numeric(vectorOfDates[blockIndexes]) } # Factors seasgroups <- as.factor(blocks[blockIndexes]) # Observed response <- observed[blockIndexes] # Population pop <- population[blockIndexes] if (verbose) { print(response)} dataGLM <- data.frame(response=response,wtime=wtime,population=pop, seasgroups=seasgroups,vectorOfDates=vectorOfDates[blockIndexes]) return(dataGLM) } ################################################################################ # END OF DATA GLM FUNCTION ################################################################################ ################################################################################ # GLM FUNCTION ################################################################################ algo.farrington.glm <- function(dataGLM,timeTrend,populationOffset,factorsBool, reweight,weightsThreshold,pThresholdTrend,b, noPeriods,typePred,fitFun,glmWarnings,epochAsDate, dayToConsider,diffDates,populationNow,k,verbose) { arguments <- list(dataGLM=dataGLM, timeTrend=timeTrend, populationOffset=populationOffset, factorsBool=factorsBool,reweight=reweight, weightsThreshold=weightsThreshold,glmWarnings=glmWarnings, verbose=verbose,control=control) model <- do.call(fitFun, args=arguments) #Stupid check to pass on NULL values from the algo.farrington.fitGLM proc. if (is.null(model)) return(model) ###################################################################### #Time trend ###################################################################### #Check whether to include time trend, to do this we need to check whether #1) wtime is signifcant at the 95lvl #2) the predicted value is not larger than any observed value #3) the historical data span at least 3 years. doTrend <- NULL # if model converged with time trend if ("wtime" %in% names(coef(model))){ # get the prediction for k if(epochAsDate){ wtime=(as.numeric(dayToConsider)-as.numeric(dataGLM$vectorOfDates[1]))/as.numeric(diffDates)[1] } else { wtime <- c(k) } pred <- predict.glm(model,newdata=data.frame(wtime=wtime, population=populationNow, seasgroups=factor(noPeriods), dispersion=model$phi),se.fit=TRUE,type="response") # check if three criterion ok #is the p-value for the trend significant (0.05) level significant <- (summary.glm(model)$coefficients["wtime",4] < pThresholdTrend) #have to use at least three years of data to allow for a trend atLeastThreeYears <- (b>=3) #no horrible predictions noExtrapolation <- (pred$fit <= max(dataGLM$response)) #All 3 criteria have to be met in order to include the trend. Otherwise #it is removed. Only necessary to check this if a trend is requested. doTrend <- (atLeastThreeYears && significant && noExtrapolation) # if not then refit if (doTrend==FALSE) { arguments$timeTrend=FALSE model <- do.call(fitFun, args=arguments) } } else { doTrend <- FALSE } #done with time trend ###################################################################### ###################################################################### # Calculate prediction # ###################################################################### #Predict value if(epochAsDate){ wtime=(as.numeric(dayToConsider)-as.numeric(dataGLM$vectorOfDates[1]))/as.numeric(diffDates)[1] } else { wtime <- c(k) } pred <- predict.glm(model,newdata=data.frame(wtime=wtime, population=populationNow, seasgroups=factor(noPeriods), dispersion=model$phi),se.fit=TRUE,type=typePred) coeffTime=ifelse(doTrend,summary.glm(model)$coefficients["wtime",1],NA) finalModel <- list (pred,doTrend,coeffTime,model$phi) names(finalModel) <- c("pred","doTrend","coeffTime","phi") return(finalModel) } ################################################################################ # END OF GLM FUNCTION ################################################################################ surveillance/R/algo_rogerson.R0000644000176000001440000004125511731650466016202 0ustar ripleyusers################################################### ### chunk number 1: ################################################### ################################################################### # Average Run Lengths for CUSUMs using Markov Chain approach # # based on the program of Hawkins, D. M. (1992) # "Evaluation of Average Run Lengths of Cumulative Sum Charts # for an Arbitrary Data Distribution" # Communications in Statistics--Simulation. 21(4) 1001-1020. #--------------------------------------------------------------- # # for discrete distributions (i.e. Pois, Bin) # and upward CUSUMS (increasing rate,probability) # # Parameters: # h - decision interval h # k - reference value k # distr - "poisson" or "binomial" # theta - distribution parameter for cdf distr, e.g. lambda for ppois, p for pbinomial # W - winsorizing value W (for robust CUSUM) # to get a nonrobust CUSUM set W > k+h # digits - k and h are rounded to digits decimal places # ... - further arguments for distribution # i.e. number of trials n for binomial (defaults to n=1) # # Returns: # ARL - one-sided ARL of the regular (no-head-start) CUSUM ################################################################### arlCusum <- function(h=10, k=3, theta=2.4, distr=c("poisson","binomial"), W=NULL,digits=1,...){ h <- round(h,digits) k <- round(k,digits) #cat("h",h,"k",k,"\n") distr <- match.arg(distr,c("poisson","binomial")) ############## # cdf of a binomial variate with fixed sample size pbinomial <- function(x,p,n=1){ pbinom(x,size=n,prob=p) } ######## distribution <- switch(distr, "poisson" = ppois, "binomial" = pbinomial ) #no winsorization if(is.null(W)) W <- ceiling(h+k+1) # common denominator of h and k denrat <- commonDenom(h,k,digits=digits) #cat("h =",h,"k =",k,"denrat",denrat,"\n") # check parameters for feasibility if(h <=0) stop("Nonpositive decision interval\n") if(W <= k) stop("Winsorization value less than reference value\n") K <- as.integer(k*denrat+0.5) N <- as.integer(denrat) M <- as.integer(h*denrat -0.5) w <- as.integer(W*denrat+0.5) deviat <- abs(K-k*denrat)+abs(M-h*denrat+1)+abs(w-W*denrat) if(deviat > .01) stop("h, k or W not a multiple of 1/denrat\n") # determine probabilities x <- seq(((-M-1)+K)/N,(M+K)/N,by=(1/denrat)) probs <- distribution(x, theta,...) # Winsorization (any observation exeeding some treshold value W is replaced by W # CUSUM is then: S_n = max{0, S_n-1 + min(X_n,W) - k} probs[x>=W] <- 1 #construct transition matrix transition <- matrix(NA,M+1,M+1) transition[1,1] <- probs[(M+2)] #Pr(X <= k) transition[-1,1] <- probs[(M+2)-(1:M)] #Pr(X <= -j+ k) ,j=1,2,...,h-1 transition[1,-1] <- probs[(M+2)+(1:M)]- probs[(M+2)+(1:M)-1] #Pr(X = j+ k) , j=1,2,...,h-1 idx <-rep((M+2):((M+2)+M-1),M)-rep(0:(M-1),each=M) transition[-1,-1] <- matrix(probs[idx]-probs[idx-1],nrow=M,ncol=M,byrow=TRUE) #print(transition) # I - transition matrix R IminusR <- diag(1,M+1) - transition #Solve might work poorly in some cases res <- try(solve(IminusR)%*%rep(1,M+1),silent=TRUE) # res <- try(qr.solve(IminusR)%*%rep(1,M+1),silent=TRUE) if(inherits(res, "try-error")){ warning("I-R singular\n") return(NA) } ARL <- res[1] #FIRARL - one-sided ARL of the FIR CUSUM with head start 0.5h FIRARL <- res[(M+1)/2+1] return(list(ARL=ARL,FIR.ARL=FIRARL)) } ################################################################# # find smallest common denominator of x and y, # i.e find an integer N so that x=X/N and y=Y/N (with X,Y integer) ################################################################# commonDenom <- function(x,y,digits=1){ x <- round(x,digits) y <- round(y,digits) which.max( ( round((x+y)*1:(10^digits),digits)%%1 == 0 ) # (x+y)*N is integer & ( round(x*1:(10^digits),digits)%%1 == 0 ) # x*N is integer & ( round(y*1:(10^digits),digits)%%1 == 0 ) ) # y*N is integer } ################################################### ### chunk number 2: ################################################### ################################################################# # find reference value k for a Poisson /Binomial CUSUM # designed to detect a change from theta0 to theta1 # # digits - k is rounded to digits decimal places if roundK=TRUE # ... - extra arguments for distribution, # i.e number of trials n for binomial, set to 1 if not specified ################################################################## findK <- function(theta0,theta1,distr=c("poisson","binomial"),roundK=FALSE,digits=1,...){ n <- list(...)$n if(is.null(n)) n <- 1 distr <- match.arg(distr,c("poisson","binomial")) k <- switch(distr, "poisson" = (theta1 - theta0)/(log(theta1)-log(theta0)), "binomial" = -n*(log(1-theta1)-log(1-theta0))/(log(theta1*(1-theta0))-log(theta0*(1-theta1))) ) # for discrete data the # Cusum values are of form integer - integer multiple of k # so there is a limited set of possible values of h (and ARL) if(roundK){ # add/substract 0.05 to k so that k isn't an integer or a multiple of 0.5 # when rounded (then the Markov Chain has more states) if(round(k,digits=digits)%%1 == 0.5 | round(k,digits=digits)%%1 == 0){ round.k <- ((k-floor(k))*10^digits)%%1 #print(roundK) if(round.k < .5 ) k <- k+0.5*10^(-digits) else k <- k-0.5*10^(-digits) } k <- round(k,digits=digits) } return(k) } ################################################### ### chunk number 3: ################################################### ################################################################## # function to find the decision limit h so that the # average run length for a Poisson/Binomial CUSUM with in-control # parameter theta0 is (approx.) ARL0 # # Params: # ARL0 - desired in-control ARL # theta0 - in-control parameter # s - change to detect (in stdev) # rel.tol - (relative) tolerance (if attainable) # roundK - should k be rounded up to digits decimal place (avoiding integers, multiples of 0.5) # digits - h is rounded to digits decimal places # distr - "poisson" or "binomial" # ... - further arguments for distribution (i.e number of trials n for "binomial") # # Returns: # vector c(theta0, h, k, ARL, rel.tol) ################################################################# findH <- function(ARL0,theta0,s=1, rel.tol=0.03,roundK=TRUE,distr=c("poisson","binomial"),digits=1,FIR=FALSE,...){ distr <- match.arg(distr,c("poisson","binomial")) #FIR-ARL or zero-start ARL? fir.arl <- ifelse(FIR,2,1) theta1 <- getTheta1(theta0,s=s,distr=distr) k <- findK(theta0,theta1,roundK=roundK,distr=distr,digits=digits,...) # compute ARL for two (arbitrary) points (h1, h2) h1 <- min(12,4*k) arl1 <- arlCusum(h=h1,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- 1 #ensure h1 and arl1 are not too small (-> log. interpolation is better) while(arl1 < 100){ h1 <- 2*h1 arl1 <- arlCusum(h=h1,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- nEval + 1 } h2 <- h1*2^(sign(ARL0-arl1)) arl2 <- arlCusum(h=h2,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- nEval + 1 # determine h (that leads to an ARL of ARL0) using logarithmic interpolation h.hat <- round(logInterpolation(ARL0,h1,h2,arl1,arl2),digits) # what's the actual ARL for h arl <- arlCusum(h=h.hat,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- nEval + 1 relTol <- abs((arl-ARL0)/ARL0) #cat("theta0:", theta0,"k:", k,"h:", h.hat,"ARL:",arl,"relTol:", relTol,"\n") i<-0 signs <- sign(ARL0-arl) convergence <- relTol < rel.tol if(convergence){ # print(nEval) return(c("theta0"=theta0,"h"=h.hat,"k"=k,"ARL"=arl,"rel.tol"=relTol)) } # find hLow so that the target ARL0 is in interval c(ARL(hLow), ARL(h.hat)) denrat <- 1/commonDenom(1,k,digits=digits) steps <- denrat #max(0.1,denrat) # cat("denrat",denrat,"steps",steps,"\n") hLow <- round(h.hat+signs*steps,digits) arlLow <- arlCusum(h=hLow,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- nEval + 1 relTol.Low <- abs((arlLow-ARL0)/ARL0) if(relTol.Low < rel.tol){ # print(nEval) return(c("theta0"=theta0,"h"=hLow,"k"=k,"ARL"=arlLow,"rel.tol"=relTol.Low)) } while(sign(ARL0-arl)*sign(ARL0-arlLow)>0){ # cat("steps:",nEval,"\n") h.hat <- hLow arl <-arlLow relTol <- relTol.Low signs <- sign(ARL0-arl) hLow <- round(h.hat+signs*steps,digits) arlLow <- arlCusum(h=hLow,k=k,theta=theta0,distr=distr,digits=digits,...)[[fir.arl]] nEval <- nEval + 1 relTol.Low <- abs((arlLow-ARL0)/ARL0) if(relTol.Low < rel.tol){ # print(nEval) return(c("theta0"=theta0,"h"=hLow,"k"=k,"ARL"=arlLow,"rel.tol"=relTol.Low)) } # cat("hLow:", hLow,"ARL:",arlLow,"relTol:",relTol.Low,"\n") } # cat("hLow:", hLow,"ARL:",arlLow,"relTol:",relTol.Low,"\n") # return the ARL which is at least the target ARL0 if(sign(ARL0-arlLow)<0){ h.hat <- hLow arl <- arlLow relTol <- relTol.Low } #print(nEval) return(c("theta0"=theta0,"h"=h.hat,"k"=k,"ARL"=arl,"rel.tol"=relTol)) } ################################################################## # find h for various values theta0 # # Params: # theta0 - vector of in control parameter # ARL0 - desired in-control ARL # # Returns: # matrix with columns c(theta0, h, k, ARL, rel.Tol) ################################################################## hValues <- function(theta0,ARL0,rel.tol=0.02,s=1,roundK=TRUE,digits=1,distr=c("poisson","binomial"),FIR=FALSE,...){ distr <- match.arg(distr,c("poisson","binomial")) n <- list(...)$n hVals <- t(sapply(theta0,findH,ARL0=ARL0,rel.tol=rel.tol,s=s,roundK=roundK,digits=digits,distr=distr,FIR=FIR,...)) res <- list(hValues=hVals,ARL0=ARL0,s=s,rel.tol=rel.tol,distribution=distr,firARL=FIR) res$n <- n return(res) } ################################################################## # get the decision limit h for CUSUM with # in-control parameter theta using a "table" of h values # # theta - in-control parameter # hValues - matrix with columns c(theta, h) ################################################################## getH <- function(theta,hValues){ one<- function(theta){ theta.diff <- abs(hValues[,1]-theta) idx <- which.min(theta.diff) h <- hValues[idx,2] if(theta.diff[idx] > 0.05) warning("table doesn't contain h value for theta = ",theta,"\n") return(h) } sapply(theta,one) } ##################################################################### # get decision interval h and reference value k ##################################################################### getHK <- function(theta,hValues){ one<- function(theta){ theta.diff <- abs(hValues[,1]-theta) idx <- which.min(theta.diff) hk <- hValues[idx,2:3] if(theta.diff[idx] > 0.05) warning("table doesn't contain h value for theta = ",theta,"\n") return(hk) } t(sapply(theta,one)) } ################################################################# # get out-of-control parameter theta1 # # X ~ Po(lambda0): theta1 = lambda0 + s*sqrt(lambda0) # theta1 corresponds to a s*stdev increase in mean # # X ~Bin(n,pi) # H0: Odds of failure =pi/(1-pi) vs H1: Odds = s*pi/(1-pi) # prob of failure under H1 is then pi1 = s*pi0/(1+(s-1)*pi0) ################################################################# getTheta1 <- function(theta0,s=1,distr=c("poisson","binomial")){ distr <- match.arg(distr,c("poisson","binomial")) theta1 <- switch(distr, "poisson" = theta0 + s*sqrt(theta0), "binomial" = s*theta0/(1-theta0+s*theta0) ) return(theta1) } ################################################################# # logarithmic interpolation, i.e. linear interpolation of ln(f(x)) # in points (x0,ln(f0)), (x1,ln(f1)) # # (ln(f)-ln(f0))/(ln(f1)-ln(f0)) = (x-x0)/(x1-x0) # # returns: x # # to find decision limit h for given ARL0 set x = h, f(h) = ARL0(h,k) # and solve equation for x ################################################################# logInterpolation <- function(f,x0,x1,f0,f1){ x0 + ((x1-x0)*(log(f)-log(f0)))/(log(f1)-log(f0)) } ################################################### ### chunk number 4: ################################################### # control - list with # range - vector of indices in the observed matrix to monitor # theta0t - matrix with in-control parameter, needs to be specified # ARL0 - desired average run length for each one of the univariate CUSUMs # s - change to detect # hValues - matrix with decision intervals for theta0_t # reset - if TRUE, the CUSUM is reset to zero after an alarm # nt - time varying sample sizes (for Binomial), # matrix of same dimension as theta0t algo.rogerson <- function(disProgObj, control=list(range=range, theta0t=NULL, ARL0=NULL, s=NULL, hValues=NULL, distribution=c("poisson","binomial"), nt=NULL, FIR=FALSE,limit=NULL, digits=1)){ if (is.null(control$s)) { stop("Error: the s value is not specified") } if (is.null(control$hValues)) { stop("Error: the hValues are not specified") } # if (is.null(control$ARL0)) { stop("Error: no ARL0 value specified") } #Default value is poisson control$distribution <- match.arg(control$distribution,c("poisson","binomial")) if(is.null(control$FIR)){ control$FIR <- FALSE } if(is.null(control$limit)) control$limit <- -1 if(is.null(control$digits)) control$digits <- 1 x <- as.matrix(disProgObj$observed[control$range,]) if (is.null(control$theta0t)) { stop("Error: no theta0t vector specified") } else { theta0t <- as.matrix(control$theta0t) } #theta0 <- colMeans(theta0t) #size = length of process size <- nrow(x) nAreas <- ncol(theta0t) theta0 <- rep(mean(theta0t),nAreas) #check dimensions of x, theta0t if(size !=nrow(theta0t) | (ncol(x)%%nAreas)!=0) stop("wrong dimensions\n") reps <- ncol(x)/nAreas #time-varying size n for Binomial nt<-control$nt if(control$distribution=="binomial"){ if(is.null(nt)) nt <- matrix(rep(control$n,size),ncol=1) else nt<-as.matrix(nt) } theta1 <- getTheta1(theta0,s=control$s,distr=control$distribution) theta1t <- getTheta1(theta0t,s=control$s,distr=control$distribution) hk <- getHK(theta0,hValues=control$hValues) k <- hk[,"k"] h <- hk[,"h"] #cat("k =",k,"h =",h,"\n") if(control$FIR){ control$limit <- 0.5 fir <- h/2 } else { fir <- 0 } #cat("fir",fir,"\n") # initialize the necessary vectors # start with cusum[1] = 0 cusum <- matrix(0,nrow=(size+1), ncol=nAreas*reps) cusum[1,] <- fir alarm <- matrix(data = 0, nrow = (size+1), ncol = nAreas*reps) upperbound <- matrix(0,nrow=(size+1),ncol=reps) #CUSUM as in Rogerson (2004) for(t in 1:size){ #choose k_t based upon theta_0t and theta_1t hkt <- getHK(theta0t[t,],hValues=control$hValues) #kt <- hkt[,"k"] kt <- findK(theta0t[t,],theta1t[t,],distr=control$distribution,roundK=TRUE, digits=control$digits, n=nt[t,]) # #for given k_t (theta0t) and ARL_0 choose h_t #ht <- getH(lambda0t[t],control$hValues) ht <- hkt[,"h"] ct <- h/ht # compute cumulative sums of observations x corrected with the # reference value kt, scaled by factor ct # cusum[t+1,]<- pmax(0, cusum[t,] + ct*(x[t,]-kt)) # reset CUSUM to zero if an alarm is given at time t if((control$limit >= 0) & any(alarm[t,]==1)){ cusum.t <- cusum[t,] cusum.t[alarm[t,]==1] <- pmin(cusum[t,], control$limit*h)[alarm[t,]==1] cusum[t+1,]<- pmax(0, cusum.t + ct*(x[t,]-kt)) } else { cusum[t+1,]<- pmax(0, cusum[t,] + ct*(x[t,]-kt)) } # give alarm if the cusum is larger than h alarm[t+1,] <- cusum[t+1,] >= h # in case speed is premium then one might want to comment this line if((control$limit >= 0) & any(alarm[t,]==1)) { upperbound[t+1,] <- ceiling( (h-cusum.t)/ct + kt) } else { upperbound[t+1,] <- ceiling( (h-cusum[t,])/ct + kt) } #Ensure upperbound is positive (this should always be the case) if (upperbound[t+1,] < 0) { upperbound[t+1,] <- 0} } # discard cusum[1] and alarm[1] cusum <- as.matrix(cusum[-1,]) alarm <- as.matrix(alarm[-1,]) upperbound <- as.matrix(upperbound[-1,]) #Add name and data name to control object. control$name <- paste("CUSUM Rogerson:",control$distribution) control$data <- paste(deparse(substitute(disProgObj))) # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj,control=c(control,list(h=h))) class(result) = "survRes" # for surveillance system result return(result) } surveillance/R/earsC.R0000644000176000001440000001422312164275142014365 0ustar ripleyusers# \|||/ # (o o) # ,~~~ooO~~(_)~~~~~~~~~, # | EARS | # | surveillance | # | methods | # | C1, C2 and C3 | # '~~~~~~~~~~~~~~ooO~~~' # |__|__| # || || # ooO Ooo ###################################################################### # Implementation of the EARS surveillance methods. ###################################################################### # DESCRIPTION ###################################################################### # Given a time series of disease counts per month/week/day # this function determines whether there was an outbreak at given time points: # it deduces for each time point an expected value from past values, # it defines an upperbound based on this value and on the variability # of past values # and then it compares the observed value with the upperbound. # If the observed value is greater than the upperbound # then an alert is flagged. # Three methods are implemented. # They do not use the same amount of past data # and are expected to have different specificity and sensibility # from C1 to C3 # the amount of past data used increases, # so does the sensibility # but the specificity decreases. ###################################################################### # PARAMETERS ###################################################################### # range : range of timepoints over which the function will look for # outbreaks. # method : which of the three EARS methods C1, C2 and C3 should be used. # ###################################################################### # INPUT ###################################################################### # A R object of class sts ###################################################################### # OUTPUT ###################################################################### # The same R object of class sts with slot alarm and upperbound filled # by the function ###################################################################### earsC <- function(sts, control = list(range = NULL, method = "C1", alpha = 0.001)) { ###################################################################### #Handle I/O ###################################################################### #If list elements are empty fill them! # Method if (is.null(control[["method",exact=TRUE]])) { control$method <- "C1" } # Extracting the method method <- match.arg( control$method, c("C1","C2","C3"),several.ok=FALSE) # Range # By default it will take all possible weeks # which is not the same depending on the method if (is.null(control[["range",exact=TRUE]])) { if (method == "C1"){ control$range <- c(8:dim(sts@observed)[1]) } if (method == "C2"){ control$range <- c(10:dim(sts@observed)[1]) } if (method == "C3"){ control$range <- c(12:dim(sts@observed)[1]) } } # zAlpha if (is.null(control[["alpha",exact=TRUE]])) { # C1 and C2: Risk of 1st type error of 10-3 # This corresponds to an Z(1-zAlpha) of about 3 if (method %in% c("C1","C2")) { control$alpha = 0.001 } # C3: Risk of 1st type error of 0.025 # This corresponds to an Z(1-zAlpha) of about 2 if (method=="C3") { control$alpha = 0.025 } } # Calculating the threshold zAlpha zAlpha <- qnorm((1-control$alpha)) #Deduce necessary amount of data from method maxLag <- switch(method, C1=7, C2=9, C3=11) # Order range in case it was not given in the right order control$range = sort (control$range) ###################################################################### #Loop over all columns in the sts object #Call the right EARS function depending on the method chosen (1, 2 or 3) ##################################################################### for (j in 1:ncol(sts)) { # check if the vector observed includes all necessary data: maxLag values. if((control$range[1] - maxLag) < 1) { stop("The vector of observed is too short!") } ###################################################################### # Method C1 or C2 ###################################################################### if (method %in% c("C1","C2")) { # Create a matrix with time-lagged vectors refVals <- NULL for (lag in maxLag:(maxLag-6)) { refVals <- cbind(refVals, observed(sts)[(control$range-lag),j]) } # calculate the upperbound sts@upperbound[control$range,j] <- apply(refVals,1,mean)+ zAlpha*apply(refVals,1,sd) } if (method=="C3") { # Create a matrix with time-lagged vectors refVals <- NULL rangeC2 = ((min(control$range) - 2) : max(control$range)) for (lag in 9:3) { refVals <- cbind(refVals, observed(sts)[(rangeC2-lag),j]) } # Calculate C2 C2 <- (observed(sts)[rangeC2,j] - apply(refVals,1,mean)) / apply(refVals,1,sd) # Calculate the upperbound # first calculate the parts of the formula with the maximum of C2 and 0 for # two time lags. partUpperboundLag2 = pmax(rep(0,length=length(C2)-2),C2[1:(length(C2)-2)]-1) partUpperboundLag1 = pmax(rep(0,length=length(C2)-2),C2[2:(length(C2)-1)]-1) sts@upperbound[control$range,j] <- observed(sts)[control$range,j] + apply(as.matrix(refVals[3:length(C2),]),1,sd)*(zAlpha - (partUpperboundLag2 + partUpperboundLag1)) # Upperbound must be superior to 0 which is not always the case #with this formula sts@upperbound[control$range,j] = pmax(rep(0,length(control$range)),sts@upperbound[control$range,j]) } # end of loop over j } #end of loop over cols in sts #Make sts return object control$name <- paste("EARS_",method,sep="") control$data <- paste(deparse(substitute(sts))) sts@control <- control #Where are the alarms? sts@alarm[control$range,] <- matrix(observed(sts)[control$range,]>upperbound(sts)[control$range,] ) #Done return(sts[control$range,]) } surveillance/R/gpc.poly-methods.R0000644000176000001440000000401312237174420016516 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Methods for gpc.poly polygons ### These are no longer used by the surveillance package itself ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### Redefinition of gpclib's scale.poly method to also do centering scale.gpc.poly <- function (x, center = c(0,0), scale = c(1,1)) { x@pts <- lapply(x@pts, function (p) { p$x <- (p$x-center[1]) / scale[1] p$y <- (p$y-center[2]) / scale[2] p }) x } ### Same as inside.owin for gpc.poly (using point.in.polygon from package sp) inside.gpc.poly <- function(x, y = NULL, polyregion, mode.checked = FALSE) { xy <- xy.coords(x, y, recycle=FALSE) N <- length(xy$x) # check for each polygon of polyregion if points are in the polygon locations <- sapply(polyregion@pts, function (poly) { pip <- point.in.polygon(xy$x, xy$y, poly$x, poly$y, mode.checked = mode.checked) if (poly$hole) { # if point is inside a hole then attribute -Inf ifelse(pip == 1, -Inf, 0) } else pip }) if (N == 1) sum(locations) > 0 else .rowSums(locations, N, length(polyregion@pts)) > 0 } ### Maximum extent of a gpc.poly (i.e. maximum distance of two vertices) diameter.gpc.poly <- function (object) { pts <- object@pts x <- unlist(lapply(pts, "[[", "x"), use.names=FALSE) y <- unlist(lapply(pts, "[[", "y"), use.names=FALSE) ## The diagonal of the bounding box provides a fast upper bound ##ext <- sqrt(diff(range(x))^2 + diff(range(y))^2) xy <- cbind(x,y) dists <- dist(xy) max(dists) } surveillance/R/options.R0000644000176000001440000001005112060410366015010 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Description: Set up surveillance.options. ### The code below is inspired by the options management of the ### spatstat package authored by Adrian Baddeley and Rolf Turner, which is ### available under GPL-2 from http://CRAN.R-project.org/package=spatstat ### ### Copyright (C) 2012 Sebastian Meyer ### $Revision: 465 $ ### $Date: 2012-12-07 16:53:25 +0100 (Fre, 07 Dez 2012) $ ################################################################################ .Options <- new.env() ## Specify options .Options$gpclib <- list( default=FALSE, # no gpclib due to license restrictions check=function(x) { if (!is.logical(x) || length(x) != 1L) return(FALSE) if (x && !requireNamespace("gpclib")) { warning("cannot set gpclib=TRUE") return(FALSE) } TRUE }, valid="a single logical value" ) .Options$allExamples <- list( default=TRUE, # maybe disabled by .onAttach() check=function(x) is.logical(x) && length(x) == 1L, valid="a single logical value" ) ## Function to activate the defaults reset.surveillance.options <- function () { opts <- sapply(ls(.Options, all.names=TRUE), function (option) { .Options[[option]]$value <- .Options[[option]]$default }, simplify=FALSE, USE.NAMES=TRUE) invisible(opts) } ## Internal function to query options get.surveillance.options <- function (x, drop = TRUE) { opts <- lapply(.Options, "[[", "value") if (drop && !missing(x) && length(x) == 1L) opts[[x]] else opts[x] } ## Exported function to modify and query options surveillance.options <- function (...) { knownOptions <- ls(.Options, all.names=TRUE) called <- list(...) if (length(called) == 0) return(get.surveillance.options()) if (is.null(names(called)) && length(called)==1) { x <- called[[1]] if (is.null(x)) return(get.surveillance.options()) if (is.list(x)) called <- x } if (is.null(names(called))) # case: surveillance.options("par1","par2",...) { ischar <- unlist(lapply(called, is.character)) if(all(ischar)) { choices <- unlist(called) ok <- choices %in% knownOptions if(!all(ok)) stop("unrecognised option(s): ", called[!ok]) return(get.surveillance.options(choices)) } else { wrong <- called[!ischar] offending <- unlist(lapply(wrong, deparse, nlines=1, control="delayPromises")) offending <- paste(offending, collapse=",") stop("unrecognised mode of argument(s) [", offending, "]:", "\n should be character string or name=value pair") } } else { # case: surveillance.options(name=value, name2=value2, ...) assignto <- names(called) if (!all(nzchar(assignto))) stop("options must all be identified by name=value") recog <- assignto %in% knownOptions if(!all(recog)) stop("unrecognised option(s): ", assignto[!recog]) ## validate and assign new values oldopts <- get.surveillance.options(assignto, drop=FALSE) for(i in seq_along(assignto)) { nama <- assignto[i] valo <- called[[i]] entry <- .Options[[nama]] if (!entry$check(valo)) stop("option ", dQuote(nama), " should be ", entry$valid) .Options[[nama]]$value <- valo } ## done invisible(oldopts) } } surveillance/R/plot_multi.R0000644000176000001440000004762611770111463015532 0ustar ripleyusers################################################### ### chunk number 1: ################################################### create.disProg <- function(week, observed, state, start=c(2001,1), freq=52, neighbourhood=NULL, populationFrac=NULL,epochAsDate=FALSE){ namesObs <-colnames(observed) # check whether observed contains only numbers if(!all(sapply(observed, is.numeric))){ stop("\'observed\' must be a matrix with numbers\n") } #univariate timeseries ? if(is.vector(observed)){ observed <- matrix(observed,ncol=1) namesObs <- deparse(quote(observed)) } else { # ensure we have a matrix observed <- as.matrix(observed) } if(missing(state)){ state <- 0*observed } else if(is.vector(state)){ state <- matrix(state,ncol=1) } else { state <- as.matrix(state) } #check number of columns of observed and state nAreas <- ncol(observed) nObs <- nrow(observed) if(ncol(observed) != ncol(state)){ #if there is only one state-vector for more than one area, repeat it if(ncol(state)==1) { state <- matrix(rep(state,nAreas),ncol=nAreas,byrow=FALSE) } else { cat('wrong dimensions of observed and state \n') return(NULL) } } #check neighbourhood matrix # neighbourhood can be a matrix or an array of dimension c(nAreas,nAreas, nrow(observed)) if(!is.null(neighbourhood) ) { dimNhood <- dim(neighbourhood) if(length(dimNhood)==2 & any(dimNhood != nAreas)) { cat('wrong dimensions of neighbourhood matrix \n') return(NULL) } else if (length(dimNhood)==3 & (any(dimNhood[1:2] != nAreas) | (dimNhood[3] != nrow(observed)) )){ cat('wrong dimensions of neighbourhood matrix \n') return(NULL) } } else { # no neighbourhood specified neighbourhood <- matrix(NA,nrow=nAreas,ncol=nAreas) } if(is.null(populationFrac)) { populationFrac <- matrix(1/ncol(observed),nrow=nObs, ncol=ncol(observed)) } else { # make sure populationFrac is a matrix populationFrac <- as.matrix(populationFrac) # check dimensions if(nrow(populationFrac)!= nObs | ncol(populationFrac)!= nAreas) stop("dimensions of \'populationFrac\' and \'observed\' do not match\n") # check whether populationFrac contains only numbers if(!all(sapply(populationFrac, is.numeric))){ stop("\'populationFrac\' must be a matrix with real numbers\n") } } #labels for observed and state if(is.null(namesObs)){ namesObs <- paste(deparse(quote(observed)),1:nAreas,sep="") } colnames(observed) <- namesObs colnames(state) <- namesObs res <- list("week"=week, "observed"=observed, "state"=state, "start"=start, "freq"=freq, "neighbourhood"=neighbourhood, "populationFrac"=populationFrac,"epochAsDate"=epochAsDate) class(res) <- "disProg" return(res) } print.disProg <- function(x, ...) { cat( "-- An object of class disProg -- \n" ) cat( "freq:\t\t", x$freq,"\n" ) cat( "start:\t\t", x$start,"\n" ) cat( "dim(observed):\t", dim(x$observed), "\n\n") n <- 1 cat("Head of observed:\n") print(head(x$observed,n)) #cat("\nhead of neighbourhood:\n") #print( head(x$neighbourhood,n)) } ################################################### ### chunk number 2: ################################################### sumNeighbours <- function(disProgObj){ observed <- disProgObj$observed neighbours <- matrix(nrow=nrow(observed),ncol=ncol(observed)) for(i in 1:ncol(observed)){ #only one neighbour if(sum(disProgObj$neighbourhood[,i])==1) neighbours[,i] <- observed[,disProgObj$neighbourhood[,i]==1] #more than one neighbour else neighbours[,i] <- apply(observed[,disProgObj$neighbourhood[,i]==1], MARGIN=1, sum) } return(neighbours) } ################################################### ### chunk number 3: ################################################### aggregate.disProg <- function(x,...){ #aggregate observed counts observed <- apply(x$observed,MARGIN=1,sum) #aggregate states state <- apply(x$state,MARGIN=1,sum) state[state > 1] <- 1 #create univariate disProg object x <- create.disProg(week=x$week, observed=observed, state=state, freq=x$freq,start=x$start) return(x) } ################################################### ### chunk number 4: ################################################### plot.disProg.one <- function(x, title = "", xaxis.years=TRUE, quarters=TRUE, startyear = x$start[1], firstweek = x$start[2], ylim=NULL, xlab="time", ylab="No. infected",type="hh",lty=c(1,1),col=c(1,1), outbreak.symbol = list(pch=3, col=3),legend.opts=list(x="top", legend=c("Infected", "Outbreak"),lty=NULL,pch=NULL,col=NULL),...) { observed <- x$observed state <- x$state # width of the column tab <- 0.5 # left/right help for constructing the columns observedxl <- (1:length(observed))-tab observedxr <- (1:length(observed))+tab # control where the highest value is max <- max(observed) #if ylim is not specified if(is.null(ylim)){ ylim <- c(-1/20*max, max) } #Plot the results using one Large plot call matplot(x=cbind(observedxl, observedxr),y=cbind(observed, observed),xlab=xlab,ylab=ylab, type=type,lty=lty, col=col, ylim=ylim,axes = !(xaxis.years),...) #Show the outbreaks if (!is.null(outbreak.symbol)) { for(i in 1:length(observed)){ matlines( c(i-tab, i+tab), c(observed[i],observed[i]) ) if(state[i] == 1) matpoints( i, ylim[1], pch=outbreak.symbol$pch, col=outbreak.symbol$col) } } title(title) cex <- par()$cex.axis #Label of x-axis if(xaxis.years){ # get the number of quarters lying in range for getting the year and quarter order obsPerYear <- x$freq obsPerQuarter <- x$freq/4 myat.week <- seq(ceiling((obsPerYear-firstweek+1)/obsPerQuarter) * obsPerQuarter + 1, length(observed)+(floor((obsPerYear-firstweek + 1)/obsPerQuarter) * obsPerQuarter +1), by=obsPerQuarter) # get the right year order year <- (myat.week - obsPerYear) %/% obsPerYear + startyear # function to define the quarter order quarterFunc <- function(i) { switch(i+1,"I","II","III","IV")} # get the right number and order of quarter labels quarter <- sapply( (myat.week-1) %/% obsPerQuarter %% 4, quarterFunc) # get the positions for the axis labels myat.week <- myat.week - (obsPerYear - firstweek + 1) # construct the computed axis labels if (quarters) { if (cex == 1) { mylabels.week <- paste(year,"\n\n",quarter,sep="") } else { mylabels.week <- paste(year,"\n",quarter,sep="") } } else { mylabels.week <- paste(year,sep="") } axis( at=myat.week , labels=mylabels.week , side=1, line = 1 ) axis( side=2 ) } #should there be a legend? if(!is.null(legend.opts) && (class(legend.opts) == "list")) { #Fill empty (mandatory) slots in legend.opts list if (is.null(legend.opts$lty)) legend.opts$lty = c(lty[1],NA) if (is.null(legend.opts$col)) legend.opts$col = c(col[1],outbreak.symbol$col) if (is.null(legend.opts$pch)) legend.opts$pch = c(NA,outbreak.symbol$pch) if (is.null(legend.opts$x)) legend.opts$x = "top" if (is.null(legend.opts$legend)) legend.opts$legend = c("Infected", "Outbreak") #Create the legend do.call("legend",legend.opts) } invisible() } plot.disProg <- function(x, title = "", xaxis.years=TRUE, startyear = x$start[1], firstweek = x$start[2], as.one=TRUE, same.scale=TRUE, ...){ observed <- x$observed state <- x$state #univariate timeseries ? if(is.vector(observed)) observed <- matrix(observed,ncol=1) if(is.vector(state)) state <- matrix(state,ncol=1) nAreas <- ncol(observed) max <- max(observed) #check if x is multivariate or univariate #multivariate time series if(nAreas > 1){ #all areas in one plot -- not supported in sts if(as.one){ matplot(observed,type="l",lty=1:nAreas,col=1:nAreas,ylim=c(0, 1.1*max),xlab="time",ylab="No. of Infected", axes=!xaxis.years) #If no legend.opts is specified or not set to null if ((is.na(pmatch("legend.opts",names(list(...))))) | (!is.na(pmatch("legend.opts",names(list(...)))) & (!is.null(list(...)$legend.opts)))) { legend.opts <- list(...)$legend.opts if (is.null(legend.opts$x)) legend.opts$x = "topleft" if (is.null(legend.opts$legend)) legend.opts$legend = colnames(observed) if (is.null(legend.opts$col)) legend.opts$col = 1:nAreas if (is.null(legend.opts$lty)) legend.opts$lty = 1:nAreas if (is.null(legend.opts$ncol)) legend.opts$ncol = 5 if (is.null(legend.opts$bty)) legend.opts$bty = "n" do.call("legend",legend.opts) } title(title) if(xaxis.years){ #todo: move this as output of ONE function # get the number of quarters lying in range for getting the year and quarter order myat.week <- seq(ceiling((52-firstweek+1)/13) * 13 + 1, length(observed)+(floor((52-firstweek + 1)/13) * 13 +1), by=13) # get the right year order year <- (myat.week - 52) %/% 52 + startyear # function to define the quarter order quarterFunc <- function(i) { switch(i+1,"I","II","III","IV")} # get the right number and order of quarter labels quarter <- sapply( (myat.week-1) %/% 13 %% 4, quarterFunc) # get the positions for the axis labels myat.week <- myat.week - (52 - firstweek + 1) # construct the computed axis labels cex <- par()$cex.axis if (cex == 1) { mylabels.week <- paste(year,"\n\n",quarter,sep="") } else { mylabels.week <- paste(year,"\n",quarter,sep="") } axis( at=myat.week , labels=mylabels.week , side=1, line = 1 ) axis( side=2 ) } } else { #plot each area #set window size par(mfrow=magic.dim(nAreas),mar=c(2,1,1,1)) if(same.scale) ylim <- c(-1/20*max, max) else ylim <- NULL #plot areas k <- 1:nAreas sapply(k, function(k) { plot.disProg.one(create.disProg(x$week, observed[,k], state[,k], freq=x$freq,start=x$start), title = "", startyear = startyear, firstweek = firstweek, xaxis.years=xaxis.years, ylim=ylim, legend.opts=NULL, ... ) mtext(colnames(observed)[k],line=-1.3) }) #reset graphical params par(mfrow=c(1,1), mar=c(5, 4, 4, 2)+0.1) } } else { #univariate time series plot.disProg.one(x=x, title = title, startyear = startyear, firstweek = firstweek, xaxis.years=xaxis.years, ...) } invisible() } ################################################### ### chunk number 5: ################################################### plot.survRes.one <- function(x, method=x$control$name, disease=x$control$data, domany=FALSE,ylim=NULL,xaxis.years=TRUE,startyear = 2001, firstweek = 1, xlab="time", ylab="No. infected", main=NULL, type="hhs",lty=c(1,1,2),col=c(1,1,4), outbreak.symbol = list(pch=3, col=3),alarm.symbol=list(pch=24, col=2),legend.opts=list(x="top",legend=c("Infected", "Upperbound", "Alarm", "Outbreak"),lty=NULL,col=NULL,pch=NULL), ...) { ################## Handle the NULL arguments ######################################################## if (is.null(main)) main = paste("Analysis of ", as.character(disease), " using ", as.character(method),sep="") #No titles are drawn when more than one is plotted. if (domany) main = "" survResObj <- x observed <- survResObj$disProgObj$observed[survResObj$control$range] state <- survResObj$disProgObj$state[survResObj$control$range] #print(list(...)) # width of the column tab <- 0.5 # left/right help for constructing the columns observedxl <- (1:length(observed))-tab observedxr <- (1:length(observed))+tab upperboundx <- (1:length(survResObj$upperbound)) #-0.5 # control where the highest value is max <- max(max(observed),max(survResObj$upperbound)) #if ylim is not specified #if(is.null(ylim)){ # ylim <- c(-1/20*max, max) #} #~~~~~~~~~~~~~~~~~~~~~~~~~~ if (is.null(ylim)) { max <- max(max(observed), max(survResObj$upperbound)) ylim <- c(-1/20 * max, max) } else { max <- ylim[2] } #ensure that there is enough space for the alarm/outbreak symbols if(ylim[1]>=0) ylim[1] <- -1/20*max #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #Generate the matrices to plot xstuff <- cbind(observedxl, observedxr, upperboundx) #no adjusting + min(x$control$range) - 1 ystuff <- cbind(observed, observed, survResObj$upperbound) #Plot the results using one Large plot call (we do this by modifying #the call). matplot(x=xstuff,y=ystuff,xlab=xlab,ylab=ylab,main=main,ylim=ylim,axes = !(xaxis.years),type=type,lty=lty,col=col,...) if (!is.null(survResObj$aggr)) { points(upperboundx+tab,survResObj$aggr,col=1) } for(i in 1:length(observed)){ matlines( c(i-tab, i+tab), c(observed[i],observed[i]),col=col[1]) if(survResObj$alarm[i] == 1) matpoints( i, -1/40*max, pch=alarm.symbol$pch, col=alarm.symbol$col) if(state[i] == 1) matpoints( i, -1/20*max, pch=outbreak.symbol$pch, col=outbreak.symbol$col) } # check where to place the legend. If the left upper side is free place it there if (max * 2/3 >= max( max(observed[1:floor(1/4 * length(observed))]), max(survResObj$upperbound[1:floor(1/4 * length(survResObj$upperbound))]) )) { xlegpos <- 0 } #Label of x-axis if(xaxis.years){ # get the number of quarters lying in range for getting the year and quarter order myat.week <- seq(ceiling((52-firstweek+1)/13) * 13 + 1, length(observed)+(floor((52-firstweek + 1)/13) * 13 +1), by=13) # get the right year order year <- (myat.week - 52) %/% 52 + startyear # function to define the quarter order quarterFunc <- function(i) { switch(i+1,"I","II","III","IV")} # get the right number and order of quarter labels quarter <- sapply( (myat.week-1) %/% 13 %% 4, quarterFunc) # get the positions for the axis labels myat.week <- myat.week - (52 - firstweek + 1) # construct the computed axis labels #cex <- par()$cex.axis #if (cex == 1) { mylabels.week <- paste(year,"\n\n",quarter,sep="") #} else { # mylabels.week <- paste(year,"\n",quarter,sep="") #} axis( at=myat.week , labels=mylabels.week , side=1, line = 1 ) axis( side=2 ) } if(!is.null(legend.opts) && (class(legend.opts) == "list")) { #Fill empty (mandatory) slots in legend.opts list if (is.null(legend.opts$lty)) legend.opts$lty = c(lty[1],lty[3],NA,NA) if (is.null(legend.opts$col)) legend.opts$col = c(col[1],col[3],alarm.symbol$col,outbreak.symbol$col) if (is.null(legend.opts$pch)) legend.opts$pch = c(NA,NA,alarm.symbol$pch,outbreak.symbol$pch) if (is.null(legend.opts$x)) legend.opts$x = "top" if (is.null(legend.opts$legend)) legend.opts$legend = c("Infected", "Upperbound", "Alarm", "Outbreak") do.call("legend",legend.opts) } invisible() } #the main function -- cant we do better than this? plot.survRes <- function(x, method=x$control$name, disease=x$control$data, xaxis.years=TRUE,startyear = 2001, firstweek = 1, same.scale=TRUE,...) { observed <- x$disProgObj$observed state <- x$disProgObj$state alarm <- x$alarm #univariate timeseries ? if(is.vector(observed)) observed <- matrix(observed,ncol=1) if(is.vector(state)) state <- matrix(state,ncol=1) if(is.vector(alarm)) alarm <- matrix(alarm,ncol=1) nAreas <- ncol(observed) max <- max(max(observed),max(x$upperbound)) #multivariate time series if(nAreas > 1){ #all areas in one plot #set window size par(mfrow=magic.dim(nAreas),mar=c(2,1,1,1)) if(same.scale) { ylim <- c(-1/20*max, max) } else { ylim <- NULL } #plot areas k <- 1:nAreas sapply(k, function(k) { #Create the survRes dP <- create.disProg(x$disProgObj$week, observed[,k], state[,k],start=x$start) obj <- list(alarm=alarm[,k],disProgObj=dP,control=x$control,upperbound=x$upperbound[,k]) class(obj) <- "survRes" plot.survRes.one(obj,startyear = startyear, firstweek = firstweek, xaxis.years=xaxis.years, ylim=ylim, legend.opts=NULL,domany=TRUE,... ) mtext(colnames(observed)[k],line=-1.3) }) #reset graphical params par(mfrow=c(1,1), mar=c(5, 4, 4, 2)+0.1) } else { #univariate time series plot.survRes.one(x=x, startyear = startyear, firstweek = firstweek, xaxis.years=xaxis.years, domany=FALSE,...) } invisible() } ################################################### ### chunk number 6: ################################################### magic.dim <- function(k){ if(k==1) return(c(1,1)) #factorize k factors <- primeFactors(k) #find the best factorization of k into two factors res <- bestCombination(factors) #if k is a prime or the difference between the two factors of k is too large #rather use the roots of the next square number greater than k #up is root of the smallest square number >= k up <- ceiling(sqrt(k)) #low is root of the biggest square number < k low <- up -1 if(diff(res) >5){ # e.g. k=11 is a prime, the next square number is 16 so up=4 and low=3 # low^2 = 9 < 11 is naturally too small, up^2=16 > 11 so c(4,4) is a solution # but low*up = 3*4 = 12 > 11 is also adequate and a better solution if((k - low^2) < up) res <- c(low,up) else res <- c(up,up) } return(sort(res)) } ################################################### ### chunk number 7: ################################################### primeFactors <- function(x){ if(x==1) return(1) factors<- numeric(0) i<-1 #start with i=2 and divide x by i (as often as possible) then try division by i+1 #until all factors are found, i.e. x=1 while(i < x){ i <- i+1 while((x %% i)==0){ # each time a new factor i is found, save it and proceed with x = x/i # e.g. k=20: 2 is a factor of x=20, continue with x = 10 = 20/2 # 2 is a factor of x=10, continue with x = 5 = 10/2 # 3 and 4 are no factors of x = 5 # 5 is a factor of x = 5, continue with x = 1 # result: 20 = c(2, 2, 5) factors <- c(factors, i) x <- x/i } } return(factors) } ################################################### ### chunk number 8: ################################################### ###################################################################### # Given a prime number factorization of a number, e.g. 36 # yields x=c(2,2,3,3) # and parition x into two groups, such that the product of the numbers # in group one is as similar as possible to the product # of the numbers of group two. This is useful in magic.dim # # Params: # x - the prime number factorization # # Returns: # c(prod(set1),prod(set2)) ###################################################################### bestCombination <- function(x) { #Compute the power set of 0:1^length(x), i.e. a binary indicator for #variable stating whether to include it in set 1 or not. combos <- as.matrix(expand.grid(rep(list(0:1),length(x)))) mode(combos) <- "logical" #Small helper function, given a vector of length(x) stating whether #to include an element in set1 or not, compute the product #of set1 and set2=x\backslash set1 #set1: all those for which include is TRUE, set2: all those for which #include is FALSE setsize <- function(include) { c(prod(x[include]),prod(x[!include])) } #Compute the product of set1 and set2 for each possible combination sizes <- apply(combos,MARGIN=1,FUN=setsize) #Calculate the combination, where x is as close to y as possible bestConfig <- combos[which.min(abs(diff(sizes))),] #Return this setsize of this configuration return(setsize(bestConfig)) } surveillance/R/twinstim_step.R0000644000176000001440000001431012213074366016236 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Functions and methods to make step() work for twinstim objects ### (restricted to one component at a time) ### ### Copyright (C) 2013 Sebastian Meyer ### $Revision: 645 $ ### $Date: 2013-09-08 15:17:42 +0200 (Son, 08 Sep 2013) $ ################################################################################ ### To make step() work, we are dealing with modified twinstim objects: ### object$formula is replaced by the result of terms(object), which selects only ### one of the two components! The original full formula specification is ### retained in the new "formulae" component. ### We let this special class inherit from "twinstim" such that, e.g., ### extractAIC.twinstim is used for its objects. However, this is tricky since ### the classes are actually incompatible in the formula specification. Only ### methods which don't use the $formula part work, but this constraint holds ### for what is needed to run step(), if we define some additional specific ### methods for this class. twinstim_stependemic <- twinstim_stepepidemic <- function (object) { stepClass <- grep("twinstim_step", sys.call()[[1L]], value=TRUE) ##<- since sys.call()[[1L]] may also be surveillance:::... if (identical(class(object), "twinstim")) { component <- sub("twinstim_step", "", stepClass) object$formulae <- object$formula object$formula <- object$formulae[[component]] class(object) <- c(stepClass, "twinstim") } else if (!inherits(object, stepClass)) stop("unintended use") object } ## In the first step() loop, object$call$formula is set to terms(object). Since ## there is no "formula" argument to twinstim(), we must remove it from the call ## before update()ing. We also have to convert object$formula to the complete ## formula specification (a named list) and remove the original one ($formulae). .step2twinstim <- function (object) { ##if (identical(class(object), "twinstim")) return(object) component <- sub("^twinstim_step", "", class(object)[1]) stopifnot(component %in% c("endemic", "epidemic")) object$call$formula <- NULL object$formula <- modifyList( object$formulae, setNames(list(formula(object$formula)), component) ) object$formulae <- NULL class(object) <- "twinstim" object } ### special update- and terms-methods for use through stepComponent() below update.twinstim_stependemic <- function (object, endemic, ..., evaluate = TRUE) { object <- .step2twinstim(object) res <- NextMethod("update") # use update.twinstim() ## we need to keep the special class such that step() will keep invoking ## the special update- and terms-methods on the result stepClass <- sub("update.", "", .Method, fixed=TRUE) ##<- or: .Class[1L], or: grep("step", class(object), value=TRUE) if (evaluate) { do.call(stepClass, alist(res)) } else { as.call(list(call(":::", as.name("surveillance"), as.name(stepClass)), res)) ## the call will only be evaluated within stats:::drop1.default() or ## stats:::add1.default, where the "stepClass" constructor function ## (twinstim_stependemic or twinstim_stepepidemic) is not visible; ## we thus have to use ":::". } } update.twinstim_stepepidemic <- function (object, epidemic, ..., evaluate = TRUE) {} body(update.twinstim_stepepidemic) <- body(update.twinstim_stependemic) terms.twinstim_stependemic <- terms.twinstim_stepepidemic <- function (x, ...) terms(x$formula) ### Function to perform AIC-based model selection (component-specific) ### This is essentially a wrapper around stats::step() stepComponent <- function (object, component = c("endemic", "epidemic"), scope = list(upper=object$formula[[component]]), direction = "both", trace = 2, verbose = FALSE, ...) { component <- match.arg(component) ## Convert to special twinstim class where $formula is the component formula object_step <- do.call(paste0("twinstim_step", component), alist(object)) ## silent optimizations if (trace <= 2) object_step$call$optim.args$control$trace <- object_step$optim.args$control$trace <- 0 object_step$call$verbose <- verbose ## Run the selection procedure res <- step(object_step, scope = scope, direction = direction, trace = trace, ...) ## Restore original trace and verbose arguments if (trace <= 2) { res$call$optim.args$control <- object$call$optim.args$control res$optim.args$control <- object$optim.args$control } res$call$verbose <- object$call$verbose ## Convert back to original class .step2twinstim(res) } ### add1.default and drop1.default work without problems through the above ### implementation of stepComponent() using the tricky twinstim classes, ### where object$formula is replaced by the requested component's formula. ### However, for stand-alone use of add1 and drop1, we need specialised methods. add1.twinstim <- drop1.twinstim <- function (object, scope, component = c("endemic", "epidemic"), trace = 2, ...) { component <- match.arg(component) ## Convert to special twinstim class where $formula is the component formula object <- do.call(paste0("twinstim_step", component), alist(object)) ## Call the default method (unfortunately not exported from stats) ## Note that the next method chosen is "unchanged if the class of the ## dispatching argument is changed" (see ?NextMethod) ## (the "component" argument will be part of "..." and passed further on to ## extractAIC.twinstim() where it is unused) NextMethod(trace=trace) } add1.twinstim_stependemic <- drop1.twinstim_stependemic <- function (object, scope, ...) NextMethod(component="endemic") add1.twinstim_stepepidemic <- drop1.twinstim_stepepidemic <- function (object, scope, ...) NextMethod(component="epidemic") surveillance/R/algo_call.R0000644000176000001440000001706312035760223015246 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # 'algo.quality' calculates quality values # like specifity, sensitivity for a surveillance method # # Parameters: # survResObj: object of class survRes, which includes the state chain and # the computed alarm chain algo.quality <- function(survResObj, penalty = 20){ state <- survResObj$disProgObj$state[survResObj$control$range] alarm <- survResObj$alarm # go sure to get a complete confusion matrix state <- factor(state, levels = c(0,1)) alarm <- factor(alarm, levels = c(0,1)) # create a confusion matrix confusionTable <- table(state, alarm) # compute Sensitiviy (TP rate) and Specifity (TN rate) sens = confusionTable[2,2]/(confusionTable[2,2] + confusionTable[2,1]) spec = confusionTable[1,1]/(confusionTable[1,2] + confusionTable[1,1]) # get the TP, FN, TN, FP value TP = confusionTable[2,2] FN = confusionTable[2,1] TN = confusionTable[1,1] FP = confusionTable[1,2] # compute the Euclidean distance between (1-spec, sens) to (0,1) dist = sqrt(((1-spec) - 0)^2 + (sens - 1)^2) # compute the lag # match gets the first position of a symbol # check if the state vector contains at least one outbreak if( !(is.element(1,state)) ){ lag = 0 } else{ lag <- c() # outbreakbeginnings outbegins <- c() # find outbreakpositions varA <- which(state == 1) outbegins <- c(outbegins, varA[1]) # Are there more than one outbreak ? ;-) if(length(varA) > 1){ # get just the beginnings of the outbreakserieses #varB <- varA[2:length(varA)] - varA[1:(length(varA)-1) varB <- diff(varA) outbegins <- c(outbegins,varA[which(varB != 1)+1]) } count <- 1 for(i in outbegins){ # decide if it's the last outbreak if(count < length(outbegins)){ # check if the outbreak was found by the system before the # next outbreak took place pos <- match(1,alarm[i:min(i+penalty,(outbegins[count+1]-1))]) if (is.na(pos)){ # give a penalty if the outbreak wasn't found lag <- c(lag, penalty) } else{ # compute the lag for the current outbreak lag <- c(lag, pos-1) } } else{ # check if the outbreak was found by the system pos <- match(1, alarm[i:min(i+penalty, length(alarm))]) if (is.na(pos)){ # give a penalty if the outbreak wasn't found lag <- c(lag, penalty) } else{ # compute the lag for the current outbreak lag <- c(lag, pos-1) } } count <- count + 1 } lag <- mean(lag) } result <- list(TP = TP, FP = FP, TN = TN, FN = FN, sens = sens, spec = spec, dist = dist, mlag =lag) class(result) <- "algoQV" return(result) } ################################################### ### chunk number 2: ################################################### print.algoQV <- function(x,...) { qualityValues <- c("TP", "FP", "TN", "FN", "Sens", "Spec", "dist", "mlag" ) class(x) <- "list" result <- t(as.matrix(x)) #Give the result matrix names dimnames(result)[[2]] <- qualityValues #Print to screen print(result) invisible() } ################################################### ### chunk number 3: ################################################### xtable.algoQV <- function(x, caption = NULL, label = NULL, align = NULL, digits = NULL, display = NULL, ...) { n <- names(x) x <- matrix(x,nrow=1) dimnames(x)[[2]] <- n xtable(x,caption, label, align, digits, display, ...) } ################################################### ### chunk number 4: ################################################### # 'algo.call' calls the defined surveillance algorithms for # a specified observed vector. # # Parameter # disProgObj: object of class survRes, which includes the state chain, the observed # control: specifies which surveillance systems should be used with their parameters. # The parameter funcName and range must be specified where funcName must be # the apropriate function (without 'algo.') # range (in control): positions in observed which should be computed algo.call <- function(disProgObj, control = list( list(funcName = "rki1", range = range), list(funcName = "rki", range = range, b = 2, w = 4, actY = TRUE), list(funcName = "rki", range = range, b = 2, w = 5, actY = TRUE) ) ) { #Function to apply one algorithm to the disProgObj onecall <- function(i) { do.call(paste("algo.",control[[i]]$funcName, sep=""), list(disProgObj = disProgObj, control = control[[i]])) } #Apply each algorithm in the control list to the disProgObj survResults <- lapply(1:length(control),onecall) #Create some fancy naming.. names(survResults) <- lapply(survResults,function(survObj) {survObj$control$name}) #Done return(survResults) } ################################################### ### chunk number 5: ################################################### algo.compare <- function(survResList){ return(t(sapply(survResList,algo.quality))) } ################################################### ### chunk number 6: ################################################### algo.summary <- function(compMatrices){ # check if the input is large enough for summing if(length(compMatrices) < 1){ stop("It's an empty list !") } if(length(compMatrices) == 1){ return(compMatrices[[1]]) } #Stupid conversion... compMatrices <- lapply(compMatrices,function(one) { n <- dimnames(one) one <- matrix(as.numeric(one),nrow=dim(one)[[1]]) dimnames(one) <- n return(one) }) # Compute the whole result wholeResult = compMatrices[[1]] lag = matrix(0,length(compMatrices),length(wholeResult[,1])) lag[1,] = wholeResult[,8] for(i in 2:length(compMatrices)){ wholeResult = wholeResult + compMatrices[[i]] lag[i,] = compMatrices[[i]][,8] } # Sens (TP) wholeResult[,5] = wholeResult[,1]/(wholeResult[,1]+wholeResult[,4]) # Spec (TN/(TN+FP)) wholeResult[,6] = wholeResult[,3]/(wholeResult[,2]+wholeResult[,3]) # dist wholeResult[,7] = sqrt((wholeResult[,6]-1)^2 + (wholeResult[,5]-1)^2) # median(lag) for(i in 1:length(wholeResult[,1])){ wholeResult[i,8] = mean(lag[,i]) } #class(wholeResult) <- "compMatrix" # comparison matrix return(wholeResult) } surveillance/R/nowcast.R0000644000176000001440000003473412122142736015013 0ustar ripleyusers###################################################################### # Function to perform nowcast at a specific day s. The full # documentation is available in the nowcast.Rd file. # # Parameters: # s - a Date object representing today # t - a Date object representing the day to do the forecast for. # A requirement is that t<=s. ToDo: t should be a vector # D - the Database containing columns dHospital and dReport # # Returns: # stsBP object with estimate and CI in the appropriate slots. ###################################################################### nowcast <- function(s,t,D,dEventCol="dHospital",dReportCol="dReport", method=c("freq.pi","bayes.nb","bayes.betapi","bayes.bnb","uniform"), aggregate.by="1 day", control=list( dRange=NULL, timeDelay=function(d1,d2) {as.numeric(d2-d1)}, estimateF=NULL, alpha=0.05, y.prior.max=300, B=1e5, score=FALSE,PMF=FALSE,sts.truth=FALSE)) { #Check if t<=s if (!all(t<=s)) { stop("Assertion t<=s failed.") } #Check that specified methods are all valid method <- match.arg(method,c("freq.pi","bayes.nb","bayes.betapi","bayes.bnb","uniform"),several.ok=TRUE) #If there is a specification of dateRange set dMin and dMax accordingly #Otherwise use the limits of the range if (is.null(control$dRange)) { dMin <- min(D[,dEventCol],na.rm=TRUE) dMax <- max(D[,dEventCol],na.rm=TRUE) } else { dMin <- control$dRange[1] dMax <- control$dRange[2] } dateRange <- seq(dMin,dMax,by=aggregate.by) timeDelay <- NULL #Choose default timeDelay function if none is given. if (is.null(control[["timeDelay"]])) { timeDelay <- function(d1,d2) {as.numeric(d2-d1)} } else { if (is.function(control[["timeDelay"]])) { timeDelay <- control[["timeDelay"]] } else { stop("timeDelay(d1,d2) needs to be a function.") } } #Create a column containing the reporting delay using the timeDelay #function D$delay <- timeDelay(D[,dEventCol],D[,dReportCol]) #Which observations are available at time s D.sub <- D[ na2FALSE(D[,dReportCol] <= s),] if (nrow(D.sub)==0) { stop(paste("No data available at s=",s,"\n")) } #Create an sts object containing the observed number of counts until s sts <- linelist2sts(D.sub,dEventCol,aggregate.by=aggregate.by,dRange=dateRange) sts <- as(sts,"stsBP") #Create an object containing the "truth" based on D sts.truth <- linelist2sts(D,dEventCol,aggregate.by=aggregate.by,dRange=dateRange) if (is.null(control[["sts.truth",exact=TRUE]])) { control$sts.truth <- FALSE } #Estimation function for the delay. Standard procedure is to reduce #database to only contain the cases which are available at time s if (is.null(control[["estimateF",exact=TRUE]])) { estimateF <- function(Ds,s,dReportCol) { if (nrow(Ds)>0) { F <- ecdf(Ds$delay) } else { warning("No data available to estimate the ECDF at time ",as.character(s),"\n") F <- stepfun(x=0,y=c(0,0)) } attr(F,"ms") <- sum(!is.na(Ds$delay)) return(F) } } else { if (!is.function(control[["estimateF",exact=TRUE]])) { stop("The argument control$estimateF needs to be a function.") } else { estimateF <- control$estimateF } } #Estimate delay CDF at s using the specified function F <- estimateF(D.sub,s,dReportCol) #How many observations were used for the estimation ms <- attr(F,"ms") ###################################################################### #y.prior max including check that y.prior.max is not too small. ###################################################################### if (is.null(control[["y.prior.max",exact=TRUE]])) { control$y.prior.max=300 } y.prior.max <- control$y.prior.max if (2*y.prior.max < max(observed(sts),na.rm=TRUE)) { warning("y.prior.max appears too small. Largest observed value is more than 50% of y.prior.max, which -- in case this number is extrapolated -- might cause problems.\n") } #Create a vector representing the support of y_{t} yt.support <- 0:y.prior.max if (is.null(control[["alpha",exact=TRUE]])) { alpha <- 0.05 } else { alpha <- control$alpha } if (is.null(control[["B",exact=TRUE]])) { B <- 1e5 } else { B <- control$B } if (is.null(control[["score",exact=TRUE]])) { control$score <- FALSE } #List of scores to calculate. Can become an argument later on scores <- c("logS","RPS","dist.median","outside.ci") #Initialize scoring rule results - to be saved in control slot -- dirty SR <- array(0,dim=c(nrow(sts),length(method),length(scores))) #List for storing the PMFs. if (is.null(control[["PMF",exact=TRUE]])) { control$PMF <- FALSE } ###################################################################### # Done manipulating the control list with default arguments ###################################################################### sts@control <- control #Save truth if (control$sts.truth) { sts@control$sts.truth <- sts.truth } else { sts@control$sts.truth <- NULL } sts@control$PMF <- list() ###################################################################### # Helper functions for Bayesian now-casting. ###################################################################### #PMF of the Discrete uniform between lower and upper ddu <- function(x,lower=0,upper=1) { if (lower>upper) stop("lower > upper") return( 1/(upper-lower+1) * ((x>= lower) & (x<= upper))) } #Beta distribution after having observed a sample of x_s positives and #m_s - x_s negatives. Protect especially against 0/1 evaluation dpits <- function(pits) { val <- dbeta(pits, shape1=1/2 + F(diffsti)*ms, shape2=1/2 + ms - F(diffsti)*ms) ifelse(is.finite(val),val,1e99) } ###################################################################### # Posterior based on the beta-negative binomial distribution ###################################################################### dbnb <- function(k,n,alpha,beta) { #Check if k's outside the support are requested. neg <- k<0 k[neg] <- 0 #Calculate the density of the beta-negbin. See Teerapabolarn (2008) num <- lgamma(n+alpha)+lgamma(k+beta)+lgamma(n+k)+lgamma(alpha+beta) den <- lgamma(n+k+alpha+beta)+lgamma(n)+lgamma(k+1)+lgamma(alpha)+lgamma(beta) res <- exp(num-den) res[neg] <- 0 return( res) } dpost.bnb <- function(yt) { #Shape parameters of the beta distribution for the proportion p alpha <- 1/2 + F(diffsti)*ms beta <- 1/2 + ms - F(diffsti)*ms #Add yt, because the support above is 0,... (i.e. only failures are counted) return(dbnb( yt-yts,n=yts+1,alpha=alpha,beta=beta)) } ###################################################################### # Posterior based on negative binomial approximation # yt - vector of integer values where to evaluate the function # pits - the probability ###################################################################### dpost.nb <- function(yt,pits) { ifelse(yt < yts,0, dnbinom( yt-yts, yts+1 , prob=pits)) } #Unormalized joint posterior of N and \pi_{ts} post.ytpi.unorm <- function(yt,yts,pits) { dbinom( yts, size=yt, prob=pits) * ddu(yt,upper=y.prior.max) * dpits(pits) } ###################################################################### #Loop over all time points in t ###################################################################### idxt <- which(dateRange %in% t) for (i in idxt) { #Calculate time difference between dateRange[i] and s, i.e. typically #s-dateRange[i] once and for all diffsti <- timeDelay(dateRange[i], s) #Observed value yts <- as.numeric(observed(sts)[i,]) #Calculate pi estimates (fixed & dynamic) pits <- F(diffsti) #List of casts containing probability distributions Ps <- list() ###################################################################### # Simple frequentist now-casting using pointwise logit bounds ###################################################################### if ("freq.pi" %in% method) { #Proportion reported pi.hat <- F(diffsti)# mean(with(D.sub, delay <= diffsti),na.rm=TRUE) #Use that on logit scale we have an asymptotic normal distribution. #See, e.g., Lachin (2000), p.17. -- here dynamic estimation if (pi.hat != 0 & pi.hat != 1) { se.logit.pi.hat <- sqrt(1/(ms*pi.hat*(1-pi.hat))) #"Frequentisish" predictive distribution approach: based on #asymptotic normal on logit transform. #This only takes uncertainty of estimation into account pits.sample <- plogis(rnorm(B , qlogis(pi.hat), sd=se.logit.pi.hat)) yts.sample <- round(observed(sts)[i,]/pits.sample) } else { #no uncertainty yts.sample <- rep(observed(sts)[i,],B) } #PMF of the frequentist approach. Add 1/B to all cells to make sure there are no zeroes (HACK!) # (table(factor(yts.sample, levels=yt.support))+1)/(B+length(yt.support)) Ps[["freq.pi"]] <- table(factor(yts.sample, levels=yt.support))/B } ###################################################################### #For Negbin approximation the posterior is available, but for consistency #we create a vector with the values of the PMF ###################################################################### if ("bayes.nb" %in% method) { Ps[["bayes.nb"]] <- dpost.nb(yt.support,pits) } ###################################################################### #A really bad forecast -- the uniform ###################################################################### if ("uniform" %in% method) { Ps[["uniform"]] <- rep(1/length(yt.support),length(yt.support)) } ###################################################################### #Posterior which does not take the uncertainty in the estimation #of \pi_{ts} into account. This can be approximated by a NegBin ###################################################################### ###################################################################### #Alternative. Incorporate uncertainty of the estimation of pits ###################################################################### if ("bayes.betapi" %in% method) { P.bayes.betapi <- numeric(length(yt.support)) for ( j in 1:length(yt.support)) { yt <- yt.support[j] f <- function(pits) { post.ytpi.unorm(yt=yt, yts=yts, pits=pits) } P.bayes.betapi[j] <- integrate(f,lower=0,upper=1)$value } Ps[["bayes.betapi"]] <- P.bayes.betapi/sum(P.bayes.betapi) } ###################################################################### # Beta-negative binomial. Should be the same as the bayes.betapi ###################################################################### if ("bayes.bnb" %in% method) { Ps[["bayes.bnb"]] <- dpost.bnb(yt.support) } ###################################################################### ###################################################################### #Done with the computation of PMFs. Now use these for calculation. ###################################################################### ###################################################################### #Save PMFs if thats requested if (control$PMF) { sts@control$PMF[[as.character(t)]] <- Ps } #Evaluate scoring rules, if requested if (control$score) { #Infer the true value ytinf <- observed(sts.truth)[i,] #Evaluate all scores for all predictive distributions for (i.P in 1:length(Ps)) { for (i.score in 1:length(scores)) { SR[i,i.P,i.score] <- do.call(scores[i.score],args=list(P=Ps[[i.P]],y=ytinf,alpha=alpha)) } } } #end if control$score #Add first cast & ci to stsBP slots sts@upperbound[i,] <- median(yt.support[which.max( cumsum(Ps[[1]])>0.5)]) sts@ci[i,,] <- yt.support[c(which.max(cumsum(Ps[[1]]) > alpha/2),which.max(cumsum(Ps[[1]]) > 1-alpha/2))] } #end of loop over time points #Add scoring rule to output if (control$score) { dimnames(SR) <- list(as.character(dateRange),names(Ps),scores) sts@control$SR <- SR } else { sts@control$SR <- NULL } #Other arguments to save sts@control$yt.support <- yt.support #Done return(sts) } ###################################################################### # Helper functions ###################################################################### #Helper function na2FALSE <- function(x) {x[is.na(x)] <- FALSE ; return(x) } ###################################################################### # Logarithmic score # # Parameters: # P - predictive distribution, given as a vector containing the PMF # with support 0,...,N.prior.max # y - the actual observation. Can be a vector. # # Returns: # -log P(y). If y outside 0,..,N.prior.max then -Inf. ###################################################################### logS <- function(P, y, ...) { return(ifelse( y>=0 & y<=length(P)-1, -log(P[y+1]), -Inf)) } ###################################################################### # Ranked probability score # # Parameters: # P - predictive distribution, given as a vector containing the PMF # with support 0,...,N.prior.max # y - the actual observation. Can be a vector. # # Returns: # -log P(y). If y outside 0,..,N.prior.max then -Inf. ###################################################################### RPS <- function(P,y, ...) { N.support <- 0:(length(P)-1) sum( (cumsum(P) - (y <= N.support))^2) } #Some other scoring rules which are not proper. dist.median <- function(P,y, ...) { point.estimate <- which.max(cumsum(P)>0.5) - 1 return(abs(point.estimate - y)) } #0/1 indicator of observed value outside equal tailed (1-alpha/2) CI outside.ci <- function(P,y,alpha) { N.support <- 0:(length(P)-1) ci <- N.support[c(which.max(cumsum(P) > alpha/2),which.max(cumsum(P) > 1-alpha/2))] ifelse( y>=ci[1] & y<=ci[2], 0, 1) } surveillance/R/twinstim_methods.R0000644000176000001440000013507712237174420016742 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Methods for objects of class "twinstim", specifically: ### vcov, logLik, print, summary, plot (intensity, iaf), R0, residuals, update ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### don't need a specific coef-method (identical to stats:::coef.default) ## coef.twinstim <- function (object, ...) ## { ## object$coefficients ## } ### but a method to extract the coefficients in a list might be useful ## "npars" is a named vector or list, where each element states the number of ## coefficients in a group of coefficients. coeflist <- function (coefs, npars) { coeflist <- vector("list", length(npars)) names(coeflist) <- names(npars) csum <- c(0L,cumsum(npars)) for (i in seq_along(coeflist)) { coeflist[[i]] <- coefs[seq.int(from=csum[i]+1L, length.out=npars[[i]])] } coeflist } ## extended and twinstim-specific version, ## which renames elements and unions nbeta0 and p as "endemic" mycoeflist <- function (coefs, npars) { coeflist <- coeflist(coefs, npars) coeflist <- c(list(c(coeflist[[1]], coeflist[[2]])), coeflist[-(1:2)]) names(coeflist) <- c("endemic", "epidemic", "siaf", "tiaf") coeflist } ## asymptotic variance-covariance matrix (inverse of fisher information matrix) vcov.twinstim <- function (object, ...) { solve(object$fisherinfo) # inverse of estimated expected fisher information } ## Extract log-likelihood of the model (which also enables the use of AIC()) logLik.twinstim <- function (object, ...) { r <- object$loglik attr(r, "df") <- length(coef(object)) class(r) <- "logLik" r } ## Also define an extractAIC-method to make step() work extractAIC.twinstim <- function (fit, scale, k = 2, ...) { loglik <- logLik(fit) edf <- attr(loglik, "df") penalty <- k * edf c(edf = edf, AIC = -2 * c(loglik) + penalty) } ## Number of events (excluding the pre-history) nobs.twinstim <- function (object, ...) length(object$fitted) ## print-method print.twinstim <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall:\n") print.default(x$call) cat("\nCoefficients:\n") print.default(format(coef(x), digits=digits), print.gap = 2, quote = FALSE) cat("\nLog-likelihood: ", format(logLik(x), digits=digits), "\n", sep = "") if (!isTRUE(x$converged)) { cat("\nWARNING: OPTIMIZATION ROUTINE DID NOT CONVERGE!", paste0("(",x$converged,")"), "\n") } cat("\n") invisible(x) } summary.twinstim <- function (object, test.iaf = FALSE, correlation = FALSE, symbolic.cor = FALSE, ...) { ans <- unclass(object)[c("call", "converged", "counts")] ans$cov <- vcov(object) npars <- object$npars coefs <- coef(object) nbeta0 <- npars[1]; p <- npars[2]; nbeta <- nbeta0 + p q <- npars[3] nNotIaf <- nbeta + q niafpars <- npars[4] + npars[5] est <- coefs se <- sqrt(diag(ans$cov)) zval <- est/se pval <- 2 * pnorm(abs(zval), lower.tail = FALSE) coefficients <- cbind(est, se, zval, pval) dimnames(coefficients) <- list(names(est), c("Estimate", "Std. Error", "z value", "Pr(>|z|)")) ans$coefficients.beta <- coefficients[seq_len(nbeta),,drop=FALSE] ans$coefficients.gamma <- coefficients[nbeta+seq_len(q),,drop=FALSE] ans$coefficients.iaf <- coefficients[nNotIaf+seq_len(niafpars),,drop=FALSE] if (!test.iaf) { ## usually, siaf and tiaf parameters are strictly positive, ## or parametrized on the logscale. In this case the usual wald test ## with H0: para=0 is invalid or meaningless. is.na(ans$coefficients.iaf[,3:4]) <- TRUE } # estimated parameter correlation if (correlation) { ans$correlation <- cov2cor(ans$cov) ans$symbolic.cor <- symbolic.cor } ans$loglik <- logLik(object) ans$aic <- AIC(object) ans$runtime <- object$runtime class(ans) <- "summary.twinstim" ans } ## additional methods to make confint.default work for summary.twinstim vcov.summary.twinstim <- function (object, ...) object$cov coef.summary.twinstim <- function (object, ...) with(object, { coeftab <- rbind(coefficients.beta, coefficients.gamma, coefficients.iaf) structure(coeftab[,1], names=rownames(coeftab)) }) ## print-method for summary.twinstim print.summary.twinstim <- function (x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) { nbeta <- nrow(x$coefficients.beta) # = nbeta0 + p q <- nrow(x$coefficients.gamma) niafpars <- nrow(x$coefficients.iaf) cat("\nCall:\n") print.default(x$call) if (nbeta > 0L) { cat("\nCoefficients of the endemic component:\n") printCoefmat(x$coefficients.beta, digits = digits, signif.stars = signif.stars, signif.legend = (q==0L) && signif.stars, ...) } else cat("\nNo coefficients in the endemic component.\n") if (q + niafpars > 0L) { cat("\nCoefficients of the epidemic component:\n") printCoefmat(rbind(x$coefficients.gamma, x$coefficients.iaf), digits = digits, signif.stars = signif.stars, ...) # if (niafpars > 0L) { # #cat("Coefficients of interaction functions:\n") # printCoefmat(x$coefficients.iaf, digits = digits, signif.stars = signif.stars, ...) # } } else cat("\nNo epidemic component.\n") cat("\nAIC: ", format(x$aic, digits=max(4, digits+1))) cat("\nLog-likelihood:", format(x$loglik, digits = digits)) cat("\nNumber of log-likelihood evaluations:", x$counts[1]) cat("\nNumber of score function evaluations:", x$counts[2]) cores <- attr(x$runtime, "cores") cat("\nRuntime", if (!is.null(cores) && cores > 1) paste0(" (", cores, " cores)") , ": ", format( if (length(x$runtime)==0) NA_real_ else if (length(x$runtime)==1) x$runtime else x$runtime[["elapsed"]], digits=max(4, digits+1)), " seconds", sep="") cat("\n") correl <- x$correlation if (!is.null(correl)) { p <- NCOL(correl) if (p > 1L) { cat("\nCorrelation of Coefficients:\n") if (is.logical(symbolic.cor) && symbolic.cor) { correl <- symnum(correl, abbr.colnames = NULL) correlcodes <- attr(correl, "legend") attr(correl, "legend") <- NULL print(correl) cat("---\nCorr. codes: ", correlcodes, "\n", sep="") } else { correl <- format(round(correl, 2), nsmall = 2) correl[!lower.tri(correl)] <- "" colnames(correl) <- substr(colnames(correl), 1, 5) print(correl[-1, -p, drop = FALSE], quote = FALSE) } } } if (!isTRUE(x$converged)) { cat("\nWARNING: OPTIMIZATION ROUTINE DID NOT CONVERGE!", paste0("(",x$converged,")"), "\n") } cat("\n") invisible(x) } ### 'cat's the summary in LaTeX code toLatex.summary.twinstim <- function (object, digits = max(3, getOption("digits") - 3), eps.Pvalue = 1e-4, align = "lrrrr", withAIC = FALSE, ...) { ret <- capture.output({ cat("\\begin{tabular}{", align, "}\n\\hline\n", sep="") cat(" & Estimate & Std. Error & $z$ value & $P(|Z|>|z|)$ \\\\\n\\hline\n\\hline\n") tabh <- object$coefficients.beta tabe <- rbind(object$coefficients.gamma, object$coefficients.iaf) for (tabname in c("tabh", "tabe")) { tab <- get(tabname) if (nrow(tab) > 0L) { rownames(tab) <- gsub(" ", "", rownames(tab)) tab_char <- capture.output( printCoefmat(tab, digits=digits, signif.stars=FALSE, eps.Pvalue = eps.Pvalue, na.print="NA") )[-1] #tab_char <- sub("< (0\\..+)$", "<\\1", tab_char) tab_char <- sub("([<]?)[ ]?([0-9]+)e([+-][0-9]+)$", "\\1\\2\\\\cdot{}10^{\\3}", tab_char) con <- textConnection(tab_char) tab2 <- read.table(con, colClasses="character") close(con) rownames(tab2) <- paste0("\\texttt{",gsub("_","\\\\_",tab2[,1]),"}") tab2 <- tab2[,-1] tab2[] <- lapply(tab2, function(x) { ifelse(is.na(x), "", paste0("$",x,"$")) # (test.iaf=FALSE) }) print(xtable(tab2), only.contents=TRUE, hline.after=NULL, include.colnames=FALSE, sanitize.text.function=identity) cat("\\hline\n") } } if (withAIC) { cat("\\hline\n") cat("AIC:& $", format(object$aic, digits=max(4, digits+1)), "$ &&&\\\\\n") cat("Log-likelihood:& $", format(object$loglik, digits=digits), "$ &&&\\\\\n") } cat("\\hline\n") cat("\\end{tabular}\n") }) class(ret) <- "Latex" ret } ## Alternative implementation including exp-transformation of parameters ## CAVE: no iaf parameters here xtable.summary.twinstim <- function (x, caption = NULL, label = NULL, align = c("l", "r", "r", "r"), digits = 3, display = c("s", "f", "s", "s"), ci.level = 0.95, ci.fmt = "%4.2f", ci.to = "--", eps.pvalue = 1e-4, ...) { cis <- confint(x, level=ci.level) tabh <- x$coefficients.beta tabe <- x$coefficients.gamma tab <- rbind(tabh, tabe) tab <- tab[grep("^([he]\\.\\(Intercept\\)|h.type)", rownames(tab), invert=TRUE),,drop=FALSE] expcis <- exp(cis[rownames(tab),,drop=FALSE]) cifmt <- paste0(ci.fmt, ci.to, ci.fmt) rrtab <- data.frame(RR = exp(tab[,1]), CI = sprintf(cifmt, expcis[,1], expcis[,2]), "p-value" = formatPval(tab[,4], eps=eps.pvalue), check.names = FALSE, stringsAsFactors=FALSE) names(rrtab)[2] <- paste0(100*ci.level, "% CI") ## append caption etc. class(rrtab) <- c("xtable", "data.frame") caption(rrtab) <- caption label(rrtab) <- label align(rrtab) <- align digits(rrtab) <- digits display(rrtab) <- display ## Done rrtab } xtable.twinstim <- function () { cl <- match.call() cl[[1]] <- as.name("xtable.summary.twinstim") cl$x <- substitute(summary(x)) eval.parent(cl) # => xtable.summary.twinstim must be exported } formals(xtable.twinstim) <- formals(xtable.summary.twinstim) ### Plot temporal or spatial evolution of the intensity intensity.twinstim <- function (x, aggregate = c("time", "space"), types = 1:nrow(x$qmatrix), tiles, tiles.idcol = NULL) { modelenv <- environment(x) ## check arguments if (is.null(modelenv)) stop("'x' is missing the model environment\n", " -- re-fit or update() with 'model=TRUE'") aggregate <- match.arg(aggregate) stopifnot(is.vector(types, mode="numeric"), types %in% seq_len(modelenv$nTypes), !anyDuplicated(types)) ## remove (big) x object from current evaluation environment qmatrix <- x$qmatrix # not part of modelenv force(types) # evaluate types before rm(x) rm(x) # don't need this anymore ##thisenv <- environment() ##parent.env(thisenv) <- modelenv # objects of modelenv become visible ## Instead of the above, we do cheap and nasty model unpacking! ## safer than the parent.env<- hack (R manual: "extremely dangerous"), and ## cleaner than running code inside with(modelenv,...) since assignments ## then would take place in modelenv, which would produce garbage t0 <- modelenv$t0 T <- modelenv$T histIntervals <- modelenv$histIntervals eventTimes <- modelenv$eventTimes eventCoords <- modelenv$eventCoords eventTypes <- modelenv$eventTypes removalTimes <- modelenv$removalTimes gridTiles <- modelenv$gridTiles gridBlocks <- modelenv$gridBlocks tiaf <- modelenv$tiaf tiafpars <- modelenv$tiafpars eps.s <- modelenv$eps.s siaf <- modelenv$siaf siafpars <- modelenv$siafpars ## endemic component on the spatial or temporal grid hInt <- if (modelenv$hash) { eta <- drop(modelenv$mmhGrid %*% modelenv$beta) if (!is.null(modelenv$offsetGrid)) eta <- modelenv$offsetGrid + eta expeta <- exp(unname(eta)) .beta0 <- rep_len(if (modelenv$nbeta0==0L) 0 else modelenv$beta0, modelenv$nTypes) fact <- sum(exp(.beta0[types])) if (aggregate == "time") { # int over W and types by BLOCK fact * c(tapply(expeta * modelenv$ds, gridBlocks, sum, simplify = TRUE)) } else { # int over T and types by tile fact * c(tapply(expeta * modelenv$dt, gridTiles, sum, simplify = TRUE)) } } else { ngrid <- if (aggregate == "time") { gridBlocks[length(gridBlocks)] } else nlevels(gridTiles) rep.int(0, ngrid) } ## endemic component as a function of time or location hIntFUN <- if (modelenv$hash) { if (aggregate == "time") { function (tp) { stopifnot(isScalar(tp)) if (tp == t0) hInt[1L] else { starts <- histIntervals$start idx <- match(TRUE, c(starts,T) >= tp) - 1L block <- histIntervals$BLOCK[idx] hInt[as.character(block)] } } } else { stopifnot(is(tiles, "SpatialPolygons")) tilesIDs <- if (is.null(tiles.idcol)) { sapply(tiles@polygons, slot, "ID") } else tiles@data[[tiles.idcol]] if (!all(levels(gridTiles) %in% tilesIDs)) { stop("'tiles' is incomplete for 'x' (check 'tiles.idcol')") } .tiles <- as(tiles, "SpatialPolygons") # for over-method (drop data) function (xy) { # works with a whole coordinate matrix points <- SpatialPoints(xy, proj4string=tiles@proj4string) polygonidxOfPoints <- over(points, .tiles) points.outside <- is.na(polygonidxOfPoints) polygonidxOfPoints[points.outside] <- 1L # tiny hack tilesOfPoints <- if (is.null(tiles.idcol)) { sapply(tiles@polygons[polygonidxOfPoints], slot, "ID") } else tiles@data[polygonidxOfPoints,tiles.idcol] is.na(tilesOfPoints) <- points.outside # resolve hack hInt[tilesOfPoints] # index by name } } } else function (...) 0 ## epidemic component eInt <- if (modelenv$hase) { qSum_types <- rowSums(qmatrix[,types,drop=FALSE])[eventTypes] fact <- qSum_types * modelenv$gammapred if (aggregate == "time") { # as a function of time (int over W & types) factS <- fact * modelenv$siafInt function (tp) { stopifnot(isScalar(tp)) tdiff <- tp - eventTimes infectivity <- qSum_types > 0 & (tdiff > 0) & (removalTimes >= tp) if (any(infectivity)) { gsources <- tiaf$g(tdiff[infectivity], tiafpars, eventTypes[infectivity]) intWj <- factS[infectivity] * gsources sum(intWj) } else 0 } } else { # as a function of location (int over time and types) factT <- fact * modelenv$tiafInt nEvents <- nrow(eventCoords) function (xy) { stopifnot(is.vector(xy, mode="numeric"), length(xy) == 2L) point <- matrix(xy, nrow=nEvents, ncol=2L, byrow=TRUE) sdiff <- point - eventCoords proximity <- qSum_types > 0 & .rowSums(sdiff^2, nEvents, 2L) <= eps.s^2 if (any(proximity)) { fsources <- siaf$f(sdiff[proximity,,drop=FALSE], siafpars, eventTypes[proximity]) intTj <- factT[proximity] * fsources sum(intTj) } else 0 } } } else function (...) 0 ## return component functions list(hGrid = hInt, hFUN = hIntFUN, eFUN = eInt, aggregate = aggregate, types = types) } intensityplot.twinstim <- function (x, which = c("epidemic proportion", "endemic proportion", "total intensity"), aggregate, types, tiles, tiles.idcol, # arguments of intensity.twinstim; # defaults are set below plot = TRUE, add = FALSE, tgrid = 101, rug.opts = list(), sgrid = 128, polygons.args = list(), points.args = list(), cex.fun = sqrt, ...) { which <- match.arg(which) ## set up desired intensities cl <- match.call() cl <- cl[c(1L, match(names(formals(intensity.twinstim)), names(cl), 0L))] cl[[1]] <- as.name("intensity.twinstim") components <- eval(cl, envir = parent.frame()) aggregate <- components$aggregate types <- components$types ## define function to plot FUN <- function (tmp) {} names(formals(FUN)) <- if (aggregate == "time") "times" else "coords" body1 <- if (aggregate == "time") expression( hGrid <- sapply(times, components$hFUN, USE.NAMES=FALSE), eGrid <- sapply(times, components$eFUN, USE.NAMES=FALSE) ) else expression( hGrid <- unname(components$hFUN(coords)), # takes whole coord matrix eGrid <- apply(coords, 1, components$eFUN) ) body2 <- switch(which, "epidemic proportion" = expression(eGrid / (hGrid + eGrid)), "endemic proportion" = expression(hGrid / (hGrid + eGrid)), "total intensity" = expression(hGrid + eGrid)) body(FUN) <- as.call(c(as.name("{"), c(body1, body2))) if (!plot) return(FUN) ## plot the FUN modelenv <- environment(components$eFUN)$modelenv dotargs <- list(...) nms <- names(dotargs) if (aggregate == "time") { ## set up grid of x-values (time points where 'which' will be evaluated) tgrid <- if (isScalar(tgrid)) { seq(modelenv$t0, modelenv$T, length.out=tgrid) } else { stopifnot(is.vector(tgrid, mode="numeric")) sort(tgrid) } ## calculate 'which' on tgrid yvals <- FUN(tgrid) ## plot it if(! "xlab" %in% nms) dotargs$xlab <- "time" if(! "ylab" %in% nms) dotargs$ylab <- which if(! "type" %in% nms) dotargs$type <- "l" if(! "ylim" %in% nms) dotargs$ylim <- { if (which == "total intensity") c(0,max(yvals)) else c(0,1) } do.call(if (add) "lines" else "plot", args=c(alist(x=tgrid, y=yvals), dotargs)) if (is.list(rug.opts)) { if (is.null(rug.opts$ticksize)) rug.opts$ticksize <- 0.02 if (is.null(rug.opts$quiet)) rug.opts$quiet <- TRUE eventTimes.types <- modelenv$eventTimes[modelenv$eventTypes %in% types] do.call("rug", args = c(alist(x=eventTimes.types), rug.opts)) } invisible(FUN) } else { .tiles <- as(tiles, "SpatialPolygons") # we don't need the data here ## set up grid of coordinates where 'which' will be evaluated if (isScalar(sgrid)) { sgrid <- maptools::Sobj_SpatialGrid(.tiles, n = sgrid)$SG ## ensure that sgrid has exactly the same proj4string as .tiles ## since CRS(proj4string(.tiles)) might have modified the string sgrid@proj4string <- .tiles@proj4string } sgrid <- as(sgrid, "SpatialPixels") ## only select grid points inside W (tiles) in.tiles <- !is.na(over(sgrid, .tiles)) sgrid <- sgrid[in.tiles,] ## calculate 'which' on sgrid yvals <- FUN(coordinates(sgrid)) sgridy <- SpatialPixelsDataFrame(sgrid, data=data.frame(yvals=yvals), proj4string=.tiles@proj4string) ## define sp.layout lobjs <- list() if (is.list(polygons.args)) { nms.polygons <- names(polygons.args) if(! "col" %in% nms.polygons) polygons.args$col <- "darkgrey" lobjs <- c(lobjs, list(c(list("sp.polygons", .tiles, first=FALSE), polygons.args))) } if (is.list(points.args)) { eventCoords.types <- modelenv$eventCoords[modelenv$eventTypes %in% types,,drop=FALSE] ## eventCoords as Spatial object with duplicates counted and removed eventCoords.types <- SpatialPoints(eventCoords.types, proj4string=.tiles@proj4string, bbox = .tiles@bbox) eventCoords.types <- SpatialPointsDataFrame(eventCoords.types, data.frame(mult = multiplicity(eventCoords.types))) eventCoords.types <- eventCoords.types[!duplicated(coordinates(eventCoords.types)),] points.args <- modifyList(list(pch=1, cex=0.5), points.args) pointcex <- cex.fun(eventCoords.types$mult) pointcex <- pointcex * points.args$cex points.args$cex <- NULL lobjs <- c(lobjs, list(c(list("sp.points", eventCoords.types, first=FALSE, cex=pointcex), points.args))) } if ("sp.layout" %in% nms) { if (!is.list(dotargs$sp.layout[[1]])) { # let sp.layout be a list of lists dotargs$sp.layout <- list(dotargs$sp.layout) } lobjs <- c(lobjs, dotargs$sp.layout) dotargs$sp.layout <- NULL } ## plotit if (add) message("'add'ing is not possible with 'aggregate=\"space\"'") if (! "xlim" %in% nms) dotargs$xlim <- bbox(.tiles)[1,] if (! "ylim" %in% nms) dotargs$ylim <- bbox(.tiles)[2,] if (! "scales" %in% nms) dotargs$scales <- list(draw = TRUE) do.call("spplot", args=c(alist(sgridy, zcol="yvals", sp.layout=lobjs, checkEmptyRC=FALSE), dotargs)) } } ## set default arguments for intensityplot.twinstim from intensity.twinstim formals(intensityplot.twinstim)[names(formals(intensity.twinstim))] <- formals(intensity.twinstim) ### Plot fitted tiaf or siaf(cbind(0, r)), r=distance iafplot <- function (object, which = c("siaf", "tiaf"), types = 1:nrow(object$qmatrix), scaled = FALSE, conf.type = if (length(pars) > 1) "bootstrap" else "parbounds", conf.level = 0.95, conf.B = 999, xgrid = 101, col.estimate = rainbow(length(types)), col.conf = col.estimate, alpha.B = 0.15, lwd = c(3,1), lty = c(1,2), xlim = NULL, ylim = NULL, add = FALSE, xlab = NULL, ylab = NULL, legend = !add && (length(types) > 1), ...) { which <- match.arg(which) IAF <- object$formula[[which]][[if (which=="siaf") "f" else "g"]] coefs <- coef(object) ## epidemic intercept (case of no intercept is not addressed atm) if (scaled) { idxgamma0 <- match("e.(Intercept)", names(coefs), nomatch=0L) if (idxgamma0 == 0L) { message("no scaling due to missing epidemic intercept") scaled <- FALSE } } else idxgamma0 <- 0L # if no scaling, gamma0 is 0-length gamma0 <- coefs[idxgamma0] ## parameters of the interaction function idxiafpars <- grep(paste0("^e\\.",which), names(coefs)) iafpars <- coefs[idxiafpars] ## concatenate parameters idxpars <- c(idxgamma0, idxiafpars) pars <- c(gamma0, iafpars) ## type of confidence band force(conf.type) # per default depends on 'pars' if (length(pars) == 0 || any(is.na(conf.type)) || is.null(conf.type)) { conf.type <- "none" } conf.type <- match.arg(conf.type, choices = c("parbounds", "bootstrap", "none")) ## add intercept-factor to IAF if scaled=TRUE FUN <- if (scaled) { function (x, pars, types) { gamma0 <- pars[1L] iafpars <- pars[-1L] exp(gamma0) * IAF(x, iafpars, types) } } else IAF ## grid of x-values (t or ||s||) on which FUN will be evaluated if (is.null(xlim)) { xmax <- if (add) { par("usr")[2] / (if (par("xaxs")=="r") 1.04 else 1) } else if (which == "siaf") { sqrt(sum((object$bbox[,"max"] - object$bbox[,"min"])^2)) } else { diff(object$timeRange) } xlim <- c(0, xmax) } xgrid <- if (isScalar(xgrid)) { seq(0, xlim[2], length.out=xgrid) } else { stopifnot(!is.na(xgrid), is.vector(xgrid, mode="numeric")) ## xgrid-specification overrides default xlim if (is.null(match.call()$xlim)) xlim <- c(0, max(xgrid)) sort(xgrid) } ## initialize plotting frame if (!add) { if (is.null(ylim)) ylim <- c(0, FUN(if (which=="siaf") cbind(0,0) else 0, pars, 1L)) if (is.null(xlab)) xlab <- if (which == "siaf") { expression("Distance " * x * # group("||",bold(s)-bold(s)[j],"||") * " from host") } else { expression("Time " * t * " since infectious") } if (is.null(ylab)) { ylab <- if (which == "siaf") { expression(f(x)) # f(group("||",bold(s)-bold(s)[j],"||")) } else { expression(g(t)) } if (scaled) { ylab <- as.expression(as.call(list(quote(paste), quote(e^{gamma[0]}), quote(phantom() %.% phantom()), ylab[[1]]))) } } plot(xlim, ylim, type="n", xlab = xlab, ylab = ylab, ...) } for (i in seq_along(types)) { ## select parameters on which to evaluate iaf parSample <- switch(conf.type, parbounds = { cis <- confint(object, idxpars, level=conf.level) ## all combinations of parameter bounds do.call("expand.grid", as.data.frame(t(cis))) }, bootstrap = { ## bootstrapping parameter values rbind(pars, mvrnorm(conf.B, mu=pars, Sigma=vcov(object)[idxpars,idxpars,drop=FALSE])) }) ## add confidence limits if (!is.null(parSample)) { fvalsSample <- apply(parSample, 1, function (pars) FUN(if(which=="siaf") cbind(xgrid,0) else xgrid, pars, types[i])) lowerupper <- if (conf.type == "parbounds") { t(apply(fvalsSample, 1, range)) } else { # bootstrapped parameter values if (is.na(conf.level)) { stopifnot(alpha.B >= 0, alpha.B <= 1) .col <- col2rgb(col.conf[i], alpha=TRUE)[,1] .col["alpha"] <- round(alpha.B*.col["alpha"]) .col <- do.call("rgb", args=c(as.list(.col), maxColorValue = 255)) matlines(x=xgrid, y=fvalsSample, type="l", lty=lty[2], col=.col, lwd=lwd[2]) # returns NULL } else { t(apply(fvalsSample, 1, quantile, probs=c(0,conf.level) + (1-conf.level)/2)) } } if (!is.null(lowerupper)) { matlines(x=xgrid, y=lowerupper, type="l", lty=lty[2], col=col.conf[i], lwd=lwd[2]) } } ## add point estimate lines(x=xgrid, y=FUN(if(which=="siaf") cbind(xgrid,0) else xgrid, pars, types[i]), lty=lty[1], col=col.estimate[i], lwd=lwd[1]) } ## add legend if (isTRUE(legend) || is.list(legend)) { default.legend <- list(x = "topright", legend = rownames(object$qmatrix)[types], col = col.estimate, lty = lty[1], lwd = lwd[1], bty = "n", cex = 0.9, title="type") legend.args <- if (is.list(legend)) { modifyList(default.legend, legend) } else default.legend do.call("legend", legend.args) } invisible() } ### Plot method for twinstim (wrapper for iafplot and intensityplot) plot.twinstim <- function (x, which, ...) { cl <- match.call() which <- match.arg(which, choices = c(eval(formals(intensityplot.twinstim)$which), eval(formals(iafplot)$which))) FUN <- if (which %in% eval(formals(intensityplot.twinstim)$which)) "intensityplot" else "iafplot" cl[[1]] <- as.name(FUN) if (FUN == "iafplot") names(cl)[names(cl) == "x"] <- "object" eval(cl, envir = parent.frame()) } ### Calculates the basic reproduction number R0 for individuals ### with marks given in 'newevents' R0.twinstim <- function (object, newevents, trimmed = TRUE, ...) { ## extract model information npars <- object$npars if (npars["q"] == 0L) { message("no epidemic component in model, returning 0-vector") if (missing(newevents)) return(object$R0) else { return(structure(rep.int(0, nrow(newevents)), names = rownames(newevents))) } } t0 <- object$timeRange[1L] T <- object$timeRange[2L] typeNames <- rownames(object$qmatrix) nTypes <- length(typeNames) types <- seq_len(nTypes) form <- formula(object) siaf <- form$siaf tiaf <- form$tiaf coefs <- coef(object) tiafpars <- coefs[sum(npars[1:4]) + seq_len(npars["ntiafpars"])] siafpars <- coefs[sum(npars[1:3]) + seq_len(npars["nsiafpars"])] if (missing(newevents)) { ## if no newevents are supplied, use original events if (trimmed) { # already calculated by 'twinstim' return(object$R0) } else { # untrimmed version (spatio-temporal integral over R+ x R^2) ## extract relevant data from model environment if (is.null(modelenv <- environment(object))) { stop("need model environment for untrimmed R0 of fitted events\n", " -- re-fit or update() with 'model=TRUE'") } eventTypes <- modelenv$eventTypes eps.t <- modelenv$eps.t eps.s <- modelenv$eps.s gammapred <- modelenv$gammapred names(gammapred) <- names(object$R0) # for names of the result } } else { ## use newevents stopifnot(is.data.frame(newevents)) if (!"time" %in% names(newevents)) { stop("missing event \"time\" column in 'newevents'") } if (any(!c("eps.s", "eps.t") %in% names(newevents))) { stop("missing \"eps.s\" or \"eps.t\" columns in 'newevents'") } stopifnot(is.factor(newevents[["type"]])) ## subset newevents to timeRange .N <- nrow(newevents) newevents <- subset(newevents, time + eps.t > t0 & time <= T) if (nrow(newevents) < .N) { message("subsetted 'newevents' to only include events infectious ", "during 'object$timeRange'") } ## extract columns newevents$type <- factor(newevents[["type"]], levels = typeNames) eventTimes <- newevents[["time"]] eps.t <- newevents[["eps.t"]] eps.s <- newevents[["eps.s"]] ## calculate gammapred for newevents epidemic <- terms(form$epidemic, data = newevents, keep.order = TRUE) mfe <- model.frame(epidemic, data = newevents, na.action = na.pass, drop.unused.levels = FALSE) mme <- model.matrix(epidemic, mfe) gamma <- coefs[sum(npars[1:2]) + seq_len(npars["q"])] if (ncol(mme) != length(gamma)) { stop("epidemic model matrix has the wrong number of columns ", "(check the variable types in 'newevents' (factors, etc))") } gammapred <- drop(exp(mme %*% gamma)) names(gammapred) <- rownames(newevents) ## now, convert types of newevents to integer codes eventTypes <- as.integer(newevents$type) } ## qSum qSumTypes <- rowSums(object$qmatrix) qSum <- unname(qSumTypes[eventTypes]) ## calculate remaining factors of the R0 formula, i.e. siafInt and tiafInt if (trimmed) { # trimmed R0 for newevents ## integral of g over the observed infectious periods .tiafInt <- .tiafIntFUN() gIntUpper <- pmin(T - eventTimes, eps.t) gIntLower <- pmax(0, t0 - eventTimes) tiafInt <- .tiafInt(tiafpars, from=gIntLower, to=gIntUpper, type=eventTypes, G=tiaf$G) ## integral of f over the influenceRegion bdist <- newevents[[".bdist"]] influenceRegion <- newevents[[".influenceRegion"]] if (is.null(influenceRegion)) { stop("missing \".influenceRegion\" component in 'newevents'") } noCircularIR <- if (is.null(bdist)) FALSE else all(eps.s > bdist) if (attr(siaf, "constant")) { iRareas <- sapply(influenceRegion, area.owin) ## will be used by .siafInt() } else if (! (is.null(siaf$Fcircle) || (is.null(siaf$effRange) && noCircularIR))) { if (is.null(bdist)) { stop("missing \".bdist\" component in 'newevents'") } } .siafInt <- .siafIntFUN(siaf, noCircularIR=noCircularIR) .siafInt.args <- c(alist(siafpars), object$control.siaf$F) siafInt <- do.call(".siafInt", .siafInt.args) } else { # untrimmed R0 for original events or newevents if (any(is.infinite(eps.t), is.infinite(eps.s))) { message("infinite interaction ranges yield infinite R0 values ", "because 'trimmed = FALSE'") } ## integrals of interaction functions for all combinations of type and ## eps.s/eps.t in newevents typeTcombis <- expand.grid(type=types, eps.t=unique(eps.t), KEEP.OUT.ATTRS=FALSE) typeTcombis$gInt <- with(typeTcombis, tiaf$G(eps.t, tiafpars, type)) - tiaf$G(rep.int(0,nTypes), tiafpars, types)[typeTcombis$type] typeScombis <- expand.grid(type=types, eps.s=unique(eps.s), KEEP.OUT.ATTRS=FALSE) typeScombis$fInt <- apply(typeScombis, MARGIN=1, FUN=function (type_eps.s) { type <- type_eps.s[1] eps.s <- type_eps.s[2] if (is.null(siaf$Fcircle)) { do.call(siaf$F, c(list(discpoly(c(0,0), eps.s, class="owin"), siaf$f, siafpars, type), object$control.siaf$F)) } else { siaf$Fcircle(eps.s, siafpars, type) } }) ## match combinations to rows of original events or 'newevents' eventscombiidxS <- match(paste(eventTypes,eps.s,sep="."), with(typeScombis,paste(type,eps.s,sep="."))) eventscombiidxT <- match(paste(eventTypes,eps.t,sep="."), with(typeTcombis,paste(type,eps.t,sep="."))) siafInt <- typeScombis$fInt[eventscombiidxS] tiafInt <- typeTcombis$gInt[eventscombiidxT] } ## return R0 values R0s <- qSum * gammapred * siafInt * tiafInt R0s } ### Extract the "residual process" (cf. Ogata, 1988) of a twinstim, i.e. the ### fitted cumulative intensity of the ground process at the event times. ### "generalized residuals similar to those discussed in Cox and Snell (1968)" residuals.twinstim <- function (object, ...) { res <- object$tau if (is.null(res)) { if (is.null(modelenv <- environment(object))) { stop("residuals not available; re-fit the model with 'cumCIF = TRUE'") } else { cat("'", substitute(object), "' was fit with disabled 'cumCIF'", " -> calculate it now...\n", sep="") res <- with(modelenv, LambdagEvents(cumCIF.pb = TRUE)) cat("Done.\n") try({ objname <- deparse(substitute(object)) object$tau <- res assign(objname, object, envir = parent.frame()) cat("Note: added the 'tau' component to '", objname, "' for future use.\n", sep="") }, silent = TRUE) } } return(res) } ###################################################################### # Function to compute estimated and profile likelihood based # confidence intervals. Heavy computations might be necessary! # #Params: # fitted - output from a fit with twinstim # profile - list with 4D vector as entries - format: # c(index, lower, upper, grid size) # where index is the index in the coef vector # lower and upper are the parameter limits (can be NA) # grid size is the grid size of the equally spaced grid # between lower and upper (can be 0) # alpha - (1-alpha)% profile likelihood CIs are computed. # If alpha <= 0 then no CIs are computed # control - control object to use for optim in the profile loglik computations # # Returns: # list with profile loglikelihood evaluations on the grid # and highest likelihood and wald confidence intervals ###################################################################### profile.twinstim <- function (fitted, profile, alpha = 0.05, control = list(fnscale = -1, factr = 1e1, maxit = 100), do.ltildeprofile=FALSE,...) { ## Check that input is ok profile <- as.list(profile) if (length(profile) == 0L) { stop("nothing to do") } lapply(profile, function(one) { if (length(one) != 4L) { stop("each profile entry has to be of form ", "'c(index, lower, upper, grid size)'") }}) if (is.null(fitted[["functions"]])) { stop("'fitted' must contain the component 'functions' -- fit using the option model=TRUE") } ################################################################ warning("Sorry, the profile likelihood is not implemented yet.") ############################################################### ## Control of the optim procedure if (is.null(control[["fnscale",exact=TRUE]])) { control$fnscale <- -1 } if (is.null(control[["maxit",exact=TRUE]])) { control$maxit <- 100 } if (is.null(control[["trace",exact=TRUE]])) { control$trace <- 2 } ## Estimated normalized likelihood function ltildeestim <- function(thetai,i) { theta <- theta.ml theta[i] <- thetai fitted$functions$ll(theta) - loglik.theta.ml } ## Profile normalized likelihood function ltildeprofile <- function(thetai,i) { #cat("Investigating theta[",i,"] = ",thetai,"\n") emptyTheta <- rep(0, length(theta.ml)) # Likelihood l(theta_{-i}) = l(theta_i, theta_i) ltildethetaminusi <- function(thetaminusi) { theta <- emptyTheta theta[-i] <- thetaminusi theta[i] <- thetai #cat("Investigating theta = ",theta,"\n") res <- fitted$functions$ll(theta) - loglik.theta.ml #cat("Current ltildethetaminusi value: ",res,"\n") return(res) } # Score function of all params except thetaminusi stildethetaminusi <- function(thetaminusi) { theta <- emptyTheta theta[-i] <- thetaminusi theta[i] <- thetai res <- fitted$functions$sc(theta)[-i] #cat("Current stildethetaminusi value: ",res,"\n") return(res) } # Call optim -- currently not adapted to arguments of control arguments # used in the fit resOthers <- tryCatch( optim(par=theta.ml[-i], fn = ltildethetaminusi, gr = stildethetaminusi, method = "BFGS", control = control), warning = function(w) print(w), error = function(e) list(value=NA)) resOthers$value } ## Initialize theta.ml <- coef(fitted) loglik.theta.ml <- c(logLik(fitted)) se <- sqrt(diag(vcov(fitted))) resProfile <- list() ## Perform profile computations for all requested parameters cat("Evaluating the profile logliks on a grid...\n") for (i in 1:length(profile)) { cat("i= ",i,"/",length(profile),"\n") #Index of the parameter in the theta vector idx <- profile[[i]][1] #If no borders are given use those from wald intervals (unconstrained) if (is.na(profile[[i]][2])) profile[[i]][2] <- theta.ml[idx] - 3*se[idx] if (is.na(profile[[i]][3])) profile[[i]][3] <- theta.ml[idx] + 3*se[idx] #Evaluate profile loglik on a grid (if requested) if (profile[[i]][4] > 0) { thetai.grid <- seq(profile[[i]][2],profile[[i]][3],length=profile[[i]][4]) resProfile[[i]] <- matrix(NA, nrow = length(thetai.grid), ncol = 4L, dimnames = list(NULL, c("grid","profile","estimated","wald"))) #Loop over all gridpoints for (j in 1:length(thetai.grid)) { cat("\tj= ",j,"/",length(thetai.grid),"\n") resProfile[[i]][j,] <- c(thetai.grid[j], #Do we need to compute ltildeprofile (can be quite time consuming) ifelse(do.ltildeprofile, ltildeprofile(thetai.grid[j],idx), NA), ltildeestim(thetai.grid[j],idx), - 1/2*(1/se[idx]^2)*(thetai.grid[j] - theta.ml[idx])^2) } } } names(resProfile) <- names(theta.ml)[sapply(profile, function(x) x[1L])] ############################### ## Profile likelihood intervals ############################### # Not done, yet ciProfile <- NULL ####Done, return return(list(lp=resProfile, ci.hl=ciProfile, profileObj=profile)) } ### update-method for the twinstim-class ## stats::update.default would also work but is not adapted to the specific ## structure of twinstim: optim.args (use modifyList), two formulae, model, ... ## However, this specific method is inspired by and copies small parts of the ## update.default method from the stats package developed by The R Core Team update.twinstim <- function (object, endemic, epidemic, control.siaf, optim.args, model, ..., use.estimates = TRUE, evaluate = TRUE) { call <- object$call thiscall <- match.call(expand.dots=FALSE) extras <- thiscall$... if (!missing(model)) { call$model <- model ## Special case: update model component ONLY if (evaluate && all(names(thiscall)[-1] %in% c("object", "model", "evaluate"))) { return(.update.twinstim.model(object, model)) } } ## Why we no longer use call$endemic but update object$formula$endemic: ## call$endemic would be an unevaluated expression eventually receiving the ## parent.frame() as environment, cp.: ##(function(e) {ecall <- match.call()$e; eval(call("environment", ecall))})(~1+start) ## This could cause large files if the fitted model is saved. ## Furthermore, call$endemic could refer to some object containing ## the formula, which is no longer visible. call$endemic <- if (missing(endemic)) object$formula$endemic else update.formula(object$formula$endemic, endemic) call$epidemic <- if (missing(epidemic)) object$formula$epidemic else update.formula(object$formula$epidemic, epidemic) ## Note: update.formula uses terms.formula(...,simplify=TRUE), but ## the principle order of terms is retained. Offsets will be moved to ## the end and a missing intercept will be denoted by a final -1. if (!missing(control.siaf)) call$control.siaf <- if (is.null(object$control.siaf)) # if constantsiaf control.siaf else modifyList(object$control.siaf, control.siaf) call["optim.args"] <- if (missing(optim.args)) object["optim.args"] else { list( # use list() to enable optim.args=NULL if (is.list(optim.args)) { modifyList(object$optim.args, optim.args) } else optim.args # = NULL ) } ## Set initial values (will be appropriately subsetted and/or extended with ## zeroes inside twinstim()) call$start <- if (missing(optim.args) || (!is.null(optim.args) && !"par" %in% names(optim.args))) { ## old optim.args$par probably doesn't match updated model, ## thus we set it as "start"-argument call$optim.args$par <- NULL if (use.estimates) coef(object) else object$optim.args$par } else NULL if ("start" %in% names(extras)) { newstart <- eval.parent(extras$start) call$start[names(newstart)] <- newstart extras$start <- NULL } ## CAVE: the remainder is copied from stats::update.default (as at R-2.15.0) if(length(extras)) { existing <- !is.na(match(names(extras), names(call))) ## do these individually to allow NULL to remove entries. for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if(any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } if(evaluate) eval(call, parent.frame()) else call } .update.twinstim.model <- function (object, model) { call <- object$call call$model <- model if (model) { # add model environment call$start <- coef(object) call$optim.args$fixed <- TRUE call$cumCIF <- FALSE cat("Setting up the model environment ...\n") capture.output(suppressMessages( objectWithModel <- eval(call, parent.frame()) )) cat("Done.\n") object <- append(object, objectWithModel["functions"], after=match("optim.args", names(object))) class(object) <- class(objectWithModel) # dropped by append() environment(object) <- environment(objectWithModel) } else { # remove model environment object$functions <- NULL environment(object) <- NULL } object$call$model <- model object } ## a terms-method is required for stepComponent() terms.twinstim <- function (x, component=c("endemic", "epidemic"), ...) { component <- match.arg(component) terms.formula(x$formula[[component]], keep.order=TRUE) } surveillance/R/algo_glrnb.R0000644000176000001440000002243112237000207015423 0ustar ripleyusers################################################### ### chunk number 1: ################################################### ###################################################################### # # Implementation of GLR -- documentation converted to Rd format. # # Author: Michael Hoehle (with contributions by Valentin Wimmer) # Date: 8 Jan 2008 # ###################################################################### algo.glrnb <- function(disProgObj, control = list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept", theta=NULL,dir=c("inc","dec"), ret=c("cases","value"))) { #Small helper function either <- function(cond, whenTrue, whenFalse) { if (cond) return(whenTrue) else return(whenFalse) } # Set the default values if not yet set if(is.null(control[["c.ARL",exact=TRUE]])) control$c.ARL <- 5 if(is.null(control[["change",exact=TRUE]])) control$change <- "intercept" if(is.null(control[["Mtilde",exact=TRUE]])) control$Mtilde <- 1 if(is.null(control[["M",exact=TRUE]])) control$M <- -1 if(is.null(control[["dir",exact=TRUE]])) control$dir <- "inc" if(is.null(control[["ret",exact=TRUE]])) control$ret <- "value" if(!is.null(control[["theta",exact=TRUE]])) { if(control[["theta",exact=TRUE]] == 1) { stop("Error: theta has to be larger than 1!") } } #if(is.null(control[["alpha",exact=TRUE]])) # control$alpha <- 0 #GLM (only filled if estimated) m <- NULL ################################################ #Extract the important parts from the arguments ################################################ observed <- disProgObj$observed #range is fixed, but t is modified as we iterate the cusum t <- control$range ; range <- control$range control$mu0Model <- NULL control$dir <- match.arg(control$dir, c("inc","dec")) dir <- ifelse(control$dir=="inc",1,-1) control$ret <- match.arg(control$ret, c("value","cases")) ret <- pmatch(control$ret,c("value","cases")) mod <- list() # Estimate m (the expected number of cases), i.e. parameter lambda of a # poisson distribution based on time points 1:t-1 if (is.null(control[["mu0",exact=TRUE]]) | is.list(control[["mu0",exact=TRUE]])) { #Initialize if (is.null(control[["mu0",exact=TRUE]])) control$mu0 <- list() if (is.null(control[["mu0",exact=TRUE]][["S"]])) control$mu0$S <- 1 if (is.null(control[["mu0",exact=TRUE]][["trend"]])) control$mu0$trend <- FALSE if (is.null(control[["mu0",exact=TRUE]][["refit"]])) control$mu0$refit <- FALSE control$mu0Model <- control$mu0 #Estimate using a hook function (lazy evaluation) control$mu0 <- estimateGLRNbHook()$pred mod[[1]] <- estimateGLRNbHook()$mod # if it is necessary to estimate alpha if(is.null(control[["alpha",exact=TRUE]])) control$alpha <- mod[[1]]$theta } #Postprocess if ((control$alpha>0) & (control$ret == "cases") & (is.null(control[["theta",exact=TRUE]]))) { stop("Return of cases is currently not implemented for the GLR detector based on the negative binomial distribution!") } #The counts x <- observed[control$range] mu0 <- control$mu0 #Reserve space for the results # start with cusum[timePoint -1] = 0, i.e. set cusum[1] = 0 alarm <- matrix(data = 0, nrow = length(t), ncol = 1) upperbound <- matrix(data = 0, nrow = length(t), ncol = 1) #Setup counters for the progress doneidx <- 0 N <- 1 xm10 <- 0 noofalarms <- 0 noOfTimePoints <- length(t) #Loop as long as we are not through the sequence while (doneidx < noOfTimePoints) { # cat("Doneidx === ",doneidx,"\n") # Call the C-interface -- this should depend on the type if (control$change == "intercept") { if (is.null(control[["theta",exact=TRUE]])) { if (control$alpha == 0) { #poisson if (control$M > 0 ){ # window limited res <- .C("glr_cusum_window",as.integer(x),as.double(mu0),length(x),as.integer(control$M),as.integer(control$Mtilde),as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),cases=as.double(numeric(length(x))),as.integer(dir),as.integer(ret),PACKAGE="surveillance") } else { # standard res <- .C("glr_cusum",as.integer(x),as.double(mu0),length(x),as.integer(control$Mtilde),as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),cases=as.double(numeric(length(x))),as.integer(dir),as.integer(ret),PACKAGE="surveillance") } } else { #negbin res <- .C("glr_nb_window",x=as.integer(x),mu0=as.double(mu0),alpha=as.double(control$alpha),lx=length(x),Mtilde=as.integer(control$Mtilde),M=as.integer(control$M),c.ARL=as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),dir=as.integer(dir),PACKAGE="surveillance") } } else { ###################### !is.null(control$theta) if (control$alpha == 0) { #poisson res <- .C("lr_cusum",x=as.integer(x),mu0=as.double(mu0),lx=length(x),as.double(control$theta),c.ARL=as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),cases=as.double(numeric(length(x))),as.integer(ret),PACKAGE="surveillance") } else { #negbin res <- .C("lr_cusum_nb",x=as.integer(x),mu0=as.double(mu0),alpha=as.double(control$alpha),lx=length(x),as.double(control$theta),c.ARL=as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),cases=as.double(numeric(length(x))),as.integer(ret),PACKAGE="surveillance") } } } else { ################### Epidemic chart ####################### if (control$change == "epi") { if (control$alpha == 0) { #pois res <- .C("glr_epi_window",as.integer(x),as.double(mu0),length(x),as.integer(control$Mtilde),as.integer(control$M),as.double(xm10),as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),PACKAGE="surveillance") } else { res <- .C("glr_nbgeneral_window",as.integer(x),as.double(mu0),alpha=as.double(control$alpha),lx=length(x),Mtilde=as.integer(control$Mtilde),M=as.integer(control$M),xm10=as.double(xm10),c.ARL=as.double(control$c.ARL),N=as.integer(0),val=as.double(numeric(length(x))),dir=as.integer(dir),PACKAGE="surveillance") } } } #In case an alarm found log this and reset the chart at res$N+1 if (res$N < length(x)) { #Put appropriate value in upperbound upperbound[1:res$N + doneidx] <- either(ret == 1, res$val[1:res$N] ,res$cases[1:res$N]) alarm[res$N + doneidx] <- TRUE #Chop & get ready for next round xm10 <- x[res$N] #put start value x_0 to last value x <- x[-(1:res$N)] ; t <- t[-(1:res$N)] #If no refitting is to be done things are easy if (!is.list(control$mu0Model) || (control$mu0Model$refit == FALSE)) { mu0 <- mu0[-(1:res$N)] } else { #Update the range (how to change back??) range <- range[-(1:res$N)] mu0 <- estimateGLRNbHook()$pred mod[[noofalarms+2]] <- estimateGLRNbHook()$mod control$mu0[(doneidx + res$N + 1):length(control$mu0)] <- mu0 } noofalarms <- noofalarms + 1 } doneidx <- doneidx + res$N } # fix of the problem that no upperbound-statistic is returned after #last alarm upperbound[(doneidx-res$N+1):nrow(upperbound)] <- either(ret == 1, res$val, res$cases) #fix of the problem that no upperbound-statistic is returned #in case of no alarm if (noofalarms == 0) { upperbound <- either(ret==1, res$val, res$cases) } # ensure upper bound is positive and not NaN upperbound[is.na(upperbound)] <- 0 upperbound[upperbound < 0] <- 0 # Add name and data name to control object algoName <- either(control$alpha == 0, "glrpois:", "glrnb:") control$name <- paste(algoName, control$change) control$data <- paste(deparse(substitute(disProgObj))) control$m <- m control$mu0Model$fitted <- mod # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj,control=control) class(result) = "survRes" # for surveillance system result return(result) } ################################################### ### chunk number 2: ################################################### estimateGLRNbHook <- function() { #Fetch control object from parent control <- parent.frame()$control #The period p <- parent.frame()$disProgObj$freq #Current range to perform surveillance on range <- parent.frame()$range #Define training & test data set (the rest) train <- 1:(range[1]-1) test <- range #Perform an estimation based on all observations before timePoint #Event better - don't do this at all in the algorithm - force #user to do it himself - coz its a model selection problem data <- data.frame(y=parent.frame()$disProgObj$observed[train],t=train) #Build the model equation formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } #Fit the GLM m <- eval(substitute(glm.nb(form,data=data),list(form=as.formula(formula)))) #Predict mu_{0,t} return(list(mod=m,pred=as.numeric(predict(m,newdata=data.frame(t=range),type="response")))) } surveillance/R/twinstim_siaf_lomax.R0000644000176000001440000002054612237174420017413 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Implementation of an isotropic power-law kernel: ### Density of the Lomax distribution, i.e. a shifted Pareto distribution with ### domain [0;Inf), scaled to 1 at the origin. ### THIS IS OBSOLETE since siaf.powerlaw provides the same kernel but with a ### better parametrization (using d := alpha+1 and omitting prop. constants) ### ### Copyright (C) 2012-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ## density=FALSE returns standardized Lomax kernel, i.e. f(x) = f_Lomax(x)/f(0), ## such that the kernel function starts at 1. f_Lomax(0) = alpha / sigma siaf.lomax <- function (nTypes = 1, logpars = TRUE, density = FALSE, effRangeProb = NULL, validpars = NULL) { .Deprecated("siaf.powerlaw") nTypes <- as.integer(nTypes) stopifnot(length(nTypes) == 1L, nTypes > 0L) ## for the moment we don't make this type-specific if (nTypes != 1) stop("type-specific shapes are not yet implemented") if (!logpars) stop("only the 'logpars' parametrization is implemented") ## helper expression, note: logpars=c(logscale=logsigma, logshape=logalpha) tmp <- expression( logsigma <- logpars[[1L]], # used "[[" to drop names logalpha <- logpars[[2L]], sigma <- exp(logsigma), alpha <- exp(logalpha) ) ## spatial kernel f <- function (s, logpars, types = NULL) {} body(f) <- as.call(c(as.name("{"), tmp, expression(sLength <- sqrt(rowSums(s^2))), expression(logfvals <- (alpha+1) * (logsigma - log(sLength+sigma))), ##logfvals <- logalpha + alpha*logsigma - (alpha+1)*log(sLength+sigma) if (density) { expression(exp(logfvals + logalpha - logsigma)) } else { expression(exp(logfvals)) } )) ## numerically integrate f over a polygonal domain F <- siaf.fallback.F ## fast integration of f over a circular domain Fcircle <- function (r, logpars, type = NULL) {} body(Fcircle) <- as.call(c(as.name("{"), tmp, ## integrate standardized f(x) = f_Lomax(x) / f_Lomax(0) expression( logfofr <- (alpha+1) * (logsigma - log(r+sigma)), fofr <- exp(logfofr), basevolume <- pi * r^2 * fofr, # cylinder volume up to height f(r) intfinvsq <- if (alpha == 1) { sigma^2 * (-3 - logfofr + 4*sqrt(fofr) - fofr) } else { (2*sigma^2 *(1-fofr) - r*(alpha+1)*(alpha*r+2*sigma) *fofr) / alpha / (alpha-1) }, int <- basevolume + pi * intfinvsq ), ## if density=TRUE, multiply result by f_Lomax(0) if (density) expression(int * alpha / sigma) else expression(int) )) ## derivative of f wrt logpars deriv <- function (s, logpars, types = NULL) {} body(deriv) <- as.call(c(as.name("{"), tmp, expression(sLength <- sqrt(rowSums(s^2))), expression(logsigma.xsigma <- logsigma - log(sLength+sigma)), if (density) { expression( logfac <- logalpha - logsigma + (alpha+1) * logsigma.xsigma, derivlogsigma.part <- (alpha*sLength-sigma) / (sLength+sigma), derivlogalpha.part <- 1 + alpha * logsigma.xsigma ) } else { expression( logfac <- (alpha+1) * logsigma.xsigma, derivlogsigma.part <- (alpha+1) * sLength / (sLength+sigma), derivlogalpha.part <- alpha * logsigma.xsigma ) }, expression(exp(logfac) * cbind(derivlogsigma.part, derivlogalpha.part)) )) ## Numerical integration of 'deriv' over a polygonal domain Deriv <- function (polydomain, deriv, logpars, type = NULL, nGQ = 20L) {} body(Deriv) <- as.call(c(as.name("{"), ## Determine a = argmax(abs(deriv(c(x,0)))) if (density) { expression(a <- c(0,0)) # max abs values are at 0 } else c(tmp, expression( xrange <- polydomain$xrange, # polydomain is a "owin" maxxdist <- max(abs(xrange)), a.logsigma <- min(maxxdist, sigma / (alpha+1)), a.logalpha <- min(maxxdist, sigma * (exp(1/(alpha+1)) - 1)), a <- c(a.logsigma, a.logalpha), if (sum(xrange) < 0) a <- -a # is more of the domain left of 0? )), expression( deriv1 <- function (s, paridx) deriv(s, logpars, type)[,paridx,drop=TRUE], intderiv1 <- function (paridx) polyCub.SV(polydomain, deriv1, paridx = paridx, nGQ = nGQ, alpha = a[paridx]), res.logsigma <- intderiv1(1L), res.logalpha <- intderiv1(2L), res <- c(res.logsigma, res.logalpha), res ) )) ## "effective" integration range (based on some high quantile) effRange <- if (isScalar(effRangeProb)) { effRange <- function (logpars) {} body(effRange) <- as.call(c(as.name("{"), substitute(qlomax(effRangeProb, exp(logpars[[1]]), exp(logpars[[2]])), list(effRangeProb=effRangeProb)) )) effRange } else NULL ## simulate from the Lomax kernel (within a maximum distance 'ub') simulate <- function (n, logpars, type, ub) { ## Sampling from f(s) = dlomax(||s||), truncated to ||s|| <= ub is via ## polar coordinates and applies the inverse transformation method sigma <- exp(logpars[[1L]]) alpha <- exp(logpars[[2L]]) E <- sigma / (alpha-1) # only valid if alpha > 1 ##r <- VGAM::rlomax(n, scale=sigma, shape3.q=alpha) ## NO, r must be sampled from a density proportional to r*dlomax(r)!!! ##curve(x * alpha/sigma * (1+x/sigma)^-(alpha+1), 0, 200) ## We need the primitive of the density, i.e. int_0^r x*dlomax(x) dx cumd <- if (alpha == 1) { function (r) sigma * (log(1+r/sigma) - r/(r+sigma)) } else { function (r) ifelse(is.infinite(r) & alpha > 1, E, E * (1 - (1+r/sigma)^-alpha * (r*alpha/sigma+1))) } ## cumulative distribution function: int_0^q x*dlomax(x) / c dx ## the normalization constant c is only finite if alpha > 1 _or_ if ## the density is truncated (in simEpidataCS, simulation is always ## bounded to eps.s and to the largest extend of W), otherwise the ## distribution is improper CDF <- if (is.finite(ub)) { # in this case any alpha > 0 is fine normconst <- cumd(ub) function (q) cumd(q) / normconst } else { # for r in [0;Inf] the density is only proper if alpha > 1 stopifnot(alpha > 1) function (q) cumd(q) / E } ## However, there is no closed form expression for the quantile function ## of that distribution (inverse CDF), so we have to use uniroot ## However, uniroot needs a finite upper bound stopifnot(is.finite(ub)) QF <- function(p) uniroot(function(q) CDF(q)-p, lower=0, upper=ub)$root ## now sample r as QF(U), where U ~ U(0,1) r <- sapply(runif(n), QF) ## Check simulation via kernel estimate: ## plot(density(r, from=0, to=ub)) ## curve(x*VGAM::dlomax(x,sigma,alpha) / normconst, add=TRUE, col=2) ## now rotate each point by a random angle to cover all directions theta <- stats::runif(n, 0, 2*pi) r * cbind(cos(theta), sin(theta)) } ## set function environments to the global environment environment(f) <- environment(F) <- environment(Fcircle) <- environment(deriv) <- environment(Deriv) <- environment(simulate) <- .GlobalEnv if (is.function(effRange)) environment(effRange) <- .GlobalEnv ## return the kernel specification list(f=f, F=F, Fcircle=Fcircle, effRange=effRange, deriv=deriv, Deriv=Deriv, simulate=simulate, npars=2L, validpars=validpars) } surveillance/R/sim_pointSource.R0000644000176000001440000000423311731650466016517 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # Programme to simulate epidemies which were # introduced by point sources. # The basis of this proagramme is a combination of # a Hidden Markov Modell (to get random dates # for outbreaks) and a simple Model to simulate # the epidemy. # # Parameters: # r - probability to get a new epidemy at time i if there was one # at time i-1 # p - probability to get no new epidemy at time i if there was none # at time i-1 # length - number of timesteps to visit # # Parameters for the background: # A - Amplitude, default = 1. # alpha - Incidence, default = 1. # beta - time dependent regression coefficient, default = 0. # phi - weeks of seaonal move, default = 0. # frequency - frequency of the sinus, default = 1. # state - a eventually given markov chain, # which defines the status at this time (outbreak or not) # K - additional weigth for an outbreak sim.pointSource <- function(p = 0.99, r = 0.01, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K){ if(is.null(state)){ # create a markov-chain state <- matrix(data = 0, ncol = 1, nrow = length) state[1] <- 0 #hoehle - fix: rbinom(1,1,0.5) # always begin with a zero # create the transition matrix transitionMatrix <- matrix(data = c(p, (1-r),(1-p), r), nrow = 2, ncol = 2) if(length(state) > 1){ # just do it if there is a preceding value for (i in 2:length){ # check the matrix for the correct line and take the right # probability. The last value of state is the newest. state[i] <- rbinom(1,1,transitionMatrix[state[i-1] + 1, 2]) } } } # go sure to have the rigth length as parameter length <- length(state) observed <-sim.seasonalNoise(A, alpha, beta, phi, length, frequency, state, K)$seasonalBackground result <- list(observed = observed, state = state, A = A, alpha = alpha, beta = beta, K = K, p = p, r = r, freq=52, start=c(2001,1)) class(result) = "disProg" # for disease progress return(result) } surveillance/R/hhh4_weights.R0000644000176000001440000002607512212103666015720 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Helper functions for neighbourhood weight matrices in hhh4() ### ### Copyright (C) 2012-2013 Sebastian Meyer ### $Revision: 641 $ ### $Date: 2013-09-05 15:31:34 +0200 (Don, 05 Sep 2013) $ ################################################################################ ### check ne$weights specification checkNeighbourhood <- function (neighbourhood) { ## setValidity() in sts.R only guarantees correct 'dim' and 'dimnames' ## we also assert numeric or logical matrix with non-NA entries ## FIXME: However, we currently don't check for symmetry and for zeros on ## the diagonal... stopifnot(is.matrix(neighbourhood), nrow(neighbourhood) == ncol(neighbourhood), is.numeric(neighbourhood) | is.logical(neighbourhood), is.finite(neighbourhood)) invisible(TRUE) } checkWeightsArray <- function (W, nUnits, nTime, name) { if (!is.array(W)) stop("'", name, "' must return a matrix/array") if (any(dim(W)[1:2] != nUnits) || isTRUE(dim(W)[3] != nTime)) stop("'", name, "' must conform to dimensions ", nUnits, " x ", nUnits, " (x ", nTime, ")") if (any(is.na(W))) stop("missing values in '", name, "' are not allowed") diags <- if (is.matrix(W)) diag(W) else apply(W, 3, diag) if (any(diags != 0)) stop("'", name, "' must only contain zeroes on the diagonal", if (!is.matrix(W)) "s") } checkWeights <- function (weights, nUnits, nTime, nbmat, data) # only used for parametric weights { name <- "control$ne$weights" ## check specification testweights <- if (is.array(weights)) weights else { if (is.list(weights) && checkWeightsFUN(weights) && checkNeighbourhood(nbmat)) { if (all(nbmat %in% 0:1)) warning("'", deparse(substitute(nbmat)), "' is binary (should contain", " general neighbourhood orders)") weights$w(weights$initial, nbmat, data) } else { stop("'", name, "' must be a matrix/array or a list of functions") } } ## apply matrix/array checks if (is.list(weights)) { # parametric weights checkWeightsArray(testweights, nUnits, nTime, name=paste0(name, "$w")) dim.d <- length(weights$initial) dw <- weights$dw(weights$initial, nbmat, data) d2w <- weights$d2w(weights$initial, nbmat, data) if (dim.d == 1L) { checkWeightsArray(dw, nUnits, nTime, name=paste0(name, "$dw")) checkWeightsArray(d2w, nUnits, nTime, name=paste0(name, "$d2w")) } else { if (!is.list(dw) || length(dw) != dim.d) stop("'", name, "$dw' must return a list (of matrices/arrays)", " of length ", dim.d) if (!is.list(d2w) || length(d2w) != dim.d*(dim.d+1)/2) stop("'", name, "$d2w' must return a list (of matrices/arrays)", " of length ", dim.d*(dim.d+1)/2) lapply(dw, checkWeightsArray, nUnits, nTime, name=paste0(name, "$dw[[i]]")) lapply(d2w, checkWeightsArray, nUnits, nTime, name=paste0(name, "$d2w[[i]]")) } } else checkWeightsArray(testweights, nUnits, nTime, name=name) ## Done invisible(TRUE) } ### calculate the weighted sum of counts of adjacent (or all other) regions ### i.e. the nTime x nUnit matrix with elements ne_ti = sum_j w_jit * y_jt ## W is either a nUnits x nUnits matrix of time-constant weights w_ji ## or a nUnits x nUnits x nTime array of time-varying weights weightedSumNE <- function (observed, weights, lag) { dimY <- dim(observed) nTime <- dimY[1L] nUnits <- dimY[2L] tY <- t(observed) # -> nUnits x nTime res <- apply(weights, 2L, function (wi) ## if dim(weights)==2 (time-constant weights), length(wi)=nUnits, ## if dim(weights)==3, wi is a matrix of size nUnits x nTime .colSums(tY * wi, nUnits, nTime, na.rm=TRUE)) rbind(matrix(NA_real_, lag, nUnits), res[seq_len(nTime-lag),,drop=FALSE]) } ## slower alternative, where the weights are always converted to a 3D array weightedSumNE.old <- function(observed, weights, lag) { dimY <- dim(observed) nTime <- dimY[1L] nUnits <- dimY[2L] nhood <- array(weights, c(nUnits,nUnits,nTime)) res <- matrix(NA_real_, nrow = nTime, ncol = nUnits, dimnames = list(NULL, colnames(observed))) for(i in seq_len(nUnits)){ weights.i <- t(nhood[,i,]) weightedObs <- observed * weights.i res[,i] <- rowSums(weightedObs, na.rm=TRUE) } rbind(matrix(NA_real_, lag, nUnits), head(res, nTime-lag)) } ############################################### ### predefined parametric weight structures ### ############################################### ### check parametric weights specification consisting of a list of: ## - three functions: w, dw, and d2w ## - a vector of initial parameter values checkWeightsFUN <- function (object) { fnames <- paste0(c("","d","d2"), "w") if (any(!sapply(object[fnames], is.function))) stop("parametric weights require functions ", paste0("'", fnames, "'", collapse=", ")) if (any(!sapply(object[fnames], function(FUN) length(formals(FUN)) >= 3L))) stop("parametric weights functions must accept (not necessarily use)", "\n at least 3 arguments (parameter vector, ", "neighbourhood order matrix, data)") if (!is.vector(object$initial, mode="numeric") || length(object$initial) == 0L) stop("parametric weights require initial parameter values") TRUE } ### Construct weight matrix wji according to the Zeta-distribution with respect ### to the orders of neighbourhood (in nbmat, as e.g. obtained from nbOrder()), ### optionally fulfilling rowSums(wji) = 1 ## As a formula (for j != i, otherwise wji = 0): ## - for shared=TRUE: wji = pzeta(oji; d, maxlag) / sum_k I(ojk == oji) ## - for shared=FALSE: wji = pzeta(oji; d, maxlag) / sum_k pzeta(ojk; d, maxlag) ## Here, oji = oij is the order of nb of i and j, ## and pzeta(o; d, m) = o^-d / sum_{r=1}^m r^-d is the Zeta-distribution ## on 1:m (also called Zipf's law). ## For shared=TRUE (not recommended) and normalize=FALSE, maxlag should be ## <= min_j(max_i(oji)), such that every region has neighbours up to order ## 'maxlag' and higher orders can not be infected. Otherwise, regions with not ## as high-order neighbours would not sum their weights to 1 (but lower). ## For shared=FALSE, maxlag=max(nbmat) yields the weights ## wji = oji^-d / sum_k ojk^-d ## In both cases, maxlag=1 yields the classical weights wji=1/nj. zetaweights <- function (nbmat, d = 1, maxlag = max(nbmat), normalize = FALSE) { ## raw (non-normalized) zeta-distribution on 1:maxlag zeta <- c(0, seq_len(maxlag)^-d) # first 0 is for lag 0 (i.e., diag(nbmat)) ## replace order by zetaweight of that order wji <- zeta[nbmat + 1L] # results in vector wji[is.na(wji)] <- 0 # for lags > maxlag ## set dim and names dim(wji) <- dimW <- dim(nbmat) dimnames(wji) <- dimnames(nbmat) ## if (shared) { ## ## multiplicity of orders by row: dim(nbmat)==dim(multbyrow) ## multbyrow <- t(apply(nbmat, 1, function(x) table(x)[as.character(x)])) ## ## neighbours of same order share the zetaweight for that order ## wji <- wji / sum(zeta) / multbyrow ## } if (normalize) { # normalize such that each row sums to 1 wji / .rowSums(wji, dimW[1], dimW[2]) } else wji } ### powerlaw weights ## in the non-truncated case, i.e. maxlag = max(nbmat), ## the raw powerlaw weights are defined as w_ji = o_ji^-d, ## and with (row-)normalization we have w_ji = o_ji^-d / sum_k o_jk^-d powerlaw <- function (maxlag, normalize = TRUE, log = FALSE, initial = if (log) 0 else 1) { if (missing(maxlag)) { stop("'maxlag' must be specified (e.g. maximum neighbourhood order)") ## specifying 'maxlag' in zetaweights is actually optional since it has ## the default value max(nbmat). however, repeatedly asking for this ## maximum would be really inefficient. } else stopifnot(isScalar(maxlag)) ## main function which returns the weight matrix weights.call <- call("zetaweights", quote(nbmat), quote(d), maxlag, normalize) weights <- as.function(c(alist(d=, nbmat=, ...=), call("{", weights.call)), envir=.GlobalEnv) if (log) { # the parameter d is interpreted on log-scale ## we prepend the necessary conversion d <- exp(d) body(weights) <- as.call(append(as.list(body(weights)), quote(d <- exp(d)), after=1)) } ## construct derivatives with respect to "d" (or log(d), respectively) dweights <- d2weights <- as.function(c(alist(d=, nbmat=, ...=), quote({})), envir=.GlobalEnv) header <- c( if (log) quote(d <- exp(d)), # such that d is again on original scale substitute(W <- weights.call, list(weights.call=weights.call)), expression( nUnits <- nrow(W), # such that we can use .rowSums() is.na(nbmat) <- nbmat == 0L, # w_jj(d)=0 => w_jj'(d)=0, sum over j!=i, logo <- log(nbmat) # have to set NA because we do log(o) ) ) footer <- expression(deriv[is.na(deriv)] <- 0, deriv) ## first derivative tmp1 <- expression( norm <- .rowSums(nbmat^-d, nUnits, nUnits, na.rm=TRUE), tmpnorm <- .rowSums(nbmat^-d * -log(nbmat), nUnits, nUnits, na.rm=TRUE) / norm, tmp1 <- logo + tmpnorm ) deriv1 <- if (normalize) { expression(deriv <- W * -tmp1) } else expression(deriv <- W * -logo) body(dweights) <- as.call(c(as.name("{"), header, if (normalize) tmp1, deriv1, if (log) expression(deriv <- deriv * d), # this is the non-log d footer )) ## second derivative body(d2weights) <- as.call(c(as.name("{"), header, if (normalize) { c(tmp1, expression( tmp2 <- .rowSums(nbmat^-d * log(nbmat)^2, nUnits, nUnits, na.rm=TRUE) / norm - tmpnorm^2, deriv <- W * (tmp1^2 - tmp2) )) } else expression(deriv <- W * logo^2), if (log) c( do.call("substitute", list(deriv1[[1]], list(deriv=as.name("deriv1")))), expression(deriv <- deriv * d^2 + deriv1 * d) # this is the non-log d ), footer )) ## return list of functions list(w=weights, dw=dweights, d2w=d2weights, initial=initial) } surveillance/R/plot_xtable.R0000644000176000001440000000040212035760242015634 0ustar ripleyusers################################################### ### chunk number 1: ################################################### compMatrix.writeTable <- function (compMatrix) { xtable(compMatrix, display = c("s", rep("d", 4), rep("G", 4)), vsep = "|") } surveillance/R/twinSIR.R0000644000176000001440000005226711731650466014706 0ustar ripleyusers###################################################################### # Authors: Michael Hoehle, Sebastian Meyer # Date: 02 Nov 2009 # # Function 'twinSIR' performs (penalized) maximum likelihood inference # for the Hoehle (2009) model. Now with REML estimation of smoothing # parameter lambda. # # ATTENTION: the .loglik and .score functions assume atRiskY == 1 data ###################################################################### ###################################################################### # Log-Likelihood function # # PARAMS: # theta - parameter vector c(alpha,beta), where # beta also contains the baseline coefficients in the first place # X - covariate matrix related to alpha, i.e. the epidemic component # Z - covariate matrix related to beta, i.e. the Cox-like endemic component # survs - data.frame with columns id, start, stop and event # weights - vector of length nrow(X) indicating the number of individuals # with the same covariates. weights are allowed to change over time. # Note: it is assumed that none of the individuals covered by # "weights" can have an actual event, if so they need to have their # own row ###################################################################### .loglik <- function(theta, X, Z, survs, weights) { # Calculate epidemic (e) and endemic (h) component of the infection intensity eh <- .eh(theta, X, Z) # Calculate infection intensity assuming atRiskY == 1 for all rows lambdaNoY <- rowSums(eh) # dN Part of the loglik isEvent <- survs$event == 1 events <- which(isEvent) intdN <- numeric(length(isEvent)) # zeros intdN[events] <- weights[events] * log(lambdaNoY[events]) # here one might have got -Inf values in case of 0-intensity at an event time # lambda integral of the log-likelihood dt <- survs$stop - survs$start intlambda <- weights * lambdaNoY * dt # Return the log-likelihood loglik <- sum( intdN - intlambda ) return(loglik) } ###################################################################### # Penalized log-likelihood function # Additional Params: # lambda.smooth - smoothing parameter # K - penalty matrix on the beta component ###################################################################### .ploglik <- function(theta, X, Z, survs, weights, lambda.smooth, K) { loglik <- .loglik(theta, X, Z, survs, weights) if (lambda.smooth == 0) { return(loglik) } # Add penalty term and return the penalized log-likelihood beta <- theta[ncol(X) + seq_len(ncol(Z))] penalty <- lambda.smooth/2 * drop(t(beta) %*% K %*% beta) return(loglik - penalty) } ###################################################################### # Score function # Params: see .loglik ###################################################################### .score <- function(theta, X, Z, survs, weights) { dimX <- dim(X) nRows <- dimX[1] px <- dimX[2] pz <- ncol(Z) isEvent <- survs$event == 1 # event indicator for the dN integral events <- which(isEvent) dt <- survs$stop - survs$start # for the dt integral # Calculate epidemic (e) and endemic (h) component of the infection intensity eh <- .eh(theta, X, Z) h <- eh[,2,drop=TRUE] # Calculate infection intensity at event times lambdaEvents <- rowSums(eh[events,,drop=FALSE]) score <- if (px > 0L) { wX <- X * weights part1intdN <- matrix(0, nrow = nRows, ncol = px, dimnames = dimnames(X)) part1intdN[events,] <- wX[events,] / lambdaEvents part1intlambda <- wX * dt colSums(part1intdN - part1intlambda) } else NULL if (pz > 0L) { wZh <- Z * (h * weights) part2intdN <- matrix(0, nrow = nRows, ncol = pz, dimnames = dimnames(Z)) part2intdN[events,] <- wZh[events,] / lambdaEvents part2intlambda <- wZh * dt part2 <- colSums(part2intdN - part2intlambda) score <- c(score, part2) } return(score) } ###################################################################### # Penalized Score function # Additional Params: see .ploglik ###################################################################### .pscore <- function(theta, X, Z, survs, weights, lambda.smooth, K, ...) { score <- .score(theta, X, Z, survs, weights) if (lambda.smooth == 0) { return(score) } # Add penalty term and return the penalized Score function beta <- theta[ncol(X) + seq_len(ncol(Z))] penalty <- c(rep.int(0, ncol(X)), lambda.smooth * K %*% beta) return(score - penalty) } ###################################################################### # Fisher information matrix function # Params: see .loglik ###################################################################### .fisherinfo <- function(theta, X, Z, survs, weights) { px <- ncol(X) pz <- ncol(Z) isEvent <- survs$event == 1 # event indicator events <- which(isEvent) # Fisher matrix calculation only incorporates data at event times! Xevents <- X[events,,drop = FALSE] Zevents <- Z[events,,drop = FALSE] # Calculate epidemic (e) and endemic (h) component of the infection intensity eh <- .eh(theta, Xevents, Zevents) h <- eh[,2,drop=TRUE] # Calculate infection intensity lambda <- rowSums(eh) # calculate intdN of d/dtheta log(lambda_i(t)) for all individuals with events wpl <- weights[events] / lambda dloglambda <- if (px > 0L) Xevents * wpl else NULL if (pz > 0L) { dloglambda <- cbind(dloglambda, Zevents * (h * wpl)) } # Build the optional variation process (Martinussen & Scheike, p64) fisherinfo <- matrix(0, nrow=px+pz, ncol=px+pz) for (i in 1:nrow(dloglambda)) { x <- dloglambda[i,,drop=FALSE] # single-ROW matrix fisherinfo <- fisherinfo + crossprod(x) # t(x) %*% x } return(fisherinfo) } ###################################################################### # Fisher information matrix function # Additional Params: see .ploglik ###################################################################### .pfisherinfo <- function(theta, X, Z, survs, weights, lambda.smooth, K) { fisherinfo <- .fisherinfo(theta, X, Z, survs, weights) if (lambda.smooth == 0) { return(fisherinfo) } # Add penalty term and return the penalized Fisher information matrix penalty <- matrix(0, ncol=ncol(fisherinfo), nrow=nrow(fisherinfo)) zIndex <- ncol(X) + seq_len(ncol(Z)) penalty[zIndex,zIndex] <- lambda.smooth * K return(fisherinfo + penalty) } ###################################################################### # Marginal likelihood of the log(smoothing) parameter as given # by a Laplace approximation c.f. Kneib & Fahrmeir (2006), p.9. # or Cai et al (2002) # # Params: # log.lambda.smooth - log parametrization to ensure positive value of # lambda.smooth # theta - fixed regression parameters # X - design matrix of additive part # Z - design matrix of multiplicative part # survs - the data.frame containing the data in survs format # weights - for weighting individual entries # K - smoother matrix # # Returns: # value of lmarg ###################################################################### .lmarg.lambda <- function(log.lambda.smooth, theta, X, Z, survs, weights, K) { #Contribution of the penalized likelihood loglik <- .ploglik(theta, X, Z, survs, weights, exp(log.lambda.smooth), K) #Laplace approximation using TP representation H <- .pfisherinfo(theta, X, Z, survs, weights, exp(log.lambda.smooth), K) beta <- theta[ncol(X) + seq_len(ncol(Z))] #[Q]: Extract baseline terms from model and translate into #TP-spline setting, i.e. a B-spline of 0th order is assumed baselineIdx <- grep("cox\\(logbaseline.*\\)",dimnames(Z)[[2]]) b <- diff(beta[baselineIdx]) laplace <- 1/2*(length(b)-1)*log.lambda.smooth - 1/2*log(det(H)) return(loglik + laplace) } ###################################################################### # Model fitter. Prepares everything and uses optim's (L-)BFGS(-B) to # maximize the (penalized) log-likelihood. ###################################################################### twinSIR <- function (formula, data, weights, subset, knots = NULL, nIntervals = 1, lambda.smooth = 0, penalty = 1, optim.args = list(), model = TRUE, keep.data = FALSE) { cl <- match.call() ## Verify that 'data' inherits from "epidata" data <- eval(cl$data, parent.frame()) if (!inherits(data, "epidata")) { stop("'data' must inherit from class \"epidata\"") } ## Extract the time range of the epidemic timeRange <- attr(data, "timeRange") minTime <- timeRange[1L] maxTime <- timeRange[2L] # ## NOTE: modification of 'data' has no effect with the current evaluation # ## of model.frame in the parent.frame() as the original 'data' will # ## be used. # ## Impute blocks for 'knots', which are not existing stop times # if (is.vector(knots, mode = "numeric")) { # insideKnot <- (knots > minTime) & (knots < maxTime) # if (any(!insideKnot)) { # warning("only 'knots' inside the observation period are considered") # } # knots <- sort(knots[insideKnot]) # data <- intersperse(data, knots) # } ############################ ### Build up model.frame ### (this is derived from the coxph function) ############################ mfnames <- c("", "formula", "data", "weights", "subset") mf <- cl[match(mfnames, names(cl), nomatch = 0L)] mf$id <- as.name("id") mf$atRiskY <- as.name("atRiskY") mf$subset <- if (is.null(mf$subset)) { call("==", mf$atRiskY, 1) } else { call("&", mf$subset, call("==", mf$atRiskY, 1)) } if(length(formula) == 2L) { # i.e. no response specified formula[3L] <- formula[2L] formula[[2L]] <- quote(cbind(start, stop, event)) } mf$na.action <- as.name("na.fail") special <- c("cox") Terms <- terms(formula, specials = special, data = data, keep.order = FALSE) mf$formula <- Terms mf[[1]] <- as.name("model.frame") mf <- eval(mf, parent.frame()) ########################################################### ### Check arguments and extract components of the model ### ########################################################### ## Extract and check 'weights' weights <- model.extract(mf, "weights") if (is.null(weights)) { weights <- rep(1, nrow(mf)) names(weights) <- attr(mf, "row.names") } else { if (!is.vector(weights, mode="numeric")) { stop("'weights' must be a numeric vector") } if (any(weights < 0)) { stop("negative 'weights' not allowed") } } ## Extract the response response <- model.response(mf) survs <- data.frame(id = model.extract(mf, "id"), start = response[,1L], stop = response[,2L], event = response[,3L], check.names = FALSE, stringsAsFactors = FALSE) attr(survs, "eventTimes") <- attr(data, "eventTimes") attr(survs, "timeRange") <- timeRange ## Check specified baseline intervals if (is.null(knots) && isScalar(nIntervals)) { knots <- if (nIntervals == 1) { numeric(0) } else if (nIntervals > 1) { quantile(attr(survs, "eventTimes"), probs = seq(from=0, to=1, length.out=nIntervals+1)[-c(1,nIntervals+1)], type = 1, names = FALSE) } else { stop("'nIntervals' must be a single number >= 1") } } else if (is.vector(knots, mode = "numeric")) { isInsideKnot <- (knots > minTime) & (knots < maxTime) if (any(!isInsideKnot)) { warning("only 'knots' inside the observation period are considered") knots <- knots[isInsideKnot] } isStopKnot <- knots %in% unique(survs$stop) if (any(!isStopKnot)) { stop("ATM, 'knots' must be a subset of the 'stop' times where at least ", "one individual is susceptible") # nNonStopKnots <- sum(!isStopKnot) # warning( # sprintf(ngettext(nNonStopKnots, # paste("%d of 'knots' has been ignored due to no susceptible", # "individuals at this time point: "), # paste("%d 'knots' have been ignored due to no susceptible", # "individuals at those time points: ")), nNonStopKnots), # knots[!stopKnot] # ) # knots <- knots[stopKnot] } knots <- sort(knots) } else { stop("'knots' (a numeric vector) or 'nIntervals' (a single number) ", "must be specified") } intervals <- c(minTime, knots, maxTime) nIntervals <- length(intervals) - 1L message( sprintf(ngettext(nIntervals, "Initialized %d log-baseline interval: ", "Initialized %d log-baseline intervals: "), nIntervals), paste(format(intervals, trim = TRUE), collapse=" ") ) ## Extract the two parts of the design matrix: ## Z contains the Cox part, X contains the epidemic part, there's no intercept des <- read.design(mf, Terms) X <- des$X; px <- ncol(X) Z <- des$Z ## Add variables for the piecewise constant baseline to Z (if requested) if (nIntervals == 1L) { nEvents <- length(attr(survs, "eventTimes")) if (attr(Terms, "intercept") == 1) Z <- cbind("cox(logbaseline)" = 1, Z) } else { # we have more than one baseline interval/parameter intervalIndices <- findInterval(survs$start, intervals, rightmost.closed = FALSE) intervalNumbers <- seq_len(nIntervals) baselineVars <- sapply(intervalNumbers, function(i) intervalIndices == i) dimnames(baselineVars) <- list(NULL, paste("cox(logbaseline.", intervalNumbers, ")", sep="")) Z <- cbind(baselineVars, Z) nEvents <- as.vector(table(factor(intervalIndices[survs$event == 1], levels = seq_len(nIntervals)))) } pz <- ncol(Z) ## Check that we have at least one parameter if (pz == 0L && px == 0L) { stop("nothing to do: neither a baseline nor covariates have been specified") } ## Check lambda.smooth if (!isScalar(lambda.smooth)) { stop("'lambda.smooth' must be scalar") } if (lambda.smooth != 0 && pz == 0L) { lambda.smooth <- 0 message("Note: 'lambda.smooth' was set to 0, because there was no endemic ", "component in the formula.") } ## Setup penalty matrix if (isScalar(penalty)) { K <- matrix(0, ncol = pz, nrow = pz) if (lambda.smooth != 0 && nIntervals > 1L) { # do we have equidistant knots? knotSpacings <- diff(intervals) #equidistant <- all(sapply(knotSpacings[-1], function(x) isTRUE(all.equal(x,knotSpacings[1])))) equidistant <- isTRUE(all.equal(diff(knotSpacings), rep.int(0,nIntervals-1))) if (equidistant) { # K = D'D only works for equidistant knots # difference matrix of order 'penalty' D <- diff(diag(nIntervals), differences=penalty) K[intervalNumbers,intervalNumbers] <- crossprod(D) # t(D) %*% D } else { # special weighting scheme for the non-equidistant case if (penalty != 1) { stop("ATM, non-equidistant knots only work for 1st order penalty") } #Use Fahrmeir & Lang (2001), p.206 invdelta <- 1/diff(intervals) * mean(diff(intervals)) #Use Fahrmeir & Lang (2001), p.206 for (i in 1:(nIntervals)) { idx2 <- cbind(j=c(-1,1) + i, deltaidx=i+c(-1,0),fac=c(-1,-1)) idx2 <- idx2[idx2[,"j"] > 0 & idx2[,"j"] <= nIntervals,,drop=FALSE] #Off diagonal elements K[i, idx2[,"j"]] <- invdelta[idx2[,"deltaidx"]] * idx2[,"fac"] #Diagonal element K[i, i] <- sum(invdelta[idx2[,"deltaidx"]]) } message("Note: non-equidistant knots. Using penalization matrix ", "correcting for distance between knots.\n") # print(K) # browser() } } } else if (is.matrix(penalty) && ncol(penalty) == pz && nrow(penalty) == pz) { K <- penalty } else { stop("'penalty' must either be a single number or a square matrix of ", "dimension ", pz, "x", pz, ", fitting the number of unknown ", "parameters in the endemic component (baseline and covariates)") } ## Check that optim.args is a list if (!is.list(optim.args)) { stop("'optim.args' must be a list") } ## Check start value for theta if (!is.null(optim.args[["par"]])) { if (!is.vector(optim.args$par, mode="numeric")) { stop("'optim.args$par' must be a numeric vector or NULL") } if (length(optim.args$par) != px + pz) { stop(gettextf(paste("'optim.args$par' (%d) does not have the same length", "as the number of unknown parameters (%d + %d = %d)"), length(optim.args$par), px, pz, px + pz)) } } else { optim.args$par <- c(rep.int(1, px), rep.int(0, pz)) } message("Initial parameter vector: ", paste(optim.args$par, collapse=" ")) ## Set names for theta names(optim.args$par) <- c(colnames(X), colnames(Z)) #################### ### Optimization ### #################### ## Configuring the optim procedure (check optim.args) optimControl <- list(trace = 1, fnscale = -1, maxit = 300, factr = 1e7) optimControl[names(optim.args[["control"]])] <- optim.args[["control"]] optim.args$control <- optimControl optimArgs <- list(par = optim.args$par, fn = .ploglik, gr = .pscore, X = X, Z = Z, survs = survs, weights = weights, lambda.smooth = lambda.smooth, K = K, method = "L-BFGS-B", lower = c(rep(0,px), rep(-Inf,pz)), upper = rep(Inf,px+pz), control = list(), hessian = FALSE) namesOptimArgs <- names(optimArgs) namesOptimUser <- names(optim.args) optimValid <- namesOptimUser %in% namesOptimArgs optimArgs[namesOptimUser[optimValid]] <- optim.args[optimValid] if (any(!optimValid)) warning("unknown names in optim.args: ", paste(namesOptimUser[!optimValid], collapse = ", ")) if (! "method" %in% namesOptimUser && px == 0L) { optimArgs$method <- "BFGS" } if (optimArgs$method != "L-BFGS-B") { optimArgs$lower <- -Inf optimArgs$upper <- Inf } #Fit model using fixed smoothing parameter or use mixed model #representation to estimate lambda.smooth using marginal likelihood if (lambda.smooth == -1) { if (isScalar(penalty) && penalty == 1) { ################################################################### ##TODO: Need to check for B-spline (?). Move options into ctrl obj ################################################################### #Iterative procedure where we change between optimizing regression #parameters given fixed smoothing parameter and optimizing the #smoothing parameter given fixed regression parameters (Gauss-Seidel) #procedure. The tuning parameters (5) could go into the control object. lambda.smooth <- 5 reltol <- 1e-2 maxit <- 25 #Parameters for keeping track of the iterations lambda.smoothOld <- 1e99 iter <- 0 #Loop until relative convergence or max-iteration reached while ((abs(lambda.smooth-lambda.smoothOld)/lambda.smoothOld > reltol) & (iter < maxit)) { #Iteration begins iter <- iter + 1 if (optimControl$trace > 0) { cat("==> Iteration ",iter," of Gauss-Seidel maximization. lambda.smooth = ",lambda.smooth,"\n") } #Step 1 - maximize (alpha,beta) with fixed lambda optimArgs$lambda.smooth <- lambda.smooth optimRes <- do.call("optim", optimArgs) theta <- optimRes$par optimArgs$par <- theta #better start value the next time #Step 2 - maximize log(lambda) with fixed (alpha,beta) optimLambda <- optim(log(lambda.smooth), .lmarg.lambda, control=list(fnscale=-1,trace=1),method="BFGS", theta=theta, X=X, Z=Z, survs=survs, weights=weights, K=K) lambda.smoothOld <- lambda.smooth lambda.smooth <- exp(optimLambda$par) } #Done, update optimArgs with new smoothing parameter optimArgs$lambda.smooth <- lambda.smooth } else { stop("REML estimation using TP-splines only works for 1st order differences.") } } ## Call optim with the arguments above (including the news smoothing param) optimRes <- do.call("optim", optimArgs) ############## ### Return ### ############## ## Set up list object to be returned fit <- list(coefficients = optimRes$par, lambda.smooth = lambda.smooth, loglik = optimRes$value, counts = optimRes$counts, converged = (optimRes$convergence == 0)) ## If requested, add observed fisher info (= negative hessian at maximum) if (!is.null(optimRes$hessian)) { fit$fisherinfo.observed <- -optimRes$hessian } ## Add own (exact) fisher info computation fit$fisherinfo <- .pfisherinfo(theta = fit$coefficients, X = X, Z = Z, survs = survs, weights = weights, lambda.smooth = lambda.smooth, K = K) ## Add 'method' fit$method <- optimArgs$method ## Append further information fit$intervals <- intervals fit$nEvents <- nEvents if (model) { fit$model <- list( survs = survs, X = X, Z = Z, weights = weights, lambda.smooth = lambda.smooth, K = K, f = attr(data, "f")[match(colnames(X), names(attr(data, "f")), nomatch=0)] ) } if (keep.data) { fit$data <- data } fit$call <- cl fit$formula <- formula(Terms) fit$terms <- Terms ## Return object of class "twinSIR" class(fit) <- "twinSIR" return(fit) } surveillance/R/algo_rki.R0000644000176000001440000001056511734631673015133 0ustar ripleyusers### R code from vignette source 'Rnw/algo_rki.Rnw' ### Encoding: ISO8859-1 ################################################### ### code chunk number 1: algo_rki.Rnw:96-214 ################################################### # Implementation of the Robert-Koch Institute (RKI) surveillance system. # The system evaluates specified timepoints and gives alarm if it recognizes # an outbreak for this timepoint. # # Features: # Choice between the different RKI sub-systems (difference in reference values). algo.rkiLatestTimepoint <- function(disProgObj, timePoint = NULL, control = list(b = 2, w = 4, actY = FALSE)){ observed <- disProgObj$observed freq <- disProgObj$freq # If there is no value in timePoint, then take the last value in observed if(is.null(timePoint)){ timePoint = length(observed) } # check if the vector observed includes all necessary data. if((timePoint-(control$b*freq)-control$w) < 1){ stop("The vector of observed is too short!") } # Extract the reference values from the historic time series basevec <- c() # if actY == TRUE use also the values of the year of timepoint if(control$actY){ basevec <- observed[(timePoint - control$w):(timePoint - 1)] } # check if you need more referencevalues of the past if(control$b >= 1){ for(i in 1:control$b){ basevec <- c(basevec, observed[(timePoint-(i*freq)-control$w):(timePoint-(i*freq)+control$w)]) } } # compute the mean. mu <- mean(basevec) if(mu > 20){ # use the normal distribution. # comupte the standard deviation. sigma <- sqrt(var(basevec)) # compute the upper limit of the 95% CI. upCi <- mu + 2 * sigma } else{ # use the poisson distribution. # take the upper limit of the 95% CI from the table CIdata.txt. #data("CIdata", envir=environment()) # only local assignment -> SM: however, should not use data() here #CIdata <- read.table(system.file("data", "CIdata.txt", package="surveillance"), header=TRUE) #SM: still better: use R/sysdata.rda (internal datasets being lazy-loaded into the namespace environment) # for the table-lookup mu must be rounded down. mu <- floor(mu) # we need the third column in the row mu + 1 upCi <- CIdata[mu + 1, 3] } # give alarm if the actual value is larger than the upper limit. alarm <- observed[timePoint] > upCi result <- list(alarm=alarm, upperbound=upCi) class(result) = "survRes" # for surveillance system result return(result) } # 'algo.rki' calls 'algo.bayesLatestTimepoint' for data points given by range. algo.rki <- function(disProgObj, control = list(range = range, b = 2, w = 4, actY = FALSE)){ # Set the default values if not yet set if(is.null(control$b)){ # value from rki 3 control$b <- 2 } if(is.null(control$w)){ # value from rki 3 control$w <- 4 } if(is.null(control$actY)){ # value from rki 3 control$actY <- FALSE } # initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) count <- 1 for(i in control$range){ #hoehle Debug: #print(i) # call algo.rki1LatestTimepoint result <- algo.rkiLatestTimepoint(disProgObj, i, control = control) # store the results in the right order alarm[count] <- result$alarm upperbound[count] <- result$upperbound count <- count + 1 } #Add name and data name to control object. control$name <- paste("rki(",control$w,",",control$w*control$actY,",",control$b,")",sep="") control$data <- paste(deparse(substitute(disProgObj))) # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj, control=control) class(result) = "survRes" # for surveillance system result return(result) } algo.rki1 <- function(disProgObj, control = list(range = range)) { algo.rki(disProgObj, control = list(range = control$range, b = 0, w = 6, actY = TRUE)) } algo.rki2 <- function(disProgObj, control = list(range = range)){ algo.rki(disProgObj, control = list(range = control$range, b = 1, w = 6, actY = TRUE)) } algo.rki3 <- function(disProgObj, control = list(range = range)){ algo.rki(disProgObj, control = list(range = control$range, b = 2, w = 4, actY = FALSE)) } surveillance/R/linelist2sts.R0000644000176000001440000000512711765400002015761 0ustar ripleyusers###################################################################### # Takes a data frame with dates of individual # cases and create an aggregated sts time series object for these # data with aggregation occuring at the desired scale. # Note: This function is experimental # # Parameters: # linelist - a data frame containing individual case information, one per line # dateCol - a character string denoting the column name in case containing # the relevant date variable to aggregate # aggregate.by - aggregation block length given as a string compatible with # seq.Date -- see \link{seq.Date} for further details. # # Author: Michael Hoehle # Date LaMo: 06 Feb 2012 ###################################################################### linelist2sts <- function(linelist,dateCol,aggregate.by="1 week",dRange=NULL, startYearFormat=switch(aggregate.by,"1 day"="%V","7 day"="%V","1 week"="%V","1 month"="%Y","3 month"="%Y"), startEpochFormat=switch(aggregate.by,"1 day"="%j","7 day"="%V","1 week"="%V","1 month"="%m","3 month"="%Q") ) { #by <- match.arg(by,c("1 day","1 week","1 month","1 year") if (is.null(dRange)) { dRange <- range(linelist[,dateCol],na.rm=TRUE) } ## #Make sure that if weeks we span the entire data set. ## if ((aggregate.by=="1 week" | aggregate.by == "7 day") & is.null(dRange)) { ## #Adjust first date to a monday and the last to be a sunday ## weekDay <- as.numeric(format(dRange, "%w")) ## dRange[1] <- dRange[1] - ifelse( weekDay[1] == 0, 6, (weekDay[1]-1)) ## dRange[2] <- dRange[2] + 7 ## } #Add exactly one time step to dRange to ensure that cut #contains the respective level maxDate <- seq(max(dRange),length.out=2,by=aggregate.by)[-1] dates <- seq(min(dRange), maxDate, by=aggregate.by) #Make a table containing the specific number of cases. Note that this #needs to occur using a cut statement lvl <- cut(linelist[,dateCol], breaks=dates,right=FALSE) observed <- table(lvl) epoch <- as.Date(names(observed)) #Translate "by" to freq string freq <- switch(aggregate.by,"1 day"=365,"7 day"=52,"1 week"=52,"1 month"=12,"3 month"=4) startYear <- as.numeric(formatDate(min(dates),startYearFormat)) startEpoch <- as.numeric(formatDate(min(dates),startEpochFormat)) observed <- matrix(observed,ncol=1) #Create S4 object sts <- new("sts",epoch=as.numeric(epoch),observed=observed, alarm=0*observed, epochAsDate=TRUE,freq=freq,start=c(startYear,startEpoch)) #Return return(sts) } surveillance/R/twinstim_siaf_gaussian.R0000644000176000001440000001627312237174420020107 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Gaussian spatial interaction function for twinstim's epidemic component ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ## nTypes: determines the number of parameters=(log-)standard deviations of the ## Gaussian kernel. In a multitype epidemic, the different types may share the ## same spatial interaction function (type-invariant), in which case nTypes=1. ## Otherwise nTypes should equal the number of event types of the epidemic, in ## which case every type has its own variance parameter. ## logsd: logical indicating if the gaussian kernel should be reparametrized ## such that the log-standard deviation is the parameter in question. This ## avoids constrained optimisation (L-BFGS-B) or the use of 'validpars'. ## density: logical. If TRUE, the isotropic Gaussian density (on R^2) will not ## be scaled to have maximum value of 1 at the mean c(0,0). ## effRangeMult: determines the effective range for numerical integration in ## terms of multiples of the parameter, i.e. with effRangeMult=6 numerical ## integration only considers the 6-sigma area around the event instead of the ## whole observation region W. ## validpars: If logsd = FALSE, you should either use ## constrained optimisation (L-BFGS-B) or set 'validpars' to function (pars) ## pars > 0. siaf.gaussian <- function (nTypes = 1, logsd = TRUE, density = FALSE, F.adaptive = TRUE, effRangeMult = 6, validpars = NULL) { nTypes <- as.integer(nTypes) stopifnot(length(nTypes) == 1L, nTypes > 0L) f <- function (s, pars, types) {} # coordinate matrix s, length(types) = 1 or nrow(s) F <- if (F.adaptive) { function(polydomain, f, pars, type, adapt=0.1) {} } else siaf.fallback.F Fcircle <- function (r, pars, type) {} # single radius and type effRange <- function (pars) {} deriv <- function (s, pars, types) {} # coordinate matrix s, length(types) = 1 or nrow(s) Deriv <- function (polydomain, deriv, pars, type, nGQ = 20L) {} # single "owin" and type simulate <- function (n, pars, type, ub) {} # n=size of the sample, # type=single type, # ub=upperbound (unused here) ## if there is only one type, we set the default type(s) argument to 1 ## (it is actually unused inside the functions) if (nTypes == 1L) { formals(f)$types <- formals(Fcircle)$type <- formals(deriv)$types <- formals(Deriv)$type <- formals(simulate)$type <- 1L } # helper expressions tmp1 <- if (logsd) expression(sds <- exp(pars)) else expression(sds <- pars) tmp1.1 <- if (nTypes==1L) expression(sd <- sds) else expression(sd <- sds[type]) tmp2 <- c( expression(sLengthSquared <- .rowSums(s^2, L <- nrow(s), 2L)), if (nTypes == 1L) expression(sdss <- sds) else expression( types <- rep_len(types, L), sdss <- sds[types] ) ) # spatial interaction function body(f) <- as.call(c(as.name("{"), tmp1, tmp2, expression(fvals <- exp(-sLengthSquared/2/sdss^2)), if (density) expression(fvals / (2*pi*sdss^2)) else expression(fvals) )) # numerically integrate f over a polygonal domain if (F.adaptive) { body(F) <- as.call(c(as.name("{"), tmp1, tmp1.1, expression( eps <- adapt * sd, intf <- polyCub.midpoint(polydomain, f, pars, type, eps=eps), intf ) )) } # calculate the integral of f over a circular domain around 0 body(Fcircle) <- as.call(c(as.name("{"), tmp1, tmp1.1, expression(val <- pchisq((r/sd)^2, 2)), # cf. Abramowitz&Stegun formula 26.3.24 if (!density) expression(val <- val * 2*pi*sd^2), expression(val) )) # effective integration range of f as a function of sd if (isScalar(effRangeMult)) { body(effRange) <- as.call(c(as.name("{"), tmp1, substitute(effRangeMult*sds) )) } else effRange <- NULL # derivative of f wrt pars derivexpr <- if (logsd) { # derive f wrt psi=log(sd) !! if (density) { quote(deriv[cbind(1:L,colidx)] <- exp(-frac) / pi/sdss^2 * (frac-1)) } else { quote(deriv[cbind(1:L,colidx)] <- exp(-frac) * 2*frac) } } else { # derive f wrt sd !! if (density) { quote(deriv[cbind(1:L,colidx)] <- exp(-frac) / pi/sdss^3 * (frac-1)) } else { quote(deriv[cbind(1:L,colidx)] <- exp(-frac) * 2*frac/sdss) } } derivexpr <- do.call("substitute", args=list(expr=derivexpr, env=list(colidx=if (nTypes==1L) 1L else quote(types)))) body(deriv) <- as.call(c(as.name("{"), tmp1, tmp2, expression( deriv <- matrix(0, L, length(pars)), frac <- sLengthSquared/2/sdss^2 ), derivexpr, expression(deriv) )) # integrate 'deriv' over a polygonal domain body(Deriv) <- as.call(c(as.name("{"), ## Determine a = argmax(abs(deriv(c(x,0)))) if (density) { expression(a <- 0) # maximum absolute value is at 0 } else { c(tmp1, tmp1.1, expression( xrange <- polydomain$xrange, # polydomain is a "owin" a <- min(max(abs(xrange)), sqrt(2)*sd), # maximum absolute value if (sum(xrange) < 0) a <- -a # is more of the domain left of 0? ) ) }, if (nTypes == 1L) { expression(deriv.type <- function (s) deriv(s, pars, 1L)[,1L,drop=TRUE]) } else { # d f(s|type_i) / d sigma_{type_j} is 0 for i != j expression(deriv.type <- function (s) deriv(s, pars, type)[,type,drop=TRUE]) }, expression(int <- polyCub.SV(polydomain, deriv.type, nGQ=nGQ, alpha=a)), if (nTypes == 1L) expression(int) else expression( res <- numeric(length(pars)), # zeros res[type] <- int, res ) )) ## sampler (does not obey the 'ub' argument!!) body(simulate) <- as.call(c(as.name("{"), tmp1, tmp1.1, expression(matrix(stats::rnorm(2*n, mean=0, sd=sd), nrow=n, ncol=2L)) )) ## set function environments to the global environment environment(f) <- environment(F) <- environment(Fcircle) <- environment(deriv) <- environment(Deriv) <- environment(simulate) <- .GlobalEnv if (is.function(effRange)) environment(effRange) <- .GlobalEnv ## return the kernel specification list(f=f, F=F, Fcircle=Fcircle, effRange=effRange, deriv=deriv, Deriv=Deriv, simulate=simulate, npars=nTypes, validpars=validpars) } surveillance/R/twinSIR_epidata.R0000644000176000001440000011155012231574471016361 0ustar ripleyusers################################################################################ # Author: Sebastian Meyer # Date: 19 Jun 2009 # # This file contains methods related to the class "epidata" (a history # data.frame of the observed epidemic): A converter function as.epidata and # standard methods like print, summary and plot. # There are also more sophisticated functions 'animate' and 'stateplot'. # NB: The summary and plot functions stem from my Bachelor Thesis. ################################################################################ ################################################################################ # CONVERTER FUNCTION # the main purpose is to prepare the data of an epidemic for the inference # function 'twinSIR', i.e. perform consistency checks, transform data to common # format and calculate epidemic covariates with distance function f. # - we assume fixed coordinates (this is important as time-varying coordinates # would result in more sophisticated and time consuming calculations of # distance matrices) ! # - in the first block (start = t0) all id's must be present (for coordinates) # - those id's with atRiskY(t0) = 0 are taken as initially infectious # - SIS epidemics are possible, but must be given as SIRS with pseudo R-events, # i.e. individuals will be removed and become susceptible directly afterwards ################################################################################ # default method (original data in a data.frame) as.epidata.default <- function(data, id.col, start.col, stop.col, atRiskY.col, event.col, Revent.col, coords.cols, f = list(), ...) { cl <- match.call() # If necessary, convert 'data' into a data.frame (also converting # column names to syntactically correct names for use in formulae) data <- as.data.frame(data, stringsAsFactors = FALSE) # Check f if (length(f) > 0L) { if (is.null(coords.cols)) { stop("need coordinates to calculate epidemic covariates") } if (!is.list(f) || is.null(names(f)) || any(!sapply(f, is.function))) { stop("'f' must be a named list of functions or 'list()'") } if (any(fInfNot0 <- sapply(f, function(B) B(Inf)) != 0)) { stop("all functions in 'f' must return 0 at infinite distance: ", "f[[i]](Inf) == 0 fails for i = ", paste(which(fInfNot0), collapse=", ")) } } # Use column numbers as indices and check them colargs <- c("id.col", "start.col", "stop.col", "atRiskY.col", "event.col", "Revent.col", "coords.cols") colidxs <- structure(as.list(numeric(length(colargs))), names = colargs) for (colarg in colargs) { colidx <- get(colarg, inherits = FALSE) if (colarg != "coords.cols" && length(colidx) != 1L) { stop("the column specifier '", colarg, "' must be of length 1") } if (is.character(colidx)) { colidx <- match(colidx, colnames(data)) if (any(is.na(colidx))) { stop("'", colarg, " = ", deparse(cl[[colarg]]), "': ", "column does not exist in 'data'") } } else if (is.numeric(colidx) && any(colidx<1L | colidx>ncol(data))) { stop("'", colarg, " = ", deparse(cl[[colarg]]), "': ", "column index must be in [1; ", ncol(data), "=ncol(data)]") } colidxs[[colarg]] <- colidx } # Rename main columns to default column names colidxsVec <- unlist(colidxs) colnams <- c("id", "start", "stop", "atRiskY", "event", "Revent") colnames(data)[colidxsVec[1:6]] <- colnams usedReservedName <- any(colnams %in% colnames(data)[-colidxsVec[1:6]]) # REORDER COLUMNS, so that main columns come first (also for make.unique) data <- data[c(colidxsVec, setdiff(seq_len(NCOL(data)), colidxsVec))] # Make columns names unique (necessary if other column with name in colnams) if (usedReservedName) { colnames(data) <- make.unique(colnames(data)) message("Some other columns had reserved names and have been renamed") } # Convert id into a factor (also removing unused levels if it was a factor) data[["id"]] <- factor(data[["id"]]) # Check atRiskY, event and Revent for values other than 0 and 1 for (var in c("atRiskY", "event", "Revent")) { data[[var]] <- as.numeric(data[[var]]) if (any(! data[[var]] %in% c(0,1))) stop("'", var, "' column may only assume values 0 and 1") } # Check consistency of atRiskY and event (event only if at-risk) noRiskButEvent <- data[["atRiskY"]] == 0 & data[["event"]] == 1 if (noRiskButEventRow <- match(TRUE, noRiskButEvent, nomatch = 0)) { stop("inconsistent atRiskY/event indicators in row ", noRiskButEventRow, ": event only if at risk") } # Check event (infection) times for ties eventTimes <- data[data[["event"]] == 1, "stop"] ReventTimes <- data[data[["Revent"]] == 1, "stop"] duplicatedEventTime <- duplicated(c(eventTimes, ReventTimes)) if (duplicatedEventTimeIdx <- match(TRUE, duplicatedEventTime, nomatch=0)) { stop("non-unique event times: concurrent event/Revent at time ", c(eventTimes, ReventTimes)[duplicatedEventTimeIdx]) } # Check start/stop consistency and add block id histIntervals <- unique(data[c("start", "stop")]) histIntervals <- histIntervals[order(histIntervals[,1L]),] nBlocks <- nrow(histIntervals) if (any(histIntervals[,2L] <= histIntervals[,1L])) { stop("stop times must be greater than start times") } startStopCheck <- histIntervals[-1L,1L] != histIntervals[-nBlocks,2L] if (startStopCheckIdx <- match(TRUE, startStopCheck, nomatch = 0)) { stop("inconsistent start/stop times: time intervals not consecutive ", "at stop time ", histIntervals[startStopCheckIdx,2L]) } if ("BLOCK" %in% colnames(data)) { warning("column name 'BLOCK' is reserved, ", "existing column has been replaced") } data[["BLOCK"]] <- match(data[["start"]], histIntervals[,1L]) # SORT by block/id and create indexes for block borders data <- data[order(data[["BLOCK"]], data[["id"]]),] beginBlock <- match(seq_len(nBlocks), data[["BLOCK"]]) endBlock <- c(beginBlock[-1L]-1L, nrow(data)) # make block column the first column BLOCK.col <- match("BLOCK", colnames(data)) data <- data[c(BLOCK.col, setdiff(seq_along(data), BLOCK.col))] coords.cols <- 1L + 6L + seq_along(colidxs[["coords.cols"]]) # Check consistency of atRiskY and event (not at-risk after event) .checkFunction <- function(eventblock, eventid) { rowsOfNextBlock <- beginBlock[eventblock+1L]:endBlock[eventblock+1L] nextBlockData <- data[rowsOfNextBlock, c("id", "atRiskY")] idIdx <- which(nextBlockData[["id"]] == eventid) if (length(idIdx) == 1L && nextBlockData[idIdx, "atRiskY"] == 1) { stop("inconsistent atRiskY/event indicators for id '", eventid, "': should not be at risk immediately after event") } } eventTable <- data[data[["event"]] == 1,] for(k in seq_len(nrow(eventTable))) { .checkFunction(eventTable[k,"BLOCK"], eventTable[k,"id"]) } # Compute epidemic variables x if ((nf <- length(f)) > 0L) { # check names(f) and initialize x-columns if (any(names(f) %in% names(data))) { warning("some 'names(f)' already existed in 'names(data)' ", "and have been replaced") } data[names(f)] <- 0 # Compute distance matrix firstDataBlock <- data[beginBlock[1L]:endBlock[1L],] coords <- firstDataBlock[coords.cols] rownames(coords) <- firstDataBlock[["id"]] distmat <- as.matrix(dist(coords, method = "euclidean")) diag(distmat) <- Inf # no influence on yourself # Compute sum of distances over infectious individuals infectiousIDs <- firstDataBlock[firstDataBlock[["atRiskY"]] == 0, "id"] for(i in seq_along(beginBlock)) { blockidx <- beginBlock[i]:endBlock[i] blockdata <- data[blockidx,] blockIDs <- blockdata[["id"]] if (length(infectiousIDs) > 0L) { u <- distmat[as.character(blockIDs),as.character(infectiousIDs), drop = FALSE] # numerical indices would be better, but be careful with factors data[blockidx,names(f)] <- sapply(f, function(B) rowSums(B(u))) } recoveredID <- blockIDs[blockdata[["Revent"]] == 1] infectedID <- blockIDs[blockdata[["event"]] == 1] if (length(recoveredID) > 0L) { infectiousIDs <- infectiousIDs[infectiousIDs != recoveredID] } else if (length(infectedID) > 0L) { infectiousIDs[length(infectiousIDs)+1L] <- infectedID } } } attr(data, "eventTimes") <- sort(eventTimes) attr(data, "timeRange") <- c(histIntervals[1L,1L],histIntervals[nBlocks,2L]) attr(data, "coords.cols") <- coords.cols # must include this info because externally of this function # we don't know how many coords.cols (dimensions) we have attr(data, "f") <- f class(data) <- c("epidata", "data.frame") return(data) } ################################################################################ # EXTRACTION OPERATOR FOR 'EPIDATA' OBJECTS # Indexing with "[" would be possible (inheriting from data.frame). # But using any column index would remove attributes (row indexes would not). # Thus, we define an own method to retain and adjust the attributes when # selecting a subset of blocks of the 'epidata'. # Selecting a subset of columns will remove class "epidata" (resulting in a # simple data.frame) ################################################################################ "[.epidata" <- function(x, i, j, drop) { # use data.frame method first xx <- NextMethod("[") # then return its result as pure data.frame or assure valid 'epidata' # if a subset of columns has been selected and attributes have been removed if (NCOL(xx) != ncol(x) || any(names(xx) != names(x))) { if (inherits(xx, "data.frame")) { # xx could be a vector class(xx) <- "data.frame" # remove class 'epidata' } message("Note: converted class \"epidata\" to simple \"", class(xx), "\"") return(xx) } # else there is no effective column selection (e.g. j=TRUE) if (nrow(xx) == 0) { message("Note: no rows selected, dropped class \"epidata\"") class(xx) <- "data.frame" return(xx[TRUE]) # removes attributes } invalidEpidata <- FALSE blocksizesx <- table(x[["BLOCK"]]) blocksizesxx <- table(xx[["BLOCK"]]) blocksOK <- identical(c(blocksizesxx), c(blocksizesx[names(blocksizesxx)])) if (is.numeric(i) && any(diff(na.omit(i)) < 0)) { # epidata should remain ordered by time warning("dropped class \"epidata\": reordering rows is not permitted") invalidEpidata <- TRUE } else if (!blocksOK) { # blocks should not be cut, epidemic covariates might become invalid warning("dropped class \"epidata\": subsetting blocks not allowed") invalidEpidata <- TRUE } else if (any(diff(as.numeric(names(blocksizesxx))) != 1)) { # blocks can only be selected consecutively warning("dropped class \"epidata\": ", "only consecutive blocks may be selected") invalidEpidata <- TRUE } if (invalidEpidata) { class(xx) <- "data.frame" xx[TRUE] # removes attributes } else { # # adjust block index so that it starts at 1 # firstBlockNumber <- as.numeric(names(blocksizesxx)[1]) # if (firstBlockNumber > 1) { # xx[["BLOCK"]] <- xx[["BLOCK"]] - (firstBlockNumber-1) # } # Restore or adjust attributes tmin <- xx[["start"]][1] tmax <- xx[["stop"]][nrow(xx)] oldEventTimes <- attr(x, "eventTimes") attr(xx, "eventTimes") <- if (blocksOK) { oldEventTimes[oldEventTimes > tmin & oldEventTimes <= tmax] } else { xx[["stop"]][xx[["event"]] == 1] } attr(xx, "timeRange") <- c(tmin, tmax) attr(xx, "coords.cols") <- attr(x, "coords.cols") attr(xx, "f") <- attr(x, "f") xx } } ################################################################################ # INSERT BLOCKS FOR EXTRA STOP TIMES IN 'EPIDATA' OBJECTS ################################################################################ intersperse <- function (epidata, stoptimes) { # Check arguments if (!inherits(epidata, "epidata")) { stop("'epidata' must inherit from class \"epidata\"") } if (!is.vector(stoptimes, mode = "numeric")) { stop("'stoptimes' must be a numeric vector") } # Identify new 'stoptimes' epiStop <- unique(epidata$stop) extraStoptimes <- stoptimes[! stoptimes %in% epiStop] # Return original 'epidata' if nothing to do if (length(extraStoptimes) == 0) { # message("nothing done: no new stop times") return(epidata) } # # Retain attributes of 'epidata' # .attributes <- attributes(epidata) # .attributes <- .attributes[match(c("eventTimes", "timeRange", # "coords.cols", "f", "config", "call", "terms"), names(.attributes), # nomatch = 0)] # Check new 'stoptimes' timeRange <- attr(epidata, "timeRange") inside <- extraStoptimes > timeRange[1] & extraStoptimes < timeRange[2] if (any(!inside)) { extraStoptimes <- extraStoptimes[inside] warning("ignored extra 'stoptimes' outside the observation period") } # Impute blocks for extraStoptimes oldclass <- class(epidata) class(epidata) <- "data.frame" # Avoid use of [.epidata (not necessary here) sortedEpiStop <- sort(epiStop) for(extraStop in extraStoptimes) { nextStoptime <- sortedEpiStop[match(TRUE, sortedEpiStop > extraStop)] # Find the block (row indexes) into which the extraStop falls rowsMatchedBlock <- which(epidata$stop == nextStoptime) # Split this block up into 2 parts # later part equals original block with start time = extraStop newBlock <- epidata[rowsMatchedBlock,] newBlock$start <- extraStop # earlier part has stop time = extraStop and no events at this time point epidata[rowsMatchedBlock, "stop"] <- extraStop epidata[rowsMatchedBlock, "event"] <- 0 epidata[rowsMatchedBlock, "Revent"] <- 0 # append the new block to epidata (reorder rows later) epidata <- rbind(epidata, newBlock) } # Adjust BLOCK column sortedEpiStop <- sort(c(sortedEpiStop, extraStoptimes)) epidata$BLOCK <- match(epidata$stop, sortedEpiStop) # Reorder rows by time and id epidata <- epidata[order(epidata$BLOCK, epidata$id), ] # rownames(epidata) <- NULL class(epidata) <- oldclass return(epidata) } ################################################################################ # SUMMARY FUNCTION FOR EPIDATA OBJECTS # the epidemic is summarized by the following returned components: # - type: one of "SIR", "SI", "SIRS", "SIS" # - size: number of initially susceptible individuals, which became infected # - initiallyInfected: vector (factor) of initially infected individuals # - neverInfected: vector (factor) of never (during the observation period) # infected individuals # - coordinates: matrix with the coordinates of the individuals (rownames=id's) # - byID: data.frame with time points of events by id (columns time.I, time.R # and optionally time.S) # - counters: data.frame representing the evolution of the epidemic ################################################################################ summary.epidata <- function (object, ...) { class(object) <- "data.frame" # avoid use of [.epidata (not necessary here) # extract coordinates and initially infected individuals idlevels <- levels(object[["id"]]) N <- length(idlevels) firstDataBlock <- object[object$BLOCK == min(object$BLOCK),] coordinates <- as.matrix(firstDataBlock[attr(object, "coords.cols")]) rownames(coordinates) <- as.character(firstDataBlock[["id"]]) initiallyInfected <- firstDataBlock$id[firstDataBlock$atRiskY == 0] m <- length(initiallyInfected) n <- N - m ### summary 1: event table with columns id, time and type (of event, S/I/R) # Extract time points of the S events for each id StimesID <- by(object[c("atRiskY", "stop")], object["id"], function(x) { SeventIdx <- which(diff(x[["atRiskY"]]) == 1) x[["stop"]][SeventIdx] }, simplify=TRUE) names(StimesID) <- paste0(names(StimesID), ":") StimesVec <- c(unlist(StimesID, use.names = TRUE)) # c() if by() returned an array .Sids <- sub("(.+):.*", "\\1", names(StimesVec)) Stimes <- data.frame(id = factor(.Sids, levels = idlevels), stop = StimesVec, type = rep("S", length(StimesVec)), row.names = NULL, check.names = FALSE, stringsAsFactors = FALSE) # Extract time points of the I and R events for each id Itimes <- object[object$event == 1, c("id", "stop")] Itimes[["type"]] <- rep("I", nrow(Itimes)) Rtimes <- object[object$Revent == 1, c("id", "stop")] Rtimes[["type"]] <- rep("R", nrow(Rtimes)) # Combine the three event types into one data.frame eventTable <- rbind(Rtimes, Stimes, Itimes) # need this order for the counters below in the case of SIS: # pseudo-R-event occures infinitesimally before S names(eventTable)[2L] <- "time" eventTable <- eventTable[order(eventTable[["id"]], eventTable[["time"]]), ] eventTable[["type"]] <- factor(eventTable[["type"]], levels=c("S","I","R")) rownames(eventTable) <- NULL ### summary 2: type and size of the epidemic resusceptibility <- length(StimesVec) > 0 epitype <- if (resusceptibility) { Rtimes_notLast <- Rtimes[-which.max(Rtimes[,2]),] onlyPseudoR <- length(setdiff(Rtimes_notLast[,2], Stimes[,2])) == 0 if (onlyPseudoR) "SIS" else "SIRS" } else { if (nrow(Rtimes) > 0) "SIR" else "SI" } isEverInfected <- idlevels %in% initiallyInfected | idlevels %in% unique(eventTable$id[eventTable$type == "I"]) isNeverInfected <- !isEverInfected size <- n - sum(isNeverInfected) # everInfected <- factor(idlevels[isEverInfected], levels = idlevels) neverInfected <- factor(idlevels[isNeverInfected], levels = idlevels) ### summary 3: eventTable by id in wide form byID_everInfected <- if (nrow(eventTable) == 0) { data.frame(id = factor(character(0), levels = idlevels), time.I = numeric(0), row.names = NULL, check.names = FALSE, stringsAsFactors = FALSE) } else if (!resusceptibility) { .res <- reshape(eventTable, direction = "wide", timevar = "type", idvar = "id") attr(.res, "reshapeWide") <- NULL .res } else { rowsPerId <- table(eventTable[["id"]]) modulo3 <- rowsPerId %% 3 rest1 <- modulo3 == 1 rest12 <- modulo3 >= 1 missingR <- data.frame(id = names(rowsPerId)[rest1], time = rep(NA_real_, sum(rest1)), type = rep("R", sum(rest1)), row.names = NULL, check.names = FALSE, stringsAsFactors = FALSE) missingS <- data.frame(id = names(rowsPerId)[rest12], time = rep(NA_real_, sum(rest12)), type = rep("S", sum(rest12)), row.names = NULL, check.names = FALSE, stringsAsFactors = FALSE) eventTable3 <- rbind(eventTable, missingR, missingS) eventTable3 <- eventTable3[order(eventTable3[["id"]]),] .res <- data.frame( eventTable3[eventTable3$type == "I", c("id", "time")], eventTable3[eventTable3$type == "R", "time", drop = FALSE], eventTable3[eventTable3$type == "S", "time", drop = FALSE], row.names = NULL, check.names = FALSE, stringsAsFactors = FALSE ) names(.res) <- c("id", paste("time", c("I", "R", "S"), sep=".")) .res } byID_neverInfected <- data.frame(id = neverInfected, time.I = rep(NA_real_, n-size), time.R = rep(NA_real_, n-size), time.S = rep(NA_real_, n-size), row.names = NULL, check.names = FALSE) byID_all <- rbind(byID_everInfected, byID_neverInfected[seq_along(byID_everInfected)]) byID <- byID_all[order(byID_all[["id"]]),] rownames(byID) <- NULL ### summary 4: upgrade eventTable with ### evolution of numbers of susceptibles, infectious and removed counters <- eventTable[order(eventTable[["time"]]),c("time", "type", "id")] init <- data.frame(time = attr(object, "timeRange")[1L], type = NA_character_, id = NA_character_, nSusceptible = n, nInfectious = m, nRemoved = 0L) cumulatedReSusceptibility <- cumsum(counters[["type"]] == "S") cumulatedInfections <- cumsum(counters[["type"]] == "I") cumulatedRemovals <- cumsum(counters[["type"]] == "R") counters[["nSusceptible"]] <- init[["nSusceptible"]] - cumulatedInfections + cumulatedReSusceptibility counters[["nInfectious"]] <- init[["nInfectious"]] + cumulatedInfections - cumulatedRemovals counters[["nRemoved"]] <- init[["nRemoved"]] + cumulatedRemovals - cumulatedReSusceptibility counters <- rbind(init, counters) rownames(counters) <- NULL ### return the components in a list res <- list(type = epitype, size = n - sum(isNeverInfected), initiallyInfected = initiallyInfected, neverInfected = neverInfected, coordinates = coordinates, byID = byID, counters = counters) class(res) <- "summary.epidata" attr(res, "eventTimes") <- attr(object, "eventTimes") attr(res, "timeRange") <- attr(object, "timeRange") res } ################################################################################ # PRINT METHOD FOR 'EPIDATA' OBJECTS ################################################################################ print.epidata <- function (x, ...) { cat("\nHistory of an epidemic\n") cat("Number of individuals:", nlevels(x[["id"]]), "\n") cat("Time range:", paste(attr(x, "timeRange"), collapse = " -- "), "\n") cat("Number of infections:", length(attr(x, "eventTimes")), "\n\n") print.data.frame(x, ...) cat("\n") invisible(x) } ################################################################################ # PRINT METHOD FOR THE SUMMARY OF 'EPIDATA' OBJECTS ################################################################################ print.summary.epidata <- function(x, ...) { cat("\nAN", x$type, "EPIDEMIC\n") cat(" Time range:", paste(attr(x, "timeRange"), collapse = " -- "), "\n") cat(" Number of individuals:", nlevels(x$initiallyInfected), "\n") cat(" ", length(x$initiallyInfected), "initially infected individuals") if (length(x$initiallyInfected) > 0) { cat(":\n ") str(as.character(x$initiallyInfected), give.head = FALSE, vec.len = 100, strict.width = "wrap", indent.str = " ") } else cat("\n") cat(" ", length(x$neverInfected), "never infected individuals") if (length(x$neverInfected) > 0) { cat(":\n ") str(as.character(x$neverInfected), give.head = FALSE, vec.len = 100, strict.width = "wrap", indent.str = " ") } else cat("\n") cat(" Size of the epidemic:", x$size, "\n") if (x$type %in% c("SIRS", "SIS")) { cat(" Number of infections:", length(attr(x, "eventTimes")), "\n") } dimc <- dim(x$counters) cat("\n$ counters ('data.frame',", dimc[1L], "x", dimc[2L], "):", "evolution of the epidemic:\n") counters2print <- if (dimc[1] > 6L) { tmp <- format.data.frame(x$counters[c(1:3,1,dimc[1]-(1:0)),], na.encode = FALSE) tmp[4,] <- c("[....]", "", "", "", "", "") rownames(tmp)[4] <- "" as.matrix(tmp) } else { x$counters } print(counters2print, quote = FALSE, right = TRUE, na.print = "") cat("\n") invisible(x) } ################################################################################ # PLOT METHOD FOR "summary.epidata" OR "epidata" OBJECTS # shows the evolution of the numbers of susceptible, infectious and recovered # individuals. ################################################################################ plot.summary.epidata <- function (x, lty = c(2,1,3), lwd = 2, col = 1, col.hor = col, col.vert = col, xlab = "Time", ylab = "Number of individuals", xlim = NULL, ylim = NULL, legend.opts = list(), do.axis4 = NULL, panel.first = grid(), rug.opts = list(), which.rug = c("infections", "removals", "susceptibility", "all"), ...) { counters <- x[["counters"]] type <- x[["type"]] n <- counters[1L,"nSusceptible"] m <- counters[1L,"nInfectious"] N <- n + m times <- counters[-1L,"time"] if (missing(lty)) { lty <- c(2, 1, 3 * (type %in% c("SIR","SIRS"))) } recycle3 <- function (xnam) assign(xnam, rep(get(xnam), length.out = 3), inherits = TRUE) for(varname in c("lty", "lwd", "col", "col.hor", "col.vert")) recycle3(varname) if (is.null(xlim)) { xlim <- attr(x, "timeRange") if (xlim[2] == Inf) xlim[2] <- times[length(times)] } if (is.null(ylim)) ylim <- c(0, max( (lty[1] > 0) * {if (type %in% c("SIRS", "SIS")) N else n}, (lty[2] > 0) * max(counters$nInfectious), (lty[3] > 0) * max(counters$nRemoved) )) # basic plotting frame plot(xlim, ylim, type = "n", xlab = xlab, ylab = ylab, panel.first = panel.first, ...) abline(h = c(0, N), col = "grey") # for real xlim in lines.stepfun (see 'dr' adjustment in plot.stepfun code) fakexlim <- c(1,2) * (xlim[2] + 2*xlim[1])/3 - c(0,xlim[1]) # this isn't nice, a user argument 'dr' in plot.stepfun would be appreciated # add #Susceptibles if (all(counters$nSusceptible == n)) { lines(x = xlim, y = c(n,n), lty = lty[1], lwd = lwd[1], col = col.hor[1], ...) } else { lines(stepfun(times, counters$nSusceptible), xlim = fakexlim, lty = lty[1], lwd = lwd[1], col.hor = col.hor[1], col.vert = col.vert[1], do.points = FALSE, ...) } # add #Infected if (all(counters$nInfectious == m)) { lines(x = xlim, y = c(m,m), lty = lty[2], lwd = lwd[2], col = col.hor[2], ...) } else { lines(stepfun(times, counters$nInfectious), xlim = fakexlim, lty = lty[2], lwd = lwd[2], col.hor = col.hor[2], col.vert = col.vert[2], do.points = FALSE, ...) } # add #Removed if (all(counters$nRemoved == 0)) { lines(x = xlim, y = c(0,0), lty = lty[3], lwd = lwd[3], col = col.hor[3], ...) } else { lines(stepfun(times, counters$nRemoved), xlim = fakexlim, lty = lty[3], lwd = lwd[3], col.hor = col.hor[3], col.vert = col.vert[3], do.points = FALSE, ...) } # add special annotations if (is.null(do.axis4)) do.axis4 <- type == "SIR" if (do.axis4) { finalvalues <- counters[nrow(counters), c("nSusceptible", "nRemoved")] axis(4, at = finalvalues[lty[c(1,3)] > 0], font = 2, ...) } if (is.list(rug.opts)) { if (is.null(rug.opts$ticksize)) rug.opts$ticksize <- 0.02 if (is.null(rug.opts$quiet)) rug.opts$quiet <- TRUE which.rug <- match.arg(which.rug) if (is.null(rug.opts$col)) rug.opts$col <- switch(which.rug, all = 1, infections = col.hor[2], removals = col.hor[3], susceptibility = col.hor[1]) rugLocations <- switch(which.rug, all = times, infections = attr(x, "eventTimes"), removals = counters$time[counters$type == "R"], susceptibility = counters$time[counters$type == "S"] ) if (length(rugLocations) > 0) { do.call(rug, c(list(x = rugLocations), rug.opts)) } } if (is.list(legend.opts)) { if (is.null(legend.opts[["x",exact=TRUE]])) legend.opts$x <- "topright" if (is.null(legend.opts$legend)) legend.opts$legend <- c("susceptible", "infectious", "removed") if (any(lty == 0) && length(legend.opts$legend) == 3) legend.opts$legend <- legend.opts$legend[lty > 0] if (is.null(legend.opts$lty)) legend.opts$lty <- lty[lty > 0] if (is.null(legend.opts$lwd)) legend.opts$lwd <- lwd[lty > 0] if (is.null(legend.opts$col)) legend.opts$col <- col.hor[lty > 0] if (is.null(legend.opts$bty)) legend.opts$bty <- "n" do.call(legend, legend.opts) } invisible(as.matrix( counters[c("time", "nSusceptible", "nInfectious", "nRemoved")] )) } plot.epidata <- function(x, ...) { sx <- summary(x) plot(sx, ...) } ################################################################################ # ANIMATION OF EPIDEMICS # spatio-temporal animation (for 1/2d-coordinates only) # two types: # - sequential plots regardless of time between events (i.e. only ordering) # - chronological animation with timer ################################################################################ animate.summary.epidata <- function (object, main = "An animation of the epidemic", pch = 19, col = c(3, 2, gray(0.6)), time.spacing = NULL, sleep = quote(5/.nTimes), legend.opts = list(), timer.opts = list(), end = NULL, generate.snapshots = NULL, ...) { counters <- object[["counters"]] # remove pseudo-R-events, which come before S-event directSevents <- which(duplicated(counters[["time"]])) counters_noPseudoR <- if (length(directSevents)) { counters[-(directSevents-1), ] } else { counters } # remove initial row and keep essential columns eventTable <- counters_noPseudoR[-1, c("time", "type", "id")] eventTable[["type"]] <- unclass(eventTable[["type"]]) # get integer codes .nTimes <- nrow(eventTable) # extract initial individual information (id, at-risk, coordinates) coords <- object[["coordinates"]] d <- ncol(coords) if (d > 2L) { stop("spatial plotting in more than two dimensions is not implemented") } else if (d == 1L) { coords <- cbind(coords, 0) } else if (d == 0L) { stop ("'object' does not contain any defined coordinates") } # plot the initial state pch <- rep(pch, length.out = 3) col <- rep(col, length.out = 3) isInitiallyInfected <- rownames(coords) %in% object[["initiallyInfected"]] plot(coords, pch = ifelse(isInitiallyInfected, pch[2L], pch[1L]), col = ifelse(isInitiallyInfected, col[2L], col[1L]), main = main, ...) if (is.list(legend.opts)) { if (is.null(legend.opts[["x",exact=TRUE]])) legend.opts$x <- "topright" if (is.null(legend.opts$legend)) legend.opts$legend <- c("susceptible", "infectious", "removed") if (is.null(legend.opts$col)) legend.opts$col <- col if (is.null(legend.opts$pch)) legend.opts$pch <- pch do.call(legend, legend.opts) } # animate the epidemic by iteratively re-drawing points at the coordinates sleep <- eval(sleep) if (is.null(time.spacing)) { # plot events sequentially for(i in seq_len(.nTimes)) { Sys.sleep(sleep) tmp <- eventTable[i,] # c(time, type, id) points(coords[as.character(tmp[["id"]]),,drop=FALSE], pch = pch[tmp[["type"]]], col = col[tmp[["type"]]]) } } else { # plot events chronologically if (is.null(end)) end <- eventTable[.nTimes, "time"] + time.spacing timeGrid <- seq(from = time.spacing, to = end, by = time.spacing) timeWidth <- nchar(timeGrid[length(timeGrid)]) timeDigits <- nchar(strsplit(as.character(time.spacing), ".", fixed = TRUE)[[1L]][2L]) form <- paste("%", timeWidth, ".", timeDigits, "f", sep = "") if (is.list(timer.opts)) { if (is.null(timer.opts[["x",exact=TRUE]])) timer.opts$x <- "bottomright" if (is.null(timer.opts$title)) timer.opts$title <- "time" if (is.null(timer.opts$box.lty)) timer.opts$box.lty <- 0 if (is.null(timer.opts$adj)) timer.opts$adj <- c(0.5,0.5) if (is.null(timer.opts$inset)) timer.opts$inset <- 0.01 if (is.null(timer.opts$bg)) timer.opts$bg <- "white" do.call(legend, c(list(legend = sprintf(form, 0)), timer.opts)) } oldtp <- tp <- attr(object, "timeRange")[1L] i <- 1L # to be used in the file argument in dev.print if (is.vector(generate.snapshots, mode="character") && length(generate.snapshots) == 1L && require("animation")) { img.name <- generate.snapshots ani.dev <- animation::ani.options("ani.dev") if (is.character(ani.dev)) ani.dev <- get(ani.dev) imgdir <- file.path(animation::ani.options("outdir"), animation::ani.options("imgdir")) imgtype <- animation::ani.options("ani.type") generate.snapshots <- list( device = ani.dev, file = quote(file.path(imgdir, paste0(img.name,i,".",imgtype))), width = animation::ani.options("ani.width"), height = animation::ani.options("ani.height") ) } if (is.list(generate.snapshots)) { do.call(dev.print, generate.snapshots) } for(i in 1L+seq_along(timeGrid)) { tp <- timeGrid[i-1L] Sys.sleep(sleep) timeIndex <- which(eventTable[["time"]] > oldtp & eventTable[["time"]] <= tp) if (length(timeIndex) > 0L) { tmp <- eventTable[timeIndex,] # c(time, type, id) points(coords[as.character(tmp[["id"]]),,drop=FALSE], pch = pch[tmp[["type"]]], col = col[tmp[["type"]]]) } if (is.list(timer.opts)) { do.call(legend, c(list(legend = sprintf(form,tp)), timer.opts)) } oldtp <- tp if (is.list(generate.snapshots)) { do.call(dev.print, generate.snapshots) } } } invisible(NULL) } animate.epidata <- function (object, ...) { s <- summary(object) animate(s, ...) } ################################################################################ # PLOT THE STATE CHANGES OF INDIVIDUALS IN AN EPIDEMIC ('EPIDATA' OBJECT) # ... will be passed to the plot function (stepfun or curve), # e.g. add, xlim, ylim, main, xlab, ylab, ... ################################################################################ stateplot <- function(x, id, ...) { sx <- getSummary(x, class = "epidata") .id <- as.character(id) if (length(.id) != 1) { stop ("'id' must have length 1") } initiallyInfected <- sx[["initiallyInfected"]] if (! .id %in% levels(initiallyInfected)) { stop ("invalid 'id', does not exist in 'x'") } isInitiallyInfected <- .id %in% initiallyInfected counters <- sx[["counters"]] states <- levels(counters[["type"]]) path <- counters[which(counters$id == .id), c("time", "type")] # remove pseudo-R-events, which come before S-event directSevents <- which(duplicated(path[["time"]])) path_noPseudoR <- if (length(directSevents)) { path[-(directSevents-1), ] } else { path } pathfunc <- if (nrow(path_noPseudoR) > 0) { stepfun( x = path_noPseudoR[["time"]], y = c(1+isInitiallyInfected, unclass(path_noPseudoR[["type"]])), right = FALSE ) } else { function(t) rep(1+isInitiallyInfected, length(t)) } # plot it dotargs <- list(...) nms <- names(dotargs) if(! "xlab" %in% nms) dotargs$xlab <- "time" if(! "ylab" %in% nms) dotargs$ylab <- "state" if(! "main" %in% nms) dotargs$main <- "" if(! "xlim" %in% nms) dotargs$xlim <- attr(sx, "timeRange") if(! "xaxs" %in% nms) dotargs$xaxs <- "i" if(! "do.points" %in% nms && inherits(pathfunc, "stepfun")) { dotargs$do.points <- FALSE } do.call("plot", args = c(list(x = pathfunc, yaxt = "n"), dotargs)) axis(2, at = seq_along(states), labels = states) invisible(pathfunc) } surveillance/R/untie.R0000644000176000001440000001762212153133314014452 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Spatial and temporal tie-breaking of events ### ### Copyright (C) 2012-2013 Sebastian Meyer ### $Revision: 559 $ ### $Date: 2013-06-03 17:31:24 +0200 (Mon, 03 Jun 2013) $ ################################################################################ ## epidataCS-method ## makes use of untie.default (in time) and untie.matrix (in space) untie.epidataCS <- function (x, amount = list(t=NULL, s=NULL), minsep = list(t=0, s=0), direction = "left", keep.sources = FALSE, ...) { stopifnot(is.list(amount), !is.null(names(amount)), is.list(minsep), !is.null(names(minsep))) minsep <- modifyList(list(t=0, s=0), minsep) do.spatial <- pmatch("s", names(amount), nomatch=0L) > 0L do.temporal <- pmatch("t", names(amount), nomatch=0L) > 0L if (!do.spatial && !do.temporal) { stop("no amounts specified, nothing to do") } ## Generate new events data frame events <- marks(x, coords=FALSE)[,-1L] # drop ID column newcoords <- if (do.spatial) { # untie spatial coordinates untie.matrix(coordinates(x$events), amount$s, minsep$s, constraint=x$W, ...) } else coordinates(x$events) if (do.temporal) { # untie event times ## by default, we shift event times (non-symmetrically) to the left such ## that the shifted versions potentially stay in the same BLOCK of ## endemic covariates (the CIF is left-continuous). events$time <- untie.default(events$time, amount$t, minsep$t, direction=direction, sort=TRUE, ...) ## FIXME: Does sort=TRUE always make sense? ## maybe only sort in untie.default if amount < minsep? } ## Generate epidataCS object with new events coordinates(events) <- newcoords # -> SpatialPointsDataFrame #proj4string(events) <- proj4string(x$W) # "proj4string<-" might change the # string e.g. add +towgs84=0,0,0,0,0,0,0 events@proj4string <- x$W@proj4string npoly <- attr(x$events$.influenceRegion, "nCircle2Poly") res <- as.epidataCS(events, x$stgrid[,-1], x$W, x$qmatrix, nCircle2Poly=npoly) if (keep.sources) { res$events$.sources <- x$events$.sources } ## Done res } ## untie event times by uniform jittering untie.default <- function (x, amount = NULL, minsep = 0, direction = c("symmetric", "left", "right"), sort = NULL, giveup = 1000, ...) { stopifnot(is.numeric(x), is.vector(x)) distx <- dist(x) isPosDist <- distx > 0 if (all(isPosDist)) return(x) # no ties direction <- match.arg(direction) if (is.null(sort)) # sort if x was sorted sort <- identical(order(x, decreasing=FALSE), seq_along(x)) if (any(isPosDist)) { minsepx <- min(distx[isPosDist]) # smallest positive distance amount.bound <- if (direction=="symmetric") minsepx/2 else minsepx if (is.null(amount)) { amount <- amount.bound } else if (sort && abs(amount) > amount.bound) { warning("'amount' should not be greater than ", if (direction=="symmetric") "half of ", "the minimum separation (", format(amount.bound), ")") } } else if (is.null(amount)) { stop("default 'amount' does not work with completely tied 'x'") } shiftFUN <- switch(direction, symmetric = function (x) x + runif(length(x), -amount, amount), right = function (x) x + runif(length(x), 0, amount), left = function (x) x - runif(length(x), 0, amount)) res <- .untie(x, shiftFUN, minsep) if (sort) base::sort(res) else res } ## untie spatial coordinates by moving them by vectors drawn uniformly from a ## disc of radius 'amount', optionally respecting a region (constraint) ## inside which the jittered points should be located (of course, the initial ## points must also obey this constraint), and a minimum separation 'minsep' untie.matrix <- function (x, amount = NULL, minsep = 0, constraint = NULL, giveup = 1000, ...) { stopifnot(is.numeric(x), is.matrix(x)) dimx <- dim(x) if (dimx[2L] <= 1L) { untie.default(c(x), amount, minsep, giveup=giveup) } else if (dimx[2L] > 2L) { stop("spatial tie-breaking is only implemented for 2D coordinates") } if (is.null(amount)) { distx <- dist(x) isPosDist <- distx > 0 ## take half of smallest distance, which guarantees that new points ## will be closer to previously tied points than to others if (any(isPosDist)) amount <- min(distx[isPosDist]) / 2 else stop("default 'amount' does not work with a single location only") } if (!is.null(constraint)) { stopifnot(inherits(constraint, "SpatialPolygons")) proj4string(constraint) <- CRS(NA_character_) outOfConstraint <- function (x) { is.na(over(SpatialPoints(x), constraint)) } if (any(outOfConstraint(x))) stop("some points of the matrix 'x' don't respect the 'constraint'") } else outOfConstraint <- NULL shiftFUN <- function (x) x + runifdisc(nrow(x), amount) .untie(x, shiftFUN, minsep, outOfConstraint, giveup=giveup) } ## workhorse for both vector and matrix 'x' .untie <- function (x, shiftFUN, minsep = 0, outOfConstraintFUN = NULL, giveup = 1000) { x <- res <- as.matrix(x) move <- rep.int(TRUE, nrow(x)) # initially move _all_ points ntry <- 0L updateMoveExpr <- .updateMoveExpr(minsep>0, is.function(outOfConstraintFUN)) while((nleft <- sum(move)) > 0L && ntry < giveup) { res[move,] <- shiftFUN(x[move,,drop=FALSE]) ## determine for the moved points if they are too close to another point ## or fall out of constraint -> try again eval(updateMoveExpr) ntry <- ntry + 1L } if (ntry >= giveup) warning("could not obey 'constraint' and/or 'minsep' for some points") if (ncol(res) == 1) res[,1] else res } ## check if points with index 'idx' are too close (< minsep) to any other points ## (this function could probably be made more efficient, especially for ## length(idx) << nrow(pts), since we actually don't need all pairwise distances ## calculated by dist() but only those related to the idx-points) .tooClose <- function (pts, idx, minsep) { distpts <- as.matrix(dist(pts)) diag(distpts) <- Inf rowSums(distpts[idx,,drop=FALSE] < minsep) > 0 } ## generate expression which updates logical vector 'move' (points left to move) .updateMoveExpr <- function(doClose = FALSE, doConstraint = FALSE) { if (!doClose && !doConstraint) return(expression(move[move] <- FALSE)) exprClose <- expression(movedTooClose <- .tooClose(res, move, minsep)) exprConstraint <- if (doClose) { # only need to check those not too close expression( movedOutOfConstraint <- rep.int(FALSE, nleft), if (any(!movedTooClose)) movedOutOfConstraint[!movedTooClose] <- outOfConstraintFUN(res[move,,drop=FALSE][!movedTooClose,,drop=FALSE]) ) } else { expression( movedOutOfConstraint <- outOfConstraintFUN(res[move,,drop=FALSE]) ) } c(if (doClose) exprClose, if (doConstraint) exprConstraint, switch(doClose + 2*doConstraint, expression(move[move] <- movedTooClose), expression(move[move] <- movedOutOfConstraint), expression(move[move] <- movedTooClose | movedOutOfConstraint) ) ) } surveillance/R/twinSIR_simulation.R0000644000176000001440000006362212011207156017131 0ustar ripleyusers################################################################################ # Simulate data from the spatial SIR model as described in Hoehle (2008) # # Authors: Sebastian Meyer, Michael Hoehle # Date: 20 Jun 2009 # # Note: # This function is based on work from the Bachelor's thesis by # Sebastian Meyer, University of Munich. # # Other applications: # It is also possible to simulate data from # SI (infPeriod = function(ids) rep(Inf, length(ids)), # SIS (remPeriod = function(ids) rep(0, length(ids)) # or SIRS (remPeriod in (0;Inf)) # models. Furthermore, one can simulate data from the cox-model: # no removal (i.e. infPeriod = function(ids) rep(Inf, length(ids)) and # no epidemic component (i.e. no alpha and no f). ################################################################################ simEpidata <- function (formula, data, id.col, I0.col, coords.cols, subset, beta, h0, f = list(), alpha, infPeriod, remPeriod = function(ids) rep(Inf, length(ids)), end = Inf, trace = FALSE, .allocate = NULL) { cl <- match.call() ####################### ### Check arguments ### ####################### ### Build up model.frame mfnames <- c("", "formula", "data", "subset") mf <- cl[match(mfnames, names(cl), nomatch = 0L)] mf$na.action <- as.name("na.fail") mf$drop.unused.levels <- FALSE mf$xlev <- list() data <- eval(mf$data, parent.frame()) if (!inherits(data, "data.frame")) { stop("'data' must inherit from class \"data.frame\"") } if (inherits(data, "epidata")) { id.col <- "id" I0.col <- "atRiskY" # but we need !atRiskY (will be considered below) coords.cols <- names(data)[attr(data, "coords.cols")] if(length(formula) == 2L) { # i.e. no response specified formula[3L] <- formula[2L] formula[[2L]] <- quote(cbind(start, stop)) } } else { for(colarg in c("id.col", "I0.col", "coords.cols")) { colidx <- get(colarg, inherits = FALSE) if (is.numeric(colidx)) { tmp <- names(data)[colidx] if (any(is.na(tmp))) { stop("'", colarg, " = ", deparse(cl[[colarg]]), "': ", "column index must be in [1; ", ncol(data), "=ncol(data)]") } assign(colarg, tmp, inherits = FALSE) } } mf$I0 <- if (is.null(I0.col)) { substitute(rep(0, N), list(N=nrow(data))) } else as.name(I0.col) } mf$id <- as.name(id.col) for(coords.col in coords.cols) { eval(call("$<-", quote(mf), coords.col, quote(as.name(coords.col)))) } special <- c("cox") Terms <- terms(formula, specials = special, data = data, keep.order = TRUE, simplify = FALSE) mf$formula <- Terms mf[[1]] <- as.name("model.frame") mf <- eval(mf, parent.frame()) ### Convert id to a factor (also removing unused levels if it was a factor) mf[["(id)"]] <- factor(mf[["(id)"]]) ids <- levels(mf[["(id)"]]) nObs <- length(ids) if (nObs == 0L) { stop("nothing to do: no individuals in 'data'") } idsInteger <- seq_len(nObs) ### Check start/stop consistency (response) .startstop <- model.response(mf) if (NCOL(.startstop) != 2L || !is.numeric(.startstop)) { stop("the lhs of 'formula' must be a numeric matrix with two columns ", "like 'cbind(start, stop)'") } timeIntervals <- unique(.startstop) timeIntervals <- timeIntervals[order(timeIntervals[,1L]), , drop = FALSE] nBlocks <- nrow(timeIntervals) if (any(timeIntervals[,2L] <= timeIntervals[,1L])) { stop("stop times must be greater than start times") } if (any(timeIntervals[-1L,1L] != timeIntervals[-nBlocks,2L])) { stop("inconsistent start/stop times: time intervals not consecutive") } ### Check .allocate if (is.null(.allocate)) { .allocate <- max(500, ceiling(nBlocks/100)*100) } else { if (!isScalar(.allocate) || .allocate < nBlocks) { stop("'.allocate' must be >= ", nBlocks) } } ### Check that all blocks are complete (all id's present) .blockidx <- match(.startstop[,1L], timeIntervals[,1L]) if (any(table(.blockidx) != nObs)) { stop("all time intervals must be present for all id's") } ### Define a vector containing the time points where covariates change # unique 'start' time points (=> includes beginning of observation period) externalChangePoints <- as.vector(timeIntervals[,1L]) ### SORT THE MODEL.FRAME BY BLOCK AND ID !!! mf <- mf[order(.blockidx, mf[["(id)"]]),] ### Extract the coordinates coords <- as.matrix(mf[idsInteger, tail(1:ncol(mf),length(coords.cols))]) colnames(coords) <- coords.cols rownames(coords) <- ids ### Extract the endemic part Z of the design matrix (no intercept) des <- read.design(mf, Terms) Z <- des$Z nPredCox <- ncol(Z) # number of endemic (cox) predictor terms ### Only include basic endemic variables in the event history output basicCoxNames <- rownames(attr(Terms,"factors"))[attr(Terms,"specials")$cox] basicVarNames <- sub("cox\\(([^)]+)\\)", "\\1", basicCoxNames) nBasicVars <- length(basicCoxNames) # this is necessary if some variables in 'formula' do not have main effects extraBasicVars <- as.matrix(mf[setdiff(basicCoxNames, colnames(Z))]) ### Build up 3-dim array [id x time x var] of endemic terms coxArray <- array(cbind(Z, extraBasicVars), dim = c(nObs, nBlocks, ncol(Z) + ncol(extraBasicVars)), dimnames = list(ids, NULL, c(colnames(Z), colnames(extraBasicVars)))) idxPredVars <- seq_len(nPredCox) idxBasicVars <- match(basicCoxNames, dimnames(coxArray)[[3]]) ### Check simulation parameters ## endemic (cox) part if (nPredCox > 0L) { if(missing(beta) || length(beta) != nPredCox || !is.numeric(beta)) { stop(gettextf(paste("'beta', a numeric vector of length %d", "(number of endemic terms), must be specified"), nPredCox)) } } else { beta <- numeric(0L) } ## epidemic part nPredEpi <- length(f) if (nPredEpi > 0L) { if (ncol(coords) == 0) { stop("need coordinates for an epidemic component") } if (missing(alpha) || length(alpha) != nPredEpi || !is.numeric(alpha)) { stop(gettextf(paste("'alpha', a numeric vector of length %d", "(number of distance functions), must be specified"), nPredEpi)) } if (!is.list(f) || is.null(names(f)) || any(!sapply(f, is.function))) { stop("'f' must be a named list of functions or 'list()'") } if (any(sapply(f, function(B) B(Inf)) != 0)) { stop("all functions in 'f' must return 0 at infinite distance: ", "f[[i]](Inf) = 0") } if (!is.null(names(alpha))) { alpha <- alpha[match(names(f), names(alpha))] if (any(is.na(alpha))) { stop("names of 'alpha' and 'f' do not match") } } } else { f <- list() alpha <- numeric(0L) } ### Parse the generator function for the infectious periods if (missing(infPeriod)) { stop("argument 'infPeriod' is missing (with no default)") } infPeriod <- match.fun(infPeriod) ### Parse the generator function for the removal periods remPeriod <- match.fun(remPeriod) ### Parse the log baseline function h0spec <- paste("'h0' must be a single number or a list of functions", "\"exact\" and \"upper\"") if (missing(h0)) { stop(h0spec) } if (is.list(h0)) { if (!all(is.function(h0[["exact"]]), is.function(h0[["upper"]]))) { stop(h0spec) } if (!inherits(h0$upper, "stepfun")) { stop("function 'h0$upper' must be a 'stepfun'") } h0ChangePoints <- knots(h0$upper) } else if (isScalar(h0)) { h0func <- eval(parse(text = paste("function (t)", h0))) environment(h0func) <- parent.frame() h0 <- list(exact = h0func, upper = h0func) h0ChangePoints <- numeric(0L) } else { stop(h0spec) } if (!isScalar(h0$exact(0))) { stop("'h0$exact' must return a scalar") } ### Define function which decides if to reject a proposal during simulation exactEqualsUpper <- identical(h0$exact, h0$upper) mustReject <- if (exactEqualsUpper) { function () FALSE } else { function () lambdaStar/lambdaStarMax < runif(1) } ### Check simulation ending time if (!isScalar(end) || end <= 0) { stop("'end' must be a single positive numeric value") } ################### ### Preparation ### ################### ### Calculate the euclidean distances between the individuals distmat <- as.matrix(dist(coords, method = "euclidean")) diag(distmat) <- Inf # no influence on yourself # ### Calculate the euclidean distances and apply functions in 'f' on those # dists <- dist(coords, method = "euclidean") # fdists <- lapply(f, function(B) { # Bdists <- B(dists) # if (inherits(Bdists, "dist")) { # as.matrix(Bdists) # } else { # if (length(Bdists) != choose(nObs, 2)) { # stop("functions in 'f' must be vectorized: returned ", # "vector must be as long as the input vector") # } # .Bdists <- structure(as.vector(Bdists), class = "dist", # Size = nObs, Labels = ids, Diag = FALSE, Upper = FALSE) # as.matrix(.Bdists) # } # }) ### Initialize set of infected and susceptible individuals infected <- which( mf[idsInteger,"(I0)"] == as.numeric(!inherits(data, "epidata")) ) # in case of "epidata", mf$(I0) equals data$atRiskY => infected = I0==0 susceptibles <- which(! idsInteger %in% infected) ### Initialize tables of planned R-events and S-events Revents <- if (length(infected) > 0) { cbind(infected, infPeriod(ids[infected])) } else { matrix(numeric(0), ncol = 2) } Sevents <- matrix(numeric(0), ncol = 2) ### Small hook to subsequently update the (time depending) Cox predictor ### based on the current time (ct) during the simulation loop if (nPredCox > 0L) { coxUpdate <- expression( predCox <- as.matrix( coxArray[,which(externalChangePoints == ct),idxPredVars] ) %*% beta ) } else { predCox <- numeric(nObs) # zeros } ### 'lambdaCalc' is the main expression for the calculation of the intensity ### values IMMEDIATELY AFTER the current time 'ct'. ### It will be evaluated during the while-loop below. lambdaCalc <- expression( # Endemic Cox predictor (no h0 here!) of susceptibles predCoxS <- predCox[susceptibles], # Epidemic component of susceptibles lambdaEpidemic <- numeric(length(susceptibles)), # zeros if (nPredEpi > 0L && length(infected) > 0L) { u <- distmat[,infected, drop = FALSE] fCovars <- sapply(f, function(B) rowSums(B(u))) # fCovars is a matrix [nObs x nPredEpi] also used by updateNextEvent if (length(susceptibles) > 0L) { lambdaEpidemic <- fCovars[susceptibles,,drop=FALSE] %*% alpha } }, # Combined intensity lambdaS <- lambdaEpidemic + exp(h0$exact(ct) + predCoxS), # Ground intensity (sum of all lambdaS's) lambdaStar <- sum(lambdaS), # Upper bound on ground intensity lambdaStarMax <- if (exactEqualsUpper) { lambdaStar } else { sum(lambdaEpidemic) + sum(exp(h0$upper(ct) + predCoxS)) } ) # the following initializations are for R CMD check only ("visible binding") lambdaS <- numeric(length(susceptibles)) lambdaStarMax <- lambdaStar <- numeric(1L) # At current time (ct) we have: # lambdaS is a _vector of length the current number of susceptibles_ # containing the intensity of infection for each susceptible individual. # lambdaStar is the overall infection rate. # lambdaStarMax is the upper bound for lambdaStar regarding baseline. # 'susceptible' and 'infected' are the corresponding sets of individuals # immediately AFTER the last event # in theory, if a covariate changes in point t, then the intensity changes # at t+0 only. intensities are left-continuous functions. time interval of # constant intensity is (start;stop]. but in the implementation we need at # time ct the value of the log-baseline at ct+0, especially for # ct %in% h0ChangePoints, thus h0$upper should be a stepfun with right=FALSE ### Create a history object alongside the simulation fCovars0 <- matrix(0, nrow = nObs, ncol = nPredEpi, dimnames = list(NULL, names(f))) basicVars0 <- matrix(0, nrow = nObs, ncol = nBasicVars, dimnames = list(NULL, basicVarNames)) emptyEvent <- cbind(BLOCK = 0, id = idsInteger, start = 0, stop = 0, atRiskY = 0, event = 0, Revent = 0, coords, basicVars0, fCovars0) # WARNING: if you change the column order, you have to adjust the # hard coded column indexes everywhere below, also in getModel.simEpidata ! .fIdx <- tail(1:ncol(emptyEvent), nPredEpi) .basicIdx <- 7L + ncol(coords) + seq_len(nBasicVars) .nrowsEvHist <- .allocate * nObs # initial size of the event history evHist <- matrix(NA_real_, nrow = .nrowsEvHist, ncol = ncol(emptyEvent), dimnames = list(NULL, colnames(emptyEvent))) ## Hook - create new event and populate it with appropriate covariates updateNextEvent <- expression( nextEvent <- emptyEvent, # populate fdist covariates if (nPredEpi > 0L && length(infected) > 0L) { nextEvent[,.fIdx] <- fCovars # fCovars was calculated in lambdaCalc }, # Which time is currently appropriate in (time varying) covariates tIdx <- match(TRUE, c(externalChangePoints,Inf) > ct) - 1L, if (nBasicVars > 0L) { nextEvent[,.basicIdx] <- coxArray[,tIdx,idxBasicVars] }, # At-risk indicator if (length(susceptibles) > 0) { nextEvent[susceptibles,5L] <- 1 }, # Block index nextEvent[,1L] <- rep.int(block, nObs), # Start time nextEvent[,3L] <- rep.int(ct, nObs) ) ## Hook function to add the event to the history addNextEvent <- expression( nextEvent[,4L] <- rep.int(ct, nObs), # stop time if (block*nObs > .nrowsEvHist) { # enlarge evHist if not big enough if (trace > 0L) { cat("Enlarging the event history @ block", block, "...\n") } evHist <- rbind(evHist, matrix(NA_real_, nrow = .allocate * nObs, ncol = ncol(emptyEvent)) ) .nrowsEvHist <- .nrowsEvHist + .allocate * nObs }, evHistIdx <- idsInteger + nObs * (block-1), # = seq.int(from = 1 + nObs*(block-1), to = nObs*block) evHist[evHistIdx,] <- nextEvent, block <- block + 1 ) ####################################################################### ### MAIN PART: sequential simulation of infection and removal times ### ####################################################################### ### Some indicators ct <- timeIntervals[1L,1L] # = externalChangePoints[1] # current time block <- 1 pointRejected <- FALSE loopCounter <- 0L trace <- as.integer(trace) hadNumericalProblemsInf <- hadNumericalProblems0 <- FALSE eventTimes <- numeric(0) ### Update (time depending) endemic covariates (if there are any) if (nPredCox > 0L) { eval(coxUpdate) } ### Let's rock 'n roll repeat { loopCounter <- loopCounter + 1L if (trace > 0L && loopCounter %% trace == 0L) { cat(loopCounter, "@t =", ct, ":\t|S| =", length(susceptibles), " |I| =", length(infected), "\trejected?", pointRejected, "\n") } if (!pointRejected) { ## Compute current conditional intensity eval(lambdaCalc) ## Update event history (uses fCovars from lambdaCalc) eval(updateNextEvent) } pointRejected <- FALSE ## Determine time of next external change point changePoints <- c(externalChangePoints, h0ChangePoints, Revents[,2], Sevents[,2]) .isPendingChangePoint <- changePoints > ct nextChangePoint <- if (any(.isPendingChangePoint)) { min(changePoints[.isPendingChangePoint]) } else Inf ## Simulate waiting time for the subsequent infection T <- tryCatch(rexp(1, rate = lambdaStarMax), warning = function(w) { if (!is.na(lambdaStarMax) && lambdaStarMax < 1) { # rate was to small for rexp if (length(susceptibles) > 0L) { assign("hadNumericalProblems0", TRUE, inherits = TRUE) } if (nextChangePoint == Inf) NULL else Inf } else { # rate was to big for rexp 0 # since R-2.7.0 rexp(1, Inf) returns 0 with no warning! } }) ## Stop if lambdaStarMax too small AND no more changes in rate if (is.null(T)) { ct <- end eval(addNextEvent) break } ## Stop if lambdaStarMax too big meaning T == 0 (=> concurrent events) if (T == 0) { hadNumericalProblemsInf <- TRUE break } ## Stop at all costs if end of simulation time [0; end) has been reached if (isTRUE(min(ct+T, nextChangePoint) >= end)) { # ">=" because we don't want an event at "end" ct <- end eval(addNextEvent) break } if (ct + T > nextChangePoint) { ## Simulated time point is beyond the next time of intensity change ## (removal or covariate or upper baseline change point) ct <- nextChangePoint if (nPredCox > 0L && ct %in% externalChangePoints) { # update endemic covariates eval(coxUpdate) } if (.Reventidx <- match(ct, Revents[,2L], nomatch = 0L)) { # removal (I->R), thus update set of infected remover <- Revents[.Reventidx,1L] .remPeriod <- remPeriod(ids[remover]) Sevents <- rbind(Sevents, c(remover, ct + .remPeriod)) infected <- infected[-match(remover, infected)] nextEvent[remover,7L] <- 1 } if (.Seventidx <- match(ct, Sevents[,2L], nomatch = 0L)) { # this will also be TRUE if above .remPeriod == 0 (SIS-like with pseudo-R-event) # re-susceptibility (R->S), thus update set of susceptibles resusceptible <- Sevents[.Seventidx,1L] susceptibles <- c(susceptibles, resusceptible) } # update event history eval(addNextEvent) } else { ## Simulated time point lies within the thinning period ## => rejection sampling step ct <- ct + T if (length(h0ChangePoints) > 0L) {# i.e. if non-constant baseline # Update intensities for rejection probability at new ct eval(lambdaCalc) } if (mustReject()) { pointRejected <- TRUE next } # At this point, we have an actual event! => # Sample the individual who becomes infected with probabilities # according to the intensity proportions victimSindex <- sample(length(susceptibles), 1L, prob = lambdaS/lambdaStar) victim <- susceptibles[victimSindex] eventTimes <- c(eventTimes, ct) Revents <- rbind(Revents, c(victim, ct + infPeriod(ids[victim]))) susceptibles <- susceptibles[-victimSindex] infected <- c(infected, victim) # Add to history nextEvent[victim,6L] <- 1 eval(addNextEvent) } } ############## ### Return ### ############## if (hadNumericalProblemsInf) { warning("simulation ended due to an infinite overall infection rate") } if (hadNumericalProblems0) { warning("occasionally, the overall infection rate was numerically ", "equal to 0 although there were individuals at risk") } if (trace > 0L) { cat("Converting the event history into a data.frame (\"epidata\") ...\n") } epi <- as.data.frame(evHist[seq_len(nObs*(block-1)),,drop=FALSE]) epi$id <- factor(ids[epi$id], levels = ids) rownames(epi) <- NULL attr(epi, "eventTimes") <- eventTimes attr(epi, "timeRange") <- c(timeIntervals[1L,1L], ct) attr(epi, "coords.cols") <- 7L + seq_len(ncol(coords)) attr(epi, "f") <- f attr(epi, "config") <- list(h0 = h0$exact, beta = beta, alpha = alpha) attr(epi, "call") <- cl attr(epi, "terms") <- Terms class(epi) <- c("simEpidata", "epidata", "data.frame") if (trace > 0L) { cat("Done.\n") } return(epi) } ### We define no plot-method for simEpidata (as a wrapper for intensityPlot), ### because we want plot(simEpidataObject) to use the inherited method plot.epidata ### which shows the evolution of the numbers of individuals in states S, I, and R ################################################################################ # A 'simulate' method for objects of class "twinSIR". ################################################################################ simulate.twinSIR <- function (object, nsim = 1, seed = 1, infPeriod = NULL, remPeriod = NULL, end = diff(range(object$intervals)), trace = FALSE, .allocate = NULL, data = object$data, ...) { theta <- coef(object) px <- ncol(object$model$X) pz <- ncol(object$model$Z) nh0 <- attr(object$terms, "intercept") * length(object$nEvents) f <- object$model$f[colnames(object$model$X)] if (any(missingf <- is.na(names(f)))) { stop("simulation requires distance functions 'f', missing for: ", paste(colnames(object$model$X)[missingf], collapse=", ")) } formulaLHS <- "cbind(start, stop)" formulaRHS <- paste(c(as.integer(nh0 > 0), # endemic intercept? names(theta)[px+nh0+seq_len(pz-nh0)]), collapse = " + ") formula <- formula(paste(formulaLHS, formulaRHS, sep="~"), env = environment(formula(object))) h0 <- if (nh0 == 0L) { if (pz == 0L) { -Inf # no endemic component at all (exp(-Inf) == 0) } else { 0 # endemic covariates act on 0-log-baseline hazard } } else { .h0 <- stepfun(x = object$intervals[1:nh0], y = c(0,theta[px+seq_len(nh0)]), right = FALSE) list(exact = .h0, upper = .h0) } if (!inherits(data, "epidata")) { stop("invalid 'data' argument: use function 'twinSIR' with ", "'keep.data = TRUE'") } if (is.null(infPeriod) || is.null(remPeriod)) { s <- summary(data) eventsByID <- s$byID if (is.null(infPeriod)) { infPeriod <- if (s$type == "SI") { function (ids) rep.int(Inf, length(ids)) } else { # SIR, SIRS or SIS eventsByID$infPeriod <- eventsByID$time.R - eventsByID$time.I meanInfPeriodByID <- if (s$type %in% c("SIRS", "SIS")) { c(tapply(eventsByID$infPeriod, list(eventsByID$id), mean, na.rm = TRUE, simplify = TRUE)) } else { structure(eventsByID$infPeriod, names = eventsByID$id) } meanInfPeriod <- mean(meanInfPeriodByID, na.rm = TRUE) if (is.na(meanInfPeriod)) { stop("'infPeriod = NULL' invalid: ", "no infection periods observed") } function (ids) { infPeriods <- meanInfPeriodByID # named vector infPeriods[is.na(infPeriods)] <- meanInfPeriod infPeriods[ids] } } } if (is.null(remPeriod)) { remPeriod <- if (s$type == "SIRS") { eventsByID$remPeriod <- eventsByID$time.S - eventsByID$time.R meanRemPeriodByID <- c(tapply(eventsByID$remPeriod, list(eventsByID$id), mean, na.rm = TRUE, simplify = TRUE)) meanRemPeriod <- mean(meanRemPeriodByID, na.rm = TRUE) function (ids) { remPeriods <- meanRemPeriodByID # named vector remPeriods[is.na(remPeriods)] <- meanRemPeriod remPeriods[ids] } } else if (s$type == "SIS") { function (ids) rep.int(0, length(ids)) } else { # SIR or SI function (ids) rep.int(Inf, length(ids)) } } } set.seed(seed) res <- replicate(nsim, simEpidata(formula, data = data, beta = theta[px + nh0 + seq_len(pz-nh0)], h0 = h0, f = f, alpha = theta[seq_len(px)], infPeriod = infPeriod, remPeriod = remPeriod, end = end, trace = trace, .allocate = .allocate), simplify = FALSE ) if (nsim == 1L) res[[1L]] else res } surveillance/R/algo_bayes.R0000644000176000001440000000751111731650466015444 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # Implementation of the Bayes system. # The system evaluates specified timepoints and gives alarm if it recognizes # an outbreak for this timepoint. # # Features: # Choice between different Bayes sub-systems (difference in reference values). algo.bayesLatestTimepoint <- function(disProgObj, timePoint = NULL, control = list(b = 0, w = 6, actY = TRUE, alpha=0.05)){ observed <- disProgObj$observed freq <- disProgObj$freq # If there is no value in timePoint, then take the last value in observed if(is.null(timePoint)){ timePoint = length(observed) } #If no level specified. # check if the vector observed includes all necessary data. if((timePoint-(control$b*freq)-control$w) < 1){ stop("The vector of observed is too short!") } # construct the reference values basevec <- c() # if actY == TRUE use also the values of the year of timepoint if(control$actY){ basevec <- observed[(timePoint - control$w):(timePoint - 1)] } # check if you need more referencevalues of the past if(control$b >= 1){ for(i in 1:control$b){ basevec <- c(basevec, observed[(timePoint-(i*freq)-control$w):(timePoint-(i*freq)+control$w)]) } } # get the parameter for the negative binomial distribution # Modification on 13 July 2009 after comment by C. W. Ryan on NAs in the # time series sumBasevec <- sum(basevec, na.rm=TRUE) lengthBasevec <- sum(!is.na(basevec)) # compute the upper limit of the 95% CI. upCi <- qnbinom(1-control$alpha, sumBasevec + 1/2, (lengthBasevec)/(lengthBasevec + 1)) # give alarm if the actual value is larger than the upper limit. alarm <- observed[timePoint] >= upCi result <- list(alarm=alarm, upperbound=upCi, disProgObj=disProgObj) class(result) = "survRes" # for surveillance system result return(result) } # 'algo.bayes' calls 'algo.bayesLatestTimepoint' for data points given by range. algo.bayes <- function(disProgObj, control = list(range = range, b = 0, w = 6, actY = TRUE,alpha=0.05)){ # Set the default values if not yet set if(is.null(control$b)){ # value from bayes 1 control$b <- 0 } if(is.null(control$w)){ # value from bayes 1 control$w <- 6 } if(is.null(control$alpha)){ # value from bayes 1 control$alpha <- 0.05 } if(is.null(control$actY)){ # value from bayes 1 control$actY <- TRUE } # initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) count <- 1 for(i in control$range){ # call algo.bayesLatestTimepoint result <- algo.bayesLatestTimepoint(disProgObj, i, control = control) # store the results in the right order alarm[count] <- result$alarm upperbound[count] <- result$upperbound count <- count + 1 } #Add name and data name to control object. control$name <- paste("bayes(",control$w,",",control$w*control$actY,",",control$b,")",sep="") control$data <- paste(deparse(substitute(disProgObj))) # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj,control=control) class(result) = "survRes" # for surveillance system result return(result) } algo.bayes1 <- function(disProgObj, control = list(range = range)){ algo.bayes(disProgObj, control = list(range = control$range, b = 0, w = 6, actY = TRUE,alpha=0.05)) } algo.bayes2 <- function(disProgObj, control = list(range = range)){ algo.bayes(disProgObj, control = list(range = control$range, b = 1, w = 6, actY = TRUE,alpha=0.05)) } algo.bayes3 <- function(disProgObj, control = list(range = range)){ algo.bayes(disProgObj, control = list(range = control$range, b = 2, w = 4, actY = FALSE,alpha=0.05)) } surveillance/R/twinSIR_helper.R0000644000176000001440000002064612237001336016225 0ustar ripleyusers################################################################################ # Author: Sebastian Meyer with contributions by Michael Hoehle # Date: 19 Jun 2009 # # This file contains helper for the main functions in twinSIR.R. # and functions to compute one-sided AIC by simulation (in twinSIR_methods.R) ################################################################################ ################################################################################ # The cox function is used in model formulae to indicate/capture the variables # which go into the cox part/endemic component of the model. # Also, with this "cox variables" it is possible to build up interactions # as usual: cox(var1):cox(var2)... (as if cox(...) was a normal variable) ################################################################################ cox <- function (x) { x } ################################################################################ # read.design extracts the two parts X and Z of the design matrix. # Z contains the endemic part (consisting of the cox(.) terms), # X contains the epidemic part (the rest). # The automatic intercept variable is excluded from these matrices! # # ARGS: # m - a model.frame # Terms - terms for this model.frame (used to extract the model.matrix from m) # RETURNS: # list of matrices X and Z. # If there is no variable in one part of the model the corresponding matrix has # 0 columns, e.g. ncol(Z) = 0, if there is no endemic (Cox) part. # NOTE: # This function is inspired from the timereg package by T. Scheike (available # under GPL2). See http://staff.pubhealth.ku.dk/~ts/timereg.html for details. # The function has been improved/modified to fit our purposes. ################################################################################ read.design <- function (m, Terms) { attr(Terms, "intercept") <- 1 # we will remove the intercept later on # we need this to ensure that we have a reference category # in case of factors (correct contrasts) XZ <- model.matrix(Terms, m) Zterms <- grep("cox\\([^)]+\\)", colnames(XZ), ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE) # timereg 1.0-9 way: pattern="^cox[(][A-z0-9._]*[)]" with perl=TRUE X <- XZ[, -c(1L, Zterms), drop = FALSE] Z <- XZ[, Zterms, drop = FALSE] ud <- list(X = X, Z = Z) return(ud) } ## Alternative way to do the same thing as read.design. ## This approach is similar to that of coxph, but most often some milliseconds ## slower. # read.design <- function (m, Terms) # { # attr(Terms, "intercept") <- 1 # we will remove the intercept later on # # we need this to ensure that we have a reference category # # in case of factors (right contrasts) # nCoxTerms <- length(attr(Terms, "specials")[["cox"]]) # if (nCoxTerms > 0) { # dropX <- untangle.specials(Terms, "cox", order=1:3)$terms # } # if (length(dropX) > 0) { # X <- model.matrix(Terms[-dropX], m) # by subscripting a Terms object, # Z <- model.matrix(Terms[dropX], m) # one always gets an intercept term # Z <- Z[, -1, drop = FALSE] # } else { # X <- model.matrix(Terms, m) # Z <- X[, NULL, drop = FALSE] # } # X <- X[, -1, drop = FALSE] # # ud <- list(X = X, Z = Z) # return(ud) # } ################################################################################ # Little helper function which returns either summary(object) or simply object, # if it is already a summary. The function also verifies the 'class'. ################################################################################ getSummary <- function (object, class) { summaryClass <- paste("summary", class, sep=".") if (inherits(object, class)) { summary(object) } else if (inherits(object, summaryClass)) { object } else { stop("'object' must inherit from class \"", summaryClass, "\" or \"", class, "\"") } } ################################################################################ ############################## OSAIC function ################################## ################################################################################ # Two functions: # Ztilde.chibarsq <- function(Z,p,W,R) # w.chibarsq.sim <- function(p, W, N=1e4) # # Both functions are only used internally, no need for documentation # they are used in function .OSAICpenalty (twinSIR_methods.R) ################################################################################ ########################################################################## # This function computes Ztilde # for one Z as specified in Simulation 3, Silvapulle & Sen (2005), p. 79. # See also p. 37 for the quadprog link. # # Params: # Z - px1 vector with specific Z value # p - dimension of the problem, where theta is restricted to R^{+p} # W - covariance matrix of Z # R - constraint matrix R\theta \geq 0. In all cases equal to diag(p), # but to save time we deliver it to the function every time # # Returns: # Ztilde, the point at which (Z-\theta)' W^{-1} (Z-\theta) is the # minimum over \theta \geq 0. ########################################################################## Ztilde.chibarsq <- function(Z,p,W,R) { #Inverse of W Winv <- solve(W) #The solve.QP function minimizes #-d^T b + 1/2 b^T D b subject to the constraints A^T b >= b_0. #Thus using p. 37 we have d = t(Winv) %*% Z. #Note: solve.QP$value is only correct up to a constant d <- t(Winv) %*% Z theta <- matrix(quadprog::solve.QP(Dmat = Winv, dvec= d, Amat= t(R), bvec= rep(0,p),meq=0)$solution,p,1) return(sum(theta > 0)) } ###################################################################### # Compute OSAIC by simulation weights as described in Silvapulle & Sen # (2005), Simulation 3, p.79. # # Params: # p - dimension of the problem, theta is constrained to R^{+p} # W - covariance matrix of the chibarsq distribution # N - number of simulations to use # # Returns: # vector of length p containing the weights w_i, i=1, \ldots, p, # computed by Monte Carlo simulation ###################################################################### w.chibarsq.sim <- function(p, W, N=1e4) { #Matrix for constraints - always the identity matrix R <- diag(p) #Draw Z's from multivariate normal distribution with covariance #matrix W Z <-t(t(mvrnorm(N,rep(0,p),W))) #For each simulation calculate Ztilde sims <- apply(Z,MARGIN=1,function(Z) Ztilde.chibarsq(Z=matrix(Z,p,1), p=p,W=W,R=R)) w <- table(factor(sims, levels=0:p))/length(sims) return(w) } ################################################################################ # The helper 'getModel.simEpidata' extracts the model of an object of class # "simEpidata" similar to the function 'twinSIR' with model = TRUE, # i.e. a list with components survs, X, Z and weights, where atRiskY == 1. # The log-baseline h0 is evaluated at start times of intervals only. # This function is used in function 'intensityPlot'. ################################################################################ getModel.simEpidata <- function (object, ...) { class(object) <- "data.frame" # avoid use of [.epidata (not necessary here) config <- attr(object, "config") alpha <- config$alpha beta <- config$beta atRiskY1 <- object$atRiskY == 1 simepi1 <- object[atRiskY1,] survs <- simepi1[c("id", "start", "stop", "event")] attr(survs, "eventTimes") <- attr(object, "eventTimes") attr(survs, "timeRange") <- attr(object, "timeRange") X <- as.matrix(simepi1[tail(1:ncol(simepi1), length(alpha))]) logbaseline <- sapply(survs$start, FUN = config$h0, simplify = TRUE) Terms <- attr(object, "terms") Z <- read.design(model.frame(Terms, simepi1), Terms)$Z Z <- cbind("cox(logbaseline)" = logbaseline, Z) model <- list(survs = survs, X = X, Z = Z, weights = rep.int(1,nrow(survs))) return(model) } ### Similar auxiliary method extracting the model component ### of a fitted 'twinSIR' getModel.twinSIR <- function (object, ...) { if (is.null(model <- object[["model"]])) { stop("'", deparse(substitute(object)), "' does not contain the 'model' ", "component (use 'model = TRUE' when calling 'twinSIR')") } return(model) } surveillance/R/hhh4_simulate.R0000644000176000001440000001710312166543503016067 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Simulate from a HHH4 model ### ### Copyright (C) 2012-2013 Michaela Paul and Sebastian Meyer ### $Revision: 594 $ ### $Date: 2013-07-08 16:05:55 +0200 (Mon, 08 Jul 2013) $ ################################################################################ ### Simulate-method for ah4-objects simulate.ah4 <- function (object, # result from a call to hhh4 nsim=1, # number of replicates to simulate seed=NULL, y.start=NULL, # initial counts for epidemic components subset=1:nrow(object$stsObj), coefs=coef(object), # coefficients used for simulation components=c("ar","ne","end"), # which comp to include simplify=nsim>1, # counts array only (no full sts) ...) { ## Determine seed (this part is copied from stats:::simulate.lm with ## Copyright (C) 1995-2012 The R Core Team) if(!exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) runif(1) # initialize the RNG if necessary if(is.null(seed)) RNGstate <- get(".Random.seed", envir = .GlobalEnv) else { R.seed <- get(".Random.seed", envir = .GlobalEnv) set.seed(seed) RNGstate <- structure(seed, kind = as.list(RNGkind())) on.exit(assign(".Random.seed", R.seed, envir = .GlobalEnv)) } ## END seed cl <- match.call() stsObj <- object$stsObj control <- object$control theta <- if (missing(coefs)) coefs else checkCoefs(object, coefs) ## get weight matrix/array of the ne component neweights <- getNEweights(object, coefW(theta)) ## lags lag.ar <- control$ar$lag lag.ne <- control$ne$lag maxlag <- max(lag.ar, lag.ne) ## initial counts nUnits <- ncol(stsObj) if (is.null(y.start)) { # set starting value to mean observed (in subset!) y.means <- ceiling(colMeans(observed(stsObj)[subset,,drop=FALSE])) y.start <- matrix(y.means, maxlag, nUnits, byrow=TRUE) } else { if (is.vector(y.start)) y.start <- t(y.start) if (ncol(y.start) != nUnits) stop(sQuote("y.start"), " must have nUnits=", nUnits, " columns") if (nrow(y.start) < maxlag) stop("need 'y.start' values for lag=", maxlag, " initial time points") } ## get fitted components nu_it (with offset), phi_it, lambda_it, t in subset model <- interpretControl(control, stsObj) means <- meanHHH(theta, model, subset=subset) psi <- splitParams(theta,model)$overdisp ## set predictor to zero if not included ('components' argument) stopifnot(length(components) > 0, components %in% c("ar", "ne", "end")) getComp <- function (comp) { sel <- if (comp == "end") "endemic" else paste(comp, "exppred", sep=".") res <- means[[sel]] if (!comp %in% components) res[] <- 0 res } ar <- getComp("ar") ne <- getComp("ne") end <- getComp("end") ## simulate simcall <- quote( simHHH4(ar, ne, end, psi, neweights, y.start, lag.ar, lag.ne) ) if (!simplify) { ## result template res0 <- stsObj[subset,] setObserved <- function (observed) { res0@observed[] <- observed res0 } simcall <- call("setObserved", simcall) } res <- if (nsim==1) eval(simcall) else replicate(nsim, eval(simcall), simplify=if (simplify) "array" else FALSE) if (simplify) dimnames(res) <- list(subset, colnames(model$response), NULL) ## Done attr(res, "call") <- cl attr(res, "seed") <- RNGstate res } ### Internal auxiliary function, which performs the actual simulation simHHH4 <- function(ar, # lambda_it (nTime x nUnits matrix) ne, # phi_it (nTime x nUnits matrix) end, # nu_it (nTime x nUnits matrix, offset included) psi, # overdisp param(s) or numeric(0) (psi->0 = Poisson) neW, # weight matrix/array for neighbourhood component start, # starting counts (vector of length nUnits, or # matrix with nUnits columns if lag > 1) lag.ar = 1, lag.ne = lag.ar ) { nTime <- nrow(end) nUnits <- ncol(end) ## simulate from Poisson or NegBin model rdistr <- if (length(psi)==0 || isTRUE(all.equal(psi, 0, check.attributes=FALSE))) { rpois } else { psi.inv <- 1/psi # since R uses different parametrization ## draw 'n' samples from NegBin with mean vector 'mean' (length=nUnits) ## and overdispersion psi such that Variance = mean + psi*mean^2 ## where 'size'=1/psi and length(psi) == 1 or length(mean) function(n, mean, size = psi.inv) rnbinom(n, mu = mean, size = psi.inv) } ## if only endemic component -> simulate independently if (all(ar + ne == 0)) { return(matrix(rdistr(length(end), end), nTime, nUnits)) } ## weighted sum of counts of other (neighbouring) regions ## params: y - vector with (lagged) counts of regions ## W - nUnits x nUnits adjacency/weight matrix (0=no neighbour) wSumNE <- if (is.null(neW) || all(neW == 0)) { # includes the case nUnits==1 function (y, W) numeric(nUnits) } else function (y, W) .colSums(W * y, nUnits, nUnits) ## initialize matrices for means mu_i,t and simulated data y_i,t mu <- y <- matrix(0, nTime, nUnits) y <- rbind(start, y) nStart <- nrow(y) - nrow(mu) # usually just 1 for lag=1 ## simulate timeDependentWeights <- length(dim(neW)) == 3 if (!timeDependentWeights) neWt <- neW for(t in seq_len(nTime)){ if (timeDependentWeights) neWt <- neW[,,t] ## mean mu_i,t = lambda*y_i,t-1 + phi*sum_j wji*y_j,t-1 + nu_i,t mu[t,] <- ar[t,] * y[nStart+t-lag.ar,] + ne[t,] * wSumNE(y[nStart+t-lag.ne,], neWt) + end[t,] ## Sample from Poisson/NegBin with that mean y[nStart+t,] <- rdistr(nUnits, mu[t,]) } ## return simulated data without initial counts y[-seq_len(nStart),,drop=FALSE] } ### check compatibility of a user-specified coefficient vector with model checkCoefs <- function (object, coefs, reparamPsi=TRUE) { theta <- coef(object, reparamPsi=reparamPsi) #-> computes 1/exp(logpsi) if (length(coefs) != length(theta)) stop(sQuote("coefs"), " must be of length ", length(theta)) names(coefs) <- names(theta) coefs } ### extract the (final) weight matrix/array from a fitted ah4 object getNEweights <- function (object, pars = coefW(object)) { neweights <- object$control$ne$weights if (!is.list(neweights)) # NULL or fixed weight structure return(neweights) ## parametric weights nd <- length(neweights$initial) if (length(pars) != nd) stop("'pars' must be of length ", nd) neweights$w(pars, neighbourhood(object$stsObj), object$control$data) } ### extract parameters of neighbourhood weights from ah4-object or coef vector coefW <- function (object) { coefs <- if (inherits(object, "ah4")) object$coefficients else object coefs[grep("^neweights", names(coefs))] } surveillance/R/twinstim_siaf_powerlawL.R0000644000176000001440000001671312237174420020250 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### _L_agged power-law kernel f(s) = (||s||/sigma)^-d for ||s|| >= sigma, else 1 ### Similar to the density of the Pareto distribution (but value 1 for < sigma) ### ### Copyright (C) 2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ siaf.powerlawL <- function (nTypes = 1, logpars = TRUE, effRangeProb = NULL, validpars = NULL) { nTypes <- as.integer(nTypes) stopifnot(length(nTypes) == 1L, nTypes > 0L) ## for the moment we don't make this type-specific if (nTypes != 1) stop("type-specific shapes are not yet implemented") if (!logpars) stop("only the 'logpars' parametrization is implemented") ## helper expression, note: logpars=c(logscale=logsigma, logd=logd) tmp <- expression( logsigma <- logpars[[1L]], # used "[[" to drop names logd <- logpars[[2L]], sigma <- exp(logsigma), d <- exp(logd) ) ## spatial kernel f <- function (s, logpars, types = NULL) {} body(f) <- as.call(c(as.name("{"), tmp, expression(sLength <- sqrt(.rowSums(s^2, nrow(s), 2L))), expression(ifelse(sLength < sigma, 1, (sLength/sigma)^-d)) )) ## numerically integrate f over a polygonal domain F <- siaf.fallback.F ## alternative (too slow): subtract the inner sigma-region with constant f=1 from polydomain ## F <- function (polydomain, f, logpars, type=NULL, nGQ=20L, nCircle2Poly=32) ## { ## sigma <- exp(logpars[[1L]]) ## intinner <- pi*sigma^2 ## poly <- setdiff(owin2gpc(polydomain), ## discpoly(c(0,0), sigma, npoly=nCircle2Poly, class="gpc.poly")) ## intpoly <- polyCub.SV(poly, f, logpars, type=type, alpha=0, nGQ=nGQ) ## intinner + intpoly ## } ## fast integration of f over a circular domain Fcircle <- function (r, logpars, type = NULL) {} body(Fcircle) <- as.call(c(as.name("{"), tmp, expression( ## trivial case: radius of integration domain < sigma (=> constant f) if (r <= sigma) return(pi * r^2), ## otherwise, if r > sigma, integration via f^-1 fofr <- (r/sigma)^-d, basevolume <- pi * r^2 * fofr, # cylinder volume up to height f(r) intfinvsq <- sigma^2 * if (d == 2) -d*log(sigma/r) else { d/(d-2) * (1 - (sigma/r)^(d-2)) }, basevolume + pi * intfinvsq ) )) ## derivative of f wrt logpars deriv <- function (s, logpars, types = NULL) {} body(deriv) <- as.call(c(as.name("{"), tmp, expression( sLength <- sqrt(.rowSums(s^2, nrow(s), 2L)), f <- (sLength/sigma)^-d, derivlogsigma <- d*f, derivlogd <- f*log(f), idx0 <- sLength < sigma, derivlogsigma[idx0] <- derivlogd[idx0] <- 0, cbind(derivlogsigma, derivlogd) ) )) ## Numerical integration of 'deriv' over a polygonal domain Deriv <- function (polydomain, deriv, logpars, type = NULL, nGQ = 20L) {} body(Deriv) <- as.call(c(as.name("{"), ## Determine a = argmax(abs(deriv(c(x,0)))) c(tmp, expression( a.logsigma <- sigma, a.logd <- sigma * exp(1/d), xrange <- polydomain$xrange, # polydomain is a "owin" maxxdist <- max(abs(xrange)), a <- pmin(c(a.logsigma, a.logd), maxxdist), if (sum(xrange) < 0) a <- -a # is more of the domain left of 0? )), expression( deriv1 <- function (s, paridx) deriv(s, logpars, type)[,paridx,drop=TRUE], intderiv1 <- function (paridx) polyCub.SV(polydomain, deriv1, paridx=paridx, nGQ = nGQ, alpha = a[paridx]), res.logsigma <- intderiv1(1L), res.logd <- intderiv1(2L), res <- c(res.logsigma, res.logd), res ) )) ## "effective" integration range (based on quantile of the Pareto distri) effRange <- if (isScalar(effRangeProb)) { stop("'effRange' is currently not supported for power law's") effRange <- function (logpars) {} body(effRange) <- as.call(c(as.name("{"), tmp, expression( alpha <- d-1, # only works for alpha > 0, i.e. d > 1 ! sigma/(1-effRangeProb)^(1/alpha) ) )) effRange } else NULL ## simulate from the lagged power-law kernel (within a maximum distance 'ub') simulate <- function (n, logpars, type, ub) { sigma <- exp(logpars[[1L]]) d <- exp(logpars[[2L]]) ## Sampling via polar coordinates and inversion method ## random angle theta <- stats::runif(n, 0, 2*pi) ## sampling radius r ## trivial case u < sigma: p(r) \propto r on [0;u] if (ub < sigma) { r <- ub * sqrt(stats::runif(n)) # inversion sampling ## now rotate each point by a random angle to cover all directions return(r * cbind(cos(theta), sin(theta))) } ## case u >= sigma: p(r) \propto r if r sample component unir <- stats::runif(n) <= mass1 / (mass1 + mass2) ## samples from the uniform short-range component: n1 <- sum(unir) r1 <- sigma * sqrt(stats::runif(n1)) # similar to the case u < sigma ## samples from power-law component: p2(r) \propto r^(-d+1) on [sigma;u] ## For d>2 only, we could use VGAM::rpareto(n,sigma,d-2), d=1 is trivial n2 <- n - n1 r2 <- if (d==1) stats::runif(n2, sigma, ub) else { # inversion sampling P2inv <- if (d == 2) { function (z) ub^z * sigma^(1-z) } else { function (z) (z*ub^(2-d) + (1-z)*sigma^(2-d))^(1/(2-d)) } P2inv(stats::runif(n2)) } ## put samples from both components together r <- c(r1, r2) ## now rotate each point by a random angle to cover all directions r * cbind(cos(theta), sin(theta)) } ## set function environments to the global environment environment(f) <- environment(F) <- environment(Fcircle) <- environment(deriv) <- environment(Deriv) <- environment(simulate) <- .GlobalEnv if (is.function(effRange)) environment(effRange) <- .GlobalEnv ## return the kernel specification list(f=f, F=F, Fcircle=Fcircle, effRange=effRange, deriv=deriv, Deriv=Deriv, simulate=simulate, npars=2L, validpars=validpars) } surveillance/R/plot_graphics.R0000644000176000001440000001003211731650466016165 0ustar ripleyusers################################################### ### chunk number 1: ################################################### plot.survRes <- function(x, method=x$control$name, disease=x$control$data, startyear = 2001, firstweek = 1, legend=TRUE,...){ survResObj <- x observed <- survResObj$disProgObj$observed[survResObj$control$range] state <- survResObj$disProgObj$state[survResObj$control$range] # width of the column tab <- 0.5 # left/right help for constructing the columns observedxl <- (1:length(observed))-tab observedxr <- (1:length(observed))+tab upperboundx <- (1:length(survResObj$upperbound))-0.5 ###################################################################### # Generate the axis labelling ###################################################################### #Compute how much has been cut off by the specification of range start <- min(survResObj$control$range)-1 startyear <- startyear + start %/% 52 firstweek <- firstweek + start %% 52 # get the number of quarters lying in range myat.week <- seq(ceiling((52-firstweek+1)/13) * 13 + 1, length(observed)+(floor((52-firstweek + 1)/13) * 13 +1), by=13) # get the right year order year <- (myat.week - 52) %/% 52 + startyear # function to define the quarter order quarterFunc <- function(i) { switch(i+1,"I","II","III","IV")} # get the right number and order of quarter labels quarter <- sapply( (myat.week-1) %/% 13 %% 4, quarterFunc) # get the positions for the axis labels myat.week <- myat.week - (52 - firstweek + 1) #Find out how much the axes are scaled cex <- par()$cex.axis # construct the compute axis label if (cex == 1) { mylabels.week <- paste(year,"\n\n",quarter,sep="") } else { mylabels.week <- paste(year,"\n",quarter,sep="") } #Remove NaNs from upperbound (real problem: where do they come from) #survResObj$upperbound[is.nan(survResObj$upperbound)] <- 0 # control where the highest value is max <- max(max(observed),max(survResObj$upperbound)) #Generate the matrices to plot xstuff <- cbind(observedxl, observedxr, upperboundx) ystuff <-cbind(observed, observed, survResObj$upperbound) #Plot the results using one Large plot call matplot(xstuff,ystuff , t="hhs", lty=c(1,1,1), col=c(1,1,4), ylim=c(-1/20*max, max), xlab = "time", ylab = "No. of infected", axes = FALSE)#hoehle, ...) if (!is.null(survResObj$aggr)) { points(upperboundx+tab,survResObj$aggr,col=1) } for(i in 1:length(observed)){ matlines( c(i-tab, i+tab), c(observed[i],observed[i]) ) if(survResObj$alarm[i] == 1) matpoints( i, -1/40*max, pch=24, col=2) if(state[i] == 1) matpoints( i, -1/20*max, pch=24, col=3) } if (disease != "") { disease <- paste("of ",disease," ",sep="") } title(paste("Analysis ", as.character(disease), "using ", as.character(method),sep="")) # parameters for the legend placement to the right upper side xlegpos <- 1/4 ylegpos <- 1 # check where to place the legend. If the left upper side is free place it there if (max * 2/3 >= max( max(observed[1:floor(1/4 * length(observed))]), max(survResObj$upperbound[1:floor(1/4 * length(survResObj$upperbound))]) )) { xlegpos <- 0 } if (legend) { legend(xlegpos*length(observed)/sqrt(cex), ylegpos*max, legend=c("Infected", "Threshold", "Computed Alarm", "Defined Alarm"), lty=c(1,1,NA,NA), col=c(1,4,2,3), pch=c(NA,NA,24,24),cex=cex) } axis( at=myat.week , labels=mylabels.week , side=1, line = 1 ) axis( side=2 ) invisible() } surveillance/R/AllGeneric.R0000644000176000001440000001100712236642254015334 0ustar ripleyusers ### Define some functions to be S3 generic animate <- function (object, ...) UseMethod("animate") R0 <- function (object, ...) UseMethod("R0") as.epidata <- function (data, ...) UseMethod("as.epidata") intensityplot <- function (x, ...) UseMethod("intensityplot") untie <- function (x, amount, ...) UseMethod("untie") fixef <- function (object, ...) UseMethod("fixef") ranef <- function (object, ...) UseMethod("ranef") intersectPolyCircle <- function (object, center, radius, ...) UseMethod("intersectPolyCircle") ## internal function with methods for "twinSIR" and "simEpidata" getModel <- function (object, ...) UseMethod("getModel") ## (rather internal) generic with a default and a "Spatial" method multiplicity <- function (x, ...) UseMethod("multiplicity") ### Define some functions to be S4 generic if(!isGeneric("plot")) setGeneric("plot", useAsDefault=plot) if(!isGeneric("aggregate")) setGeneric("aggregate", useAsDefault=aggregate) ###################################################################### #Access and replace functions for the "sts" class ###################################################################### #epoch slot if(!isGeneric("epoch")) setGeneric("epoch", function(x, as.Date=x@epochAsDate) standardGeneric("epoch")) setMethod("epoch", "sts", function(x, as.Date=x@epochAsDate) { if (!as.Date) { return(x@epoch) } else { return(as.Date(x@epoch, origin="1970-01-01")) } }) setGeneric("epoch<-", function(x, value) standardGeneric("epoch<-")) setReplaceMethod("epoch", "sts", function(x, value) { x@epoch <- value x }) # observed slot if(!isGeneric("observed")) setGeneric("observed", function(x) standardGeneric("observed")) setMethod("observed", "sts", function(x) { return(x@observed) }) setGeneric("observed<-", function(x, value) standardGeneric("observed<-")) setReplaceMethod("observed", "sts", function(x, value) { x@observed <- value x }) # alarms slot if(!isGeneric("alarms")) setGeneric("alarms", function(x) standardGeneric("alarms")) setMethod("alarms", "sts", function(x) { return(x@alarm) }) setGeneric("alarms<-", function(x, value) standardGeneric("alarms<-")) setReplaceMethod("alarms", "sts", function(x, value) { x@alarm <- value x }) # upperbound slot if(!isGeneric("upperbound")) setGeneric("upperbound", function(x) standardGeneric("upperbound")) setMethod("upperbound", "sts", function(x) { return(x@upperbound) }) setGeneric("upperbound<-", function(x, value) standardGeneric("upperbound<-")) setReplaceMethod("upperbound", "sts", function(x, value) { x@upperbound <- value x }) # population slot (actually its populationFrac) if(!isGeneric("population")) setGeneric("population", function(x) standardGeneric("population")) setMethod("population", "sts", function(x) { return(x@populationFrac) }) setGeneric("population<-", function(x, value) standardGeneric("population<-")) setReplaceMethod("population", "sts", function(x, value) { x@populationFrac <- value x }) ##control slot if(!isGeneric("control")) setGeneric("control", function(x) standardGeneric("control")) setMethod("control", "sts", function(x) { return(x@control) }) setGeneric("control<-", function(x, value) standardGeneric("control<-")) setReplaceMethod("control", "sts", function(x, value) { x@control <- value x }) ###multinomial Time series slot ##control slot if(!isGeneric("multinomialTS")) setGeneric("multinomialTS", function(x) standardGeneric("multinomialTS")) setMethod("multinomialTS", "sts", function(x) { return(x@multinomialTS) }) setGeneric("multinomialTS<-", function(x, value) standardGeneric("multinomialTS<-")) setReplaceMethod("multinomialTS", "sts", function(x, value) { x@multinomialTS <- value x }) ### neighbourhood matrix slot if(!isGeneric("neighbourhood")) setGeneric("neighbourhood", function(x) standardGeneric("neighbourhood")) setMethod("neighbourhood", "sts", function(x) { return(x@neighbourhood) }) setGeneric("neighbourhood<-", function(x, value) standardGeneric("neighbourhood<-")) setReplaceMethod("neighbourhood", "sts", function(x, value) { x@neighbourhood <- value x }) ###################################################################### #Some access functions similar to matrix/dataframe (definition in sts.R) ###################################################################### if(!isGeneric("nrow")) setGeneric("nrow", useAsDefault=nrow) if(!isGeneric("ncol")) setGeneric("ncol", useAsDefault=ncol) if(!isGeneric("colnames")) setGeneric("colnames", useAsDefault=colnames) #New methods if(!isGeneric("as.data.frame")) setGeneric("as.data.frame", useAsDefault=as.data.frame) surveillance/R/sim_HHH.R0000644000176000001440000001363511731650466014622 0ustar ripleyusers################################################### ### chunk number 1: ################################################### ############################################ # Simulates multivariate count data based on the model described in Held et.al (2005) # Note: trend is omitted ###################################### simHHH.default <- function(model=NULL,control=list(coefs=list(alpha=1, gamma=0, delta=0, lambda=0, phi=NULL,psi=NULL,period=52), neighbourhood=NULL,population=NULL,start=NULL), length){ ################################################# #Help functions ################################################ # draws n random numbers from a NB(mean, psi) distribution rNB<-function(n,mean,size=control$coefs$psi){ rnbinom(n, mu=mean, size=size) } # returns formula for the seasonal part of \nu_t formulaSeason <- function(mod="~-1",S=1,period){ for(i in 1:S){ mod <- paste(mod,"+sin(",2*i,"*pi*t/",period,")+cos(",2*i,"*pi*t/",period,")",sep="") } return(as.formula(mod)) } # sum of all neighbours # params: x - vector with counts # nhood - adjacency matrix, 0= no neighbour # returns a vector with the sum of "neighbouring counts" for all areas sumN <- function (x,nhood) { n<- length(x) if(any(nhood>0)){ nhood <- nhood >0 res <- sapply(1:n,function(i) sum(x[nhood[i,]])) } else { res<- rep(0,n) } return(res) } ################################################## ################################## # set default values if not specified ##################################### if(is.null(control$coefs$alpha)) stop("alpha needs to be specified") nAreas <- length(control$coefs$alpha) # define neighbourhood-matrix, assume there are no neighbours if(is.null(control$neighbourhood)) control$neighbourhood <- matrix(0,nAreas,nAreas) # set population (i.e. n_i,t) to 1 if not specified if(is.null(control$population)){ control$population <- matrix(1, ncol=nAreas,nrow=length) } else { #assumption: n_i,t = n_i pop <-control$population[1,] control$population <- matrix(pop,ncol=nAreas,nrow=length,byrow=TRUE) } #determine number of seasons if(is.null(control$coefs$gamma)){ control$coefs$gamma <-0 control$coefs$delta <- 0 S <- 1 } else { if(length(control$coefs$gamma) != length(control$coefs$delta)) stop("gamma and delta must have the same length") S <- length(control$coefs$gamma) } if(is.null(control$coefs$period)) control$coefs$period <- 52 # is there a autoregressive (epidemic) part if(is.null(control$coefs$lambda)){ control$coefs$lambda <- 0 } if(is.null(control$coefs$phi)){ control$coefs$phi <- 0 } if(!is.null(control$start)){ if(length(control$start)!=nAreas) stop("wrong dimension of start\n") } # simulate from Poisson or NegBin model if(is.null(control$coefs$psi)){ rdistr<-rpois } else{ rdistr<-rNB } # computation of seasonal part of nu_i,t: season <- model.frame(formula=formulaSeason(S=S,period=control$coefs$period), data=data.frame("t"=1:length)) #rearrange the sinus and cosinus parts season <- season[,c(seq(1,2*S,by=2),seq(2,2*S,by=2))] # this computes \sum_{s=1}^S [gamma_s*sin(omega_s*t) + delta_s*cos(omega_s*t) ] season<- as.matrix(season)%*%c(control$coefs$gamma,control$coefs$delta) # compute endemic part: nu_t = exp( alpha_i + season_t ) nu<-exp(sapply(1:nAreas,function(i) control$coefs$alpha[i]+season)) # initialize matrices for the mean mu_i,t and the simulated data x_i,t # x_i,0 is set to the mean of n_it*\nu_it mu <- matrix(0,ncol=nAreas,nrow=length) x <- matrix(0,ncol=nAreas,nrow=length+1) x[1,] <- ifelse(is.null(control$start),colMeans(control$population*nu),start) #print(x[1,]) if(control$coefs$lambda == 0 && control$coefs$phi ==0){ mu <- control$population*nu x <- matrix(rdistr(nAreas*(length+1),mu),ncol=nAreas,byrow=FALSE) } else { # simulate data for(t in 1:length){ #mu_i,t = lambda*x_i,t-1 +phi*\sum_j~i x_j,t-1 mu[t,] <- control$coefs$lambda *x[t,] + control$coefs$phi*sumN(x[t,],control$neighbourhood) + control$population[t,]*nu[t,] x[t+1,] <- rdistr(nAreas,mu[t,]) } } #remove first time point dp <- create.disProg(week=1:length,observed=x[-1,],state=rep(0,length), neighbourhood=control$neighbourhood, populationFrac=control$population) return(list(data=dp,mean=mu,endemic=control$population*nu,coefs=control$coefs)) } ################## simHHH <- function(model,control,length){ UseMethod("simHHH") } ################################ # simulates data using the estimated parameter values of a model fitted with algo.hhh # Note: NO trend simHHH.ah <- function(model,control=model$control, length){ #hoehle: removed this to make simHHH.ah consistent with simHHH.default # control <- model$control #number of areas nAreas <- ncol(model$disProgObj$observed) #number of seasons S <- control$nseason cntrl <- list(lambda=NULL,phi=NULL,gamma=NULL,delta=NULL, psi=NULL,period=model$control$period) #extract coefficients coefs <- coef(model) if(control$neighbours) cntrl$phi <- coefs["phi"] if(control$negbin) cntrl$psi <- coefs["psi"] if(control$lambda) cntrl$lambda <- coefs["lambda"] if(S > 0){ cntrl$gamma <- coefs[paste("gamma",1:S,sep="")] cntrl$delta <- coefs[paste("delta",1:S,sep="")] } cntrl$alpha <- coefs[paste("alpha",1:nAreas,sep="")] result <- simHHH(length,control=list(coefs=cntrl, neighbourhood=model$disProgObj$neighbourhood, populationFrac=model$disProgObj$populationFrac )) return(result) } surveillance/R/sim_background.R0000644000176000001440000000414011731650466016321 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # 'sim.seasonalNoise' generates a cyclic model of a poisson distribution # as background data for a simulated timevector. # # Parameters: # A - amplitude (range of sinus), default = 1 # alpha - parameter to move along the y-axis # (negative values not allowed) # d.h alpha > = A, default = 1, # beta - regression coefficient, default = 0 # season - factor to create seasonal moves # (moves the curve along the x-axis), default = 0 # length - number of weeks to model # frequency - factor to determine the oscillation-frequency, default = 1 # state - if a state chain is given, it is weighted by the parameter K # and influences mu # K - weight for outbreaks sim.seasonalNoise <- function(A = 1, alpha = 1, beta = 0, phi = 0, length, frequency = 1, state = NULL, K = 0){ t <- 1:length # constant factor to transform weeks to the appropriate pi-value. omega <- 2 * pi/ 52 # season moves the sin along the x-axis. if(is.null(state)){ # no state chain mu <- exp(A * sin( frequency * omega * (t + phi)) + alpha + beta * t) } else{ # encounter the state chain mu <- exp(A * sin( frequency * omega * (t + phi)) + alpha + beta * t + K * state) } # create the noise as random numbers of the Poisson distribution # with parameter mu seasonalBackground <- rpois(length, mu) # get random numbers result <- list(seasonalBackground = seasonalBackground, t = t, mu = mu, A = A, alpha = alpha, beta = beta, phi = phi, length = length, frequency = frequency, K = K) class(result) = "seasonNoise" return(result) } surveillance/R/algo_twins.R0000644000176000001440000002200311731650466015476 0ustar ripleyusers###################################################################### # Experimental version -- integrating the twins program into # the surveillance package ###################################################################### algo.twins <- function(disProgObj, control= list(burnin=1000, filter=10, sampleSize=2500, noOfHarmonics=1, alpha_xi=10, beta_xi=10, psiRWSigma=0.25, alpha_psi=1, beta_psi=0.1, nu_trend=FALSE, logFile="twins.log")) { if (ncol(disProgObj$observed)>1) { stop("Error: algo.twins only handles univariate time series of counts.") } ## Determine period from data T <- as.integer(disProgObj$freq) ## Convert sts objects if (class(disProgObj) == "sts") disProgObj <- sts2disProg(disProgObj) ## set default values (if not provided in control) if(is.null(control[["burnin",exact=TRUE]])) control$burnin <- 1000 if(is.null(control[["filter",exact=TRUE]])) control$filter <- 10 if(is.null(control[["sampleSize",exact=TRUE]])) control$sampleSize <- 2500 if(is.null(control[["alpha_xi",exact=TRUE]])) control$alpha_xi <- 10 if(is.null(control[["beta_xi",exact=TRUE]])) control$beta_xi <- 10 if(is.null(control[["psiRWSigma",exact=TRUE]])) control$psiRWSigma <- 0.25 if(is.null(control[["alpha_psi",exact=TRUE]])) control$alpha_psi <- 1 if(is.null(control[["beta_psi",exact=TRUE]])) control$beta_psi <- 0.1 if(is.null(control[["nu_trend",exact=TRUE]])) control$nu_trend <- FALSE if(is.null(control[["logFile",exact=TRUE]])) control$logFile <- "twins.log" if(is.null(control[["noOfHarmonics",exact=TRUE]])) control$noOfHarmonics <- 1 nfreq <- control$noOfHarmonics control$logFile2 <- paste(control$logFile,"2",sep="") ## Call the C code x <- disProgObj$observed n <- as.integer(dim(x)[1]) I <- as.integer(dim(x)[2]) ## with(control, res <- .C(...)) is not valid R syntax!! res <- with(control, .C("twins", x=as.integer(x), n=n, I=I, logFile=logFile, logFile2=logFile2, burnin=as.integer(burnin), filter=as.integer(filter), sampleSize=as.integer(sampleSize), alpha_xi=as.double(alpha_xi), beta_xi=as.double(beta_xi), T=as.integer(T), nfreq=as.integer(nfreq), psiRWSigma=as.double(0.25), alpha_psi=as.double(alpha_psi), beta_psi=as.double(beta_psi), nu_trend=as.integer(nu_trend), PACKAGE="surveillance")) ## Log files results <- read.table(control$logFile,header=T,na.strings=c("NaN","-NaN")) results2 <- read.table(control$logFile2,header=T,na.strings=c("NaN","-NaN")) acc <- read.table(paste(control$logFile,".acc",sep=""),col.names=c("name","RWSigma","acc")) rownames(acc) <- acc[,1] acc <- acc[,-1] ## Nothing is returned by the function - result is not a ## standard survObj result <- structure(list(control=control, disProgObj=disProgObj, logFile=results, logFile2=results2), class="atwins") return(result) } ###################################################################### # Adapted the functions form figures.R ###################################################################### ## Helper functions to make list of Z and the means of X,Y and omega make.pois <- function(obj) { n <- nrow(obj$disProgObj$observed) m<-list() m$n <- n m$Z <- obj$disProgObj$observed m$X <- numeric(n) m$Y <- numeric(n) m$omega <- numeric(n) ## Read means at each time instance Vars <- c("X","Y","omega") for (t in 1:n) { for (v in Vars) { m[[v]][t] <- obj$logFile2[,paste(v,".",t,".",sep="")] } } return(m) } pois.plot <- function(m.results,...) { plotorder <- c(expression(Z),expression(Y),expression(X)) plotcols <- c(1,"red","blue") lwd <- c(1,3,3) sts <- disProg2sts(m.results$disProgObj) ## Make default legend if nothing else is specified. if (is.null(list(...)[["legend.opts",exact=TRUE]])) { ## plot(sts,legend.opts=list(x="topleft",legend=paste(plotorder),lwd=lwd,col=plotcols,horiz=TRUE,y.intersp=0,lty=1),...) ## There is a bug here, but atm I do not have the time to fix it. plot(sts,legend.opts=NULL,...) } else { plot(sts,...) } ## Add Y and X lines for (i in 2:length(plotorder)) { lines(1:(m.results$n)+0.5,m.results[[paste(plotorder[i])]][c(2:m.results$n,m.results$n)],type="s",col=plotcols[i],lwd=lwd[i]) } } ## makes list of gamma, zeta and nu make.nu <- function(obj) { n <- nrow(obj$disProgObj$observed) samplesize <- obj$control$sampleSize frequencies <- obj$control$noOfHarmonics # instead of just always "1" ! season <- obj$disProgObj$freq basefrequency <- 2 * pi / season ## optionally also get the linear time trend coefficient withTrend <- obj$control$nu_trend ## this list will be returned at the end m<-list() ## first get all the gamma's from the logFile matrix into nicer elements of ## the list m for (j in 0:(2*frequencies + withTrend)) { m$gamma[[j+1]] <- numeric(samplesize) m[["gamma"]][[j+1]] <- obj$logFile[,paste("gamma",".",j,".",sep="")] } ## zeta is a list which has one element for each time point (vector of samples) m$zeta<-list() ## for all time points: for (t in 1:n) { ## start with the intercept m$zeta[[t]]<-m$gamma[[1]] ## add all harmonic terms for(j in 1:frequencies){ m$zeta[[t]] <- m$zeta[[t]] + m$gamma[[2*j]]*sin(basefrequency*j*(t-1)) + m$gamma[[2*j+1]]*cos(basefrequency*j*(t-1)) } ## and (optionally) finally add the linear trend if(withTrend) { m$zeta[[t]] <- m$zeta[[t]] + m$gamma[[2*frequencies + 2]] * (t - n/2) } } ## nu is the analogous list with the exponentiated zeta's m$nu<-list() for (t in 1:n) { m$nu[[t]]<-exp(m$zeta[[t]]) } ## also copy the number of harmonics m$frequencies <- frequencies ## and return return(m) } ## Function to plot median, and quantiles over time for m.par (m.par is list of n vectors, x is time) tms.plot <-function(x,m.par,xlab="",ylab="",ylim=FALSE,...){ m<-list() n<-length(m.par) m$median<-numeric(n) for (t in 1:n) { m$median[t]<- median(m.par[[t]]) m$q025[t]<- quantile(m.par[[t]],0.025) m$q975[t]<- quantile(m.par[[t]],0.975) } if(!ylim){ ymin<-min(m$q025) ymax<-max(m$q975) ylim=c(ymin,ymax) } plot(x-1,m$q975[x],type="l",col="red",main="",xlab=xlab,ylab=ylab,ylim=ylim,...) lines(x-1,m$median[x],type="l") lines(x-1,m$q025[x],type="l",col="red") } ###################################################################### # Function to plot an atwins object -- currently not # properly documented ###################################################################### plot.atwins <- function(x, which=c(1,4,6,7), ask=TRUE,...) { ## Extract from the 3 dots if(is.null(which)) { which <- c(1,4,6,7) } if(is.null(ask)) { ask <- TRUE } ## Make list of X,Y,Z,omega means of results2 m.results <-make.pois(x) m.results$disProgObj <- x$disProgObj ## Make list of results of gamma, zeta and nu nu<-make.nu(x) ## Plots show <- rep(FALSE,7) show[which] <- TRUE par(ask=ask) if (show[1]) { par(mfcol=c(1,1)) pois.plot(m.results,...) } if (show[2]) { ## make room for 2 * (frequencies + 1) panels par(mfcol=c(2,nu$frequencies+1)) ## and plot all gamma coefficients (possibly including the linear time ## trend coef) for(j in seq_along(nu$gamma)) { plot(nu$gamma[[j]],type="l",ylab=paste("gamma",j - 1,sep="")) } } if (show[3]) { par(mfcol=c(1,1)) plot(x$logFile$K,type="l",ylab=expression(K)) plot(x$logFile$xilambda,type="l",ylab=expression(xi)) plot(x$logFile$psi,type="l",ylab=expression(psi)) } if (show[4]) { par(mfcol=c(1,2)) acf(x$logFile$K,lag.max = 500,main="",xlab=expression(K)) acf(x$logFile$psi,lag.max = 500,main="",xlab=expression(psi)) } if (show[5]) { par(mfcol=c(1,1)) tms.plot(2:m.results$n,nu$nu,xlab="time") } if (show[6]) { par(mfcol=c(1,2)) hist(x$logFile$K,main="",xlab=expression(K),prob=TRUE,breaks=seq(-0.5,max(x$logFile$K)+0.5,1)) hist(x$logFile$psi,main="",xlab=expression(psi),prob=TRUE,nclass=50) } if (show[7]) { par(mfcol=c(1,1)) hist(x$logFile$Znp1,main="",xlab=expression(Z[n+1]),prob=TRUE,breaks=seq(-0.5,max(x$logFile$Znp1)+0.5,1)) } } surveillance/R/algo_hmm.R0000644000176000001440000001142512034543036015110 0ustar ripleyusers################################################### ### chunk number 1: ################################################### algo.hmm <- function(disProgObj, control = list(range=range, Mtilde=-1, noStates=2, trend=TRUE, noHarmonics=1,covEffectEqual=FALSE, saveHMMs = FALSE, extraMSMargs=list() )){ # check if the msm package is available if (!require("msm")) { stop("the HMM method requires package ", dQuote("msm")) } # Set the default values if not yet set if(is.null(control$Mtilde)){ control$Mtilde <- -1 } if(is.null(control$noStates)){ control$noStates <- 2 } if(is.null(control$trend)){ control$trend <- TRUE } if(is.null(control$noHarmonics)){ control$noHarmonics <- 1 } if(is.null(control$covEffectEqual)){ control$covEffectEqual <- FALSE } if(is.null(control$saveHMMs)){ control$saveHMMs <- FALSE } if(is.null(control$extraMSMargs)){ control$extraMSMargs <- list() } #Stop if not enough for estimation if(min(control$range) < 2) { stop("Error: Too few values as reference values") } # initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) control$hmms <- list() ############################################## #Repeat for each time point to monitor on-line ############################################## for (i in 1:length(control$range)) { #Function is so slow some sort of perfomance indicator is usually necessary cat(paste("i=",i," (out of ",length(control$range),")\n",sep="")) #Initialize observations for each round -- can be done sequentally first <- ifelse(control$Mtilde== -1, 1, max(control$range[i]-control$Mtilde+1,1)) t <- first:control$range[i] observed <- disProgObj$observed[t] #Init data counts <- data.frame(observed, t) names(counts) <- c("observed","t") #Initialize formula formulaStr <- ifelse(control$trend, "~ 1 + t ", "~ 1 ") #Create formula and add harmonics as covariates -- this could be done recursively? for (j in seq_len(control$noHarmonics)) { counts[,paste("cos",j,"t",sep="")] <- cos(2*j*pi*(t-1)/disProgObj$freq) counts[,paste("sin",j,"t",sep="")] <- sin(2*j*pi*(t-1)/disProgObj$freq) formulaStr <- paste(formulaStr,"+ cos",j,"t + sin",j,"t ",sep="") } #Obtain crude inits q <- quantile(observed,seq(0,1,length=control$noStates+1)) lvl <- cut(observed,breaks=q,include.lowest=TRUE) crudeMean <- as.numeric(tapply(observed, lvl, mean)) hcovariates <- list() hmodel <- list() for (j in seq_len(control$noStates)) { hcovariates[[j]] <- as.formula(formulaStr) val <- crudeMean[j] #Substitution necessary, as hmmPois does lazy evaluation of rate argument hmodel[[j]] <- eval(substitute(hmmPois(rate=val),list(val=crudeMean[j]))) } #Any constraints on the parameters of the covariates for the different states hconstraint <- list() if (control$covEffectEqual) { hconstraint <- list(t=rep(1,control$noStates)) for (j in seq_len(control$noHarmonics)) { hconstraint[[paste("sin",j,"t",sep="")]] <- rep(1,control$noStates) hconstraint[[paste("cos",j,"t",sep="")]] <- rep(1,control$noStates) } } #Prepare object for msm fitting msm.args <- list(formula = observed ~ t, data = counts, #HMM with "noStates" states having equal initial values qmatrix = matrix(1/control$noStates,control$noStates,control$noStates), #y|x \sim Po( \mu[t] ) with some initial values hmodel = hmodel, #Models for \log \mu_t^1 and \log \mu_t^2 hcovariates = hcovariates, #Force the effects of the trend and harmonics to be equal for all states hconstraint=hconstraint) #Add additional msm arguments msm.args <- modifyList(msm.args, control$extraMSMargs) # fit the HMM hmm <- do.call(what="msm", args=msm.args) #In case the model fits should be saved. if (control$saveHMMs) { control$hmms[[i]] <- hmm } #If most probable state of current time point (i.e. last obs) equals the #highest state then do alarm # print(observed) # print(matrix(viterbi.msm(hmm)$fitted,ncol=1)) alarm[i] <- viterbi.msm(hmm)$fitted[length(t)] == control$noStates #Upperbound does not have any meaning -- compute posterior probability! upperbound[i] <- 0 } #Add name and data name to control object. control$name <- paste("hmm:", control$trans) control$data <- paste(deparse(substitute(disProgObj))) #no need for hmm object -- control$hmm <- hmm # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj,control=control) class(result) = "survRes" # for surveillance system result return(result) } surveillance/R/newtonRaphson.R0000644000176000001440000001450212166473572016206 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Michaela's own implementation of a Newton-Raphson optimizer ### ### Copyright (C) 2010-2012 Michaela Paul ### $Revision: 589 $ ### $Date: 2013-07-08 10:25:30 +0200 (Mon, 08 Jul 2013) $ ################################################################################ ##################### # x - initial parameter values # control arguments: # scoreTol - convergence if max(abs(score)) < scoreTol # paramTol - convergence if rel change in theta < paramTol # F.inc - eigenvalues of the hessian are computed when the Cholesky factorization # fails, and a constant added to the diagonal to make the smallest # eigenvalue= F.inc * largest # fn must return loglikelihood with score and fisher as attributes # fn <- function(theta,...){ # ll <- loglik(theta,...) # attr(ll,"score") <- score(theta,...) # attr(ll,"fisher") <- fisher(theta,...) # return(ll) # } newtonRaphson <- function(x,fn,..., control=list(), verbose=FALSE){ # set default values control.default <- list(scoreTol=1e-5, paramTol=1e-8, F.inc=0.01, stepFrac=0.5, niter=30) control <- modifyList(control.default, control) # number of step reductions, not positive definite Fisher matrices during iterations steph <- notpd <- 0 convergence <- 99 i <- 0 rel.tol <- function(x,xnew){ sqrt(sum((xnew-x)^2)/sum(x^2)) } score <- function(fn){ return(attr(fn,"score")) } fisher <- function(fn){ return(attr(fn,"fisher")) } ll0 <- c(fn(x,...)) if(verbose>1) cat("initial loglikelihood",ll0,"\n\n") # fn cannot be computed at initial par if(!is.finite(ll0) | is.na(ll0)){ cat("fn can not be computed at initial parameter values.\n") return(list(convergence=30, notpd = notpd, steph = steph)) } while(convergence != 0 & (i< control$niter)){ i <- i+1 ll <- fn(x,...) if(max(abs(score(ll))) < control$scoreTol){ convergence <- 0 break } # get cholesky decompositon F <- fisher(ll) F.chol <- try(chol(F),silent=TRUE) # could still give a nearly singular matrix # => could also check condition number if(inherits(F.chol,"try-error")){ if(verbose>1) cat("fisher is not pd\n") # fisher is not pd notpd <- notpd +1 ev <- eigen(F,symmetric=TRUE, only.values=TRUE)$values # add a constant to diag(F) diag(F) <- diag(F) + (control$F.inc*(max(abs(ev))) - min(ev))/(1-control$F.inc) # compute cholesky decomposition of modified fisher F.chol <- chol(F) } direction <- chol2inv(F.chol)%*% score(ll) if(max(abs(direction)) < control$paramTol*(max(abs(x))+1e-8) ){ convergence <- 0 break } # do Newton-Raphson step x.new <- c(x + direction) ll.new <- fn(x.new,...) if(verbose>1) cat("iteration",i,"\trel.tol =",rel.tol(x,x.new),"\tabs.tol(score) =",max(abs(score(ll.new))),"\n") if(verbose>2) cat("theta =",round(x.new,2),"\n") if(verbose>1) cat("loglikelihood =",ll.new,"\n") ## Backtracking: reduce stepsize until we really improve the loglikelihood # ll(x1,lambda) = ll(x0) + lambda * fisher(x0)^-1 %*% score(x0) i.backstep <- 0 ## Gray (2001) Ch 3: Unconstrained Optimization and Solving Nonlinear Equations # It is technically possible to construct sequences where ll(x1) > ll(x0) # at each step but where the sequence never converges. # For this reason a slightly stronger condition is usually used. # Dennis and Schnabel (1983): Numerical Methods for Unconstrained # Optimization and Nonlinear Equations. SIAM. (ch 6,3.2, p.126) # recommend requiring that lambda satisfy # ll(x1) > ll(x0) + 1e-4 *(x1-x0)' %*% score(x0) while((is.na(ll.new) || (ll.new < c(ll)+ (1e-4)*sum(direction*score(ll)))) & (i.backstep <= 20)){ if(verbose>1 & i.backstep==0) cat("backtracking: ") i.backstep <- i.backstep +1 steph <- steph +1 # reduce stepsize by a fixed fraction stepFrac direction <- control$stepFrac*direction x.new <- c(x + direction) ll.new <- fn(x.new,...) if(verbose>1) cat("*") } if(verbose & i.backstep>0) cat("\n") if(i.backstep >20){ if(verbose>1)cat("backtracking did not improve fn\n") #cat("ll: ",ll,"\tll.new: ",ll.new,"\n") convergence <- 10 break } x <- c(x.new) if(verbose>1) cat("\n") } ll <- fn(x,...) # max number of iterations reached, but check for convergence if(max(abs(score(ll))) < control$scoreTol){ convergence <- 0 } # convergence if # 1) relative difference between parameters is small # 2) absolute value of gradient is small # 3) stop after niter iterations if(i==control$niter & convergence !=0){ if(verbose>1) cat("Newton-Raphson stopped after",i,"iterations!\n") # iteration limit reached without convergence convergence <- 10 } if(verbose>1) cat("iteration",i,"\trel.tol =",rel.tol(x,x.new),"\tabs.tol(score) =",max(abs(score(ll))),"\n") if(verbose>2) cat("theta =",round(x.new,2),"\n") if(verbose>1) cat("loglikelihood =",c(ll),"\n\n") # loglikelihood loglik <- c(ll) # fisher info F <- fisher(ll) if(inherits(try(solve(F),silent=TRUE),"try-error")){ cat("\n\n***************************************\nfisher not regular!\n") #print(summary(x)) return(list(coefficients=x, loglikelihood=loglik, fisher=FALSE, convergence=22, notpd = notpd, steph = steph)) } # check if solution is a maximum (i.e. if fisher is pd ) eps <- 1e-10 if(!all(eigen(F,symmetric=TRUE, only.values=TRUE)$values > eps)){ if(verbose>1) cat("fisher information at solution is not pd\n") return(list(coefficients=x, loglikelihood=loglik, fisher=FALSE, convergence=21, notpd = notpd, steph = steph)) } if(verbose>0) cat("number of iterations = ",i," coverged = ", convergence ==0," log-likelihood = ",loglik, " notpd = ", notpd, " steph = ", steph, "\n") result <- list(coefficients=x, loglikelihood=loglik, fisher=FALSE, convergence=convergence, notpd=notpd, steph=steph,niter=i) return(result) } surveillance/R/algo_cusum.R0000644000176000001440000002060312237000434015454 0ustar ripleyusers################################################### ### chunk number 1: ################################################### algo.cusum <- function(disProgObj, control = list(range=range, k=1.04, h=2.26, m=NULL, trans="standard",alpha=NULL)){ # Set the default values if not yet set if(is.null(control$k)) control$k <- 1.04 if(is.null(control$h)) control$h <- 2.26 if(is.null(control$trans)) control$trans <- "standard" if(is.null(control$alpha)) control$alpha <- 0.1 alpha <- control$alpha observed <- disProgObj$observed timePoint <- control$range[1] # Estimate m (the expected number of cases), i.e. parameter lambda of a # poisson distribution based on time points 1:t-1 if(is.null(control$m)) { m <- mean(observed[1:(timePoint-1)]) } else if (is.numeric(control$m)) { m <- control$m } else if (control$m == "glm") { #Fit a glm to the first observations training <- 1:(timePoint-1) #Set the time index t <- disProgObj$start[2] + training - 1 #Set the observations x <- observed[training] #Set period p <- disProgObj$freq df <- data.frame(x=x,t=t) control$m.glm<- glm(x ~ 1 + cos(2*pi/p*t) + sin(2*pi/p*t) ,family=poisson(),data=df) #predict the values in range t.new <- disProgObj$start[2] + control$range - 1 m <- predict(control$m.glm,newdata=data.frame(t=t.new),type="response") } #No transformation #standObs <- observed[control$range] x <- observed[control$range] standObs <- switch(control$trans, # compute standardized variables z3 (proposed by Rossi) "rossi" = (x - 3*m + 2*sqrt(x*m))/(2*sqrt(m)), # compute standardized variables z1 (based on asympotic normality) "standard" = (x - m)/sqrt(m), # anscombe residuals "anscombe" = 3/2*(x^(2/3)-m^(2/3))/m^(1/6), # anscombe residuals as in pierce schafer based on 2nd order approx of E(X) "anscombe2nd" = (x^(2/3)-(m^(2/3)-m^(-1/3)/9))/(2/3*m^(1/6)), # compute Pearson residuals for NegBin "pearsonNegBin" = (x - m)/sqrt(m+alpha*m^2), # anscombe residuals for NegBin "anscombeNegBin" = anscombeNB(x,mu=m,alpha=alpha), # don't do anything "none" = x, stop("invalid 'trans'formation") ) # initialize the necessary vectors # start with cusum[timePoint -1] = 0, i.e. set cusum[1] = 0 cusum <- matrix(0,nrow=(length(control$range)+1), ncol=1) alarm <- matrix(data = 0, nrow = (length(control$range)+1), ncol = 1) for (t in 1:length(control$range)){ # compute cumulated sums of standardized observations corrected with the # reference value k for all time points in range cusum[t+1]<- max(0, cusum[t]+(standObs[t]-control$k)) # give alarm if the cusum is larger than the decision boundary h alarm[t+1] <- cusum[t+1] >= control$h } #Backtransform h <- control$h k <- control$k Ctm1 <- cusum[1:length(control$range)] upperbound <- switch(control$trans, # standardized variables z3 (proposed by Rossi) "rossi" = 2*h*m^(1/2)+2*k*m^(1/2)-2*Ctm1*m^(1/2)+5*m-2*(4*m^2+2*m^(3/2)*h+2*m^(3/2)*k-2*m^(3/2)*Ctm1)^(1/2), # standardized variables z1 (based on asympotic normality) "standard" = ceiling(sqrt(m)*(h+k-Ctm1)+ m), # anscombe residuals "anscombe" = ifelse( ((2/3)*m^(1/6)*(h+k-Ctm1)+m^(2/3))<0, 0, (2/3*m^(1/6)*(h+k-Ctm1)+m^(2/3))^(3/2) ), # anscombe residuals ? "anscombe2nd" = ifelse( ((2/3)*m^(1/6)*(h+k-Ctm1)+(m^(2/3)-m^(1/3)/9))<0, 0, (2/3*m^(1/6)*(h+k-Ctm1)+(m^(2/3)-m^(1/3)/9))^(3/2) ), # Pearson residuals for NegBin "pearsonNegBin" = sqrt(m+alpha*m^2)*(h+k-Ctm1)+ m, # anscombe residuals for NegBin ? "anscombeNegBin" = h-cusum[-1], # don't do anything "none" = h-cusum[-1] ) # ensure upper bound is positive and not NaN upperbound[is.na(upperbound)] <- 0 upperbound[upperbound < 0] <- 0 # discard cusum[1] and alarm[1] cusum <- cusum[-1] alarm <- alarm[-1] #Add name and data name to control object. control$name <- paste("cusum:", control$trans) control$data <- paste(deparse(substitute(disProgObj))) control$m <- m # return alarm and upperbound vectors result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj,control=control, cusum=cusum) class(result) = "survRes" # for surveillance system result return(result) } ################################################### ### chunk number 2: ################################################### ###################################################################### # Program to test the transformation of NegBin variables # using the transformation similar to Anscombe residuals ###################################################################### ##################################################################### # function to evaluate hypgeom_2F1(1/3,2/3, 5/3, x) # "exact" values for x = -(0:10) and linear interpolation for x = -(10:100) #################################################################### hypgeom2F1special <- function(x) { #Return the z (the approximation grid), which is closest to x idx <- which.min(abs(surveillance.gvar.z-x)) if(x >= -10) return(surveillance.gvar.hyp[idx]) else{ # find out interval that contains x if((x-surveillance.gvar.z[idx]) < 0){ idxLow <- idx +1 idxUp <- idx } else { idxLow <- idx idxUp <- idx -1 } #linear interpolation: f(x)=f(x0)+(f(x1)-f(x0))/1*(x-x0) return(surveillance.gvar.hyp[idxLow]+(surveillance.gvar.hyp[idxUp]-surveillance.gvar.hyp[idxLow])*(x-surveillance.gvar.z[idxLow])) } } ##################################################################### # compute anscombe residuals for Y ~ NegBin(mu, alpha) using hypgeom2F1 function # E(Y)= \mu, Var(Y) = \mu + \alpha*\mu^2 ################################################################# anscombeNB <- function(y,mu,alpha=0.1) { hypgeom.mu <- 3/2*mu^(2/3)*hypgeom2F1special(-alpha*mu) one <- function(y){ up <- 3/2*y^(2/3) * hypgeom2F1special(-alpha*y) - hypgeom.mu down <- (mu+alpha*mu^2)^(1/6) return(up/down) } return(sapply(y,one)) } ################################################### ### chunk number 3: ################################################### ###################################################################### # Given a specification of the average run length in the (a)cceptance # and (r)ejected setting determine the k and h values in a standard # normal setting. # # Description: # Functions from the spc package are used in a simple univariate # root finding problem. # # Params: # ARLa - average run length in acceptance setting (i.e. number before # false alarm # ARLw - average run length in rejection state (i.e. number before # an increase is detected (i.e. detection delay) # method - optim method to use, see ?optim # # Returns: # list( k - reference value, h - decision interval) ###################################################################### find.kh <- function(ARLa=500,ARLr=7,sided="one",method="BFGS",verbose=FALSE) { if (!requireNamespace("spc")) stop("find.kh() requires package ", dQuote("spc")) #Small helper function which is to be minimized fun <- function(k) { if (k>0) { #Compute decision interval h <- spc::xcusum.crit(L0=ARLa,k=k,r=50,sided=sided) #Check if xcusum.crit managed to find a solution if (is.nan(h)) stop("spc::xcusum.crit was not able to find a h corresponding to ", "ARLa=",ARLa," and k=",k) if (h > 0) { #Compute ARLr given the above computed h arlr <- spc::xcusum.arl(k,h,mu=2*k,r=50,sided=sided) #Deviation from the requested ARLr if (verbose) { cat("k=",k," score = ",(arlr-ARLr)^2,"\n") } return( (arlr-ARLr)^2 ) } else { return(1e99) } } else { return( 1e99) } } k <- optim(1,fun,method=method)$par return(list(k=k,h=spc::xcusum.crit(L0=ARLa,k=k,r=50,sided=sided))) } surveillance/R/algo_cdc.R0000644000176000001440000000677312003566242015072 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # Implementation of the CDC surveillance system. # The system evaluates specified timepoints and gives alarm if it recognizes # an outbreak for this timepoint. # algo.cdcLatestTimepoint <- function(disProgObj, timePoint = NULL, control = list(b = 5, m = 1, alpha=0.025)){ observed <- disProgObj$observed freq <- disProgObj$freq # If there is no value in timePoint, then take the last value in observed if(is.null(timePoint)){ timePoint = length(observed) } # check if the vector observed includes all necessary data. if((timePoint-(control$b*freq)-control$m*4) < 1){ stop("The vector of observed is too short!") } ###################################################################### #Find which weeks to take -- hoehle 27.3.2007 - fixed bug taking #things in the wrong time order (more recent values) ###################################################################### midx <- seq(-control$m*4-3,control$m*4) yidx <- ((-control$b):(-1))*freq baseidx <- sort(rep(yidx,each=length(midx)) + midx) months <- rep(1:((2*control$m+1)*control$b),each=4) basevec <- as.integer(by(observed[timePoint + baseidx ],months,sum)) # Create a normal distribution based upper confidence interval # (we will use the prediction interval described in # Farrington & Andrew (2003)) upCi <- mean(basevec)+qnorm(1-control$alpha/2)*sd(basevec)*sqrt(1+1/length(basevec)) #Counts for the current mounth yt0 <- sum(observed[timePoint:(timePoint-3)]) # Alarm if the actual value is larger than the upper limit. alarm <- yt0 > upCi # Save aggregated score for later visualisation. aggr <- yt0 result <- list(alarm=alarm, upperbound=upCi,aggr=aggr) class(result) = "survRes" # for surveillance system result return(result) } # 'algo.cdc' calls 'algo.bayesLatestTimepoint' for data points given by range. algo.cdc <- function(disProgObj, control = list(range = range, b=5, m=1, alpha=0.025)){ if(disProgObj$freq != 52) { stop("algo.cdc only works for weekly data.") } # initialize the necessary vectors alarm <- matrix(data = 0, nrow = length(control$range), ncol = 1) aggr <- matrix(data = 0, nrow = length(control$range), ncol = 1) upperbound <- matrix(data = 0, nrow = length(control$range), ncol = 1) #Set control options (standard CDC options) if (is.null(control$range)) { control$range <- (disProgObj$freq*control$b - control$m):length(disProgObj$observed) } if (is.null(control$b)) {control$b=5} if (is.null(control$m)) {control$m=1} #bug fixed if (is.null(control$alpha)) {control$alpha=0.025} count <- 1 for(i in control$range){ # call algo.cdcLatestTimepoint result <- algo.cdcLatestTimepoint(disProgObj, i,control=control) # store the results in the right order alarm[count] <- result$alarm aggr[count] <- result$aggr upperbound[count] <- result$upperbound count <- count + 1 } #Add name and data name to control object. control$name <- paste("cdc(",control$m*4,"*,",0,",",control$b,")",sep="") control$data <- paste(deparse(substitute(disProgObj))) # Return the vectors- # as a special feature CDC objects contain an "aggr" identifier # containing the aggregated counts for each week. result <- list(alarm = alarm, upperbound = upperbound, disProgObj=disProgObj, control=control, aggr=aggr) class(result) = "survRes" # for surveillance system result return(result) } surveillance/R/spatial_tools.R0000644000176000001440000001341612237174420016206 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Auxiliary functions for operations on spatial data ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ### Polygonal Approximation of a Disc/Circle discpoly <- function (center, radius, npoly = 64, class = c("Polygon", "owin", "gpc.poly"), hole = FALSE) { class <- match.arg(class) if (class == "owin") { # use spatstat::disc res <- disc(radius=radius, centre=center, mask=FALSE, npoly=npoly) if (hole) { res$bdry[[1]]$x <- rev(res$bdry[[1]]$x) res$bdry[[1]]$y <- rev(res$bdry[[1]]$y) res$bdry[[1]]$hole <- TRUE } return(res) } ## do it myself for the "Polygon" and "gpc.poly" classes stopifnot(radius > 0, isScalar(npoly), npoly > 2) theta <- seq(2*pi, 0, length = npoly+1)[-(npoly+1)] # for clockwise order if (hole) theta <- rev(theta) # for anticlockwise order x <- center[1] + radius * cos(theta) y <- center[2] + radius * sin(theta) switch(class, "Polygon" = Polygon(cbind(c(x,x[1]),c(y,y[1])), hole=hole), "gpc.poly" = { pts <- list(list(x=x, y=y, hole=hole)) if (isClass("gpc.poly") || requireNamespace("rgeos")) { new("gpc.poly", pts = pts) } else { warning("formal class \"gpc.poly\" not available") pts } } ) } ### Wrapper for polyclip or rgeos::gUnaryUnion or maptools::unionSpatialPolygons unionSpatialPolygons <- function (SpP, method = c("rgeos", "polyclip", "gpclib"), ...) { method <- match.arg(method) W <- switch( method, "polyclip" = { tiles_xylist <- xylist(SpP, reverse=FALSE) W_xylist <- polyclip::polyclip(tiles_xylist, tiles_xylist, "union", fillA = "nonzero", fillB = "nonzero", ...) ## FIXME: polyclip() seems to return owin-type vertex order? W_Polygons <- Polygons( lapply(W_xylist, function(p) Polygon(cbind(p$x,p$y)[c(1L,length(p$x):1L),])), ID="1") SpatialPolygons(list(W_Polygons)) }, "rgeos" = rgeos::gUnaryUnion(SpP, ...), "gpclib" = { library("maptools") # loading only the namespace is not sufficient, # since rgeosStatus is only set in .onAttach gpclibCheck() && maptools::gpclibPermit() maptools::unionSpatialPolygons( SpP, IDs = rep.int(1,length(SpP@polygons)), avoidGEOS = TRUE, ...) }) ## ensure that W has exactly the same proj4string as SpP W@proj4string <- SpP@proj4string W } ### Compute distance from points to boundary ### copied in part from function bdist.points() of the "spatstat" package ### authored by A. Baddeley and R. Turner (DEPENDS ON spatstat::distppl) ## xy is the coordinate matrix of the points ## poly is a polygonal domain of class "owin" or "gpc.poly" ## Note that we do not check if points are actually inside the polygonal domain bdist <- function (xy, poly) { result <- rep.int(Inf, nrow(xy)) bdry <- if (is.polygonal(poly)) { poly$bdry } else if (inherits(poly, "gpc.poly")) { poly@pts } else stop("'poly' must be \"owin\" or \"gpc.poly\"") for (i in seq_along(bdry)) { polly <- bdry[[i]] px <- polly$x py <- polly$y nsegs <- length(px) for (j in seq_len(nsegs)) { j1 <- if (j < nsegs) j + 1L else 1L seg <- c(px[j], py[j], px[j1], py[j1]) ## calculate distances of points to segment j of polygon i result <- pmin.int(result, distppl(xy, seg)) } } return(result) } ### sample n points uniformly on a disc with radius r runifdisc <- function (n, r = 1) { rangle <- runif(n, 0, 2*pi) rdist <- r * sqrt(runif(n, 0, 1)) rdist * cbind(cos(rangle), sin(rangle)) } ### Count number of instances at the same location of a SpatialPoint object multiplicity.default <- function (x, ...) { distmat <- as.matrix(dist(x)) as.integer(rowSums(distmat == 0)) } multiplicity.Spatial <- function (x, ...) { multiplicity(coordinates(x)) } ### determines which polygons of a SpatialPolygons object are at the border, ### i.e. have coordinates in common with the spatial union of all polygons polyAtBorder <- function (SpP, snap = sqrt(.Machine$double.eps), method = "rgeos", ...) { SpP <- as(SpP, "SpatialPolygons") W <- unionSpatialPolygons(SpP, method = method, ...) if (length(W@polygons) > 1) warning("unionSpatialPolygons() produced >1 Polygons-components") Wcoords <- unique(do.call("rbind", lapply(W@polygons[[1]]@Polygons, coordinates))) atBorder <- sapply(SpP@polygons, function (x) { coords <- unique(do.call("rbind", lapply(x@Polygons, coordinates))) res <- FALSE for (i in seq_len(nrow(coords))) { if (any(spDistsN1(Wcoords, coords[i,], longlat=FALSE) < snap)) { res <- TRUE break } } res }) names(atBorder) <- row.names(SpP) atBorder } surveillance/R/isoWeekYear.R0000644000176000001440000000605411731650466015567 0ustar ripleyusers###################################################################### # Extract ISO week from Date object # # Details: # Code by Gustaf Rydevik , revised 2010 # http://tolstoy.newcastle.edu.au/R/e10/help/10/05/5588.html # This is a platform independent way of doing # format.Date(x,"%G") or format.Date(x,"%G") # which unfortunately does not work on windows platforms. # # Note: The function is vectorized. # # Parameters: # Y -- Inputs a date object (POSIX) or Year # M -- month (NULL if Y is a Date object) # D -- day (NULL if Y is a Date object) # # Returns: # ISO year and wek of the date ###################################################################### isoWeekYear<-function(Y,M=NULL,D=NULL){ #Format the date. But whatts the difference between the two statements? if(!class(Y)[1]%in%c("Date","POSIXt")) { date.posix<-strptime(paste(Y,M,D,sep="-"),"%Y-%m-%d") } if(class(Y)[1]%in%c("POSIXt","Date")){ date.posix<-as.POSIXlt(Y) Y<-as.numeric(format(date.posix,"%Y")) M<-as.numeric(format(date.posix,"%m")) D<-as.numeric(format(date.posix,"%d")) } #LY LY <- (Y%%4==0 & !(Y%%100==0))|(Y%%400==0) LY.prev <- ((Y-1)%%4==0 & !((Y-1)%%100==0))|((Y-1)%%400==0) date.yday<-date.posix$yday+1 jan1.wday<-strptime(paste(Y,"01-01",sep="-"),"%Y-%m-%d")$wday jan1.wday<-ifelse(jan1.wday==0,7,jan1.wday) date.wday<-date.posix$wday date.wday<-ifelse(date.wday==0,7,date.wday) ####If the date is in the beginning, or end of the year, ### does it fall into a week of the previous or next year? Yn<-ifelse(date.yday<=(8-jan1.wday)&jan1.wday>4,Y-1, ifelse(((365+LY-date.yday)<(4-date.wday)),Y+1,Y)) ##Set the week differently if the date is in the beginning,middle or ##end of the year Wn<-ifelse( Yn==Y-1, ifelse((jan1.wday==5|(jan1.wday==6 &LY.prev)),53,52), ifelse(Yn==Y+1,1,(date.yday+(7-date.wday)+(jan1.wday-1))/7-(jan1.wday>4)) ) return(list(ISOYear=Yn,ISOWeek=Wn)) } ###################################################################### # Not very beautiful function implementing a platform independent # format.Date function. See format.Date, which for the %V and %G # format strings does not work on windows. # Added format string %Q for formatting of the quarter (1-4) the month # belongs to. # # Params: # x - An object of type Date to be converted. # format - A character string. Note that only "%V and %G" are # processed on Windows. Otherwise the call is sent to format.Date ###################################################################### formatDate <- function(x, format) { if (sessionInfo()[[1]]$os == "mingw32") { res <- switch(format, "%G"=isoWeekYear(x)$ISOYear, "%V"=isoWeekYear(x)$ISOWeek, "%Q"=as.character((as.numeric(format(x,"%m"))-1) %/% 3 + 1), format.Date(x, format)) } else { res <- switch(format, "%Q"=as.character((as.numeric(format(x,"%m"))-1) %/% 3 + 1), format.Date(x, format)) } return(res) } surveillance/R/twinstim_epidata.R0000644000176000001440000004356512237174420016706 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Data structure for CONTINUOUS SPATIO-temporal infectious disease case data ### and a spatio-temporal grid of endemic covariates ### ### Copyright (C) 2009-2013 Sebastian Meyer ### $Revision: 666 $ ### $Date: 2013-11-08 15:45:36 +0100 (Fre, 08 Nov 2013) $ ################################################################################ ###################################################################### # MAIN GENERATOR FUNCTION FOR epidataCS OBJECTS # PARAMS: # events: SpatialPointsDataFrame of cases with obligatory columns # time: time point of event # tile: reference to spatial unit (tile) in stgrid, where the event is located # type: optional type of event (-> marked twinstim). will be converted to a factor variable. # eps.t: maximal temporal influence radius (e.g. length of infectious period, time to culling, etc.), may be Inf # eps.s: maximal spatial influence radius (e.g. 100 [km]), may be Inf # The remaining columns are further marks of the event, e.g. sex, age of infected person (-> epidemic covariates) # The column names "ID", ".obsInfLength", ".bdist", ".influenceRegion", and ".sources" are reserved. # "ID": unique chronological ID for the events # ".obsInfLength": observed length of the infectious period (being part [0,T]) # ".bdist": minimal distance of the event locations to the boundary # ".influenceRegion": object of class "owin", the intersection of W with b(s,eps.s), with origin at s # ".sources": potential sources of infection # stgrid: data.frame with obligatory columns # tile: ID of spatial unit (e.g. id of municipality) # start, stop: temporal interval # area: area of the spatial unit (tile) # The remaining columns are endemic covariates. # The column name "BLOCK" is reserved (indexing the time intervals of stgrid). # W: SpatialPolygons. Observation region. Must have same proj4string as events. # qmatrix: square indicator matrix (0/1 or TRUE/FALSE) for possible transmission between the event types. will be internally converted to logical. Defaults to an independent spread of the event types. # nCircle2Poly: accuracy (number of edges) of the polygonal approximation of a circle # T: end of observation period (=last stop time). Must be specified if only the # start but not the stop times are supplied in stgrid (-> auto-generation of stop-times). # clipper: engine to use for computing polygon intersections. ###################################################################### obligColsNames_events <- c("time", "tile", "type", "eps.t", "eps.s") obligColsNames_stgrid <- c("start", "stop", "tile", "area") reservedColsNames_events <- c("ID", ".obsInfLength", ".sources", ".bdist", ".influenceRegion", "BLOCK", "start") reservedColsNames_stgrid <- c("BLOCK") as.epidataCS <- function (events, stgrid, W, qmatrix = diag(nTypes), nCircle2Poly = 32, T = NULL, clipper = c("polyclip", "rgeos")) { clipper <- match.arg(clipper) # Check and SORT events and stgrid cat("\nChecking 'events':\n") events <- checkEvents(events) cat("Checking 'stgrid':\n") stgrid <- checkstgrid(stgrid, T) # Check class and proj4string of W and consistency of area cat("Checking 'W'...\n") W <- as(W, "SpatialPolygons") stopifnot(identicalCRS(W, events)) W.area <- sum(sapply(W@polygons, slot, "area")) tiles.totalarea <- sum(stgrid$area[stgrid$BLOCK == 1]) if (abs(W.area - tiles.totalarea) / max(W.area, tiles.totalarea) > 0.005) { cat("\tArea of 'W' =", W.area, "\n") cat("\tTotal area of the tiles in 'stgrid' =", tiles.totalarea, "\n") warning("area of 'W' should be consistent with the ", "total area of the tiles in 'stgrid'") } # Check qmatrix cat("Checking 'qmatrix'...\n") typeNames <- levels(events$type) nTypes <- length(typeNames) qmatrix <- checkQ(qmatrix, typeNames) # Check nCircle2Poly stopifnot(isScalar(nCircle2Poly)) nCircle2Poly <- as.integer(nCircle2Poly) # Small helper function converting event index to (time, tile) string eventidx2string <- function (eventIdx) { paste(c("time", "tile", "type"), "=", unlist(events@data[eventIdx,c("time","tile","type")]), collapse = ", ") } # Check that all events are part of W cat("Checking if all events are part of 'W'...\n") WIdxOfEvents <- over(events, W) if (eventNotInWidx <- match(NA, WIdxOfEvents, nomatch = 0L)) { stop("the event at (", eventidx2string(eventNotInWidx), ") is not ", "inside 'W'") } # Some basic quantities eventCoords <- coordinates(events) nEvents <- nrow(eventCoords) timeRange <- with(stgrid, c(start[1], stop[length(stop)])) # Are event times covered by stgrid? cat("Checking if all events are covered by 'stgrid'...\n") ## FIXME: what about pre-history events? don't need stgrid-data for them if (events$time[1] <= timeRange[1] || events$time[nEvents] > timeRange[2]) { stop("event times are not covered by 'stgrid': must be in (", timeRange[1L],",",timeRange[2L],"]") } # Are all events$tile references really part of the stgrid? .events.tile <- factor(events$tile, levels = levels(stgrid$tile)) if (missingSCellIdx <- match(NA, .events.tile, nomatch = 0L)) { stop("the 'events$tile' entry \"", events$tile[missingSCellIdx], "\"", " is not a valid level of 'stgrid$tile'") } events$tile <- .events.tile # Calculate time point of removal, when event is definitely no longer infective removalTimes <- events$time + events$eps.t # Calculate distance matrix of events cat("Calculating euclidean distance matrix of events...\n") eventDists <- as.matrix(dist(eventCoords, method = "euclidean")) #diag(eventDists) <- Inf # infinite distance to oneself (no self-infection), not needed # Map events to corresponding grid cells # Also precalculate possible origins of events (other infected individuals) cat("Mapping events to 'stgrid' cells and", "determining potential event sources...\n") withPB <- interactive() gridcellsOfEvents <- integer(nEvents) eventSources <- vector(nEvents, mode = "list") if (withPB) pb <- txtProgressBar(min=0, max=nEvents, initial=0, style=3) for (i in seq_len(nEvents)) { idx <- gridcellOfEvent(events$time[i], events$tile[i], stgrid) if (is.na(idx)) { stop("could not find information for time point ", events$time[i], " and tile \"", events$tile[i], "\" in 'stgrid'") } gridcellsOfEvents[i] <- idx eventSources[[i]] <- determineSources( i, events$time, removalTimes, eventDists[i,], events$eps.s, events$type, qmatrix ) if (withPB) setTxtProgressBar(pb, i) } if (withPB) close(pb) # Attach endemic covariates from stgrid to events cat("Attaching endemic covariates from 'stgrid' to 'events'...\n") stgridIgnoreCols <- match(setdiff(obligColsNames_stgrid, "start"), names(stgrid)) copyCols <- setdiff(seq_along(stgrid), stgridIgnoreCols) reservedColsIdx <- na.omit(match(names(stgrid)[copyCols], names(events@data), nomatch=NA_integer_)) if (length(reservedColsIdx) > 0L) { warning("in 'events@data', the existing columns with names of endemic ", "covariates from 'stgrid' (", paste0("'", names(events@data)[reservedColsIdx], "'", collapse=", "), ") have been replaced") events@data <- events@data[-reservedColsIdx] } events@data <- cbind(events@data, stgrid[gridcellsOfEvents, copyCols]) # Calculate observed infection length = min(T-time, eps.t) for use in log-likelihood events$.obsInfLength <- with(events@data, pmin(timeRange[2]-time, eps.t)) # Attach possible eventSources (infective individuals) to events events$.sources <- eventSources # Calculate minimal distance of event locations from the polygonal boundary cat("Calculating (minimal) distances of the events to the boundary...\n") Wowin <- as(W, "owin") # imported from polyCub events$.bdist <- bdist(eventCoords, Wowin) # Construct spatial influence regions around events cat("Constructing spatial influence regions around events...\n") events$.influenceRegion <- if (clipper == "polyclip") { .influenceRegions(events, Wowin, nCircle2Poly, clipper=clipper) } else .influenceRegions(events, W, nCircle2Poly, clipper=clipper) # Attach some useful attributes res <- list(events = events, stgrid = stgrid, W = W, qmatrix = qmatrix) class(res) <- c("epidataCS", "list") cat("Done.\n\n") return(res) } ###################################################################### # HELPER FUNCTIONS FOR as.epidataCS ###################################################################### ### CHECK FUNCTION FOR events ARGUMENT IN as.epidataCS checkEvents <- function (events, dropTypes = TRUE) { # Check class and spatial dimensions stopifnot(inherits(events, "SpatialPointsDataFrame")) if (ncol(events@coords) != 2L) { stop("only two spatial dimensions are supported") } # Check existence of type column cat("\tChecking 'type' column... ") events$type <- if ("type" %in% names(events)) { if (dropTypes) factor(events$type) else as.factor(events$type) } else { cat("Setting 'type' to 1 for all events.") factor(rep.int(1L,nrow(events@coords))) } cat("\n") # Check obligatory columns obligColsIdx <- match(obligColsNames_events, names(events), nomatch = NA_integer_) if (any(obligColsMissing <- is.na(obligColsIdx))) { stop("missing obligatory columns in 'events@data': ", paste(obligColsNames_events[obligColsMissing], collapse = ", ")) } # Check other columns on reserved names reservedColsIdx <- na.omit(match(reservedColsNames_events, names(events), nomatch=NA_integer_)) if (length(reservedColsIdx) > 0L) { warning("in 'events@data', the existing columns with reserved names (", paste0("'", names(events)[reservedColsIdx], "'", collapse=", "), ") have been replaced") events@data <- events@data[-reservedColsIdx] } # Check that influence radii are numeric and positive (also not NA) cat("\tChecking 'eps.t' and 'eps.s' columns...\n") with(events@data, stopifnot(is.numeric(eps.t), eps.t > 0, is.numeric(eps.s), eps.s > 0)) # Transform time into a numeric variable cat("\tConverting event time into a numeric variable...\n") events$time <- as.numeric(events$time) stopifnot(!is.na(events$time)) # Check event times for ties cat("\tChecking event times for ties...\n") timeIsDuplicated <- duplicated(events$time) if (any(timeIsDuplicated)) { duplicatedTimes <- unique(events$time[timeIsDuplicated]) warning("detected non-unique event times: ", "concurrent events at time ", if (length(duplicatedTimes) == 1L) "point " else "points\n", paste(duplicatedTimes, collapse = ", ")) } # Sort events chronologically cat("\tSorting events...\n") events <- events[order(events$time),] # Attribute unique IDs to events (running chronologically from 1 to nEvents) events$ID <- seq_along(events) # Make ID column the first column, then obligatory columns then remainders (epidemic covariates) IDcolIdx <- match("ID", names(events)) obligColsIdx <- match(obligColsNames_events, names(events)) covarColsIdx <- setdiff(seq_along(events@data), c(IDcolIdx, obligColsIdx)) events <- events[c(IDcolIdx, obligColsIdx, covarColsIdx)] # Done. return(events) } ### CHECK FUNCTION FOR stgrid ARGUMENT IN as.epidataCS checkstgrid <- function (stgrid, T) { # Check class stopifnot(inherits(stgrid, "data.frame")) # Check obligatory columns autostop <- FALSE if (is.null(stgrid[["stop"]])) { if (is.null(T)) stop("'T' must be specified for auto-generation ", "of 'stop' column in 'stgrid'") stopifnot(isScalar(T)) autostop <- TRUE stgrid$stop <- NA_real_ } obligColsIdx <- match(obligColsNames_stgrid, names(stgrid), nomatch = NA_integer_) if (any(obligColsMissing <- is.na(obligColsIdx))) { stop("missing obligatory columns in 'stgrid': ", paste(obligColsNames_stgrid[obligColsMissing], collapse = ", ")) } # Check other columns on reserved names reservedColsIdx <- na.omit(match(reservedColsNames_stgrid, names(stgrid), nomatch=NA_integer_)) if (length(reservedColsIdx) > 0L) { warning("in 'stgrid', the existing columns with reserved names (", paste0("'", names(stgrid)[reservedColsIdx], "'", collapse=", "), ") have been replaced") stgrid <- stgrid[-reservedColsIdx] } # Transform tile into a factor variable # (also removing unused levels if it was a factor) cat("\tConverting 'tile' into a factor variable...\n") stgrid$tile <- factor(stgrid$tile) # Transform start times and area into numeric variables stgrid$start <- as.numeric(stgrid$start) stgrid$area <- as.numeric(stgrid$area) # Check stop times stgrid$stop <- if (autostop) { # auto-generate stop times from start times and T cat("\tAuto-generating 'stop' column...\n") starts <- sort(unique(stgrid$start)) if (T <= starts[length(starts)]) { stop("'T' must be larger than the last 'start' time in 'stgrid'") } stops <- c(starts[-1], T) stops[match(stgrid$start, starts)] } else { as.numeric(stgrid$stop) } # chronological data.frame of unique periods histIntervals <- unique(stgrid[c("start", "stop")]) histIntervals <- histIntervals[order(histIntervals[,1L]),] nBlocks <- nrow(histIntervals) if (!autostop) { # Check start/stop consistency cat("\tChecking start/stop consisteny...\n") if (any(histIntervals[,2L] <= histIntervals[,1L])) { stop("stop times must be greater than start times") } startStopCheck <- histIntervals[-1L,1L] != histIntervals[-nBlocks,2L] if (startStopCheckIdx <- match(TRUE, startStopCheck, nomatch = 0)) { stop("inconsistent start/stop times: time intervals not consecutive ", "at stop time ", histIntervals[startStopCheckIdx,2L]) } } # Add BLOCK id stgrid$BLOCK <- match(stgrid$start, histIntervals[,1L]) # Check that we have a full BLOCK x tile grid cat("\tChecking if the grid is rectangular (all time-space combinations)...\n") blocksizes <- table(stgrid$BLOCK) tiletable <- table(stgrid$tile) if (length(unique(blocksizes)) > 1L || length(unique(tiletable)) > 1L) { stop("'stgrid' is not a full grid") } # First column BLOCK, then obligCols, then remainders (endemic covariates) cat("\tSorting the grid by time and tile...\n") BLOCKcolIdx <- match("BLOCK", names(stgrid)) obligColsIdx <- match(obligColsNames_stgrid, names(stgrid)) covarColsIdx <- setdiff(seq_along(stgrid), c(BLOCKcolIdx, obligColsIdx)) stgrid <- stgrid[c(BLOCKcolIdx, obligColsIdx, covarColsIdx)] # Sort by BLOCK and tile stgrid <- stgrid[order(stgrid$BLOCK, stgrid$tile),] # # Get row indexes of the blocks' first/last rows # beginBlock <- match(seq_len(nBlocks), stgrid[["BLOCK"]]) # endBlock <- c(beginBlock[-1L]-1L, nrow(stgrid)) # Done. return(stgrid) } ### CONSTRUCT SPATIAL INFLUENCE REGIONS AROUND EVENTS # An influenceRegion is an object of class "owin" with origin # at the event (over which we have to integrate by a cubature rule) # An attribute "area" gives the area of the influenceRegion. # If it is actually a circular influence region, then there is an attribute # "radius" denoting the radius of the influence region. # Argument 'W' can be of class "owin" (preferred) or "SpatialPolygons" # (especially for clipper="rgeos") .influenceRegions <- function (events, W, npoly, maxExtent = NULL, clipper = "polyclip") { Wowin <- as(W, "owin") if (is.null(maxExtent)) maxExtent <- diameter.owin(Wowin) doIntersection <- switch( clipper, # which package to use for polygon intersection "polyclip" = function (center, eps) intersectPolyCircle.owin(Wowin, center, eps, npoly), "rgeos" = function (center, eps) as( intersectPolyCircle.SpatialPolygons( as(W, "SpatialPolygons"), center, eps, npoly), "owin"), stop("unsupported polygon clipping engine: '", clipper, "'") ) eventCoords <- coordinates(events) res <- mapply( function (x, y, eps, bdist) { center <- c(x,y) ## if eps is very large, the influence region is the whole region of W iR <- shift.owin( if (eps > maxExtent) Wowin else doIntersection(center, eps), -center) ## if iR is actually a circle of radius eps, attach eps as attribute attr(iR, "area") <- if (eps <= bdist) { attr(iR, "radius") <- eps pi * eps^2 } else area.owin(iR) iR }, eventCoords[,1], eventCoords[,2], events$eps.s, events$.bdist, SIMPLIFY = FALSE, USE.NAMES = FALSE) attr(res, "nCircle2Poly") <- npoly res } surveillance/R/twinstim_glm.R0000644000176000001440000000405212100254147016034 0ustar ripleyusers################################################################################ ### Part of the surveillance package, http://surveillance.r-forge.r-project.org ### Free software under the terms of the GNU General Public License, version 2, ### a copy of which is available at http://www.r-project.org/Licenses/. ### ### Formulation of an endemic-only twinstim as a pseudo Poisson-GLM ### ### Copyright (C) 2013 Sebastian Meyer ### $Revision: 484 $ ### $Date: 2013-01-24 16:51:02 +0100 (Don, 24 Jan 2013) $ ################################################################################ ### a type-independent endemic-only twinstim equals a weighted Poisson-GLM on ### the stgrid data with outcome nEvents/weights, and weights = K * dt * ds glm.epidataCS <- function (data, formula = NULL) { if (is.null(formula)) { formula <- as.formula(paste("~", paste(names(data$stgrid)[-c(1,3:5)], collapse="+") )) } else if ("1 | type" %in% attr(terms(formula), "term.labels")) { stop("type-specific endemic intercepts are currently not supported") ## if we had a type-specific model, we would have to set up a ## "stkappagrid", i.e. with nBlocks*nTiles*nTypes rows, and remove the ## factor nTypes from the weights } ## aggregated number of events in each cell of the stgrid eventsbycell <- c(table(with(data$events@data, interaction(tile, BLOCK, drop=FALSE, sep=".", lex.order=FALSE) ))) nEvents <- eventsbycell[paste(data$stgrid$tile, data$stgrid$BLOCK, sep=".")] nEvents[is.na(nEvents)] <- 0L stopifnot(sum(nEvents) == nrow(data$events)) ## weights nTypes <- nlevels(data$events$type) weights <- with(data$stgrid, nTypes * (stop-start) * area) ## Poisson-GLM environment(formula) <- environment() # -> nEvents and weights are visible glm(update(formula, nEvents/weights ~ .), data=data$stgrid, family=poisson, weights=weights) } surveillance/R/ks.plot.unif.R0000644000176000001440000001336012237000672015656 0ustar ripleyusers################# # Plot the empirical distribution function of a sample from U(0,1) # together with a confidence band of the corresponding K-S-test. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # # Parts of the code are taken from stats::ks.test, which has # copyright 1995-2012 by The R Core Team under GPL-2 (or later). # Furthermore, the C function calls are taken from # http://svn.r-project.org/R/trunk/src/library/stats/src/ks.c (as at 2012-08-16), # which similarly is Copyright (C) 1999-2009 by the R Core Team # and available under GPL-2. Somewhat disguised in their code is a reference # that parts of their code uses code published in # George Marsaglia and Wai Wan Tsang and Jingbo Wang (2003), # "Evaluating Kolmogorov's distribution". # Journal of Statistical Software, Volume 8, 2003, Issue 18. # URL: http://www.jstatsoft.org/v08/i18/. # # # Parameters: # U - numeric vector containing the sample (NA's are silently removed) # conf.level - confindence level for the K-S-test, # can also be a vector of multiple levels # exact - see ks.test # col.conf - colour of the confidence band # col.ref - colour of the reference line ################# ks.plot.unif <- function (U, conf.level = 0.95, exact = NULL, col.conf = "gray", col.ref = "gray", xlab = expression(u[(i)]), ylab = "Cumulative distribution") { stopifnot(is.vector(U, mode="numeric")) U <- U[!is.na(U)] n <- length(U) TIES <- FALSE if (anyDuplicated(U)) { warning("ties should not be present for the Kolmogorov-Smirnov test") TIES <- TRUE } if (is.null(exact)) exact <- (n < 100) && !TIES ## Helper function to invert the K-S test. The function ## pkolmogorov2x is the CDF of the Kolmogorov test statistic ## and is taken from the R project sources, which ## is (C) 1995-2009 by The R Core Team under GPL-2 f <- if (exact) { function (x, p) { # x is the test statistic PVAL <- 1 - .C("pkolmogorov2x", p = as.double(x), as.integer(n), PACKAGE = "surveillance")$p PVAL - p } } else { pkstwo <- function(x, tol = 1e-06) { # x is the test statistic ## stopifnot(length(x) == 1L) #Same copyright as above applies to the C code. if (is.na(x)) NA_real_ else if (x == 0) 0 else { .C("pkstwo", 1L, p = as.double(x), as.double(tol), PACKAGE = "surveillance")$p } } function (x, p) { PVAL <- 1 - pkstwo(sqrt(n) * x) PVAL - p } } ## Test inversion Dconf <- sapply(conf.level, function (level) { uniroot(f, lower=0, upper=1, p=1-level)$root }) ## Small helper function to draw a line myabline <- function (a, b, x.grid = seq(0,1,length.out=101), ...) { lines(x.grid, a + b * x.grid, ...) } ## Figure 10 in Ogata (1988) plot(c(0,1), c(0,1), type="n", xlab=xlab, ylab=ylab) myabline(a=0, b=1, col=col.ref, lwd=2) rug(U) lines(ecdf(U), verticals=TRUE, do.points=FALSE) sapply(Dconf, function (D) { myabline(a=D, b=1, col=col.conf, lty=2) myabline(a=-D, b=1, col=col.conf, lty=2) }) #legend(x="topleft", col=col.conf, lty=2, # legend=paste(100*conf.level,"% KS error bounds", sep="")) invisible() } ###################################################################### # Check the residual process of fitted twinstim or twinSIR # using ks.plot.unif on 1-exp(-diff(tau)) # and a scatterplot of u_i vs. u_{i+1} to inspect serial correlation # # Parameters: # object - a fitted twinSIR or twinstim model # # Draws the ECDF of the transformed residuals together with backtransformed # 95% Kolmogorov-Smirnov error bounds. ###################################################################### checkResidualProcess <- function (object, plot = 1:2, mfrow = n2mfrow(length(plot)), ...) { stopifnot(inherits(object, c("twinSIR", "twinstim"))) ## check plot argument if (is.logical(plot)) plot <- which(rep(plot, length.out = 2)) else { stopifnot(is.vector(plot, mode="numeric"), plot %in% 1:2) } ## extract residual process tau <- do.call("residuals", args = list(substitute(object)), envir = parent.frame()) ## Transform to uniform variable Y <- diff(c(0,tau)) U <- 1 - exp(-Y) ## Calculate KS test ks <- ks.test(U, "punif", alternative = "two.sided", exact = match.call()[["exact"]]) ## return value ret <- list(tau=tau, U=U, ks=ks) ## 2 types of plots plotcalls <- alist( ## Investigate uniform distribution of U ks.plot.unif(U, ...), ## Investigate serial correlation between U_t and U_{t+1} which ## corresponds to Figure 11 in Ogata (1988) plot(tail(U,n=-1), head(U,n=-1), xlab=expression(u[(i)]), ylab=expression(u[i+1])) ) ## eval selected plot calls if (length(plot) > 0L) { opar <- par(mfrow = mfrow); on.exit(par(opar)) for (i in plot) eval(plotcalls[[i]]) invisible(ret) } else { ret } } surveillance/R/hhh4_methods.R0000644000176000001440000002517412242522435015712 0ustar ripleyusersprint.ah4 <- function (x, digits = max(3, getOption("digits") - 3),reparamPsi=TRUE, ...) { if(!x$convergence) cat('Results are not reliable! Try different starting values. \n') else { if(!is.null(x$call)){ cat("\nCall: \n", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") } if (length(ranef(x))) { cat('Random effects: \n') V <- as.matrix(round(diag(getCov(x)),digits=digits)) corr <- round(getCov(x),digits=digits) corr[upper.tri(corr,diag=TRUE)] <- "" V.corr <- cbind(V,corr) colnames(V.corr) <- c("Var","Corr",rep("",ncol(V.corr)-2)) print(noquote(V.corr)) cat("\nFixed effects:\n") print.default(format(fixef(x, reparamPsi=TRUE,...), digits = digits), print.gap = 2, quote = FALSE) } else if (length(fixef(x))) { cat("Coefficients:\n") print.default(format(fixef(x, reparamPsi=TRUE,...), digits = digits), print.gap = 2, quote = FALSE) } else cat("No coefficients\n") cat("\n") invisible(x) } } summary.ah4 <- function(object, ...){ # do not summarize results in case of non-convergence if(!object$convergence){ cat('Results are not reliable! Try different starting values. \n') return(invisible(object)) } ret <- object[c("call","convergence","dim","loglikelihood","margll","nTime","nUnit")] # get estimated covariance matrix of random effects if(object$dim["random"]>0){ REmat <- object$Sigma attr(REmat, "correlation") <- cov2cor(REmat) attr(REmat, "sd") <- sqrt(diag(REmat)) rownames(REmat) <- colnames(REmat) <- gsub("sd.", "", names(object$Sigma.orig))[grep("sd.", names(object$Sigma.orig))] aic <- NULL bic <- NULL } else{ REmat <- NULL aic <- AIC(object) bic <- AIC(object,k=log(object$nObs)) } fe <- fixef(object,se=TRUE, ...) re <- ranef(object) ret <- c(ret, list(fixef=fe, ranef=re, REmat=REmat, AIC=aic, BIC=bic)) class(ret) <- "summary.ah4" return(ret) } print.summary.ah4 <- function(x, digits = max(3, getOption("digits") - 3), ...){ if(!x$convergence){ cat('Results are not reliable! Try different starting values. \n') invisible(x) } else { if(!is.null(x$call)){ cat("\nCall: \n", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") } if(x$dim["random"]>0){ cat('Random effects: \n') V <- as.matrix(round(diag(x$REmat),digits=digits)) corr <- round(attr(x$REmat, "correlation"),digits=digits) corr[upper.tri(corr,diag=TRUE)] <- "" V.corr <- cbind(V,corr) colnames(V.corr) <- c("Var","Corr",rep("",ncol(V.corr)-2)) print(noquote(V.corr)) } cat('\nFixed effects: \n') print(round(x$fixef,digits=digits),print.gap=2) if(x$dim["random"]==0){ cat('\nlog-likelihood: ',round(x$loglikelihood,digits=digits-2),'\n') cat('AIC: ',round(x$AIC,digits=digits-2),'\n') cat('BIC: ',round(x$BIC,digits=digits-2),'\n\n') } else { cat('\npenalized log-likelihood: ',round(x$loglikelihood,digits=digits-2),'\n') cat('marginal log-likelihood: ',round(x$margll,digits=digits-2),'\n\n') } cat('Number of units: ',x$nUnit,'\n') cat('Number of time points: ',x$nTime,'\n\n') if(any(x$fixef[,"Estimates"]== -20)){ cat("Warning: coefficients \'",rownames(x$fixef)[x$fixef[,"Estimates"]==-20] ,"\' could not be estimated accurately\n\n") } } invisible(x) } logLik.ah4 <- function(object,...){ if(!object$convergence) stop("algorithm did not converge\n") val <- object$loglikelihood if(object$dim["random"]==0){ attr(val, "df") <- length(coef(object)) attr(val, "nobs") <- object$nObs class(val) <- "logLik" } return(val) } AIC.ah4 <- function (object, ..., k = 2) { if(object$dim["random"]==0){ NextMethod("AIC") } else { warning("AIC not well defined for models with random effects") NA_real_ } } coef.ah4 <- function(object, se=FALSE, reparamPsi=TRUE, idx2Exp=NULL, amplitudeShift=FALSE, ...) { coefs <- object$coefficients stdErr <- object$se if(reparamPsi && object$control$family!="Poisson"){ #extract psi coefficients index <- grep("-log(overdisp",names(coefs), fixed=TRUE) if (length(index) == 0L) { # backward compatibility (internal psi coef # was named "overdisp" prior to r406) index <- grep("^overdisp", names(coefs)) } else { psi.names <- names(coefs)[index] # change labels from "-log(overdisp.xxx)" to "overdisp.xxx" names(coefs)[index] <- substr(psi.names, start=6, stop=nchar(psi.names)-1) } #transform psi coefficients coefs[index] <- exp(-coefs[index]) # se's using Delta rule: se[h(psi)] = se[psi] * |h'(psi)| # h = exp(-psi), h' = -exp(-psi) D <- diag(coefs[index],length(index)) stdErr[index] <- sqrt(diag(D %*% object$cov[index,index] %*% t(D))) } if(!is.null(idx2Exp)){ # extract coefficients on log-scale exp.names <- names(coefs)[idx2Exp] # change labels names(coefs)[idx2Exp] <- paste("exp(",exp.names,")",sep="") # transform coefs[idx2Exp] <- exp(coefs[idx2Exp]) D <- diag(coefs[idx2Exp],length(idx2Exp)) stdErr[idx2Exp] <- sqrt(diag(D %*% object$cov[idx2Exp,idx2Exp] %*% t(D))) } if(amplitudeShift){ indexAS <- sort(c(grep(c(".sin"),names(coefs),fixed=TRUE),grep(c(".cos"),names(coefs),fixed=TRUE))) namesSinCos <- names(coefs)[indexAS] namesSinCos <- gsub(".sin",".A",namesSinCos) namesSinCos <- gsub(".cos",".s",namesSinCos) names(coefs)[indexAS] <- namesSinCos coefs[indexAS] <- sinCos2amplitudeShift(coefs[indexAS]) D <- jacobianAmplitudeShift(coefs[indexAS]) cov <- D %*% object$cov[indexAS,indexAS] %*% t(D) stdErr[indexAS] <- sqrt(diag(cov)) } if(se) return(cbind("Estimates"=coefs,"Std. Error"=stdErr)) else return(coefs) } fixef.ah4 <- function(object,...){ if(object$dim[1]>0){ return(head(coef(object,...), object$dim[1])) } else return(NULL) } ranef.ah4 <- function(object, tomatrix = FALSE, ...){ if(object$dim[2]>0){ ranefvec <- tail(coef(object,...), object$dim[2]) } else return(NULL) if (!tomatrix) return(ranefvec) ## transform to a nUnits x c matrix (c %in% 1:3) model <- interpretControl(object$control,object$stsObj) idxRE <- model$indexRE idxs <- unique(idxRE) names(idxs) <- model$namesFE[idxs] mat <- sapply(idxs, function (idx) { RE <- ranefvec[idxRE==idx] Z <- model$terms["Z.intercept",][[idx]] "%m%" <- get(model$terms["mult",][[idx]]) Z %m% RE }) rownames(mat) <- colnames(model$response) return(mat) } confint.ah4 <- function (object, parm, level = 0.95, reparamPsi = TRUE, idx2Exp = NULL, amplitudeShift = FALSE, ...) { cf <- coef(object, reparamPsi=reparamPsi, idx2Exp=idx2Exp, amplitudeShift=amplitudeShift, se=TRUE) pnames <- rownames(cf) if (missing(parm)) parm <- pnames else if (is.numeric(parm)) parm <- pnames[parm] a <- (1 - level)/2 a <- c(a, 1 - a) pct <- paste(format(100 * a, trim = TRUE, scientific = FALSE, digits = 3),"%") fac <- qnorm(a) ci <- array(NA, dim = c(length(parm), 2L), dimnames = list(parm, pct)) ses <- cf[parm,2] ci[] <- cf[parm,1] + ses %o% fac ci } ## mean predictions for a subset of 1:nrow(object$stsObj) predict.ah4 <- function(object, newSubset=control$subset, type="response", ...) { control <- object$control if (type == "response" && all((m <- match(newSubset, control$subset, nomatch=0L)) > 0)) { ## we can extract fitted means from object object$fitted.values[m,,drop=FALSE] } else { ## means for time points not fitted (not part of control$subset) data <- object$stsObj coefs <- coef(object, reparamPsi=FALSE) model <- interpretControl(control, data) predicted <- meanHHH(coefs, model, subset=newSubset) if (type=="response") predicted$mean else { type <- match.arg(type, names(predicted)) predicted[[type]] } } } # plot estimated mean # this needs to be made more customizable plot.ah4 <- function(x, i=1, m=NULL, ylim=NULL, ylab="No. infected", xlab="", title=NULL, col=c("grey30","grey60","grey85"), border=col, cex=.6, pch=19, hide0s=FALSE, legend=FALSE, ...) { stopifnot(length(i) == 1) if(is.character(i) && is.na(i <- match(.i <- i, colnames(x$stsObj)))) stop("region '", .i, "' does not exist") if(is.null(title)) title <- colnames(x$stsObj)[i] obs <- observed(x$stsObj)[x$control$subset,i] if(is.null(ylim)) ylim <- c(0, max(obs,na.rm=TRUE)) start <- x$stsObj@start start[2] <- start[2]+1 plot(ts(obs,frequency=x$stsObj@freq,start=start), ylim=ylim,ylab=ylab,type="n",las=1,xlab=xlab) title(main=title,line=0.5) if(is.null(m)) m <- meanHHH(coef(x,reparamPsi=FALSE),interpretControl(x$control,x$stsObj)) m$endemic[is.na(m$mean)] <- 0 m$epi.own[is.na(m$mean)] <- 0 m$mean[is.na(m$mean)] <- 0 tp <- (1:(length(obs)))/x$stsObj@freq +x$stsObj@start[1] + x$stsObj@start[2]/x$stsObj@freq if(!is.null(dim(as.matrix(m$epidemic)))) { # FIXME: will this ever be FALSE? polygon(c(tp[1],tp,tail(tp,1)),c(0,as.matrix(m$mean)[,i],0),col=col[1],border=border[1]) if(!is.null(dim(m$epi.own))) polygon(c(tp[1],tp,tail(tp,1)),c(0,as.matrix(m$endemic)[,i]+as.matrix(m$epi.own)[,i],0),col=col[2],border=border[2]) } polygon(c(tp[1],tp,tail(tp,1)),c(0,as.matrix(m$endemic)[,i],0),col=col[3],border=border[3]) ptidx <- if (hide0s) obs > 0 else TRUE points(tp[ptidx],obs[ptidx],pch=pch,cex=cex) if(legend){ legend("topright", bty="n", legend=c("observed","ne","ar","end"), pch=c(pch,rep(NA,3)), lty=c(NA,rep(1,3)), lwd=8, pt.lwd=1, col=c(1,col)) } } ### refit hhh4-model ## ...: arguments modifying the original control list ## subset.upper: refit on a subset of the data up to that time point ## use.estimates: use fitted parameters as new start values ## (only applicable if same model) update.ah4 <- function (object, ..., subset.upper=NULL, use.estimates=FALSE) { control <- object$control control <- modifyList(control, list(...)) if (isScalar(subset.upper)) control$subset <- control$subset[control$subset <= subset.upper] if (use.estimates) control$start <- ah4coef2start(object) hhh4(object$stsObj, control) } ## convert fitted parameters from "ah4" to list suitable for control$start ah4coef2start <- function (fit) list(fixed = fixef(fit, reparamPsi=FALSE), random = ranef(fit, reparamPsi=FALSE), sd.corr = getSdCorr(fit)) surveillance/R/zzz.R0000644000176000001440000000453712237005356014173 0ustar ripleyusers####################################### ### Hook functions for package start-up ####################################### gpclibCheck <- function (fatal = TRUE) { gpclibOK <- surveillance.options("gpclib") if (!gpclibOK && fatal) { message("Note: The gpclib license is accepted by ", sQuote("surveillance.options(gpclib=TRUE)"), ".") stop("acceptance of the gpclib license is required") } gpclibOK } .onLoad <- function (libname, pkgname) { ## initialize options reset.surveillance.options() } .onAttach <- function (libname, pkgname) { ## Startup message VERSION <- packageVersion(pkgname, lib.loc=libname) packageStartupMessage("This is ", pkgname, " ", VERSION, ". ", "For overview type ", sQuote(paste0("help(", pkgname, ")")), ".") ## decide if we should run all examples (some take a few seconds) allExamples <- if (interactive()) TRUE else { .withTimings <- Sys.getenv("_R_CHECK_TIMINGS_") withTimings <- !is.na(.withTimings) && nzchar(.withTimings) !withTimings } surveillance.options(allExamples = allExamples) } ### Function 'base::rep_len' only exists as of R version 3.0.0 ### Define it as a wrapper for base::rep() for older versions if (getRversion() < "3.0.0" || !exists("rep_len", baseenv())) { rep_len <- function (x, length.out) rep(x, length.out=length.out) } ########################### ### Little helper functions ########################### ### checking if x is scalar, i.e. a numeric vector of length 1. isScalar <- function (x) { length(x) == 1L && is.vector(x, mode = "numeric") } ### _c_onditional lapply, which only uses lapply() if X really is a list object ### and otherwise applies FUN to X. The result is always a list (of length 1 in ### the latter case). Used for neOffset in hhh4 models. clapply <- function (X, FUN, ...) { if (is.list(X)) lapply(X, FUN, ...) else list(FUN(X, ...)) } ### pretty p-value formatting formatPval <- function (pv, eps = 1e-4) { format1 <- function (p) format.pval(p, digits = if (p<10*eps) 1 else 2, eps = eps) sapply(pv, format1) } ### quantile function of the Lomax distribution ### we could also use VGAM::qlomax (but this would be slightly slower) qlomax <- function (p, scale, shape) { scale * ((1-p)^(-1/shape) - 1) } surveillance/R/testcalls.R0000644000176000001440000000413011731650466015327 0ustar ripleyusers################################################### ### chunk number 1: ################################################### test <- function(data = c("k1", "m5"), range = 157:339){ res <- list() for(i in data){ disProgObj <- readData(i,week53to52=TRUE) disProgObj <- enlargeData(disProgObj) survResults <- algo.call(disProgObj, control = list( list(funcName = "rki1", range = range), list(funcName = "rki2", range = range), list(funcName = "rki3", range = range), list(funcName = "bayes", range = range,alpha=0.05))) res[[i]] <- algo.compare(survResults) cat("\n\n\n", i, " Res:\n") print(compMatrix.writeTable(res[[i]])) } sum <- algo.summary(res) cat("\n\nSummary:\n") print(compMatrix.writeTable(sum)) } ################################################### ### chunk number 2: ################################################### testSim <- function(p = 0.99, r = 0.01, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K, range = 200:400){ disProgObj <- sim.pointSource(p, r, length, A, alpha, beta, phi, frequency, state, K) survResults <- algo.call(disProgObj, control = list(list(funcName = "rki1", range = range))) res <- algo.compare(survResults) plot(survResults[[1]], "RKI 1", "Simulation") print(compMatrix.writeTable(res)) } ################################################### ### chunk number 3: ################################################### makePlot <- function(outputpath, data = "k1", method = "rki1", name, disease, range = 157:339){ disProgObj <- readData(data,week53to52=TRUE) disProgObj <- enlargeData(disProgObj) res <- algo.call(disProgObj, control = list(list(funcName = method, range = range))) pdf(paste(outputpath, data, "_", method, "_plot.pdf", sep=""), width = 10) plot(res[[1]],name,disease) dev.off() } surveillance/R/algo_hhh.R0000644000176000001440000016445512024073436015113 0ustar ripleyusers################################################### ### chunk number 1: ################################################### # lag - which lag for observation-driven part? # y_i,t = lambda*y_i,t-lag NOTE: lag=-1 means y_i,t+1 # lag.range =c(lag.neg, lag.pos) # i.e. (1,0) for t-1,t (DEFAULT) # (2,2) for t-2,t-1,t,t+1,t+2 algo.hhh <- function(disProgObj, control=list(lambda=TRUE, neighbours=FALSE, linear=FALSE, nseason=0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"), lag.range=NULL), thetastart=NULL, verbose=TRUE){ #Convert sts objects if (class(disProgObj) == "sts") disProgObj <- sts2disProg(disProgObj) #set default values (if not provided in control) if(is.null(control[["linear",exact=TRUE]])) control$linear <- FALSE if(is.null(control[["nseason",exact=TRUE]])) control$nseason <- 0 if(is.null(control[["neighbours",exact=TRUE]])) control$neighbours <- NA if(is.null(control[["negbin",exact=TRUE]])) control$negbin <- "none" if(is.null(control[["lambda",exact=TRUE]])) control$lambda <- 1 if(is.null(control[["proportion",exact=TRUE]])) control$proportion <- "none" control$negbin <- match.arg(control$negbin, c("single","multiple","none")) control$proportion <- match.arg(control$proportion, c("single","multiple","none")) # convert logical values to numerical values, FALSE corresponds to NA # to allow for lag == 0 if(is.logical(control[["lambda", exact=TRUE]])){ control$lambda <- as.numeric(control$lambda) control$lambda[control$lambda==0] <- NA } if(is.logical(control[["neighbours", exact=TRUE]])){ control$neighbours <- as.numeric(control$neighbours) control$neighbours[control$neighbours==0] <- NA } # determine range of observations y_i,t if(is.null(control[["lag.range",exact=TRUE]])){ lags <- c(control$lambda, control$neighbours) control$lag.range <- c(max(c(lags,1),na.rm=TRUE), max(c(-lags,0), na.rm=TRUE)) } # check if observed is a vector and convert to matrix if necessary if(is.vector(disProgObj$observed)) disProgObj$observed <- as.matrix(disProgObj$observed) n <- nrow(disProgObj$observed) nareas <- ncol(disProgObj$observed) #univariate if(nareas ==1){ control$neighbours <- NA control$proportion <- "none" control$nseason <- control$nseason[1] } # model with (lambda, pi) ? if(control$proportion != "none"){ control$neighbours <- NA # no lambda specified or lambda not specified for each area if(sum(!is.na(control$lambda)) == 0 | sum(!is.na(control$lambda))!= nareas) control$lambda <- 1 } # check neighbourhood matrix if neighbours=TRUE or proportion!="none" if(sum(!is.na(control$neighbours))>0 | control$proportion != "none"){ # is there a neighbourhood matrix? if(is.null(disProgObj$neighbourhood)) stop("No neighbourhood matrix is provided\n") if(any(is.na(disProgObj$neighbourhood))) stop("No correct neighbourhood matrix given\n") } #make "design" matrices designRes<- make.design(disProgObj=disProgObj, control=control) # check if there are neighbours if(designRes$dim$phi > 0){ nOfNeighbours <- designRes$nOfNeighbours if((designRes$dim$phi==1) & (sum(nOfNeighbours)==0)) stop("Specified model is not in line with neighbourhood matrix\n") # if((designRes$dim$phi==nareas) & (any(nOfNeighbours[!is.na(control$neighbours)]==0))) if((length(control$neighbours) == nareas) & (any(nOfNeighbours[!is.na(control$neighbours)]==0))) stop("Specified model is not in line with neighbourhood matrix\n") } else if(designRes$dim$proportion > 0){ nOfNeighbours <- designRes$nOfNeighbours if((designRes$dim$proportion==1) & (sum(nOfNeighbours)==0)) stop("Specified model is not in line with neighbourhood matrix\n") if((designRes$dim$proportion==nareas) & (any(nOfNeighbours==0))) stop("Specified model is not in line with neighbourhood matrix\n") } dimtheta <- designRes$dimTheta$dim dimLambda <- designRes$dimTheta$lambda dimPhi <- designRes$dimTheta$phi #starting values for optim areastart <- log(colMeans(designRes$Y)/designRes$populationFrac[1,]) if(!is.null(thetastart)){ #check dimension of thetastart # must be either of length dimtheta or of length dimtheta-nareas if(all(length(thetastart) != c(dimtheta, dimtheta-nareas)) ){ cat('thetastart must be of length', dimtheta, 'or ',dimtheta-nareas,'\n') return(NULL) } theta <- thetastart if(length(theta) == dimtheta) areastart <- NULL } else { #set starting values for theta #lambda = log(0.5), phi = log(0.1), beta = gamma = delta = 0, psi = 1 theta <- c(rep(log(0.5),designRes$dimTheta$lambda), rep(log(0.1),designRes$dimTheta$phi), rep(0.5,designRes$dimTheta$proportion), rep(0, designRes$dimTheta$trend + designRes$dimTheta$season), rep(2,designRes$dimTheta$negbin) ) } #starting values for intercepts if(!is.null(areastart)){ if(dimLambda + dimPhi >0){ #cat("theta",theta[1:(dimLambda + dimPhi)],"\n") Lambda <- getLambda(theta[1:(dimLambda + dimPhi)], designRes) expAlpha <- expAlpha.mm(Lambda,designRes$Y) expAlpha[expAlpha <=0] <- (colMeans(designRes$Y)/designRes$populationFrac[1,])[expAlpha <=0] areastart <- log(expAlpha) #areastart <- log(expAlpha.mm(Lambda,designRes$Y)) } theta <- c(areastart,theta) #cat("initial values",theta,"\n") } #check if initial values are valid mu<-meanResponse(theta,designRes)$mean if(any(mu==0) | any(!is.finite(mu))) stop("invalid initial values\n") # maximize loglikelihood mycontrol <- list(fnscale=-1, type=3, maxit=1000) suppressWarnings(myoptim <- optim(theta, fn=loglikelihood, gr=gradient, control=mycontrol, method="BFGS", hessian=TRUE, designRes=designRes)) if(myoptim$convergence==0){ convergence <- TRUE } else { if(verbose) cat("Algorithm has NOT converged. \n") res <- list(convergence=FALSE) class(res) <- "ah" return(res) } loglik <- myoptim$value if(loglik==0){ if(verbose){ cat('loglikelihood = 0\n') cat('Results are not reliable! Try different starting values. \n') } res <- list(convergence=FALSE) class(res) <- "ah" return(res) } thetahat <- myoptim$par fisher <- -myoptim$hessian # fitted values fitted <- meanResponse(thetahat,designRes)$mean #psi, lambda and phi are on log-scale #-> transformation of estimates, standard errors and fisher (using delta rule) #labels for results D <- jacobian(thetahat, designRes)$D thetahat <- jacobian(thetahat, designRes)$theta #Approximation to the inverted fisher info matrix # cov <- try(D %*% solve(fisher) %*% D, silent=TRUE) cov <- try(D %*% solve(fisher) %*% t(D), silent=TRUE) #fisher info is singular if(class(cov) == "try-error"){ if(verbose){ cat("Fisher info singular \t loglik=",loglik," \n") cat("theta",round(thetahat,2),"\n") cat('Results are not reliable! Try different starting values. \n') } res <- list(convergence=FALSE) class(res) <- "ah" return(res) } if(any(!is.finite(diag(cov))) | any(diag(cov)<0)){ if(verbose){ cat("infinite or negative cov\t loglik=",loglik,"\n") cat("theta",round(thetahat,2),"\n") cat('Results are not reliable! Try different starting values. \n') } res <- list(convergence=FALSE) class(res) <- "ah" return(res) } se <- sqrt(diag(cov)) if(convergence & verbose) cat("Algorithm claims to have converged \n") result <- list(coefficients=thetahat, se=se, cov=cov, call=match.call(), loglikelihood=loglik, convergence=convergence, fitted.values=fitted, control=control,disProgObj=disProgObj, lag=designRes$lag, nObs=designRes$nObs) class(result) <- "ah" return(result) } ################################################### ### chunk number 2: ################################################### algo.hhh.grid <- function(disProgObj, control=list(lambda=TRUE,neighbours=FALSE, linear=FALSE, nseason=0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"),lag.range=NULL), thetastartMatrix, maxTime=1800, verbose=FALSE){ #convert disProgObj if necessary if (class(disProgObj) == "sts") disProgObj <- sts2disProg(disProgObj) #set default values (if not provided in control) if(is.null(control[["linear",exact=TRUE]])) control$linear <- FALSE if(is.null(control[["nseason",exact=TRUE]])) control$nseason <- 0 if(is.null(control[["neighbours",exact=TRUE]])) control$neighbours <- NA if(is.null(control[["negbin",exact=TRUE]])) control$negbin <- "none" if(is.null(control[["lambda",exact=TRUE]])) control$lambda <- 1 if(is.null(control[["proportion",exact=TRUE]])) control$proportion <- "none" control$negbin <- match.arg(control$negbin, c("single","multiple","none")) control$proportion <- match.arg(control$proportion, c("single","multiple","none")) # convert logical values to numerical values, FALSE corresponds to NA # to allow for lag == 0 if(is.logical(control[["lambda", exact=TRUE]])){ control$lambda <- as.numeric(control$lambda) control$lambda[control$lambda==0] <- NA } if(is.logical(control[["neighbours", exact=TRUE]])){ control$neighbours <- as.numeric(control$neighbours) control$neighbours[control$neighbours==0] <- NA } # determine range of observations y_i,t if(is.null(control[["lag.range",exact=TRUE]])){ lags <- c(control$lambda, control$neighbours) control$lag.range <- c(max(c(lags,1),na.rm=TRUE), max(c(-lags,0), na.rm=TRUE)) } n <- nrow(disProgObj$observed) nareas <- ncol(disProgObj$observed) # check parameter specification for season #univariate if(nareas ==1){ control$neighbours <- NA control$proportion <- "none" control$nseason <- control$nseason[1] } # model with (lambda, pi) ? if(control$proportion != "none"){ control$neighbours <- NA # no lambda specified or lambda not specified for each area if(sum(!is.na(control$lambda)) == 0 | sum(!is.na(control$lambda))!= nareas) control$lambda <- 1 } # check neighbourhood matrix if neighbours=TRUE or proportion!="none" if(sum(!is.na(control$neighbours))>0 | control$proportion != "none"){ if(any(is.na(disProgObj$neighbourhood))) stop("No correct neighbourhood matrix given\n") } designRes<- make.design(disProgObj=disProgObj, control=control) # check if there are neighbours if(designRes$dim$phi > 0){ nOfNeighbours <- designRes$nOfNeighbours if((designRes$dim$phi==1) & (sum(nOfNeighbours)==0)) stop("Specified model is not in line with neighbourhood matrix\n") # if((designRes$dim$phi==nareas) & (any(nOfNeighbours[!is.na(control$neighbours)]==0))) if((length(control$neighbours) == nareas) & (any(nOfNeighbours[!is.na(control$neighbours)]==0))) stop("Specified model is not in line with neighbourhood matrix\n") } else if(designRes$dim$proportion > 0){ nOfNeighbours <- designRes$nOfNeighbours if((designRes$dim$proportion==1) & (sum(nOfNeighbours)==0)) stop("Specified model is not in line with neighbourhood matrix\n") if((designRes$dim$proportion==nareas) & (any(nOfNeighbours==0))) stop("Specified model is not in line with neighbourhood matrix\n") } dimthetaStart <- designRes$dimTheta$dim -nareas if(dimthetaStart == 0){ #only intercepts, grid search not necessary return(algo.hhh(disProgObj=disProgObj,control=control)) } #check dimension of thetastartMatrix if(!is.matrix(thetastartMatrix)){ cat('thetastart must be a matrix with', designRes$dimTheta$dim, 'or ', dimthetaStart, 'columns\n') return(NULL) } if(all(ncol(thetastartMatrix) != c(designRes$dimTheta$dim, dimthetaStart))){ cat('thetastart must be a matrix with', designRes$dimTheta$dim, 'or ', dimthetaStart,'columns\n') return(NULL) } #try multiple starting values and return the result with highest likelihood #stop search once time limit is exceeded i<-0 nOfIter <- nrow(thetastartMatrix) gridUsed <- nOfIter if(verbose) cat('The size of grid is', nOfIter, '\n') bestLoglik <- list(loglikelihood = -1e99) allLoglik <- matrix(NA,nrow=nOfIter,ncol=designRes$dimTheta$dim+1) time <- maxTime while((time > 0) & (i < nOfIter)){ i <- i+1 #run algo.hhh with the i-th row of thetastartMatrix as initial values time.i <- system.time(res<-try(algo.hhh(disProgObj=disProgObj,control=control,thetastart=thetastartMatrix[i,],verbose=verbose),silent=!verbose))[3] #how much time is left now time <- time - time.i #print progress information if(verbose){ if(class(res)== "try-error") print(c(niter=i,timeLeft=time,loglik=NULL)) else print(c(niter=i,timeLeft=time,loglik=res$loglikelihood)) } #don't consider "useless" results for the search of the best loglikelihood if(class(res)!= "try-error" && res$convergence){ #save loglik allLoglik[i,] <- c(res$loglikelihood,coef(res)) #keep it as bestLoglik if loglikelihood improved if(res$loglikelihood > bestLoglik$loglikelihood){ bestLoglik <- res } } } if(time < 0){ if(verbose) cat('Time limit exceeded, grid search stopped after', i, 'iterations. \n') allLoglik <- as.matrix(allLoglik[1:i,]) gridUsed <- i } timeUsed <- ifelse(time>0, maxTime-time,maxTime+abs(time)) #algo.hhh did not converge or produced useless results for all starting values, #i.e. there is no result if(is.null(coef(bestLoglik))) { #convergence <- FALSE #cat('Algorithms did not converge, please try different starting values! \n') bestLoglik <- list(loglikelihood=NULL,convergence=FALSE) } else{ #give names to all Loglik-matrix colnames(allLoglik) <- c("loglik",names(coef(bestLoglik))) } result <- list(best = bestLoglik, allLoglik = allLoglik,gridSize=nOfIter,gridUsed=gridUsed, time=timeUsed,convergence=bestLoglik$convergence) class(result) <- "ahg" return(result) } ################################################### ### chunk number 3: ################################################### create.grid <- function(disProgObj, control, params = list(epidemic = c(0.1, 0.9, 5), endemic=c(-0.5,0.5,3), negbin = c(0.3, 12, 10))) { #convert S4 sts to S3 if necessary if (class(disProgObj) == "sts") disProgObj <- sts2disProg(disProgObj) designRes <- make.design(disProgObj, control) control <- designRes$control dimParams <- designRes$dimTheta dimLambda <- dimParams$lambda dimPhi <- dimParams$phi dimProp <- dimParams$proportion dimEndemic <- dimParams$trend + dimParams$season dimNegbin <- dimParams$negbin # check if initial values are provided if((dimLambda +dimPhi > 0) & is.null(params$epidemic)) stop("Please provide initial values for the epidemic component \n") if((dimEndemic > 0) & is.null(params$endemic)) stop("Please provide initial values for the endemic component \n") if((dimNegbin > 0) & is.null(params$negbin)) stop("Please provide initial values for the dispersion parameter psi \n") # check if initial values are specified correctly if(!is.null(params$epidemic)){ if( params$epidemic[3]%%1 !=0 | params$epidemic[3]<1 | sign(params$epidemic[3])== -1) stop("Last component of params$epidemic must be a positive integer\n") } if(!is.null(params$endemic)){ if( params$endemic[3]%%1 !=0 | params$endemic[3]<1 | sign(params$endemic[3])== -1) stop("Last component of params$endemic must be a positive integer\n") } if(!is.null(params$negbin)){ if( params$negbin[3]%%1 !=0 | params$negbin[3]<1 | sign(params$negbin[3])== -1) stop("Last component of params$negbin must be a positive integer\n") } grid <- list() if(dimNegbin >0){ psi <- seq(params$negbin[1], params$negbin[2], length = params$negbin[3]) if(any(psi<=0)) stop("Initial values for psi must be positive\n") log.psi <- log(psi[psi >0]) grid$psi <- log.psi } if(dimLambda >0){ epidemic <- seq(params$epidemic[1], params$epidemic[2], length = params$epidemic[3]) if(any(epidemic<=0)) stop("Iinitial values for lambda must be positive\n") log.lambda <- log(epidemic[epidemic >0]) grid$lambda <- log.lambda } if(dimPhi >0){ epidemic <- seq(params$epidemic[1], params$epidemic[2], length = params$epidemic[3]) if(any(epidemic<=0)) stop("Initial values for phi must be positive\n") log.lambda <- log(epidemic[epidemic >0]) grid$phi <- log.lambda } if(dimProp >0){ if(any(epidemic<=0 | epidemic >=1)) stop("initial values for pi must be in (0,1)\n") logit.prop <- log(epidemic[epidemic > 0 & epidemic < 1]) - log(1-epidemic[epidemic > 0 & epidemic < 1]) grid$prop <- logit.prop } if(dimEndemic >0){ endemic <- seq(params$endemic[1], params$endemic[2], length = params$endemic[3]) grid$endemic <- endemic } grid <- expand.grid(grid) grid <- as.matrix( grid[c(rep("lambda",dimLambda), rep("phi",dimPhi), rep("prop",dimProp), rep("endemic",dimEndemic), rep("psi",dimNegbin))] ) gridSize <- nrow(grid) cat("Matrix with ",gridSize, " initial values\n") return(grid) } ################################################### ### chunk number 4: ################################################### loglikelihood <- function(theta, designRes){ control <- designRes$control Y <- designRes$Y mean <- meanResponse(theta=theta, designRes=designRes)$mean dimNegbin <- designRes$dimTheta$negbin dimTheta <- designRes$dimTheta$dim #loglikelihood poisson if(dimNegbin==0){ result <- colSums(dpois(Y, lambda=mean, log=TRUE)) } else if(dimNegbin==1){ #loglikelihood negbin #ensure psi (on last position in vector theta) ist positive psi <- exp(theta[dimTheta]) result <- colSums(dnbinom(Y, size=psi, mu=mean, log=TRUE)) } else if(dimNegbin>1){ #loglikelihood negbin, multiple dispersion params #ensure psi (on last positions) is positive psi <- exp(theta[(dimTheta-dimNegbin+1):dimTheta]) psi <- matrix(psi,ncol=dimNegbin, nrow=nrow(Y), byrow=TRUE) result <- colSums(dnbinom(Y, size=psi, mu=mean, log=TRUE)) } res <- sum(result) attr(res, "colsums") <- result return(res) } ################################################### ### chunk number 5: ################################################### meanResponse <- function(theta, designRes){ # unpack design matrices Y <- designRes$Y nareas <- ncol(Y) n <- nrow(Y) X.trendSeason <- designRes$X.trendSeason Ym1 <- designRes$Ym1 Ym1.neighbours <- designRes$Ym1.neighbours nhood <- designRes$disProgObj$neighbourhood nOfNeighbours <- designRes$nOfNeighbours pop <- designRes$populationFrac #check dimension of theta if(designRes$dimTheta$dim != length(theta)){ cat('theta must be of length',designRes$dimTheta$dim,'\n') return(NULL) } #unpack parameters and ensure lambda and phi are positive params <- unpackParams(theta,designRes) ################################################################### ## calculation of mean #autoregressive part # model with lambda and phi ? if(designRes$control$proportion == "none"){ #auto=0 if lambda and phi are not used in model lambda <- params$lambda phi <- params$phi # no autoregression if(is.null(lambda)) auto.lambda<- 0 else { # multiple lambda if(length(designRes$control$lambda)==nareas){ # create vector lambda with elements 0 if control$lambda=FALSE lambda <- rep(0,nareas) lambda[!is.na(designRes$control$lambda)] <- params$lambda } auto.lambda <- Ym1*matrix(lambda,ncol=nareas,nrow=nrow(Y), byrow=TRUE) } if(is.null(phi)) auto.phi <- 0 else { # multiple phi if(length(designRes$control$neighbours)==nareas){ # create vector phi with elements 0 if control$neighbours=FALSE phi <- rep(0,nareas) phi[!is.na(designRes$control$neighbours)] <- params$phi } auto.phi <- Ym1.neighbours*matrix(phi,ncol=nareas,nrow=nrow(Y), byrow=TRUE) } auto<- auto.lambda + auto.phi } else { ################################################# ## model with lambda and proportion pi ################################################# # helper function weightedSumEpidemic <- function(prop,lambda){ # ensure region id is not included diag(nhood) <- 0 # compute sum_j~i {pi_ji * Y_j,t-1} for unit id # where pi_ji = pi_i for j=i # pi_ji =(1-pi_j)/|k~j| for j~i one <- function(id){ # nOfNeighbours is number of Neigbours for each unit id=1,..,m i.e. |k~id| nOfNeighbours[id]<-1 pi.ij <- matrix(lambda*(1-prop)/nOfNeighbours,ncol=length(prop),nrow=nrow(Ym1),byrow=TRUE) # select pi_ij with j~i piYm1 <- as.matrix((Ym1*pi.ij)[,nhood[,id]>0]) rowSums(piYm1) } sapply(1:length(prop),one) } lambda <- matrix(params$lambda,ncol=nareas,nrow=n,byrow=TRUE) if(designRes$control$proportion == "single") prop <- rep(params$pi,nareas) else prop <- params$pi # lambda*pi_ji*Y_j,t-1 auto.phi <- weightedSumEpidemic(prop=prop,lambda=lambda[1,]) auto.lambda <- Ym1*lambda*matrix(prop,ncol=nareas,nrow=n,byrow=TRUE) auto <- auto.lambda+auto.phi } ################ #trend and seasonal components nSeason <- designRes$control$nseason dimSeason <- designRes$dimTheta$season dimTrend <- designRes$dimTheta$trend # trend if(dimTrend >0){ if(length(designRes$control$linear) == 1) beta <- rep(params$beta,nareas) else { beta <- rep(0,nareas) beta[designRes$control$linear] <-params$beta } predTime <- as.matrix(X.trendSeason[,1])%*%beta } else predTime <- 0 # season if( dimSeason >0){ # discard design matrix for trend X.Season <- X.trendSeason[,(1+ (dimTrend>0) ):ncol(X.trendSeason)] maxSeason <- max(nSeason) #construct a suitable matrix for seasonal parameters gamma_i # same number of Fourier frequencies S for all areas i: if(length(nSeason)==1){ gammaMat <- matrix(params$gamma,ncol=nareas,nrow=2*maxSeason,byrow=FALSE) } else if(length(nSeason)==nareas){ # different number of frequencies S_i for each area gammaMat <- matrix(0,ncol=nareas,nrow=2*maxSeason) index <- rep(1:nareas,2*nSeason) for(i in 1:nareas) gammaMat[0:(2*nSeason[i]),i] <- params$gamma[index==i] } else stop("nseason must be a vector of length 1 or",nareas,"\n") predSeason <- X.Season%*%gammaMat } else predSeason <- 0 #intercepts for areas #matrix with columns (alpha_1,...,alpha_nareas) predarea <- matrix(params$alpha, byrow=TRUE, ncol=nareas, nrow=nrow(Y)) #endemic part endemic <- pop*exp(predarea+predTime+predSeason) #results mean <- auto + endemic #Done return(list(mean=mean,epidemic=auto,endemic=endemic,epi.own=auto.lambda,epi.neighbours=auto.phi)) } ################################################### ### chunk number 6: ################################################### make.design <- function(disProgObj, control=list(lambda=TRUE, neighbours=FALSE, linear=FALSE, nseason=0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"), lag.range=NULL) ){ #Convert sts objects if (class(disProgObj) == "sts") disProgObj <- sts2disProg(disProgObj) #set default values (if not provided in control) if(is.null(control[["linear",exact=TRUE]])) control$linear <- FALSE if(is.null(control[["nseason",exact=TRUE]])) control$nseason <- 0 if(is.null(control[["neighbours",exact=TRUE]])) control$neighbours <- NA if(is.null(control[["negbin",exact=TRUE]])) control$negbin <- "none" if(is.null(control[["lambda",exact=TRUE]])) control$lambda <- 1 if(is.null(control[["proportion",exact=TRUE]])) control$proportion <- "none" control$proportion <- match.arg(control$proportion, c("single","multiple","none")) control$negbin <- match.arg(control$negbin, c("single","multiple","none")) # convert logical values to numerical values, FALSE corresponds to NA # to allow for lag == 0 if(is.logical(control[["lambda", exact=TRUE]])){ control$lambda <- as.numeric(control$lambda) control$lambda[control$lambda==0] <- NA } if(is.logical(control[["neighbours", exact=TRUE]])){ control$neighbours <- as.numeric(control$neighbours) control$neighbours[control$neighbours==0] <- NA } # determine range of observations y_i,t if(is.null(control[["lag.range",exact=TRUE]])){ lags <- c(control$lambda, control$neighbours) control$lag.range <- c(max(c(lags,1),na.rm=TRUE), max(c(-lags,0), na.rm=TRUE)) } data <- disProgObj$observed n <- nrow(data) nareas <- ncol(data) # check parameters if(length(control$lambda)>1 & length(control$lambda)!=nareas) stop("parameter lambda is not specified correctly\n") if(length(control$neighbours)>1 & length(control$neighbours)!=nareas) stop("parameter phi is not specified correctly\n") if(length(control$linear)>1 & length(control$linear)!=nareas) stop("parameter beta is not specified correctly\n") #univariate if(nareas ==1){ control$neighbours <- NA control$proportion <- "none" control$nseason <- control$nseason[1] } # maximum number of seasonal Fourier frequencies maxSeason <- max(control$nseason) # model with (lambda, pi) ? if(control$proportion != "none"){ control$neighbours <- NA # no lambda specified or lambda is not specified for each area if(sum(!is.na(control$lambda)) == 0 |sum(!is.na(control$lambda)) !=nareas) control$lambda <- 1 } dimLambda <- sum(!is.na(control$lambda)) dimPhi <- sum(!is.na(control$neighbours)) dimProportion <- switch(control$proportion , "single" = 1, "multiple"= nareas, "none" = 0) dimTrend <- sum(control$linear) dimSeason <- sum(2*control$nseason) dimIntercept <- nareas dimNegbin <- switch(control$negbin, "single" = 1, "multiple"= nareas, "none" = 0) #theta = (alpha_i, lambda, phi (or pi), beta,gamma_i,delta_i,..., psi) dim <- dimLambda+dimPhi+dimTrend+dimSeason+dimIntercept+dimProportion+dimNegbin dimTheta <- list(lambda=dimLambda, phi=dimPhi, trend=dimTrend, season=dimSeason, intercept=dimIntercept, proportion=dimProportion, negbin=dimNegbin ,dim=dim) #################################################################### # arrange response as matrix #Y, Ym1, Ym1.neighbours and population are (nOfobs)x(nOfareas) matrices #where nOfareas is the number of areas/units and # nOfobs is determined by control$lag.range with default nOfObs=n-1 # Thus, lag.range can be used to ensure that models with different lags # are based on the same observations. t.min <- 1+control$lag.range[1] t.max <- n-control$lag.range[2] Y <- matrix(data[t.min:t.max,],nrow=length(t.min:t.max),ncol=nareas) # population sizes n_{i,t} if(is.null(disProgObj$populationFrac)){ population <- matrix(1, nrow=length(t.min:t.max),ncol=nareas) } else { population <- matrix(disProgObj$populationFrac[t.min:t.max,],nrow=length(t.min:t.max),ncol=nareas) } # observed counts at time point t-lag # NOTE: the same lag (the maximum lag) is used for all areas if(dimLambda >0){ lag.lambda <- control$lambda[which.max(abs(control$lambda))] Ym1 <- matrix(data[(t.min:t.max)-lag.lambda,],nrow=length(t.min:t.max),ncol=nareas) } else { lag.lambda<- NA Ym1 <- matrix(0,nrow=length(t.min:t.max),ncol=nareas) } Ym1.neighbours <- matrix(0,nrow=length(t.min:t.max),ncol=nareas) nOfNeighbours <- 0 # now matrix for neighbours if(dimPhi>0){ lag.phi <- control$neighbours[which.max(abs(control$neighbours))] Ym1.neighbours <- weightedSumNeighbours(disProgObj)$neighbours[(t.min:t.max)-lag.phi,] nOfNeighbours <- weightedSumNeighbours(disProgObj)$nOfNeighbours # Ym1.neighbours <- sumNeighbours(disProgObj)[-n,] } else lag.phi <- NA if(dimProportion >0){ Ym1.neighbours <- weightedSumNeighbours(disProgObj)$neighbours[(t.min:t.max)-lag.lambda,] #not really needed nOfNeighbours <- weightedSumNeighbours(disProgObj)$nOfNeighbours } #################################################################### # now define design matrix (for trend and seasonality) for each time point #t<- disProgObj$week[t.min:t.max] # if no $week is given if(is.null(disProgObj$week)){ t <- (t.min:t.max)-1 } else { t<- disProgObj$week[(t.min:t.max)-1] } #t <- t - mean(t) form<-function(mod=ifelse(dimTrend == 0,"~-1","~-1+t"), S=maxSeason, period=disProgObj$freq){ if(S>0){ for(i in 1:S){ mod <- paste(mod,"+sin(",2*i,"*pi*t/",period,")+cos(",2*i,"*pi*t/",period,")",sep="") } } return(as.formula(mod)) } if(dimTrend +dimSeason >0) X.trendSeason<-model.matrix(form(),data.frame(t=t)) else X.trendSeason <-NULL result <- list("Y"=Y, "Ym1"=Ym1, "Ym1.neighbours"=Ym1.neighbours,"nOfNeighbours"=nOfNeighbours, "X.trendSeason"=X.trendSeason, "populationFrac"=population, "dimTheta"=dimTheta, "control"=control,"disProgObj"=disProgObj, "lag"=c(lag.lambda,lag.phi),"nObs"=prod(dim(Ym1))) return(result) } ################################################### ### chunk number 7: ################################################### print.ah <- function(x,digits = max(3, getOption("digits") - 3), amplitudeShift=TRUE,reparamPsi=TRUE,...){ if(!x$convergence) cat('Results are not reliable! Try different starting values. \n') else { if(!is.null(x$call)){ cat("Call: \n") print(x$call) } cat('\nEstimated parameters and standard errors: \n\n') coefs <- coefficients(x, se=TRUE, amplitudeShift=amplitudeShift,reparamPsi=reparamPsi) print(round(cbind("Estimates"=coefs[,"Estimates"], "Std.Error"=coefs[,"Std. Error"]),digits=digits),print.gap=2) cat('\nlog-likelihood: ',round(x$loglik,digits=digits-2),'\n') cat('AIC: ',round(AIC(x),digits=digits-2),'\n') cat('BIC: ',round(AIC(x,k=log(x$nObs)),digits=digits-2),'\n\n') if(!is.na(x$lag[1])) cat('lag used for lambda: ',x$lag[1],'\n') if(!is.na(x$lag[2])) cat('lag used for phi: ',x$lag[2] ,'\n') cat('number of observations: ',x$nObs,'\n\n') } } print.ahg <- function (x, digits = max(3, getOption("digits") - 3), amplitudeShift=TRUE,reparamPsi=TRUE, ...){ cat("\nsize of grid: ", x$gridSize, "\n") if (x$gridSize != x$gridUsed) cat("grid search stopped after", x$gridUsed, "iterations \n") cat("convergences: ",sum(!is.na(x$all[,1])),"\n") cat("time needed (in seconds)",x$time,"\n\n") if (!x$convergence) cat("\nAlgorithms did not converge, please try different starting values! \n") else { x$best$call <- NULL cat("values of log-likelihood:") print(table(round(x$all[,1],0))) # cat("\n") print.ah(x$best, digits = digits, amplitudeShift=amplitudeShift,reparamPsi=reparamPsi) } } ################################################### ### chunk number 8: ################################################### ################################# # obtain predictions from the fitted algo.hhh model # # params: # object - a fitted object of class "ah" # newdata - optionally, a disProgObject with which to predict; # if omitted, the fitted mean is returned. # type - the type of prediction required. The default is on the scale of the response # variable (endemic and epidemic part) # the alternative "endemic" returns only the endemic part (i.e. n_it * \nu_it) ################################ predict.ah <- function(object,newdata=NULL,type=c("response","endemic","epi.own","epi.neighbours"),...){ type <- match.arg(type,c("response","endemic","epi.own","epi.neighbours")) control <- object$control if(is.null(newdata)) newdata <- object$disProgObj if(!inherits(newdata, "disProg")) stop("data must be an object of class disProg\n") coefs <- coefficients(object) design <- make.design(newdata,control=control) # in meanResponse the params lambda, phi are "exp()'ed" # log() them to obtain the correct predictions if(sum(!is.na(control$lambda)) >0 | sum(!is.na(control$neighbours)) >0){ indexL <- design$dimTheta$intercept+1 indexU <- indexL +design$dimTheta$lambda +design$dimTheta$phi -1 coefs[indexL:indexU] <- log(coefs[indexL:indexU]) #cat("lambda,phi: indexL",indexL,"indexU",indexU,"\n") # pi is on logit-scale if(control$proportion != "none"){ indexL <- design$dimTheta$intercept+design$dimTheta$lambda+1 indexU <- indexL +design$dimTheta$proportion -1 #cat("indexL",indexL,"indexU",indexU,"\n") coefs[indexL:indexU] <- log(coefs[indexL:indexU]/(1-coefs[indexL:indexU])) } } predicted <- meanResponse(coefs,design) if(type=="response") return(predicted$mean) else if(type=="endemic") return(predicted$endemic) else if(type=="epi.own") return(predicted$epi.own) else if(type=="epi.neighbours") return(predicted$epi.neighbours) } predict.ahg <- function(object, newdata=NULL, type=c("response","endemic","epi.own","epi.neighbours"),...){ predict(object$best,newdata=newdata,type=type) } ################################################### ### chunk number 9: ################################################### ########################## ## residuals ################## residuals.ah <- function (object, type = c("deviance", "pearson"), ...){ type <- match.arg(type, c("deviance", "pearson")) # fitted values mean<- object$fitted.values #discard 1st observation (to obtain same dimension as mean) y <- as.matrix(object$disProgObj$observed[-1,]) # poisson or negbin model if(object$control$negbin!="none"){ coefs <- coefficients(object) psi <- matrix(coefs[grep("psi",names(coefs))],ncol=ncol(y),nrow=nrow(y),byrow=TRUE) distr <- function(mu){ dnbinom(y, mu=mu, size=psi, log=TRUE) } variance <- mean*(1+mean/psi) } else { distr <- function(mu){ dpois(y, lambda=mu,log=TRUE) } variance <- mean } res <- switch(type, deviance = sign(y-mean)*sqrt(2*(distr(y)-distr(mean))), pearson = (y-mean)/sqrt(variance) ) return(res) } residuals.ahg <- function(object, type = c("deviance", "pearson"), ...){ residuals.ah(object$best,type=type) } ################################################### ### chunk number 10: ################################################### ############################################ # extract estimates and standard errors (se=TRUE) # if amplitudeShift=TRUE, the seasonal params are transformed # if reparamPsi=TRUE, the overdispersion param psi is transformed to 1/psi # ############################################ coef.ah <- function(object,se=FALSE, amplitudeShift=FALSE, reparamPsi=FALSE,...){ coefs <- object$coefficients stdErr <- object$se if(amplitudeShift & max(object$control$nseason)>0){ #extract sin, cos coefficients index <- grep(" pi ",names(coefs)) sinCos.names <- names(coefs)[index] # change labels names(coefs)[index] <- paste(c("A","s"),substr(sinCos.names,4,100),sep="") #transform sin, cos coefficients coefs[index] <- sinCos2amplitudeShift(coefs[index]) # se's using Delta rule D <- diag(1,length(coefs)) D[index,index]<- jacobianAmplitudeShift(coefs[index]) cov <- D %*% object$cov %*% t(D) stdErr <- sqrt(diag(cov)) } if(reparamPsi & object$control$negbin!="none"){ #extract psi coefficients index <- grep("psi",names(coefs)) psi.names <- names(coefs)[index] # change labels names(coefs)[index] <- paste("1/",psi.names,sep="") #transform psi coefficients coefs[index] <- 1/coefs[index] # se's using Delta rule: se[h(psi)] = se[psi] * |h'(psi)| # h = 1/psi, h' = -1/psi^2 D <- diag(coefs[index]^2,length(index)) stdErr[index] <- sqrt(diag(D %*% object$cov[index,index] %*% t(D))) } if(se) return(cbind("Estimates"=coefs,"Std. Error"=stdErr)) else return(coefs) } coef.ahg <- function(object,se=FALSE, amplitudeShift=FALSE, reparamPsi=FALSE,...){ return(coef(object$best,se=se, amplitudeShift=amplitudeShift,reparamPsi=reparamPsi)) } ################################################### ### chunk number 11: ################################################### ## convert between sin/cos and amplitude/shift formulation ################################################### # y = gamma*sin(omega*t)+delta*cos(omega*t) # = A*sin(omega*t + phi) # with Amplitude A= sqrt(gamma^2+delta^2) # and shift phi= arctan(delta/gamma) ################################################# sinCos2amplitudeShift <- function(params){ # number of sin+cos terms lengthParams <- length(params) if(lengthParams %% 1 !=0) stop("wrong number of params") index.sin <- seq(1,lengthParams,by=2) one <- function(i=1,params){ coef.sin <- params[i] coef.cos <- params[i+1] amplitude <- sqrt(coef.cos^2+coef.sin^2) shift <- atan2(coef.cos, coef.sin) return(c(amplitude,shift)) } return(c(sapply(index.sin,one,params=params))) } amplitudeShift2sinCos <- function(params){ lengthParams <- length(params) if (lengthParams%%1 != 0) stop("wrong number of params") index.A <- seq(1, lengthParams, by = 2) one <- function(i = 1, params) { coef.A <- params[i] coef.shift <- params[i + 1] coef.cos <- -coef.A*tan(coef.shift)/sqrt(1+tan(coef.shift)^2) coef.sin <- -coef.A/sqrt(1+tan(coef.shift)^2) return(c(coef.sin,coef.cos)) } return(c(sapply(index.A, one, params = params))) } ############################################## # y = gamma*sin(omega*t)+delta*cos(omega*t) # g(gamma,delta) = [sqrt(gamma^2+delta^2), arctan(delta/gamma) ]' # compute jacobian (dg_i(x)/dx_j)_ij ############################################# jacobianAmplitudeShift <- function(params){ # number of sin+cos terms lengthParams <- length(params) if(lengthParams %% 1 !=0) stop("wrong number of params") index.sin <- seq(1,lengthParams,by=2) # function to compute jacobian of the transformation sinCos2AmplitudeShift() one <- function(i=1,params){ coef.sin <- params[i] coef.cos <- params[i+1] dAmplitude.dcoef.sin <- coef.sin/sqrt(coef.cos^2+coef.sin^2) dAmplitude.dcoef.cos <- coef.cos/sqrt(coef.cos^2+coef.sin^2) dShift.dcoef.sin <- - coef.cos/(coef.cos^2+coef.sin^2) dShift.dcoef.cos <- coef.sin/(coef.cos^2+coef.sin^2) return(c(dAmplitude.dcoef.sin,dShift.dcoef.sin,dAmplitude.dcoef.cos,dShift.dcoef.cos)) } jacobi<-sapply(index.sin,one,params=params) res <- matrix(0,nrow=lengthParams,ncol=lengthParams) j<-0 for (i in index.sin){ j<-j+1 res[i:(i+1),i:(i+1)] <- jacobi[,j] } return(res) } ################################################### ### chunk number 12: ################################################### ## additional (undocumented) functions needed for algo.hhh ###################################################################### # Function to unpack params and ensure that autoregressive parameters # lambda and phi are positive # and proportion parameter is 0 < pi < 1 # # theta - (alpha_i, lambda, phi, prop, beta, gamma_i, delta_i, psi) # designRes - result of a call to make.design ###################################################################### unpackParams <- function(theta, designRes){ dimIntercept <- designRes$dimTheta$intercept dimLambda <- designRes$dimTheta$lambda indexLambda <- dimIntercept+dimLambda dimPhi <- designRes$dimTheta$phi indexPhi <- indexLambda +dimPhi dimProportion <- designRes$dimTheta$proportion indexProportion <- indexPhi+dimProportion dimTrend <- designRes$dimTheta$trend indexTrend <- indexProportion+dimTrend dimSeason <- designRes$dimTheta$season indexSeason <- indexTrend +dimSeason dimNegbin <- designRes$dimTheta$negbin # params set to NULL if not specified # intercept always alpha <- theta[1:dimIntercept] if(dimLambda >0) lambda <- exp(theta[(dimIntercept+1):indexLambda]) else lambda <- NULL if(dimPhi >0) phi <- exp(theta[(indexLambda+1):(indexPhi)]) else phi <- NULL if(dimProportion >0){ prop <- theta[(indexPhi+1):indexProportion] # ensure that proportion is 00) beta <- theta[(indexProportion+1):indexTrend] else beta <- NULL if(dimSeason >0) gamma <- theta[(indexTrend+1):indexSeason] else gamma <- NULL if(dimNegbin >0) psi <- exp(theta[(indexSeason+1):(indexSeason+dimNegbin)]) else psi <- NULL return(list(alpha=alpha,lambda=lambda, phi=phi,pi=prop,beta=beta, gamma=gamma, psi=psi)) } ############################################# # function to compute gradient of loglikelihood # -> used in optim ################################################ gradient <- function(theta,designRes){ if(any(is.na(theta) | !is.finite(theta))) return(rep(NA,length(theta))) Y<-designRes$Y Ym1 <-designRes$Ym1 control <- designRes$control mean <- meanResponse(theta=theta, designRes=designRes) params <- unpackParams(theta,designRes) nOfNeighbours <- designRes$nOfNeighbours nhood <- designRes$disProgObj$neighbourhood nareas <- ncol(Y) endemic <- mean$endemic meanTotal <- mean$mean ## helper function for derivatives: # negbin model or poisson model if(control$negbin!="none"){ psi <- matrix(params$psi,ncol=nareas,nrow=nrow(Y),byrow=TRUE) psiPlusMu <- psi + meanTotal # helper function for derivatives: negbin derivHHH <- function(dmu){ # if(any(dim(dmu)!=dim(Y))) # cat("warning: dimensions wrong \n") (-psi/psiPlusMu +Y/meanTotal -Y/psiPlusMu)*dmu } } else { # helper function for derivatives: poisson derivHHH <- function(dmu){ # if(any(dim(dmu)!=dim(dmu))) # cat("warning: dimensions wrong \n") Y *(dmu/meanTotal) - dmu } } ########################################### ## epidemic part ########################################## # model with lambda and phi if(designRes$dimTheta$proportion == 0){ # gradient for lambda if(designRes$dimTheta$lambda >0){ lambda <- params$lambda if(length(control$lambda)>1){ # create vector lambda with elements 0 if control$lambda=FALSE lambda <- rep(0,nareas) lambda[!is.na(designRes$control$lambda)] <- params$lambda } lambda <- matrix(lambda,ncol=nareas,nrow=nrow(Y),byrow=TRUE) dLambda <- derivHHH(lambda*designRes$Ym1) # multiple lambda_i's or single lambda ? if(length(control$lambda) > 1) grLambda <- colSums(dLambda)[!is.na(designRes$control$lambda)] else grLambda <- sum(dLambda) if(any(is.na(grLambda))){ warning("derivatives for lambda not computable\n") return(rep(NA,length(theta))) } } else grLambda <- NULL # gradient for phi if(designRes$dimTheta$phi >0){ phi <- params$phi if(length(control$neighbours)>1){ # create vector phi with elements 0 if control$neighbours=FALSE phi <- rep(0,nareas) phi[!is.na(designRes$control$neighbours)] <- params$phi } phi <- matrix(phi,ncol=nareas,nrow=nrow(Y),byrow=TRUE) if(any(is.na(phi))) stop("phi contains NA\'s\n") dPhi <- derivHHH(phi*designRes$Ym1.neighbours) # multiple phi_i's or single phi ? if(length(control$neighbours)>1) grPhi <- colSums(dPhi)[!is.na(designRes$control$neighbours)] else grPhi<- sum(dPhi) if(any(is.na(grPhi))){ warning("derivatives for phi not computable\n") return(rep(NA,length(theta))) } } else grPhi <- NULL # gradient for proportion pi grPi <- NULL } else { ################################################ ## model with lambda and proportion pi ############################################### ## gradient for lambda gradLambda <- function(prop,lambda){ # ensure region id is not included diag(nhood) <- 0 # compute lambda_id* [pi_id*Ym1_id + sum_j~id {(1-pi_id )/|j~id|* Ym1_id}] for unit id dLambda.id <- function(id){ # number of Neigbours for unit id, i.e. |k~id| n<-nOfNeighbours[id] lambdaYm1.id <- Ym1[,id]*lambda[id] pi.id.j <- rep(0,nareas) pi.id.j[id]<- prop[id] pi.id.j[nhood[,id]>0] <-(1-prop[id])/n lambdaYm1pi.id <-lambdaYm1.id*matrix(pi.id.j,ncol=nareas,nrow=nrow(Ym1),byrow=TRUE) # d/dpi log L(mu_i,t) return(rowSums(derivHHH(lambdaYm1pi.id))) } return(sapply(1:nareas,dLambda.id)) } ## gradient for pi gradPi <- function(prop,lambda){ # ensure region id is not included diag(nhood) <- 0 # compute (pi_id-pi_id^2)* [lambda_id*Ym1_id - sum_j~id {lambda_id/|j~id|* Ym1_id}] for unit id dPi.id <- function(id){ # number of Neigbours for unit id, i.e. |k~id| n<-nOfNeighbours[id] dPiYm1.id <- Ym1[,id]*(prop[id]-prop[id]^2) lambda.id.j <- rep(0,nareas) lambda.id.j[id]<- lambda[id] lambda.id.j[nhood[,id]>0] <-(-lambda[id])/n dPiYm1lambda.id <-dPiYm1.id*matrix(lambda.id.j,ncol=nareas,nrow=nrow(Ym1),byrow=TRUE) # d/dpi log L(mu_i,t) return(rowSums(derivHHH(dPiYm1lambda.id))) } return(sapply(1:nareas,dPi.id)) } # gradient for lambda if(designRes$dimTheta$lambda ==0) cat("no lambda\n") lambda <- rep(params$lambda,length=nareas) prop <- rep(params$pi, length=nareas) dLambda <- gradLambda(prop=prop,lambda=lambda) # multiple lambda_i's or single lambda ? if(designRes$dimTheta$lambda > 1) grLambda <- colSums(dLambda) else grLambda <- sum(dLambda) if(any(is.na(grLambda))){ warning("derivatives for lambda not computable\n") return(rep(NA,length(theta))) } # gradient for phi grPhi <- NULL # gradient for proportion pi dPi <- gradPi(prop=prop,lambda=lambda) if(designRes$dimTheta$proportion >1) grPi <- colSums(dPi) else grPi <- sum(dPi) if(any(is.na(grPi))){ warning("derivatives for pi not computable\n") return(rep(NA,length(theta))) } } ############################################ ## endemic part ############################################ # gradient for intercepts grAlpha <- colSums(derivHHH(endemic)) if(any(is.na(grAlpha))){ warning("derivatives for alpha not computable\n") return(rep(NA,length(theta))) } # gradient for trend if(designRes$dimTheta$trend >0){ dTrend <- derivHHH(endemic*designRes$X.trendSeason[,1]) if(designRes$dimTheta$trend >1) grTrend <- colSums(dTrend)[designRes$control$linear] else grTrend <- sum(dTrend) if(any(is.na(grTrend))){ warning("derivatives for trend not computable\n") return(rep(NA,length(theta))) } } else grTrend <- NULL # gradient for season grSeason <- NULL if(designRes$dimTheta$season >0){ ## single or multiple seasonal params if(length(control$nseason)==1){ for (i in ((designRes$dimTheta$trend>0) +1):ncol(designRes$X.trendSeason) ){ grSeason <- c(grSeason, sum(derivHHH(endemic*designRes$X.trendSeason[,i]))) } if(any(is.na(grSeason))){ warning("derivatives for seasonal parameters not computable\n") return(rep(NA,length(theta))) } } else if(length(control$nseason)==nareas){ #maximum number of Fourier frequencies S.max=max_i{S_i} maxSeason <- 2*max(control$nseason) grSeason <- matrix(NA,nrow=maxSeason,ncol=ncol(Y)) for (j in ((designRes$dimTheta$trend>0) +1):(maxSeason+(designRes$dimTheta$trend>0) ) ){ # compute derivatives of gamma_{ij}, j= 1, ..., 2*S.max grSeason[j-(designRes$dimTheta$trend>0),] <- colSums(derivHHH(endemic*designRes$X.trendSeason[,j])) # set gradients for gamma_{ij} to NA if j > S_i grSeason[j-(designRes$dimTheta$trend>0),(j > (2*control$nseason)+(designRes$dimTheta$trend>0))] <- NA } # gradient now is in order sin(omega_1)_A, sin(omega_1)_B, sin(omega_1)_C, ... # cos(omega_1)_A, cos(omega_1)_B, cos(omega_1)_C, ... # sin(omega_2)_A, sin(omega_2)_B, sin(omega_2)_C, ... # ... # and needs to be in the following order: # sin(omega_1)_A, cos(omega_1)_A, sin(omega_2)_A, ..., cos(omega_S.max)_A # sin(omega_1)_B, cos(omega_1)_B, sin(omega_2)_B, ..., cos(omega_S.max)_B # remove NA's, i.e. only derivatives for {gamma_{ij}: j <=2*S_i} # check if there are any NaN's if(any(is.nan(grSeason))){ warning("derivatives for seasonal parameters not computable\n") return(rep(NA,length(theta))) } grSeason <- grSeason[!is.na(grSeason)] } # end multiple params } # end gradient season # gradient for psi if(designRes$dimTheta$negbin>0){ dPsi <- psi*(digamma(Y+psi)-digamma(psi) +log(psi)+1 - log(psiPlusMu) -psi/psiPlusMu -Y/psiPlusMu) # multiple psi_i's or single psi? if(designRes$dimTheta$negbin >1) grPsi <- colSums(dPsi) else grPsi <- sum(dPsi) if(any(is.na(grPsi))){ warning("derivatives for psi not computable\n") return(rep(NA,length(theta))) } } else grPsi <- NULL res <- c(grAlpha,grLambda,grPhi,grPi,grTrend,grSeason,grPsi) return(res) } ################################ # Calculates the weighted sum of counts of adjacent areas # weights are specified in neighbourhood-matrix of the disProgObj # (experimental atm) # # \nu_i,t = \lambda_y_i,t-1 + \phi*\sum_(j~i) [w_ji*y_j,t-1] # # disProgObj$neighbourhood can either be a matrix with weights w_ji (in columns) # or an array (for time varying weights) # # if the neighbourhood-matrix has elements 1 if i~j and 0 otherwise # weightedSumNeighbours() = sumNeighbours() ########################################### weightedSumNeighbours <- function(disProgObj){ observed <- disProgObj$observed ntime<-nrow(observed) narea<-ncol(observed) neighbours <- matrix(nrow=ntime,ncol=narea) nhood <- disProgObj$neighbourhood #check neighbourhood if(any(is.na(nhood))) stop("No correct neighbourhood matrix given\n") ## constant neighbourhood (over time)? if(length(dim(nhood))==2){ # ensure only neighouring areas are summed up diag(nhood) <- 0 nhood <- array(nhood,c(narea,narea,ntime)) } else if(length(dim(nhood))==3){ if(any(dim(nhood)[1:2]!= narea) | dim(nhood)[3] != ntime) stop("neighbourhood info incorrect\n") } # number of neighbours nOfNeighbours <-colSums(nhood[,,1]>0) for(i in 1:ncol(observed)){ #weights <- matrix(as.numeric(nhood[,i]),nrow=nrow,ncol=ncol,byrow=TRUE) weights <- t(nhood[,i,]) neighbours[,i] <- rowSums(observed*weights) } return(list(neighbours=neighbours, nOfNeighbours=nOfNeighbours)) } ################################################# # params psi, lambda and phi are on log-scale # -> transformation of estimates, standard errors and fisher (using delta rule) # labels for results # # g(theta) = (exp(lambda), exp(phi), beta, gamma, delta, exp(psi), alpha) # D is the Jacobian of g # D = diag(exp(lambda), exp(phi), 1, 1, 1, exp(psi), 1) ######################################### jacobian <- function(thetahat, designRes){ dimtheta <- designRes$dimTheta$dim nareas <- ncol(designRes$disProgObj$observed) thetaNames <- NULL D <-diag(1,ncol=dimtheta,nrow=dimtheta) dimLambda <- designRes$dimTheta$lambda dimPhi <- designRes$dimTheta$phi dimPi <- designRes$dimTheta$proportion dimTrend <- designRes$dimTheta$trend dimPsi <- designRes$dimTheta$negbin dimSeason <-designRes$dimTheta$season nseason <- designRes$control$nseason alpha <- colnames(designRes$disProgObj$observed) if(is.null(alpha)) alpha <- paste("obs",1:nareas, sep="") thetaNames <- c(thetaNames, alpha) if(dimLambda >0){ if(length(designRes$control$lambda)==1) lambda <- "lambda" else { lambda <- paste("lambda", alpha, sep="_")[!is.na(designRes$control$lambda)] } thetaNames <- c(thetaNames, lambda) index <-(nareas+1):(nareas+dimLambda) thetahat[index] <- exp(thetahat[index]) diag(D)[index] <- thetahat[index] } if(dimPhi >0){ if(length(designRes$control$neighbours)==1) phi <- "phi" else { phi <- paste("phi", alpha, sep="_")[!is.na(designRes$control$neighbours)] } thetaNames <- c(thetaNames, phi) index <- (nareas+dimLambda+1):(nareas+dimLambda+dimPhi) thetahat[index] <- exp(thetahat[index]) diag(D)[index] <- thetahat[index] } if(dimPi>0){ prop <- switch(designRes$control$proportion, "single"="pi", "multiple"=paste("pi", alpha, sep="_")) thetaNames <- c(thetaNames, prop) index <- (nareas+dimLambda+dimPhi+1):(nareas+dimLambda+dimPhi+dimPi) exp.pi <- exp(thetahat[index]) diag(D)[index] <- exp.pi/((1+exp.pi)^2) thetahat[index] <- exp.pi/(1+exp.pi) } if(dimTrend >0){ beta <- colnames(designRes$X.trendSeason)[1] if(length(designRes$control$linear)>1) beta <- paste(beta,alpha,sep="_")[designRes$control$linear] thetaNames <- c(thetaNames, beta) } if(dimSeason > 0){ maxSeason <- 2*max(nseason) sinCos <- rep(colnames(designRes$X.trendSeason)[(1+ (dimTrend>0) ):((dimTrend>0) +maxSeason)], length=maxSeason) if(length(nseason)==1){ gammaDelta <- sinCos } else if(length(nseason==nareas)){ gammaDelta <- matrix(NA,ncol=nareas,nrow=maxSeason) for(i in 1:nareas){ gammaDelta[0:(2*nseason[i]),i] <- paste(sinCos,alpha[i],sep="_")[0:(2*nseason[i])] } gammaDelta <- gammaDelta[!is.na(gammaDelta)] } thetaNames <- c(thetaNames, gammaDelta ) } if(dimPsi >0){ psi <- switch(designRes$control$negbin, "single"="psi", "multiple"=paste("psi",alpha,sep="_")) thetaNames <- c(thetaNames, psi) index <- (dimtheta-dimPsi+1):dimtheta thetahat[index] <- exp(thetahat[index]) diag(D)[index] <- thetahat[index] } dimnames(D) <- list(thetaNames,thetaNames) names(thetahat) <- thetaNames return(list(D=D,theta=thetahat)) } # theta.epidemic = c(lambda,phi) # Note: lambda and phi are on log-scale getLambda <- function(theta.epidemic, designRes, t.weights=1){ # check dimension of theta.epidemic dimLambda <- designRes$dimTheta$lambda dimPhi <- designRes$dimTheta$phi if(designRes$dimTheta$proportion>0) stop("proportions currently not supported\n") if(length(theta.epidemic)!= (dimLambda+dimPhi)) stop("vector with parameters must be of length ", dimLambda+dimPhi,"\n") # is there an autoregression? if(sum(!is.na(designRes$control$lambda))==0 & sum(!is.na(designRes$control$neighbours)) ==0) return(NULL) if(dimLambda>0){ coef.lambda <- exp(theta.epidemic[1:dimLambda] ) } else coef.lambda <- 0 if(dimPhi>0){ coef.phi <- exp(theta.epidemic[(dimLambda+1):length(theta.epidemic)] ) } else coef.phi <- 0 #univariate? if(ncol(designRes$disProgObj$observed)==1){ if(sum(!is.na(designRes$control$lambda))==1) return(coef.lambda) else return(NULL) } nareas <- ncol(designRes$Y) #ncol(nhood) if(designRes$control$proportion=="none"){ # no lambda if(sum(!is.na(designRes$control$lambda))==0){ lambda <- rep(0,nareas) # single lambda for all units } else if(sum(!is.na(designRes$control$lambda))==1 & length(designRes$control$lambda)==1){ lambda <- rep(coef.lambda,nareas) # multiple lambda } else{ lambda <- rep(0, nareas) lambda[designRes$control$lambda] <- coef.lambda } Lambda <- diag(lambda,nareas) if(dimPhi>0){ # extract neighbourhood, i.e. weight matrix nhood <- designRes$disProgObj$neighbourhood # time-varying weights w_ji if(length(dim(nhood))==3) nhood <- nhood[,,t.weights] # ensure the diagonal is zero diag(nhood) <- 0 nOfNeighbours <- colSums(nhood>0) # single phi for all units if(length(designRes$control$neighbours)==1 & sum(!is.na(designRes$control$neighbours))==1){ phi <-rep(coef.phi,nareas) } else if(length(designRes$control$neighbours)>1 & sum(!is.na(designRes$control$neighbours))>0){ phi <- rep(0,nareas) phi[!is.na(designRes$control$neighbours)] <- coef.phi } phi.weights <- matrix(phi,nrow=nareas,ncol=nareas,byrow=FALSE)*nhood Lambda[nhood>0] <- phi.weights[nhood>0] } } else { #todo: check return(NULL) #hoehle 14 Oct 2008 - commented, coz it contains warnings for R CMD check # lambdaMatrix <- matrix(lambda,ncol=nareas,nrow=nareas,byrow=TRUE) # nOfNeighbours <- rowSums(nhood) # piMatrix <- matrix((1-prop)/nOfNeighbours,ncol=nareas,nrow=nareas,byrow=TRUE) # piMatrix[nhood==0] <-0 # diag(piMatrix)<-prop # Lambda <- lambdaMatrix*piMatrix } return(Lambda) } ## moment estimator of exp(alpha) ## alpha.hat(lambda,phi) = mean(y)' %*% (I - Lambda) expAlpha.mm <- function(Lambda,Y){ mean.obs <- colMeans(Y) mean.obs %*% (diag(1,length(mean.obs))-Lambda) } ######## logLik.ah <- function(object,...){ if(!inherits(object, "ah")) stop("expected object to be an object of class ah\n") if(!object$convergence) stop("algorithm did not converge\n") val <- object$loglikelihood attr(val, "df") <- length(coef(object)) attr(val, "nobs") <- object$nObs class(val) <- "logLik" return(val) } logLik.ahg <- function(object, ...){ logLik.ah(object$best) } surveillance/R/algo_glrpois.R0000644000176000001440000001642011731650466016017 0ustar ripleyusers################################################### ### chunk number 1: ################################################### ###################################################################### # # Implementation of GLR -- documentation converted to Rd format. # # Author: Michael Hoehle (with contributions by Valentin Wimmer) # Date: 8 Jan 2008 # ###################################################################### algo.glrpois <- function(disProgObj, control = list(range=range,c.ARL=5, mu0=NULL, Mtilde=1, M=-1, change="intercept", theta=NULL,dir=c("inc","dec"), ret=c("cases","value"))) { if (is.null(control$alpha)) { control$alpha <- 0 } else { if (control$alpha != 0) { stop("Error: algo.glrpois has to operate with control$alpha = 0.") } } return(algo.glrnb(disProgObj, control)) ## # Set the default values if not yet set ## if(is.null(control$c.ARL)) ## control$c.ARL <- 5 ## if(is.null(control$change)) ## control$change <- "intercept" ## if(is.null(control$Mtilde)) ## control$Mtilde <- 1 ## if(is.null(control$M)) ## control$M <- -1 ## if(is.null(control$dir)) ## control$dir <- "inc" ## if(is.null(control$ret)) ## control$ret <- "value" ## #GLM (only filled if estimated) ## m <- NULL ## #Extract the important parts from the arguments ## observed <- disProgObj$observed ## t <- control$range ## control$mu0Model <- NULL ## range <- control$range ## control$dir <- match.arg(control$dir, c("inc","dec")) ## dir <- ifelse(control$dir=="inc",1,-1) ## control$ret <- match.arg(control$ret, c("value","cases")) ## ret <- pmatch(control$ret,c("value","cases")) ## # Estimate m (the expected number of cases), i.e. parameter lambda of a ## # poisson distribution based on time points 1:t-1 ## if (is.null(control$mu0) | is.list(control$mu0)) { ## #Initialize ## if (is.null(control$mu0)) control$mu0 <- list() ## if (is.null(control$mu0$S)) control$mu0$S <- 1 ## if (is.null(control$mu0$trend)) control$mu0$trend <- FALSE ## if (is.null(control$mu0$refit)) control$m0$refit <- FALSE ## control$mu0Model <- control$mu0 ## #Estimate using a hook function (lazy evaluation) ## control$mu0 <- estimateGLRPoisHook() ## } ## #The counts ## x <- observed[control$range] ## mu0 <- control$mu0 ## #Reserve space for the results ## # start with cusum[timePoint -1] = 0, i.e. set cusum[1] = 0 ## alarm <- matrix(data = 0, nrow = length(t), ncol = 1) ## upperbound <- matrix(data = 0, nrow = length(t), ncol = 1) ## #If no restarting set threshold to infinity and compute alarms manually ## #afterwards ## if (!control$restart) { c.ARL.saved <- control$c.ARL ; control$c.ARL <- 1e99} ## #Setup counters for the progress ## doneidx <- 0 ## N <- 1 ## xm10 <- 0 ## noofalarms <- 0 ## noOfTimePoints <- length(t) ## #Loop as long as we are not through the sequence ## while (doneidx < noOfTimePoints) { ## #cat("Doneidx === ",doneidx,"\n") ## #Call the C-interface -- this should depend on the type and the distribution ## ###################################################################### ## # Poisson ## ###################################################################### ## if (control$change == "intercept") { ## if (is.null(control$theta)) { ## res <- .C("glr_cusum",as.integer(x),as.double(mu0),length(x),as.integer(control$Mtilde),as.double(control$c.ARL),N=as.integer(0),val=as.double(x),cases=as.integer(x),as.integer(dir),as.integer(ret),PACKAGE="surveillance") ## } else { ## res <- .C("lr_cusum",as.integer(x),as.double(mu0),length(x),as.double(control$theta),as.double(control$c.ARL),N=as.integer(0),val=as.double(x),cases=as.double(x),PACKAGE="surveillance") ## } ## } else { ################### Epidemic chart ####################### ## if (control$change == "epi") { ## res <- .C("glr_epi_window",as.integer(x),as.double(mu0),length(x),as.integer(control$Mtilde),as.integer(control$M),as.double(xm10),as.double(control$c.ARL),N=as.integer(0),val=as.double(x),PACKAGE="surveillance") ## } ## } ## #In case an alarm found log this and reset the chart at res$N+1 ## if (res$N < length(x)) { ## #Put appropriate value in upperbound ## upperbound[1:res$N + doneidx] <- ifelse(ret==1, res$val[1:res$N], res$cases[1:res$N]) ## alarm[res$N + doneidx] <- TRUE ## #Chop & get ready for next round ## xm10 <- x[res$N] #put start value x_0 to last value ## x <- x[-(1:res$N)] ; t <- t[-(1:res$N)] ## #If no refitting is to be done things are easy ## if (!is.list(control$mu0Model) || (control$mu0Model$refit == FALSE)) { ## mu0 <- mu0[-(1:res$N)] ## } else { ## #Update the range (how to change back??) ## range <- range[-(1:res$N)] ## mu0 <- estimateGLRPoisHook() ## control$mu0[(doneidx + res$N + 1):length(control$mu0)] <- mu0 ## } ## noofalarms <- noofalarms + 1 ## } ## doneidx <- doneidx + res$N ## } ## # fix of the problem that no upperbound-statistic is returned after ## #last alarm ## upperbound[(doneidx-res$N+1):length(range)] <- ifelse (ret==1, res$val, res$cases) ## #fix of the problem that no upperbound-statistic ss returned ## #in case of no alarm ## if (noofalarms == 0) { ## upperbound <- ifelse( ret == 1, res$val, res$cases) ## } ## #Manually generate the alarms ## if (!control$restart) { alarm <- upperbound > c.ARL.saved} ## # ensure upper bound is positive and not NaN ## upperbound[is.na(upperbound)] <- 0 ## upperbound[upperbound < 0] <- 0 ## #Add name and data name to control object. ## control$name <- paste("glrpois: ", control$change) ## control$data <- paste(deparse(substitute(disProgObj))) ## control$m <- m ## # return alarm and upperbound vectors ## result <- list(alarm = alarm, upperbound = upperbound, ## disProgObj=disProgObj,control=control) ## class(result) = "survRes" # for surveillance system result ## return(result) } ################################################### ### chunk number 2: ################################################### estimateGLRPoisHook <- function() { #Fetch control object from parent control <- parent.frame()$control #The period p <- parent.frame()$disProgObj$freq #Current range to perform surveillance on range <- parent.frame()$range #Define training & test data set (the rest) train <- 1:(range[1]-1) test <- range #Perform an estimation based on all observations before timePoint #Event better - don't do this at all in the algorithm - force #user to do it himself - coz its a model selection problem data <- data.frame(y=parent.frame()$disProgObj$observed[t],t=train) #Build the model equation formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } #Fit the GLM m <- eval(substitute(glm(form,family=poisson(),data=data),list(form=as.formula(formula)))) #Predict mu_{0,t} return(as.numeric(predict(m,newdata=data.frame(t=range),type="response"))) } surveillance/vignettes/0000755000176000001440000000000012242645665015022 5ustar ripleyuserssurveillance/vignettes/surveillance-cache.RData0000755000176000001440000014536012004061670021470 0ustar ripleyusers7zXZi"6!X<ʱ])TW"nRʟXgqjn]LUJΎ+[׼ڽ}\F74Z"PIkxM{dLbٟ 's!p?L,ď+5G'ߛ1SԙHKj(80L0U=N)eغO4G^jd2V#_ pM1n9v`F_8B)!V+Y^Ljb.HL& SPoNpi]f^P@!ubZC)ttFt0'#WP)%xNN%`v5~Rjgh½u7,3'8Iq3d%8 iTl}8A4M'$ݧ4ptB/'GTkQWdFb5 6-׃D{I/GHP@|ٗ'F*$χ5.J=~\r.T=B Ɗ5?tjDm`| .Ü0/Ei'RlאeN0wĄMw9\R9&L"y@҃06ntP)*JCK- zCAb73'jURJMX.gu+8㣑J1J_XPG tWlCK9{%VFRS\tj5쑱Xm+} C-0Rb-KiV=Eooe M>@Vy΢0.) RV^@y'Q`n&~<xSh?lJ=wb3շd-I1E$ӵ]oA4giK1]_r^dcxg;+9"mb09`AV*y5 $ ߇>-B]@ fhnԃAXx|<roX)-ZcRd|j^.Cg /^]yCʱIQObh`҆ [xMAČdgV3-Ww \o i/f0{J"u9G\xUT/WЁmsY5d1[m6]4)nQ uc6/?5] [LyWƛm['% JSB'Y#oZ?,x)Us @ٻHe/EsvĒO|mi-B"9{K.qJީHSHxrFSi%$g8?ںVy C$JU`Yb zpƝ3(o۱k~8KA-ޭ>BǰܻJ;DJ"'Rh'NS3Ġ9fRu6ʕa.p3\!aNK鰯Z<"K*i <.ɒ#LANw]v}oyLehZؕl77^rO; kκW Iu vjhT8{\Ph:hʄ?.MwmQrU6@} Ζ5" u71׬)TƮMLVuƄլ7{\ }6l0~4y?GSZp/^K]kӒ~%vEP7&=+չo:KD`I|ʉ.}pr9 Ctnj;G9Ȯ z)G܃hSS]lMG._/k(vv5zi?I[^g}["^Ƅh>={bE$?>bN3R-FluMR1jC0r[x*r&vFqcbМެf WGċL N&@@%kZ1Ȯi9-,Zq[ƞnOVI]zMaVCׇѩògeklJCle <nлY ,C̽lVN,-H+z;dHŇ grp/)-X;SbKlU\gQ'0CNF32Amղ_:^+7 $чm~t6f>M1r'oߍ}g[- TʲRU=y8ӓ`^27Sp8CEZ M"8);h~-}-lBo^b`ɞ^N.IGK m:9Nw>"97:?S~I H.c9kc!;7P2zYR  mW1z|f9ؓ^\#6_y:f0=O![KT։fZl@hqLU&\+x(HZqyTO2>p>gRLku{Ab+&`pl[ EvzmlSXN]ZF,X~O\j}4~yPI!TFƱZFN߈񶏕9`t'`(<d GBiUUmM'I*y]PaD8-@Cw9u>h k9^֥n;4m?q]\{M%}a׈v`;d{/w0hTKAӓկuZC]yW=I+2YԹ*`m-UޞܐKk;#ʂ*~;Ջ&_KÃo:=H1F2dgldIJ6nb6Pi:iLNO+%p8whC?R򿩒^"`|׺Gp=q5m<1s'[涂jT ZKؑb+Ҭ7LrI`D'WlN}&'\(a~h wϚX% k6qAA@.tWF*pUNƪAOچ/6>X^L;2 {Eb_{7(SZt +؂!"!Tl饼A#Vx0X gO6!za՛+*?O7x ,O\ٝ{XOGd"S aYD5!0fM-R\/++Bn e/珏-9@"EBĕX+lʴXv`nWևр>\625?Q`,;sri UH)5-,Ȑho,f1GxAl oߟB0iB9f} ܧ~)q%^m8c3mwL[oӔ sdnͮ-&·ԹKjؤYLȃ>X{FSw:;te;EDP?rzUD${e83<`P(Ƥ ncsd2gAB娘q/aJ5+'L'f%l O#&-,{O긋!DYryѭ@ mGM<4O|P|{ZZP0q%4[5'tI~ktx^Ӱ#9Y"@ _d풡S[pNΕ[slW(:s*c%ז%WAMU(kOkCC^6Um] w\>#!"]''sQs'̳ 3UǾ3T%J 4HDߧxXR %[ HXr|I,D*!(-[fş@>81|~C g@aXo!Z]lyO _4^MfO|jŭ Ȏf_ , G"I,HC rKlk9`9G5TTyWy.t_7_F[ύ*R+2TRb4py>iK"hđ*G.4~HKŒ9"Rc5rTo&/i16@юH2cb ‘+$I%ttub5ޤe}oeuZ/GxڤضaIXoR R͸:胹 PCuQE*R60{P 8g;Ѥwڈߕ̋47?4q4qlW8\uJd%M]Yh]̇"Q(ϸK`n'\hl#+bF\uy IvPUiP{/[fEQhtwCɨI&c'.zik=W@LmL7#]r&m+9NREN-\0/L?>ǟWe6u EMV?@:︲2Ou6:܅֘ ˔c`X3I8ş l @yj^.x$XjTYH,+Mtbo0 ;:אda0i"}A!`_>j3J դO dȻcA}(IPf$ی6*ip][<đtjUP>ǣ i$3| hm ~}>^GU Y)rokm쎸ذ:"ڹ}3!/6ϟ{Uw@ N!snlG{_!)cQ[9TFjFC7ΡVčVp=P~RbTy ZpSRDM냈>KmDK0f!4DC*k3ijV⼜N/R6{ J[3q& ?,±\+LUNLZdE%5)n2{Å7L*JƔ;wܣ[F?4vi%)T+@gRhn(+6U a%04{0$R 'H`jOb-ŭ<` *qĕ/;ㇹsXCpa( n:QAAAgOIud;DBtPjx:)2 |r3w. &RODy4u-RbZ23HS醯d IZ2a=C _gulZ$!&5~# E!h&uq4;pȂ$uO+nB4T3kPHGJuԍ};Ðb,Bo|R".fo:˖O^̟(%$mc´ߵUJ(ĎM}">Y>s|ŝ!VV~dliGh<Vz\o}m-#r_YLF{FlcBwM&G潓*}#Pu, ]Ұz{L._=Z5fܟۺ9Ű11qvßԍf,C9D7偟bZ !<,8=2'a7m"݅?胭0sW&D=i9|s־yjN#k] Ty RL| & Yhq|x{_H. o:A!/x_sXل3?-U{oqIJO]|7ԛ2q6(|y&(S˪kf/nc+r3>")Pnw^}K#nQ-`XȫN9+ O‡xG&8>nlܓ W֗O ~U ǿcK@vӫ'"tgO //i!~KThG|C[ùM@Jt1+L{脡T8NLDA;,sE}kqcY+Dsn M)U%n|[& `s,*,_mBJ%6l]<:50^XZ`3%4(Xu)O+~FhKyzQr9 9=jMM%Q]j蠼*D꤃L_,Y]cu+~7:d(ċq.ۼEϤȉu|uؕ1X/jmޞv񣴮)r?d QȾp|B]{u?۞;+ E>YfjE8 փa/qve~$ fQXIqO80U:II%ʷsEU` 4i#Ѡ$^[wdByp(Ks# 1)s2R=xh4!>!IOZQx&~hPQPNt]7e((_OO@FP%h`jZ|6$ uqo=b讹dЈ.`n[*GdI" ]&(y]6oLPJ]nnz65  \x~ϸ H[Ɋi4(hzF~ߡ{/G)|>Es')EWkye(Ďԇ4wYPM`M:IC-tPALɈe?Y ^qxˡS*&`QsąrYq;ځ KO(!iAE .IŅb'?& YMK?c1c[G^%?VD \"nA%5c5Dj'bS[s j?YW/Ҡur;ޙ9*yEnPp<&|C59[p=Jz&ijiv7t`U-Bwa&zD 3~E@uSd**]H<=,x`&/Ycq>2 $pIǗh`oEˣRB^;.E{8A0z}4+EfO .7 x'3zQvm7v**ֵZ,Qm2^ ueajEkdv=T!>`n'KE扺, nU+\*G'ł9D\5ŧ_S]&'ق =KhqMyڊj[P]P;?tofӦk_Gqu-9S\j6E{lK$W>mJ[h7<@GQ>!Bk8ѝ4z- ܌v^U [E{2 (,6)$XꀨAH$MʗӌT.Hb<#wO 鲀 ;5ߢ3?j4 .qtɶ9."\ h=0΋_P3McknT&D9}N> >̟ P=XqJ5$mid{ql+ iBKc,.R8 kx'(gXo{=hNF4|i!aJ +wE/ kDTwX@Q f+\w$6Kb [g/TtZX!vQQIJ@튇TXѸm8 ]3·{CrRYA]*=4OKg?]9&;.i(*lXa6Gy+;BnA7tL`7ǘ2>'Y$Tvd6$5s"' HT1lD ?)d 1^j7^n,ltZSl[+% -n\ҩcԈ0!oӯN[D'zji)D& D!`;VѿFr!o8' J;a.d&2{W 㯯UmX#)FmEqmSm)caA 7Ć0yE]?` z,@O(a =rX{o@G=']Bk3nG> I\5$̱k'c;]+{h18;4Nth:}LCN}\8M9qF}GMW4i1[!LJ4ɆI bJPlccXuk)k~CjL#vÈrs 2 TJy3mG!Z|YAGpadā*est ^" QcylHLl ;4~cD8YZI;ojL}n4p;CʟEp=uwbܑA\/hB@C 5i$M AW.4Φz*@j% kYnc_Qo٧.GU8b(si;=T}5Q8jqWae̬ c\OyA8JjO1$K u޷Χ{0TP0{[2>;-r#w:d&@īEy4(y:k?`\!dS<ĨQwzlWfupԵu|!شۮ:1ȤA9[t "Ћmx|w:Sj[ GR@? >:xaNhEbC-j̨B= W/\~Au`Ḅ=Ѡ#l0mcQɼ;o )g3 o*ᲄ \1hQ͟p*n^=šVnie& e)pQӲQ˻B^w:_Fݎ쨌}t:#%q3ʦc< TrSS+晆.ZQsIXr';2.9HLB;wknK|ןM0* [+)"ⶬS3\ e`ҚzUGGYP_g/wt2q 3H@|5RyiT5؞j~snKy0(|@t^އ<4yTm _JJ+-pshXi:`$,,~"{Y}Bܝ_`رJRq[LI~ߥ {L@W#Q]G$<9!2 c1;8 W*/̵Aʁ5Ká-dU ͅzV3Ȼ;`"{@\[ ͕\PoOmT5jRm(c$vuX0)gs3d)mلl8+IyN8MDq4|t5CL{.G#^Bqn}.=ׯFjdۘ}8u1O~S͇I pXI8Q#"rg qoW&^woaGT`^,w2Oxc~z@GCT!7TrtY#p}gezEDJ8*-~ _9F aT4mݩ GZ.iQS+ecr97zXRU^ cy8K6-^7=.1|eQҪF}@XHʩvH( 3Cӏ3( g%mqoT1ԡڻqR/VuO9,e [$%aV̅*.1Ii3b44.`e0sm;',der61#љ7BZk{,RYv#DXr?N]ҎYq /kG{,|;曯Z/DoJpec.QNɩe3lJY3O4E <*?ه^J\_^1I {uV`?ߘm*=27Vl+h= '+Q=Ҩ=ϩU5>%"C4G}0-K?96~jfdJAX|Cצȕiy4Vˍ{s/KRLXpR2}DT_qkpۘ+!"22e"rw#2 Y~Af-ͨfb+֭OUwYLwk9Qo5Z|GffTqLU %S277v݁HYzSo"É $AިbRq6.>s f%nWk>0th&<[Ǫ |L [p;%{2$,axq$s{=RBG3R|Y3쟰{~ݾeO;GCx{VsꙘ٦ .N{Ӝ [lzdjx9ݎ?dE"iƣ-b])^tc"-F`P{XՍW ZY8qT~(_l"1p$0 |DAֽ4|!DYt>Ilw[ "ɪB-B:>\gf&1T2[!uix;[ Rӆw:.7mʪnf*Iq t0b\v<F-JRANޜ/}="jT4'p}H`_Z.73y9^kC} ʲ]mjO0Ilڸ I벻˗ "\kaٽ1/ȎLnt0WZDi Bn聥EI(կ|)'+c&5B{"ì;P%h|4,A+E!mYCG皵&<Qm=Z$ygҧE2™ b07-2OKsX*s7&4:ڥ[&Q$~F }({ĸz3q6!*z[1lc׎՗4kX-\a&y9kxMHqsy>Z U=5%KXjPɼ@.t^x%Uw'I9B6ӥ?Ak_Mi9 sK9rCd>IGIh\P_Ti[mDY4F@Nw]Zۧ$Y :A`}j L4jϝSO%KIoQmӧxDXTس.]L5f+Rs8] YϴK}YP{!Y׏ɻ M#55卋cul=z+u8}~@dy0[,-)A/e^|?}yۡ*}BݤynDûֆ(w!F^aZ:9A>B/- !565ITuI).e"0P'^# 'f;'D72l}tGTUO1CChiWuT ؒfn| ozȤ '|<{'`n(} wS=JqV2 ?l86wi{=Jd 7֟^7N R&h{+ƕ9>8y>qc Y iy&5tM,1 ԉj_)/qޔޗrtoonykiܹA/ĒU 6::hcOKPoH1$&8DlQc6VX6s V(`$7Sۼ0T&J N`þ"eIYd'#h;IbEYMf(F>anpTn_{ɢR@ʂ EY  pz^Rȇ~& \Ě`O!4HkhB?[X(FWDaeLo0vx"N>N&6ION_M)Ȭ5&,;q ҵ7 X|v; ٪^ 1X4;S#+l9S 9I@5o\!8vGHu1{H DJowqsU-aZUl6#U[# ®lg}LeS_r<$hSCTA_) K$iqE(W^\[-k@3W0ǝgPr~=j;LnQ&^*1sԎhD_qe% }{'_ÒpLa$Kiu]%* ߶[8 kGAV]Ny _iM+ ƁJA%; b8XM_YaR0fuOd*$:G=zLo3mo5suD[zux#ßJC\HAZT'bUZ|Lh&&;f**-{NL O14KJJuI]RafApo%S3E-xNV/ٙ !5N?M0݄1ӟN)ӴAV ֪NfqnYIegDc]4gi`WS˗ɀzWwR>3#.\0?M^soBQ쥮q[LdEX>My.$]-Dyh}<(ITՄ{#Scm̩"xHE\D*Ξ@SdiEn/*T8 ;& cg6-I\IR{$mkY'<%})/VJα:&㭫W12k'+ő4W-7WoJp"!K.Ϡ?Q f4S@]-2:B& 쾮fJA)Aybd^* z2LO-0TciHUoT,u.DZzƁSbU`Δ(^iZ'խ,M|Q])3t X bԤA?Dm`Ѱ[hx uy/SZ\(Q(=;87V7=q *NJ>P I+KF0vNf1B~Ң q> rOq3"h5S6Ã`\mFr ni1 yq 0[oɖ,ڗק˓Qw$go>EցwPN]i1(v-"z0w'5u4s3fO>rpE`#?w:[E3'z"MuTRLk ۫niLcc.®{ܞͧΏ_lsEq d9WA!((ذ"{n)tZ7'zba%ĝm5_XM[$+Iڬ\;W6KD0aI|HHҞөx׷7:;Mq+& H\ ҆Fao -POUr;7Tz $#ԑNI5]wfZ6;@t V V2&:1I FB;^4zV06YǐɲG69AA?ҹ)Fk'J?V֎.Zy!hw'p3K|uk /Dmi*S dy93WjvJZsHr8`ٽE'Tj#j)ƭ2f"ٶu|ɏE)Ic_w/jt|#+ ǶhHy73'7u*“M&] uбCx9r"{zǷey)8 | # > zoxh I'ع&v~N4)Ko?_{gᚂ#soȀ rL*zzeĐ#10×g{j: n3ʩtp A-y'i㍈a:Sq(tlSpiv[0& JhNcMBTVM(qчyBI!^w!!^Ig "C3R Y(,4<68t} ر땸3':`J*A ֺBs#zdU#|5Q#$!٥7 * mم&7!ȷTSdis!3jkvT5盓 n>| o}E{;誕(_EӘI( U~q馺jʄ%ު%r-81*ӫw&8( ;lz@A H 6c >LS'R}4$ux`-\,׫C ERhc Gk [U|lSIO)OuJ7(7\竦Li BφbqbeaHZٳ?TrCƃrS"KI}S_%h5~(HgHgHY$~'y= (gaC2p1h&Ӥ eɤrɴuG]~iT^x:*l׷㫲=洽> Dl4)5TW(+$UIQQ{M}hY'Rs.=hd?( x.jߴM6ǩ]iWQ:4rBF#p*I7!*TA L+k.p$##"!!o^5z,͓$dlsDqEO6)$ A*ל %I?oβƐQ$zx gF"BL4_^X{V6Xw%hmaPVt۳ &0$u9 E ǯ !*?7^tFt .}@P ONV` A2x5~w@c -Z2|CٯXeJ1JP~x5w>CL )@ Y2m"g;{3`ك׶-^ƬC%AAϡQjLHå;^ǘLg[~Z0sH_˽ 2Q3*2_,wTY2W)p٦ [;6 2F¼O&Oyu]4tb*Tb㍚n>F7'ʼNZ =T1KF5@< K'Hm@{kIPؠUŅلUM&)W"t(灧yt{:XЖLdLg* u0`@S[;߰a)"2\K6y|y7Wm:_B%yʨXpxf4DD0橷~|7GxenϹ lj 4c]UHErh,I3dYE_ -R` F6 Hs%u@>GcuX#_3yb<ʝ$%& Q(Ƅ%x#=;i]gq[73jE-7s\(3 3݂!ua>\ ÅMC`fq*zK+Q*?jMgȋc\]D[NaO=%UFUAAo1/c6h=.Z˳S `D- i!@fq;sωL0)c: &+nC]D4&UAE&dAYߑVMYfGysh%L~m0?[|d케S^/mf֕Ew*5#gqdTU Y k5Uǎ%*~A?mjC5LnX,^>tZJ6}ӏZUHLqSmzol8tRTV`E8Sf/>oGQBCXC%)dju1ȵI‡wnr0M@o%7Vsu2.g3(pd}alb ;'hFÒN{^B)p<NU<"8η;c#n=G*4+w3{U!ry+A{1@Af7lgD iQ4Vb菃O '۩agk/sU1mp\FD!~\̚Eh^"@LZ3Lȼasđ wIk'a[8/ ~I[<%]n /}Nֱ5_fTTcl]H!p=v.$,M'~8ozx(,2cQ('+NuÇ<ךeBޗbr' C~٪_ϞzebݘyhH_whyJ 3= 5E`n3u.AC&[ئe=vBKLy]cҹAtҿ|NF[ݮuXdxfxa:ڜbD^F!V'@lFf3cz߿f!>#^f@+5 }G߶VIiH,]&8Oy]&xlHDv8M߃H*;A?4%A,d"7JPOE{B7B;e0 QCOH8f/~w\lLⲽ6OA,hɳb%] jX. n1~&4Z8л@jBa"P{O$Y\6W:=EkA=DTaV٤fMiDDآja iMRl}tJ>q:ڏѴ_]@ b^q(Nl.RF3ތsA5s k݀+dV4B`'7j "dhy.q%r>'4]g 'hB,6EٜnE GL=v_ 4d@S^uR]?!]~?."{.aǰ_qUւ)@",fp9mz64 PNRӢdm2I #$LmY_^b*kL^:!% CH?J1{Yɋ%/%dIe0142~x4.8>tnaSœ;9ЎYcg{!`ꆽnz =[,x#B^ ZOg0' KZ,GbLyF3 )|R!p(7B+1,2ho0+?ECrʅ?-2:K0dEB4msTA"GIX֎VS}k`ujcΨdLEe2ԛ:FNXQ;ĚHj."M~3#gC7Zč?+\9uiJ\Y-O:nh[san|lj)eE+T~XWP%UHABw)1N,>*E GV8|WA@X|ͬBf)^Mqws6{fuSäf|/JA^3^$YKBg Eڢz5腉_qu|nڥlwM[j*X-UG]")Mڒ'ftoOY |HLkb>FG&ZMFmfYo}~y Xֲ ~id[{*J TlZl#W$[*ǒ=Nތ&k 1>Ee >V2ZeѲY>Cd% Cx6LE%AP2|r֦)IG[ yؐ-lʯHMa`ad !\j,xX#Y(o\!4؆#$y3J|2(%E/ZTduH\vubv%Y ئp໵QA yyC%p܂gmu[f⊔Еd~dg\u=KU%]m~(2Gq8"nr"δBɝL9OzU0əkU\;qڊ^8" gk0O'[ٰt[]K<2>JDcJ t8:xaev?`Zj"%BIey4&:߱L\)8v{hmOLNQWhO+͌_g'&d|o.!ePZ|^PGAWL&"K~@vƸa;h" UF`DOuZw8W&yHBpk}# к27%|}K2(~ƓHZ,̜mdp,-{q88JmVm[]UQڮE,s|o 1LCzOC{p'5j4@u4CGch#}K%0n0CzB}$)BOew'`(ÒOLtJ [OkGsնJ`5*.DMԄΎf0.\\=xh+HDlfENM~Mi/ Ý|Ɏ8 "]R*y˛ƾ:uTz\9\0H~;bgd/mMJK?+ݻ,f“y(zQS/ F;s'k&eCFMG&.G!ڣnD bc{Ϭv"q5@%uc{g^"rf]:`90 aUv\S|sW;КBk٪Ŋף"d~t!o,?jli}!8>ԝ$E? aG򙗱XuP>}!ܽH,^[8 䣁_k9=feW|`"kKf `hF_LȢ,l! }/2=zn׆iwy`gνN0ilgɚd(Z.zt⇅yRWMŇ o<餗vsj[4d4jCXV i? "STH![,ŎXgm烛j3&Dpw#^Jza=<)| е25MFFz<7T PO+^PM)\/?(K4n\ ebUw F5@Q -lU5Q=:u9`#un:QY~C},lXLw/9/%Ls >[D*9>^yܧ 4Uq5L{ľ=2j H" mh |3pFO8k'v5-lFsepmȍ@xZ:*7ⰮF{Z j98T??980 ڣ~f|Ͽw|ǯ0yu3j.BtNɟW}W 8Dun?sNJ5wȽlFb&2-2gdPX,F(ubrnϔ[drMp곯Y1}-#;تQ* c*,Tdz] !$"{Tk? 4m"F-iSjNJ2Pլ+D`0TaT.RR/QC|A3czZ05 BKilUPP9t_Bs()q\JL&H6s؞2Ubo2Ec[n9_bu8 qb;@Mmdr?Nw4NrmJAϩhblZ?BAu G/{<1Y{'AcBL IЫ=Mm) 9~)48,TKgCQ.l'`,F$T_z>l&cCs"`YcRd@E Y;GG TJ^ Ś UOT׻IGYȲVu4!ff>F{N*[$D t$0DN CK~U-5AQuwVᛀERk&=ӌ7sU7ɭٲF3ͪx9 c<jߜl-j;O;viXd@tcsVӒ(S"(M ~1ERmzkbg^$DӛWmpm Z, Ě[2}7/,=p٩CUS;11b63RoyY3% m\$39jBɁ+̍gphd܃Qk7d.Hn2QJ>z{#I^Ӣ1e]Ƨ] kmoJj9+=PRL򾧁G1J* Cfg/Nq .Ɋ3_^C~2[?ih|g_HwQ-ᅁt-2Q2,;63OFu`+_^+WlGZ;ξcG*Fb=?(s&q*hY?9p<%\90j*7lQmcQGS8[L06"<֩{(;` De]*%vݰyCƃh m+d+ xssA5MVw=:-E0{P:M{RE~|) tSk4щDGi"<kGg$HEL~6'} _Mk.T63QҿcP¿4᭼A0 ]1WX' Eذpt7ܪy2ߝʬFTvqä?9~ G*׶UWDI<d̔at9´vPk_E~.FR_Hu:;]{`o\ؙOU\˩"]!#;HtUЛ+<|_H5 ζղSpy($}[uMREg+9dUr y8n0NP ~ae]~(V&h13a⩀t8K)u zk$`mقUEC05(u+kf<Zx9 Qx"a<_&pJ7s$b",e AFM:mzB̙_4J06m WLj0[g/au=i }!M^IWt)cVj%&e(1`1t祉<8MP:nŰkP؃G0MN<84ͼn%ݳȜClAA#j?]3$hW:g6ii-o&&&6S+Hji7XKO9 '$y-ZDN*D+5{Bє p%'{֠d,&Jt-rЀj͛Ơ|Ղa Zܡe\YGx C b ? E \tzW?I!I*DޘB>\[sg!|L1E||N/v".iCE3/k[`r&4p[p1 *4+yK쵱:5rdU+\lw`繾X|j0P:P~Mih4˟[v @㉩Nrt\h솮dZ:xS.0~0D"Av^;ԗ<$o$'\"P836"9 ca&|}&mQ0B'tW$pb$gm>$@ieʞoۊ.[':oΤM'H K'#~/3$nAًoS =ޗ57(FD [Krmh(MELʚ EQ>;66 |-+A v881 Rzń5-A V/8|X |FdyZҔMy%T5B p#! 9K,>9tJDz[bܝcf5f{|T|F:|#I}%-@'*dl܎i,kIL{؟P *@s(C9v4.s-Ɇ gì|MIb~~6Jn.2.C ܺ;X/ge<”$\r-bbg” :v8 Zժ 5:"0q?h ~F፛5luS'"g:qC9*W|+/PE3GkN]]sNxz[ tԏ1|_s'?!ү^\Ȣ9'} Jcv[uG/F^RctWo"Ū|g GJ`=zۢ/WX+Lt*kM%R,&gi?Ǹ4Y_ Xx]D<.n8r;zZd%'[%_ᐲ{]K}l0iN0B #3\ ^(/K#J B{ SX`OTYPT,.{n  >9*ĕ߫,lB?vJ12#K h#dB:Jd}L! ISHwM"] 7IX1lRT jPPhQCR SمPcm}Qn<0oXuI eKr#{T 0Z+rP-!j!Wiȅ\2d9 [b"RzMU7hmB=pT+G6@_#Nܿ6oRmNi43K%6E! !̪%ڵj>[Bdw0zmO$>'-JHS' 59ML!ϩ6b X޼?Rx|eY ]#޼z RGU)J{E)?؍.ē 09瀘R* v"l٠Arh/Y"/1=̵]n5j^(ρtF,[~8ĆX8{~bX-B*_@^1ϻ/icXC4HL (]pkͷ߷۶>ћyq|%b9ƪW|:P܄JΒGۿKOЍ<;NFu&"#9A`O=!ۡHAbC!XkP|} #yF-H-4,:):M@j|(1zZB/մY;P$Lb 0>˜NRj#:eT1/fM6V[m= мP# %W_7\>pOZF\!6 =wѭ }X$r_ƩW@ϸs= qmn2Ω]Xht] y4:5/laEw`Ry$)t :# #XoN7jzLcaН|9D!݌&޻GshXY!Oyߎ0~4,.W^+ҨtQcUKS٥@;+S##FVZJ'SY2QO60yj5+y)zkXU.vAgMc60BRg#YkVNClvCZSg-nhhS`$\^Ks-8%\#mJsk%l#ZRoaxDj7 RIt9(\oTR } :ϗ=wq$LOw?M(:ưJm`a?cTYJ1GgaWDa,&r(<0r 4-־ޗI͂Os3d$oO5hǶ08@5X l-Iɳޤ#o}dzQ/mJ4竮AMEs@whޭYyr9P81I,6#k,4QT9וaI(.д.8C2E&E[o0'"36WBa߻*vK`3yh3?רm*r´%B5ۗ٢$1L\3(ZJ]:Mù/<hB組HM(4_&wCbfNPH[AӦV-s[YȊe |_ })gP_>}+JTj@xA"¢ԂQg!) Oel!}ƽ3X1j͌ҾYVʷJ.NSF_$\28h9QEo&@^aWpm\En0@ R!ߒR5:osxox[wpΟnЪ9fm^fP9J{7>W7X܌M,^/]lwMl SL/{. m]W - :JޔL%uYcsZ9U6z"҉Tcc]ε*R"!FgV.Mଵӣ~qΒqŦ&y+@ @/~U#_&\0Bמ{]TWݾB}%UŜ#+p?jLn9G S FGPr9k)C-@ /@;E rM߭JjiIڍ˕'-5A\+DKk\] (\`!Qxֹ%8]ԥA)ߵ~O}1~}Sꣷ[QBNaFΦoiAeBywr0jrkL!d:uNJzSK:66]I. i? ֞ à.ލ*p#?k}5l/FLN<~\iM`Tvz pVi, i] ĆĀQO7EOACMy~I?:;r-3;C2+sq1(8$̞7Zz{()T(,. O (v2M*'Ӊ6wBgn5[ MNM}>!OqU2^,`R&a#ޥkwݕ8 lvVZ໚'F:"ה^O7bz{lctN< ް9ϧ !lJU<g .iIUd:!yXf*58J AMPwE0XyX?bF2V$ ;]&?j_8lJe=w z# 4`ؼsqlEvdm3IMaSv7 Uw B"E6Wޓ|)j_@FD,o]$rPW!sN}ŰI#"֥Du,)Iχ  H|L\@GО^(t .kP1u-UF]B+ U@'9ėFV90ԪlE];#e 'LH|\_T/ZReWSξ[ƮM)7`x^$Wi ұE a{zlWJO؆-/{MmfvsZ1fvsԤЕY4,-t4g@G}u8vd_ys{\<\g{GdϫD O1bcD^;xt*`Vn6tѩ`5d@J l%$<[`qngIe]D$`xQxT{ٌvr0y(v("4|_Xj6)&yjo829~Ų4pP`+q[ZoNڙQpL/0{6s68 NĈVҋXzY!+R2_Ҽy嫗`foX .e CE"g=\9B4AQ֒=x4`b⩓:"k/ ND4"M@!oѳ-3H,,fdag1HD(@j MGAY}oaמ#>jcȶ5ZţdWg.9 S+ثܗXBT/!/'U`P DjbGC\V]F}>F&r7M*IC{_9i=eE5UUŘ%+NsXe(E >*="T=nb8]n%u"/F$ L02npCB•V藋/z[@#qS,A}k'ǣ1̍} ~rh:<[_E׬,3GSUz{҃z5t17ϯ@D=31FeQ覆J*W6}I[8AtT;%y>K9]I5j*Rm[FgA8{Kd 1_UP|<{,cEG?xxU~& }}TU7%7'M${eo, q9/$^‰/m7Xa, GL\Nq(cq+?GJ̘<]&k1Y@2qHsl-p0׍3gk^VLN7/X].u܌>[V@+eWiGEXnsr>0mT#FijfHP 4m<~X3؋6a0B&'>fv aNؓp2h!aqD@ǀ3d#,:hz4xY+rA1ܮ%F̜t23m9lyl1l!t/LYgwZİ_ЎPHM|}L6MΨ*Xu jrgvOFtU%IV̼I|C x sF>zHPD&ʋt'O]p klOBV#`SI{Lk!NFӦ{A|wDTb]+RO7&)Y>cZO+T%ߥ9ѸE#W3̞hXun+I 7ԓJZjN̞hoUE؊cN0={\$ewpҭ$;sUHןhog1.@Ri.-vU+06{KnjB" O'jёv^G*sZW5 jl:hhO>Q|!LTO#^duz%)Hc~cET#$<+P/(h& Hi:D2W!;|vPі'+h\Av.FġwFm˸kZu'3LhOlTyhh?/߱[:K`gx{')GYۢ?zmiB?V59r)Ox@֝Z99az-W`:P].ն KIrPQ05ps"t{'369Zkup LjDdE+EwIqL;1RPfFㄳ?HNQJ3ޏ~Q h7 ;`s٨0P;#~H~Yˢ@}.F-&d{uȜcsw~~—%IAgQbQyc0$+w=BMW?ptaS+}yP~J’Tqv}ս}%, c1S g}y=lx`(L^.8@۳<9nEG.*ߚb ls4pj YnhF!ć0'*Wesith[K@FXBPktZb hTבrrak)7-^L'ygx$F$PaԌ;<45ąFQ2Md#d!PߖN}qe &M@j&e]'mLq]KVS(:WsDX| >Zw=cqN˝M?|ljI]8vК54G ~H55J@5D_3M+45q7G~w,Ӑ @_&|)fv6v*%(V KpiIsqFKuMZ6+-ʮ?#\c L*` =Ig="'q,JQ8錤 ض%XgC\ԓ<xB_@3aOh@JD})0b,MY5{:9\Jq}(gL##=H"@%ac3~4͙;X" *!VuM;_r-QstYMܠl9K˝V[{D0tj8 QDu5+uNc=JyKx;_CɵeŌY;*h8򳜎7I[Nf?h*p4`- Ldv  X$ҽ+8O; jCB%$|Zj9#K.2gϕؿGy!˩U3͚ø5<՘/waDq  [K q+Yࣄ&~XSѳm|srCF ^\ϵ[+]L $ =7u`@o.S!IJajN ~۳3h%RXs.{+q'%v^y@ yEc-`6ky`4wjw4I 2 qVf7$%@O X Uʌf;L*1#>v_ sNZqI/MUT!"Uސ%{Ώ$Ն#_e(q"&3=7&5ە @đquu!l_Pl @􆕅~0*)fOH?ϔa$"c`st.LD{0Q:`!X@|G|3_amR+m8Ģ|XB` [>?ێfreСx;2jH}׽6$}{pt4`h2$!L<#K]a蝓u> ̵vTߜ.YM~_8=B{wgRӏfdÈWN#8~6rV7Ibz=:ߗ R 5dz.=ۑ0"uk*\vgWu"?_XOb`=ZHt1,FIOyOKGXWSaZ7W*Ԩǧmgv_zfPѻN 0^T2p">Ebg7An̮єBR -g`a5N+++`FvqS&&MS|YJP[Qd$XB҄PI.p6le3XoQUN^"JO5aςN!oY#a `m܂,ubBۄtzŘVtG8fw׳3.\y2AҘ (NOI?F8ڙQZ+A,&cK[1%P1 T="^׍KO*J2 4lmHeWfnk^.^| xWx6Mm%=Dx5(¢Թ#l ڄf^v{#TԆnTB6WBh#Ez͟^cgZȤp< 2"D+CЭ 5odVM BZ;?#Ь[YJF^ <(W(y eqPӳ)9\&Ly|'L1W>L""Yd8z8 iHTE&5e|w6h{H2 i8[&_>; uQtuQ#SoNg.PfSz[OuKqsAύbg+:Ykr섑N.qy"lek\z5Y]btߴ@Lqr`Y@ջ/x>-xk@>@uul7c1mZ454C.g't0K$l9bć1[E)NL$fO8oB>ܢ-\ȈܝRPw,MbMY/K%**~ v@UvZ=6|͔ȗnMِm_%\H݀7kgs~5ʈ \fY= &S!fK3~qصc5Oۻv'6ʙJJK(Τ;3uFc b@>n(ܰ'b[Qv8ARWkqV NⓃ{9I|/o1T׀X29/AZ1Wb?JX իXHHr^ pDz lj:=]{6|&`ƣA2ƈWEDN^XWd oxlvִZ`$6KA"Q\T>9>P|VLKtXEK(rR߶`*L6m2RQ( ns*z!Pe~vXˉ9t0{1yg Tz p~ɜt''±3ʯD߱wmS> = e] h'h,wb _< D=+#: G]@Äy.MVy9ViԈ;h*ʱ޶%U7!8%I|@!}J%(TlŃS2Cdaq֛ѻQ2`{@vJ"تnI׷-P~ [$7UEMv=xWn;^x U w eͿ _TS*Uō<٬H5H@%V/6pdJ sG6Gh$G!r~w\zЏwO:88v|o?|IСJcۇh$XOsC%s' 4 R󭮫cbʴx'|BTX0JJ`=V!IC iA8V}SaqHǕ yENK?;[6u L=[`zE!Ⱥ2!2%eBJPenU'Fĝ2ǩuO[i3Ħָ&ʨ阆A(V5T1Ls+-sCwo?]1`)=pf8s87hCexP9/5ް\LP"V7? ToV&26=`Z $Bp@!WoہBdy9 ˉASO&ĜLNzT08.z&-VHsU\kΎ wnh~]T<;'{?qъH΁G?>rԫ2Ĭ'l^Mp:#NJ{D$3YጚFB^PRWeY!|b3tݎ2+w6-ؓO{^[][G jB"{k2C][pb_I;ؗW*|ְF˶T{6usi'}FYh<7JiL ⺥\Mx|G$13Cm{䶐9Qgc#cp藾c]} t[Evu~bն F1Fw񆙦tۏopuI&&Q 7&A$)'hEP7$ț@4GMF+;W5=ņ?lZz"< 7NλdJ:Ynűq=`>X3GRRжz%(cw# p TJTVlJw'ae06>-cWtzG_"@J}ٷJ A3>wÁ*0Xt>$ЦL!_Z|Z8j&A><#P!i ǼMjf1JjxRZ+PύwR |,q#{:LjҸ&' $@lY'p>\j \PwĢ0XW;=, ehzE`zsKnC:ž>\, yqX5K"^G#,`U[N$BT ~,B1v~Xѕa>S7=@41h%ؤ#yn]4ܥ'1ry/}q vqL > %9nLv^9PV1LggOLGj νmxؙ6 :oq⸻`p#Q6Rgo!^5Zq1fA?QA*u9풄%nqy%΂C[d_Of=I- F4/I3_jBڏ=G :ro2λ;ev|L'a.?~cO7?Ht"]=Fsӫ+ r>eiC|*޶ubf%svJ<":rEh8t U+7? qi2qu*%4#Pl*)R{$Q{/;sEjH(8SVGEO=kӸs.vJM h {Zvw qQgb1iUڡ^Ҽa/IPke^Β:+eꯙзq| EOͤ+A'HTuFHh\OCf'*O Q7}X|HbΞg#72.=z Vo{4Z :&yVn@*'o?4X9*Oy?xJmܸ} cca_k'uT*ZpPu6eɖm C4 ca4?"ǂwG{dY;9D:o  H>ݪQ`kAkeg%N̩dIVlso5|23,3oB4*#-|3"`LZH՝qPC7QGe2|z1$7Yʳ X # ۚ4%^&V apSɠtpz̀}^3}M[L[{y_(Ѣ~C pSwK@YXtd󳞥{VƱSedIH:v3{:;Δs&uD$ 7fS{G f8:jONnZ`ozW$37N}c{xڸ6&%f~C1F FD_\R C%9zOD{E16ǁG9}ekzED(XDl8/:S>|"Rx=]C & `hO$#2ɮIEdznn>\AiLڬ|I+bCS<AtPhw>F]SE28 dP=+|ȩmqq*>1nHnGG%?B T癮Xi*:[XQBUA tw/q7A{o1Vae@+Nٌh޷! w/X Ή_ƘmyaR0kgc$7ˉ=#ޣkw Sy"A] 36Atbe Mlopk^+)|PX:٥7/8`? hdugn7> NYKrGw1K͐X&h.jBP@E}@ȣKB4?*-7; 5 B$6d[$/>sGpv٢A䖹kͰhLhXQ)+ i1$/^UfGȚ]с(ybp5d75jTȋunrTiXVnM)WKGP\ = fRBߓ 柙3uJa{)ۆłbLC;.&`Q!&26FȳQsxa\uN|Ϧaߥ^C쌂X51ZI:U#=HɕVV>0 YZsurveillance/vignettes/hhh4.Rnw0000644000176000001440000007711112023615777016352 0ustar ripleyusers%\VignetteIndexEntry{Additional documentation of the function hhh4} %\VignetteDepends{surveillance, maptools, Matrix} %\VignetteKeyword{getting started} %\VignettePackage{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preamble parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage[utf8]{inputenc} \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{relsize} \usepackage{epsfig} \usepackage{comment} \usepackage[english]{babel} \usepackage{pdfpages} \setlength{\parindent}{0pt} \setcounter{secnumdepth}{1} \newcommand{\Po}{\operatorname{Po}} \newcommand{\NegBin}{\operatorname{NegBin}} \newcommand{\n}{{\cal N}} \newcommand{\surveillance}{\texttt{surveillance}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\hhh}{\texttt{hhh4}} \newcommand{\R}{\textsf{R}} \newcommand{\sts}{\texttt{sts}} \newcommand{\example}[1]{\textit{Example: #1}} \title{The function `hhh4' in the R-package `surveillance'} %' \author{ Michaela Paul\thanks{Author of correspondence: Email: \texttt{michaela.paul@ifspm.uzh.ch}}\\ Division of Biostatistics\\ Institute of Social and Preventive Medicine\\ University of Zurich, Switzerland } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \SweaveOpts{prefix.string=figs/hhh4, width=10,height=4.5, keep.source=T, strip.white=true} \setkeys{Gin}{width=1\textwidth} \definecolor{Sinput}{rgb}{0,0,0.56} \definecolor{Scode}{rgb}{0,0,0.56} \definecolor{Soutput}{rgb}{0,0,0} \DefineVerbatimEnvironment{Sinput}{Verbatim}{formatcom={\color{Sinput}},fontshape=sl,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Soutput}{Verbatim}{formatcom={\color{Soutput}},fontfamily=courier, fontshape=it,fontsize=\relsize{-2}} \DefineVerbatimEnvironment{Scode}{Verbatim}{formatcom={\color{Scode}},fontshape=sl,fontsize=\relsize{-1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library("surveillance") library("maptools") gpclibPermit() library("Matrix") options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ###################################################################### #Do we need to compute or can we just fetch results ###################################################################### compute <- !file.exists("hhh4-cache.RData") #load computed results if(!compute) load("hhh4-cache.RData") print(paste("Doing computations: ",compute,sep="")) @ \maketitle \begin{abstract} \noindent This document gives an introduction to the use of the function \hhh\ for modelling univariate and multivariate time series of infectious disease counts. The function is part of the \R-package \surveillance, which provides tools for the visualization, modelling and monitoring of surveillance time series. The basic functionality of \surveillance\ is introduced in the package vignette \citep{vignette} and in \cite{hoehle-2007} with main focus on outbreak detection methods. The following illustrates the use of \hhh\ as estimation and prediction routine for the modelling framework proposed by \citet{held-etal-2005}, and extended in \citet{paul-etal-2008}, \citet{paul-held-2011} and \citet{herzog-etal-2010}. \end{abstract} \section{Introduction}\label{sec:intro} To meet the threats of infectious diseases, many countries have established surveillance systems for the reporting of various infectious diseases. The systematic and standardized reporting at a national and regional level aims to recognize all outbreaks quickly, even when aberrant cases are dispersed in space. Traditionally, notification data, i.e.\ counts of cases confirmed according to a specific definition and reported daily, weekly or monthly on a regional or national level, are used for surveillance purposes. The \R-package \surveillance\ provides functionality for the retrospective modelling and prospective change-point detection in the resulting surveillance time series. A recent introduction to the package with focus on outbreak detection methods is given by \cite{hoehle-mazick-2010}. This document illustrates the functionality of the function \hhh\ for the modelling of univariate and multivariate time series of infectious disease counts. It is part of the \surveillance\ package as of version 1.3. Section~\ref{sec:data} introduces the S4 class data structure used to store surveillance time series data within the package. Access and visualization methods are outlined by means of built-in data sets. In Section~\ref{sec:model}, the statistical modelling approach by \cite{held-etal-2005} and further model extensions are described. After the general function call and arguments are shown, the detailed usage of \hhh\ is demonstrated in Section~\ref{sec:hhh} using data introduced in Section~\ref{sec:data}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% DATA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Surveillance data}\label{sec:data} Denote by $\{y_{it}; i=1,\ldots,I,t=1,\ldots,T\}$ the multivariate time series of disease counts for a specific partition of gender, age and location. Here, $T$ denotes the length of the time series and $I$ denotes the number of units (e.g\ geographical regions or age groups) being monitored. Such data are represented using objects of the S4 class \sts\ (surveillance time series). This class contains the $T\times I$ matrix of counts $y_{it}$ in a slot \code{observed}. An integer slot \code{epoch} denotes the time index $1\leq t \leq T$ of each row in \code{observed}. The number of observations per year, e.g.\ 52 for weekly or 12 for monthly data, is denoted by \code{freq}. Furthermore, \code{start} denotes a vector of length two containing the start of the time series as \code{c(year, epoch)}. For spatially stratified time series, the slot \code{neighbourhood} denotes an $I \times I$ adjacency matrix with elements 1 if two regions are neighbors and 0 otherwise. For map visualizations, the slot \code{map} links the multivariate time series to geographical regions of an ESRI shapefile (using functionality from the package \code{maptools}~\citep{maptools}). Additionally, the slot \code{populationFrac} contains a $T\times I$ matrix representing population fractions in unit $i$ at time $t$. The package \surveillance\ contains a number of time series in the \code{data} directory. Most data sets originate from the SurvStat@RKI database\footnote{\url{http://www3.rki.de/SurvStat}}, maintained by the Robert Koch Institute (RKI), Germany. Selected data sets will be analyzed in Section~\ref{sec:hhh} and are introduced in the following. Note that many of the built-in datasets are stored in the S3 class data structure \mbox{\code{disProg}}. They can be easily converted into the S4 \sts\ data structure using the function \code{disProg2sts}. The resulting \sts\ object can be accessed similar as standard \code{matrix} objects and allows easy temporal and spatial aggregation as will be shown in the remainder of this section. \\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Influenza and meningococcal disease in Germany 01/2001--52/2006} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% As a first example, the weekly number of influenza and meningococcal disease cases in Germany is considered. <>= # load data data("influMen") # convert to sts class and print basic information about the time series print(fluMen <- disProg2sts(influMen)) @ The univariate time series of meningococcal disease counts can be obtained with <>= meningo <- fluMen[, "meningococcus"] dim(meningo) @ The \code{plot} function provides an interface to the visual representation of the multivariate time series in time, space and space-time which is controlled by the \code{type} argument: <>= plot(fluMen, type = observed ~ time | unit, # type of plot same.scale = FALSE, # unit-specific ylim ? col = "grey" # color of bars ) @ See \cite{hoehle-mazick-2010} for a detailed description of the plot routines.\\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Influenza in Southern Germany, 01/2001-52/2008} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The spatio-temporal spread of influenza in the 140 Kreise (districts) of Bavaria and Baden-W\"urttemberg is analyzed using the weekly number of cases reported to the RKI~\citep{survstat-fluByBw} in the years 2001--2008. An \sts\ object containing the data is created as follows: <>= # read in observed number of cases flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", package = "surveillance"))) # remove 'X' in column names colnames(flu.counts) <- substring(colnames(flu.counts),first = 2, last = 5) # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", package = "surveillance"))) # visualize adjacency matrix image(Matrix(nhood)) @ \begin{center} \vspace*{-2em} \setkeys{Gin}{width=.5\textwidth} <>= # read in observed number of cases flu.counts <- as.matrix(read.table(system.file("extdata/counts_flu_BYBW.txt", package = "surveillance"))) # remove 'X' in columnnames colnames(flu.counts) <- substring(colnames(flu.counts),first=2,last=5) # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in adjacency matrix with elements 1 if two regions share a common border nhood <- as.matrix(read.table(system.file("extdata/neighbourhood_BYBW.txt", package = "surveillance"))) print(image(Matrix(nhood))) @ \end{center} <>= # read in a shapefile of the districts in Bavaria and Baden-Wuerttemberg map <- readShapePoly(system.file("shapes/districts_BYBW.shp", package = "surveillance"), IDvar = "id") # read in population fractions p <- matrix(read.table(system.file("extdata/population_2001-12-31_BYBW.txt", package = "surveillance"), header = TRUE)$popFrac, nrow = nrow(flu.counts), ncol= ncol(flu.counts), byrow = TRUE) # create sts object flu <- new("sts", epoch = 1:nrow(flu.counts), observed = flu.counts, start = c(2001, 1), freq = 52, neighbourhood = nhood, map = map, population = p ) @ This \sts\ object is already included in \surveillance\ and may be loaded with \code{data(fluBYBW)}. A map of the total number of cases in the year 2001 may be obtained as follows: \setkeys{Gin}{width=.5\textwidth} %\vspace*{-2em} \begin{center} <>= par(mar=c(0,0,0,0)) plot(flu[year(flu) == 2001, ], # select year 2001 type = observed ~ 1 | unit, # map of counts aggregated over times t labels = FALSE # suppress region labels in map ) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \example{Measles in Germany, 01/2005--52/2007} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The following data set contains the weekly number of measles cases in the 16 German Bundesl\"ander (federal states), in the years 2005--2007. These data are analyzed in~\cite{herzog-etal-2010} after aggregation into successive bi-weekly periods. \setkeys{Gin}{width=1\textwidth} \begin{center} <>= data("measlesDE") # aggregate into successive bi-weekly periods measles2w <- aggregate(measlesDE, nfreq = 26) plot(measles2w, type = observed ~ time, # plot aggregated over all units i main = "Bi-weekly number of measles cases in Germany", legend.opts = NULL # suppress default legend ) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Model %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Model formulation}\label{sec:model} Retrospective surveillance aims to identify outbreaks and (spatio-)temporal patterns through statistical modelling. Motivated by a branching process with immigration, \cite{held-etal-2005} suggest the following model for the analysis of univariate time series of infectious disease counts $\{y_{t}; t=1,\ldots,T\}$. The counts are assumed to be Poisson distributed with conditional mean \begin{align*} \mu_{t} = \lambda y_{t-1}+ \nu_{t}, \quad(\lambda,\nu_{t}>0) \end{align*} where $\lambda$ and $\nu_t$ are unknown quantities. The mean incidence is decomposed additively into two components: an epidemic or \emph{autoregressive} component $\lambda y_{t-1}$, and an \emph{endemic} component $\nu_t$. The former should be able to capture occasional outbreaks whereas the latter explains a baseline rate of cases with stable temporal pattern. \cite{held-etal-2005} suggest the following parametric model for the endemic component: \begin{align}\label{eq:nu_t} \log(\nu_t) =\alpha + \beta t + \left\{\sum_{s=1}^S \gamma_s \sin(\omega_s t) + \delta_s \cos(\omega_s t)\right\}, \end{align} where $\alpha$ is an intercept, $\beta$ is a trend parameter, and the terms in curly brackets are used to model seasonal variation. Here, $\gamma_s$ and $\delta_s$ are unknown parameters, $S$ denotes the number of harmonics to include, and $\omega_s=2\pi s/$\code{freq} are Fourier frequencies (e.g.\ \code{freq = 52} for weekly data). For ease of interpretation, the seasonal terms in \eqref{eq:nu_t} can be written equivalently as \begin{align*} \gamma_s \sin(\omega_s t) + \delta_s \cos(\omega_s t)= A_s \sin(\omega_s t +\varphi_s) \end{align*} with amplitude $A_s=\sqrt{\gamma_s^2+\delta_s^2}$ describing the magnitude, and phase difference $\tan(\varphi_s)=\delta_s/\gamma_s$ describing the onset of the sine wave. To account for overdispersion, the Poisson model may be replaced by a negative binomial model. Then, the conditional mean $\mu_t$ remains the same but the conditional variance increases to $\mu_t (1+\mu_t \psi)$ with additional unknown overdispersion parameter $\psi>0$. The model is extended to multivariate time series $\{y_{it}\}$ in \cite{held-etal-2005} and \cite{paul-etal-2008} by including an additional \emph{neighbor-driven} component, where past cases in other (neighboring) units also enter as explanatory covariates. The conditional mean $\mu_{it}$ is then given by \begin{align} \label{eq:mu_it} \mu_{it} = \lambda y_{i,t-1} + \phi \sum_{j\neq i} w_{ji} y_{j,t-1} +e_{it} \nu_{t}, \end{align} where the unknown parameter $\phi$ quantifies the influence of other units $j$ on unit $i$, $w_{ji}$ are suitably chosen known weights and $e_{it}$ corresponds to an offset (such as population fractions at time $t$ in region $i$). A simple choice for the weights is $w_{ji}=1$ if units $j$ and $i$ are adjacent and 0 otherwise. See \cite{paul-etal-2008} for a discussion of alternative weights. When analyzing a specific disease observed in, say, multiple regions or several pathogens (such as influenza and meningococcal disease), the assumption of equal incidence levels or disease transmission across units is questionable. To address such heterogeneity, the unknown quantities $\lambda$, $\phi$, and $\nu_t$ in \eqref{eq:mu_it} may also depend on unit $i$. This can be done via \begin{itemize} \item unit-specific fixed parameters, e.g.\ $\log(\lambda_i)=\alpha_i$ \citep{paul-etal-2008}; \item unit-specific random effects, e.g\ $\log(\lambda_i)=\alpha_0 +a_i$, $a_i \stackrel{\text{iid}}{\sim} \n(0,\sigma^2_\lambda)$ \citep{paul-held-2011}; \item linking parameters with known (possibly time-varying) explanatory variables, e.g.\ $\log(\lambda_i)=\alpha_0 +x_i\alpha_1$ with region-specific vaccination coverage $x_i$ \citep{herzog-etal-2010}. \end{itemize} A call to \hhh\ fits a Poisson or negative binomial model with conditional mean \begin{align*} \mu_{it} = \lambda_{it} y_{i,t-1} + \phi_{it} \sum_{j\neq i} w_{ji} y_{j,t-1} +e_{it} \nu_{it} \end{align*} to a multivariate time series of counts. Here, the three unknown quantities are decomposed additively on the log scale \begin{align} \log(\lambda_{it}) &= \alpha_0 + a_i +\bm{u}_{it}^\top \bm{\alpha} \tag{\code{ar}}\\ \log(\phi_{it}) &= \beta_0 + b_i +\bm{x}_{it}^\top \bm{\beta} \tag{\code{ne}}\\ \log(\nu_{it}) &= \gamma_0 + c_i +\bm{z}_{it}^\top \bm{\gamma}\tag{\code{end}} \end{align} where $\alpha_0,\beta_0,\gamma_0$ are intercepts, $\bm{\alpha},\bm{\beta},\bm{\gamma}$ are vectors of unknown parameters corresponding to covariate vectors $\bm{u}_{it},\bm{x}_{it},\bm{z}_{it}$, and $a_i,b_i,c_i$ are random effects. For instance, model~\eqref{eq:nu_t} with $S=1$ seasonal terms may be represented as $\bm{z}_{it}=(t,\sin(2\pi/\code{freq}\;t),\cos(2\pi/\code{freq}\;t))^\top$. The stacked vector of all random effects is assumed to follow a normal distribution with mean $\bm{0}$ and covariance matrix $\bm{\Sigma}$, see \cite{paul-held-2011} for further details. Inference is based on (penalized) likelihood methodology as proposed in \cite{paul-held-2011}. In applications, each component (\code{ar})--(\code{end}) may be omitted in parts or as a whole. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function call and arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Function call and control settings}\label{sec:hhh} The estimation procedure is called with <>= hhh4(sts, control) @ where \code{sts} denotes a (multivariate) surveillance time series and the model is specified in the argument \code{control} in consistency with other algorithms in \surveillance. The \code{control} setting is a list of the following arguments: <>= control = list( ar = list(f = ~ -1), # formula: exp(u'alpha) * y_i,t-1 ne = list(f = ~ -1, # formula: exp(x'beta) * sum_j {w_ji * y_j,t-1} weights = NULL # matrix with weights w_ji # [w_ji = neighbourhood(stsObj) as default] ), end = list(f = ~ 1, # formula: exp(z'gamma) * e_it offset = NULL # optional offset e_it ), family = "Poisson", # Poisson or NegBin model subset = 2:nrow(stsObj), # subset of observations to be used # in the fitting process optimizer = list(tech = "nlminb"), # details for optimizer verbose = FALSE, # no progress information is printed start = list(fixed = NULL, # list with initial values for fixed, random = NULL, # random, and sd.corr = NULL # variance parameters ), data = data.frame(t = epoch(sts)) # data.frame, # or named list with covariates ) @ The first three arguments \code{ar}, \code{ne}, and \code{end} specify the model components using \code{formula} objects. As default, the counts $y_{it}$ are assumed to be Poisson distributed. A negative binomial model is obtained with \code{family = "NegBin1"}. The log-likelihood is maximized using the optimization routine implemented in \code{nlminb}. Alternatively, the methods implemented in \code{optim} may be used, e.g.\ \code{optimizer = list(tech = "BFGS")}. Initial values for the fixed, random, and variance parameters are passed on in the \code{start} argument. If the model contains covariates, these have to be specified in the \code{data} argument. When covariates do not vary across units, they may be passed on as a vector of length $T$. Otherwise, covariate values have to be stored and passed on in a matrix of size $T \times I$. In the following, the functionality of \hhh\ is demonstrated using the data sets introduced in Section~\ref{sec:data} and previously analyzed in \cite{paul-etal-2008}, \cite{paul-held-2011} and \cite{herzog-etal-2010}. Selected results are reproduced. For a thorough discussion we refer to these papers. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Univariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% As a first example, consider the univariate time series of meningococcal infections in Germany, 01/2001--52/2006 \citep[cf.~Tab.~1 in ][]{paul-etal-2008}. A Poisson model without autoregression and $S=1$ seasonal term is specified as follows: <>= # specify formula object for endemic component ( f_S1 <- addSeason2formula(f = ~ 1, S = 1, period = 52) ) # fit Poisson model summary(hhh4(meningo, control = list(end = list(f = f_S1), family = "Poisson"))) @ A corresponding negative binomial model is obtained via <>= result1 <- hhh4(meningo, control = list(end = list(f = f_S1), family = "NegBin1")) @ As default, the autoregressive component is omitted with \code{$\sim$ -1} in the formula specification. In can be included in the model with <>= m2 <- list(ar = list(f = ~ 1), # log(lambda) = alpha end = list(f = f_S1), family = "NegBin1", # use estimates from previous model as initial values start = list(fixed = c(log(0.1), # initial values for alpha, coef(result1)) # and remaining parameters ) ) # fit model result2 <- hhh4(meningo, control = m2) # extract ML estimates round(coef(result2, se = TRUE, # also return standard errors idx2Exp = 1 # exponentiate 1st param [-> exp(alpha)] ),2) # get AIC AIC(result2) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Bivariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Now, the weekly numbers of both meningococcal disease (\textsc{MEN}) and influenza (\textsc{FLU}) cases are analyzed to investigate whether influenza infections predispose meningococcal disease \citep[cf.~Tab.~2 in][]{paul-etal-2008}. This requires disease-specific parameters which are specified in the formula object with \code{fe(\ldots)}. In the following, a negative binomial model with mean \begin{align*} \binom{\mu_{\text{men},t}} {\mu_{\text{flu},t}}= \begin{pmatrix} \lambda_\text{men} & \phi \\ 0 & \lambda_\text{flu} \\ \end{pmatrix} \binom{\text{\sc men}_{t-1}}{\text{\sc flu}_{t-1}} + \binom{\nu_{\text{men},t}}{\nu_{\text{flu},t}}\,, \end{align*} where the endemic component includes $S=3$ seasonal terms for the \textsc{FLU} data and $S=1$ seasonal terms for the \textsc{MEN} data is considered. Here, $\phi$ quantifies the influence of past influenza cases on the meningococcal disease incidence. This model corresponds to the second model of Tab.~2 in \cite{paul-etal-2008} and is fitted with <>= neighbourhood(fluMen) <- matrix(c(0,0,1,0),2,2) @ <>= # create formula for endemic component f.end <- addSeason2formula(f = ~ -1 + fe(1, which = c(TRUE, TRUE)), # disease-specific intercepts S = c(3, 1), # S = 3 for flu, S = 1 for men period = 52) # specify model m <- list(ar = list(f = ~ -1 + fe(1, which=c(TRUE, TRUE))), ne = list(f = ~ -1 + fe(1, which=c(FALSE, TRUE))), end = list(f = f.end), family = "NegBinM" ) # fit model summary(result <- hhh4(fluMen, control = m)) @ A plot of the estimated mean for the meningococcal disease data, decomposed into the three components, is obtained with \setkeys{Gin}{width=.8\textwidth} \begin{center} <>= plot(result, i = 2, col = c("orange", "blue", "grey85"), legend = TRUE) @ \end{center} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubsection{Multivariate modelling} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% For disease counts observed in a large number of regions, say, (i.e.\ highly multivariate time series of counts) the use of region-specific parameters to account for regional heterogeneity is no longer feasible, as estimation and identifiability problems may occur. \cite{paul-held-2011} propose a random effects formulation to analyze the weekly number of influenza cases in \Sexpr{ncol(flu)} districts of Southern Germany. For example, consider a model with random intercepts in the endemic component: $c_i \sim \n(0,\sigma^2_\nu), i=1,\ldots,I$. Such effects are specified in a formula object as <>= f.end <- ~ -1 + ri(type = "iid", corr = "all") @ Setting \code{type = "car"} would assume that the random effects are spatially correlated instead of uncorrelated. See \cite{paul-held-2011} for further details. The argument \code{corr = "all"} allows for correlation between region-specific random effects in different components, e.g.\ random incidence levels $c_i$ in the endemic component and random effects $b_i$ in the neighbor-driven component. The following call to \hhh\ fits such a random effects model with linear trend and $S=3$ seasonal terms in the endemic component and a fixed autoregressive parameter $\lambda$ to the influenza data \citep[cf. model B2 in Tab.~3 in][]{paul-held-2011}. <>= # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") +I((t-208)/100) , S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1+ ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1", verbose = 1, start=list(fixed=c(-0.9,-1.53,0.56,2.45,2.05,0.33,-0.49,0.21,-0.36,0.21,-0.09), sd.corr=c(-0.02,-0.34,0.68)) ) if(compute){ # this is time-consuming... result.B2 <- hhh4(flu, model.B2) s.B2 <- summary(result.B2) system.time(pred.B2 <- oneStepAhead(result.B2,tp=nrow(flu)-2*52)) meanSc.B2 <- colMeans(scores(pred.B2)) save(s.B2, meanSc.B2, file="hhh4-cache.RData") } @ <>= # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(flu)/rowSums(neighbourhood(flu)) # endemic component: iid random effects, linear trend, and S=3 seasonal terms f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") + I((t-208)/100), S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1+ ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1" ) # fit model summary(result.B2 <- hhh4(flu, model.B2)) @ <>= s.B2 @ Model choice based on information criteria such as AIC or BIC is well explored and understood for models that correspond to fixed-effects likelihoods. However, in the presence of random effects their use can be problematic. For model selection in time series models, the comparison of successive one-step-ahead forecasts with the actually observed data provides a natural alternative. In this context, \cite{gneiting-raftery-2007} recommend the use of strictly proper scoring rules, such as the logarithmic score or the ranked probability score. See \cite{czado-etal-2009} and \cite{paul-held-2011} for further details. One-step-ahead predictions for the last 2 years for model B2 are obtained as follows: <>= pred.B2 <- oneStepAhead(result.B2, tp = nrow(flu) - 2 * 52) @ The mean logarithmic and mean ranked probability score are then computed with <>= colMeans(scores(pred.B2)[, c("logs", "rps")]) @ <>= meanSc.B2[ c("logs", "rps")] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Measles data <>= data(MMRcoverageDE) cardVac1 <- MMRcoverageDE[1:16,3:4] adjustVac <- function(cardVac, p=0.5,nrow=1){ card <- cardVac[,1] vac <- cardVac[,2] vacAdj <- vac*card + p*vac*(1-card) return(matrix(vacAdj,nrow=nrow, ncol=length(vacAdj), byrow=TRUE)) } vac0 <- 1-adjustVac(cardVac1,p=0.5,nrow=measles2w@freq*3) colnames(vac0) <- colnames(measles2w) @ As a last example, consider the number of measles cases in the 16 federal states of Germany, in the years 2005--2007. There is considerable regional variation in the incidence pattern which is most likely due to differences in vaccination coverage. In the following, information about vaccination coverage in each state, namely the log proportion of unvaccinated school starters, is included as explanatory variable in a model for the bi-weekly aggregated measles data. See \cite{herzog-etal-2010} for further details. Vaccination coverage levels for the year 2006 are available in the dataset \code{data(MMRcoverageDE)}. This dataset can be used to compute the $\Sexpr{nrow(vac0)}\times \Sexpr{ncol(vac0)}$ matrix \code{vac0} with adjusted proportions of unvaccinated school starters in each state $i$ used by \cite{herzog-etal-2010} <<>>= vac0[1:2, 1:5] @ A Poisson model which links the autoregressive parameter with this covariate and contains $S=1$ seasonal term in the endemic component \citep[cf.~model A0 in Tab.~3 in ][]{herzog-etal-2010} is obtained with <>= # endemic component: Intercept + S = 1 sine/cosine pair f.end <- addSeason2formula(f = ~ 1, S = 1, period = 26) # autoregressive component: Intercept + vaccination coverage information model.A0 <- list(ar = list(f = ~ 1 + logVac0), end = list(f = f.end, offset = population(measles2w)), data = list(t = epoch(measles2w), logVac0 = log(vac0))) # fit model result.A0 <- hhh4(measles2w, model.A0) # parameter estimates round(coef(result.A0, se = TRUE, # also return standard errors amplitudeShift = TRUE # transform sin/cos terms to ), 2) # Amplitude/shift formulation @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Summary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 \section{Summary} As part of the \R-package \surveillance, the function \hhh\ provides a flexible tool for the modelling of multivariate time series of infectious disease counts. The discussed count data model is able to account for serial and spatio-temporal correlation, as well as heterogeneity in incidence levels and disease transmission. The functionality of \hhh\ was illustrated using several built-in data sets. \bibliography{references} \end{document} surveillance/vignettes/map-weserems.eps0000644000176000001440000003147612004056547020142 0ustar ripleyusers%!PS-Adobe-3.0 EPSF-3.0 %%DocumentNeededResources: font Helvetica %%+ font Helvetica-Bold %%+ font Helvetica-Oblique %%+ font Helvetica-BoldOblique %%+ font Symbol %%DocumentMedia: a4 595 841 0 () () %%Title: R Graphics Output %%Creator: R Software %%Pages: (atend) %%Orientation: Portrait %%BoundingBox: 95 115 529 741 %%EndComments %%BeginProlog /bp { gs gs } def % begin .ps.prolog /gs { gsave } def /gr { grestore } def /ep { showpage gr gr } def /m { moveto } def /l { rlineto } def /np { newpath } def /cp { closepath } def /f { fill } def /o { stroke } def /c { newpath 0 360 arc } def /r { 4 2 roll moveto 1 copy 3 -1 roll exch 0 exch rlineto 0 rlineto -1 mul 0 exch rlineto closepath } def /p1 { stroke } def /p2 { gsave bg setrgbcolor fill grestore newpath } def /p3 { gsave bg setrgbcolor fill grestore stroke } def /t { 6 -2 roll moveto gsave rotate ps mul neg 0 2 1 roll rmoveto 1 index stringwidth pop mul neg 0 rmoveto show grestore } def /cl { grestore gsave newpath 3 index 3 index moveto 1 index 4 -1 roll lineto exch 1 index lineto lineto closepath clip newpath } def /rgb { setrgbcolor } def /s { scalefont setfont } def /R { /Font1 findfont } def /B { /Font2 findfont } def /I { /Font3 findfont } def /BI { /Font4 findfont } def /S { /Font5 findfont } def 1 setlinecap 1 setlinejoin % end .ps.prolog % begin encoding /WinAnsiEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Euro /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef /Zcaron /.notdef /.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /.notdef /zcaron /Ydieresis /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def % end encoding %%IncludeResource: font Helvetica /Helvetica findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding WinAnsiEncoding def currentdict end /Font1 exch definefont pop %%IncludeResource: font Helvetica-Bold /Helvetica-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding WinAnsiEncoding def currentdict end /Font2 exch definefont pop %%IncludeResource: font Helvetica-Oblique /Helvetica-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding WinAnsiEncoding def currentdict end /Font3 exch definefont pop %%IncludeResource: font Helvetica-BoldOblique /Helvetica-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding WinAnsiEncoding def currentdict end /Font4 exch definefont pop %%IncludeResource: font Symbol /Symbol findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall currentdict end /Font5 exch definefont pop %%EndProlog %%Page: 1 1 bp 18.00 18.00 577.28 823.89 cl 77.04 91.44 547.04 764.85 cl /bg { 1 1 1 } def 0 0 0 rgb 0.75 setlinewidth [] 0 setdash np 354.71 709.97 m 8.28 -38.85 l -9.24 -33.12 l 23.89 2.55 l -3.19 -12.42 l 10.51 -10.19 l -5.41 -7.96 l -18.47 -11.15 l 1.59 -8.91 l 0 0 l -11.78 1.91 l 0 0 l -17.52 33.12 l -10.19 -1.91 l -3.18 33.75 l -36.94 -2.23 l -9.87 -6.05 l -4.46 5.10 l 2.55 27.07 l 18.78 0 l -3.50 8.59 l 14.97 11.47 l 0 0 l 12.74 2.55 l 12.74 4.77 l 14.01 -0.63 l 13.69 2.54 l cp p3 np 285.92 729.40 m 21.98 -0.32 l 7.00 -1.59 l 0.32 -4.46 l -10.51 1.91 l -7.64 -1.91 l -6.05 0.96 l -2.55 -5.42 l -6.37 -0.95 l 0.64 7.00 l 3.18 4.78 l cp p3 np 328.60 735.45 m 19.10 0 l 6.05 -1.59 l 0.96 -1.91 l -13.06 -4.14 l -9.87 0.63 l -5.41 -2.22 l -1.91 3.18 l 4.14 6.05 l cp p3 /bg { 0.9529 0.9529 0.9529 } def np 508.52 644.37 m 1.28 -6.05 l 0 0 l -13.70 -14.33 l -0.95 -23.24 l -2.23 -43.00 l 0 0 l -2.55 -15.28 l 1.59 -11.47 l 0 0 l 12.74 -15.60 l 15.29 -5.41 l 7.32 -18.15 l 0 0 l -3.18 -4.78 l 0 0 l -36.31 16.24 l -14.01 -5.10 l -3.18 16.56 l -15.93 -5.73 l 0 0 l -3.50 7.96 l 2.87 4.46 l 0 0 l 1.91 3.50 l -13.06 39.17 l -9.87 -1.27 l -7.33 15.92 l 0 0 l 8.28 6.69 l 1.28 12.74 l 0 0 l 8.28 -1.91 l 5.09 2.86 l 6.05 7.01 l 0 4.46 l 4.78 7.00 l 1.27 17.52 l -3.50 6.69 l -8.28 -2.55 l -7.00 0.95 l 1.91 14.97 l 3.18 10.19 l 12.74 8.60 l 6.05 -1.91 l 8.92 -13.69 l 10.82 -4.78 l 22.93 -9.24 l cp p3 /bg { 0.9059 0.9059 0.9059 } def np 437.19 409.36 m 18.15 4.14 l 4.14 -10.19 l 10.83 -1.28 l -0.96 -7.96 l 14.97 -5.09 l -1.59 -6.06 l 0 0 l -2.23 -4.77 l 2.55 -9.56 l 1.59 -7.64 l -7.64 -6.05 l -8.60 0.64 l -23.89 -21.66 l 3.19 -25.47 l 8.28 -12.10 l -9.24 -6.37 l -1.27 -14.33 l 0 0 l -23.25 -5.42 l -6.69 -13.05 l -24.52 3.50 l 1.60 22.29 l -7.97 7.33 l 14.65 32.48 l -14.65 22.61 l 0 0 l 12.74 24.20 l 28.34 2.55 l 11.47 37.26 l cp p3 /bg { 0.8588 0.8588 0.8588 } def np 384.64 345.35 m 14.65 -22.61 l -14.65 -32.48 l 7.97 -7.33 l -1.60 -22.29 l 24.52 -3.50 l 6.69 13.05 l 23.25 5.42 l 0 0 l -1.27 -12.42 l 0 0 l 2.54 -17.52 l 27.07 -16.56 l 4.78 -18.15 l -0.64 -15.28 l 0 0 l -0.32 -6.37 l -4.14 -11.47 l 1.91 -6.69 l 12.74 -5.41 l -10.19 -10.51 l -13.69 -6.05 l 1.27 -10.19 l 0 0 l -31.84 8.60 l -17.52 -21.66 l -9.23 3.19 l -10.19 -5.41 l 0 0 l -14.65 3.50 l -12.42 -10.83 l -12.42 3.82 l -5.42 12.74 l 0 0 l 25.48 11.46 l -1.27 18.16 l -19.43 5.09 l 6.05 40.45 l 0 0 l 7.33 -19.11 l 14.96 -4.78 l 12.10 2.87 l 0.96 -5.10 l 7.96 2.23 l -1.59 11.47 l 8.92 2.22 l 0 9.56 l -13.06 -2.23 l -1.59 9.87 l -14.33 0.64 l -4.14 6.69 l -9.56 -4.46 l 0 0 l -5.41 11.46 l -12.10 7.01 l -13.38 -3.51 l -23.24 11.79 l -2.55 16.56 l -21.34 10.19 l 0 0 l 3.19 50.63 l 18.79 15.92 l 0.31 7.33 l 0 0 l 17.20 -1.28 l 16.88 8.92 l 35.66 -7.64 l cp p3 /bg { 0.8078 0.8078 0.8078 } def np 524.13 487.06 m -10.83 -14.01 l -2.87 -24.84 l 14.97 7.96 l 0 0 l -4.78 -53.18 l -37.89 -20.07 l 0 0 l 1.59 6.06 l -14.97 5.09 l 0.96 7.96 l -10.83 1.28 l -4.14 10.19 l -18.15 -4.14 l 0 0 l -26.75 21.65 l 1.27 27.39 l -13.37 18.79 l 0 0 l 16.24 15.60 l 0 0 l 16.24 1.27 l 0 -7.00 l 4.14 -2.87 l 12.42 5.42 l 7.32 19.42 l 0 0 l 15.93 5.73 l 3.18 -16.56 l 14.01 5.10 l 36.31 -16.24 l cp p3 /bg { 0.7608 0.7608 0.7608 } def np 362.67 589.92 m 1.91 -6.69 l 0 0 l 0.64 -3.82 l -9.24 -19.74 l -31.52 -25.16 l 3.82 -12.74 l 0 0 l -14.65 2.87 l -9.55 -44.91 l 0 0 l -14.02 -7.64 l -14.33 19.43 l -59.55 13.05 l 0 0 l -0.63 6.69 l 5.09 12.42 l 0 23.25 l 6.69 9.87 l 0.32 10.51 l 5.41 10.51 l 0 0 l 9.24 -0.64 l -1.60 14.65 l 0 0 l 18.47 -6.37 l 19.11 6.69 l 20.70 -12.42 l 18.15 0 l 33.76 12.10 l 0 0 l 11.78 -1.91 l cp p3 np 130.52 688.96 m 14.97 -7.65 l -0.64 -1.91 l -10.51 -0.63 l -5.73 -3.83 l 5.41 -6.68 l -2.54 -2.23 l -3.83 2.55 l -7.96 -0.32 l -8.28 6.37 l 1.28 5.09 l 17.83 9.24 l cp p3 /bg { 0.7137 0.7137 0.7137 } def np 228.92 204.59 m -3.82 -2.86 l -36.94 1.59 l -7.01 -6.05 l 0 0 l -7.00 -4.14 l 0 0 l -9.56 16.24 l 13.06 27.70 l -16.56 38.22 l -7.64 -9.24 l -38.85 8.60 l -13.70 10.19 l -4.14 26.11 l 16.25 2.55 l -7.97 21.66 l 15.61 9.23 l 44.90 -7.00 l 0 0 l -0.32 -5.74 l 23.57 -14.64 l 6.05 -3.19 l 7.64 -10.19 l 17.83 3.82 l 5.42 -16.88 l -1.91 -16.87 l -16.24 -8.92 l 7.96 -34.07 l 13.37 -26.12 l cp p3 /bg { 0.6667 0.6667 0.6667 } def np 403.43 684.50 m -10.82 -12.74 l 12.73 -35.35 l 0 0 l 1.91 -14.33 l 7.01 -9.55 l 2.55 3.82 l 5.73 0.95 l 12.74 -19.10 l 0 0 l -1.28 -12.74 l -8.28 -6.69 l 0 0 l -8.27 -6.69 l -20.70 -7.00 l -14.97 -0.64 l 0 6.69 l -17.20 12.10 l 0 0 l -1.91 6.69 l 0 0 l -1.59 8.91 l 18.47 11.15 l 5.41 7.96 l -10.51 10.19 l 3.19 12.42 l -23.89 -2.55 l 9.24 33.12 l -8.28 38.85 l 0 0 l 23.57 1.60 l 9.23 0 l 13.38 -3.51 l 1.91 -3.18 l -2.55 -4.78 l 3.18 -15.60 l cp p3 np 375.41 739.59 m 11.15 -2.87 l 2.54 -2.86 l -2.23 -1.59 l -2.23 1.27 l -17.83 0.64 l -3.82 3.50 l 4.46 2.23 l 7.96 -0.32 l cp p3 /bg { 0.6196 0.6196 0.6196 } def np 304.08 479.73 m 21.01 -15.92 l 0.96 -17.51 l 20.06 -14.02 l 0.64 -5.41 l -8.28 -12.74 l -18.15 -10.82 l -5.73 -17.84 l 7.32 -11.78 l -16.88 -11.46 l 9.87 -16.88 l 0 0 l -0.31 -7.33 l -18.79 -15.92 l -3.19 -50.63 l 0 0 l -6.69 -12.74 l 6.06 -6.37 l -11.15 -15.60 l -25.79 -13.38 l -26.12 -18.79 l 0 0 l -13.37 26.12 l -7.96 34.07 l 16.24 8.92 l 1.91 16.87 l -5.42 16.88 l -17.83 -3.82 l -7.64 10.19 l -6.05 3.19 l -23.57 14.64 l 0.32 5.74 l 0 0 l 11.15 -2.23 l 7.96 66.23 l 10.82 17.52 l 23.89 45.22 l -3.19 40.44 l 0 0 l 59.55 -13.05 l 14.33 -19.43 l 14.02 7.64 l cp p3 /bg { 0.5725 0.5725 0.5725 } def np 437.19 409.36 m -11.47 -37.26 l -28.34 -2.55 l -12.74 -24.20 l 0 0 l -35.66 7.64 l -16.88 -8.92 l -17.20 1.28 l 0 0 l -9.87 16.88 l 16.88 11.46 l -7.32 11.78 l 5.73 17.84 l 18.15 10.82 l 8.28 12.74 l -0.64 5.41 l -20.06 14.02 l -0.96 17.51 l -21.01 15.92 l 0 0 l 9.55 44.91 l 14.65 -2.87 l 0 0 l 28.66 -7.32 l -1.59 -7.97 l 8.28 -10.19 l 3.50 1.91 l 7.96 -7.96 l -0.95 -4.14 l 24.20 -8.91 l 0 0 l 13.37 -18.79 l -1.27 -27.39 l 26.75 -21.65 l cp p3 /bg { 0.5255 0.5255 0.5255 } def np 301.53 700.74 m -14.97 -11.47 l 3.50 -8.59 l -18.78 0 l -2.55 -27.07 l 4.46 -5.10 l 9.87 6.05 l 36.94 2.23 l 3.18 -33.75 l 10.19 1.91 l 17.52 -33.12 l 0 0 l -33.76 -12.10 l -18.15 0 l -20.70 12.42 l -19.11 -6.69 l -18.47 6.37 l 0 0 l -1.91 14.33 l -25.15 -3.82 l -12.42 2.55 l -3.19 -8.92 l -11.46 -5.73 l -4.78 6.05 l 0 0 l 0 17.51 l 3.82 19.75 l 6.69 12.10 l 5.41 4.46 l 4.14 -6.06 l 3.51 0 l 8.59 8.92 l -14.33 14.33 l 5.42 7.01 l 6.05 4.14 l 10.19 12.42 l 11.14 7.00 l 10.83 5.10 l 8.28 1.59 l 30.57 -0.64 l 9.88 -4.45 l 9.55 1.27 l cp p3 np 224.15 719.85 m 29.29 -1.28 l 2.55 -2.55 l -22.29 -4.45 l -16.56 -0.32 l -4.14 1.59 l 0.95 3.18 l 10.20 3.83 l cp p3 np 198.99 708.70 m 4.77 -0.95 l 0 -1.92 l -43.94 -4.77 l -2.55 1.91 l 1.27 2.23 l 40.45 3.50 l cp p3 np 165.23 694.05 m -6.05 -5.73 l -4.46 2.87 l -1.27 3.18 l 5.09 4.14 l 6.69 -4.46 l cp p3 np 265.86 722.39 m 7.96 -1.27 l 0.32 -3.18 l -3.50 -1.92 l -10.51 1.60 l 0 2.23 l 5.73 2.54 l cp p3 /bg { 0.4745 0.4745 0.4745 } def np 454.07 521.45 m -22.93 4.46 l -16.56 -33.12 l 0 0 l -16.24 -15.60 l 0 0 l -24.20 8.91 l 0.95 4.14 l -7.96 7.96 l -3.50 -1.91 l -8.28 10.19 l 1.59 7.97 l -28.66 7.32 l 0 0 l -3.82 12.74 l 31.52 25.16 l 9.24 19.74 l -0.64 3.82 l 0 0 l 17.20 -12.10 l 0 -6.69 l 14.97 0.64 l 20.70 7.00 l 8.27 6.69 l 0 0 l 7.33 -15.92 l 9.87 1.27 l 13.06 -39.17 l -1.91 -3.50 l cp p3 /bg { 0.4275 0.4275 0.4275 } def np 362.67 208.10 m 11.15 1.27 l -3.19 8.60 l 0 0 l 9.56 4.46 l 4.14 -6.69 l 14.33 -0.64 l 1.59 -9.87 l 13.06 2.23 l 0 -9.56 l -8.92 -2.22 l 1.59 -11.47 l -7.96 -2.23 l -0.96 5.10 l -12.10 -2.87 l -14.96 4.78 l -7.33 19.11 l cp p3 /bg { 0.3804 0.3804 0.3804 } def np 454.70 509.03 m -7.32 -19.42 l -12.42 -5.42 l -4.14 2.87 l 0 7.00 l -16.24 -1.27 l 0 0 l 16.56 33.12 l 22.93 -4.46 l 0 0 l -2.87 -4.46 l 3.50 -7.96 l cp p3 /bg { 0.3333 0.3333 0.3333 } def np 240.70 591.83 m 1.60 -14.65 l -9.24 0.64 l 0 0 l -49.36 4.77 l -7.00 9.88 l 5.09 3.82 l 0 0 l 4.78 -6.05 l 11.46 5.73 l 3.19 8.92 l 12.42 -2.55 l 25.15 3.82 l 1.91 -14.33 l cp p3 /ps 12 def B 12 s 209.50 587.52 (3402) .5 0 0 t 434.64 500.90 (3403) .5 0 0 t 387.99 198.06 (3404) .5 0 0 t 390.22 526.06 (3451) .5 0 0 t 252.17 646.91 (3452) .5 0 0 t 370.63 430.21 (3453) .5 0 0 t 255.99 350.44 (3454) .5 0 0 t 394.52 616.18 (3455) .5 0 0 t 162.84 264.61 (3456) .5 0 0 t 286.08 544.53 (3457) .5 0 0 t 461.87 444.70 (3458) .5 0 0 t 390.38 230.54 (3459) .5 0 0 t 434.64 331.17 (3460) .5 0 0 t 476.52 576.38 (3461) .5 0 0 t 326.85 658.54 (3462) .5 0 0 t 18.00 18.00 577.28 823.89 cl ep %%Trailer %%Pages: 1 %%EOF surveillance/vignettes/glrnb.Rnw0000644000176000001440000005504012004056304016600 0ustar ripleyusers%\VignetteIndexEntry{Additional documentation of the function algo.glrnb} %\VignetteKeywords{getting started} %\VignettePackage{surveillance} %\VignetteDepends{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preabmle parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} % Brug times som font - vigtigt i % pdflatex? %PSTricks \usepackage{pdftricks} \begin{psinputs} \usepackage{pst-all} \end{psinputs} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{relsize} \usepackage{epsfig} \usepackage{comment} \newcommand{\surveillance}{\texttt{surveillance}} \usepackage{pdfpages} \setlength{\parindent}{0pt} \title{The function 'algo.glrnb' in the R-Package 'surveillance'} \author{ Valentin Wimmer$^{(1,2)}$\thanks{Author of correspondence: Email: \texttt{Valentin.Wimmer@gmx.de}}$\>\>$ and Michael H\"{o}hle$^{(1,2)}$ \\ (1) Department of Statistics\\ University of Munich, Germany\\ (2) MC-Health - Munich Center of Health Sciences } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Put all in another directory \SweaveOpts{prefix.string=figs/vignette_glrnb} \setkeys{Gin}{width=1\textwidth} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontshape=s1,fontsize=\relsize{-1}} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl,fontsize=\relsize{-1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library(surveillance) library(xtable) options(SweaveHooks=list(fig=function() par(mar=c(5,4,4,0),cex.axis=1.5,cex.lab=1.5,cex.main=1.5))) options(width=70) set.seed(247) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") @ \maketitle %\mbox{}\hrulefill\\ \begin{abstract} \noindent The aim of this document is to show the use of the function \verb+algo.glrnb+ for a type of count data regression chart, the generalized likelihood ratio (GLR) statistic. The function is part of the R-Package '\texttt{surveillance}' \citep{hoehle2007R}, which provides outbreak detection algorithms for surveillance data. For an introduction to this package, the vignette for the package can be used \citep{vignette}. There one can find information about the data structure of the \verb+disProg+ and \verb+SurvRes+ objects. Furthermore tools for outbreak detection, such as a Bayesian approach, procedures described by \citet{stroup89}, \citet{farrington96} and the methods used at the Robert Koch Institut, Germany, are explained. The function \verb+algo.glrnb+ is the implementation of the control charts for poisson and negative binomial distributions for monitoring time series of counts described in \citet{hoehle2008}. This document gives an overview of the different features of the function and illustrations of its use are given for simulated and real surveillance data. \\ \noindent{\bf Keywords:} change-point detection, generalized regression charts, poisson and negative binomial distribution, increase and decrease \end{abstract} \section{Introduction}\label{sec:intro} For the monitoring of infectious diseases it is necessary to monitor time series of routinely collected surveillance data. Methods of the statistic process control (SPC) can be used for this purpose. Here it is important, that the methods can handle the special features of surveillance data, e.g.\ seasonality of the disease or the count data nature of the collected data. It is also important, that not only the number of counts of one time point (week, month) are regarded but instead the cases of previous time points are considered, because beside abrupt changes also small constant changes should be detected. CUSUM-methods (function \verb+algo.cusum+), LR-charts or GLR-methods as described by \citet{lai95} and \citet{hoehle2008} can afford this. With the function \verb+algo.glrnb+ these methods can easily applied to surveillance data. A typical assumption for time series of counts is, that the observed counts at each time point follow a Poisson distribution. If overdispersion is likely, the negative binomial distribution provides a better alternative. Both distributions are provided by \verb+algo.glrnb+. In the GLR-scheme, an outbreak can be defined as a change in the intercept. The function \verb+algo.glrnb+ allows the user to specify whether increases or decreases in mean should be regarded. For each time point a GLR-statistic is computed, if this statistic exceeds a threshold value, an alarm is given. The function also provides the possibility to return the number of cases that would have been necessary to produce an alarm. This vignette is organized as follows: First, in Section \ref{sec:prel} the data structure is explained, in Section \ref{sec:glr} a short introduction in the theory of the GLR-charts is given and Section \ref{sec:control} shows the different \verb+control+-settings. % In Section \ref{sec:extensions} some possible extensions are presented. \section{Preliminaries}\label{sec:prel} Consider the situation, where a time series of counts is collected for surveillance purpose. In each interval, usually one week, the number of cases of the interesting disease in an area (country, district) is counted. The resulting time series is denoted by $\{y_t\>;t=1,\ldots,n\}$. Usually the data are collected on line, so that the time point $n$ is the actual time point. Our aim is to decide with the aid of a statistic for each time point $n$ if there is an outbreak at this or any former time point. If an outbreak is detected, the algorithm gives an alarm. Observed time series of counts are saved in a \verb+disProg+ object, a list containing the time series of counts, the number of weeks and a state chain. The state is 1, if e.g. the Robert Koch Institut declares the week to be part of an outbreak and 0 otherwise ~\citep{survstat}. By using the state chain the quality of the surveillance algorithm can be tested. %The 'surveillance'-package provides standard plot routines for the surveillance objects. As an first example the number of cases of salmonella hadar in the years 2001-2006 is examined. \\ \textit{Example 1:} <>= data(shadar) plot(shadar,main="Number of salmonella hadar cases in Germany 2001-2006") @ The package provides the possibility to simulate surveillance data with the functions \verb+sim.pointSource+, \verb+sim.seasonalNoise+ and \verb+sim.HHH+. See \citep{hoehle2007R} and the vignette for further information. \\ \textit{Example 2:} <>= # Simulate data simData <- sim.pointSource(length=300,K=0.5,r=0.6,p=0.95) @ <>= plot(simData) @ \section{LR and GLR-charts}\label{sec:glr} Our aim is to detect a significant change in the number of cases. This is done as follows. One assumes, that there is a number of cases that is usual, the in control mean $\mu_0$. The in-control mean is defined in \citet{hoehle2008} to be \begin{equation} \label{mu0} \operatorname{log}(\mu_{0,t})=\beta_0 + \beta_1t + \sum_{s=1}^S(\beta_{2s} \cos(\omega s t) + \beta_{2s+1}\sin(\omega s t)). \end{equation} If an outbreak occurs, the number of cases increases and the situation is out-of control and the algorithm should produce an alarm. The change is assumed to be an additive increase on log scale, \begin{equation} \label{interceptchange} \operatorname{log}(\mu_1)= \operatorname{log}(\mu_0) + \kappa . \end{equation} If $\mu_0$ is unknown one could use a part of the data to estimate it with a generalized linear model (GLM). If $\kappa$ is known, LR-charts can be used, if not, $\kappa$ has to be estimated, which is the GLR-scheme setting. For each time point, the likelihood ratio statistic is computed as follows \begin{equation} \label{cusum} GLR(n)=\max_{1 \leq k \leq n} \sup_{\theta \in \Theta} \left[ \sum_{t=k}^n \log \left\{ \frac{f_{\theta}(y_t)}{f_{\theta_0}(y_t)} \right\} \right] . \end{equation} Now $N=\inf \{n \geq 1 : GLR(n) \geq c_{\gamma} \}$ is the first time point where the GLR-statistic is above a threshold $c_{\gamma}$. For this time point $N$ an alarm is given. If the parameter $\kappa$ and hence $\theta=\kappa$ is known, the maximation over $\theta$ can be omitted. With the function \verb+algo.glrnb+ one can compute the the GLR-statistic for every time point. If the actual value extends the chosen threshold $c_{\gamma}$, an alarm is given. After every alarm, the algorithm gets reset and the surveillance starts again. The result of a call of \verb+algo.glrnb+ is an object of class \verb+SurvRes+. This is basically a list of several arguments. The most important one is the \verb+upperbound+ statistic, which is a vector of length $n$ containing the likelihood-ratio-statistic for every time point under surveillance. The \verb+alarm+-vector contains a boolean for every time point whether there was an alarm or not. \\ At this point in the vignette we move more into the applied direction and refer the user to \citet{hoehle2008} for further theoretical details about the GLR procedure. The next example demonstrates the surveillance with the \verb+algo.glrnb+ in a learning by doing type of way. The example should demonstrate primarily the result of the surveillance. More details to the control-options follow in the next section. All control values are set here on default and the first two years are used to find a model for the in-control mean and so surveillance is starting in week 105. A plot of the results can be obtained as follows <>= survObj <- algo.glrnb(shadar,control=list(range=105:295,alpha=0)) plot(survObj,startyear=2003) @ The default value for $c_{\gamma}$ is 5. The upperbound statistic is above this value several times in the third quarter of 2006 (time points marked by small triangles in the plot). In the next section follow a description of the control-setting for tuning the behavior of the algorithm, e.g.\ one can search not only for increases in mean as shown in the example but also for decreases. \section{Control-settings}\label{sec:control} In this section, the purpose and use of the control settings of the \verb+algo.glrnb+ function are shown and illustrated by the examples from Section \ref{sec:prel}. The control-setting is a list of the following arguments. <>= control=list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept",theta=NULL, dir=c("inc","dec"),ret=c("cases","value")) @ \begin{itemize} \item \verb+range+ \\ The \verb+range+ is a vector of consecutive indices for the week numbers in the \verb+disProg+ object for which surveillance should be done. If a model for the in-control parameter $\mu_0$ is known (\verb+mu0+ is not \verb+NULL+), the surveillance can start at time point one. Otherwise it is necessary to estimate the values for \verb+mu0+ with a GLM. Thus, the range should not start at the first time point but instead use the first weeks/months as control-range. (Note: It is important to use enough data for estimating $\mu_0$, but one should be careful that these data are in control) With the following call one uses the first 2 years (104 weeks) for estimating $\mu_0$ and the the years 2003 to 2006 will be on line monitored. <>= control=list(range=105:length(shadar$observed)) algo.glrnb(disProgObj=shadar,control=control) @ \item \verb+alpha+ \\ This is the (known) dispersion parameter $\alpha$ of the negative binomial distribution. If \verb+alpha+=0, modeling corresponds to the Poisson distribution. In this case, the call of \verb+algo.glrnb+ is similar to a call of \verb+algo.glrpois+. If $\alpha$ is known, the value can be specified in the \verb+control+-settings. <>= control=list(range=105:295,alpha=3) algo.glrnb(disProgObj=shadar,control=control) @ If overdispersion is present in the data, but the dispersion parameter $\alpha$ is unknown, an estimation $\hat{\alpha}$ is calculated as part of the in-control model estimation. Use \verb+alpha=NULL+ to get this estimation. The estimated value $\hat{\alpha}$ is saved in the \verb+survRes+-Object in the \verb+control+-list. Use <>= control=list(range=105:295,alpha=NULL) surv <- algo.glrnb(shadar,control=control) surv$control$alpha @ to get the estimated dispersion parameter for the salmonella data. \item \verb+mu0+ \\ This vector contains the values for $\mu_0$ for each time point in the \verb+range+. If it has the value \verb+NULL+ the observed values with indices 1 to \verb+range+-1 are used to fit a GLM. If there is no knowledge about the in-control parameter, one can use the values before the range to find an seasonal model as in equation \ref{mu0}. \verb+mu0+ is at the moment a list of three argument: \verb+S+ is the number of harmonics to include in the model, \verb+trend+ is Boolean whether a linear trend $\beta_1t$ should be considered. The default is to use the same model of $\mu_0$ for the whole surveillance. An alternative is, to fit a new model after every detected outbreak. If refitting should be done, choose \verb+refit=TRUE+ in the \verb+mu0+ list. In this case, the observed value from time point 1 to the time point of the last alarm are used for estimating a GLM. Then we get a new model after every alarm. In the following example a model with \verb+S+=2 harmonics and no linear trend is fitted for the Salmonella data. The observed cases from the first two years are used for fitting the GLM. <>= control=list(range=105:295,mu0=list(S=2,trend=FALSE)) algo.glrnb(disProgObj=shadar,control=control) @ <>= control=list(range=105:295,mu0=list(S=2,trend=F,refit=T)) surv <- algo.glrnb(disProgObj=shadar,control=control) @ The predicted values for the in-control mean in the range are shown as a dashed line in the following plot. <>= plot(shadar) with(surv$control,lines(mu0~range,lty=2,lwd=4,col=4)) @ The information about the used model is saved in the \verb+survRes+-object, too. <>= surv$control$mu0Model @ The $\mu_0$ model is fitted by a call of the function \verb+estimateGLRNbHook+. Instead of using the standard seasonal negative binomial model from equation \ref{mu0}, one can change the \texttt{R}-code of the function \verb+estimateGLRNbHook+ to get any desired model. The standard code is the following <>= estimateGLRNbHook @ To include own models in the \verb+estimateGLRNbHook+ function, the code of the function has to be changed. In the following code chunk \verb+estimateGLRNbHook+ is modified so that weights are included in the model. \begin{small} \begin{verbatim} estimateGLRPoisHook <- function() { control <- parent.frame()$control p <- parent.frame()$disProgObj$freq range <- parent.frame()$range train <- 1:(range[1]-1) test <- range #Weights of training data - sliding window also possible weights <- exp(-0.3 * ((max(train)-train)) %/% 12) data <- data.frame(y=parent.frame()$disProgObj$observed[train],t=train) formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } m <- eval(substitute(glm(form,family=poisson(),data=data,weights=weights), list(form=as.formula(formula)))) return(list(mod=m,pred=as.numeric(predict(m,newdata=data.frame(t=test), type="response")))) } \end{verbatim} \end{small} Additionally the fitted model from the call of \verb+estimateGLRNbHook+ is saved. The result of a call of \verb+glm.nb+ is in the standard setting an object of class \verb+negbin+ inheriting from class \verb+glm+. So methods as \verb+summary+, \verb+plot+ of \verb+predict+ can be used on this object. If refitting is done, the list of the used models is saved. Use <>= coef(surv$control$mu0Model$fitted[[1]]) @ to get the estimated values of the first (and in case of \verb+refit=FALSE+ only) model for the parameter vector $\beta$ given in (\ref{mu0}). \item \verb+c.ARL+ \\ This is just the threshold $c_{\gamma}$ for the GLR-test (see equation \ref{cusum}). The smaller the value is chosen, the more likely it is to detect an outbreak but on the other hand false alarms can be produced. <>= control=list(range=105:295,alpha=0) surv <- algo.glrnb(disProgObj=shadar,control=control) table(surv$alarm) @ For a choice of $c_{\gamma}$ we get \Sexpr{table(surv$alarm)[2]} alarms. In the following table the results for different choices of the threshold are shown. <>= num <- rep(NA) for (i in 1:6){ num[i] <- table(algo.glrnb(disProgObj=shadar,control=c(control,c.ARL=i))$alarm)[2] } @ \begin{table}[h] \begin{center} \caption{Number of alarms for salmonella hadar data in dependence of c.ARL} \label{c.ARL} \begin{tabular}{l|cccccc} \verb+c.ARL+ & 1 & 2 & 3 & 4 & 5 & 6 \\ \hline no. of alarms & \Sexpr{num[1]} & \Sexpr{num[2]} & \Sexpr{num[3]} & \Sexpr{num[4]} & \Sexpr{num[5]} & \Sexpr{num[6]} \end{tabular} \end{center} \end{table} \item \verb+change+ \\ There are two possibilitys to define an outbreak. The intercept-change is described in Section \ref{sec:glr} and equation \ref{interceptchange}. Use \verb+change="intercept"+ to choose this possibility. The other alternative is the epidemic chart, where an auto-regressive model is used. See \citet{held2005} and \citet{hoehle2008} for more details. A call with \verb+change="epi"+ in the control-settings leads to this alternative. Note that in the epidemic chart not every feature of \verb+algo.glrnb+ is available. \item \verb+theta+ \\ If the change in intercept in the intercept-charts is known in advance, this value can be passed to the function (see Section \ref{sec:glr}). These LR-charts are faster but can lead to inferior results if a wrong value of \verb+theta+ is used compared to the actual out-of-control value (\citet{hoehle2008}). If an increase of 50 percent in cases is common when there is an outbreak which corresponds to a $\kappa$ of $\log(1.5)=0.405$ in equation \ref{interceptchange} use <>= control=list(range=105:295,theta=0.4) algo.glrnb(disProgObj=shadar,control=control) @ If there is no knowledge about this value (which is the usual situation), it is not necessary to specify \verb+theta+. In the GLR-charts, the value for $\kappa$ is calculated by a maximation of the likelihood. Use the call <>= control=list(range=105:295,theta=NULL) algo.glrnb(disProgObj=shadar,control=control) @ in this situation. \item \verb+ret+ \\ The \verb+upperbound+-statistic of a \verb+survRes+-object is usually filled with the LR- or GLR-statistic of equation \ref{cusum}. A small value means, that the in-control-situation is likely, a big value is a hint for an outbreak. If you choose \verb+ret="value"+, the upperbound slot is filled with the GLR-statistic. These values are plotted then, too. The alternative return value is \verb+"cases"+. In this case, the number of cases at time point $n$ that would have been necessary to produce an alarm are computed. The advantage of this option is the easy interpretation. If the actual number of cases is more extreme than the computed one, an alarm is given. With the following call, this is done for the salmonella data. <>= control=list(range=105:295,ret="cases",alpha=0) surv2 <- algo.glrnb(disProgObj=shadar,control=control) @ <>= plot(surv2,startyear=2003) @ Of course, the alarm time points are the same as with \verb+ret="cases"+. \item \verb+dir+ \\ In the surveillance of infectious diseases it is regular to detect an increase in the number of infected persons. This is also the standard setting for \verb+algo.glrnb+. But in other applications it could be of interest to detect a decrease of counts. For this purpose, the \verb+dir+-option is available. If \verb+dir+ is set to \verb+"inc"+, only increases in regard to the in-control mean are taken into account in the likelihood-ratio-statistic. With \verb+dir="dec"+, only decreases are considered. As an example we take the salmonella data again, but know we look at the number of cases that would have been necessary if a decrease should be detected. <>= control=list(range=105:295,ret="cases",dir="dec",alpha=0) surv3 <- algo.glrnb(disProgObj=shadar,control=control) @ <>= plot(surv3,startyear=2003) @ The observed number of cases is below the computed threshold several times in 2005 to 2006 and alarms are given. \item \verb+Mtilde+ and \verb+M+ \\ These parameters are necessary for the so called ''window-limited'' GLR scheme. Here the maximation is not performed for all $1 \leq k \leq n$ but instead only for a window $k \in \{n-M,...,n-\tilde{M}+1 \}$ of values. Note that $1 \leq \tilde{M} \leq M$, where the minimum delay $\tilde{M}$ is the minimal required sample size to obtain a sufficient estimate of $\theta_1=(\mu_0,\kappa)$ ~\citep{hoehle2008}. The advantage of using a window of values instead of all values is the faster computation, but in the setup with intercept-charts and $\theta_1=\kappa$ this doesn't bother much and $\tilde{M}=1$ is sufficient. \end{itemize} \section{Discussion} As seen, the function \verb+algo.glrnb+ allows many possibilities for doing surveillance for a time series of counts. In order to achieve fast computations, the function is implemented in C. An important issue in surveillance is the quality of the used algorithms. This can be measured by the sensitivity and the specificity of the result. The aim of our future work is to provide the possibility for computing the quality and in the next step to include a ROC-approach in order to have a more formal framework for the choice of threshold $c_{\gamma}$. %\include{extensions} %\renewcommand{\bibsection}{\section{REFERENCES}} \bibliography{references} \end{document} surveillance/vignettes/.install_extras0000644000176000001440000000005412004056304020034 0ustar ripleyusershhh4-cache.RData$ surveillance-cache.RData$ surveillance/vignettes/map-weserems.pdf0000644000176000001440000001174212004056304020105 0ustar ripleyusers%PDF-1.3 %쏢 8 0 obj <> stream x\͎$ S19l[$E\[} GTA8b0RD˅_N}?z6K?ygF>l_,vC%v^\bpkCFzekq~æﯰ ز볖V'ذno^EHXM2Z1[T&^ِJS|?+L/pqKq|u`{|z;2~~z+?N5 HӨVpxԥ Ⱦٹ0-|5*mn jM>nNM8 lfK/Hׁ'("ܸ@ SAWo&9HV[q.1,Jq3yi+f_ &JL&|)X(ATjU-+W,(b$ e%ԭL#!e HaۻӈrH 5] ŵ6 f4Ԥ =,boԬ}ĸf*?g1=YjY Ѐ81|ajxNێ8Mju}a-afS_Peʕ]Hm+x5j|,Q-5H|I/ j"}bZ%ߞE]6K2K_mvjbnrLߋ-nm.$g2)ȭi7,Hp`E٠Zănqs"zrnV$=xPf&/O&lW9pV~[~b Jf@۱py3|aL?fpA%CL-#6 /c= ?;yH9kF9 [ujZ%C9z8z u–ۋSzBJN4bypoU&,JfA'ERI9왤Bmt-h l.wzn+E[ƝlCp ;U;43giAasiX bdhyF~P__ $ ˽cSײUTuT-Y1_(4a;ZgY{C?.:_pQ;!,"`APP.` |*ݲmA.&Edn_|L5Jn˫GaWͿ%G}?9 Ϣ:Զ M eW}ӊ \<0mIj՜ x sendstream endobj 9 0 obj 3265 endobj 7 0 obj <> /Contents 8 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 6 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 5 0 obj <>stream xkhD endstream endobj 4 0 obj <>stream xc` endstream endobj 14 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 17 0000000000 65535 f 0000003580 00000 n 0000004509 00000 n 0000003521 00000 n 0000003970 00000 n 0000003822 00000 n 0000003628 00000 n 0000003370 00000 n 0000000015 00000 n 0000003350 00000 n 0000004438 00000 n 0000004352 00000 n 0000004270 00000 n 0000004191 00000 n 0000004117 00000 n 0000003716 00000 n 0000003746 00000 n trailer << /Size 17 /Root 1 0 R /Info 2 0 R >> startxref 4672 %%EOF surveillance/vignettes/surveillance.Rnw0000644000176000001440000007250412230242341020173 0ustar ripleyusers%\VignetteIndexEntry{Getting started with the package} %\VignetteKeywords{getting started} %\VignettePackage{surveillance} %\VignetteDepends{surveillance} \documentclass[a4paper,11pt]{article} \usepackage{natbib} \bibliographystyle{apalike} % Preabmle parts \usepackage[T1]{fontenc} % Make it possible to use danish characters !! \usepackage{url} \usepackage{hyperref} \usepackage{times} \renewcommand{\sfdefault}{ptm} % Brug times som font - vigtigt i % pdflatex? %PSTricks \usepackage{pdftricks} \begin{psinputs} \usepackage{pst-all} \end{psinputs} \usepackage{bm} \usepackage{amsmath} \usepackage{amssymb} \usepackage{latexsym} \usepackage{verbatim} \usepackage{epsfig} \usepackage{comment} \newcommand{\surveillance}{\texttt{surveillance}} \usepackage{pdfpages} \title{The R-Package 'surveillance'} \author{ Michael H{\"o}hle\thanks{Author of correspondance: Department of Statistics, University of Munich, Ludwigstr.\ 33, 80539 M{\"u}nchen, Germany, Email: \texttt{hoehle@stat.uni-muenchen.de}}$\>\>$, Andrea Riebler and Michaela Paul\\ Department of Statistics\\ University of Munich\\ Germany } \date{\today} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sweave %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Put all in another directory \SweaveOpts{prefix.string=figs/vignette} \setkeys{Gin}{width=1\textwidth} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial R code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= library(surveillance) library(xtable) options(SweaveHooks=list(fig=function() par(mar=c(5,4,4,0),cex.axis=1.5,cex.lab=1.5,cex.main=1.5))) options(width=70) set.seed(1234) ##################################################################### # create directory figs if it does not exist ##################################################################### if(!file.exists("figs/")) dir.create("figs/") ###################################################################### #Do we need to compute or can we just fetch results ###################################################################### CACHEFILE <- "surveillance-cache.RData" compute <- !file.exists(CACHEFILE) #load computed results if(!compute) load(CACHEFILE) print(paste("Doing computations:", compute)) @ \maketitle %\mbox{}\hrulefill\\ \begin{abstract} \noindent This document gives an introduction to the R-Package 'surveillance' containing tools for outbreak detection in routinely collected surveillance data. The package contains an implementation of the procedures described by~\citet{stroup89}, \citet{farrington96} and the system used at the Robert Koch Institute, Germany. For evaluation purposes, the package contains example data sets and functionality to generate surveillance data by simulation. To compare the algorithms, benchmark numbers like sensitivity, specificity, and detection delay can be computed for a set of time series. Being an open-source package it should be easy to integrate new algorithms; as an example of this process, a simple Bayesian surveillance algorithm is described, implemented and evaluated.\\ \noindent{\bf Keywords:} infectious disease, monitoring, aberrations, outbreak, time series of counts. \end{abstract} {\large Disclaimer}: This vignette reflects package state at version 1.2 and is hence somewhat outdated. New functionality has been added to the package: this includes the \texttt{hhh4}, \texttt{twinSIR} and \texttt{twinstim} modelling and the \texttt{glrnb} outbreak detection. A description of the \texttt{hhh4} modelling can be found in its own vignette \verb+vignette("hhh4")+, \texttt{glrnb} is described in \verb+vignette("glrnb")+. Furthermore, use of the new S4 class \texttt{sts} instead of \texttt{disProg} is encouraged to encapsulate the data. \section{Introduction}\label{sec:intro} Public health authorities have in an attempt to meet the threats of infectious diseases to society created comprehensive mechanisms for the collection of disease data. As a consequence, the abundance of data has demanded the development of automated algorithms for the detection of abnormalities. Typically, such an algorithm monitors a univariate time series of counts using a combination of heuristic methods and statistical modelling. Prominent examples of surveillance algorithms are the work by~\citet{stroup89} and~\citet{farrington96}. A comprehensive survey of outbreak detection methods can be found in~\citep{farrington2003}. The R-package \texttt{surveillance} was written with the aim of providing a test-bench for surveillance algorithms. From the Comprehensive R Archive Network (CRAN) the package can be downloaded together with its source code. It allows users to test new algorithms and compare their results with those of standard surveillance methods. A few real world outbreak datasets are included together with mechanisms for simulating surveillance data. With the package at hand, comparisons like the one described by~\citet{hutwagner2005} should be easy to conduct. The purpose of this document is to illustrate the basic functionality of the package with R-code examples. Section~\ref{sec:data} contains a description of the data format used to store surveillance data, mentions the built-in datasets and illustrates how to create new datasets by simulation. Section~\ref{sec:algo} contains a short description of how to use the surveillance algorithms and illustrate the results. Further information on the individual functions can be found in the on-line documentation of the package, which is also provided in printed form as an Appendix of this document. \section{Surveillance Data}\label{sec:data} Denote by $\{y_t\>;t=1,\ldots,n\}$ the time series of counts representing the surveillance data. Because such data typically are collected on a weekly basis, we shall also use the alternative notation $\{y_{i:j}\}$ with $j=\{1,\ldots,52\}$ being the week number in year $i=\{-b,\ldots,-1,0\}$. That way the years are indexed such that most current year has index zero. For evaluation of the outbreak detection algorithms it is also possible for each week to store -- if known -- whether there was an outbreak that week. The resulting multivariate series $\{(y_t,x_t)\>; t=1,\ldots,n\}$ is in \texttt{surveillance} given by an object of class \texttt{disProg} (disease progress), which is basically a \texttt{list} containing two vectors: the observed number of counts and a boolean vector \texttt{state} indicating whether there was an outbreak that week. A number of time series are contained in the \texttt{data} directory, mainly originating from the SurvStat@RKI database at \href{http://www3.rki.de/SurvStat/}{http://www3.rki.de/SurvStat/} maintained by the Robert Koch Institute, Germany~\citep{survstat}. For example the object \texttt{k1} describes Kryptosporidosis surveillance data for the German federal state Baden-W\"{u}rttemberg 2001-2005. The peak in 2001 is due to an outbreak of Kryptosporidosis among a group of army-soldiers in boot-camp~\citep{bulletin3901}. In \surveillance\ the \texttt{readData} function is used to bring the time series on \texttt{disProg} form. The SurvStat@RKI database at \href{http://www3.rki.de/SurvStat/}{http://www3.rki.de/SurvStat/} maintained by the Robert Koch Institute, Germany, uses a 53 weeks a year format; therefore a conversion with \texttt{correct53to52} is necessary. <>= data(k1) plot(k1,main="Kryptosporidiosis in BW 2001-2005") @ For evaluation purposes it is also of interest to generate surveillance data using simulation. The package contains functionality to generate surveillance data containing point-source like outbreaks, for example with a Salmonella serovar. The model is a Hidden Markov Model (HMM) where a binary state $X_t, t=1,\ldots,n$, denotes whether there was an outbreak and $Y_t$ is the number of observed counts, see Fig.~\ref{fig:hmm}. \begin{figure}[htbp] \centering \begin{pdfpic} \input pst-eps \TeXtoEPS \SpecialCoor \begin{pspicture}(0,0)(10,3) %lower y -2.5 would be better %\psgrid \psset{arrowsize=7pt,arrowinset=0} \rput(1,2.5){\ovalnode{X1}{$X_1$}} \rput(3,2.5){\ovalnode{X2}{$X_2$}} \rput(5,2.5){\ovalnode{X3}{$X_3$}} \rput(6.5,2.5){\ovalnode[linestyle=none]{Xinv1}{}} \rput(7,2.5){$\ldots$} \rput(7.5,2.5){\ovalnode[linestyle=none]{Xinv2}{}} \rput(9,2.5){\ovalnode{Xn}{$X_n$}} \rput(1,0.5){\ovalnode{Y1}{$Y_1$}} \rput(3,0.5){\ovalnode{Y2}{$Y_2$}} \rput(5,0.5){\ovalnode{Y3}{$Y_3$}} \rput(9,0.5){\ovalnode{Yn}{$Y_n$}} \ncline{->}{X1}{X2} \ncline{->}{X2}{X3} \ncline{->}{X3}{Xinv1} \ncline{->}{Xinv2}{Xn} \ncline{->}{X1}{Y1} \ncline{->}{X2}{Y2} \ncline{->}{X3}{Y3} \ncline{->}{Xn}{Yn} \end{pspicture} \endTeXtoEPS \end{pdfpic} \caption{The Hidden Markov Model} \label{fig:hmm} \end{figure} The state $X_t$ is a homogenous Markov chain with the following transition matrix \begin{center} \begin{tabular}{c|cc} $X_t\backslash X_{t+1}$ & 0 & 1\\ \hline $0$ & $p$ & $1 - p$ \\ $1$ & $1 - r$ & $r$ \end{tabular} \end{center} Hence $1-p$ is the probability to switch to an outbreak state and $1-r$ is the probability that $X_t=1$ is followed by $X_{t+1}=1$. Furthermore, the observation $Y_t$ is Poisson-distributed with log-link mean depending on a seasonal effect and time trend, i.e.\ \[ \log \mu_t = A \cdot \sin \, (\omega \cdot (t + \varphi)) + \alpha + \beta t. \] In case of an outbreak $(X_t=1)$ the mean increases with a value of $K$, altogether \begin{equation}\label{eq:hmm} Y_t \sim \operatorname{Po}(\mu_t + K \cdot X_t). \end{equation} The model in (\ref{eq:hmm}) corresponds to a single-source, common-vehicle outbreak, where the length of an outbreak is controlled by the transition probability $r$. The daily numbers of outbreak-cases are simply independently Poisson distributed with mean $K$. A physiologically better motivated alternative could be to operate with a stochastic incubation time (e.g.\ log-normal or gamma distributed) for each individual exposed to the source, which results in a temporal diffusion of the peak. The advantage of (\ref{eq:hmm}) is that estimation can be done by a generalized linear model (GLM) using $X_t$ as covariate and that it allows for an easy definition of a correctly identified outbreak: each $X_t=1$ has to be identified. More advanced setups would require more involved definitions of an outbreak, e.g.\ as a connected series of time instances, where the number of outbreak cases is greater than zero. Care is then required in defining what a correctly identified outbreak for time-wise overlapping outbreaks means. In \surveillance\ the function \verb+sim.pointSource+ is used to simulate such a point-source epidemic; the result is an object of class \verb+disProg+. \label{ex:sts} <>= sts <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) plot(sts) @ \section{Surveillance Algorithms}\label{sec:algo} Surveillance data often exhibit strong seasonality, therefore most surveillance algorithms only use a set of so called \emph{reference values} as basis for drawing conclusions. Let $y_{0:t}$ be the number of cases of the current week (denoted week $t$ in year $0$), $b$ the number of years to go back in time and $w$ the number of weeks around $t$ to include from those previous years. For the year zero we use $w_0$ as the number of previous weeks to include -- typically $w_0=w$. Altogether the set of reference values is thus defined to be \[ R(w,w_0,b) = \left(\bigcup\limits_{i=1}^b\bigcup\limits_{j=\,-w}^w y_{-i:t+j}\right) \cup \left(\bigcup_{k=-w_0}^{-1} y_{0:t+k}\right) \] Note that the number of cases of the current week is not part of $R(w,w_0,b)$. A surveillance algorithm is a procedure using the reference values to create a prediction $\hat{y}_{0:t}$ for the current week. This prediction is then compared with the observed $y_{0:t}$: if the observed number of cases is much higher than the predicted number, the current week is flagged for further investigations. In order to do surveillance for time $0:t$ an important concern is the choice of $b$ and $w$. Values as far back as time $-b:t-w$ contribute to $R(w,w_0,b)$ and thus have to exist in the observed time series. Currently, we have implemented four different type of algorithms in \surveillance. The Centers for Disease Control and Prevention (CDC) method~\citep{stroup89}, the Communicable Disease Surveillance Centre (CDSC) method~\citep{farrington96}, the method used at the Robert Koch Institute (RKI), Germany~\citep{altmann2003}, and a Bayesian approach documented in~\citet{riebler2004}. A detailed description of each method is beyond the scope of this note, but to give an idea of the framework the Bayesian approach developed in~\citet{riebler2004} is presented: Within a Bayesian framework, quantiles of the predictive posterior distribution are used as a measure for defining alarm thresholds. The model assumes that the reference values are identically and independently Poisson distributed with parameter $\lambda$ and a Gamma-distribution is used as Prior distribution for $\lambda$. The reference values are defined to be $R_{\text{Bayes}}= R(w,w_0,b) = \{y_1, \ldots, y_{n}\}$ and $y_{0:t}$ is the value we are trying to predict. Thus, $\lambda \sim \text{Ga}(\alpha, \beta)$ and $y_i|\lambda \sim \text{Po}(\lambda)$, $i = 1,\ldots,{n}$. Standard derivations show that the posterior distribution is \begin{equation*} \lambda|y_1, \ldots, y_{n} \sim \text{Ga}(\alpha + \sum_{i=1}^{n} y_i, \beta + n). \end{equation*} Computing the predictive distribution \begin{equation*} f(y_{0:t}|y_1,\ldots,y_{n}) = \int\limits^\infty_0{f(y_{0:t}|\lambda)\, f(\lambda|y_1,\ldots,y_{n})}\, d\lambda \end{equation*} we get the Poisson-Gamma-distribution \begin{equation*} y_{0:t}|y_1,\ldots,y_{n} \sim \text{PoGa}(\alpha + \sum_{i=1}^{n} y_i, \beta + n), \end{equation*} which is a generalization of the negative Binomial distribution, i.e.\ \[ y_{0:t}|y_1,\ldots,y_{n} \sim \text{NegBin}(\alpha + \sum_{i=1}^{n} y_i, \tfrac{\beta + n}{\beta + n + 1}). \] Using the Jeffrey's Prior $\text{Ga}(\tfrac{1}{2}, 0)$ as non-informative Prior distribution for $\lambda$ the parameters of the negative Binomial distribution are \begin{align*} \alpha + \sum_{i=1}^{n} y_i &= \frac{1}{2} + \sum_{y_{i:j} \in R_{\text{Bayes}}}\!\! y_{i:j} \quad % \intertext{and} \quad\text{and}\quad \frac{\beta + n}{\beta + n + 1} = \frac{|R_{\text{Bayes}}|}{|R_{\text{Bayes}}| + 1}. \end{align*} Using a quantile-parameter $\alpha$, the smallest value $y_\alpha$ is computed, so that \begin{equation*} P(y \leq y_\alpha) \geq 1-\alpha. \end{equation*} Now \begin{equation*} A_{0:t} = I(y_{0:t} \geq y_\alpha), \end{equation*} i.e. if $y_{0:t}\geq y_\alpha$ the current week is flagged as an alarm. As an example, the \verb+Bayes1+ method uses the last six weeks as reference values, i.e.\ $R(w,w_0,b)=(6,6,0)$, and is applied to the \texttt{k1} dataset with $\alpha=0.01$ as follows. <>= k1.b660 <- algo.bayes(k1, control = list(range = 27:192,b=0,w=6,alpha=0.01)) plot(k1.b660, disease="k1", firstweek = 1, startyear = 2001) @ Several extensions of this simple Bayesian approach are imaginable, for example the inane over-dispersion of the data could be modeled by using a negative-binomial distribution, time trends and mechanisms to correct for past outbreaks could be integrated, but all at the cost of non-standard inference for the predictive distribution. Here simulation based methods like Markov Chain Monte Carlo or heuristic approximations have to be used to obtain the required alarm thresholds. In general, the \verb+surveillance+ package makes it easy to add additional algorithms -- also those not based on reference values -- by using the existing implementations as starting point. The following call uses the CDC and Farrington procedure on the simulated time series \verb+sts+ from page~\pageref{ex:sts}. Note that the CDC procedure operates with four-week aggregated data -- to better compare the upper bound value, the aggregated number of counts for each week are shown as circles in the plot. <>= cntrl <- list(range=300:400,m=1,w=3,b=5,alpha=0.01) sts.cdc <- algo.cdc(sts, control = cntrl) sts.farrington <- algo.farrington(sts, control = cntrl) @ <>= if (compute) { <> } @ <>= par(mfcol=c(1,2)) plot(sts.cdc, legend.opts=NULL) plot(sts.farrington, legend.opts=NULL) @ Typically, one is interested in evaluating the performance of the various surveillance algorithms. An easy way is to look at the sensitivity and specificity of the procedure -- a correct identification of an outbreak is defined as follows: if the algorithm raises an alarm for time $t$, i.e.\ $A_t=1$ and $X_t=1$ we have a correct classification, if $A_t=1$ and $X_t=0$ we have a false-positive, etc. In case of more involved outbreak models, where an outbreak lasts for more than one week, a correct identification could be if at least one of the outbreak weeks is correctly identified, see e.g.\ \citet{hutwagner2005}. To compute various performance scores the function \verb+algo.quality+ can be used on a \verb+SurvRes+ object. <<>>= print(algo.quality(k1.b660)) @ This computes the number of false positives, true negatives, false negatives, the sensitivity and the specificity. Furthermore, \texttt{dist} is defined as \[ \sqrt{(Spec-1)^2 + (Sens - 1)^2}, \] that is the distance to the optimal point $(1,1)$, which serves as a heuristic way of combining sensitivity and specificity into a single score. Of course, weighted versions are also imaginable. Finally, \texttt{lag} is the average number of weeks between the first of a consecutive number of $X_t=1$'s (i.e.\ an outbreak) and the first alarm raised by the algorithm. To compare the results of several algorithms on a single time series we declare a list of control objects -- each containing the name and settings of the algorithm we want to apply to the data. <>= control = list( list(funcName = "rki1"), list(funcName = "rki2"), list(funcName = "rki3"), list(funcName = "bayes1"), list(funcName = "bayes2"), list(funcName = "bayes3"), list(funcName = "cdc",alpha=0.05), list(funcName = "farrington",alpha=0.05)) control <- lapply(control,function(ctrl) { ctrl$range <- 300:400;return(ctrl)}) @ % In the above, \texttt{rki1}, \texttt{rki2} and \texttt{rki3} are three methods with reference values $R_\text{rki1}(6,6,0)$, $R_\text{rki2}(6,6,1)$ and $R_\text{rki3}(4,0,2)$ all called with $\alpha=0.05$. The methods \texttt{bayes1}-\texttt{bayes3} is the Bayesian algorithm using the same setup of reference values. The CDC Method is special, since it operates on aggregated four-week blocks. To make everything comparable a common $\alpha=0.05$ level is used for all algorithms. All algorithms in \texttt{control} are applied to \texttt{sts} using: <>= algo.compare(algo.call(sts,control=control)) @ <>= if (compute) { acall <- algo.call(sts,control=control) } algo.compare(acall) @ %res <- algo.compare(algo.call(sts,control=control)) %xtable(res,digits=c(0,0,0,0,0,2,2,2,2)) A test on a set of time series can be done as follows. Firstly, a list containing 10 simulated time series is created. Secondly, all the algorithms specified in the \texttt{control} object are applied to each series. Finally the results for the 10 series are combined in one result matrix. <>= #Create 10 series ten <- lapply(1:10,function(x) { sim.pointSource(p = 0.975, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7)}) @ <>= #Do surveillance on all 10, get results as list ten.surv <- lapply(ten,function(ts) { algo.compare(algo.call(ts,control=control)) }) @ <>= if (compute) { <> } @ <>= #Average results algo.summary(ten.surv) @ <>= res <- algo.summary(ten.surv) res[,5:8] <- round(res[,5:8]*100)/100 res @ %xtable(algo.summary(ten.surv),digits=c(0,0,0,0,0,2,2,2,2)) A similar procedure can be applied when evaluating the 14 surveillance series drawn from SurvStat@RKI~\citep{survstat}. A problem is however, that the series after conversion to 52 weeks/year are of length 209 weeks. This is insufficient to apply e.g.\ the CDC algorithm. To conduct the comparison on as large a dataset as possible the following trick is used: The function \texttt{enlargeData} replicates the requested \texttt{range} and inserts it before the original data, after which the evaluation can be done on all 209 values. <>= #Update range in each - cyclic continuation range = (2*4*52) + 1:length(k1$observed) control <- lapply(control,function(cntrl) { cntrl$range=range;return(cntrl)}) #Outbreaks outbrks <- c("m1", "m2", "m3", "m4", "m5", "q1_nrwh", "q2", "s1", "s2", "s3", "k1", "n1", "n2", "h1_nrwrp") #Load and enlarge data. outbrks <- lapply(outbrks,function(name) { #Load with data eval(substitute(data(name),list(name=name))) enlargeData(get(name),range=1:(4*52),times=2) }) #Apply function to one one.survstat.surv <- function(outbrk) { algo.compare(algo.call(outbrk,control=control)) } @ <>= algo.summary(lapply(outbrks,one.survstat.surv)) @ <>= if (compute) { res.survstat <- algo.summary(lapply(outbrks,one.survstat.surv)) } print(res.survstat,digits=3) @ In both this study and the earlier simulation study the Bayesian approach seems to do quite well. However, the extent of the comparisons do not make allowance for any more supported statements. Consult the work of~\citet{riebler2004} for a more thorough comparision using simulation studies. \section{Multivariate surveillance} As of version 0.9-2 \surveillance\ supports the visualization of multivariate time series of counts. An (multivariate) object of class \texttt{disProg} contains matrices with the observed number of counts and the respective state chains, where each column represents an individual time series. Additional elements of the \texttt{disProg}-object are a neighbourhood matrix and a matrix with population counts. However, only modelling of the time series as by~\citet{held2005} is currently available. In the near future the surveillance algorithms will also be extended to handle these multivariate data. For example, consider the weekly counts of new measles cases for each ``Kreis'' (area) of the administrative district ``Weser-Ems'' in Lower Saxony, Germany, in 2001 and 2002~\citep{survstat}. Figure~\ref{fig:map} shows a map of the $m=15$ areas. The corresponding $m \times m$ neighbourhood matrix has elements 1 if two areas share a common border and is 0 otherwise. \begin{figure}[htb] \centering \includegraphics[width=0.5\textwidth]{map-weserems} \caption{Map of the administrative district ``Weser-Ems''} \label{fig:map} \end{figure} In the package \texttt{surveillance} the measles data are already available in the form of a \texttt{disProg}-object. <>= data(measles.weser) plot(measles.weser, title="measles in Weser-Ems 2001-2002", xaxis.years=TRUE, startyear= 2001, firstweek=1) @ The number of counts for each area can also be looked at and plotted as individual time series. Here, the x-axis is the week number since 1st of January 2001 and the y-axis is the number of measles cases. <>= plot(measles.weser,as.one=FALSE,xaxis.years=FALSE) @ \vspace{1em} The data are analysed using the model proposed by \citet{held2005}. A call to the function \texttt{algo.hhh} fits a Poisson or negative binomial model with mean \[ \mu_{it} = \lambda y_{i,t-1} + \phi \sum_{j \sim i} y_{j,t-1} + n_{it} \nu_{it}\, , \quad i=1,\ldots,m, \, t=1,\ldots,n \, , \] where $j \sim i$ denotes all neighbours of $i$, to a multivariate time series of counts. It is estimated by maximum likelihood using numerical optimization methods. The $n_{it}$ are standardized population counts and $\log \nu_{it} = \alpha_i + \beta t + \sum_{s=1}^{S}\big(\gamma_s sin(\omega_s t) + \delta_s cos(\omega_s t)\big)$ with Fourier frequencies $\omega_s$. <>= ##################################################### # measles if(compute){ # algo.hhh cntrl <- list(linear=TRUE, nseason=1, neighbours=FALSE, negbin="single", lambda=TRUE) measles.hhh.neF <- algo.hhh(measles.weser,control=cntrl) cntrl$neighbours <- TRUE measles.hhh <-algo.hhh(measles.weser,cntrl) # algo.hhh.grid grid <- create.grid(measles.weser, cntrl, params=list(endemic=c(lower=-0.5, upper=0.5, length=3), epidemic=c(0.1,0.9,5), negbin=c(0.3,12,5))) cat("running a grid search for up to 900 seconds.\n") measles.hhh.grid <- algo.hhh.grid(measles.weser, control=cntrl, thetastartMatrix=grid, maxTime=900) } @ For the weekly measles data $\omega_s=2s\pi/52$ (i.e.\ \texttt{period}=52). In the following, the model specified in \texttt{cntrl} is fitted to the data. The counts are assumed to be negative binomial distributed with mean $\mu_{it}$ and variance $\mu_{it} +\mu_{it}^2/\psi$. A linear time trend $\beta$, seasonal parameters $\gamma_1$ and $\beta_1$ (i.e.\ $S=1$) as well as the autoregressive parameters $\lambda$ and $\phi$ are included to specify the mean. All in all, there are %21 parameters to be estimated. $2S+m+4$ parameters to be estimated for the negative binomial model. In case of a Poisson model, the number of parameters reduces by one as the overdispersion parameter $\psi$ is omitted. <>= cntrl <- list(linear=TRUE, nseason=1, neighbours=TRUE, negbin="single", lambda=TRUE) measles.hhh <- algo.hhh(measles.weser,control=cntrl) @ Depending on the inital values for the parameters, the optimization algorithm might not converge or only find a local maximum as the parameter space is high-dimensional. It is therefore reasonable to try multiple starting values. The function \texttt{create.grid} takes a \texttt{list} with elements in the form of \texttt{param = c(lower,upper,length)} to create a matrix of starting values. For each parameter a sequence of length \texttt{length} from \texttt{lower} to \texttt{upper} is built and the resulting grid contains all combinations of these parameter values. A call to \texttt{algo.hhh.grid} conducts a grid search until either all starting values are used or a time limit \texttt{maxTime} (in seconds) is exceeded. The result with the highest likelihood is returned. %algo.hhh.grid <>= grid <- create.grid(measles.weser, cntrl, params = list(endemic = c(lower = -0.5, upper = 0.5, length = 3), epidemic = c(0.1, 0.9, 5), negbin = c(0.3,12,5))) algo.hhh.grid(measles.weser, control=cntrl, thetastartMatrix=grid, maxTime=900) @ <>= print(measles.hhh.grid,3) @ <>= if (compute) { # save computed results save(list=c("sts.cdc","sts.farrington","acall","res","res.survstat", "control","ten.surv",ls(pattern="measles")), file=CACHEFILE) tools::resaveRdaFiles(CACHEFILE) } @ \section{Discussion and Future work} Many extensions and additions are imaginable to improve the package. For now, the package is intended as an academic tool providing a test-bench for integrating new surveillance algorithms. Because all algorithms are implemented in R, performance has not been an issue. Especially the current implementation of the Farrington Procedure is rather slow and would benefit from an optimization possible with fragments written in C. One important improvement would be to provide more involved mechanisms for the simulation of epidemics. In particular it would be interesting to include multi-day outbreaks originating from single-source exposure, but with delay due to varying incubation time~\citep{hutwagner2005} or SEIR-like epidemics~\citep{andersson2000}. However, defining what is meant by a correct outbreak identification, especially in the case of overlapping outbreaks, creates new challenges which have to be met. \section{Acknowledgements} We are grateful to K.\ Stark and D.\ Altmann, RKI, Germany, for discussions and information on the surveillance methods used by the RKI. Our thanks to C.\ Lang, University of Munich, for his work on the R--implementation and M. Kobl, T. Schuster and M. Rossman, University of Munich, for their initial work on gathering the outbreak data from SurvStat@RKI. The research was conducted with financial support from the Collaborative Research Centre SFB 386 funded by the German research foundation (DFG). %\renewcommand{\bibsection}{\section{REFERENCES}} \bibliography{references} \end{document} surveillance/vignettes/hhh4-cache.RData0000644000176000001440000000604212023615777017633 0ustar ripleyusersXy85EQDS2L1Ťk.ޫ4ZM*͍PMhRҼ l]kZ.-go=O9ϻ|j(U@ DIbH$ Iҵ2$$ɓԇ>//Kج~"A$HڍAg3L24ٝ:aphȍFi,#ŏ)']i!Aq0cF;y|gLW:A?Vl6 VvHV]^&ۋ2 >b{{]߯ju*s=jkp;^ZRVXK 毌{ِ(H35utih@J`mȴp~Ū_S{RA8|YW*L;gMkydךH6rhM9' Shc6ˏG!2C!>8;vL]1YˤhS(d1 w:Yw6[c:z>aB6XC ?1X_wxW:z函Q۝I|>yrXl ͕=Tlfu5V1 ~BD%_k}'Fi.tJ}g\ Vtay0‰Հִ q7l/豷# ZG.FOVzOZm{_ɷbnѵ_.lqX3kJZAy# V<+Gr<<2r_C;LlCC|1.ndZOh_W·FK-Eu +)-u'#k5Gᾠp,dl}=$t(G]QAB-nn{ ّfVǗnnݼn\ 9s8*$LvwRlGH f1ؙkMa*ق/D6odmbwITo7򫅡 ةwL ͱ:WNr{h2{T-m uM'7B[O3+ʓcm5+1odk^ﶶB}- sr>t]Yפ)7-5x-`y, vz݉O#JlhS{ ז*AR^pWL?f[cW'@g,x$5$&훺uws/ۀM5Pf+4~˯ͽ)d!GT&oYt=rhؾng}#C ueխuZ4&%̓AX ۔vZ,#RNh]Y7oUGZAֶӖ P`3(ֻBP~M]H QŌg|Uy.wh|oA3EKynS_MF& )<\Ȼx@-b䧺I.:_JrbVr2vvQ]=U/i`K^&:-#^mr/Wbu=B@:5jy+nOIg˨SmR9m2>z;Wt/;^ 7ƅV= 1|b~d\+!UUBɲ +Wa|'%~gPaXmJk,IFb[3P&|x=};ҷ{腽9ܩߣ.R%>Py:T7;[ /|1g(_t%KhxDz+jhpH9PV}5J/ohcyS:MD1Sr Nz 5;I TuJU̶{M4`(ge<3X/r,?\KƦ_ 2( 4{1)X~JfM윥'S.Q'QNx? zGVVсgrQBW JO?џ~:yB4Q-TE Py>E N]GnY:1*RbY'A՜EX,܈՜9xg1 {W)v8M%B=^5t),|p$tH`gOa_bJfRtIK|͙XpW5dmt LaauL[Vݏd9 Ps$XW:f O2<)vv|/XkŅhgu2};|beEi-LĨKڋ-QX,w[18[mf/⌄,~FE Q5_Cr PkKQym~\99ݥ璞VC-W `uY=%Iފ9OǕ_v2[ *z .5SML7v *86ݒ#xI9.Cլ=ko| =pl@ǃR 8ʼ$Exf@'7:P*}@R=+RĖmJvJZ[B!IҵfuarJ$'o n_p)0{MF? Ζ>ˏC2[ZAs{T&c4x\Ś ?`lr ths3nFXC3~?g n IvIP&g5G GfGt) DѵN*9>JOb % :4I[MMBhpɻqG<~|&KRKBtFQQRݩ/c2='L;Ph#W^qJدIXOXd7+kEG/mhlAJ6B]\$KY_1T쵘fj?(oT RI*8{(Y5.JY#$ @#surveillance/vignettes/references.bib0000644000176000001440000002271712003565743017623 0ustar ripleyusers@BOOK{andersson2000, title = {Stochastic Epidemic Models and their Statistical Analysis}, publisher = {Springer-Verlag}, year = {2000}, author = {H. {Andersson} and T. {Britton}}, volume = {151}, series = {Springer Lectures Notes in Statistics}, owner = {hoehle}, pdf = {Z:\Literature\Infectious Diseases\andersson2000.ps}, } @MastersThesis{riebler2004, author = {A. {Riebler}}, title = {{Empirischer Vergleich von statistischen Methoden zur Ausbruchserkennung bei Surveillance Daten}}, year = {2004}, note = {Bachelor's thesis}, owner = {hoehle}, school = {Department of Statistics, University of Munich}, } @UNPUBLISHED{altmann2003, author = {D. {Altmann}}, title = {{The Surveillance System of the Robert Koch Institute, Germany}}, note = {Personal Communication}, year = {2003}, owner = {hoehle}, } @MISC{bulletin3901, author = {{Robert Koch Institute}}, title = {{Epidemiologisches Bulletin 39}}, howpublished = {Available from http://www.rki.de}, year = {2001}, owner = {hoehle}, } @MISC{survstat, author = {{Robert Koch-Institut}}, title = {{SurvStat@RKI}}, howpublished = {http://www3.rki.de/SurvStat}, year = {2004}, note = {Date of query: September 2004}, } @ARTICLE{hutwagner2005, author = {L. {Hutwagner} and T. {Browne} and G.M {Seeman} and A.T. {Fleischhauer}}, title = {Comparing Abberation Detection Methods with Simulated Data}, journal = {Emerging Infectious Diseases}, year = {2005}, volume = {11}, pages = {314--316}, owner = {hoehle}, } @INCOLLECTION{farrington2003, chapter = {Outbreak Detection: Application to Infectious Disease Surveillance}, pages = {203--231}, booktitle = {Monitoring the Health of Populations}, publisher = {Oxford University Press}, year = {2003}, editor = {R. {Brookmeyer} and D.F. {Stroup}}, author = {C.P. {Farrington} and N. { Andrews}}, owner = {hoehle}, } @ARTICLE{stroup89, author = {D.F. {Stroup} and G.D. {Williamson} and J.L {Herndon} and J.M {Karon}}, title = {Detection of aberrations in the occurence of notifiable diseases surveillance data}, journal = {Statistics in Medicine}, year = {1989}, volume = {8}, pages = {323--329}, owner = {hoehle}, } @Article{held2005, author = {L. {Held} and M. {Hhle} and M. {Hofmann}}, title = {A statistical framework for the analysis of multivariate infectious disease surveillance counts}, journal = {Statistical Modelling}, year = {2005}, volume = {5}, pages = {187--199}, } @Article{rossi99, author = {G. {Rossi} and L. {Lampugnani} and M. {Marchi}}, title = {An approximate {CUSUM} procedure for surveillance of health events}, journal = {Statistics in Medicine}, year = {1999}, volume = {18}, pages = {2111--2122}, } @Article{ewanKemp60, author = {W. D. {Ewan} and K. W. {Kemp}}, title = {Sampling Inspection of Continuous Processes with no autocorrelation between successive results}, journal = {Biometrika}, year = {1960}, volume = {47}, number = {3/4}, pages = {363--380}, } @Article{pierceSchafer86, author = {D. A. {Pierce} and D. W. {Schafer}}, title = {Residuals in Generalized Linear Models}, journal = {Journal of the American Statistical Association}, year = {1986}, number = {396}, volume = {81}, pages = {977--986}, } @BOOK{hardin, author = {J. {Hardin} and J. {Hilbe}}, title = {Generalized Linear Models and Extensions}, publisher = {Stata Press}, year = {2001}, } @BOOK{montgomery, author = {D. C. {Montgomery}}, title = {Introduction to statistical quality control}, publisher = {John Wiley \& Sons}, year = {2005}, } @Misc{hypgeom, author = {E. W. {Weisstein}}, year = {2006}, title = {{"Hypergeometric Function". From \textit{MathWorld} -- A Wolfram Web Resource}}, note = {\url{http://mathworld.wolfram.com/HypergeometricFunction.html}}, } @Article{farrington96, author = {C. P. {Farrington} and N. J. {Andrews} and A. D. {Beale} and M. A. {Catchpole}}, title = {A Statistical Algorithm for the Early Detection of Outbreaks of Infectious Disease}, journal = {Journal of the Royal Statistical Association. Series A}, year = {1996}, volume = {159}, pages = {547--563}, } @Misc{packageSpc, title = {spc: Statistical Process Control}, author = {S. {Knoth}}, year = {2004}, note = {R package version 0.1. \url{http://www.cran.r-project.org/src/contrib/Descriptions/spc.html}}, } @Article{lucas85, author = {J. M. {Lucas}}, title = {Counted Data {CUSUM}'s}, journal = {Technometrics}, year = {1985}, volume = {27}, number = {2}, pages = {129--144}, } @TECHREPORT{hoehle2008, author = {M. {Hhle} and M. {Paul}}, title = {Count data regression charts for the monitoring of surveillance time series}, institution = {To appear in Computational Statistics and Data Analysis}, year = {2008}, note = {accepted in 14 February 2008, doi:10.1016/j.csda.2008.02.015 } } @article{hoehle2007R, author = {M. {Hhle}}, title = {{surveillance: An R package for the monitoring of infectious diseases}}, year = {2007}, journal = {Computational Statistics}, } @ARTICLE{lai95, author = {T. L. {Lai}}, title = {Sequential Changepoint Detection in Quality Control and Dynamical Systems}, journal = {Journal of the Royal Statistical Society. Series B}, year = {1995}, volume = {57}, pages = {613--658}, number = {4}, } @ARTICLE{kleinmannAbrams, author = {K. P. {Kleinman} and A. M. {Abrams}}, title = {Assessing surveillance using sensitivity, specificity and timeliness}, journal = {Statistical Methods in Medical Research}, year = {2006}, volume = {15}, pages = {445--464}, } %%from michaela @article{gneiting-raftery-2007, author={Tilmann Gneiting and Adrian E. Raftery}, title={Strictly proper scoring rules, prediction, and estimation}, journal={Journal of the American Statistical Association}, year=2007, volume={102}, number=477, pages={359--378} } @Manual{maptools, title = {maptools: Tools for reading and handling spatial objects}, author = {Nicholas J. Lewin-Koh and Roger Bivand and contributions by Edzer J. Pebesma and Eric Archer and Adrian Baddeley and Hans-Jrg Bibiko and Stephane Dray and David Forrest and Michael Friendly and Patrick Giraudoux and Duncan Golicher and Virgilio Gomez Rubio and Patrick Hausmann and Thomas Jagger and Sebastian P. Luque and Don MacQueen and Andrew Niccolai and Tom Short and Ben Stabler}, year = {2010}, note = {R package version 0.7-34}, url = {http://CRAN.R-project.org/package=maptools}, } @article{czado-etal-2009, author = {Claudia Czado and Tilmann Gneiting and Leonhard Held}, title = {Predictive model assessment for count data}, journal = {Biometrics}, year = 2009, volume = {65}, number = 4, pages = {1254--1261}, } @article{held-etal-2006, author = {L Held and M Hofmann and M {H\"ohle} and V Schmid}, title = {A two-component model for counts of infectious diseases}, journal = {Biostatistics}, year = 2006, volume = {7}, number = 3, pages = {422--437}, } @article{held-etal-2005, author = {Held, Leonhard and H\"ohle, M and Hofmann, M}, title = {A statistical framework for the analysis of multivariate infectious disease surveillance counts}, journal = {Statistical Modelling}, year = 2005, volume = {5}, number = 3, pages = {187--199}, } @article{paul-etal-2008, author = {M. Paul and L. Held and A. M. Toschke}, title = {Multivariate modelling of infectious disease surveillance data}, journal = {Statistics in Medicine}, year = 2008, volume = {27}, number = 29, pages = {6250--6267}, doi = {10.1002/sim.3440}, } @article{paul-held-2011, author={Paul, M. and Held, L.}, title={Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts}, journal={Statistics in Medicine}, volume = {30}, number = 10, pages = {1118--1136}, year=2011, doi={10.1002/sim.4177}, } @article{herzog-etal-2010, author = {Herzog ,S. A. and Paul, M. and Held, L.}, title = {Heterogeneity in vaccination coverage explains the size and occurrence of measles epidemics in {German} surveillance data}, journal = {Epidemiology and Infection}, year = 2011, volume = {139}, issue = 4, pages = {505--515}, doi={10.1017/S0950268810001664} } @article{hoehle-2007, author = {H{\"o}hle, M}, title = {Surveillance: an {R} package for the monitoring of infectious diseases}, journal = {Computational Statistics}, year = 2007, volume = {22}, number = 4, pages = {571-582}, } @incollection{hoehle-mazick-2010, author = {H{\"o}hle, M. and Mazick, A.}, title = {Aberration detection in {R} illustrated by {Danish} mortality monitoring}, booktitle = {Biosurveillance: A Health Protection Priority}, publisher = {CRC Press}, year = 2010, editor = {Kass-Hout, T. and Zhang, X}, } @misc{vignette, author = {M. {H{\"o}hle} and A. {Riebler} and M. {Paul}}, title = {The {R}-Package 'surveillance'}, year = 2007, } @MISC{survstat-fluByBw, author = {{Robert Koch-Institut}}, title = {{SurvStat@RKI}}, howpublished = {\url{http://www3.rki.de/SurvStat}}, year = {2009}, note = {Accessed March 2009}, } surveillance/MD50000644000176000001440000004233512242705203013312 0ustar ripleyusers55f35b125ae4bd9b304a3c4e98d345f2 *DESCRIPTION 3eeae91f4b3a761c47e3e0d7af10143a *NAMESPACE 5757e933dbe5fc1c2652549a0311879d *R/AllClass.R 9ebbbd4fc73b50cf43cf41e4ed166c89 *R/AllGeneric.R 488af5c741ed268133e4fe06c9e037d8 *R/LRCUSUM.runlength.R e07e984ff9fd79508c84b4c691294912 *R/algo_bayes.R dada40fcd3e3c27368cd9069641ba5ba *R/algo_call.R be214ec6475829e4205744ac732af81a *R/algo_cdc.R c9ca07b4861c4273ff8331615a435e82 *R/algo_cusum.R 2f2f2f54604d1b33742346e1f747f7b9 *R/algo_farrington.R 9f43db392bc08ed72869fe5c6cd54565 *R/algo_glrnb.R 3db79eef3951132cc41d05eb095dc766 *R/algo_glrpois.R 3b039ab8fbd280448ea8ab18cfc842d0 *R/algo_hhh.R 349714ac98e2734615f0aed696e0c056 *R/algo_hmm.R ffe30e0cf94d26af23fef991a0e66cc4 *R/algo_outbreakP.R 7e59e5a1fd0c57754e6f123e04014da9 *R/algo_rki.R e33c4e91fcaec7731e2b9f48b3c0042f *R/algo_rogerson.R 851baf7f0ca3f4a3d32a52a749e51fdf *R/algo_twins.R 88172bb94a613e34c473ccfb218e1c92 *R/backprojNP.R 58f183cd43de6a0d9a30d3bc976eed3c *R/catCUSUM.R 9478f626e70c9d7f8185a5105805aea8 *R/checkDerivatives.R c65e9c1ed5054d3ab72e8e96d4151eae *R/earsC.R c69bbe5d580156fc85ac91f2d9575f66 *R/farringtonFlexible.r 499516a69f9535c3d423e20fff7089b5 *R/gpc.poly-methods.R 984ace8e2de655000f9b7796d8eff099 *R/graphs.R 335a571f9aaaebdf08dbd7d7bf9e4ac5 *R/hhh4.R 46f625ebe811ba205a26a5a45c05ecaf *R/hhh4_methods.R f3de8aacae2c857b24a886746bd113f1 *R/hhh4_oneStepAhead.R eb8bc79592a0f6da7a9794e3f76a015a *R/hhh4_simulate.R 8cfd41971cfb585f0166d07f12b3ed7e *R/hhh4_weights.R 9c0f5da853e9edb71e6d4bebbc501dc1 *R/intersectPolyCircle.R b0464b77eb458c9086c55491597d2197 *R/isoWeekYear.R c41c26cbc294733ee3f92f0965661146 *R/ks.plot.unif.R ccc99d23c44d90f8089deeda1ba135b1 *R/linelist2sts.R 54b4e5a8c54769aa9952173f7f4beeec *R/misc_dataProcessing.R d422246b5d50244224cf20c9e3801cee *R/modifyListcall.R 97dc655b61a75fe9c57bb39e2f5013a6 *R/newtonRaphson.R e406692cf0852cc261bbd2793a72b083 *R/nowcast.R 010968c070940bec9434a692cfed8398 *R/options.R 6ef55423957a51d580307775bd4520bb *R/pairedbinCUSUM.R ce260573344c25b486aed2d9a7f2cd43 *R/plot_graphics.R b8f1263487a1a4c00fca3489e54d004b *R/plot_multi.R 09197f8ab423db066604ab32d9417970 *R/plot_xtable.R febe1dfb00fa9c8c3d21fd524ec87a33 *R/scores.R 7a05e6653d764f127813157b00f1f576 *R/sim_HHH.R d76738240acf75767e17440185a3503a *R/sim_background.R 064d3a73fdd755280188e83d8f858945 *R/sim_pointSource.R 0ed40d42d475f75746d217bbb8b47845 *R/spatial_tools.R 586867dd964e87bae8dc1a276c4ef094 *R/stcd.R aefe48e25d52c19d15960a7f48cd36e9 *R/sts.R 6c830501f2f3655580a08cf50dd6ecfd *R/stsBP.R 8378a889c6c3dd2be8c8b4a2d949126a *R/sysdata.rda 692aa77b1ee65f1269d73aaf2ea9905a *R/testcalls.R 0b7d31235ccb9aeef2894e9f31402538 *R/twinSIR.R bf1dd03bee61dc40a00d9ce70960e29d *R/twinSIR_epidata.R 6d35209739d561bcf2babc84084916b4 *R/twinSIR_helper.R 0c251c18648b2a2b03eff1a432d49698 *R/twinSIR_intensity.R 23a9c3d7cb8b364e64dd08c39b414ecf *R/twinSIR_methods.R 895f45936bc77fd8cec4f3f9857599b5 *R/twinSIR_simulation.R 606edb0d91183df1ba393493ac9f20db *R/twinstim.R a32a36837a21963a106026ba572fc5f1 *R/twinstim_epidata.R 053ac520a4af4ad83ef09358f851724e *R/twinstim_epidata_methods.R ae1e012fd4135d933c1247507a4b6a2c *R/twinstim_glm.R 8f320019d61baeff43513e1cfa3727ac *R/twinstim_helper.R 393273117e91d7f747101423eaa384c3 *R/twinstim_methods.R 65e2ea2eb0bbf85617018f48bf92d71c *R/twinstim_siaf.R 248d3a7908ceaed60c98628f0df7ab21 *R/twinstim_siaf_gaussian.R 9420f3a936d4ef17c0b0a804f7458860 *R/twinstim_siaf_lomax.R d6f59cebf4e00fc2498451d558ac0cc2 *R/twinstim_siaf_powerlaw.R baf40a43d0d29352490b1f3f955694eb *R/twinstim_siaf_powerlawL.R 549fa6127f767f8544cc5d9ce9a37da5 *R/twinstim_simulation.R 6c130c853f64a111b359f76961d6bade *R/twinstim_step.R a2ba126e720629fc8389df9cf5a96759 *R/twinstim_tiaf.R 400652499a6d6e94e1003746530043e1 *R/untie.R 2df4513162b271bf1b1a9924f4238d88 *R/wrap_univariate.R dd71d598cadaf915c4f67ce4e78e585a *R/zzz.R ab7b3d0a91479b99d10b4ecf40e7da99 *build/vignette.rds 39cd4adbe3c05e3bed5a29e962a30724 *data/MMRcoverageDE.RData bc57ed2de6c59d625e8ff1dc4bcc534d *data/abattoir.RData a5d19dc926e0079295e7bbb807b71183 *data/deleval.RData 39d04cde4be2c6f0722e7516ead4f5ce *data/fluBYBW.RData 4e6936fe19397c28d73483e524a0a4e2 *data/foodata.RData 9e2ca201eec569ab449ba3c0fb74df2d *data/fooepidata.RData 180cf88831013fdf378cbf49b2f46558 *data/foofit.RData 154bd5f0caec21664a3b42caf7990582 *data/h1_nrwrp.RData fe16935fa3d4aeea19dd7f7b45680efb *data/ha.RData f13e5e8fff2b55cb8df0169792c821eb *data/ha.sts.RData b08b984194d7a671d498b0c98e220924 *data/hagelloch.RData d86889b540c46c9b9ea2b42e5dfd3bcc *data/hepatitisA.RData 2fcf533585f5145db50bb0a345fa3d24 *data/imdepi.RData f86d7193bc68a9835c7826448785b3a3 *data/imdepifit.RData 445460586865937f0977d2870ada141d *data/influMen.RData d7e124e76fd06d35ac3de97cfb3ca0d8 *data/k1.RData 1173ed2c8b616486e274967c6a97ce8f *data/m1.RData f4ae714001625bb89963fe0e4e2e9a77 *data/m2.RData b21b89d9b8dab8750e93f944fc30cac1 *data/m3.RData ec915cd8e2ce14bfd9a8de11bdba92ad *data/m4.RData 728cf151f5516831158588b57d194cd9 *data/m5.RData b1313db9d37f054c5185cea5fc215ca0 *data/measles.weser.RData 9b38f5dd970f407ef6eb0197c9f428f8 *data/measlesDE.RData 6e88fa261848741a2927e8a0208c176c *data/meningo.age.RData 50a6532c6e5cde846c2354693a265b5a *data/momo.RData 0c08f2d5d556db1d91f1c6a3d3125d70 *data/n1.RData 029fff2b44242b6fc032dd4abb839207 *data/n2.RData 9b33e305674dc2bd24e465592a88e4e1 *data/q1_nrwh.RData f19779c068198733db7f1c95cecc19db *data/q2.RData 66338d480d9d6f7541d6b7f5690f1c94 *data/s1.RData 08135e0c5091d08becc0ceb7bb3bb3c4 *data/s2.RData a24280cb563d545fa1f547b5c0959962 *data/s3.RData ebc818bb58803591f7ade0b04d956926 *data/salmonella.agona.RData f976fafb219fc04b750e0e4117ba054c *data/shadar.RData 97c92287e08fb4908e6e1e5377ce4f03 *demo/00Index fbc204efd6d34f7061f99580f770fd35 *demo/biosurvbook.R a6e5d4f6ba7b0dd2307175afc9460aac *demo/cost.R bfb498546206bd0e4e3ae1423e22c6e4 *inst/CITATION dc04f3f81f53ea433d8bd71fc20d04f0 *inst/NEWS.Rd 5d566af39ce74cb70757a4375d462edc *inst/doc/glrnb.R f777348428b5eb98ba1954089cbdfe86 *inst/doc/glrnb.Rnw f8a21093aa5cc4faad020052292f7e72 *inst/doc/glrnb.pdf 6967166f90c747bd7ea90c79c071b12f *inst/doc/hhh4-cache.RData 983a474d57b46b70b7bb459280496629 *inst/doc/hhh4.R 04fdd5d19c3e3c0a4762491658071d3d *inst/doc/hhh4.Rnw fec2f2c4886ad04c4ea2097a58c0e2e6 *inst/doc/hhh4.pdf b1eda1570ac0b890180ee15fbd697485 *inst/doc/surveillance-cache.RData f5914daac805a229cd058d42cb78e3bd *inst/doc/surveillance.R f4f7f163915ee62ad9cd5e30e4cae468 *inst/doc/surveillance.Rnw e5256fbc187abae407b3439e932baefb *inst/doc/surveillance.pdf e2e3d5a2b56513964a64fe6476d52818 *inst/extdata/counts_flu_BYBW.txt 7475135b03ccdf173429ee21b85ca4f8 *inst/extdata/h1_nrwrp.txt 6b1da7976e5a3a83fa4aef34a85fbc3b *inst/extdata/k1.txt 8df0eec6b4370d8fb4474939bd468f75 *inst/extdata/m1.txt 36acb8eadf4088b4df254363e491c93e *inst/extdata/m2.txt 7dcfecd167561244cce073f26508cc65 *inst/extdata/m3.txt fa4c5c3940fadaa326d71e557c0fa769 *inst/extdata/m4.txt 987da7f7150baa5224cf002ff433cedf *inst/extdata/m5.txt 695773a46addc3189753d7b00bf2cec9 *inst/extdata/n1.txt d1cfd8d70ad90c0588b5ecab843d6a44 *inst/extdata/n2.txt 7368155ea8525f22a4039c99101fa209 *inst/extdata/neighbourhood_BYBW.txt 57facd5cc2cdaadf18538e6742158b88 *inst/extdata/population_2001-12-31_BYBW.txt 242a2683b7480faf8755ecee88e640f2 *inst/extdata/q1_nrwh.txt fc7bf5a597d4ddaab36faa6b02f682c5 *inst/extdata/q2.txt cbe1b1190400f7029f24c761c100fddb *inst/extdata/s1.txt a8cf8716b32896d394ce1a1528763d2d *inst/extdata/s2.txt 403ff1cd7ad4649f141448b45c244036 *inst/extdata/s3.txt 3cfa159d1f9810e948068fb7831fdc2c *inst/extdata/salmonella.agona.txt 61faaa303d7c5e4e88278dc1026f1463 *inst/shapes/berlin.dbf 6d61b4a4e2ba0197aed611390250f5a8 *inst/shapes/berlin.sbn 4215c8c5fc9aa22fa9277267cbe20746 *inst/shapes/berlin.sbx 57a46753e569f12f8aa48540429444d4 *inst/shapes/berlin.shp 2a29a0fdf04dc5a01a3614ef1096f7e5 *inst/shapes/berlin.shx d1f3b9bd2251c20b24fd9f047d048eb3 *inst/shapes/districtsD.RData a1ad825549f8d4aa6b6a5cecb5755b1b *inst/shapes/districts_BYBW.dbf e05bceaa0e4dcea2fe3effa1dcddd2da *inst/shapes/districts_BYBW.shp 9962ddcf28b7eea0ea31c1720d14e77b *inst/shapes/districts_BYBW.shx fd4c03e1b4fe1f89a145f93d8c7c5dca *inst/unitTests/runit_algoglrnb.R affd5a9ff16dede57ad2398964b9c830 *man/LRCUSUM.runlength.Rd 68047c0b43e002d3d783324d1dee07ed *man/MMRcoverageDE.Rd 324b5fa5008db97e2436248e0cdbfba1 *man/R0.Rd 9f827e9d16c728aeb315bac835ddc636 *man/abattoir.Rd b856f9dc1a200cd0c78f07f8dc03b6dc *man/addSeason2formula.Rd 83d43d0ff309d2f2d2061769f051c73d *man/aggregate.disProg.Rd 87ab0de867524a03a869dddbcae80179 *man/algo.bayes.Rd 6dbd3ecb97ca3802411bdf24b3440622 *man/algo.call.Rd 7df4913d8cf692b2a1e69bfa0e42ad0d *man/algo.cdc.Rd da86a2d555071c5c8befda8099a07929 *man/algo.compare.Rd 52c64d8db9150b4e2d017dc3ffee7149 *man/algo.cusum.Rd 9c95544ff5cb1353b7f06a2b409597b6 *man/algo.farrington.Rd 43b5e5c1d6ec4e0cc7efa582d4a1f047 *man/algo.farrington.assign.weights.Rd 96f65c87c55bbdaeffd1f8838842615d *man/algo.farrington.fitGLM.Rd 5c26bb44dd9f7b4ba6ea36aa12c223d4 *man/algo.farrington.threshold.Rd 333cff30b08f7c89abe104c869ecdbfe *man/algo.glrnb.Rd 3acbda9096665c1c194e7d5564591c5b *man/algo.glrpois.Rd 172a0613d9ea8c41249465b71b1b402d *man/algo.hhh.Rd c558c05d835279f4c34433b9b0739cd0 *man/algo.hhh.grid.Rd a374d8c18d1a8fbdd4b8ce1a37d8405b *man/algo.hmm.Rd 365c177b208c9348fa03481a5120c623 *man/algo.outbreakP.Rd 5bb563fa48de712e102f0fae75b36117 *man/algo.quality.Rd a8d32e124ec656138b4d95b18ba01864 *man/algo.rki.Rd 7b4d8231127a12bad082bb9e978ba51a *man/algo.rogerson.Rd 153a9f225b8d231fa67e36f9b277cb9d *man/algo.summary.Rd 522db96bbc687ce465f9768407090bb9 *man/algo.twins.Rd d3822596ea8c07c0ba128f7f70f2140f *man/animate.Rd 4a498092a4dc6f05aab28dbadd9fecbf *man/anscombe.residuals.Rd af4a2443f164cb0761ab003ede106ce6 *man/arlCusum.Rd 8fba3d43f36c5192474f8e3597d3a1b0 *man/backprojNP.Rd 69323cec2352af38c3c91c2bb4e0f0ac *man/bestCombination.Rd ac6cd4ab8ced02be8cc921e2960df7b9 *man/categoricalCUSUM.Rd 4c59feeeed54e43e4131f15cb76b8f68 *man/checkResidualProcess.Rd 2aa23e12ccfff25d1f3fa7ea1a061503 *man/compMatrix.writeTable.Rd 319d40887d73a27cc8f4c5029cabff75 *man/correct53to52.Rd 1aea752efd836eb3fab5164b3c6c483a *man/create.disProg.Rd fa32f0323061e36744a6ba031a5a8469 *man/create.grid.Rd 0ad47182fdad29a99fc197fb94bcf8b0 *man/deleval.Rd f19f6e9be0bfcc9a6e08adbf958c6b7a *man/disProg2sts.Rd 80329fe7efe094d8833545c66af03bae *man/discpoly.Rd ff1f4ba162982f12db8d92af84e84289 *man/earsC.Rd e27fcca6f14c93e3e26d98ffaa5363a1 *man/enlargeData.Rd b7db2bc364bc5e070d0422d235026807 *man/estimateGLRNbHook.Rd 6cdfcb41cbf1187608b9ce530e4a2bad *man/estimateGLRPoisHook.Rd 362ae14c98d7f484ccef8f403bf49544 *man/farringtonFlexible.Rd 369cd16f4ae8448c6d4f330cd3a2e551 *man/find.kh.Rd f9e50061341a8bb2edcf9f97db60b6ad *man/findH.Rd 81fa90d421a1125feb41851f896e3e2b *man/findK.Rd 0ffd9fa119d262e32f0d7fadad163353 *man/fluBYBW.Rd f074e4a1e092cbdad0558bc7efd112d7 *man/formatPval.Rd 78241ec03b9e2219be5194ac8d58eec6 *man/ha.Rd 4bb8749022f0642616ab11faaca3334b *man/hagelloch.Rd 01bf7b983d901e0c805f7eae3002d3df *man/hepatitisA.Rd 597495115c3bb9f75337221e90c16a0c *man/hhh4.Rd 392743c1b8db65d6236b88f50b6ae130 *man/hhh4_formula.Rd 01b070ac7c5e3deab42db7f1838e3620 *man/hhh4_methods.Rd ad8d4ba0d59b5ed827b174d4580cb221 *man/hhh4_predict.Rd 61bc97916f58e3b928870e5094641305 *man/hhh4_validation.Rd 726a064c5539e54a66a21138bd0a40cb *man/imdepi.Rd 7c6c7d7f79f9570fbc7acdf91af9462a *man/influMen.Rd 0a357ea0865d70111f7baee6b09d5f7e *man/inside.gpc.poly.Rd df35457995a21853415e9af9e3ada813 *man/intensityplot.Rd 2b609124840577c36396c103047b97f9 *man/intersectPolyCircle.Rd 9d04dc30b863d2a5961247f906ec770c *man/isScalar.Rd c76e78a45c8308ea7d2f98170407e728 *man/isoWeekYear.Rd 679aeaee52f1b1a521cf846ebf1f8ec9 *man/ks.plot.unif.Rd 7439c3ac39bdee8f880f036c4a39229b *man/linelist2sts.Rd d52f3c41b3587f148b71c942af1e278d *man/loglikelihood.Rd 1a1d99966006b6998b726869180a1bc0 *man/m1.Rd d3447ea171121378eb39f6a79b4e5203 *man/magic.dim.Rd 0871650fbdd650fc46df7c8762b2508c *man/make.design.Rd 2801e72dae8ef4b33672b9922e8293cd *man/makePlot.Rd f665aea89a14a094010e5b880e18f582 *man/meanResponse.Rd 98273d3663822f43c2b217d434957011 *man/measles.weser.Rd 69fdba5f7fcbd2a12497c033d4d5d073 *man/measlesDE.Rd 76dd10c0fd87ada9a7bafb1b1146dc6d *man/meningo.age.rd a8f64d6f51bea302fc1ff30f346b0ec2 *man/momo.Rd 38de4450726ab1b2f04bc01ebe860f13 *man/multiplicity.Rd db2449785e11053b027cfc855e63449a *man/nbOrder.Rd 398b7959aeb4a2573a9515511b374f95 *man/nowcast.Rd e70083db0c45d0dd7485bf3316871832 *man/pairedbinCUSUM.Rd 4c0c93b8260967a505aceb7cd519cccc *man/plot.atwins.Rd 7696c53856163ddbc06fef5dfb23859c *man/plot.disProg.Rd 9637d3e9c2cc5be63e4617f163ca232a *man/plot.survRes.Rd 41a6f183cc51a1bcac4a03243cf8ee05 *man/poly2adjmat.Rd 11ec54654d7cd02bb8c6c7d43befcfd2 *man/polyAtBorder.Rd caff937de65add937adc4876d5d52890 *man/powerlaw.Rd e208f167886c6ccfe22cfaf2a4ea0731 *man/predict.ah.Rd 607bc9e8b1624f1415019417f6e0d9b7 *man/primeFactors.Rd 928eff1f1e598de4176175af89560fa3 *man/print.algoQV.Rd 78f3fabce93aef267799a0528c84ed69 *man/qlomax.Rd 312512ae8945e7acb44f8e3f4e0efb39 *man/readData.Rd 98fd54bb56a99b006f43750ea6f4a94d *man/refvalIdxByDate.Rd a0785182c551f53e6a8936d3ceb60ee4 *man/residuals.ah.Rd 61cb5ac1b932674bd4a9d1b41fd0c8d4 *man/residualsCT.Rd 4e859fb3b9452782199359f9ecd3e653 *man/runifdisc.Rd 079678c075a737515b89fdef444a0715 *man/salmonella.agona.Rd 13b2a4a417b50c7b4dbb1903dfab6f68 *man/scale.gpc.poly.Rd 2a0f8870abea1924431c9c7488b734e0 *man/shadar.Rd bc44231fc7b3402cae7cd70a2625a499 *man/sim.pointSource.Rd 59cbca3d776400f8e5bf94cda309904c *man/sim.seasonalNoise.Rd 14923989e97e84fdce22e2f71f13d744 *man/simHHH.Rd 14a14e43f9d980e82996cbdc9f29a8a9 *man/simulate.ah4.Rd bb60b62230fdc91b7f6ad6a09d9bfc02 *man/stcd.Rd 0ee3dfdeceea1a6c78cf7454de79ac95 *man/sts-class.Rd 45605e3fa867544cb229eb02bbc18429 *man/stsAggregate.Rd 35c3ddc633a082fa29522ba7e75f3c17 *man/stsBP-class.Rd 5253c6bf955df2e77635b73c45d63807 *man/stsDisp.Rd 12f381b8971e40942556064737297adb *man/stsSlots.Rd f3a5c440990e678b3507e1276034e679 *man/stsXtrct.Rd 7a51052cfe961bb040b176c81339441b *man/sumNeighbours.Rd 83318272d87326b821232dfb4eaed85a *man/surveillance-package.Rd d5914464cdf2cd55075812115ac6b683 *man/surveillance.options.Rd f9d253c0ab49b0057febd30f9c36203b *man/test.Rd 7f40863d854dacf0cc18ff9bcf98a7c5 *man/testSim.Rd 12fb515e2c77bbb76ecf237f8b1ee1cd *man/toFileDisProg.Rd 14f78f8e0c6af1a9e325d47054d96eb6 *man/twinSIR.Rd 52c55bd23b27f40474997747638a9490 *man/twinSIR_cox.Rd 9d6eb7b22c9bf9f330ce59e88f39681b *man/twinSIR_epidata.Rd 9da2e05ab8b7fdbf74fe123d1f1bb511 *man/twinSIR_epidata_animate.Rd 5b87352e38b2d80918bcf4d5ee8bdefc *man/twinSIR_epidata_intersperse.Rd bad34fd0e11f5bb0e916444f7baaa2a1 *man/twinSIR_epidata_plot.Rd 31c143aff94bcb296cd3ef5637153992 *man/twinSIR_epidata_summary.Rd 97083676e280ef418ba00802ce6c7697 *man/twinSIR_exData.Rd 1b68bde74236627ea42fdf3081b83d6b *man/twinSIR_intensityplot.Rd a8ecbd8d9da579b94cae98389e6f4296 *man/twinSIR_methods.Rd 2de935ef5507b3bbb32ec7c430dfdf8f *man/twinSIR_profile.Rd 2a92d42d2b501dedb203bb4f1cccac4c *man/twinSIR_simulation.Rd 3a13476515792270fc572b68edce0fb5 *man/twinstim.Rd fbaae4d334c8dc417025cf4bdbffcfd1 *man/twinstim_epidataCS.Rd aac2f8f292bf77ca1f664edb3e6ce638 *man/twinstim_epidataCS_aggregate.Rd f6efed9f7f378f96c93df1897430dc43 *man/twinstim_epidataCS_animate.Rd b7c6be0f83557deceeb1cf63a7f936b1 *man/twinstim_epidataCS_plot.Rd 0863813ff8b0212df7a53209dc660026 *man/twinstim_epidataCS_update.Rd f0b9335b619464513b4486970cf2c80d *man/twinstim_iaf.Rd 42b6a466d775e0feda63f0b808239bab *man/twinstim_iafplot.Rd c4285a61e6f540cb40c88f1afb4509ba *man/twinstim_intensityplot.Rd 341ced239579da1df5efb35ee7a11436 *man/twinstim_methods.Rd 30954d87702654fac94fb92a7170e848 *man/twinstim_plot.Rd 5571addf634a4d72c67e7c1fb752e26c *man/twinstim_profile.Rd 5cfd970a803227f91badc56cb56b3041 *man/twinstim_simulation.Rd 09a9bf371ed24206d1a3af5917a54902 *man/twinstim_step.Rd 5417bb435d7e87954e1f7e683ecf1c07 *man/twinstim_update.Rd d29934ef4632a47a4288ddb519955df0 *man/unionSpatialPolygons.Rd f2abfe10121b8f2bf0faaba07c220dd0 *man/untie.Rd d6ddf2f0c489e168841d9830dc5bb01c *man/wrap.algo.Rd 827e035f4597ade0783da616b100fd1b *man/xtable.algoQV.Rd 097df59c31e96b389c3a74a7e40541a2 *man/zetaweights.Rd 6cdac59cb5c2917894dcd80d09a68885 *src/Makevars c01d4199673982821a4816c702f9885e *src/Makevars.win b03b552e9456a164ef4b99a3a73f1e24 *src/backproj.cc 591f53f4e940f79fae3422b45238e815 *src/gsl_wrappers.h d250bee682f538b62e1211abb0c6508a *src/ks.c b88cfaeae45fcb3d8c9d4a5e3e2a27ed *src/stcd-assuncaocorrea.cc c7e10733c5a4a27293f72ae939935163 *src/stcd-assuncaocorrea.h f5f8b17638ad384e9f015b1d3fe94bff *src/surveillance.c 669662da4a89999b6a37b1fb9c32505f *src/twins.cc b2beeb294c448a5db17138017a25f15a *tests/createSTS-objects.R d1f0f4b19e9199324a205c6f82797bf2 *tests/doRUnit.R e2e3d5a2b56513964a64fe6476d52818 *tests/flu_ByBw.txt 7368155ea8525f22a4039c99101fa209 *tests/neighourhood_ByBw.txt 57facd5cc2cdaadf18538e6742158b88 *tests/population_2001-12-31_ByBw.txt bb6582125b2295d609e621b3b5f7a747 *tests/test-nbOrder.R 5377d1ca6f84996460749d2af7d623a7 *tests/test-siafs.R f777348428b5eb98ba1954089cbdfe86 *vignettes/glrnb.Rnw 6967166f90c747bd7ea90c79c071b12f *vignettes/hhh4-cache.RData 04fdd5d19c3e3c0a4762491658071d3d *vignettes/hhh4.Rnw 68a3fbbbbd3eb173f354a76fedd5b2d3 *vignettes/map-weserems.eps 29af6a7f0f0d933dce2ad1353e16e326 *vignettes/map-weserems.pdf 63a7b963e2b9d494c031451bdc25f761 *vignettes/references.bib b1eda1570ac0b890180ee15fbd697485 *vignettes/surveillance-cache.RData f4f7f163915ee62ad9cd5e30e4cae468 *vignettes/surveillance.Rnw surveillance/build/0000755000176000001440000000000012242645664014110 5ustar ripleyuserssurveillance/build/vignette.rds0000644000176000001440000000050212242645664016444 0ustar ripleyusersRMO0.?6?? &`Lבh,-)EW,lQJ6CK̼y/W!xys;oq%2^Wzs nkBfRD&uAcbS"1L8K3ɒ ՚ W7L}u 3d nuEg;&驇3[u2wsvJ-%w{Ӂ7Jノ#s6طҒ 2\ҷF*AM< ;wsm1(PU+TA_,surveillance/DESCRIPTION0000644000176000001440000001031312242705203014477 0ustar ripleyusersPackage: surveillance Title: Temporal and Spatio-Temporal Modeling and Monitoring of Epidemic Phenomena Version: 1.7-0 Date: 2013-11-19 Authors@R: c(person("Michael", "Hhle", email = "Michael.Hoehle@stat.uni-muenchen.de", role = c("aut", "cre", "ths")), person("Sebastian", "Meyer", email = "Sebastian.Meyer@ifspm.uzh.ch", role = "aut"), person("Michaela", "Paul", email = "Michaela.Paul@ifspm.uzh.ch", role = "aut"), person("Leonhard", "Held", email = "Leonhard.Held@ifspm.uzh.ch", role = c("ctb", "ths")), person("T.", "Correa", role = "ctb"), person("M.", "Hofmann", role = "ctb"), person("C.", "Lang", role = "ctb"), person("A.", "Riebler", role = "ctb"), person("D.", "Sabans Bov", role = "ctb"), person("M.", "Salmon", role = "ctb"), person("S.", "Steiner", role = "ctb"), person("M.", "Virtanen", role = "ctb"), person("V.", "Wimmer", role = "ctb"), person("R Core Team", role = "ctb", comment = "A few code segments are modified versions of code from base R")) Author: Michael Hhle [aut, cre, ths], Sebastian Meyer [aut], Michaela Paul [aut], Leonhard Held [ctb, ths], T. Correa [ctb], M. Hofmann [ctb], C. Lang [ctb], A. Riebler [ctb], D. Sabans Bov [ctb], M. Salmon [ctb], S. Steiner [ctb], M. Virtanen [ctb], V. Wimmer [ctb], R Core Team [ctb] (A few code segments are modified versions of code from base R) Maintainer: Michael Hhle Depends: R (>= 2.15.2), methods, grDevices, graphics, stats, utils, Rcpp, sp (>= 1.0-6), xtable, polyCub (>= 0.4-0) Imports: MASS, Matrix, spatstat (>= 1.34-0) LinkingTo: Rcpp Suggests: msm, spc, colorspace, animation, quadprog, parallel, memoise, polyclip, rgeos, gpclib, maptools, intervals, spdep, numDeriv, maxLik, RUnit, digest, coda, splancs, gamlss Description: A package implementing statistical methods for the modeling and change-point detection in time series of counts, proportions and categorical data, as well as for the modeling of continuous-time epidemic phenomena, e.g. discrete-space setups such as the spatially enriched Susceptible-Exposed-Infectious-Recovered (SEIR) models for surveillance data, or continuous-space point process data such as the occurrence of disease or earthquakes. Main focus is on outbreak detection in count data time series originating from public health surveillance of infectious diseases, but applications could just as well originate from environmetrics, reliability engineering, econometrics or social sciences. Currently the package contains implementations of typical outbreak detection procedures such as Stroup et. al (1989), Farrington et al (1996), Rossi et al (1999), Rogerson and Yamada (2001), a Bayesian approach, negative binomial CUSUM methods and a detector based on generalized likelihood ratios. Furthermore, inference methods for the retrospective infectious disease model in Held et al (2005), Held et al (2006), Paul et al (2008) and Paul and Held (2011) are provided. A novel CUSUM approach combining logistic and multinomial logistic modelling is also included. Continuous self-exciting spatio-temporal point processes are modeled through additive-multiplicative conditional intensities as described in Hhle (2009) ("twinSIR", discrete space) and Meyer et al (2012) ("twinstim", continuous space). The package contains several real-world datasets, the ability to simulate outbreak data, visualize the results of the monitoring in temporal, spatial or spatio-temporal fashion. License: GPL-2 URL: http://surveillance.r-forge.r-project.org/ Encoding: latin1 Packaged: 2013-11-19 11:29:57 UTC; sebastian NeedsCompilation: yes Repository: CRAN Date/Publication: 2013-11-19 16:57:55 surveillance/man/0000755000176000001440000000000012242645665013565 5ustar ripleyuserssurveillance/man/hhh4_methods.Rd0000644000176000001440000001041212206614676016426 0ustar ripleyusers\encoding{latin1} \name{hhh4_methods} \alias{print.ah4} \alias{summary.ah4} \alias{logLik.ah4} \alias{AIC.ah4} \alias{coef.ah4} \alias{ranef} \alias{fixef} \alias{fixef.ah4} \alias{ranef.ah4} \alias{confint.ah4} % FIXME: functions without documentation atm %% \alias{print.summary.ah4} %% \alias{plot.ah4} %% \alias{update.ah4} \title{ Print, Summary and Extraction Methods for \code{"ah4"} Objects } \description{ Besides \code{print} and \code{summary} methods there are also some standard extraction methods defined for objects of class \code{"ah4"} resulting from a call to \code{\link{hhh4}}. } \usage{ \method{print}{ah4}(x, digits = max(3, getOption("digits") - 3), reparamPsi = TRUE, ...) \method{summary}{ah4}(object, ...) \method{coef}{ah4}(object, se = FALSE, reparamPsi = TRUE, idx2Exp = NULL, amplitudeShift = FALSE, ...) \method{fixef}{ah4}(object, ...) \method{ranef}{ah4}(object, tomatrix = FALSE, ...) \method{AIC}{ah4}(object, ..., k = 2) \method{logLik}{ah4}(object, ...) \method{confint}{ah4}(object, parm, level = 0.95, reparamPsi = TRUE, idx2Exp = NULL, amplitudeShift = FALSE, ...) } \arguments{ \item{x, object}{an object of class \code{"ah4"}.} \item{digits}{the number of significant digits to use when printing } \item{reparamPsi}{ logical. If \code{TRUE}, the overdispersion parameter from the negative binomial distribution is transformed from internal (log-)scale to a user scale (where zero corresponds to a Poisson distribution). } \item{\dots}{ For the \code{summary}, \code{fixef} and \code{ranef} methods: arguments passed to \code{coef}.\cr For the remaining methods: unused (argument of the generic). } \item{se}{logical switch indicating if standard errors are required} \item{idx2Exp}{vector with integers idicating the parameters which should be returned on exp-scale.} \item{amplitudeShift}{logical switch indicating whether the parameters for sine/cosine terms modelling seasonal patterns (see \code{\link{addSeason2formula}}) should be transformed to an amplitude/shift formulation.} \item{tomatrix}{logical. If \code{FALSE} (default), the vector of all random effects is returned (as used internally). However, for random intercepts of \code{type="car"}, the number of parameters is one less than the number of regions and the individual parameters are not obviously linked to specific regions. Setting \code{tomatrix} to \code{TRUE} returns a more useful representation of random effects in a matrix with as many rows as there are regions and as many columns as there are random effects. Here, any CAR-effects are transformed to region-specific effects.} \item{k}{ numeric specifying the \emph{penalty} per parameter to be used; \code{k = 2} (default) is the classical AIC. } \item{parm}{a vector of numbers or names, specifying which parameters are to be given confidence intervals. If missing, all parameters are considered.} \item{level}{the confidence level required.} } \details{ The function \code{coef} returns all estimated (regression) parameters from a model as propsed by Paul and Held (2011), see \code{\link{hhh4}}. If the model includes random effects, those can be extracted with \code{ranef}, whereas \code{fixef} returns the fixed parameters. The function \code{AIC} returns the value of the AIC criterion only for models without random effects; otherwise it is not well defined and \code{NA} is returned. The function \code{logLik} returns an object of class \code{"logLik"} in the case of a model without random effects, and the value of the penalized log-likelihood at the parameter estimates otherwise. The function \code{confint} returns Wald-type confidence intervals (assuming asymptotic normality) for one or more parameters in the fitted model. } \value{ See also the documentation for the generic functions \code{\link{coef}}, \code{\link{AIC}}, \code{\link{logLik}} and \code{\link{confint}}. } \author{ Michaela Paul } \references{ Paul, M. and Held, L. (2011) Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts. Statistics in Medicine, \bold{30}, 1118--1136. } %\examples{ %} \keyword{methods} \keyword{print} surveillance/man/twinSIR_intensityplot.Rd0000644000176000001440000001410612003573017020404 0ustar ripleyusers\encoding{latin1} \name{twinSIR_intensityplot} \alias{plot.twinSIR} \alias{intensityplot.twinSIR} \alias{intensityplot.simEpidata} \title{ Plotting Paths of Infection Intensities for \code{twinSIR} Models } \description{ \code{\link{intensityplot}} methods to plot the evolution of the total infection intensity, its epidemic proportion or its endemic proportion over time. The default \code{plot} method for objects of class \code{"twinSIR"} is just a wrapper for the \code{intensityplot} method. } \usage{ \method{plot}{twinSIR}(x, which = c("epidemic proportion", "endemic proportion", "total intensity"), ...) \method{intensityplot}{twinSIR}(x, which = c("epidemic proportion", "endemic proportion", "total intensity"), aggregate = TRUE, theta = NULL, plot = TRUE, add = FALSE, rug.opts = list(), ...) \method{intensityplot}{simEpidata}(x, which = c("epidemic proportion", "endemic proportion", "total intensity"), aggregate = TRUE, theta = NULL, plot = TRUE, add = FALSE, rug.opts = list(), ...) } \arguments{ \item{x}{ an object of class \code{"\link{twinSIR}"} (fitted model) or \code{"\link{simEpidata}"} (simulated \code{twinSIR} epidemic), respectively. } \item{which}{ \code{"epidemic proportion"}, \code{"endemic proportion"}, or \code{"total intensity"}. Partial matching is applied. Determines whether to plot the path of the total intensity \eqn{\lambda(t)} or its epidemic or endemic proportions \eqn{\frac{e(t)}{\lambda(t)}}{e(t)/lambda(t)} or \eqn{\frac{h(t)}{\lambda(t)}}{h(t)/lambda(t)}. } \item{aggregate}{ logical. Determines whether lines for all individual infection intensities should be drawn (\code{FALSE}) or their sum only (\code{TRUE}, the default). } \item{theta}{ numeric vector of model coefficients. If \code{x} is of class \code{"twinSIR"}, then \code{theta = c(alpha, beta)}, where \code{beta} consists of the coefficients of the piecewise constant log-baseline function and the coefficients of the endemic (\code{cox}) predictor. If \code{x} is of class \code{"simEpidata"}, then \code{theta = c(alpha, 1, betarest)}, where 1 refers to the (true) log-baseline used in the simulation and \code{betarest} is the vector of the remaining coefficients of the endemic (\code{cox}) predictor. The default (\code{NULL}) means that the fitted or true parameters, respectively, will be used. } \item{plot}{ logical indicating if a plot is desired, defaults to \code{TRUE}. Otherwise, only the data of the plot will be returned. Especially with \code{aggregate = FALSE} and many individuals one might e.g. consider to plot a subset of the individual intensity paths only or do some further calculations/analysis of the infection intensities. } \item{add}{ logical. If \code{TRUE}, paths are added to the current plot, using \code{lines}. } \item{rug.opts}{ either a list of arguments passed to the function \code{\link{rug}}, or \code{NULL} (or \code{NA}), in which case no \code{rug} will be plotted. By default, the argument \code{ticksize} is set to 0.02 and \code{quiet} is set to \code{TRUE}. Note that the argument \code{x} of the \code{rug()} function, which contains the locations for the \code{rug} is fixed internally and can not be modified. The locations of the rug are the time points of infections. } \item{\dots}{ For the \code{plot.twinSIR} methode, arguments passed to \code{intensityplot.twinSIR}. For the \code{intensityplot} methods, further graphical parameters passed to the function \code{\link{matplot}}, e.g. \code{lty}, \code{lwd}, \code{col}, \code{xlab}, \code{ylab} and \code{main}. Note that the \code{matplot} arguments \code{x}, \code{y}, \code{type} and \code{add} are implicit and can not be specified here. } } \value{ numeric matrix with the first column \code{"stop"} and as many rows as there are \code{"stop"} time points in the event history \code{x}. The other columns depend on the argument \code{aggregate}: if \code{TRUE}, there is only one other column named \code{which}, which contains the values of \code{which} at the respective \code{"stop"} time points. Otherwise, if \code{aggregate = FALSE}, there is one column for each individual, each of them containing the individual \code{which} at the respective \code{"stop"} time points. } \references{ \enc{Hhle}{Hoehle}, M. (2009), Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics, Biometrical Journal, 51(6):961-978. } \author{ Sebastian Meyer } \seealso{ \code{\link{twinSIR}} or \enc{Hhle}{Hoehle} (2009) for a more detailed description of the intensity model. \code{\link{simulate.twinSIR}} for the simulation of epidemic data according to a \code{twinSIR} specification. } \examples{ data("fooepidata") data("foofit") # an overview of the evolution of the epidemic plot(fooepidata) # overall total intensity plot(foofit, which="total") # overall epidemic proportion epi <- plot(foofit, which="epidemic") # look at returned values head(epi) # add the inverse overall endemic proportion = 1 - epidemic proportion ende <- plot(foofit, which="endemic", add=TRUE, col=2) legend("right", legend="endemic proportion \n(= 1 - epidemic proportion)", lty=1, col=2, bty="n") # individual intensities tmp <- plot(foofit, which="total", aggregate=FALSE, col=rgb(0,0,0,alpha=if(getRversion() < "2.7.0") 1 else 0.1), main=expression("Individual infection intensities " * lambda[i](t) == Y[i](t) \%.\% (e[i](t) + h[i](t)))) # return value: matrix of individual intensity paths str(tmp) # plot intensity path only for individuals 3 and 99 matplot(x=tmp[,1], y=tmp[,1+c(3,99)], type="S", ylab="Force of infection", xlab="time", main=expression("Paths of the infection intensities " * lambda[3](t) * " and " * lambda[99](t))) legend("topright", legend=paste("Individual", c(3,99)), col=c(1,2), lty=c(1,2)) } \keyword{hplot} \keyword{aplot} \keyword{dplot} \keyword{methods} surveillance/man/backprojNP.Rd0000644000176000001440000002576412237175135016115 0ustar ripleyusers\encoding{latin1} \name{backprojNP} \alias{backprojNP} %Internal functions \alias{backprojNP.fit} \alias{naninf2zero} \alias{em.step.becker} \title{ Non-parametric back-projection of incidence cases to exposure cases using a known incubation time as in Becker et al (1991). } \description{ The function is an implementation of the non-parametric back-projection of incidence cases to exposure cases described in Becker et al. (1991). The method back-projects exposure times from a univariate time series containing the number of symptom onsets per time unit. Here, the delay between exposure and symptom onset for an individual is seen as a realization of a random variable governed by a known probability mass function. The back-projection function calculates the expected number of exposures \eqn{\lambda_t}{lambda_t} for each time unit under the assumption of a Poisson distribution, but without any parametric assumption on how the \eqn{\lambda_t}{lambda_t} evolve in time. Furthermore, the function contains a boostrap based procedure, as given in Yip et al (2011), which allows an indication of uncertainty in the estimated \eqn{\lambda_t}{lambda_T}. The procedure is equivalent to the suggestion in Becker and Marschner (1993). However, the present implementation in \code{backprojNP} allows only a univariate time series, i.e. simulteneous age groups as in Becker and Marschner (1993) are not possible. The method in Becker et al. (1991) was originally developed for the back-projection of AIDS incidence, but it is equally useful for analysing the epidemic curve in outbreak situations of a disease with long incubation time, e.g. in order to qualitatively investigate the effect of intervention measures. } \usage{ backprojNP(sts, incu.pmf, control = list(k = 2, eps = rep(0.005,2), iter.max=rep(250,2), Tmark = nrow(sts), B = -1, alpha = 0.05, verbose = FALSE, lambda0 = NULL, eq3a.method = c("R","C"), hookFun = function(stsbp) {}), \dots) } \arguments{ \item{sts}{ an object of class \code{"\linkS4class{sts}"} (or one that can be coerced to that class): contains the observed number of symptom onsets as a time series. } \item{incu.pmf}{Probability mass function (PMF) of the incubation time. The PMF is specified as a vector or matrix with the value of the PMF evaluated at \eqn{0,...,d_max}{0,...,d_max}, i.e. note that the support includes zero. The value of \eqn{d_max}{d_max} is automatically calculated as \code{length(incu.pmf)-1} or \code{nrow(incu.pmf)-1}. Note that if the sts object has more than one column, then for the backprojection the incubation time is either recycled for all components or, if it is a matrix with the same number of columns as the sts object, the \eqn{k}{k}'th column of \code{incu.pmf} is used for the backprojection of the \eqn{k}{k}'th series. } \item{control}{A list with named arguments controlling the functionality of the non-parametric back-projection. \describe{ \item{\code{k}}{An integer representing the smoothing parameter to use in the smoothing step of the EMS algorithm. Needs to be an even number. } \item{\code{eps}}{A vector of length two representing the convergence threshold \eqn{\epsilon}{epsilon} of the EMS algorithm, see Details for further information. The first value is the threshold to use in the \eqn{k=0}{k=0} loop, which forms the values for the parametric bootstrap. The second value is the threshold to use in the actual fit and bootstrap fitting using the specified \code{k}. If \code{k} is only of length one, then this number is replicated twice. } \item{\code{Tmark}}{Numeric with \eqn{T'\leq T}. Upper time limit on which to base convergence, i.e. only the values \eqn{\lambda_1,\ldots,\lambda_{T'}} are monitored for convergence. See details. } \item{\code{iter.max}}{ The maximum number of EM iterations to do before stopping. } \item{\code{B}}{ Number of parametric bootstrap samples to perform from an initial k=0 fit. For each sample a back projection is performed. See Becker and Marschner (1993) for details. } \item{\code{alpha}}{(1-\eqn{\alpha}{alpha})*100\% confidence intervals are computed based on the percentile method. } \item{\code{verbose}}{(boolean). If true show extra progress and debug information. } \item{\code{lambda0}}{Start values for lambda. Vector needs to be of the length \code{nrow(sts)}. } \item{\code{eq3a.method}}{A single character being either \code{"R"} or \code{"C"} depending on whether the three nested loops of equation 3a in Becker et al. (1991) are to be executed as safe R code (can be extremely slow, however the implementation is not optimized for speed) or a C code (can be more than 200 times faster!). However, the C implementation is experimental and can hang R if, e.g., the time series does not go far enough back. } \item{\code{hookFun}}{ Hook function called for each iteration of the EM algorithm. The function should take a single argument \code{stsbp} of class \code{"\linkS4class{stsBP}"} class. It will be have the lambda set to the current value of lambda. If no action desired just leave the function body empty (default). Additional arguments are possible. } } } \item{\dots}{Additional arguments are sent to the hook function. } } \details{ Becker et al. (1991) specify a non-parametric back-projection algorithm based on the Expectation-Maximization-Smoothing (EMS) algorithm. In the present implementation the algorithm iterates until \deqn{\frac{||\lambda^{(k+1)} - \lambda^{(k)}||}{||\lambda^{(k)}||} < \epsilon} This is a slight adaptation of the proposals in Becker et al. (1991). If \eqn{T} is the length of \eqn{\lambda} then one can avoid instability of the algorithm near the end by considering only the \eqn{\lambda}{lambda}'s with index \eqn{1,\ldots,T'}. See the references for further information. } \value{ \code{backprojNP} returns an object of \code{"\linkS4class{stsBP}"}. } \references{ Becker NG, Watson LF and Carlin JB (1991), A method for non-parametric back-projection and its application to AIDS data, Statistics in Medicine, 10:1527-1542. Becker NG and Marschner IC (1993), A method for estimating the age-specific relative risk of HIV infection from AIDS incidence data, Biometrika, 80(1):165-178. Yip PSF, Lam KF, Xu Y, Chau PH, Xu J, Chang W, Peng Y, Liu Z, Xie X and Lau HY (2011), Reconstruction of the Infection Curve for SARS Epidemic in Beijing, China Using a Back-Projection Method, Communications in Statistics - Simulation and Computation, 37(2):425-433. Associations of Age and Sex on Clinical Outcome and Incubation Period of Shiga toxin-producing Escherichia coli O104:H4 Infections, 2011 (2013), Werber D, King LA, Mller L, Follin P, Buchholz U, Bernard H, Rosner BM, Ethelberg S, de Valk H, Hhle M, American Journal of Epidemiology, 178(6):984-992. } \author{ Michael \enc{Hhle}{Hoehle} with help by Daniel \enc{Sabans Bov}{Sabanes Bove} for the \pkg{Rcpp} interface } \note{ The method is still experimental. A proper plot routine for \code{stsBP} objects is currently missing. } %\seealso{ %} \examples{ #Generate an artificial outbreak of size n starting at time t0 and being of length n <- 1e3 ; t0 <- 23 ; l <- 10 #PMF of the incubation time is an interval censored gamma distribution #with mean 15 truncated at 25. dmax <- 25 inc.pmf <- c(0,(pgamma(1:dmax,15,1.4) - pgamma(0:(dmax-1),15,1.4))/pgamma(dmax,15,1.4)) #Function to sample from the incubation time rincu <- function(n) { sample(0:dmax, size=n, replace=TRUE, prob=inc.pmf) } #Sample time of exposure and length of incubation time set.seed(123) exposureTimes <- t0 + sample(x=0:(l-1),size=n,replace=TRUE) symptomTimes <- exposureTimes + rincu(n) #Time series of exposure (truth) and symptom onset (observed) X <- table( factor(exposureTimes,levels=1:(max(symptomTimes)+dmax))) Y <- table( factor(symptomTimes,levels=1:(max(symptomTimes)+dmax))) #Convert Y to an sts object sts <- new("sts", epoch=1:length(Y),observed=matrix(Y,ncol=1)) #Plot the outbreak plot(sts,xaxis.years=FALSE,legend=NULL) #Add true number of exposures to the plot lines(1:length(Y)+0.2,X,col="red",type="h",lty=2) #Helper function to show the EM step plotIt <- function(cur.sts) { plot(cur.sts,xaxis.years=FALSE,legend=NULL,ylim=c(0,140)) } #Call non-parametric back-projection function with hook function but #without bootstrapped confidence intervals bpnp.control <- list(k=0,eps=rep(0.005,2),iter.max=rep(250,2),B=-1,hookFun=plotIt,verbose=TRUE) #Fast C version (use argument: eq3a.method="C")! system.time(sts.bp <- backprojNP(sts, incu.pmf=inc.pmf, control=modifyList(bpnp.control,list(eq3a.method="C")), ylim=c(0,max(X,Y)))) #Show result plot(sts.bp,xaxis.years=FALSE,legend=NULL,lwd=c(1,1,2),lty=c(1,1,1)) lines(1:length(Y)+0.2,X,col="red",type="h",lty=2) #Do the convolution for the expectation mu <- matrix(0,ncol=ncol(sts.bp),nrow=nrow(sts.bp)) #Loop over all series for (j in 1:ncol(sts.bp)) { #Loop over all time points for (t in 1:nrow(sts.bp)) { #Convolution, note support of inc.pmf starts at zero (move idx by 1) i <- seq_len(t) mu[t,j] <- sum(inc.pmf[t-i+1] * upperbound(sts.bp)[i,j],na.rm=TRUE) } } #Show the fit lines(1:nrow(sts.bp)-0.5,mu[,1],col="green",type="s",lwd=3) #Non-parametric back-projection including boostrap CIs. B=10 is only #used for illustration in the documentation example #In practice use a realistic value of B=1000 or more. bpnp.control2 <- modifyList(bpnp.control, list(hookFun=NULL,k=2,B=10,eq3a.method="C")) \dontrun{ bpnp.control2 <- modifyList(bpnp.control, list(hookFun=NULL,k=2,B=1000,eq3a.method="C")) } sts.bp2 <- backprojNP(sts, incu.pmf=inc.pmf, control=bpnp.control2) ###################################################################### # Plot the result. This is currently a manual routine. # ToDo: Need to specify a plot method for stsBP objects which also # shows the CI. # # Parameters: # stsBP - object of class stsBP which is to be plotted. ###################################################################### plot.stsBP <- function(stsBP) { maxy <- max(observed(stsBP),upperbound(stsBP),stsBP@ci,na.rm=TRUE) plot(upperbound(stsBP),type="n",ylim=c(0,maxy), ylab="Cases",xlab="time") if (!all(is.na(stsBP@ci))) { polygon( c(1:nrow(stsBP),rev(1:nrow(stsBP))), c(stsBP@ci[2,,1],rev(stsBP@ci[1,,1])),col="lightgray") } lines(upperbound(stsBP),type="l",lwd=2) legend(x="topright",c(expression(lambda[t])),lty=c(1),col=c(1),fill=c(NA),border=c(NA),lwd=c(2)) invisible() } #Plot the result of k=0 and add truth for comparison. No CIs available plot.stsBP(sts.bp) lines(1:length(Y),X,col=2,type="h") #Same for k=2 plot.stsBP(sts.bp2) lines(1:length(Y),X,col=2,type="h") } \keyword{models} \keyword{optimize} surveillance/man/addSeason2formula.Rd0000644000176000001440000000521512100215213017377 0ustar ripleyusers\encoding{latin1} \name{addSeason2formula} \alias{addSeason2formula} \title{ Function that adds a sine-/cosine formula to an existing formula. } \description{ This function helps to construct a \code{\link{formula}} object that can be used in a call to \code{\link{hhh4}} to model seasonal variation via a sum of sine and cosine terms. } \usage{ addSeason2formula(f = ~1, S = 1, period = 52, timevar = "t") } \arguments{ \item{f}{ formula that the seasonal terms should be added to, defaults to an intercept \code{~1}. } \item{S}{ number of sine and cosine terms. If \code{S} is a vector, unit-specific seasonal terms are created. } \item{period}{ period of the season, defaults to 52 for weekly data. } \item{timevar}{ the time variable in the model. Defaults to \code{"t"}. } } \details{ The function adds the seasonal terms \deqn{ \sum_{s=1}^\code{S} \gamma_s \sin(\frac{2\pi s}{\code{period}} t) +\delta_s \cos(\frac{2\pi s}{\code{period}} t), }{ sum_s gamma_s * sin(2*pi*s/period * t) + delta_s * cos(2*pi*s/period * t), } where \eqn{\gamma_s}{gamma_s} and \eqn{\delta_s}{delta_s} are the unknown parameters and \eqn{t}, \eqn{t = 1, 2, \ldots} denotes the time variable \code{timevar}, to an existing formula \code{f}. Note that the seasonal terms can also be expressed as \deqn{\gamma_{s} \sin(\frac{2\pi s}{\code{period}} t) + \delta_{s} \cos(\frac{2\pi s}{\code{period}} t) = A_s \sin(\frac{2\pi s}{\code{period}} t + \epsilon_s)}{% \gamma_s sin(2*pi*s/period * t) + \delta_s cos2*pi*s/period * t) = A_s sin(2*pi*s/period * t + \epsilon_s)} with amplitude \eqn{A_s=\sqrt{\gamma_s^2 +\delta_s^2}}{A_s=sqrt{\gamma_s^2 +\delta_s^2}} and phase difference \eqn{\tan(\epsilon_s) = \delta_s / \gamma_s}. % The amplitude and phase shift can be obtained from model fitted with % \code{\link{hhh4}} by specifying \code{amplitudeShift = TRUE} % in the respective \code{coef} method. } \value{ Returns a \code{\link{formula}} object with the seasonal terms. Note that to use the resulting formula in \code{\link{hhh4}}, a time variable named as specified by the argument \code{timevar} must be available. } \author{ M. Paul, with contributions by S. Meyer } \seealso{ \code{\link{hhh4}}, \code{\link{fe}}, \code{\link{ri}} } \examples{ # add 2 sine/cosine terms to a model with intercept and linear trend addSeason2formula(f = ~ 1 + t, S = 2) # the same for monthly data addSeason2formula(f = ~ 1 + t, S = 2, period = 12) # different number of seasons for a bivariate time series addSeason2formula(f = ~ 1, S = c(3, 1), period = 52) } surveillance/man/twinSIR_methods.Rd0000644000176000001440000001537612013210617017127 0ustar ripleyusers\encoding{latin1} \name{twinSIR_methods} \alias{print.twinSIR} \alias{summary.twinSIR} \alias{AIC.twinSIR} \alias{extractAIC.twinSIR} \alias{vcov.twinSIR} \alias{logLik.twinSIR} \alias{print.summary.twinSIR} \title{ Print, Summary and Extraction Methods for \code{"twinSIR"} Objects } \description{ Besides \code{print} and \code{summary} methods there are also some standard extraction methods defined for objects of class \code{"twinSIR"}: \code{vcov}, \code{logLik} and especially \code{AIC} and \code{extractAIC}, which extract Akaike's Information Criterion. Note that special care is needed, when fitting models with parameter constraints such as the epidemic effects \eqn{\alpha} in \code{twinSIR} models. Parameter constraints reduce the average increase in the maximized loglikelihood - thus the penalty for constrained parameters should be smaller than the factor 2 used in the ordinary definition of AIC. To this end, these two methods offer the calculation of the so-called one-sided AIC (OSAIC). } \usage{ \method{print}{twinSIR}(x, digits = max(3, getOption("digits") - 3), ...) \method{summary}{twinSIR}(object, correlation = FALSE, symbolic.cor = FALSE, ...) \method{AIC}{twinSIR}(object, ..., k = 2, one.sided = NULL, nsim = 1e3) \method{extractAIC}{twinSIR}(fit, scale = 0, k = 2, one.sided = NULL, nsim = 1e3, ...) \method{vcov}{twinSIR}(object, ...) \method{logLik}{twinSIR}(object, ...) \method{print}{summary.twinSIR}(x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) } \arguments{ \item{x, object, fit}{an object of class \code{"twinSIR"}.\cr For the \code{print} method of the \code{summary} method, an object of class \code{"summary.twinSIR"}.} \item{digits}{ integer, used for number formatting with \code{signif()}. Minimum number of significant digits to be printed in values. } \item{correlation}{ logical. if \code{TRUE}, the correlation matrix of the estimated parameters is returned and printed. } \item{symbolic.cor}{ logical. If \code{TRUE}, print the correlations in a symbolic form (see \code{symnum}) rather than as numbers. } \item{\dots}{ For the \code{summary} method: arguments passed to \code{\link{extractAIC.twinSIR}}.\cr For the \code{AIC} method, optionally more fitted model objects.\cr For the \code{print}, \code{extractAIC}, \code{vcov} and \code{logLik} methods: unused (argument of the generic). } \item{k}{ numeric specifying the "weight" of the \emph{penalty} to be used; in an unconstrained fit \code{k = 2} is the classical AIC. } \item{one.sided}{ logical or \code{NULL} (the default). Determines if the one-sided AIC should be calculated instead of using the classical penalty \code{k*edf}. The default value \code{NULL} chooses classical AIC in the case of an unconstrained fit and one-sided AIC in the case of constraints. The type of the fit can be seen in \code{object$method} (or \code{fit$method} respectively), where \code{"L-BFGS"} means constrained optimization. } \item{nsim}{ number of simulations to use for determining the weights in the OSAIC formula when there are more than two epidemic covariates in the fit. Defaults to 1000 samples. } \item{scale}{unused (argument of the generic).} \item{signif.stars}{logical. If \code{TRUE}, \dQuote{significance stars} are printed for each coefficient.} } \details{ The \code{print} and \code{summary} methods allow the compact or comprehensive representation of the fitting results, respectively. The former only prints the original function call, the estimated coefficients and the maximum log-likelihood value. The latter prints the whole coefficient matrix with standard errors, z- and p-values (see \code{\link{printCoefmat}}), and additionally the number of infections per log-baseline \code{interval}, the (one-sided) AIC and the number of log-likelihood evaluations. They both append a big \dQuote{WARNING}, if the optimization algorithm did not converge. The estimated coefficients may be extracted by using the default \code{coef}-method from package \pkg{stats}. The two AIC functions differ only in that \code{AIC} can take more than one fitted model object and that \code{extractAIC} always returns the number of parameters in the model (\code{AIC} only does with more than one fitted model object). Concerning the choice of one-sided AIC: parameter constraints -- such as the non-negative constraints for the epidemic effects alpha in \code{twinSIR} models -- reduce the average increase in the maximized loglikelihood. Thus, the penalty for constrained parameters should be smaller than the factor 2 used in the ordinary definition of AIC. One-sided AIC (OSAIC) suggested by Hughes and King (2003) is such a proposal when \eqn{p} out of \eqn{k = p + q} parameters have non-negative constraints: \deqn{OSAIC = -2 l(\theta, \tau) + 2 \sum_{g=0}^p w(p,g) (k-p+g)}{% OSAIC = -2 l(theta, tau) + 2 sum_{g=0}^p w(p,g) (k-p+g)} where \eqn{w(p,g)} are \eqn{p}-specific weights. For more details see Section 5.2 in \enc{Hhle}{Hoehle} (2009). } \value{ The \code{print} methods return their first argument, invisibly, as they always should. The \code{vcov} and \code{logLik} methods return the estimated variance-covariance matrix of the parameters (here, the inverse of the estimate of the expected Fisher information matrix), and the maximum log-likelihood value of the model, respectively. The \code{summary} method returns a list containing some summary statistics of the fitted model, which is nicely printed by the corresponding \code{print} method. For the \code{\link{AIC}} and \code{\link{extractAIC}} methods, see the documentation of the corresponding generic functions. } \references{ Hughes A, King M (2003) Model selection using AIC in the presence of one-sided information. \emph{Journal of Statistical Planning and Inference} \strong{115}, pp. 397--411. \enc{Hhle}{Hoehle}, M. (2009), Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics, Biometrical Journal, 51(6):961-978. } \author{ Michael \enc{Hhle}{Hoehle} and Sebastian Meyer } \examples{ data("foofit") foofit coef(foofit) vcov(foofit) logLik(foofit) summary(foofit, correlation = TRUE, symbolic.cor = TRUE) # AIC or OSAIC AIC(foofit) AIC(foofit, one.sided = FALSE) extractAIC(foofit) extractAIC(foofit, one.sided = FALSE) # with BIC-like penalty weight AIC(foofit, k = log(nlevels(foofit$model$survs$id))) # just as a stupid example for the use of AIC with multiple fits foofit2 <- foofit AIC(foofit, foofit2) # 2nd column should actually be named "OSAIC" here } \keyword{methods} \keyword{print} \keyword{htest} surveillance/man/algo.hhh.grid.Rd0000644000176000001440000001366411770111463016467 0ustar ripleyusers\name{algo.hhh.grid} \alias{algo.hhh.grid} \alias{print.ahg} \alias{coef.ahg} \encoding{latin1} \title{Function to try multiple starting values} \description{ Tries multiple starting values in \code{algo.hhh}. Starting values are provided in a matrix with \code{gridSize} rows, the grid search is conducted until either all starting values are used or a time limit \code{maxTime} is exceeded. The result with the highest likelihood is returned. } \usage{ algo.hhh.grid(disProgObj, control=list(lambda=TRUE, neighbours=FALSE, linear=FALSE, nseason=0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"),lag.range=NULL), thetastartMatrix, maxTime=1800, verbose=FALSE) } \arguments{ \item{disProgObj}{object of class \code{disProg}} \item{control}{control object: \describe{ \item{\code{lambda}}{If \code{TRUE} an autoregressive parameter \eqn{\lambda} is included, if \code{lambda} is a vector of logicals, unit-specific parameters \eqn{\lambda_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{lambda} as a vector of integers, see Examples and \code{\link{algo.hhh}} for details.} \item{\code{neighbours}}{If \code{TRUE} an autoregressive parameter for adjacent units \eqn{\phi} is included, if \code{neighbours} is a vector of logicals, unit-specific parameters \eqn{\phi_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{neighbours} as a vector of integers.} \item{\code{linear}}{a \code{logical} (or a vector of logicals) indicating wether a linear trend \eqn{\beta} (or a linear trend \eqn{\beta_i} for each unit) is included} \item{\code{nseason}}{integer number of Fourier frequencies; if \code{nseason} is a vector of integers, each unit \eqn{i} gets its own seasonal parameters } \item{\code{negbin}}{if \code{"single"} negative binomial rather than poisson is used, if \code{"multiple"} unit-specific overdispersion parameters are used.} \item{\code{proportion}}{see details in \code{\link{algo.hhh}} } \item{\code{lag.range}}{determines which observations are used to fit the model} }} \item{thetastartMatrix}{matrix with initial values for all parameters specified in the control object as rows.} \item{verbose}{if \code{true} progress information is printed} \item{maxTime}{maximum of time (in seconds) to elapse until algorithm stopps.} } \value{Returns an object of class \code{ahg} with elements \item{best}{result of a call to \code{algo.hhh} with highest likelihood } \item{allLoglik}{values of loglikelihood for all starting values used} \item{gridSize}{number of different starting values in thetastartMatrix} \item{gridUsed}{number of used starting values} \item{time}{elapsed time} \item{convergence}{if \code{false} \code{algo.hhh} did not converge for all (used) starting values} } \seealso{\code{\link{algo.hhh}}, \code{\link{create.grid}} } \author{M. Paul, L. Held} \examples{ \dontrun{ ## monthly counts of menigococcal infections in France data(meningo.age) # specify model for algo.hhh.grid model1 <- list(lambda=TRUE) # create grid of inital values grid1 <- create.grid(meningo.age, model1, params = list(epidemic=c(0.1,0.9,5))) # try multiple starting values, print progress information algo.hhh.grid(meningo.age, control=model1, thetastartMatrix=grid1, verbose=TRUE) # specify model model2 <- list(lambda=TRUE, neighbours=TRUE, negbin="single", nseason=1) grid2 <- create.grid(meningo.age, model2, params = list(epidemic=c(0.1,0.9,3), endemic=c(-0.5,0.5,3), negbin = c(0.3, 12, 10))) # run algo.hhh.grid, search time is limited to 30 sec algo.hhh.grid(meningo.age, control=model2, thetastartMatrix=grid2, maxTime=30) ## weekly counts of influenza and meningococcal infections in Germany, 2001-2006 data(influMen) # specify model with two autoregressive parameters lambda_i, overdispersion # parameters psi_i, an autoregressive parameter phi for meningococcal infections # (i.e. nu_flu,t = lambda_flu * y_flu,t-1 # and nu_men,t = lambda_men * y_men,t-1 + phi_men*y_flu,t-1 ) # and S=(3,1) Fourier frequencies model <- list(lambda=c(TRUE,TRUE), neighbours=c(FALSE,TRUE), linear=FALSE, nseason=c(3,1),negbin="multiple") # create grid of initial values grid <- create.grid(influMen,model, list(epidemic=c(.1,.9,3), endemic=c(-.5,.5,3), negbin=c(.3,15,10))) # run algo.hhh.grid, search time is limited to 30 sec algo.hhh.grid(influMen, control=model, thetastartMatrix=grid, maxTime=30) # now meningococcal infections in the same week should enter as covariates # (i.e. nu_flu,t = lambda_flu * y_flu,t-1 # and nu_men,t = lambda_men * y_men,t-1 + phi_men*y_flu,t ) model2 <- list(lambda=c(1,1), neighbours=c(NA,0), linear=FALSE,nseason=c(3,1),negbin="multiple") algo.hhh.grid(influMen, control=model2, thetastartMatrix=grid, maxTime=30) } } \keyword{ts} \keyword{regression} \references{ Held, L., \enc{Hhle}{Hoehle}, M., Hofmann, M. (2005) A statistical framework for the analysis of multivariate infectious disease surveillance counts, Statistical Modelling, \bold{5}, 187--199. Paul, M., Held, L. and Toschke, A. M. (2008) Multivariate modelling of infectious disease surveillance data, Statistics in Medicine, \bold{27}, 6250--6267. } % create.grid surveillance/man/estimateGLRNbHook.Rd0000644000176000001440000000337511746213150017331 0ustar ripleyusers\name{estimateGLRNbHook} \alias{estimateGLRNbHook} \encoding{latin1} \title{Hook function for in-control mean estimation} \description{ Allows the user to specify his own estimation routine for the in-control mean of \code{algo.glrpois} Needs to work for GLRNbHook } \usage{ estimateGLRNbHook() } %\arguments{ %} \value{ A list \item{\code{mod}}{resulting model of a call of \code{glm.nb}} \item{\code{range}}{vector of length as \code{range} containing the predicted values} } % \details{ This hook function allows the user to customize the behaviour of the algorithm. } \seealso{ \code{\link{algo.glrnb}} and \code{\link{algo.glrpois}} } \author{M. Hoehle} \examples{ \dontrun{ estimateGLRNbHook <- function() { #Fetch control object from parent control <- parent.frame()$control #The period p <- parent.frame()$disProgObj$freq #Current range to perform surveillance on range <- parent.frame()$range #Define training & test data set (the rest) train <- 1:(range[1]-1) test <- range #Perform an estimation based on all observations before timePoint #Event better - don't do this at all in the algorithm - force #user to do it himself - coz its a model selection problem data <- data.frame(y=parent.frame()$disProgObj$observed[t],t=train) #Build the model equation formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } #Fit the GLM m <- eval(substitute(glm.nb(form,data=data), list(form=as.formula(formula)))) #Predict mu_{0,t} return(as.numeric(predict(m,newdata=data.frame(t=range),type="response"))) } } } \keyword{regression} %\source{} surveillance/man/arlCusum.Rd0000644000176000001440000000354311731650466015651 0ustar ripleyusers\name{arlCusum} \alias{arlCusum} \title{Calculation of Average Run Length for discrete CUSUM schemes} \description{ Calculates the average run length (ARL) for an upward CUSUM scheme for discrete distributions (i.e. Poisson and binomial) using the Markov chain approach. } \usage{ arlCusum(h=10, k=3, theta=2.4, distr=c("poisson","binomial"), W=NULL, digits=1, ...) } \arguments{ \item{h}{ decision interval} \item{k}{ reference value} \item{theta}{distribution parameter for the cumulative distribution function (cdf) \eqn{F}, i.e. rate \eqn{\lambda} for Poisson variates or probability \eqn{p} for binomial variates} \item{distr}{ \code{"poisson"} or \code{"binomial"} } %ppois, pbinom \item{W}{Winsorizing value \code{W} for a robust CUSUM, to get a nonrobust CUSUM set %\code{W} is set to \code{W} > \code{k}+\code{h}. If \code{NULL}, a nonrobust CUSUM is used.} \item{digits}{ \code{k} and \code{h} are rounded to \code{digits} decimal places } \item{\dots}{ further arguments for the distribution function, i.e. number of trials \code{n} for binomial cdf } } \value{ Returns a list with the ARL of the regular (zero-start) and the fast initial response (FIR) CUSUM scheme with reference value \code{k}, decision interval \code{h} for \eqn{X \sim F(\theta)}, where F is the Poisson or binomial cdf \item{ARL}{one-sided ARL of the regular (zero-start) CUSUM scheme} \item{FIR.ARL}{one-sided ARL of the FIR CUSUM scheme with head start \eqn{\frac{\code{h}}{2}} } } \keyword{models} \source{Based on the FORTRAN code of Hawkins, D. M. (1992). Evaluation of Average Run Lengths of Cumulative Sum Charts for an Arbitrary Data Distribution. Communications in Statistics - Simulation and Computation, 21(4), p. 1001-1020. } surveillance/man/imdepi.Rd0000644000176000001440000001760712207660446015331 0ustar ripleyusers\encoding{latin1} \docType{data} \name{imdepi} \alias{imdepi} \alias{imdepifit} \title{ Occurrence of Invasive Meningococcal Disease in Germany } \description{ \code{imdepi} contains data on the spatio-temporal location of 636 cases of invasive meningococcal disease caused by two specific meningococcal finetypes in Germany. \code{imdepifit} contains a model fit to the \code{imdepi} data. } \usage{ data(imdepi) data(imdepifit) } \format{ \code{imdepi} is an object of class \code{"\link{epidataCS}"} (a list with components \code{events}, \code{stgrid}, \code{W} and \code{qmatrix}). \code{imdepifit} is an object of class \code{"\link{twinstim}"}, see \code{\link{summary.twinstim}} for some simple methods for fitted \code{"twinstim"} models. } \details{ The dataset contains a slightly modified version of the data analyzed in Meyer et al. (2012) represented as an \code{"epidataCS"} object, which is a list with components \code{events}, \code{stgrid}, \code{W}, and \code{qmatrix}. The \code{events} entry is a \code{"\linkS4class{SpatialPointsDataFrame}"} object (ETSR89 projection, i.e. EPSG code 3035, with unit \sQuote{km}) containing 636 events, each with the following entries: \describe{ \item{ID:}{Unique identifier of the case.} \item{time:}{Time of the case occurrence measured in number of days since origin.} \item{tile:}{Tile ID in the spatio-temporal grid (\code{stgrid}) of endemic covariates, where the event is contained in. This corresponds to one of the 413 districts of Germany. } \item{type:}{Event type, a factor with levels \code{"B"} and \code{"C"}.} \item{eps.t:}{Maximum temporal interaction range for the event. Here set to 30 days.} \item{eps.s:}{Maximum spatial interaction range for the event. Here set to 200 km.} \item{sex:}{Sex of the case, i.e. a factor with levels \code{"male"} and \code{"female"}.} \item{agegrp:}{Factor giving the age group of the case, i.e. 0-2, 3-18 or >=19. Note: for a small number of cases this information is not available (\code{NA}).} \item{BLOCK, start:}{Block ID and start time (in days since origin) of the cell in the spatio-temporal endemic covariate grid, which the event belongs to.} \item{popdensity:}{Population density at the location of the event (corresponds to population density of the district where the event is located).} } There are further auxiliary columns attached to the events' data the names of which begin with a . (dot): These are created during conversion to the \code{"epidataCS"} class and are necessary for fitting the data with \code{twinstim}, see the description of the \code{"\link{epidataCS}"}-class. With \code{coordinates(imdepi$events)} one obtains the (x,y) locations of the events. The identifier in \code{tile} is indexed according to the German official municipality key ( \dQuote{Amtlicher Gemeindeschl\enc{}{ue}ssel}). See \url{http://de.wikipedia.org/wiki/Amtlicher_Gemeindeschl\%C3\%BCssel} for details. The data component \code{stgrid} contains the spatio-temporal grid of endemic covariate information. In addition to the usual bookkeeping variables this includes: \describe{ \item{area:}{Area of the district \code{tile} in square kilometers.} \item{popdensity:}{Population density (inhabitants per square kilometer) computed from DESTATIS (Federal Statistical Office) information (Date: 31.12.2008) on communities level (LAU2) aggregated to district level (NUTS3).} } We have actually not included any time-dependent covariates here, we just established this grid with a (reduced -> fast) temporal resolution of monthly intervals so that we can model endemic time trends and seasonality (in this discretized time). The entry \code{W} contains the observation window as a \code{\link{SpatialPolygons}} object. In this case the boundaries of Germany (simplified polygon to enhance speed). %% The original shape file was downloaded from %% \url{http://www.geodatenzentrum.de/geodaten/gdz_rahmen.gdz_div?gdz_spr=eng&gdz_akt_zeile=5&gdz_anz_zeile=5&gdz_user_id=0} %% as of 2009-01-01, which has copyright by Bundesamt fr Kartographie %% und Geodsie, Frankfurt am Main: %% "Copy, distribution and making available to the public - also in %% parts - is allowed with reference." %% This shapefile was then simplified using \code{simplify.owin()} from %% package \pkg{spatstat} with parameter \code{dmin = 10}. The entry \code{qmatrix} is a \eqn{2\times 2}{2 x 2} identity matrix indicating that no transmission between the two finetypes can occur. } \source{ German Reference Centre for Meningococci (NRZM) -- hosted by the Department of Hygiene and Microbiology, Julius-Maximilians-Universit\enc{}{ae}t W\enc{}{ue}rzburg, Germany.\cr Thanks to Dr. Johannes Elias and Prof. Dr. Ulrich Vogel from the NRZM for providing the IMD event data. See \url{http://www.meningococcus.de/} and \url{http://episcangis.hygiene.uni-wuerzburg.de/} for further details about the IMD event data. } \references{ Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} Meyer, S. (2010): Spatio-Temporal Infectious Disease Epidemiology based on Point Processes. Master's Thesis, Ludwig-Maximilians-Universit\enc{}{ae}t M\enc{}{ue}nchen.\cr Available as \url{http://epub.ub.uni-muenchen.de/11703/} } \seealso{ the data class \code{"\link{epidataCS}"}, and function \code{\link{twinstim}} for model fitting. } \examples{ data("imdepi") # Basic information print(imdepi, n=5, digits=2) # What is an epidataCS-object? str(imdepi, max.level=4) names(imdepi$events@data) # => events data.frame has hidden columns sapply(imdepi$events@data, class) # marks and print methods ignore these auxiliary columns # look at the B type only imdepiB <- subset(imdepi, type == "B") #<- subsetting applies to the 'events' component imdepiB # select only the last 10 events tail(imdepi, n=10) # there is also a corresponding 'head' method # Access event marks str(marks(imdepi)) # there is an update-method which assures that the object remains valid # when changing parameters like eps.s, eps.t or qmatrix update(imdepi, eps.t = 20) # Summary s <- summary(imdepi) s str(s) # Step function of number of infectives plot(s$counter, xlab = "Time [days]", ylab = "Number of infectious individuals", main = "Time series of IMD assuming 30 days infectious period") # distribution of number of potential sources of infection opar <- par(mfrow=c(1,2), las=1) for (type in c("B","C")) { plot(100*prop.table(table(s$nSources[s$eventTypes==type])), xlim=range(s$nSources), xlab = "Number of potential epidemic sources", ylab = "Proportion of events [\%]") } par(opar) # a histogram of the number of events along time (using the # plot-method for the epidataCS-class, see ?plot.epidataCS) opar <- par(mfrow = c(2,1)) plot(imdepi, aggregate = "time", subset = type == "B", main = "Finetype B") plot(imdepi, aggregate = "time", subset = type == "C", main = "Finetype C") par(opar) # Plot the spatial distribution of the events in W plot(imdepi$W) colTypes <- c("darkblue","indianred2") pch <- c(3,4) with(imdepi, { plot(events,pch=pch[events$type],col=colTypes[events$type],add=TRUE) legend(x="topleft",levels(events$type),col=colTypes, pch=pch,title="Finetype") }) # somehow easier: use the plot-method for the epidataCS class plot(imdepi, aggregate="space", axes=TRUE, colTypes=colTypes) title(xlab = "x [km]", ylab = "y [km]") \dontrun{ # Show a dynamic illustration of the spatio-temporal dynamics of the # spread during the first year of type B with a step size of 7 days animate(imdepiB, interval=c(0,365), time.spacing=7, sleep=0.1) } } \keyword{datasets} surveillance/man/estimateGLRPoisHook.Rd0000644000176000001440000000314211731650466017705 0ustar ripleyusers\name{estimateGLRPoisHook} \alias{estimateGLRPoisHook} \encoding{latin1} \title{Hook function for in-control mean estimation} \description{ Allows the user to specify his own estimation routine for the in-control mean of \code{algo.glrpois} } \usage{ estimateGLRPoisHook() } %\arguments{ %} \value{ A vector of length as \code{range} containing the predicted values. } % \details{ This hook function allows the user to customize the behaviour of the algorithm. } \seealso{ \code{\link{algo.glrpois}} } \author{M. Hoehle} \examples{ \dontrun{ estimateGLRPoisHook <- function() { #Fetch control object from parent control <- parent.frame()$control #The period p <- parent.frame()$disProgObj$freq #Current range to perform surveillance on range <- parent.frame()$range #Define training & test data set (the rest) train <- 1:(range[1]-1) test <- range #Perform an estimation based on all observations before timePoint #Event better - don't do this at all in the algorithm - force #user to do it himself - coz its a model selection problem data <- data.frame(y=parent.frame()$disProgObj$observed[t],t=train) #Build the model equation formula <- "y ~ 1 " if (control$mu0Model$trend) { formula <- paste(formula," + t",sep="") } for (s in 1:control$mu0Model$S) { formula <- paste(formula,"+cos(2*",s,"*pi/p*t)+ sin(2*",s,"*pi/p*t)",sep="") } #Fit the GLM m <- eval(substitute(glm(form,family=poisson(),data=data),list(form=as.formula(formula)))) #Predict mu_{0,t} return(as.numeric(predict(m,newdata=data.frame(t=range),type="response"))) } } } \keyword{regression} %\source{} surveillance/man/create.disProg.Rd0000644000176000001440000000414512003774404016716 0ustar ripleyusers\name{create.disProg} \alias{create.disProg} \alias{print.disProg} \encoding{latin1} \title{Creating an object of class disProg} \description{ Creates an object of class \code{disProg} from a vector with the weeknumber (week) and matrices with the observed number of counts (observed) and the respective state chains (state), where each column represents an individual time series. The matrices neighbourhood and populationFrac provide information about neighbouring units and population proportions. } \usage{ create.disProg(week, observed, state, start=c(2001,1), freq=52, neighbourhood=NULL, populationFrac=NULL, epochAsDate=FALSE) } \arguments{ \item{week}{index in the matrix of observations, typically weeks} \item{observed}{matrix with parallel time series of counts where rows are time points and columns are the individual time series for unit/area \eqn{i, i=1,\ldots,m}} \item{state}{matrix with corresponding states} \item{start}{vector of length two denoting the year and the sample number (week, month, etc.) of the first observation} \item{freq}{sampling frequency per year, i.e. 52 for weekly data, 12 for monthly data, 13 if 52 weeks are aggregated into 4 week blocks.} \item{neighbourhood}{neighbourhood matrix \eqn{N} of dimension \eqn{m \times m} with elements \eqn{n_{ij}=1} if units \eqn{i} and \eqn{j} are adjacent and 0 otherwise } \item{populationFrac}{matrix with corresponding population proportions} \item{epochAsDate}{interpret the integers in \code{week} as Dates. Default is \code{FALSE}} } \value{\item{disProg}{object of class \code{disProg} } } \author{M. Paul} \examples{ # create an univariate disProg object # read in salmonella.agona data salmonella <- read.table(system.file("extdata/salmonella.agona.txt", package = "surveillance"), header = TRUE) # look at data.frame str(salmonella) salmonellaDisProg <- create.disProg(week = 1:nrow(salmonella), observed = salmonella$observed, state = salmonella$state, start = c(1990, 1)) # look at disProg object salmonellaDisProg } \keyword{hplot} surveillance/man/categoricalCUSUM.Rd0000644000176000001440000001663512062335727017154 0ustar ripleyusers\name{categoricalCUSUM} \alias{categoricalCUSUM} \alias{catcusum.LLRcompute} \encoding{latin1} \title{CUSUM detector for time-varying categorical time series} \description{ Function to process \code{sts} object by binomial, beta-binomial or multinomial CUSUM. Logistic, multinomial logistic, proportional odds or Bradley-Terry regression models are used to specify in-control and out-of-control parameters. } \usage{ categoricalCUSUM(stsObj,control = list(range=NULL,h=5,pi0=NULL, pi1=NULL, dfun=NULL, ret=c("cases","value")),...) } \arguments{ \item{stsObj}{Object of class \code{sts} containing the number of counts in each of the \eqn{k} categories of the response variable. Time varying number of counts \eqn{n_t} is found in slot \code{populationFrac}. } \item{control}{Control object containing several items \itemize{ \item{\code{range}}{Vector of length \eqn{t_{max}} with indices of the \code{observed} slot to monitor.} \item{\code{h}}{Threshold to use for the monitoring. Once the CUSUM statistics is larger or equal to \code{h} we have an alarm.} \item{\code{pi0}}{\eqn{(k-1) \times t_{max}} in-control probability vector for all categories except the reference category.} \item{\code{mu1}}{\eqn{(k-1) \times t_{max}} out-of-control probability vector for all categories except the reference category.} \item{\code{dfun}}{The probability mass function or density used to compute the likelihood ratios of the CUSUM. In a negative binomial CUSUM this is \code{dnbinom}, in a binomial CUSUM \code{dbinom} and in a multinomial CUSUM \code{dmultinom}. The function must be able to handle the arguments \code{y}, \code{size}, \code{mu} and \code{log}. As a consequence, one in the case of the beta-binomial distribution has to write a small wrapper function.} \item{\code{ret}}{Return the necessary proportion to sound an alarm in the slot \code{upperbound} or just the value of the CUSUM statistic. Thus, \code{ret} is one of tha values in \code{c("cases","value")}.} }} \item{\dots}{Additional arguments to send to \code{dfun}.} } \details{ The function allows the monitoring of categorical time series as described by regression models for binomial, beta-binomial or multinomial data. The later includes e.g. multinomial logistic regression models, proportional odds models or Bradley-Terry models for paired comparisons. See the \enc{Hhle}{Hoehle} (2010) reference for further details about the methodology. Once an alarm is found the CUSUM scheme is resetted (to zero) and monitoring continues from there. } \seealso{\code{\link{categoricalCUSUM}}} \value{An \code{sts} object with \code{observed}, \code{alarm}, etc. slots trimmed to the \code{control$range} indices. } \references{ Hhle, M. (2010), Changepoint detection in categorical time series, Book chapter to appear in T. Kneib and G. Tutz (Eds.), Statistical Modelling and Regression Structures, Springer. } \examples{ if (require("gamlss")) { ########################################################################### #Beta-binomial CUSUM for a small example containing the time-varying #number of positive test out of a time-varying number of total #test. ####################################### #Load meat inspection data data("abattoir") #Use GAMLSS to fit beta-bin regression model phase1 <- 1:(2*52) phase2 <- (max(phase1)+1) : nrow(abattoir) #Fit beta-binomial model using GAMLSS abattoir.df <- as.data.frame(abattoir) colnames(abattoir.df) <- c("y","t","state","alarm","n") m.bbin <- gamlss( cbind(y,n-y) ~ 1 + t + + sin(2*pi/52*t) + cos(2*pi/52*t) + + sin(4*pi/52*t) + cos(4*pi/52*t), sigma.formula=~1, family=BB(sigma.link="log"), data=abattoir.df[phase1,c("n","y","t")]) #CUSUM parameters R <- 2 #detect a doubling of the odds for a test being positive h <- 4 #threshold of the cusum #Compute in-control and out of control mean pi0 <- predict(m.bbin,newdata=abattoir.df[phase2,c("n","y","t")],type="response") pi1 <- plogis(qlogis(pi0)+log(R)) #Create matrix with in control and out of control proportions. #Categories are D=1 and D=0, where the latter is the reference category pi0m <- rbind(pi0, 1-pi0) pi1m <- rbind(pi1, 1-pi1) ###################################################################### # Use the multinomial surveillance function. To this end it is necessary # to create a new abattoir object containing counts and proportion for # each of the k=2 categories. For binomial data this appears a bit # redundant, but generalizes easier to k>2 categories. ###################################################################### abattoir2 <- new("sts",epoch=1:nrow(abattoir), start=c(2006,1),freq=52, observed=cbind(abattoir@observed,abattoir@populationFrac -abattoir@observed), populationFrac=cbind(abattoir@populationFrac,abattoir@populationFrac), state=matrix(0,nrow=nrow(abattoir),ncol=2), multinomialTS=TRUE) ###################################################################### #Function to use as dfun in the categoricalCUSUM #(just a wrapper to the dBB function). Note that from v 3.0-1 the #first argument of dBB changed its name from "y" to "x"! ###################################################################### mydBB.cusum <- function(y, mu, sigma, size, log = FALSE) { return(dBB(y[1,], mu = mu[1,], sigma = sigma, bd = size, log = log)) } #Create control object for multinom cusum and use the categoricalCUSUM #method control <- list(range=phase2,h=h,pi0=pi0m, pi1=pi1m, ret="cases", dfun=mydBB.cusum) surv <- categoricalCUSUM(abattoir2, control=control, sigma=exp(m.bbin$sigma.coef)) #Show results plot(surv[,1],legend.opts=NULL,dx.upperbound=0) lines(pi0,col="green") lines(pi1,col="red") #Index of the alarm which.max(alarms(surv[,1])) } #ToDo: Compute run length using LRCUSUM.runlength } \author{M. \enc{Hhle}{Hoehle}} \keyword{regression} % positives <- matrix(c(25,54,50,70,54,83,62,37,53,29,48,95,63,53,47,67,31,56,20,37,33,34,28,58,45,31,34,17,25,23,19,32,29,34,46,58,45,50,50,41,57,66,41,68,58,35,40,45,20,49,33,24,21,31,25,28,29,20,25,13,41,31,25,25,7,9,48,15,4,45,7,52,21,19,60,25,24,26,16,15,8,17,43,19,10,31,26,19,20,20,27,17,27,23,35,34,53,32,58,81,37,3,0,0,0,1,41,21,34,33,48,17,61,39,70,13,56,65,50,39,46,29,35,18,35,43,34,49,49,18,36,30,34,55,61,44,35,23,35,37,33,37,15,17,66,8,2,10,39,17,42,27,28,55,26,0,0,0,0,0,1,0,0,0,16,36,36,25,34,26,2),ncol=1) % n <- matrix(c(4200,4900,4700,5100,4900,5000,4700,4500,4500,4400,4300,4500,4500,4800,3000,3600,4200,4300,2900,4000,3000,4500,3300,4700,4300,4100,3100,2500,3700,3300,3700,4200,4200,4100,4000,5000,3900,3700,4600,4400,4500,5000,4100,3800,2300,3000,3700,3200,2000,2500,4000,1500,1700,3000,3000,2500,2300,3100,2600,1300,4100,1800,2600,2900,1100,1300,3700,2700,1700,2700,1100,3300,1800,3500,4100,3300,4100,2500,3000,2400,800,3300,3100,3000,3100,2500,3300,3200,2700,2700,1500,1400,2200,1600,2700,1700,4200,3900,8100,5900,4800,300,0,0,0,200,5000,5400,6100,5500,4300,4100,8000,8200,7700,2500,5200,7200,7400,5000,6500,3900,5300,4100,6600,6600,5400,6300,6100,5000,5000,4700,4900,5200,4800,4900,4900,4900,5000,5000,4900,4900,900,800,1300,200,700,1200,2300,1600,2900,2600,3600,4000,2000,0,0,0,0,0,100,0,0,100,2200,2900,3100,3200,3900,4300,1000),ncol=1) %#Create S4 object %sts <- new("sts",epoch=1:nrow(positives),start=c(2006,1),freq=52,observed=positives,state=0*positives,populationFrac=n,multinomialTS=TRUE)surveillance/man/fluBYBW.Rd0000644000176000001440000000245512165764502015330 0ustar ripleyusers\name{fluBYBW} \alias{fluBYBW} \encoding{latin1} \title{Influenza in Southern Germany} \description{Weekly number of influenza A & B cases in the 140 districts of the two Southern German states Bavaria and Baden-Wuerttemberg, for years 2001 to 2008. } \usage{data(fluBYBW)} \format{ An \code{sts} object containing \eqn{416\times 140}{416 x 140} observations starting from week 1 in 2001. The \code{population} slot contains the population fractions of each district at 31.12.2001, obtained from the Federal Statistical Office of Germany. The \code{map} slot contains an object of class \code{SpatialPolygonsDataFrame}. } \source{ Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; Queried on 6 March 2009. } \note{ Prior to \pkg{surveillance} version 1.6-0, \code{data(fluBYBW)} contained a redundant last row (417) filled with zeroes only. } \examples{ data(fluBYBW) # Plot a map of the total number of cases in the year 2001 plot(fluBYBW[year(fluBYBW) == 2001, ], type = observed ~ 1|unit, labels = FALSE) } \references{ Paul, M. and Held, L. (2011) Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts. Statistics in Medicine, \bold{30}, 1118--1136. } \keyword{datasets} surveillance/man/twinstim_plot.Rd0000644000176000001440000000260512010510267016751 0ustar ripleyusers\name{twinstim_plot} \alias{plot.twinstim} \title{ Plot methods for fitted \code{twinstim}'s } \description{ The fitted conditional intensity function from \code{\link{twinstim}} may be visualized in at least two ways: \code{\link{iafplot}} plots the fitted interaction functions (as a function of the distance from the host), and \code{\link{intensityplot.twinstim}} plots the fitted intensity either aggregated over space (evolution over time) or aggregated over time (spatial surface of the cumulated intensity). The \code{plot} method for class \code{"twinstim"} is just a wrapper for these two functions. } \usage{ \method{plot}{twinstim}(x, which, ...) } \arguments{ \item{x}{ an object of class \code{"twinstim"}. } \item{which}{ character. Which characteristic of the conditional intensity should be plotted? Possible values are the ones allowed in the functions \code{\link{iafplot}} and \code{\link{intensityplot.twinstim}}, e.g. \code{"siaf"}, or \code{"epidemic proportion"}. Partial matching is applied. } \item{\dots}{ further arguments passed to \code{iafplot} or \code{intensityplot.twinstim}. } } \value{ See the documentation of the respective plot functions, \code{\link{iafplot}} or \code{\link{intensityplot.twinstim}}. } \author{ Sebastian Meyer } \examples{ # see the examples for iafplot() and intensityplot.twinstim() } \keyword{hplot} surveillance/man/runifdisc.Rd0000644000176000001440000000165412143463162016036 0ustar ripleyusers\name{runifdisc} \alias{runifdisc} \title{ Sample Points Uniformly on a Disc } \description{ Sample \code{n} points uniformly on a disc of radius \code{r} in two-dimensional euclidean space via transformation to polar coordinates: the angle is sampled uniformly from \eqn{U(0,2\pi)}, the length is sampled uniformly from \eqn{\sqrt{U(0,r^2)}}. The sampled polar coordinates are then back-transformed to cartesian coordinates. } \usage{ runifdisc(n, r = 1) } \arguments{ \item{n}{ integer size of the sample. } \item{r}{ numeric radius of the disc (centered at (0,0)). } } \value{ A two-column coordinate matrix of the sampled points. } \author{ Sebastian Meyer } \seealso{ \code{\link[spatstat]{runifdisc}} in package \pkg{spatstat}, which is slightly more flexible and integrated within the \code{"ppp"} class. } \examples{ x <- surveillance:::runifdisc(1000, 3) plot(x) } \keyword{datagen} \keyword{distribution} surveillance/man/twinSIR_exData.Rd0000644000176000001440000000202312041530043016652 0ustar ripleyusers\encoding{latin1} \name{twinSIR_exData} \alias{foodata} \alias{fooepidata} \alias{foofit} %\alias{bw} \docType{data} \title{ Artificial data and data from the German Federal State Baden-Wuerttemberg } \description{ This is data, which is used in \code{twinSIR} examples or the package vignette. \code{fooepidata} is an object of class \code{"\link{epidata}"} simulated from artificial \code{foodata}. \code{foofit} is an object of class \code{"\link{twinSIR}"} and is the result of a fit of \code{fooepidata}. % The data set \code{bw} contains some information on the counties of % Baden-\enc{Wrttemberg}{Wuerttemberg} for the years 2002--2006: % latitude and longitude of the county's centroid, population, area, % annual number of infections with tick-borne encephalitis (where the county of % infection is known), as well as some yearly aggregated weather information % (temperature, precipitation, sunshine). } \examples{ data(foodata) data(fooepidata) data(foofit) } \keyword{datasets} \keyword{internal} surveillance/man/plot.survRes.Rd0000644000176000001440000000776211731650466016513 0ustar ripleyusers\name{plot.survRes} \alias{plot.survRes} \alias{plot.survRes.one} \encoding{latin1} \title{Plot a survRes object} \description{Plotting of a (multivariate) \code{survRes} object. The function \code{plot.survRes.one} is used as a helper function to plot a univariate time series. } \usage{ \method{plot}{survRes}(x, method=x$control$name, disease=x$control$data, xaxis.years=TRUE,startyear = 2001, firstweek = 1, same.scale=TRUE,\dots) \method{plot}{survRes.one}(x, method=x$control$name, disease=x$control$data, domany=FALSE,ylim=NULL,xaxis.years=TRUE,startyear = 2001, firstweek = 1, xlab="time", ylab="No. infected", main=NULL, type="hhs", lty=c(1,1,2),col=c(1,1,4), outbreak.symbol = list(pch=3,col=3),alarm.symbol=list(pch=24,col=2), legend.opts=list(x="top", legend=c("Infected", "Upperbound", "Alarm", "Outbreak"), lty=NULL,col=NULL,pch=NULL), ...) } \arguments{ \item{x}{object of class \code{survRes}} \item{method}{surveillance method to be used in title} \item{disease}{name of disease in title} \item{xaxis.years}{Boolean indicating whether to show a year based x-axis for weekly data} \item{domany}{Boolean telling the function whether it is called for a multivariate (\code{TRUE}) or univariate (\code{FALSE}) \code{survRes} object. In case of \code{TRUE} no titles are drawn.} \item{ylim}{range of y axis} \item{startyear}{year to begin the axis labeling (the year where the oldest data come from)} \item{firstweek}{number of the first week of January in the first year (just for axis labeling reasons)} \item{xlab}{label of the x-axis} \item{ylab}{label of the y-axis} \item{main}{the title of the graphics is generated from the \code{method} and \code{disease} arguments if not specified otherwise} \item{same.scale}{plot all time series with the same \code{ylim}? Defaults to \code{true}}. \item{type}{line type of the observed counts (first two elements) and the upper bound (third element)} \item{lty}{vector of size 3 speciying the line type of the observed counts (left, right) and the upperbound line} \item{col}{vector with three elements: color of left bar and color of top bar, color of right bar, col of the upperbound line.} \item{outbreak.symbol}{list with entries \code{pch} and \code{col} specifying the plot symbol} \item{alarm.symbol}{list with entries \code{pch} and \code{col} specifying the plot symbol} \item{legend.opts}{a list containing the entries to be sent to the \code{\link{legend}} function. If no legend is requested use \code{legend.opts=NULL}. Otherwise, the following arguments are default \describe{ \item{\code{x}}{\code{top}} \item{\code{legend}}{The names infected and outbreak.} \item{\code{lty}}{If \code{NULL} the \code{lty} argument will be used} \item{\code{pch}}{If \code{NULL} the \code{pch} argument is used} \item{\code{col}}{If \code{NULL} the \code{col} argument is used} } Any further arguments to the \code{legend} function are just provided as additional elements of this list, e.g. \code{horiz=TRUE}. } \item{...}{further arguments for the function \code{matplot}. If e.g. \code{xlab} or \code{main} are provided they overwrite the default values.} } \value{ none. A plot showing the number of infected, the threshold for recognizing an outbreak, the alarm status and the outbreak status is generated. } \details{ The \code{plot.survRes.one} is intended for internal use. At the moment none of the surveillance methods support multivariate \code{survRes} objects. New versions of the packages currently under development will handle this. } \author{M. \enc{Hhle}{Hoehle}} \examples{ data(ha) ctrl <- list(range = 209:290, b = 2, w = 6, alpha = 0.005) plot(algo.bayes(aggregate(ha), control = ctrl)) } \keyword{hplot} % magic.dim surveillance/man/twinSIR_simulation.Rd0000644000176000001440000003777012061366125017663 0ustar ripleyusers\encoding{latin1} \name{twinSIR_simulation} \alias{simEpidata} \alias{simulate.twinSIR} \title{ Simulation of Epidemic Data } \description{ This function simulates the infection (and removal) times of an epidemic. Besides the classical SIR type of epidemic, also SI, SIRS and SIS epidemics are supported. Simulation works via the conditional intensity of infection of an individual, given some (time varying) endemic covariates and/or some distance functions (epidemic components) as well as the fixed positions of the individuals. The lengths of the infectious and removed periods are generated following a pre-specified function (can be deterministic). The \code{\link{simulate}} method for objects of class \code{"\link{twinSIR}"} simulates new epidemic data using the model and the parameter estimates of the fitted object. } \usage{ simEpidata(formula, data, id.col, I0.col, coords.cols, subset, beta, h0, f = list(), alpha, infPeriod, remPeriod = function(ids) rep(Inf, length(ids)), end = Inf, trace = FALSE, .allocate = NULL) \method{simulate}{twinSIR}(object, nsim = 1, seed = 1, infPeriod = NULL, remPeriod = NULL, end = diff(range(object$intervals)), trace = FALSE, .allocate = NULL, data = object$data, ...) } \arguments{ \item{formula}{ an object of class \code{"\link{formula}"} (or one that can be coerced to that class): a symbolic description of the intensity model to be estimated. The details of model specification are given under Details. } \item{data}{ a data.frame containing the variables in \code{formula} and the variables specified by \code{id.col}, \code{I0.col} and \code{coords.col} (see below). It represents the \dQuote{history} of the endemic covariates to use for the simulation. The form is similar to and can be an object of class \code{"\link{epidata}"}. The simulation period is splitted up into \emph{consecutive} intervals of constant endemic covariables. The data-frame consists of a block of N (number of individuals) rows for each of those time intervals (all rows in a block share the same start and stop values... therefore the name \dQuote{block}), where there is one row per individual in the block. Each row describes the (fixed) state of the endemic covariates of the individual during the time interval given by the start and stop columns (specified through the lhs of \code{formula}). For the \code{simulate} method of class \code{"twinSIR"} this should be the object of class \code{"\link{epidata}"} used for the fit. This is a part of the return value of the function \code{twinSIR}, if called with argument \code{keep.data} set to \code{TRUE}. } \item{id.col}{ only if \code{data} does not inherit from \code{epidata}: single index of the \code{id} column in \code{data}. Can be numeric (by column number) or character (by column name).\cr The \code{id} column identifies the individuals in the data-frame. It will be converted to a factor variable and its levels serve also to identify individuals as argument to the \code{infPeriod} function. } \item{I0.col}{ only if \code{data} does not inherit from \code{epidata}: single index of the \code{I0} column in \code{data}. Can be numeric (by column number), character (by column name) or \code{NULL}.\cr The \code{I0} column indicates if an individual is initially infectious, i.e. it is already infectious at the beginning of the first time block. Setting \code{I0.col = NULL} is short for \dQuote{there are no initially infectious individuals}. Otherwise, the variable must be logical or in 0/1-coding. As this variable is constant over time the initially infectious individuals are derived from the first time block only. } \item{coords.cols}{ only if \code{data} does not inherit from \code{epidata}: index\emph{es} of the \code{coords} column\emph{s} in \code{data}. Can be a numeric (by column number), a character (by column name) vector or \code{NULL}.\cr These columns contain the coordinates of the individuals. It must be emphasized that the functions in this package currently assume \emph{fixed positions} of the individuals during the whole epidemic. Thus, an individual has the same coordinates in every block. For simplicity, the coordinates are derived from the first time block only. The epidemic covariates are calculated based on the euclidian distance between the individuals, see \code{f}. } \item{subset}{ an optional vector specifying a subset of the covariate history to be used in the simulation. } \item{beta}{ numeric vector of length equal the number of endemic (\code{cox}) terms on the rhs of \code{formula}. It contains the effects of the endemic predictor (excluding the log-baseline \code{h0}, see below) in the same order as in the formula. } \item{h0}{ \emph{either} a single number to specify a constant baseline hazard (equal to \code{exp(h0)}) \emph{or} a list of functions named \code{exact} and \code{upper}. In the latter case, \code{h0$exact} is the true log-baseline hazard function and \code{h0$upper} is a \emph{piecewise constant upper bound} for \code{h0$exact}. The function \code{h0$upper} must inherit from \code{\link{stepfun}} with \code{right=FALSE}. Theoretically, the intensity function is left-continuous, thus \code{right=TRUE} would be adequate, but in the implementation, when we evaluate the intensity at the \code{\link{knots}} (change points) of \code{h0$upper} we need its value for the subsequent interval. } \item{f}{ a \emph{named} list of distance functions or \code{list()} (the default), if no epidemic component is desired (if additionally \code{infPeriod} (see below) always returns \code{Inf}, then one simulates from the Cox model). The functions must interact elementwise on a (distance) matrix so that - for a matrix D - f[[m]](D) results in a matrix. A simple example is \code{function(u) {u <= 1}}, which indicates if the euclidian distance between the individuals is smaller than or equal to 1. To ensure that an individual does not influence itself, the distance to itself is defined as \code{Inf}. Consequently, all of the distance functions must have the property f[[m]](Inf) = 0. The names of the functions will be the names of the epidemic variables in the resulting data-frame. So, the names should not coincident with names of endemic variables. The value of such an % The functions must be vectorized so that - for a vector of % distances \code{u} - \code{f[[m]](u)} returns a vector of the same length % as \code{u}, where the distance function \code{f[[m]]} was applied on each % distance separately. A simple example for a distance function is % \code{function(u) {u <= 1}}, which indicates if the distance between the % individuals is smaller than or equal to 1. The names of the functions will % be the names of the epidemic variables in the resulting data frame. Thus, % the names should not coincident with the names of the variables in the % \code{formula}. The value of such an epidemic variable is computed as follows: \eqn{I(t)} denotes the set of infectious individuals just before time \eqn{t} and \eqn{s_i} the coordinate vector of individual \eqn{i}. For individual \eqn{i} at time \eqn{t} the epidemic component \eqn{m} has the value \eqn{\sum_{j \in I(t)} f_m(||s_i - s_j||)}{% \sum_{j in I(t)} f[[m]](||s_i - s_j||)} } \item{alpha}{ numeric vector of length equal the number of epidemic terms, i.e. the number of distance functions in \code{f}. It contains the effects of the epidemic predictor in the same order as the distance functions in \code{f} or, if names are supplied, matching to the distance functions will be done by name. } \item{infPeriod}{ a function generating lengths of infectious periods. It should take one parameter (e.g. \code{ids}), which is a character vector of id's of individuals, and return appropriate infection periods for those individuals. Therefore, the value of the function should be of length \code{length(ids)}. For example, for independent and identically distributed infection periods following \eqn{Exp(1)}, the generating function is \code{function(ids) rexp(length(ids), rate=1)}. For a constant infectious period of length c, it is sufficient to set \code{function (x) {c}}.\cr For the \code{simulate} method of class \code{"twinSIR"} only, this can also be \code{NULL} (the default), which means that the observed infectious periods of infected individuals are re-used when simulating a new epidemic and individuals with missing infectious periods (i.e. infection and recovery was not observed) are attributed to the mean observed infectious period. Note that it is even possible to simulate an SI-epidemic by setting \code{infPeriod = function (x) {Inf}} In other words: once an individual became infected it spreads the disease forever, i.e. it will never be removed. } \item{remPeriod}{ a function generating lengths of removal periods. Per default, once an individual was removed it will stay in this state forever (\code{Inf}). Therefore, it will not become at-risk (S) again and re-infections are not possible. Alternatively, always returning 0 as length of the removal period corresponds to a SIS epidemic. Any other values correspond to SIRS. } \item{end}{ a single positive numeric value specifying the time point at which the simulation should be forced to end. By default, this is \code{Inf}, i.e. the simulation continues until there is no susceptible individual left.\cr For the \code{simulate} method of class \code{"twinSIR"} the default is to have equal simulation and observation periods. } \item{trace}{ logical (or integer) indicating if (or how often) the sets of susceptible and infected individuals as well as the rejection indicator (of the rejection sampling step) should be \code{cat}ed. Defaults to \code{FALSE}. } \item{.allocate}{ number of blocks to initially allocate for the event history (i.e. \code{.allocate*N} rows). By default (\code{NULL}), this number is set to \code{max(500, ceiling(nBlocks/100)*100)}, i.e. 500 but at least the number of blocks in \code{data} (rounded to the next multiple of 100). Each time the simulated epidemic exceeds the allocated space, the event history will be enlarged by \code{.allocate} blocks. } \item{object}{ an object of class \code{"twinSIR"}. This must contain the original \code{data} used for the fit (see \code{data}). } \item{nsim}{ number of epidemics to simulate. Defaults to 1. } \item{seed}{ an integer that will be used in the call to \code{\link{set.seed}} before simulating the epidemics. } \item{\dots}{ unused (argument of the generic). } } \details{ A model is specified through the \code{formula}, which has the form \code{cbind(start, stop) ~ cox(endemicVar1) * cox(endemicVar2)}, i.e. the right hand side has the usual form as in \code{\link{lm}}, but all variables are marked as being endemic by the special function \code{\link{cox}}. The effects of those predictor terms are specified by \code{beta}. The left hand side of the formula denotes the start and stop columns in \code{data}. This can be omitted, if \code{data} inherits from class \code{"epidata"} in which case \code{cbind(start, stop)} will be used. The epidemic model component is specified by the parameter \code{f} (and by the epidemic effects \code{alpha}). The simulation algorithm used is \emph{Ogata's modified thinning}. For details, see \enc{Hhle}{Hoehle} (2009), Section 4. } \value{ An object of class \code{"simEpidata"}, which is a \code{data.frame} with the columns \code{"id"}, \code{"start"}, \code{"stop"}, \code{"atRiskY"}, \code{"event"}, \code{"Revent"} and the coordinate columns (with the original names from \code{data}), which are all obligatory. These columns are followed by all the variables appearing on the rhs of the \code{formula}. Last but not least, the generated columns with epidemic variables corresponding to the functions in the list \code{f} are appended, if \code{length(f)} > 0. Note that objects of class \code{"simEpidata"} also inherit from class \code{"\link{epidata}"}, thus all \code{"\link{epidata}"} methods can be applied. The \code{data.frame} is given the additional \emph{attributes} \item{"eventTimes"}{ numeric vector of infection time points (sorted chronologically). } \item{"timeRange"}{ numeric vector of length 2: \code{c(min(start), max(stop))}. } \item{"coords.cols"}{ numeric vector containing the column indices of the coordinate columns in the resulting data-frame. } \item{"f"}{ this equals the argument \code{f}. } \item{"config"}{ a list with elements \code{h0 = h0$exact}, \code{beta} and \code{alpha}. } \item{call}{the matched call.} \item{terms}{the \code{terms} object used.} If \code{nsim > 1} epidemics are simulated by the \code{simulate}-method for fitted \code{"twinSIR"} models, these are returned in a list. } \references{ \enc{Hhle}{Hoehle}, M. (2009), Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics, Biometrical Journal, 51(6):961-978. } \author{ Sebastian Meyer and Michael \enc{Hhle}{Hoehle} } \seealso{ The \code{\link{plot.epidata}} and \code{\link{animate.epidata}} methods for plotting and animating (simulated) epidemic data, respectively. The \code{\link{intensityplot.simEpidata}} method for plotting paths of infection intensities. Function \code{\link{twinSIR}} for fitting spatio-temporal epidemic intensity models to epidemic data. } \examples{ ## Generate a data frame containing a hypothetic population with 100 individuals set.seed(1234) n <- 100 pos <- matrix(rnorm(n*2), ncol=2, dimnames=list(NULL, c("x", "y"))) pop <- data.frame(id=1:n,x=pos[,1], y=pos[,2], gender=sample(0:1, n, replace=TRUE), I0col=rep(0,n),start=rep(0,n),stop=rep(Inf,n)) ## Simulate an epidemic in this population set.seed(1) epi <- simEpidata(cbind(start,stop) ~ cox(gender), data = pop, id = "id", I0.col = "I0col", coords.cols = c("x","y"), beta = c(-2), h0 = -1, alpha = c(B1 = 0.1), f = list(B1 = function(u) u <= 1), infPeriod = function(ids) rexp(length(ids), rate=1)) # Plot the numbers of susceptible, infectious and removed individuals plot(epi) if (surveillance.options("allExamples")) { ## load data of an artificial epidemic data("fooepidata") summary(fooepidata) ## simulate a new evolution of the epidemic set.seed(1) simepi <- simEpidata(cbind(start, stop) ~ cox(z1) + cox(z1):cox(z2), data = fooepidata, beta = c(1,0.5), h0 = -7, alpha = c(B2 = 0.01, B1 = 0.005), f = list(B1 = function(u) u<=1, B2 = function(u) u>1 & is.finite(u)), infPeriod = function(ids) rexp(length(ids), rate=0.2), trace = FALSE) summary(simepi) plot(simepi) intensityplot(simepi) } ## load a fitted model object, which must contain the original data ## (use 'keep.data = TRUE' in the call of 'twinSIR') data("foofit") foofit # plot original epidemic plot(foofit$data) ## simulate a new epidemic using the model and parameter estimates of 'foofit' ## and set simulation period = observation period # a) with observed infPeriods (i.e. fixed length 3 days): simfitepi1 <- simulate(foofit) plot(simfitepi1) # b) with new infPeriods (simuluated from the Exp(0.3) distribution): simfitepi2 <- simulate(foofit, infPeriod=function(ids) rexp(length(ids), rate=0.3)) plot(simfitepi2) intensityplot(simfitepi2, which="total", aggregate=FALSE, col=rgb(0,0,0,alpha=if(getRversion() < "2.7.0") 1 else 0.1)) } \keyword{datagen} \keyword{models} surveillance/man/polyAtBorder.Rd0000644000176000001440000000317212237153156016456 0ustar ripleyusers\name{polyAtBorder} \alias{polyAtBorder} \title{Indicate Polygons at the Border} \description{ Determines which polygons of a \code{"\linkS4class{SpatialPolygons}"} object are at the border, i.e. have coordinates in common with the spatial union of all polygons (constructed using \code{\link{unionSpatialPolygons}}). } \usage{ polyAtBorder(SpP, snap = sqrt(.Machine$double.eps), method = "rgeos", ...) } \arguments{ \item{SpP}{ an object of class \code{"\linkS4class{SpatialPolygons}"}. } \item{snap}{ tolerance used to consider coordinates as identical. } \item{method}{method to use for \code{\link{unionSpatialPolygons}}. Defaults to \code{"rgeos"}, since \pkg{polyclip} uses integer arithmetic, which causes rounding errors usually requiring tuning of (i.e., increasing) the tolerance parameter \code{snap} (see example below).} \item{\dots}{further arguments passed to the chosen \code{method}.} } \value{ logical vector of the same length as \code{SpP} also inheriting its \code{row.names}. } \author{ Sebastian Meyer } \examples{ ## Load districts of Germany load(system.file("shapes", "districtsD.RData", package="surveillance")) ## indicate districts at the border districtAtBorder <- polyAtBorder(districtsD) ## plot to check plot(districtsD, col=districtAtBorder) ## polyclip cannot be used with the default snapping tolerance plot(districtsD, col=polyAtBorder(districtsD, method="polyclip")) ## but increasing the tolerance gives the correct result stopifnot(identical(districtAtBorder, polyAtBorder(districtsD, snap=1e-6, method="polyclip"))) } \keyword{spatial} surveillance/man/primeFactors.Rd0000644000176000001440000000051511731650466016510 0ustar ripleyusers\name{primeFactors} \alias{primeFactors} \encoding{latin1} \title{Prime number factorization} \description{ Computes prime number factorization of an integer x. } \usage{ primeFactors(x) } \arguments{ \item{x}{an integer} } \value{vector with prime number factorization of x} \keyword{hplot} % bestCombination surveillance/man/twinstim_epidataCS_update.Rd0000644000176000001440000000445712236675562021225 0ustar ripleyusers\name{twinstim_epidataCS_update} \alias{update.epidataCS} \title{ Update method for \code{"epidataCS"} } \description{ The \code{\link{update}} method for the \code{"\link{epidataCS}"} class may be used to modify the hyperparameters \eqn{\epsilon} (\code{eps.t}) and \eqn{\delta} (\code{eps.s}), the indicator matrix \code{qmatrix} of possible ways of transmission between the event types, and the numerical accuracy \code{nCircle2Poly} of the polygonal representation of a circle. The update method will also update the auxiliary information contained in an \code{"epidataCS"} object accordingly, e.g., the vector of potential sources of each event, or the polygonal representation of the influence region. } \usage{ \method{update}{epidataCS}(object, eps.t, eps.s, qmatrix, nCircle2Poly, ...) } \arguments{ \item{object}{ an object of class \code{"epidataCS"}. } \item{eps.t}{ numeric vector of length the number of events in \code{object$events}. The event data column \code{eps.t} specifies the maximum temporal influence radius (e.g., length of infectious period, time to culling, etc.) of the events. } \item{eps.s}{ numeric vector of length the number of events in \code{object$events}. The event data column \code{eps.s} specifies the maximum spatial influence radius of the events. } \item{qmatrix}{ square indicator matrix (0/1 or TRUE/FALSE) for possible transmission between the event types. } \item{nCircle2Poly}{ accuracy (number of edges) of the polygonal approximation of a circle. } \item{\dots}{ unused (argument of the generic). } } \value{ The updated \code{"epidataCS"} object. } \author{ Sebastian Meyer } \seealso{ class \code{"\link{epidataCS}"}. } \examples{ data("imdepi") ## assume different interaction ranges and simplify polygons imdepi2 <- update(imdepi, eps.t = 20, eps.s = Inf, nCircle2Poly = 16) (s <- summary(imdepi)) (s2 <- summary(imdepi2)) ## The update reduced the number of infectives (along time) ## because the length of the infectious periods is reduced. It also ## changed the set of potential sources of transmission for each ## event, since the interaction is shorter in time but wider in space ## (eps.s=Inf means interaction over the whole observation region). } \keyword{manip} \keyword{utilities} \keyword{methods} surveillance/man/isoWeekYear.Rd0000644000176000001440000000234611745335465016311 0ustar ripleyusers\name{isoWeekYear} \alias{isoWeekYear} \title{Find ISO week and ISO year of a vector of Date objects} \description{ This function extracts the ISO week and ISO year of a \code{Date} according to the ISO 8601 specification. Note that this function does nothing else than format.Date(x, "\%G") and format.Date(x, "\%V") would do on Mac/Unix computers. However, this is not implemented on Windows. A small internal wrapper for \code{format.Date} (called \code{formatDate}) thus directs all calls having one of these format strings to this function, if the \code{sessionInfo()[[1]]$os} information reveals a Windows system. } \details{ The code is by Gustaf Rydevik posted at http://tolstoy.newcastle.edu.au/R/e10/help/10/05/5588.html } \usage{ isoWeekYear(Y, M=NULL, D=NULL) } \arguments{ \item{Y}{Date object (POSIX) or the year. Can be a vector.} \item{M}{month, \code{NULL} if Y is a Date object)} \item{D}{day, \code{NULL} if Y is a Date object)} } \value{ A list with entries \code{ISOYear} and \code{ISOWeek} containing the corresponding results. } \author{Gustaf Rydevik} \examples{ dates <- as.Date(c("2002-12-31","2003-01-01","2003-01-06")) isoWeekYear(dates) } \keyword{chron} surveillance/man/twinstim_step.Rd0000644000176000001440000000375712207663541016773 0ustar ripleyusers\name{twinstim_step} \alias{stepComponent} \alias{add1.twinstim} \alias{drop1.twinstim} \title{ Stepwise Model Selection by AIC } \description{ \code{stepComponent} is a wrapper around \code{\link{step}} to select a \code{"\link{twinstim}"} component's model based on an information criterion in a stepwise algorithm. There are also stand-alone single-step methods of \code{\link{add1}} and \code{\link{drop1}}. } \usage{ stepComponent(object, component = c("endemic", "epidemic"), scope = list(upper = object$formula[[component]]), direction = "both", trace = 2, verbose = FALSE, ...) \method{add1}{twinstim}(object, scope, component = c("endemic", "epidemic"), trace = 2, ...) \method{drop1}{twinstim}(object, scope, component = c("endemic", "epidemic"), trace = 2, ...) } \arguments{ \item{object}{an object of class \code{"twinstim"}.} \item{component}{one of \code{"endemic"} or \code{"epidemic"} (partially matched), determining the model component where the algorithm should proceed.} \item{scope,direction,trace}{see \code{\link{step}} and \code{\link{add1}}, respectively.} \item{verbose}{see \code{\link{twinstim}}.} \item{\dots}{further arguments passed to \code{\link{step}}, \code{\link{add1.default}}, or \code{\link{drop1.default}}, respectively.} } \value{ See \code{\link{step}} and \code{\link{add1}}, respectively. } \author{ (of this wrapper around \code{\link{step}}) Sebastian Meyer } \seealso{ \code{\link{step}}, \code{\link{add1}}, \code{\link{drop1}} } \examples{ data("imdepi") data("imdepifit") ## simple baseline model m0 <- update(imdepifit, epidemic = ~1, siaf=NULL, cumCIF=FALSE, start=c("e.(Intercept)"=-16)) ## AIC-based step-wise backward selection of the endemic component m0_step <- stepComponent(m0, "endemic", scope=list(lower=~I(start/365-3.5))) ## nothing is dropped from the model \dontshow{ m0_step$anova <- NULL stopifnot(identical(m0, m0_step)) } } \keyword{models} \keyword{methods} surveillance/man/stsSlots.Rd0000644000176000001440000000213511745737671015721 0ustar ripleyusers%%% FIXME: remove this file and add all the aliases to sts-class.Rd ? \name{stsSlot-generics} \docType{methods} \alias{alarms} \alias{alarms<-} \alias{upperbound} \alias{upperbound<-} \alias{control} \alias{control<-} \alias{epoch} \alias{epoch<-} \alias{observed} \alias{observed<-} \alias{population} \alias{population<-} \alias{multinomialTS} \alias{multinomialTS<-} \alias{neighbourhood} \alias{neighbourhood<-} \title{Generic functions to access \code{"sts"} slots} \description{ For almost every slot of the \code{"sts"} class, package \pkg{surveillance} defines a generic function of the same name (except for the \code{population} method where the slot is actually called \code{populationFrac}, and \code{alarms}, where the slot is actually called \code{alarm}) as well as a replacement version (\code{<-}) to extract or set the corresponding slot of a \code{sts} object. (This documentation is not really valid yet.) } %\section{Methods}{ %\describe{ % %\item{x = "sts"}{ The slot of \code{x} is determined and returned or set.} %}} \seealso{ the \code{"\linkS4class{sts}"} class } \keyword{methods} surveillance/man/print.algoQV.Rd0000644000176000001440000000144411731650466016400 0ustar ripleyusers\name{print.algoQV} \alias{print.algoQV} \title{Print quality value object} \description{Print a single qualitity value object in a nicely formatted way} \usage{ \method{print}{algoQV}(x,...) } \arguments{ \item{x}{Quality Values object generated with \code{quality}} \item{...}{Further arguments (not reall used)} } \keyword{print} \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 200, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Let this object be tested from rki1 survResObj <- algo.rki1(disProgObj, control = list(range = 50:200)) # Compute the quality values in a nice formatted way algo.quality(survResObj) } surveillance/man/algo.bayes.Rd0000644000176000001440000001122711731650466016100 0ustar ripleyusers\name{algo.bayes} \alias{algo.bayes} \alias{algo.bayesLatestTimepoint} \alias{algo.bayes1} \alias{algo.bayes2} \alias{algo.bayes3} \encoding{latin1} \title{The Bayes System} \description{ Evaluation of timepoints with the Bayes subsystem 1,2 or 3 or a self defined Bayes subsystem. } \usage{ algo.bayesLatestTimepoint(disProgObj, timePoint = NULL, control = list(b = 0, w = 6, actY = TRUE,alpha=0.05)) algo.bayes(disProgObj, control = list(range = range, b = 0, w = 6, actY = TRUE,alpha=0.05)) algo.bayes1(disProgObj, control = list(range = range)) algo.bayes2(disProgObj, control = list(range = range)) algo.bayes3(disProgObj, control = list(range = range)) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain)} \item{timePoint}{time point which shoud be evaluated in \code{algo.rkiLatestTimepoint}. The default is to use the latest timepoint} \item{control}{control object: \code{range} determines the desired timepoints which should be evaluated, \code{b} describes the number of years to go back for the reference values, \code{w} is the half window width for the reference values around the appropriate timepoint and \code{actY} is a boolean to decide if the year of \code{timePoint} also spend \code{w} reference values of the past. The parameter \code{alpha} is the \eqn{1-\alpha}-quantile to use in order to calculate the upper threshold. As default \code{b}, \code{w}, \code{actY} are set for the Bayes 1 system with \code{alpha}=0.05. } } \value{ \item{survRes}{ \code{algo.bayesLatestTimepoint} returns a list of class \code{survRes} (surveillance result), which includes the alarm value for recognizing an outbreak (1 for alarm, 0 for no alarm), the threshold value for recognizing the alarm and the input object of class disProg. \code{algo.bayes} gives a list of class \code{survRes} which includes the vector of alarm values for every timepoint in \code{range} and the vector of threshold values for every timepoint in \code{range} for the system specified by \code{b}, \code{w} and \code{actY}, the range and the input object of class disProg. \code{algo.bayes1} returns the same for the Bayes 1 system, \code{algo.bayes2} for the Bayes 2 system and \code{algo.bayes3} for the Bayes 3 system. } } \details{ Using the reference values for calculating an upper limit (threshold) via the negative binomial distribution, alarm is given if the actual value is bigger or equal than this threshold. \code{algo.bayes} calls \code{algo.bayesLatestTimepoint} for the values specified in \code{range} and for the system specified in \code{control}. \code{algo.bayes1}, \code{algo.bayes2}, \code{algo.bayes3} call \code{algo.bayesLatestTimepoint} for the values specified in \code{range} for the Bayes 1 system, Bayes 2 system or Bayes 3 system. \itemize{ \item \code{"Bayes 1"} reference values from 6 weeks ago and alpha=0.05 fixed. \item \code{"Bayes 2"} reference values from 6 weeks ago and 13 weeks of the year ago (symmetrical around the comparable week). Alpha is fixed at 0.05. \item \code{"Bayes 3"} 18 reference values. 9 from the year ago and 9 from two years ago (also symmetrical around the comparable week). Alpha is fixed at 0.05. } The procedure is now able to handle \code{NA}'s in the reference values. In the summation and when counting the number of observed reference values these are simply not counted. } \seealso{ \code{\link{algo.call}}, \code{\link{algo.rkiLatestTimepoint}} and \code{\link{algo.rki}} for the RKI system. } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ disProg <- sim.pointSource(p = 0.99, r = 0.5, length = 208, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Test for bayes 1 the latest timepoint algo.bayesLatestTimepoint(disProg) # Test week 200 to 208 for outbreaks with a selfdefined bayes algo.bayes(disProg, control = list(range = 200:208, b = 1, w = 5, actY = TRUE,alpha=0.05)) # The same for bayes 1 to bayes 3 algo.bayes1(disProg, control = list(range = 200:208,alpha=0.05)) algo.bayes2(disProg, control = list(range = 200:208,alpha=0.05)) algo.bayes3(disProg, control = list(range = 200:208,alpha=0.05)) } \keyword{classif} \source{ Riebler, A. (2004), Empirischer Vergleich von statistischen Methoden zur Ausbruchserkennung bei Surveillance Daten, Bachelor's thesis. } surveillance/man/LRCUSUM.runlength.Rd0000644000176000001440000001310112061360325017171 0ustar ripleyusers\name{LRCUSUM.runlength} \alias{LRCUSUM.runlength} \alias{outcomeFunStandard} \alias{LLR.fun} \encoding{latin1} \title{Run length computation of a CUSUM detector} \description{ Compute run length for a count data or categorical CUSUM. The computations are based on a Markov representation of the likelihood ratio based CUSUM. } \usage{ LRCUSUM.runlength(mu,mu0,mu1,h,dfun, n, g=5,outcomeFun=NULL,...) } \arguments{ \item{mu}{\eqn{k-1 \times T} matrix with true proportions, i.e. equal to mu0 or mu1 if one wants to compute e.g. \eqn{ARL_0} or \eqn{ARL_1}.} \item{mu0}{\eqn{k-1 \times T} matrix with in-control proportions} \item{mu1}{\eqn{k-1 \times T} matrix with out-of-control proportion} \item{h}{The threshold h which is used for the CUSUM.} \item{dfun}{The probability mass function or density used to compute the likelihood ratios of the CUSUM. In a negative binomial CUSUM this is \code{dnbinom}, in a binomial CUSUM \code{dbinom} and in a multinomial CUSUM \code{dmultinom}.} \item{n}{Vector of length \eqn{T} containing the total number of experiments for each time point.} \item{g}{The number of levels to cut the state space into when performing the Markov chain approximation. Sometimes also denoted \eqn{M}. Note that the quality of the approximation depends very much on \eqn{g}. If \eqn{T} greater than, say, 50 its necessary to increase the value of \eqn{g}.} \item{outcomeFun}{A hook function to compute all possible outcome states to compute the likelihood ratio for. If \code{NULL} then the default function \code{outcomeFunStandard(k,n)} is used. This function uses the Cartesian product of \code{0:n} for \code{k} components.} \item{\dots}{Additional arguments to send to \code{dfun}.} } \details{ Brook and Evans (1972) formulated an approximate approach based on Markov chains to determine the PMF of the run length of a time-constant CUSUM detector. They describe the dynamics of the CUSUM statistic by a Markov chain with a discretized state space of size \eqn{g+2}. This is adopted to the time varying case in \enc{Hhle}{Hoehle} (2010) and implemented in R using the \dots notation such that it works for a very large class of distributions. } \seealso{\code{\link{categoricalCUSUM}}} \value{A list with five components \item{P}{An array of \eqn{g+2 \times g+2} transition matrices of the approximation Markov chain.} \item{pmf}{Probability mass function (up to length \eqn{T}) of the run length variable.} \item{cdf}{Cumulative density function (up to length \eqn{T}) of the run length variable.} \item{arl}{If the model is time homogenous (i.e. if \eqn{T==1}) then the ARL is computed based on the stationary distribution of the Markov chain. See the eqns in the reference for details. Note: If the model is not time homogeneous then the function returns \code{NA} and the ARL has to be approximated manually from the output. One could use \code{sum(1:length(pmf) * pmf)}, which is an approximation because of using a finite support for a sum which should be from 1 to infinity. } } \references{ Hhle, M. (2010), Changepoint detection in categorical time series, Book chapter in T. Kneib and G. Tutz (Eds.), Statistical Modelling and Regression Structures - Festschrift in Honour of Ludwig Fahrmeir, Springer, pp. 377-397. Preprint available as http://www.stat.uni-muenchen.de/~hoehle/pubs/hoehle2010-preprint.pdf Hhle, M. and Mazick, A. (2009), Aberration detection in R illustrated by Danish mortality monitoring, Book chapter to appear in T. Kass-Hout and X. Zhang (Eds.) Biosurveillance: A Health Protection Priority, CRCPress. Preprint available as http://www.stat.uni-muenchen.de/~hoehle/pubs/hoehle_mazick2009-preprint.pdf Brook, D. and Evans, D. A. (1972), An approach to the probability distribution of Cusum run length, Biometrika, 59:3, pp. 539--549. } \examples{ ###################################################### #Run length of a time constant negative binomial CUSUM ###################################################### #In-control and out of control parameters mu0 <- 10 alpha <- 1/2 kappa <- 2 #Density for comparison in the negative binomial distribution dY <- function(y,mu,log=FALSE, alpha, ...) { dnbinom(y, mu=mu, size=1/alpha, log=log) } #In this case "n" is the maximum value to investigate the LLR for #It is assumed that beyond n the LLR is too unlikely to be worth #computing. LRCUSUM.runlength( mu=t(mu0), mu0=t(mu0), mu1=kappa*t(mu0), h=5, dfun = dY, n=rep(100,length(mu0)), alpha=alpha) h.grid <- seq(3,6,by=0.3) arls <- sapply(h.grid, function(h) { LRCUSUM.runlength( mu=t(mu0), mu0=t(mu0), mu1=kappa*t(mu0), h=h, dfun = dY, n=rep(100,length(mu0)), alpha=alpha,g=20)$arl }) plot(h.grid, arls,type="l",xlab="threshold h",ylab=expression(ARL[0])) if (surveillance.options("allExamples")) { ###################################################### #Run length of a time varying negative binomial CUSUM ###################################################### mu0 <- matrix(5*sin(2*pi/52 * 1:200) + 10,ncol=1) rl <- LRCUSUM.runlength( mu=t(mu0), mu0=t(mu0), mu1=kappa*t(mu0), h=2, dfun = dY, n=rep(100,length(mu0)), alpha=alpha,g=20) plot(1:length(mu0),rl$pmf,type="l",xlab="t",ylab="PMF") plot(1:length(mu0),rl$cdf,type="l",xlab="t",ylab="CDF") } ######################################################## # Further examples contain the binomial, beta-binomial # and multinomial CUSUMs. Hopefully, these will be added # in the future. ######################################################## } \author{M. \enc{Hhle}{Hoehle}} \keyword{regression} surveillance/man/simHHH.Rd0000644000176000001440000000703011770111463015161 0ustar ripleyusers\name{simHHH} \alias{simHHH} \alias{simHHH.default} \alias{simHHH.ah} \encoding{latin1} \title{Simulates data based on the model proposed by Held et. al (2005)} \description{ Simulates a multivariate time series of counts based on the Poisson/Negative Binomial model as described in Held et al. (2005). } \usage{ \method{simHHH}{default}(model=NULL, control = list(coefs = list(alpha=1, gamma = 0, delta = 0, lambda = 0, phi = NULL, psi = NULL, period = 52), neighbourhood = NULL, population = NULL, start = NULL), % state = NULL, K = 0), length) \method{simHHH}{ah}(model, control = model$control, length) } \arguments{ \item{control}{list with \describe{ \item{coefs}{list with the following parameters of the model - if not specified, those parameters are omitted \describe{ \item{alpha}{vector of length \code{m} with intercepts for \code{m} units or geographic areas respectively} \item{gamma}{vector with parameters for the "sine" part of \eqn{\nu_{i,t}} } \item{delta}{vector with parameters for the "cosine" part of \eqn{\nu_{i,t}} } \item{lambda}{autoregressive parameter} \item{phi}{autoregressive parameter for adjacent units} \item{psi}{overdispersion parameter of the negative binomial model; \code{NULL} corresponds to a Poisson model} \item{period}{period of the seasonal component, defaults to 52 for weekly data} } } \item{neighbourhood}{neighbourhood matrix of size \eqn{m \times m} with element 1 if two units are adjacent; the default \code{NULL} assumes that there are no neighbours} \item{population}{matrix with population proportions; the default \code{NULL} sets \eqn{n_{i,t}=1} } \item{start}{if \code{NULL}, the means of the endemic part in the \code{m} units is used as initial values \eqn{y_{i,0}} } }} \item{model}{Result of a model fit with \code{\link{algo.hhh}}, the estimated parameters are used to simulate data} \item{length}{number of time points to simulate } } \value{Returns a list with elements \item{data}{\code{disProgObj} of simulated data } \item{mean}{matrix with mean \eqn{\mu_{i,t}} that was used to simulate the data} \item{endemic}{matrix with only the endemic part \eqn{\nu_{i,t}} } \item{coefs}{list with parameters of the model} } \details{ Simulates data from a Poisson or a Negative Binomial model with mean \deqn{\mu_{it} = \lambda y_{i,t-1} + \phi \sum_{j \sim i} y_{j,t-1} + n_{it} \nu_{it}} where \deqn{\log \nu_{it} = \alpha_i + \sum_{s=1}^{S}(\gamma_s sin(\omega_s t) + \delta_s cos(\omega_s t))} \eqn{\omega_s = 2s\pi/\code{period}} are Fourier frequencies and \eqn{n_{it}} are possibly standardized population sizes. } \note{The model does not contain a linear trend.} %\seealso{\code{\link{algo.hhh}}, \code{\link{algo.hhh.grid}}} \source{Held, L., \enc{Hhle}{Hoehle}, M., Hofmann, M. (2005). A statistical framework for the analysis of multivariate infectious disease surveillance counts. Statistical Modelling, 5, p. 187-199. } \keyword{datagen} surveillance/man/earsC.Rd0000644000176000001440000001546712122142736015112 0ustar ripleyusers\name{earsC} \alias{earsC} \encoding{latin1} \title{Surveillance for a count data time series using the EARS C1, C2 or C3 method.} \description{ % The function takes \code{range} values of the surveillance time series \code{sts} and for each time point computes a threshold for the number of counts based on values from the recent past. This is then compared to the observed number of counts. If the observation is above a specific quantile of the prediction interval, then an alarm is raised. This method is especially useful for data without many reference values, since it only needs counts from the recent past. % } \usage{ earsC(sts, control = list(range = NULL, method = "C1", alpha = 0.001)) } \arguments{ \item{sts}{object of class sts (including the \code{observed} and the \code{state} time series) , which is to be monitored.} \item{control}{Control object \describe{ \item{\code{range}}{Specifies the index of all timepoints which should be tested. If \code{range} is \code{NULL} the maximum number of possible timepoints is used. This number depends on the method chosen. For C1 all timepoints from timepoint 8 can be assessed, for C2 from timepoint 10 and for C3 from timepoint 12.} \item{\code{method}}{String indicating which method to use: \cr "C1" for EARS C1-MILD method, "C2" for EARS C2-MEDIUM method, "C3" for EARS C3-HIGH method. By default if \code{method} is \code{NULL} C1 is chosen.} \item{\code{alpha}}{An approximate (two-sided) \eqn{(1-\alpha)\cdot 100\%} prediction interval is calculated. By default if \code{alpha} is \code{NULL} 0.001 is assumed for C1 and C2 whereas 0.025 is assumed for C3. These different choices are the one made at the CDC.} % } } } \details{ The three methods are different in terms of baseline used for calculation of the expected value and in terms of method for calculating the expected value: \itemize{ \item in C1 and C2 the expected value is the moving average of counts over the sliding window of the baseline and the prediction interval depends on the standard derivation of counts over this window. They can be considered as Shewhart control charts with a small sample used for calculations. \item in C3 the expected value is based on the sum over 3 timepoints (assessed timepoints and the two previous timepoints) of the discrepancy between observations and predictions, predictions being calculated with C2 method. This method shares a common point with CUSUM method (adding discrepancies between predictions and observations over several timepoints) but is not a CUSUM (sum over 3 timepoints, not accumulation over a whole range), even if it sometimes presented as such. } Here is what the function does for each method: \enumerate{ \item For C1 the baseline are the 7 timepoints before the assessed timepoint t, t-7 to t-1. The expected value is the mean of the baseline. An approximate (two-sided) \eqn{(1-\alpha)\cdot 100\%} prediction interval is calculated based on the assumption that the difference between the expected value and the observed value divided by the standard derivation of counts over the sliding window, called \eqn{C_1(t)}, follows a standard normal distribution in the absence of outbreaks: \deqn{C_1(t)= \frac{Y(t)-\bar{Y}_1(t)}{S_1(t)},} where \deqn{\bar{Y}_1(t)= \frac{1}{7} \sum_{i=t-1}^{t-7} Y(i)} and \deqn{ S^2_1(t)= \frac{1}{6} \sum_{i=t-1}^{t-7} [Y(i) - \bar{Y}_1(i)]^2.} Then under the null hypothesis of no outbreak, \deqn{C_1(t) \mathcal \sim {N}(0,1)} An alarm is raised if \deqn{C_1(t)\ge z_{1-\alpha}} with \eqn{z_{1-\alpha}} the \eqn{(1-\alpha)^{th}} quantile of the centered reduced normal law. \cr The upperbound \eqn{U_1(t)} is then defined by: \deqn{U_1(t)= \bar{Y}_1(t) + z_{1-\alpha}S_1(t).} \item C2 is very close to C1 apart from a 2-day lag in the baseline definition. Indeed for C2 the baseline are 7 timepoints with a 2-day lag before the assessed timepoint t, t-9 to t-3. The expected value is the mean of the baseline. An approximate (two-sided) \eqn{(1-\alpha)\cdot 100\%} prediction interval is calculated based on the assumption that the difference between the expected value and the observed value divided by the standard derivation of counts over the sliding window, called \eqn{C_2(t)}, follows a standard normal distribution in the absence of outbreaks: \deqn{C_2(t)= \frac{Y(t)-\bar{Y}_2(t)}{S_2(t)},} where \deqn{\bar{Y}_2(t)= \frac{1}{7} \sum_{i=t-3}^{t-9} Y(i)} and \deqn{ S^2_2(t)= \frac{1}{6} \sum_{i=t-3}^{t-9} [Y(i) - \bar{Y}_2(i)]^2.} Then under the null hypothesis of no outbreak, \deqn{C_2(t) \mathcal \sim {N}(0,1)} An alarm is raised if \deqn{C_2(t)\ge z_{1-\alpha},} with \eqn{z_{1-\alpha}} the \eqn{(1-\alpha)^{th}} quantile of the centered reduced normal law. \cr The upperbound \eqn{U_2(t)} is then defined by: \deqn{U_2(t)= \bar{Y}_2(t) + z_{1-\alpha}S_2(t).} \item C3 is quite different from the two other methods but it is based on C2. Indeed it uses \eqn{C_2(t)} from timepoint t and the two previous timepoints. This means the baseline are timepoints t-11 to t-3. The statistic \eqn{C_3(t)} is the sum of discrepancies between observations and predictions. \deqn{C_3(t)= \sum_{i=t}^{t-2} \max(0,C_2(i)-1)} Then under the null hypothesis of no outbreak, \deqn{C_3(t) \mathcal \sim {N}(0,1)} An alarm is raised if \deqn{C_3(t)\ge z_{1-\alpha},} with \eqn{z_{1-\alpha}} the \eqn{(1-\alpha)^{th}} quantile of the centered reduced normal law. \cr The upperbound \eqn{U_3(t)} is then defined by: \deqn{U_3(t)= \bar{Y}_2(t) + S_2(t)\left(z_{1-\alpha}-\sum_{i=t-1}^{t-2} \max(0,C_2(i)-1)\right).} } } \value{ An object of class \code{sts} with the slots \code{upperbound} and \code{alarm} filled by the chosen method. } \examples{ #Sim data and convert to sts object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 208, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) stsObj = disProg2sts( disProgObj) #Call function and show result res1 <- earsC(stsObj, control = list(range = 20:208,method="C1")) plot(res1,legend.opts=list(horiz=TRUE,x="topright"),dx.upperbound=0) # compare upperbounds depending on alpha res3 <- earsC(stsObj, control = list(range = 20:208,method="C3",alpha = 0.001)) plot(res3@upperbound,t='l') res3 <- earsC(stsObj, control = list(range = 20:208,method="C3")) lines(res3@upperbound,col='red') } \author{M. Salmon} \keyword{classif} \source{ Fricker, R.D., Hegler, B.L, and Dunfee, D.A. (2008). Comparing syndromic surveillance detection methods: EARS versus a CUSUM-based methodology, 27:3407-3429, Statistics in medicine. } surveillance/man/measlesDE.Rd0000644000176000001440000000173511731650466015721 0ustar ripleyusers\name{measlesDE} \alias{measlesDE} \encoding{latin1} \title{Measles in the 16 states of Germany} \description{Weekly number of measles cases in the 16 states (Bundeslaender) of Germany for years 2005 to 2007. } \usage{data(measlesDE) } \format{ An \code{sts} object containing \eqn{156\times 16}{156 x 16} observations starting from week 1 in 2005. The \code{population} slot contains the population fractions of each state at 31.12.2006, obtained from the Federal Statistical Office of Germany. } \source{Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; Queried on 14 October 2009. } \seealso{\code{\link{MMRcoverageDE}}} \examples{ data(measlesDE) plot(measlesDE) } \references{ Herzog, S.A., Paul, M. and Held, L. (2011) Heterogeneity in vaccination coverage explains the size and occurrence of measles epidemics in German surveillance data. Epidemiology and Infection, \bold{139}, 505--515. } \keyword{datasets} surveillance/man/refvalIdxByDate.Rd0000644000176000001440000000216611731650466017073 0ustar ripleyusers\name{refvalIdxByDate} \alias{refvalIdxByDate} \encoding{latin1} \title{Compute indices of reference value using Date class} \description{ The reference values are formed base on computatations of \code{seq} for Date class arguments. } \usage{ refvalIdxByDate(t0, b, w, epochStr, epochs) } \arguments{ \item{t0}{A Date object describing the time point} \item{b}{Number of years to go back in time} \item{w}{Half width of window to include reference values for} \item{epochStr}{One of \code{"1 month"}, \code{"1 week"} or \code{"1 day"}} \item{epochs}{Vector containing the epoch value of the sts/disProg object} } \details{ Using the Date class the reference values are formed as follows: Starting from \code{t0} go i, i= 1,...,\code{b} years back in time. For each year, go \code{w} epochs back and include from here to \code{w} epochs after \code{t0}. In case of weeks we always go back to the closest monday of this date. In case of months we also go back in time to closest 1st of month. } \value{ a vector of indices in epochs which match } \keyword{regression} surveillance/man/disProg2sts.Rd0000644000176000001440000000164511731650466016302 0ustar ripleyusers\name{disProg2sts} \alias{disProg2sts} \alias{sts2disProg} \title{Convert disProg object to sts and vice versa} \description{ % A small helper function to convert a \code{disProg} object to become an object of the S4 class \code{sts} and vice versa. In the future the \code{sts} should replace the \code{disProg} class, but for now this function allows for conversion between the two formats. % } \usage{ disProg2sts(disProgObj, map=NULL) sts2disProg(sts) } \arguments{ \item{disProgObj}{object of class disProg} \item{map}{\code{SpatialPolygonsDataFrame} object containing the map visualization} \item{sts}{Object of class \code{sts} to convert} } \value{ an object of class \code{sts} or \code{disProg}, respectively. } \seealso{ \code{\link{sts-class}} } \examples{ data(ha) print(disProg2sts(ha)) class(sts2disProg(disProg2sts(ha))) } \keyword{utilities} surveillance/man/compMatrix.writeTable.Rd0000644000176000001440000000411611731650466020277 0ustar ripleyusers\name{compMatrix.writeTable} \alias{compMatrix.writeTable} \encoding{latin1} \title{Latex Table Generation} \description{generates a latex table } \usage{ compMatrix.writeTable(compMatrix) } \arguments{ \item{compMatrix}{Matrix which includes quality values for every surveillance system.} } \value{ \item{xtable}{ Latex table of the entered matrix. } } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ ### First creates some tables ### # Create a test object disProgObj1 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) disProgObj2 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 5) disProgObj3 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 17) # Let this object be tested from any methods in range = 200:400 range <- 200:400 control <- list( list(funcName = "rki1", range = range), list(funcName = "rki2", range = range), list(funcName = "rki3", range = range) ) ### This are single compMatrices compMatrix1 <- algo.compare(algo.call(disProgObj1, control=control)) compMatrix2 <- algo.compare(algo.call(disProgObj2, control=control)) compMatrix3 <- algo.compare(algo.call(disProgObj3, control=control)) ### This is a summary compMatrix sumCompMatrix <- algo.summary( list(a=compMatrix1, b=compMatrix2, c=compMatrix3) ) ### Now show the latextable from the single compMatrix compMatrix1 compMatrix.writeTable(compMatrix1) ### Now show the latextable from the summary compMatrix compMatrix.writeTable(sumCompMatrix) } \keyword{print} surveillance/man/twinstim_intensityplot.Rd0000644000176000001440000002141112236001533020715 0ustar ripleyusers\name{twinstim_intensityplot} \alias{intensityplot.twinstim} \alias{intensity.twinstim} \alias{intensityplot.simEpidataCS} \title{ Plotting Intensities of Infection over Time or Space } \description{ \code{\link{intensityplot}} method to plot the evolution of the total infection intensity, its epidemic proportion or its endemic proportion over time or space (integrated over the other dimension) of fitted \code{\link{twinstim}} models (or \code{\link{simEpidataCS}}). The \code{"simEpidataCS"}-method is just a wrapper around \code{intensityplot.twinstim} by making the \code{"simEpidataCS"} object \code{"twinstim"}-compatible, i.e. enriching it by the required model components and environment. The \code{intensity.twinstim} auxiliary function returns functions which calculate the endemic or epidemic intensity at a specific time point or location (integrated over the other dimension). } \usage{ \method{intensityplot}{twinstim}(x, which = c("epidemic proportion", "endemic proportion", "total intensity"), aggregate = c("time", "space"), types = 1:nrow(x$qmatrix), tiles, tiles.idcol = NULL, plot = TRUE, add = FALSE, tgrid = 101, rug.opts = list(), sgrid = 128, polygons.args = list(), points.args = list(), cex.fun = sqrt, ...) \method{intensityplot}{simEpidataCS}(x, ...) intensity.twinstim(x, aggregate = c("time", "space"), types = 1:nrow(x$qmatrix), tiles, tiles.idcol = NULL) } \arguments{ \item{x}{ an object of class \code{"twinstim"} or \code{"simEpidataCS"}, respectively. } \item{which}{ \code{"epidemic proportion"}, \code{"endemic proportion"}, or \code{"total intensity"}. Partial matching is applied. Determines whether to plot the path of the total intensity or its epidemic or endemic proportions over time or space (\code{which}) aggregated over the other dimension and \code{types}. } \item{aggregate}{ One of \code{"time"} or \code{"space"}. The former results in a plot of the evolution of \code{which} as a function of time (integrated over the observation region \eqn{\bold{W}}), whereas the latter produces a \code{spplot} of \code{which} over \eqn{\bold{W}} (spanned by \code{tiles}). In both cases, \code{which} is evaluated on a grid of values, given by \code{tgrid} or \code{sgrid}, respectively. } \item{types}{ event types to aggregate. By default, all types of events are aggregated, but one could also be interested in only one specific type or a subset of event types. } \item{tiles}{ object of class \code{\linkS4class{SpatialPolygons}} representing the decomposition of \eqn{\bold{W}} into different regions (as used in the corresponding \code{stgrid} of the \code{"\link{epidataCS}"}. This is only needed for \code{aggregate = "space"}. } \item{tiles.idcol}{ either a column index for \code{tiles@data}, or \code{NULL} (default), which refers to the \code{"ID"} slot of the polygons. The resulting ID's must correspond to the ID's used in the \code{tile} column of the \code{stgrid} of the \code{"\link{epidataCS}"} on which \code{x} was fitted. } \item{plot}{ logical indicating if a plot is desired, which defaults to \code{TRUE}. Otherwise, a function will be returned, which takes a vector of time points (if \code{aggregate = "time"}) or a matrix of coordinates (if \code{aggregate = "space"}), and returns \code{which} on this grid. } \item{add}{ logical. If \code{TRUE} and \code{aggregate = "time"}, paths are added to the current plot, using \code{lines}. This does not work for \code{aggregate = "space"}. } \item{tgrid}{ either a numeric vector of time points when to evaluate \code{which}, or a scalar representing the desired number of evaluation points in the observation interval \eqn{[t_0, T]}. This argument is unused for \code{aggregate = "space"}. } \item{rug.opts}{ if a list, its elements are passed as arguments to the function \code{\link{rug}}, which will mark the time points of the events if \code{aggregate = "time"} (it is unused in the spatial case); otherwise (e.g., \code{NULL}), no \code{rug} will be produced. By default, the \code{rug} argument \code{ticksize} is set to 0.02 and \code{quiet} is set to \code{TRUE}. Note that the argument \code{x} of the \code{rug} function, which contains the locations for the \code{rug} is fixed internally and can not be modified. } \item{sgrid}{ either an object of class \code{"\linkS4class{SpatialPixels}"} (or coercible to that class) representing the locations where to evaluate \code{which}, or a scalar representing the total number of points of a grid constructed on the bounding box of \code{tiles} (using \code{\link[maptools]{Sobj_SpatialGrid}} from package \pkg{maptools}). \code{sgrid} is internally subsetted to contain only points inside \code{tiles}. This argument is unused for \code{aggregate = "time"}. } \item{polygons.args}{ if a list, its elements are passed as arguments to \code{\link{sp.polygons}}, which will add \code{tiles} to the plot if \code{aggregate = "space"} (it is unused for the temporal plot). By default, the fill \code{col}our of the tiles is set to \code{"darkgrey"}. } \item{points.args}{ if a list, its elements are passed as arguments to \code{\link{sp.points}}, which will add the event locations to the plot if \code{aggregate = "space"} (it is unused for the temporal plot). By default, the plot symbol ist set to \code{pch=1}. The sizes of the points are determined as the product of the argument \code{cex} (default: 0.5) of this list and the sizes obtained from the function \code{cex.fun} which accounts for multiple events at the same location. } \item{cex.fun}{ function which takes a vector of counts of events at each unique location and returns a (vector of) \code{cex} value(s) for the sizes of the points at the event locations used in \code{points.args}. Defaults to the \code{sqrt()} function, which for the default circular \code{pch=1} means that the area of each point is proportional to the number of events at its location. } \item{\dots}{ further arguments passed to \code{plot} or \code{lines} (if \code{aggregate = "time"}), or to \code{\link{spplot}} (if \code{aggregate = "space"}).\cr For \code{intensityplot.simEpidataCS}, arguments passed to \code{intensityplot.twinstim}. } } \value{ If \code{plot = FALSE} or \code{aggregate = "time"}, a function is returned, which takes a vector of time points (if \code{aggregate = "time"}) or a matrix of coordinates (if \code{aggregate = "space"}), and returns \code{which} on this grid. If \code{plot = TRUE} and \code{aggregate = "space"}, the \code{\link{trellis.object}} containg the spatial plot is returned. } \author{ Sebastian Meyer } \seealso{ \code{\link{plot.twinstim}}, which calls this function. } \examples{ data("imdepi") data("imdepifit") # for the intensityplot we need the model environment, which can be # easily added by the intelligent update method (no need to refit the model) imdepifit <- update(imdepifit, model=TRUE) ## path of the total intensity opar <- par(mfrow=c(2,1)) intensityplot(imdepifit, which="total intensity", aggregate="time", tgrid=500) plot(imdepi, breaks=100) par(opar) ## path of the proportion of the epidemic component by event intensityplot(imdepifit, which="epidemic proportion", aggregate="time", tgrid=500, types=1) intensityplot(imdepifit, which="epidemic proportion", aggregate="time", tgrid=500, types=2, add=TRUE, col=2) legend("topright", legend=levels(imdepi$events$type), lty=1, col=1:2, title = "event type") if (surveillance.options("allExamples") && requireNamespace("maptools")) { ## spatial shape of the intensity (aggregated over time) # load borders of Germany's districts (obtained from the # Bundesamt fr Kartographie und Geodsie, Frankfurt am Main, Germany, # www.geodatenzentrum.de), simplified by the "special" Visvalingam # algorithm (level=60\%) using www.MapShaper.org: load(system.file("shapes", "districtsD.RData", package="surveillance")) # total intensity (using a rather sparse 'sgrid' for speed) intensityplot(imdepifit, which="total intensity", aggregate="space", tiles=districtsD, sgrid=500) # epidemic proportion by type maps_epiprop <- lapply(1:2, function (type) { intensityplot(imdepifit, which="epidemic", aggregate="space", types=type, tiles=districtsD, sgrid=1000, at=seq(0,1,by=0.1), col.regions=rev(heat.colors(20))) }) plot(maps_epiprop[[1]], split=c(1,1,2,1), more=TRUE) plot(maps_epiprop[[2]], split=c(2,1,2,1)) } } \keyword{hplot} \keyword{aplot} \keyword{dplot} \keyword{methods} surveillance/man/surveillance.options.Rd0000644000176000001440000000470012236666227020243 0ustar ripleyusers\name{surveillance.options} \alias{surveillance.options} \alias{reset.surveillance.options} \title{Options of the \pkg{surveillance} Package} \description{ Query, set or reset options specific to the \pkg{surveillance} package, similar to what \code{\link{options}} does for global settings. } \usage{ surveillance.options(...) reset.surveillance.options() } \arguments{ \item{\dots}{ Either empty, or a sequence of option names (as strings), or a sequence of \code{name=value} pairs, or a named list of options. Available options are: \describe{ \item{gpclib:}{ Logical flag indicating whether \pkg{gpclib}, the General Polygon Clipping Library for \R, which has a restricted license (commercial use prohibited), may be used. This is no longer required since package \pkg{surveillance} has switched to alternatives such as \pkg{polyclip} and \pkg{rgeos} for generating \code{"epidataCS"} objects by \code{as.epidataCS} or \code{simEpidataCS}. However, for \code{\link{unionSpatialPolygons}} and \code{\link{intersectPolyCircle.gpc.poly}}, using \pkg{gpclib} is still an option (mainly for backwards compatibility). The default setting is \code{FALSE}. } \item{allExamples:}{ Logical flag mainly for CRAN-compatibility, i.e. to prevent cumbersome computations in help file examples from being run by CRAN servers. This option defaults to \code{TRUE} unless the environment variable \env{_R_CHECK_TIMINGS_} is set when attaching the \pkg{surveillance} package. } } } } \value{ \code{reset.surveillance.options} reverts all options to their default values and (invisibly) returns these in a list. For \code{surveillance.options}, the following holds: \itemize{ \item If no arguments are given, the current values of all package options are returned in a list. \item If one option name is given, the current value of this option is returned (\emph{not} in a list, just the value). \item If several option names are given, the current values of these options are returned in a list. \item If \code{name=value} pairs are given, the named options are set to the given values, and the \emph{previous} values of these options are returned in a list. } } \author{ Sebastian Meyer, inspired by the implementation of \code{spatstat.options()} in the \pkg{spatstat} package by Adrian Baddeley and Rolf Turner. } \examples{ surveillance.options() } \keyword{environment} surveillance/man/R0.Rd0000644000176000001440000001173612207604654014337 0ustar ripleyusers\encoding{latin1} \name{R0} \alias{R0} \alias{R0.twinstim} \alias{R0.simEpidataCS} \title{Computes basic reproduction numbers from fitted models} \description{ The S3 generic function \code{R0} defined in package \pkg{surveillance} is intended to compute basic reproduction numbers from fitted epidemic models. The package currently defines a method for the \code{"\link{twinstim}"} class, which computes mean numbers of infections caused by infected individuals depending on the event type and marks attached to the individual, which contribute to the infection pressure in the epidemic predictor of that class. There is also a method for simulated epidemics (internally just a wrapper for the \code{"twinstim"}-method). } \usage{ R0(object, ...) \method{R0}{twinstim}(object, newevents, trimmed = TRUE, ...) \method{R0}{simEpidataCS}(object, trimmed = TRUE, ...) } \arguments{ \item{object}{A fitted epidemic model object for which an \code{R0} method exists.} \item{newevents}{ an optional \code{data.frame} of events for which the basic reproduction numbers should be calculated. If omitted, it is calculated for the original events from the fit. In this case, if \code{trimmed = TRUE} (the default), the result is just \code{object$R0}; however, if \code{trimmed = FALSE}, the model environment is required, i.e. \code{object} must have been fitted with \code{model = TRUE}. For the \code{twinstim} method, \code{newevents} must at least contain the following columns: the \code{time} of the events, the factor variable \code{type}, the interaction ranges \code{eps.t} and \code{eps.s}, as well as columns for the marks used in the epidemic component of the fitted twinstim \code{object} as stored in \code{formula(object)$epidemic}. The coding of the variables must of course be the same as used for fitting. For \code{trimmed} R0 values, \code{newevents} must additionally contain the components \code{.influenceRegion} and, if using the \code{Fcircle} trick in the \code{siaf} specification, also \code{.bdist} (cf. the hidden columns in the \code{events} component of class \code{"epidataCS"}). } \item{trimmed}{ logical indicating if the individual reproduction numbers should be calculated by integrating the epidemic intensities over the observation period and region only (\code{trimmed = TRUE}) or over the whole time-space domain R+ x R^2 (\code{trimmed = FALSE}). By default, if \code{newevents} is missing, the trimmed \code{R0} values stored in \code{object} are returned. Trimming means that events near the (spatial or temporal) edges of the observation domain have lower reproduction numbers (ceteris paribus) because events outside the observation domain are not observed. } \item{\dots}{additional arguments passed to methods. Currently unused for the \code{twinstim} method.} } \details{ For the \code{"\link{twinstim}"} class, the individual-specific mean number \eqn{\mu_j} of infections caused by individual (event) \eqn{j} inside its theoretical (untrimmed) spatio-temporal range of interaction given by its \code{eps.t} (\eqn{\epsilon}) and \code{eps.s} (\eqn{\delta}) values is defined as follows (cf. Meyer et al, 2012): \deqn{\mu_j = e^{\eta_j} \cdot \int_0^\epsilon g(t) dt \cdot \int_{b(\bold{0},\delta)} f(\bold{s}) d\bold{s} .} Here, \eqn{b(\bold{0},\delta)} denotes the disc centred at (0,0)' with radius \eqn{\delta}, \eqn{\eta_j} is the epidemic linear predictor, \eqn{g(t)} is the temporal interaction function, and \eqn{f(\bold{s})} is the spatial interaction function. Alternatively, the \code{trimmed} (observed) mean reproduction numbers are obtain by integrating over the observed infectious domains of the individuals, i.e. integrate \eqn{f} over the intersection of the influence region with the observation region \code{W} (i.e. over \eqn{\{ W \cap b(\bold{s}_j,\delta) \} - \bold{s}_j}) and \eqn{g} over the intersection of the observed infectious period with the observation period \eqn{(t_0;T]} (i.e. over \eqn{(0; \min(T-t_j,\epsilon)]}). (Numerical) Integration is performed exactly as during the fitting of \code{object}, for instance \code{object$control.siaf} is queried if necessary. } \value{ numeric vector of estimated basic reproduction numbers from the fitted model \code{object} corresponding to the rows of \code{newevents} (if supplied) or the original fitted events including events of the prehistory. } \references{ Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} } \author{Sebastian Meyer} \examples{ # load the 'imdepi' data and a model fit data("imdepi") data("imdepifit") R0s <- R0(imdepifit) tapply(R0s, imdepi$events@data[names(R0s), "type"], summary) R0(imdepifit, newevents=marks(imdepi)[1,], trimmed=FALSE) } \keyword{methods} \keyword{univar} surveillance/man/checkResidualProcess.Rd0000644000176000001440000000461512004012230020133 0ustar ripleyusers\name{checkResidualProcess} \alias{checkResidualProcess} \title{ Check the residual process of a fitted \code{twinSIR} or \code{twinstim} } \description{ Transform the residual process (cf. the \code{\link[=residuals.twinstim]{residuals}} methods for classes \code{"twinSIR"} and \code{"twinstim"}) such that the transformed residuals should be uniformly distributed if the fitted model well describes the true conditional intensity function. Graphically check this using \code{\link{ks.plot.unif}}. The transformation for the residuals \code{tau} is \code{1 - exp(-diff(c(0,tau)))} (cf. Ogata, 1988). Another plot inspects the serial correlation between the transformed residuals (scatterplot between u_i and u_{i+1}). } \usage{ checkResidualProcess(object, plot = 1:2, mfrow = n2mfrow(length(plot)), ...) } \arguments{ \item{object}{ an object of class \code{"\link{twinSIR}"} or \code{"\link{twinstim}"}. } \item{plot}{ logical (or integer index) vector indicating if (which) plots of the transformed residuals should be produced. The \code{plot} index 1 corresponds to a \code{\link{ks.plot.unif}} to check for deviations of the transformed residuals from the uniform distribution. The \code{plot} index 2 corresponds to a scatterplot of \eqn{u_i} vs. \eqn{u_{i+1}}. By default (\code{plot = 1:2}), both plots are produced. } \item{mfrow}{ see \code{\link{par}} (and \code{\link{n2mfrow}} for the default choice). } \item{\dots}{ further arguments passed to \code{\link{ks.plot.unif}}. } } \value{ A list (returned invisibly, if \code{plot = TRUE}) with the following components: \describe{ \item{tau}{the residual process obtained by \code{residuals(object)}.} \item{U}{the transformed residuals which should be distributed as U(0,1).} \item{ks}{the result of the \code{ks.test} for the uniform distribution of \code{U}.} } } \references{ Ogata, Y. (1988) Statistical models for earthquake occurrences and residual analysis for point processes. \emph{Journal of the American Statistical Association}, 83, 9-27 } \author{ Sebastian Meyer } \seealso{ \code{\link{ks.plot.unif}} and the \code{\link[=residuals.twinstim]{residuals}}-method for classes \code{"twinSIR"} and \code{"twinstim"}. } \examples{ ## load the twinSIR() fit data("foofit") checkResidualProcess(foofit) } \keyword{dplot} \keyword{htest} surveillance/man/anscombe.residuals.Rd0000644000176000001440000000115711731650466017636 0ustar ripleyusers\name{anscombe.residuals} \alias{anscombe.residuals} \encoding{latin1} \title{Compute Anscombe residuals} \description{ The residuals of \code{m} are transformed to form Anscombe residuals. which makes them approximately standard normal distributed. } \usage{ anscombe.residuals(m, phi) } \arguments{ \item{m}{\code{m} is a glm object of the fit } \item{phi}{\code{phi} is the current estimated over-dispersion} } \value{Standardized Anscombe residuals of \code{m}} \references{McCullagh & Nelder, Generalized Linear Models, 1989} \keyword{regression} %algo.farrington.assign.weights surveillance/man/algo.farrington.assign.weights.Rd0000644000176000001440000000130312164317667022100 0ustar ripleyusers\name{algo.farrington.assign.weights} \alias{algo.farrington.assign.weights} \encoding{latin1} \title{Assign weights to base counts} \description{ Weights are assigned according to the Anscombe residuals } \usage{ algo.farrington.assign.weights(s, weightsThreshold=1) } \arguments{ \item{s}{Vector of standardized Anscombe residuals} \item{weightsThreshold}{A scalar indicating when observations are seen as outlier. In the original Farrington proposal the value was 1 (default value), in the improved version this value is suggested to be 2.58.} } \value{Weights according to the residuals} \seealso{See Also as \code{\link{anscombe.residuals}}} \keyword{regression} surveillance/man/algo.compare.Rd0000644000176000001440000000350511731650466016423 0ustar ripleyusers\name{algo.compare} \alias{algo.compare} \title{Comparison of Specified Surveillance Systems using Quality Values} \description{Comparison of specified surveillance systems using quality values. } \usage{ algo.compare(survResList) } \arguments{ \item{survResList}{a list of survRes objects to compare via quality values.} } \value{ \item{matrix}{Matrix with values from \code{\link{algo.quality}}, i.e. quality values for every surveillance system found in \code{survResults}.} } \seealso{\code{\link{algo.quality}} } \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Let this object be tested from any methods in range = 200:400 range <- 200:400 survRes <- algo.call(disProgObj, control = list( list(funcName = "rki1", range = range), list(funcName = "rki2", range = range), list(funcName = "rki3", range = range), list(funcName = "rki", range = range, b = 3, w = 2, actY = FALSE), list(funcName = "rki", range = range, b = 2, w = 9, actY = TRUE), list(funcName = "bayes1", range = range), list(funcName = "bayes2", range = range), list(funcName = "bayes3", range = range), list(funcName = "bayes", name = "myBayes", range = range, b = 1, w = 5, actY = TRUE,alpha=0.05) ) ) algo.compare(survRes) } \keyword{classif} surveillance/man/twinstim_epidataCS.Rd0000644000176000001440000004040112237160545017637 0ustar ripleyusers\encoding{latin1} \name{twinstim_epidataCS} \alias{epidataCS} \alias{as.epidataCS} \alias{print.epidataCS} \alias{nobs.epidataCS} \alias{head.epidataCS} \alias{tail.epidataCS} \alias{[.epidataCS} \alias{subset.epidataCS} \alias{marks} % the generic 'marks()' is imported from spatstat and % then exported (unchanged) -> documentation required \alias{marks.epidataCS} \alias{summary.epidataCS} \alias{print.summary.epidataCS} \title{ Class for Representing Continuous Space-Time Point Process Data } \description{ Data structure for \strong{c}ontinuous \strong{s}patio-temporal event data, e.g. individual case reports of an infectious disease. Apart from the actual \code{events}, the class simultaneously holds a spatio-temporal grid of endemic covariates (similar to disease mapping) and a representation of the observation region. The \code{"epidataCS"} class is the basis for fitting spatio-temporal epidemic intensity models with the function \code{\link{twinstim}}. } \usage{ as.epidataCS(events, stgrid, W, qmatrix = diag(nTypes), nCircle2Poly = 32L, T = NULL, clipper = c("polyclip", "rgeos")) \method{print}{epidataCS}(x, n = 6L, digits = getOption("digits"), ...) \method{nobs}{epidataCS}(object, ...) \method{head}{epidataCS}(x, n = 6L, ...) \method{tail}{epidataCS}(x, n = 6L, ...) \method{[}{epidataCS}(x, i, j, drop = FALSE) \method{subset}{epidataCS}(x, subset, select, drop = FALSE, ...) \method{marks}{epidataCS}(x, coords = TRUE, ...) \method{summary}{epidataCS}(object, ...) \method{print}{summary.epidataCS}(x, ...) } \arguments{ \item{events}{ a \code{"\linkS4class{SpatialPointsDataFrame}"} of cases with the following obligatory columns (in the \code{events@data} \code{data.frame}): \describe{ \item{time}{time point of event. Will be converted to a numeric variable by \code{as.numeric}. There should be no concurrent events (but see \code{\link{untie}} for an ex post adjustment) and the event times must be covered by \code{stgrid}, i.e. belong to the time interval \eqn{(t_0,T]}, where \eqn{t_0} is \code{min(stgrid$start)} and \code{T} is described below.} \item{tile}{the spatial region (tile) where the event is located. This links to the tiles of \code{stgrid}.} \item{type}{optional type of event in a marked \code{twinstim} model. Will be converted to a factor variable dropping unused levels. If missing, all events will be attribute the single type \code{"1"}.} \item{eps.t}{maximum \emph{temporal} influence radius (e.g. length of infectious period, time to culling, etc.); must be positive and may be \code{Inf}.} \item{eps.s}{maximum \emph{spatial} influence radius (e.g. 100 [km]); must be positive and may be \code{Inf}. A compact influence region mainly has computational advantages, but might also be plausible for specific applications.} } The \code{data.frame} may contain columns with further marks of the events, e.g. sex, age of infected individuals, which may be used as epidemic covariates influencing infectiousness. Note that some auxiliary columns will be added at conversion whose names are reserved: \code{"ID"}, \code{".obsInfLength"}, \code{".bdist"}, \code{".influenceRegion"}, and \code{".sources"}, as well as \code{"start"}, \code{"BLOCK"}, and all endemic covariates' names from \code{stgrid}. } \item{stgrid}{ a \code{\link{data.frame}} describing endemic covariates on a full spatio-temporal region x interval grid (e.g., district x week), which is a decomposition of the observation region \code{W} and period \eqn{t_0,T}. This means that for every combination of spatial region and time interval there must be exactly one row in this \code{data.frame}, that the union of the spatial tiles equals \code{W}, the union of the time intervals equals \eqn{t_0,T}, and that regions (and intervals) are non-overlapping. There are the following obligatory columns: \describe{ \item{tile}{ID of the spatial region (e.g., district ID). It will be converted to a factor variable (dropping unused levels if it already was one).} \item{start, stop}{columns describing the consecutive temporal intervals (converted to numeric variables by \code{as.numeric}). The \code{start} time of an interval must be equal to the \code{stop} time of the previous interval. The \code{stop} column may be missing, in which case it will be auto-generated from the set of \code{start} values and \code{T}.} \item{area}{area of the spatial region (\code{tile}). Be aware that the unit of this area (e.g., square km) must be consistent with the units of \code{W} and \code{events} (as specified in their \code{\link{proj4string}}s, if they have projected coordinates).} } The remaining columns are endemic covariates. Note that the column name \code{"BLOCK"} is reserved (a column which will be added automatically for indexing the time intervals of \code{stgrid}). } \item{W}{ an object of class \code{"\linkS4class{SpatialPolygons}"} representing the observation region. It must have the same \code{proj4string} as \code{events} and all events must be within \code{W}. The function \code{\link[spatstat]{simplify.owin}} from package \pkg{spatstat} may be useful if polygonal operations take too long or memory is limited (see also the \dQuote{Note} section below). } \item{qmatrix}{ a square indicator matrix (0/1 or \code{FALSE}/\code{TRUE}) for possible transmission between the event types. The matrix will be internally converted to \code{logical}. Defaults to an independent spread of the event types, i.e. the identity matrix. } \item{nCircle2Poly}{ accuracy (number of edges) of the polygonal approximation of a circle. } \item{T}{ end of observation period (i.e. last \code{stop} time of \code{stgrid}). Must be specified if the start but not the stop times are supplied in \code{stgrid} (=> auto-generation of \code{stop} times). } \item{clipper}{polygon clipping engine to use for calculating the \code{.influenceRegion}s of events (see the Value section below). Default is the \pkg{polyclip} package (called via \code{\link{intersect.owin}} from package \pkg{spatstat}). In \pkg{surveillance} <= 1.6-0, package \pkg{gpclib} was used, which has a restrictive license. This is no longer supported.} \item{x}{an object of class \code{"epidataCS"} or \code{"summary.epidataCS"}, respectively.} \item{n}{a single integer. If positive, the first (\code{head}, \code{print}) / last (\code{tail}) \code{n} events are extracted. If negative, all but the \code{n} first/last events are extracted. } \item{digits}{minimum number of significant digits to be printed in values.} \item{i,j}{ arguments passed to the \code{\link[=[,SpatialPointsDataFrame-method]{[-method}} for \code{SpatialPointDataFrame}s for subsetting the \code{events} (not \code{stgrid} or \code{W}). Only epidemic covariates can be removed from \code{events} by the \code{j} index. The other components of \code{x} (\code{stgrid}, \ldots) are retained.} \item{drop, \dots}{unused (arguments of the generics). However, the \code{print} method for class \code{"epidataCS"} passes \dots to the \code{\link{print.data.frame}} method.} \item{subset, select}{arguments used to subset the \code{events} from an \code{"epidataCS"} object like in \code{\link{subset.data.frame}}.} \item{coords}{logical indicating if the data frame of event marks returned by \code{marks.epidataCS} should also include the event coordinates. This defaults to \code{TRUE}.} \item{object}{an object of class \code{"epidataCS"}.} } \details{ The function \code{as.epidataCS} is used to generate objects of class \code{"epidataCS"}, which is the data structure required for \code{\link{twinstim}} models. The extraction method for class \code{"epidataCS"} ensures that the subsetted object will be valid, for instance, it updates the auxiliary list of potential transmission paths stored in the object. This \code{[}-method is also the basis for the \code{subset.epidataCS}-method, which is implemented similar to the \code{\link{subset.data.frame}}-method. The \code{print} method for \code{"epidataCS"} prints some metadata of the epidemic, e.g., the observation period, the dimensions of the spatio-temporal grid, the types of events, and the total number of events. By default, it also prints the first \code{n = 6} rows of the \code{events}. } \value{ An object of class \code{"epidataCS"} is a list containing the following components: \item{events}{a \code{"\linkS4class{SpatialPointsDataFrame}"} (see the description of the argument). The input \code{events} are checked for requirements, sorted chronologically and attributed an ID. The columns are in the following order: ID, obligatory event columns, event marks, the columns \code{BLOCK}, \code{start} and endemic covariates copied from \code{stgrid}, and finally, hidden auxiliary columns. The added auxiliary columns are: \describe{ \item{\code{.obsInfLength}}{observed length of the infectious period (being part [0,T]), i.e. \code{pmin(T-time, eps.t)}.} \item{\code{.sources}}{a list of numeric vectors of potential sources of infection (wrt the interaction ranges eps.s and eps.t) for each event. Currently row numbers are used as index, not the ID's.} \item{\code{.bdist}}{minimal distance of the event locations to the polygonal boundary \code{W}.} \item{\code{.influenceRegion}}{a list of influence regions represented by objects of the \pkg{spatstat} class \code{"owin"}. For each event, this is the intersection of \code{W} with a (polygonal) circle of radius \code{eps.s} centered at the event's location, shifted such that the event location becomes the origin. The list has \code{nCircle2Poly} set as an attribute.} } } \item{stgrid}{a \code{data.frame} (see description of the argument). The spatio-temporal grid of endemic covariates is sorted by time interval (indexed by the added variable \code{BLOCK}) and region (\code{tile}). It is a full \code{BLOCK} x \code{tile} grid.} \item{W}{a \code{"\linkS4class{SpatialPolygons}"} object representing the observation region.} \item{qmatrix}{see the above description of the argument. The \code{\link{storage.mode}} of the indicator matrix is set to logical and the \code{dimnames} are set to the levels of the event types.} The \code{nobs}-method returns the number of events. The \code{head} and \code{tail} methods subset the epidemic data using the extraction method (\code{[}), i.e. they return an object of class \code{"epidataCS"}, which only contains (all but) the first/last \code{n} events. For the \code{"epidataCS"} class, the method of the generic function \code{\link[spatstat]{marks}} defined by the \pkg{spatstat} package returns a \code{data.frame} of the event marks (actually also including time and location of the events), disregarding endemic covariates and the auxiliary columns from the \code{events} component of the \code{"epidataCS"} object. The \code{summary} method (which has again a \code{print} method) returns a list of metadata, event data, the tables of tiles and types, a step function of the number of infectious individuals over time (\code{counter}), and the number of potential sources of transmission for each event (\code{nSources}) which is based on the given maximum interaction ranges \code{eps.t} and \code{eps.s}. } \note{ The more detailed the observation region \code{W} is the slower the operations will be. Often it can be advantageous to sacrifice some detail for speed by reducing polygon complexity using, e.g., the Douglas and Peucker (1973) reduction method available at \url{http://MapShaper.org} (Harrower and Bloch, 2006) or as function \code{dp()} in the (slightly outdated) package \pkg{shapefiles}, or by passing by \pkg{spatstat}'s \code{\link[spatstat]{simplify.owin}} procedure. } \references{ Douglas, D. H. and Peucker, T. K. (1973): Algorithms for the reduction of the number of points required to represent a digitized line or its caricature. \emph{Cartographica: The International Journal for Geographic Information and Geovisualization}, \bold{10}, 112-122. Harrower, M. and Bloch, M. (2006): MapShaper.org: A Map Generalization Web Service. \emph{IEEE Computer Graphics and Applications}, \bold{26}(4), 22-27.\cr DOI-Link: \url{http://dx.doi.org/10.1109/MCG.2006.85} Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} Meyer, S. (2010): Spatio-Temporal Infectious Disease Epidemiology based on Point Processes. Master's Thesis, Ludwig-Maximilians-Universit\enc{}{ae}t M\enc{}{ue}nchen.\cr Available as \url{http://epub.ub.uni-muenchen.de/11703/} } \author{ Sebastian Meyer with documentation contributions by Michael H\enc{}{oe}hle and Mayeul Kauffmann. } \seealso{ \code{\link{plot.epidataCS}} for plotting, and \code{\link{animate.epidataCS}} for the animation of such an epidemic. There is also an \code{\link[=update.epidataCS]{update}} method for the \code{"epidataCS"} class. Models for \code{"epidataCS"} can be fitted with \code{\link{twinstim}}. It is also possible to convert the data to \code{\link{epidata}} objects (discrete space) for analysis with \code{\link{twinSIR}} (see \code{\link{as.epidata.epidataCS}}). } \examples{ ## load "imdepi" example data (which is an object of class "epidataCS") data("imdepi") ## take a look at the data object print(imdepi, n=5, digits=2) s <- summary(imdepi) s plot(s$counter, xlab = "Time [days]", ylab="Number of infectious individuals", main=paste("Time series of the number of infectious individuals", "assuming an infectious period of 30 days", sep="\n")) plot(table(s$nSources), xlab="Number of \"close\" infective individuals", ylab="Number of events", main=paste("Distribution of the number of potential sources", "assuming an interaction range of 200 km and 30 days", sep="\n")) ## the summary object contains further information str(s) ## see the help page on the 'imdepi' dataset for more insight ## extraction methods subset the 'events' component ## (thereby taking care of the validity of the epidataCS object, ## for instance the hidden auxiliary column .sources and qmatrix) imdepi[101:200, -match("sex", names(imdepi$events))] tail(imdepi, n=4) # reduce the epidemic to the last 4 events subset(imdepi, type=="B") # only consider event type B ### now reconstruct the object from its components ## (Simplified) observation region (as SpatialPolygons) W <- imdepi$W summary(W) ## events events <- marks(imdepi)[,-1] coordinates(events) <- c("x", "y") # promote to a SpatialPointsDataFrame proj4string(events) <- proj4string(W) # ETRS89 projection (+units=km) summary(events) ## plot W with events plot(W, axes=TRUE) title(xlab="x [km]", ylab="y [km]") points(events, pch=unclass(events$type), cex=0.5, col=unclass(events$type)) legend("topright", legend=levels(events$type), title="Type", pch=1:2, col=1:2) \dontrun{ # similar to using the convenient plot-method for "epidataCS" plot(imdepi, "space") } ## endemic covariates stgrid <- imdepi$stgrid[,-1] ## indicator matrix for possible transmission between event types qmatrix <- imdepi$qmatrix qmatrix ## construct an object of class "epidataCS" from these components myimdepi <- as.epidataCS(events, stgrid, W, qmatrix, nCircle2Poly=16) \dontshow{ ## should be equal as long as the internal structures of "epidataCS" and ## of the embedded classes ("owin", "SpatialPolygons", ...) do not change if (!identical(imdepi, myimdepi)) warning("@Sebastian: update data(imdepi)") } ## take a look into the internal structure of an epidataCS-object str(imdepi, max.level=4) } \keyword{spatial} \keyword{classes} \keyword{manip} surveillance/man/influMen.Rd0000644000176000001440000000112711731650466015627 0ustar ripleyusers\name{influMen} \alias{influMen} \docType{data} \title{Influenza and meningococcal infections in Germany, 2001-2006} \description{ Weekly counts of new influenza and meningococcal infections in Germany 2001-2006. } \usage{data(influMen)} \format{ A \code{disProg} object containing \eqn{312\times 2}{312 x 2} observations starting from week 1 in 2001 to week 52 in 2006. } \source{ Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}. Queried on 25 July 2007. } \examples{ data(influMen) plot(influMen, as.one=FALSE, same.scale=FALSE) } \keyword{datasets} surveillance/man/wrap.algo.Rd0000644000176000001440000000510112034544325015731 0ustar ripleyusers\name{wrap.algo} \alias{wrap.algo} \alias{farrington} \alias{bayes} \alias{rki} \alias{cusum} \alias{glrpois} \alias{glrnb} \alias{outbreakP} %% FIXME: hmm and rogerson are currently undocumented and unexported %\alias{hmm} %\alias{rogerson} \encoding{latin1} \title{Multivariate Surveillance through independent univariate algorithms} \description{ This function takes an \code{sts} object and applies an univariate surveillance algorithm to the time series of each observational unit. } \usage{ %This is the main function wrap.algo(sts, algo, control,control.hook=function(k) return(control),verbose=TRUE,...) %Derived functions fixing the control object and the "algo" argument farrington(sts, control=list(range=NULL, b=3, w=3,reweight=TRUE, verbose=FALSE,alpha=0.01),...) bayes(sts, control = list(range = range, b = 0, w = 6, actY = TRUE,alpha=0.05),...) rki(sts, control = list(range = range, b = 2, w = 4, actY = FALSE),...) cusum(sts, control = list(range=range, k=1.04, h=2.26, m=NULL, trans="standard",alpha=NULL),...) glrpois(sts, control = list(range=range,c.ARL=5, S=1,beta=NULL, Mtilde=1, M=-1, change="intercept",theta=NULL),...) glrnb(sts, control = list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept", theta=NULL,dir=c("inc","dec"), ret=c("cases","value")),...) outbreakP(sts, control=list(range = range, k=100, ret=c("cases","value"),maxUpperboundCases=1e5),...) } \arguments{ \item{sts}{Object of class \code{sts}} \item{algo}{Character string giving the function name of the algorithm to call, e.g. \code{"algo.farrington"}. Calling is done using \code{do.call}.} \item{control}{Control object as list. Depends on each algorithm.} \item{control.hook}{This is a function for handling multivariate objects. This argument is a function function of integer k, which returns the appropriate control object for region k} \item{verbose}{Boolean, if \code{TRUE} then textual information about the process is given} \item{...}{Additional arguments sent to the \code{algo} function.} } \value{ An \code{sts} object with the \code{alarm}, \code{upperbound}, etc. slots filled with the results of independent and univariate surveillance algorithm. } \seealso{ \code{\link{algo.rki}}, \code{\link{algo.farrington}}, \code{\link{algo.cusum}}, \code{\link{algo.glrpois}}, \code{\link{algo.glrnb}}, \code{\link{algo.outbreakP}} for the exact form of the \code{control} object. } \author{M. \enc{Hhle}{Hoehle}} %\examples{ %} \keyword{classif} surveillance/man/findH.Rd0000644000176000001440000000447111731650466015107 0ustar ripleyusers\name{findH} \alias{findH} \alias{hValues} \title{ Find decision interval for given in-control ARL and reference value} \description{ Function to find a decision interval \code{h}* for given reference value \code{k} and desired ARL \eqn{\gamma} so that the average run length for a Poisson or Binomial CUSUM with in-control parameter \eqn{\theta_0}, reference value \code{k} and is approximately \eqn{\gamma}, i.e. \eqn{\Big| \frac{ARL(h^*) -\gamma}{\gamma} \Big| < \epsilon}, or larger, i.e. \eqn{ARL(h^*) > \gamma }. } \usage{ findH(ARL0, theta0, s = 1, rel.tol = 0.03, roundK = TRUE, distr = c("poisson", "binomial"), digits = 1, FIR = FALSE, ...) hValues(theta0, ARL0, rel.tol=0.02, s = 1, roundK = TRUE, digits = 1, distr = c("poisson", "binomial"), FIR = FALSE, ...) } \arguments{ \item{ARL0}{ desired in-control ARL \eqn{\gamma} } \item{theta0}{in-control parameter \eqn{\theta_0}} \item{s}{change to detect, see details} \item{distr}{ \code{"poisson"} or \code{"binomial"} } \item{rel.tol}{relative tolerance, i.e. the search for \code{h}* is stopped if \eqn{\Big| \frac{ARL(h^*) -\gamma}{\gamma} \Big| < } \code{rel.tol} } \item{digits}{the reference value \code{k} and the decision interval \code{h} are rounded to \code{digits} decimal places} \item{roundK}{ passed to \code{findK} } \item{FIR}{if \code{TRUE}, the decision interval that leads to the desired ARL for a FIR CUSUM with head start \eqn{\frac{\code{h}}{2}} is returned } \item{\dots}{ further arguments for the distribution function, i.e. number of trials \code{n} for binomial cdf } } \value{ \code{findH} returns a vector and \code{hValues} returns a matrix with elements \item{theta0}{in-control parameter} \item{h}{decision interval} \item{k}{reference value} \item{ARL}{ARL for a CUSUM with parameters \code{k} and \code{h} } \item{rel.tol}{corresponds to \eqn{\Big| \frac{ARL(h) -\gamma}{\gamma} \Big|} } } \details{ The out-of-control parameter used to determine the reference value \code{k} is specified as: \deqn{\theta_1 = \lambda_0 + s \sqrt{\lambda_0} } for a Poisson variate \eqn{X \sim Po(\lambda)} \deqn{\theta_1 = \frac{s \pi_0}{1+(s-1) \pi_0} } for a Binomial variate \eqn{X \sim Bin(n, \pi) } } \keyword{models} surveillance/man/multiplicity.Rd0000644000176000001440000000304412003251014016555 0ustar ripleyusers\name{multiplicity} \alias{multiplicity} \alias{multiplicity.default} \alias{multiplicity.Spatial} \title{ Count Number of Instances of Points } \description{ The \code{multiplicity} S3-generic function defined in \pkg{surveillance} is intended as a simple auxiliary function, which counts the number of instances of each row in a numeric \code{matrix} (or \code{data.frame}), or of each point in a \code{Spatial} object. Indeed, this just computes the distance matrix of the rows (points), and then counts the number of zeroes in each row. } \usage{ multiplicity(x, ...) \method{multiplicity}{default}(x, ...) \method{multiplicity}{Spatial}(x, ...) } \arguments{ \item{x}{ an object, for which a \code{multiplicity} method is defined, e.g. a numeric matrix (or anything coercible to it by \code{as.matrix}) or an object of class \code{"\linkS4class{SpatialPoints}"}. } \item{\dots}{currently unused.} } \value{ an integer vector containing the number of instances at each point of the object. } \seealso{ Examples of the \code{\link{hagelloch}} data for a specific use of this function. } \examples{ foo <- matrix(c(1,2,3, 2,3,4, 1,2,3, 4,5,6), byrow=TRUE, ncol=3) multiplicity(foo) # the following function determines the multiplicity of rows of a # numeric matrix and returns unique rows with appended multiplicity countunique <- function (matrix) { count <- multiplicity(matrix) unique(cbind(matrix, count)) } countunique(foo) } \keyword{utilities} \keyword{spatial} surveillance/man/twinstim_profile.Rd0000644000176000001440000000631112207660617017446 0ustar ripleyusers\encoding{latin1} \name{twinstim_profile} \alias{profile.twinstim} \title{ Profile Likelihood Computation and Confidence Intervals for \code{twinstim} objects } \description{ Function to compute estimated and profile likelihood based confidence intervals for \code{twinstim} objects. Computations might be cumbersome! } \usage{ \method{profile}{twinstim}(fitted, profile, alpha = 0.05, control = list(fnscale = -1, factr = 10, maxit = 100), do.ltildeprofile=FALSE, ...) } \arguments{ \item{fitted}{ an object of class \code{"twinstim"}. } \item{profile}{ a list with elements being numeric vectors of length 4. These vectors must have the form \code{c(index, lower, upper, gridsize)}. \describe{ \item{\code{index}:}{ index of the parameter to be profiled in the vector \code{coef(fitted)}. } \item{\code{lower, upper}:}{ lower/upper limit of the grid on which the profile log-likelihood is evaluated. Can also be \code{NA} in which case \code{lower/upper} equals the lower/upper bound of the respective 0.3 \% Wald confidence interval (+-3*se). } \item{\code{gridsize}:}{ grid size of the equally spaced grid between lower and upper. Can also be 0 in which case the profile log-likelihood for this parameter is not evaluated on a grid. } } } \item{alpha}{ \eqn{(1-\alpha)\%}{(1-alpha)\%} profile likelihood based confidence intervals are computed. If alpha <= 0, then no confidence intervals are computed. } \item{control}{ control object to use in \code{\link{optim}} for the profile log-likelihood computations. It might be necessary to control \code{maxit} or \code{reltol} in order to obtain results in finite time. } \item{do.ltildeprofile}{If \code{TRUE} calculate profile likelihood as well. This might take a while, since an optimisation for all other parameters has to be performed. Useful for likelihood based confidence intervals. Default: \code{FALSE}. } \item{\dots}{ unused (argument of the generic). } } \value{ list with profile log-likelihood evaluations on the grid and highest likelihood and wald confidence intervals. The argument \code{profile} is also returned. } \author{ Michael \enc{Hhle}{Hoehle} } \examples{ # the following call takes a while \dontrun{ #Load the twinstim model fitted to the IMD data data("imdepifit") #Generate profiling object for a list of parameters for the new model names <- c("h.(Intercept)","e.typeC") coefList <- lapply(names, function(name) { c(pmatch(name,names(coef(imdepifit))),NA,NA,11) }) #Profile object (necessary to specify a more loose convergence #criterion). Speed things up by using do.ltildeprofile=FALSE (the default) prof <- profile(imdepifit, coefList,control=list(fnscale=-1,maxit=50, reltol=0.1,REPORT=1,trace=5),do.ltildeprofile=TRUE) #Plot result for one variable par(mfrow=c(1,2)) for (name in names) { with(as.data.frame(prof$lp[[name]]),matplot(grid,cbind(profile,estimated,wald), type="l",xlab=name,ylab="loglik")) legend(x="bottomleft",c("profile","estimated","wald"),lty=1:3,col=1:3) } } } \keyword{htest} \keyword{methods} \keyword{optimize} \keyword{dplot} surveillance/man/algo.farrington.Rd0000644000176000001440000001222712165031451017134 0ustar ripleyusers\name{algo.farrington} \alias{algo.farrington} \encoding{latin1} \title{Surveillance for a count data time series using the Farrington method.} \description{ % The function takes \code{range} values of the surveillance time series \code{disProgObj} and for each time point uses a GLM to predict the number of counts according to the procedure by Farrington et al. (1996). This is then compared to the observed number of counts. If the observation is above a specific quantile of the prediction interval, then an alarm is raised. % } \usage{ algo.farrington(disProgObj, control=list(range=NULL, b=3, w=3, reweight=TRUE,verbose=FALSE,alpha=0.01,trend=TRUE,limit54=c(5,4), powertrans="2/3", fitFun=c("algo.farrington.fitGLM.fast","algo.farrington.fitGLM", "algo.farrington.fitGLM.populationOffset"))) } \arguments{ \item{disProgObj}{object of class disProgObj (including the \code{observed} and the \code{state} time series.)} \item{control}{Control object \describe{ \item{\code{range}}{Specifies the index of all timepoints which should be tested. If range is \code{NULL} the maximum number of possible weeks is used.} \item{\code{b}}{how many years back in time to include when forming the base counts.} \item{\code{w}}{windows size, i.e. number of weeks to include before and after the current week} \item{\code{reweight}}{Boolean specifying whether to perform reweight step} \item{\code{trend}}{If \code{true} a trend is included and kept in case the conditions in the Farrington et. al. paper are met (see the results). If \code{false} then NO trend is fit.} \item{\code{verbose}}{show extra debugging information} \item{\code{plot}}{shows the final GLM model fit graphically (use History|Recording to see all pictures)} \item{\code{powertrans}}{Power transformation to apply to the data. Use either "2/3" for skewness correction (Default), "1/2" for variance stabilizing transformation or "none" for no transformation} \item{\code{alpha}}{An approximate (two-sided) \eqn{(1-\alpha)\%}\ prediction interval is calculated} \item{\code{limit54}}{To avoid alarms in cases where the time series only has about 0-2 cases the algorithm uses the following heuristic criterion (see Section 3.8 of the Farrington paper) to protect against low counts: no alarm is sounded if fewer than \eqn{cases=5} reports were received in the past \eqn{period=4} weeks. \code{limit54=c(cases,period)} is a vector allowing the user to change these numbers. Note: As of version 0.9-7 The term "last" period of weeks includes the current week - otherwise no alarm is sounded for horrible large numbers if the four weeks before that are too low.} \item{\code{fitFun}}{String containing the name of the fit function to be used for fitting the GLM. The options are \code{algo.farrington.fitGLM.fast} (default) and \code{algo.farrington.fitGLM} or \code{algo.farrington.fitGLM.populationOffset}. See details of \code{\link{algo.farrington.fitGLM}} for more information.} % } } } \details{ The following steps are perfomed according to the Farrington et al. (1996) paper. \enumerate{ \item fit of the initial model and initial estimation of mean and overdispersion. \item calculation of the weights omega (correction for past outbreaks) \item refitting of the model \item revised estimation of overdispersion \item rescaled model \item omission of the trend, if it is not significant \item repetition of the whole procedure \item calculation of the threshold value \item computation of exceedance score } } \value{ An object of class \code{SurvRes}. } \examples{ #Read Salmonella Agona data data("salmonella.agona") #Do surveillance for the last 100 weeks. n <- length(salmonella.agona$observed) #Set control parameters. control <- list(b=4,w=3,range=(n-100):n,reweight=TRUE, verbose=FALSE,alpha=0.01) res <- algo.farrington(salmonella.agona,control=control) #Plot the result. plot(res,disease="Salmonella Agona",method="Farrington") \dontrun{ #Generate random data and convert into sts object set.seed(123) x <- matrix(rpois(1000,lambda=1),ncol=1) sts <- new("sts", observed=x, epoch=1:nrow(x), state=x*0, freq=52) #Compare timing of the two possible fitters for algo.farrington (here using S4) system.time( sts1 <- farrington(sts, control=list(range=c(500:1000), fitFun="algo.farrington.fitGLM.fast"))) system.time( sts2 <- farrington(sts, control=list(range=c(500:1000), fitFun="algo.farrington.fitGLM"))) #Check if results are the same sum(upperbound(sts1) - upperbound(sts2)) } } \author{M. \enc{Hhle}{Hoehle}} \seealso{\code{\link{algo.farrington.fitGLM}},\code{\link{algo.farrington.threshold}}} \keyword{classif} \source{A statistical algorithm for the early detection of outbreaks of infectious disease, Farrington, C.P., Andrews, N.J, Beale A.D. and Catchpole, M.A. (1996), J. R. Statist. Soc. A, 159, 547-563.} surveillance/man/animate.Rd0000644000176000001440000000104511735270236015464 0ustar ripleyusers\name{animate} \alias{animate} \title{ Generic animation of spatio-temporal objects } \description{ Generic function for animation of \R objects. } \usage{ animate(object, ...) } \arguments{ \item{object}{The object to animate.} \item{\dots}{ Arguments to be passed to methods, such as graphical parameters or time interval options for the snapshots. } } \seealso{ The methods \code{\link{animate.epidata}} and \code{\link{animate.epidataCS}} for the animation of epidemics. } \keyword{hplot} \keyword{dynamic} \keyword{spatial} surveillance/man/loglikelihood.Rd0000644000176000001440000000246211770111463016672 0ustar ripleyusers\name{loglikelihood} \alias{loglikelihood} \encoding{latin1} \title{Calculation of the loglikelihood needed in algo.hhh} \description{ Calculates the loglikelihood according to the model specified in \code{designRes}. } \usage{ loglikelihood(theta, designRes) } \arguments{ \item{theta}{vector of parameters \deqn{\theta = (\alpha_1,\ldots,\alpha_m, \bold{\lambda}, \bold{\phi}, \bold{\beta}, \bold{\gamma}_1, \ldots, \bold{\gamma}_m, \bold{\psi}),} where \eqn{\bold{\lambda}=(\lambda_1,\ldots,\lambda_m)}, \eqn{\bold{\phi}=(\phi_1,\ldots,\phi_m)}, \eqn{\bold{\beta}=(\beta_1,\ldots,\beta_m)}, \eqn{\bold{\gamma_1}=(\gamma_{11},\ldots,\gamma_{1,2S_1})}{\bold{\gamma_1}=(\gamma_11,\ldots,\gamma_(1,2S_1))}, \eqn{\bold{\gamma_m}=(\gamma_{m1},\ldots,\gamma_{m,2S_m})}{\bold{\gamma_m}=(\gamma_m1,\ldots,\gamma_(m,2S_m))}, \eqn{\bold{\psi}=(\psi_1,\ldots,\psi_m)}. If the model specifies less parameters, those components are omitted.} \item{designRes}{Result of a call to \code{make.design} } } \value{ Returns the loglikelihood } \seealso{\code{\link{algo.hhh}}} \author{M. Paul, L. Held} \keyword{internal} %\keyword{models} % meanResponse surveillance/man/algo.glrpois.Rd0000644000176000001440000001346011747513452016455 0ustar ripleyusers\name{algo.glrpois} \alias{algo.glrpois} \encoding{latin1} \title{Poisson regression charts} \description{ Poisson regression charts for the monitoring of surveillance time series. } \usage{ algo.glrpois(disProgObj,control = list(range=range,c.ARL=5, mu0=NULL, Mtilde=1, M=-1, change="intercept",theta=NULL, dir=c("inc","dec"),ret=c("cases","value"))) } \arguments{ \item{disProgObj}{object of class \code{disProg} to do surveillance for} \item{control}{A list controlling the behaviour of the algorithm \describe{ \item{\code{range}}{vector of indices in the observed vector to monitor (should be consecutive)} \item{\code{mu0}}{A vector of in-control values of the Poisson distribution with the same length as \code{range}. If \code{NULL} the observed values in \code{1:(min(range)-1)} are used to estimate beta through a generalized linear model. To fine-tune the model one can instead specify \code{mu0} as a list with two components: \describe{ \item{\code{S}}{number of harmonics to include} \item{\code{trend}}{include a term \code{t} in the GLM model} }} \item{\code{c.ARL}}{threshold in the GLR test, i.e. \eqn{c_{\gamma}}{c_gamma}} \item{\code{Mtilde}}{number of observations needed before we have a full rank the typical setup for the "\code{intercept}" and "\code{epi}" charts is \code{Mtilde=1}} \item{\code{M}}{number of time instances back in time in the window-limited approach, i.e. the last value considered is \eqn{\max{1,n-M}}. To always look back until the first observation use \code{M=-1}.} \item{\code{change}}{a string specifying the type of the alternative. Currently the two choices are \code{intercept} and \code{epi}. See the SFB Discussion Paper 500 for details.} \item{\code{theta}}{if \code{NULL} then the GLR scheme is used. If not \code{NULL} the prespecified value for \eqn{\kappa} or \eqn{\lambda} is used in a recursive LR scheme, which is faster. } \item{\code{dir}}{a string specifying the direction of testing in GLR scheme. With \code{"inc"} only increases in \eqn{x} are considered in the GLR-statistic, with \code{"dec"} decreases are regarded. } \item{\code{ret}}{a string specifying the type of \code{upperbound}-statistic that is returned. With \code{"cases"} the number of cases that would have been necassary to produce an alarm or with \code{"value"} the glr-statistic is computed (see below).} } } } \value{ \item{survRes}{ \code{algo.glrpois} returns a list of class \code{survRes} (surveillance result), which includes the alarm value for recognizing an outbreak (1 for alarm, 0 for no alarm), the threshold value for recognizing the alarm and the input object of class disProg. The \code{upperbound} slot of the object are filled with the current \eqn{GLR(n)} value or with the number of cases that are necassary to produce an alarm at any timpoint \eqn{<=n}. Both lead to the same alarm timepoints, but \code{"cases"} has an obvious interpretation.} } % \details{ % This function implements the seasonal Poisson charts based on generalized likelihood ratio (GLR) as described in the SFB Discussion Paper 500. A moving-window generalized likelihood ratio detector is used, i.e. the detector has the form % \deqn{N = \inf\left\{ n : \max_{1\leq k \leq n} \left[ \sum_{t=k}^n \log \left\{ \frac{f_{\theta_1}(x_t|z_t)}{f_{\theta_0}(x_t|z_t)} \right\} \right] \geq c_\gamma \right\} }{N = inf(... >= c_gamma)} % where instead of \eqn{1\leq k \leq n}{1<= k <= n} the GLR statistic is computed for all \eqn{k \in \{n-M, \ldots, n-\tilde{M}+1\}}{k \in \{n-M, \ldots, n-Mtilde+1\}}. To achieve the typical behaviour from \eqn{1\leq k\leq n}{1<= k <= n} use \code{Mtilde=1} and \code{M=-1}. So \eqn{N} is the time point where the GLR statistic is above the threshold the first time: An alarm is given and the surveillance is resetted starting from time \eqn{N+1}. Note that the same \code{c.ARL} as before is used, but if \code{mu0} is different at \eqn{N+1,N+2,\ldots} compared to time \eqn{1,2,\ldots} the run length properties differ. Because \code{c.ARL} to obtain a specific ARL can only be obtained my Monte Carlo simulation there is no good way to update \code{c.ARL} automatically at the moment. Also, FIR GLR-detectors might be worth considering. At the moment, window limited ``\code{intercept}'' charts have not been extensively tested and are at the moment not supported. As speed is not an issue here this doesn't bother too much. Therefore, a value of \code{M=-1} is always used in the intercept charts. } \seealso{ \code{\link{algo.rkiLatestTimepoint}} } \author{M. Hoehle with contributions by V. Wimmer} \examples{ ##Simulate data and apply the algorithm S <- 1 ; t <- 1:120 ; m <- length(t) beta <- c(1.5,0.6,0.6) omega <- 2*pi/52 #log mu_{0,t} base <- beta[1] + beta[2] * cos(omega*t) + beta[3] * sin(omega*t) #Generate example data with changepoint and tau=tau tau <- 100 kappa <- 0.4 mu0 <- exp(base) mu1 <- exp(base + kappa) #Generate data set.seed(42) x <- rpois(length(t),mu0*(exp(kappa)^(t>=tau))) s.ts <- create.disProg(week=1:length(t),observed=x,state=(t>=tau)) #Plot the data plot(s.ts,legend=NULL,xaxis.years=FALSE) #Run cntrl = list(range=t,c.ARL=5, Mtilde=1, mu0=mu0, change="intercept",ret="value",dir="inc") glr.ts <- algo.glrpois(s.ts,control=c(cntrl)) lr.ts <- algo.glrpois(s.ts,control=c(cntrl,theta=0.4)) plot(glr.ts,xaxis.years=FALSE) plot(lr.ts,xaxis.years=FALSE) } \keyword{classif} \source{ Poisson regression charts for the monitoring of surveillance time series (2006), \enc{Hhle}{Hoehle}, M., SFB386 Discussion Paper 500. } % Hook %Rnw file surveillance/man/twinstim_epidataCS_aggregate.Rd0000644000176000001440000001152012154351012021632 0ustar ripleyusers\name{twinstim_epidataCS_aggregate} \alias{epidataCS2sts} \alias{as.epidata.epidataCS} \title{Conversion (aggregation) of \code{"epidataCS"} to \code{"epidata"} or \code{"sts"}} \description{ Continuous-time continuous-space epidemic data stored in an object of class \code{"\link{epidataCS}"} can be aggregated in space or in space and time yielding an object of class \code{"\link{epidata}"} or \code{"\linkS4class{sts}"} for use of \code{\link{twinSIR}} or \code{\link{hhh4}} modelling, respectively. } \usage{ ## aggregation in space and time over 'stgrid' for use of 'hhh4' models epidataCS2sts(object, freq, start, neighbourhood, tiles = NULL, popcol.stgrid = NULL, popdensity = TRUE) ## aggregation in space for use of 'twinSIR' models \method{as.epidata}{epidataCS}(data, tileCentroids, eps = 0.001, ...) } \arguments{ \item{object, data}{an object of class \code{"\link{epidataCS}"}.} \item{freq,start}{see the description of the \code{"\linkS4class{sts}"} class.} \item{neighbourhood}{ binary adjacency or neighbourhood-order matrix of the regions (\code{tiles}). If missing but \code{tiles} is given, a binary adjacency matrix will be auto-generated from \code{tiles} using functionality of the \pkg{spdep} package (see \code{\link{poly2adjmat}}). Since the \code{"neighbourhood"} slot in \code{"\linkS4class{sts}"} is actually optional, \code{neighbourhood=NULL} also works. } \item{tiles}{ object inheriting from \code{"\linkS4class{SpatialPolygons}"} representing the regions in \code{object$stgrid} (column \code{"tile"}). It will become the \code{"map"} slot of the resulting \code{"sts"} object. Its \code{row.names} must match \code{levels(object$stgrid$tile)}. If \code{neighbourhood} is provided, \code{tiles} is optional (not required for \code{hhh4}, but for plots of the resulting \code{"sts"} object). } \item{popcol.stgrid}{ single character or numeric value indexing the column in \code{object$stgrid} which contains the population data (counts or densities, depending on the \code{popdensity} argument). This will become the \code{"populationFrac"} slot (optional).} \item{popdensity}{ logical indicating if the column referenced by \code{popcol.stgrid} contains population densities or absolute counts. } \item{tileCentroids}{ a coordinate matrix of the region centroids (i.e., the result of \code{coordinates(tiles)}). Its row names must match \code{levels(data$stgrid$tile)}. This will be the coordinates used for the \dQuote{population} (i.e., the \code{tiles} from \code{"\link{epidataCS}"}) in the discrete-space \code{\link{twinSIR}} modelling. } \item{eps}{ numeric scalar for breaking tied removal and infection times between different individuals (tiles), which might occur during conversion from \code{"epidataCS"} to \code{"epidata"}. Rather dumb, this is simply done by subtracting \code{eps} from each tied removal time. One should consider other ways of breaking the tied event times. } \item{\dots}{unused (argument of the generic).} } \details{ Some comments on the conversion from \code{"epidataCS"} to \code{"epidata"}: the conversion results into SIS epidemics only, i.e. the at-risk indicator is set to 1 immediately after recovery. A tile is considered infective if at least one individual within the tile is infective, otherwise it is susceptible. The lengths of the infectious periods are taken from \code{data$events$eps.t}. There will be no \code{f} columns in the resulting \code{"epidata"}. These must be generated by a subsequent call to \code{\link{as.epidata}} with desired \code{f}. } \value{ \code{epidataCS2sts}: an object of class \code{"\linkS4class{sts}"} representing the multivariate time-series of the number of cases aggregated over \code{stgrid}. \code{as.epidata.epidataCS}: an object of class \code{"\link{epidata}"} representing an SIS epidemic in form of a multivariate point process (one for each region/\code{tile}). } \author{ Sebastian Meyer } \seealso{ \code{\link{epidata}} and \code{\link{twinSIR}} \code{linkS4class{sts}} and \code{\link{hhh4}}. } \examples{ data("imdepi") load(system.file("shapes", "districtsD.RData", package="surveillance")) ## convert imdepi point pattern into multivariate time series imdepi_sts <- epidataCS2sts(imdepi, freq=12, start=c(2002,1), neighbourhood=NULL, # not needed here tiles=districtsD) ## compare plots of monthly number of cases opar <- par(mfrow=c(2,1)) plot(imdepi, "time", t0.Date=as.Date("2002-01-01"), breaks="months") plot(imdepi_sts, type=observed~time, legend.opts=NULL) par(opar) ## plot number of cases by district plot(imdepi_sts, type=observed~1|unit, labels=FALSE) } \keyword{spatial} \keyword{manip} \keyword{methods} surveillance/man/linelist2sts.Rd0000644000176000001440000000513212040001525016465 0ustar ripleyusers\encoding{latin1} \name{linelist2sts} \alias{linelist2sts} %Internal functions \title{ Convert individual case information based on dates into an aggregated time series } \description{ The function is used to convert an individual line list of cases to an aggregated time series based on date information of the cases. } \usage{ linelist2sts(linelist,dateCol,aggregate.by="1 week",dRange=NULL, startYearFormat=switch(aggregate.by, "1 day"="\%V","7 day"="\%V","1 week"="\%V","1 month"="\%Y","3 month"="\%Y"), startEpochFormat=switch(aggregate.by, "1 day"="\%j","7 day"="\%V","1 week"="\%V","1 month"="\%m","3 month"="\%Q") ) } \arguments{ \item{linelist}{ A \code{data.frame} containing the line list of cases. } \item{dateCol}{A character string stating the column name in \code{linelist} which contain the case data which are to be temporally aggregated. } \item{aggregate.by}{Temporal aggregation level given as a string, see the \code{by} variable of the \link{seq.Date} function for further details. } \item{dRange}{A vector containing the minimum and maximum data to use. If not specified these dates are extracted automatically by taking \code{range(D[,dateCol])}. } \item{startYearFormat}{Strptime compatible format string to use for determining how the date string is generated. Usually the provided options are sufficient.} \item{startEpochFormat}{Strptime compatible format string to use for determining how the date string is generated. Usually the provided options are sufficient.} } \details{ In case aggregation occurs by week the date range is automatically extended such that the starting and ending dates are mondays. This might not be an appropriate way in all situations this function is to be used. } \value{ The function returns an object of class \code{"\linkS4class{sts}"}. The \code{freq} slot might not be appropriate. } \author{ Michael \enc{Hhle}{Hoehle} } \note{ This implementation is still experimental, changes might occur in the future. } \seealso{ See also \code{\link{seq.Date}}. } \examples{ #Load simulated outbreak data. url <- paste("http://www.stat.uni-muenchen.de/~hoehle/", "teaching/moid2011/tutorials/cast-backnow/outbreak.txt",sep="") D <- try(read.table(url,header=TRUE,colClasses=c("integer",rep("Date",3)))) if (!inherits(D, "try-error")) { #Convert line list to an sts object sts <- linelist2sts(D, dateCol="dOnset", aggregate.by="1 day") #Plot the result plot(sts,xaxis.years=FALSE,legend.opts=NULL,xlab="time (days)") } } \keyword{models} \keyword{optimize} surveillance/man/residualsCT.Rd0000644000176000001440000000446612003772154016275 0ustar ripleyusers\name{residualsCT} \alias{residuals.twinSIR} \alias{residuals.twinstim} \title{ Extract Cox-Snell-like Residuals of a Fitted Point Process } \description{ Extract the \dQuote{residual process} (cf. Ogata, 1988) of a fitted point process modell specified through the conditional intensity function, for instance a model of class \code{"\link{twinSIR}"} or \code{"\link{twinstim}"}. The residuals are defined as the fitted cumulative intensities at the event times, and are generalized residuals similar to those discussed in Cox and Snell (1968). } \usage{ \method{residuals}{twinSIR}(object, ...) \method{residuals}{twinstim}(object, ...) } \arguments{ \item{object}{ an object of class \code{"\link{twinSIR}"} or \code{"\link{twinstim}"}. } \item{\dots}{unused (argument of the generic).} } \details{ For objects of class \code{twinstim}, the residuals may already be stored in the object as component \code{object$tau} if the model was fitted with \code{cumCIF = TRUE}. In this case, the \code{residuals} method just extracts these values. Otherwise, the residuals have to be calculated, which is only possible with access to the model environment, i.e. \code{object} must have been fitted with \code{model = TRUE}. The calulcated residuals are then also appended to \code{object} for future use. However, if \code{cumCIF} and \code{model} were both set to true in the \code{object} fit, then it is not possible to calculate the residuals and the method returns an error. } \value{ Numeric vector of length the number of events of the corresponding point process fitted by \code{object}. This is the observed residual process. } \references{ Ogata, Y. (1988) Statistical models for earthquake occurrences and residual analysis for point processes. \emph{Journal of the American Statistical Association}, 83, 9-27 Cox, D. R. & Snell, E. J. (1968) A general definition of residuals. \emph{Journal of the Royal Statistical Society. Series B (Methodological)}, 30, 248-275 } \seealso{ \code{\link{checkResidualProcess}} to graphically check the goodness-of-fit of the underlying model. } \author{ Sebastian Meyer } \examples{ ## Load the twinSIR() fit data("foofit") residuals(foofit) ## these residuals are, e.g., used by checkResidualProcess() checkResidualProcess(foofit) } \keyword{methods} surveillance/man/testSim.Rd0000644000176000001440000000353211731650466015504 0ustar ripleyusers\name{testSim} \alias{testSim} \encoding{latin1} \title{Print xtable for a Simulated Disease and the Summary} \description{Just a test method. } \usage{ testSim(p = 0.99, r = 0.01, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K, range = 200:400) } \arguments{ \item{p}{probability to get a new epidemy at time i if there was one at time i-1, default 0.99} \item{r}{probability to get no new epidemy at time i if there was none at time i-1, default 0.01} \item{length}{number of weeks to model, default 400} \item{A}{amplitude (range of sinus), default = 1} \item{alpha}{parameter to move along the y-axis (negative values not allowed) with alpha > = A, default = 1} \item{beta}{regression coefficient, default = 0} \item{phi}{factor to create seasonal moves (moves the curve along the x-axis), default = 0} \item{frequency}{factor to determine the oscillation-frequency, default = 1} \item{state}{use a state chain to define the status at this timepoint (outbreak or not). If not given a Markov chain is generated by the programme, default NULL} \item{K}{additional weigth for an outbreak which influences the distribution parameter mu, default = 0} \item{range}{range of timepoints to be evaluated by the RKI 1 system, default 200:400.} } \value{ \item{xtable}{one printed latex table and a result plot} } \details{A pointSource epidemy is generated and sent to the RKI 1 system, the quality values for the result are computed and shown as a latex table. Additionally a plot of the result is generated. } \seealso{\code{\link{sim.pointSource}}, \code{\link{algo.call}}, \code{\link{algo.compare}}, \code{\link{plot.survRes}}, \code{\link{compMatrix.writeTable}} } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ testSim(K = 2) testSim(r = 0.5, K = 5) } \keyword{misc} surveillance/man/readData.Rd0000644000176000001440000000345511744234530015557 0ustar ripleyusers\name{readData} \alias{readData} \title{Reading of Disease Data} \description{Reading of disease data. In the package disease data are saved in a file \code{.txt} containing three columns -- the weeknumber (week), the observed number of counts (observed) and a state (state). The data are read using \code{read.table(...,header=T)}, hence the file has to contain a header. } \usage{ readData(abb,week53to52=TRUE,sysPath=TRUE) } \arguments{ \item{abb}{abbreviation of the diseasename.} \item{week53to52}{Boolean indicating whether to convert RKI 53 Weeks System to 52 weeks a year} \item{sysPath}{Boolean, if \code{TRUE} then R automatically looks in the data directory of the \pkg{surveillance} package.} } \value{ \item{disProg}{a object \code{disProg} (disease progress) including a list of the observed and the state chain.} } \details{ This function is only kept for backwards compability. As of 0.9-2 all data should be read with \code{data}. } \seealso{\code{\link{m1}}, \code{\link{m2}}, \code{\link{m3}}, \code{\link{m4}}, \code{\link{m5}}, \code{\link{q1_nrwh}}, \code{\link{q2}}, \code{\link{s1}}, \code{\link{s2}}, \code{\link{s3}}, \code{\link{k1}}, \code{\link{n1}}, \code{\link{n2}}, \code{\link{h1_nrwrp}} } \examples{ readData("m5") #To bring a single vector of counts into a format, which can be #handled by readData. Assume ``counts'' is a vector of counts. counts <- rpois(100,20) counts <- data.frame("week"=1:length(counts),"observed"=counts, "state"=rep(0,length(counts))) write(c("week","observed","state"),file="disease.txt",ncol=3) write(t(as.matrix(counts)),file="disease.txt",ncol=3,append=TRUE) disease <- readData("disease",week53to52=FALSE,sysPath=FALSE) } \keyword{misc} surveillance/man/makePlot.Rd0000644000176000001440000000216011731650466015624 0ustar ripleyusers\name{makePlot} \alias{makePlot} \encoding{latin1} \title{Plot Generation} \description{Just a test method. } \usage{ makePlot(outputpath, data = "k1", method = "rki1", name, disease, range = 157:339) } \arguments{ \item{outputpath}{path for the storage} \item{data}{abbreviation of the disease-file} \item{method}{method to be called} \item{name}{name of the method} \item{disease}{disease name} \item{range}{range to plot} } \details{\code{makePlot} reads the data given in \code{data} using the function \code{readData}, and the data are corrected to 52 weeks, enlarged using \code{enlargeData} and sendt to the surveillance system given in \code{method}. The system result is plotted and stored in \code{outputpath}. } \seealso{\code{\link{readData}}, \code{\link{correct53to52}}, \code{\link{enlargeData}}, \code{\link{algo.call}}, \code{\link{plot.survRes}} } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ makePlot("./", "k1", "rki2", "RKI 2", "Kryptosporidiose") } \keyword{misc} surveillance/man/ks.plot.unif.Rd0000644000176000001440000000444112013461146016373 0ustar ripleyusers\encoding{latin1} \name{ks.plot.unif} \alias{ks.plot.unif} \title{ Plot the ECDF of a uniform sample with Kolmogorov-Smirnov bounds } \description{ This plot function takes a univariate sample that should be tested for a U(0,1) distribution, plots its empirical cumulative distribution function (\code{\link{ecdf}}), and adds a confidence band by inverting the corresponding Kolmogorov-Smirnov test (\code{\link{ks.test}}). The uniform distribution is rejected if the ECDF is not completely inside the confidence band. } \usage{ ks.plot.unif(U, conf.level = 0.95, exact = NULL, col.conf = "gray", col.ref = "gray", xlab = expression(u[(i)]), ylab = "Cumulative distribution") } \arguments{ \item{U}{ numeric vector containing the sample. Missing values are (silently) ignored. } \item{conf.level}{ confidence level for the K-S-test (defaults to 0.95), can also be a vector of multiple levels. } \item{exact}{see \code{\link{ks.test}}.} \item{col.conf}{ colour of the confidence lines. } \item{col.ref}{ colour of the diagonal reference line. } \item{xlab, ylab}{ axis labels. } } \value{ \code{NULL} (invisibly). } \author{ Michael H\enc{}{oe}hle and Sebastian Meyer. The code contains segments originating from the source of the \link{ks.test} function \url{http://svn.r-project.org/R/trunk/src/library/stats/R/ks.test.R}, which is Copyright (C) 1995-2012 The R Core Team available under GPL-2 (or later) and C functionality from \url{http://svn.r-project.org/R/trunk/src/library/stats/src/ks.c}, which is copyright (C) 1999-2009 the R Core Team and available under GPL-2 (or later). Somewhat hidden in their \file{ks.c} file is a statement that part of their code is based on code published in George Marsaglia and Wai Wan Tsang and Jingbo Wang (2003), "Evaluating Kolmogorov's distribution". Journal of Statistical Software, Volume 8, 2003, Issue 18. URL: \url{http://www.jstatsoft.org/v08/i18/}. } \seealso{ \code{\link{ks.test}} for the Kolmogorov-Smirnov test, as well as \code{\link{checkResidualProcess}}, which makes use of this plot function. } \examples{ samp <- runif(99) ks.plot.unif(samp, conf.level=c(0.95, 0.99), exact=TRUE) ks.plot.unif(samp, conf.level=c(0.95, 0.99), exact=FALSE) } \keyword{hplot} \keyword{htest} surveillance/man/algo.call.Rd0000644000176000001440000000521711731650466015712 0ustar ripleyusers\name{algo.call} \alias{algo.call} \title{Query Transmission to Specified Surveillance Systems} \description{Transmission of a object of class disProg to the specified surveillance systems. } \usage{ algo.call(disProgObj, control = list( list(funcName = "rki1", range = range), list(funcName = "rki", range = range, b = 2, w = 4, actY = TRUE), list(funcName = "rki", range = range, b = 2, w = 5, actY = TRUE))) } \arguments{ \item{disProgObj}{object of class disProg, which includes the state chain and the observed} \item{control}{specifies which surveillance systems should be used with their parameters. The parameter \code{funcName} and \code{range} must be specified where \code{funcName} must be the appropriate method function (without '\code{algo.}'). \code{range} defines the timepoints to be evaluated by the actual system. If \code{control} includes \code{name} this name is used in the survRes Object as name.} } \value{ \item{list of survRes Objects}{generated by the specified surveillance systems } } \seealso{\code{\link{algo.rki}}, \code{\link{algo.bayes}}, \code{\link{algo.farrington}}} \examples{ # Create a test object disProg <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Let this object be tested from any methods in range = 200:400 range <- 200:400 survRes <- algo.call(disProg, control = list( list(funcName = "rki1", range = range), list(funcName = "rki2", range = range), list(funcName = "rki3", range = range), list(funcName = "rki", range = range, b = 3, w = 2, actY = FALSE), list(funcName = "rki", range = range, b = 2, w = 9, actY = TRUE), list(funcName = "bayes1", range = range), list(funcName = "bayes2", range = range), list(funcName = "bayes3", range = range), list(funcName = "bayes", name = "myBayes", range = range, b = 1, w = 5, actY = TRUE,alpha=0.05) ) ) # this are some survResObjects survRes[["rki(6,6,0)"]] survRes[["bayes(5,5,1)"]] } \keyword{classif} surveillance/man/shadar.Rd0000644000176000001440000000112411731650466015311 0ustar ripleyusers\name{shadar} \alias{shadar} \title{Salmonella Hadar cases in Germany 2001-2006} \description{Number of salmonella hadar cases in Germany 2001-2006. An increase is seen during 2006 } \usage{data(shadar) } \format{ A \code{disProg} object containing \eqn{295\times 1}{295 x 1} observations starting from week 1 in 2001 to week 35 in 2006. } \source{ Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; Queried on September 2006. Robert Koch Institut, Epidemiologisches Bulletin 31/2006. } \examples{ data(shadar) plot(shadar) } \keyword{datasets} surveillance/man/twinstim_epidataCS_plot.Rd0000644000176000001440000001050212114774035020673 0ustar ripleyusers\name{twinstim_epidataCS_plot} \alias{plot.epidataCS} \title{ Plotting the Events of an Epidemic over Time and Space } \description{ The \code{plot} method for class \code{"epidataCS"} either plots the number of events along the time axis (aggregated over space) using \code{hist()}, or the locations of the events in the observation region \code{W} (aggregated over time). } \usage{ \method{plot}{epidataCS}(x, aggregate = c("time", "space"), subset, ...) } \arguments{ \item{x}{ an object of class \code{"epidataCS"}. } \item{aggregate}{ character, one of \code{"time"} and \code{"space"}. If \code{"time"}, the number of events over time is plotted using the function \code{\link{hist}} (or \code{\link{hist.Date}}). Otherwise, the observation region \code{x$W} and the locations of the events therein are plotted. } \item{subset}{ logical expression indicating a subset of events to consider for plotting: missing values are taken as false. Note that the expression is evaluated in the events data frame \code{x$events@data}, which means that column names can be referred to by name (like in \code{\link{subset.data.frame}}). } \item{\dots}{ The following graphical parameters are available depending on the value of \code{aggregate}. For plotting the number of events over time (\code{aggregate = "time"}): \describe{ \item{t0.Date}{the beginning of the observation period \code{t0 = x$stgrid$start[1]} as a \code{"\link{Date}"} (or anything coercible by \code{as.Date} without further arguments), enabling a nice x-axis using \code{\link{hist.Date}} and sensible \code{breaks} of the histogram (which must also be specified in this case, e.g., \code{"months"}). The event times then equal \code{t0.Date + as.integer(x$events$time - t0)}, i.e. possible fractional parts of the event times are removed (which ensures that using \code{breaks = "months"} or other automatic types always works).} \item{freq}{see \code{\link{hist}}, defaults to \code{TRUE}.} \item{col}{fill colour for the bars of the histogram, defaults to \code{"white"}.} \item{add}{logical (\code{FALSE}) indicating if the histogram should be added to an existing plot window.} \item{xlim,ylim}{\code{NULL} provides automatic axis limits.} \item{xlab,ylab}{axis labels (with sensible defaults).} \item{main}{main title of the plot, defaults to \code{NULL}.} \item{panel.first}{expression that should be evaluated after the plotting window has been set up but before the histogram is plotted. Defaults to adding horizontal grid lines.} \item{\dots}{further arguments passed to \code{\link{hist}} or \code{\link{hist.Date}}, respectively.} } For plotting the locations of the events in the observation region (\code{aggregate = "space"}): \describe{ \item{cex.fun}{function which takes a vector of counts of events at each unique location and returns a (vector of) \code{cex} value(s) for the sizes of the corresponding \code{points}. Defaults to the \code{sqrt()} function, which for the default circular \code{pch=1} means that the area of each point is proportional to the number of events at its location.} \item{points.args}{a list of further arguments passed to \code{\link{points}}. An argument \code{cex} (default: 0.5) in this list multiplies the sizes obtained from \code{cex.fun}.} \item{colTypes}{colour vector for the different event types. Defaults to colours from the \code{\link{rainbow}} palette. They are only used if \code{col} is missing in \code{points.args}.} \item{\dots}{further arguments passed to the \code{plot}-method for \code{"\linkS4class{SpatialPolygons}"}, which draws the observation region \code{x$W}.} } } } \value{ For \code{aggregate = "time"} the data of the histogram (as returned by \code{\link{hist}}), for \code{aggregate = "space"} \code{NULL}, invisibly. } \author{ Sebastian Meyer } \seealso{ \code{\link{animate.epidataCS}} } \examples{ data("imdepi") ## show the occurrence of events along the time axis (-> histogram) plot(imdepi, aggregate = "time", subset = type == "B", main = "Time series of events of the serogroup B finetype") ## show the distribution in space plot(imdepi, aggregate = "space", colTypes = 1:2) } \keyword{hplot} \keyword{methods} \keyword{spatial} surveillance/man/residuals.ah.Rd0000644000176000001440000000117611731650466016440 0ustar ripleyusers\name{residuals.ah} \alias{residuals.ah} \alias{residuals.ahg} \encoding{latin1} \title{Residuals from a HHH model} \description{ Extracts model residuals from a \code{ah} or \code{ahg} object. } \usage{ \method{residuals}{ah}(object, type=c("deviance","pearson"), \dots) } \arguments{ \item{object}{object of class \code{ah} or \code{ahg} } \item{type}{the type of residuals which should be returned. The alternatives are "deviance" (default) and "pearson"} \item{\dots}{not really used} } \value{ matrix with residuals for each region and time point. } \details{this function is still experimental} \keyword{models} surveillance/man/hagelloch.Rd0000644000176000001440000001303612061353416015772 0ustar ripleyusers\name{hagelloch} \alias{hagelloch} \alias{hagelloch.df} \encoding{latin1} \title{1861 measles epidemic in the city of Hagelloch, Germany} \description{Data on the 188 cases in the measles outbreak among children in the German city of Hagelloch (near T\enc{}{ue}bingen) 1861. The data were originally collected by Dr. Albert Pfeilsticker and re-analysed by Dr. Heike Oesterle. } \usage{ data("hagelloch") } \format{ Loading the data in \code{hagelloch} gives two objects: \code{hagelloch} and \code{hagelloch.df}. The former is an \code{epidata} object for use with \code{twinSIR} containing the entire process history of outbreak in the population of 188 children. The latter is a simple \code{data.frame} containing a single line with individual information of each infected child. The covariate information in either \code{hagelloch} or \code{hagelloch.df} are as follows: \describe{ \item{PN}{patient no.} \item{NAME}{patient name} \item{FN}{family name} \item{HN}{House number.} \item{AGE}{Age in years} \item{SEX}{Sex of the individual (unknown,male,female)} \item{PRO}{Date of prodromes, formatted as \code{Date}} \item{ERU}{Date of rash, formatted as \code{Date}} \item{CL}{Class (preschool, 1st class, 2nd class)} \item{DEAD}{Date of death (as \code{Date}), if not available then \code{NA}} \item{IFTO}{no. of patient who most likely insource of infection (0 = unknown)} \item{SI}{serialinterval = no of days between dates of prodromes between infection source and infected person} \item{C}{complications (no complicatons, bronchopneumonia, severe bronchitis, lobar pneumonia, pseudocroup, cerebral edema)} \item{PR}{duration of prodromes in days} \item{CA}{number of cases in family} \item{NI}{number of initial cases} \item{GE}{generation number of case} \item{TD}{day of max. fever (days after rush)} \item{TM}{man fever (grad celsius)} \item{HNX}{x coordinate of house (in meters). Scaling in metres is obtained by taking original data multiplied by 2.5 (see details in Neal and Roberts (2004))} \item{HNY}{y coordinate of house (in meters). See also the above description of \code{HNX}.} \item{tS}{Time of symptoms (here: prodomes) in days after the start of the epidemic 30 Oct 1861. This corresponds to the time of the "Exposed"->"Infectious" transition in an SEIR model.} \item{tQ}{Time upon which the rash first appears.} \item{tD}{Time of death, if available, in day after start of the epidemic.} \item{tI}{Time at which individual becomes infected. This corresponds to the transition from state "Susceptible" to "Exposed" in an "SEIR" model. Actually this time is unknown, but we use \deqn{I_i = S_i - d_1,}{I[i] = S[i] - d[1],} where \eqn{d_1=1}{d[1]=1} is the latency period. See Neal and Roberts (2004) for details.} \item{tR}{Time at which the infectious period of the individual ends, i.e. time at which the individual moves from "Infectious" to "Recovered". This unknown time is calculated as \deqn{R_i = \min{D_i,Q_i+d_0},}{R[i] = min(D[i],Q[i]+d[0]),} where as in Section 3.1 of Neal and Roberts (2004) we use \eqn{d_0=3}{d0=3}.} } Note that the \code{tS},\code{tQ},\code{tD},\code{tI} and \code{tR} entries are only available in the \code{hagelloch} object. They describe the transition of individual in an Susceptible-Exposed-Infectious-Revovered (SEIR) model. Note that in order to avoid ties in the event times resulting from the daily interval censoring, a \eqn{U(0,1)} distributed random variable has been subtracted from \code{tS}, \code{tD} and \code{tQ} in order to break ties. } \source{ Thanks to Peter J. Neal, University of Manchester, for providing us with these data, which he again became from Niels Becker, Australian National University. To cite the data, the main references are Pfeilsticker (1863) and Oesterle (1992). } \examples{ data("hagelloch") #Data frame with the original data documented in Oesterle (1992) head(hagelloch.df) #Represented as epidata object (s <- summary(hagelloch)) ### Use data.frame to illustrate the basics #Show case locations as in Neal & Roberts (different scaling) using #the data.frame (promoted to a SpatialPointsDataFrame) coordinates(hagelloch.df) <- c("HNX","HNY") plot(hagelloch.df,xlab="x [m]",ylab="x [m]",pch=15,axes=TRUE, cex=sqrt(multiplicity(hagelloch.df))) #Epicurve hist(as.numeric(hagelloch.df$tS),xlab="Time (days)",ylab="Cases",main="") ### SIR model information for population & individuals plot(s, col=c("green","red","darkgray")) stateplot(s, id=c("187")) \dontrun{ #Show a dynamic illustration of the spread of the infection animate(hagelloch,time.spacing=0.1,legend.opts=list(x="topleft"),sleep=1/100) } } \references{ Pfeilsticker, A. (1863). Beitr\enc{}{ae}ge zur Pathologie der Masern mit besonderer Ber\enc{}{ue}cksichtgung der statistischen Verh\enc{}{ae}ltnisse, M.D. Thesis, Eberhard-Karls Universit\enc{}{ae}t, T\enc{}{ue}bingen. Available as \url{http://www.archive.org/details/beitrgezurpatho00pfeigoog}. Oesterle, H. (1992). Statistische Reanalyse einer Masernepidemie 1861 in Hagelloch, M.D. Thesis, Eberhard-Karls Universit\enc{}{ae}at, T\enc{}{ue}bingen. Neal, P. J. and Roberts, G. O (2004). Statistical inference and model selection for the 1861 Hagelloch measles epidemic, Biostatistics 5(2):249-261 } \seealso{\code{\link{twinSIR}}, \code{\link{epidata}}} \keyword{datasets} surveillance/man/hhh4_validation.Rd0000644000176000001440000001431412166471241017114 0ustar ripleyusers\encoding{latin1} \name{hhh4_validation} \alias{oneStepAhead} \alias{scores} \title{ Predictive Model Assessment for HHH4 models } \description{ The function \code{oneStepAhead} computes successive one-step-ahead predictions for a (random effects) HHH model fitted by \code{\link{hhh4}}. The function \code{scores} computes a number of (strictly) proper scoring rules based on the one-step-ahead predictions. See Paul and Held (2011) for further details. } \usage{ oneStepAhead(result, tp, which.start = c("current", "final", "none"), keep.estimates = FALSE, verbose = TRUE) scores(object, unit = NULL, sign = FALSE, individual = FALSE) } \arguments{ \item{result}{Fitted \code{\link{hhh4}} model object of class \code{"ah4"}.} \item{tp}{numeric vector of length 1 or 2. One-step-ahead predictions are computed from time points \code{tp[1]}, \ldots, \code{tp[2]} (yielding predictions for time points \code{tp[1]+1}, ...), where \code{tp[2]} defaults to \code{nrow(result$stsObj)}. } \item{which.start}{ Which initial values should be used when successively refitting the model for subsets of the data (up to time point \code{tp[1]}, up to \code{tp[1]+1}, ...)? Default (\code{"current"}) is to use the fitted parameters from the previous time point. Alternatively, \code{"final"} means to always use the fitted values from \code{result} as initial values for the model update, and \code{"none"} means to use \code{result} all along time (no updating at all). The latter case runs much faster but reduces to comparing the fitted means from \code{result} with the observed data (no one-step-ahead predictions). } \item{keep.estimates}{ logical indicating if parameter estimates and log-likelihoods from the successive fits should be returned. } \item{verbose}{ logical indicating if additional information is to be printed during the computations. For the sequential \code{hhh4} model updates, a verbosity of \code{verbose-1} is used if there is more than one time point to predict, otherwise \code{verbose}. } \item{object}{result of \code{oneStepAhead}.} \item{unit}{integer specifying a specific unit for which the scores are computed. If \code{NULL} all units are considered.} \item{sign}{logical indicating if the sign of the difference between the observed counts and corresponding predictions should be returned.} \item{individual}{logical indicating if individual scores for all units or a mean score over all units should be returned.} } \value{ \code{oneStepAhead} returns a list with \item{pred}{matrix with one-step-ahead predictions} \item{psi}{overdispersion parameter on log-scale in case of a negative binomial model and \code{NULL} otherwise} \item{observed}{matrix with observed counts at the predicted time-points} \item{allConverged}{logical indicating if all successive fits converged} If \code{keep.estimates = TRUE}, the following elements will be non-\code{NULL}: \item{coefficients}{matrix with estimated regression parameters from the successive fits} \item{Sigma.orig}{matrix with estimated variance parameters from the successive fits} \item{logliks}{matrix with columns \code{"loglikelihood"} and \code{"margll"} with their obvious meanings} \code{scores} returns a matrix with the computed logarithmic, ranked probability, squared error, Dawid-Sebastiani, and normalized squared error score as columns. } \references{ Czado, C., Gneiting, T. and Held, L. (2009) Predictive model assessment for count data. Biometrics, \bold{65}, 1254--1261 Paul, M. and Held, L. (2011) Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts. Statistics in Medicine, \bold{30}, 1118--1136 } \author{ Michaela Paul and Sebastian Meyer } \seealso{ \code{vignette{"hhh4"}} and \code{\link{hhh4}}. } \examples{ ## univariate salmonella agona data data(salmonella.agona) # convert to sts class salmonella <- disProg2sts(salmonella.agona) # generate formula for temporal and seasonal trends f.end <- addSeason2formula(f = ~ 1 + t, S=1, period=52) model1 <- list(ar = list(f = ~ 1), end = list(f =f.end), family = "NegBin1") # run model result <- hhh4(salmonella, model1) # do one-step-ahead predictions for the last 5 weeks pred <- oneStepAhead(result, nrow(salmonella)-5) # compute mean scores colMeans(scores(pred)) \dontrun{ ###################################################################### # Do one-step-ahead predictions for the models from the Paul & Held # (2011) paper for the influenza data from Bavaria and Baden-Wuerttemberg # (this takes some time!) ###################################################################### ## see ?hhh4 for a specification of the models ## do 1-step ahead predictions for the last two years tp <- nrow(fluBYBW)-2*52 val_A0 <- oneStepAhead(res_A0,tp=tp) val_B0 <- oneStepAhead(res_B0,tp=tp) val_C0 <- oneStepAhead(res_C0,tp=tp) val_A1 <- oneStepAhead(res_A1,tp=tp) val_B1 <- oneStepAhead(res_B1,tp=tp) val_C1 <- oneStepAhead(res_C1,tp=tp) val_A2 <- oneStepAhead(res_A2,tp=tp) val_B2 <- oneStepAhead(res_B2,tp=tp) val_C2 <- oneStepAhead(res_C2,tp=tp) val_D <- oneStepAhead(res_D,tp=tp) ################################## ## compute scores ################################ #scores vals <- ls(pattern="val_") nam <- substring(vals,first=5,last=6) uni <- NULL indiv <- TRUE scores_i <- list() meanScores <- NULL for(i in seq(along.with=vals)){ sc <- scores(get(vals[i]),unit=uni, individual=indiv) scores_i[[i]] <- sc meanScores <- rbind(meanScores,colMeans(sc)) } names(scores_i) <- nam rownames(meanScores) <- nam ##comparison with best model B2 compareWithBest <- function(best, whichModels, whichScores=1:3, nPermut=9999, seed=1234){ set.seed(seed) pVals <- NULL for(score in whichScores){ p <- c() for(model in whichModels){ if(model==best) p <- c(p,NA) else p <- c(p,permutationTest(scores_i[[model]][,score],scores_i[[best]][,score], plot=TRUE,nPermutation=nPermut)$pVal.permut) } pVals <- cbind(pVals,p) } return(pVals) } pVals_flu <- compareWithBest(best=6, whichModels=1:10,seed=2059710987) rownames(pVals_flu) <- nam } } \keyword{ts} \keyword{regression} surveillance/man/stcd.Rd0000644000176000001440000000733312014370051014774 0ustar ripleyusers\name{stcd} \alias{stcd} \encoding{latin1} \title{Spatio-temporal cluster detection} \description{ Shiryaev-Roberts based prospective spatio-temporal cluster detection as in Assuncao & Correa (2009). } \usage{ stcd(x, y,t,radius,epsilon,areaA, areaAcapBk, threshold, cusum=FALSE) } \arguments{ \item{x}{Vector containing spatial x coordinate of the events.} \item{y}{Vector containing spatial y coordinate of the events.} \item{t}{Vector containing the time points of the events. It is assumed that the vector is sorted (early->last).} \item{radius}{Radius of the cluster to detect.} \item{epsilon}{Relative change of event-intensity within the cluster to detect. See reference paper for an explicit definition.} \item{areaA}{Area of the observation region A (single number) -- This argument is currently ignored!} \item{areaAcapBk}{Area of A \ B(s_k,rho) for all k=1,\ldots,n (vector). This argument is currently ignored!} \item{threshold}{Threshold limit for the alarm and should be equal to the desired Average-Run-Length (ARL) of the detector.} \item{cusum}{(logical) If \code{FALSE} (default) then the Shiryaev-Roberts detector is used as in the original article by Assuncao & Correa (2009), i.e. \eqn{R_n = \sum_{k=1}^n \Lambda_{k,n}}, where \eqn{\Lambda_{k,n}} denotes the likelihood ratio between the in-control and out-of control model. If \code{TRUE}, CUSUM test statistic is used instead. Here, \deqn{R_n = \max_{1\leq k \leq n} \Lambda_{k,n}}. Note that this has implications on what threshold will sound the alarm (CUSUM threshold needs to be smaller).} } \details{ Shiryaev-Roberts based spatio-temporal cluster detection based on the work in Assuncao and Correa (2009). The implementation is based on C++ code originally written by Marcos Oliveira Prates, UFMG, Brazil and provided by Thais Correa, UFMG, Brazil during her research stay in Munich. This stay was financially supported by the Munich Center of Health Sciences. Note that the vectors \code{x}, \code{y} and \code{t} need to be of the same length. Furthermore, the vector \code{t} needs to be sorted (to improve speed, the latter is not verified within the function). The current implementation uses a call to a C++ function to perform the actual computations of the test statistic. The function is currently experimental -- data type and results may be subject to changes. } \value{A list with three components \item{R}{A vector of the same length as the input containing the value of the test statistic for each observation.} \item{idxFA}{Index in the x,y,t vector causing a possible alarm. If no cluster was detected, then a value of \code{-1} is returned here.} \item{idxCC}{index in the x,y,t vector of the event containing the cluster. If no cluster was detected, then a value of \code{-1} is returned here.} } \references{ Assuncao, R. and Correa, T. (2009), Surveillance to detect emerging space-time clusters, Computational Statistics & Data Analysis, 53(8):2817-2830. } \examples{ if (require("splancs")) { # load the data from package "splancs" data(burkitt, package="splancs") # order the times burkitt <- burkitt[order(burkitt$t), ] #Parameters for the SR detection epsilon <- 0.5 # relative change within the cluster radius <- 20 # radius threshold <- 161 # threshold limit res <- stcd(x=burkitt$x, y=burkitt$y, t=burkitt$t, radius=radius, epsilon=epsilon, areaA=1, areaAcapBk=1, threshold=threshold) #Index of the event which.max(res$R >= threshold) } } \author{M. O. Prates, T. Correa and M. \enc{Hhle}{Hoehle}} \keyword{cluster} surveillance/man/algo.outbreakP.Rd0000644000176000001440000001215312003567022016714 0ustar ripleyusers\encoding{latin1} \name{algo.outbreakP} \alias{algo.outbreakP} \alias{calc.outbreakP.statistic} \title{Semiparametric surveillance of outbreaks} \description{ Frisen and Andersson (2009) method for semiparametric surveillance of outbreaks } \usage{ algo.outbreakP(disProgObj, control = list(range = range, k=100, ret=c("cases","value"),maxUpperboundCases=1e5)) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain).} \item{control}{A list controlling the behaviour of the algorithm \describe{ \item{\code{range}}{determines the desired time-points which should be monitored. Note that it is automatically assumed that ALL other values in \code{disProgObj} can be used for the estimation, i.e. for a specific value \code{i} in \code{range} all values from 1 to \code{i} are used for estimation.} \item{\code{k}}{The threshold value. Once the outbreak statistic is above this threshold \code{k} an alarm is sounded.} \item{\code{ret}}{a string specifying the type of \code{upperbound}-statistic that is returned. With \code{"cases"} the number of cases that would have been necessary to produce an alarm (NNBA) or with \code{"value"} the outbreakP-statistic is computed (see below).} \item{\code{maxUpperboundCases}}{Upperbound when numerically searching for NNBA. Default is 1e5.} } } } \value{ \item{survRes}{ \code{algo.outbreakP} gives a list of class \code{survRes} which includes the vector of alarm values for every time-point in \code{range}, the vector of threshold values for every time-point in \code{range}. } } \details{ A generalized likelihood ratio test based on the Poisson distribution is implemented where the means of the in-control and out-of-control states are computed by isotonic regression. \deqn{OutbreakP(s) = \prod_{t=1}^s \left( \frac{\hat{\mu}^{C1}(t)}{\hat{\mu}^D(t)} \right)^{x(t)} }, where \eqn{\hat{\mu}^{C1}(t)} is the estimated mean obtained by uni-modal regression under the assumption of one change-point and \eqn{\hat{\mu}^D(t)} is the estimated result when there is no change-point (i.e. this is just the mean of all observations). Note that the contrasted hypothesis assume all means are equal until the change-point, i.e. this detection method is especially suited for detecting a shift from a relative constant mean. Hence, this is less suited for detection in diseases with strong seasonal endemic component. Onset of influenza detection is an example where this method works particular well. In case \code{control$ret == "cases"} then a brute force numerical search for the number needed before alarm (NNBA) is performed. That is, given the past observations, whats the minimum number which would have caused an alarm? Note: Computing this might take a while because the search is done by sequentially increasing/decreasing the last observation by one for each time point in \code{control$range} and then calling the workhorse function of the algorithm again. The argument \code{control$maxUpperboundCases} controls the upper limit of this search (default is 1e5). Currently, even though the statistic has passed the threshold, the NNBA is still computed. After a few time instances what typically happens is that no matter the observed value we would have an alarm at this time point. In this case the value of NNBA is set to \code{NA}. Furthermore, the first time point is always \code{NA}, unless \code{k<1}. } \source{ The code is an extended R port of the Java code by Marianne \enc{Frisn}{Frisen} and Linus \enc{Schiler}{Schioeler} from the CASE project available under the GNU GPL License v3. See https://smisvn.smi.se/case/ for further details on the CASE project. A manual on how to use an Excel implementation of the method is available at \url{http://www.hgu.gu.se/item.aspx?id=16857}. The R code contains e.g. the search for NNBA (see details). } \author{M. \enc{Hhle}{Hoehle} -- based on Java code by Frisen and \enc{Schiler}{Schioeler}} \references{ \enc{Frisn}{Frisen}, Andersson and \enc{Schiler}{Schioeler} (2009), Robust outbreak surveillance of epidemics in Sweden, Statistics in Medicine, 28(3):476-493. \enc{Frisn}{Frisen} and Andersson (2009) Semiparametric Surveillance of Monotonic Changes, Sequential Analysis 28(4):434-454. } \examples{ #Use data from outbreakP manual (http://www.hgu.gu.se/item.aspx?id=16857) y <- matrix(c(1,0,3,1,2,3,5,4,7,3,5,8,16,23,33,34,48),ncol=1) #Generate sts object with these observations mysts <- new("sts", observed=y, epoch=1:length(y), alarm=y*0, start=c(2000,1), freq=52) #Run the algorithm and present results #Only the value of outbreakP statistic upperbound(outbreakP(mysts, control=list(range=1:length(y),k=100, ret="value"))) #Graphical illustration with number-needed-before-alarm (NNBA) upperbound. res <- outbreakP(mysts, control=list(range=1:length(y),k=100, ret="cases")) plot(res,dx.upperbound=0,lwd=c(1,1,3),legend.opts=list(legend=c("Infected", "NNBA","Outbreak","Alarm"),horiz=TRUE)) } \keyword{classif} surveillance/man/hhh4.Rd0000644000176000001440000004041412221273155014676 0ustar ripleyusers% hhh4 \encoding{latin1} \name{hhh4} \alias{hhh4} % FIXME: functions without documentation atm \alias{permutationTest} \alias{pit} \title{Random effects HHH model fit as described in Paul and Held (2011)} \description{ Fits a Poisson or negative binomial model with conditional mean \deqn{\mu_{it} = \lambda_{it} y_{i,t-1} + \phi_{it} \sum_{j\neq i} w_{ji} y_{j,t-1} + e_{it} \nu_{it} }{% \mu_it = \lambda_it y_i,t-1 + \phi_it sum_(j != i) w_ji y_j,t-1 + e_it \nu_it } containing epidemic and endemic components to a multivariate time series of counts. In the case of a negative binomial model, the conditional variance is \eqn{\mu_{it}(1+\psi\mu_{it})}{\mu_it(1+\psi*\mu_it)} with overdispersion parameter \eqn{\psi}. The three unknown quantities of the mean \eqn{\mu_{it}}{\mu_it} \itemize{ \item \eqn{\lambda_{it}}{\lambda_it} in the autoregressive (\code{ar}) component, \item \eqn{\phi_{it}}{\phi_it} in the neighbor-driven (\code{ne}) component, and \item \eqn{\nu_{it}}{\nu_it} in the endemic (\code{end}) component, } are decomposed additively on the log scale, \eqn{w_{ji}}{w_ji} are known weights, and \eqn{e_{it}}{e_it} is a (multiplicative) offset. The linear predictors may contain random effects. } \usage{ hhh4(stsObj, control = list( ar = list(f = ~ -1, lag = 1, weights = NULL, initial = NULL ), ne = list(f = ~ -1, lag = 1, weights = neighbourhood(stsObj), initial = NULL ), end = list(f = ~ 1, offset = 1, initial = NULL ), family = c("Poisson","NegBin1","NegBinM"), subset = 2:nrow(stsObj), optimizer = list(stop = list(tol=1e-5, niter=100), regression = list(method="nlminb"), variance = list(method="nlminb")), verbose = FALSE, start = list(fixed=NULL, random=NULL, sd.corr=NULL), data = data.frame(t = epoch(stsObj)-1), keep.terms = FALSE ), check.analyticals = FALSE ) } \arguments{ \item{stsObj}{object of class \code{"\linkS4class{sts}"} containing the multivariate count data time series} \item{control}{control object, which is a list containing several components: \describe{ \item{\code{ar}}{ Model for the autoregressive component given as list with the following components: \describe{ \item{f = ~ -1}{a formula specifying \eqn{\log(\lambda_{it})}{log(\lambda_it)}} \item{lag = 1}{autoregression on \eqn{y_{i,t-lag}}{y_i,t-lag} (currently only \code{lag = 1} is possible)} \item{weights = NULL}{optional weights, only used if model is a contact matrix (currently not implemented)} \item{initial = NULL}{vector with initial values for parameters if \code{f = ~1} (not really used ATM)} } } \item{\code{ne}}{Model for the neighbor-driven component given as list with the following components: \describe{ \item{f = ~ -1}{a formula specifying \eqn{\log(\phi_{it})}{log(\phi_it)}} \item{lag = 1}{autoregression on \eqn{y_{j,t-lag}}{y_j,t-lag} (currently only \code{lag = 1} is possible)} \item{weights = neighbourhood(stsObj)}{ neighbourhood weights \eqn{w_{ji}}{w_ji}. By default, the neighbourhood slot of \code{stsObj} is used. Time-varying weights are possible by specifying an array of \code{dim()} \code{c(nUnits, nUnits, nTime)}, where \code{nUnits=ncol(stsObj)} and \code{nTime=nrow(stsObj)}.} \item{initial = NULL}{vector with initial values for parameter if \code{f = ~1} (not really used ATM)} } } \item{\code{end}}{Model for the endemic component given as list with the following components \describe{ \item{f = ~ 1}{a formula specifying \eqn{\log(\nu_{it})}{log(\nu_it)}} \item{offset = 1}{optional multiplicative offset \eqn{e_{it}}{e_it}} \item{initial = NULL}{vector with initial values for parameter if \code{f = ~1} (not really used ATM)} } } \item{\code{family}}{Distributional family -- either \code{"Poisson"}, or the Negative Binomial distribution with one common overdispersion parameter for all units (\code{"NegBin1"}) or an overdispersion parameter for each unit (\code{"NegBinM"}). } \item{\code{subset}}{Typically \code{2:nrow(obs)} if model contains autoregression} \item{\code{optimizer}}{a list of three lists of control arguments. The \code{"stop"} list specifies two criteria for the outer optimization of regression and variance parameters: the relative \code{tol}erance for parameter change using the criterion \code{max(abs(x[i+1]-x[i])) / max(abs(x[i]))}, and the maximum number \code{niter} of outer iterations. Control arguments for the single optimizers are specified in the lists named \code{"regression"} and \code{"variance"}. \code{method="nlminb"} is the default optimizer for both (taking advantage of the analytical Fisher information matrices), however, the \code{method}s from \code{\link{optim}} may also be specified (as well as \code{"\link{nlm}"} but that one is not recommended here). Especially for the variance updates, Nelder-Mead optimization (\code{method="Nelder-Mead"}) is an attractive alternative. All other elements of these two lists are passed as \code{control} arguments to the chosen \code{method}, e.g., if \code{method="nlminb"} adding \code{iter.max=50} increases the maximum number of inner iterations from 20 (default) to 50. } \item{\code{verbose}}{Logical if additional information is to be printed during the computations} \item{\code{start}}{List with initials, overrides any initial values in formulas (this is currently the only way to specify initial values)} \item{\code{data}}{a data frame or, more generally, a named list with covariates that are to be included as fixed effects (see \code{\link{fe}}) in any of the 3 component formulae. By default, the time variable \code{t} is available and used for seasonal effects created by \code{\link{addSeason2formula}}. In general, covariates in this list can be either vectors of length \code{nrow(stsObj)} interpreted as time-varying but common across all units, or matrices of the same dimension as the disease counts \code{observed(stsObj)}. } \item{\code{keep.terms}}{ Logical if the terms object used in the fit is to be returned } } } \item{check.analyticals}{logical (or a subset of \code{c("numDeriv", "maxLik")}), indicating if (how) the implemented analytical score vector and Fisher information matrix should be checked against numerical derivatives at the parameter starting values, using the packages \pkg{numDeriv} and/or \pkg{maxLik}. If activated, \code{hhh4} will return a list containing the analytical and numerical derivatives for comparison (no ML estimation will be performed). This is mainly intended for internal use by the package developers.} } \value{Returns an object of class \code{ah4} with elements \item{coefficients}{named vector with estimated (regression) parameters of the model} \item{se}{estimated standard errors (for regression parameters)} \item{cov}{covariance matrix (for regression parameters)} \item{Sigma}{estimated variance components for random effects} \item{Sigma.orig}{estimated variance components on internal scale used for optimization } \item{Sigma.cov}{ inverse of (minus Hessian matrix) for variance components } \item{call}{ the matched call } \item{dim}{ vector with number of fixed and random effects in the model } \item{loglikelihood}{(penalized) loglikelihood evaluated at the MLE} \item{margll}{ (approximate) log marginal likelihood should the model contain random effects } \item{convergence}{logical. Did optimizer converge?} \item{fitted.values}{fitted mean values \eqn{\mu_{i,t}}{\mu_it}} \item{control}{control object of the fit} \item{terms}{ the terms object used in the fit if \code{keep.terms = TRUE} and \code{NULL} otherwise} \item{stsObj}{ the supplied \code{stsObj} } \item{lag}{ specified lag of the autoregression, ATM always \eqn{= 1} } \item{nObs}{number of observations used for fitting the model} \item{nTime}{ number of time points used for fitting the model } \item{nUnit}{ number of units (e.g. areas) used for fitting the model } } \details{ For further details see \code{vignette("hhh4")} and the references. } \note{ For the time being this function performs only modelling of the multivariate time series. No surveillance/monitoring functionality is available. } \seealso{\code{\link{algo.hhh}}, \code{\link{fe}}, \code{\link{ri}} } \author{M. Paul, S. Meyer, and L. Held} \examples{ ##################################################################### # Fit some models from ?algo.hhh ##################################################################### ## univariate salmonella agona data data(salmonella.agona) # convert to sts class salmonella <- disProg2sts(salmonella.agona) # generate formula for temporal and seasonal trends f.end <- addSeason2formula(f = ~ 1 + t, S=1, period=52) model1 <- list(ar = list(f = ~ 1), end = list(f =f.end), family = "NegBin1") # run model res <- hhh4(salmonella, model1) summary(res, idx2Exp=1, amplitudeShift=TRUE) ## multivariate time series: # measles cases in Lower Saxony, Germany data(measles.weser) measles <- disProg2sts(measles.weser) # same model as above summary(hhh4(measles, control=model1)) # now use region-specific intercepts in endemic component f.end2 <- addSeason2formula(f = ~ -1 + fe(1, which=rep(TRUE, ncol(measles))) + t, S = 1, period = 52) model2 <- list(ar = list(f = ~ 1), end = list(f = f.end2, offset = population(measles)), family = "NegBin1") # run model summary(hhh4(measles, control=model2), idx2Exp=1, amplitudeShift=TRUE) # include autoregressive parameter phi for adjacent "Kreise" # no linear trend in endemic component f.end3 <- addSeason2formula(f = ~ -1 + fe(1, which=rep(TRUE, ncol(measles))), S = 1, period = 52) model3 <- list(ar = list(f = ~ 1), ne = list(f = ~1), end = list(f = f.end3, offset= population(measles)), family = "NegBin1") # run model res3 <- hhh4(measles, control=model3) summary(res3, idx2Exp=1:2, amplitudeShift=TRUE) \dontshow{ ## check that neighbourhood weights array yields same result .neweights <- array(neighbourhood(measles), dim = c(rep(ncol(measles),2),nrow(measles)), dimnames = c(dimnames(neighbourhood(measles)), list(NULL))) res3_tv <- hhh4(measles, control = modifyList(model3, list(ne=list(weights=.neweights)))) .disregardComponents <- function(ah4) { ah4["call"] <- list(NULL) ah4$control$ne["weights"] <- list(NULL) ah4 } stopifnot(all.equal(.disregardComponents(res3), .disregardComponents(res3_tv))) } \dontrun{ ###################################################################### # Fit the models from the Paul & Held (2011) paper for the influenza data # from Bavaria and Baden-Wuerttemberg (this takes some time!) # For further documentation see also the vignette. ###################################################################### data("fluBYBW") ############################################################### ## generate formula for temporal and seasonal trends f.end <- addSeason2formula(f = ~ -1 + ri(type="iid", corr="all") + I((t-208)/100), S=3, period=52) ## details for optimizer opt <- list(stop = list(tol=1e-5, niter=200), regression = list(method="nlminb"), variance = list(method="nlminb")) ########################## ## models # A0 cntrl_A0 <- list(ar = list(f = ~ -1), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose = 1, data = data.frame(t = epoch(fluBYBW)-1)) summary(res_A0 <- hhh4(fluBYBW,cntrl_A0)) # B0 cntrl_B0 <- list(ar = list(f = ~ 1), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_B0 <- hhh4(fluBYBW,cntrl_B0) # C0 cntrl_C0 <- list(ar = list(f = ~ -1 + ri(type="iid", corr="all")), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_C0 <- hhh4(fluBYBW,cntrl_C0) #A1 # weight matrix w_ji = 1/(No. neighbors of j) if j ~ i, and 0 otherwise wji <- neighbourhood(fluBYBW)/rowSums(neighbourhood(fluBYBW)) cntrl_A1 <- list(ar = list(f = ~ -1), ne = list(f = ~ 1, weights = wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_A1 <- hhh4(fluBYBW,cntrl_A1) # B1 cntrl_B1 <- list(ar = list(f = ~ 1), ne = list(f = ~ 1, weights = wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_B1 <- hhh4(fluBYBW,cntrl_B1) # C1 cntrl_C1 <- list(ar = list(f = ~ -1 + ri(type="iid", corr="all")), ne = list(f = ~ 1, weights = wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_C1 <- hhh4(fluBYBW,cntrl_C1) #A2 cntrl_A2 <- list(ar = list(f = ~ -1), ne = list(f = ~ -1 + ri(type="iid",corr="all"), weights=wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_A2 <- hhh4(fluBYBW,cntrl_A2) # B2 cntrl_B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1 + ri(type="iid",corr="all"), weights =wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_B2 <- hhh4(fluBYBW,cntrl_B2) # C2 cntrl_C2 <- list(ar = list(f = ~ -1 + ri(type="iid", corr="all")), ne = list(f = ~ -1 + ri(type="iid",corr="all"), weights =wji), end = list(f =f.end, offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1), start=list(fixed=fixef(res_B0),random=c(rep(0,140), ranef(res_B0)), sd.corr=c(-.5,res_B0$Sigma.orig,0))) res_C2 <- hhh4(fluBYBW,cntrl_C2) # D cntrl_D <- list(ar = list(f = ~ 1), ne = list(f = ~ -1 + ri(type="iid"), weights = wji), end = list(f =addSeason2formula(f = ~ -1 + ri(type="car") + I((t-208)/100), S=3, period=52), offset = population(fluBYBW)), family = "NegBin1", optimizer = opt, verbose=1, data=data.frame(t=epoch(fluBYBW)-1)) res_D <- hhh4(fluBYBW,cntrl_D) } } \keyword{ts} \keyword{regression} \references{ Held, L., \enc{Hhle}{Hoehle}, M., Hofmann, M. (2005) A statistical framework for the analysis of multivariate infectious disease surveillance counts, Statistical Modelling, \bold{5}, 187--199. Paul, M., Held, L. and Toschke, A. M. (2008) Multivariate modelling of infectious disease surveillance data, Statistics in Medicine, \bold{27}, 6250--6267. Paul, M. and Held, L. (2011) Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts. Statistics in Medicine, \bold{30}, 1118--1136 } surveillance/man/unionSpatialPolygons.Rd0000644000176000001440000000412712236641530020247 0ustar ripleyusers\name{unionSpatialPolygons} \alias{unionSpatialPolygons} \title{ Compute the Unary Union of \code{"SpatialPolygons"} } \description{ Union all subpolygons of a \code{"\link[sp:SpatialPolygons-class]{SpatialPolygons}"} object. This is a wrapper for the polygon clipping engines implemented by packages \pkg{rgeos}, \pkg{polyclip}, or \pkg{gpclib}. } \usage{ unionSpatialPolygons(SpP, method = c("rgeos", "polyclip", "gpclib"), ...) } \arguments{ \item{SpP}{ an object of class \code{"\link[sp:SpatialPolygons-class]{SpatialPolygons}"}. For the \pkg{polyclip} \code{method} only, all polygon classes for which an \code{\link{xylist}}-method exists should work as input. } \item{method}{ polygon clipping machinery to use. Default is to simply call \code{\link[rgeos]{gUnaryUnion}} in package \pkg{rgeos}. For \code{method="polyclip"}, function \code{\link[polyclip]{polyclip}} from package \pkg{polyclip} is used, whereas \code{method="gpclib"} calls \code{\link[maptools]{unionSpatialPolygons}} in package \pkg{maptools} (and requires acceptance of \pkg{gpclib}'s restricted license via \code{\link{surveillance.options}(gpclib=TRUE)}). } \item{\dots}{further arguments passed to the chosen \code{method}.} } \value{ an object of class \code{"\link[sp:SpatialPolygons-class]{SpatialPolygons}"} representing the union of all subpolygons. } \author{ Sebastian Meyer } \seealso{ \code{\link[rgeos]{gUnaryUnion}} in package \pkg{rgeos}, \code{\link[polyclip]{polyclip}} in package \pkg{polyclip}, \code{\link[maptools]{unionSpatialPolygons}} in package \pkg{maptools} (for using \code{\link[gpclib:gpc.poly-class]{union}} of package \pkg{gpclib}). } \examples{ ## Load districts of Germany load(system.file("shapes", "districtsD.RData", package="surveillance")) ## Union these districts plot(unionSpatialPolygons(districtsD, method="polyclip"), border=0, col=1) plot(districtsD, add=TRUE, border="lightgrey") if (requireNamespace("rgeos")) plot(unionSpatialPolygons(districtsD, method="rgeos"), add=TRUE, border=2, lwd=2) } \keyword{spatial} surveillance/man/algo.cdc.Rd0000644000176000001440000000647712003566242015530 0ustar ripleyusers\name{algo.cdc} \alias{algo.cdcLatestTimepoint} \alias{algo.cdc} \encoding{latin1} \title{The CDC Algorithm} \description{ Surveillance using the CDC Algorithm } \usage{ algo.cdcLatestTimepoint(disProgObj, timePoint = NULL, control = list(b = 5, m = 1, alpha=0.025)) algo.cdc(disProgObj, control = list(range = range, b= 5, m=1, alpha = 0.025)) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain).} \item{timePoint}{time point which shoud be evaluated in \code{algo.cdcLatestTimepoint}. The default is to use the latest timepoint.} \item{control}{control object: \code{range} determines the desired timepoints which should be evaluated, \code{b} describes the number of years to go back for the reference values, \code{m} is the half window width for the reference values around the appropriate timepoint (see details). The standard definition is \code{b}=5 and \code{m}=1. } } % \details{ % Using the reference values for calculating an upper limit, alarm is given if the actual value is bigger than a computed threshold. \code{algo.cdc} calls \code{algo.cdcLatestTimepoint} for the values specified in \code{range} and for the system specified in \code{control}. The threshold is calculated by the predictive version, i.e. \deqn{mean(x) + z_{\alpha/2} * sd(x) * \sqrt(1+1/k),} which corresponds to Equation 8-1 in the Farrington and Andrews chapter. % Note that an aggregation into 4-week blocks occurs in \code{algo.cdcLatestTimepoint} and \code{m} denotes number of 4-week blocks (months) to use as reference values. This function currently does the same for monthly data (not correct!) % } % \value{ \item{survRes}{ \code{algo.cdcLatestTimepoint} returns a list of class \code{survRes} (surveillance result), which includes the alarm value (alarm = 1, no alarm = 0) for recognizing an outbreak, the threshold value for recognizing the alarm and the input object of class disProg. \code{algo.cdc} gives a list of class \code{survRes} which includes the vector of alarm values for every timepoint in \code{range}, the vector of threshold values for every timepoint in \code{range} for the system specified by \code{b}, \code{w}, the range and the input object of class disProg. } } % \seealso{ \code{\link{algo.rkiLatestTimepoint}},\code{\link{algo.bayesLatestTimepoint}} and \code{\link{algo.bayes}} for the Bayes system. } \author{M. \enc{Hhle}{Hoehle}} \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 500, A = 1,alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Test week 200 to 208 for outbreaks with a selfdefined cdc algo.cdc(disProgObj, control = list(range = 400:500,alpha=0.025)) } \keyword{classif} \source{ Stroup, D., G. Williamson, J. Herndon, and J. Karon (1989). Detection of aberrations in the occurence of notifiable diseases surveillance data. Statistics in Medicine 8, 323-329. Farrington, C. and N. Andrews (2003). Monitoring the Health of Populations, Chapter Outbreak Detection: Application to Infectious Disease Surveillance, pp. 203-231. Oxford University Press. } surveillance/man/stsXtrct.Rd0000644000176000001440000000233012165246273015704 0ustar ripleyusers\name{[,sts-methods} \docType{methods} \title{Extraction and Subsetting of \pkg{sts} objects} % % This is stolen from the Matrix package. %\alias{[,sts,missing,missing,ANY-method} %\alias{[,sts,missing,index,missing-method} %\alias{[,sts,index,missing,missing-method} \alias{[,sts-method} \alias{[,sts,ANY,ANY,ANY-method} % \description{ Methods for \code{"["}, i.e., extraction or subsetting of the \code{"\linkS4class{sts}"} class in package \pkg{surveillance}. Note that \code{[<--methods} methods (i.e. subassigments) are currently not supported. \code{drop} is always \code{FALSE}. } \section{Methods}{ There are more than these: \describe{ \item{x = "sts", i = "missing", j = "missing", drop= "ANY"}{ ... } \item{x = "sts", i = "numeric", j = "missing", drop= "missing"}{ ... } \item{x = "sts", i = "missing", j = "numeric", drop= "missing"}{ ... } } } \examples{ data("ha.sts") haagg <- aggregate(ha.sts, nfreq=13) #A suite of of simple tests (inspired by the Matrix package) #stopifnot(identical(ha.sts, ha.sts[])) plot(haagg[, 3]) # Single series plot(haagg[1:30, 3]) # Somewhat shorter #Counts at time 20 plot(haagg[20, ], type = observed ~1 |unit) } \keyword{methods} \keyword{array} surveillance/man/predict.ah.Rd0000644000176000001440000000216011731650466016071 0ustar ripleyusers\name{predict.ah} \alias{predict.ah} \alias{predict.ahg} \encoding{latin1} \title{Predictions from a HHH model} \description{ Use a \code{ah} or \code{ahg} object for prediction. } \usage{ \method{predict}{ah}(object,newdata=NULL, type=c("response","endemic","epi.own","epi.neighbours"), \dots) } \arguments{ \item{object}{object of class \code{ah} or \code{ahg} } \item{newdata}{optionally, a disProgObject with which to predict; if omitted, the fitted mean is returned. } \item{type}{the type of prediction required. The default is on the scale of the response variable (endemic and epidemic part). The alternative "endemic" returns only the endemic part (i.e. \eqn{n_{it} \nu_{it}}{n_it * \nu_it}), "epi.own" and "epi.neighbours" return the epidemic part (i.e. \eqn{\lambda_i y_{i,t}}{\lambda_i * y_i,t} and \eqn{\phi_i \sum_{j \sim i} y_{j,t-1}}{\phi_i * \sum_(j ~ i) y_j,t-1} )} \item{...}{not really used} } \value{ matrix of values containing the mean \eqn{\mu_{it}}{\mu_it} for each region and time point. } \details{this function is still experimental} \keyword{ models } % residuals.ah surveillance/man/untie.Rd0000644000176000001440000001006312153115672015167 0ustar ripleyusers\name{untie} \alias{untie} \alias{untie.epidataCS} \alias{untie.matrix} \alias{untie.default} \title{ Randomly Break Ties in Data } \description{ This is a generic function intended to randomly break tied data in a way similar to what \code{\link{jitter}} does: tie-breaking is performed by shifting \emph{all} data points by a random amount. The \pkg{surveillance} package defines methods for matrices, \code{"epidataCS"}, and a default method for numeric vectors. } \usage{ untie(x, amount, ...) \method{untie}{epidataCS}(x, amount = list(t=NULL, s=NULL), minsep = list(t=0, s=0), direction = "left", keep.sources = FALSE, ...) \method{untie}{matrix}(x, amount = NULL, minsep = 0, constraint = NULL, giveup = 1000, ...) \method{untie}{default}(x, amount = NULL, minsep = 0, direction = c("symmetric", "left", "right"), sort = NULL, giveup = 1000, ...) } \arguments{ \item{x}{ the data to be untied. } \item{amount}{ upperbound for the random amount by which data are shifted. \code{NULL} means to use a data-driven default, which equals the minimum separation of the data points for the non-symmetric default method and its half for the symmetric default method and the \code{matrix} method. For numeric vectors (default method), the jittered version is the same as for \code{jitter(x, amount=amount)} if \code{direction="symmetric"} (and \code{amount} is non-\code{NULL}), and \code{x} \dQuote{+-} \code{runif(length(x), 0, amount)} (otherwise).\cr For matrices, a vector uniformly drawn from the disc with radius \code{amount} is added to each point (row).\cr For \code{"epidataCS"}, \code{amount} is a list stating the amounts for the temporal and/or spatial dimension, respectively. It then uses the specific methods with arguments \code{constraint=x$W}, \code{direction}, and \code{sort=TRUE}. } \item{minsep}{minimum separation of jittered points. Can only be obeyed if much smaller than \code{amount} (also depending on the number of points). \code{minsep>0} is currently only implemented for the spatial (matrix) method.} \item{keep.sources}{ logical (\code{FALSE}). If \code{TRUE}, the original list of possible event sources in \code{x$events$.sources} will be preserved. For instance, events observed at the same time did by definition not trigger each other; however, after random tie-breaking one event will precede the other and considered as a potential source of infection for the latter, although it could just as well be the other way round. Enabling \code{keep.sources} will use the \code{.sources} list from the original (tied) \code{"epidataCS"} object. } \item{constraint}{ an object of class \code{"\linkS4class{SpatialPolygons}"} representing the domain which the points of the matrix should belong to -- before and after jittering. } \item{giveup}{number of attempts after which the algorithm should stop trying to generate new points.} \item{direction}{ one of \code{"symmetric"} (default), \code{"left"}, or \code{"right"}, indicating in which direction vector elements should be shifted. } \item{sort}{ logical indicating if the jittered vector should be sorted. Defaults to doing so if the original vector was already sorted. } \item{\dots}{ For the \code{"epidataCS"}-method: arguments passed to the \code{matrix}- or \code{default}-method (\code{giveup}). Unused in other methods. } } \value{ the untied (jittered) data. } \author{ Sebastian Meyer } \seealso{ \code{\link{jitter}} } \examples{ # vector example set.seed(123) untie(c(rep(1,3), rep(1.2, 4), rep(3,3)), direction="left", sort=FALSE) # spatial example data(imdepi) coords <- coordinates(imdepi$events) table(duplicated(coords)) mult <- multiplicity(coords) plot(coords, cex=sqrt(mult)) set.seed(1) coords_untied <- untie(coords) stopifnot(!anyDuplicated(coords_untied)) points(coords_untied, col=2) # shifted by very small amount in this case } \keyword{utilities} \keyword{manip} \keyword{dplot} surveillance/man/magic.dim.Rd0000644000176000001440000000142311745455715015706 0ustar ripleyusers\name{magic.dim} \alias{magic.dim} \encoding{latin1} \title{Returns a suitable k1 x k2 for plotting the disProgObj} \description{ For a given number \code{k} \code{magic.dim} provides a vector containing two elements, the number of rows (k1) and columns (k2), respectively, which can be used to set the dimension of a single graphic device so that k1*k2 plots can be drawn by row (or by column) on the device. } \usage{ magic.dim(k) } \arguments{ \item{k}{an integer} } \value{vector with two elements} \seealso{ \code{\link{primeFactors}} and \code{\link{bestCombination}} which are internally used to complete the task. \code{\link{n2mfrow}} is a similar function from package \pkg{grDevices}. } \keyword{dplot} \keyword{utilities} surveillance/man/algo.farrington.fitGLM.Rd0000644000176000001440000000573211731650466020273 0ustar ripleyusers\name{algo.farrington.fitGLM} \alias{algo.farrington.fitGLM} \alias{algo.farrington.fitGLM.fast} \alias{algo.farrington.fitGLM.populationOffset} \encoding{latin1} \title{Fit the Poisson GLM of the Farrington procedure for a single time point} \description{ The function fits a Poisson regression model (GLM) with mean predictor \deqn{\log \mu_t = \alpha + \beta w_t}{ log mu_t = alpha + beta * w} as specified by the Farrington procedure. That way we are able to predict the value \eqn{c_0}{c0}. If requested Anscombe residuals are computed based on an initial fit and a 2nd fit is made using weights, where base counts suspected to be caused by earlier outbreaks are downweighted. } \usage{ algo.farrington.fitGLM(response, wtime, timeTrend = TRUE, reweight = TRUE, ...) algo.farrington.fitGLM.fast(response, wtime, timeTrend = TRUE, reweight = TRUE, ...) algo.farrington.fitGLM.populationOffset(response, wtime, population, timeTrend=TRUE,reweight=TRUE, ...) } \arguments{ \item{response}{The vector of observed base counts} \item{wtime}{Vector of week numbers corresponding to \code{response}} \item{timeTrend}{Boolean whether to fit the \eqn{\beta t}{beta*t} or not} \item{reweight}{Fit twice -- 2nd time with Anscombe residuals} \item{population}{Population size. Possibly used as offset, i.e. in \code{algo.farrington.fitGLM.populationOffset} the value \code{log(population)} is used as offset in the linear predictor of the GLM: \deqn{\log \mu_t = \log(\texttt{population}) + \alpha + \beta w_t}{ log mu_t = log(population) alpha + beta * w} This provides a way to adjust the Farrington procedure to the case of greatly varying populations. Note: This is an experimental implementation with methodology not covered by the original paper. } \item{\dots}{Used to catch additional arguments, currently not used.} } % \details{Compute weights from an initial fit and rescale using Anscombe based residuals as described in the \code{\link{anscombe.residuals}} function. Note that \code{algo.farrington.fitGLM} uses the \code{glm} routine for fitting. A faster alternative is provided by \code{algo.farrington.fitGLM.fast} which uses the \code{glm.fit} function directly (thanks to Mikko Virtanen). This saves computational overhead and increases speed for 500 monitored time points by a factor of approximately two. However, some of the routine \code{glm} functions might not work on the output of this function. Which function is used for \code{algo.farrington} can be controlled by the \code{control$fitFun} argument. } % \value{An object of class GLM with additional fields \code{wtime}, \code{response} and \code{phi}. If the \code{glm} returns without convergence \code{NULL} is returned.} % \seealso{\code{\link{anscombe.residuals}},\code{\link{algo.farrington}}} \keyword{regression} surveillance/man/m1.Rd0000644000176000001440000000430111731650466014364 0ustar ripleyusers\name{m1} \alias{m1} \alias{h1_nrwrp} \alias{k1} \alias{m2} \alias{m3} \alias{m4} \alias{m5} \alias{n1} \alias{n2} \alias{q1_nrwh} \alias{q2} \alias{s1} \alias{s2} \alias{s3} \encoding{latin1} \title{RKI SurvStat Data} \description{14 datasets for different diseases beginning in 2001 to the 3rd Quarter of 2004 including their defined outbreaks. \itemize{ \item \code{m1} 'Masern' in the 'Landkreis Nordfriesland' (Germany, Schleswig-Holstein) \item \code{m2} 'Masern' in the 'Stadt- und Landkreis Coburg' (Germany, Bayern) \item \code{m3} 'Masern' in the 'Kreis Leer' (Germany, Niedersachsen) \item \code{m4} 'Masern' in the 'Stadt- und Landkreis Aachen' (Germany, Nordrhein-Westfalen) \item \code{m5} 'Masern' in the 'Stadt Verden' (Germany, Niedersachsen) \item \code{q1\_nrwh} 'Q-Fieber' in the 'Hochsauerlandkreis' (Germany, Westfalen) and in the 'Landkreis Waldeck-Frankenberg' (Germany, Hessen) \item \code{q2} 'Q-Fieber' in 'Mnchen' (Germany, Bayern) \item \code{s1} 'Salmonella Oranienburg' in Germany \item \code{s2} 'Salmonella Agona' in 12 'Bundeslndern' of Germany \item \code{s3} 'Salmonella Anatum' in Germany \item \code{k1} 'Kryptosporidiose' in Germany, 'Baden-Wrttemberg' \item \code{n1} 'Norovirus' in 'Stadtkreis Berlin Mitte' (Germany, Berlin) \item \code{n2} 'Norovirus' in 'Torgau-Oschatz' (Germany, Sachsen) \item \code{h1\_nrwrp} 'Hepatitis A' in 'Oberbergischer Kreis, Olpe, Rhein-Sieg-kreis' (Germany, Nordrhein-Westfalen) and 'Siegenwittgenstein Altenkirchen' (Germany, Rheinland-Pfalz) } } \usage{data(m1) } \format{ \code{disProg} objects each containing 209 observations (weekly on 52 weeks) \describe{ \item{observed}{Number of counts in the corresponding week} \item{state}{Boolean whether there was an outbreak.} } } \source{Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; m1 and m3 were queried on 10 November 2004. The rest during September 2004. } \seealso{\code{\link{readData}}} \examples{ data(k1) survResObj <- algo.rki1(k1, control=list(range=27:192)) plot(survResObj, "RKI 1", "k1", firstweek=27, startyear=2002) } \keyword{datasets} surveillance/man/twinSIR_cox.Rd0000644000176000001440000000141212003572153016244 0ustar ripleyusers\name{twinSIR_cox} \alias{cox} \title{ Identify Endemic Components in an Intensity Model } \description{ The special function \code{cox} marks terms in formulae of the functions \code{\link{twinSIR}} and \code{\link{simEpidata}} as endemic components, i.e. variables acting multiplicatively on the baseline infection intensity. Technically, this function is implemented as \code{function(x) {x}} and defined as \dQuote{special} in \code{\link{terms.formula}}. } \seealso{ Usage in formulae of functions \code{\link{twinSIR}} and \code{\link{simEpidata}}. } \examples{ # a hypothetic call of the fitting function 'twinSIR' with two epidemic and # two endemic covariates: \dontrun{ twinSIR( ~ B1 + B2 + cox(vaccination) + cox(size), data = myEpidata) } } \keyword{internal} surveillance/man/intensityplot.Rd0000644000176000001440000000130712061460336016767 0ustar ripleyusers\name{intensityplot} \alias{intensityplot} \title{ Plot Paths of Point Process Intensities } \description{ Generic function for plotting paths of point process intensities. Methods currently defined in package \pkg{surveillance} are for classes \code{"twinSIR"} and \code{"simEpidata"} (temporal), as well as \code{"twinstim"} and \code{"simEpidataCS"} (spatio-temporal). } \usage{ intensityplot(x, ...) } \arguments{ \item{x}{ An object for which an \code{intensityplot} method is defined. } \item{\dots}{ Arguments passed to the corresponding method. } } \seealso{ The methods \code{\link{intensityplot.twinSIR}} and \code{\link{intensityplot.twinstim}}. } \keyword{hplot} surveillance/man/xtable.algoQV.Rd0000644000176000001440000000234112035760417016514 0ustar ripleyusers\name{xtable.algoQV} \alias{xtable.algoQV} \title{Xtable quality value object} \description{Xtable a single qualitity value object in a nicely formatted way} \usage{ \method{xtable}{algoQV}(x,caption = NULL, label = NULL, align = NULL, digits = NULL, display = NULL, ...) } \arguments{ \item{x}{Quality Values object generated with \code{quality}} \item{caption}{See \code{\link[xtable]{xtable}}} \item{label}{See \code{\link[xtable]{xtable}}} \item{align}{See \code{\link[xtable]{xtable}}} \item{digits}{See \code{\link[xtable]{xtable}}} \item{display}{See \code{\link[xtable]{xtable}}} \item{...}{Further arguments (see \code{\link[xtable]{xtable})}} } \keyword{print} \seealso{ \code{\link[xtable]{xtable}}} \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 200, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Let this object be tested from rki1 survResObj <- algo.rki1(disProgObj, control = list(range = 50:200)) # Compute the quality values in a nice formatted way xtable(algo.quality(survResObj)) } surveillance/man/twinstim_methods.Rd0000644000176000001440000001306712207660116017451 0ustar ripleyusers\encoding{latin1} \name{twinstim_methods} \alias{print.twinstim} \alias{summary.twinstim} \alias{vcov.twinstim} \alias{logLik.twinstim} \alias{nobs.twinstim} \alias{print.summary.twinstim} \alias{toLatex.summary.twinstim} \alias{xtable.twinstim} \alias{xtable.summary.twinstim} \title{ Print, Summary and Extraction Methods for \code{"twinstim"} Objects } \description{ Besides \code{\link{print}} and \code{\link{summary}} methods there are also some standard extraction methods defined for objects of class \code{"twinstim"}: \code{\link{vcov}}, \code{\link{logLik}}, and \code{\link{nobs}}. This also enables the use of, e.g., \code{\link{confint}} and \code{\link{AIC}}. The model \code{summary} can be exported to LaTeX by the corresponding \code{\link{toLatex}} method. } \usage{ \method{print}{twinstim}(x, digits = max(3, getOption("digits") - 3), ...) \method{summary}{twinstim}(object, test.iaf = FALSE, correlation = FALSE, symbolic.cor = FALSE, ...) \method{vcov}{twinstim}(object, ...) \method{logLik}{twinstim}(object, ...) \method{nobs}{twinstim}(object, ...) \method{print}{summary.twinstim}(x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) \method{toLatex}{summary.twinstim}(object, digits = max(3, getOption("digits") - 3), eps.Pvalue = 1e-4, align = "lrrrr", withAIC = FALSE, ...) \method{xtable}{summary.twinstim}(x, caption = NULL, label = NULL, align = c("l", "r", "r", "r"), digits = 3, display = c("s", "f", "s", "s"), ci.level = 0.95, ci.fmt = "\%4.2f", ci.to = "--", eps.pvalue = 1e-4, ...) } \arguments{ \item{x, object}{an object of class \code{"twinstim"} or \code{"summary.twinstim"}, respectively.} \item{digits}{ integer, used for number formatting with \code{signif()}. Minimum number of significant digits to be printed in values. } \item{test.iaf}{logical indicating if the simple Wald z- and p-values should be calculated for parameters of the interaction functions \code{siaf} and \code{tiaf}. Because it is often invalid or meaningless to do so, the default is \code{FALSE}. } \item{correlation}{ logical. If \code{TRUE}, the correlation matrix of the estimated parameters is returned and printed. } \item{symbolic.cor}{ logical. If \code{TRUE}, print the correlations in a symbolic form (see \code{symnum}) rather than as numbers. } \item{signif.stars}{logical. If \code{TRUE}, \dQuote{significance stars} are printed for each coefficient.} \item{eps.Pvalue}{see \code{\link{printCoefmat}}.} \item{withAIC}{logical indicating if the AIC and the log-likelihood of the model should be included below the table of coefficients in the LaTeX tabular.} \item{caption,label,align,display}{see \code{\link{xtable}}.} \item{ci.level,ci.fmt,ci.to}{the confidence intervals are calculated at level \code{ci.level} and printed using \code{\link{sprintf}} with format \code{ci.fmt} and seperator \code{ci.to}.} \item{eps.pvalue}{argument passed to \code{\link{formatPval}}.} \item{\dots}{ For \code{print.summary.twinstim}, arguments passed to \code{\link{printCoefmat}}.\cr For all other methods: unused (argument of the generic). } } \details{ The \code{print} and \code{summary} methods allow the compact or comprehensive representation of the fitting results, respectively. The former only prints the original function call, the estimated coefficients and the maximum log-likelihood value. The latter prints the whole coefficient matrix with standard errors, z- and p-values (see \code{\link{printCoefmat}}) -- separately for the endemic and the epidemic component -- and additionally the AIC, the number of log-likelihood and score evaluations, and the runtime. They both append a big \dQuote{WARNING}, if the optimization algorithm did not converge. The estimated coefficients may be extracted by using the default \code{coef}-method from package \pkg{stats}. } \value{ The \code{print} methods return their first argument, invisibly, as they always should. The \code{vcov}, \code{logLik}, and \code{nobs} methods return the estimated variance-covariance matrix of the parameters (here, the inverse of the estimate of the expected Fisher information matrix), the maximum log-likelihood value of the model, and the number of events (excluding events of the pre-history), respectively. The \code{summary} method returns a list containing some summary statistics of the model, which is nicely printed by the corresponding \code{print} method. The \code{toLatex} method returns a character vector of class \code{"Latex"}, each element containing one line of LaTeX code (see \code{\link{print.Latex}}). } \author{ Sebastian Meyer } \examples{ # load a fit of the 'imdepi' data, see the example in ?twinstim data("imdepifit") # print method imdepifit # extract point estimates coef(imdepifit) # variance-covariance matrix of endemic parameters # (inverse of expected Fisher information) unname(vcov(imdepifit)[1:4,1:4]) # the default confint() method may be used for Wald CI's confint(imdepifit, parm="e.typeC", level=0.95) # log-likelihood and AIC of the fitted model logLik(imdepifit) AIC(imdepifit) nobs(imdepifit) # summary method summary(imdepifit, test.iaf=FALSE, correlation=TRUE, symbolic.cor=TRUE) # create LaTeX code of coefficient table toLatex(summary(imdepifit), withAIC=FALSE) # or using the xtable-method (which produces RR's) xtable(summary(imdepifit)) } \keyword{methods} \keyword{print} \keyword{htest} surveillance/man/formatPval.Rd0000644000176000001440000000107412104261126016150 0ustar ripleyusers\name{formatPval} \alias{formatPval} \title{ Pretty p-Value Formatting } \description{ Just \acronym{yapf} -- yet another p-value formatter... It is implemented as \code{sapply(pv, function(p) format.pval(p, digits = if (p<10*eps) 1 else 2, eps = eps)}. } \usage{ formatPval(pv, eps = 1e-4) } \arguments{ \item{pv}{a numeric vector (of p-values).} \item{eps}{a numerical tolerance, see \code{\link{format.pval}}.} } \value{ The character vector of formatted p-values. } \examples{ formatPval(c(0.13567, 0.0432, 0.000546, 1e-8)) } \keyword{print} surveillance/man/create.grid.Rd0000644000176000001440000000445712003572572016244 0ustar ripleyusers\name{create.grid} \alias{create.grid} \encoding{latin1} \title{Computes a matrix of initial values} \description{ For a given model and a list of parameters specified as \code{param = c(lower,upper,length)}, \code{create.grid} creates a grid of initial values for \code{algo.hhh.grid}. The resulting matrix contains all combinations of the supplied parameters which each are a sequence of length \code{length} from \code{lower} to \code{upper}. Note that the autoregressive parameters \eqn{\lambda, \phi} and the overdispersion parameter \eqn{\psi} must be positive. Only one sequence of initial values is considered for the autregressive, endemic and overdispersion parameters to create the grid, e.g. initial values are the same for each one of the seasonal and trend parameters. } \usage{ create.grid(disProgObj, control, params = list(epidemic = c(0.1, 0.9, 5), endemic=c(-0.5,0.5,3), negbin = c(0.3, 12, 10))) } \arguments{ \item{disProgObj}{object of class \code{disProg} } \item{control}{specified model} \item{params}{list of parameters: \code{param=c(lower,upper,length)} \itemize{ \item \code{epidemic} autoregressive parameters \eqn{\lambda} and \eqn{\phi}. \item \code{endemic} trend and seasonal parameters \eqn{\beta, \gamma_j}. \item \code{negbin} overdispersion parameter for negative binomial model \eqn{\psi}. } } } \value{ \item{matrix}{matrix with \code{gridSize} starting values as rows} } \seealso{\code{\link{algo.hhh.grid}}} \author{M. Paul} \examples{ # simulate data set.seed(123) disProgObj <- simHHH(control = list(coefs = list(alpha =-0.5, gamma = 0.4, delta = 0.6)),length=300)$data # consider the model specified in a control object for algo.hhh.grid cntrl1 <- list(lambda=TRUE, neighbours=TRUE, linear=TRUE, nseason=1) cntrl2 <- list(lambda=TRUE, negbin="single") # create a grid of initial values for respective parameters grid1 <- create.grid(disProgObj, cntrl1, params = list(epidemic=c(0.1,0.9,3), endemic=c(-1,1,3))) grid2 <- create.grid(disProgObj, cntrl2, params = list(epidemic=c(0.1,0.9,5), negbin=c(0.3,12,10))) } \keyword{misc} surveillance/man/pairedbinCUSUM.Rd0000644000176000001440000001520411731650466016625 0ustar ripleyusers\name{pairedbinCUSUM} \alias{pairedbinCUSUM} \alias{pairedbinCUSUM.runlength} \alias{pairedbinCUSUM.LLRcompute} \encoding{latin1} \title{Paired binary CUSUM and its run-length computation} \description{ CUSUM for paired binary data as described in Steiner et al. (1999). } \usage{ pairedbinCUSUM(stsObj, control = list(range=NULL,theta0,theta1, h1,h2,h11,h22)) pairedbinCUSUM.runlength(p,w1,w2,h1,h2,h11,h22, sparse=FALSE) } \arguments{ \item{stsObj}{Object of class \code{sts} containing the paired responses for each of the, say n, patients. The observed slot of \code{stsObj} is thus a \eqn{n \times 2} matrix.} \item{control}{Control object as a list containing several parameters. \itemize{ \item{\code{range}}{Vector of indices in the observed slot to monitor.} \item{\code{theta0}}{In-control parameters of the paired binary CUSUM.} \item{\code{theta1}}{Out-of-control parameters of the paired binary CUSUM.} \item{\code{h1}}{Primary control limit (=threshold) of 1st CUSUM.} \item{\code{h2}}{Primary control limit (=threshold) of 2nd CUSUM.} \item{\code{h11}}{Secondary limit for 1st CUSUM.} \item{\code{h22}}{Secondary limit for 2nd CUSUM.} } } \item{p}{Vector giving the probability of the four different possibile states, i.e. c((death=0,near-miss=0),(death=1,near-miss=0), (death=0,near-miss=1),(death=1,near-miss=1)).} \item{w1}{The parameters \code{w1} and \code{w2} are the sample weights vectors for the two CUSUMs, see eqn. (2) in the paper. We have that \code{w1} is equal to deaths } \item{w2}{As for \code{w1}} \item{h1}{decision barrier for 1st individual cusums} \item{h2}{decision barrier for 2nd cusums} \item{h11}{together with \code{h22} this makes up the joing decision barriers} \item{h22}{together with \code{h11} this makes up the joing decision barriers} \item{sparse}{Boolean indicating whether to use sparse matrix computations from the \code{Matrix} library (usually much faster!). Default: \code{FALSE}.} } \details{ For details about the method see the Steiner et al. (1999) reference listed below. Basically, two individual CUSUMs are run based on a logistic regression model. The combined CUSUM not only signals if one of its two individual CUSUMs signals, but also if the two CUSUMs simultaneously cross the secondary limits. } \seealso{\code{\link{categoricalCUSUM}}} \value{An \code{sts} object with \code{observed}, \code{alarm}, etc. slots trimmed to the \code{control$range} indices. } \references{ Steiner, S. H., Cook, R. J., and Farewell, V. T. (1999), Monitoring paired binary surgical outcomes using cumulative sum charts, Statistics in Medicine, 18, pp. 69--86. } \examples{ #Set in-control and out-of-control parameters as in paper theta0 <- c(-2.3,-4.5,2.5) theta1 <- c(-1.7,-2.9,2.5) #Small helper function to compute the paired-binary likelihood #of the length two vector yz when the true parameters are theta dPBin <- function(yz,theta) { exp(dbinom(yz[1],size=1,prob=plogis(theta[1]),log=TRUE) + dbinom(yz[2],size=1,prob=plogis(theta[2]+theta[3]*yz[1]),log=TRUE)) } #Likelihood ratio for all four possible configurations p <- c(dPBin(c(0,0), theta=theta0), dPBin(c(0,1), theta=theta0), dPBin(c(1,0), theta=theta0), dPBin(c(1,1), theta=theta0)) #Compute ARL using non-sparse matrix operations \dontrun{ pairedbinCUSUM.runlength(p,w1=c(-1,37,-9,29),w2=c(-1,7),h1=70,h2=32,h11=38,h22=17) } #Sparse computations don't work on all machines (e.g. the next line #might lead to an error. If it works this call can be considerably (!) faster #than the non-sparse call. \dontrun{ pairedbinCUSUM.runlength(p,w1=c(-1,37,-9,29),w2=c(-1,7),h1=70,h2=32, h11=38,h22=17,sparse=TRUE) } #Use paired binary CUSUM on the De Leval et al. (1994) arterial switch #operation data on 104 newborn babies data("deleval") #Switch between death and near misses observed(deleval) <- observed(deleval)[,c(2,1)] #Run paired-binary CUSUM without generating alarms. pb.surv <- pairedbinCUSUM(deleval,control=list(theta0=theta0, theta1=theta1,h1=Inf,h2=Inf,h11=Inf,h22=Inf)) plot(pb.surv, xaxis.years=FALSE) ###################################################################### #Scale the plots so they become comparable to the plots in Steiner et #al. (1999). To this end a small helper function is defined. ###################################################################### ###################################################################### #Log LR for conditional specification of the paired model ###################################################################### LLR.pairedbin <- function(yz,theta0, theta1) { #In control alphay0 <- theta0[1] ; alphaz0 <- theta0[2] ; beta0 <- theta0[3] #Out of control alphay1 <- theta1[1] ; alphaz1 <- theta1[2] ; beta1 <- theta1[3] #Likelihood ratios llry <- (alphay1-alphay0)*yz[1]+log(1+exp(alphay0))-log(1+exp(alphay1)) llrz <- (alphaz1-alphaz0)*yz[2]+log(1+exp(alphaz0+beta0*yz[1]))- log(1+exp(alphaz1+beta1*yz[1])) return(c(llry=llry,llrz=llrz)) } val <- expand.grid(0:1,0:1) table <- t(apply(val,1, LLR.pairedbin, theta0=theta0, theta1=theta1)) w1 <- min(abs(table[,1])) w2 <- min(abs(table[,2])) S <- upperbound(pb.surv) / cbind(rep(w1,nrow(observed(pb.surv))),w2) #Show results par(mfcol=c(2,1)) plot(1:nrow(deleval),S[,1],type="l",main="Near Miss",xlab="Patient No.", ylab="CUSUM Statistic") lines(c(0,1e99), c(32,32),lty=2,col=2) lines(c(0,1e99), c(17,17),lty=2,col=3) plot(1:nrow(deleval),S[,2],type="l",main="Death",xlab="Patient No.", ylab="CUSUM Statistic") lines(c(0,1e99), c(70,70),lty=2,col=2) lines(c(0,1e99), c(38,38),lty=2,col=3) ###################################################################### # Run the CUSUM with thresholds as in Steiner et al. (1999). # After each alarm the CUSUM statistic is set to zero and # monitoring continues from this point. Triangles indicate alarm # in the respective CUSUM (nearmiss or death). If in both # simultaneously then an alarm is caued by the secondary limits. ###################################################################### pb.surv2 <- pairedbinCUSUM(deleval,control=list(theta0=theta0, theta1=theta1,h1=70*w1,h2=32*w2,h11=38*w1,h22=17*w2)) plot(pb.surv2, xaxis.years=FALSE) } \author{S. Steiner and M. \enc{Hhle}{Hoehle}} \keyword{regression} %deleval <- read.table("~/MCHealth/Varizellen/R/leval.txt",header=TRUE) %deleval <- new("sts", epoch=1:nrow(deleval), observed=deleval,state=0*deleval,freq=104) %save(file="~/Surveillance/surveillance/pkg/data/deleval.RData",list=c("deleval"))surveillance/man/twinSIR.Rd0000644000176000001440000003521012240444211015372 0ustar ripleyusers\encoding{latin1} \name{twinSIR} \alias{twinSIR} \title{ Fit an Additive-Multiplicative Intensity Model for SIR Data } \description{ \code{twinSIR} is used to fit additive-multiplicative intensity models for epidemics as described in \enc{Hhle}{Hoehle} (2009). Estimation is driven by (penalized) maximum likelihood in the point process frame work. Optimization (maximization) of the (penalized) likelihood function is performed by means of \code{\link{optim}}. } \usage{ twinSIR(formula, data, weights, subset, knots = NULL, nIntervals = 1, lambda.smooth = 0, penalty = 1, optim.args = list(), model = TRUE, keep.data = FALSE) } \arguments{ \item{formula}{ an object of class \code{"\link{formula}"} (or one that can be coerced to that class): a symbolic description of the intensity model to be estimated. The details of model specification are given under Details. } \item{data}{ an object inheriting from class \code{"\link{epidata}"}. } \item{weights}{ an optional vector of weights to be used in the fitting process. Should be \code{NULL} (the default, i.e. all observations have unit weight) or a numeric vector. } \item{subset}{ an optional vector specifying a subset of observations to be used in the fitting process. The subset \code{atRiskY == 1} is automatically chosen, because the likelihood only depends on those observations. } \item{knots}{ numeric vector or \code{NULL} (the default). Specification of the knots, where we suppose a step of the log-baseline. With the current implementation, these must be existing \code{"stop"} time points in \code{subset(data, atRiskY == 1)}. The intervals of constant log-baseline hazard rate then are \eqn{(minTime;knots_1]}, \eqn{(knots_1;knots_2]}, \ldots, \eqn{(knots_K;maxTime]}. By default, the \code{knots} are automatically chosen at the quantiles of the infection time points such that \code{nIntervals} intervals result. Non-NULL \code{knots} take precedence over \code{nIntervals}. } \item{nIntervals}{ the number of intervals of constant log-baseline hazard. Defaults to 1, which means an overall constant log-baseline hazard will be fitted. } \item{lambda.smooth}{ numeric, the smoothing parameter \eqn{\lambda}. By default it is 0 which leads to unpenalized likelihood inference. In case \code{lambda.smooth=-1}, the automatic smoothing parameter selection based on a mixed model approach is used (cf. \enc{Hhle}{Hoehle}, 2009). } \item{penalty}{ either a single number denoting the order of the difference used to penalize the log-baseline coefficients (defaults to 1), or a more specific penalty matrix \eqn{K} for the parameter sub-vector \eqn{\beta}. In case of non-equidistant knots -- usually the case when using quantile based knot locations -- a 1st order differences penalty matrix as in Fahrmeir and Lang (2001) is available. For non-equidistant knots higher orders than one are not implemented. } \item{optim.args}{ a list with arguments passed to the \code{\link{optim}} function. Especially useful are the following ones: \describe{ \item{\code{par}:}{ to specify initial parameter values. Those must be in the order \code{c(alpha, h0, beta)}, i.e. first the coefficients of the epidemic covariates in the same order as they appear in the \code{formula}, then the log-baseline levels in chronological order and finally the coefficients of the endemic covariates in the same order as they appear in the \code{cox} terms of the \code{formula}. The default is to start with 1's for \code{alpha} and 0's for \code{h0} and \code{beta}. } \item{\code{control}:}{ for more detailed \code{trace}-ing (default: 1), another \code{REPORT}-ing frequency if \code{trace} is positive (default: 10), higher \code{maxit} (maximum number of iterations, default: 300) or another \code{factr} value (default: 1e7, a lower value means higher precision). } \item{\code{method}:}{ the optimization algorithm defaults to \code{"L-BFGS-B"} (for box-constrained optimization), if there are any epidemic (non-\code{cox}) variables in the model, and to \code{"BFGS"} otherwise. } \item{\code{lower}:}{ if \code{method = "L-BFGS-B"} this defines the lower bounds for the model coefficients. By default, all effects \eqn{\alpha} of epidemic variables are restricted to be non-negative. Normally, this is exactly what one would like to have, but there might be reasons for other lower bounds, see the Note below. } \item{\code{hessian}:}{ An estimation of the Expected Fisher Information matrix is always part of the return value of the function. It might be interesting to see the Observed Fisher Information (= negative Hessian at the maximum), too. This will be additionally returned if \code{hessian = TRUE}. } } } \item{model}{ logical indicating if the model frame, the \code{weights}, \code{lambda.smooth}, the penalty matrix \eqn{K} and the list of used distance functions \code{f} (from \code{attributes(data)}) should be returned for further computation. This defaults to \code{TRUE} as this information is necessary e.g. in the \code{profile} and \code{plot} methods. } \item{keep.data}{ logical indicating if the \code{"epidata"} object (\code{data}) should be part of the return value. This is only necessary for use of the \code{\link[=simulate.twinSIR]{simulate}}-method for \code{"twinSIR"} objects. The reason is that the \code{twinSIR} function only uses and stores the rows with \code{atRiskY == 1} in the \code{model} component, but for the simulation of new epidemic data one needs the whole data set with all individuals in every time block. The default value is \code{FALSE}, so if you intent to use \code{simulate.twinSIR}, you have to set this to \code{TRUE}. } } \details{ A model is specified through the \code{formula}, which has the form \code{~ epidemicTerm1 + epidemicTerm2 + cox(endemicVar1) * cox(endemicVar2)}, i.e. the right hand side has the usual form as in \code{\link{lm}} with some variables marked as being endemic by the special function \code{\link{cox}}. The left hand side of the formula is empty and will be set internally to \code{cbind(start, stop, event)}, which is similar to \code{Surv(start, stop, event, type="counting")}. Basically, the additive-multiplicative model for the infection intensity \eqn{\lambda_i(t)} for individual \eqn{i} is \deqn{\lambda_i(t) = Y_i(t) * (e_i(t) + h_i(t))} where \describe{ \item{Y\_i(t)}{ is the at-risk indicator, indicating if individual \eqn{i} is \dQuote{at risk} of becoming infected at time point \eqn{t}. This variable is part of the event history \code{data}. } \item{e\_i(t)}{ is the epidemic component of the infection intensity, defined as \deqn{e_i(t) = \sum_{j \in I(t)} f(||s_i - s_j||)} where \eqn{I(t)} is the set of infectious individuals just before time point \eqn{t}, \eqn{s_i} is the coordinate vector of individual \eqn{i} and the function \eqn{f} is defined as \deqn{f(u) = \sum_{m=1}^p \alpha_m B_m(u)} with unknown transmission parameters \eqn{\alpha} and known distance functions \eqn{B_m}. This set of distance functions results in the set of epidemic variables normally calculated by the converter function \code{\link{as.epidata}}, considering the equality \deqn{e_i(t) = \sum_{m=1}^p \alpha_m x_{im}(t)} with \eqn{x_{im}(t) = \sum_{j \in I(t)} B_m(||s_i - s_j||)} being the \eqn{m}'th epidemic variable for individual \eqn{i}. } \item{h\_i(t)}{ is the endemic (\code{cox}) component of the infection intensity, defined as \deqn{h_i(t) = \exp(h_0(t) + z_i(t)' \beta)} where \eqn{h_0(t)} is the log-baseline hazard function, \eqn{z_i(t)} is the vector of endemic covariates of individual \eqn{i} and \eqn{\beta} is the vector of unknown coefficients. To fit the model, the log-baseline hazard function is approximated by a piecewise constant function with known knots, but unknown levels, which will be estimated. The approximation is specified by the arguments \code{knots} or \code{nIntervals}. } } If a big number of \code{knots} (or \code{nIntervals}) is chosen, the corresponding log-baseline parameters can be rendered identifiable by the use of penalized likelihood inference. At present, it is the job of the user to choose an adequate value of the smoothing parameter \code{lambda.smooth}. Alternatively, a data driven \code{lambda.smooth} smoothing parameter selection based on a mixed model representation of an equivalent truncated power spline is offered (see reference for further details). The following two steps are iterated until converegence: \enumerate{ \item Given fixed smoothing parameter, the penalized likelihood is optimized for the regression components using a L-BFGS-B approach \item Given fixed regression parameters, a Laplace approximation of the marginal likelihood for the smoothing parameter is numerically optimized. } Depending on the data convergence might take a couple of iterations. Note also that it is unwise to include endemic covariates with huge values, as they affect the intensities on the exponential scale after having been multiplied by the parameter vector \eqn{\beta}. With big covariates the \code{optim} method "L-BFGS-B" will likely terminate due to an infinite log-likelihood or score function in some iteration. } \value{ \code{twinSIR} returns an object of \code{\link{class}} \code{"twinSIR"}. An object of this class is a list containing the following components: \item{coefficients}{a named vector of coefficients.} \item{loglik}{the maximum of the (penalized) log-likelihood function.} \item{counts}{the number of log-likelihood and score function evaluations.} \item{converged}{logical indicating convergence of the optimization algorithm.} \item{fisherinfo.observed}{if requested, the negative Hessian from \code{optim}.} \item{fisherinfo}{an estimation of the Expected Fisher Information matrix.} \item{method}{the optimization algorithm used.} \item{intervals}{a numeric vector (\code{c(minTime, knots, maxTime)}) representing the consecutive intervals of constant log-baseline.} \item{nEvents}{a numeric vector containing the number of infections in each of the above \code{intervals}.} \item{model}{if requested, the model information used. This is a list with components \code{"survs"} (data.frame with the id, start, stop and event columns), \code{"X"} (matrix of the epidemic variables), \code{"Z"} (matrix of the endemic variables), \code{"weights"} (the specified \code{weights}), \code{"lambda.smooth"} (the specified \code{lambda.smooth}), \code{"K"} (the penalty matrix used) and \code{"f"} (the distance functions used). Be aware that the model only contains those rows with \code{atRiskY == 1}!} \item{data}{if requested, the supplied \code{"epidata"} \code{data}.} \item{call}{the matched call.} \item{formula}{the specified \code{formula}.} \item{terms}{the \code{terms} object used.} } \references{ \enc{Hhle}{Hoehle}, M. (2009), Additive-Multiplicative Regression Models for Spatio-Temporal Epidemics, Biometrical Journal, 51(6):961-978. } \author{ Michael \enc{Hhle}{Hoehle} and Sebastian Meyer } \note{ There are some restrictions to modelling the infection intensity without a baseline hazard rate, i.e. without an intercept in the \code{formula}. Reason: At some point, the optimization algorithm L-BFGS-B tries to set all transmission parameters \eqn{\alpha} to the boundary value 0 and to calculate the (penalized) score function with this set of parameters (all 0). The problem then is that the values of the infection intensities \eqn{lambda_i(t)} are 0 for all \eqn{i} and \eqn{t} and especially at observed event times, which is impossible. Without a baseline, it is not allowed to have all alpha's set to 0, because then we would not observe any infections. Unfortunately, L-BFGS-B can not consider this restriction. Thus, if one wants to fit a model without baseline hazard, the control parameter \code{lower} must be specified in \code{optim.args} so that some alpha is strictly positive, e.g. \code{optim.args = list(lower = c(0,0.001,0.001,0))} and the initial parameter vector \code{par} must not be the zero vector. } \seealso{ \code{\link{as.epidata}} for the necessary data input structure, \code{\link{plot.twinSIR}} for plotting the path of the infection intensity, \code{\link{profile.twinSIR}} for profile likelihood estimation. and \code{\link{simulate.twinSIR}} for the simulation of epidemics following the fitted model. Furthermore, the standard extraction methods \code{\link[=vcov.twinSIR]{vcov}}, \code{\link[=logLik.twinSIR]{logLik}}, \code{\link[=AIC.twinSIR]{AIC}} and \code{\link[=extractAIC.twinSIR]{extractAIC}} are implemented for objects of class \code{"twinSIR"}. } \examples{ data("fooepidata") summary(fooepidata) # fit an overall constant baseline hazard rate fit1 <- twinSIR(~ B1 + B2 + cox(z2), data = fooepidata, keep.data = TRUE) fit1 summary(fit1) # fit a piecewise constant baseline hazard rate with 3 intervals using # _un_penalized ML and estimated coefs from fit1 as starting values fit2 <- twinSIR(~ B1 + B2 + cox(z2), data = fooepidata, nIntervals = 3, optim.args = list(par=c(coef(fit1)[1:2],rep(coef(fit1)[3],3),coef(fit1)[4]))) fit2 summary(fit2) # fit a piecewise constant baseline hazard rate with 9 intervals # using _penalized_ ML and estimated coefs from fit1 as starting values fit3 <- twinSIR(~ B1 + B2 + cox(z2), data = fooepidata, nIntervals = 9, lambda.smooth = 0.1, penalty = 1, optim.args = list( par=c(coef(fit1)[1:2], rep(coef(fit1)[3],9), coef(fit1)[4]))) fit3 summary(fit3) # plot of the 9 log-baseline levels plot(x=fit3$intervals, y=coef(fit3)[c(3,3:11)], type="S") ### -> for more sophisticated intensity plots, see 'plot.twinSIR' plot(fit3) \dontshow{ ### TODO (@Michael): Analysis of the 1861 hagelloch measles epidemic #data(hagelloch) #m <- twinSIR(~c1 + c2 + household + local1, data = hagelloch) #FIXME: what is "local1"? what is "local"? what about c1, c2, household? # describe this on the help page of data(hagelloch)? #FIXME: there are no functions to generate c1 and c2 in attr(hagelloch, "f") # which implies that the simulate-method doesn't work for this model #summary(m) } } \keyword{models} \keyword{optimize} surveillance/man/algo.hhh.Rd0000644000176000001440000001754312003774404015543 0ustar ripleyusers% algo.hhh \name{algo.hhh} \alias{algo.hhh} \alias{print.ah} \alias{coef.ah} \encoding{latin1} \title{Model fit based on the Held, Hoehle, Hofman paper} \description{ Fits a Poisson/negative binomial model with mean \eqn{\mu_{it}}{\mu_it} (as described in Held/\enc{Hhle}{Hoehle}/Hofmann, 2005) to a multivariate time series of counts. } \usage{ algo.hhh(disProgObj, control=list(lambda=TRUE, neighbours=FALSE, linear=FALSE, nseason = 0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"),lag.range=NULL), thetastart=NULL, verbose=TRUE) } \arguments{ \item{disProgObj}{object of class \code{disProg}} \item{control}{control object: \describe{ \item{\code{lambda}}{If \code{TRUE} an autoregressive parameter \eqn{\lambda} is included, if \code{lambda} is a vector of logicals, unit-specific parameters \eqn{\lambda_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{lambda} as a vector of integers, see Examples and Details.} \item{\code{neighbours}}{If \code{TRUE} an autoregressive parameter for adjacent units \eqn{\phi} is included, if \code{neighbours} is a vector of logicals, unit-specific parameters \eqn{\phi_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{neighbours} as a vector of integers.} \item{\code{linear}}{a \code{logical} (or a vector of logicals) indicating wether a linear trend \eqn{\beta} (or a linear trend \eqn{\beta_i} for each unit) is included} \item{\code{nseason}}{Integer number of Fourier frequencies; if \code{nseason} is a vector of integers, each unit \eqn{i} gets its own seasonal parameters } \item{\code{negbin}}{if \code{"single"} negative binomial rather than poisson is used, if \code{"multiple"} unit-specific overdispersion parameters are used.} \item{\code{proportion}}{see Details} \item{\code{lag.range}}{determines which observations are used to fit the model } }} \item{thetastart}{vector with starting values for all parameters specified in the control object (for \code{optim}). } \item{verbose}{if \code{true} information about convergence is printed} } \value{Returns an object of class \code{ah} with elements \item{coefficients}{estimated parameters} \item{se}{estimated standard errors} \item{cov}{covariance matrix} \item{loglikelihood}{loglikelihood} \item{convergence}{logical indicating whether \code{optim} converged or not} \item{fitted.values}{fitted mean values \eqn{\mu_{i,t}}{\mu_it} } \item{control}{specified control object} \item{disProgObj}{specified \code{disProg}-object} \item{lag}{which lag was used for the autoregressive parameters \eqn{lambda} and \eqn{phi} } \item{nObs}{number of observations used for fitting the model} } \details{ This functions fits a model as specified in equations (1.2) and (1.1) in Held et al. (2005) to univariate time series, and as specified in equations (3.3) and (3.2) (with extensions given in equations (2) and (4) in Paul et al., 2008) to multivariate time series. For univariate time series, the mean structure of a Poisson or a negative binomial model is \deqn{\mu_t = \lambda y_{t-lag} + \nu_t }{\mu_t = \lambda y_t-lag + \nu_t } where \deqn{\log( \nu_t) = \alpha + \beta t + \sum_{j=1}^{S}(\gamma_{2j-1} \sin(\omega_j t) + \gamma_{2j} \cos(\omega_j t) ) }{ log(\nu_t) = \alpha + \beta t + \sum_(j=1)^S (\gamma_(2j-1) * sin(\omega_j * t) + \gamma_2j * cos(\omega_j * t) ) } and \eqn{\omega_j = 2\pi j/period }{\omega_j = 2 * \pi * j / period} are Fourier frequencies with known period, e.g. \code{period}=52 for weekly data. Per default, the number of cases at time point \eqn{t-1}, i.e. \eqn{lag=1}, enter as autoregressive covariates into the model. Other lags can also be considered. For multivariate time series the mean structure is \deqn{\mu_{it} = \lambda_i y_{i,t-lag} + \phi_i \sum_{j \sim i} w_{ji} y_{j,t-lag} + n_{it} \nu_{it}}{% \mu_it = \lambda_i * y_i,t-lag + \phi_i * \sum_(j ~ i) w_ji * y_j,t-lag + n_it * \nu_it } where \deqn{\log(\nu_{it}) = \alpha_i + \beta_i t + \sum_{j=1}^{S_i} (\gamma_{i,2j-1} \sin(\omega_j t) + \gamma_{i,2j} \cos(\omega_j t) ) }{% log(\nu_it) = \alpha_i + \beta_i * t + \sum_(j=1)^S_i (\gamma_(i,2j-1) * sin(\omega_j * t) + \gamma_(i,2j) * cos(\omega_j * t) ) } and \eqn{n_{it}}{n_it} are standardized population counts. The weights \eqn{w_{ji}}{w_ji} are specified in the columns of the neighbourhood matrix \code{disProgObj$neighbourhood}. Alternatively, the mean can be specified as \deqn{\mu_{it} = \lambda_i \pi_i y_{i,t-1} + \sum_{j \sim i} \lambda_j (1-\pi_j)/ |k \sim j| y_{j,t-1} + n_{it} \nu_{it}}{% \mu_it = \lambda_i *\pi_i * y_i,t-1 + \sum_(j ~ i) \lambda_j *(1-\pi_j)/|k ~ j| * y_j,t-1 + n_it * \nu_it } if \code{proportion}="single" ("multiple") in the \code{control} argument. Note that this model specification is still experimental. } \note{ For the time being this function is not a surveillance algorithm, but only a modelling approach as described in the papers by Held et. al (2005) and Paul et. al (2008). } \seealso{\code{\link{algo.hhh.grid}}, \code{\link{hhh4}}} \author{M. Paul, L. Held, M. \enc{Hhle}{Hoehle}} \examples{ # univariate time series: salmonella agona cases data(salmonella.agona) model1 <- list(lambda=TRUE, linear=TRUE, nseason=1, negbin="single") algo.hhh(salmonella.agona, control=model1) # multivariate time series: # measles cases in Lower Saxony, Germany data(measles.weser) # same model as above algo.hhh(measles.weser, control=model1) # include autoregressive parameter phi for adjacent "Kreise" # specifiy start values for theta model2 <- list(lambda = TRUE, neighbours = TRUE, linear = FALSE, nseason = 1, negbin = "single") algo.hhh(measles.weser, control = model2, thetastart = rep(0, 20) ) ## weekly counts of influenza and meningococcal infections ## in Germany, 2001-2006 data(influMen) # specify model with two autoregressive parameters lambda_i, overdispersion # parameters psi_i, an autoregressive parameter phi for meningococcal infections # (i.e. nu_flu,t = lambda_flu * y_flu,t-1 # and nu_men,t = lambda_men * y_men,t-1 + phi_men*y_flu,t-1 ) # and S=(3,1) Fourier frequencies model <- list(lambda=c(TRUE,TRUE), neighbours=c(FALSE,TRUE), linear=FALSE,nseason=c(3,1),negbin="multiple") # run algo.hhh algo.hhh(influMen, control=model) # now meningococcal infections in the same week should enter as covariates # (i.e. nu_flu,t = lambda_flu * y_flu,t-1 # and nu_men,t = lambda_men * y_men,t-1 + phi_men*y_flu,t ) model2 <- list(lambda=c(1,1), neighbours=c(NA,0), linear=FALSE,nseason=c(3,1),negbin="multiple") algo.hhh(influMen, control=model2) } \keyword{ts} \keyword{regression} \references{ Held, L., \enc{Hhle}{Hoehle}, M., Hofmann, M. (2005) A statistical framework for the analysis of multivariate infectious disease surveillance counts, Statistical Modelling, \bold{5}, 187--199. Paul, M., Held, L. and Toschke, A. M. (2008) Multivariate modelling of infectious disease surveillance data, Statistics in Medicine, \bold{27}, 6250--6267. } surveillance/man/algo.farrington.threshold.Rd0000644000176000001440000000233211731650466021136 0ustar ripleyusers\name{algo.farrington.threshold} \alias{algo.farrington.threshold} \encoding{latin1} \title{Compute prediction interval for a new observation} \description{ Depending on the current transformation \eqn{h(y)= \{y, \sqrt{y}, y^{2/3}\}}, \deqn{V(h(y_0)-h(\mu_0))=V(h(y_0))+V(h(\mu_0))} is used to compute a prediction interval. The prediction variance consists of a component due to the variance of having a single observation and a prediction variance. } \usage{ algo.farrington.threshold(pred,phi,alpha=0.01,skewness.transform="none",y) } \arguments{ \item{pred}{A GLM prediction object} \item{phi}{Current overdispersion parameter (superflous?)} \item{alpha}{Quantile level in Gaussian based CI, i.e. an \eqn{(1-\alpha)\cdot 100\%} confidence interval is computed. } \item{skewness.transform}{Skewness correction, i.e. one of \code{"none"}, \code{"1/2"}, or \code{"2/3"}.} \item{y}{Observed number} } \value{ % Vector of length four with lower and upper bounds of an \eqn{(1-\alpha)\cdot 100\%} confidence interval (first two arguments) and corresponding quantile of observation \code{y} together with the median of the predictive distribution. % } \keyword{regression} surveillance/man/discpoly.Rd0000644000176000001440000000433512236716421015677 0ustar ripleyusers\name{discpoly} \alias{discpoly} \title{Polygonal Approximation of a Disc/Circle} \description{ Generates a polygon representing a disc/circle (in planar coordinates) as an object of one of three possible classes: \code{"\link[sp:Polygon-class]{Polygon}"}, \code{"\link[spatstat]{owin}"}, or -- if \pkg{rgeos} (or \pkg{gpclib}) are available -- \code{"\link[rgeos:gpc.poly-class]{gpc.poly}"}. } \usage{ discpoly(center, radius, npoly = 64, class = c("Polygon", "owin", "gpc.poly"), hole = FALSE) } \arguments{ \item{center}{numeric vector of length 2 (center coordinates of the circle).} \item{radius}{single numeric value (radius of the circle).} \item{npoly}{single integer. Number of edges of the polygonal approximation.} \item{class}{class of the resulting polygon (partial name matching applies). For \code{"owin"}, this is just a wrapper around \pkg{spatstat}'s own \code{\link[spatstat]{disc}} function.} \item{hole}{logical. Does the resulting polygon represent a hole?} } \value{ A polygon of class \code{class} representing a circle/disc with \code{npoly} edges accuracy.\cr If \code{class="gpc.poly"} although this formal class is not currently defined (and \pkg{rgeos} is not available), only the \code{pts} slot of a \code{"gpc.poly"} is returned with a warning. } \author{ Sebastian Meyer\cr This function is inspired by the \code{\link[spatstat]{disc}} function from package \pkg{spatstat} authored by Adrian Baddeley and Rolf Turner. } \examples{ ## Construct circles with increasing accuracy and of different spatial classes disc1 <- discpoly(c(0,0), 5, npoly=4, class = "owin") disc2 <- discpoly(c(0,0), 5, npoly=16, class = "Polygon") ## Look at the results print(disc1) plot(disc1, axes=TRUE, main="", border=2) print(disc2) lines(disc2, col=3) if (requireNamespace("rgeos")) { # for the "gpc.poly" class definition disc3 <- discpoly(c(0,0), 5, npoly=64, class = "gpc.poly") print(disc3) plot(disc3, add=TRUE, poly.args=list(border=4)) } ## if one only wants to _draw_ a circle without an object behind symbols(0, 0, circles=5, inches=FALSE, add=TRUE, fg=5) } \seealso{ \link[spatstat]{disc} in package \pkg{spatstat}. } \keyword{datagen} \keyword{spatial} surveillance/man/intersectPolyCircle.Rd0000644000176000001440000000321412236736514020037 0ustar ripleyusers\name{intersectPolyCircle} \alias{intersectPolyCircle} \alias{intersectPolyCircle.owin} \alias{intersectPolyCircle.SpatialPolygons} \alias{intersectPolyCircle.gpc.poly} \title{ Intersection of a Polygonal and a Circular Domain } \description{ This is a unifying wrapper around functionality of various packages dealing with spatial data. It computes the intersection of a circular domain and a polygonal domain (whose class defines the specific method). } \usage{ intersectPolyCircle(object, center, radius, ...) \method{intersectPolyCircle}{owin}(object, center, radius, npoly = 32, ...) \method{intersectPolyCircle}{SpatialPolygons}(object, center, radius, npoly = 32, ...) \method{intersectPolyCircle}{gpc.poly}(object, center, radius, npoly = 32, useGEOS = FALSE, ...) } \arguments{ \item{object}{a polygonal domain of one of the supported classes.} \item{center,radius,npoly}{see \code{\link{discpoly}}.} \item{useGEOS}{logical indicating if package \pkg{rgeos} (\code{\link[rgeos]{gIntersection}}) should be used instead of package \pkg{gpclib}. The latter (default) requires explicit acceptance of \pkg{gpclib}'s restricted license via \code{\link{surveillance.options}(gpclib=TRUE)}.} \item{\dots}{potential further arguments (from the generic).} } \value{ a polygonal domain of the same class as the input \code{object}. } \author{ Sebastian Meyer } \seealso{ \code{\link{discpoly}} to generate a polygonal approximation to a disc } \examples{ data("letterR", package="spatstat") plot(letterR) plot(intersectPolyCircle(letterR, c(3,2), 1), add=TRUE, col=2, lwd=3) } \keyword{spatial} \keyword{manip} surveillance/man/sts-class.Rd0000644000176000001440000001660112242432222015753 0ustar ripleyusers\name{sts-class} \Rdversion{1.1} \docType{class} \alias{sts-class} % % accessing the slots \alias{alarms,sts-method} \alias{alarms<-,sts-method} \alias{upperbound,sts-method} \alias{upperbound<-,sts-method} \alias{control,sts-method} \alias{control<-,sts-method} \alias{epoch,sts-method} \alias{epoch<-,sts-method} \alias{observed,sts-method} \alias{observed<-,sts-method} \alias{population,sts-method} \alias{population<-,sts-method} \alias{multinomialTS,sts-method} \alias{multinomialTS<-,sts-method} \alias{neighbourhood,sts-method} \alias{neighbourhood<-,sts-method} % other access methods \alias{nrow,sts-method} \alias{ncol,sts-method} \alias{dim,sts-method} \alias{colnames,sts,missing,missing-method} \alias{epochInYear} \alias{epochInYear,sts-method} \alias{year} \alias{year,sts-method} % other methods \alias{initialize,sts-method} \alias{as.data.frame,sts-method} \encoding{latin1} \title{Class \code{"sts"} -- surveillance time series} \description{ This is a lightweight S4 class to implement multivariate time series of counts used for public health surveillance data. The class captures the time series data as well as the spatial layout of the regions, where the data originate from. } \section{Slots}{ \describe{ \item{\code{epoch}:}{Object of class \code{numeric} or specifying the time of observation. In old versions of the package this used to be the week numbers. However, depending on the \code{freq} argument, it can now be day or month as well. Furthermore, if \code{epochAsDate=TRUE} then it is the \code{as.numeric} representation of \code{Date} objects giving the exact date of the observation. Note: This slot used to be called \code{week} in earlier versions of the package, but has now been renamed to reflect the greater flexibility in the choice of observation time.} \item{\code{freq}:}{If weekly data \code{freq} corresponds to 52, in case of monthly data \code{freq} is 12.} \item{\code{start}:}{vector of length two denoting the year and the sample number (week, month, etc.) of the first observation} \item{\code{observed}:}{A matrix of size \code{length(epoch)} times the number of regions containing the weekly/monthly number of counts in each region. The colnames of the matrix should match the ID values of the shapes in the \code{map} slot.} \item{\code{state}:}{Matrix with the same dimension as \code{observed} containing booleans whether at the specific time point there was an outbreak in the region} \item{\code{alarm}:}{Matrix with the same dimension as \code{observed} specifying whether an outbreak detection algorithm declared a specific time point in the region as having an alarm. If the object containins just observations then this slot is null. } \item{\code{upperbound}:}{Matrix with upper bound values } \item{\code{neighbourhood}:}{Symmetric matrix of size \eqn{(number of regions)^2} describing the neighbourhood structure. It may either be a binary adjacency matrix or contain neighbourhood orders.} \item{\code{populationFrac}:}{A \code{matrix} of population fractions (with dimensions \code{dim(observed)}).} \item{\code{map}:}{Object of class \code{SpatialPolygonsDataFrame} providing a shape of the areas which are monitored. } \item{\code{control}:}{Object of class \code{list}, thais is a rather free data type to be returned by the surveillance algorithms. } \item{\code{epochAsDate}:}{Object of class \code{"logical"} stating whether to use a ISO 8601 representation of the \code{epoch} slot using the \code{Date} class (\code{epochAsDate=TRUE}) or just to interpret the epochs as numerics (\code{epochAsDate=FALSE}).} \item{\code{multinomialTS}:}{Object of class \code{"logical"} stating whether to interpret the object as \code{observed} out of \code{population}, i.e. a multinomial interpretation instead of a count interpretation.} } } \section{Methods}{ \describe{ \item{nrow}{\code{signature(x = "sts")}: extract number of rows of the \code{observed} matrix slot. The dimension of the other matrix slots is similar.} \item{ncol}{\code{signature(x = "sts")}: extract number of columns of the \code{observed} matrix slot.} \item{dim}{\code{signature(x = "sts")}: extract matrix dimensions of \code{observed} using \code{\link{dim}}.} \item{observed}{\code{signature(x = "sts")}: extract the \code{observed} slot of an \code{sts} object.} \item{population}{\code{signature(x = "sts")}: extract the \code{population} slot of an \code{sts} object.} \item{multinomialTS}{\code{signature(x = "sts")}: extract the \code{multinomialTS} slot of an \code{sts} object.} \item{neighbourhood}{\code{signature(x = "sts")}: extract the \code{neighbourhood} slot of an \code{sts} object.} \item{alarms}{\code{signature(x = "sts")}: extract the \code{alarm} slot of an \code{sts} object.} \item{upperbound}{\code{signature(x = "sts")}: extract the \code{upperbound} slot of an \code{sts} object.} \item{control}{\code{signature(x = "sts")}: extract the \code{control} slot of an \code{sts} object.} \item{epoch}{\code{signature(x = "sts")}: extract the \code{epoch} slot of an \code{sts} object. If ISO dates are used then the returned object is of class \code{Date}.} \item{epochInYear}{\code{signature(x = "sts")}: Returns the epoch number within the year of the \code{epoch} slot.} \item{colnames}{\code{signature(x="sts",do.NULL="missing",prefix="missing")}: extract \code{\link{colnames}} of the \code{observed} matrix.} \item{initialize}{\code{signature(x="sts")}: the internal function \code{init.sts} is called, which assigns all slots. } \item{aggregate}{\code{signature(x="sts")}: see \code{\link{aggregate,sts-method}}} \item{year}{\code{signature(x = "sts")}: extracts the corresponding year of each observation of \code{x}} \item{obsinyear}{\code{signature(x = "sts")}: extracts the corresponding week number within the year of each observation of \code{x}} \item{as.data.frame}{\code{signature(x = "sts")}: converts the \code{observed}, \code{epoch}, \code{state} and \code{alarm} slots of \code{x} into a data frame with column names matching the colnames of the respective slots. Useful when one wants to fit a model based on the object} \item{plot}{\code{signature(x="sts",y="missing",function(x, y, type,...)...)}: this function is the successor of the \code{\link{plot.disProg}} and \code{\link{plot.survRes}} functions. It takes (more or less) the same arguments as \code{plot.survRes}. The most important difference is the type of plot, which is specified using \code{type}. See \code{\link{show,sts-method}} for details. } } } \author{M. \enc{Hhle}{Hoehle}} \examples{ if (requireNamespace("maptools")) { # load disProg-object "ha" and convert to S4-class "sts" data("ha") shpfile <- system.file("shapes/berlin.shp",package="surveillance") ha.sts <- disProg2sts(ha, map=maptools::readShapePoly(shpfile,IDvar="SNAME")) } else { data("ha.sts") # is almost identical to the above except that German umlauts # have been replaced in 'ha.sts@map@data$BEZIRK' for compatibility reasons } ha.sts plot(ha.sts, type=observed ~ 1 | unit) } \keyword{classes} surveillance/man/test.Rd0000644000176000001440000000154111745750766015042 0ustar ripleyusers\name{test} \alias{test} \encoding{latin1} \title{Print xtable for several diseases and the summary} \description{Just a test method} \usage{ test(data = c("k1", "m5"), range = 157:339) } \arguments{ \item{data}{vector of abbreviations for the diseases} \item{range}{timepoints to evaluate} } \value{ \item{xtable}{printed latex tables} } \details{The specified datasets are readed, corrected, enlarged and sent to the RKI 1, RKI 2, RKI 3 and Bayes system. The quality values are computed and printed for each diesease as latex table. Additonally a summary latex table for all diseases is printed } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ test( c("m1", "m2", "m3", "m4", "m5", "q1_nrwh", "q2", "s1", "s2", "s3", "k1", "n1", "n2", "h1_nrwrp") ) } \keyword{misc} surveillance/man/nowcast.Rd0000644000176000001440000001460112122142736015520 0ustar ripleyusers\encoding{latin1} \name{nowcast} \alias{nowcast} %Internal functions \alias{nowcast.fit} \alias{dist.median} \alias{outside.ci} \alias{logS} \alias{RPS} \title{ Adjust observed epidemic curve for reporting delay of cases } \description{ Nowcasting can help to obtain up-to-date information on epidemic trends during an outbreak situation, when reports about important indicators (such as hospitalizations) only arrive with delay. Note: This function is experimental and currently does not deal with right-truncation of the observations. An improved version is to be expected. } \usage{ nowcast(s, t, D, dEventCol = "dHospital", dReportCol = "dReport", method = c("freq.pi","bayes.nb","bayes.betapi","bayes.bnb","uniform"), aggregate.by="1 day", control = list( dRange = NULL, timeDelay = function(d1,d2) {as.numeric(d2-d1)}, estimateF = NULL, alpha = 0.05, y.prior.max = 300, B = 1e5, score = FALSE, PMF=FALSE, sts.truth=FALSE)) } \arguments{ \item{s}{ an object of class \code{Date} denoting the day at which to do the nowcast } \item{t}{a vector of \code{Date} objects denoting the day(s) for which the projections are to be done. One needs to ensure t <= s. } \item{D}{A data frame with one row per case -- for each case on needs information on the day of the event (e.g. hospitalization) and the day of report of this event. } \item{dEventCol}{The name of the column in \code{D} which contains the date of the event, e.g. hospitalization. Default: \code{"dHospital"}. } \item{dReportCol}{Name of the column in \code{D} containing the date at which the report arrives at the respective register. Default: \code{"dReport"}. } \item{method}{A vector of strings denoting the different methods to use. Note that results of the first name in this list are officially returned by the function. However, it is possible to specify several methods here, e.g. in order to compare score evaluations. } \item{aggregate.by}{Time scale used for the temporal aggregation of the records in the data \code{D}. See \link{linelist2sts} and \link{seq.Date} for further information.} \item{control}{A list with named arguments controlling the functionality of the nowcasting. \describe{ \item{dRange}{Default: \code{NULL}. In this case the \code{dEventCol} column is used to extract the first and last available in \code{D}.} \item{timeDelay}{A function taking arguments \code{d1} and \code{d2} and which computes the time span between them. Default: \code{function(d1,d2) {as.numeric(d2-d1)}}. However, more advanced function are imaginable. See examples. } \item{estimateF}{Denotes the estimation procedure for the CDF of the delay distribution. The function should have a header of the form \code{function(Ds,s,dReportCol)}, where \code{Ds} is the linelist of all cases available at \code{s} and \code{dReportCol} denotes the column containing the report data. If \code{NULL} (Default) then the empirical CDF is computed each time based on all available data. Otherwise, one can specify a function based on more complex modelling. Results needs to be a CDF, e.g. as a stepfunction. } \item{alpha}{Equal tailed (1-\eqn{\alpha}{alpha})*100\% prediction intervals are calculated. Default: 0.05.} \item{y.prior.max}{Limit of the support of \eqn{y_t}{yt}. The value needs to be high enough such that at this limit only little of the predictive distribution is right-truncated. Default: 300} \item{B=1e5}{Number of samples to use in the method \code{"freq.pi"}. Default: 1e5} \item{score}{Compute scoring rules. Default: \code{FALSE}. The computed scores are found in the \code{control} slot of the result.} \item{PMF}{Boolean whether to teturn the probability mass functions of the individual forecasts (Default: \code{FALSE}). The result can be found in the \code{control} slot of the return object.} \item{sts.truth}{Boolean whether to return an sts object containing the true number of counts (ignoring reporting delays). Result would be found in the \code{control} slot.} } } } \details{ No details currently available. } \value{ \code{nowcast} returns an object of \code{"\linkS4class{stsBP}"}. The \code{upperbound} slot contains the median of the method specified at position one of the argument \code{method}. } \references{ Donker T, van Boven M, van Ballegooijen WM, Van't Klooster TM, Wielders CC, Wallinga J. (2011), Nowcasting pandemic influenza A/H1N1 2009 hospitalizations in the Netherlands, Eur J Epidemiol. 2011 Mar;26(3):195-201. Epub 2011 Mar 18. an der Heiden M, Wadl M, \enc{Hhle}{Hoehle} M (2011), Now-Casting during a huge outbreak of haemolytic-uremic syndrome in Germany 2011, Abstracts of the ESCAIDE conference, Stockholm, Sweden, 6-8 Nov, 2011. } \author{ Michael \enc{Hhle}{Hoehle} } \note{ The methods and implementation is still experimental. } %\seealso{ %} \examples{ #Load simulated outbreak data. url <- paste("http://www.stat.uni-muenchen.de/~hoehle/", "teaching/moid2011/tutorials/cast-backnow/outbreak.txt",sep="") D <- try(read.table(url,header=TRUE,colClasses=c("integer",rep("Date",3)))) if (!inherits(D, "try-error")) { s <- as.Date("2011-06-02") ; k <- 10 ; l <- 3 t <- seq(s-k-l+1,s-l,by="1 day") dRange <- as.Date(c("2011-05-01","2011-07-10")) #Perform the nowcast nc <- nowcast(s=s,t=t,D=D,dEventCol="dHospital",dReportCol="dRegister", method="bayes.nb",aggregate.by="1 day",control=list(dRange=dRange)) #Show result plot(nc,xaxis.years=FALSE,dx.upperbound=0,legend=NULL,lty=c(1,1,1), lwd=c(1,1,2),ylab="Cases",xlab="Time (days)",main="", ylim=c(0,max(nc@ci,na.rm=TRUE))) idx <- max(which(!is.na(upperbound(nc)))) lines( c(idx-0.5,idx+0.5), rep(upperbound(nc)[idx,],2),lwd=2,col="blue") ##Show CIs for (i in 1:nrow(nc)) { points(i, upperbound(nc)[i,], col="indianred") lines( i+c(-0.3,0.3), rep(nc@ci[i,,1],2),lty=1,col="indianred2") lines( i+c(-0.3,0.3), rep(nc@ci[i,,2],2),lty=1,col="indianred2") lines( rep(i,each=2), nc@ci[i,,],lty=2,col="indianred2") } #Add "now" on the x-axis points( as.numeric(s-dRange[1])+1,0,pch=10,cex=1.5,col="red") } } \keyword{models} \keyword{optimize} surveillance/man/hhh4_predict.Rd0000644000176000001440000000220012206614637016406 0ustar ripleyusers\name{predict.ah4} \alias{predict.ah4} \title{Predictions from a \code{hhh4} Model} \description{ Get fitted (component) means from a \code{\link{hhh4}} model (of class \code{"ah4"}). } \usage{ \method{predict}{ah4}(object, newSubset=control$subset, type="response", \dots) } \arguments{ \item{object}{fitted \code{\link{hhh4}} model object of class \code{"ah4"}.} \item{newSubset}{subset of time points for which to return the predictions. Defaults to the subset used for fitting the model, and must be a subset of \code{1:nrow(object$stsObj)}.} \item{type}{the type of prediction required. The default (\code{"response"} or, equivalently, \code{"mean"}) is on the scale of the response variable (mean = endemic plus epidemic components). The alternatives are: \code{"endemic"}, \code{"epidemic"}, \code{"epi.own"} (i.e. the autoregresssive part), and \code{"epi.neighbours"} (i.e. the spatio-temporal part).} \item{\dots}{unused (argument of the generic).} } \value{ matrix of fitted means for each time point (of \code{newSubset}) and region. } \author{Michaela Paul and Sebastian Meyer} \keyword{methods} \keyword{models} surveillance/man/powerlaw.Rd0000644000176000001440000000502012212102166015666 0ustar ripleyusers\name{powerlaw} \alias{powerlaw} \title{ Power-Law Neighbourhood Weights for \code{hhh4} Models } \description{ Set up a power-law weight structure for the neighbourhood component of \code{\link{hhh4}} models, i.e., without normalization we have \eqn{w_{ji} = o_{ji}^{-d}}{w_ji = o_ji^-d}, where \eqn{o_{ji}}{o_ji} is the order of neighbourhood between regions \eqn{i} and \eqn{j}, see \code{\link{nbOrder}}. } \usage{ powerlaw(maxlag, normalize = TRUE, log = FALSE, initial = if (log) 0 else 1) } \arguments{ \item{maxlag}{single integer specifying up to which order of neighbourhood the weights should be positive; they will be set to 0 for higher orders. If spatial dependence is not to be truncated at some high order, \code{maxlag} should be set to the maximum neighbourhood order in the network of regions.} \item{normalize}{logical indicating if the weights should be normalized such that the rows of the weight matrix sum to 1.} \item{log}{logical indicating if the decay parameter should be estimated on the log-scale to ensure positivity.} \item{initial}{scalar initial value for the (log-)decay parameter.} } \value{ a list which can be passed as a specification of parametric neighbourhood weights in \code{\link{hhh4}}. } \references{ Meyer, S. and Held, L. (2013): Modelling power-law spread of infectious diseases. \emph{arXiv:1308.5115}\cr arXiv-Link: \url{http://arxiv.org/abs/1308.5115} } \author{ Sebastian Meyer } \seealso{ \code{\link{nbOrder}} to determine the matrix of neighbourhood orders from a binary adjacency matrix. \code{\link{siaf.powerlaw}} for modelling power-law distance decay in \code{\link{twinstim}} space-time point process models. } \examples{ if (requireNamespace("spdep")) { data("measles.weser") measles <- disProg2sts(measles.weser) ## parametric powerlaw weights require neighbourhood orders in the data neighbourhood(measles) <- nbOrder(neighbourhood(measles), maxlag=Inf) ## a simple hhh4 model with power-law decay of spatial interaction m <- list(ar = list(f = ~ 1), ne = list(f = ~ 1, weights = powerlaw(maxlag=4, log=FALSE)), end = list(f = addSeason2formula(~-1 + ri(), S=1, period=52), offset = population(measles)), family = "NegBin1", verbose=TRUE) ## fit the model set.seed(1) # random intercepts are initialized randomly fit <- hhh4(measles, m) summary(fit) # "neweights.d" is the decay parameter } } \keyword{spatial} \keyword{models} \keyword{utilities} surveillance/man/stsAggregate.Rd0000644000176000001440000000247411746056122016473 0ustar ripleyusers\name{aggregate-methods} \docType{methods} \alias{aggregate,sts,ANY,ANY-method} \alias{aggregate,sts-method} \title{Aggregate the the series of an sts object} \description{ Method to aggregate the matrix slots of an sts object. Either the time series is aggregated so a new sampling frequency of \code{nfreq} units per time slot is obtained -- i.e as in \code{\link{aggregate.ts}}. The other option is to aggregate over all \code{ncol} units. Note: The function is not 100\% consistent with what the generic function \code{\link{aggregate}} does. } \section{Methods}{ \describe{ \item{x = "sts", by="time", nfreq="all",...}{ \describe{ \item{x}{an object of class \code{sts}} \item{by}{a string being either "time" or "unit"} \item{nfreq}{new sampling frequency if \code{by=="time"}. If \code{nfreq=="all"} then all time instances are summed.} \item{...}{not used} } returns an object of class \code{sts} } } } \details{ Warning: In case the aggregation is by unit the upperbound slot is set to NA. Furthermore the MAP object is left as is, but the object cannot be plotted anymore. } \seealso{ \code{\link{aggregate}} } \examples{ data("ha") has4 <- disProg2sts(ha) dim(has4) dim(aggregate(has4,by="unit")) dim(aggregate(has4,nfreq=13)) } \keyword{methods} surveillance/man/algo.rogerson.Rd0000644000176000001440000001105311731650466016630 0ustar ripleyusers\name{algo.rogerson} \alias{algo.rogerson} \title{Modified CUSUM method as proposed by Rogerson and Yamada (2004)} \description{ Modified Poisson CUSUM method that allows for a time-varying in-control parameter \eqn{\theta_{0,t}} as proposed by Rogerson and Yamada (2004). The same approach can be applied to binomial data if \code{distribution="binomial"} is specified. } \usage{ algo.rogerson(disProgObj, control = list(range = range, theta0t = NULL, ARL0 = NULL, s = NULL, hValues = NULL, distribution = c("poisson","binomial"), nt = NULL, FIR=FALSE, limit = NULL, digits = 1)) } \arguments{ \item{disProgObj}{object of class \code{disProg} that includes a matrix with the observed number of counts} \item{control}{ list with elements \describe{ \item{range}{vector of indices in the observed matrix of \code{disProgObj} to monitor} \item{theta0t}{matrix with in-control parameter, must be specified} \item{ARL0 }{ desired average run length \eqn{\gamma} } \item{s}{change to detect, see \code{\link{findH}} for further details} \item{hValues}{matrix with decision intervals \code{h} for a sequence of values \eqn{\theta_{0,t}} (in the range of \code{theta0t}) } \item{distribution}{\code{"poisson"} or \code{"binomial"} } \item{nt}{optional matrix with varying sample sizes for the binomial CUSUM} \item{FIR}{a FIR CUSUM with head start \eqn{\frac{\code{h}}{2}} is applied to the data if \code{TRUE}, otherwise no head start is used; see details } \item{limit}{numeric that determines the procedure after an alarm is given, see details} \item{digits}{the reference value and decision interval are rounded to \code{digits} decimal places. Defaults to 1 and should correspond to the number of digits used to compute \code{hValues} } } } } \details{ The CUSUM for a sequence of Poisson or binomial variates \eqn{x_t} is computed as \deqn{S_t = \max \{0, S_{t-1} + c_t (x_t- k_t)\} , \, t=1,2,\ldots ,} where \eqn{S_0=0} and \eqn{c_t=\frac{h}{h_t} }; \eqn{k_t} and \eqn{h_t} are time-varying reference values and decision intervals. An alarm is given at time \eqn{t} if \eqn{S_t \geq h}. If \code{FIR=TRUE}, the CUSUM starts with a head start value \eqn{S_0=\frac{\code{h}}{2}} at time \eqn{t=0}. After an alarm is given, the FIR CUSUM starts again at this head start value. The procedure after the CUSUM gives an alarm can be determined by \code{limit}. Suppose that the CUSUM signals at time \eqn{t}, i.e. \eqn{S_t \geq h}. %as suggested by Kenett and Pollack (1983) for the standard CUSUM. For numeric values of \code{limit}, the CUSUM is bounded above after an alarm is given, % at time \eqn{t-1}, i.e. \eqn{S_{t}} is set to \eqn{ \min\{\code{limit} \cdot h,S_{t}\} }. %\deqn{S_{t} = \max \{0, S_{t-1} + c_t(x_t - k_t)\}. } Using \code{limit}=0 corresponds to resetting \eqn{S_t} to zero after an alarm as proposed in the original formulation of the CUSUM. If \code{FIR=TRUE}, \eqn{S_{t}} is reset to \eqn{ \frac{\code{h}}{2} } (i.e. \code{limit}=\eqn{\frac{\code{h}}{2} } ). If \code{limit=NULL}, no resetting occurs after an alarm is given. } \note{\code{algo.rogerson} is a univariate CUSUM method. If the data are available in several regions (i.e. \code{observed} is a matrix), multiple univariate CUSUMs are applied to each region. } \value{Returns an object of class \code{survRes} with elements \item{alarm}{indicates whether the CUSUM signaled at time \eqn{t} or not (1 = alarm, 0 = no alarm) } \item{upperbound}{CUSUM values \eqn{S_{t}} } \item{disProgObj}{\code{disProg} object } \item{control}{list with the alarm threshold \eqn{h} and the specified control object} } \examples{ # simulate data set.seed(123) data <- simHHH(control = list(coefs = list(alpha =-0.5, gamma = 0.4, delta = 0.6)),length=300) # extract mean used to generate the data lambda <- data$endemic # determine a matrix with h values hVals <- hValues(theta0 = 10:150/100, ARL0=500, s = 1, distr = "poisson") # apply modified Poisson CUSUM res <- algo.rogerson(data$data, control=c(hVals, list(theta0t=lambda,range=1:300))) plot(res) } \references{ Rogerson, P. A. and Yamada, I. Approaches to Syndromic Surveillance When Data Consist of Small Regional Counts. Morbidity and Mortality Weekly Report, 2004, 53/Supplement, 79-85 % %Kenett, R. and Pollack, M. On Sequential Detection of a Shift in the %Probability of a Rare Event. Journal of the American Statistical Association, %1983, 78, 389-395 } \seealso{\code{\link{hValues}}} \keyword{classif} surveillance/man/twinSIR_epidata_intersperse.Rd0000644000176000001440000000263011745466114021523 0ustar ripleyusers\name{twinSIR_epidata_intersperse} \alias{intersperse} \title{ Impute Blocks for Extra Stops in \code{"epidata"} Objects } \description{ This function modifies an object inheriting from class \code{"epidata"} such that it features the specified stop time points. For this purpose, the time interval in the event history into which the new stop falls will be splitted up into two parts, one block for the time period until the new stop -- where no infection or removal occurs -- and the other block for the time period from the new stop to the end of the original interval.\cr Main application is to enable the use of \code{knots} in \code{twinSIR}, which are not existing stop time points in the \code{"epidata"} object. } \usage{ intersperse(epidata, stoptimes) } \arguments{ \item{epidata}{ an object inheriting from class \code{"epidata"}. } \item{stoptimes}{ a numeric vector of time points inside the observation period of the \code{epidata}. } } \value{ an object of the same class as \code{epidata} with additional time blocks for any new \code{stoptimes}. } \author{ Sebastian Meyer } %\seealso{ %} \examples{ data("fooepidata") subset(fooepidata, start < 25 & stop > 25, select = 1:7) nrow(fooepidata) moreStopsEpi <- intersperse(fooepidata, c(25,75)) nrow(moreStopsEpi) subset(moreStopsEpi, stop == 25 | start == 25, select = 1:7) } \keyword{spatial} \keyword{manip} surveillance/man/correct53to52.Rd0000644000176000001440000000230711731650466016376 0ustar ripleyusers\name{correct53to52} \alias{correct53to52} \title{Data Correction from 53 to 52 weeks} \description{Correction of data from 53 to 52 weeks a year } \usage{ correct53to52(disProgObj, firstweek = 1) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain).} \item{firstweek}{the number of the first week in a year, default = 1 (if it starts with the beginning of a year). Necessary, because the infected of week 53 and the infected of week 52 must be added.} } \value{ \item{disProg}{a object \code{disProg} (disease progress) including a list of the observed and the state chain (corrected to 52 weeks instead of 53 weeks a year)} } \details{\code{\link{readData}} reads data with 53 weeks a year, but normally one year is said to have 52 weeks. } \seealso{\code{\link{readData}} } \examples{ #This call correct53to52 automatically obj <- readData("k1",week53to52=TRUE) correct53to52(obj) # first entry is the first week of the year obj <- readData("n1",week53to52=FALSE) correct53to52(obj, firstweek = 5) # now it's assumed that the fifth # entry is the first week of the year } \keyword{utilities} surveillance/man/find.kh.Rd0000644000176000001440000000247411744234335015376 0ustar ripleyusers\name{find.kh} \alias{find.kh} \title{Determine the k and h values in a standard normal setting} \description{ Given a specification of the average run length in the (a)cceptance and (r)ejected setting determine the k and h values in a standard normal setting. } \usage{ find.kh(ARLa = 500, ARLr = 7, sided = "one", method = "BFGS", verbose=FALSE) } \arguments{ \item{ARLa}{average run length in acceptance setting, aka. in control state. Specifies the number of observations before false alarm.} \item{ARLr}{average run length in rejection state, aka. out of control state. Specifies the number of observations before an increase is detected (i.e. detection delay)} \item{sided}{one-sided cusum scheme} \item{method}{Which method to use in the function \code{\link{optim}}. Standard choice is BFGS, but in some situation Nelder-Mead can be advantageous.} \item{verbose}{gives extra information about the root finding process} } \value{ Returns a list with reference value k and decision interval h. } \details{ Functions from the \pkg{spc} package are used in a simple univariate root finding problem. } %\seealso{} %\author{} \examples{ find.kh(ARLa=500,ARLr=7,sided="one") find.kh(ARLa=500,ARLr=3,sided="one") } \keyword{models} %\source{} surveillance/man/scale.gpc.poly.Rd0000644000176000001440000000133212060131326016652 0ustar ripleyusers\name{scale.gpc.poly} \alias{scale.gpc.poly} \title{Centering and Scaling a \code{"gpc.poly"} Polygon} \description{ This is a re-implementation of the corresponding method from package \pkg{gpclib} to also allow centering. } \usage{ \method{scale}{gpc.poly}(x, center = c(0,0), scale = c(1,1)) } \arguments{ \item{x}{an object of class \code{"gpc.poly"}.} \item{center}{numeric vector of length 2 (x,y), which will be subtracted from the respective coordinates of \code{x}.} \item{scale}{numeric vector of length 2 (x,y), which serves as the divisor for the respective coordinates of \code{x}.} } \value{ A \code{"gpc.poly"}, the shifted and/or scaled version of \code{x}. } \keyword{methods} \keyword{manip} surveillance/man/twinstim_iaf.Rd0000644000176000001440000003655012212071030016532 0ustar ripleyusers\encoding{latin1} \name{twinstim_iaf} \alias{siaf.constant} \alias{siaf.gaussian} \alias{siaf.lomax} \alias{siaf.powerlaw} \alias{siaf.powerlawL} \alias{tiaf.constant} \alias{tiaf.exponential} \title{ Temporal and Spatial Interaction Functions for \code{twinstim} } \description{ A \code{twinstim} model as described in Meyer et al. (2012) requires the specification of the spatial and temporal interaction functions (\eqn{f} and \eqn{g}, respectively), i.e. how infectivity decays with increasing spatial and temporal distance from the source of infection. It is of course possible to define own functions (which are implemented as list objects with required components described in the \dQuote{Value} section below), but the package also predefines some dispersal kernels returned by the constructor functions documented here. } \usage{ # predefined spatial interaction functions siaf.constant() siaf.gaussian(nTypes = 1, logsd = TRUE, density = FALSE, F.adaptive = TRUE, effRangeMult = 6, validpars = NULL) siaf.lomax(nTypes = 1, logpars = TRUE, density = FALSE, effRangeProb = NULL, validpars = NULL) siaf.powerlaw(nTypes = 1, logpars = TRUE, effRangeProb = NULL, validpars = NULL) siaf.powerlawL(nTypes = 1, logpars = TRUE, effRangeProb = NULL, validpars = NULL) # predefined temporal interaction functions tiaf.constant() tiaf.exponential(nTypes = 1) } \arguments{ \item{nTypes}{ determines the number of parameters ((log-)scales or (log-)shapes) of the kernels. In a multitype epidemic, the different types may share the same spatial interaction function, in which case \code{nTypes=1}. Otherwise \code{nTypes} should equal the number of event types of the epidemic, in which case every type has its own (log-)scale or (log-)shape, respectively. Currently, the constructor function for the Lomax and the power law kernels \code{siaf.lomax}, \code{siaf.powerlaw}, \code{siaf.powerlawL}, respectively, only allows a type-invariant kernel (\code{nTypes=1}). } \item{logsd, logpars}{ logical indicating if the kernel should be parametrized with the log-standard deviation (or log(scale) and log(shape)) as the parameter(s) in question to enforce positivity. This is the recommended default and avoids constrained optimisation (L-BFGS-B) or the use of \code{validpars}. The alternative (\code{FALSE}) is only implemented for \code{siaf.gaussian}. } \item{density}{ logical. If \code{TRUE}, a density is used as the interaction function: for \code{siaf.gaussian}, the density of the bivariate, isotropic normal distribution, for \code{siaf.lomax}, \eqn{f(||\bold{s}||)} is the density of the (univariate) Lomax distribution (\eqn{f(\bold{s})} is not a bivariate density here). However, in this case, the magnitude of the interaction function depends on the parameters of the distribution, which interferes with the identification of an epidemic intercept. Hence, the use of \code{density = TRUE} is not recommended.\cr For \code{density = FALSE}, \code{siaf.gaussian} uses the kernel of the bivariate normal density, and \code{siaf.lomax} is normalized to unity at the origin, i.e. \eqn{f(\bold{s}) / f(\bold{0})} is used. However, the latter still has proportionality constants in the kernel, which is why the use of \code{siaf.lomax} is deprecated. The new \code{siaf.powerlaw} replaces \code{siaf.lomax} and uses the pure kernel of the Lomax density (see Details). } \item{F.adaptive}{ If \code{F.adaptive = TRUE}, then an adaptive bandwidth of \code{adapt*sd} will be used in the midpoint-cubature (\code{\link[polyCub]{polyCub.midpoint}} in package \pkg{polyCub}) of the Gaussian interaction kernel, where \code{adapt} is an extra parameter of the returned \code{siaf$F} function and defaults to 0.1, but it may also be specified in the \code{control.siaf$F} argument list of \code{twinstim}.\cr Otherwise, if \code{F.adaptive = FALSE}, a general cubature method (\code{\link[polyCub]{polyCub}}) is returned as \code{siaf$F} component, where the \code{method} and accuracy (\code{eps}, \code{dimyx}, or \code{nGQ}, depending on the method) should then be specified in \code{twinstim}'s \code{control.siaf$F} argument. } \item{effRangeMult}{ determines the effective range for numerical integration in terms of multiples of the standard deviation \eqn{\sigma} of the Gaussian kernel, i.e. with \code{effRangeMult=6} numerical integration only considers the \eqn{6 \sigma} area around the event instead of the whole observation region \code{W}. Setting \code{effRangeMult=NULL} will disable the integral approximation with an effective integration range. } \item{effRangeProb}{ numeric scalar in \eqn{(0,1)}, which determines the effective range for numerical integration in terms of the corresponding quantile of the univariate Lomax distribution. May also be \code{NULL} (default), which disables the integral approximation with an effective integration range. } \item{validpars}{ function taking one argument, the parameter vector, indicating if it is valid. If \code{logsd=FALSE} or \code{logpars=FALSE} and one prefers not to use \code{method="L-BFGS-B"} for fitting the \code{twinstim}, then \code{validpars} should be set to \code{function (pars) pars > 0}. } } \details{ The readily available spatial interaction functions are defined as follows: \describe{ \item{\code{siaf.constant}:}{ \eqn{f(s) = 1} } \item{\code{siaf.gaussian}:}{ \eqn{f(s|\kappa) = \exp(-||s||/2/\sigma_\kappa^2)}\cr If \code{nTypes=1} (single-type epidemic or type-invariant \code{siaf} in multi-type epidemic), then \eqn{\sigma_\kappa = \sigma} for all types \eqn{\kappa}. If \code{density=TRUE}, then the kernel formula above is additionally divided by \eqn{2 \pi \sigma_\kappa^2}, yielding the density of the bivariate, isotropic Gaussian distribution with zero mean and covariance matrix \eqn{\sigma_\kappa^2 I_2}. } \item{\code{siaf.lomax}:}{ \eqn{f(s) = (\sigma / (||s|| + \sigma))^{\alpha+1}},\cr which is the density of the univariate Lomax distribution scaled to 1 at the origin, i.e. divided by \eqn{\alpha / \sigma}. If \code{density=TRUE}, the original Lomax density is used. Due to potential identifiability issues with an epidemic intercept, \code{siaf.lomax} is deprecated and \code{siaf.powerlaw} should be used instead! } \item{\code{siaf.powerlaw}:}{ \eqn{f(s) = (||s|| + \sigma)^{-d}},\cr which is the pure kernel of the Lomax density, i.e. without any proportionality constants. The parameters are optimized on the log-scale to ensure positivity, i.e. \eqn{\sigma = \exp(\tilde{\sigma})} and \eqn{d = \exp(\tilde{d})}, where \eqn{(\tilde{\sigma}, \tilde{d})} is the parameter vector. } \item{\code{siaf.powerlawL}:}{ \eqn{f(s) = (||s||/\sigma)^{-d}}, for \eqn{||s|| \ge \sigma}, and \eqn{f(s) = 1} otherwise,\cr which is a \emph{L}agged power-law kernel featuring uniform short-range dispersal (up to distance \eqn{\sigma}) and a power-law decay (Pareto-style) from distance \eqn{\sigma} onwards. The parameters are optimized on the log-scale to ensure positivity, i.e. \eqn{\sigma = \exp(\tilde{\sigma})} and \eqn{d = \exp(\tilde{d})}, where \eqn{(\tilde{\sigma}, \tilde{d})} is the parameter vector. } } Furthermore, there are two predefined temporal interaction functions: \describe{ \item{\code{tiaf.constant}:}{ \eqn{g(t) = 1} } \item{\code{tiaf.exponential}:}{ \eqn{g(t|\kappa) = \exp(-\alpha_\kappa t)},\cr which is the kernel of the exponential distribution. If \code{nTypes=1} (single-type epidemic or type-invariant \code{tiaf} in multi-type epidemic), then \eqn{\alpha_\kappa = \alpha} for all types \eqn{\kappa}. } } } \value{ The specification of an interaction function, which is a list. For spatial kernels, this list contains the following components: \item{f}{spatial interaction function (\code{siaf}). It must accept two arguments, the first one being a (2-column) coordinate matrix, the second one a parameter vector. For marked \code{twinstim}, it must accept the type of the event (integer code) as its third argument (either a single type for all locations or separate types for each location).} \item{F}{function computing the integral of \eqn{f(s)} (passed as second argument) over a polygonal \code{"owin"} domain (first argument). The third and fourth argument are the parameter vector and the (\emph{single}) type, respectively. There may be additional arguments, which can then be specified in the \code{control.siaf$F} argument list of \code{twinstim}. If the \code{F} function is missing, a general default (\code{\link[polyCub]{polyCub}}) will be used, with extra arguments \code{method} (default: \code{"SV"}) and corresponding accuracy parameters.} \item{Fcircle}{optional function for fast calculation of the (two-dimensional) integral of \eqn{f(s)} over a circle with radius \code{r} (first argument). Further arguments are as for \code{f}. It must not be vectorized (will always be called with single radius and a single type). If this function is specified, integration of the \code{siaf} over the spatial influence region of an event will be faster if the region is actually circular. This is the case if the event is located at least a distance \code{eps.s} from the border of the observation region \code{W}, or if the distance to the border is larger than the effective integration range (if specified, see \code{effRange} below).} \item{effRange}{optional function returning the \dQuote{effective} range of \eqn{f(s)} for the given set of parameters (the first and only argument) such that the circle with radius \code{effRange} contains the numerically essential proportion of the integral mass. For the Gaussian kernel the default is \code{function (logsd) 6*exp(logsd)}. The return value must be a vector of length \code{nTypes} (effective range for each type). This function is only used if \code{Fcircle} is also specified.} \item{deriv}{optional derivative of \eqn{f(s)} \emph{with respect to the parameters}. It takes the same arguments as \code{f} but returns a matrix with as many rows as there were coordinates in the input and \code{npars} columns. This derivative is necessary for the calculation of the score function in \code{twinstim()}, which is advantageous for the numerical log-likelihood maximization.} \item{Deriv}{function computing the integral of \code{deriv} (passed as second argument) over a polygonal \code{"owin"} domain (first argument). The return value is thus a vector of length \code{npars}. The third argument is the parameter vector and the fourth argument is a (\emph{single}) type and must be named \code{type}. There may be additional arguments, which can then be specified in the \code{control.siaf$Deriv} argument list of \code{twinstim}. If the \code{Deriv} function is missing, a general default (\code{\link[polyCub]{polyCub}}) will be used, with extra arguments \code{method} (default: \code{"SV"}) and corresponding accuracy parameters.} \item{simulate}{optional function returning a sample drawn from the spatial kernel (only required for the simulation of \code{twinstim} models). Its first argument is the size of the sample to generate, further arguments are as for \code{f} (but the optional third argument specifies a single event type only). The function must return a two-column \emph{matrix} of the sampled locations. Note that the simulation method actually samples only one location at a time, thus it is sufficient to have a working \code{function(n=1, pars, type)}. } \item{npars}{the number of parameters of the spatial interaction function \code{f} (i.e. the length of its second argument).} For temporal kernels, the components are: \item{g}{temporal interaction function (\code{tiaf}). It must accept two arguments, the first one being a vector of time points, the second one a parameter vector. For marked \code{twinstim}, it must accept the type of the event (integer code) as its third argument (either a single type for all locations or separate types for each location).} \item{G}{a primitive of \eqn{g(t)} (with respect to time). It must accept the same arguments as \code{g}, for instance a \emph{vector} of time points (not just a single one).} \item{deriv}{optional derivative of \eqn{g(t)} \emph{with respect to the parameters}. It takes the same arguments as \code{g} but returns a matrix with as many rows as there were time points in the input and \code{npars} columns. This derivative is necessary for the calculation of the score function in \code{twinstim()}, which is advantageous for the numerical log-likelihood maximization.} \item{Deriv}{optional primitive of \code{deriv} (with respect to time). It must accept the same arguments as \code{deriv}, \code{g} and \code{G} and returns a matrix with as many rows as there were time points in the input and \code{npars} columns. The integrated derivative is necessary for the score function in \code{twinstim}.} \item{npars}{the number of parameters of the temporal interaction function \code{g} (i.e. the length of its second argument).} In \emph{both} cases, there may be an additional component \code{validpars} as a way to specify parameter constraints: \item{validpars}{ optional function taking one argument, the parameter vector, indicating if it is valid. This function is rarely needed in practice, because usual box-constrained parameters can be taken into account by using L-BFGS-B as the optimization method in \code{twinstim} (with arguments \code{lower} and \code{upper}), and positivity constraints by using log-parametrizations. This component is not necessary (and ignored) if \code{npars == 0}. } } \references{ Meyer, S. and Held, L. (2013): Modelling power-law spread of infectious diseases. \emph{arXiv:1308.5115}\cr arXiv-Link: \url{http://arxiv.org/abs/1308.5115} Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} Meyer, S. (2010): Spatio-Temporal Infectious Disease Epidemiology based on Point Processes. Master's Thesis, Ludwig-Maximilians-Universit\enc{}{ae}t M\enc{}{ue}nchen.\cr Available as \url{http://epub.ub.uni-muenchen.de/11703/} } \author{ Sebastian Meyer } \seealso{ \code{\link{twinstim}}. } \examples{ # constant temporal dispersal tiaf.constant() # or exponential decay specification tiaf.exponential() # Type-dependent Gaussian spatial interaction function using an adaptive # two-dimensional midpoint-rule to integrate it over polygonal domains siaf.gaussian(2, F.adaptive=TRUE) # Type-independent power-law kernel siaf.powerlaw() # siaf.lomax() is deprecated # "lagged" power-law siaf.powerlawL() } \keyword{models} \keyword{utilities} surveillance/man/momo.Rd0000644000176000001440000000464411747514016015025 0ustar ripleyusers\name{momo} \alias{momo} \encoding{latin1} \title{Danish 1994-2008 all cause mortality data for six age groups} \description{ Weekly number of all cause mortality from 1994-2008 in each of the six age groups <1, 1-4, 5-14, 15-44, 45-64, 65-74, 75-84 and 85 years. } \usage{data(momo) } \details{ The object of class \code{sts} contains the number of all cause mortality from 1994-2008 in Denmark for each of the six age groups <1, 1-4, 5-14, 15-44, 45-64, 65-74, 75-84 and 85 years. A special feature of such EuroMOMO data is that weeks are handled as defined by the ISO 8601 standard, which can be handled by the \code{sts} class. The \code{population} slot of the \code{momo} object contains the population size in each of the six age groups. These are yearly data obtained from the StatBank Denmark. The aim of the EuroMOMO project is to develop and strengthen real-time monitoring of mortality across Europe; this will enhance the management of serious public health risks such as pandemic influenza, heat waves and cold snaps. For further details see the homepage of the EuroMOMO project. } \source{ Department of Epidemiology, Statens Serum Institute, Copenhagen, Denmark StatBank Denmark, Statistics Denmark, \url{http://www.statistikbanken.dk/} } \examples{ data("momo") plot(momo,legend.opts=NULL) } \references{ Hhle, M. and A. Mazick, A. (2009) Aberration detection in R illustrated by Danish mortality monitoring, Book chapter to appear in T. Kass-Hout and X. Zhang (Eds.) Biosurveillance: A Health Protection Priority, CRC Press. EuroMOMO project page, \url{http://www.euromomo.eu/}, Last accessed: 13 Oct 2010. } \keyword{datasets} %###################################################################### %# Importing data from a csv file. As well as population. %###################################################################### %momo.ts <- read.csv("~/Surveillance/EuroMoMo/Data/mortality-dk.csv",header=TRUE,check.names=FALSE) %#Fill week slot with Monday of each week , starting from 3rd Jan 1994 %dates <- as.Date("1994-01-03") + 7 * 0:(nrow(momo.ts)-1) %#Create sts object %momo <- new("sts",epoch=as.numeric(dates), start=c(1994,1), freq=52, % observed=momo.ts, epochAsDate=TRUE) %population(momo) <- as.matrix(read.csv("~/Surveillance/EuroMoMo/Data/population-dk.csv",check.names=FALSE)) %save(file="~/Surveillance/surveillance/pkg/data/momo.RData",list=c("momo")) surveillance/man/hepatitisA.Rd0000644000176000001440000000102611731650466016143 0ustar ripleyusers\name{hepatitisA} \docType{data} \alias{hepatitisA} \title{Hepatitis A in Germany} \description{ Weekly number of reported hepatitis A infections in Germany 2001-2004. } \usage{data(hepatitisA) } \format{ A \code{disProg} object containing \eqn{208\times 1}{208 x 1} observations starting from week 1 in 2001 to week 52 in 2004. } \source{ Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; Queried on 11 01 2005. } \examples{ data(hepatitisA) plot(hepatitisA) } \keyword{datasets} surveillance/man/twinSIR_epidata.Rd0000644000176000001440000002433612154320114017067 0ustar ripleyusers\name{twinSIR_epidata} \alias{as.epidata} \alias{as.epidata.default} \alias{print.epidata} \alias{[.epidata} \alias{epidata} \title{ Class for Epidemic Data Discrete in Space and Continuous in Time } \description{ The function \code{as.epidata} is used to generate objects of \code{\link{class}} \code{"epidata"}. Objects of this class are specific data frames containing the event history of an epidemic together with some additional attributes. These objects are the basis for fitting spatio-temporal epidemic intensity models with the function \code{\link{twinSIR}}. Note that the spatial information itself, i.e. the positions of the individuals, is assumed to be constant over time. Besides epidemics following the SIR compartmental model, also data from SI, SIRS and SIS epidemics may be supplied. Inference for the infectious process works as usual and simulation of such epidemics is also possible. } \usage{ as.epidata(data, ...) \method{as.epidata}{default}(data, id.col, start.col, stop.col, atRiskY.col, event.col, Revent.col, coords.cols, f = list(), ...) \method{print}{epidata}(x, ...) \method{[}{epidata}(x, i, j, drop) } \arguments{ \item{data}{ For the default method a \code{\link{matrix}} or a \code{\link{data.frame}}. It contains the observed event history in a form similar to \code{Surv(, type="counting")} with additional information (variables) along the process. It must not be sorted in any specific order; this will be done automatically during conversion. The observation period is splitted up into \emph{consecutive} intervals of constant state - thus constant infection intensities. The data frame consists of a block of N (number of individuals) rows for each of those time intervals (all rows in a block share the same start and stop values... therefore the name \dQuote{block}), where there is one row per individual in the block. Each row describes the (fixed) state of the individual during the interval given by the start and stop columns \code{start.col} and \code{stop.col}.\cr Note that there may not be more than one event (infection or removal) in a single block. Thus, in a single block, only one entry in the \code{event.col} and \code{Revent.col} may be 1, all others are 0. This rule follows the assumption that there are no concurrent events (infections or removals). } \item{id.col}{ single index of the \code{id} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{id} column identifies the individuals in the data frame. It will be converted to a factor variable. } \item{start.col}{ single index of the \code{start} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{start} column contains the (numeric) time points of the beginnings of the consecutive time intervals of the event history. The minimum value in this column, i.e. the start of the observation period should be 0. } \item{stop.col}{ single index of the \code{stop} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{stop} column contains the (numeric) time points of the ends of the consecutive time intervals of the event history. The stop value must always be greater than the start value of a row. } \item{atRiskY.col}{ single index of the \code{atRiskY} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{atRiskY} column indicates if the individual was \dQuote{at-risk} of becoming infected during the time interval (start; stop]. This variable must be logical or in 0/1-coding. Individuals with \code{atRiskY == 0} in the first time interval (normally the rows with \code{start == 0}) are taken as \emph{initially infectious}. } \item{event.col}{ single index of the \code{event} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{event} column indicates if the individual became \emph{infected} at the \code{stop} time of the interval. This variable must be logical or in 0/1-coding. } \item{Revent.col}{ single index of the \code{Revent} column in \code{data}. Can be numeric (by column number) or character (by column name). The \code{Revent} column indicates if the individual was \emph{recovered} at the \code{stop} time of the interval. This variable must be logical or in 0/1-coding. } \item{coords.cols}{ index\emph{es} of the \code{coords} column\emph{s} in \code{data}. Can be a numeric (by column number) vector, a character (by column name) vector or \code{NULL} (in which case epidemic covariates are not calculateable). These columns contain the coordinates of the individuals. It must be emphasized that the functions related to \code{\link{twinSIR}} models currently assume \emph{fixed positions} of the individuals during the whole epidemic. Thus, an individual has the same coordinates in every block. For simplicity, the coordinates are derived from the first time block only (normally the rows with \code{start == 0}). The epidemic covariates are calculated based on the euclidian distances between the individuals, see \code{f}. } \item{f}{ a \emph{named} list of distance functions or \code{list()} (the default), if calculation of epidemic covariates is not requested. The functions must interact elementwise on a (distance) matrix so that - for a matrix D - f[[m]](D) results in a matrix. A simple example is \code{function(u) {u <= 1}}, which indicates if the euclidian distance between the individuals is smaller than or equal to 1. To ensure that an individual does not influence itself, the distance to itself is defined as \code{Inf}. Consequently, all of the distance functions must have the property f[[m]](Inf) = 0. The names of the functions will be the names of the epidemic variables in the resulting data frame. The value of such a variable is computed as follows: \eqn{I(t)} denotes the set of infectious individuals just before time \eqn{t} and \eqn{s_i} the coordinate vector of individual \eqn{i}. For individual \eqn{i} at time \eqn{t} the epidemic component \eqn{m} has the value \eqn{\sum_{j \in I(t)} f_m(||s_i - s_j||)}{% \sum_{j in I(t)} f[[m]](||s_i - s_j||)} } \item{x}{ an object of class \code{"epidata"}. } \item{\dots}{ arguments passed to \code{\link{print.data.frame}}. Currently unused in \code{as.epidata}. } \item{i,j,drop}{ arguments passed to \code{\link{[.data.frame}}. } } \details{ The \code{print} method for objects of class \code{"epidata"} simply prints the data frame with a small header containing the time range of the observed epidemic and the number of infected individuals. Usually, the data frames are quite long, so the summary method \code{\link{summary.epidata}} might be useful. Also, indexing/subsetting \code{"epidata"} works exactly as for \code{\link[=[.data.frame]{data.frame}}s, but there is an own method, which assures consistency of the resulting \code{"epidata"} or drops this class, if necessary. SIS epidemics are implemented as SIRS epidemics where the length of the removal period equals 0. This means that an individual, which has an R-event will be at risk immediately afterwards, i.e. in the following time block. Therefore, data of SIS epidemics have to be provided in that form containing \dQuote{pseudo-R-events}. } \note{ The column name \code{"BLOCK"} is a reserved name. This column will be added automatically at conversion and the resulting data frame will be sorted by this column and by id. Also the names \code{"id"}, \code{"start"}, \code{"stop"}, \code{"atRiskY"}, \code{"event"} and \code{"Revent"} are reserved for the respective columns only. } \value{ a \code{data.frame} with the columns \code{"BLOCK"}, \code{"id"}, \code{"start"}, \code{"stop"}, \code{"atRiskY"}, \code{"event"}, \code{"Revent"} and the coordinate columns (with the original names from \code{data}), which are all obligatory. These columns are followed by any remaining columns of the input \code{data}. Last but not least, the newly generated columns with epidemic variables corresponding to the functions in the list \code{f} are appended, if \code{length(f)} > 0. The \code{data.frame} is given the additional \emph{attributes} \item{"eventTimes"}{ numeric vector of infection time points (sorted chronologically). } \item{"timeRange"}{ numeric vector of length 2: \code{c(min(start), max(stop))}. } \item{"coords.cols"}{ numeric vector containing the column indices of the coordinate columns in the resulting data frame. } \item{"f"}{ this equals the argument \code{f}. } } \author{ Sebastian Meyer } \seealso{ The \code{\link[=plot.epidata]{plot}} and the \code{\link[=summary.epidata]{summary}} method for class \code{"epidata"}. Furthermore, the function \code{\link{animate.epidata}} for the animation of epidemics. Function \code{\link{twinSIR}} for fitting spatio-temporal epidemic intensity models to epidemic data. Function \code{\link{simEpidata}} for the simulation of epidemic data. } \examples{ # an artificial example of an event history from the package data("foodata") str(foodata) # convert the data to an object of class "epidata", # also generating some epidemic covariates myEpidata <- as.epidata(foodata, id.col = 1, start.col = "start", stop.col = "stop", atRiskY.col = "atrisk", event.col = "infected", Revent.col = "removed", coords.cols = c("x","y"), f = list(B1 = function(u) u<=1, B2 = function(u) u>1 & is.finite(u)) ) # note the is.finite restriction in B2 to ensure that f[[i]](Inf) = 0, for all i str(myEpidata) subset(myEpidata, BLOCK == 1) summary(myEpidata) # see 'summary.epidata' plot(myEpidata) # see 'plot.epidata' and also 'animate.epidata' stateplot(myEpidata, "15") # see 'stateplot' \dontrun{ # works in interactive mode, but not in R CMD check data("fooepidata") stopifnot(identical(myEpidata, fooepidata)) } } \keyword{spatial} \keyword{classes} \keyword{manip} surveillance/man/sumNeighbours.Rd0000644000176000001440000000077311770111463016702 0ustar ripleyusers\name{sumNeighbours} \alias{sumNeighbours} \title{Calculates the sum of counts of adjacent areas} \description{ Calculates the sum of counts of adjacent units/areas, i.e. \eqn{\sum_{j \sim i} y_{j,t}}{sum_j~i y_j,t} for all time points \eqn{t} and each unit \eqn{i}, \eqn{t=1,\ldots,n, i=1,\ldots,m}. } \usage{ sumNeighbours(disProgObj) } \arguments{ \item{disProgObj}{Object of class \code{disProg}} } \value{matrix of dimension \eqn{n \times m}{n x m} } \keyword{internal} surveillance/man/inside.gpc.poly.Rd0000644000176000001440000000305412236735246017061 0ustar ripleyusers\name{inside.gpc.poly} \alias{inside.gpc.poly} \title{ Test Whether Points are Inside a \code{"gpc.poly"} Polygon } \description{ Same as, e.g., \code{\link[spatstat]{inside.owin}} from package \pkg{spatstat} and \code{\link[sp]{point.in.polygon}} from package \pkg{sp}, i.e., test whether points lie inside or outside a given polygon. Actually, the method for \code{"gpc.poly"} documented here internally uses the \code{\link[sp]{point.in.polygon}} function. } \usage{ inside.gpc.poly(x, y = NULL, polyregion, mode.checked = FALSE) } \arguments{ \item{x,y}{ numeric vectors of coordinates of the points to be tested. The coordinates can be supplied in any form accepted by \code{\link{xy.coords}}. } \item{polyregion}{ an object of class \code{"gpc.poly"}. It is checked if the points specified through \code{x} and \code{y} fall into this polygonal region. } \item{mode.checked}{ passed to \code{\link[sp]{point.in.polygon}}. } } \details{ The nodes and edges of (non-hole) polygons are treated as being inside. Points that fall \emph{strictly} inside holes are treated as being outside of the polygon. } \value{ Logical vector whose \code{i}th entry is \code{TRUE} if the corresponding point \code{(x[i],y[i])} is inside \code{polyregion}. } \author{ Sebastian Meyer } \examples{ if (requireNamespace("rgeos")) { poly <- discpoly(c(0.5,0.5), 0.5, npoly=4, class="gpc.poly") pts <- cbind(x=runif(50), y=runif(50)) plot(poly) points(pts, col=1+inside.gpc.poly(pts, polyregion=poly)) } } \keyword{utilities} \keyword{spatial} surveillance/man/toFileDisProg.Rd0000644000176000001440000000134011731650466016561 0ustar ripleyusers\name{toFileDisProg} \alias{toFileDisProg} \title{Writing of Disease Data} \description{Writing of disease data (disProg object) into a file. } \usage{ toFileDisProg(disProgObj, toFile) } \arguments{ \item{disProgObj}{The disProgObj to save in file} \item{toFile}{The path and filename of the file to save} } \value{ \item{file}{The file with the disease data} } \details{ Writing of \code{disProg} object into a file as illustrated in the example. } \seealso{\code{\link{readData}}, \code{\link{sim.pointSource}}} \examples{ disProgObj <- sim.pointSource(length=200, K=1) toFileDisProg(disProgObj, "./simulation.txt") mydisProgObj <- readData("./simulation",sysPath=FALSE) } \keyword{file} surveillance/man/twinSIR_profile.Rd0000644000176000001440000000407311731650466017134 0ustar ripleyusers\encoding{latin1} \name{twinSIR_profile} \alias{profile.twinSIR} \title{ Profile Likelihood Computation and Confidence Intervals } \description{ Function to compute estimated and profile likelihood based confidence intervals. Computations might be cumbersome! } \usage{ \method{profile}{twinSIR}(fitted, profile, alpha = 0.05, control = list(fnscale = -1, factr = 10, maxit = 100), ...) } \arguments{ \item{fitted}{ an object of class \code{"twinSIR"}. } \item{profile}{ a list with elements being numeric vectors of length 4. These vectors must have the form \code{c(index, lower, upper, gridsize)}. \describe{ \item{\code{index}:}{ index of the parameter to be profiled in the vector \code{coef(fitted)}. } \item{\code{lower, upper}:}{ lower/upper limit of the grid on which the profile log-likelihood is evaluated. Can also be \code{NA} in which case \code{lower/upper} equals the lower/upper bound of the respective 0.3 \% Wald confidence interval (+-3*se). } \item{\code{gridsize}:}{ grid size of the equally spaced grid between lower and upper. Can also be 0 in which case the profile log-likelihood for this parameter is not evaluated on a grid. } } } \item{alpha}{ \eqn{(1-\alpha)\%}{(1-alpha)\%} profile likelihood based confidence intervals are computed. If alpha <= 0, then no confidence intervals are computed. } \item{control}{ control object to use in \code{\link{optim}} for the profile log-likelihood computations. } \item{\dots}{ unused (argument of the generic). } } \value{ list with profile log-likelihood evaluations on the grid and highest likelihood and wald confidence intervals. The argument \code{profile} is also returned. } \author{ Michael \enc{Hhle}{Hoehle} } \examples{ data("foofit") # the following call takes a while \dontrun{ prof <- profile(foofit, list(c(1,0,0.05,5), c(3,NA,NA,0), c(4, NA, NA, 10))) prof } } \keyword{htest} \keyword{methods} \keyword{optimize} \keyword{dplot} surveillance/man/twinSIR_epidata_plot.Rd0000644000176000001440000001530612231573303020130 0ustar ripleyusers\name{twinSIR_epidata_plot} \alias{plot.epidata} \alias{plot.summary.epidata} \alias{stateplot} \title{ Plotting the Evolution of an Epidemic } \description{ Functions for plotting the evolution of epidemics. The \code{\link{plot}} methods for \code{\link{class}}es \code{"\link{epidata}"} and \code{"summary.epidata"} plots the numbers of susceptible, infectious and recovered (= removed) individuals by step functions along the time axis. The function \code{stateplot} shows individual state changes along the time axis. } \usage{ \method{plot}{summary.epidata}(x, lty = c(2, 1, 3), lwd = 2, col = 1, col.hor = col, col.vert = col, xlab = "Time", ylab = "Number of individuals", xlim = NULL, ylim = NULL, legend.opts = list(), do.axis4 = NULL, panel.first = grid(), rug.opts = list(), which.rug = c("infections", "removals", "susceptibility", "all"), ...) \method{plot}{epidata}(x, ...) stateplot(x, id, ...) } \arguments{ \item{x}{ an object inheriting from class \code{"epidata"} or \code{"summary.epidata"}. In the former case, its summary is calculated and the function continues as in the latter case. The \code{plot} method for class \code{"epidata"} is a simple wrapper for \code{plot.summary.epidata} implemented as \code{plot(summary(x, ...))}. } \item{lty, lwd}{ vectors of length 3 containing the line types and widths, respectively, for the numbers of susceptible, infectious and removed individuals (in this order). By default, all lines have width 1 and the line types are dashed (susceptible), solid (infectious) and dotted (removed), respectively. To omit the drawing of a specific line, just set the corresponding entry in \code{lty} to 0. The vectors are recycled if necessary. For information about the different \code{lty} and \code{lwd} codes, see the help pages of \code{\link{par}}. } \item{col, col.hor, col.vert}{ vectors of length 3 containing the line colors for the numbers of susceptible, infectious and removed individuals (in this order). \code{col.hor} defines the color for the horizontal parts of the step function, whilst \code{col.vert} defines the color for its vertical parts. The argument \code{col} is just short for \code{col.hor = col} and \code{col.vert = col}. By default, all lines are completely drawn in black. The vectors are recycled if necessary. For information about the possible values of \code{col}, see the help pages of \code{\link{par}}. } \item{xlab, ylab}{ axis labels, default to "Time" and "Number of individuals", respectively. } \item{xlim, ylim}{ the x and y limits of the plot in the form \code{c(xmin, xmax)} and \code{c(ymin, ymax)}, respectively. By default, these are chosen adequately to fit the time range of the epidemic and the number of individuals. } \item{legend.opts}{ either a list of arguments passed to the \code{\link{legend}} function or \code{NULL} (or \code{NA}), in which case no legend will be plotted. All necessary arguments have sensible defaults and need not be specified, i.e. \describe{ \item{\code{x}:}{\code{"topright"}} \item{\code{legend}:}{\code{c("susceptible", "infectious", "removed")}} \item{\code{lty}:}{same as argument \code{lty} of the main function} \item{\code{lwd}:}{same as argument \code{lwd} of the main function} \item{\code{col}:}{same as argument \code{col.hor} of the main function} \item{\code{bty}:}{\code{"n"}} } } \item{do.axis4}{ logical indicating if the final numbers of susceptible and removed individuals should be indicated on the right axis. The default \code{NULL} means \code{TRUE}, if \code{x} represents a SIR epidemic and \code{FALSE} otherwise, i.e. if the epidemic is SI, SIS or SIRS. } \item{panel.first}{ an expression to be evaluated after the plot axes are set up but before any plotting takes place. By default, a standard grid is drawn. } \item{rug.opts}{ either a list of arguments passed to the function \code{\link{rug}} or \code{NULL} (or \code{NA}), in which case no \code{rug} will be plotted. By default, the argument \code{ticksize} is set to 0.02, \code{col} is set to the color according to \code{which.rug} (black if this is \code{"all"}), and \code{quiet} is set to \code{TRUE}. Note that the argument \code{x}, which contains the locations for the \code{rug} is fixed internally and can not be modified. The argument \code{which.rug} (see below) determines the locations to mark. } \item{which.rug}{ By default, tick marks are drawn at the time points of infections. Alternatively, one can choose to mark only \code{"removals"}, \code{"susceptibilities"} (i.e. state change from R to S) or \code{"all"} events. } \item{id}{ single character string or factor of length 1 specifying the individual for which the \code{stateplot} should be established. } \item{\dots}{ For \code{plot.summary.epidata}: further graphical parameters passed to \code{plot}, \code{lines} and \code{axis}, e.g. \code{main}, \code{las}, \code{cex.axis} (etc.) and \code{mgp}.\cr For \code{plot.epidata}: arguments passed to \code{plot.summary.epidata}.\cr For \code{stateplot}: arguments passed to \code{\link{plot.stepfun}} or \code{\link{plot.function}} (if \code{id} had no events during the observation period). By default, \code{xlab="time"}, \code{ylab="state"}, \code{xlim=attr(x,"timeRange")}, \code{xaxs="i"} and \code{do.points=FALSE}. } } \value{ \code{plot.summary.epidata} (and \code{plot.epidata}) invisibly returns the matrix used for plotting, which contains the evolution of the three counters.\cr \code{stateplot} invisibly returns the function, which was plotted, typically of class \code{"stepfun"}, but maybe of class \code{"function"}, if no events have been observed for the individual in question (then the function always returns the initial state). The vertical axis of \code{stateplot} can range from 1 to 3, where 1 corresponds to \emph{S}uscepible, 2 to \emph{I}nfectious and 3 to \emph{R}emoved. } \author{ Sebastian Meyer } \seealso{ \code{\link{summary.epidata}} for the data, on which the plots are based. \code{\link{animate.epidata}} for the animation of epidemics. } \examples{ data("fooepidata") s <- summary(fooepidata) # evolution of the epidemic par(las = 1) plot(s) # stateplot stateplot(s, id = "15", main = "Some individual event paths") stateplot(s, id = "1", add = TRUE, col = 2) stateplot(s, id = "20", add = TRUE, col = 3) legend("topright", legend = c(15, 1, 20), title = "id", lty = 1, col = 1:3, inset = 0.1) } \keyword{hplot} \keyword{methods} \keyword{spatial} surveillance/man/twinstim_update.Rd0000644000176000001440000000434412207663426017275 0ustar ripleyusers\name{twinstim_update} \alias{update.twinstim} \title{ \code{update}-method for \code{"twinstim"} } \description{ Update and (by default) re-fit a \code{"twinstim"}. This method is especially useful if one wants to add the \code{model} environment (which is required for some methods) to a fitted model object a posteriori. } \usage{ \method{update}{twinstim}(object, endemic, epidemic, control.siaf, optim.args, model, ..., use.estimates = TRUE, evaluate = TRUE) } \arguments{ \item{object}{a previous \code{"twinstim"} fit.} \item{endemic, epidemic}{changes to the formulae -- see \code{\link{update.formula}} and \code{\link{twinstim}}.} \item{control.siaf}{a list, see \code{\link{twinstim}}. It will modify the original \code{control.siaf} using \code{\link{modifyList}}.} \item{optim.args}{see \code{\link{twinstim}}. If a list, it will modify the original \code{optim.args} using \code{\link{modifyList}}.} \item{model}{see \code{\link{twinstim}}. If this is the only argument to update, re-fitting is cleverly circumvented.} \item{\dots}{Additional arguments to the call, or arguments with changed values.} \item{use.estimates}{logical indicating if the estimates of \code{object} should be used as initial values for the new fit (in the \code{start} argument of \code{twinstim}). Defaults to \code{TRUE}.} \item{evaluate}{If \code{TRUE} (default), evaluate the new call else return the call.} } \value{ If \code{evaluate = TRUE} the re-fitted object, otherwise the updated call. } \author{ Sebastian Meyer Inspiration and some pieces of code originate from \code{\link{update.default}} by the R Core Team. } \seealso{ \code{\link{update.default}} } \examples{ data("imdepi") data("imdepifit") ## add another epidemic covariate (but fix siaf-parameter for speed) imdepifit2 <- update(imdepifit, epidemic = ~. + log(popdensity), optim.args = list(fixed="e.siaf.1"), cumCIF=FALSE) ## compare by AIC AIC(imdepifit, imdepifit2) if (surveillance.options("allExamples")) { ## enrich the fit by the model environment imdepifit <- update(imdepifit, model=TRUE) ## this enables, e.g., intensityplot()s and untrimmed R0 estimates } } \keyword{models} \keyword{methods} surveillance/man/algo.hmm.Rd0000644000176000001440000001575312034543506015557 0ustar ripleyusers\encoding{latin1} \name{algo.hmm} \alias{algo.hmm} \title{Hidden Markov Model (HMM) method} \description{ % This function implements on-line HMM detection of outbreaks based on the retrospective procedure described in Le Strat and Carret (1999). Using the function \code{\link[msm]{msm}} (from package \pkg{msm}) a specified HMM is estimated, the decoding problem, i.e. the most probable state configuration, is found by the Viterbi algorithm and the most probable state of the last observation is recorded. On-line detection is performed by sequentally repeating this procedure. Warning: This function can be very slow - a more efficient implementation would be nice! } \usage{ algo.hmm(disProgObj, control = list(range=range, Mtilde=-1, noStates=2, trend=TRUE, noHarmonics=1, covEffectEqual=FALSE, saveHMMs = FALSE, extraMSMargs=list())) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain)} \item{control}{control object: \describe{ \item{\code{range}}{determines the desired time points which should be evaluated. Note that opposite to other surveillance methods an initial parameter estimation occurs in the HMM. Note that range should be high enough to allow for enough reference values for estimating the HMM} \item{\code{Mtilde}}{number of observations back in time to use for fitting the HMM (including the current observation). Reasonable values are a multiple of \code{disProgObj$freq}, the default is \code{Mtilde=-1}, which means to use all possible values - for long series this might take very long time!} \item{\code{noStates}}{number of hidden states in the HMM -- the typical choice is 2. The initial rates are set such that the \code{noStates}'th state is the one having the highest rate. In other words: this state is considered the outbreak state.} \item{\code{trend}}{Boolean stating whether a linear time trend exists, i.e. if \code{TRUE} (default) then \eqn{\beta_j \neq 0}{\beta != 0}} \item{\code{noHarmonics}}{number of harmonic waves to include in the linear predictor. Default is 1.} \item{\code{covEffectEqual}}{see details} \item{\code{saveHMMs}}{Boolean, if \code{TRUE} then the result of the fitted HMMs is saved. With this option the function can also be used to analyse data retrospectively. Default option is \code{FALSE}} \item{\code{extraMSMArgs}}{A named list with additional arguments to send to the \code{\link[msm:msm]{msm}} HMM fitting function. Note that the \code{msm} arguments \code{formula}, \code{data}, \code{qmatrix}, \code{hmodel}, \code{hcovariates} and \code{hconstraint} are automatically filled by \code{algo.hmm}, thus these should NOT be modified.} } } } \value{ \item{survRes}{ \code{algo.hmm} gives a list of class \code{survRes} which includes the vector of alarm values for every timepoint in \code{range}. No \code{upperbound} can be specified and is put equal to zero. The resulting object contains a slot \code{control$hmm}, which contains the \code{msm} object with the fitted HMM. } } \details{ For each time point t the reference values values are extracted. If the number of requested values is larger than the number of possible values the latter is used. Now the following happens on these reference values: A \code{noState}-State Hidden Markov Model (HMM) is used based on the Poisson distribution with linear predictor on the log-link scale. I.e. \deqn{Y_t | X_t = j \sim Po(\mu_t^j),}{Y_t|X_t = j ~ Po(\mu_t^j),} where \deqn{\log(\mu_t^j) = \alpha_j + \beta_j\cdot t + \sum_{i=1}^{nH} \gamma_j^i \cos(2i\pi/freq\cdot (t-1)) + \delta_j^i \sin(2i\pi/freq\cdot (t-1))}{% log(mu_t^j) = alpha_j + beta_j t + \sum_{i=1}^{nH} gamma_j^i \cos(2*i*pi/freq * (t-1)) + delta_j^i sin(2*i*pi/freq * (t-1)) } % and \eqn{nH=}\code{noHarmonics} and \eqn{freq=12,52} depending on the sampling frequency of the surveillance data. In the above \eqn{t-1} is used, because the first week is always saved as \code{t=1}, i.e. we want to ensure that the first observation corresponds to cos(0) and sin(0). If \code{covEffectEqual} then all covariate effects parameters are equal for the states, i.e. \eqn{\beta_j=\beta, \gamma_j^i=\gamma^i, \delta_j^i=\delta^i} for all \eqn{j=1,...,noState}. In case more complicated HMM models are to be fitted it is possible to modify the \code{msm} code used in this function. Using e.g. \code{AIC} one can select between different models (see the \pkg{msm} package for further details). Using the Viterbi algorithms the most probable state configuration is obtained for the reference values and if the most probable configuration for the last reference value (i.e. time t) equals \code{control$noOfStates} then an alarm is given. Note: The HMM is re-fitted from scratch every time, sequential updating schemes of the HMM would increase speed considerably! A major advantage of the approach is that outbreaks in the reference values are handled automatically. } \seealso{\code{\link[msm:msm]{msm}}} \author{M. \enc{Hhle}{Hoehle}} \examples{ \dontrun{ library("msm") set.seed(123) #Simulate outbreak data from HMM counts <- sim.pointSource(p = 0.98, r = 0.8, length = 3*52, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.5) #Do surveillance using a two state HMM without trend component and #the effect of the harmonics being the same in both states. A sliding #window of two years is used to fit the HMM surv <- algo.hmm(counts, control=list(range=(2*52):length(counts$observed), Mtilde=2*52,noStates=2,trend=FALSE, covEffectsEqual=TRUE,extraMSMargs=list())) plot(surv,legend=list(x="topright")) #Retrospective use of the function, i.e. monitor only the last time point #but use option saveHMMs to store the output of the HMM fitting surv <- algo.hmm(counts,control=list(range=length(counts$observed),Mtilde=-1,noStates=2, trend=FALSE,covEffectsEqual=TRUE, saveHMMs=TRUE)) #Compute most probable state using the viterbi algorithm - 1 is "normal", 2 is "outbreak". viterbi.msm(surv$control$hmm[[1]])$fitted #How often correct? tab <- cbind( truth=counts$state + 1 , hmm=viterbi.msm(surv$control$hmm[[1]])$fitted) table(tab[,1],tab[,2]) } } \references{ Y. Le Strat and F. Carrat, Monitoring Epidemiologic Surveillance Data using Hidden Markov Models (1999), Statistics in Medicine, 18, 3463--3478 I.L. MacDonald and W. Zucchini, Hidden Markov and Other Models for Discrete-valued Time Series, (1997), Chapman & Hall, Monographs on Statistics and applied Probability 70 } \keyword{classif} surveillance/man/algo.twins.Rd0000644000176000001440000001176212061363037016135 0ustar ripleyusers\name{algo.twins} \alias{algo.twins} \encoding{latin1} \title{Model fit based on a two-component epidemic model} \description{ Fits a negative binomial model (as described in Held et al. (2006) to an univariate time series of counts. } \usage{ algo.twins(disProgObj, control=list(burnin=1000, filter=10, sampleSize=2500, noOfHarmonics=1, alpha_xi=10, beta_xi=10, psiRWSigma=0.25,alpha_psi=1, beta_psi=0.1, nu_trend=FALSE, logFile="twins.log")) } \arguments{ \item{disProgObj}{object of class \code{disProg}} \item{control}{control object: \describe{ \item{\code{burnin}}{Number of burn in samples.} \item{\code{filter}}{Thinning parameter. If \code{filter = 10} every 10th sample is after the burn in is returned.} \item{\code{sampleSize}}{Number of returned samples. Total number of samples = \code{burnin}+\code{filter}*\code{sampleSize}} \item{\code{noOfHarmonics}}{Number of harmonics to use in the modelling, i.e. \eqn{L}{L} in (2.2) of Held et al (2006).} \item{\code{alpha_xi}}{Parameter \eqn{\alpha_{\xi}}{\alpha_\xi} of the hyperprior of the epidemic parameter \eqn{\lambda}{\lambda}} \item{\code{beta_xi}}{Parameter \eqn{\beta_{\xi}}{\beta_\xi} of the hyperprior of the epidemic parameter \eqn{\lambda}{\lambda}} \item{\code{psiRWSigma}}{Starting value for the tuning of the variance of the random walk proposal for the overdispersion parameter \eqn{\psi}{\psi}.} \item{\code{alpha_psi}}{Parameter \eqn{\alpha_{\psi}}{\alpha_\psi} of the prior of the overdispersion parameter \eqn{\psi}{\psi}} \item{\code{beta_psi}}{Parameter \eqn{\beta_{\psi}}{\beta_\psi} of the prior of the overdispersion parameter \eqn{\psi}{\psi}} \item{\code{nu_trend}}{Adjust for a linear trend in the endemic part? (default: \code{FALSE})} \item{\code{logFile}}{Base file name for the output files. The function writes three output files in your current working directory (i.e. getwd()). If \code{logfile = "twins.log"} the results are stored in the three files "twins.log", "twins.log2" and "twins.log.acc". "twins.log" containes the returned samples of the parameters \eqn{\psi}{\psi}, \eqn{\gamma_{0}}{\gamma_0}, \eqn{\gamma_{1}}{\gamma_1}, \eqn{\gamma_{2}}{\gamma_2}, K, \eqn{\xi_{\lambda}}{\xi_\lambda} \eqn{\lambda_{1},...,\lambda{n}}{\lambda_1,...,\lambda_{n}}, the predictive distribution of the number of cases at time \eqn{n+1} and the deviance. "twins.log2" containes the sample means of the variables \eqn{X_{t}, Y_{t}, \omega_{t}}{X_t, Y_t, \omega_t} and the relative frequency of a changepoint at time t for t=1,...,n and the relative frequency of a predicted changepoint at time n+1. "twins.log.acc" contains the acceptance rates of \eqn{\psi}{\psi}, the changepoints and the endemic parameters \eqn{\gamma_{0}}{\gamma_0}, \eqn{\gamma_{1}}{\gamma_1}, \eqn{\gamma_{2}}{\gamma_2} in the third column and the variance of the random walk proposal for the update of the parameter \eqn{\psi}{\psi} in the second column.} } } } \details{Note that for the time being this function is not a surveillance algorithm, but only a modelling approach as described in the Held et. al (2006) paper. Note also that the function writes three logfiles in your current working directory (i.e. getwd()): twins.log, twins.log.acc and twins.log2 Thus you need to have write permissions in the current getwd() directory. } \value{Returns an object of class \code{atwins} with elements \item{control}{specified control object} \item{disProgObj}{specified \code{disProg}-object} \item{logFile}{containes the returned samples of the parameters \eqn{\psi}{\psi}, \eqn{\gamma_{0}}{\gamma_0}, \eqn{\gamma_{1}}{\gamma_1}, \eqn{\gamma_{2}}{\gamma_2}, K, \eqn{\xi_{\lambda}}{\xi_\lambda} \eqn{\lambda_{1},...,\lambda{n}}{\lambda_1,...,\lambda_{n}}, the predictive distribution and the deviance.} \item{logFile2}{containes the sample means of the variables \eqn{X_{t}, Y_{t}, \omega_{t}}{X_t, Y_t, \omega_t} and the relative frequency of a changepoint at time t for t=1,...,n and the relative frequency of a predicted changepoint at time n+1.} } \references{Held, L., Hofmann, M., \enc{Hhle}{Hoehle}, M. and Schmid V. (2006) A two-component model for counts of infectious diseases, Biostatistics, \bold{7}, pp. 422--437. } \author{M. Hofmann and M. \enc{Hhle}{Hoehle} and D. \enc{Sabans Bov}{Sabanes Bove}} \examples{ # Load the data used in the Held et al. (2006) paper data("hepatitisA") # Fix seed - this is used for the MCMC samplers in twins set.seed(123) # Call algorithm and save result (use short chain without filtering for speed) otwins <- algo.twins(hepatitisA, control=list(burnin=500, filter=1, sampleSize=1000)) # This shows the entire output (use ask=TRUE for pause between plots) plot(otwins, ask=FALSE) # Direct access to MCMC output hist(otwins$logFile$psi,xlab=expression(psi),main="") if (require("coda")) { print(summary(mcmc(otwins$logFile[,c("psi","xipsi","K")]))) } } \keyword{ts} \keyword{regression} surveillance/man/measles.weser.Rd0000644000176000001440000000165111731650466016631 0ustar ripleyusers\name{measles.weser} \alias{measles.weser} \docType{data} \title{Measles epidemics in Lower Saxony in 2001-2002} \description{ Weekly counts of new measles cases for each "Kreis" of the administrative district "Weser-Ems" in Lower Saxony, Germany, in 2001 and 2002. All in all there are 15 "Kreise", two "Kreise" have been omitted %due to ? } \usage{data(measles.weser)} \format{ An multivariate object of class disProg with 104 observations for each one of the 15 Kreise. \describe{ \item{week}{Number of week.} \item{observed}{Matrix with number of counts in the corresponding week and Kreis.} \item{state}{Boolean whether there was an outbreak -- dummy not implemented.} \item{neighbourhood}{Neighbourhood matrix.} \item{populationFrac}{Population fractions.} % } } %\source{ ?? } \examples{ data(measles.weser) plot(measles.weser, as.one=FALSE) } \keyword{datasets} surveillance/man/surveillance-package.Rd0000644000176000001440000001343412242635205020133 0ustar ripleyusers\encoding{latin1} \name{surveillance-package} \alias{surveillance-package} \alias{surveillance} \docType{package} \title{ Temporal and Spatio-Temporal Modeling and Monitoring of Epidemic Phenomena % Outbreak Detection and Retrospective Modeling for Surveillance Data } \description{ A package implementing statistical methods for the modeling and change-point detection in time series of counts, proportions and categorical data, as well as for the modeling of continuous-time epidemic phenomena, e.g. discrete-space setups such as the spatially enriched Susceptible-Exposed-Infectious-Recovered (SEIR) models for surveillance data, or continuous-space point process data such as the occurrence of disease or earthquakes. Main focus is on outbreak detection in count data time series originating from public health surveillance of infectious diseases, but applications could just as well originate from environmetrics, reliability engineering, econometrics or social sciences. Currently the package contains implementations of typical outbreak detection procedures such as Stroup et. al (1989), Farrington et al (1996), Rossi et al (1999), Rogerson and Yamada (2001), a Bayesian approach, negative binomial CUSUM methods and a detector based on generalized likelihood ratios. Furthermore, inference methods for the retrospective infectious disease model in Held et al (2005), Held et al (2006), Paul et al (2008) and Paul and Held (2011) are provided. A novel CUSUM approach combining logistic and multinomial logistic modelling is also included. Continuous self-exciting spatio-temporal point processes are modeled through additive-multiplicative conditional intensities as described in H\enc{}{oe}hle (2009) ("twinSIR", discrete space) and Meyer et al (2012) ("twinstim", continuous space). The package contains several real-world datasets, the ability to simulate outbreak data, visualize the results of the monitoring in temporal, spatial or spatio-temporal fashion. } \details{ \tabular{ll}{ Package: \tab surveillance\cr URL: \tab \url{http://surveillance.r-forge.r-project.org/}\cr License: \tab GPL version 2 (\url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html})\cr } \pkg{surveillance} is an \R package implementing statistical methods for the retrospective modeling and prospective change-point detection in time series of counts, proportions and categorical data. The main application is in the detection of aberrations in routine collected public health data seen as univariate and multivariate time series of counts or point-processes. However, applications could just as well originate from environmetrics, econometrics or social sciences. As many methods rely on statistical process control methodology, the package is thus also relevant to quality control and reliability engineering. The fundamental data structure of the package is an S4 class \code{sts} wrapping observations, monitoring results and date handling for multivariate time series. Currently the package contains implementations typical outbreak detection procedures such as Stroup et al. (1989), Farrington et al., (1996), Rossi et al. (1999), Rogerson and Yamada (2001), a Bayesian approach (H\enc{}{oe}hle, 2007), negative binomial CUSUM methods (H\enc{}{oe}hle and Mazick, 2009), and a detector based on generalized likelihood ratios (H\enc{}{oe}hle and Paul, 2008). However, also CUSUMs for the prospective change-point detection in binomial, beta-binomial and multinomial time series is covered based on generalized linear modelling. This includes e.g. paired binary CUSUM described by Steiner et al. (1999) or paired comparison Bradley-Terry modelling described in H\enc{}{oe}hle (2010). The package contains several real-world datasets, the ability to simulate outbreak data, visualize the results of the monitoring in temporal, spatial or spatio-temporal fashion. Furthermore, inference methods for the retrospective infectious disease model in Held et al. (2005), Paul et al. (2008) ("algo.hhh") and Paul and Held (2011) ("hhh4") handling multivariate time series of counts. Furthermore, the fully Bayesian approach for univariate time series of counts from Held et al. (2006) ("twins") is also implemented Self-exciting spatio-temporal point processes are modeled through additive-multiplicative conditional intensities as described in H\enc{}{oe}hle (2009) ("twinSIR") and Meyer et al (2012) ("twinstim"). Altogether, the package contains several real-world datasets, the ability to simulate outbreak data, visualize the results of the monitoring in temporal, spatial or spatio-temporal fashion. } \section{Acknowledgements}{ T. Correa, L. Held, M. Hofmann, C. Lang, A. Riebler, D. Saban\enc{}{e}s Bov\enc{}{e}, M. Salmon, S. Steiner, M. Virtanen, and V. Wimmer made substantial contributions of code. The authors would like to thank the following people for ideas, discussions, testing and feedback: Doris Altmann, Johannes Dreesman, Johannes Elias, Mayeul Kauffmann, Marc Geilhufe, Kurt Hornik, Marcos Prates, Brian D. Ripley, Barry Rowlingson, Christopher W. Ryan, Klaus Stark, Yann Le Strat, Andr\enc{}{e} Michael Toschke, Wei Wei, Achim Zeileis. } \author{ Michael H\enc{}{oe}hle, Sebastian Meyer, and Michaela Paul Maintainer: Michael H\enc{}{oe}hle \email{Michael.Hoehle@stat.uni-muenchen.de} } \references{ See \code{citation(package="surveillance")}. } \keyword{ package } \examples{ #Code from an early survey article about the package: Hoehle (2007) #available from http://surveillance.r-forge.r-project.org/ \dontrun{demo(cost)} #Code from a more recent book chapter about using the package for the #monitoring of Danish mortality data (Hoehle and Mazick, 2010). \dontrun{demo(biosurvbook)} } surveillance/man/findK.Rd0000644000176000001440000000244111731650466015105 0ustar ripleyusers\name{findK} \alias{findK} \title{Find reference value } \description{ Calculates the reference value \code{k} for a Poisson or binomial CUSUM designed to detect a shift from \eqn{\theta_0} to \eqn{\theta_1} } \usage{ findK(theta0, theta1, distr = c("poisson", "binomial"), roundK = FALSE, digits = 1, ...) } \arguments{ \item{theta0}{ in-control parameter } \item{theta1}{ out-of-control parameter } \item{distr}{ \code{"poisson"} or \code{"binomial"} } \item{digits}{ the reference value \code{k} is rounded to \code{digits} decimal places} \item{roundK}{ For discrete data and rational reference value there is only a limited set of possible values that the CUSUM can take (and therefore there is also only a limited set of ARLs). If \code{roundK=TRUE}, integer multiples of 0.5 are avoided when rounding the reference value \code{k}, % i.e. the CUSUM can take more values. %with this \code{k} %and therefore more values of ARL are possible) } \item{\dots}{ further arguments for the distribution function, i.e. number of trials \code{n} for the binomial cdf. } } \value{ Returns reference value \code{k}. } \keyword{models} surveillance/man/nbOrder.Rd0000644000176000001440000000360312144011740015427 0ustar ripleyusers\name{nbOrder} \alias{nbOrder} \title{ Determine Neighbourhood Order Matrix from Binary Adjacency Matrix } \description{ Given a square binary matrix indicating adjacencies, the function \code{nbOrder} determines the integer matrix of orders of neighbourhood using the function \code{\link[spdep]{nblag}} from the \pkg{spdep} package. Hence this function is essentially a wrapper around functionality of the \pkg{spdep} package. } \usage{ nbOrder(neighbourhood, maxlag = 1) } \arguments{ \item{neighbourhood}{ a square, numeric or logical, and usually symmetric matrix with finite entries (and usually zeros on the diagonal) which indicates first-order neighbourhood (interpreted as \code{neighbourhood == 1}, \emph{not} \code{>0}). } \item{maxlag}{ positive scalar integer specifying an upper bound for the neighbourhood order. The default (1) just returns the input neighbourhood matrix (converted to binary integer mode). \code{maxlag} is automatically trimmed to one less than the number of regions (there cannot be higher orders) and then converted to integer, thus, \code{maxlag = Inf} also works. } } \value{ An integer matrix of neighbourhood order. The \code{dimnames} of the input \code{neighbourhood} matrix are preserved. } \note{ By the end, the function issues a \code{\link{message}} informing about the range of maximum neighbourhood order by region. } \author{ Sebastian Meyer } \seealso{ \code{\link[spdep]{nblag}} from the \pkg{spdep} package, on which this wrapper depends. } \examples{ ## generate adjacency matrix set.seed(1) n <- 6 adjmat <- matrix(0, n, n) adjmat[lower.tri(adjmat)] <- sample(0:1, n*(n-1)/2, replace=TRUE) adjmat <- adjmat + t(adjmat) adjmat ## determine neighbourhood order matrix if (requireNamespace("spdep")) { nbmat <- nbOrder(adjmat, maxlag=Inf) nbmat } } \keyword{spatial} \keyword{utilities} surveillance/man/simulate.ah4.Rd0000644000176000001440000001062312165311273016341 0ustar ripleyusers\encoding{latin1} \name{simulate.ah4} \alias{simulate.ah4} \title{Simulates data based on the model proposed by Paul and Held (2011) } \description{ Simulates a multivariate time series of counts based on the Poisson/Negative Binomial model as described in Paul and Held (2011). } \usage{ \method{simulate}{ah4}(object, nsim = 1, seed = NULL, y.start = NULL, subset = 1:nrow(object$stsObj), coefs = coef(object), components=c("ar","ne","end"), simplify=nsim>1, ...) } \arguments{ \item{object}{ an object of class \code{"ah4"}. } \item{nsim}{ number of time series to simulate. Defaults to \code{1}. } \item{seed}{ an object specifying how the random number generator should be initialized for simulation (via \code{\link{set.seed}}). The initial state will also be stored as an attribute \code{"seed"} of the result. The original state of the \code{\link{.Random.seed}} will be restored at the end of the simulation. By default (\code{NULL}), neither initialization nor recovery will be done. This behaviour is copied from the \code{\link{simulate}.lm} method. } \item{y.start}{ vector or matrix (with \code{ncol(object$stsObj)} columns) with starting counts for the epidemic components. If \code{NULL}, the observed means in the respective units of the data in \code{object} during \code{subset} are used. } \item{subset}{ time period in which to simulate data. Defaults to the whole period. } \item{coefs}{ coefficients used for simulation from the model in \code{object}. Default is to use the fitted parameters. Note that the \code{coefs}-vector must be in the same order and scaling as \code{coef(object)}. } \item{components}{ character vector indicating which components of the fitted model \code{object} should be active during simulation. For instance, a simulation with \code{components="end"} is solely based on the fitted endemic mean. } \item{simplify}{ logical indicating if only the simulated counts (\code{TRUE}) or the full sts object (\code{FALSE}) should be returned for every replicate. Defaults to counts only if \code{nsim>1}, such that the result will be an array of dimension \code{c(nTime, nUnits, nsim)}. } \item{\dots}{unused (argument of the generic).} } \details{ Simulates data from a Poisson or a Negative Binomial model with mean \deqn{\mu_{it} = \lambda_{it} y_{i,t-1} + \phi_{it} \sum_{j \neq i} w_{ji} y_{j,t-1} + \nu_{it}}{% \mu_it = \lambda_it y_i,t-1 + \phi_it \sum_j w_ji y_j,t-1 + \nu_it} where \eqn{\lambda_{it}>0}, \eqn{\phi_{it}>0}, and \eqn{\nu_{it}>0} are parameters which are modelled parametrically. The function uses the model and parameter estimates of the fitted \code{object} to simulate the time series. With the argument \code{coefs} it is possible to simulate from the model as specified in \code{object}, but with different parameter values. } \value{ An object of class \code{"sts"} in case \code{nsim = 1}, and a list of such objects otherwise. } \references{ Paul, M. and Held, L. (2011) Predictive assessment of a non-linear random effects model for multivariate time series of infectious disease counts. Statistics in Medicine, \bold{30}, 1118--1136 } \author{ Michaela Paul and Sebastian Meyer } \seealso{ \code{\link{hhh4}}, \code{\link{simHHH}} } \examples{ data(influMen) # convert to sts class and extract meningococcal disease time series meningo <- disProg2sts(influMen)[,2] # fit model fit <- hhh4(meningo, control = list(ar = list(f = ~ 1), end = list(f = addSeason2formula(S = 1, period = 52)), family = "NegBin1")) plot(fit) # simulate from model simData <- simulate(fit, seed=1234) # plot simulated data plot(simData, main = "simulated data", legend.opts = NULL, xaxis.years = FALSE) # consider a Poisson instead of a NegBin model coefs <- coef(fit) coefs["overdisp"] <- 0 simData2 <- simulate(fit, seed=123, coefs = coefs) plot(simData2, main = "simulated data: Poisson model", legend.opts = NULL, xaxis.years = FALSE) # consider a model with higher autoregressive parameter coefs <- coef(fit) coefs[1] <- log(0.5) simData3 <- simulate(fit, seed=321, coefs = coefs) plot(simData3, main = "simulated data: lambda = 0.5", legend.opts = NULL, xaxis.years = FALSE) } \keyword{datagen} surveillance/man/sim.pointSource.Rd0000644000176000001440000000473511731650466017163 0ustar ripleyusers\name{sim.pointSource} \alias{sim.pointSource} \encoding{latin1} \title{Generation of Simulated Point Source Epidemy} \description{Simulation of epidemies which were introduced by point sources. The basis of this proagramme is a combination of a Hidden Markov Modell (to get random timepoints for outbreaks) and a simple model (compare \code{\link{sim.seasonalNoise}}) to simulate the epidemy. } \usage{ sim.pointSource(p = 0.99, r = 0.01, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K) } \arguments{ \item{p}{probability to get a new epidemy at time i if there was one at time i-1, default 0.99.} \item{r}{probability to get no new epidemy at time i if there was none at time i-1, default 0.01.} \item{length}{number of weeks to model, default 400. \code{length} is ignored if \code{state} is given. In this case the length of \code{state} is used.} \item{A}{amplitude (range of sinus), default = 1.} \item{alpha}{parameter to move along the y-axis (negative values not allowed) with alpha > = A, default = 1.} \item{beta}{regression coefficient, default = 0.} \item{phi}{factor to create seasonal moves (moves the curve along the x-axis), default = 0.} \item{frequency}{factor to determine the oscillation-frequency, default = 1.} \item{state}{use a state chain to define the status at this timepoint (outbreak or not). If not given a Markov chain is generated by the programme, default NULL.} \item{K}{additional weigth for an outbreak which influences the distribution parameter mu, default = 0.} } \value{ \item{disProg}{a object \code{disProg} (disease progress) including a list of the observed, the state chain and nearly all input parameters. } } \seealso{\code{\link{sim.seasonalNoise}} } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ # Plotting of simulated data disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 208, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 2) # plot the simulated disease with the defined outbreaks plot(disProgObj) state <- rep(c(0,0,0,0,0,0,0,0,1,1), 20) disProgObj <- sim.pointSource(state = state, K = 1.2) plot(disProgObj) } \keyword{datagen} surveillance/man/stsBP-class.Rd0000755000176000001440000000374712003536617016217 0ustar ripleyusers\name{stsBP-class} \Rdversion{1.1} \docType{class} \alias{stsBP-class} % % % % other names % %\alias{aggregate,stsBP-method} % %\alias{plot,stsBP-method} % %\alias{plot,stsBP,missing-method} % \alias{nrow,stsBP-method} % \alias{ncol,stsBP-method} % \alias{dim,stsBP-method} % \alias{alarms,stsBP-method} % \alias{alarms<-,stsBP-method} % \alias{upperbound,stsBP-method} % \alias{upperbound<-,stsBP-method} % \alias{control,stsBP-method} % \alias{control<-,stsBP-method} % \alias{epoch,stsBP-method} % \alias{epoch<-,stsBP-method} % \alias{epochInYear,stsBP-method} % \alias{observed,stsBP-method} % \alias{observed<-,stsBP-method} % \alias{population,stsBP-method} % \alias{population<-,stsBP-method} % \alias{multinomialTS,stsBP-method} % \alias{multinomialTS<-,stsBP-method} % \alias{neighbourhood,stsBP-method} % \alias{neighbourhood<-,stsBP-method} % \alias{colnames,stsBP,missing,missing-method} % \alias{initialize,stsBP-method} % \alias{as.data.frame,stsBP-method} %Coerce method to convert to sts object \alias{coerce,sts,stsBP-method} \encoding{latin1} \title{Class "stsBP" -- a class inheriting from class \code{sts} which allows the user to store the results of back-projecting or nowcasting surveillance time series} \description{ A class inheriting from class \code{sts}, but with additional slots to store the result and associated confidence intervals from back projection of a \code{sts} object. } \section{Slots}{ The slots are as for \code{"\linkS4class{sts}"}. However, two additional slots exists. \describe{ \item{\code{ci}:}{An array containing the upper and lower limit of the confidence interval.} \item{\code{lambda}:}{Back projection component} } } \section{Methods}{ The methods are the same as for \code{"\linkS4class{sts}"}. \itemize{ \item{\code{signature(from = "sts", to = "stsBP")}}{ Convert an object of class \code{sts} to class \code{stsBP}. } } } %end section methods. \author{M. \enc{Hhle}{Hoehle}} \keyword{classes} surveillance/man/ha.Rd0000644000176000001440000000152411746056164014444 0ustar ripleyusers\name{ha} \alias{ha} \alias{ha.sts} \title{Hepatitis A in Berlin} \description{Number of Hepatitis A cases among adult male (age>18) in Berlin 2001-2006. An increase is seen during 2006 } \usage{ data("ha") data("ha.sts") } \format{ \code{ha} is a \code{disProg} object containing \eqn{290\times 12}{290 x 12} observations starting from week 1 in 2001 to week 30 in 2006. \code{ha.sts} is generated from \code{ha} by the converter function \code{\link{disProg2sts}} using a shape file of Berlin, see the Example given in the help file for class \code{"\linkS4class{sts}"}. } \source{ Robert Koch-Institut: SurvStat: \url{http://www3.rki.de/SurvStat}; Queried on 25 August 2006. Robert Koch Institut, Epidemiologisches Bulletin 33/2006, p.290. } \examples{ data(ha) plot(aggregate(ha)) } \keyword{datasets} surveillance/man/hhh4_formula.Rd0000644000176000001440000001033612221272015016415 0ustar ripleyusers\encoding{latin1} \name{hhh4_formula} \alias{fe} \alias{ri} \title{ Specify Formulae in a Random Effects HHH Model } \description{ The special functions \code{fe} and \code{ri} are used to specify (unit-specific) effects of covariates and a random intercept term, respectively, in formulae used in the function \code{\link{hhh4}}. } \usage{ fe(x, which = NULL, initial = NULL) ri(type = c("iid","car")[1], corr = c("none", "all")[1], initial.var = NULL, initial.re = NULL) } \arguments{ \item{x}{an expression like \code{sin(2*pi*t/52)} involving the time variable \code{t}, or just \code{1} for an intercept. In general this covariate expression might use any variables contained in the \code{control$data} argument of the parent \code{\link{hhh4}} call.} \item{which}{vector of logicals indicating which unit should get an unit-specific parameter. If \code{NULL}, the effect of the covariate is assumbed to be the same for all units.} \item{initial}{initial values (on internal scale!) for the fixed effects used for optimization. Not really used ATM.} \item{type}{random intercepts either follow an IID or a CAR model} \item{corr}{logical switch indicating whether random effects in different components (such as \code{ar} and \code{end}) should be correlated or not. } \item{initial.var}{initial values (on internal scale!) for the variance components used for optimization. Not really used ATM.} \item{initial.re}{initial values (on internal scale!) for the random effects used for optimization. Not really used ATM.} } \seealso{ \code{\link{addSeason2formula}}, usage of formulae in the vignette and in examples of \code{\link{hhh4}}. } \note{ This function should only be used in formula objects for \code{\link{hhh4}}, and is not intended for direct calling. If unit-specific or random intercepts are specified, an overall intercept must be excluded with \code{-1}. } \keyword{regression} \examples{ \dontrun{ # some calls of the fitting function 'hhh4': # see vignette("hhh4") for further details ## Ex: univariate time series of meningococcal infections in Germany # Negative binomial model with # endemic component: Intercept + S = 1 sine/cosine pair # autoregressive component: Intercept f.S1 <- addSeason2formula(f = ~ 1, S = 1, period = 52) hhh4(meningo, control = list(ar = list(f = ~ 1), end = list(f = f.S1), family = "NegBin1")) ## Ex: disease-specific intercept in influenza/meningococcal time series # Negative binomial model with # autoregressive component: disease-specific intercepts # neighbour-driven component: only intercept for flu -> men # endemic component: S=3 and S=1 sine/cosine pairs for flu and men, respectively f.end <- addSeason2formula(f = ~ -1 + fe(1, which = c(TRUE, TRUE)), S = c(3, 1), period = 52) m <- list(ar = list(f = ~ -1 + fe(1, which = c(TRUE, TRUE))), ne = list(f = ~ -1 + fe(1, which = c(FALSE, TRUE))), end = list(f = f.end), family = "NegBinM" ) hhh4(fluMen, control = m) ## Ex: (correlated) random intercepts for influenza in Southern Germany # Negative binomial model with # autoregressive component: Intercept # neighbour-driven component: random intercepts # endemic component: random intercepts + trend + S = 3 sine/cosine pairs f.end <- addSeason2formula(f = ~ -1 + ri(type = "iid", corr="all") + I((t-208)/100), S = 3, period = 52) model.B2 <- list(ar = list(f = ~ 1), ne = list(f = ~ -1 + ri(type = "iid", corr="all"), weights = wji), end = list(f = f.end, offset = population(flu)), family = "NegBin1") hhh4(flu, model.B2) ## Ex: measles in Germany # Poisson model with # autoregressive component: Intercept + vaccination coverage info # endemic component: Intercept + S = 1 sine/cosine pair f.end <- addSeason2formula(f = ~ 1, S = 1, period = 26) model.A0 <- list(ar = list(f = ~ 1 + logVac0), end = list(f = f.end, offset = population(measles2w)), data = list(t = epoch(measles2w), logVac0 = log(vac0))) hhh4(measles2w, model.A0) } } surveillance/man/algo.summary.Rd0000644000176000001440000000363711731650466016500 0ustar ripleyusers\name{algo.summary} \alias{algo.summary} \title{Summary Table Generation for Several Disease Chains} \description{Summary table generation for several disease chains. } \usage{ algo.summary(compMatrices) } \arguments{ \item{compMatrices}{list of matrices constructed by algo.compare.} } \value{ \item{matrix}{summing up the singular input matrices } } \details{As lag the mean of all single lags is returned. TP values, FN values, TN values and FP values are summed up. \code{dist}, \code{sens} and \code{spec} are new computed on the basis of the new TP value, FN value, TN value and FP value. } \seealso{\code{\link{algo.compare}}, \code{\link{algo.quality}} } \examples{ # Create a test object disProgObj1 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) disProgObj2 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 5) disProgObj3 <- sim.pointSource(p = 0.99, r = 0.5, length = 400, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 17) # Let this object be tested from any methods in range = 200:400 range <- 200:400 control <- list( list(funcName = "rki1", range = range), list(funcName = "rki2", range = range), list(funcName = "rki3", range = range) ) compMatrix1 <- algo.compare(algo.call(disProgObj1, control=control)) compMatrix2 <- algo.compare(algo.call(disProgObj2, control=control)) compMatrix3 <- algo.compare(algo.call(disProgObj3, control=control)) algo.summary( list(a=compMatrix1, b=compMatrix2, c=compMatrix3) ) } \keyword{print} surveillance/man/algo.rki.Rd0000644000176000001440000001020711731650466015557 0ustar ripleyusers\name{algo.rki} \alias{algo.rkiLatestTimepoint} \alias{algo.rki} \alias{algo.rki1} \alias{algo.rki2} \alias{algo.rki3} \encoding{latin1} \title{The system used at the RKI} \description{ Evaluation of timepoints with the detection algorithms used by the RKI } \usage{ algo.rkiLatestTimepoint(disProgObj, timePoint = NULL, control = list(b = 2, w = 4, actY = FALSE)) algo.rki(disProgObj, control = list(range = range, b = 2, w = 4, actY = FALSE)) algo.rki1(disProgObj, control = list(range = range)) algo.rki2(disProgObj, control = list(range = range)) algo.rki3(disProgObj, control = list(range = range)) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain).} \item{timePoint}{time point which shoud be evaluated in \code{algo.rkiLatestTimepoint}. The default is to use the latest timepoint.} \item{control}{control object: \code{range} determines the desired timepoints which should be evaluated, \code{b} describes the number of years to go back for the reference values, \code{w} is the half window width for the reference values around the appropriate timepoint and \code{actY} is a boolean to decide if the year of \code{timePoint} also spend \code{w} reference values of the past. As default \code{b}, \code{w}, \code{actY} are set for the RKI 3 system. } } \value{ \item{survRes}{ \code{algo.rkiLatestTimepoint} returns a list of class \code{survRes} (surveillance result), which includes the alarm value (alarm = 1, no alarm = 0) for recognizing an outbreak, the threshold value for recognizing the alarm and the input object of class disProg. \code{algo.rki} gives a list of class \code{survRes} which includes the vector of alarm values for every timepoint in \code{range}, the vector of threshold values for every timepoint in \code{range} for the system specified by \code{b}, \code{w} and \code{actY}, the range and the input object of class disProg. \code{algo.rki1} returns the same for the RKI 1 system, \code{algo.rki2} for the RKI 2 system and \code{algo.rki3} for the RKI 3 system. } } \details{ Using the reference values for calculating an upper limit (threshold), alarm is given if the actual value is bigger than a computed threshold. \code{algo.rki} calls \code{algo.rkiLatestTimepoint} for the values specified in \code{range} and for the system specified in \code{control}. \code{algo.rki1} calls \code{algo.rkiLatestTimepoint} for the values specified in \code{range} for the RKI 1 system. \code{algo.rki2} calls \code{algo.rkiLatestTimepoint} for the values specified in \code{range} for the RKI 2 system. \code{algo.rki3} calls \code{algo.rkiLatestTimepoint} for the values specified in \code{range} for the RKI 3 system. \itemize{ \item \code{"RKI 1"} reference values from 6 weeks ago \item \code{"RKI 2"} reference values from 6 weeks ago and 13 weeks of the year ago (symmetrical around the comparable week). \item \code{"RKI 3"} 18 reference values. 9 from the year ago and 9 from two years ago (also symmetrical around the comparable week). } } \seealso{ \code{\link{algo.bayesLatestTimepoint}} and \code{\link{algo.bayes}} for the Bayes system. } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, Christian Lang} \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 208, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Test week 200 to 208 for outbreaks with a selfdefined rki algo.rki(disProgObj, control = list(range = 200:208, b = 1, w = 5, actY = TRUE)) # The same for rki 1 to rki 3 algo.rki1(disProgObj, control = list(range = 200:208)) algo.rki2(disProgObj, control = list(range = 200:208)) algo.rki3(disProgObj, control = list(range = 200:208)) # Test for rki 1 the latest timepoint algo.rkiLatestTimepoint(disProgObj) } \keyword{classif} surveillance/man/deleval.Rd0000644000176000001440000000277611731650466015501 0ustar ripleyusers\name{deleval} \alias{deleval} \encoding{latin1} \title{Surgical failures data} \description{ The dataset from Steiner et al. (1999) on A synthetic dataset from the Danish meat inspection -- useful for illustrating the beta-binomial CUSUM. } \usage{data(abattoir) } \details{ Steiner et al. (1999) use data from de Leval et al. (1994) to illustrate monitoring of failure rates of a surgical procedure for a bivariate outcome. Over a period of six years an arterial switch operation was performed on 104 newborn babies. Since the death rate from this surgery was relatively low the idea of surgical "near miss" was introduced. It is defined as the need to reinstitute cardiopulmonary bypass after a trial period of weaning. The object of class \code{sts} contains the recordings of near misses and deaths from the surgery for the 104 newborn babies of the study. The data could also be handled by a multinomial CUSUM model. } \seealso{\code{\link{pairedbinCUSUM}}} \examples{ data("deleval") plot(deleval, xaxis.years=FALSE,ylab="Response",xlab="Patient number") } \references{ Steiner, S. H., Cook, R. J., and Farewell, V. T. (1999), Monitoring paired binary surgical outcomes using cumulative sum charts, Statistics in Medicine, 18, pp. 69--86. De Leval, Marc R., Franiois, K., Bull, C., Brawn, W. B. and Spiegelhalter, D. (1994), Analysis of a cluster of surgical failures, Journal of Thoracic and Cardiovascular Surgery, March, pp. 914--924. } \keyword{datasets} surveillance/man/MMRcoverageDE.Rd0000644000176000001440000000375511731650466016443 0ustar ripleyusers\name{MMRcoverageDE} \alias{MMRcoverageDE} \encoding{latin1} \title{MMR coverage levels in the 16 states of Germany} \description{Coverage levels at school entry for the first and second dose of the combined measles-mumps-rubella (MMR) vaccine in 2006, estimated from children presenting vaccination documents at school entry examinations. } \usage{data(MMRcoverageDE) } \format{ A \code{data.frame} containing 19 rows and 5 columns with variables \describe{ \item{state}{Names of states: first each of the 16 states (Bundeslaender, BL) is listed, followed by the Total of Germany, as well as the total of West (alte BL) and East Germany (neue BL).} \item{nOfexaminedChildren}{Number of children examined.} \item{withVaccDocument}{Percentage of children who presented vaccination documents.} \item{MMR1}{Percentage of children with vaccination documents, who received at least 1 dose of MMR vaccine.} \item{MMR2}{Percentage of children with vaccination documents, who received at least 2 doses of MMR vaccine.} } Coverage levels were derived from vaccination documents presented at medical examinations, which are conducted by local health authorities at school entry each year. Records include information about the receipt of 1st and 2nd doses of MMR, but no information about dates. Note that information from children who did not present a vaccination document on the day of the medical examination, is not included in the estimated coverage. } \source{ Robert Koch-Institut (2008) Zu den Impfquoten bei den Schuleingangsuntersuchungen in Deutschland 2006. Epidemiologisches Bulletin, \bold{7}, 55-57 } \seealso{\code{\link{measlesDE}}} \examples{ data(MMRcoverageDE) } \references{ Herzog, S.A., Paul, M. and Held, L. (2011) Heterogeneity in vaccination coverage explains the size and occurrence of measles epidemics in German surveillance data. Epidemiology and Infection, \bold{139}, 505--515. } \keyword{datasets} surveillance/man/plot.disProg.Rd0000644000176000001440000000772011731650466016443 0ustar ripleyusers\name{plot.disProg} \alias{plot.disProg} \alias{plot.disProg.one} \encoding{latin1} \title{Plot Generation of the Observed and the defined Outbreak States of a (multivariate) time series} \description{Plotting of a disProg object. } \usage{ \method{plot}{disProg}(x, title = "", xaxis.years=TRUE, startyear = x$start[1], firstweek = x$start[2], as.one=TRUE, same.scale=TRUE, \dots) \method{plot}{disProg.one}(x, title = "", xaxis.years=TRUE, quarters=TRUE, startyear = x$start[1], firstweek = x$start[2], ylim=NULL, xlab="time", ylab="No. infected",type="hh",lty=c(1,1),col=c(1,1), outbreak.symbol = list(pch=3, col=3), legend.opts=list(x="top", legend=c("Infected", "Outbreak"), lty=NULL,pch=NULL,col=NULL), \dots) } \arguments{ \item{x}{object of class \code{disProg}} \item{title}{plot title} \item{xaxis.years}{if \code{TRUE}, the x axis is labeled using years} \item{quarters}{add quarters to the plot} \item{startyear}{year to begin the axis labeling (the year where the oldest data come from). This arguments will be obsolete in \code{sts}.} \item{firstweek}{number of the first week of January in the first year (just for axis labeling grounds)} \item{as.one}{if \code{TRUE} all individual time series are shown in one plot} \item{same.scale}{if \code{TRUE} all plots have same scale} \item{ylim}{range of y axis} \item{xlab}{label of the x-axis} \item{ylab}{label of the y-axis} \item{type}{line type of the observed counts (should be \code{hh})} \item{lty}{line type of the observed counts} \item{col}{color of the observed count lines} \item{outbreak.symbol}{list with entries \code{pch} and \code{col} specifying the plot symbol} \item{legend.opts}{a list containing the entries to be sent to the \code{\link{legend}} function. If no legend is requested use \code{legend.opts=NULL}. Otherwise, the following arguments are default \describe{ \item{\code{x}}{\code{top}} \item{\code{legend}}{The names infected and outbreak} \item{\code{lty}}{If \code{NULL} the \code{lty} argument will be used} \item{\code{pch}}{If \code{NULL} the \code{pch} argument is used} \item{\code{col}}{If \code{NULL} the \code{col} argument is used} } An further arguments to the \code{legend} function are just provided as additional elements of this list, e.g. \code{horiz=TRUE}. } \item{\dots}{further arguments for the function \code{matplot}} } \value{ \item{a plot}{showing the number of infected and the defined alarm status for a time series created by simulation or given in data either in one single plot or in several plots for each individual time series. } } \author{M. \enc{Hhle}{Hoehle} with contributions by A. Riebler and C. Lang} \examples{ # Plotting of simulated data disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 208, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 5) # plot the simulated disease with the defined outbreaks plot(disProgObj) title <- "Number of Infected and Defined Outbreak Positions for Simulated Data" plot(disProgObj, title = title) plot(disProgObj, title = title, xaxis.years=TRUE, startyear = 1999, firstweek = 13) plot(disProgObj, title = title, xaxis.years=TRUE, startyear = 1999, firstweek = 14) # Plotting of measles data data(measles.weser) # one plot plot(measles.weser, title = "measles cases in the district Weser-Ems", xaxis.years=TRUE, startyear= 2001, firstweek=1) # plot cases for each "Kreis" plot(measles.weser, same.scale=TRUE, as.one=FALSE) } \keyword{hplot} surveillance/man/twinstim_epidataCS_animate.Rd0000644000176000001440000001357712206625544021354 0ustar ripleyusers\encoding{latin1} \name{twinstim_epidataCS_animate} \alias{animate.epidataCS} \title{ Spatio-Temporal Animation of a Continuous-Time Continuous-Space Epidemic } \description{ Function for the animation of continuous-time continuous-space epidemic data, i.e. objects inheriting from class \code{"epidataCS"}. There are three types of animation, see argument \code{time.spacing}. Besides the direct plotting in the \R session, it is also possible to generate a sequence of graphics files to create animations outside \R, since this function is compatible to the framework of the contributed \R package \pkg{animation} and respects the \code{\link[animation]{ani.options}} \code{"interval"} and \code{"nmax"} if this package is available. } \usage{ \method{animate}{epidataCS}(object, interval = c(0,Inf), time.spacing = NULL, nmax = NULL, sleep = NULL, legend.opts = list(), timer.opts = list(), pch = 15:18, col.current = "red", col.I = "#C16E41", col.R = "#B3B3B3", col.influence = "#FEE0D2", main = NULL, verbose = TRUE, ...) } \arguments{ \item{object}{ an object inheriting from class \code{"epidataCS"}. } \item{interval}{time range of the animation.} \item{time.spacing}{ time interval for the animation steps.\cr If \code{NULL} (the default), the events are plotted one by one. Thus, it is just the \emph{ordering} of the events, which is shown.\cr To plot the appearance of events proportionally to the exact time line, \code{time.spacing} can be set to a numeric value indicating the period of time between consecutive plots. Then, for each time point in \code{seq(0, end, by = time.spacing)} the current state of the epidemic can be seen and an additional timer indicates the current time (see \code{timer.opts} below).\cr If \code{time.spacing = NA}, then the time spacing is automatically determined in such a way that \code{nmax} snapshots result. In this case, \code{nmax} must be given a finite value. } \item{nmax}{ maximum number of snapshots to generate. The default \code{NULL} means to take the value from \code{ani.options("nmax")} if the \pkg{animation} package is available, and no limitation (\code{Inf}) otherwise. } \item{sleep}{ numeric scalar specyfing the artificial pause in seconds between two time points, or \code{NULL} (default), when this is taken from \code{ani.options("interval")} if the \pkg{animation} package is available, or set to 0.1 otherwise. Thus, if generating an animation inside \pkg{animation}'s \code{\link[animation]{saveHTML}} or similar, then this should be set to 0. } \item{pch, col}{ vectors of length equal to the number of event types specifying the point symbols and colors for events to plot (in this order). The vectors are recycled if necessary. } \item{legend.opts}{ either a list of arguments passed to the \code{\link{legend}} function or \code{NULL} (or \code{NA}), in which case no legend will be plotted. All necessary arguments have sensible defaults and need not be specified. } \item{timer.opts}{ either a list of arguments passed to the \code{\link{legend}} function or \code{NULL} (or \code{NA}), in which case no timer will be plotted. All necessary arguments have sensible defaults and need not be specified, i.e. \describe{ \item{\code{x}:}{\code{"bottomright"}} \item{\code{title}:}{\code{"time"}} \item{\code{box.lty}:}{\code{0}} \item{\code{adj}:}{\code{c(0.5,0.5)}} \item{\code{inset}:}{\code{0.01}} \item{\code{bg}:}{\code{"white"}} } Note that the argument \code{legend}, which is the current time of the animation, can not be modified. } \item{col.current}{color of events when occuring.} \item{col.I}{color once infectious.} \item{col.R}{color event has once \dQuote{recovered}. If \code{NA}, then recovered events will not be shown.} \item{col.influence}{color with which the influence region is drawn. Use \code{NA} if no influence regions should be drawn.} \item{main}{optional main title placed above the map.} \item{verbose}{logical specifying if a (textual) progress bar should be shown during snapshot generation. This is especially useful if the animation is produced within \code{\link[animation]{saveHTML}} or similar.} \item{\dots}{ further graphical parameters passed to the plot-method of the \code{\link{SpatialPolygons-class}}. } } %\value{ % invisibly returns \code{NULL}. %} \author{ Sebastian Meyer with documentation contributions by Michael H\enc{}{oe}hle } \seealso{ \code{\link{plot.epidataCS}} for plotting the numbers of events by time (aggregated over space) or the locations of the events in the observation region \code{W} (aggregated over time). The contributed \R package \pkg{animation}. } \examples{ \dontrun{ data("imdepi") imdepiB <- subset(imdepi, type == "B") if (require("animation")) ani.options(interval = 0.1, nmax = 60) # Animate the first year of type B with a step size of 7 days animate(imdepiB, interval=c(0,365), time.spacing=7) # Animate the whole time range but with nmax=60 snapshots only and # omitting the painting of (quiet artificial) influence regions animate(imdepiB, time.spacing=NA, col.influence=NA, nmax=60) # Sequential animation of events animate(imdepiB, time.spacing=NULL, nmax=60) # Such an animation can be saved in various ways using the tools of # the animation package, e.g., saveHTML() if (require("animation")) { ani.options(outdir = tempdir()) saveHTML(animate(imdepiB, interval=c(0,365), time.spacing=7), img.name = "imdepi_year1", htmlfile = "imdepi_animation.html", autobrowse = TRUE, title = "Animation of the first year", description = c("Take a look into the first-year dynamics.")) } } } \keyword{hplot} \keyword{dynamic} \keyword{spatial} surveillance/man/twinSIR_epidata_animate.Rd0000644000176000001440000001626212061362061020570 0ustar ripleyusers\name{twinSIR_epidata_animate} \alias{animate.epidata} \alias{animate.summary.epidata} \title{ Spatio-Temporal Animation of an Epidemic } \description{ Function for the animation of epidemic data, i.e. objects inheriting from class \code{"epidata"}. This only works with 1- or 2-dimensional coordinates and is not useful if some individuals share the same coordinates (overlapping). There are two types of animation, see argument \code{time.spacing}. Besides the direct plotting in the \R session, it is also possible to generate a sequence of graphics files to create animations outside \R. } \usage{ \method{animate}{summary.epidata}(object, main = "An animation of the epidemic", pch = 19, col = c(3, 2, gray(0.6)), time.spacing = NULL, sleep = quote(5/.nTimes), legend.opts = list(), timer.opts = list(), end = NULL, generate.snapshots = NULL, ...) \method{animate}{epidata}(object, ...) } \arguments{ \item{object}{ an object inheriting from class \code{"epidata"} or \code{"summary.epidata"}. In the former case, its summary is calculated and the function continues as in the latter case, passing all \code{...} arguments to the \code{summary.epidata} method. } \item{main}{ a main title for the plot, see also \code{\link{title}}. } \item{pch, col}{ vectors of length 3 specifying the point symbols and colors for susceptible, infectious and removed individuals (in this order). The vectors are recycled if necessary. By default, susceptible individuals are marked as filled green circles, infectious individuals as filled red circles and removed individuals as filled gray circles. Note that the symbols are iteratively drawn (overlayed) in the same plotting region as time procedes. For information about the possible values of \code{pch} and \code{col}, see the help pages of \code{\link{points}} and \code{\link{par}}, respectively. } \item{time.spacing}{ time interval for the animation steps. If \code{NULL} (the default), the events are plotted one by one with pauses of \code{sleep} seconds. Thus, it is just the \emph{ordering} of the events, which is shown. To plot the appearance of events proportionally to the exact time line, \code{time.spacing} can be set to a numeric value indicating the period of time between consecutive plots. Then, for each time point in \code{seq(0, end, by = time.spacing)} the current state of the epidemic can be seen and an additional timer indicates the current time (see \code{timer.opts} below). The argument \code{sleep} will be the artificial pause in seconds between two of those time points. } \item{sleep}{ time in seconds to \code{\link{Sys.sleep}} before the next plotting event. By default, each artificial pause is of length \code{5/.nTimes} seconds, where \code{.nTimes} is the number of events (infections and removals) of the epidemic, which is evaluated in the function body. Thus, for \code{time.spacing = NULL} the animation has a duration of approximately 5 seconds. In the other case, \code{sleep} is the duration of the artificial pause between two time points. } \item{legend.opts}{ either a list of arguments passed to the \code{\link{legend}} function or \code{NULL} (or \code{NA}), in which case no legend will be plotted. All necessary arguments have sensible defaults and need not be specified, i.e. \describe{ \item{\code{x}:}{\code{"topright"}} \item{\code{legend}:}{\code{c("susceptible", "infectious", "removed")}} \item{\code{pch}:}{same as argument \code{pch} of the main function} \item{\code{col}:}{same as argument \code{col} of the main function} } } \item{timer.opts}{ either a list of arguments passed to the \code{\link{legend}} function or \code{NULL} (or \code{NA}), in which case no timer will be plotted. All necessary arguments have sensible defaults and need not be specified, i.e. \describe{ \item{\code{x}:}{\code{"bottomright"}} \item{\code{title}:}{\code{"time"}} \item{\code{box.lty}:}{\code{0}} \item{\code{adj}:}{\code{c(0.5,0.5)}} \item{\code{inset}:}{\code{0.01}} \item{\code{bg}:}{\code{"white"}} } Note that the argument \code{legend}, which is the current time of the animation, can not be modified. } \item{end}{ ending time of the animation in case of \code{time.spacing} not being \code{NULL}. By default (\code{NULL}), time stops after the last event. } \item{generate.snapshots}{ By default (\code{NULL}), the animation is not saved to image files but only shown on the on-screen device. In order to do that, \code{time.spacing} must not be \code{NULL}, and there are two options:\cr If the framework of the \pkg{animation} package should be used, i.e. the \code{animate}-call is passed as the \code{expr} argument to one of the \code{save*} functions of the \pkg{animation} package, then set \code{generate.snapshots = img.name}, where \code{img.name} is the base name for the generated images (the same as passed to the \code{save*} function). The path and format (type, width, height) for the generated images is derived from \code{\link[animation]{ani.options}}. See the last example below.\cr Alternatively, \code{generate.snapshots} may be a list of arguments passed to the function \code{\link{dev.print}}, which then is executed at each time point of the grid defined by \code{time.spacing}. Essentially, this is used for saving the produced snapshots to files, e.g. \code{generate.snapshots = % list(device=pdf, file=quote(paste("epidemic_",sprintf(form,tp),".pdf",% sep="")))} will store the animation steps in pdf-files in the current working directory, where the file names each end with the time point represented by the corresponding plot. Because the variables \code{tp} and \code{form} should only be evaluated inside the function the \code{file} argument is \code{quote}d. Alternatively, the file name could also make use of the internal plot index \code{i}, e.g., use \code{file=quote(paste("epidemic",i,".pdf",sep=""))}. } \item{\dots}{ further graphical parameters passed to the basic call of \code{plot}, e.g. \code{las}, \code{cex.axis} (etc.) and \code{mgp}. } } %\value{ % invisibly returns \code{NULL}. %} \author{ Sebastian Meyer } \seealso{ \code{\link{summary.epidata}} for the data, on which the plot is based. \code{\link{plot.epidata}} for plotting the evolution of an epidemic by the numbers of susceptible, infectious and removed individuals. The contributed \R package \pkg{animation}. } \examples{ \dontrun{ data("fooepidata") (s <- summary(fooepidata)) # plot the ordering of the events only animate(s, sleep=0.01) # or: animate(fooepidata) # with timer (animate only up to t=10) animate(s, time.spacing=0.1, end=10, sleep=0.01) # using features of the animation package: if (require("animation")) saveHTML( animate(s, time.spacing = 1, sleep = 0, generate.snapshots = "epiani"), img.name = "epiani", use.dev = FALSE, ani.type = "png", width = 600 ) } } \keyword{hplot} \keyword{dynamic} \keyword{spatial} surveillance/man/algo.cusum.Rd0000644000176000001440000001145311747513336016133 0ustar ripleyusers\name{algo.cusum} \alias{algo.cusum} \title{CUSUM method} \encoding{latin1} \description{ Approximate one-side CUSUM method for a Poisson variate based on the cumulative sum of the deviation between a reference value k and the (standardized) observed values. An alarm is raised if the cumulative sum equals or exceeds a prespecified decision boundary h. } \usage{ algo.cusum(disProgObj, control = list(range = range, k = 1.04, h = 2.26, m = NULL, trans = "standard", alpha = NULL)) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain)} \item{control}{control object: \describe{ \item{\code{range}}{determines the desired time points which should be evaluated} \item{\code{k}}{is the reference value} \item{\code{h}}{the decision boundary} \item{\code{m}}{how to determine the expected number of cases -- the following arguments are possible \describe{ \item{\code{numeric}}{a vector of values having the same length as \code{range}. If a single numeric value is specified then this value is replicated \code{length(range)} times.} \item{\code{NULL}}{A single value is estimated by taking the mean of all observations previous to the first \code{range} value.} \item{\code{"glm"}}{ A GLM of the form \deqn{\log(m_t) = \alpha + \beta t + \sum_{s=1}^S (\gamma_s \sin(\omega_s t) + \delta_s \cos(\omega_s t)),} where \eqn{\omega_s = \frac{2\pi}{52}s}{\omega_s = 2\pi/52 s} are the Fourier frequencies is fitted. Then this model is used to predict the \code{range} values.} }} \item{\code{trans}}{one of the following transformations (warning: anscombe and negbin transformations are experimental) \describe{ \item{\code{rossi}}{compute standardized variables z3 as proposed by Rossi} \item{\code{standard}}{compute standardized variables z1 (based on asympotic normality)} \item{\code{anscombe}}{anscombe residuals -- experimental} \item{\code{anscombe2nd}}{ anscombe residuals as in Pierce and Schafer (1986) based on 2nd order approximation of E(X) -- experimental} \item{\code{pearsonNegBin}}{compute Pearson residuals for NegBin -- experimental} \item{\code{anscombeNegBin}}{anscombe residuals for NegBin -- experimental} \item{\code{none}}{ no transformation} } } \item{\code{alpha}}{parameter of the negative binomial distribution, s.t. the variance is \eqn{m+\alpha *m^2} } } } } \value{ \item{survRes}{ \code{algo.cusum} gives a list of class \code{survRes} which includes the vector of alarm values for every timepoint in \code{range} and the vector of cumulative sums for every timepoint in \code{range} for the system specified by \code{k} and \code{h}, the range and the input object of class disProg. The \code{upperbound} entry shows for each time instance the number of diseased individuals it would have taken the cusum to signal. Once the CUSUM signals no resetting is applied, i.e. signals occurs until the CUSUM statistic again returns below the threshold. The \code{control$m.glm} entry contains the fitted glm object, if the original argument was "\code{glm}". } } \details{This implementation is still experimental} %\seealso{} \author{M. Paul and M. \enc{Hhle}{Hoehle}} \examples{ # Xi ~ Po(5), i=1,...,500 disProgObj <- create.disProg(week=1:500, observed= rpois(500,lambda=5), state=rep(0,500)) # there should be no alarms as mean doesn't change res <- algo.cusum(disProgObj, control = list(range = 100:500,trans="anscombe")) plot(res) # simulated data disProgObj <- sim.pointSource(p = 1, r = 1, length = 250, A = 0, alpha = log(5), beta = 0, phi = 10, frequency = 10, state = NULL, K = 0) plot(disProgObj) # Test week 200 to 250 for outbreaks surv <- algo.cusum(disProgObj, control = list(range = 200:250)) plot(surv) } \references{ G. Rossi, L. Lampugnani and M. Marchi (1999), An approximate CUSUM procedure for surveillance of health events, Statistics in Medicine, 18, 2111--2122 D. A. Pierce and D. W. Schafer (1986), Residuals in Generalized Linear Models, Journal of the American Statistical Association, 81, 977--986 } \keyword{classif} %\source{} surveillance/man/enlargeData.Rd0000644000176000001440000000243711731650466016266 0ustar ripleyusers\name{enlargeData} \alias{enlargeData} \title{Data Enlargement} \description{Enlargement of data which is too short for a surveillance method to evaluate. } \usage{ enlargeData(disProgObj, range = 1:156, times = 1) } \arguments{ \item{disProgObj}{object of class disProg (including the observed and the state chain).} \item{range}{range of already existing data (\code{state}, \code{observed}) which should be used for enlargement.} \item{times}{number of times to enlarge.} } \value{ \item{disProg}{a object \code{disProg} (disease progress) including a list of the observed and the state chain (extended with cyclic data generation)} } \details{ \code{observed} and \code{state} are enlarged in the way that the part \code{range} of \code{observed} and \code{state} is repeated \code{times} times in front of \code{observed} and \code{state}. Sometimes it's useful to care for the cyclic property of the timeseries, so as default we enlarge observed and state once with the first three existing years, assuming a year has 52 weeks. } \seealso{\code{\link{readData}} } \examples{ obj <- readData("k1") enlargeData(obj) # enlarge once with part 1:156 enlargeData(obj, 33:36, 10) # enlarge 10 times with part 33:36 } \keyword{utilities} surveillance/man/sim.seasonalNoise.Rd0000644000176000001440000000366111731650466017451 0ustar ripleyusers\name{sim.seasonalNoise} \alias{sim.seasonalNoise} \encoding{latin1} \title{Generation of Background Noise for Simulated Timeseries} \description{Generation of a cyclic model of a Poisson distribution as background data for a simulated timevector. The mean of the Poisson distribution is modelled as: \deqn{\mu = \exp(A \sin( frequency \cdot \omega \cdot (t + \phi)) + \alpha + \beta * t + K * state)}{% mu = exp(A * sin( frequency * omega * (t + phi)) + alpha + beta * t + K * state)} } \usage{ sim.seasonalNoise(A = 1, alpha = 1, beta = 0, phi = 0, length, frequency = 1, state = NULL, K = 0) } \arguments{ \item{A}{amplitude (range of sinus), default = 1.} \item{alpha}{parameter to move along the y-axis (negative values not allowed) with alpha > = A, default = 1.} \item{beta}{regression coefficient, default = 0.} \item{phi}{factor to create seasonal moves (moves the curve along the x-axis), default = 0.} \item{length}{number of weeks to model.} \item{frequency}{factor to determine the oscillation-frequency, default = 1.} \item{state}{if a state chain is entered the outbreaks will be additional weighted by K.} \item{K}{additional weigth for an outbreak which influences the distribution parameter mu, default = 0.} } \value{ \item{seasonNoise}{Object of class \code{seasonNoise} which includes the modelled timevector, the parameter \code{mu} and all input parameters. } } \seealso{\code{\link{sim.pointSource}} } \author{M. \enc{Hhle}{Hoehle}, A. Riebler, C. Lang} \examples{ season <- sim.seasonalNoise(length = 300) plot(season$seasonalBackground,type = "l") # use a negative timetrend beta season <- sim.seasonalNoise(beta = -0.003, length = 300) plot(season$seasonalBackground,type = "l") } \keyword{datagen} surveillance/man/twinstim_iafplot.Rd0000644000176000001440000001274012207663272017447 0ustar ripleyusers\encoding{latin1} \name{twinstim_iafplot} \alias{iafplot} \title{ Plot the spatial or temporal interaction function of a twimstim } \description{ The function plots the fitted temporal or (isotropic) spatial interaction function of a \code{twinstim} object. } \usage{ iafplot(object, which = c("siaf", "tiaf"), types = 1:nrow(object$qmatrix), scaled = FALSE, conf.type = if (length(pars) > 1) "bootstrap" else "parbounds", conf.level = 0.95, conf.B = 999, xgrid = 101, col.estimate = rainbow(length(types)), col.conf = col.estimate, alpha.B = 0.15, lwd = c(3,1), lty = c(1,2), xlim = NULL, ylim = NULL, add = FALSE, xlab = NULL, ylab = NULL, legend = !add && (length(types) > 1), ...) } \arguments{ \item{object}{ object of class \code{"twinstim"} containing the fitted model. } \item{which}{ argument indicating which of the two interaction functions to plot. Possible values are \code{"siaf"} (default) for the spatial interaction function and \code{"tiaf"} for the temporal interaction function. } \item{types}{ integer vector indicating for which event \code{types} the interaction function should be plotted in case of a marked twinstim. } \item{scaled}{ logical indicating if the interaction function should be multiplied by the epidemic intercept \eqn{exp(\gamma_0)}. This is required for the comparison of estimated interaction functions from different models. } \item{conf.type}{ type of confidence interval to produce. If \code{"bootstrap"}, \code{conf.B} parameter values (vectors) are sampled from the asymptotic (multivariate) normal distribution of the ML estimate(s) of the interaction function parameters; the interaction function is then evaluated on the \code{xgrid} (i.e. temporal or spatial distances from the host) for each parameter realization to obtain a \code{conf.level} confidence interval at each point of the \code{xgrid}. If \code{"parbounds"}, the \code{conf.level} Wald confidence intervals for the interaction function parameters are calculated and the interaction function is evaluated on the \code{xgrid} (distances from the host) for all combinations of the bounds of the parameters and the point-wise extremes of those functions are plotted. This type of confidence interval is actually only valid in the case of only one interaction function parameter, but could also be used as a rough indication if bootstrapping takes too long. } \item{conf.level}{ the confidence level required. For \code{conf.type = "bootstrap"} it may also be specified as \code{NA}, in which case all \code{conf.B} bootstrapped functions will be plotted with transparency value given by \code{alpha.B}. } \item{conf.B}{ number of samples for the \code{"bootstrap"} confidence interval. } \item{xgrid}{ either a numeric vector of x-values (distances from the host) where to evaluate \code{which}, or a scalar representing the desired number of evaluation points in the interval \code{c(0,xlim[2])}. } \item{col.estimate}{ vector of colours to use for the function point estimates of the different \code{types}. } \item{col.conf}{ vector of colours to use for the confidence intervals of the different \code{types}. } \item{alpha.B}{ alpha transparency value (as relative opacity) used for the \code{conf.B} bootstrapped interaction functions in case \code{conf.level = NA} } \item{lwd, lty}{ numeric vectors of length two specifying the line width and type of point estimates (first element) and confidence limits (second element), respectively. } \item{xlim, ylim}{ vectors of length two containing the x- and y-axis limit of the plot. The default y-axis ranges from 0 to 1 (or to \eqn{exp(\gamma_0)}, if \code{scaled}). The default x-axis ranges from 0 to the length of the observation period (\code{which="tiaf"}) or the length of the diagonale of the bounding box of the observation region (\code{which="siaf"}), respectively, or to the maximum of \code{xgrid} if given as a vector of evaluation points. } \item{add}{ add to an existing plot? } \item{xlab, ylab}{ labels for the axes with \code{NULL} providing sensible defaults. } \item{legend}{ logical indicating if a legend for the \code{types} should be added. It can also be a list of arguments passed to \code{\link{legend}} to tweak the default settings. } \item{\dots}{ additional arguments passed to the default \code{plot} method. } } \value{ A plot is created -- see e.g. Figure 3(b) in Meyer et al. (2012). \code{NULL} is returned (invisibly). } \references{ Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} } \author{ Sebastian Meyer } \seealso{ \code{\link{plot.twinstim}}, which calls this function. } \examples{ data("imdepifit") iafplot(imdepifit, "tiaf", types=1) # tiaf.constant(), not very exciting iafplot(imdepifit, "siaf", types=1, # same for types=2 xlim=c(0,200), col.estimate=1, lwd=c(2,1)) # scaled version and bootstrap-CI (used if 'siaf' has more than one parameter) iafplot(imdepifit, "siaf", types=1, scaled=TRUE, xlim=c(0,200), conf.type="bootstrap", col.estimate=2) } \keyword{hplot} \keyword{aplot} surveillance/man/stsDisp.Rd0000644000176000001440000001150612012724501015466 0ustar ripleyusers\name{display-methods} \alias{plot,sts,missing-method} %\alias{print} %\alias{print,sts-method} \alias{show,sts-method} \alias{plot.sts.time} \alias{plot.sts.time.one} \alias{plot.sts.spacetime} \alias{plot.sts.alarm} \title{Display Methods for Surveillance Time-Series Objects} \description{ Display methods for objects of class \code{"sts"}. } \section{Usage}{ plot(x,y,type,...) print(x,...) } \section{Arguments}{ \describe{ \item{x}{an object of class \code{"sts"}} \item{y}{missing} \item{type}{a formula specifying the plot type, several options are possible: \describe{ \item{\code{observed ~ time}}{The observations in \code{x} are aggregated over units and the resulting univariate time-series is plotted. The plotting is done by the function \code{plot.time.sts}, which takes the same arguments as the \code{\link{plot.survRes}} function.} \item{\code{observed ~ time | unit}}{shows \code{dim(x)} plots with each showing the time-series of one observational unit. The actual plotting is done by the function \code{plot.time.sts.one}} \item{\code{observed ~ 1 | unit}}{for each unit the counts are aggregated over time and a map illustrating the counts is shown. The column names of the \code{x@observed} object are used to label the entries of the \code{x@map}. Regions with an alarm are shaded.} \item{\code{observed ~ 1 | unit * time}}{an animation consisting of \code{nrow(x)} frames is generated. Each frame contains the number of counts per region for the current row in the \code{observed} matrix. It is possible to redirect the output into files, e.g. to generate an animated GIF. See the examples.} \item{\code{alarm ~ time}}{Generates a so called alarmplot for a multivariate \code{sts} object. For each time point and each series it is shown whether there is an alarm. In case of hierarchical surveillance the user can pass an additional argument \code{lvl}, which is a vector of the same length as rows in \code{x} specifying for each time series its level. } } } \item{\dots}{further arguments passed to or from other methods: in case of plotting these are passed to \code{\link{plot}}, in case of printing these are passed to \code{\link{print.default}}} } } \details{ The plotting of time-series plots relies on two internal functions with \code{plot.sts.time.one} being the work-horse. Its arguments are (almost) similiar to \code{\link{plot.survRes}}. \code{k} is the column to plot. \preformatted{plot.sts.time(x, type,method=x@control$name,disease=x@control$data,same.scale=TRUE, par.list=list(mfrow=magic.dim(nAreas),mar=par()$mar),...)} \preformatted{plot.sts.time.one <- function(x, k=1, domany=FALSE,ylim=NULL,xaxis.years=TRUE, xaxis.units=TRUE, epochsAsDate=x@epochAsDate, xlab="time", ylab="No. infected", main=NULL, type="s",lty=c(1,1,2),col=c(NA,1,4),lwd=c(1,1,1), outbreak.symbol = list(pch=3, col=3, cex=1),alarm.symbol=list(pch=24, col=2, cex=1),cex=1,legend.opts=list(x="top", legend=NULL,lty=NULL,pch=NULL,col=NULL),dx.upperbound=0.5, hookFunc=function() {},...)} Note that the \code{hookFunc} is called after all the basic plotting has be done, i.e. it is not possible to control formatting with this function. For spacetime plots the following internal function does all the work: \preformatted{plot.sts.spacetime(x,type,legend=NULL,opts.col=NULL, labels=TRUE,wait.ms=250,cex.lab=0.7,verbose=FALSE, dev.printer=NULL,...)} Alarmplot \preformatted{plot.sts.alarm <- function(x, lvl=rep(1,nrow(x)), ylim=NULL,xaxis.years=TRUE, xaxis.units=TRUE, epochsAsDate=x@epochAsDate, xlab="time", main=NULL, type="hhs",lty=c(1,1,2),col=c(1,1,4), outbreak.symbol = list(pch=3, col=3, cex=1),alarm.symbol=list(pch=24, col=2, cex=1),cex=1,cex.yaxis=1,...)} \code{print} is the method for printing \code{sts} objects. } \value{ The methods are called for their side-effects. } \seealso{ \code{\link{plot.survRes}} } \examples{ data("ha.sts") print(ha.sts) plot(ha.sts, type= observed ~ time) plot(ha.sts, type= observed ~ time | unit) plot(ha.sts, type= observed ~ 1 | unit) plot(ha.sts[1:20,1:2], type= observed ~ 1 | unit) \dontrun{ # space-time animation plot(aggregate(ha.sts,nfreq=13), type= observed ~ 1 | unit * time) #Configure a png device printer to save the frames dev.printer <- list(device=png, extension=".png", width=640, height=480, name=file.path(tempdir(),"berlin")) #Do the animation (without extra sleeping time between frames) plot(aggregate(ha.sts,nfreq=13), type = observed ~ 1 | unit * time, wait.ms=0, dev.printer=dev.printer) #Use ImageMagick (you might have to adjust the path to 'convert') system(paste("convert -delay 50 ",dev.printer$name, "*.png ", dev.printer$name, "-animated.gif",sep="")) } } \keyword{ts} \keyword{hplot} surveillance/man/make.design.Rd0000644000176000001440000000637511770111463016241 0ustar ripleyusers\name{make.design} \alias{make.design} \encoding{latin1} \title{Create the design matrices} \description{ Creates the design matrices needed for \code{meanResponse} } \usage{ make.design(disProgObj, control=list(lambda=TRUE, neighbours=FALSE, linear=FALSE, nseason=0, negbin=c("none", "single", "multiple"), proportion=c("none", "single", "multiple"),lag.range=NULL) ) } \arguments{ \item{disProgObj}{object of class \code{disProg}} \item{control}{control object: \describe{ \item{\code{lambda}}{If \code{TRUE} an autoregressive parameter \eqn{\lambda} is included, if \code{lambda} is a vector of logicals, unit-specific parameters \eqn{\lambda_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{lambda} as a vector of integers, see \code{\link{algo.hhh}} for details.} \item{\code{neighbours}}{If \code{TRUE} an autoregressive parameter for adjacent units \eqn{\phi} is included, if \code{neighbours} is a vector of logicals, unit-specific parameters \eqn{\phi_i} are included. By default, observations \eqn{y_{t-lag}}{y_t-lag} at the previous time points, i.e. \eqn{lag=1}, are used for the autoregression. Other lags can be used by specifying \code{neighbours} as a vector of integers.} \item{\code{linear}}{a \code{logical} (or a vector of logicals) indicating wether a linear trend \eqn{\beta} (or a linear trend \eqn{\beta_i} for each unit) is included} \item{\code{nseason}}{Integer number of Fourier frequencies; if \code{nseason} is a vector of integers, each unit \eqn{i} gets its own seasonal parameters } \item{\code{negbin}}{if \code{"single"} negative binomial rather than poisson is used, if \code{"multiple"} unit-specific overdispersion parameters are used.} \item{\code{proportion}}{see details in \code{\link{algo.hhh}} } \item{\code{lag.range}}{determines which observations are used to fit the model } }} } \value{Returns a list with elements \item{Y}{matrix with number of cases \eqn{y_{it}}{y_it} in unit \eqn{i} at time \eqn{t} as elements, i.e. data without the first time point.} \item{Ym1}{matrix with previous number of cases \eqn{y_{i,t-1}}{y_i,t-1}, i.e data without the last time point.} \item{Ym1.neighbours}{matrix with weighted sum of earlier counts of adjacent units \eqn{\sum_{j \sim i} m_{ji} y_{j,t-1}}{sum_(j ~ i) w_ji * y_j,t-1} } \item{nOfNeighbours}{vector with number of neighbours for each unit \eqn{i} } \item{X.trendSeason}{design matrix for linear trend and seasonal components} \item{populationFrac}{matrix with corresponding population proportions} \item{dimTheta}{list with number of parameters used in model} \item{control}{control object} \item{disProgObj}{Object of class \code{disProg}} \item{lag}{which lag is used for the autoregressive parameters \eqn{\lambda} and \eqn{\phi} } \item{nObs}{number of observations} } \author{M.Paul, L. Held} \keyword{internal} % predict.ah surveillance/man/twinstim_simulation.Rd0000644000176000001440000003462212236676620020203 0ustar ripleyusers\encoding{latin1} \name{twinstim_simulation} \alias{simEpidataCS} \alias{simulate.twinstim} \title{ Simulation of a Self-Exciting Spatio-Temporal Point Process } \description{ The function \code{simEpidataCS} simulates events of a self-exiciting spatio-temporal point process of the \code{"\link{twinstim}"} class. Simulation works via Ogata's modified thinning of the conditional intensity as described in Meyer et al. (2012). The \code{\link{simulate}} method for objects of class \code{"\link{twinstim}"} simulates new epidemic data using the model and the parameter estimates of the fitted object. } \usage{ simEpidataCS(endemic, epidemic, siaf, tiaf, qmatrix, rmarks, events, stgrid, tiles, beta0, beta, gamma, siafpars, tiafpars, t0 = stgrid$start[1], T = tail(stgrid$stop,1), nEvents = 1e5, control.siaf = list(F=list(), Deriv=list()), W = NULL, trace = 5, nCircle2Poly = 32, gmax = NULL, .allocate = 500, .skipChecks = FALSE, .onlyEvents = FALSE) \method{simulate}{twinstim}(object, nsim = 1, seed = NULL, data, tiles, rmarks = NULL, t0 = NULL, T = NULL, nEvents = 1e5, control.siaf = object$control.siaf, W = NULL, trace = FALSE, nCircle2Poly = NULL, gmax = NULL, .allocate = 500, simplify = TRUE, ...) } \arguments{ \item{endemic}{ see \code{\link{twinstim}}. Note that type-specific endemic intercepts are specified by \code{beta0} here, not by the term \code{(1|type)}. } \item{epidemic}{ see \code{\link{twinstim}}. Marks appearing in this formula must be returned by the generating function \code{rmarks}. } \item{siaf}{ see \code{\link{twinstim}}. In addition to what is required for fitting with \code{twinstim}, the \code{siaf} specification must also contain the element \code{simulate}, a function which draws random locations following the spatial kernel \code{siaf$f}. The first argument of the function is the number of points to sample (say \code{n}), the second one is the vector of parameters \code{siafpars}, the third one is the type indicator (a character string matching a type name as specified by \code{dimnames(qmatrix)}). With the current implementation there will always be simulated only one location at a time, i.e. \code{n=1}. The \link[=siaf.constant]{predefined siaf's} all provide simulation. } \item{tiaf}{ e.g. what is returned by the generating function \code{\link{tiaf.constant}} or \code{\link{tiaf.exponential}}. See also \code{\link{twinstim}}. } \item{qmatrix}{ see \code{\link{epidataCS}}. Note that this square matrix and its \code{dimnames} determine the number and names of the different event types. In the simplest case, there is only a single type of event, i.e. \code{qmatrix = diag(1)}. } \item{rmarks}{ function of single time (1st arg) and location (2nd arg) returning a one-row \code{data.frame} of marks (named according to the variables in \code{epidemic}) for an event at this point. This must include the columns \code{eps.s} and \code{eps.t}, i.e. the values of the spatial and temporal interaction ranges at this point. Only \code{"numeric"} and \code{"factor"} columns are allowed. Assure that factor variables are coded equally (same levels and level order) for each new sample. For the \code{simulate.twinstim} method, the default (\code{NULL}) means sampling from the empirical distribution function of the (non-missing) marks in \code{data} in (\code{t0};\code{T}]. } \item{events}{ \code{NULL} or missing (default) in case of an empty prehistory, or a \code{\link{SpatialPointsDataFrame}} containing events of the prehistory (-Inf;\code{t0}] of the process (required for the epidemic to start in case of no endemic component in the model). The \code{SpatialPointsDataFrame} must have the same \code{proj4string} as \code{tiles} and \code{W}). The attached \code{data.fram}e (data slot) must contain the typical columns as described in \code{\link{as.epidataCS}} (\code{time}, \code{tile}, \code{eps.t}, \code{eps.s}, and, for type-specific models, \code{type}) and all marks appearing in the \code{epidemic} specification. Note that some column names are reserved (see \code{\link{as.epidataCS}}). Only events up to time \code{t0} are selected and taken as the prehistory. } \item{stgrid}{ see \code{\link{as.epidataCS}}. Simulation only works inside the spatial and temporal range of \code{stgrid}. } \item{tiles}{ object inheriting from \code{"\linkS4class{SpatialPolygons}"} with \code{row.names} matching the \code{tile} names in \code{stgrid} and having the same \code{proj4string} as \code{events} and \code{W}. This is necessary to draw the spatial location of events generated by the endemic component. } \item{beta0,beta,gamma,siafpars,tiafpars}{ these are the parameter subvectors of the \code{twinstim}. \code{beta} and \code{gamma} must be given in the same order as they appear in \code{endemic} and \code{epidemic}, respectively. \code{beta0} is either a single endemic intercept or a vector of type-specific endemic intercepts in the same order as in \code{qmatrix}. } \item{t0}{ events having occured during (-Inf;\code{t0}] are regarded as part of the prehistory \eqn{H_0} of the process. The time point \code{t0} must be an element of \code{stgrid$start}. For \code{simEpidataCS}, by default, and also if \code{t0=NULL}, it is the earliest time point of the spatio-temporal grid \code{stgrid}. For the \code{simulate.twinstim} method, \code{NULL} means to use the same time range as for the fitting of the \code{"twinstim"} \code{object}. } \item{T, nEvents}{ simulate a maximum of \code{nEvents} events up to time \code{T}, then stop. For \code{simEpidataCS}, by default, and also if \code{T=NULL}, \code{T} equals the last stop time in \code{stgrid} (it cannot be greater) and \code{nEvents} is bounded above by 10000. For the \code{simulate.twinstim} method, \code{T=NULL} means to use the same same time range as for the fitting of the \code{"twinstim"} \code{object}. } \item{W}{ see \code{\link{as.epidataCS}}. Must have the same \code{proj4string} as \code{events} and \code{tiles}. If not specified (\code{NULL}), \code{W} is generated automatically via \code{\link{unionSpatialPolygons}(tiles)}. However, since the result of such an operation should always be verified, it is recommended to create \code{W} in advance.\cr It is important that \code{W} and \code{tiles} cover the same region, because on the one hand offspring is sampled in the spatial influence region of the parent event (which is the intersection of \code{W} and a circle of radius the \code{eps.s} of the parent event), and on the other hand the tiles of the sampled coordinates are determined by overlay with \code{tiles}. } \item{trace}{ logical (or integer) indicating if (or how often) the current simulation status should be \code{cat}ed. For the \code{simulate.twinstim} method, \code{trace} currently only applies to the first of the \code{nsim} simulations. } \item{.allocate}{ number of rows (events) to initially allocate for the event history; defaults to 500. Each time the simulated epidemic exceeds the allocated space, the event \code{data.frame} will be enlarged by \code{.allocate} rows. } \item{.skipChecks,.onlyEvents}{ these logical arguments are not meant to be set by the user. They are used by the simulate-method for twinstim objects. } \item{object}{ an object of class \code{"\link{twinstim}"}. } \item{nsim}{ number of epidemics (i.e. spatio-temporal point patterns inheriting from class \code{"epidataCS"}) to simulate. Defaults to 1 when the result is a simple object inheriting from class \code{"simEpidataCS"} (as if \code{simEpidataCS} would have been called directly). If \code{nsim > 1}, the result will be a list the structure of which depends on the argument \code{simplify}. } \item{seed}{ an object specifying how the random number generator should be initialized for simulation (via \code{\link{set.seed}}). The initial state will also be stored as an attribute \code{"seed"} of the result. The original state of the \code{\link{.Random.seed}} will be restored at the end of the simulation. By default (\code{NULL}), neither initialization nor recovery will be done. This behaviour is copied from the \code{\link{simulate}.lm} method. } \item{data}{ an object of class \code{"epidataCS"}, usually the one to which the \code{"twinstim"} \code{object} was fitted. } \item{simplify}{ logical. It is strongly recommended to set \code{simplify = TRUE} (default) if \code{nsim} is large. This saves space and computation time, because for each simulated epidemic only the \code{events} component is saved. All other components, which do not vary between simulations, are only stored from the first run. In this case, the runtime of each simulation is stored as an attribute \code{"runtime"} to each simulated \code{events}. See also the \dQuote{Value} section below. } \item{control.siaf}{see \code{\link{twinstim}}.} \item{nCircle2Poly}{see \code{\link{as.epidataCS}}. For \code{simulate.twinstim}, \code{NULL} means to use the same value as for \code{data}.} \item{gmax}{ maximum value the temporal interaction function \code{tiaf$g} can attain. If \code{NULL}, then it is assumed as the maximum value of the type-specific values at 0, i.e. \code{max(tiaf$g(rep.int(0,nTypes), tiafpars, 1:nTypes))}. } \item{\dots}{unused (arguments of the generic).} } \value{ The function \code{simEpidataCS} returns a simulated epidemic of class \code{"simEpidataCS"}, which enhances the class \code{"epidataCS"} by the following additional components known from objects of class \code{"\link{twinstim}"}: \code{timeRange}, \code{formula}, \code{coefficients}, \code{npars}, \code{call}, \code{runtime}. The \code{simulate.twinstim} method has some additional \emph{attributes} set on its result: \code{call}, \code{seed}, \code{simplified}, and \code{runtime} with their obvious meanings. Furthermore, if \code{nsim > 1}, it returns an object of class \code{"simEpidataCSlist"}, the form of which depends on the value of \code{simplify}: if \code{simplify = FALSE}, then the return value is just a list of sequential simulations, each of class \code{"simEpidataCS"}. However, if \code{simplify = TRUE}, then the sequential simulations share all components but the simulated \code{events}, i.e. the result is a list with the same components as a single object of class \code{"simEpidataCS"}, but with \code{events} replaced by an \code{eventsList} containing the \code{events} returned by each of the simulations. The \code{stgrid} component of the returned \code{"simEpidataCS"} will be truncated to the actual end of the simulation, which might be \eqn{ 1}) may have different \code{stgrid} time ranges. In a \code{"simEpidataCSlist"}, the \code{stgrid} shared by all of the simulated epidemics is just the \code{stgrid} returned by the \emph{first} simulation. } \note{ The more detailed the polygons in \code{tiles} are the slower the algorithm is. Often it can be advantageous to sacrifice some detail for speed by reducing polygon complexity using, e.g., the Douglas and Peucker (1973) reduction method available at \url{http://MapShaper.org} (Harrower and Bloch, 2006) or as function \code{dp()} in the (slightly outdated) package \pkg{shapefiles}, or by passing by \pkg{spatstat}'s \code{\link[spatstat]{simplify.owin}} procedure. } \references{ Douglas, D. H. and Peucker, T. K. (1973): Algorithms for the reduction of the number of points required to represent a digitized line or its caricature. \emph{Cartographica: The International Journal for Geographic Information and Geovisualization}, \bold{10}, 112-122 Harrower, M. and Bloch, M. (2006): MapShaper.org: A Map Generalization Web Service. \emph{IEEE Computer Graphics and Applications}, \bold{26}(4), 22-27.\cr DOI-Link: \url{http://dx.doi.org/10.1109/MCG.2006.85} Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} Meyer, S. (2010): Spatio-Temporal Infectious Disease Epidemiology based on Point Processes. Master's Thesis, Ludwig-Maximilians-Universit\enc{}{ae}t M\enc{}{ue}nchen.\cr Available as \url{http://epub.ub.uni-muenchen.de/11703/} } \author{ Sebastian Meyer, with contributions by Michael H\enc{}{oe}hle } \seealso{ The \code{\link{plot.epidataCS}} and \code{\link{animate.epidataCS}} methods for plotting and animating continuous-space epidemic data, respectively, which also work for simulated epidemics (by inheritance). Function \code{\link{twinstim}} for fitting spatio-temporal conditional intensity models to epidemic data. } \examples{ data("imdepi") data("imdepifit") ## load borders of Germany's districts (obtained from the ## Bundesamt fr Kartographie und Geodsie, Frankfurt am Main, Germany, ## www.geodatenzentrum.de), simplified by the "special" Visvalingam ## algorithm (level=60\%) using www.MapShaper.org: load(system.file("shapes", "districtsD.RData", package="surveillance")) ## map of Germany's districts plot(districtsD) plot(stateD, add=TRUE, border=2, lwd=2) # 'stateD' is the union of the polygons in 'districtsD' ## simulate 2 realizations (during a VERY short period -- for speed) ## considering events from data(imdepi) before t=31 as pre-history mysims <- simulate(imdepifit, nsim=2, seed=1, data=imdepi, tiles=districtsD, W=stateD, t0=31, T=61, trace=FALSE, nCircle2Poly=16, .allocate=100, simplify=TRUE) ## extract the first realization -> object of class simEpidataCS mysim1 <- mysims[[2]] summary(mysim1) plot(mysim1, aggregate="space") ## plot both epidemics using the plot-method for simEpidataCSlist's plot(mysims, aggregate="time", subset=type=="B") } \keyword{datagen} \keyword{models} surveillance/man/algo.glrnb.Rd0000644000176000001440000001515311747513423016101 0ustar ripleyusers\name{algo.glrnb} \alias{algo.glrnb} \encoding{latin1} \title{Cound data regression charts} \description{ Count data regression charts for the monitoring of surveillance time series. } \usage{ algo.glrnb(disProgObj,control = list(range=range,c.ARL=5, mu0=NULL, alpha=0, Mtilde=1, M=-1, change="intercept", theta=NULL,dir=c("inc","dec"),ret=c("cases","value"))) } \arguments{ \item{disProgObj}{object of class \code{disProg} to do surveillance for} \item{control}{A list controlling the behaviour of the algorithm \describe{ \item{\code{range}}{vector of indices in the observed vector to monitor (should be consecutive)} \item{\code{mu0}}{A vector of in-control values of the mean of the negative binomial distribution with the same length as \code{range}. If \code{NULL} the observed values in \code{1:(min(range)-1)} are used to estimate beta through a generalized linear model. To fine-tune the model one can instead specify \code{mu0} as a list with two components: \describe{ \item{\code{S}}{number of harmonics to include} \item{\code{trend}}{include a term \code{t} in the GLM model} }} \item{\code{alpha}}{The (known) dispersion parameter of the negative binomial distribution. If \code{alpha=0} then the negative binomial distribution boils down to the Poisson distribution and a call of \code{algo.glrnb} is equivalent to a call to \code{algo.glrpois}. If \code{alpha=NULL} the parameter is calculated as part of the in-control estimation.} \item{\code{c.ARL}}{threshold in the GLR test, i.e. \eqn{c_{\gamma}}{c_gamma}} \item{\code{Mtilde}}{number of observations needed before we have a full rank the typical setup for the "\code{intercept}" and "\code{epi}" charts is \code{Mtilde=1}} \item{\code{M}}{number of time instances back in time in the window-limited approach, i.e. the last value considered is \eqn{\max{1,n-M}}. To always look back until the first observation use \code{M=-1}.} \item{\code{change}}{a string specifying the type of the alternative. Currently the two choices are \code{intercept} and \code{epi}. See the SFB Discussion Paper 500 for details.} \item{\code{theta}}{if \code{NULL} then the GLR scheme is used. If not \code{NULL} the prespecified value for \eqn{\kappa} or \eqn{\lambda} is used in a recursive LR scheme, which is faster. } \item{\code{dir}}{a string specifying the direction of testing in GLR scheme. With \code{"inc"} only increases in \eqn{x} are considered in the GLR-statistic, with \code{"dec"} decreases are regarded. } \item{\code{ret}}{a string specifying the type of \code{upperbound}-statistic that is returned. With \code{"cases"} the number of cases that would have been necessary to produce an alarm or with \code{"value"} the glr-statistic is computed (see below).} } } } \value{ \item{survRes}{ \code{algo.glrnb} returns a list of class \code{survRes} (surveillance result), which includes the alarm value for recognizing an outbreak (1 for alarm, 0 for no alarm), the threshold value for recognizing the alarm and the input object of class disProg. The \code{upperbound} slot of the object are filled with the current \eqn{GLR(n)} value or with the number of cases that are necessary to produce an alarm at any timpoint \eqn{<=n}. Both lead to the same alarm timepoints, but \code{"cases"} has an obvious interpretation.} } % \details{ % This function implements the seasonal cound data chart based on generalized likelihood ratio (GLR) as described in the Hoehle and Paul (2008) paper. A moving-window generalized likelihood ratio detector is used, i.e. the detector has the form % \deqn{N = \inf\left\{ n : \max_{1\leq k \leq n} \left[ \sum_{t=k}^n \log \left\{ \frac{f_{\theta_1}(x_t|z_t)}{f_{\theta_0}(x_t|z_t)} \right\} \right] \geq c_\gamma \right\} }{N = inf(... >= c_gamma)} % where instead of \eqn{1\leq k \leq n}{1<= k <= n} the GLR statistic is computed for all \eqn{k \in \{n-M, \ldots, n-\tilde{M}+1\}}{k \in \{n-M, \ldots, n-Mtilde+1\}}. To achieve the typical behaviour from \eqn{1\leq k\leq n}{1<= k <= n} use \code{Mtilde=1} and \code{M=-1}. So \eqn{N} is the time point where the GLR statistic is above the threshold the first time: An alarm is given and the surveillance is resetted starting from time \eqn{N+1}. Note that the same \code{c.ARL} as before is used, but if \code{mu0} is different at \eqn{N+1,N+2,\ldots} compared to time \eqn{1,2,\ldots} the run length properties differ. Because \code{c.ARL} to obtain a specific ARL can only be obtained my Monte Carlo simulation there is no good way to update \code{c.ARL} automatically at the moment. Also, FIR GLR-detectors might be worth considering. At the moment, window limited ``\code{intercept}'' charts have not been extensively tested and are at the moment not supported. As speed is not an issue here this doesn't bother too much. Therefore, a value of \code{M=-1} is always used in the intercept charts. } \seealso{ \code{\link{algo.rkiLatestTimepoint}} } \author{M. Hoehle} \examples{ ##Simulate data and apply the algorithm S <- 1 ; t <- 1:120 ; m <- length(t) beta <- c(1.5,0.6,0.6) omega <- 2*pi/52 #log mu_{0,t} alpha <- 0.2 base <- beta[1] + beta[2] * cos(omega*t) + beta[3] * sin(omega*t) #Generate example data with changepoint and tau=tau tau <- 100 kappa <- 0.4 mu0 <- exp(base) mu1 <- exp(base + kappa) #Generate data set.seed(42) x <- rnbinom(length(t),mu=mu0*(exp(kappa)^(t>=tau)),size=1/alpha) s.ts <- create.disProg(week=1:length(t),observed=x,state=(t>=tau)) #Plot the data plot(s.ts,legend=NULL,xaxis.years=FALSE) #Run GLR based detection cntrl = list(range=t,c.ARL=5, Mtilde=1, mu0=mu0, alpha=alpha, change="intercept",ret="value",dir="inc") glr.ts <- algo.glrnb(s.ts,control=c(cntrl)) plot(glr.ts,xaxis.years=FALSE) #CUSUM LR detection with backcalculated number of cases cntrl2 = list(range=t,c.ARL=5, Mtilde=1, mu0=mu0, alpha=alpha, change="intercept",ret="cases",dir="inc",theta=1.2) glr.ts2 <- algo.glrnb(s.ts,control=c(cntrl2)) plot(glr.ts2,xaxis.years=FALSE) } \keyword{classif} \source{ Count data regression charts for the monitoring of surveillance time series (2008), M. \enc{Hhle}{Hoehle} and M. Paul, Computational Statistics and Data Analysis, 52(9), pp. 4357--4368. Poisson regression charts for the monitoring of surveillance time series (2006), \enc{Hhle}{Hoehle}, M., SFB386 Discussion Paper 500. } % Hook %Rnw file surveillance/man/isScalar.Rd0000644000176000001440000000101512143432533015576 0ustar ripleyusers\name{isScalar} \alias{isScalar} \title{ Checks if the Argument is Scalar } \description{ The simple helper function \code{isScalar} just checks if its argument is a scalar, i.e. a numeric vector of length 1. It is implemented as \code{length(x) == 1L && is.vector(x, mode = "numeric")}. } \usage{ isScalar(x) } \arguments{ \item{x}{an \code{R} object.} } \value{ A length-one logical vector. } %% \examples{ %% isScalar(TRUE) # FALSE %% isScalar(1:10) # FALSE %% isScalar(pi) # TRUE %% } \keyword{internal} surveillance/man/salmonella.agona.Rd0000644000176000001440000000132112003774404017251 0ustar ripleyusers\name{salmonella.agona} \alias{salmonella.agona} \docType{data} \title{Salmonella Agona cases in the UK 1990-1995} \description{ Reported number of cases of the Salmonella Agona serovar in the UK 1990-1995. Note however that the counts do not correspond exactly to the ones used by Farrington et. al (1996). } \usage{data(salmonella.agona)} \format{ A \code{disProg} object with 312 observations starting from week 1 in 1990. } \source{A statistical algorithm for the early detection of outbreaks of infectious disease, Farrington, C.P., Andrews, N.J, Beale A.D. and Catchpole, M.A. (1996). , J. R. Statist. Soc. A, 159, 547-563.} \examples{ data(salmonella.agona) } \keyword{datasets} surveillance/man/bestCombination.Rd0000644000176000001440000000110111731650466017162 0ustar ripleyusers\name{bestCombination} \alias{bestCombination} \encoding{latin1} \title{Partition of a number into two factors} \description{ Given a prime number factorization \code{x}, \code{best combination} partitions \code{x} into two groups, such that the product of the numbers in group one is as similar as possible to the product of the numbers of group two. This is useful in magic.dim } \usage{ bestCombination(x) } \arguments{ \item{x}{prime number factorization} } \value{Returns a vector c(prod(set1),prod(set2)) } \keyword{hplot} surveillance/man/plot.atwins.Rd0000644000176000001440000000470011731650466016334 0ustar ripleyusers\name{plot.atwins} \alias{plot.atwins} \encoding{latin1} \title{Plot results of a twins model fit} \description{ Plot results of fitting a twins model using MCMC output. Plots similar to those in the Held et al. (2006) paper are generated } \usage{ \method{plot}{atwins}(x, which=c(1,4,6,7), ask=TRUE, \dots) } \arguments{ \item{x}{An object of class \code{atwins}.} \item{which}{a vector containing the different plot types to show \describe{ \item{1}{A plot of the observed time series Z is shown together with posterior means for the number of endemic cases (X) and number of epidemic cases (Y).} \item{2}{This plot shows trace plots of the gamma parameters over all MCMC samples.} \item{3}{This shows a trace plot of psi, which controls the overdispersion in the model.} \item{4}{Autocorrelation functions for K and psi are shown in order to judge whether the MCMC sampler has converged.} \item{5}{Shows a plot of the posterior mean of the seasonal model nu[t] together with 95\% credibility intervals based on the quantiles of the posterior.} \item{6}{Histograms illustrating the posterior density for K and psi. The first one corresponds to Fig. 4(f) in the paper.} \item{7}{Histograms illustrating the predictive posterior density for the next observed number of cases Z[n+1]. Compare with Fig.5 in the paper.} } } \item{ask}{Boolean indicating whether to ask for a newline before showing the next plot.} \item{\dots}{Additional control for the plots, which are currently ignored.} } \details{ For details see the plots in the paper. Basically MCMC output is visualized. This function is together with \code{algo.twins} still experimental. } \value{This function does not return anything.} \references{Held, L., Hofmann, M., \enc{Hhle}{Hoehle}, M. and Schmid V. (2006) A two-component model for counts of infectious diseases, Biostatistics, \bold{7}, pp. 422--437. } \author{M. Hofmann and M. \enc{Hhle}{Hoehle}} \seealso{\link{algo.twins}} \examples{ \dontrun{ #Apparently, the algo.atwins can crash on some LINUX systems #thus for now the example section is commented #Load the data used in the Held et al. (2006) paper data("hepatitisA") #Fix seed - this is used for the MCMC samplers in twins set.seed(123) #Call algorithm and save result otwins <- algo.twins(hepatitisA) #This shows the entire output plot(otwins,which=c(1,2),ask=FALSE) } } \keyword{ts} \keyword{regression} surveillance/man/qlomax.Rd0000644000176000001440000000166012003771340015341 0ustar ripleyusers\name{qlomax} \alias{qlomax} \title{ Quantile Function of the Lomax Distribution } \description{ Quantile function of the Lomax distribution with positive scale parameter \code{scale} (often denoted as \eqn{\sigma}{sigma}) and positive shape parameter \code{shape} (often denoted as \eqn{\alpha}{alpha}). This implementation does not include any checks, but only the raw formula \code{scale * ((1-p)^(-1/shape) - 1)}. Another implementation can be found as \code{\link[VGAM]{qlomax}} in the package \pkg{VGAM}. } \usage{ qlomax(p, scale, shape) } \arguments{ \item{p}{ vector of probabilities. } \item{scale}{ positive scale parameter. } \item{shape}{ positive shape parameter. } } \value{ Numeric vector of quantiles corresponding to the probabilities \code{p}. } \author{ Sebastian Meyer } \seealso{ \code{\link[VGAM]{Lomax}} in package \pkg{VGAM}. } \examples{ qlomax(0.99, 1, 2) } \keyword{distribution} surveillance/man/twinstim.Rd0000644000176000001440000005430512240443323015722 0ustar ripleyusers\encoding{latin1} \name{twinstim} \alias{twinstim} \title{ Fit a Two-Component Spatio-Temporal Point Process Model } \description{ A \code{twinstim} model as described in Meyer et al. (2012) is fitted to marked spatio-temporal point process data. This constitutes a regression approach for conditional intensity function modelling. } \usage{ twinstim(endemic, epidemic, siaf, tiaf, qmatrix = data$qmatrix, data, subset, t0 = data$stgrid$start[1], T = tail(data$stgrid$stop,1), na.action = na.fail, start = NULL, partial = FALSE, control.siaf = list(F = list(), Deriv = list()), optim.args = list(), finetune = FALSE, model = FALSE, cumCIF = TRUE, cumCIF.pb = interactive(), cores = 1, verbose = TRUE) } \arguments{ \item{endemic}{ right-hand side formula for the exponential (Cox-like multiplicative) endemic component. May contain offsets (to be marked by the special function \code{offset}). If omitted or \code{~0} there will be no endemic component in the model. A type-specific endemic intercept can be requested by including the term \code{(1|type)} in the formula. } \item{epidemic}{ formula representing the epidemic model for the event-specific covariates (marks) determining infectivity. Offsets are not implemented here. If omitted or \code{~0} there will be no epidemic component in the model. } \item{siaf}{ spatial interaction function. May be \code{NULL} or missing (corresponding to \code{siaf.constant()}, i.e. constant infectivity independent of the spatial distance from the host), a list (specifying a continuous kernel, as e.g., returned by the functions \code{\link{siaf.gaussian}} or \code{\link{siaf.powerlaw}}), or numeric (knots of a step function). If you run into \dQuote{false convergence} with a non-constant \code{siaf} specification, the numerical accuracy of the cubature methods is most likely too low (see the \code{control.siaf} argument). } \item{tiaf}{ temporal interaction function. May be \code{NULL} (or missing, corresponding to constant infectivity independent of the temporal distance from the host), a list (specifying a continuous function, as e.g., returned by \code{\link{tiaf.exponential}}), or numeric (knots of a step function). } \item{qmatrix}{ square indicator matrix (0/1 or \code{FALSE}/\code{TRUE}) for possible transmission between the event types. The matrix will be internally converted to \code{logical}. Defaults to the \eqn{Q} matrix specified in \code{data}. } \item{data}{ an object of class \code{"\link{epidataCS}"}. } \item{subset}{ an optional vector evaluating to logical indicating a subset of \code{data$events} to keep. Missing values are taken as \code{FALSE}. The expression is evaluated in the context of the \code{data$events@data} \code{data.frame}, i.e. columns of this \code{data.frame} may be referenced directly by name. } \item{t0, T}{ events having occured during (-Inf;t0] are regarded as part of the prehistory \eqn{H_0} of the process. Only events that occured in the interval (t0; T] are considered in the likelihood. The time point \code{t0} (\code{T}) must be an element of \code{data$stgrid$start} (\code{data$stgrid$stop}). The default time range covers the whole spatio-temporal grid of endemic covariates. } \item{na.action}{ how to deal with missing values in \code{data$events}? Do not use \code{\link{na.pass}}. Missing values in the spatio-temporal grid \code{data$stgrid} are not accepted. } \item{start}{ a named vector of initial values for (a subset of) the parameters. The names must conform to the conventions of \code{twinstim} to be assigned to the correct model terms. For instance, \code{"h.(Intercept)"} = endemic intercept, \code{"h.I(start/365)"} = coefficient of a linear time trend in the endemic component, \code{"h.factorB"} = coefficient of the level B of the factor variable \code{factor} in the endemic predictor, \code{"e.(Intercept)"} = epidemic intercept, \code{"e.VAR"} = coefficient of the epidemic term \code{VAR}, \code{"e.siaf.2"} = second \code{siaf} parameter, \code{"e.tiaf.1"} = first \code{tiaf} parameter. Elements which don't match any of the model parameters are ignored. Alternatively, \code{start} may also be a named list with elements \code{"endemic"} or \code{"h"}, \code{"epidemic"} or \code{"e"}, \code{"siaf"} or \code{"e.siaf"}, and \code{"tiaf"} or \code{"e.tiaf"}, each of which containing a named numeric vector with the term labels as names (i.e. without the prefix \code{"h."}, \code{"e."}, etc). Thus, \code{start=list(endemic=c("(Intercept)"=-10))} is equivalent to \code{start=c("h.(Intercept)"=-10)}. } \item{partial}{ logical indicating if a partial likelihood similar to the approach by Diggle et al. (2010) should be used (default is \code{FALSE}). Note that the partial likelihood implementation is not well tested. } \item{control.siaf}{ a list with elements \code{"F"} and \code{"Deriv"}, which are lists of extra arguments passed to the functions \code{siaf$F} and \code{siaf$Deriv}, respectively.\cr These arguments mainly determine the accuracy of the numerical cubature rules from package \pkg{polyCub} involved in non-constant \code{siaf} specifications, e.g., the bandwidth of the midpoint rule or the number of Gaussian quadrature points. For instance, \code{\link{siaf.gaussian}} by default uses the midpoint-cubature (\code{\link[polyCub]{polyCub.midpoint}}) with an adaptive bandwidth of \code{eps=adapt*sd} to numerically integrate the kernel \eqn{f(\bold{s})} over polygonal domains. The \code{adapt} parameter defaults to 0.1, but may be modified via setting \code{control.siaf$F$adapt}. In contrast, the cubature rule \code{\link[polyCub]{polyCub.SV}} with \code{nGQ=20} is by default used to numerically integrate the derivative of \eqn{f(\bold{s})} wrt the kernel parameters over polygonal domains. The number of cubature points may be modified via setting \code{control.siaf$Deriv$nGQ}.\cr This argument list is ignored in the case \code{siaf=siaf.constant()} (which is the default if \code{siaf} is unspecified). } \item{optim.args}{ an argument list passed to \code{\link{optim}}, or \code{NULL}, in which case no optimization will be performed but the necessary functions will be returned in a list (similar to what is returned if \code{model = TRUE}). Initial values for the parameters may be given as list element \code{par} in the order \code{(endemic, epidemic, siaf, tiaf)}. If no initial values are provided, a crude estimate for the endemic intercept will be used (see the Examples), but just zeroes for the remaining parameters. However, any initial values given in the \code{start} argument take precedence over those in \code{par}. Note that \code{optim} receives the negative log-likelihood for minimization (thus, if used, \code{optim.args$control$fnscale} should be positive). The \code{hessian} argument defaults to \code{TRUE} and in the \code{control} list, \code{trace}ing is enabled with \code{REPORT=1} by default. By setting \code{optim.args$control$trace = 0}, all output from the optimization routine is suppressed. For the \code{partial} likelihood, the analytic score function and the Fisher information are not implemented and the default is to use robust \code{method="Nelder-Mead"} optimization. There may be an extra component \code{fixed} in the \code{optim.args} list, which determines which parameters should stick to their initial values. This can be specified by a logical vector of the same length as the \code{par} component, by an integer vector indexing \code{par} or by a character vector following the \code{twinstim} naming conventions. Furthermore, if \code{isTRUE(fixed)}, then all parameters are fixed at their initial values and no optimization is performed. Importantly, the \code{method} argument in the \code{optim.args} list may also be \code{"nlminb"}, in which case the \code{\link{nlminb}} optimizer is used. This is also the default for full likelihood inference. In this case, not only the score function but also the \emph{expected} Fisher information can be used during optimization (as estimated by what Martinussen and Scheike (2006, p. 64) call the \dQuote{optional variation process}, or see Rathbun (1996, equation (4.7))). In our experience this gives better convergence than \code{optim}'s methods. For \code{method="nlminb"}, the following parameters of the \code{optim.args$control} list may be named like for \code{optim} and are renamed appropriatly: \code{maxit} (-> \code{iter.max}), \code{REPORT} (-> \code{trace}, default: 1), \code{abstol} (-> \code{abs.tol}), and \code{reltol} (-> \code{rel.tol}, default: \code{1e-6}). For \code{nlminb}, a logical \code{hessian} argument indicates if the negative \emph{expected} Fisher information matrix should be used as the Hessian during optimization (otherwise a numerical approximation is used). Similary, \code{method="nlm"} should also work but is not recommended here. } \item{finetune}{ logical indicating if a second maximisation should be performed with robust Nelder-Mead \code{optim} using the resulting parameters from the first maximisation as starting point. This argument is only considered if \code{partial = FALSE} and the default is to not conduct a second maximization (in most cases this does not improve upon the MLE). } \item{model}{ logical. If \code{TRUE} the result contains an element \code{functions} with the log-likelihood function (or partial log-likelihood function, if \code{partial = TRUE}), and optionally the score and the expected Fisher information functions (not for the partial likelihood, and only if \code{siaf} and \code{tiaf} provide the necessary derivatives). The environment of those functions equals the evaluation environment of the fitting function, i.e. it is kept in the workspace and the necessary model frames are still available when \code{twinstim} has finished. The environment is also set as an attribute of the \code{twinstim} result. } \item{cumCIF}{ logical (default: \code{TRUE}) indicating whether to calculate the fitted cumulative ground intensity at event times. This is the residual process, see \code{\link{residuals.twinstim}}. } \item{cumCIF.pb}{ logical indicating if a progress bar should be shown during the calculation of \code{cumCIF}. Defaults to do so in an interactive \R session, and will be \code{FALSE} if \code{cores != 1}. } \item{cores}{ number of processes to use in parallel operation. By default \code{twinstim} runs in single-CPU mode. Currently, only the \pkg{multicore}-type of parallel computing via forking is supported, which is not available on Windows, see \code{\link[parallel]{mclapply}} in package \pkg{parallel}. } \item{verbose}{ logical indicating if information should be printed during execution. Defaults to \code{TRUE}. } } \details{ The function performs maximum likelihood inference for the additive-multiplicative spatio-temporal intensity model described in Meyer et al. (2012). It uses \code{\link{nlminb}} as the default optimizer and returns an object of class \code{twinstim}. Such objects have \code{print}, \code{\link[=plot.twinstim]{plot}} and \code{\link[=summary.twinstim]{summary}} methods. The output of the \code{summary} can be processed by the \code{\link[=toLatex.summary.twinstim]{toLatex}} function. Furthermore, the usual model fit methods such as \code{coef}, \code{vcov}, \code{logLik}, \code{\link[=residuals.twinstim]{residuals}}, and \code{update} are implemented. A specific add-on is the use of the functions \code{\link{R0}} and \code{\link[=simulate.twinstim]{simulate}}. } \value{ Returns an S3 object of class \code{"twinstim"}, which is a list with the following components: \item{coefficients}{vector containing the MLE.} \item{loglik}{value of the log-likelihood function at the MLE with a logical attribute \code{"partial"} indicating if the partial likelihood was used.} \item{counts}{number of log-likelihood and score evaluations during optimization.} \item{control.siaf}{see the \dQuote{Arguments} section above.} \item{optim.args}{input optimizer arguments used to determine the MLE.} \item{converged}{either \code{TRUE} (if the optimizer converged) or a character string containing a failure message).} \item{fisherinfo}{\emph{expected} Fisher information evaluated at the MLE. Only part of the output for full likelihood inference (\code{partial = FALSE}) and if spatial and temporal interaction functions are provided with their derivatives.} \item{fisherinfo.observed}{observed Fisher information matrix evaluated at the value of the MLE. Obtained as the negative Hessian. This is only part of the result if \code{optim.args$method} is not \code{"nlminb"} and if it was requested by setting \code{hessian=TRUE} in \code{optim.args}.} \item{fitted}{fitted values of the conditional intensity function at the events.} \item{fittedComponents}{two-column matrix with columns \code{"h"} and \code{"e"} containing the fitted values of the endemic and epidemic components, respectively.\cr (Note that \code{rowSums(fittedComponents) == fitted}.)} \item{tau}{fitted cumulative ground intensities at the event times. Only calculated and returned if \code{cumCIF = TRUE}. This is the \dQuote{residual process} of the model, see \code{\link{residuals.twinstim}}.} \item{R0}{estimated basic reproduction number for each event. This equals the spatio-temporal integral of the epidemic intensity over the observation domain (t0;T] x W for each event.} \item{npars}{vector describing the lengths of the 5 parameter subvectors: endemic intercept(s) \eqn{\beta_0(\kappa)}, endemic coefficients \eqn{\beta}, epidemic coefficients \eqn{\gamma}, parameters of the \code{siaf} kernel, and parameters of the \code{tiaf} kernel.} \item{qmatrix}{the \code{qmatrix} associated with the epidemic \code{data} as supplied in the model call.} \item{bbox}{the bounding box of \code{data$W}.} \item{timeRange}{the time range used for fitting: \code{c(t0,T)}.} \item{formula}{a list containing the four main parts of the model specification: \code{endemic}, \code{epidemic}, \code{siaf}, and \code{tiaf}.} \item{functions}{if \code{model=TRUE} this is a \code{list} with components \code{ll}, \code{sc} and \code{fi}, which are functions evaluating the log-likelihood, the score function and the expected Fisher information for a parameter vector \eqn{\theta}. The \code{environment} of these function is the model environment, which is thus retained in the workspace if \code{model=TRUE}. } \item{call}{the matched call.} \item{runtime}{contains the \code{\link{proc.time}}-queried time taken to fit the model, i.e. a named numeric vector of length 5, with the number of \code{cores} set as additional attribute.} If \code{model=TRUE}, the model evaluation environment is assigned to this list and can thus be queried by calling \code{environment()} on the result. } \note{ \code{twinstim} makes use of the \pkg{memoise} package if it is available -- and that is highly recommended for non-constant \code{siaf} specifications to speed up calculations. Specifically, the necessary numerical integrations of the spatial interaction function will be cached such that they are only calculated once for every state of the \code{siaf} parameters during optimization. } \references{ Diggle, P. J., Kaimi, I. & Abellana, R. (2010): Partial-likelihood analysis of spatio-temporal point-process data. \emph{Biometrics}, \bold{66}, 347-354. Martinussen, T. and Scheike, T. H. (2006): Dynamic Regression Models for Survival Data. Springer. Meyer, S., Elias, J. and H\enc{}{oe}hle, M. (2012): A space-time conditional intensity model for invasive meningococcal disease occurrence. \emph{Biometrics}, \bold{68}, 607-616.\cr DOI-Link: \url{http://dx.doi.org/10.1111/j.1541-0420.2011.01684.x} Meyer, S. (2010): Spatio-Temporal Infectious Disease Epidemiology based on Point Processes. Master's Thesis, Ludwig-Maximilians-Universit\enc{}{ae}t M\enc{}{ue}nchen.\cr Available as \url{http://epub.ub.uni-muenchen.de/11703/} Rathbun, S. L. (1996): Asymptotic properties of the maximum likelihood estimator for spatio-temporal point processes. \emph{Journal of Statistical Planning and Inference}, \bold{51}, 55-74. } \author{ Sebastian Meyer with documentation contributions by Michael H\enc{}{oe}hle and Mayeul Kauffmann. } \seealso{ \code{\link{twinSIR}} for a discrete space alternative. There is also a \code{\link{simulate.twinstim}} method, which simulates the point process based on the fitted \code{twinstim}. } \examples{ # Load invasive meningococcal disease data data("imdepi") ### first, fit a simple endemic-only model ## Calculate initial value for the endemic intercept (the crude estimate ## which is used by default if no initial value is supplied). ## Assume the model only had a single-cell endemic component ## (rate of homogeneous Poisson process scaled for population density): popdensity.overall <- with(subset(imdepi$stgrid, BLOCK == 1), weighted.mean(popdensity, area)) popdensity.overall # pop. density in Germany is ~230 inhabitants/km^2 W.area <- with(subset(imdepi$stgrid, BLOCK == 1), sum(area)) W.area # area of Germany is about 357100 km^2 # this should actually be the same as sum(sapply(imdepi$W@polygons, slot, "area")) # which here is not exactly the case because of polygon simplification ## initial value for the endemic intercept h.intercept <- with(summary(imdepi), log(nEvents/popdensity.overall/diff(timeRange)/W.area)) ## fit the endemic-only model m_noepi <- twinstim( endemic = addSeason2formula(~ offset(log(popdensity)) + I(start/365-3.5), S=1, period=365, timevar="start"), data = imdepi, subset = !is.na(agegrp), optim.args = list(par=c(h.intercept,rep(0,3))), # the default anyway model = FALSE, cumCIF = FALSE # for reasons of speed ) ## look at the model summary summary(m_noepi) if (surveillance.options("allExamples")) { ## type-dependent endemic intercept? m_noepi_type <- update(m_noepi, endemic = ~(1|type) + .) summary(m_noepi_type) # LR-test for a type-dependent intercept in the endemic-only model pchisq(2*(logLik(m_noepi_type)-logLik(m_noepi)), df=1, lower.tail=FALSE) } ### add an epidemic component with just the intercept, i.e. ### assuming uniform dispersal in time and space up to a distance of ### eps.s = 200 km and eps.t = 30 days (see summary(imdepi)) m0 <- update(m_noepi, epidemic=~1, start=c("e.(Intercept)"=-18), model=TRUE) \dontrun{ ## NOTE: in contrast to using nlminb() optim's BFGS would miss the ## likelihood maximum wrt the epidemic intercept if starting at -10 m0_BFGS <- update(m_noepi, epidemic=~1, start=c("e.(Intercept)"=-10), optim.args = list(method="BFGS")) format(cbind(coef(m0), coef(m0_BFGS)), digits=3, scientific=FALSE) m0_BFGS$fisherinfo # singular Fisher information matrix here m0$fisherinfo logLik(m0_BFGS) logLik(m0) ## nlminb is more powerful since we make use of the analytical fisherinfo ## as estimated by the model during optimization, which optim cannot } ## summarize the model fit s <- summary(m0, correlation = TRUE, symbolic.cor = TRUE) s # output the table of coefficients as LaTeX code toLatex(s, digits=2, withAIC=FALSE) # or xtable(s) ## the default confint-method can be used for Wald-CI's confint(m0, level=0.95) ## same R0 estimate for every event (epidemic intercept only) summary(R0(m0, trimmed=FALSE)) ## plot the path of the fitted total intensity plot(m0, "total intensity", tgrid=500) if (surveillance.options("allExamples")) { ## extract "residual process" integrating over space (takes some seconds) res <- residuals(m0) # if the model describes the true CIF well _in the temporal dimension_, # then this residual process should behave like a stationary Poisson # process with intensity 1 plot(res, type="l"); abline(h=c(0, length(res)), lty=2) # -> use the function checkResidualProcess checkResidualProcess(m0) ## NB: the model fit environment is kept in the workspace with model=TRUE sort(sapply(environment(m0), object.size)) # saving m0 to RData will include this model environment, thus might # consume quiet a lot of disk space (as it does use memory), mainly # depending on the size of "stgrid", the number of "events" and the # polygonal resolution of "W" } if (surveillance.options("allExamples")) { ## estimate an exponential temporal decay of infectivity m1_tiaf <- update(m0, tiaf=tiaf.exponential()) plot(m1_tiaf, "tiaf", xlim=c(0,30), legend=FALSE) ### try with a spatially decreasing interaction kernel ## Likelihood evaluation takes much longer than for constant spatial spread ## Here we use the kernel of an isotropic bivariate Gaussian with same ## standard deviation for both finetypes m1 <- update(m0, siaf = siaf.gaussian(1, F.adaptive = TRUE), start = c("e.siaf.1" = 2.8), # exp(2.8) = sigma = 16 km optim.args = list(fixed="e.siaf.1"), # for reasons of speed of the example, the siaf # parameter log(sigma) is fixed to 2.8 here control.siaf = list(F=list(adapt=0.25)) # use adaptive eps=sigma/4 ) AIC(m_noepi, m0, m1) # further improvement summary(m1, test.iaf=FALSE) # nonsense to test H0: log(sigma) = 0 plot(m1, "siaf", xlim=c(0,200), types=1) # the same for types=2 ### add epidemic covariates m2 <- update(m1, epidemic = ~ 1 + type + agegrp) AIC(m1, m2) # further improvement summary(m2) # look at estimated R0 values by event type tapply(R0(m2), imdepi$events@data[names(R0(m2)), "type"], summary) } } \keyword{models} \keyword{optimize} surveillance/man/meanResponse.Rd0000644000176000001440000001261411770111463016504 0ustar ripleyusers\name{meanResponse} \alias{meanResponse} \encoding{latin1} \title{Calculate mean response needed in algo.hhh} \description{ Calculates the mean response for the model specified in designRes according to equations (1.2) and (1.1) in Held et al. (2005) for univariate time series and equations (3.3) and (3.2) (with extensions given in equations (2) and (4) in Paul et al., 2008) for multivariate time series. See details. } \usage{ meanResponse(theta, designRes) } \arguments{ \item{theta}{vector of parameters \eqn{\theta = (\alpha_1,\ldots,\alpha_m, \bold{\lambda}, \bold{\phi}, \bold{\beta}, \bold{\gamma}_1, \ldots, \bold{\gamma}_m, \bold{\psi}),}{\theta = (\alpha_1,\ldots,\alpha_m, \lambda, \phi, \beta, \gamma_1, \ldots, \gamma_m, \psi),} where \eqn{\bold{\lambda}=(\lambda_1,\ldots,\lambda_m)}{\lambda=(\lambda_1,\ldots,\lambda_m)}, \eqn{\bold{\phi}=(\phi_1,\ldots,\phi_m)}{\phi=(\phi_1,\ldots,\phi_m)}, \eqn{\bold{\beta}=(\beta_1,\ldots,\beta_m)}{\beta=(\beta_1,\ldots,\beta_m)}, \eqn{\bold{\gamma_1}=(\gamma_{11},\ldots,\gamma_{1,2S_1})}{\gamma_1=(\gamma_11,\ldots,\gamma_(1,2S_1))}, \eqn{\bold{\gamma_m}=(\gamma_{m1},\ldots,\gamma_{m,2S_m})}{\gamma_m=(\gamma_m1,\ldots,\gamma_(m,2S_m))}, \eqn{\bold{\psi}=(\psi_1,\ldots,\psi_m)}{\psi=(\psi_1,\ldots,\psi_m)}. If the model specifies less parameters, those components are omitted.} \item{designRes}{Result of a call to \code{make.design} } } \details{ Calculates the mean response for a Poisson or a negative binomial model with mean \deqn{\mu_t = \lambda y_{t-lag} + \nu_t }{\mu_t = \lambda y_t-lag + \nu_t } where \deqn{\log( \nu_t) = \alpha + \beta t + \sum_{j=1}^{S}(\gamma_{2j-1} \sin(\omega_j t) + \gamma_{2j} \cos(\omega_j t) ) }{ log(\nu_t) = \alpha + \beta t + \sum_(j=1)^S (\gamma_(2j-1) * \sin(\omega_j * t) + \gamma_2j * \cos(\omega_j * t) ) } and \eqn{\omega_j = 2\pi j/period }{\omega_j = 2 * \pi * j / period} are Fourier frequencies with known period, e.g. \code{period}=52 for weekly data, for a univariate time series. Per default, the number of cases at time point \eqn{t-1}, i.e. \eqn{lag=1}, enter as autoregressive covariates into the model. Other lags can also be considered. The seasonal terms in the predictor can also be expressed as \eqn{\gamma_{s} \sin(\omega_s t) + \delta_{s} \cos(\omega_s t) = A_s \sin(\omega_s t + \epsilon_s)}{ \gamma_s sin(\omega_s * t) + \delta_s cos(\omega_s * t) = A_s sin(\omega_s * t + \epsilon_s)} with amplitude \eqn{A_s=\sqrt{\gamma_s^2 +\delta_s^2}}{A_s=sqrt{\gamma_s^2 +\delta_s^2}} and phase difference \eqn{\tan(\epsilon_s) = \delta_s / \gamma_s}. The amplitude and phase shift can be obtained from a fitted model by specifying \code{amplitudeShift=TRUE} in the \code{coef} method. For multivariate time series the mean structure is \deqn{\mu_{it} = \lambda_i y_{i,t-lag} + \phi_i \sum_{j \sim i} w_{ji} y_{j,t-lag} + n_{it} \nu_{it}}{ \mu_it = \lambda_i * y_i,t-lag + \phi_i * \sum_(j ~ i) w_ji * y_j,t-lag + n_it * \nu_it } where \deqn{\log(\nu_{it}) = \alpha_i + \beta_i t + \sum_{j=1}^{S_i} (\gamma_{i,2j-1} \sin(\omega_j t) + \gamma_{i,2j} \cos(\omega_j t) ) }{ log(\nu_it) = \alpha_i + \beta_i * t + \sum_(j=1)^S_i (\gamma_(i,2j-1) * \sin(\omega_j * t) + \gamma_(i,2j) * \cos(\omega_j * t) ) } and \eqn{n_{it}}{n_it} are standardized population counts. The weights \eqn{w_{ji}}{w_ji} are specified in the columns of the neighbourhood matrix \code{disProgObj$neighbourhood}. Alternatively, the mean can be specified as \deqn{\mu_{it} = \lambda_i \pi_i y_{i,t-1} + \sum_{j \sim i} \lambda_j (1-\pi_j)/ |k \sim j| y_{j,t-1} + n_{it} \nu_{it}}{ \mu_it = \lambda_i *\pi_i * y_i,t-1 + \sum_(j ~ i) \lambda_j *(1-\pi_j)/|k ~ j| * y_j,t-1 + n_it * \nu_it } if \code{proportion}="single" ("multiple") in \code{designRes$control}. Note that this model specification is still experimental. } \value{ Returns a \code{list} with elements \item{mean}{matrix of dimension \eqn{n \times m}{n x m} with the calculated mean response for each time point and unit, where \eqn{n} is the number of time points and \eqn{m} is the number of units. } \item{epidemic}{matrix with the epidemic part \eqn{ \lambda_i y_{i,t-1} + \phi_i \sum_{j \sim i} y_{j,t-1}}{ \lambda_i * y_i,t-1 + \phi_i * \sum_(j ~ i) y_j,t-1} } \item{endemic}{matrix with the endemic part of the mean \eqn{ n_{it} \nu_{it} }{ n_it*nu_it } } \item{epi.own}{matrix with \eqn{ \lambda_i y_{i,t-1} }{\lambda_i * y_i,t-1} } \item{epi.neighbours}{matrix with \eqn{\phi_i \sum_{j \sim i} y_{j,t-1}}{ \phi_i * \sum_(j ~ i) y_j,t-1} } } \author{M. Paul, L. Held} %\keyword{models} \keyword{internal} \references{ Held, L., \enc{Hhle}{Hoehle}, M., Hofmann, M. (2005) A statistical framework for the analysis of multivariate infectious disease surveillance counts, Statistical Modelling, \bold{5}, 187--199. Paul, M., Held, L. and Toschke, A. M. (2008) Multivariate modelling of infectious disease surveillance data, Statistics in Medicine, \bold{27}, 6250--6267. } surveillance/man/algo.quality.Rd0000644000176000001440000000454311731650466016470 0ustar ripleyusers\name{algo.quality} \alias{algo.quality} \title{Computation of Quality Values for a Surveillance System Result} \description{Computation of the quality values for a surveillance System output. } \usage{ algo.quality(survResObj, penalty = 20) } \arguments{ \item{survResObj}{object of class survRes, which includes the state chain and the computed alarm chain} \item{penalty}{the maximal penalty for the lag} } \value{ \item{list of quality values}{ \itemize{ \item TP: Number of correct found outbreaks. \item FP: Number of false found outbreaks. \item TN: Number of correct found non outbreaks. \item FN: Number of false found non outbreaks. \item sens: True positive rate, meaning TP/(FN + TP). \item spec: True negative rate, meaning TN/(TN + FP). \item dist: Euclidean distance between (1-spec, sens) to (0,1). \item lag: Lag of the outbreak recognizing by the system. } } } \details{ The lag is defined as follows: In the state chain just the beginnings of an outbreak chain (outbreaks directly following each other) are considered. In the alarm chain, the range from the beginning of an outbreak until \eqn{min(next outbreak beginning,\code{penalty})} timepoints is considered. The \code{penalty} timepoints were chosen, to provide an upper bound on the penalty for not discovering an outbreak. Now the difference between the first alarm by the system and the defined beginning is denoted ``the lag'' Additionally outbreaks found by the system are not punished. At the end, the mean of the lags for every outbreak chain is returned as summary lag. } \seealso{\code{\link{algo.compare}}} \examples{ # Create a test object disProgObj <- sim.pointSource(p = 0.99, r = 0.5, length = 200, A = 1, alpha = 1, beta = 0, phi = 0, frequency = 1, state = NULL, K = 1.7) # Let this object be tested from rki1 survResObj <- algo.rki1(disProgObj, control = list(range = 50:200)) # Compute the quality values algo.quality(survResObj) } \keyword{misc} surveillance/man/farringtonFlexible.Rd0000644000176000001440000002540212164317667017704 0ustar ripleyusers\name{farringtonFlexible} \alias{farringtonFlexible} \encoding{latin1} \title{Surveillance for an univariate count data time series using the improved Farrington method described in Noufaily et al. (2012).} \description{ % The function takes \code{range} values of the surveillance time series \code{sts} and for each time point uses a Poisson GLM with overdispersion to predict an upper bound on the number of counts according to the procedure by Farrington et al. (1996) and by Noufaily et al. (2012). This bound is then compared to the observed number of counts. If the observation is above the bound, then an alarm is raised. % } \usage{ farringtonFlexible(sts, control = list(range = NULL, b = 3, w = 3, reweight = TRUE, weightsThreshold = 2.58, verbose = FALSE,glmWarnings = TRUE, alpha = 0.01, trend = TRUE, pThresholdTrend = 0.05, limit54=c(5,4), powertrans="2/3", fitFun="algo.farrington.fitGLM.flexible", populationOffset = FALSE, noPeriods = 1, pastWeeksNotIncluded = 26, thresholdMethod = "delta")) } \arguments{ \item{sts}{object of class sts (including the \code{observed} and the \code{state} time series)} \item{control}{Control object given as a \code{list} containing the following components: \describe{ \item{\code{range}}{Specifies the index of all timepoints which should be tested. If range is \code{NULL} all possible timepoints are used.} \item{\code{b}}{How many years back in time to include when forming the base counts.} \item{\code{w}}{Window's half-size, i.e. number of weeks to include before and after the current week in each year.} \item{\code{reweight}}{Boolean specifying whether to perform reweighting step.} \item{\code{weightsThreshold}}{Defines the threshold for reweighting past outbreaks using the Anscombe residuals (1 in the original method, 2.58 advised in the improved method).} \item{\code{verbose}}{Boolean specifying whether to show extra debugging information.} \item{\code{glmWarnings}}{Boolean specifying whether to print warnings from the call to \code{glm}.} \item{\code{alpha}}{An approximate (one-sided) \eqn{(1-\alpha)\cdot 100\%} prediction interval is calculated unlike the original method where it was a two-sided interval. The upper limit of this interval i.e. the \eqn{(1-\alpha)\cdot 100\%} quantile serves as an upperbound.} \item{\code{trend}}{Boolean indicating whether a trend should be included and kept in case the conditions in the Farrington et. al. paper are met (see the results). If \code{false} then NO trend is fit.} \item{\code{pThresholdTrend}}{Threshold for deciding whether to keep trend in the model (0.05 in the original method, 1 advised in the improved method).} \item{\code{limit54}}{Vector containing two numbers: \code{cases} and \code{period}. To avoid alarms in cases where the time series only has about almost no cases in the specific week the algorithm uses the following heuristic criterion (see Section 3.8 of the Farrington paper) to protect against low counts: no alarm is sounded if fewer than \eqn{\code{cases}=5} reports were received in the past \eqn{\code{period}=4} weeks. \code{limit54=c(cases,period)} is a vector allowing the user to change these numbers. Note: As of version 0.9-7 of the package the term "last" period of weeks includes the current week - otherwise no alarm is sounded for horrible large numbers if the four weeks before that are too low.} \item{\code{powertrans}}{Power transformation to apply to the data if the threshold is to be computed with the method described in Farrington et al. (1996. Use either "2/3" for skewness correction (Default), "1/2" for variance stabilizing transformation or "none" for no transformation.} \item{\code{fitFun}}{String containing the name of the fit function to be used for fitting the GLM. The only current option is "algo.farrington.fitGLM.flexible".} \item{\code{populationOffset}}{Boolean specifying whether to include a population offset in the GLM. The slot \code{sts@population} gives the population vector.} \item{\code{noPeriods}}{Number of levels in the factor allowing to use more baseline. If equal to 1 no factor variable is created, the set of reference values is defined as in Farrington et al (1996).} \item{\code{pastWeeksNotIncluded}}{Number of past weeks to ignore in the calculation.} \item{\code{thresholdMethod}}{Number of past weeks to ignore in the calculation. Options are "delta" for the method described in Farrington et al. (1996), "Noufaily" for the method described in Noufaily et al. (2012), and "pban" for the method extended from Noufaily et al. (2012).} } } } \details{ The following steps are perfomed according to the Farrington et al. (1996) paper. \enumerate{ \item Fit of the initial model with intercept, time trend if \code{trend} is \code{TRUE}, seasonal factor variable if \code{noPeriod} is bigger than 1, and population offset if \code{populationOffset} is \code{TRUE}. Initial estimation of mean and overdispersion. \item Calculation of the weights omega (correction for past outbreaks) if \code{reweighting} is \code{TRUE}. The threshold for reweighting is defined in \code{control}. \item Refitting of the model \item Revised estimation of overdispersion \item Omission of the trend, if it is not significant \item Repetition of the whole procedure \item Calculation of the threshold value using the model to compute a quantile of the predictive distribution. The method used depends on \code{thresholdMethod}, this can either be: \describe{ \item{"delta"}{One assumes that the prediction error (or a transformation of the prediction error, depending on \code{powertrans}), is normally distributed. The threshold is deduced from a quantile of this normal distribution using the variance and estimate of the expected count given by GLM, and the delta rule. The procedure takes into account both the estimation error (variance of the estimator of the expected count in the glm) and the prediction error (variance of the prediction error). This is the suggestion in Farrington et al. (1996).} \item{"nbPlugin"}{One assumes that the new count follows a negative binomial distribution parameterized by the expected count and the overdispersion estimated in the GLM. The threshold is deduced from a quantile of this discrete distribution. This process disregards the estimation error, though. This method was used in Noufaily, et al. (2012).} \item{"pban"}{One also uses the assumption of the negative binomial sampling distribution but does not plug in the estimate of the expected count from the GLM, instead one uses a quantile from the asymptotic normal distribution of the expected count estimated in the GLM; in order to take into account both the estimation error and the prediction error. } } \item Computation of exceedance score } } \value{ An object of class \code{sts} with the slots \code{upperbound} and \code{alarm} filled by appropriate output of the algorithm. The slot \code{control} is the usual list but with more items all of length \code{length(range)}: \describe{ \item{trend}{ is a vector of Booleans indicating whether a time trend was fitted for this time point.} \item{trendVector}{ is a vector giving the coefficient of the time trend in the GLM for this time point. If no trend was fitted it is equal to NA.} \item{pvalue}{ is a vector giving the probability of observing a value at least equal to the observation under the null hypothesis .} \item{expected}{is a vector giving the expectation of the predictive distribution for each timepoint. It is only reported if the conditions for raising an alarm are met, e.g enoughCases.} \item{mu0Vector}{ is a vector giving what is inputed in the negative binomial distribution to get the upperbound as a quantile (either a plug-in from the glm or a quantile from the asymptotic normal distribution of the estimator)} \item{phiVector}{ is a vector giving the overdispersion of the glm at each timepoint.} } } \keyword{classif} \examples{ ### DATA I/O ### #Read Salmonella Agona data data("salmonella.agona") # Create the corresponding sts object from the old disProg object salm <- disProg2sts(salmonella.agona) ### RUN THE ALGORITHMS WITH TWO DIFFERENT SETS OF OPTIONS ### # Farrington with old options control1 <- list(range=(260:312), noPeriods=1,populationOffset=FALSE, fitFun="algo.farrington.fitGLM.flexible", b=4,w=3,weightsThreshold=1, pastWeeksNotIncluded=3, pThresholdTrend=0.05,trend=TRUE, thresholdMethod="delta",alpha=0.1) control2<- list(range=(260:312), noPeriods=10,populationOffset=FALSE, fitFun="algo.farrington.fitGLM.flexible", b=4,w=3,weightsThreshold=2.58, pastWeeksNotIncluded=26, pThresholdTrend=1,trend=TRUE, thresholdMethod="delta",alpha=0.1) salm1 <- farringtonFlexible(salm,control=control1) salm2 <- farringtonFlexible(salm,control=control2) ### PLOT THE RESULTS ### y.max <- max(upperbound(salm1),observed(salm1),upperbound(salm2),na.rm=TRUE) plot(salm1,ylim=c(0,y.max), main='S. Newport in Germany') lines( 1:(nrow(salm1)+1)-0.5, c(upperbound(salm1),upperbound(salm1)[nrow(salm1)]), type="s",col='tomato4',lwd=2) lines( 1:(nrow(salm2)+1)-0.5, c(upperbound(salm2),upperbound(salm2)[nrow(salm2)]), type="s",col="blueviolet",lwd=2) legend(c(0,10),c('Alarm','Upperbound with old options','Upperbound with new options'), pch=c(24,NA,NA),lty=c(NA,1,1), bg="white",lwd=c(2,2,2),col=c('red','tomato4',"blueviolet")) } \author{M. Salmon, M. \enc{Hhle}{Hoehle}} \seealso{\code{\link{algo.farrington.fitGLM}},\code{\link{algo.farrington.threshold}}} \keyword{classif} \references{A statistical algorithm for the early detection of outbreaks of infectious disease, Farrington, C.P., Andrews, N.J, Beale A.D. and Catchpole, M.A. (1996), J. R. Statist. Soc. A, 159, 547-563. An improved algorithm for outbreak detection in multiple surveillance systems, Noufaily, A., Enki, D.G., Farrington, C.P., Garthwaite, P., Andrews, N.J., Charlett, A. (2012), Statistics in Medicine, published online.} surveillance/man/poly2adjmat.Rd0000644000176000001440000000273312154347331016276 0ustar ripleyusers\name{poly2adjmat} \alias{poly2adjmat} \title{ Derive Adjacency Structure of \code{"SpatialPolygons"} } \description{ Wrapping around functionality of the \pkg{spdep} package, this function computes the symmetric, binary (0/1), adjacency matrix from a \code{"\linkS4class{SpatialPolygons}"} object. It essentially applies \code{\link[spdep]{nb2mat}(\link[spdep]{poly2nb}(SpP, ...), style="B", zero.policy=zero.policy)}. } \usage{ poly2adjmat(SpP, ..., zero.policy = TRUE) } \arguments{ \item{SpP}{an object inheriting from \code{"\link{SpatialPolygons-class}"}.} \item{\dots}{arguments passed to \code{\link[spdep]{poly2nb}}.} \item{zero.policy}{logical indicating if islands are allowed, see \code{\link[spdep]{nb2mat}}.} } \value{ a symmetric numeric indicator matrix of size \code{length(SpP)}^2 representing polygon adjacencies. } \author{ (of this wrapper) Sebastian Meyer } \seealso{ \code{\link[spdep]{poly2nb}} in package \pkg{spdep} } \examples{ if (requireNamespace("spdep")) { ## generate adjacency matrix for districts of Bayern and Baden-Wuerttemberg data("fluBYBW") adjmat <- poly2adjmat(fluBYBW@map) ## same as already stored in the neighbourhood slot (in different order) stopifnot(all.equal(adjmat, neighbourhood(fluBYBW)[rownames(adjmat),colnames(adjmat)])) ## the neighbourhood graph can be plotted with spdep plot(spdep::mat2listw(adjmat), coordinates(fluBYBW@map)) } } \keyword{spatial} \keyword{graphs} surveillance/man/zetaweights.Rd0000644000176000001440000000277412145120227016404 0ustar ripleyusers\name{zetaweights} \alias{zetaweights} \title{ Power-Law Weights According to Neighbourhood Order } \description{ Compute power-law weights with decay parameter \code{d} based on a matrix of neighbourhood orders \code{nbmat} (e.g., as obtained via \code{\link{nbOrder}}). Without normalization and truncation, this is just \eqn{o^{-d}} (where \eqn{o} is a neighbourhood order). This function is mainly used internally for \code{\link{powerlaw}} weights in \code{\link{hhh4}} models. } \usage{ zetaweights(nbmat, d = 1, maxlag = max(nbmat), normalize = FALSE) } \arguments{ \item{nbmat}{numeric, symmetric matrix of neighbourhood orders.} \item{d}{single numeric decay parameter (default: 1). Should be positive.} \item{maxlag}{single numeric specifying an upper limit for the power law. For neighbourhood orders > \code{maxlag}, the resulting weight is 0. Defaults to no truncation.} \item{normalize}{Should the resulting weight matrix be normalized such that rows sum to 1?} } \value{ a numeric matrix with same dimensions and names as the input matrix. } \author{ Sebastian Meyer } \seealso{\code{\link{powerlaw}}} \examples{ nbmat <- matrix(c(0,1,2,2, 1,0,1,1, 2,1,0,2, 2,1,2,0), 4, 4, byrow=TRUE) zetaweights(nbmat, d=1, normalize=FALSE) # harmonic: o^-1 zetaweights(nbmat, d=1, normalize=TRUE) # rowSums=1 zetaweights(nbmat, maxlag=1, normalize=FALSE) # results in adjacency matrix } \keyword{spatial} \keyword{utilities} surveillance/man/abattoir.Rd0000644000176000001440000000156511731650466015665 0ustar ripleyusers\name{abattoir} \alias{abattoir} \encoding{latin1} \title{Abattoir Data} \description{ A synthetic dataset from the Danish meat inspection -- useful for illustrating the beta-binomial CUSUM. } \usage{data(abattoir) } \details{ The object of class \code{sts} contains an artificial data set inspired by meat inspection data used by Danish Pig Production, Denmark. For each week the number of pigs with positive audit reports is recorded together with the total number of audits made that week. } \seealso{\code{\link{categoricalCUSUM}}} \examples{ data("abattoir") plot(abattoir,legend.opts=NULL) population(abattoir) } \references{ Hhle, M. (2010), Changepoint detection in categorical time series, Book chapter to appear in T. Kneib and G. Tutz (Eds.), Statistical Modelling and Regression Structures, Springer. } \keyword{datasets} surveillance/man/meningo.age.rd0000644000176000001440000000164011731650466016301 0ustar ripleyusers\name{meningo.age} \alias{meningo.age} \docType{data} \title{Meningococcal infections in France 1985-1995} \description{ Monthly counts of meningococcal infections in France 1985-1995. Here, the data is split into 4 age groups (<1, 1-5, 5-20, >20). } \usage{data(meningo.age)} \format{ An multivariate object of class disProg with 156 observations in each one of 4 age groups. \describe{ \item{week}{Number of month} \item{observed}{Matrix with number of counts in the corresponding month and age group} \item{state}{Boolean whether there was an outbreak -- dummy not implemented} \item{neighbourhood}{Neighbourhood matrix, all age groups are adjacent} \item{populationFrac}{Population fractions} } } \source{ ?? } \examples{ data(meningo.age) plot(meningo.age, title="Meningococcal infections in France 1985-95") plot(meningo.age, as.one=FALSE) } \keyword{datasets} surveillance/man/aggregate.disProg.Rd0000644000176000001440000000121211731650466017401 0ustar ripleyusers\name{aggregate.disProg} \alias{aggregate.disProg} \title{Aggregate the observed counts} \description{ Aggregates the observed counts for a multivariate \code{disProgObj} over the units. Future versions of \code{surveillance} will also allow for time aggregations etc. } \usage{ \method{aggregate}{disProg}(x,\dots) } \arguments{ \item{x}{Object of class \code{disProg}} \item{\dots}{not used at the moment} } \value{\item{x}{univariate \code{disProg} object with aggregated counts and respective states for each time point.} } \keyword{hplot} \examples{ data(ha) plot(aggregate(ha)) } % plot.disProg surveillance/man/twinSIR_epidata_summary.Rd0000644000176000001440000000563012003572406020646 0ustar ripleyusers\name{twinSIR_epidata_summary} \alias{summary.epidata} \alias{print.summary.epidata} \title{ Summarizing an Epidemic } \description{ The \code{\link{summary}} method for \code{\link{class}} \code{"\link{epidata}"} gives an overview of the epidemic. Its \code{\link{print}} method shows the type of the epidemic, the time range, the total number of individuals, the initially and never infected individuals and the size of the epidemic. An excerpt of the returned \code{counters} data frame is also printed (see the Value section below). } \usage{ \method{summary}{epidata}(object, ...) \method{print}{summary.epidata}(x, ...) } \arguments{ \item{object}{an object inheriting from class \code{"epidata"}.} \item{x}{an object inheriting from class \code{"summary.epidata"}, i.e. an object returned by the function \code{summary.epidata}.} \item{\dots}{unused (argument of the generic).} } \value{ A list with the following components: \item{type}{ character string. Compartmental type of the epidemic, i.e. one of "SIR", "SI", "SIS" or "SIRS". } \item{size}{ integer. Size of the epidemic, i.e. the number of initially susceptible individuals, which became infected during the course of the epidemic. } \item{initiallyInfected}{ factor (with the same levels as the \code{id} column in the \code{"epidata"} object). Set of initially infected individuals. } \item{neverInfected}{ factor (with the same levels as the \code{id} column in the \code{"epidata"} object). Set of never infected individuals, i.e. individuals, which were neither initially infected nor infected during the course of the epidemic. } \item{coordinates}{ numeric matrix of individual coordinates with as many rows as there are individuals and one column for each spatial dimension. The row names of the matrix are the \code{id}s of the individuals. } \item{byID}{ data frame with time points of infection and optionally removal and re-susceptibility (depending on the \code{type} of the epidemic) ordered by \code{id}. If an event was not observed, the corresponding entry is missing. } \item{counters}{ data frame containing all events (S, I and R) ordered by time. The columns are \code{time}, \code{type} (of event), corresponding \code{id} and the three counters \code{nSusceptible}, \code{nInfectious} and \code{nRemoved}. The first row additionally shows the counters at the beginning of the epidemic, where the \code{type} and \code{id} column contain missing values. } } \author{ Sebastian Meyer } \seealso{ \code{\link{as.epidata}} for generating objects of class \code{"epidata"}. } \examples{ data("fooepidata") s <- summary(fooepidata) s # uses the print method for summary.epidata names(s) # components of the list 's' # positions of the individuals plot(s$coordinates) # events by id head(s$byID) } \keyword{methods}

.o :mKg&∷'G"F{IR gw`?g$Jwmtsu&I Wbt#ƭ(7SDӨoVIUPq?Ht' ) "`$ ﭛTx9XcvJܼ\xLӣX S\<` O-P&-䲳ߙـG75I%ӃT0 Tr04f|&$Ւts+ HLᡊClֿk?3gsnEL!~5M=5'l-u~$Fá@֚~!"S4h lH #%>)JhP;j#GF$yygO46'Vb;"X/೽!OGs2Cj1u|m0:b8\!l\ps`@7\_yt>R@^6a4'.£"duܸv[ J27:xtV:DLm(e 'gR0Gꉶ>?e(){3f)GrD*D5N jyKDŒ?<ń1}]Z%G3"NbiWO҇A%h Z2ֿhŽJi%n*r'ɟSd!BLJ2l)"a@>i2xbNDV e;rsMV># QEGҢTz+뜘)s}x^#vm7&a5yg1?31ɓs$AnB$밭dܻ%-<.XULZd`X_H0^:ykXgGbVG}d{r 2 !m+t_bDvMZ(yryzof~fӞW>";FP*jߴ74 /op2T*/^N>hҦ6ʷU3 rANER[l@P(Wp9|Ra-V9] ă'6bޯ9}Eα5]ceFXOMS%{UnڪlQn)Pp׷&Le:iUsp9fU/Y}CW^`M;@(i[ZqIR'.G;f e^MV G8m@w,ojezktK7źMnm@O껐ܲ}C.|ZlΘkyA{>1P*xOJ 8 ;tZ#nLGRY{0?Kt"{ɷ:Sk@)*Uj[VbHh*;֬m #D|7y]~>X&<"D" s̊~UD=oג{򽰼 + iNEIփy%~[Xn$ɣ}nYOKqfꐙU Y0ҁN8^ҫ(QRgK,}hi,J}'iñq6*`! iG"- <!ZfAoX dw>cnX7`fhYT,m='I)~.b p>w}&"rSWW^v0AZHQBC@&_} E$:,?R|y Q5L7{-a᪯giD c`FE!saF1LVt̿rh-tc9Oۘ'΢`VyphZ@"w-iE>k=ˎ$t},gٺGy+T3K =һ;5WӚ8T4va k&iFBI ?3?ǐt)#BoFdWyAr7MhFgظẠb ZT T,al@Kc|R,*+q%|Xqa1zR#gj4E=Q|z8^>ph:=5a$N $7 &wHM'2rI#H+G["A^]Zy[0Rm:,_i&!?M} 뭳N8u+(lN# 3NXѽ.]f~#֩6ش3g=Pwl+'pa군(ge88vjݠh$M->@[ V^1Mt; EEB+^A&n*QO8c h9>-%$G8.Lx/};dvwP+1RŽڨ$F}kZ8!ao۰eS蕈W -*zȯ8•|0*!^'w*O>q ߧ<8}\>9NqA,qZ7SXgOG&m9y06E0챁* >=ÀEVRƣ ؅0Z%z7~3 0,.Qc=!gXGeEG4`ްpν.8.Ҳ\e[UJx+4?o"iԢabX GnE"#i-pnUIA RiD&hٲ3&t]C B;74V""q=|3Xp҈WS[ 6L0ރH`?\-e5AA<ϷYֺj6 巪c˱jh"Aw&l,?3y-EZ`FȾVJJ=0[hk.$6)[q"֗-+en5(twPo&wKkզ uO R{廒D_?=W`5zw!P `NB3 gdV=ܷ&`F2M% 8&1|UԨCԧiFU4㔾ѯbT;vxߌvP,|k &={ݩBBf(>ЯBHp cT-7ϏָhG,\ 9H: 3$~{ c!P:MxݮL wb3I bPpXŰU*$:ON;B ق-uΫ.ctK4WǮ/n#f;Ŀվ]/\GNcȋX TlB=.%!Қp[ +dCaH]&e'ىKȁQ`=Vk& &s/YjTFo)f2s+]"yRP|N߹KLrM䉀V8['F3&b7?I"r07FNaXBf#1u JޅN!*d }+ghO{sƜ\&^c2XdMU h!>_4*OͿMX2ZOcyxƎܠ>6ꌭm]WXqf]{u>Bk֍D`E3:C[5$Xk:Nh||ZˈK?#f*GXɳ@bQpopNgnnFB'A|R(5}CUTf?u^xE>#p+h}RLr~-!- ֈI-5%aEod\N)V˂D]vq QEóHQєaLIڵ̀ysu3Q't^ʸ+6Q6 i?X'⬗VĖA#AK1e 'rάJㄦZQ3vD7VΘR6ƹ\oZ@QZ->2j 8J+kjW b=3Tf:kd3[Hxg7`!E,́]va4haN7dݍ*" pE!!;Vpj0PjJJK5u%@QЅ^!y{EG>N6ysI,^;EÐa$nJh+-*eGE\nv#hL.axaQX{S}+Wϋ:rdTi/Y_ǎt{IA vfrM_6cd <|@ވ^2ԕUii&Ge=#g:`0VGsBnVFC#fo2'^5q4Z},-Q[mK:v~4kCm@X#OQf;>7w0_67 G"+oܪS} @>glUL*5uK(;۬z>7Wy[=0V'[ңΤn+%ǀ|pM97BcPc[={u4'<^nN<߂3r= yW7pP&$oPeK">B`:.b[f viHq_ɹmQQY\"m,L/FlO5J`)v.&n2"H.$iPYfnkgW.J b1 Q ['Xt] 0Mq+ %+uO6iGكٲ0@m(M\?wVLM/onm8nAD>IC[>ckA5"g4*"/!|QmB#' Il'&IM`2F=Wym8%/ ː%ݖ^ ]XpHR|-ZP;gtDv/զ2XD[_S0uz^AGLv3=Y5?ڮrYC>4$'K,Ye\7v{r3/"2nݷrFЬ\WQK=- A"2v3ǖ9$Ll*G| Ȅ=*lHLxAX{]s6(wCa39uV!Fn,& " :XSnZzsʂ 0̉PSmxlv-p~ie~ՃwwXp##D\.cg+YTnk.|5 +*ؼR^܊yy,Es[τp{^#rrXR&ڿ۴$ _D؊JnFG皅jV7Esv/5~V_7Dl*绰`vD*%ްFn*!;&u%>$j$aX?XPphpwN:]Cڇ:D{"IH-k1؀U|pF=nkA$JB]C]>f҄:%e1eCzp1u<9\Vb!] &+E^=}Wuҟ:8b*m".\*rB)% 1mp ,'"ɋޤ2X} ѰĠt빽o ןo$#CYpоؖ@E %> Ib빢 No>UBYHGnm0bP QU7fJhk"o5sō|q}j L-͢G};n̽8#"lc} ٷB?M\cdqqBcf$5,q~#gGp4\Ѥu5w A!26"߽cA.q92*_a9y~ HhbփJt.O{^/92ݨ y}.0{Y/JnqF0m|uH_ j ?tٟloZ桟HLG;3S-;},9ع$q͞2Pهnd³T|3<%.04 Xrb܁`i_8MI\Q}ԓx0 `ZGadxC{tÂL/0A[w.FJb6T"9_doG[<9c9Re6  מ9"Y]/3pOϒm/DgHozFvs5WsDX=yVD pfTn`]9}TT$a^  dkϚ"BI~N~s쐗ݑڵ?, K0 (w`}N({ŋg{L7g4k/Sn2 U-lڎ'Ol׶,鑇,OڜR? sV_–ִ{. [qȷ m+@PψaZ)v&'q]&j|Ûo svF9z&\-Ћؔ É3A]b4Uܜa/}$G."t9SkMIo!X:rF{iKsgY)kdة_V[J\c|P0;<}//h:駷G܉]|4-FEC޲_A nD:1b1@i0!n#r&D0^uQV?IoE9!$*֌Reˁ^7* 9xT,^X쀅`w䐽(4 8ۉ{.\8n*|4 UIgGQ5б(J5.QQCKz_JԋzLMql؟ӌ?ZCbj]N)!/ NMyer l_%|}ΉH&Otꕋ 7w1,o}: y]ΡX2JKY?$T$yah%vsFDʱ[L᧗F\7k@TWt6s,G+G?_[A7 Rc?6Cct Cܴ j/l#(y58ȳnZ7K_>Q'48QW\1VEn}^9&@QȞFs:, )&TL$o|^e˚ZnlWoׇ b ͠|MVobzWn;zͣڍ|p0v> {wi0}Sȟkom9+f )eBaE rUgKo'oSadmI~eHFa/qV){;+ jddOoDX?U;X0]RB6юȥWB(a+pzI5m&F/qrevbwsMF߇9Iij|]xXrei|:8#m \>jav,R;|>DϛB?V%K*eg{$$Q]p3ٰJFl΂mms-ȜD1|T V5 V!A2ޓbRC{Y͞ي?yDg׏[)j o#\ `$d<1C:$ɐc Kyw',|id8qP$ڸL?D7LS ܐG[<_V9|_9YK_G"NĻO=w6oq~t8>?}̝tոڌ/"RB$/=RZF$-nX@[=bw8*1 w:}u+ꆼK|x#*?tȟd|g䛖NVXٰ-h (hahSʓK̃z$G V8LkQ[26(=0J&ɞ @ɱX&/%xxx5#0je*ZfԁT ȯP'h-߽. gq?LBn;ҵ8іۺg=1ڷoi]Pvw@*n>EgiOH濖 3/ s(ktH6 vƁ_j7=rl6h\wHT0mk_i4 1& q|udb)%~i‚@} f6ohab9(I0~ vMO~;AD}UBN qƥSٸ61;cg0O8贿U`6 dY%wtCZc_2U rfe!g7nz⇲z>y0tD%h=z``˗U&큍/():?)sىd?D.8>po@druv+_|_f,~o6eB[B¬D :/ssmZ`/GoLQ- $E0# -= [TB10.;"4|@6ݹǞp$qf20x3_0MaCJݠu:q` `NQf] eх~۟2ɖ"(iڮ-řV- t7]h#a+2¥i>Bm dK7EZLKf<A.Yg_Z+8١I((_zg(ֿ9zA8?\]=: -}_o9f* 5Gzqw&D5A?ZzNu:Z̳ fkmjkI\3қ ]{gѧߑPxŧ7o+Dxј㛫;5#*"G64<l%>jR hqM]Vu7Ě )Ec"'ZYM'KWyie(1g*Vh)gF*Tn}dn(Jd Ym/Ǡ0W (%}Y|GRP?<1(AIQRo\ 2d`ϲUs-6``k^nkL+d-^߰\tȂ1)׽6vпj=7lJf%,-(LΉFNw[X{˳I͌phs )1pG4UTMLjs!4-yޏMJ4!,~i.ҝX"R]V6~N;%9G}m>ёWkG.;'-/!#QIgI!PL QABCPh{'#ni~ʓyRΕ 5 @}fj`j52ȏ:E\^"Av] 2C4˕=ܩTe8:ڝ)蠕92 zl[J1խz{8V&iG OJM|/KPwݲ.h d&vArB\{oz'`^ޢM%Ɖ1 Fp+ TS~laﺝx0nÙ7n{c-VsDeF+O? MJ 9"@VY|֫+M,L\7~T\q =*c 4ױ4OrX faQNЯ7 DQhӱ:e- `:J]P]cWz[ZL7骭[1/܏C%( Gӹ}~߁4\acSևGfV Ό/^ZRXx$H=070Lᗌe3C ZᮒQ>q 놾V~"0āH]]4fGeB&a,?0gGd?1S3"Ue!`8 o\ " w`LQFb+;|*Qke"mMȿ}->/$Ф;AyB_00o%An8 -ԇqwdڰ-T8<Ut5E5H*,He #7&$ҥw8+s#??N0/) v6 ,UE(|uF=UxBU[CB-߇G5h}LF:f / rycVjGɒuGi̚ʹGxj$e)./Y\%= }8 #GF|0J!'UZe6e=& yV[A:bZd">yT,j2XRr4w_22%hRSX?&W帼TveHe"s35JswlڗM}擖!58v`.a.?i^Bv]o,@ࡒ;h' ʓ8g`"d /A03#C{0KXNً%2hd aQX͋x֚3V:IzLC*|*#XC7|8Q5\BCFxPo+ӯ, 09ҌN4.B997]>@fmF>LfPu Er{#<*$V-϶̷{ -&;TY:4sM;K٪0YT8ѲLћ6_N!܏om2qw}4P0D[0cN1=5,X%'sg˝|J)UQMIWOiC-{@O{c*7:6:mQTD }1 hǬލ@M"^SeDT=m)0Sk6lί|lB羸;;KP!iOAqY@oW6#}P_͡OUj\e&8i%9mPDfC/3' ;`FHZ;@ɶ J+>[?:p||B LYMrCc0bC(iU=77NK@ۧ~@cL@ldtUg#;ő%$ubp>c"?^AvmU~y.swjƌ!~)X`lX;`חⱪF5%P2v8m6bjl I3pin"up BV 4EvZaՄO^ye ,[…,\,T$+g]"= " CUbY2L$fX߈jHֶmko .7?*`- .viXK"Z%:.idm Gݎ7 >ygϏ*@WO ˂͚1x;$;}QahG]>Mhج]u.>yJ`N[σ w`&۫$H2Cǡy_:t}PY2U\׷l5ZAuH~'B0obw%H^7 ĐfO\$BٺXY!aJ'A]e b4-KSO{g[:~s'كI?LcL|Rk`EC?FjYH))#',x'pPGA uk'"C>%N,ŹvC3  + >ӪC_<=@aAMU9t.<޸PPp=G z:/,A)6M.FQv]+Hch۷+hy8[̈́h3&CWgDPxs-C]nE@=Bbմ:. CYx1\Xx:16ao~Gw .ZWdwBݞFXl; . 9'3 xbZwZYo+@()BFĴHah [ NC]Ԋ9ZqEzd' 6j^Ѹwr'ÿ/elvs\Hua%# @[R+ߵΧsLCT d䰏Rj,yJtv۸Oapf ȨYìMFEmoucWObS!Ǿڥޞ@{Vٟ&]ڕ5i`aGeq`\큺eYw`x7|Uvяh^>?R -,,F:f}+j[ҩ'80w纲֬^oo[' bch#EuWrNBobdb`ב-"PG}&MIkJ-Hui[^ò"w IB=҇*|T83ۅg˫3y 0u$8i`g쾤Ĝ6?"ٶ3jRkp|ݤϿ:a~z[ݶ4lZV$:-^wtzBB ]Ju\!%l>e= 4Y1{G~>ëݹf.M>އVmlNCweG:K$V2StfўqwcIPWg%8hPЀg2>Op"!l0y۝B6aGL.p3'P޵x|{!"̢c-Qroj"YM}*07AP]1WMUlB`|+=۽jmj*;G 0U89<5{؅R hZqPIVoqBppyt>>Nˊ|}ۨ'-rL{>q[ JH=@Rx ȑP5LlYIo9T|W+Okr;hwL\9 汚$x*ǕY[KsBAܯ ӰvVe qWc.LS[ɋ UM\r_` OLA~~a΃/WaoU3V}}j߮U:|JgSa+JlYGc=]X`v?!y&s+'zAZ%ŒEIJ)y>i0%=NÜ I:}&ilʑg)q.&s§QYQumE2ıc{ &CV7kSO4m4q/H^ۻs/g?lΣV>`\1T-C=A3EG9RRuBj -$+eļqpr#{;2;mS9C1C(˾z -=9L۠"9V _(ZХGxOm< q*'q:=Na%"^,|;!ꞌ#x2POUYEЊ]Sa;&pEjؑp#l7!glrKݟƋmpNpCT ۳Ɍc$Rz-(զV-Uձ{`os9Y{hDL }wB5p]pbR<!s4&K[ZyUNX, XtQ>o_n{XƄ{;@!63_ iYɎO0u|<- dy0UʉRYքO7)L+B Z\}aU zrwy18"g6Ց zB,_JxEpէD ;&IB?ߐZOߟ y"1WEsa 蚽DH?AB@:i#?զKۖlL֠Ă=!UU%EXY jjL/*XkZ58?ߐ$rdF!RߢA׾Й-IyD%("^79ـrѾie@H 1QZ_ 厑 Q!R2:f[\֦qV;ZM-uyŧVdE1|71<-l1@K#(Ӟζ`5̶!uE*#J0cY6,c kW!5__EḆ/M#a̩(}}=53SXhфVaπ;ļX;ʏ桺Y8V ?6@}Aqq;O ^7MF9Oc_r%8/D9H0i`u1sdv]|@wfu!G⨆#Rl)c{gs %7/; ȩӎ8Y M/0- l./Qi S}#EQ ^K 3yu_ 6:x_%cy Ѻ}[X@)qV uBIMn$AzC S)7050LJ*Cp)$9:;<eh&8t}fjĶ ' ^yd|g"[|;5:v}^oAuipyKDI#3yVKE+-P >0*̠ ."z;P'eM-1ak+Vjo7+?aRVvZ.`DPyh:8 .VF׻pW4U&!pGe{-X%KRZ(rcnVseC eΐ$跭SV=jAɓ?os%Qnys430iPn 5㝥bJsD o띁7Rߵ$i*ws0tȰǀCt}XaHK0|D U%~.1Y'uHTd֨hБC8J|4ɪ_)m/ cպ8]vk.uJ<+E&7b u)q>39pHl]()M! H.$RW纎?ƍ(|"pzWtYޠY~S2|Wc&FL0ͲKaY?|5M r ѥuǽɃGe;QV/~z1f+^Hk&e} 8'{nj▽7xErh6Qlc;%}pI7$$*p֞`Yxj<бڳ2kN jl'\m(?ovY}lbnR-4ؕJD+k2DeTU} 6Zc^H85&;DOa'RwdLUw&0w#Xt`fPȇ#6CLCu23sɾ A?L,v[Knv4ho EF0¨djI?ʅ"V ߮Vd,b @3;Ј8 w?~Ó 51YXUQX0R8ɰT4_z[S78*w oHP³_1ҾOFN XĈ##E$&;M tathE$`dO +a9Tʔp zMJv ܋=finNt NK dFc$vQd-M/A ;(cIq&k$+?H6Qͦ":ެ\3mj@B2z$beɜb^ɟvU`fΊ~A1cJh΂U ҂x !$6Q $8OKN}d8ur~`^VjՓAvD~3kk&iU rԖ;ԾAuh̫~^ hU`HEEC`\}dJ "0E|D T+2p==]aZ+crnUe|1_WDzE1_1K$*lMC4&o>P~[D4volChi&:I񃼀$헦P'ョMX(c@M[YEP{S׬uX tAKו2J_0&ÐxbC<3m&\9O7d\:Qza82Nh+{9><04Tov xZ֏rPջ:+$iυWӗnǒaggmPL0 )į5ϟKW!1PH8_;c֫r!J@a>>_X (d C`W s`}L.~.SWj`[S䭌~FUz 6H_.Χ)c F=v4|^$%Qp%w[-xF`tzP|E>"Q7.Τ~ud{-! R6V~;W![ǚ,Sixpja>Z { #D*3GoY7}{=Ǭ6䈗qJ`ǜ@=p-*ﵙm:|:?yk}$΂Uq x)Zϸ20{_ M: _yO-lkŌg1;v{qeo'N2&hS*Cz|b%=/Rz_b0a5.OAU}k''}>q8J30LIb-"|p HQ(C273raRjJ{mW Kc0&sg񚥨dS1!0|ђO,M흶&~2D⤃.߿1t4DYmEG(?00%~{dkyYRgx*04wŃ5?^>`߶gr.à.&Sm.@SH\" ;S%Kjl|i8XI{Bb{.G|#=gL[Ԗ](qkfGwk[ZڕXQNI;PU˭`9 DY=NAa_LIo 3A'ptCRs:]STN~͛)?5hb4$N>'._ ^ uczWcz̈́ RoJVsc2_%T ~Uoq<dF072iɧ07ew1([PlV:tT{HV"HcVJ_V Jw&滣ԩʦL'p3E|4҂2I^}83(3B f'釔0i_aš6 Xrԋ *yC~QňEn??p6~$3:1!{x%>m `Vl;u=[z׷x8G[謴GW6I?o3LQfT._ <9KL^).,QskZ?qj~454U OcpCԛaFuϔM6u>1Wyht}g$樊GYFr?'2@K]ͧ%c:^|:k^'o6= pǢ$5n5̆He˦B:y@$M5m]> ,##?޾n}@ͦ]@hRDRA*t;gAY&K(YEP9 -j 9"ڢHkI:NE;KaOH9mǻHxa4mCUZu.&Um;RgO @ r̐pd/GIΆYbt,N_tI#`)mm _ Cz OY I$  a \k70H(ӰgQ˧i@bw^d#~qTL:9ED3oi6io?ݼ:L*E} TvRة?,`Ԡ: Uζ>JKWzf4) Tӫ $zuHE_zm|YAFVhAl7:ۉ9c>8aާ 2ag js97 K(>MP@\Bs?"$p8PFg\d`1֔p+WtfT @xJ _̙ ku] BbzủO1jDb rl).[9 ٹFJmv# HW+U嶡3F<L!!R- Z=Oߌ*M΋FҖF? qy^. `rIȂ&țU q@%'+ w͌MX{?/ラJ e.&Fc̏2Ij F'F#axBRȀ[jڅ_8Kn'4ZSLcyߜaW%EaݻlK%aN&v@U~Th./&B}ss Eiz%HCkk)T0[/fئߵ9.67aĵ(􄋠RYe&Ko l<\v*,O i_@ q Daď^(_F y7lkT?!mϥFr7>8 *&E5pE?wQi~j;Wzɂ2` ɪT~n|ػ\ ɨWA۸g >P!2Kaq4gᵞ4zY |f!! ͷ-Pz|J=tjk#E% XU_\,~V"9H v#+4U4%50֙VW2ȅߚَ. JIN}|v1,AOfп`8J <Ʊ&gpE p%$jfQ<'4~ztMJ,i/8-='Onĭhщy8䕊5¡ +~$(ʟ^r;ëc#W ϨGkԛ&ZIw+n,;ji_,n٫~"e`f,+Z`6ʦ+í]dòcD3j^E}!y׿0݉%d*+}H8kʲ/qpGf+M-h\E6hq ~*'gɡ`z!?Oac(ߠ+Ǵ.uI=C}OM̕rJKu&'TMqNSlp ΐk~; yM2Ŏ2J D$ȓBY}F>ܼ>j+&bi8狧MeT6qN9^4pH>\gN^?_`)|aV-@NξehƼR:K=i+\ס]%8] q;w'ViN nwP[I7kG:MLk&s7ݝ lE L$Rz"z6chY"ּLrn',$Y0J&kR 7^M)3σ8K:+E|JԻT-^Wo!? i,}x]zDEȅ8n[Oi?d0F=[֩ ōѻߢdMAv\v>faӒ15dxv;؁ D#3̻SlPJ O7z%;n_¸ YZ_Jc-sJq#lJKiofzzŐ`+J5Qw>y{+iҚQ"\6Tbep-ArjrA)ā۶~m#z.!)WP/D1bKR#6[(VKJd^n4 ꕆ6E<:LRL ]eD= :f){ R4C& ˖n;Upc5/ #=ZZ~Px@n%rxq?)X&GBlRfxJR Y-Ǥ%g0$ t~{+8lܱfzrTAңtRS>GN[H$=>(̀RލW 6nYr|El@K`ͽWTܩΒ'I2Jf]Ȁ티n'>B@zޜ"2CԐIOT@핾yVC*H[|es+tIׇef!QnZ3 N92cihz.g!!Pgq##o\a&xπ!:y^Mob{ڎ$ZX 3f/%L񕠄f S3%d_1fVde'8ȀVoᕥ~K>@㾥<3-CQI36iw;t;Qw3%3nzi1ݙuwKq}F@ 2#Fb}0}r(5F =ė kPu\!_@_[RZ!Դ/ QHDX\(KQ?m&jG3b*뛵ɺS)Yy]E1fY+|gRNTwDg{̋u+ XNIHmBj4vS j@ mq=ȉغtjdAlFM}K4cHfK5Nؾ.(37峔سƬABoJ'yCkٷry;ވ:j(HpC,:S8v; "۞ ijvbm:0Q*3} ]-LAe4~Np _Bd/m;F ' 0ԏ&ɯIQ,^ͦ"=UEۥ5G=]l2ZDd! \?qS0뮹?'EmQC([ZP/rb'}x&M4A굩9Qor5=A! -j!:G 88FM{nk"Y[GsbVoJ4QT' J @ 5C"oH|.) :\oCn/UIDl3Ն'iv4J{(' 9CPڍaw Jvf.q  `!ue0䷃`ZUMV_=&\!7Fb_9UCe/OIHx9JoDyoR%ŝ/Y a*UyE srq[faq)cNy %3~]"a Dl<8A奠}s 2hUG 19*<띓5L>zo?3L9<}21FӔfg[G@M3"WÞøX C.ސ7,ʫ,g䯒KP IX(E*QsVM>FhSI}Tdn/v %$~m-\Y7 fJZ no4z|Ӻ^C` zM7: (DT=̡ĦkiWC0 EBlD֋5g߇^)I?@0)JFkǩZ?S1vZwD=X0o aH\s.Dn} |ʘ%s*o(JOa ,3V.vf4 ֺ vLovȍ8Mloe"Wzq ?Ƈ `1t+ɑύT .|[&w<6G(t#N5 iY_{ j{F) K>fG>D%9ͥP峕Mx; 16L `qk aoXʴTLpnTDc+xo)ݙ X$/|F`$'CzAXu8ih:z/ w9eN| vp~Nt1e~m*|+ikqF5[Rʕ Jt- vvHe7u2lEk,/ۼvJJng*鏯4˸N! 7#x Co%}Rss*+Fps@2+3.2륥'l+b?3h6Y}# /ևMl Q jLTؿ&e-UT?&c4d8N'( (XipB] JV'RaR+T6ΒaP_(Y6.{#7Fnj Ԟl_ͫVB" GLA)TB$KV%1 Gޭ< TCJa( ЬY-8`WDڸav3l%Ȣ BK )OY8R,iq9|٤߼d D Wvg#~3ׅApWOs4~ 3"zsIpPfR;8vGh:_ +ݰ LQiF0v1;uFzx!;HQpBMfZ^r57E'8r5-`/R$on= ^<wp[[j[%8e9A>;F +g}ah,+}Ԛ[q`w8A7& uk3V,"E3g7I\ .:FsqԽ=7<').bvQս },"NIr,N$D* éMV9vzǃDHPlLBE܎СanY}#֎/er %Ԛa53@WHsUrAgS=%7rQ`kET]֫soO!/M%T3Ϙ^^`bE8/;L7y=bE4fP'?. *_>$>)t"a~dcT(>}BL 9<[$OA2#.몼2-d@,>o_ϛ7,(FqwSwC(e4aęҩ43_}21er ?WM*<8]q [E -_!(=2m*ھk=bb#$+&wEh$,oN6\ 9 =ȾQW-6Jd=Q2hsHer7`\/MnsϥNUgDHT. 01nj}/VrAJ7~1q_(r&*E&嵛}8qm;'OW0@D-|hTa aCtI M.I-egsw0J3gNxe-QLxaTr<lߤaBލgaLF9U>o#d3|dڟRV*P(*h6_l5d3o)Bq,c< LtDy ;㹛=%yq_{3{Pg18?8_>e#y 5ux [h2e #n=*7-xghCx6398878I=#|piD*GSyQ~W%: 2YS5!{"W\R@<hO1:ԝPxGDEE} V>gA%Z؏c"0'߈ěݠ^kTJ@O\W9XRnuFɑ2]𼜮QlZs*+au,1˿b]v˳~vJ1ѾJm՞XӚ}~E[4|8"RmߐHGx-;G$s Z#: |xgh7lMp'TV`o}hD p9?`~ aflp]4 D=/F\u_)]Ԥ%=ámnIvk ' YUV^CɓMxS@5(r|UD.鶚TBy(hNf3P6h._A$XE3 ]Yfq7&Ë\Ce /E{LD/#7晶ۺNkE#TDutµy5ڽXvYFDjA٠]y%h=UxP^|aZ5ufj 8>vE gQiD}0Txqv2߉ FB`w }d[ϞA)表?37fڎ v-5D|ydQFԚj$={4`d.xd;팧M-0OWJKݙ]A{ #v-[C O>7 v9hFf6QHW~+gaN=U-Ol9$HछfNɩLf8lF l!hJ0$^VnF|n\bZ|be 5q 獧*D?i1:G2&^k)@;h3Yb@=t !?6ovϏ"^MI"]Z+ }H/[@+939MPA~Ahﹾ\@@ Jmkh-0BP"vyja&,gn')vRD~.W5~ϛXWшriχC>Pz$˝å $nUOw+V L+C`TPL:`B N'{9)aDJ)^B;<vc;a` ͺ6S 3Sm_q JW qIzkš<֔hghuۚ,r^J Y[ z10f]P3[az}U^ u}0ua]͕- 8[,~UQxg 6J)';aBa5ݐjⷮH{MN-20/U5F 9r2ѵ /tb(7Ԫu,{H@FɣGjM[tOܹƓݚ#}chRʨuZZQg}lxxk3,WdO 3@5y8t] PHmٜD1$]bi73R皫Y_PmF6Jn0C$&àj!Re[2{ll;R0.[ը-n=3PuD&"Y͟|J)\|ˆx)6yv,.uݯ!+O#@Jߎxjm\Oc\fw?w6s.1|Uw-Ĝʚ٬ϿP'a% u=:ٴ#^NtkA!bJ}ce{Amhh-b+3i9Oy^q ~1B ° nzt _*ޖjP̧d΄#< ( yv,rm[?nV~Ei|E݉ ZU{qf4LM Zqo.|4^ SqUz&yd L>!ARyN:|@wTA_{HdQ3g)*R1Iao=>( FKB|THZ;Gr϶>m|cŖASA1"TOaޕST ͙m~ |sg`׉TJOyr}6ВաY! =B1F. f{û3Q!gJ[\՜WddzH*I%xw31Th D!KBH$:9 Eq ŭiU#h1uB^szP)VbG;}w\" cGQuS'd ǼHF-@Nh˗($,o?pK[ueG]:sq%^@bӮ[dRdũ^# yhSrH3 [Ο7=:ڣ[6_Ndtwb҆[u1#B.mL(<E98#kID8!U{V:8eFY ÿtg\h֊Xi @,aWXKdE]h0l%@^xXbG0VxfDh/0%@x#q%8]Q 3͈Xi?[Τ,S-(0QS=ž-YwVc`YGeɦY]\ (⦋VW/.޶IG‚~HfHq]TQb`1x R@&oSEp8_b=AdAԥNN kHd b rULit4عޖQj2AzxuOLej3w葐B=6Sx]*$D_Zm4>e–Taq](װm):Too¾P{<#~1'?HL.l\b QH #LV6tsi]cP#舃ckޠYX+H\y/JrЛS,\/GBycjm7+ϭ4 5#<0K%.bwJ:5I*XDA`Gb|cHjeiL p25nq}N[-=!B|<'Oٽ$: <@ )/ F?Sy #\`N5 /13gQuZ0 !X`<=,.cD8p+=JSYg)Ւx N Ju]VeA>ݐ_E`)$sҢk5E$OUhl1Tȇ;x_m l3΋H &}za)"sMP׾ ) <"?TXuMHU` QٱI.vQn:3mTlM݌v0A VtS[ 7$0zel|>g]\d?Pr~PZyGHtm[թb Ʃjq3IC5(M7Oq !h qQELv s⨅ m(֠\Ufqjw亘qm;)US{QR [?eh!%@KW՚w r5~ax/52<r5;[@`hޯ\܄\?4Nt+mk^;DywȠQzڂ7g3虮~dw2p9_8o7n<瑋7 D(f=,=x*#pD̦dGa녯4k2rtX DԌ\ K' pM*7uWZBh@aBhfugG>І,di/LOJ иv,=xCنl8i [Axܞ;~ Eq{hssޙL2}/d(Z,ZNg xky8YGudR8H,!FBտ]ňGc5o  Ou^nt!^ JIO":fyd}1 /\1:UCL#z%xݻ+%F?(È2$} ۬lN4z)L!y4`݇*oaWm]зpJe^{ZZ>gx- _N.4}Q |M@@$^otpY =ytg!mj2vٽچY0πMSغ(atc8&TJbgHt))ؐ雥y4Ȭ8W*aVR:ɠJ2J\ gٞɟ!q!^Dq$ .w<{iv< e͙1#u3̇q{Tt_`#̩}\\i# hZg _{Q%G49ln (Cʡ]=Am7 >gJ ug Yag{]P?8sY\8%C8!{I5Ѵ3&u}Ȱ_WZRW9 [!Y79R3R,H*^)_Χ&m@!qi!}s/2"7]f捿n 4tU4gmz?˿zȕ\9{hM1_W$5'Ijs>^Lo&Rrڹ8^Z2A9FǃY^=7x(O{D(4>brk6]θf!#8Y%)6aIZpW涻3>ҫ]^IV8֙ՑXLBӍ4L0G}l~%!j3W,=s;t2n|Q|{Ac"*W g3(ڛ+1}q<'~ T-\+?+(EtPn Wa4%Xrɱ:a5zaH0Qi*C!ʹ|e]8Voh>pcqSVע Rp WK ]"c˴!&,2~<*2 nsZeXm/T9mn nGU\8'M6A5`cK0}SZOz8tٴFJ#}?+f Տe\8T'62/b,xGvݺWZ= j)EQj'ك;,Ly^I@8f"5 k<2EjFE=ݬM/ǖv~ g<#n*iOb_:S3:#{&WDce~z0 HbNP]((Td΅@G'9q4n| @+T2c;R#s9ZćUP~ꉸ]5T 1Lӛ[MR)K;I c*Qsv4|,=A LYa+V Q(Z>wyõZ uݟWD7%l? z/hxZٲ[{eU9N=PXM .f"*[VVݭD;Az y-A!)L40 ^a1A̾ՙ$TvWی`uX6jȜ١9ڝBJe%_7H 1pkGv&Q\f*a]Ӑ('/5)uh1#}(YMJg%LQ˜;VhFMAP-VLg=N=>hGgޥ;˿/K?9%z8? OTS"xQk_ں8ߴ[LJ&n!;]^kok0T`GX)o\%06 y~14rtK5:dnbᤆl11kn9ߗIjfl˹ Eհc>7u=5㹥) `M~VZyZJB"ݭ96(ecʰ;DF4pK!fCi y4ީL%R@nG1nVc 0XuwMq%֒!*t%to нt‡uNH_wɍL긗 s.ڲ$Hrn*Q6}0_3Ă41A &rbo/lZ9^?(q$'rZ8ՌX#|hm=RxnLeZ+M³ G`# Vi8?}\?pȹ%X$|un-/XW>l~^ܯa Y@Efsh pn0E koQPLKgX7g/P:U'ɂvwTrlC~mo"'JZIAD] aewQM[+A"ΏuP#SƲ+XV…_FGla)~'خ8@H.EFÕS{^i{2mk~-ӁD2Ȓ {&6I"g'6~ ɞ[XM閟ƕ2-g9n3dph%ހ}`m=tR?2Lū;Y?57N`O }cyŮ~3.Qhؿ),i7sڮj,oB}ܙ @b5~}}Ud}#+y#A)Fb`fYLJhoOIzy8g=lGn虘7E=p.ǚ!ftXVK-\d!LH%_pv tVJRՈN񲘷 3 2R ~?$|vc$Diz.o?S9t3tgAmYny<^^>Qg:e 63?jsv؞f1 Lڭ PG=!?_m k"x8y**ULYl`,γ ⬆f& +vpZk{X0ن_Ԫ s,5"GPNgp5͒ԯE -Qa7 7A}νQOfigd'D).ki {kt D>a`8+|=Z>Jn0嗭û˚uOA:j ߻·mfڒОr]K<%lD9ׯ[>PedY4AvNKj^ar=Îr Ь@TƦ46xܼcNMkt}{.Y7QlJ6&{i Uc1 (MhVve'B?#rGhɁLo=,J)\mv zn޼$oʵY%c!]u]b!9ˆ6Mƞ?QgFKClY >9}H#I϶VFCoTr70M9m *6R"민8SOø"mff~[`˦2Fq嫛?z;(g2$7FUCb|h بjWCW͔8a&J%Bk(|jLf=h;$ў%SqMb ?}$[dY #3z>A RPdI"g ):x/ULejiʉOnNB_Х̯ ’XV;7ï]rKrN֍y!m^/,-.$gߠ2 ~wږ>=#:Ru㋥!Naovy-^k,hI~M-ngho#B \p{DKjRԒ66aVڪ0!`QUR=wS5:J% y1y6iXD(W Y%~HR8Jݲ(.6WTe\%bs oDhh]T({+PY(I$BtwDM +3WwtuVϫPӫH .6eM!/1dq3l;EQBn֯]4q&}aZWEp!. [t\[.'-b@9! X* J2feqdym6x?P k ? aya6Y9glD Wf*[J O Yq nަtq dR]5ƅk~ Ћ5`zmOf*f~lԻl*Ц|R"GHWA'B`]E=SXk_b%ie5x,~!ܖG#YhnP-OCO3sc oEIyk\LEScL8kxaˌt]L:@ 'vtw6c_,kwi|&zؠo6J/kWS^?pGCUhgjER`h'Xު$kW :Xؕ2M4nOO0nԿMV>!??F$lݴ3D49)d;'%%L -pEztA@6l"?G?ŒN'Рdi \!V;&'dYi)efZSpyoz,M/k2|1D̤_ZV .u.6؟}7KI"A#\{8 <ԏ3 Eq]ꪛi[(LhlpuUskL^xěsФ=@ E}ۙm&(]v=d:!c?Se 0db`]+*lvnCU'X1L_`U&r D~vC DE^_4>g%ό?Pl;F}>ǧlE*܆jƔhތBh0b (#BtL`ae$;bW;^C]QqF,V!3 #NJipC[R  J:?'Ҝ:dI}Z}'USౝ"f"T]p胤}!X>tF -DК5th'D&嘬w-[upgy`B\RƢ %vf$R믱xTɗYK ~ >M|L5yRxܟ׆-GM&5Y5 ?"RUSΑ8mg_F. |<sjqJC&iIش1Lx::sF_T'jȴ"'iv mp3wc\]*s'2@Č}>)PPDq4fˣGyiSEv AȩdAr9ɢZ8sބbMWz(ٰVwkA w7%1 (%UV9Pt^}g"WiWptJ":N$1C}rm;@$%)-A2R\ ?Υa N͞4ӟ%o) mA%0Vzϙ4 Z{"+*I\ߥ@, lߥ鮣4uSO6d ɛHQ|\=k=֤)bΘ^Z1E ^!lxz.L ,h{_ oϕy4;v_Z1,y{&?"[SV<Ҩq\Kη{!%vbPL{Q4&~B|MbuӄM]h%kMi ßt% ,liHwb-/pC/85 j(J8-)P4̣ȸ)=ڤ\\Z~Bi^ji{3FVqVE Vee s(). eŒ`?FbA/j>FZ߆{vJ6k}V4b ` SGϙ vkb4hkZԸxV=-É[ydN8NtCU&7&.ٞcP)ŏOjz;1XϵՅk  ݣ=@IBTX*Xq45J}^l Ed[Ay\RMoa,WYqK<.b~.!;FaLh˔hB*oԃK̒ ϮFo\$cp;_ U^E=Wy%h;{!:FzEu>s74f:vyLr;@w"Prn.$miFGq>ֆN97|Y`xmu?ƥjmwb^$MECK7f 㛐wv$u}͢ṳ#r7zWך@.%(8- 7n{@m '{|S/K(&=$ܣri}J-fʧ(Ű_{?.n 0UPidy6YnĮx뼋}65 %uH0Ot:bsRd}aعvp 82=t э83I?AË`̧<]y(W#T b2"DY"j<ip~ hƤ;qrX5B&\e`T 90"s[|>TD6U]THSo!D˿n=-J] 3YW>QFy6PvݱS.硃Eyr\짨DCKk3dl=<4mc8``5FEqqF݅0QLwo)X ';+T,~6,'Ty< -HSJx|3=^i_!Qh Ni+bZJ"&R}xBv;Ƹn@k8)yA$Yߙ>g:RH JF/Y)АIvc"Q#8S]wG Wj1CXc8oܴ 3)j1cOJr/CJX]{_[Ĵk(Dly1fTei !Sg8I͟jwϬ]R1FpBoMK|/ȡ v*;.JHD)1g U|-I)W܌8Ae{ȡ$~`a{~ |'MM_Mkf' xDgSeggЕ$8],K&tyLnE5]HgP4@AyKDNsF6-ߔ0g3ɰ8ďŢض+(oF =?w@Y{O섽5?[ O #$nԮJA.3_^z19"ByLr,S jE>k#Ӣ`oM[JUm\[sMl NHQ=>7#@Ғ|k}]#cAf * :6/ <$AY0q,K- oq}Tw@O׭ nJz#,EOΥSNVTL4~*$'G9z #Ki?HxC$݉q4'Eqw P.-`Fm2\A6.)ٞeG b9v)tR'G q q fiŅ]o̰-%lqMhUޏIO4@φYE;d;|?>[,By_&U ӄzHނk@ˢ{{ >6_,{p@ =ݠ} 0_j0<a̧GVPKYP"iy:K`<*RD;5TSIhz]$Dg.FKg9P2<8? wI>:}Ʌҙ$/%-MyIE*;՜¡r~m/bRqk=Fʙ0WOʛ&!ilsF3ۮX̿*6vvTW1`LRPmNmn[w8ߔhe?Rٟl9w/$Q{Yyra5ZL靰&i4{ZeV@2FӪ/L(v M'GNgw (X_E vA=JKZ*ĤX)Nb7 _AU4Zh$ VMRܢ!m+] {vj(;nܬ叫7T=V~iǀO nu^RKֈ2Yes斾 ^c?U>ҥ9BFM+4y6wcDƂvH5W sWEGO΁P收eG+~07 mtdmU,ߖG`u?\U8X-l r;㣶TQmd6gPC&iUsϦGQy(`o}Ӧbљ'b#rV2A8c*g["*DZ!9Wy\ks ?u%n 5i }F]7OLT0<eqC.xȱ_#N@ :]$7!C(3nVG_IIq9<#Hpz):OBēMI~~BܓۢUKAdd6=Lo }ڿ =~S&[B`-s36 ф8GG K@Pbժf&z̴$(Eﺵ FSTyQs/>̪Mlu+%QTCԉYtw;Q֦rf(G9D |H^̌y®(Y1"M&fdQŃMu2-9gcaui4_/;a`~$WL?IZMiAWAnqX7/$-yIrcGe8 .=_C``li om YD[zvLΧۅ:iI n]W7fPD}uت{ZTn6(~J <'[g)̼ꑿo X PJ}kc1ZmHF&+QsL׳b'DM'!;1c] jPiVF k.%*eQ ]=lUr}|ڪ [g( CDqc%;nK(HJ.&ٛnSH}o-jl;J  K@WM{gaj7QL'3byV&T 7mroѥrŴSksn+N~ф0_ 7KCUɡxr㞱1ya% SxاNsq 9f xav?m+YVF)&It(аh>(H#=l:ӭ 椫|6DcЫ|ۋ %xOTOKFY x5p{Hh~p">Qk_r8mӾB|=fLR!ggFSgD6i$f 4YOFuȤ_NШ`5)zRJv'Oj 8^ _zY`x3PE~rOne:9Y#J`͂1I17-u#%-_KP|BUXzq:c×䎔{slxӇA8aKDJqL9!s_QDYπ86VJz2u_yR7نՏ(.eLʅܧ nз8^Rz5ə`x5ظwhA$ Ɂ"! pUPpoս:Z[=:o$#"YAs<] -Ssk䃁ݫ;Ql_N.bv)+T Qs' Jh@:Qx ^mm)r@_2!˳٧}9({n/\vy(BnqZwj L-?265Ms=;vK**ڪyք"SnXfϷD0- s[jm2=ohZ۔x*@,#񦙴)_|>Kgҗ|rr/k\$2O v*u YQ*BݢW̴><]="@_YX<8JmqB[N7,OkyH`r _yXDI9 $'~6r4=I@x t&~m'%Gы(CfN!X]l,|5?>YBp_gMyXL#*` !)&U)K@fEܳO!fkhɏ\ܚRI]ؠj-YD5lCoTeqOћc+Lh&+5^tc=%T6_4}N/+!awf .H #a0R ]$e)v6>|YY!]ߵ i+fՉuG(%2J<Ucxe@ ޖlXY&0o]PXcԽI^8?<4|/4<2Z/ r7kr֠̈nMxV h3rgA< 8lk̠j"jbAe72[yg0dfcsO)3%03!& {~>@Z1Ȅ`csTg9gyk8NKxpA;s qKklN̊z qZ v^P`ù6eaϦ/cϿ8E_9v}]WA^rFG -;,ZK!;)}y Pc0+nVvTB6j7R]e]IIz^;4HwǨ3ΑKYm7,nu(81{&L =|O8l qJFbjKp#Ǫ^(X<?VG #w'fhyT*RYnb};2Y5&Wr-q W[<һY3K#2̐ #45{k{ 9#+/o![!$&!(\RǦ (<TCõ|H W# FWiU X*{9 H0X^B/kI:Juhou;M}Yk^L[E )U"`Zi['5>U*K'a 4ޭ|>g Q.ke5s|e>y$˵bf@h{+5{yqB\Y[.ceQd孍+'fzҎuB_ MGݗ*7U@D1 6ODС^f}EĄ) ,xc&1*^ n`Jr10+VԻۺ41BH;TܰHp`T_'[㋉[Hm . ӳ'ljt=n+.ME /njF@t !C:zcX7b-6ډ6şndNABlqST*Y2l>@l̚,7`<Ю+Qf+*~@ ͓i |3ea`k1h!㿛M>,ā'ƹ/z4!T,('/^J8>PI(#YR'Ah-4XV}Nǚh,?klO‹Rp^Ƚk8j!}\{ӐG媥l\FSjpyY6`:/3\^67le,wSמ>E47n(>Gƹvy$G**s7>=⢥V,s0Ӛf_IwZ3^B A|{UV$0S;ge}&HBש仭ٗS`Xx}@(k:N6W%B<9at.Y#%6 P OgxEә{QOʠWLR)Z,00P k ;|B<qV70~]F~o\2ؤEP%UGpxr v6mFt䗮#xaKLDT0k0xb6n,ɧcgnqnP K>*5c֝6mD ;F@%`P:筤:Ÿt-~kY5;-ԥ\X;{s?G5b k]K?r՜'Զ-#iNюu5. wzBľ:aTYJ{RbEY\fos)}lF?Uƞ2RjIPD,#k4c^(~5mk]rW #."-j">$O80mZz KZoqɟqi@d)tq[- -H=) t|- .;`k@!U)wȂ, Lf,엡a9@XxGHEwpJFY$R!]jM[Ir.S0묯:5@ԃVrD[Ջ/ `Y}jU|I2)awux\ )ˮ&#V\Ѩ<<[n\QYϳ<頙-ȷ*=Nڰ9\?E+_3xNI[Y.vD5Il.|ͼ.7$0* \aKM(1{ܦlߔ , -wA܀ dgD+kp{U,u*57:J"GΏXBCV|]'T4qg?|솿Ի\]+g7oF;ߚ ^4=w`Z~O&wέ!R|fY/uЄBπ͉byc 8Iwm6uˤy|m#H)iwPnzDK]wD ti5˱'1S-2pNq#ִSW ߻NՅJ-3-orD:qMTd KCg`ֈPKIrvpj#_Ӿ6bV ,1_k6s}j*ڹgRLi" e,aő}e,8HE, Y"&Ѿs̄HZdqqL93u],7Z.ۏFG۽AAFd'z 0 J, uēJthYllkH`= c7jq[LgfIg Qgf|<,}G"KbjJ+ }PduGlѳJ)Q.@"rX`J]I<8Fbӡ4<`EscUY]p9bv^qXKvz.xZ`̃-19ކ<(hG*t+TaiV;1nt,;ûtyD%m=;ehBPLv}$`)@~K'#2QV.h…?7x.76Dx8(XXe6qAiy7cltb** ;K?| K)Cq,#Y[_cM RřJ/ɶ>Alveѓ^- r.@=G{gmRw1J$$?,+WC@4H-`'E}O));NVo>*3xOg%%=;}OK Ӂ ۙ.I<-bFF% |cR4id  Ϋvr}ḂɐF=|uDtrXx;O ֚ jhtqTażɸ;/XG?NT}"xߩ=pZU)q6EYyy/S/A&V(޳1:UvqظsؑT;Ke- ~k|:/4;6Xr*(s:Վ^ؙqtjA7<"/mzoh_)oz܅Qaj;E:!6}`grgZxXsɰ4&˰V W#AN*#}fn-pJ JpJgGK,U5/n,btK۹މ"3Q(d?GYCf^EC@Ǡ>zyjTRX8C. B7]7 AL/gm:";,ϛ3b!> @AkAO'u~F.x z:?!"y]%+H9vP(􉭇nc~ʠa&kB9[ 0QϑYăv.k|]1. [Behks}g?/:>O>owO7JU\wDxx4@rt^lqs3݋6qhsMKv%5U'50_:;e-3G/ YiͪL~8[i3t }+Z\9 'bl17#F٬ ۭG{,4, ";v&.#gZi7-ُh8iIR@ˇsÛ4;w@Kח$',* Y D0Kh!?A?f(KeK5]:7{-eňz\ęy_vvk/_MB%7(kWtJ*eaמ.k/?}ߡ8Wo֒f%.OFB*=a;:!ߔLcf}sZwܮF'ӎ.b:t#fz5U^qL;| w Ϩ 4 r%TTץ-2U9}ʢi(4G X6oPΒA\“1zZêBأnw8Wh.kwwo \d.֖֮1q~k,P7DRb4#PqqPb c<cF⧔vbOO)iuJ LVuWWsH/4˸ӶwvDy:#"̊SnuC;@T96j@i"#lZ0lSeɲiR^訍?\Be& yjR*&z*[@1)9z`DhO#V_b8X-9&.4SdP IƠgSjHH=B]bi+^Xd0݁P> (A:PB_Y3L&҈:ͺa1??7 @H38UdYCĞ_(9vnؔm^'9x7&VQ>uA906:*w9 ^#, m4[mYUL}6s^Ё}c{ 7<\zR刺Q&wr@  >2Ɏ+lynU_I A< LOPǹ3ICe":E(R|5meAOIY<"5m2]Q Hb,՟)l;"Ă\?dsO>t ұd14wD=yn'߽S\\q+fk%g`]e9fB51ta۳k 3ړb/ԅb-; vw&89͊JᡨAbEh(&oIO0Eߕ܏=&a#es.HrԆ<;A9 hp߉c ̈́ۿӐ*/{$d)XÿBbC >?ڀ|c7<"KTQmJds{ʰFeHH;z^(~|L`[U3-},eHJ? 'fM:Ev;44GyIsnXDM m QT$IA1V biS:hWI){3ⷅĂ[6b`dif?@7(9mH&~>Ua(L6̜#Loʅ5\SLƵH"sN`F(U'rY,`SM XWV`%a$]*7`ok :!n\><ʤCybnX 8 4FEHrw{83@EHjCe 2/+8^NHs@|j C[6zϺdD`lNmPаYe C9K"8C3TC$K\'{ժ#jlQby_A[Z̼!|%~M%5{A#M|vi- qB^+)?R Ms67AҿT1KWgy>^Q1 pBҼ==V8CY11CvG!V<䌕jCN`z7go`TAE%Hnf̐EySWUFM=VY 25Α]{$/ ~8 {ix.3ɤ&<^j> U zzV٣Fh.zyMJ %Z .ª?Wғx(@!Z/eh9Hp63fEr8.uNő^q\?N˹WW&ztT]W^VfH(:*nP'vES}#؄}+zT:Kȶ- (ZXĮCyrI^.qYzMHG@XBo@@PfHiIk&x@ơސX Ǧs|}y)A~g)TgX|%30FE)"Q 3O/|ܘ,b2q Yݒqxc2RyA<t ܬ=<$mӞzϙ\@,J:sRBKƌ(w5Fj lm|UQ"Zwﶝp[GdwX2M q{֥RcE57@(^7p-iNg/k+xD0C=Jܨ1 iOTްw%\^t֘k[,a7%R'jc]ѷsIG2 Pk)Ir\Z:wsHoCa 0s],vx ~^ u{4Kց#),F=3}΅kqɜ9K]܆.l-\S; Z.8 ҈+e) "3FxvV0C]%dPӁ.Au IBy!:ǰo&KB60ll${vJTğ+9c2]?k7b!b"bU B8HYq)^!%Ti2Ӕ^@ mgy2l lHYhr { :!F'BX76Q:|CJke{(:^F:LWsEt)_W%q)=(j'RK畒PvDۮZS3? 2u9J!Q_ը/-FM ]$̪Q:Xƾs[mꏞⷁ%;8QcԌ[0#P|@2#?{PF'έE+*؈"Y0S9CZƔޚ6")hkWB<duJK%Xhoidϝ];"I^`7qnh9; FV?}E(c5:}Z3"1˒ݖ ɲ^Vق A^(0umL+íG Hث5X_n>Q5 P4y7..Dy7f7Fe~OV_VeOʷHFubwoQ,z\z0`qJf;. }h"Nn̳8B*E4~* ^C<ɭ]K]6^lebD3s}=b[LʮUg5M>A;k>dl 59BzAk2Lgd Q7E7IX~2 ¶ofW[Ϙ-/)"plUf%-F'TݛU场*Ly_wR<#>%0"}~&Me}w8+^kw9~Ց8]4x9K:#!,7[RQ'zQYM]t0PkMreW䳹eHw{A]'cGE]X&.ı@ `rwP^jN(,H‚B /SѵCQ0EYR$: G쉪,wu <&%›M7w>hbA| drXgB6Qkh3C tz3=ۣBXN@1߽`ݿk9SU,|4cZWTA$0'ź|+k}d3n7IFv8>~ Z#zROfֈ2`U#d/*p3fhBɏ0CLf9~Gtԧ\Hp!nm>kkކg"pyXid"^)3@t"Im[Znp)K gh9q|qi~WQ=_49ۛJ-ʼnieQL@E;ʟd"VAG ,.͖S0A2{!r+H a Rؚߏ #>($4c_Q:LCi_ V]xrb{tfOѨu7Y Y*^$H=dJZ PNދ h;@ q{3 e^(j8' 2!i}o>[xia10\(} 3\eSe4vERǙzTc$|[5]ˎEޛw*zF}cXqߎ"?z񅫿ZmZ]4_(]*gpׇC{ %5ؑZhȳH ]>wt]pq,qޔpMx+ Tc#Vz::e..m`l .&Mq{2f>t H1l Wj}@.8 '9p pX!c WHTXzR=[% e*q5EHUws;%x':ƈP5E" 5I^ˍE{[.w׊u?v _ĨWkI%qo =!KN`v*7NhJ q]1j}>PN\^N*= D+/AW`R\gz;a]۹Ocmz ;kR!9r_} 3#Uu~,ǸрK]IeI@hKPn^7+bdBC~ yGIm=`;$jG̿V&+pS6\ܦȧ֧]&5LV% o גgJ̗kU0lvg('ި7@<^kЇM [P]4R.OjT |\b"a pu/,%6SLH ߨ֙gZpN*m7g[ %Bޯ)Jr s ΑqGLGt>lNaiÐ{QUtv|#t<=([so8I=@,qXM++ a/'3gOղsmõt vZ3jb)$C)T*Q'f-,*@_Dڄ6PC<W^4,q=ך]A[?}vbsr0H)x.rxoHW2e;>/rIR7y_fE>_dB$j9_?[ wIi)l'(\&*ݝ4-Ld>P KB{;)K@k7z 5L}ݖi4[CPQO䭡Id=GGG{EH-C\Xx'jonLs89"N0o:+]xOUZ)qئSc VV*fͼ+Gs^=TAZǖ23m 3=@yKB nuE}@ (f@ȧpBYWcxju }oϯ(,H<m*|<uiW80 T0V͕i&"R8yGv1MDq1e~%GjoS/u܍i#:5*FR$W2?x[#BO  hk[䙎 =4#1LV>D}ldՠlOkh|2 HHd\ND9R'Yig`k:mu lB: ɄÈTLޮ? lI26MaJLtS[ =[D{okVkx( XAJfnw}T2Dm:)+uM3VyXPuW-QRԻFܓ(a-'|t}1mN$l'8C[Z=ݟjQlByi ÖI:NsɃPVk}v p VYXaNАwB?BKsemⰲԴKƁBkVOF; k2uW@ۗbriD3p2*7\`5vW~O)6t}dC \1$SYWGBS~>k{EYJ"@Ni cg~^c|jxQIbtAt@>,)KCup2ԨvTBr}YݢћI7%ϹezO#OxA9D:(MP .hq^F9z獄%DyPRqxff/u^Y#Hܩ3j_S+wzHx7IZ׺&|.!p'J@'["ߙsDl#qfT}HDƧqzvFNI )>U+Nn5g[?&Ïg;PoꗦEahH!ɜ-T"Fgc yp 6jbW?K*X.%dSaǰttbi}kՏ@ž9`YE|}){.$x,fǦOMђc'KB0Lh~1X\!dE5P⻞U[6i5ѻ?Ԩrs?jn8L?DES]T Ll~˛fҬqK(5G=~bh\KZc Nװ7>(p6eaY"MƏ`Id]& ~>p5^MLnm3U>cߗMU+ȵTGu$3JT`XC{dB9Xg6lJtH3Dx~.'k]-IFwƢ,\fĢV^OC+u‘% 9D-meZQ O(v%]rT_":jX6{hѷ[Bg)lN@$}&H!6v_ tdC+_,gDUhDAeg>9'lM:?w,+Ϥ9X_MS%eE&73kn>I L%sp.5CcCI4k׌SO;:czQzCH(Udʍֳ]QHg>Cv4VfxOl.̯qf&&!vaPr^Po#/Yz pmӘve3Fqw|CēuR-[Uexƌ y=!b9|}|!OֵJrmÀqms5e*RC (Hf ߨkGs5@HunC۝` &"vQ5b#IA\߻*_NF&ȤFF0A- B +U4]E!nYFJVѮu4Kq긭ʋ%g2TdH_El=J ``kgSb~vD5Y8⬹C|9Wcs`5x5Eo1qb%ڥ]:q.:X `| b l`kk TTH8" 6ƐB U׷lȯRn|):Jai &2.3ı#mdb2-8t&xٔ[2lT0O>8jJf-r|J^ar2^•LoQ1p~:`XS&`ޔJ=L1Azeyi  ښ*e>Œr-:c"4LLUx *`woҐspĖL~.@ɢDMpʲ@B_i'cUveg@mc[A M>;qAt1~x;4t^Yf0 J݄J`g1ՁxК5[ZtXNld\u zpYB^/X2YbK*;Ah…jH_:(UF +t@  >յ B۠SaЌ} c2zkstڶ5o9n&Pv6( qt'sYgJ@`a-/O{kGk꠫-p * .cV5Lt>4$TsAN_EIr c76`0bp ţt!WĆ !iܱ~Ͻ۵RyDIo B>} A%S=ȗ| W35ɜnOLd*3IQ rWf;XVߝ%SYZE\2A(X QLΉT=[x%< T@)2?,QE-&Y DE?6WYLfz{v"̬.aOd^cXx>#$䉱Mk#3y@C.Ĉj++:v&dtT DnPtP]L.`ЮgnLg!KB|<oʃ݉Ni44KPCGX`At!=*穀Cx;<"T*noZ/7mQ f{3V]VDd)!DT{i|V Um:BO~%i_cq.$4gv#Y3T7_ aY=WVD0Eɥ9~) gۀGLTJ-h]yaVRSd3is͕!ԠK.ZpL 43f2n,OPdbDyWsэM@D's7q%&| d}twtn7Xo"@!%j(e2qk)KQYMir{d\H'# {Ί1**lYGG/S#.y)[VnJI~4M[8`Os3$F@b,a|W!q$Z0jiJ2'jŤio9O~@[',"蔛`B< j*~CHOև7އ|;qv҉,&|{n7ܺkyqΒ(E X]{ O*e¤RC\ H 4.$k^ UpR/ YdmMc?2zx6}Uvg4rH`Z WZy&<]y8l5-?{YvZHӁF3"~˦*#lJZkZbw [2m:0¤[8|\_< ZQJlM,3]-K!S6,7F̚*) NyMp^&Վőaqvv$u9{ZjivuaJf拤;|FwNఙcC҅ap0B6S`ݱxQ])F{Ǯ٪B !w*%9kc3ޮ3Ca"Fg%|Xth)ެds-F["Yٌ%a8f#rˠj|oPDhǐ`drďN*J~(1HNz[t݄fW:•{AbOXo,˚^kDϩJ}9j\̈́fJd aDlkAS AucQ$ÉKG^}R[<ޢ_h0c'fz2z|H ?3r^/{[9xmm ^M,NL1xA7s񎾭EE&^;XҢb[\So' OX|Ѷ5Z ]9d] *#3S3I]nRժUl{]ĸ=w>2V |bHE'vV\jq sU )0; (R:as39(0HoB‡"Obh12T 9KԠ9̧j '^]tNV>S0eXdglf%9BRZl1 flꬪ>{|q~kmda?׶DOU Z(;}aY5'6J,j(!>dg\vT$ZΎo_ᵢB2)ػgeqRa5Oq‰,Ȼ.?tЗ* #W,Vu95͟ٴO9} ()1W|1_oy E;0``LM2gs=ꈎ'Tz7TEveނf^ω*ʻb@lNh]j-FðO_V@m1~P/Z|,椟c$(ͳT#YaugqR alR`9 0ͼ[Q60k1Y+w"Zt.BGa}#~gE0 )־>Y g 7:o ̮ Hcn=KL + |&HIwexad6(NآbU)oiy:Jh4GZ4Œ"3Nb Uh#tOIYrc&»^F `VN(q.W2ɬ;ԗD8pw\[HX\mW$&_;5,ზ#%H%.e,j(Nh8%bA$5^KkPjOLyI|E,Ɂ)scncm{pii(M6!B\}Xm Zr!5,C_ ,|!W3;)06osg=Y#3K?:+Z7L?Igyg_WSؓ5y#Qsԏ>T0YLI vI]`OvLs`!BorTVH_2 O9&Q `mwB?9LhDŎ{qg N"+r ɼ>D?l} wു۞ZjgqMy _b iF%`}8}ìY@Ri_d?pX" ϳvFb\QռчG21FЋx,&p3N#N&`~aш$A @#R!=\#S6KxA(bGə4!ZTxp&{)տJFHyppj!FrOƍNFcj~~3Epx8J,Ufo)cT,Q;̭?){KOnQ!$_< ~8U]Yll%Xw{.{ѰNl6YDPA>#"`lyY7$ӓ̾;f<ɁyOĦ흆;g8يvh5L!<{P(4g]b$:)9+E̍f\ɚx3DZ+RN7 fk,E2zN)e?O!94OFB 8%EH|3i'Tk;BE6oSH3 Rw6zOA݄X񆩼 ܪkyR,< iRx6䠦?.<5@<;p.0Gdߙ+,")gLca 7lE}Gg8ٳ(4"EO͐7.ICX'g5N_XHNaK9okn1Lzx[2k3ፍHae67!HfIaC4^9ԀhNF4aFydjJ =71(=:*0e;9NL?U5NݛtH=.V)$l% gyrW` 3שW0B4S! <͂ez8G sy '4zl,qאЋͳ\{43|}l˜v}r4WѢ7 2f~eSć'0.Sź|w)"NzPLoO|͉T?yuҕ0 =ubS(qd6$m aǘ$KƑ oNe ,@>qagd#ڙOtҔ.(y'1|aׅCއN[XVg,GD^iФE3|;1ei-]Bx!J: =z&Hӛ& nQX1˒o Q{k{3mDiY\6QT㹠K3URJ nf_&N I喵mwG5𛮘#&t~gZ, T5pYU.rR5 $b煗6dzMWnBA]<[G2~,䋰wpD1"(uVC^Iiؐ_m j֚jN;@W ENC7b}~K(񥛾p+Q7d$uGc(nᬽE%d \aH1b&i.PϠApR0 e /]# Be!~6V$ؐz\tEPͥ}JhgW)۝Z8n֜z޴Єh LgDrD'SfD"4x +::ޒ=8cAn7J\A= 2uP& U=z|l2cktIԣ;[f{z,4Y-1J9?Dr{{mmE\Z)TԾ]cs|ѽT_ҩu?Zyok%OLn z.MKٱLg{ٷXfyM,Kn(E%~}ԛ>_`pخ‹WF;6'MeBSo}=q1?NeMzz1Zs;6A]Ki$]7@O`uZ&-A,N6@z09oô1˟iWş[H(Ssi\c!S">\j$тBMu5U=Z@{zu7.67/_'dѸj0+xN+z <̊ T2.tzLrIh_*R-#DS}'=Ó<0qq!ܯ;%ZZ,-'1a=Xt2e.}&~'5ɶTY,n'xl}N,61Puej\㟾Y"B*s}W ~^]zr"uK_ZgSp[NLbVLt" =.0rI] 䪬 Be;qgRM2Y8`JD7x|ݬ2뤳ѱ_Ju6kOD{%&M]tZG C[){&*ᨣXkG]z*^&t1\_PnJ1,ۓGe~7h81ep]D6~5uxr1ĹʄwPS*{jͅ &[tƸd#]*&y3\`7xi|.1jRt0- eA>GeiW@ g)w^ l"X!譔8@vH=EqVvF<x%=@t;x"%O& ž@B06_|YwZy^[᳅r1_MQ#~ƯH5!>B|yUYCvtݜ?ܥ\@g؇,#OgqƫH,adiCw ƇÖ$n U@а d'ML=Z>6GGjѼ?'SY xWN+cЋp:UN22W $a^eS'M6u) Ap|lD!'0A֍rKӆ~Q'==J!LqT"4%]FϛhCd9A}3= RJOD䤡dFDe8ђqkܖȻb鐚`2{n$:A-LO)2tc.>>mtf7VTAAmGYYA |:Fnu#1|'^sM\Ǣ࿂M-YGGCb> ɩy'Y$ʏγ|i5_.IvI/WM.:) [ilIֈ8WX?r-iD:&{^T RFdNsUoypKv cf-RV&IZxH gU^ƔjMKT9$?C9bmI&,VNPg {jtSoeŸ">f3CUQNU3*:׆Py(U]mmĐ ۟PYݼ"VnBMҡf*jh/J.Z[\~ߣϲ+yg$<\$V)5Pu 3t?> cb8?vp;(ٌ{:ghbm3EYMelA^ʅzJJs`$\#2z# H1=D40+c PxrePm4 EzؽNhCI'9})2zE ݦ%;$):mJM7̠,reX=_5ш,R[~#9ZSKjiQGIJ2!;_ɯT&"-&0+} m5I\^tU=T>Uݺr<fBFJD|.w J0r2ԡbs؈u {UC`-Ev,b)QZ`p +9[&VkW-=@(pn7َtg,"}RrU\Z]Wia[8mRu"|WaX"PUȜi! 7Ŵ40OLWO-2 /4>~:/>%nOND8Q +2-PlFem?}-տnJ^yn3 MY"]i!lcd}q.ׂWoÝ`2-9RP)0Ě1OEa>b{W Te4PYJLl= n`Ðz3A[2q˥6p"O 2LVf8}2+пׂB[ȕ&QE-EDDfv v!iJI <VcvM$m6BmEM!Rw? tB8G7jc:/ǎ04Eg BNy6j6> _y~R'21±P|<dr?ұ\8*2nܝ)|u͍Qh5."uP>" WiOT=4~1hVo:=h/W)Vr5}mfB.˗޲Uwt3e!_^؋E7sy%$(ZS(dZDfl=GfVۨSmEhB\^PvhƟ7LQ* Fˈ}ܵ 友a@㓣O?w.=}"ˊʖ,4*OT2d‡Ot[Ö@:stZ.nBfLmMTa&/,h0\]\2cI*6X@!h~ī|KjRylpX46!#ц*&9QJ-}=BBr4ﶍ?}CG{a./>4D6~7Yt)(\A` k*-ã >p`)CWMoUV µ!R*#j! .YD|h ַȣNtO(E>=0;slf?Ս!\9^3zNָqcs°lN2LJyQS#45H) Π,} O}W%\h̤+3X A/83"7,Փ: :vr@\(k{!x/#e!p`{p.N{+A R;89#!-26 K֧e4Y-#TE9Eb e*J؏IU6lqیh~pl,_^{Ӿ`V+vs8,Z`>(ڽ*4MX?!)Kpx,D0])UkBUҨk{/ L2Rdjan!wS"\9rJ4*b!txeW6+$k9 8=h!:BcWR. Pӎ?Hu^+6X}@uJBkMk#oQ wo>9}3^/4Q~:Isu<|x\AEmDa1N|'_/rDMD egsi @}&/8HXpXTv6ƭUYfY6 %olsco8\rTw mEn 7%ڴ#41P_48R\O[D|RgPt^YeK@Ϡ}o\v Z`Ve1@4l{ Cr;kv)<9mh W݃o Tv\䟴jt ^境 Ԡ4 ϋWMkkNF퍭rIiW 0 C&, ,h@SGʩy/K1L2B-A[#FfI{9bCR8sH9խcypGL.ʥ=Pi0[V^nD "+c}+k](m ,`}g'g=$"ƹAV&F~ڶ?4]1Oԥ+GOь:/Npqx{InnXLCxϓ!" (܂ DK$T\K!qr+޴*\HPhgA+J Ai{×X.."~;ZGq-4n59{;] UXkd/{R}T(f9i yB 8=;*XTlHߗLyX`"VCB>g}m6P"ƚwMxv=ݳh+Btw*7O̔먚efV4sB*ȕ %upvEQl ӗ^ KbU+`^^{e`4/jk֫6doZb!Fsxz Bb҅>3" u$`!|U p@n $|WiY۴WxރԅKGig}lF5^RIoY&x*H +q6&["2M 5?LX:. 2]\2Y2J\ex_RVf$q èTE; [LZpD F}k)G_ <Ik 5]}o|(Ph5ȨV(6³Sl>շ>3nAE*T=)Xm' "6/>ĠhEI-Lj"Na^e#&y+RyD _8*/pi$PHZb Y2-#xꋊJEO>~FdG]p (ڂ#|W7A^ ֪$nJ֢KMthr}QyZ#C,Co̖U=o[L >x_?dT5 ?Zrp&jCqѝOk4^jQy,yD^An'I&1xW3mqd,WiOZF3XZ%HAg}_w!rHLhx]upƕ0{V7Q׿Hr\;6('Fuj~+d/y9%DU%|yBaU?m \}#ƍڙ<7F'agr%J ߏ97U_죰T.PetGUPO> lxRiD(3򥯭`~R8AmE ^w&|TD,T or+Zv&X$*M_c\[LbplRzڏGY۲˫nlQ.G)[ʌ"jw)$4d/d3 M<4ظpjWmeSUi`(ʷ5:뤭L#|tܞ\,| : Z 9 찞[\R}&PD/NsOCg<rFU^T$?!(^. gq;4/2'},4V2FO*>u_Ƈ+sA]f#$ʰn3Uh7P턪[Xm:i[aڜINz8:)wF*.|^Bݽdw ]Eco"Du"+;ҋWߠRNrEO$qy=- ]3Cތ%vwE݀"y5!ȱF]!:2֧̹T1?>?!3fz2%J,Gd~bn4[! 6K7\a'ph-+x PMAvb5㏝~SttǭcDS#dT}vZ#[j,ˮ%ȹ&odda.bA^6' C!G)IhT2-V.L-A<ocN7uYܮbJI%MBXzRlwC NKU:iQ*܊A>lrZ.'#5 6%`s`%Ep}wO?q"v\3C!I3ePB31vmVbKןMU}c/ !`n/@10$ʜ\PuG-}>*klf+oT־GĞ*ŷXXZM'vj^pU=K8TUEfִ!9?Hq_RC,x#A%lljZ܁e42T9H5u5r^Մ% *_쏨EvRj9?P}b2bLoq:[O-zР;22ڛ`(-]xB>.vC^b|q Gk?".ؓ%WHD3@Fڷjos 4KwjjHXYP_Tn3>uijK5na+,O L1tzg~-C?|o C)+9fH{-d&fTYqf Ky+<ޡGti[:'q%UMv']l{5_ $S8y胤'DcCg=BŪϩDphl]`5.NÃv Koxjfge$b|fjJr*G.ly j6 ^yB9R\4'Z^ `NL֧-OCt_w2l%u$)4p-NY*HBb*H@ƖJ5:a уy|6ZŠUi0j& (TY5mUuŅ6/?R5| ]EnU$O/:Lo9*?5SX!{܇H'i>ugw*}rQV7rIYg;0pړ}/ì?i-vC`/9>L|MbyK;DI`^"ԉLMZ*ݦg9Zl>a+;a`D^ىwҵTOvd8?. Mn}z1f~'ܮA6O.A0]ׅ>A"৯@[,B7*z4?޸9T-,J޽C|H}?; >޵ ؁Z2Q rRƾ*ρ eVh)x?ÐrGe9 G{j4:fE/[Jc2uW!C'ZzHhgeR/8GrM:fVy'6V8@= Iޟ-u("$Lb,Q5tddwJKdS.h sEu7۠З< ףCvЖjII!{"Q8rZ1IuEƾ9'%+-v (!$^\+gπ2?W)dk+h+ө֝Q([)Ir6Dl Bozͦq#o.P.39a.H 4nq@VzyU^0mίfן>8Da+*q.N:΋/oo**2إ/YQXeN|Q"P~@@3+lV}L[Im ;>L>>|Zc>##u ԪdI XǠ AʮduT'ȿJG~H:Cd$k?p1E;\iVkCƗk(eb!kLB 2|(yjG$1WX-˴):V oG:']{HE;i5 XQC_v )6 =Fu!XChGWquͣ `!!>Q^Ϳo#' YBo{AI5Yw:}h$A?b͞9mHu'99IdwEw['0P#?@ $q/9a'R æ/{}FjqBP)a]et>Q7採rݍٯw`欦M 1%=4"0SP!C^>kɮǀNnM?O ^(!YR>NC~u9v۳^ppp&i S4A׵w3vQ(\TcN@@붙aV|:<(&mZ)ho)|O˃~$}I¥p2F> n9ge kr#|Pd0ٌkC!Fߨ)\/YET. })K `\M|.NU[v FJe EWY+8tv4Ќ]LlT$&r-WKP5AAk-1AA9Ikk^fvcL^{h@1X&Ңf}fP[ Μdv` g׋< Vm|h ]5O*Y2UmMq}KB'夢%V> 'f8~QF%g;d&PCa] !f'vz@vTBvL w\ݚ `GQ?X5ض,l>6 6-݂cOǂ6s_*h ^aih,lr@ѼψvU/8A#a=f%=''{gH,t pr0J?.+R ƌ#k㗻f8x]a6=73nD^ 0PFi<,(ok6 #UI%)sylFy-*Kd (<~ۅX6+y '֌z}jE>qt11BX@T걙b 8š6EYzOxY}hI܀faXLBs/^TX^S"|0?Jq֛d&.3ԆT,ŷmnZg>/-82K_kR$)GvԠWf&V\ /^# \΄?s*e/c^EqYU3QVeGՋx=}s}4o:pZ,j0&D{=Cഩ,MD &PaG8CC@JCi>9"h cLp0H~ʠZ!P<)^Uu./-(Kk;B<&LJO+QM<'={^댶+H z`3@ IEDxX{Z* >/xfpa{L=Vjɹ/y;&J ſkyG8m  1;&KM:9(i~1ae]Nb#bPB^(;U,A5'|PN`eMg ʢ2111S-h$xRT E~D%l.,=.F)F.ud\-!5Fܵ=WP'be|Pd&ptN'ßYeZʽ$?]~ĚwJxB5 ]| U;{~b,x-/dpэe9#%,Dyvaqt9nCH`VTyC`R<f̞IyOo pHaT-#&|p %2)0pFb]t߷3ͳi‡qAtYYH1W/@!/#>ҸY%$0Ggt|#ox$}S0^WƱN5YG3QlaEoVqXnXX aÒN~{PZAJ@`|4pU=|PNyB08JHnQs"A]D\֖ls0RDRo2tF3 p{I㽣Wm@jZzu~wjɄjkS=W 2U")!f6WFbe p5ewhqpz Gza~/&@əmшH.Aw=L\Oꤦ\񜷝GJv9=}t<=BWʊd;!{h}u \r^'&X*MEPu^+}. O2 +lV֎az;WO4&]=b V~ÛqJ#8` RM1NnəTЊpEUEHmX)p+~M-={]syM_(-嬑5' w̶S!}UY (ŁJ%m E`J. ef7(HLK TC6s:P8/8 FZ­iPԭ4V0<8X;5vrUyqZMIA׵JcUUa 8nM8 .Xq%>0B's^Ƙ&{?њX|HV-:KU_T~J><]>x5Ngj\n7&6WQ6t$gUx tI>s`Fe;=\lёwiWpU)`AdGzcȮEf5ʆQ@W g@L.?ntsZ }y.fUA:`lhM UVT}mJR6\:r3#N$#||#ܺL~DNA.M2 Z /Q̺DTUu! L`˧{ aDJW8­w@70u+@VXWJV)0c@c8P vKzQӒSTեru-XW X`7W6 Vcnze'oQ?O ЀCp")HkWTk56J (&q9q5cNfa]]BB=&aSN", (&K/xSj-C:Ny}89J #+ s6W|ΐ%^@v,Xg'e+^!C]XI>^WOeVhdaLV`zvUѣc 8wvD$!  Ne+#\g.%*,O)Vpƒ_Dx)4(AmZrgy, uZ1Қ(fumQCN`9EVG tVB Ku|<ۚ)Br~h"+ct~&$Uq)Z~ Vfq;H}6ɗKkjݴ `sSXK%`,ެqy"XC k ps<M:' b=g:o~D^UHpy3ӶP&ܔ~"y-kzHQ_ Suxh% 7YhL _`=h)3\E2BUp,]!4.@6MPMU90e[JǞ4C<\d!":ܩ":2~(Mvް,͊LhV{T0sC%D>$T-mFe+ANN : .΃>NQ^@8=]yqZ ^͸:'<\yQw_;Ñ~z&}r޴&$םbQiM >IE]VP4YY~u4;Xǡ#ʅôɖO6aFzWy TfVw! `/f0e[^4vs8wUb m^6g0DfH~ޚvjɘ1uG޸D _9% t&\:}-D1QA68#~Ͱɲxnj8DobrӅ%G~,D3Ž~?yZPNd:Ͳn@7U_""Gj &.C3Mr, 1c8p$~Ϳ³/wIL. ,Zǡӛ?hyѭ^)5Dx=h" u,q>\ucMGKtǜ:#ZQ-?KCpMW2c)iW]0s yi}7yW3!iƖ>PbKƳM[MUȒФ=wgH@k::j<$ V^9jDvy$^M ^SV+)T <飂gYɥEۜ<r;*\:`MC rp5 V:=\JBcY K[w8[QuRN-&eP9l $* T/~ $ *K$0@u7[7W>'t.9Ԥpӿs]S#Z`I/˅x9KkYٌ_Dl&sA+`5$r%>J 1irOH}bn={?\;g*fݼ\%- j^_[(2~L8cXa&KRN?U"g ĐZ;W5'G6 GDVK拉 mlsW `G)ܴܒ^7L:O"`hb'jϴ|Է> poRQ$|1:{0.~No,%F1j#ϔ/d~ё ? L02U-M|ˡ9' atș(y"ڟֵx&M<=fA,iOg">m Ʋ}!LyIuOGsP9V)À<{&'k~)IOWl5[cξqç)́&J:C~si04~Ʀ2->B\x+}UdU-ٹ݂2(&j)E]:VH1Ù`r#"Հ@`yO N:1O'ޏX3օǥơ:GEJd0x()$B`YyJ-nӵ[pß0j=KQEJwG,u1n,-ILK|]4RzBz1,-I? 5O[b2,D<‡7WM.{S͊sJ5 2!h_畁u%SNY.ěfK:ә[3vCP6|em6m{ceC~ 3:qnEeHMv)ɗF2cx< ܜ|mpZlYXx6/^7w&uOT?S;etPec&H3+yc''>qRV2*"kl˭s]4%pJ<8 YF3̾Ϣ8kμ:8Km!0m\Ĭp@Kt͝u qu{f+x ,kIC jfq냀,G"qpeqA}6G @Qx^,K/,76|An.k5\1B3ă.VHx<WSXUn^X匀(^†r:Ɋ0D4n#rw:u:WI*@8('tV8yϩ(ۙb$]y0vF5lAJ냣2#2Nqwr7=P`6~>f݄o A as@aM篺5k١A z}⌬vW!WU[# ʤNCEJ%@Ĩ~s\2Z0o[{,f[9"T%]Q/Y)XK ߂rvZ+kt[lL[zDB:F F0G]%ԴRUqZ,. T[ 7N8G78b McT jH+v M!Cn7ӀN7]AVZM&Z^4ڋ~VZe0mͳJaI;#kX b'Y^zF2'NjYlzJM7sKhࠏB9axi8{55oNC6dUgo/>?&k 6cXWBb&{8P[[ ')Rm57:k$kez ݮl%"(K%S=K(X靨ڭ\fb8˟r Mr+ReX凌_((-N'k͉11+Xo= yFlɈN#W+y&nKK]_au0bi&)<On֤m=^RO k8P 멍?oL^svso~ >#\D37fR]oRNa/$, apwsVWirԻ3zlS&y=ΗZKLOT)c;CSKz62SDPS߉ I;vAaͯ$lJ{QnɅ]l:5؏..nף64%zj܍``mcc4~Hk'I.)5<`} +x2*~l+Nc5~vҕ }ڬk}ڪvR A)+T#<(Ǵx͟X)B6DIXirD"mW[yUzKo u*y8q$2헹}OKnyrAt/2)Lo=λ46a' _$EoN8T0~1&JGJTÀ< K]YYA!57f2\׃m.ħO![-bl f>>.:N=ꭗ`TMmV!+8:%!RQڍYsgr-W{am kox,hQ6Bfx!\Rnc=ƄFᜳH֝sz\@ΞIsXl 6W$% 'DPqzs@s` }2}ưpwa/\X(\Nog:t1★΋ӓЀ^T_=Oͱ0 &?ߡGȝ-Jbh#~]\<$:42pmA:`{[brl@+9G-.vXZ >ӻ8QYFY&5*nrÍprH;t VWζEi|3H6śնyb=uhaQ 6mN/Hh/BIyay}?X5w.~@ث8p .V~hʞ  yNjXݭ݂X"}+JxIW$PBLu`pVWWt}N`/aF9P*pr*vDzU/*9Wߐ?XUh؝ 29&U7zoBMv,^VRv]_b(p[ZHvf5e/:,w#o1 =D L'p^@RFx Ǔf9n0͚ E/-)#)YK?cxCT>t,Tzy~Z y>ԖS9Iޫ8qR'c5Š Ǟʿ-;~χ>vܱ!Eea%1kbuqi(DOÑI*k$ 9TK-/EL7D b*h#q.Ya ;s Z3mu L4af˿ׄcަFmYDі?nI90v+#\h>b)3 wv꩷"KvkAGS LaTރv2"/2L&3t  Inwfdj%5Qv*ҟ] #&-jP`Yp=-6ȵ1M}9`꠲!meӦɅ9clAjGWl;pby4Qag$uB:Fxog(Y=0{&3FIEEiqs;3TS p1t;3!gG oY4#yA:d2Jv-SAF|Ai)d%HiK5}|:n?wHԅ$C&l Cf>6Xz2ڀogzW:2yo+mE[|'f]1z^ 0|y8=C_=o{~Ya[H<>Z7ߒ{f_ׁmZҪ8}D-dwj3o w˘$E@O%׬VqDwSݞ{IYR_+]cU ;UIDC-۹?rzW7=JxkBxD}5\yٖTn(=\BKߟ8=ȠDbdp Uy3:$ûLs+pі“+^[*7tC.tΩ)'F˙S!9JM;k)"rV-LV\6=,MG:ݤu77to'/m.%Tp3 UAbNsT TAw6I~ R5ͦޟhTύK ]e,}ђ;$C̹"!G<49HGyyF1|>Jɱg\(֝OEvylCnjZ_Q[4mOm <8@ߋ@OFQnŪ]@?BdM}B]wOCi&vgHG:AXM';nKCu{ jG{ A(=Msh\MŌ dy(kb"bfzrI` !lcV<_MWln^"^O#XH"4F&Ҟp>eC#>(%)GM|Urq|@E%+UWcssSX?4DS}Ki4BGPcOaMaz(oQdSRW&cmc BluΡܟ?U%*',-bI`K-RB`YH)j7R[Ξ8'}p_^ mCg H(+m$t]KO󔛌 ӧX6UpNSKh#5L6lG1ʡ\lQPޅG#dPe:s V|'arA_nt^AD _RF ij`o1pύ#Y+ZeMyLs@4X\~ h^j'rJ'RFHo^*| (|N&~D[͙XM؞wJ;@̒U_щ%(+!_kyә^gf0ԕHQgm hӥP8d|RA0=tN#M5y_>*Diq+oڽtdC{"F$oB~ˌMd! mtY7h뺲e[9FFc?Y>C]mEki &Jԝr%Ӥ`tMM'?jl_\ [`gm 'rZ0hmTޜ3\_.\c6>l/Ou"&#WN.uc=;2ƦTt08]rwUY}"*GF±~Df{q 7Ug${çnؤO&iM#| |m.9g~*}hÙ~usUŋ#E77sF+T6/]zjtPig=u]q>7e}m>05:7@' q6[%$J.2E6[`0`~y=(PGΡ{'!k3Mo$Qh.b2h˟覒nR|'n3>X& { 8T -94ΟNME[@к j͸ BV&\ru(nP |^>bkXS ?7M%#N I&)ٕ}%9ؕɉ3}T+Rnʳc#AepPC16zLJ–ͩdߪ*8ǚASogQ"=}W*;Z+2w C0Hq5ge-ic[ȴs$71KX!W>6Ҝ 6 }+{NqSTl5g U6S:W0?.٘~>xy .y")lP_ gWvSV{h(PUA,a1%+hTxJ O5" 0{K==]J@ VaQc 0H!붮X"ZTnw<)U;,$Hv EsL:qomYj>ФYf.4d#byfĻ] A!_r( ͘d쐼Z?o-y`3$tfD!GE0~*&GAY;v{i&>њ8 C /G%bz@RgU'NM., ;>,:-#< FtN&{uu=` /riά7J`uf$_(cA' cV1 3mQm ;lqߖ~cN~OY5! R)~[GKDzȎ~=-k$hؒJcG~>IS 4_n-\X^gz}.&Dw<# =JNm/>*mWe׶j/NjuwFF 9ޟ3l~ta#}ns4!!^|xʬf-랄a:,UvƪmB"@;Cl?&m0m]&%RNqͿ,ti-lvR= $'Z 7V]ت&=w)W'xJƭgXfY|xM.R)nVIxL$Hx̾7'O_*o3ƒ HnÜf"-F*c$Mk]Qf6D.Hj`d5c=fBc Fc GMH5Aa°W.@Z:#:P ܙ(R31r;?@0:/D ]n-5p1ˀ))0Jr$Ћ∉y.  T>aB+穧L7Oa%Te|eMMά=yQ+tjtIwZYh8K4oSA랮xp {m/c>j{b2,QrHo(IU NPЫP=TK J;'V;L-ՂS^~@_hY/5׍h1J6ހHv21y}K?MRT}\EsveWmEKu^oVk+3<( AFiOP 党?/`ސ@Rϥmm7p<ٽEBwM I@X8c{+-\( fQfQn?DJ #VABl-63hh^(8.ʥMS$鏚sVxrʫ#?ߙ;P"ՍK3gV(|uSlΜ 'K( rNϵviKsKkt Đ+{HIZŦ MbC{wk;pT0틯r0!`:Od5XM#'n8 $CS?;'4lON;Z*(,}$PnM?FMfH&; P]jMǽ%1.p ǖ̚:,KZjx[`nѱ,h[GhvZG"RnF< h_P ZZ'%qg]S&D"Ex/U)weӐhL͗ I )92OVV>5i5ue˼|=Yc\*Gg,(h~~}cRX$E:<3vLDpnE5,HSLN R_ xZ5j& Įq($9)=]cbgmE,RW+f3&?j&/4IOs-1MނHO9o~,_|o 3rq Ql̙K?L,KSn EpL0gѓ kݞ:) ԋsZωͳ$AG޴2sMy QSø"e㱕mG\J4L <8KMXj}@4p-՟UM$"UdݘLY 1">. #[2}uʣPYAsR,ԶTMo&dSaoClIJ*7a[;+lgs xUI#5PD=ԍ,xǪTKtq(<(0hbGnb*zX"[OIvQc)gf)ȄVGZC8eCnX@p,w%Y6ÓBO#ngpЮ6{='|l*w9m&7Ϧw2(oLmMa$FJSB1fL^a8s* trl0NB31ӂMv]C5UsYrגbZ0dt, D+z_!S?y6}j>gng ]'1"[rՃYЌ)ew*-F.j-ޡG"w H гtL?bPX@`;Ej١ QEv&P"ȵxrչ9rc0#DG`mO ?iu^8 d:+5ָ;CџBzLek<ɾϜ Zy5ЌW0%K(Ugl<)h'ApQ;Uȵ\5ͺ&@}`bGRXK~ʊ'!МL`0I&"o=V8BvUϾ|hN_]KCw9P~(]zexggc>ej y ^6#(PtamBP? by,w#;2pF~%(C ӿHˆ h8#}|Ǔq=7xǺُ:ʶY*8\/9[G4xL~@U\wL dpo\1$=_m됣ު!=L>%'O 8@ȶq[Ӿ I`7r4l%zwO=@ijqu0Ozqܩ1pxW+K:a;Sa7-ѣn\, CVٷx6O"!~œ < fN[PJ7H!Z<~)"PYM"x3ޖ%۟wEsv@jO^tw^ڢ2SC\lA/)[VD V= 9p $ߏ${BdܥX'}oHHeġ-o'4>\jFEyeO)6ڢ5h^ɐ f[Ho TBnd7 'ij[NႷ(q(USdYB:h?ƞ%Xz wשà֒ke;rT ?\q$䙤֍73|[,d4˹kZH #rk`,[E.OTo-8#ծ=z;.b:< J C8ٰ,CX <~繭hFm,ǞYqøu^@|r Ӣ|u:0GŽz" ?uK|ù/>Ot}rM!lr '838x>_?<xޝ, h?O,-]:>H1ΐʮ[H $#ɉDNTHkĊe'ce֔5whA#JڟmY AZӐ#|}\;5G9 }^ tjo+iۀ/Sj9Wb# ZȽ$!U a9lg]Zg30z گu# z|[L#xqv 3%{0΅Y!BjXIh^cO7MI(]+mQĺN>mC4. >*h&trHÄ^8WX拍]rԅDe@"={ 'Ru۴NUg;ҮB}':hg85WTIEz"CvY&TO,BIL+?0[ t^諓P1g䢦<8{sM-9SݘV0LX!XIܦY2%1qc{UCHtUQ95ە% --Q qxIY0M0./0]Fkqqͻ?8)cB 0>n`?ǎgdnGt%|pvwxKW /D^yZ >bbRxX+ݎ*Woh7C%bM ♼Pu,q J lHۘ~}!bj!0`3P2}sz {RD:"?;#;n\C[6 VkU\*OiWd= 2eyz'υ=Uޯ@B[cC:WcM7lx>]m^jH:GTi^ap$(䍪g4h+ fW|6`+~( uVȈ~fWrŏ=:`$dLVRyZ0R?ueB^z6" V/O>\ϱϞ?}b(2cЅ#.[&ljBT 4u3ކªD N7n-9v-U7+̷=c1>v߇my.#rJ9?ve)\O S]ȶf]vP pޯMQ--~ŃH[Ft"K_s-ffAHsRzȍ:Nj oqZV j|4v]sآ.R̝e%8v|aʐ7A#߷]$,l99?Sz Ԧ%]?.5 OS;3"*~c(ޜ?6pՒ0pcڴ!d)a,7nS+ &6!o3"-=BQ;6EE?+InT0p5>e%=nY@ur"Z`V?9|-$E*;4lj U,u:`}vl[+&8?CuxRX|T뽶zp7T6 ^@'^P[ភ4vFoB BlZJxRp:5( #%oy:L?rL*<3c 葈&$Ŵ{u~=0$rH;m=inkg+2jHuZ`u/PG3+Ը{Ղ/)'c'2[Hj鲘,r 5X`@s PCRF".?qzm*"dKtւA~DLsH1~dV3,]3 WtGzurZx)l uDl/פTZ1s wQ[}!ְ7L AŅƑпkA":f~1 {0PzD{O$H@a"/R6w}И*Ҝ3PޥͬM˥ LfyI.<ec$떓:yY:I7foQic!٪~%Q{Wn>P}kd+x_F矾‰c\>c8ޥh{ dԅ|W!.[^_&d Ҳ2>pUm`w\LrzZdDt&Pabn`f\'Rj7=Np)t1`))<D[#255^'<@ 9Ǻ])_, 筢G?=ơ?!tNQGګ<9RCJqβ !S4#poS}Vt݃dnAH<O|.V6 =6zTݾYH4˙nZ{ޱP\P.Ko;YݍAԃ<" tgP#5<&;:.hMj6 @κ8=E`LԢ[սmH$o/E&mâp|// c4(OP%V+fϬ1X]S٘؀13 jֱ2t gBRs߿V&W4FEQ qe|.¹H-jI;fQ0xҫtx>Ċh16 ~`ۈRI7\~/@%.lhX3T4,W=˪QHDr);%Q[dy fQ0K `U֩ЍsjOʇG9z fK%ΰ,?9ݲ(jݾIBYk=Ҥ:C2O.j@ %/Ls?hWP|j"zL2^m4MB7BDFxPI}&cpQ` 1-BPᾷM08@r)jJ3x l$;2L6vh; MH|h[7A\`E^;1 h ˅)d̠>Pe+`I-1Sι2n 3I,SU\൧STB^'{+`$w],C?LHxmhԩnedMa -V ϯ[BzpԖ'2*>$ZӛʍF<7&:^y~` $9\d/)\Al舖+W\`$sm~?/Yg&-B㈜8:כ>x(5TLgHdQ3\|kn@8`gFX\ex(@@L֤UDKPu|QV7^62]n1_鉗lBmj㛦`AhH:j(E~+wWǝ5Z G4whc9F$|xv!<)nr ۰:FʡUBDž+v|v>WT}L̋V9Yd;-D^#8Hv/j'd6`:x3AfTTKiI"/?eƻx[,)%ʘ(WQF H WraN:+FuOq QHx4œ+B]9AJDRumzЯ`x]J |wˆh[KI/?%OI2bc" ]duB⎙_RA.퉖*lG-7nj+f( ֯ouPAũBT vXXhW)5%R 50¸DgǸtqvO Zs/Ro+=9щL-5AuiXzu^pYR=DA@?%;D{}NH>=9EN8yQ|)Ҫna.3VtCG)\5-5Oj{7_WƮ5Q[L 0?0ŴotBʉGuNFy[nwn'.x 0׽KZՂzds`:paۯoh98XYQ49 FV~Ul$_CT>q`QåF2qrNh):aʼn~dߑI]4oÏJAugaS̓d$ָJI" )xrڢVuʏ3_+(rGM?!ey\O\co~d18[J$E@ 2Be:`Gݵ;: l52I"~.o!mV<ǿࡻ<Afh%~-M\Uy\w_j%)NZK?yo]{.Ik z+Tm2r-"q(^OIX:vܠ]pɟr/v1$e5 V܊>XViܿ3K6A(<d2u_0>{קg;8?-js-lXU@ Ѫ9$7Τ #&|Ҳ*1(7LO|c|nz=A\K}hR-_`*Bs0EAA4=V{Obx@A-.al5@xҾ]#@`\l'WJԖ;>45"nd_6S}JH(^hh7K<9OfA9Y 8/FccΑh),^6yUQϕ qE2wwhRހVJ<)RSO>hF~6N Yʔ5V5nԏ̓~v37QS06i܃jl4û]xWyZĎnG%_fUy&: QlזAG<'̫hzsXM@xV:XlNrn)2(iVva}JT$W$OW".ܔ␓i!f%ʼnz(*XT;C}0':H'JjphCȇ)'ig1#+Q{ub_Q!ãc_M74樣r f.7[1zv6 â;nηeސ 54T CGty>}u#e;0KDK[P i Up+2~Ǻ4'ҁk_jmq S.KF'dxshwZh g[c#Y_ōߌ0PSҿ zb퐴3\fL?~ 1`tËD6:&ڱ6ZpbZE@΃gc߅K۔%_)g$p bVTo @,Wp&oN~zB`&Jv2sW-cEr,R144A-)hCh_[)銿8`ľ1N!4pR8^_B<3l#yQ8@ њ> 7lŁWN0wsQg[m1U3GI'oBL !x3Z%[4?_ٲa:|yMwKbΓ7g0N!QUX}H W(&<3Ysx hV;*{DTdV%تdt_!׺T#L-ng Q|cv]E.&8 7m[3B;~x /1f3%ȭvi_k KbŶd&52V`펳EQ4.G?Otf 9٢Ł{+ܹ^X,C DJkV__UӣO gRSr]!%|u|^ilk%k.Da洘ٓSڽ/ ό-ţda }/tp!#sK%nq Hi_xx8c3ۉ[UKW+^RPܩRӞz sr 4Žh^dXaƦ'H<ު^A؜rwTРEb8``.*zqnnRR/ .dP9AB^'5=*PxwՌ)迬 G A_ BuSMA͑3#]tr?})Q-&)^3d^rܧQ8(T"N}PS>)eIa;\}q10˖r`a um6=w!#VEKJ46$v%8His:F;rlW-K`ྰZ"2Qաba7ȹAoQi/Wp,CUO$m ƉS7'U& Jae]yd %cNmV7\, 抶X]σ93#5ЄtQ U\7 #U vY:)d=uɒ;{%*q}`9#=k6a7 I>E=.;Mߺ~a|W[[(_ZʿO'C8hS _ d?QTͼ^F}1ʁ. I}_fl?\)O?(̰VNS36hF,t‚B+rլ`<UZ=Kg\>fHnGlkhbT9}%nNИXߏ[/ _s_Y zXFho /g |Ћ(+OoF=}"'g LnȍX CAt} cAIM}6c xvS@Hƨx ։Ujƪy~[щlYz¯a&zO} HLx&U4xϘ*U°fyQDlvLtI2/`sPq._'FqqS=@@c1N7ty/>wK>vJ*іjNp]$>!g7Y$/x@`TWKKl%PO?&3E 둋htl@vp2ϐV=D+ǒo(Om?☩qٸy@t%05QzXJJʴۧ`{Iԭ@"~h1}q x; $I{KDs$J[p$pѣw54^̯U$j-G'(|F1y;\+X Uˉ325̲B|}%㍕70j~NQy!KZ f\n=.όե){]{ " - 8e*=7ÉV@`')"_솶LG$(JD= RVj9C`X2[t uw^٤~ @d?J'4W\IG:D$s0@MԕVȃ,9 q %>L.*F[[ZNdu8pu^*q,ӭWv .)ap`KOV/UUśb5.ks.EeU:{+/}4JN݉8Ch-uݙ lSX$hF(]x{+Gfjsw H$Xο0=N¬ 3\.RDXe%n,kO8FN&qd5Ν//=J |T5Re ;WAuʯbw#o93%uǔԒ_5/F̚@p_aC4yLϷ6 )ySsۑ!JT0NcMTg~/cu(/c@l; ,}\B7f!ljMy:7XpԵ]<%=&"J( u-xUg 0 Pg*j iJqp>3s3rT|> 75%gǂ9#91J=7mPnu٘_X|W|  E`ßQ$$wbxZ UMS pܞt54 BU=e Je"*r?^' SvI&40ږm+ ifg B Z iR&zA ;)#|ڡ'7}krvDA8jN!XV-Fۑp,F4:;&~ej ]` Y ueⱲ$u< 9ѹ*ƈyMbP)hZ\X!y{3Sa0_)^4P ڋ|ǝ+ݑJYf_j|A OffkN"c^KX@,kh1#`i 9[BؒDf=NiwJIm$4θ:D&nI}_/w EC!W$Q9š}_K8KX7- ٭ݎN"6aQowcIV_U˓b ݳu0uU[= VɜqrTBl2KPNY{Zp™@ ^3ĖWaea[KiX[45fk8;_1քA7ˑbNOODqKo!6j *jgY,K[!{24e| i4J~:v*]ឿ>-Cn؅ev\n}uM8gF $i<;YԛfX(G#&s՚9^Fq<;#ЭR[qUJ\WQlSVJ]#/E?= 0W5'%%2]j[ mQFa}`x}c<4.z|}+/ꁐ6#Q2gXMчF 4=de*bB/[zNO}K1R@gAFwO@33Df1Wbʙ=xH Qt{aΎh'.F97)5Nk򃣈9MZTN+М^fUpIpө{Mwe"5q-Յf?ͥL 4P0%D=Fo8X b0/KO"jc\@P AbtO;FE3<+B3.?xW 5kTp;ߓS.!-mӠB3*^DQX h )R0ISq=0)>sq"TLo.nX^^8X8\2c ]Y9<&ESX!noUI$rwn&XI-P#XqQux$ ҧ5qB HnG+H-[CRUm`8zK6v=k䇣t.d--a2q7)qPxaiW.ܾ0y?AF1ci*ȬN@aV`쒳N;faW +ĭĺ+[wkڼ\|f+de;06Lzub {KUc >O9[q]iBvF܇ &(Ѱ[xyPjN=- N Ěйţ6|<ܸH1tyai.J̖S>=IWҖ FL~ѱ0SiP: E kC2ɚL9|=䞇}MBlQ‡"u%bVAi+~.O-1wZ,audT!}3JzVd7k}7%jCr?=8j~ OT"gTE^ 9Iux2Gu~!ǞYZ؂yޤ=FH&, `x,*SHQ}%00W߱ҏ9~X ZihPぢKrd^;q0Ƽ7Q;>dj<Л}GtP $ @"TupF?7:̨?EM"=1 ; 4;In" fC*X ie(<g(0ӁڃhE8Ge\goVX ߨ298A/f2G^ T[t 'c2>/)/dtBP:Y`uʇ&(5g ޅ6ZITd^6kmplwʡ:/m%V~,<}1,c5TBFFⶈîk'4jy+5KdfBy顙 5<5dr$l"Ո-2ʥ,!>`Fb*~*v\i hP]i5W> _?!`: rԁ'6;.Ho*|H:zV Pt.;6ΧŇ%bLWMuzU{+r5BKNN"I 9֏\N >iUVywG%|e2ڲ=$Y_nKʢޘE~L$*`vm"2; G6rCQu7i9ZÔ/nUPd"eC>g`#Px~xU&ޖ;#țN1v7 ع)ɔZ{-vL/k3췷1\a9Lq03nbi"7Ļ|R%V;<]&R]qI=Qu=lC p3,OLd|ڐg0+>F<%ce%b\kE2ƪ_0)/ͩB3;S̚hGKE !/qrI( H_)/HߘV۬+Fuh@" l̎J1$/@?#sFjtwBvJtmWM6?iV%r3."TfK8QÐTfStGMe3Z=ۘ/v FNiΧN&SBtֿ?"ƹ5.1ȲM(BnyMQ :. [cd~;LAl`C{w~|\F,[%*{@w`0-AsMIe>u:TXŏanIB0F=,E7Zyx $l3CkhDZD_g_ޟ Q90e_@v$ݾJ"z \#4loJ[1|&_WSr)z=-G-\? g&"7\$,J@68ڭ_8OE?%ݔO<JzObY1 5N5 '[/c,~HtklfY`n%5J~hYwu&'L.Hr%8Cq ?CMk[4-։ 9qkZ r5jQ94ԌI?h^.ѬSi|'hZ|7-¬j()JZJMz22Apdi9oF&9gخIw|'7P(P c2;bJ+O|a-$rAAC^ i.RSBH6'O1B"fGWII? -:#tQoqRCq DDZCD)'*L*㥂+Z3L %d!Fj89aP\!1Bٴ<#r S L#&rzüsMF4(PQecsF-SCêMck=*,]ȧ.@_@L&/%J @w}#$N aEneik\Z۱NCe*@Uh6AJ}aSF\Ϳ̵(W*( .SGˆ P~9ḧ́+C8f!ĈnöN|7 PK]vE#?koh~>BljyF9CokZHhK &\*{ȝO'nwC8"b}oRNR@<]УGT_29'饞.4~-adt=g+d RިwH{1FrF,/.GQkn͜Qbrc;(1|" >OD$f+w8Ԁ)V{'zHs2,mK V!*W+U;11*lv(2=nIR,ERAr1Q?!d>V, hj⋾# *GM+$zT:8$Y9ā%Yыo#‚vxm-B=*]`{h1Y7>ao,w;; n}>q jXA1ZjR^X|֊ /4l7}Ջ9t⏷WSd""7dc tؠ(e/Nt>C\oCU4~̮띓0i|F5.'6s?n`! RyvY.(Fs qNND4Ќ(_g_-#]%CZln#a؁P @- "s`u t U}{g)c|F IA-(,;fj~s mZO'os4!l 0es ;yr$GŊ+?<֔FtV^}5Sn/aʺlR;11<ye0YtU :)`?n{Qmn5 I"gF;*n|2I#DLWH8yeF:`f/ ^$z Q ŝܶ[XD it(}>$J]ico~ yiկ~7/#2Bgc?H ^1`j>]4ѿC/tTq<-YntTl'Dy]&[_$o+&RHyJ׫<N_ă{D1_N]']Pn)Ҽ)WmZFv=px5]RCu,Uˠۉ=?GM0xB<O]…U7HtJXCn=^YM(fU7^Jwk!pvqi|ı_A >.9)dF >A<<М2VMQ #~F!]mԺArz_~WA =>@LQ?l4RsK*ydr_"MJ]``q{lyz{l(_"LnƀT@sˌr+ވ^b }ټmWFQŘ }N[ڴkMV %un$s"-aRy?)\Q:tkl(vz}U4N"{If:'ǭD mDhOy^K*=zDJ\Yy = {K[T 0blFJ Zj* HRO񭏊*T/]>ϊ}|CZ*ǚ5|~psR~~aFt`JE꧉S}>\>hٍJl?ctNyр%e)˪`O[â`]>eazıazahxYP *A<+rYRKt.bPF9[h5TD~Cu2xj6x=s1JS O#[ xOslKH?mjS6ψ +E86פC4HgYK]z#"'W$j83TiU؉X\-ǰY;ԇk9rH.{:_'0H$V/Y&Px=nH-X'Hj*'TۣT2a)Tl$VeӰzR;ͼb#l0(,dh"ݩKIlO3/ +bT iǰ*pW<KL6D(?G5f4a֢ͩD-6~Vȴmx>qD¶D-NA7mM#mj慨1Wޒ]卦XJFw8"%B5`Fȸg9+Y0yxmLT\f $s:U8d 0]0p?U67^[;gc Z r߄WBI__N`(9)|h ͒Ht쩂r4\[L4rUb{*7ʰNmYI?o AV])p5 cXZ9reuK x䠤U]?*RW;,y IIО;498\Yb]'!+`bc>;h>YL&Sii:Un3;tpܖF8 ht]:y,/oh)FCe[•2]qP*#кņƟ>_yꭥAi4 !D c5Zj'^l(}\ 7"&\(Ϋb;HqN,s=ύ!4PC%K3RGK밂Nrvfc;Vl&)R &6( !TxRbP@5$$I ~$мtQ` bi>Β~0ҋX>DEiIixkMg kw~G#`0ϡ{9iG-w8zJ.$*+E }H,.n2ZgEۯ4Qa%/U ]sNN' g3;iL 'ac k!( ~r>#5^9h)9$mh..]|5bƏr3u 7^-ld^hT}%A M*[:x*(dm2؝z" *$RRTsv5栫骋 s^=6ʨfzx/z.<3MФ* 31S6 Db(^h@91줍뜍K,0a_<4 bŵK=Yrd2~w-\,հ;x-d*<&xYaw1{&$H$ 2t({ةHYLOw!~]1' J ! Q=v74Q^[YkK 9'<8%+7]sGM>Dq ߨ_3x4EUJ|w-KytR]nMVpP|ѹZSг#FP!M\KvɍԉH%~;%rkcV^k-g<%0bndW~zДKφ-O6^㏛̴hee*ZFL| @CMp&{+F&˸' H=ςᲔ[aY lF͗?o1X)|V3~ˉqr pu3,{sG2Ksxจl0Wg}uHG07dY!o~:yp8D450bY:ڿ, 1*K G뚻2kGc+ vr}p&1!L8Q# dl;bRO-&@vɉ3\/AP=L`7诡& upm@!f~k'ul{ 3pvD.N]+Zw)X5W/>oVNPRNy2U]M = p {/չ(ƦQim7NA Yx@(yq| Dcwec7\9 `96п[=/bsQb[5-aŅ g1p_o`6rG4g2"{e;a&&)*ic(MYj:OI ߯:O"NNߥb'j~50T#M+x.HcT{np&Iod&LZ (?{hshm(u ?-\cHeqY4|w]%& -^-Y̩6($-֞KpMcn ^ƫmNw ߯JG>@WKᡀ JW? *ǡib4=A8)@Z&D+234T@X4Ei`쏊0" *"Kt@MǪt3dx5@X|hy9wۨtּ(nZ` CIW/dة`>9m97h/PY$]"d:)+ב/sx@]$D+,f4rPGוJ58#c҃C?R1-wP6hD̷EURNu1.cX_2K+ps= Rؽ]|ͯ0F(=f2Ҕ^ASZeG+ {,! hrų ԉddl<\wYA՟ST@Z+ %evZbʄ"sM㮑}I\OQZXPKX jU=~޸Civ. Z9&2nt,?W3d S"`[5ZQE~n3 l 4;ԁ soU6QC02Yvwܰ$Eבּ|ign.yuŹdv?QB6HqGG༇GDXsmzF,ԏ(H]vie5ZS@j>6!@shc"&0h[aY8Ri; ߋئ{ xaCddtjWx(r)2.&T͇3J!t@y"4yM|čjØ6'%@fϲ[sd'Dt(c̩I显68-xp4Ⳝ9x@ y-W-y2okx]ҿ69j0\;4`y}k+0<&ڒV[Z&&Z*2~[9pDҊq"P*lXBb:m kJJt@.xmq\Sd5m<`_򷇵c+,0Z&K'\A`Wn]+ak0BL!DF!;/9*;pD P-tZ([-aAf*lE͹衮ʸa6_jZV b{76NQwLԶ<2'P (=>gyDXIUť_! v|o+&~𙆱րL RP[XnǻYoHs\2d-Zni' JW}O^P:g('km?w#>q|+ WE;Ym wk,Yx&NSk ?*9Ov=Xg7R6xl $( q?*(_޻Xmg`ĕlQPʋB̒K0ld WXbA[i!0G gMMGEi UpEvNAzwi:*DM~*\tt16^]TWtţN,d^1 dTZf,a45@{q1jL"z BrsS2DxNV!3pT$8\Tk+s5FrnzV)XV,LKb-]`_S5*t?$@!f:I^Yk6WT]c+_+Z†h_օAbDNO?.4id q2z,Y H;x:2=mCKG{zTK~VY e%-%3W-x vG+( 1=.xK}<&qa_5ڕ-,9BT Rгk0SWnY_zRk耳 _e_. Ja|gq=yӴXM23lв>rG_92i2~:R|cpGtھR'Wd蠍qxoT Q$-#y*n n Q+!K kH֔7|*G9$œyzrbU'Y=x;gF?^bDn# (:[w|8{GGb7UT.+`(M(;F8n ^3eU~*xl05N윥@5fAKx=2኏{cMhH6f&iSx찉}zi,dl!*d}@I2kx*qoAi47-o%cYm%e"QMtFٲmyu+*ݰڪWו>9 Jg7wh$-YOْ2۲^[ivЪ)9eS~TDۤAؙBP\ܹ@R:7XC in+Ґt`*_ bI:lLܶ` LRt]LIڛ%Wo_ezfo)+E10EC).W<8=2O*lz3:,H"Yۼ˥t:yBmuKިR$Xt-Dr/[`}:.qd$ nX- -)ӅdLC3|EEN^0 ^|M `r{<`cޮq:4 }^,5 ,+^_@J><|S8*`1`(r#5RVCPICQ̕(;ķFVv n|&9:=/"ˤi7'Q@(`ޭV^ܿeӚZ* `t))5+lc_hs锍 (3g:2k)Ke%RYQ"وvdp@-LQ"{|onZ;mWUk ŨdiQ =A.NHC޳Ux60ݪd쨒ȣEDM'ERz*dg>V#۠5$j#m,«+\AFcCkB`r']Ԣ3ttߔVRLd}26|6xm&y)1V $BΪ7bKwGK$,m׶!LJ1 ݈;4;&+u:{ NTy''B=b`;icy#u+v:o;RBz0'I|HxJϟi=qj0 L*W59 la4LJftHp}k' 1^οぎ؞gQ-brף?BJ s\- Eo q`a}b!\d?wòS,؜qhZ&yOI0ɓάJĊm,|,B/vkGϔpF/qBx9]Y! ^^YB|β5u@RbڧR協fyE*I(Fv{fl:)Dj!JoTND㭨Lj,FUPˀovi\?hsq</^5> c֫jdl#"Hr*zznd9t[zI6]V{֐3sOH7yZlPR%/b\OI/ǫV%h] OykCFِ]bN>hSLTJ.z|)yM)Q+[i!%ʔޝCc@ҀYyņS[1:aJW pG3\ÈmZֺL!˸bIX3ȅüvR> W79?CC \T,>e&\{&K8N{WJU_V ‡|5;{Y)1Ω$DDKɮ a*Sשׁ6PvN)a&D&@OKlA6CS8%[6@GnlY/Xnp$؇9T:>-(]cJ-@3?O;)%}[h;* '(XVʵxkPG[Hg4͘,%"NwDt@gx_y 4ET"bb~^ӱwjcÂ|ȶF"<(oьx K~:>ƍw~d!eCPK\!lJG3wQS6 U(8/1*ʾn\mIpʬSg<*DS@NnXgFK62&Rv C6E2^*݆n>F(hK즚d/,sx"7YX?L)S},^3`"80,7˥:d 񣟣M#d &/oRtnz(Lmr^?@*MtuO!*h9WJ<Et!4\tVB\_Ͱ'HH/W} >I5o{S}vu{HgShak ȭ@Z+DYFS!*(tXyoð>א3)6C)Irfg/ēJ?3_nu}X*p,@Dc8)d[8X6j]_8`+'/4}лu?xcFK(2 TFt=٦Ʒ uwf@]*r>~#, 87UE gn("f_9^qR33ʧ[y(]ȶdI aDœvޓ* A,q[fo%bx1f']` $Iߋ gC&"cp,}F6y8 TZAi QQFCІZ*U)7WQҠ/>TEOZNHWg{]2Z>|+O*PR :ds`7;X;`+ ZgmHۏFgpgP 'b`pF0i <$6DQ]+1H8Lw0uI˘r~E7ruc:#xǖD94V&3-L .N 5G5(ن6}`Y'Eb@Ē4aww<*oE~9Yb; OphjdLWL& % uW"K_9u Fϊ.X2]`s8TbAi@@_Xnm4LJF(1.i 0?"6̒!x88@? gFֈmW>iBL$w囐@#P$UPn&:1G3Մ#ejg?N`11IZRlc5lhDiirX1ٞQV}n.bZ39TV1hFOU@5Q.l`!fWp%XUC@dPoXm)m$8r`P&a%VLG%S8 =c EM&e (m„zM,1fre pBȰRP(*v2Iv;ӋnTP&7!Fy0sp<YiB&2Ce X ueHWn "؏%g%R/@Ć6ij٤a>[–m|!@܀0ŪKhчCC褆E2Lq7OS׻2!«Fun:?1ǟ ux2N=d.?YlV2#uiO&E(B奄tq_hPS aZ @Wi/YZ,2Tel#u𿼚,Cٿk,, BL`"R7DeNrv8I}EZ5e9x7=AhPGWYq)0ͧW ;dcJ :k:&oP s٬1`QM [m{Sd;"}e47KNi·06P^PkQ֋I'gzˆ#<9oelu$EFй|_=245sLB7ZϩWh6T#J`>~)$32c|x~wӏBb]]$Ff0~<"sl) 9j gr!ë7 +ZJN-OHHm HU]$iuuO}RJ3Z,hvk-Hww<0F/^$9>LY+eN:9`|:Td {{݄op,nG9Ra 3dg#Em׈ZI ۗIG2+7@ZӲ* >-ZL"&oYcehO 0'|su7vE,3IwM;?|g-mR\NJt!\k)b"CF00ǹp* m&ǑtYFH_G+ne&p#½be.hl xY5*E=>^ḵ Z[vQ°ġvXvȕT>ex?CBA{X(i޻nD_TkqeGVU%H$%&QPfpR>2GDyYj)NLe?f\yDSZ ٰ(-1]dbup/Գtv1H೉OcULR T T3G~4 G"*`k46N+ Yi.y nn9-yk7"6;3ؗcqEG9IkULC;j( ʱٻݶ߽NF{I0*UҠfh1iZL)u./QZ [m>C#9Cy$gE}LХ8˰Ꮅ)]d(1xqONA]LFCxNF&5֋u_[qMU`MC< Z_e@1W5x=#zևϒt W;1 ٲߢH_Ĵޟ ՃnF"e@wk1m>.2mAK\p[͏BfHZtF4^iB>9YO{Yi ԕggE 5hNH٭;~@X35s>)-te:aj"L q-敤(μ HDNJ ITsuͷC2_]J@w>ܵp~\ԏ)KCҜu?.c69 afVΌ?ep_]󅛴sW'ڹ1#cJGϐa$ac.\c".VT+CNCbqd=mgX1]a}xY~]EA*NVcGۤfK? +?S I쏎oUQH8hcy]0HuGjqt~Q !]o+Ru/VA@1m@j=üH>kT䖉 'θ- {{7ufoAA/}cr`$mmNV`b>^`˓<7H5ݒ5,6ozFn}tl}f\H`^D JüKn^A_GL>K~]ϘAÎ:9Z6Ȧ}nG˜Qz[bimy/;&EY3S7n>^q ,Fy/ED  FqĶ%3C/sb|N>/t0ɷ ,)SL{L\H›>R1X`#Wl{xaOZs+*g^xq.fliop1$i8,**.3\+6ˆud@u&4+! 3;|D&iSTZKY=:oKk3(̾ޖ%(ǩ %Ϡ8](%źC|YtOtMx?ݦn+3W/}F{D7N(?>n)M7C2/C;]lXBjIZfPRNl_^%Eih+%W(sXW-zuZ hI;r8ظA^x<'In R.\&|hN>Pߐb$3x^Zߜg]Hubd}uylbg)1Lξ_2X写5$ŒȪA0F7o okk;wD׋{{Qi!{ *;NS(,7k-=.$AxVy*P53/ b;pC,??#KN9Ύ»}͟bwsk@J&ai@1k$$f [dL,]p #cw+,dlƜn'vz,`_ CItc>4B,gu?\Bf,^nߡ-&+BgtG5H,)D>ti *qh\gbȮC!f}d"!'I 3Z ce0G$l }Avb _PU_9jzDi,6uI{GYwae`X8PAj~j8f] 9M%>6ytD:E7[Wk䞈ݛ E݄ԋsRr?4Oi"Ū ϱDz6üsq*@ut  C0|6PFﲜl$ؘ+5F^2:j/wCӂ(pGruBi4k!< $:]̇wPs1ܯ3lٍ\&GSR@i*Ol4nCKX} !(_cVċ22܃n$&s3'ߐK"Vmh̆ f&'^٣RʱփdY uɷk?Y3^ WPD}0*rZuC_kKTHfPcco*tnN!"HVJ'U+R9$; ㆚\5.m nDd0cӵ6?f23nl Au\_g\S÷̡iZ/˵n2v E$p/SZEO}<}P_%e^k.'`_ѭ( ;x%225Im{ٕqׇ5^ywr83ki_hwVaf.F+qmEU dveM7~lU%]q¶\j~a4(=Bk9!<-Z|8n_&"_?2n ?܊^7]5w q4 u,s/JELű`B)>ow5iPhh}b@ܯj_2-@_fQ">)Lqo93"`aL6OY@ab^JigXwcNl(mtNpk %wZ05m&nTz(H[#x~1K)=ƖC$YkE[ OoEiE!aբӱ%ozyyٛye7c12*z k0"eyک+DebֵCg_#> 8.9qhB)RQYx=~Z)(,8ɂ] ^G}k,2-#4(s7a$G8W7k2FLRsA&-#0}a܄B'$+=2N -p n (q,'ͱ bw 4g3_4dGDQ~uqrO)ތS z 52bavY-Ftsox q(!f4 |y0L0s4~hm F'1s-"k%+\!z^uX 8\Y^q0CJF`t`^3e!´"γ^Kh߸d‘J? U?q ZSNMLIFjA4vY6+x~?@3#%#?t"v6o35QI-_JuՙFs{"#IHGp\%/_}^(fĭB{J v)5{chrR lB¶ H$Ԭ5`ݺ$ȩM N0V Tā™[L"›ߴ+*:~kj}3(k:D o3N}^xji6$W8y=W\jdɎl WY<MZ 5aBDY'":73Jkk?!o-W+Ρ3gu<+~PB !M5 "ؓ90pjϳz.pӁ.g?}9a~qlHHdob`oB#r~:,L?1%<-I2ڶBCI5BwGkKBd.V^2*lg&(8I!Y896Yg!BTuȰ T$!saWl J)"EOx^Y´$L] oᢌӉw5澖xCǞ1AM#7aTEk`v3DZaj]NWx_voth4!:xsI23f /:*Qx] ڃ9{U2Y\u˂JgYGid{C@~!(nЩuXDY% !OW(vōY^F/Ţ|YO>\n_/5/9댡^ć}x^4IZ|'ܛVsBiU)V($#?d"hx5KVv gS e1j`>\*$\R6*N+*m6kzZ Htv'on^t+dG b8L_9o4\1/ys4̋%癯Ι{-Z)[;:% eWTQ9sN\RљH$NniV%p'rNz F8o3Xۺk- ,*qLN^8;pDL'FݧETsfy0vbq+\(oE` ;HWy.v Wި% 1Me?doŵ:갋AbDzV[^I*~ˀ 5m+E&m MbP:D EpXށyOKy?y[d-bؕG)&빠a(/tg Qt+K2=IK.TiX@q!:G6Ίwq?gϭ@W}>SWmyլJ&>-ǵJ({P맰ͮ1TmGB Nq0lphxz J ֕VxNЩ= gCT[ uis6{¶ Z`tf-M"3 ׮~mLyg,練 bbf.[yy;i[G91DL[d9|ogAB^*98ym tπomeM%aF)JvM1טnsȎ{*r6z5Q|%Vmtd@8 ѝçשxxn2V 0 =%Y3B $ь1xc4>6c9p:=O]O)gRϠQ3Oc%b,冨pr]ȅfK ZQY&gvΉC vs)DG =pts{YUOiPX؃h@=Ӹ!]Xtfw[.7f ZQ%"%yƅ)d4,53 `2E޵]v/Ow;qť:ؽׂ(G 0m{Q/p47\S8`PleV5r0#K(aˏ(DұKRn_@SsIwƮ~|ЎBViA(KG;M;]Mzkt$d9RڈjsGNRXowd0GpXln|hgϾT(bc[^-Ҙsmynl8}| ~(Ch'. i.5Rq[ P_-70KNA}gQVnǪ[^ /lN9v_Z e2(7V/,TId-6W jk\#Oʄҳ8Xj%ϼZ~zT?2/*Gxem䩟4dbsX2oZS}G77Dp?# ;./ƀx8\AD1pPcjo 'Ŋx(#8 LZ\|tkowN Ͼ$ *Pp'45l:5) P|;$fϚn㡞9%Dѭ}[ST,$ZQHag@J45izXq{\U8/zWı2u 9ܷ3ۜL5<Rb/F ?9꺹2"Qʁ) t3 rއkLp_j~ktN6Bl(n|_blhAJ@qGtk&Ń/hi|~K yrC\ ֫&O7|.kW o )-{ u+Ó/DZ{R^7,k~f8Z, ri~iUi~ e3`ro6?GPx pajIcs#5d{JJW 'uo"eh/^fߟa fIg>eh4܁"0/t{C,B'BM`F@/RZ- +=x>^]e20BC܎{&_6 E,gZk/?w^m03oݯQ1{у􋁟. whf\8R=BQFVkzt܀7@ב"vLc;N8`{!8V%ϰ #$tG $ +GC w^&vD}d(\u3AGMkpPF)`! NBt5/? h3zKLKzwSo R[(=]x2)l͡Pqo&*NI_0c*ShtS-uQku[rРUwJM ]AfcfBcZAI| Uq" Fh%èP/Fy-d&:?] rG5yԕ{9rQ_+ak[t6!p/yUt=Յ?S%j߶vh|"1oxiIS!RrRpqGxY܍AiO%5?w6x5s< ֪$~E![ çxFP'aݸTuz/xv1%OYx-7Tg&N6;|ge˅,yMpށ[۬.3NssSyԤtbo| ߧϕ†% 6B"xh^w;'jcLS "Uׁ/~iF2e0-̈́DExb js)o6g9G**^=: y9-C9ƵYf[LM(3$T`aRfARj +N3ɱpynν8:54"qT$F~hJ[nEt2xRp>4i(T Y$SX_MYiiuT3( 28~e%u6 GIN#H'edF8TtGm8{ Z%GXqxR9lAVG,-Vv,[$*pc R Kɲ"݈U~24)EeXBz/#]n$p/ƴa.ȳ6HơLe59`Yn`a`ytȬ {J3/"YC SVӰdIg)Uf5gg0Pk&d%;X.A9'dbIv-cdo9FXZ- a'KKMzc Dl[Â2ٛ+|#-s! j#C$G%idqy| ۃ8j2xDklBš) ֆl#\QP>>բ #@W0r_ȷV iܘp .5_(T%^2U W&gwԏ{RM@:1h4ٰ`eg+S%-]v%j?w(_琰 iLAY&UfHo+zEsߵU0{Y{R"L8aTh:d\xPcaXNQ_ l;'j* 8F5PcR?B)R?; ]f2BV4 VdžSXhL+3No' Hk7**Q[MwʗVJ]*1AlS8oFձ%*qSuaij=cGŸέ9a ƬQ(3+X"ՔnUݿ`Bk梠re[a޽l4zE"P(03<~_!RS7AtUk•K``_%< :/zU@W n(q(CdO _kOjTGL)I-߈?i>zd4b~^ߐˊ<\(mւes}]3G:{u  B}S='< s G)NA,0nƒ;0Ǵre >dr(Mdpp.frTx brv1D~}_lA/=ӕ_+Ix;iQzOj pu'o9KA92=!)茧DpۍI}%cU`DE?X)G{͗?W&3JL!bNXS4ZtG Wu7^39FD~(Բi;uK8=gc6IESg!7iT[{2{{"tؼ6ITD0ք gZiXV]e+QQnl=lo=3D ^O.ߖO<}<n!<[o\bJHq*lgFĩje~oxEzy,d&ޯOUL[>{gu@\|I֚[k땙8l5&"ʲ2φ14Pn?3tA˰AV.QzyQ;Y2]lx.߸BiabJ O/̆+1 hܫWH96foBݣKd#J7ʎ xG xsB᳚s5 ɋy{fƳbn鷝H4}|n{^!e"~cݩszh,YS7Rx_Uqj+HH6q20 ۿU<=̉F(͠h!6W~,&LUaƍ-61}U$N|j^=E\ & ?M#CC{N=$yCлPҌg|&AiPꩢf}Y.|Y10yOCF' LG#Lahȟ'gǿʟh-@0sMӸXnߖ9;2α)I:Bv&  :)5 nӱ,zYEFXZ]Y^SnBD.,R14W|)0,/,Uੑ@fg1~rpV]wE;/JPL%Q!'}!^=t} I*XL1=ȲԈ|7[tvgX[.-n%,;MRW&#q6fվk#VF8V'=Z5IQ="HiYc@ gb# 2WS_ 2 OMڹ#:lN ?UAnI倱g.9ϪSژS :,yE )+jfYƭ]44b˵h Ryi 1$p*]-$D|Efo_BTMX+EOIM}ݔ"bkt/;7\R7DzA-PwzkuW *ӾNPa3CeB-1gX^^لzv883&I}\L~` P׳Ldvpe"jfBq(:W'ÚrҟrR5Wk-n19nNKL|?D O7}dj vt @gG 1yn]t }rA- hi5lO) qtHK.p4]F18ES7$gNk=?+~ ʀyn஠ǿ J}b5#34zDY1~tX>IM"9=vb$wM3,T t^d$6m b& q*kźQˏ ]=];Li,Э :X 1·.`yqt/٨ nC1s.fxxbwo@mZvrA&\& | GG: 4ڻ°p^/ g(a=D]b?R.@"jN֮-SɫN|U#p'w-A1^d\9+ ݃Lkr#/AlRwh08 ek GizDV֙5n=B^JrA!7r"-|[lI XiiHjBRĴY֦O52jK+ZoFp-0! M/6G+Cܑ7Ń)Nw]'E$?M5jCKpKn%gN2 ;6ᘛI!ĶRhdPE%!3h&u+ciM$بD,egM h&nj]JCe _@(<6wዖax6B[裯wMN^難؀AU2oQaW4f.DSm4R{׹qʭv8GfmU{?۵**$>Lb`xv|"&˒uxdeB~ͫ~@5 1J$d38U bo| ܦ50O2^y˜$0B--LZq̴ؒm8\Lvg*߹§Hq({^O,'#Ǐ ;Qd/H Y"+8O#{WB=QSߞySuM7&~_9Ŏ+0"uT`2>piu"ٯL(j?=crZף h %9$FPW'i#G`IW@xVu_ZUTPt%nyV~܊yw`aNb1xeT#+/T<l n Ҳv^LuGBS?qϺ|I?ZxB`k}o,uqF!d` Jjn_ Ə \W_itȖvлv'8j=D?(8)iv.5X8C¸6$~ n'BR"Pau^گܓ=?e?;bʡug}lZ^SYeuӓ^ς1nbDi6u>||): ( ҀR @n* MR"gyx3m r6)A:GNဨ܋ňr T*MƧÀ+ԶKf*گo~jqUՑG^YgoWT$]麈Wk}hhOX?e/QJBO!4p@~#RaZWhEC0BNrOa}T5W R΃‰+e7}N`dK+g:u8Z++@;D4P:s2.΍pҟſ6{fILLmf@Vc-43KRߐyNr?!J<3Fy6orWyȫq28,I=SQVh)itdx`o2SDޮX%:OVc:W'zV#/f fFlBU/k㍍\{']aW246n5d74‡1EMDX,7 8/N[G2gj.&k3. vg랿󠔪&$ȀQQDZ?}U֗bk$'Eﺤmcu÷jLw>?F3JA !y4yukXjy:\Kɳt OUB;a 챻kШ^bt.S,=#_BZ^vcJhc=Dq~X&7i1'F@Θi6)չB# sARnMh@N >ߴzâ׍d{!_<( b:&m_X+iMڧmi'[r ulGɅL_Ցz2Vi ~8nh@.^J!;(Eϓt߳&f)lػW ?a//O{#f2ZW󣢤{Ӈ(Nm|oGШco1!#HZ(TU)6B|&>(tE[.@\Q#h໤;_ 7K#^|:;hRD~87UMBJo 'C?<:!awKlX_g{1퍯Sz֞aⳛvać:k&6v*u-cI5gTgKY|ht?H&B=$:Iid!;mHjL}IKA~BeJ{~}[$&+Òs^m_/qKϛ>_ڎLЎ .aš=QjʹsJ.SI5Zf>@|̹hAJkҚÐXF]m[)J8q]d OF+pܣ YLB{p . eU"yYTӔDޢPmK3Iճ=ZCwAē.I&m"#[Sw “ VFȝrԻyBS_ƌ\G.5LgpLL jJCE¥ Rq3$?&s[/LL2 5-Ű(8EHft1a(jËz-՘Пº|{#:s=4T3 Pﳍ5|ku;eTGZ-ş9|zp,[$~)Q*R%;-C.ûs7;-Lj1--Bf/ :*OZsWcdx:%CBVPxrf0hݒ8q7#J+y3شe.~iȎ!W e}o5ٟUG:]HN.rAiX+Ϛ5ީٵ8$c~\Smk>]4V[L Y" ZNj5}'xC-9^&O]>ƻ$"QHP1+7`{=,i[x+^m=G TVc)m(@5079WOZ&a{Ԝ!:eUbW֓ީ24į6_*k8kCHعK`H+=@[v;Z ⌂w?4|'GkFCkyѐyƈT.IY_gR.t*P+%G7QUƅMFIinAHZfT[)v?~Zp"OQF5װ (yBVp#ί̀A =>Wnpއm,s0IŠH]:)rﮛME^U a7eK- ςo3 ,0x*%nj!GQg-d A϶;BB8P]'D0d>B4?WjP5g"d=oqĂv– ۼ~D5|e(N@&?΁1 *v@KM-d[WPʚx3_s]^T{|g2-;1dX!vW{/jŨet*=2.ÅbYnLJ &{4:$$AZ0#E'Z{Z7HMv"P2rɄge^EFV@CD1!KЛq&sj8`K8jv',UY@ Wsl?LdFLATCgB|:۔,;3PF%B _< .$ھefjoCC̑4g,|8|8s;8VQ!d[ЄXΚP;)犷\YÖT | ,:AX>oP SUOeM=x]yhH,svDdo ǔ_-W qQKdCGHCr͜V|;{&xxn$!:+v5+Fz@oZ_赵nE~Ahc' us87fikpp3g/[7\Zϖ$S]%Hˈ7h:sZˋ=Uxv @ BЏ%`N>J)ǾZ7y~͍|\s9ub{ϵ8bLeKP"'0YJܞ<Y]3b*V'߃9Z q0dC>26v!pɹ3t3Q:6`-}PBs'y9dtғ笄kAcO<=JZSHjRR8[M:8WM"}.0j<2F ^٘y/"G]X"纮 \#s#mD'e(ˎ 5hC \\N/Fgȶb( PJЌ{$7&}J80蜏$IP.sxtL9?WsٞmU` _}`TJL # NGP nKJ(7 8=nh yS+Ee8xl`Cojns2ءd7羘%ceYӿ&e9a(_6MtE8ׁH]Σ-uZv5R vfl1&؆NMt LdCTf)۵/ `؏JFF܊#(]\y< ËAdf<ΰlU=.тKn~Yo-| GDmڳc'xsavusyUt- (Obkߟ(p,3 9Tfޏ!z*iPk&6n8gXL)ydndCS(Tε{PU$]& 5 .ubss:5!R$HH[K"bn p~k*|R'}&TbXv_qG;;#B,ߙNyQ_R"/VBK`CG$\Y rؠHXT!3JIeE{ҝ/$xOq*kTU$$cN'^ٱVΝDD9^ж[T]?bu )͜>O=LJ ȎɭVKbxFP)4Տ\)}:/Oӓ UW_MJe7U>fi052vN1NuaWOU^ԥ We@d1E|{8K\-f}^Nwex:Abׅ9[¡pNB7Tkꚉ;DrLUwemp?>2q3~جн }`TѝWnX]Tk"Ľjnֲh*L-Z4{# q+eK[šj(c/%OsaЪiiouHfcs>r-dos{7BNHε*ݰ )\=sd\ T=6YA{;)BAtPQ b+|(Fŵ!O2c0/p.YP>~1Z8 ʬ#tlsjZ؛0Ta"&w]q'WE|/VSG3 rqd<yki^a{Xջ#qO=1@,̅ێٶ7iQ Ћ1 H-s/<([#\vo`V+DVtu_dI7V_>ibF\ԛq[+ZƠ>ڡ q-ԙΤ2+\B$~~"zŻGuW/V|:xK\:ғUxҎtr f3ΕTy '[ Zf4cf϶|ig(AU,7)r @DB+'h`a^l k$W1h4t,7}6ZMtX%e""_AsD_:j 6+zأ5N!'^ wDa}Fr+9e<緄:d"bo317mZ/nT|/ב0s9/y;c\uSڧ\0F$L-iR`P|\ڬuTloOf8a1Eo1sM؎{8 gr 8㸦m y[D5$p;W=,[k9$44eml3 )9Y0W<7dXpBAA_\X 5͟lYuxϩrwG$1l("(?>w^'b1R{<6bnkp网O (;g`W6SFF^}*RS 'f-v@iK*TÚ'8FDz_[gwـY7ݕ*O ΗېsH[(XM ` N(΁֕%e̓[;.nBܰ::@ZGSp|/l%KvEOFe|_bNS݆?qވvVBgN\@R^&D7g>[ O88&(.:2{GڗI:;%!YM#-I$Ht1}n-]x$Nl/iwgLXG`#VAW/m NTWUsx"\) `L?X9e+ms`Ѽ"y^ :4)@ޞ^:@ >m,?Q&L3KZtk)u<{.;BHI*=~e?rǢGA8ȁC%P gMsY `~%!Mh3g? Vى 2r޹Ec>#pD5\Xe eP>X; $!Utai'*u[bB~=[n[ N;*ɒ) qc]IbWIYON.7]T .TD׈@7mt-fC뼣"* H.şhZU+>r&'jqbQc2(Iʉqcbbtg[Yi)*\KxST s㥲x(ѓNzWRvbC2r'5Yv0G`2kXغcjblh/T*"zwa$gQׄU DgRGE}F8KRgh˟-K +cӄ]v9{Rѥӿa7og3iFl[kBk̵,\FQ?d`)0{|l]^ZU#i ^}Ɍ߱J~թL)Hrɣ Ltg~So„贏;$+=7Ec4N_g%ec?uL#5s,6mݏR KgTDSG_W_g`(Z3z/kXV?1l9' ՠjSLߐb0W/tnYOn%iL*B +=9bxIn_WjH .!=&!aQ] O S//h򓌈&螓.pBa4Jgb?~D!5b>@yqc`?c3V0PZO~ץUE6Ng vZk/Tq!Хxxk|Pm;Kڇ@o,2v_=-EAȲ|Ho?˕p\)^~mu |4 isRl.X ;L2*$zc`tt5Y"HДeZnX*-MۊjBn^h0ۆܐ@ۡk=O,ʹ^&䔜7 DDğ{0xGzq}nM: ϿĴ;mڡۑBW`}a;yu?:̇NZXkW*uK1Bv^z:8ėoy c{Od,m!|n4}QI;3f%j‰4L$G4Y[E][!^`ZՠSxg~m\`*XfEk0NMUq;xkkesF]-)Zks׷*2P*xȁASiYP%06h_ٝ b15ڏQ-0_$ mm8A7;)XRrhpok7 ﱦԢ0V]rv4_}n sNMFnȾYpZ\+‹TFxCm$Mh kPIjN×4"(ƥ0Ϩy-pHx9~-NC8z x,u<=G=>wL ]#/"[sԤ6 T /()t-+cEc_ݗ`l唷1d^ixfɈ<·`6M-, IEÔ{$?^kFNFv ;C~oVѪhn=v7zl񽂙A6^|e}-fqA{#ww Lcnra6.'. Pۋ]Zk-y)IYr Ժhaԍ6_)TN"3mbt:u#l72~ ,dWA|LW)bzXtnȆٳ)`!М,q|?%~hPN78_AEI#㪣_u&HTS,DAEv leϓ!5 ֖"%H/jPR#mt˜׸$TC^9uF#*ħJgFdvSA<sq& bF/ SMV40* A 2zpML&wfXi)1ee,$ #Fdƶ7 O)HPPirE!|S3x1wPOh^jL]mq%6ctCy#cB/VBrri>iWCc?Nw5,͘;5|C :*w\W@bMb_{!O;daeWQZaMg$1aDh l)b׺<)qC_ Ǵr=%2?mGDaJmh6sȻ? G׮K gIg3q}IaE>uJVNTE+ǾVrȎugj"~H!X?%,=^zRwېLׇz#q@52b>K,xHs^^֕䍤T5p|C\ HOk*"{'b̽%? }_^<^,hph6돋?k7 8_f@AQ<âjdg(^.+c|UL|se8q# rxMڮy}+kc?"D8D]Yj~ShԔmA{8^n%T&Đz<jnik?a~Jf:C>-^܎ 8$1 xobF02bt7HKl!{Oɜ=hp=)#[?&iĶ} 2͓=n9,f9$N8/};ԭ=n9,9el4z C\_ /iŸc Y{_l%k 1 hT; "G"K1/F)lŵK5J?$Gӈ@OgZc=щͿVv Ǒe'!#;Z-_@Xnc̬I\iofHfsb ɅHKA׎Е)rOYz\֑g pҸ)~ʊDh""ti/Xj`KQ);ngc-_}Gb}`r׭3۪0ą c_`k#kn<`_ h_=˰?ɹĖpJaTl#Y#KiL@[O#j"_u+ZTޓ5:}/=婯ۧyP% nZ ;~{]G:{ub' [n妭>՗$dqSbB:a5/_gw2ZaDt+I 2[i(-NH&Xr4㭘<5SzSZ:%7C~\4۹>ӼE2ڿXj1$m C/e9wyrl/fLB(3~jq^St;vLFyPc%ʝƹ+fs3!c-dOaoP^z=K' h:)J{&9tB4Y,1XC;Zӎ"ӧD':ʛB5ׂ8~Jv?p-qra5Pw #.7a_̗D7F3JH_FPxj^/2C=z]`USBTuf 2^6oe">ĝ{NHA9M;גۂ:%a 7H3l7mR/Ew̠R׉,f*T& ˩';EIz[?)X/(xm5 t^1g+;lYkB| &6kǨ%lz/9$MǪ\4r[;x'0뒵b1lj&VTs ށ"5WtxT;yQ$/ I5uP߿Fԃ9X 7qbtHwm..N4$d\$, &["< (úuf$8SOa/\w'hgmhNQKNTc N8 7"y,E?_b!y̬d%iІa~BIqDBfb?Η-Y2 k<8o?^oʸblǚPaV >.4BS3pc~4FXjxHdyb, B'Mvw7pj0]DJL\""PL x Y^ obmW V>X<2DKT%hh+O Sc(>rӲPu`օ4zAyzkr^k~,S\>;vߦ!+2Pm>$ֆ :Ie|A"h+.h8~1Y RDE1I2ls Sź!Fdч4д09U1l-+2 /+TͿ&m-S#c,ŇsMiO87Y^^3YqIs.Mъ+9?̿o]o0uxgM]ؾy:d?/Dڻ#s2r&3z;t0 ^yeK"dTta }%E97j,WK[(͈su|J?K(׌xi㝲sɤ^-mȸ$jD1+ S]%c?p,1R&v=1G[kפ3_Ln@ e, *Ckx򧗷I,=aaj*nԯr[(ḭ24*=;͉eeYܫ VZMnBLn1haėqe^\+dlhR|43NVy{h/ѰSۘxr43MZ D.V~t"|\;=P㼞~ c{@A"% ID'ɓ*qBhtN#tOaI_j fu`N=)(ZMU%>Ib< q|lp1T۞Mp(q-O8-8ǥ1<7k ͦ}|@0=)d`(=0dG^} (AMwuPsxWQ8 ¥"]DdʼnG:d_3 elڀ ǁBoly"O{.=.h0?09u,NTed9Mhc»?G )-}W z^= %˽o͒Bs#獱s$n?+:*1T ?IToʐqY|rde3h'RhjB dpE/')6$.|ȝ6S?zU~0t^SP}l xaCQ/TW_2%"HP%'8ukjKѠ2qUDFfI ruZv{XMyUTrPuz Yۛ|baG4k&ƣG[lȓ4tPAXt0XoR)- aV)|d2WO9NcۨZU \Pg/RP=K(]R-lU|Qof@jd;X< 1 9vJxmT-$[e "xcڌ>>C9ք\v_oR ;wŴdú)>pU2h&f,ld*{I2c:5| _d3E9)(A}#E[cVD9zZ@`^m'"1M-w1Tj]8I^5Tm훚43y/F飳'r.5Ʃ٪Cf##bRbfu. qfa%., qK|o&֫̚`[*X eB'j"ݨ|p}j;r̞2~h3H7"v|h.'&62nҶy˻JXL@PiYfd0iC IFv^eҳcC*pan'Dz^dhlˬ@⒭&je iߞ\$ 'c hjD[w9{(2Q7XMJ qH-R$#C'd}"iT3]O֡\?gvzZ+:Pȵ)O7cK1I+DC[{O!eI9Jޓ0[Y!t$+Q\\>81cbf+59]P-ɸ:ma5^e}WRO9Wɮaڜ 3X42ϊ ݟMu V!󷁘D!d(zSn2s9{oްS`=K٫LlԠ6:̗`@^YBr坷iP(IA4+mI0l\8÷KG^%{̀]g:">^`MRx7L-h#{So^hRL//gPW\M@%LE^ ٰm )O]Sė͝^((AӅS~@`Z{z}J !heE?l|ir{ڥaq\@5SO xtVB~HR{< 4-8 ^}fP~MS\S48p,T@ޞղv9"VY3<}e F^Ǻ5pup d,X@BF"\2LULYzk]2}Wee !-dy+c?xx\tB3QpI&d7=DCBdt[ [)6P7_D{> 8`A7 XDz; G{n5`r3wk=\bEc+] 80eEJЗBɼ?!8ODZ =? k>}0;-;W=$g0y}]<KHInA}򽘾) 8MP$G7MǼnx @+Ek^Ò @AS!bЌz߉ixq^Gljt6J8!JtPB%,*fݓ 1]{BK$yJ`# S3dߍ[Wq=8 3Q@3g( %tm70'ͼGu^g2hi^i0 _S};3ed{9ܬç.c+: J{0^4.Fp.=ݫ4¡Y(8҅jZW‘ww[QjG)4V,kgr\zw̒L6"WJ &v0XmGeġ`i}ec-P1 c?eYwЎuCvSv 1tc ҉>+i9n%bx9%tf+ޚsLdV7H$v/\+N0̸ve1 t-j$ JΕB#;bDӲ$A"5oc'іooeg< 93asڔ :93uR‚=ovUY4GQ1}yf#/hؼ~@ye$30qb< ڒUN 1[quL,DDwzL%3Q7$ ,K"DZAӊ]b\'N#EP6SL!$d;kS;@"TR"o͈!YB9\:*NETKT)#՜z|8`r/P,)-:4 6w/fֲs[%j#{yR +n1d0.+5AfEB0Р 8BkL#k:|,(ŲC!araML7g^bض_$xoTG,J ÏkD?RRSZ J0`E iY!ixk:“gv~= -L`C,K4֏ñ:gDZۍk%GfYdA^odxicLtwQyA& zoȐoXdmO}E}C5\7T\%1T1&Ze D@B)BʦWs/i{m`uOqZwQB >D g N>0&V$ b5TUԫVWrg[m0S-~U'ip[_AwkA.x|_rg4Sy ,^K|䬦:XcԃCS$p,ه!"Ù߄?^\!oژ,CYB1LzrK|̂,KS hxd6QojKCErh`[Pp^ShI!kou&yX6Vv2EKR:4J)#t^ ٺZfk|ةU*UZ͚kt"j86 |_~Ĭ ȭc9 i/'pIVS&T@BιNm!;ir}u?R_y ]@tEcxq~IND~i3N1x1nR b|tE':/"Kghn;j15߬ZW~)%^\/*Gݣq]x!'Dwglwhu_앓 +Te{xY:O .qzXo}`am)3~I$@Q9`M*d,OrӶ dac*ys1,|3O1w'*]B%U`^{a^ ;cX?zQ?TͣaH$ډ_>_1M޳G )^:E@ڊѷ.z&Q_O:Rz)?zeTSv`|Ce}޴.K6k:?l5vMX`4}}G[cœm]V !zuS$ä V`Խ 9+yXdg:SSo2c)P&6Vݦu><>;qlTaPr4(j ,QԲn_' cبn:k>2FK>wH(k5.;/Pn 6Rp!<\sǠ,&?^?PPf>5 v8>1 v[9va|0g|5~yms+ތs?<\3ͻ>Wrj3YUKss9wO~Z-n^̿X-ߚ4&&ӧIhc&Fr&>M\E@Uw з5zkRdb-*~T2 ^z[Cl(/?e?8^^bX7tLkm{܉;Lɾ4J`{?>.=y{?)v.&bS'J_XTd 0dXE]pE,vLdT<9QtdUk5JM"e]^]~)6:MY5B}o X>GRHb_?1atBEXj0D H2k0v\* (U38*Yu%BB3GՇQ\TRSPz4 D?* ͉?^\w=nq9"Tr^"1GХ\B)E'oȼ'.r ԉLG(,k$>^ x]S*/.,no LӺ5? ߣ+މ ܉쏬pՓVZMg\eshJm/{ `̼Ew4^-CJLv1Qf 4 us.G[ #Bju s_yƆDO]&&O$ʠ "2<(Um9nq tαa{s/lUbV]1dTYS#skmtDۑ1aξ5Muu"h1;y<\(*qqs=!0!^vJYU 彛r!%"T o 6jhm]sMh8oD@[ IPxsLA'7LjU8P;$*a%fVqu{jVYRKO)g& ,`N3*~<[zWr0Z+@Ex۫{Y1̌L-Hs-n$ 9-NSѬv) }u8SQiKY6SUe`NthfXeYO|fcRb,}`nYJCDrBpV{6 e4J0!*-hTQ>"ZhyrhYN"&VYF4`5J~b2OR#%0yC)ʤa(:s)_2 k")U@O;QlZ<ܼC/6E9P8{yG5r܉Po]XT6_ W?jʹȪ3:^ |t <ǰ8ҹӿ,;+.,J˪E}l K:@bMxrЛHRv?>-~쓱|k'(\;{QǠZzOPZC0d~2Y. M7J F\!^~Or3EGva߷h9Wxp}V?䆐m{+ S4&k.0 瀸ω#FM;C(L:1 io5u4R'u=k. 4cue B3Q>nB NYC! + a9Xvj?$;g3:/={Buȳ3?vBK`"J!=۷Obv!cbzSV1|}PO$.'s% +Acp KHu6[ ;4Qt{Y+R/= }7NZǙM:,OTXB1. >1Xp$:>Ru#]@'fDPBUc6"NȳxdtEbJ̞^٣ӚeKftȉV:+-0&^x16vTk>>_L<\_i5(k=K:3x;0vl&@78``˭ʩ%wn׎acm@Ȅf1bV|vF÷3C~,)>(C0IC|[ (N.㚭k܎)wyú +̝2M Ks ϩz\y{h9o{MPeTwVBǷ1>m<*BFfhX+QJX>Iƃ# TzvW0C=\#OX4o_lh&UNsXe`Bf! 橇4^yu}+*)‰/:tM=] 4taL,(^4!Svo=!]=;Bp$^@v09lWJP9ZO!_D&Ռzl#9zwy,Uo.a W9Kd=%! Rc6rgls;2Mc\"th؎{ݭ 6_({MXmoSf%歎Æd+Gcw9$!X@IB2&c6n1]5D tz#EzŢ:Z eyNV÷osu^|9Hܖwڊ=te-ƵoG/LwM6FeDMWN7_#b?um&iVӾRއ25I5d1uA!8g$ޔ):L#K6D1:2IG;GR.K8/.؉gmRNf6r>.) op\C %2[SЮK}~1m޴+.@_nh(]]mRK9;F:^țehS)Ufڣ|Ed=)EXx@35' |H}ȟJr)s^xnn"=?Y_z>xzk jbTٻ?r ǑME:ə+Xm&,z6.f祜ko4{DNU<9 ӧԬ i!eʍeEL/l]ֳ/l&۫ 5rdACq=g:[c e*5 i`6W{ӓ騽>~o1v kuL[#p!*4$3v3?#,J}4ۮUIpgE4G(n2C>a@ttTDWnmU"b ?S& :43$+0!H)IkPK8gkKh(Jr]hnm!g<0{*ǘx&;ZH֎oB-'<ļA'sW4񤣁V|;H. %WЍm#fΫp;/S15cՒD?KM<@b޽gi$H+Q\Z8`wvc&,IAV2Ҟx:+S#E=y|_ u˪T'w Ib֤yMJ"rbխ-: ϕU}u\އD>8]t~86gWa.xC.K϶ǩe'^՝ L3lP! 6\:r\wEcC8$rW$9 n^#5Frpw8 NE_(='vrm~n*\373>=<:HG(=O' h;RH&ݽM׸!~AVΰڌ s2 )0pb4\GD0=WYpT>@X"ưMmAH@m108̎+o`gGdZh{v/3/K͉uT0^Ǥ`%b% /zȒ$n4a5q9xo@:OIL|o;'4m; ?@{bwg-)mRn ,H"{oQWdq* >.ah6 u705y1&1+Qe{-4#s0m`?vzm5[PS>-ME\0gLXAD2UtqT8i)yL3YZB FR;/yT3|ɩQQ;g>C+4@ɮT2W:ԛnGl'P< @4-҂KIp̛J~aDމ̽Ƥ3",n"{qcvDR"'UVo(K7ᚠU̹S5YlN_^RKQ'5Ŕx .k=x6[yY~2x5jנ_o^KuYQ }Zx]74r9f+2;f59CVuď#t]8x w-; 0FFc ƪI0RS;q"W.x}`0$$>pwx \zuZ4"4#IA[Jtaץk9K!#Ad#W<1~KʙkYnY!'i__*ao(_} Q?0}_l -ŕ=}GY[^ %V5ײ@hE݉* o˵B|_͡Y #{`=X|F껎::5o'FYd9/2E v町d{7yW~p@}hb5']Yfi%Y:g_,<0J"(9¦(sSWAW*Ybgn/dUyяb8H$hlvpѧf%ygcK *H%$doƂ^Z֜Tpy+)]0@63~Z b+뫷CwD`tȡhKv\.C3ə3[^BuZ*9̷_O=%mW{`&#a MDن<,(s:'(_ʹaEQ0W9[#%^,"q/xDKqcZ L`*ўME(:¬B[9._DV".)RipXB5>ҁ-}J0!&9蟵`bJ4:@ўWXU& sRFqQf "kf2S9nU?)Q(X bb0:o}.?һ6.~RҶCaL&ZƟEhmp9-.7q ;h%>?,>a s:iCFʉ_@~5X,aK}(E # t'pMe&#5.@C*F2 efF#IԤvfq{\.[<4T1͎;IIZ0[ q9 Pl4!mÚІ,݉Ejbj;ՇdiF5jbN p#+[ǷI&$;ۣVXhT.푄IL@2OL8=:?.Ų}R}N@:7yT:nxs .CzLSG-MOXM(nA/+zWZp.-&1Paei>uw)ҟ*6ji|CH&l] 3HQcjjΪcWd~zrNe㰺Ȫ t}o'/0Šw顕(]IcyS.rQvj*~bKWvt^9*gWZ%`1㝰M~mBmf6RT(N@qx|Hsw?yFˠBL仯QSϘZupd,2 VS@u _;a/% 2vM}~~J އ @RWJ_͛Gg_OzǓgz4}',ŋDBPH|stv̓/m:ol ?a$ ׽Ḽ.,,[eu8r.R MRx$$wT|*Bz"h&fNb!2,W/ t'VOy2E݌1 *5҅~Uv*]C.*xi)x*Qc+6>A4X.wl}xBTlDF\W6m+omhR<њb%]<nd"DNy8H|)ω $~2?JM} L6dƦDi8wŔ|: @hdh⥄~ 4vRBC#CStKHE8p ~ad?,..'_F!06mNue).th^л &Gp_~hnonPީDDxqpXwtYp٘g-<46-`lk iTùJ@i>ҩ _NA,lyJ549v>7N(G~!Ӊ&Ը{^ < ԍ5ytD#*'%A Ŋ00|d۰@}%.n^[%G @'*\O&P8<'Xs6"lNqb*.4K.rɽ%aEw?ܨ3G&HKu#XPG\'1`lBqp*; ݮ!7dmD{1cء IZeᵧ'Icg#7%J8~NHj|ݬUNEW+?!uu07 %)hhepq pU4D 8ᠢ8`>-q5Zl멒\LC9Ƨ D< Cn-^ a1v(/Ea1SvbJεB.); {{U@F6mRToԥz$υv _yE v% {ԇ}[G2y5Y 2(p(zSy&W"Ѡ:z,֘]^=d`P Qk;n 6 ^?QPxPy_ ç~Qֈb9 Rj9~cΰu${^:ԍ&zYf6X2Dă6]:|u"?fdo0Z(śDLOQ|xB+@l6M =GzNJ|®m]:0_ݐ6{d>|Tk2A(G:Inx+<o.FVj\3b3<ۨ{ aZ^@9>XeHj'u!w3' ^'476hM>Dr4]լ@)%rsL$ԁv$$e9ȫc':0Mw"l[#b$dU2a7.ۃmn)aS+Dve|O]Pi;g+B{t7^5jIw4ήV*@WTI9z-z7ҳUkrߋsmHuRbi9 eC 7 تC@d7<%ęMYF밯m7/'B༜wKVKeK-Rpv;|A]4?jD^υ j }odmmB6yg03/W;'\vuDd 0lEJI bQN3Sи0Bn~1\bD_jHJ MX6T@fͷ$t2DujdߴݦOh,F.(#RHX}"b1^.U]L|De@~@QrK(̞ ek+ 2F,: t߽9>cZx=muE8a4·Bo֫4% t3";Ͼ]@ w>\TAk##7VeɢnMãCǷ>!ҭM`Oh8*J4</lrO=DbIw0ŷ7"B砒-"tNhAmU7B06\.Ne l-}e:/w>].d^-PɲƯR0!PmZyILűZOIq!JXu"cT׮/cu=h~ .#ɢ" /cRK&҅<:bJ~ǧH .ҝ[a~S3Lce,hx^(l%7P3;jXfL!5%!`i5!=Fz?Tڦ`HTWRoo. WjvkE/ .{,T *?QpF$PΔ4ŘgCl/2N&Y`M 5Ct=,bM Y:D?F٧˚m,b?XP{cN~ &iU8?Y\ZBлDƚ$<)~粓+1TzCSs 2+D<Cmp䬷blvYf >إqJr-)MK!8 Ǔ}P|x]fC>uUnT"8l(/mgB3 1ڴiv,C ([Zף3ϢHqX]ٔT#J,HЅ(ؒ#,O" *eXO&-"ǩ LWٷ?( C6lxzIrr((!9#d<@a:ƝL0$g8I]6BH_ G|4⭮DXl8{F҆-yGnɥٙ嶷E~wImM ً;BpFH`Z  +o'}"38ˏ( `h*l&u8bȔDn1KЦ@,O [(Dgv#uu0D\1Is S7M7cc"|JªO*E>4>ӳМv4BrvXhs?9 "Xx$:=EK[{$XwI`C%L=O踯P#3hΐ/k_n?fD G.3[1nuFOn˹# Y2ȃz|} hY-w; ~$R"?'}>u7@6Y{vg9s~h@ڭwpAlsVۿ,f?ܶ,z:wLR 5jnT7R]i )PYSn]B[m'r:8;RlO5\J=*~>7/^eMqu4KkkBTrEh`uǹ-j1dDfTZ*딱I)/%8羾+yٕrpЇI (,tpD<׃SuwU! i:lCN!B 0g\ fU,vn((yTtS8V!1S7=Lә)@ u_gR5ŪҨB/5W娱Ub3?F,/m,hB2ƉFX3CvSDtSo{e"6 ^kYǮ:3LQ?A}Bk2::"-SxPfdFkNqҺ1@ l3mQpZz{rj"pH<},=h{e> i¤;4#e!LtkEm/{<)i9˜zCP.DtAS轩: b9.k pBarKT!K񙎶b6C }v*FǤ?gݟJ%TmAsP"V6[g^8'be勒M*x婽'OzQq۹4**.ECB7pP aKOΙxnF2D%bvE_?l+4^ꃯZkq"Flx]Ѥs~LE,eHgb[8vj$eUcm j>5ktT<_]s hTl)^ທhK+Aޟr `=v`il*Er8xdd:Kg+gb'+ V^@N(8)O <yb$P͒Q^^ H˯Vc+`Iz;e%yn3*j^)>)6WdI T2(qvQ2-nϓ)r8j BO"Yֶ( Ȅ(ș21_`ByExgT %M”^X&Eݫrؿ#Shේҧhi;XuGk@\pb-% WZt6;-KZ)0? -i8Ln1DI >}iC:~d +L}Icxeie2vPm4&WG٤ϒ'  ;ܦ\8y N6}fd;*ݷ4-$`y9 U3SFK.ߎ-ʣDR_+_ %ŧ̳&FfƶGO[ z`Sc ,7P4Sm2'u DMV Q7W_zM除[Vl#XxX~Rd= iZMm)GSC~'g7#J^,h;e희FmU(08UIɇTyG6Z1(. n$셞:8")WCMt[ j}sC6$FϹ5=t#|B=1Kd!,Зu@>ev!Hn)_4 iyDIrt})"hc%E!DO1Ns:A4 DŽVkѿk }hGp`b#b752zs{ ;l5ҮeW|bUHh:!oeJҼN d#Cqͺ*`Sp04i#Pi5T3PȖ*HfBP%ȓ*]=04BnQG C|4el=N|I9Du2J SvՏX&߿Y4pk%~Xz_pX"1#nF\%a/ɕk(/Z:,0dV]6d-ݛf\{*n3J`6 6nkjdD"3C *+Qäsqg+ 7 6t+H+]}ar/V79XUF#FE4wjV hKEbD R8j qƤ='8nL8E䫡 SM4D^**bׁ>U߇)cJDKGh0Id>ʀ*$abHH3蔻)mNgCQ\N,Sr%~?dN>hUӫ bDݣRq9#LǹMN"tO5cDt#0({(ّ]rm'Yk-kV\(5Y(2v3LwU9\4s $أ!8wYY'JrG;]j:֑=EanC Q2.aP:( ;R*%oMVKyq($.7+c+ ݨu7ִ>4,r6& ԗs./Rbo;HHUyZfWՃVˢ(:_tL4D}` L@cVv^xϟ[ϹRKȔ]k]lu7HK r/~ YБt֖ btlm(MF\pcG^Mk./&%YS+LmE|(fW675-qTf :?Q! ̠S9 8R2ts|DɁ\$nxߟ4EmLCZ тv{F3;jQŎ$?A tVq %ͣ*`)Ӳv d,äu65P Vz=ۘlGLΜ[b+YfFչ}hd&{^pY|K2>S7j .Q1ͯϕ ^gkr}lP}z|I0˯dҼ;s +/ܧr1_v9d\ xj%"-,@O'~ Skpl3i#kȽ=ݥNzy/ ˽Ѳy M SIyjxx=sNBGccu\%0ᷮ]JmYfܸ(DS:gSl`?7'Cce‘ԡc12LM|/֮m&X'6ibkV?VX>0V"3`Ag H$]."$.:x+mmؿS]3P2lN_5@SWO3tڙ'?9Fa}UZYVj erχep:}?Uo1)U a b- Ip%ZbfG[X 7;KvwEAϳ e3O&hTDG~ ; /7P+]8aHNJ)0 =ȎG(k|#+c٦b+!%<Ѯr`8CZx. }`)ɠgw궨iBD_m-P&0CJnD_cu*fC`zMleEj.ݡƎN}_P(j{ ,1L,¯{fe@ izI:YV.aj1ө(7Z :@Xeϫ@>:\Ív5Lf؍Fi@v_Q8S}D"d :=^Q~ O L)4w݉24e<^z׋0knC} |?A6vA"e'Vree)i9>Bl#n|s7eS[7 JDw L7#wχǽo{=-j"# U}g!&+.*sǯE3]+8Qղ~Vk7=B4#yg0Pb :,LTCV5.s!\$^!!}]eN&_qЍu:VY'9|Q+29)B݇@.kT*--1Ɍ E />6ym1̺& EdzR}g-JRϿ퐎|rEC6$ޣ$ۑ4Ւq̥= 2Zuċ/0#oqM SqRC5"[,e&-"ȿ H7KR Ek.f }sVt |6H1ܐ߰i\3jhPN3 dւQkfT'3Nݬ:)ҟԘ.HSPL@ QE%4ZMh6# ;A1D%a expB) pWgfgF'ln Zx C͚?oA g^GԩEzӶ Υ>'#4H=v?@V8{Rxm! vp^2V(SԎ@LPeDT?Ti<'cZAÈ#PD2kKsց^%Tc=^QUCC'4rEtUѕ;n8OTiFK娧K=]c&I#c#rQ8B˜{+ns/ :" ii8GX.7jzr4KEoM'^L锯e}W],k<ǂw ~Vs`T½ hg&YM년Ef3"}W|z(@=)K?];g#rsR\IAb('2ݮH$ǼyLwy|sr>rez4"d+)ȓ$].7-~}.1UH+$X w͐ti(3va''IcՕ|))BI;5*t H--|:&H2o.ګB_d^j0 Vy/Q^/\hNUkqR9 ?wT?%ًx%KN#>QqQ=R-b̚`~`Qa4.3xub6X1Ic&%~"b6)'|lH"Aļ h>15{XK# ROh7̋)2byy߆ԿvaTWr51"RS*KaK-debjcguBD稭:~@AD`m3*TlH~*3鱧(e$$uIX)ʹ 1ZwYA~vZDw4kVg_WG_֜5/2ǁI?L҅; 038y[pΧf@Dg>;tM4L/{KevY%KpƲd&p7 OoSU'9UwC'~*e yW@+`<<U\+/vvp?+J̹11P"ί2ІzHuB&p3AkVҽ1CP m# ZE(k:ר=ݓw?e݃,Ґ$cNeZup]wxjxwKqr`/Ily0?o!j"?þ.cL$biGA$8G~)YsoTccㅪ,^ d0B"Tq7,-PԷn)3GmfDfAyWBߛBIX,}/ؽP A EMY0@i_ʜI׽ƿ`cEJzF(qUHŇK /MmƇԧW/2;v;n, 5}/57wzQF|x[}1'Wv~5|^n?¾a %Gɺ,vG7VN \y_ Cs(+,젆qP~eX !YubET[K1`~t+q|Yh"Xt_P{ )CZZh)+xoJ,=TBd:k0kj}3TF$w}gaV z*FIoP!9 p.,!Hk rҢvII*ZЊ̆2zI(Bش+G-ұs2/BL)CkV[x{?E.: "dϽ{j^gDRuNlM˩"Í0R(J}%ۥؤߠ%G'RȬNv?f^yk'[n ̼`+#Y~ĐP5h/jvshoO ;%3/}m]ݒ~yem̷#4:͠Rb#|0<.Ra^[zRީx |+\wh ?5&Oޕ+|C*1@+jǷgͭɶYobE/Ֆ3Wdi[R NsSq4{ճCW(j*)bpD'qa"OKnJ,C|.oH's }b.pw od;31v4ʿ3\[ {>M/@W8d !΢cn#?}bGqa Sje~eCսz3=(A*Ysc@娽iZ8FCDj@oY,4@o\l:ءhu/0]S XkS5LiN5ڐᝢ(ϸr.KbS%M\F4 i9ƙEվQ[TJέ ׽E}w.+I_3h( rg\!%7y0+a=5dw6QFuTg9YgVDť;gDN q=! WB%0NtvYI8 i3ā ]x#ǥW)xM3[C*C[θ 5Rq+$INN" tN u ZJUu^eEsG۞ľS:ȱ@HXR%JtqBŰw,]1(sle0攈wע< G鴻z + E5Seb6&iwiE^a Ĭ |HƎ#DDP$_cS|3QCX)jZz~{?̈<s<% ߋAؚupŠ)t 9[6(f "I n ,W+(o'믽+fckxkO}79lQY^2 =xkx9l# 8gSm*),?zl veu-:E!"e$󴳴1=_[i!01QԎ" 7Z*R-c:ͼf72Y;z ˯?y?u{BxNDG+ Q*~,]LAbb-Am GY-wozܱ]k:=3~Ҏ#kBY2gM5$Fo..is;)p{_h!hLj* |240Gbe @tbO{l J| \a>c\?0 IX.?rBAga5$}5G g"޷V-׆ 6+{{ѱLu|B,q]ڦP?cY`Rm7+F'޿Ρ6wZ%FyI#? -0LCMmZcec~O._. tĴ@1Kҳ'GtkR<`o>cfSj'"c}[:LJPPvc^ZhD~Z;|u8+A3 vDpR2֟kG{fI /z~4ٟ j #R!,\ ͬJK|)&CWCE9T):.;"Zɴ[\FEAfn,ڔb [ ImRd.Ga<qI=qM;]5=lFELÁIlo j]AJu#/_kAtޜ [ќܧ~:ևy:_)n5^YלҨ: NL+P7 \@Y<jcBEҠ5Bk' titbD si&OOH'h^otGVYp=QĀV]9V.-2_M ]:L? Gy#CkkIKST#Ms|^S<^ufD7OEl`.֔8(إЦQ:ʦsg͘ @hH\Lb_;:y[7 0B6@h 9>7xQ\Mj)F&[ sm$?9RV:(D5s%k:'PM υG dW}4LnؐpZC8l=^}:L[ʌ-%?難gx 8RER_p/UhGHg,J⹽H%QpniIB+I--Mrcn%FF49[Z+AAQ42v -X\ uIs!ْ>6~ 6S#Kp:=WgN1aK5q8 e*p'z i-4?Ҩ;1? k}xn [}a3쪾!0i^a|38ՌEzD  F;]rD(>"$Ы7ضM4 ] : [o@r܋ v<+HLWIuz,2f W$##: \ yV Ksm%+fQRTzA=9f0-5g%KPnNm$]jc(iЗ:M"0auj̸ kKwyMUAmGp&? P!|Ŏ qYq\禡O#ֺ]g*br\ow X#dk( cQAiM߽T mKQ|.erW= Cfzk[́L(ˮ0 >׺H'U6yW_ii-l3~\!v5hZu/Ԥ"G%`W'@/\s?α'\YfRXvY[*?{C/=`׮^frSYk0Xd=RRݲO\J3 &2QprJBLʝ[Jg( 3thpN԰n ZWZ,O1[)A4qu)zIf!+ iބ|`5m[v i-Mܣ9`5_Wc -[87s>; Q$jӍ|t+LM\8c5̯,k‡|su7'r>lW򘆍E"$M^Iqas>**" &'qV`9nub'\u1rj O]Zx1S~3v +@995t2о^4ЅcuՋi)Z}s]R߽f,s .R*< #%0 k(ߺ6Nv'{ /0v}մU./͂>Q!1 S~d?]::#~6̳QR4+8bp n< &=|qQC  &.l5v,Aّ0"S z&y.B$q]Q[ ǘ & z9Ǘh3:_ p]STYxUjo )?>{X-m<}oEoC6sKG"B ӧ#%RFdK)`#NZzo@Xu? gLL?!Wn%Oα)߬iy)4cm.lh/AwܝGô-s_W, ʜ jVc /SR{bncPA\e Nx|9(uv1 `(7iEZ[,Ά;2Y_x؟}R%|C܌O5Ja;xm4ʣp\^B 7݉뢻;~SAd'{eibaY*m'o>y;ץ<;mU7B!I19S-ntou k@?p7vpGM8gc1LY11¥_s1ވ6?^b2&3#}p)#{c<{ǻ4hيm0?~)`vtWҳYoA_d/tlk&1;\(.[zE~| uV#u18Q|RX{G70.uW35 MioKlBˈ?\N&(q=$pH!3 /r:[g!髕5X?Įqr[ Ι Fz(uB! tYo>wE|f1z]䟥SJQࢆ⿞Kyo/'g{9Lpm!!-JTvA.wzh5*Q !M ]Rc%´.׿BʌD>؅n0ٖħJfŜ-/cY8@V _g yI2ݮ j/ӂ([Z!f ɨsϒ X7TKOCEշ1EJ*GW|}EHϵ=6JQ0`ݙ40䟿(]oh&i\^[RoqS d 2]Η]0cѬ_;*Uؽd4CwcEZ?gUD3&Qb7ʦ{4&KeOe7c,#> a77|3q(Pw-|0&2'." G @fh~[2 oi-8+v ȹ >JAaGK6D8DZq)ig %. IU8n &\uIQM `:ĬlV0f+(G7KE.&;W#Ohk' @ ^v"kdDEyL'pal*Z wSuZ$!ɗ0]:]VdZtAN3KAzZc")VdDCBzw]?Dm.nkӎEÓ"ac K)aFo0_.-Yܚ~i)EԻ^E><(~5h@3WԜ1qmor0//x3`P0[-i]t3t˻H cV힉T*,g3dv)g~TxI3?6;0k iEIW7 v}ul|[SD1+>>~s4Q8U8C7+QpFAEO_ٖVIc $% I ͈Lg/`|[7JBpCHLj'$߂Lآc(bàI5 p=}6^3|ÕdjS7(F:쬖z #4S8P 4] >4n5 bNvJVd J H۬0Oɤ/yf c?4"`^3ՏQ@YZsurveillance/data/k1.RData0000644000176000001440000000051611765414544015154 0ustar ripleyusersVKN0;NZJAEH.@]B 4 ħ"aM8Ψ& ~ҫ=mr5#"d![MXpJT: 60BX/U]e- 4B@VerX 1ƞ'sQOL! cJtR|\RyG6L􎵗#ZC}w}nvzN}v]{93opHo_3^32222 <2ӋHӷJ/GosxZ9Q׾i_:mۼҔ7הe`q/]~1Mp surveillance/data/fluBYBW.RData0000644000176000001440000007402412171263557016116 0ustar ripleyusers7zXZi"6!Xww])TW"nRʟsef,ť:~ 2;ruyhqL!6r@20ƃfc)ؔ@a娴`$wݐZX͞(Q֎6z"ϒ Mu淼2:H|9@f`'}/T(,cqGi,ux'teɦM7F\%o}{P!(ao~_R2읢? Ȓ[|0>ς{vW-$`'(lط8k. \N_(f F\r*Ng>3fÎn&?.PZQɱq4`y{n+M[B* c5Z J9l0DEMR8CCDm]y*n޵=[Yl\R)]k!V؆$(R*i $'oEJO."IqCJ+#"|'YNUSkaW@& xAqY ~p(AKKt5N+ sҔZ-os[&[3* \rrxFTEٗ#f\Upq4S[ԬXӆME̝RՌ9%9FJ)~4Hٴ㼼7VՅ5Un[2Ko]a579H~"3Ô'a9Y! ,bk [U{. Y5ݜ/ ˒ @#5+}mӾkPV7J%RI^쐟GKj2)c, B1y}Rh"]{ߵ'.,UgAznȈɻ-yNH‹Ew# yPUs ȨhʟRhqYq[OOLtrj%UEHy/˝7heC:0R[ft*Qwՠ C*$>:TBs|$[WHe@=%p&=5" )~}O~8"?ĎJLfD&mZڥ 6vxՖSGry+(SJq4̽CdnPZ ӨIc>(X궙-A11(K-1߄Uq\Ā xu\OyQo ?VR$+nP8*>#XݥQH̅t/:I>[R/(0}$ NU A(;Cy\ @K.;oKO)2KpI MA@ѵ:JU,˯TFȶ{-C-O[\S=4!#Q_V_5IhѶL=Lext)G)ਧQ0o4e*!āo%=ڝhņdB}Ayh1qP{HTX'Ybr#o n:-еنɜ|z*䄆_~XYܻ>JYYzeaKj݁n)}NB[ 7jgn:"+t|t%Tf|3ʇA; F`Cyբ"jzZ"\ɷ.q)f;l=FQ_.q),EĐlǁE8< K3eY=/4^U+zS i܇e{jBuC}8|gݪjLt}AX4ϑΈ=V,S"yiˣV8 Y/rȊǡ";y| e!D{]FƣhMB B8Zh3\M3z?XZ1|FޮGb$^.Hw./#YG2uYyDjmpm햁Ht(HZp^A#?(JݕŸJY8m7uE* hr(| OU{!4Iq9+yΝfF?V[S[VkR{ <&V*_]xAGVWoK?X-#mTTi o04!P-cp75Q q9NBf$`΂j_L ȥolc|͞ȹT^}Y-bNT=,1CTJ Eozcl♹S  uaDIbNa)H~+knm`):eu'\^+["~p2&28e+^srim#shmCoHL*b'ȴLTc`Qƙ\'9w *a]#KPY`3vv UuAQd=6 5WBHw!oCyy9QU[ve~dG(8զv \[|!tԛb!U`V:e`?nglޑ-fr~'0Mz2.NJ`w|-z`Hd7=\OΔ}*iu -?A7nHevʴl cٖQ<%xKCu]61Aqc[ڑQ$*ti$'LddI;A_g,oSĖ}R5[Zi܍U`cnfX g̤5/&눢&XbЦ_ԝWOͭ[|DQQ9a't2Q=ü! UTv](6&8!_I\.Gv" KNv Z MC9qO4(lLZ&Cz6]]6pP7v9+(c1d3š{Թ=~<'yC YԢM"x{ 1ܪC#L> %`龛@ļ^6\ΔmpT[ QA=Y=Qeo14d9{ ˽ј`] h[EFxDR,;t+]Yԯ~Jm$=lI"mBʜ-ώh!^T"K'KcF/wAʨ^ 'DaQa;N)sη)s²RvK><'s T/AjSx4r]IT8oυn hG lq,WlMKfUϧugq@YL gq4"Beaወpey7<G(Q̱eIDdO܀e|y]U sffz%0_:daFb$Ms&G' wXP[HH˓f4P/aikϞQqs1i;(%q32Zg^"Oϻc\,q麴4Ve5N\m泾VBk[Ț*tqXom_V*N#W#R`UF?,}GVq1j<vJ'z?\~} !ͫU/frZJۘ8˜s~.!וO?Ѭ~75h35{-(B"%@[$HMiH,Khec̍ <80b@+0(~g:`2 6X_ ( a+pǑO*ՋB,q+[ݵZb)"ы%m"VU K5|uPPsNrbZ75hv¶4$!E (J\,DvƩSPu洚 Ѡx>z|WVK ) 2ԗCc"%ϝHDdcH8I9`"JIl~+\:#5isR8\z|y)IGtX|"?ݚ1EqA8־jRJa(ϛiEos\0S2Nv| "V֖BzS\sJ_WS`6h0cLuc,iF.$oU G`QR:YGp7LV9#%$ vHH^~h1Ddrp~ e#<~]hIhZVI,!Tw7/tWb;`6-9+F#Դ8tT3U!Lm&<7QͮoMԥ2XQMe;x;'U)ը՘Rc BXj@^1rem'+28+C G \FqO YXJ&T&qO&jm}D˒8/H[.-N!jIyMWT C P\{3f5!ꝑ?e.ԱjjV\ݹaceYwm- ޵R8sK-tsjZi۴ꅷbE謺ehkX}PqF?J?.j,̙UHQ`ޗ=(!み*wAyP S>mjesU&G3LDuv%89\a˷6G<- NkَT?d;߇y|dH60Ѣn:O<Ijџbj!cɓ`c Hv h#0Y8.!Iuҹ~d"<W`)>zMQ/0KlBˈ?\N&(q=$p#_(˅ѕ~*.aaC.i #HwUip`?tM-Ow$Gڪ׽zn DtP7n7σ:Ve~HtVh6s B>0xGvJWU8T5s?α'\YfRXvY]͟JR˙}~[12LHbmVy-Zft/¡(sK&xW$IsSJew"3}H#6:HyR;Cc%ϹE(ڒ,1RCFPI;s4m x#^c49 WNÝ/tτig2mz(6|n~90Xk >J|P9&YWr &i,O=r 2~2lJ'甼w]-!Iz '_$Uv]8ypI?u]!u֠Uqb.LK( gP*?4umMb1S@;hxA+.?0‡ob]lL)|e-%~w_葵K~btZxՄW0!09b =j,ء]J;O7G!1 VI[ ^TPW%gOX(MZBH;Ik"k5(ЕDkxm8x;}">Ԗ ]:6\0-<# ԐoTCfZ/ũGET&79lUwku:\_67PQ)u'iE@{\ԛ씓iTöbBU<p{EuؑSOp .",c~{;Qئ2\KZXvMFmNTm(*rP&&Q6]"w!U"0h3^X[VEGWW_ "$Sf [92:- (c![H˙c$Lܯ )!jnY Q㶬L*|:DLx anې WE 蓂Ac04=1|hBSkhu1c`@0 / *W[|z- JWߩ΂*dFj.`w[Aje/.[.AsAYꏸ̬V)ć:a!ަFSQ! 7r$kj13RV)>+90\o6P$,fvQ(`45F*@LpqO@33Dw D+sO8M"мHpqK+pI%h *l_=M ܭJqNu>(&M t!BI$ ر ;Oѷ&L 7[h]_&h^!4FH9t^` 3Z,D XH++~q!{Li}P.f˧u- mXz) =[u_u*`e->1J9؟H+= _S<1 t54v;󫚉@*t]N9v%(TĔ\;ma`o$‡%њ3>\ ј՝67Z0 9Y e-4c\(HpF'ᖆɻ3y 0 &0u ?dҘ"A?GE; & &th1O3UUᔧo!ُ;.h+_\ŒthDF97[˓i[_^e#B^~y},тqhd ~sp u\[V57=C7]| ꊍsܠa505, 1eS&14vDDGd7•%NGFlleDTxҀ N)3n2G CW*3LuǴ:zoya1$B͹ {1R2cP!XB-<_0%{^||bƵ6J8{#_Ֆrd׾[XY_O}=h,eoyX$$CYOߓ`Yοl -heRyab&NjNyʽ89Tip]"PY90Z+p[^E>z/۸Nk %ዾ~20ފ; gV"e|FV?o+U2}]2U\yR%xPSs" /JS/g}Reſ!E+d  []|>Vn40SLY7-EQ{}!l\(DYPBzsňTʷl:?=H"UǮN6f+}7f:匂n嬟A'֧+fڞE7mLw_9҅{٤@Bho?B:1ֿP'hХg6'yZ0S6E-ޓ&9@1PHa.[$<, zgfyr.dUΡ}NwW4tKZgz,N.oS.1n)M|H钟LcPʶuyH\YSOE8<&be7כn5ϮqduCfKhJ0/vޓѼLwu+#L`F Ć)C<|_ӮzٔGXLDqis~֑ p8?l8FDSᜨjq!yIԒ O#A]q_*pT6[e5MTewS n5zjآ'΄2KM6v<<8x Za];Q!vp\Mb[ ">:c9 ݢ(!joؕj,To0;rd0`PqTиcղ6 .8hwe|T2k2qi#:`̎O<^`C]g~.7ӺFZևqt]G95ee:~)N>{D`8ģC:LvTvsD8pE|dVܬd9xm)psB/SMt+˦j I!ӄ $N1J:R005zZcGMhوD7 h 2ZPG-YTi= ]21 k. ~N)C֢yHfF<8 0L608sގecw)ـaÊ}M_ }ϙ\(⢝V#)!~$xK C3 . )PZ<+9匕KP&wE$ed[-d炐v"mKs"zi\J1%v]ɗ˻8" tSTԇp1"m,RX,[j[-Qx!=m'~7N mж;b:˪+e/)GD߆j Ox3Tm*3&P=l]xo D[)tw6I_rzC!VI"!ҟBJyfG*#nY65R0u箕}'YKl%2{JxS;Ux!˂8\bա1'NG\4q$&)'ZA M6}s*H\wP'=c4 zQjr CP Dlt 6%1b.CS/SFuo3$fv*#Qy%B3KWp5H!{. /Wݿ3e}~&v]T=3R$CnmWvv\-65G/XJ*QL8W@;^)Q!vB܍ Χ/MTF$O 1@pEcOT+1MϪp+W>1~"-d"[aOO]ifCMe} 7Q\\6 |W~_2Tod')V }vsZ _ hUgJZOijq9q37o>;h#zO[`/(pi=C_"C-:s\ zAs~I݉^~J}-'Er j 5}5+~T`~ǔ|}P#UtGVA4p8fYRo\LVtW{-vͧ݌!mzZ #s !a{H_Hцh?չOaIa-/[yn-ƎU;<8q$ٙeX(D@WꪮMQYrR?|:؝8\"2cꍽ!O\#mK%M2[ek2NR ϐЏ\ٟcgTВ3 8b9^WPnĥQpG!b*J 7KF Ol5aZڬTՙtM"  X^-j2IT!Úf4,JAh{xL p-4FPNRDP2+кLMbDg}ֵy'X;8&(6%/ RJ8?z8_@YD4)XQLM7vK&TH1@o}z_:l{e/?:\d7X)^vJ;zAw 9h CD`(E 䆷HbR6*M3jK/vUq1-+^GB\@jRB߶5`\k<5)fO;bVu`8R ?}LICQ3ħwS!vЇ$ܟy?9J׸8<,Nw8=H?pL:`gRuϨЯBȾnmz(Qfi','-H…h%u)\6^ !W$ [ٔ3b0GRP[Qcr"2 -6}6z77t RPOircc_Ǚtg/?8,B,i&<>c@4Gzbu}gY8yH)ap&?i\S~Ûhͤ%e< ȺSHb9rĸ?GW 8^ge]A)"jYE_R&{?YlZv-Gq^d!>['-cG2wL@uM8D[0l O 'Q [(cLp |MlZ!D,$6/Fd4՜d,`mwE;ӳvd`C%ve<WN@?OVºaº_ʸZ~&YX z:7 s<s$a-v3!/%U f Q`Y)t;ݼ9]{Kڏ1`Y ZE3n~%݅rj_sJs0=F\Rd B4iyE ۋnO9?Ub9ŪQV d D]2#KZ9.y6Z畿K(]h -S(xI~ fsђ;sƝ D34}H<P $pG8ttrĒYsNAB*f`C5>I>lS6Y`VV285UMl.BDAGRѢ1AH;^lݦ);bm8cBdr7Ɨ[#v݆?KRҊ\n% GZxC͎<Ni׻@V>̗&:Xw{ WzRzB0cafV^`5d.N-N_fˈʉyY0$7_9doQh`)iDQd/5XJM\u)dtvÕ68Mab.2k&cQ y?/l.0º@=5l}G.9Mps $Z,K@/-gnt5lŀQ#j=:}ϧ?$aOYMmWD&MP, 7Q۱Z\˶M w ܲ{P/1 k U&&wUxJ\NkdBi-EQ`=>s5f0+7~޵- f bn~8#n   ݈p]@V\T -*.K筭N޿I;/_oVV[,3]La7KXejrP%c.tI_y- kG!͘ fwV:.[N5% fNM `Q:BBqYMXAv^ς,'dDat҈PɰK5W:C,5O,&#LETunYlUGڇEcMвWM275{y#Zx$ڲ=`}5<']B4b/m`?CRGhH,159[k@?xN/ %TKa PG.b[Ο5@Bf_.m!htA*HEe6-WMGQ"*bIȒD=#Fuב04?Ǘ]ѓ#%NXjU4ؕ:ǡ a6b<(_ģC`b'}[U\"ٲ; ks5ufo)+ 3']ȯ0+fEiԦçMk yZH-p]Fv" _JK'PfwŊ&D9WA噜#.sP6KRyD畓 HѻLZnpL=[!yv8.ueyk1qM:0揟 O23A}ɤtxh¸WNEr v"Bя<&7P-cn]8ّ6E[n7Kɥ8 -Mg&31ڀXʼn?Bx͟xJQпhyS kDD漉-ɜ%A%bqI뀢WLHpp] gn)ےB(tv %^v Ip-`PTʘDz`64=(]h)Y]FOW$G*%' ZMj` v٭4eӥ:N: Z@dMz!l>BXogC+}">~(ȕMRK?SF:#QXX0rbX'F' ]n4RS0shԫOFTWmUdMmb(oGV')/fn4`чH J8M҇ (e v|so΁K2 :D"DEvYB.&V:P؊ɷLdSS45pfZX"0[Ն:QcIE۹jn$\p#C1!0Zui/XhGXKT*$Q>=^p,5->K[Ȑe$^|1_ԧLnIT ܀=f!d*1{T9ΦԼv041G0接^ )$ Cق,'H Є= x ok,`tZiˆ0!|ڏ[<%Q@.6~ lFȁnaTLl^=/<\C8}n&%q] e,IkTK C.$9{#"봷B℈\H=>brKQšWRPD]M^lIu(Q_8 Œ k:'*LoHX'+I3†1R̄ 9,![+0Ek?~'J6 ]@ ^y$bK͙ pDJf&krwqwYƶh$Q|vM9<?.}hkʁ3k>3z㚹g1#WWmiQ' w9ݐȝٽ)u)ږidZ9&~kڹAJ`) iLyqNUMǴ 2CI6#ޓkzVH7>΁$jE*Lh=Ӛ-,\qHJYX[#:}[)"6) pweP#*RV]O`1߰DIph6J{uR sLNC Y* k56-`njg#4+RU qelmH r؛yAž[旲)f`Ѝd O9o'{*Wu I+}!јX}ÂgR=9Y&6zj{*jYUBtK: )GЄaA0t<{x~Oԍ@b""#fڵyPyS?itY`G`: Կp t*pjGQ qCqFa_{Gi^O+!eY)8C&& VK: 'WC'lbc/λ=n)7$2c.XiX|q'ۡfW-!5?^' G-s4jd!?Sb* n"EMzQm 5JH]Y\vV/{B˽٥ܣ6^qSb_~uSc$/3z@D#5霅(&4 7>tzۭc_IҲxGxfa{<J9~%v#!\6۝as8qz͋𚼔U"77vv$Oek1G zy10iY[MTSRڐY[nk,|hXSXsgB42Զ*%T6٘)M2ң%8<;|a\ъ8ai^cYn.,:|BßTՉiE5s?9hu˗.иQ\m:IMkqŒbnpzDOW{JM5 s8cLn7xf7~77BbSN0Y b㉁~cAA0!ԽV*9$oeO1ȷwU f`wtύh\>/~n͝irGW dH<ѦI6do()B:;rYpV6XwSx94=_ł`l,Us_MAr~ܔTrL5K覿i]QRT\O?KA_KXoePH3K KmavJlSnUz 8jZZj5J7CVcU'Ej>v7FW_<,d[ rs~]_YR kO"`cmhYB YQܝb|;tbvR)^*R1} & tӍoއÐ-(TfJUцr>̐OMWd_TFG`]R8+o쀒l7O*%KfL9.L{#C% ot-4Q[wf,5 qM*sMtsRXy+XGM 5nea )t?Br" Z"urW- *U+jtZi ר`i8S&7c\(h_)ac^r)֐6AՆo{%yeJa)|]B:JۦXyn|-?"GhR@ul}c1ߔL h},= oo2-_ 3pk7}䆲{".aRIj7$4\";5.(Q{gMUFi[.@jZoZQKU-,ʷ'?o*fV n:,hk=C)@>Uz]y)|J|lI9/T} jscW}4gDHWk/wdmTi/PI[[]݄ڊ q~ nԳᅺnTSgFfnͧ~%_&)"G6C7*-$_/'kr:_<ܠrXڈ+z H CKR +7 kTƫ}zÉ=h-mN9w6TC;Mqi[x1zZ ,Hi,h=cdibL"~I46ٕ )UdYֆ x~8Z,%ھ%אh 7bI{$ ېa`Wӌ0d6K{ fffnJܵ}65z[a~_?.)= kh 4g 'DYނ8L?&(*|G?ۓ FXykF0IumV]ٷmТ)`ˮg6g1xhoo|n98Jwٟb~nC<Yj&Y D͐8Ǣ@,_mjh,-/2?>-63.#YN.9u@rД%:/H`.D[H9X ]rEsq7GW إ!b{oY- 3p:T ȔT6'}N;ŗ1BzAhu5P裯pC܉Zo0:ӳNZ{r%Dn[빶ˢ5gR_X]V 8|:8L ,˞\Phua-FЯSaQMoŵ[e}[Oұ~`*ض)Ĩ4˂68mvO(8|PPf~t.OŬKy5t' rYWd} 39mĮgJ|(D/~X,6NYyy#7qvE=|ieIfV]^69nuECuU]D1㽽W#"X7k['%.X+I메"iDl vPܾ.@et .F|*h+ܫ\/mIgn"'8) T+cQM<]ߚ8bO2#`u-KysoW $y(GUUP{O9s̛¬dbUf&cbg8Aa(&m'yedpJKn)f5 6'Oqp Oij7sipVo k[oĞQd`6[c (e <5J)mkᩛAeğ[a' mpaޗ';;jE9wttE]ϼut>Dp3ī"AP+'#iBfyR3;tk%b֢&_:&eFY}#C1-C3tHq%.O' ǯi 9#wr+o.؍-#93UЕ[>EʥD Uvo-iz9(K<y!mSTȁQTfH:+g*K,6] ^H %g3ٯL~SƫzJZ'{O O^WL ,3.j\ Tv0: c~P<=ٖvm<#w4+ 4cxmpmZTvx4Um1Ag`3 TPGթlM:r85EDid$i1&\ {Saj8~. ZGM3]!_g罪 YZL9< י m !d^ 5ߙ~u{חo4\ $ŚC,*S`-C%^N/㮪BPAN{] z abh,(c/08KM 6܉/ܖM~a|+Mu=1xq!*hoK+1jVg\tnJ3B~>נ} 7었3wpa|T8?G>P*q1q8lFo&/-52S6h [N85nCcߤk;.lhGC#d~ ^htFu!1B THGՌuف+.8m%|MvdNW/{NoX1 6Zjʮ$䓉+}o.*vp3pܒdnuy)2Be?o۽ B>z7/6Mn@P[M嵰'U͆kSrG+ 11!=ţ;N/ۈY\ 6<Ӯ"fiDSzf)J7D ,E1NOp~1:i=3H_fBJa(>(Ч%<O #n2>-2 UrU-cDlGs؎wbDZ53cʹTa$LpHHkί ŗl u=@P6g+ #n7X|k`^$(}Vn3o> ~w@N׊ aCO 7__`@)3 [,oLhS%$+Q qeQJq 65G32`=4ɹ ]Ŕ}L'~򼜠֐8ZçdpqmPiW|/$4j0^Y0i vNq_ v'F󆎾m(E=U,/OpZ t j ͪ( c?Q?;\ 4&vFqW,Ƃ f6\W 'h[ Gqɤtj}>ut `jomj9TiGybn)ThLn"ۜqȭw1M5fzg|f(j_5*:rڮja@}ݩaYt[whE/6c*M3{cVW1 f.}>M 6w{iITOYS ' N]f@U8O4[GI2C<_;g$9H.Px#+Ѭʮao &?^%[ `/&R&Ji=ȫV諗2qpkj&7v,bYFTW>ciyu,RSQ5.aઝR-C"5Fk5sT,FkpJߒys/MBw M,/Mrc 抈"3'|,ӃE*UDv%d=S+2 䇙ef6_̻LJoladfx0[ X0z!Kg)ir<6j }Oqٗ>X [ra9볆Ⱥ :C̿E GHzx..m~ݛ4IXJ9'Nixy|z;䴶SNep^94i.P_n  pQs6;% B:0/-i^̅)Do\LˆWs`8+*Z6~gyތuLDB01ℿgz5V%'T20}`wd‰Io0[R +j>{S縄rB #z-%Z*SҖ KPQN)<$iR-Un0҉g=߿7y[D?EܛY"*Q{1t=2 O>Z*x+%E F8u6~Y Cn4yCO[2wKbpE{H&ivqV*9X$nU$P[]8jKY#Jp#M0 =ѐ %#6_,Y_qOF4[~Z_lS- %0h>2X a"]K5_=6YW:}` g(Űˌ%X);[T-бhC@H$k,}z8#IO5R[-МDmk'lxyK.+lo;3Ϻ);9ZAӴVw cQ*u$jW3Xo ue\gI F (3 \ B} uPdl.-k 9iCbܰf=42s@#_ђ\Q'WQ]tu}7(NIqțDu6m4&GzuqJj[rjTҠaoLX勧L|٪gFgJhՌz&OјU>GSj,݉W46k<KY{nKlZ'uJ,O)U{їw|Bvx|B p@(016AI8ug6Bfm?9c0&E, h* lzg3s5aWP;˰t~bRx~B^TiV@_4YHeWreUWH8?51M &ʳ\01!PmN?ye3 6-L pq%@Д(zmm\2P'eBΏ Sѿb;zM}&$M`ZDٞC|Q7S2qaTmK߀;Lj6;yI8R` cX7lj뷟sObsRB9e84AB\>Wfs. ^)vSbbe]GsL,@lc&˦U=1D4zBnA^ ._#23*S` 185' hV+P7yKJNwƓX@ZR2"M۷L{άl~PD%?K"3ZTǪi\AKmh)̱m^r{doɴSY>Z6 >8=HY)X&i1T |mR d?J=TH~͔܋Ny# SU69ғĆzc=AF{H*NEU+D0xrj ۼi.gWY&w*_dOϱ&2Ayd41΋*H`r1?($̙l٨]mg-'ZI?gg ŕGfFj@3ӵv®~P7}Ee氰8k q1bbx(Պ+X MCh\xS -0M R M5L0Y6q^yl+DnsԔd`.L/`A%7ovOAV[$luy>&dW}ᯘ-qƒgI*pq+>0 YZsurveillance/data/measlesDE.RData0000644000176000001440000000442511765414544016506 0ustar ripleyusers[lWg/_M[%N-m@ۄؐ tx7 )-ƝBUUܞZ U'xUU_*PA(cή㍽}736gΜ93Z?rC~qNr0$SXL''^yv'L C)CԢ^u6q ` `\+Up ׂ:V6vN.n`xx?>n7G-V{>0nv| LOO;.p$Yp| >.0