bayesplot/0000755000176200001440000000000014061724612012257 5ustar liggesusersbayesplot/NAMESPACE0000644000176200001440000001021014057717550013500 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",neff_ratio) S3method("[",rhat) S3method(log_posterior,CmdStanMCMC) S3method(log_posterior,stanfit) S3method(log_posterior,stanreg) S3method(neff_ratio,CmdStanMCMC) S3method(neff_ratio,stanfit) S3method(neff_ratio,stanreg) S3method(nuts_params,CmdStanMCMC) S3method(nuts_params,list) S3method(nuts_params,stanfit) S3method(nuts_params,stanreg) S3method(plot,bayesplot_grid) S3method(plot,bayesplot_scheme) S3method(pp_check,default) S3method(print,bayesplot_function_list) S3method(print,bayesplot_grid) S3method(print,bayesplot_scheme) S3method(rhat,CmdStanMCMC) S3method(rhat,stanfit) S3method(rhat,stanreg) export(abline_01) export(available_mcmc) export(available_ppc) export(bayesplot_grid) export(bayesplot_theme_get) export(bayesplot_theme_replace) export(bayesplot_theme_set) export(bayesplot_theme_update) export(color_scheme_get) export(color_scheme_set) export(color_scheme_view) export(example_group_data) export(example_mcmc_draws) export(example_x_data) export(example_y_data) export(example_yrep_draws) export(facet_bg) export(facet_text) export(grid_lines) export(hline_0) export(hline_at) export(lbub) export(legend_move) export(legend_none) export(legend_text) export(log_posterior) export(mcmc_acf) export(mcmc_acf_bar) export(mcmc_areas) export(mcmc_areas_data) export(mcmc_areas_ridges) export(mcmc_areas_ridges_data) export(mcmc_combo) export(mcmc_dens) export(mcmc_dens_chains) export(mcmc_dens_chains_data) export(mcmc_dens_overlay) export(mcmc_hex) export(mcmc_hist) export(mcmc_hist_by_chain) export(mcmc_intervals) export(mcmc_intervals_data) export(mcmc_neff) export(mcmc_neff_data) export(mcmc_neff_hist) export(mcmc_nuts_acceptance) export(mcmc_nuts_divergence) export(mcmc_nuts_energy) export(mcmc_nuts_stepsize) export(mcmc_nuts_treedepth) export(mcmc_pairs) export(mcmc_parcoord) export(mcmc_parcoord_data) export(mcmc_rank_hist) export(mcmc_rank_overlay) export(mcmc_recover_hist) export(mcmc_recover_intervals) export(mcmc_recover_scatter) export(mcmc_rhat) export(mcmc_rhat_data) export(mcmc_rhat_hist) export(mcmc_scatter) export(mcmc_trace) export(mcmc_trace_data) export(mcmc_trace_highlight) export(mcmc_violin) export(neff_ratio) export(nuts_params) export(overlay_function) export(pairs_condition) export(pairs_style_np) export(panel_bg) export(param_glue) export(param_range) export(parcoord_style_np) export(plot_bg) export(pp_check) export(ppc_bars) export(ppc_bars_grouped) export(ppc_boxplot) export(ppc_data) export(ppc_dens) export(ppc_dens_overlay) export(ppc_dens_overlay_grouped) export(ppc_ecdf_overlay) export(ppc_ecdf_overlay_grouped) export(ppc_error_binned) export(ppc_error_hist) export(ppc_error_hist_grouped) export(ppc_error_scatter) export(ppc_error_scatter_avg) export(ppc_error_scatter_avg_vs_x) export(ppc_freqpoly) export(ppc_freqpoly_grouped) export(ppc_hist) export(ppc_intervals) export(ppc_intervals_data) export(ppc_intervals_grouped) export(ppc_km_overlay) export(ppc_loo_intervals) export(ppc_loo_pit) export(ppc_loo_pit_data) export(ppc_loo_pit_overlay) export(ppc_loo_pit_qq) export(ppc_loo_ribbon) export(ppc_ribbon) export(ppc_ribbon_data) export(ppc_ribbon_grouped) export(ppc_rootogram) export(ppc_scatter) export(ppc_scatter_avg) export(ppc_scatter_avg_grouped) export(ppc_stat) export(ppc_stat_2d) export(ppc_stat_freqpoly_grouped) export(ppc_stat_grouped) export(ppc_violin_grouped) export(rhat) export(scatter_style_np) export(theme_default) export(trace_style_np) export(vars) export(vline_0) export(vline_at) export(xaxis_text) export(xaxis_ticks) export(xaxis_title) export(yaxis_text) export(yaxis_ticks) export(yaxis_title) import(ggplot2) import(rlang) import(stats) importFrom(dplyr,"%>%") importFrom(dplyr,arrange) importFrom(dplyr,count) importFrom(dplyr,group_by) importFrom(dplyr,inner_join) importFrom(dplyr,left_join) importFrom(dplyr,mutate) importFrom(dplyr,n) importFrom(dplyr,one_of) importFrom(dplyr,pull) importFrom(dplyr,rename) importFrom(dplyr,select) importFrom(dplyr,summarise) importFrom(dplyr,top_n) importFrom(dplyr,ungroup) importFrom(dplyr,vars) importFrom(ggplot2,"%+replace%") importFrom(ggridges,geom_density_ridges) importFrom(ggridges,geom_density_ridges2) bayesplot/man/0000755000176200001440000000000014057717550013042 5ustar liggesusersbayesplot/man/bayesplot_theme_get.Rd0000644000176200001440000000632014057717550017355 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-ggplot-themes.R \name{bayesplot_theme_get} \alias{bayesplot_theme_get} \alias{bayesplot_theme_set} \alias{bayesplot_theme_update} \alias{bayesplot_theme_replace} \title{Get, set, and modify the active \strong{bayesplot} theme} \usage{ bayesplot_theme_get() bayesplot_theme_set(new = theme_default()) bayesplot_theme_update(...) bayesplot_theme_replace(...) } \arguments{ \item{new}{The new theme (list of theme elements) to use. This is analogous to the \code{new} argument to \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}}.} \item{...}{A named list of theme settings.} } \value{ \code{bayesplot_theme_get()} returns the current theme. The other three functions (set, update, replace) invisibly return the \emph{previous} theme so it can be saved and easily restored later. This is the same behavior as the \strong{ggplot2} versions of these functions. } \description{ These functions are the \strong{bayesplot} equivalent to \strong{ggplot2}'s \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}} and friends. They set, get, and update the active theme but only apply them to \code{bayesplots}. The current/active theme is automatically applied to every \code{bayesplot} you draw. Use \code{bayesplot_theme_get()} to get the current \strong{bayesplot} theme and \code{bayesplot_theme_set()} to set a new theme. \code{bayesplot_theme_update()} and \code{bayesplot_theme_replace()} are shorthands for changing individual elements. } \details{ \code{bayesplot_theme_set()} and friends only apply to \code{bayesplots}. However, \code{\link[ggplot2:theme_get]{ggplot2::theme_set()}} can also be used to change the \strong{bayesplot} theme. Currently, setting a theme with \code{ggplot2::theme_set()} (other than the \strong{ggplot2} default \code{\link[ggplot2:ggtheme]{ggplot2::theme_grey()}}) will override the \strong{bayesplot} theme. } \examples{ library(ggplot2) # plot using the current value of bayesplot_theme_get() # (the default is bayesplot::theme_default()) x <- example_mcmc_draws() mcmc_hist(x) # change the bayesplot theme to theme_minimal and save the old theme old <- bayesplot_theme_set(theme_minimal()) mcmc_hist(x) # change back to the previous theme bayesplot_theme_set(old) mcmc_hist(x) # change the default font size and family for bayesplots bayesplot_theme_update(text = element_text(size = 16, family = "sans")) mcmc_hist(x) # change back to the default bayesplot_theme_set() # same as bayesplot_theme_set(theme_default()) mcmc_hist(x) # updating theme elements color_scheme_set("brightblue") bayesplot_theme_set(theme_dark()) mcmc_hist(x) bayesplot_theme_update(panel.background = element_rect(fill = "black")) mcmc_hist(x) # to get the same plot without updating the theme we could also have # used the bayeplot convenience function panel_bg() bayesplot_theme_set(theme_dark()) mcmc_hist(x) + panel_bg(fill = "black") } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default \strong{bayesplot} theme. \link{bayesplot-helpers} for a variety of convenience functions, many of which provide shortcuts for tweaking theme elements after creating a plot. \link{bayesplot-colors} to set or view the color scheme used for plotting. } bayesplot/man/MCMC-parcoord.Rd0000644000176200001440000001754614057717550015674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-parcoord.R \name{MCMC-parcoord} \alias{MCMC-parcoord} \alias{mcmc_parcoord} \alias{mcmc_parcoord_data} \alias{parcoord_style_np} \title{Parallel coordinates plot of MCMC draws} \usage{ mcmc_parcoord( x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 0.2, alpha = 0.3, np = NULL, np_style = parcoord_style_np() ) mcmc_parcoord_data( x, pars = character(), regex_pars = character(), transformations = list(), np = NULL ) parcoord_style_np(div_color = "red", div_size = 0.2, div_alpha = 0.2) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{size, alpha}{Arguments passed on to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}.} \item{np}{For models fit using \link{NUTS} (more generally, any \href{https://en.wikipedia.org/wiki/Symplectic_integrator}{symplectic integrator}), an optional data frame providing NUTS diagnostic information. The data frame should be the object returned by \code{\link[=nuts_params]{nuts_params()}} or one with the same structure.} \item{np_style}{A call to the \code{parcoord_style_np()} helper function to specify arguments controlling the appearance of superimposed lines representing NUTS diagnostics (in this case divergences) if the \code{np} argument is specified.} \item{div_color, div_size, div_alpha}{Optional arguments to the \code{parcoord_style_np()} helper function that are eventually passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}} if the \code{np} argument is also specified. They control the color, size, and transparency specifications for showing divergences in the plot. The default values are displayed in the \strong{Usage} section above.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Parallel coordinates plot of MCMC draws (one dimension per parameter). See the \strong{Plot Descriptions} section below for details, and see \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)} for more background and a real example. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_parcoord()}}{ \href{https://en.wikipedia.org/wiki/Parallel_coordinates}{Parallel coordinates plot} of MCMC draws. There is one dimension per parameter along the horizontal axis and each set of connected line segments represents a single MCMC draw (i.e., a vector of length equal to the number of parameters). The parallel coordinates plot is most useful if the optional HMC/NUTS diagnostic information is provided via the \code{np} argument. In that case divergences are highlighted in the plot. The appearance of the divergences can be customized using the \code{np_style} argument and the \code{parcoord_style_np} helper function. This version of the plot is the same as the parallel coordinates plot described in Gabry et al. (2019). When the plotted model parameters are on very different scales the \code{transformations} argument can be useful. For example, to standardize all variables before plotting you could use function \code{(x - mean(x))/sd(x)} when specifying the \code{transformations} argument to \code{mcmc_parcoord}. See the \strong{Examples} section for how to do this. } } } \examples{ color_scheme_set("pink") x <- example_mcmc_draws(params = 5) mcmc_parcoord(x) mcmc_parcoord(x, regex_pars = "beta") \dontrun{ # Example using a Stan demo model library(rstan) fit <- stan_demo("eight_schools") draws <- as.array(fit, pars = c("mu", "tau", "theta", "lp__")) np <- nuts_params(fit) str(np) levels(np$Parameter) color_scheme_set("brightblue") mcmc_parcoord(draws, alpha = 0.05) mcmc_parcoord(draws, np = np) # customize appearance of divergences color_scheme_set("darkgray") div_style <- parcoord_style_np(div_color = "green", div_size = 0.05, div_alpha = 0.4) mcmc_parcoord(draws, size = 0.25, alpha = 0.1, np = np, np_style = div_style) # to use a transformation (e.g., standardizing all the variables can be helpful) # specify the 'transformations' argument (though partial argument name # matching means we can just use 'trans' or 'transform') mcmc_parcoord( draws, transform = function(x) {(x - mean(x)) / sd(x)}, size = 0.25, alpha = 0.1, np = np, np_style = div_style ) # mcmc_parcoord_data returns just the data in a conventient form for plotting d <- mcmc_parcoord_data(x, np = np) head(d) tail(d) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Hartikainen, A. (2017, Aug 23). Concentration of divergences (Msg 21). Message posted to The Stan Forums: \url{https://discourse.mc-stan.org/t/concentration-of-divergences/1590/21}. } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-test-statistics.Rd0000644000176200001440000001365114057717550017126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-test-statistics.R \name{PPC-test-statistics} \alias{PPC-test-statistics} \alias{ppc_stat} \alias{ppc_stat_grouped} \alias{ppc_stat_freqpoly_grouped} \alias{ppc_stat_2d} \title{PPC test statistics} \usage{ ppc_stat( y, yrep, stat = "mean", ..., binwidth = NULL, breaks = NULL, freq = TRUE ) ppc_stat_grouped( y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, breaks = NULL, freq = TRUE ) ppc_stat_freqpoly_grouped( y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, freq = TRUE ) ppc_stat_2d(y, yrep, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{stat}{A single function or a string naming a function, except for \code{ppc_stat_2d()} which requires a vector of exactly two functions or function names. In all cases the function(s) should take a vector input and return a scalar statistic. If specified as a string (or strings) then the legend will display function names. If specified as a function (or functions) then generic naming is used in the legend.} \item{...}{Currently unused.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting.} \item{size, alpha}{Arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of scatterplot points.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ The distribution of a (test) statistic \code{T(yrep)}, or a pair of (test) statistics, over the simulated datasets in \code{yrep}, compared to the observed value \code{T(y)} computed from the data \code{y}. See the \strong{Plot Descriptions} and \strong{Details} sections, below, as well as \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)}. } \details{ For Binomial data, the plots will typically be most useful if \code{y} and \code{yrep} contain the "success" proportions (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_stat()}}{ A histogram of the distribution of a test statistic computed by applying \code{stat} to each dataset (row) in \code{yrep}. The value of the statistic in the observed data, \code{stat(y)}, is overlaid as a vertical line. More details on \code{ppc_stat()} can be found in Gabry et al. (2019). } \item{\code{ppc_stat_grouped()},\code{ppc_stat_freqpoly_grouped()}}{ The same as \code{ppc_stat()}, but a separate plot is generated for each level of a grouping variable. In the case of \code{ppc_stat_freqpoly_grouped()} the plots are frequency polygons rather than histograms. More details on \code{ppc_stat_grouped()} can be found in Gabry et al. (2019). } \item{\code{ppc_stat_2d()}}{ A scatterplot showing the joint distribution of two test statistics computed over the datasets (rows) in \code{yrep}. The value of the statistics in the observed data is overlaid as large point. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() ppc_stat(y, yrep) ppc_stat(y, yrep, stat = "sd") + legend_none() ppc_stat_2d(y, yrep) ppc_stat_2d(y, yrep, stat = c("median", "mean")) + legend_move("bottom") color_scheme_set("teal") group <- example_group_data() ppc_stat_grouped(y, yrep, group) color_scheme_set("mix-red-blue") ppc_stat_freqpoly_grouped(y, yrep, group, facet_args = list(nrow = 2)) # use your own function to compute test statistics color_scheme_set("brightblue") q25 <- function(y) quantile(y, 0.25) ppc_stat(y, yrep, stat = "q25") # legend includes function name # can define the function in the 'stat' argument but then # the legend doesn't include a function name ppc_stat(y, yrep, stat = function(y) quantile(y, 0.25)) } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}} } \concept{PPCs} bayesplot/man/MCMC-diagnostics.Rd0000644000176200001440000001576514057717550016373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-diagnostics.R \name{MCMC-diagnostics} \alias{MCMC-diagnostics} \alias{mcmc_rhat} \alias{mcmc_rhat_hist} \alias{mcmc_rhat_data} \alias{mcmc_neff} \alias{mcmc_neff_hist} \alias{mcmc_neff_data} \alias{mcmc_acf} \alias{mcmc_acf_bar} \title{General MCMC diagnostics} \usage{ mcmc_rhat(rhat, ..., size = NULL) mcmc_rhat_hist(rhat, ..., binwidth = NULL, breaks = NULL) mcmc_rhat_data(rhat, ...) mcmc_neff(ratio, ..., size = NULL) mcmc_neff_hist(ratio, ..., binwidth = NULL, breaks = NULL) mcmc_neff_data(ratio, ...) mcmc_acf( x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20, size = NULL ) mcmc_acf_bar( x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20 ) } \arguments{ \item{rhat}{A vector of R-hat estimates.} \item{...}{Currently ignored.} \item{size}{An optional value to override \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}}'s default size (for \code{mcmc_rhat()}, \code{mcmc_neff()}) or \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}'s default size (for \code{mcmc_acf()}).} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{ratio}{A vector of \emph{ratios} of effective sample size estimates to total sample size. See \code{\link[=neff_ratio]{neff_ratio()}}.} \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting.} \item{lags}{The number of lags to show in the autocorrelation plot.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Plots of Rhat statistics, ratios of effective sample size to total sample size, and autocorrelation of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. For models fit using the No-U-Turn-Sampler, see also \link{MCMC-nuts} for additional MCMC diagnostic plots. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_rhat()}, \code{mcmc_rhat_hist()}}{ Rhat values as either points or a histogram. Values are colored using different shades (lighter is better). The chosen thresholds are somewhat arbitrary, but can be useful guidelines in practice. \itemize{ \item \emph{light}: below 1.05 (good) \item \emph{mid}: between 1.05 and 1.1 (ok) \item \emph{dark}: above 1.1 (too high) } } \item{\code{mcmc_neff()}, \code{mcmc_neff_hist()}}{ Ratios of effective sample size to total sample size as either points or a histogram. Values are colored using different shades (lighter is better). The chosen thresholds are somewhat arbitrary, but can be useful guidelines in practice. \itemize{ \item \emph{light}: between 0.5 and 1 (high) \item \emph{mid}: between 0.1 and 0.5 (good) \item \emph{dark}: below 0.1 (low) } } \item{\code{mcmc_acf()}, \code{mcmc_acf_bar()}}{ Grid of autocorrelation plots by chain and parameter. The \code{lags} argument gives the maximum number of lags at which to calculate the autocorrelation function. \code{mcmc_acf()} is a line plot whereas \code{mcmc_acf_bar()} is a barplot. } } } \examples{ # autocorrelation x <- example_mcmc_draws() dim(x) dimnames(x) color_scheme_set("green") mcmc_acf(x, pars = c("alpha", "beta[1]")) \donttest{ color_scheme_set("pink") (p <- mcmc_acf_bar(x, pars = c("alpha", "beta[1]"))) # add horiztonal dashed line at 0.5 p + hline_at(0.5, linetype = 2, size = 0.15, color = "gray") } # fake rhat values to use for demonstration rhat <- c(runif(100, 1, 1.15)) mcmc_rhat_hist(rhat) mcmc_rhat(rhat) # lollipops color_scheme_set("purple") mcmc_rhat(rhat[1:10], size = 5) color_scheme_set("blue") mcmc_rhat(runif(1000, 1, 1.07)) mcmc_rhat(runif(1000, 1, 1.3)) + legend_move("top") # add legend above plot # fake neff ratio values to use for demonstration ratio <- c(runif(100, 0, 1)) mcmc_neff_hist(ratio) mcmc_neff(ratio) \dontrun{ # Example using rstanarm model (requires rstanarm package) library(rstanarm) # intentionally use small 'iter' so there are some # problems with rhat and neff for demonstration fit <- stan_glm(mpg ~ ., data = mtcars, iter = 50, refresh = 0) rhats <- rhat(fit) ratios <- neff_ratio(fit) mcmc_rhat(rhats) mcmc_neff(ratios, size = 3) # there's a small enough number of parameters in the # model that we can display their names on the y-axis mcmc_neff(ratios) + yaxis_text(hjust = 1) # can also look at autocorrelation draws <- as.array(fit) mcmc_acf(draws, pars = c("wt", "cyl"), lags = 10) # increase number of iterations and plots look much better fit2 <- update(fit, iter = 500) mcmc_rhat(rhat(fit2)) mcmc_neff(neff_ratio(fit2)) mcmc_acf(as.array(fit2), pars = c("wt", "cyl"), lags = 10) } } \references{ Stan Development Team. \emph{Stan Modeling Language Users Guide and Reference Manual.} \url{https://mc-stan.org/users/documentation/} Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. \emph{Statistical Science}. 7(4), 457--472. } \seealso{ \itemize{ \item The \href{https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html}{Visual MCMC Diagnostics} vignette. \item \link{MCMC-nuts} for additional MCMC diagnostic plots for models fit using the No-U-Turn-Sampler. } Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/pp_check.Rd0000644000176200001440000000551014057717550015106 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_check.R \name{pp_check} \alias{pp_check} \alias{pp_check.default} \title{Posterior (or prior) predictive checks (S3 generic and default method)} \usage{ pp_check(object, ...) \method{pp_check}{default}(object, yrep, fun, ...) } \arguments{ \item{object}{Typically a fitted model object. The default method, however, takes \code{object} to be a \code{y} (outcome) vector.} \item{...}{For the generic, arguments passed to individual methods. For the default method, these are additional arguments to pass to \code{fun}.} \item{yrep}{For the default method, a \code{yrep} matrix passed to \code{fun}.} \item{fun}{For the default method, the plotting function to call. Can be any of the \link{PPC} functions. The \code{"ppc_"} prefix can optionally be dropped if \code{fun} is specified as a string.} } \value{ The exact form of the value returned by \code{pp_check()} may vary by the class of \code{object}, but for consistency we encourage authors of methods to return the ggplot object created by one of \strong{bayesplot}'s plotting functions. The default method returns the object returned by \code{fun}. } \description{ S3 generic with simple default method. The intent is to provide a generic so authors of other \R packages who wish to provide interfaces to the functions in \strong{bayesplot} will be encouraged to include \code{pp_check()} methods in their package, preserving the same naming conventions for posterior (and prior) predictive checking across many \R packages for Bayesian inference. This is for the convenience of both users and developers. See the \strong{Details} and \strong{Examples} sections, below, and the package vignettes for examples of defining \code{pp_check()} methods. } \details{ A package that creates fitted model objects of class \code{"foo"} can include a method \code{pp_check.foo()} that prepares the appropriate inputs (\code{y}, \code{yrep}, etc.) for the \strong{bayesplot} functions. The \code{pp_check.foo()} method may, for example, let the user choose between various plots, calling the functions from \strong{bayesplot} internally as needed. See \strong{Examples}, below, and the package vignettes. } \examples{ # default method y <- example_y_data() yrep <- example_yrep_draws() pp_check(y, yrep[1:50,], ppc_dens_overlay) g <- example_group_data() pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median") # defining a method x <- list(y = rnorm(50), yrep = matrix(rnorm(5000), nrow = 100, ncol = 50)) class(x) <- "foo" pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { y <- object[["y"]] yrep <- object[["yrep"]] switch(match.arg(type), multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), overlaid = ppc_dens_overlay(y, yrep)) } pp_check(x) pp_check(x, type = "overlaid") } bayesplot/man/MCMC-nuts.Rd0000644000176200001440000001502014057717550015035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-diagnostics-nuts.R \name{MCMC-nuts} \alias{MCMC-nuts} \alias{NUTS} \alias{mcmc_nuts_acceptance} \alias{mcmc_nuts_divergence} \alias{mcmc_nuts_stepsize} \alias{mcmc_nuts_treedepth} \alias{mcmc_nuts_energy} \title{Diagnostic plots for the No-U-Turn-Sampler (NUTS)} \usage{ mcmc_nuts_acceptance(x, lp, chain = NULL, ..., binwidth = NULL) mcmc_nuts_divergence(x, lp, chain = NULL, ...) mcmc_nuts_stepsize(x, lp, chain = NULL, ...) mcmc_nuts_treedepth(x, lp, chain = NULL, ...) mcmc_nuts_energy(x, ..., binwidth = NULL, alpha = 0.5, merge_chains = FALSE) } \arguments{ \item{x}{A molten data frame of NUTS sampler parameters, either created by \code{\link[=nuts_params]{nuts_params()}} or in the same form as the object returned by \code{\link[=nuts_params]{nuts_params()}}.} \item{lp}{A molten data frame of draws of the log-posterior or, more commonly, of a quantity equal to the log-posterior up to a constant. \code{lp} should either be created via \code{\link[=log_posterior]{log_posterior()}} or be an object with the same form as the object returned by \code{\link[=log_posterior]{log_posterior()}}.} \item{chain}{A positive integer for selecting a particular chain. The default (\code{NULL}) is to merge the chains before plotting. If \code{chain = k} then the plot for chain \code{k} is overlaid (in a darker shade but with transparency) on top of the plot for all chains. The \code{chain} argument is not used by \code{mcmc_nuts_energy()}.} \item{...}{Currently ignored.} \item{binwidth}{An optional value passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{alpha}{For \code{mcmc_nuts_energy()} only, the transparency (alpha) level in \verb{[0,1]} used for the overlaid histogram.} \item{merge_chains}{For \code{mcmc_nuts_energy()} only, should all chains be merged or displayed separately? The default is \code{FALSE}, i.e., to show the chains separately.} } \value{ A gtable object (the result of calling \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}) created from several ggplot objects, except for \code{mcmc_nuts_energy()}, which returns a ggplot object. } \description{ Diagnostic plots for the No-U-Turn-Sampler (NUTS), the default MCMC algorithm used by \href{https://mc-stan.org}{Stan}. See the \strong{Plot Descriptions} section, below. } \section{Quick Definitions}{ For more details see Stan Development Team (2016) and Betancourt (2017). \itemize{ \item \code{accept_stat__}: the average acceptance probabilities of all possible samples in the proposed tree. \item \code{divergent__}: the number of leapfrog transitions with diverging error. Because NUTS terminates at the first divergence this will be either 0 or 1 for each iteration. \item \code{stepsize__}: the step size used by NUTS in its Hamiltonian simulation. \item \code{treedepth__}: the depth of tree used by NUTS, which is the log (base 2) of the number of leapfrog steps taken during the Hamiltonian simulation. \item \code{energy__}: the value of the Hamiltonian (up to an additive constant) at each iteration. } } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_nuts_acceptance()}}{ Three plots: \itemize{ \item Histogram of \code{accept_stat__} with vertical lines indicating the mean (solid line) and median (dashed line). \item Histogram of \code{lp__} with vertical lines indicating the mean (solid line) and median (dashed line). \item Scatterplot of \code{accept_stat__} vs \code{lp__}. } } \item{\code{mcmc_nuts_divergence()}}{ Two plots: \itemize{ \item Violin plots of \code{lp__|divergent__=1} and \code{lp__|divergent__=0}. \item Violin plots of \code{accept_stat__|divergent__=1} and \code{accept_stat__|divergent__=0}. } } \item{\code{mcmc_nuts_stepsize()}}{ Two plots: \itemize{ \item Violin plots of \code{lp__} by chain ordered by \code{stepsize__} value. \item Violin plots of \code{accept_stat__} by chain ordered by \code{stepsize__} value. } } \item{\code{mcmc_nuts_treedepth()}}{ Three plots: \itemize{ \item Violin plots of \code{lp__} by value of \code{treedepth__}. \item Violin plots of \code{accept_stat__} by value of \code{treedepth__}. \item Histogram of \code{treedepth__}. } } \item{\code{mcmc_nuts_energy()}}{ Overlaid histograms showing \code{energy__} vs the change in \code{energy__}. See Betancourt (2016) for details. } } } \examples{ \dontrun{ library(ggplot2) library(rstanarm) fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, refresh = 0) np <- nuts_params(fit) lp <- log_posterior(fit) color_scheme_set("brightblue") mcmc_nuts_acceptance(np, lp) mcmc_nuts_acceptance(np, lp, chain = 2) mcmc_nuts_divergence(np, lp) mcmc_nuts_stepsize(np, lp) mcmc_nuts_treedepth(np, lp) color_scheme_set("red") mcmc_nuts_energy(np) mcmc_nuts_energy(np, merge_chains = TRUE, binwidth = .15) mcmc_nuts_energy(np) + facet_wrap(~ Chain, nrow = 1) + coord_fixed(ratio = 150) + ggtitle("NUTS Energy Diagnostic") } } \references{ Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. \url{https://arxiv.org/abs/1701.02434} Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. \url{https://arxiv.org/abs/1312.0906} Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. \emph{Journal of Machine Learning Research}. 15:1593--1623. Stan Development Team. \emph{Stan Modeling Language Users Guide and Reference Manual.} \url{https://mc-stan.org/users/documentation/} } \seealso{ \itemize{ \item The \href{https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html}{Visual MCMC Diagnostics} vignette. \item Several other plotting functions are not NUTS-specific but take optional extra arguments if the model was fit using NUTS: \itemize{ \item \code{\link[=mcmc_trace]{mcmc_trace()}}: show divergences as tick marks below the trace plot. \item \code{\link[=mcmc_parcoord]{mcmc_parcoord()}}: change the color/size/transparency of lines corresponding to divergences. \item \code{\link[=mcmc_scatter]{mcmc_scatter()}}: change the color/size/shape of points corresponding to divergences. \item \code{\link[=mcmc_pairs]{mcmc_pairs()}}: change the color/size/shape of points corresponding divergences and/or max treedepth saturation. } } Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-intervals.Rd0000644000176200001440000001426714057717550015772 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-intervals.R \name{PPC-intervals} \alias{PPC-intervals} \alias{ppc_intervals} \alias{ppc_intervals_grouped} \alias{ppc_ribbon} \alias{ppc_ribbon_grouped} \alias{ppc_intervals_data} \alias{ppc_ribbon_data} \title{PPC intervals} \usage{ ppc_intervals( y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3 ) ppc_intervals_grouped( y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3 ) ppc_ribbon( y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both") ) ppc_ribbon_grouped( y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both") ) ppc_intervals_data( y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) ppc_ribbon_data( y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{x}{A numeric vector the same length as \code{y} to use as the x-axis variable. For example, \code{x} could be a predictor variable from a regression model, a time variable for time-series models, etc. If \code{x} is missing or \code{NULL}, then \code{1:length(y)} is used for the x-axis.} \item{...}{Currently unused.} \item{prob, prob_outer}{Values between 0 and 1 indicating the desired probability mass to include in the inner and outer intervals. The defaults are \code{prob=0.5} and \code{prob_outer=0.9}.} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} \item{facet_args}{An optional list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} to control faceting.} \item{alpha, size, fatten}{Arguments passed to geoms. For ribbon plots \code{alpha} and \code{size} are passed to \code{\link[ggplot2:geom_ribbon]{ggplot2::geom_ribbon()}}. For interval plots \code{size} and \code{fatten} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}}.} \item{y_draw}{For ribbon plots only, a string specifying how to draw \code{y}. Can be \code{"line"} (the default), \code{"points"}, or \code{"both"}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Medians and central interval estimates of \code{yrep} with \code{y} overlaid. See the \strong{Plot Descriptions} section, below. } \section{Plot Descriptions}{ \describe{ \item{\verb{ppc_intervals(), ppc_ribbon()}}{ \code{100*prob}\% central intervals for \code{yrep} at each \code{x} value. \code{ppc_intervals()} plots intervals as vertical bars with points indicating \code{yrep} medians and darker points indicating observed \code{y} values. \code{ppc_ribbon()} plots a ribbon of connected intervals with a line through the median of \code{yrep} and a darker line connecting observed \code{y} values. In both cases an optional \code{x} variable can also be specified for the x-axis variable. Depending on the number of observations and the variability in the predictions at different values of \code{x}, one or the other of these plots may be easier to read than the other. } \item{\verb{ppc_intervals_grouped(), ppc_ribbon_grouped()}}{ Same as \code{ppc_intervals()} and \code{ppc_ribbon()}, respectively, but a separate plot (facet) is generated for each level of a grouping variable. } } } \examples{ y <- rnorm(50) yrep <- matrix(rnorm(5000, 0, 2), ncol = 50) color_scheme_set("brightblue") ppc_ribbon(y, yrep) ppc_intervals(y, yrep) # change x axis to y values (instead of indices) and add x = y line ppc_intervals(y, yrep, x = y) + abline_01() color_scheme_set("teal") year <- 1950:1999 ppc_ribbon(y, yrep, x = year, alpha = 0, size = 0.75) + ggplot2::xlab("Year") color_scheme_set("pink") year <- rep(2000:2009, each = 5) group <- gl(5, 1, length = 50, labels = LETTERS[1:5]) ppc_ribbon_grouped(y, yrep, x = year, group) + ggplot2::scale_x_continuous(breaks = pretty) ppc_ribbon_grouped( y, yrep, x = year, group, facet_args = list(scales = "fixed"), alpha = 1, size = 2 ) + xaxis_text(FALSE) + xaxis_ticks(FALSE) + panel_bg(fill = "gray20") ppc_dat <- ppc_intervals_data(y, yrep, x = year, prob = 0.5) ppc_group_dat <- ppc_intervals_data(y, yrep, x = year, group = group, prob = 0.5) \dontrun{ library("rstanarm") fit <- stan_glmer(mpg ~ wt + (1|cyl), data = mtcars, refresh = 0) yrep <- posterior_predict(fit) color_scheme_set("purple") with(mtcars, ppc_intervals(mpg, yrep, x = wt, prob = 0.5)) + panel_bg(fill="gray90", color = NA) + grid_lines(color = "white") ppc_intervals_grouped(y = mtcars$mpg, yrep, prob = 0.8, x = mtcars$wt, group = mtcars$cyl) color_scheme_set("gray") ppc_intervals(mtcars$mpg, yrep, prob = 0.5) + ggplot2::scale_x_continuous( labels = rownames(mtcars), breaks = 1:nrow(mtcars) ) + xaxis_text(angle = -70, vjust = 1, hjust = 0) } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-package.Rd0000644000176200001440000000770314057717550016733 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-package.R \docType{package} \name{bayesplot-package} \alias{bayesplot-package} \alias{bayesplot} \title{\strong{bayesplot}: Plotting for Bayesian Models} \description{ \if{html}{ \figure{stanlogo.png}{options: width="50px" alt="mc-stan.org"} } \emph{Stan Development Team} The \strong{bayesplot} package provides a variety of \strong{ggplot2}-based plotting functions for use after fitting Bayesian models (typically, though not exclusively, via Markov chain Monte Carlo). The package is designed not only to provide convenient functionality for users, but also a common set of functions that can be easily used by developers working on a variety of packages for Bayesian modeling, particularly (but not necessarily) packages powered by RStan (the \R interface to Stan). Examples of packages that will soon (or already are) using \strong{bayesplot} are \strong{rstan} itself, as well as the \strong{rstan}-dependent \strong{rstanarm} and \strong{brms} packages for applied regression modeling. } \section{Plotting functionality}{ \if{html}{ \figure{bayesplot1.png}{options: width="30\%" alt="mcmc_areas"} \figure{bayesplot2.png}{options: width="30\%" alt="ppc_hist"} \figure{bayesplot3.png}{options: width="30\%" alt="ppc_dens_overlay"} } The plotting functions in \strong{bayesplot} are organized into several modules: \itemize{ \item \link[=MCMC-overview]{MCMC}: Visualizations of Markov chain Monte Carlo (MCMC) simulations generated by \emph{any} MCMC algorithm as well as diagnostics. There are also additional functions specifically for use with models fit using the \link[=NUTS]{No-U-Turn Sampler (NUTS)}. \item \link[=PPC-overview]{PPC}: Graphical prior and posterior predictive checks (PPCs). } In future releases modules will be added specifically for forecasting/out-of-sample prediction and other inference-related tasks. } \section{Resources}{ \itemize{ \item \strong{Online documentation and vignettes}: Visit the \strong{bayesplot} website at \url{https://mc-stan.org/bayesplot/} \item \strong{Bug reports and feature requests}: If you would like to request a new feature or if you have noticed a bug that needs to be fixed please let us know at the \strong{bayesplot} issue tracker at \url{https://github.com/stan-dev/bayesplot/issues/} \item \strong{General questions and help}: To ask a question about \strong{bayesplot} on the Stan Forums forum please visit \url{https://discourse.mc-stan.org}. } } \examples{ # A few quick examples (all of the functions have many examples # on their individual help pages) # MCMC plots x <- example_mcmc_draws(params = 5) mcmc_intervals(x, prob = 0.5) mcmc_intervals(x, regex_pars = "beta") color_scheme_set("purple") mcmc_areas(x, regex_pars = "beta", prob = 0.8) color_scheme_set("mix-blue-red") mcmc_trace(x, pars = c("alpha", "sigma"), facet_args = list(nrow = 2)) color_scheme_set("brightblue") mcmc_scatter(x, pars = c("beta[1]", "sigma"), transformations = list(sigma = "log")) # Graphical PPCs y <- example_y_data() yrep <- example_yrep_draws() ppc_dens_overlay(y, yrep[1:50, ]) \donttest{ color_scheme_set("pink") ppc_stat(y, yrep, stat = "median") + grid_lines() ppc_hist(y, yrep[1:8, ]) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot} and \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change it. \link{bayesplot-colors} to set or view the color scheme used for plotting. \code{\link[ggplot2:ggsave]{ggplot2::ggsave()}} for saving plots. } bayesplot/man/MCMC-distributions.Rd0000644000176200001440000002072114057717550016752 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-distributions.R \name{MCMC-distributions} \alias{MCMC-distributions} \alias{mcmc_hist} \alias{mcmc_dens} \alias{mcmc_hist_by_chain} \alias{mcmc_dens_overlay} \alias{mcmc_dens_chains} \alias{mcmc_dens_chains_data} \alias{mcmc_violin} \title{Histograms and kernel density plots of MCMC draws} \usage{ mcmc_hist( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, breaks = NULL, freq = TRUE ) mcmc_dens( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), trim = FALSE ) mcmc_hist_by_chain( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, freq = TRUE ) mcmc_dens_overlay( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), color_chains = TRUE, trim = FALSE ) mcmc_dens_chains( x, pars = character(), regex_pars = character(), transformations = list(), ..., color_chains = TRUE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_dens_chains_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_violin( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), probs = c(0.1, 0.5, 0.9) ) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{trim}{A logical scalar passed to \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}.} \item{color_chains}{Option for whether to separately color chains.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{probs}{A numeric vector passed to \code{\link[ggplot2:geom_violin]{ggplot2::geom_violin()}}'s \code{draw_quantiles} argument to specify at which quantiles to draw horizontal lines. Set to \code{NULL} to remove the lines.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Various types of histograms and kernel density plots of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_hist()}}{ Histograms of posterior draws with all chains merged. } \item{\code{mcmc_dens()}}{ Kernel density plots of posterior draws with all chains merged. } \item{\code{mcmc_hist_by_chain()}}{ Histograms of posterior draws with chains separated via faceting. } \item{\code{mcmc_dens_overlay()}}{ Kernel density plots of posterior draws with chains separated but overlaid on a single plot. } \item{\code{mcmc_violin()}}{ The density estimate of each chain is plotted as a violin with horizontal lines at notable quantiles. } \item{\code{mcmc_dens_chains()}}{ Ridgeline kernel density plots of posterior draws with chains separated but overlaid on a single plot. In \code{mcmc_dens_overlay()} parameters appear in separate facets; in \code{mcmc_dens_chains()} they appear in the same panel and can overlap vertically. } } } \examples{ set.seed(9262017) # some parameter draws to use for demonstration x <- example_mcmc_draws() dim(x) dimnames(x) ################## ### Histograms ### ################## # histograms of all parameters color_scheme_set("brightblue") mcmc_hist(x) # histograms of some parameters color_scheme_set("pink") mcmc_hist(x, pars = c("alpha", "beta[2]")) \donttest{ mcmc_hist(x, pars = "sigma", regex_pars = "beta") } # example of using 'transformations' argument to plot log(sigma), # and parsing facet labels (e.g. to get greek letters for parameters) mcmc_hist(x, transformations = list(sigma = "log"), facet_args = list(labeller = ggplot2::label_parsed)) + facet_text(size = 15) \donttest{ # instead of list(sigma = "log"), you could specify the transformation as # list(sigma = log) or list(sigma = function(x) log(x)), but then the # label for the transformed sigma is 't(sigma)' instead of 'log(sigma)' mcmc_hist(x, transformations = list(sigma = log)) # separate histograms by chain color_scheme_set("pink") mcmc_hist_by_chain(x, regex_pars = "beta") } ################# ### Densities ### ################# mcmc_dens(x, pars = c("sigma", "beta[2]"), facet_args = list(nrow = 2)) \donttest{ # separate and overlay chains color_scheme_set("mix-teal-pink") mcmc_dens_overlay(x, pars = c("sigma", "beta[2]"), facet_args = list(nrow = 2)) + facet_text(size = 14) x2 <- example_mcmc_draws(params = 6) mcmc_dens_chains(x2, pars = c("beta[1]", "beta[2]", "beta[3]")) } # separate chains as violin plots color_scheme_set("green") mcmc_violin(x) + panel_bg(color = "gray20", size = 2, fill = "gray30") } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-discrete.Rd0000644000176200001440000001366614057717550015567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-discrete.R \name{PPC-discrete} \alias{PPC-discrete} \alias{ppc_bars} \alias{ppc_bars_grouped} \alias{ppc_rootogram} \title{PPCs for discrete outcomes} \usage{ ppc_bars( y, yrep, ..., prob = 0.9, width = 0.9, size = 1, fatten = 3, freq = TRUE ) ppc_bars_grouped( y, yrep, group, ..., facet_args = list(), prob = 0.9, width = 0.9, size = 1, fatten = 3, freq = TRUE ) ppc_rootogram( y, yrep, style = c("standing", "hanging", "suspended"), ..., prob = 0.9, size = 1 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{...}{Currently unused.} \item{prob}{A value between \code{0} and \code{1} indicating the desired probability mass to include in the \code{yrep} intervals. Set \code{prob=0} to remove the intervals. For \code{ppc_rootogram()} these are intervals of the \emph{square roots} of the expected counts.} \item{width}{For \code{ppc_bars()} and \code{ppc_bars_grouped()}, passed to \code{\link[ggplot2:geom_bar]{ggplot2::geom_bar()}} to control the bar width.} \item{size, fatten}{For \code{ppc_bars()} and \code{ppc_bars_grouped()}, \code{size} and \code{fatten} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}} to control the appearance of the \code{yrep} points and intervals. For \code{ppc_rootogram()} \code{size} is passed to \code{\link[ggplot2:geom_path]{ggplot2::geom_line()}}.} \item{freq}{For \code{ppc_bars()} and \code{ppc_bars_grouped()}, if \code{TRUE} (the default) the y-axis will display counts. Setting \code{freq=FALSE} will put proportions on the y-axis.} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} \item{facet_args}{An optional list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} to control faceting.} \item{style}{For \code{ppc_rootogram}, a string specifying the rootogram style. The options are \code{"standing"}, \code{"hanging"}, and \code{"suspended"}. See the \strong{Plot Descriptions} section, below, for details on the different styles.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Many of the \link[=PPC-overview]{PPC} functions in \strong{bayesplot} can be used with discrete data. The small subset of these functions that can \emph{only} be used if \code{y} and \code{yrep} are discrete are documented on this page. Currently these include rootograms for count outcomes and bar plots for ordinal, categorical, and multinomial outcomes. See the \strong{Plot Descriptions} section below. } \details{ For all of these plots \code{y} and \code{yrep} must be integers, although they need not be integers in the strict sense of \R's \link[base:integer]{integer} type. For rootogram plots \code{y} and \code{yrep} must also be non-negative. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_bars()}}{ Bar plot of \code{y} with \code{yrep} medians and uncertainty intervals superimposed on the bars. } \item{\code{ppc_bars_grouped()}}{ Same as \code{ppc_bars()} but a separate plot (facet) is generated for each level of a grouping variable. } \item{\code{ppc_rootogram()}}{ Rootograms allow for diagnosing problems in count data models such as overdispersion or excess zeros. They consist of a histogram of \code{y} with the expected counts based on \code{yrep} overlaid as a line along with uncertainty intervals. The y-axis represents the square roots of the counts to approximately adjust for scale differences and thus ease comparison between observed and expected counts. Using the \code{style} argument, the histogram style can be adjusted to focus on different aspects of the data: \itemize{ \item \emph{Standing}: basic histogram of observed counts with curve showing expected counts. \item \emph{Hanging}: observed counts counts hanging from the curve representing expected counts. \item \emph{Suspended}: histogram of the differences between expected and observed counts. } \strong{All of these are plotted on the square root scale}. See Kleiber and Zeileis (2016) for advice on interpreting rootograms and selecting among the different styles. } } } \examples{ set.seed(9222017) # bar plots f <- function(N) { sample(1:4, size = N, replace = TRUE, prob = c(0.25, 0.4, 0.1, 0.25)) } y <- f(100) yrep <- t(replicate(500, f(100))) dim(yrep) group <- gl(2, 50, length = 100, labels = c("GroupA", "GroupB")) color_scheme_set("mix-pink-blue") ppc_bars(y, yrep) # split by group, change interval width, and display proportion # instead of count on y-axis color_scheme_set("mix-blue-pink") ppc_bars_grouped(y, yrep, group, prob = 0.5, freq = FALSE) # rootograms for counts y <- rpois(100, 20) yrep <- matrix(rpois(10000, 20), ncol = 100) color_scheme_set("brightblue") ppc_rootogram(y, yrep) ppc_rootogram(y, yrep, prob = 0) ppc_rootogram(y, yrep, style = "hanging", prob = 0.8) ppc_rootogram(y, yrep, style = "suspended") } \references{ Kleiber, C. and Zeileis, A. (2016). Visualizing count data regressions using rootograms. \emph{The American Statistician}. 70(3): 296--303. \url{https://arxiv.org/abs/1605.01311}. } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/PPC-scatterplots.Rd0000644000176200001440000000633714057717550016511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-scatterplots.R \name{PPC-scatterplots} \alias{PPC-scatterplots} \alias{ppc_scatter} \alias{ppc_scatter_avg} \alias{ppc_scatter_avg_grouped} \title{PPC scatterplots} \usage{ ppc_scatter(y, yrep, ..., size = 2.5, alpha = 0.8) ppc_scatter_avg(y, yrep, ..., size = 2.5, alpha = 0.8) ppc_scatter_avg_grouped(y, yrep, group, ..., size = 2.5, alpha = 0.8) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{...}{Currently unused.} \item{size, alpha}{Arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points.} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Scatterplots of the observed data \code{y} vs. simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} and \strong{Details} sections, below. } \details{ For Binomial data, the plots will typically be most useful if \code{y} and \code{yrep} contain the "success" proportions (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_scatter()}}{ For each dataset (row) in \code{yrep} a scatterplot is generated showing \code{y} against that row of \code{yrep}. For this plot \code{yrep} should only contain a small number of rows. } \item{\code{ppc_scatter_avg()}}{ A scatterplot of \code{y} against the average values of \code{yrep}, i.e., the points \verb{(mean(yrep[, n]), y[n])}, where each \code{yrep[, n]} is a vector of length equal to the number of posterior draws. } \item{\code{ppc_scatter_avg_grouped()}}{ The same as \code{ppc_scatter_avg()}, but a separate plot is generated for each level of a grouping variable. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() p1 <- ppc_scatter_avg(y, yrep) p1 p2 <- ppc_scatter(y, yrep[20:23, ], alpha = 0.5, size = 1.5) p2 # give x and y axes the same limits lims <- ggplot2::lims(x = c(0, 160), y = c(0, 160)) p1 + lims p2 + lims group <- example_group_data() ppc_scatter_avg_grouped(y, yrep, group, alpha = 0.7) + lims } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-extractors.Rd0000644000176200001440000000710614057717550017533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-extractors.R \name{bayesplot-extractors} \alias{bayesplot-extractors} \alias{log_posterior} \alias{nuts_params} \alias{rhat} \alias{neff_ratio} \alias{log_posterior.stanfit} \alias{log_posterior.stanreg} \alias{log_posterior.CmdStanMCMC} \alias{nuts_params.stanfit} \alias{nuts_params.stanreg} \alias{nuts_params.list} \alias{nuts_params.CmdStanMCMC} \alias{rhat.stanfit} \alias{rhat.stanreg} \alias{rhat.CmdStanMCMC} \alias{neff_ratio.stanfit} \alias{neff_ratio.stanreg} \alias{neff_ratio.CmdStanMCMC} \title{Extract quantities needed for plotting from model objects} \usage{ log_posterior(object, ...) nuts_params(object, ...) rhat(object, ...) neff_ratio(object, ...) \method{log_posterior}{stanfit}(object, inc_warmup = FALSE, ...) \method{log_posterior}{stanreg}(object, inc_warmup = FALSE, ...) \method{log_posterior}{CmdStanMCMC}(object, inc_warmup = FALSE, ...) \method{nuts_params}{stanfit}(object, pars = NULL, inc_warmup = FALSE, ...) \method{nuts_params}{stanreg}(object, pars = NULL, inc_warmup = FALSE, ...) \method{nuts_params}{list}(object, pars = NULL, ...) \method{nuts_params}{CmdStanMCMC}(object, pars = NULL, ...) \method{rhat}{stanfit}(object, pars = NULL, ...) \method{rhat}{stanreg}(object, pars = NULL, regex_pars = NULL, ...) \method{rhat}{CmdStanMCMC}(object, pars = NULL, ...) \method{neff_ratio}{stanfit}(object, pars = NULL, ...) \method{neff_ratio}{stanreg}(object, pars = NULL, regex_pars = NULL, ...) \method{neff_ratio}{CmdStanMCMC}(object, pars = NULL, ...) } \arguments{ \item{object}{The object to use.} \item{...}{Arguments passed to individual methods.} \item{inc_warmup}{A logical scalar (defaulting to \code{FALSE}) indicating whether to include warmup draws, if applicable.} \item{pars}{An optional character vector of parameter names. For \code{nuts_params()} these will be NUTS sampler parameter names rather than model parameters. If \code{pars} is omitted all parameters are included.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} } \value{ \describe{ \item{\code{log_posterior()}}{ \code{log_posterior()} methods return a molten data frame (see \code{\link[reshape2:melt]{reshape2::melt()}}). The data frame should have columns \code{"Iteration"} (integer), \code{"Chain"} (integer), and \code{"Value"} (numeric). See \strong{Examples}, below. } \item{\code{nuts_params()}}{ \code{nuts_params()} methods return a molten data frame (see \code{\link[reshape2:melt]{reshape2::melt()}}). The data frame should have columns \code{"Parameter"} (factor), \code{"Iteration"} (integer), \code{"Chain"} (integer), and \code{"Value"} (numeric). See \strong{Examples}, below. } \item{\code{rhat()}, \code{neff_ratio()}}{ Methods return (named) vectors. } } } \description{ Generics and methods for extracting quantities needed for plotting from various types of model objects. Currently methods are provided for stanfit (\strong{rstan}), CmdStanMCMC (\strong{cmdstanr}), and stanreg (\strong{rstanarm}) objects, but adding new methods should be relatively straightforward. } \examples{ \dontrun{ library(rstanarm) fit <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) np <- nuts_params(fit) head(np) tail(np) lp <- log_posterior(fit) head(lp) tail(lp) } } \seealso{ \link{MCMC-nuts}, \link{MCMC-diagnostics} } bayesplot/man/PPC-loo.Rd0000644000176200001440000002533214057717550014547 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-loo.R \name{PPC-loo} \alias{PPC-loo} \alias{ppc_loo_pit_overlay} \alias{ppc_loo_pit_data} \alias{ppc_loo_pit_qq} \alias{ppc_loo_pit} \alias{ppc_loo_intervals} \alias{ppc_loo_ribbon} \title{LOO predictive checks} \usage{ ppc_loo_pit_overlay( y, yrep, lw, ..., pit = NULL, samples = 100, size = 0.25, alpha = 0.7, boundary_correction = TRUE, grid_len = 512, bw = "nrd0", trim = FALSE, adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_loo_pit_data( y, yrep, lw, ..., pit = NULL, samples = 100, bw = "nrd0", boundary_correction = TRUE, grid_len = 512 ) ppc_loo_pit_qq( y, yrep, lw, pit, compare = c("uniform", "normal"), ..., size = 2, alpha = 1 ) ppc_loo_pit( y, yrep, lw, pit, compare = c("uniform", "normal"), ..., size = 2, alpha = 1 ) ppc_loo_intervals( y, yrep, psis_object, subset = NULL, intervals = NULL, ..., prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3, order = c("index", "median") ) ppc_loo_ribbon( y, yrep, lw, psis_object, subset = NULL, intervals = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{lw}{A matrix of (smoothed) log weights with the same dimensions as \code{yrep}. See \code{\link[loo:psis]{loo::psis()}} and the associated \code{weights()} method as well as the \strong{Examples} section, below.} \item{...}{Currently unused.} \item{pit}{For \code{ppc_loo_pit_overlay()} and \code{ppc_loo_pit_qq()}, optionally a vector of precomputed PIT values that can be specified instead of \code{y}, \code{yrep}, and \code{lw} (these are all ignored if \code{pit} is specified). If not specified the PIT values are computed internally before plotting.} \item{samples}{For \code{ppc_loo_pit_overlay()}, the number of data sets (each the same size as \code{y}) to simulate from the standard uniform distribution. The default is 100. The density estimate of each dataset is plotted as a thin line in the plot, with the density estimate of the LOO PITs overlaid as a thicker dark line.} \item{alpha, size, fatten}{Arguments passed to code geoms to control plot aesthetics. For \code{ppc_loo_pit_qq()} and \code{ppc_loo_pit_overlay()}, \code{size} and \code{alpha} are passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} and \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}, respectively. For \code{ppc_loo_intervals()}, \code{size} and \code{fatten} are passed to \code{\link[ggplot2:geom_linerange]{ggplot2::geom_pointrange()}}. For \code{ppc_loo_ribbon()}, \code{alpha} and \code{size} are passed to \code{\link[ggplot2:geom_ribbon]{ggplot2::geom_ribbon()}}.} \item{boundary_correction}{For \code{ppc_loo_pit_overlay()}, when set to \code{TRUE} (the default) the function will compute boundary corrected density values via convolution and a Gaussian filter, also known as the reflection method (Boneva et al., 1971). As a result, parameters controlling the standard kernel density estimation such as \code{adjust}, \code{kernel} and \code{n_dens} are ignored. NOTE: The current implementation only works well for continuous observations.} \item{grid_len}{For \code{ppc_loo_pit_overlay()}, when \code{boundary_correction} is set to \code{TRUE} this parameter specifies the number of points used to generate the estimations. This is set to 512 by default.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{trim}{Passed to \code{\link[ggplot2:geom_density]{ggplot2::stat_density()}}.} \item{compare}{For \code{ppc_loo_pit_qq()}, a string that can be either \code{"uniform"} or \code{"normal"}. If \code{"uniform"} (the default) the Q-Q plot compares computed PIT values to the standard uniform distribution. If \code{compare="normal"}, the Q-Q plot compares standard normal quantiles calculated from the PIT values to the theoretical standard normal quantiles.} \item{psis_object}{If using \strong{loo} version \verb{2.0.0} or greater, an object returned by the \code{psis()} function (or by the \code{loo()} function with argument \code{save_psis} set to \code{TRUE}).} \item{subset}{For \code{ppc_loo_intervals()} and \code{ppc_loo_ribbon()}, an optional integer vector indicating which observations in \code{y} (and \code{yrep}) to include. Dropping observations from \code{y} and \code{yrep} manually before passing them to the plotting function will not work because the dimensions will not match up with the dimensions of \code{psis_object}, but if all of \code{y} and \code{yrep} are passed along with \code{subset} then \strong{bayesplot} can do the subsetting internally for \code{y}, \code{yrep} \emph{and} \code{psis_object}. See the \strong{Examples} section for a demonstration.} \item{intervals}{For \code{ppc_loo_intervals()} and \code{ppc_loo_ribbon()}, optionally a matrix of precomputed LOO predictive intervals that can be specified instead of \code{yrep} and \code{lw} (these are both ignored if \code{intervals} is specified). If not specified the intervals are computed internally before plotting. If specified, \code{intervals} must be a matrix with number of rows equal to the number of data points and five columns in the following order: lower outer interval, lower inner interval, median (50\%), upper inner interval and upper outer interval (column names are ignored).} \item{prob, prob_outer}{Values between 0 and 1 indicating the desired probability mass to include in the inner and outer intervals. The defaults are \code{prob=0.5} and \code{prob_outer=0.9}.} \item{order}{For \code{ppc_loo_intervals()}, a string indicating how to arrange the plotted intervals. The default (\code{"index"}) is to plot them in the order of the observations. The alternative (\code{"median"}) arranges them by median value from smallest (left) to largest (right).} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Leave-One-Out (LOO) predictive checks. See the \strong{Plot Descriptions} section, below, and \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)} for details. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_loo_pit_overlay()}, \code{ppc_loo_pit_qq()}}{ The calibration of marginal predictions can be assessed using probability integral transformation (PIT) checks. LOO improves the check by avoiding the double use of data. See the section on marginal predictive checks in Gelman et al. (2013, p. 152--153) and section 5 of Gabry et al. (2019) for an example of using \strong{bayesplot} for these checks. The LOO PIT values are asymptotically uniform (for continuous data) if the model is calibrated. The \code{ppc_loo_pit_overlay()} function creates a plot comparing the density of the LOO PITs (thick line) to the density estimates of many simulated data sets from the standard uniform distribution (thin lines). See Gabry et al. (2019) for an example of interpreting the shape of the miscalibration that can be observed in these plots. The \code{ppc_loo_pit_qq()} function provides an alternative visualization of the miscalibration with a quantile-quantile (Q-Q) plot comparing the LOO PITs to the standard uniform distribution. Comparing to the uniform is not good for extreme probabilities close to 0 and 1, so it can sometimes be useful to set the \code{compare} argument to \code{"normal"}, which will produce a Q-Q plot comparing standard normal quantiles calculated from the PIT values to the theoretical standard normal quantiles. This can help see the (mis)calibration better for the extreme values. However, in most cases we have found that the overlaid density plot (\code{ppc_loo_pit_overlay()}) function will provide a clearer picture of calibration problems than the Q-Q plot. } \item{\code{ppc_loo_intervals()}, \code{ppc_loo_ribbon()}}{ Similar to \code{\link[=ppc_intervals]{ppc_intervals()}} and \code{\link[=ppc_ribbon]{ppc_ribbon()}} but the intervals are for the LOO predictive distribution. } } } \examples{ \dontrun{ library(rstanarm) library(loo) head(radon) fit <- stan_lmer( log_radon ~ floor + log_uranium + floor:log_uranium + (1 + floor | county), data = radon, iter = 1000, chains = 2 # ,cores = 2 ) y <- radon$log_radon yrep <- posterior_predict(fit) loo1 <- loo(fit, save_psis = TRUE, cores = 2) psis1 <- loo1$psis_object lw <- weights(psis1) # marginal predictive check using LOO probability integral transform color_scheme_set("orange") ppc_loo_pit_overlay(y, yrep, lw = lw) ppc_loo_pit_qq(y, yrep, lw = lw) ppc_loo_pit_qq(y, yrep, lw = lw, compare = "normal") # loo predictive intervals vs observations keep_obs <- 1:50 ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs) color_scheme_set("gray") ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs, order = "median") } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (p. 152--153) Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Vehtari, A., Gelman, A., and Gabry, J. (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. \emph{Statistics and Computing}. 27(5), 1413--1432. doi:10.1007/s11222-016-9696-4. arXiv preprint: \url{https://arxiv.org/abs/1507.04544} Boneva, L. I., Kendall, D., & Stefanov, I. (1971). Spline transformations: Three new diagnostic aids for the statistical data-analyst. \emph{J. R. Stat. Soc. B} (Methodological), 33(1), 1-71. https://www.jstor.org/stable/2986005. } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-overview.Rd0000644000176200001440000000725414057717550015724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-overview.R \name{MCMC-overview} \alias{MCMC-overview} \alias{MCMC} \title{Plots for Markov chain Monte Carlo simulations} \description{ The \strong{bayesplot} MCMC module provides various plotting functions for creating graphical displays of Markov chain Monte Carlo (MCMC) simulations. The \strong{MCMC plotting functions} section, below, provides links to the documentation for various categories of MCMC plots. Currently the MCMC plotting functions accept posterior draws provided in one of the following formats: \itemize{ \item \strong{3-D array}: An array with dimensions \verb{Iteration, Chain, Parameter} in that order. \item \strong{list}: A list of matrices, where each matrix corresponds to a Markov chain. All of the matrices should have the same number of iterations (rows) and parameters (columns), and parameters should have the same names and be in the same order. \item \strong{matrix (2-D array)}: A matrix with one column per parameter. If using matrix there should only be a single Markov chain or all chains should already be merged (stacked). \item \strong{data frame}: There are two types of data frames allowed. Either a data frame with one column per parameter (if only a single chain or all chains have already been merged), or a data frame with one column per parameter plus an additional column \code{"Chain"} that contains the chain number (an integer) corresponding to each row in the data frame. } \strong{Note}: typically the user should \emph{not} include warmup iterations in the object passed to \strong{bayesplot} plotting functions, although for certain plots (e.g. trace plots) it can occasionally be useful to include the warmup iterations for diagnostic purposes. } \section{MCMC plotting functions}{ \itemize{ \item \link[=MCMC-distributions]{Posterior distributions}: Histograms and kernel density plots of parameter draws, optionally showing each Markov chain separately. \item \link[=MCMC-intervals]{Uncertainty intervals}: Uncertainty intervals computed from parameter draws. \item \link[=MCMC-traces]{Trace plots}: Times series of parameter draws, optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-scatterplots]{Scatterplots}: Scatterplots, heatmaps, and pairs plots of parameter draws, optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-parcoord]{Parallel coordinates plots}: Parallel coordinates plot of MCMC draws (one dimension per parameter), optionally including HMC/NUTS diagnostic information. \item \link[=MCMC-combos]{Combos}: Combination plots (e.g. trace plot + histogram). \item \link[=MCMC-diagnostics]{General MCMC diagnostics}: MCMC diagnostic plots including R-hat, effective sample size, autocorrelation. \link[=MCMC-nuts]{NUTS diagnostics}: Special diagnostic plots for the No-U-Turn Sampler. \item \link[=MCMC-recover]{Comparisons to "true" values}: Plots comparing MCMC estimates to "true" parameter values (e.g., values used to simulate data). } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/MCMC-scatterplots.Rd0000644000176200001440000004215114057717550016600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-scatterplots.R \name{MCMC-scatterplots} \alias{MCMC-scatterplots} \alias{mcmc_scatter} \alias{mcmc_hex} \alias{mcmc_pairs} \alias{scatter_style_np} \alias{pairs_style_np} \alias{pairs_condition} \title{Scatterplots of MCMC draws} \usage{ mcmc_scatter( x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 2.5, alpha = 0.8, np = NULL, np_style = scatter_style_np() ) mcmc_hex( x, pars = character(), regex_pars = character(), transformations = list(), ..., binwidth = NULL ) mcmc_pairs( x, pars = character(), regex_pars = character(), transformations = list(), ..., diag_fun = c("hist", "dens"), off_diag_fun = c("scatter", "hex"), diag_args = list(), off_diag_args = list(), condition = pairs_condition(), lp = NULL, np = NULL, np_style = pairs_style_np(), max_treedepth = NULL, grid_args = list(), save_gg_objects = TRUE ) scatter_style_np( div_color = "red", div_shape = 16, div_size = 2.5, div_alpha = 1 ) pairs_style_np( div_color = "red", div_shape = 4, div_size = 1, div_alpha = 1, td_color = "yellow2", td_shape = 3, td_size = 1, td_alpha = 1 ) pairs_condition(chains = NULL, draws = NULL, nuts = NULL) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{size, alpha}{For \code{mcmc_scatter()}, passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points.} \item{np}{Optionally, a data frame of NUTS sampler parameters, either created by \code{\link[=nuts_params]{nuts_params()}} or in the same form as the object returned by \code{\link[=nuts_params]{nuts_params()}}. The colors, shapes, and sizes of the superimposed points can be customized using the \code{np_style} argument.} \item{np_style}{If \code{np} is specified, \code{np_style} can be a call to the \code{scatter_style_np()} helper function (for \code{mcmc_scatter()}) or the \code{pairs_style_np()} helper function (for \code{mcmc_pairs()}) to specify arguments controlling the appearance of superimposed points representing NUTS diagnostic information. (Note: for \code{pairs_style_np()} the \code{size} arguments are interpreted as scaling factors).} \item{binwidth}{For \code{mcmc_hex()}, an optional numeric vector of \emph{length two} passed to \code{\link[ggplot2:geom_hex]{ggplot2::geom_hex()}} to override the default binwidth in both the vertical and horizontal directions.} \item{diag_fun, off_diag_fun}{For \code{mcmc_pairs()}, the plotting function to use for the plots along the diagonal and for the off-diagonal plots, respectively. Currently \code{diag_fun} can be \code{"hist"} for histogram or \code{"dens"} for density, and \code{off_diag_fun} can be \code{"scatter"} for scatterplot or \code{"hex"} for a hexagonal heatmap.} \item{diag_args, off_diag_args}{For \code{mcmc_pairs()}, optional named lists of arguments to pass to the functions implied by the \code{diag_fun} and \code{off_diag_fun} arguments, respectively. For example, if \code{off_diag_fun} is \code{"scatter"} then \code{off_diag_args} could include optional arguments to \code{mcmc_scatter()} like \code{size} and \code{alpha}.} \item{condition}{For \code{mcmc_pairs()}, a call to the \code{pairs_condition()} helper function, which is used to specify a criterion for determining which chains (or iterations) are shown in the plots above the diagonal and which are shown in the plots below the diagonal. The histograms (or density plots) along the diagonal are always made using all chains and iterations, but the scatterplots (or hex plots) above and below the diagonal show different combinations of chains/iterations depending on \code{condition}. The default is a call to \code{pairs_condition()} with none of its arguments specified. In this case half of the chains (or roughly half if there are an odd number) will be used in the plots above the diagonal and the rest in the plots below the diagonal. The \code{chains}, \code{draws}, and \code{nuts} arguments to \code{pairs_condition()}, which are documented below, can be used to change this default.} \item{lp}{For \code{mcmc_pairs()}, a molten data frame of draws of the log-posterior or, more commonly, of a quantity equal to the log-posterior up to a constant. \code{lp} should either be created via \code{\link[=log_posterior]{log_posterior()}} or be an object with the same form as the object returned by \code{\link[=log_posterior]{log_posterior()}}.} \item{max_treedepth}{For \code{mcmc_pairs()}, an integer representing the maximum treedepth allowed when fitting the model (if fit using NUTS). This is only needed for detecting which transitions (if any) hit the maximum treedepth.} \item{grid_args, save_gg_objects}{For \code{mcmc_pairs()}, arguments to pass to \code{\link[=bayesplot_grid]{bayesplot_grid()}}. For example, since \code{mcmc_pairs()} returns more than a single ggplot object, using \code{\link[=ggtitle]{ggtitle()}} afterwards will not work. But you you can still add a title to the plot using \code{grid_args = list(top="My title")}.} \item{div_color, div_shape, div_size, div_alpha, td_color, td_shape, td_size, td_alpha}{Optional arguments to the \code{scatter_style_np()} or \code{pairs_style_np()} helper functions that are eventually passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}}.The default values are displayed in the \strong{Usage} section above.} \item{chains, draws, nuts}{Optional arguments to the \code{pairs_condition()} helper function, which is used to specify the \code{condition} argument for \code{mcmc_pairs()}. \itemize{ \item The \code{chains} argument can be used to select some subset of the chains. If \code{chains} is an integer vector then the behavior is the same as the default (half the chains above the diagonal and half below) except using only the specified subset of chains. Alternatively, \code{chains} can be a list of two integer vectors with the first specifying the chains to be shown in the plots above the diagonal and the second for below the diagonal. \item The \code{draws} argument to \code{pairs_condition()} can be used to directly specify which realizations are plotted above and below the diagonal. \code{draws} can be a single proportion, which is interpreted as the proportion of realizations (among all chains) to plot in the lower panel starting with the first realization in each chain, with the complement (from the end of each chain) plotted in the upper panel. Alternatively \code{draws} can be a logical vector with length equal to the product of the number of iterations and the number of chains, in which case realizations corresponding to \code{FALSE} and \code{TRUE} will be plotted in the lower and upper panels, respectively. \item For models fit using NUTS, the \code{nuts} argument to \code{pairs_condition()} can be used. It takes a (possibly abbreviated) string to select among \code{"accept_stat__"}, \code{"stepsize__"}, \code{"treedepth__"}, \code{"n_leapfrog__"}, \code{"divergent__"}, \code{"energy__"}, and \code{"lp__"}. These are the sampler parameters associated with \code{\link[=NUTS]{NUTS()}} (and \code{"lp__"} is the log-posterior up to an additive constant). In this case, plots below the diagonal will contain realizations that are below the median of the indicated variable (or are zero in the case of \code{"divergent__"}), and plots above the diagonal will contain realizations that are greater than or equal to the median of the indicated variable (or are one in the case of \code{"divergent__"}). If \code{"lp__"} is used then the \code{lp} argument to \code{mcmc_pairs} must also be specified. For the other NUTS parameters the \code{np} argument to \code{mcmc_pairs()} must also be specified. }} } \value{ \code{mcmc_scatter()} and \code{mcmc_hex()} return a ggplot object that can be further customized using the \strong{ggplot2} package. \code{mcmc_pairs()} returns many ggplot objects organized into a grid via \code{\link[=bayesplot_grid]{bayesplot_grid()}}. } \description{ Scatterplots, hexagonal heatmaps, and pairs plots from MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_scatter()}}{ Bivariate scatterplot of posterior draws. If using a very large number of posterior draws then \code{mcmc_hex()} may be preferable to avoid overplotting. For models fit using \link{NUTS} the \code{np}, and \code{np_style} arguments can be used to add additional information in the plot (in this case the approximate location of divergences). For more on why the scatter plot with divergences is a useful diagnostic tool see \href{https://github.com/jgabry/bayes-vis-paper#readme}{Gabry et al. (2019)}. } \item{\code{mcmc_hex()}}{ Hexagonal heatmap of 2-D bin counts. This plot is useful in cases where the posterior sample size is large enough that \code{mcmc_scatter()} suffers from overplotting. } \item{\code{mcmc_pairs()}}{ A square plot matrix with univariate marginal distributions along the diagonal (as histograms or kernel density plots) and bivariate distributions off the diagonal (as scatterplots or hex heatmaps). For the off-diagonal plots, the default is to split the chains so that (roughly) half are displayed above the diagonal and half are below (all chains are always merged together for the plots along the diagonal). Other possibilities are available by setting the \code{condition} argument. Additionally, extra diagnostic information for models fit using \link{NUTS} can be added to the pairs plot using the \code{lp}, \code{np}, and \code{np_style} arguments. If \code{np} is specified (and \code{condition} is \emph{not} \code{"divergent__"}), then points (red, by default) will be superimposed onto the off-diagonal plots indicating which (if any) iterations encountered a divergent transition. Also, if both \code{np} and \code{max_treedepth} are specified then points (yellow, by default) will be superimposed to indicate a transition that hit the maximum treedepth rather than terminated its evolution normally. The \code{np_style} argument can be used with the \code{pairs_style_np()} convenience function to change the appearance of these overlaid points. See the \strong{Examples} section. } } } \examples{ library("ggplot2") # some parameter draws to use for demonstration x <- example_mcmc_draws(params = 6) dimnames(x) # scatterplot of alpha vs log(sigma) color_scheme_set("teal") (p <- mcmc_scatter(x, pars = c("alpha", "sigma"), transform = list(sigma = "log"))) p + labs( title = "Insert your own headline-grabbing title", subtitle = "with a provocative subtitle", caption = "and a controversial caption", x = expression(alpha), y = expression(log(sigma)) ) # add ellipse p + stat_ellipse(level = 0.9, color = "gray20", size = 1) # add contour color_scheme_set("red") p2 <- mcmc_scatter(x, pars = c("alpha", "sigma"), size = 3.5, alpha = 0.25) p2 + stat_density_2d(color = "black", size = .5) # can also add lines/smooths color_scheme_set("pink") (p3 <- mcmc_scatter(x, pars = c("alpha", "beta[3]"), alpha = 0.25, size = 3)) p3 + geom_smooth(method = "lm", se = FALSE, color = "gray20", size = .75, linetype = 2) \donttest{ if (requireNamespace("hexbin", quietly = TRUE)) { # hexagonal heatmap color_scheme_set("brightblue") (p <- mcmc_hex(x, pars = c("sigma", "alpha"), transform = list(sigma = "log"))) p + plot_bg(fill = "gray95") p + plot_bg(fill = "gray95") + panel_bg(fill = "gray70") } } \donttest{ color_scheme_set("purple") # pairs plots # default of condition=NULL implies splitting chains between upper and lower panels mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", off_diag_args = list(size = 1, alpha = 0.5)) # change to density plots instead of histograms and hex plots instead of # scatterplots mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", diag_fun = "dens", off_diag_fun = "hex") # plot chain 1 above diagonal and chains 2, 3, and 4 below color_scheme_set("brightblue") mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\\\[[1,4]\\\\]", diag_fun = "dens", off_diag_fun = "hex", condition = pairs_condition(chains = list(1, 2:4))) } \dontrun{ ### Adding NUTS diagnostics to scatterplots and pairs plots # examples using rstanarm package library(rstanarm) # for demonstration purposes, intentionally fit a model that # will (almost certainly) have some divergences fit <- stan_glm( mpg ~ ., data = mtcars, iter = 1000, refresh = 0, # this combo of prior and adapt_delta should lead to some divergences prior = hs(), adapt_delta = 0.9 ) posterior <- as.array(fit) np <- nuts_params(fit) # mcmc_scatter with divergences highlighted color_scheme_set("brightblue") mcmc_scatter(posterior, pars = c("wt", "sigma"), np = np) color_scheme_set("darkgray") div_style <- scatter_style_np(div_color = "green", div_shape = 4, div_size = 4) mcmc_scatter(posterior, pars = c("sigma", "(Intercept)"), np = np, np_style = div_style) # split the draws according to above/below median accept_stat__ # and show approximate location of divergences (red points) color_scheme_set("brightblue") mcmc_pairs( posterior, pars = c("wt", "cyl", "sigma"), off_diag_args = list(size = 1, alpha = 1/3), condition = pairs_condition(nuts = "accept_stat__"), np = np ) # more customizations: # - transform sigma to log(sigma) # - median log-posterior as 'condition' # - hex instead of scatter for off-diagonal plots # - show points where max treedepth hit in blue color_scheme_set("darkgray") mcmc_pairs( posterior, pars = c("wt", "cyl", "sigma"), transform = list(sigma = "log"), off_diag_fun = "hex", condition = pairs_condition(nuts = "lp__"), lp = log_posterior(fit), np = np, np_style = pairs_style_np(div_color = "firebrick", td_color = "blue", td_size = 2), # for demonstration purposes, set max_treedepth to a value that will # result in at least a few max treedepth warnings max_treedepth = with(np, -1 + max(Value[Parameter == "treedepth__"])) ) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/available_ppc.Rd0000644000176200001440000000206614057717550016117 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/available-module-functions.R \name{available_ppc} \alias{available_ppc} \alias{available_mcmc} \title{Get or view the names of available plotting functions} \usage{ available_ppc(pattern = NULL, fixed = FALSE, invert = FALSE) available_mcmc(pattern = NULL, fixed = FALSE, invert = FALSE) } \arguments{ \item{pattern, fixed, invert}{Passed to \code{\link[base:grep]{base::grep()}}.} } \value{ A possibly empty character vector of function names with several additional attributes (for use by a custom print method). If \code{pattern} is missing then the returned object contains the names of all available plotting functions in the \link{MCMC} or \link{PPC} module, depending on which function is called. If \code{pattern} is specified then a subset of function names is returned. } \description{ Get or view the names of available plotting functions } \examples{ available_mcmc() available_mcmc("nuts") available_mcmc("rhat|neff") available_ppc("grouped") available_ppc("grouped", invert = TRUE) } bayesplot/man/figures/0000755000176200001440000000000014057717550014506 5ustar liggesusersbayesplot/man/figures/bayesplot3.png0000644000176200001440000043342014057717550017307 0ustar liggesusersPNG  IHDR` iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATx Y畬}emdNhBڋ2eNW/trM')a P%Jbkl˶Ȳveyy}$kk[9| Aױs@* q1q}t]+RT H.v`keժUee޼y]E@* \x 4jޭ}K9|DGr0/x)Koޤsĩ@* g hիWns=N=ͷT HRTPoW^,eRAI/P~w)ޑws@* 7 Xt2 @* ׶}l״̘PʘGa[^,eM@ڥSJ0&SgLr/5BX|NpF ]*O@* )020HRT 8"xHGw@*  {ή @* ="/Ka~9n9^'@I0%чt1 \jz @*pq)0"vXxqMRT xM8͓~ wzV=^X## @* \  ]*ST H/z tR<5la5%}o֕'jo\ =lkx_֞#f?,!ST _o* HPyx&Şxu0jLc󶁿T HRWWzr@* gߠf(5/(kNg6_ʍX5~G/HKRT p럮T HRT`P}: FOOXa؛% kUN# Fc Di@* -ܭع-@* \ T D'rU^Y#0C&5F5׏ U0pR,nϘ4m$ By&M \K3-HRTS`D-g @*j)PO~^XEuoge-Vʸk1avwf!Tb "dž]lW䌛 @*  `NRT a C.š9.cx$V؀M9/vD!h[22wwwADقV+؋y3.H&y ^7WLRTW`C,{4^xk{0(lPw b ڴ1\g$9eik[>@\!mJxxؤH 7HRT x+sz@* 4@D[[e`Q3 c{uMytY=,LykVxp5R(U}%yW,>xC12C/гJ* #{ݧ@* \` aVD V!'CIw̓ś)<`8 ȲoL=/*\U>XÙS} K:;4U%dw5XakTq:`]З5ɣT HgF_8ǖ @/pxf2{3S06-XRUv Wi(Sb\ڟv6N7!H?&Fu)nݶߴY޳{H/-?#;~u1j34T HRE#|9T HO@N-e GMY<k?Pj퀸1lfPH^/{˜0).K>+ěk5H@ڝ]xE$䐴C`Ds~UWMe͓˕Qٵ,K.ux'`@*:+:}* odfsx>,r`3ä c-nC@Ҷ/8eoH '/%#a&ryI - N"Y yZD3I=J&s.[zMjّ|J?_ZTSX8<164T~^/ݪ 6lrWo_ReZybg#an,RT H^7e/lZ* @*p<UO^!.HF.gY/G ZGxvGO-&B0%|q֮ eR%|V) Ad2+>@ׂK;(ׁïǗI̞\>/%z>RȋŖ,Q{@u=v_)e='S'7T] Z@* K:N(NRT 8? Fl٣!@Ιg C%s< 1\/#VTM3tmX30;JܗAuϭ4J /W~_o7M*')|{ww/._?\:H=bØ)~.i۳:(?[g݇Lǔ'+W]5i m;T\]ƳO26ڰwL9iW)}bÿq.e(sgK-{M7W :p7g~Ge՚}eNm~/ ;^-@, *02~FvlZ* @'3%8OX:<]$xx'iP5X׎q GDb(!4_LKlnP3.)3#/ߟ WrI1|?X͟^$>60tRx^L~33M,?]f-P̮rś?gɷks{r^ ++C"FkvtҶPF`ـml@g1Pn?_)ڲH9_CϿX:f9m6}%}~^lG7\|$4ܯ[xlp`=#HRP0җ @*pq+Z0yuD+~>@0C W`H93k"Ɨ+wWw9ʦ݃eQ5 >ozhs,;kcJ{|u˿; a\ vٶ3rY6HRR`DKH *IRT 0hޯ ~ө01Ae R^8!V6ٳ%\cKV>"ٗ^xm{>{N8!O/hA%PjPGafu;ʾ-o[,_욲eՆ}eu˿.W-XM,g$=k珷Nghm5`g!nVIRT;j* >8%~2 y2e &=)یWH#(ky7hasX +^hXh'oR֝~aA@%=z ?RVa8Q8.jk~+_+O,;ą]G~kEU Tm@`b|0 }^ M+? -2etO>X6l H@i@* r{]l!HR ]*tCnv%Ҕ"$dG=|{4/PWBMzRRm!H& jIh)7`& @*+0"2;HRT 8?h_6Z8$VXGj6>0e꾰(dTyo5!$D@P)^d߼&,PɿβpqU sXA99n  {dve aY%6/2"Jt>T HR)vӧG{qHk.u>qwB*++[V-'n*~ e](oArΛ&(oNNcuw]ӧL(?[;]}l2H @**0"ֿUm6 @*p(@B!~Pj6@%E=/p<@eǠOdxφtE^?d+%cQi/*ľ|'lYzjӾ2|{7uTY0y0 R$ڳ 虋͚~?B3e׭16KL(r}gtNRT 8CFΰ, @*p+X~~>)^*!v@!:@=tY`\uW΅4$SF׍j'PQ8@{ n {ʾk}|ᄑ,]:xd&%P X_I7Y4 T/ľ7Fiu S'Ѝ+:?ܣeczNS, Y+0"֟GST H.Mx ܣ0F %/z J\ާ+fud`lוkfmƭOӗPGb^Q0*C@*(RT HRS C<\ L* ıՋQ^#+ 4>̹&|Lm 3]}M)oTƮW~OăEzv' @*0R $N* @ỳ`x_]@01>8Ӄ+Td@ݴ^{খ@ Ƿv=|o`v7t Dߧ?_yYgE+{y]/sZ<VM#뇰',B *(%0\DڨD&WNz:V+eS'Lmt:2@* U7@*Wޢ%|?nU *nU?@ `ty1`@X/c@ U1 Pc }gShC~g iǷd@(.ioo1԰hkԡ2&r *{z,D~r+ƈ;@Ow={>`%h0PKkRPF~6-dCt Ā#0DHrw//O(5UQ+՝{* +0"vRT Hg*VBem_5xkUmWGMf@2}{ dD18B>bO2^02o4b<_51 uC^0hw^#oջW{q Sno@* @ع*ST x+`-,\6޽V IdqVЬZ([CH1@"a<-juʎx-<] k`e?ڸ{84bnefq&[ҌPK4oR^,h0k Tct ,|&d//㮟RұS_{lB[* H(RT HRW*P=LqcX  <-@ Ю1< XS,1xgML}Ex@}\tp(Qhޒ4{?=+}ڶתW+/q}KOgc?ׁr]sK9"1Q.ƴ=fmgB]fDk>z.TOSq Gn{* *6T HR \ _񱊗TǺ/ 04^<5m]ROz fu#/֚[ =_ 49d"[2zW e yژyоpK c`ˊe^)Y63m@ o>Phh apB@ % 75'@z+^\{i(>x}[>vvqM W`9tB#w}{)ϴ xڼ]oޞ [v_~E.F~Gn-oZ1M{ `o yUȌ>͉d}g`mե>*A>(eO<%E-Dz%s޾49I>.)V*=\^գ|KRT 8WOwZ* @*yKk]p墏;  Cc Vċ4PJ遌g#t н'|P6CArqo]ex GaB'=gKFcPM|֕/T~voyGkn>ЙTX2vZ$[`Ʀ_s07x@[DEYڣtʶ'=Y7}Dedjz|[/\Rb^Z3~f* ~eNUۿXNRT 8Oc\$hƃ4@FX$hi=}ɳ rJBD[x@8sjޯ}WP\<}ro|+ʄ?z0D?y2~$f`h,`Kjz协G *^3!WEc%U뽯pwD؂miP/l\;{%U)-HRsR`D6O9)+@* V5E,yj^muw\0 Tb<0@^+^uh"b "j񄁐wAK}Yչ*>=Vx.@"&#`c=)k7(q2'>2mJ "Pf䁺>3fyIӨj '8I Mpʫg.yE;y_fl{h^hZ+?ho<qLMb@w퍁 LKRT 87[عk-@*z(`9mHdQ?O`jnvٗ&{:B@b^zM-@ma⚹P2#؞څԗz9UY=`͹4@'/$"nΡСgXy/'MOX~⇮(o:#1` ))P  /:5/X ]OBʄ Zy}Њhm#AfÎP؀dژ9_CbKa;I^ 5 ]$c[5-HRT"T=Փ\g ߨ{$EuZvX64ۼhDdR9}˫ԠA"Q`y)k _.h[g~~]^~^5,^->ׅM%c7w@ 3f*Ē笁OUfy6Z5{Ό$6p [Do^V_5Z}ϽD=a+y#HRTd $L X$PN𷸷gYPN;\\ʺ/ s @N 4:Rhz=5l02!>Bwlc΀ S_B8B ^d8\glٴgS]R~7C@ ad2A )t񐁱~/qiXͽ2F65g lsNk ȶ>AzBu]/ /gp@* #`-n쇑5ST H^KBu[d߿ǫ7zr^$a<1X;BC$X&ayF[,XKw{$">eQ?%Oe:XVLFS|tmmBLq:jfT HX Y8~y5HRT|R86OE:a,Q]ZR^Dic7 l0B+A t[>b̓]jadC}i֍1>B hW.Wz뼲n2tB{֕5k -q* H;By?HR7ٌ\>`Ik^=V@IDAT^ogτ%ēD}XI `@gq$Qw]ftcӾ:Lt6!:{IEï^ l@Yܞ#J(;[q0:P5> ʌ=DL{x@Ll@l [\@y<vpXu>zN2 Sư[Y&=F m+d)t 3sr,v" 1oOyxZK*);E3y;HRT[;w T H^zt@;šWW ?t"/>Lluposxy `C6C <4NK- $8Կ>0y*5  @=U/\:o||[VQ~t4Lc <^QAk}&΂h`를sC sf<[^M3K@tQ Ck(HFuh´V ~!niI<{\M0o.aϜ @*p|[+عk-@*j+`mqxR/Jr4|wPnME(H@o(q'@-`"`gOh)jtԱ_7ǵ~m~u7/mnzpc ЋN{x.u]'i$HRTe"-HRTr[ s `wwߧ5vl0Gyj]e) }r.Q;%2'̀.L0B1!UP)4 *Iza1(?Pnϕ3e˛o_~{*}X2Pԓё'jwٸ3⾱˧qi I9+0|:Gveh-kq1j|ySα~ҝW ǖo GWE7,=d`\ҷו۲,4( @*p Ź[;w T H^ @8poM[_ »q$ A9pLV cr4x}mЕszს7 +gj| |5'{xxx*=_X ̧jۛ2FuͯZcmJBc3.N}ﵵ`[eɔKC(+XK~Nȱy* @'܄A4@mq6~6G"O{m 43F SBT@̤C@>rxWfY\ʴsʜhF aҖD/=xb@FՠH~bռ}塒x }2{LוvtdyGG7g@* Q $FZ* y@o0j۽ãizu-e/DG 00P=K@}`app.dq~x'Ūx՜qntVi1PT<_ Όǫ[+RX~̹aZyה}6F׆ϛ6_ 4n>?| 4E0kC'45tkhhWZ7ߩy3P M[zɱ1,Uq^2=? 5[{O±-y* #`?)@* `sdλÎ9T5)DBM>XBSxu=*ٷG7uaXMH $0=u<sŘn]F?׾eCʊ1'|UXPi0œ2_&$Ё.g;vvww"vy_6ۢPx0bpzlr  hs3t]8]Z!pK_E> 0HPd_oQ~~O=Vʲ1&~uuUM UOym035p'4] ?pa7/e$}0Հcç@6yxy0ԣ c\cIi@%y>os ,oyhųrs'`U@*teQ 3p5cj{ $AoL`K=Ђ&=ڵt`N]<҇1kM+:0D{U>$=]tnyϵA{bS/)_Φm^)@* +I>σT HR7"ޯv޻< 28 ڢ]]`|`y hM9x W{`ka8lcmklϙZz`GGSKG?_@* Tʓ7ST 6k pf-ԕ vTY; @A0@Ssφ2oθcÁ^XrZ'lyaO7{JMY?i@* 'Uo9[{rf@* `‚r,yo,(.{xo9^ǃ,x:< { z/Ç1c !B=~2`#,/x $*i3fޡ6t#ϗ?\2s\ټPM_Y8 vA3sy,b<ZtfXN#2n1vZ+fW8sh8㖆^Ȗ{F3`9WҸVG=60^Pd<[_`fys Qb^V}$5V*  ğT HR7ŷxeܙe{}0p 1W[4Z1;/ޢߴ"rsW$$`2]4; r<^:y~-JσhLԴ{bt[Ⱊ[ڸxNe-7- j=RG(bY<䆮m^D@* TS @*FUyK˵t5^a *u;萀(c< `ޢx:-źpH ش@vk k$~A O}Pxy17Tʟ}زCᅓo쏾_ 5izxJ1'08l%kmDtుQKPb Έ~1C%W 415'PɦѯqnXG7^0%>} L멒@* XkwRT  t' X ][eʘ78 5x,O;/pgV%9^3@1y@xZӗq;h+I+꾩($F @c2ꨲ,<ܖZ̸RT HN@=wksϽl!HRT\P]Ϣ|YW/T4~[K(xȷW| @Β =/ (+̰!_jZ*  o=ǩ@* v ;,-y7Ub j9À /J]x lż$ikj@`scRX𰀙=Aab}/(y߸M.{=xjb!)se<{ڨ1_4i>|F{i dюp ][cp^{_yw!8Ӯ8y™nStl#[ʺ AaKKRT 8#`'*@*  JXZ`qҒktn/ Y@@F>X?w`<=0}]o (cuM߲h'\3=C {`qP}vq+݌ͫIEa_|2Ra"7/xeԱe=eިȂ^*E@*p\z?_ǽwʤ@* k1n3cqnAγ1> D [7wǽ Z9 t֮X)0hĝ^{Mx@@.@U|36`k&h1U$""'ahwRzo5ˡa+-KZVǃ˒Kʽl,<ٺZP,?RT H^V @* \ X[dVbm_@|NzY[h8`PS[g8 9yۀ O:;C}(ҨOc\ʃ3{fnuR\s\KQ /O~~ede%7^StC_: x$ y.xZ4տJR*=:6uLw~ (!)kb^e\ <LG*~* \ ğT HR M lkdqe0t;_K5phBx0P 7OWdQƘ^ o~hI'\72`.e= +$pkhw̨ fMo/O(_RnnqYam !a__'9`DsܪFf6 11)!wexUVPP:WǷt)) ~6^`N$kGmq5|0!@6X+>V_>)*r݂ 1_V>Ha~ hꃞ1yec#?lQ`KߵyӜ(># @qhؗq!3`#!MSatՎ6%eO+$:ocM? g1Y|O5FUףjcRwʹq"km̛=bnc+̽yNN^ORTbT 4s0[HRTT X wΫJ,u--Er[D\ܼd>yIBV_Y0 kÞ'pƶo 9m@ojme  f"Z*w.O=^=5ΦUOW|WY}O` y2k;/{+loVhGy 8SJ}g*{" 0\>/1l8gty@Lj|YDT H.R'-5RT 8ԒQTh\2`,1ErME>%ү?RVVcN[K"k %2>8tP5b'5H7]UF\І3,u>c+g& dq4ck@36%ڒм u'B bA @R%e-6Eq{<3$J凩J/O$d*L<[[%H,HWr><% H{}=H'fͦ_MFLeD`S" N%mapЏ&X1gF8QM~쾨L?r˦GV?=}ǣsXpQ߅@!P B( O2){bHH`17|֊‹ۖS]l2[bI{چvi{_=: ٶfB(.<}˿B( C Whg9r3? 0Ip )Rڈ0Ğ8G>u}iGb#čM*\u!n'ѰD\": Tߚ2\_9چw۳_֭{]Gޚ~y]!#xVčrmfȡ(ք4MNt]/ѽ CÅ/4 2G<[X.~NLקuI#`ԅsm-L;;۰U_]G~}/|̋ 4{xFH('7|I{Y.%^"1A zH\J>˲R>aD`B>=kۣmECMk[D7[_v[$=D;{xJjF)[yd"Nf(CLa؅Ik ௏k|c:׷l*pcXDzžmkƴᴬ( B` _[;[ír@!p#2@ AۋAH3H>R&"cKb?.r;q7R/EK<3" _FF~m(#jDh'@wÚ$Fw"CT8a侏TGEiR*3¯H>l-O([B@:E#W?H0#kDŘvQO^95|8dO,X{=,m/ ZCQ11D0)9'*fzh;#(!^}Ę-IK&~D.l2#p_<'^VOe+CG~1*OzN&-j7iٟBe=w|2:bĻ~SZ.^!P񟙙kg(0)B-a օp:8ƚX Q/#Lg:?sGXIDH@D8eiw8WB"-&<?"A(#zWFک+r{̩Ni#?yvg[鑥WkRH:)ZGB#qzftH&|XSDHD6.V2wTKyE%W=z 8e7?s_ՇG|1i&M_HcXvuL+<:eSîL:C!PsfK!PxbSѭ~O.," $ M 1O!IԉD:&ĝX"w$W?W=];Qa3[VEqHOTPZ1-6<4}p۸vv|ck{ue혲AeSU"l;V EDʴYiZ̬oaS-+:JeĊGQųv% ' &O[!0B&Lm><'ּL[WO3mv8Rx|@xLL~nؚ>ׄB[4mk B~gV,F`!E}!#ObÈ2>%"Ix}>n[:_s 5Q1 TQ)9`DhG?+Wɣ481JNF]eO[~i=@ ۤM'L7;kAd~uwگvkUe!PifD.H9j5( 0"HGkv Dʔaa!2'5i8d\GZAȻ{D1N/Clh #߄ɹg }ֈ.D draSc[Kԑ}|r|ֵm;6#y]^DzTw 2B2Q/.8]ګM\-=D>A&"na#|DL+To"(fuMi;lk\L^_p՟%"bHI[[e8N1EI3i( D:ǭ[}#~Q_@!PaulWu( SiGsAP8G b[3#WTSiƤx1E8!rj;#bDd"&A]#|Ƚ2Eb10#G6 RI'JF 2'"zI^(o'vx\\j_v҇=oC+N"P`C zƧsF9D(SO6_ٞ{4};*xA_vX4Nd&2#94sM!a/vuH-ot8YΜm_aE E8`g!bҔ!!#'Bd!j<->7iְXkc MiM"c+KDh]`ζ'>c,Z\xU+W><; "|R\?a&=Kʑ}4*,g¬]}vgkf 6A>. BkOlY!P'$Eci=62e/eXkB >B(=":tLY4UP)ws>&C6׶ab$ ʔC ҧѫ;>ܶv_Ҟ{Huî|ri6b;Fa2#llG~6yԗ\מTFݑ_>SS wGO>:o^ pQ+bxHou&oVc^D#.kE2 ^" mw<:>}ΕƠ{b۵HOX&B̸o\F^ YC$Y$C[T'Hr0#֦! feߑV!z^QLDFH8"/"zq"Q! auVc}(GdU;Cnt"W7îˇk{)ŕhQX8z~'JdE@\$];ċuZv8T='B$3>*.B`z3AʕS|D"֜ᨛiO>*S$]0W~ K OtUjiX9nϔQ6Ȇq7~:F_u}qY=+ B`#?ӷ=} C!PmNhsNNӍ bLD\Db WrkQ}"t9E3p.hA&%?ʳ:)F6顧D!2DN@0O;k+b7_h|iU{泛Ѱ o_mFQ(H&QiY_H'Gdvvj$Th "x0@IDATgoqş EU~fh焲#q7v[_Na H|4Om!umxyê /d^ݮc:u@!06 B(ndBiXqn;_qxf \iz2 'x$`(HbO(;nJ<#|$:p!|b†6 Yj)lP<uT4ޕz^VLόi%?(.|ąHSNQӆ2@7٣Q|vG$`+ 2m!sE0}y#0RIFum_9]F6g\^rg"C ۷iq'4@!PEg( BFfH4+R-y Ԉ x8€ zK8!q- :#0_IDA A4 p_4DfXT[LT gHh2LTg9R8S3=Q$Lw|яvE%E>^ThA%y eq-D)ē8CT1> 3S EEH}q!ڢL$$F \z G_r-Bxk+X㓈Ɗ6P}xG]5 #eavo4sO/ o^<^yX3c?VJ`@!0紭LrPs"!ĉ Dx8Nފj;C#3ryEyL~M$%$u_{d݋3֣?QgB &-)Cb'ֆhQw7Dkz _kp[ڑ~4#0/#P]ȓ ػ JrL5$|Hh G"R"Q?!U;>*ǖ|GT3E}M^6g]F+;Α޷cy6i=ZGpֵѰ'Q}`4<,* B`"?3kO,o@!Pf5X6 ~gaD! 'DAi\9Ս@ pގ^4D`#æ`5S!ĖH\QQJǗ .6ȿ)~Er'|tWT.<[G[G2ZO|uc[BL9C$pF%%Ē$-{`#F48ٰ'rm(bE,)#"ynj`l/8+_rL^Fo*('{N||H϶mZٞܶ[h;y: ]C` ^k*܅@!0Hbm!p7CKO#AsI&1k6~H1ˮhBM3E.3\B}BԽFYq;2G3@6DȘ#gk}Q{ﶭO-k_|f[O{9 zqQgAm=mL@mM38٢^D9qe c*ceu#¬NӧF]me`q C 3y.10s"Jh,'6i>juxA%VX>51iWӋ'ہáPî'* B` ?3ko:-o@!PR"nh+[4 0v>Y1EDDDL~?BtCya'DaFg'B9GUpCEbû+1-sLDMYϾ:v$"\{.z_꣌ wJ{N@F+[&7>q-`قE(]kj7a$EI; 3"H>ѭ'BHC~I|4؉fiq1dQ)È0C>I[P_'uQfwJN47&5L9h\7Mfr>v<ޟ:~Q_@!PAfD98rɅ@!0 tF<-8/ !7L~:#D/A(!N)!x HQ|H~ .)K~-u#66/"j.hč5_fJ~0Sw_Ž껻#Ӑ&Q漨Gg>[l N]$ ճLkI䋨wI& 3F(S%s%ɣCMҺY1LuO!=Z嫢 =",S)0KNH8Ѐch[槞@!0[ۭN~( T48m7h@\E$&(6HzGsySݐp]t & "K"năkL@!*.F߾F({ۡKOinno/(WSG~/!S>AB#퍣<,N{>Xv5]ÈJ~m~+CG#&G P8˗F~ @GmxXD`iփƴD: ANEMr~^zmVcQ鵱lvLTۘhC!Ps ).+ BX958/nDMpbyf3<3bIozaC 2OE<ȸiwi_sNI#R(ྈ )<~"N&v"I=#6=t^2^/:6-BN7Xjq̈#(48R⇐v-c3|+KM~L$pELǬga| G_hי&K *um4-1fk`' 5f03feĴIw#[rIW\ʋmE BW BX9(8'QD $0kQ v#T(ͦ MětIʥ!,4Б(NKY"-!Dѣ)QOuC:SR(&27*쎶cESWbcy]́RR_st^YcFԛ@t~"oY8)]ԎDg|B/E 2DGTΉeDM^k.⹍;DsĜ|韬W#5է3=bKab/iW[tH™W6:l}m՗m}/^;>c}_gb͠xu(f53#@!P4~5H;2BB t sY9rțZc%DB@9߹.QgĚ|::=ҚF\1Bu(t4D<~ʼ^xuk_{䎨Pix*D ^(IS_A '*gvږ# j,E)"0!d>+Jb8TjmA3$IyƹCD܋}FiE{GPAto/&2A~.fy>NoaԹ i?.!wK{?y8ɴu, B` z6k;}o( ُ\fYx5܊{3K`Z)DDDMؼDV'Aa!L1 rnBV2Έ Δ6 b)t79Z"(taA\Eq͗y s.]ցX'Gz* B`!?3` 8*@!P~R jGAq[!nJC2'(bI ;$[dL,! @~$r_}m"9>6 p"+#M2*!4MT xDbc EN((?׎~T۹2*۟}mG۸~Eb)Y"V葘1iÕO,>@O/풨%> y>Y#anolNN"2ƨ/oV<`ckBe6?ٶPa-oW) B` 0+7/+ BH+I'3">*AeDfDzDݵרYz:Q bBdڬi#w/g>֏Ęq׎EZMѫ>|apwsb#3cf|eHCFk,ܱ6DWi_9ҳfg@!PFvV>(kV(œ4A/"Q ݴ.G,T 7qRD"&^BBgzGh#<.vYiwvWDM=d@x:7ho?6'wφiIYf{5"\ġCL/X{9te"#gF"i+v#ցI_: n䪞@!0ֲB( ;8^Fxi"ڭQGMMaG4.J%r23! /( !7;/Bp!(SF^N?:&SAz>#aa ’"*wv_)Qmζ|YTJ& qw/EYi_n7˵:@s} _Z4J"g6О+i07pQA7ew1~"JH`G?GD`8㨟z݇4noX=h{ۏ_BQ}fSG ~o5`B[?l1D.N2*G47Q2j.iAS'yw>_izZDՖ] vExOzGl@2SƁqC>W|#MKCiS`e;M|!l1 Nu`?f h'XlG ~ B(j~Et;ɪhdw<7-+-n RP3>bn!"|7 ^ߍCikqy.ڂ^GuOS}L T'_ҰbGWE%\h칭a|'nuqp\_0 !A|Sď)spwf-41a>4oqNӰ$Wo"L_*z&YDLeJ2eمSy?4'̕Q35_εXyʫG{6uFf?B(;}5`ǰ<@`$2%(q%2EDH]$$ ߞ%9FHA8q1v z#^0C="MA;!<2Ė(X y>{}bHMFiϼvʿˑi^Dƻ4Իwv&#rNrr}j_ԍ 54+XuN CZg-ncD_82bSDg}+3Xg& ^NqFw}ın_{r͡/Ooh0f!PcX B` ц-͐ZdVt|yN< ТV 1I؉k$A (QKt=X |p9H?AC7"!BĢ"1Y $zz}l)@vQ(}!?~ІC󿿶} W>Bt]&L&D='6*(Ś7u׌b_xX`FpؚV\KdK:6Ji3L 0v[_*GQo9lƅrܓV/ioL̻3gaWV\B ~Jgtf,o@!0;8NjlC dPڈ3E F RmS +SҬS<Ś(tDLBՉ_Sv:hY^HBw 2&N_O$lY`S7CXv:7~'^u-bs_[G5@S0%&a2i*RپbE^?R)]"L?.}hԏӿw Φp4.vU:A黠_GbJ/8rTJ7&5뚕Kڧז:o9^?xRU}@!0Й5?e@!PF iHrt6 &#ĜHi2^v|ȇUʒה>]( \gmc>гkY 2"@ԇpRe!$>>kwGXڹhOn!\5cTÌdyix0mCDԉHSɴS>˲ Q>0 J>!cb^q҈M.Ft3T(Қ. иG{>bLxP캸| [X& ~x|{1k|9ա( @΀MrN΀rQBxnED Ԩj -EnQ*ƒD ƸgH&)e!݄s)> N>%BG'Q:Q>j@;u޿v5"C^mִ4|i˗Fa'/?#m۶}Km/ĖDC Ѫ Am0SlġI$OFGiKGvƁD1IĩBxҹ:ƙ}ܨk{lۙ{soGC]Y!Ps`:gP@!p  /D?1zF4 F~䗏!I'Ak'Ach4xYWďz-/(fkTѶa{|)R'|uEw%Q]Y҈:u1iY <}_ʩF< Ƈc/nkDe_j˛-kd|kwx8|J{Y'%b$2H@| U̴I]0 K,3[/?@@G&l-v dub>`FdE3w!"NgDz'@Ğxs0>̢$$ZhDYFzVf1;CE}.\r?OCo /1/ʌBa>qb=.olcܹ,QDO_/BX_}CHM"zi$-:| ū)b(h`!iZ+u,k팝ɱGn!p mk.N^iHzY!Pwy-+ B]$'Eb$7@צ!ùK~ڔ5bEj b1-F!$F % yWMx 䋄1SDX'Qnll!koG>[[؋{ g6Cفc'|C'qQȺNw/;{S*m鯮 # Fh駌V[kcɘ ΉN>qX0TN~56p9#ʌ?bplȴXǶAuo;]?Dv(+ B` ?ӷ5`9}D1΁YI AaF0!-~ψٚ,ʒ}2D>,H32/n+[FDCf6`,*-|S'$%Z ƨ~icþV۴${WmVE0~gFm;.9Y/Yvk$ O,#\cV_颩SWOD@=GTGc1e6Vn%Ȧ^g-ol woNu`lC`F6=@!P,hBC`?4;%r"-'/TsD))"2Hfͨ!!G =$\]k[#}Lϙ*dkćX۹:|YϨ2Ӓl:fs bH/DM&}ɼ9؁HNޟih%H\3V߈z[jk+s_Kȍ_"Ȏ)LS |aBq-F$}W<]=\PO fEce&%"r)XpOlx)Ekm1vu~sFOl"5mY?R~ 3> 9}4h O~{E{"*Ή1ŒC:QXB/}{ҍ{Fu`ڱ…; 0iO\zP@!PFܜ(_])E@H4>7#a[{"ώvg)A~-&:FƗ4 8 Cpa5ό'p=c60>Z7e}1 -1?\] ?~wCu`_;َ\VA`WpŵtS B5$GEL ՍuMZ"",!"@sW?iL/;#e2$#,/n1|Av!ݢ'|m[1|icS#[ۯGsٛo]hAAih#WWjE>1eѬ?N跶Gv?vԟsz"-jD#.S|roDE"+xcTSB^p1.-]|51mK~[mY:F ~bo*O~)( dYCh_!ˆ.u`=5 5QFЉpةP40DF |T: *բ^M$*!PY6PSz<1/B˧[22I_|㵶r?xn}zRd{;/mv;˽ﬓ0EG?N6$-#c"aDjih6^4tg)գl>}1 9;]jWѐ旾զ[J+^}xOOgf)IfQ0 i?[y`\ZC&B&J7'BZ4(ܲquE'Dyh0t++ B`6#?{ӷB(nR uFH%ՔF!ʞ >)d/eMHHzyk|" haRbDzB'tSLM#zjd[`}cWkO.j/FqIlm[g;uL/Q'BE;U3Il>2k5 f"Ƃ1 ziSD:IR6~Z|Gnd)ȊKۡp+'31͍|ճB(ft6P݊@ԟ'4MPBA&\D-"S !0dܮȵȯA(2`#DGM5;KT4NLz͸Z\v.sm[JanK۱um;$N潣]% Ԕ˃F\"LuRY˥/E=c0%&tC<!O>"%}l5Qf-gl{``+anܨ3 ];W@ mT;x8I}@!0KVkjV!P|d$rm$ՔhAjb YLIvxy"z4,Iȳ(Ȕ4":SȐpω=;Oȵ:3Pu=CƑ!6 7!OzxMq= _>p~9D:h6?WwKՕ\jCa1d-Y.QwpԿ)֮Io7D3!Fɫ}h|"i|1JpSn OpK6i=όGc8ϵLZv_齶(|'ZaB̌U BH])bn᎛Y N"/DX!31Lw"ę dZ:EmD&(<5@1ڇ3!o$vl#5EipM}h؞}G_hsOmދ'×hMU.Da>RܙaB8q}" \cZ #1#<}2l$!z9'D^AED\w\mof[kw?|v[< x1 :qqW-X ȫ:ZQXJ#oUmt"m1.e`L*u өo}mߴ-@;q1޲X;VET5( ۊͺu( YP5HIBY"& 2dĸOC.iF~-X A}h cLyF#L7$Զ&+#ZdZd 3];zͷ]Eߞ^˱^{>08}/j6ˌh/ƃȔh~6];ƀvW6E76GYe%nlmg֟,zǕ+g[Ξ;>ю W/ YYG5( [B g'2=gtDQNp.߸)fw"ǝ!&z#QD;>r4KK!LTEGWe$2=qm)bهVu۟P[2?r_\>,apabX>wIaGQΘ˚4N`8З"sVd57P#2IEaʰ!}lkb^ꥶq=m7'6x?RvU, BG ~*oi#oMy( B@jEL CD5pVe/2ː]k,4:I]P!"m8W rP {>œ ~3ꁜX{O__}RGGoC?̆?5_ޮPz[+ѶP~QOZk])zMH`=X?N;An-Fh;})RpwˆmƤ1L3Q/z/1Ο?tƚJ˧1F(^`ƌB-~;G>UI}@!p#0 @!q"0r> qfjTlr}$! = Q&Z䙸 =Czd]ɴ҄Nfi{O 1HXAq$'c $:NohR}h;bwO/k_|f[^4aDHXyQsKz?Np?f)ײD1 !٣`V1BH]xf/+84Gޫr|ȟcRZskǮ,D`6ذ(QPccBؐd8B(f3YV@!0'G l7 v4iS HlN54U_r#L/Cz(VX.ȵ":z"qN򭬬5EcG1?on_OKi˛m뺻O6w!5a`@{e] ߎ #+Q0Gvn_ƝzNt>ƥ@dt?$DBc{cnvgpcݚe홝çcnţQَYPlCӶKִB(bO6tiJ8m95R, M0[BIH/BA(!4B?y\ir 41FDN&#-_#b |5:H .~=k~_J΋Bvݽҽ 7 i>nX WдMô޾?6ǹ>Mvƌ%̴%ǒ>6N|L$?Lla9QO(E`:nCu?*6W.b#ݧۑî( -~KC!PDMBB8硧pi[AZ 2&aFBSQN/"o({6@ʹ0SL #Ϩ(ت)(醴-R|wq݇ף{шta}ĠwqtQj7DMXD{S`'mEitD?e'1P0f|2Qz m?+rko= )!w}@!0k_[#~_<@!F`S)6̡ cZ%5l'9fD@n@#IE"D,:s4| ȮE$lQNDU˘M7Cet"h"(7k~-PѰhOk/6-_hQG3|R ' gw)d̈|_֪9ח0@$2PZVTOO"Q'3պB~1}ZcϸTy])A[ WOl_}a7/SNw^VlA ~: B(nG|Hi'4 y?^w39aÈ7y=p? S *dԏvNqü|9NhȗA{O iSh|x2-7jqn[1#gP 9Js/ϼnAD5SC?3l@IDATKY+e?[ucD ز >-vQ"D?5񦝊ҵDC9?e#t`75M0]ny[[QH;C. B`v ?ӷ@cPV\@7+a$ m6 %L Lu]"U]h_8"Ɗs_9B!oI/Zf'ެFT7mHXaF$ElhXH1SOOOQS阱tD26~>Dn Ʀ6xO4LLtxHo-y=mU$6Bռ) {aUB ~no#:}O( $=")KIpXo湴Ih=CXN^CMQq&"20;f*!KDcėhB!<MDb&جΊIo;okm}m碑S}v1[^X1V4N,Z`@箍;cLD?ErC"eGp1^wTEU~ ek}RqEc$@!06@!pS$9EJ /Ƶ(tĕiDdH6cVl=F0p!,V%^59oW/iv$HȇbȘ  ""C_ĹNꢞ;PsG=rÙxC~]kiƝH2٦GVƮ!"/=< ( Y@<@!P|dFƙ-D)ZGd!!H)Qq> &`i'͑#ؚ/ "`g"bM|9'=Q6u_ٞ ojmT{_91pIS@ QKv0cqOD1cɹ1**"j"0WGrܘ5]O( E3yic5N3cZ0ΘLlS/l[.x!҅W3gc0e~Q_@!P'r6l-P'NVn@ZwtbSUo5x"|z.Ȁ|Xs1)_CH!b"H.#(DZ1B QvOAT,)g^s>kl/}G6?;6O?d#[KS0X[OFnǿc-Nr5Q9z?i#^x6XF^vܘ@[ɘ3$ y%+*l 0+V,_Wsﵥ,hw~ ( YZ49힞]]@1.~D[W#r6cʠiđcv&d"3"M8_>k_ M72PB4?iDI9wDfKCDZ+F 5\|.L#Q\ lbk𫏵FEnGǚTnFs:1uu ? GFٌGDq%W7smY4[6H_>*Ib BʲB( F !C0'3 txxOn=/mMBEͲw2 VG!'7+eژ\Ÿ|}:X@E@PGF_O˃yB޶nFQ0} U'pLiw>tl8fu٢l}'1B' qQ-Waҩw(`Ƈ)(=Q@m?cǘVNW7]VPM  v=iC B[jC!Pw&B Q^d7"[aZ[)aȚ"z"]"2C{+eI3*F[!ԙHSR ߪ?KzYB0*uQ|V}X!"llu~ .3F"oEiy3tC}q)$ Ɔgi*1 ]}'Hk|+D)XuMW5Kg6/ g{OBϸ. MP')h{+ȧ(T \I.Or^43*Z<^}MJŧ«Ƀ2#Ӷ!x$$x?XFҲQmlRfmn+ y淟?᪾ BZV@!@R(ԣ#yb 6k5$%TJ~$0SEDUi *XDG V勴xBe"ͮv|wSX4Cew^;A폾^~1Ǿ@ fZ;O֟g-}gW/ƓqČ Qь':% {>3f\j|>@hL)8c^ƛ? g<~pK+q~۾%F8-w{Xk( B{VSP5/ CC*t"]=Z/H-™f*| %"R$RE0Rhs>\;""~4Fy/V? ^95ܸo>ؾ׎=|Q{Ŷڗ֟ HG1 *JǦ6'L?%Ý[Nƃ"6qe !AFYFƎ񭮌7[Ɨ1f2B<3E1`1+ 1f*ǸxIcք{)CwסlXOY_@!Pܽm:}C!P-$Drk '"8p_qD5!"ׅ 0хf: uO3yCEsDYQAzfn8{?^qqxRlm;n߉݀܌ @!fDK}ccu#WIlGҋrg[dE:u5DAoܝa3Q[qwb˵5dƿ3j m#Qw?8jvT ڰ˙_W!Pw/YV@!p e 0&| i9pR%ЅTa׌aeʵ 0+Z"|#ę &ʠ"lRʎ>oLͷ.y _%i<^)؉z"Pf}-U=x`ƭ 91eUcIY?`+W4y!󎭫"v} e+*aB?ykI(N]w"9Bb)jK$3lWd!)DYkocP6*WhE"vsC=DVgD:}ǣ1|[YY_`Cڟ)l/*d|>oOɸHA%H!$n%7PBk[6Vk<-XvN"e@!POZ6,(>^! 2] yDt*KZϐL9AI|AFAr3 l#+lM * L _'^fAh!$T8 F{,)[??˟l/_j칭!qs(w5&%`L3]*w0}QxxbcP@`dYh}\E>#k0E)k6Nt#? ?} n96[ўݶ48N|(ns6B(fĖON)$ hnXhH&™i~S02;",1e_|~(:"$#6[s>L7U䛮*So߿ 10 eWujyT4 3K6 L6A;v'_M'M;1t,bH<F̶@CJjQ5{CP-齪=瞳sɅnlgH}?Ke| M[(t Rg ikX)"9fEog=^JUۑe\ZEɴ^6<\ yc(k\"se̖4N3OKfl22n;X9RSd{ohhpol4444D"PB YFTP.68ϿAܜCi V[% .8/,!}^(..+etUӤL/~cqa#q W_Ћ.6Vtw2N0hsDR#J%1DoQX2Qi2>/ǍB8pSeSmA`$18.N/~Yx̛]^{444047 4 < V'`,D1wQ^}@(%bf!QT%KmM}͠R!l@(z-hG].sߧ\iVNp;L+| ClxK/Y 4/qWJ4˗qd$yC3/ PuE;CcwZJl0gȻIMdk-TDƨgIŭ Hu>O27y#yЉXIKm4440d50l밵44044PqP hD5"SHZgMHҦc  9h{Z&\@1"huhKGuW6KϯZ5KD,;37sB-RJ'C5DckԷȖ}dNxd /NЖWJ]h9p$[0S_4+]0L|/XGGii`j o}M~VDƼ-b.YIxV!K^u` U( >$Թe6RWݹ{?ZzX|cf(ぃ֛/.i8so,c"nMrO$"NS$ cMWKu2uxVDg+'ږYӵ *<@;wfɴط?/`ƨ{ؼ; mh[e7B@3ĔEZVY (u>VM?,!Jm"`%@Pն_@{iOymy~Su[ @^+rW|~#WW$כ7mtreI0;)bOh.*YBϹaHDs)}-g)# ]c #zHQUm ƨFUc߼3oD>bG,"ZEڌNb֝4.ln99싍3җi4440\56p᪈vMMM?.~"--)k!O?`)[_S̖N/D4w29 D|?EDiGD8ܽN|GJY{ŧ.->iqeQi"e,B漾:bH{RiˑXf{9gnMMMKv# [MMCM] nB*EDxL~u@<'.} ( +Ο`-"g%ʐ,2z X<}uy^g^vYLA{@OЄqel\4LJ$l]W,ekas8*7 )RH{dYju)c@>nM[T qƬ-p©_WtTwpS+Ϥ,9N~9dZjka ) w5a&MMMM4PF~.R>k_&*\@m!o .zpP 0'w AC7ODJKn;qQnV'-c-y_Xz9ZVDQ}?k^D<ŭˆLM$DIJƠhhY'awcΒƺl@J!ǂsƶcȚc×bp]yH1-mFD\W+KʶyO J=vvȬ&MMMUy?akii`i@ \Z!E0_ǑanEDFǁ`@Bi^eECDގy-ĬK" K 8=_ʈeS}8nXrެn ^٧rd3) vƨ1 HĴlwP[gCDf)mc+rF p8UG6n7lb#y%1GڪSmsd2 q#1yu{w!briii`i ouF>&[ MMMϘZP_Vᵯ U4Y"<&2ljNS E+0>A,W9^Q6 qҵ_3oG_,N\O/D{dSD3޼&K^,#!}I OFmj d|zfœ#&*"6pdqS5+)dIۜƩ(*fx5ivg/RӖ5Mט-#_4i]iǬڃpmXQ[{kh ۟ށhMMMhar aJKر,^@yH@*r|U=lկÀWǐ.)_5 lɌ5k0#cu^8*)UKܜՇ/ \05fޞ !Ȓ EČYQهwu"Oef۪ӭ'%Faad c+dy7V+<%!^.di:jXzko{h;MMMD=!`02\$ 8pB`]x X;h07D .X!vHj Sp-Q XADELROZU\`Z-?Z8y:QWxiLεđ}=2=Q0Kʛ%j|"BtSX*XF$d m ^`ƦruOy[e54 A!u",&YxȸնwjŶmhhf_mr}vMMMр{YH,z"}*, 7g/>\"]ADPr yh6%Q+ؗZTX^rfOpߺWbӦS/ϹvI骤ߞ~s1?i9(!虔VQ6_ a/$˰JE D^>#XO1G(/tXY#MqQ>ǂڒ(Ä}sP ʇfNW]<+bX4iT|h_l؜yC'M7x[k-4 4 4 ,j6oV"m|D8,cXz$1h|sh=}xU-+:f*cjy`,L.O4dR:e5 4 4  'Zz>ڤiii`it%0%չ.b ~J |"d9f^B]|/@R,)+&ej2$`gedB@@o/ż.eė Mj5&^Su%H?^~֏f \Cj'I"fls:(mM53Ƴq!p!_4mUC!ibiؼ;h}[b 4440L4нm444p4%0A]M+{/RVO*)jguExMIO6UjC`,g{[/ p]83:EפֿcS̜=6vboaQsa뱘:et|gؼ-$S({iii`hMI@@pҀHQ@B:.J<`JG0+?,I<[d;et04 S۳2P7kQL/D2剄g*e^ġڛ.%o^Οj!u(4dm`2s֦c!Ў7/b[Ȝ϶ƎW\4;;;Snj]nT&MMMHyt什m4444hkT:Q),$E0 ℀U06kJaݺ@(i ZI -::&e` Y喞_~8.kw>yxs.﷖+۰@!B9cXd8d9/r9N+a%ˏ+ګ48"rY MY"qxzx[):p D۶MMMC]Pv}MMMg^pYS s VXA'dWDf$)RF R#1mJG}}"k[?#xJUt5 YF:Wٻws>w,_ES;baw {skҀe-XRI(Vq ϙ`,Dql+cL /⚧-97j]c^%iIc gĘ&Ɔi@3F]oX`sR'r'kji_z8h o^ $,"UPX 4@ EIH:VI(YcN~]Q-9^W}VhuTw4du@6(zv@Voݾ2±*+'^|Y,Qԃ>[όTè?T0= A3) r֭k ]|W/1I?+u<@MCƐ_8XKv9 Jf1dɸy d9-NF༡D!*)686؇hq8F^4e؃\u8:яN@%Q WZg믏k6x/cǎώ__{s0ԺN3 ^X[{oM=iUN}~)kkCй$-Oh Y6ԫc8؅ocbqy.G"Xc΅ֱUa p<'Dcƌϖb_W􈥌5*^Wś0h405BCm44pmyD+q`493lI-0*uFÀK}`RJ56b,y%J?+-i\YXտkM}O.=| nyxKJ_'g*'@ȱ@i _؊1䔶D87)~͖֞}b.XgAيePyC=~Ҕ|Iz)eG?<+6n<ᐎwt~w";wnoV_E_ʚkcٲe1cF>;ݳUvzBwi4444P „$){*QJ =&JZ!cӨ5{}@)mXFj#0Fj.?T\r8oaP2LL:٤7NB߸2گi~i*by=i߃s>*eY;ΈǥK3 1SGe7; qa ;J۾/({=wW]uUq.4 <p 4 Uhhx5m?q20䫤Xa̟qŤKJ 8JԆZ,H T*ZI0 hMs\6',,^帳lY'wll\y쪘\Z`<^\JO8*iog0(Q\2摱@ƤʱmFj )e%*l~;}mY('=;x/]hNHSX".pKgF:싃}|c:)N/$ȼ5/WryD$-rWޑ׿u|_ܹo=Q^\rkit5Г?wz۶iii`(k@t 釮( VKD@(ᥗ"'jTQYNRU6/}xi@9BƲ-W|X2ǧs6WOmk/b:4g[= AD[NoEz[`2LےrheCm bȉ>'H3f=I[ aޞ0ndȞygǼcbl(;{mHz?Ʀv1 ~;8/}枸"fT|Og?഼ωU]ֽgý ĕW^W={Ċ+ꈞ&eFToMϸzBgwl445PHP(w`%RJ ^zHht!N@"<(%>Eʈ SP kcȂJl=R=KǃMe~ 6s1i2 !\Z Ȕvݱ^9^Gֹ#q"BXC8-e_u'N-ݑvE% Nbl":4.\ ec$8Mm?X;SivZn)ė9kVˎ/ jѯAy5PB qq\c\j-;B6Ӏ-(gJ1,鵩94l[~8/OM$bokge~s`gJ8p<~ Jma!~L̛ڋt}b_<cΚF)^xa)ynq;pxJVL 1Mz-+'i3}oOd;4k o_M! @j)R jm>Rd'4Fx!OlWؖP=>./HVMWHyee),i `}vHՖVV6#)!M/?K8O{!c7] u<̽5;l2<4c ]1Ps!YG&4[΍C05%k#ibC>#c"^l1sKh3b鼉iЄqcמN2SX~w@w˫>prʸ[Kzu,=Z5 - 46~v5MMO,ovI&USWY1uΕyE *`rd9_V˶<9)[C@)J4jp|Hms\֗Ͻni.~jsGƯqhxL4DܯJ%K9~G6gCy]^؂;g!;/fu̜9-ϟv M>3BM HGt8Kʤ9r$> 7s)ZI@@9#eC1?;>P"dQʃ0$(BPU7u5^lz."muv!x>|.4#r6o=y덾W^E+SIZm 7 tǜmѨ:6sdcNycܳSl ٸ1SG[dkY8GfuMCy`rɣ窈)ˉ65|J{ñ k)߯_]9FΉ}ɦu8ϓqKEKI,'%xD-.̹)-)XP89)os,!:+*Fӵiq^׾2cC.h.>^w`UijDf%Es<;cR3kΈQ0utq=LzHv&瀍; 1KQYGbͺ)FJʉvVhoo}+wĻXtix㍐)m@IDAT $igŗm_@ښ4 4 4 #&Sj!`X{> D$JpV:Tuթ|IJ$_f!}ȝ_ڒWW"52Q2uwvp2dx5)szl g ƠTZ"$HPu@LM[19.D67DZ:,LJWeg. ${!lNfG,{ʭLg٠J~7~#nXpa̟?|zl;Z_t&AXkH BDx0.>>*5Ǟ(Uq*vhʫ/PQB!%54n|o|اĂ 'CKoZ7>oYiutYX;EiqDX!#،qoƏ(bmEMצEY..9F,ʧ7즌wĮt(:M> T6s̸ r?kυo&MMM pDt"y| ^khWM͒dJ-eQ{œ "g"XȔ>4Bٞ4C8J;WvxAd#;.w:/S:0IyhM][_TK+1wX"<̋!`"dLM;DTzӪqޘqaUi>?&*lh8X_s0Gua[ʢKEtcbc.C0X4!m12"VgŔTiii`(j oogl5 4 Ny&\97#xXظ9Oʇ44404нj444c 9_1[~,d i">, X"^H MetI1yZKlg~?ŷ|4?؝yQ9/hx뮉(=XIh2'.$ؙ$ l\{l8*.+9I{`Pc@´f|FdlxݱXjK;o4 4 4 <hyiiR(!QH$U!E@$O>tI"& ]DLʾv QUyGrk*`6R:H87_cE|3ǢCs[D./݉~_ET559Q )2cșqφDهx'v_!dl>(w26d#]eX\oK!5ihh8{5ňB ~w1`"(9?=ctD TMR ]@#B5/Wpۓ? jjGa'¥~rWUs"ZѯܯѪQ%RA[eiQi"HW[~6&UDžc9cNSM{nMBgM?Ni~=@rңB})PT+Ѳ ;HR+ѯ) K9//tˎ}ѯr?p2ޒZ8wjԌ/[[A%9"]lCco΋ ٖ(r2-A煄@q yc3JC̴ɣbœm.Gl}Yc|YYz|->7 0T2I?${Ѱ\JDe3O(Ȗy-V?Y4__i/ۿzo|0_7o^xeiDksNKŭR@w"G3r|x|N o0E1l- `LiYE99>E2ɘ%%˕9w reɒXv](3o]WG剎?Z5 < ͮI@@3c.8+E!$cڪL !b5= /Vex&z%8YqWG7D'?w]̙9xG@\Ԁa8N6e s9!sܾ95mS164k+1Nd3ΊQi` _(1$M>mLY%?Tp@irvi_En@O>vo.iii 5P'?Q!<d yGȬf> 0(Ͻ:>#8. St@]j+?bZ^Q:O~_ܦXhB_w(^e/|RvzM] qĩ@$}"etB fXG؏ϱA؈(+؜Λ/df'C::]#[RCɢMosnܸ1>8p@![޽{n}s)p0> XJMMxK5c2yE CЈLNY')`Q HB`/P."B"at?ʇd-ѯţsP8?WyS~N[;ݒQ^Ki__DM|5׻"['+1:Ą GW03.[~ 0n,;р|yœF2F,#w\.!bsΌ 'f6{T|㇛c%D:vmgjOd\uUq?3*V墋/%1eJzŚ4 A  [MM=@ne[\/zl$@[!M^HB$EX(â4E`f#Uz޶sxh? -:7^`_ET.'z=w";?/_ϹvI`ݵMOJ$XTչ_}EIeI56uIxe #P?xF&Ƕh M*/-^oUiӦWrw%\&/)HW0x=f;}km4 V3V^FիּCR.[ih og6B@@4XZILV$wOd~)HrR^7(tLۈpɋ VPԙR-4P DZ@dJ!qyaw}dʼȻ+ώ+-v' 0`/N,́D]=(3Ηdcls9?ql_pao>&.~J|@< /V9<i jAsDIEdklS#![Hl-iKlhg#dɶƌ񏗅<^;;qz_!o^{miA'?Y.W֎6 <zB'ihh8$Kj ǥC>“:"xox_c9_!wuW,X ^Wc~nww#~=cv5üI@@@|O>VWb\MM'7y2_qq HTHeEԔfZ|CϿ(XM4*?Ho_)&yO Ӫ6.D}9#&v9PLOΖD WaKF0Pk<y3mrS Ԥ7ë=E) 2XH1^ٗ[|c^F|V6 JD[0j<~Oh/O7kgMUƵ/9Tv=MO]t\J$xKE:6,s\ivَl#qCal/QsgybuF6JwJ` SWn, z'OTt^zS5:+[|yٳ,Q IEgJ$،3ʼL[ֳUHzcM+[n-5i8] tGVo` "͊ A<&[ B곿A/Ja~z<;D«o~-(HY+Wh]&?|$ylݷ>?.YJ?Lgn 4"WlH 97۲2bM \06&a.~D/gu+ccZfLKϟ񚤱\3Dq)mXDir.:;ǹJDD6n_W5yM!X5zq6k2nܸ[}oXl*w_|COmDZlʕ?[֘0aBVBmmNI!`uJnάjDpBD J0F,!r8 XCtB8}({D;!h9NrwPRZ{GfM}/]zե}`6ix&5 Q'T!MmXp_V y}jnJ{,1-ًN>cs)kĆB}XJ{MRW1Uɗ÷v[YQ'> nԪH|o|eUC?JJr5,a뮻4\!y_|ٟYMoox]@{k8E $腸5ihhxf4P9$uJ>m@HXHOC`йgu:m:,]{ 2E'XhL=ߏIbqx0&`ENOǭVo4PɿQ`s-[vh$Cv)i[%=/ԁ7玜K=2 BsG{VnݨlW,烥n>Bv\歕3'Ko{,^(GSk#S\#[{wϖ~1sfNʑ#G5~M//ֿoyY}vjm8U mR=h5444T4L%+ LTjn8ⶄr}H-}[ϞA CDD\y~~n!JDLRqy]7 APzϗ/yERgO_)ޚNA=!`)ي4 4 4 L4CrY<0D1 "R/e[ |0iݿ"S :TF(;;P]߉)|k^} 1m <%ŶgV]{D)0aOȰG=A$MX%l=sp({2eR>,5u; 7;מGbjy@%aЩ!e?ǖ?| 1k֬x׻wygl߶i64&MMMS48yYB 8y2" 쯯0keY5@Kĥzhoo<< >L|@/m0^׀`tW%F<@O R.`9_Vl~:@#`vu6.xRܿ`,|xn(NVi@wI$+0`oVe"%5ќM46횰4B4NJzgru޼Y,C; ׭'e$,똻 #5s늦R:no}s~p[yB@S@$2qD4D=ID6@σa1}pg ]!,"uE€E`OyVc:KK_Чþ[EG?{g?3f\3)#n/]X7`Pކ4bSAX#e<@`_չ<5\~dށWx-CAQE{0S-Vgے+bmCٲϞ.B$ D\]p93r"لc{S&eOC?s&<5c%RЈ0dOg )vmMMM=@/'i444pF5cU ~l)`*oJ눙%}L6}V@ʍ8;WJ k}}mw޼_"al CƐӕx_of,7>Vݿ/n 1:w˝n?^өIau/;iJ!Yh [K{D؟K='r<;onǠwo1i#ކ=̰_%垡" M΀ܖ4 4 4 / t@!>7,zrsp[P{yPxEr_4#g([Ө4S+"Uz~ y,w_?qɁOViPH{@#a˼NtsۋMav,qVFː)u \2r\{ر+?6>~ػ{wkײio'z_dLrMzVd4 4 4 ) N3U~P ~!] 87)M[5ݨDr^GLzH65 \/-]__ӏg'$_>/~.m.XUCXh"JHSL$?5v<{Y0"_ce_NG̥z{-}Eo(=﫣>4ӮT!`lG$ a7ΥYrBC`%d!Dn#*ĶqeNcy0h}f/u}6ihhapM4nh85 B@4 iE&@ԭQ9T*e;Yo?SXe&Ċ{Ƌ^(oS5z&5in`sqRS鄜 식!aRKD:J9@Pta6爹ڝ3/0'.cM8Ty8x`Ib)' {&}kFPj:[cMMgTQ #(s9R[ MPV` RgtBxEπ2,?kG9ܔUJ4Ϭ._ ^/Zjsƻ?kWKLO^,˃@m u tͮ,bk"F3h~訏0Q+v\h[2EʥF%?5x89ol|b6D\Ȝf?}v&MMM=@K3Uθ `B|'P\!j(}PY$|+iFcR<^<~eBSF<K[|x>.2ߑ<y-^ZjKyh+UW"ŦL)0{0[>s/ zD={de|;}B_g*zfΘ/}d6)ޛ\y{i4440 4E?pQN [n>2%}Y9qͫDr A j] ? S־v 4SF:0sOrwE gE,.ߺ{sM~7D\(/MzlpMUݫGڶiii`LF::D9 NZVJ^Td獪D7h+RN SV[-};s~ȋvmE:3'u4>C!d:.zt +:+V=*n3c>%^41ɖo`u}.;G$[PlNL9]fO.wfYcܻ-o[L_6_ x"% vrAi՟t *[妁sZ𒺔X &!0 .^mmhh#Yv9y!d6 ,J:dӮUO,ADV]~"#_wסo}q)w<;j+UI]P 0S¾8P)W74))I8II;>mN:1.Y:'Cicqڎ>h\)-N=$Cδ>P䉌{mNE='`t*joeNG@+ 94/I'^ mV.H"e] j|ևr@pD|!^{[⋟[_;5{4=p8?4Bj5ڎ7 C 0;vLJbVeΕA"FEE8<#DLG)F|؉}1v?/ ؼrPF-R}/ Sǹmϑc6_4 4 4 Jy[ ^xOyMI-n=]6=U ##ѯ ՕE΀;e;/^x|f 9p>ߣssh-q5Syǟ|cF-vù\q Bc,얽!BαUDdB8dV9/j*}iK]z61߼gcߞ2-mXJA9Wb'Wl7ihhzBsCl444k D@p%Ms1jD&X,OH-dy^x[xĕ/UiK~zXZ5cqoG/Do¶=[5е?)ḭ(a QD^sY1˕4B7bYY@'7=tFu4M΅8VodۏzY,a_*"+joMM=@OXhM4 4 <F".DxϫjZUHBL's5xf@ ҇'{9dR{!_"R;>,x8'C?WƯoi7 `&ّ_Qf6\{ S(Cء9)vnEwfZ{sOdq$םo*\5Tdv9SH_]9{@@S@R4 4 4 ] Ren ex#KR &@SxՇ6k,"/7iqy)幁o\|/w]L?6.3>{o,\<)_hhoMgds8Nj+Η, !i@3sb[4Ѳ'FFX#<fؗa%ҧ ypڇ5:WooMMM-4kjMMMgPALGnx*l!Bж# rߐ\e8,:h암0!'m{h m SlcPE0q/@J,Djʠh iX̟&䊨x<1vM"Sz4f$}5ߤiiit4Г瀵 N@j{CzKQn[R+!SN9Rh  8H'͈W[[Z7 g^yuE8 `,ܷlߌo|kK,i-Ao__^8;Yq;4pk)†^-CG!C´ax6:r>a_-]riiFʇ]ó79YQlSF?{v}w?M@@)k o-s4 4 4 V EjO< ~!K2Dܮsebe~Uϵ/ B؀,O9m}#baHCry\Ǿ|hkxoܞD\vX@r4^,Ɉ%;]sRiQSgu H׆U(Ĵƻ?&O\Q'bj-ʽaӾsh}~TU6='jM=@OXO54440PR 8t!;& Ȥ !MӮ]0!pc6-(r^e<߼ړrQ`.q$ wŭ'vo̻bb\8cl,]1ozM_{iL4ˎ:ʗjoMҞȏ!{; $Ҋ%%R] gru(r's-LnD5lw,m/8g}rO{{ڭԽ<ڤiii5VӤiii`j$`)ż*~<- LF8 jP)mI{w=v5ANHuHz'e}jx~:^Y.\@IDATܿ#{ؒq՗wǛn8'otMi>`9l4pkT,iig )IRvJf K %l^y3at>=Ks̘;/fPÛH2YפbEUsTs7 4 4 <5 Ժog OH0͞6K4mi# :328" ꌟ7爢,",{M$mMڼ CR$7r9Ϲyi=_hX",eyjeo]=a5V?jt^3׼V.MAcG`ʀ6@sPhĸnvdŹn1(\,#M%f]_0=,smͦvBW*\2p`.)`O,?d\CGn#w%޼f#_`>nh!2D)Ab>sUl0)JhlpK,\t+Pe9e3Zm5-v՗nZv->mV3Uد|]SB"*批9!,~Oh10SS\׵H`D}c2"ˮ(JmiL 5Am==!X1Ή nb{7Gp^.7Gp-bD8ExCHJDцM9BhƸ8Od() !~'UE֫D\^aطg_SdŶaS U?ɾs;W- cl 5Dž) k ‰k=ZYxH!Y.Db! ''^\2]9RpE g+R#sml1m0'Nwzq%:.%ǃGx9bFo^8z }GHQ0CNsCp0,՚!(b^W6> ' gƃtEÑyq#>Ȕp=R|vv=ٯ?^*%+mֶ^s\^mgzy^ cI9KBkF7\\d'\T|vH,)Lqέ"< R܆=l[bZl+d˫Q 첸%#8B`LGv%GkMz rh8d8?q>pbqjUvM݉FÙ.1wH;M— T9w۷q_ e!ybs7fn9s^BHqC@|#ŵC7>Ȃ B\Y 3*yȚVkon.+/2QG~)|̩k9 & K u_8# πAp@ ,2Sd(+BnjX4ch1"8Odpp\Dՙ`Áb|*8l^b{^7DWA.g^2=nQO_Xp\u갺+9ޤ4h/4#2y3!% B!sA8t+2E uEUʞ!lV8ety,2<* C#mApA`L؋W;#!Ldw4)lh8U"Xq~_EOI뷞#6o}ϷW)/fMcj\eOd{+-GK<lX"+#p`Uz W0 By`lK6!a,+PVk|3ϲکʸ뇔ͶJʦ3ᝐM8GSh?"i!C'dNp06Ce Sd9?DQFDC`04ʐ~S&H(5Zݿ~qvwMOYՒ29p9*CWoy N ށa?yn(;W_?@FԄLD15N.lv0 ^vQdyfUfy@]f;|ڔ]tsnp Aܰ$y;]B NLGWd*8JDKD##,cR<Ź 8b#AQHD-U95eSsٍv.6e کN;Z.{lJH۠L/)18D5ue "4bm=F e,v`<ʕpߧ`MAqVjjG0۷)3IC 4!Ώgq^vsG g8CoF"ͼ ,"Es.(3!B|!t!pNOSkH sݚ<.-7=fkzjh-__zw.a aNV9Λ#e& 'Y-k>u#Cg9#C PBM5"%2oԤy`iJK&8ngfd_lPG%,X>#L22bB=QڃscG1t d;#{?x.mSͶiꯑ\;ڷۇs͛Sf]z<s1iEwKwG@"D כ.8?BOl:ŶdBl 7H .Z WaVVe+M۫FIn|9}JG/9#Ge9#ppG?"8ILxOVmp(GDa EbMW6~6Ոi_Xj[vXw^{O?IkIpں5iD4_dlu|bpb8(*\]N1|ⵊP#{X#;KF62Dӧ٩+g+,ִY_GG(5R@B  D#NKW8BAln#2YRvX$?Gd&R# x*lJŋ^⣪2Gl]}ɭzAՖfu8\X[b_~ZSR]dhTOic|I#TO?G@!ޘwEØC l.`dѹfC\-6\Ӹ*, {׭-´Ml > KPQ3Q79:.EpƩs p,D!c`0#8 `c!NF G*nCyoN-qRay-p4kٻvu8TD!@1B;A'8 SuH&0y.1DWF!ĵwvI߹h9W ˜UfӭKDP[hoڛC=ۦ+45 Μ1^":q✏0i_˝ps^Y r}،#: #r!;4_TɊ4Bɢ0̖/ l= p[=D#z8 xaת@Y5~yMEtBX8䫿;#;~s$9pG ‘( 8sK&*2b5X>w>m[uڊ7QkYrC{{DNQkݎ9d<$(-48P q(#BGQ hxpkbi\¯$8"f(} eha*u=̝ 8п;#R Rf"chzcO5>CM6g4듊jm}oӏSt:m=]9XCr8.q2]ʉp867!G"@p ?\! C  BV9AeJ,g=]kb XTk&Sg['w|5خtwS{NK;iEF".r8bN9 q^8l3[p.@m¸1m>yzy]4+" Fi53ԅs vں Φ#Ep7s@!1orGv`PG<߰Gc.h+GdHKl=#D6*[$ 4h+s/GֽVӷ>ڻu-ShE9X)< PHdgvԈBJ{H6b pG!6:*윶ؖW?yy1!T)/5EI-,0n8dLǙ 9r(/rsCAXq Ӓ>f1'U~adJu/‡D-5sfYj̱ySmk W. ^-c{L19p&=.&# (Z8CllJy5&E;U/c[f7_~6(G(w8d(5TQ؏1wDq|( EbL'L۸9@2|3CY0u7edhw2X\ּn( gϚnUDFRTۭvr$r! |g_CabEʜGDcr#x2"z6Qd!R P+ySmu*틗N:~ IֆU%9)֙dX!˥c"Ä#(dns7BYΡHN/wCMA/x 0psLvJَl7):*aklS; 4p Y0[R9Pq;#06sGGp^ |C]q,GѥDmR|;J]w=fpRS+fg?;:.Pkzt 81 Ǎ烃F!qR=#z -gF syq)6 ׸12YCzXgUjekNX˷nn))!=L<8o0 9DsJCWS]1bqx"M1 @@<Xp-3MY/\{v] W nXdРA,d+Ƙ,#09->#0 0f3&H|u/kz\"ke+m\f[1FZnNNt >Ih6 qpȌ$L!j8rD1_ J5Tg{QZH 8Dp 7tAl\zg?e{jV˪ED=˚ h_ 8N!C)ehpؖg"pWwIhdmGLTpJ28/~a#/912=dPѐ/Wg, YuRI[mQE|UcF3 鞨&,'1rXF$NN[OӠc7G8@a!;&aDA(qSL G:f̜a,!Vo?[fvg7쇘8bOc@|ߐc3[8r^n#093Fm^8j}G`b"慓ă3WWM]l{>;USl+Wn(Kӳ_/,8>Jk(2pb9A{>4Y3Ē#$p=LMY⺇W(w&Bp1Te\wZԓ:pBn9RRlmמ_"_v!`qc2 ߠG16!A#8=(GF`L j~8G` 3_dNQ6s+SRR֦>-/_rzg *MX8N#0qጄnѡ 3/e׮Aoc߸Y>\=ҋΰ tR\{Uڣj(%:87.8*fb߈??a4`<A,s_8]#Yje+#0(`e."4xNc)t0}F:vI5i wXHUXZdznspU P ;l8 e&v& 8(/ aī{` Xg}_ڿUV}mז>bxi!Sƶ9hpXQJ(w&pZ8P1CڛӠ<%4ʑ(!"C#0@ɂuOWT/*Epx\)fpȚA;{yauqAblæ$˥Cc'|2Xp`2?p&#8c@ƙ@} QfR١Ay%V}gZگ9R8FX3!?&IQa̱FvQᄱ9l3y28#?vlEs1܁("3P Fj"-GU56552i4bY,%0 Bќ䗿;dA C p`8fJ2_Uv/Y~mUh{.;+6cZAedpLxQ* W82rZբ|,-d?BhzQ+fNfY#0`~'3Eɒ#Hf܁7,# 1d𻶶ʎ^2Úw+z4Ⱦ۹V0F*G x\a|]d(Cp&'.&翻ՎC†W)Lg;^eRE6[)mo\b{mvU ; sPp ^g⅑;s0.Op^q8Pn#0%+/ 48byV(!c( D.¦WQz~)pOܡ,%Qe'o]8F/7GGhTd +\V'kmO.y!)[k ̵}6[1Tx2b43`_|r,t`= 1Ei! CD#(?"c_w#o"oPj+ s ~A}}}ڊa˗)mdF۱{8E <^̬L EP 8vǁvtsɃ.N"?KG2e>y9I٩߿>rO "޲N;m}7Y͜JR! ppTXLi%ZGpBd]bטkc2ʏUQ&2,:m/wqt"cn' 9DCЦ ԇd'G䓫 >©L.4О~~m0.Ga }g E@Q8-c5Re( n#0y WwG7Dqj*JS{wSmcCU/f_M6wAwS(Abn2>PN+wIQHQ"*MKj'dpc(rtu32ZXgNp!SźP(aBqJU4;Z)B[qmmh 'Ѱa5Cy BtL"C>Cmx笟n#0m'%9 ׀(R(ym.[TWbZ䉨&+ϳɃLsy1Y0?dӘHssDg~0wH4QXbc灴k;Ov0g p&^"܈qFsDʒ)QdVhpP4lG*?<[tn0dzlT"o޴Sap |7=).?pS lw#9C'8$8|9->=H/-tͷ\;E?!$P"r± Bu`>Qñ=t~(8~̬9A RDV`nvgJp6EᐹZJʬ9 r2AkXRMF Ȅ_j:\&8 Q-{GG` .<gS%^hK`//ʹo_ou ٓVT: P!So0'C`4ˁ<%Dl1S/ =>-9D  5t?$!^@I!cxRva㠕}k۬r5f*~"E#xqLa= oGeAMG 1`^u& -Bf_9y{]zmpYmfz>cy=ʊ8]i #AV DŽ$D&p+ry;JOܞy8NlGQf!c_cal8 kx :GR54Ġ1@@UP!l,cV`^)ZuDm1dה9MqqdF,/E17G`r ec#8<a+c-Mv~b[\ˑ'hUmPԞ=D3!qNpB0O I|ἰ e=Dibq(pd,ŦfcŌXe8 Ot>tT' B\Ay"Yr3d03={SV5E-%,c5S5<=[պI_i9gLS#"<YA(>Yޤ,"0yp&c"<6?$ ɓ/ags]qooǔ.y2{+δ =9yHm@Np:',"<0N*vc㼰%w |cb[|#&cl]ٶd;DE fW%N4`Yro0J͙e.J[iN۾-<0_ޠa|>*4F8+$ HI^ طma]BU'7Řt BGpMA/un#0Х>z9`GpҙJPH/67ڼrYǺ~ςCү9_Ŋ##AiT5e808CdpR؏۠' 3IچPƨ}F~%ƍY11gG`#-dep6ͽ.^A!8񐦺%ն|auA@%yֻ5`u818> ΃8/ G`B!0&M&q Q|qft͏wo_n_v}}g5s5w[IQȜ+  V(eDY< cN G'F[\H-BRN=1B^Udڂzwp rkGl6G`sGFo^8z }GPE /'kV{?wB-}]|џ{Ϭ~FaUÍ.'#v©@ED/0A#" %Z8Wi(bLHcNbX"o`p&AE{K đLJG$mi?jYͩ&ʷ?ҤnV[x3p--~1nCp' Dm0C]#.G`#ڼq!~y9x'`oV{6[$ Oe]~ ϰ3Z c e8&1F&p:X ppfW7mqȢpZO1wn#0`nB ."0CiQ bUO3S,ZvCU," A0#1c nd9{h:,w6~b!06l8 W.!ZO]mg|Gus-^Vfk`خsO (s$s 1vÉ!pvp r8Den#9 Y_G`! VA N!SS6Sy!mm=WW,E˧[`OVm؅&K2⥘B\pPa3ư1xfp1D',nwG˞a9DkyXedڻ/K%ek=6cUoמ} (V kY\8`Nb egZ``#/}!,83} BqbS #(7dd"Ѓ/SH|s L;۶M[W<&^AY#<Њ@IDATiq<6v$ 2 n,wGO΀?pzl#AQ+3{w$3 miӶ 6ox<bkH nb!(_I'0g]Y!C zdyXo#0z<"ƴco"DzFMvqn"/NF(h@lQZsJxDy8H#/7##̱) Y# d8&byDQ΋vXTR^n@{6v5 ֮lsm1`#-9<)q$8K\Á%ܺUFECȹ9A`L p?ɍ~)Dngݗg2(ʵ ןScu9ܪ}P&{PK/D`q&:8ahNfy_42dl!Fጄh9s(A! sR 8c10Pzdw΍6'p! a[8CŒep[ɸ#ȔMKTqЊ/s Sa=&uC4)J$ƅFH jۀSfTp.p/8o.Fo%GpF3+"bdOf{[㯺?Vx| $p \/~d^ù@gJHxV B7G8e8+7ua )v5#og|,+E4߫FRᦎc@46,n OT@ g9{ / F EgJp  ́pHpLc7Gp(<udDG=W|δ[ܷr|D>_= %8)2 a1 é"H?lS˘3 {)d1F>tY7GFp& W~~C}Wj)y nxN<~opO#xfdR RI,mquv@3 7ٚl,G`Y96'8`{^t[WS2N7 W#ryc#8c@_K[nugV$ŖVgA v5۠mCyscsJiQUGX,.bR8 dp_o!Rm_8KzNc8a1h21.,$qfr8Lgp^".!b.JJ 1X⪣VY+k56VjO<ʹY-xXn]112lNw~×'!Xgp]2*plչˈ8ARvs7f^N|EgKm V;~N3h8D|c@nޔpӧ< DĖ\γ'/m3tβN 4-"4٠$(. ˱ٞ#dؑb}x6W$p@ 24Cp 0$+m k 류R)i+2%T1EQ4nxp\apc`5΁><Y" ",#p!KvmG\Y_*/ʝvEYb[TV`첓Oew[g!S)>[byL MlL9j@(-UbH11y  92Jxphpp$lđqDF_ Lja>#8/H/p\HHK,_!;" c-f-}Z!}g(+]ao1BqTTp%dELNd(F!жk]CӾn#p p+_ALfK\7>eo~{fǭRCssFTQfNZhP(2L&nx,0'and؆R;؉/Fen բdpx` ΁1$̔︜mGx9Q("DP $X`: dՉuZ8r#F0 3.vWVۜ˃٪N ڢyUa[ +e##k9 =)yAP>"1J[4F8^O) PF#aa !8 g1h88XX8#2Vp@8T"vAadDx >Þ§SBhӛgkbN_ʼJ-#x|s|Y2],c{}ޥ4Eta*%4!XaWwC]n#0ƛN'em=v 6Om*\ڴ.X쪲0ߋ}hM(.N7]QScAl"Q<N‹ ‡xbM XB 8 pY. %lC,YvSDh(;;#8@h O(72@_0;:;-̷>mPMGUwC(1-}qE#Y7J@y}D^3D@ܹ]s]qt0vȓCsl^uwn~P&a3lm{3=Ѯl3+ [o0&k`PBy\.!#L Gc; 'RGI2žp> "}qJ7!p0#,2D& 31!&KUꅊJ ܲ|kZc=z%Һvi 2id@Zy1nc| 9.|1'Uld^DEMwG8;l KPpc˧nW%N,C8kOO9VR\Ww̝(-Lf0"('DNsX( ` ?X0"}jc?kr(8Ugp4؞4VX7l'{]fpGe!DEv/8^sX qDvQY?""clYMִzk]*K;84 N2l J! 9? A1v& < >o #Q5>#k~.֗yK8 [kO?p)E\qFO 7fnʔL6 Fͳn/7se΅dE/o0iA&I`l^ N˘_憑]c:u8( $8_dgysXݺǦ(W5[söͽI)8\ 2. /r3!)ud8w, #8c@FMUpyTOzmz:zm-,VV[ ^k`8*ӈ 6bǃo1ֱlÏ%&>u*gVusHLH;Em?]y=E%׶=epQvߟmSF2_ږ,F &hΈn"i#h"أ,C|qg`OD%#[M-A-‹,Q]Ec9A`AΉdiCe~XlrjpVpTqHsG`"ׄ8QO8oь6K׬Xu 0`+~=يa59=|&xL21u p|)4kXCƬyap<:.LmR'Kp^IDe쯯r&$d_w}^mP./O_:wWuY\FpSY1#Ԉ""/Ƣ#p<f8*F>ZNwEY G؏c1B Ar`C 諛#8MT8n$ YE Y2ÍŹi=KY4 l\u\C_:KCF* ›0qMU![el<4!V2Œ""gaS_83oq:E `)[vꟇ2uڰ^s\%oKM qr% J62 qōIN/&c)\Fi m"HW88b(1cRz2` bA I1)_y ln#7SXVg5$ҁתαϘk[ͬ)̪vS۬W*tW*lsUTp|ͱni! {W^{X j6!)F5`p^QDe_Y+儔u'o˶- oӓg"ݢn\t@M(!fJH;<NjB0;(\/"cj{Eh-1:qe<7~5lC6(AQCGxe"cY0N9hIW<7N9qHo*DCkmmT!K_Tt9&%ڈ\bp8.&oWcp?cm\OG8 Foކ~@6Io/mJm]J~ӕ#ꦙ(.u%c*0q)sGh!rGb_2Z';7p3JɦN7o&嘴P ;k][r.:\(d|R2xn#ȯd+K(.A P8oR+m3av]lFkj;TU@948-" ȪQCPK`܌Q#ȘoKAM5,qg7g [<U,'ʊ34`B87~!9[<!Sz>yf cyI@l16Ů<9_p@W̽~.XWy_+TLЎ:fB aᦎ BQ"M17nEȱǀH*7x,c9cbG $ ̱rB$Pr hg888 #Gq2,Oorʢ!Ei@Ɗꔽ%.yV=zz-b+t RXp'\ $e.D=':e,0camfpږ w2U #LG@! h%Gp@ i9ʯjڲ"۬oEv{PyJNP{.7S(%Ah7qJ"t:19\<nڡ; 3m2nDc /mJbXB4D16 N8d wGB rT|2' ΋]dg?y<0`f]5sm %t%0V.&3h"pFY7%p9A,8pN;c?ό#p`%=`lG@xز}ݖ,)5i鏜m3MHCQ0XC byܤ)N";FjH(qؗ0qȦqCgźA1"1b #0n3"<Q9.qC$?G8jR%gG@ TevkiuJ\*R7mHę6wCY6< _JƲDA X2;؇syRHP0A$jxʂ16"}]#p`xq;HvٔQp Ň-zSv㍫led;h߰}ҳl0y.Xrq+%m9t^Y~oUtDRHNXb݌B1 118l1iAzDp!a0$b!@|h8\'9#p#udb!ÏX,MYkO턓gZSRm tYn?1^'br%s; 9f<>B؆ 3&xteΓ}31/wF`LXIZvs\3$lw1kNn9H}'عg':LFX↍S@&Lbۤ'k#2a]zqF☍)Uab+dxGc'~s\MbtWODf7vFװ-yfDoGDS)E gdIa*̻[3vb> 8Rvr(GƦyR|NUF0 0'M_iGQ@$elGq,DU dv1Eo#0ts@Za;߼l}-Ww_hSlE 7^M2RQN,J"F-QsbCR3fnd(٠Idps8D[c]r 1"8@ d7yPp$+D}^,X఩~R+\YjۺEˇƆ6ۯz"F F<@ a|bqx'hCu#su38ofTQd7H#%c.2XLXKi97 ;:Ӫy_ @hlX̍QQ⋒:e|7("b٢-<+6凔eǠ"5΍3d3&7w 7t8 )"?GdlCbA%_G"lxn9"A:kv[uStL2MdJֻ9 G7X2Q|oG`!O>fxb 5w T{Ց2n;!7CYS|JY RDY2_(D) M8Ǿ|Tm?MYDw9q,5΃es;sfĒhX7Gp!"D,;<"=9w-[{{l,U8(_/.8xL8qD@%0~s^(b󠔑1 "`XPZ#0Rss@oRD{liEx _wP_|1n>x)Mᆋ"E7asbޝ]w͞f#$aD.ڊ[c7{;jqיm.әjgVjWR7BHٗ{'ysyh!9mg=}>s D$;Pb)5{8HT%uB-rĪpyk7`Y4&}笪H!-}HYR@@,BR"B-[C+9}IRxw-mcn.Om/}Xu,Www!I [ct+}[/z>u2B%^gH(6%f eaCj/Xg9q@KcaI[gz7ĵ7=#+)o5&NV tu}JWZ%a yWFß-utԱu!Eod{ydӵ[cĊV m,9i+gxJbN GfuF1Pv%s5 <ȟiKMM &RZx`WRqq#c?"^}Ŷ$?/RbA  d!u ">Vb!5 @W]@ܱzL‚ ̱. xȚH0q3L}qn}$$$pJKUW=[tC&2}.x@ٝ⿽X"EDK9UxD&H}ʺGe5 8Fې0X9dxMJ@Hy:II[q!`﹥&& ]=j;w$.yz,Kp1DtlU]ȢX;%0żPy">!c΁I0a 3)ʔ-?pR笧xʲ=s,W^,l).nIIITCD+ǩa"")v(ۗY5 4 < wlYN \ӍJ8ʀgK$yLv \Bt ,E) uL2"K)k{ȞMʢWR7ŖNe :^:;bE)0ԩ̋tՕ Kl!ke$S!UH$1nzM\S}6 4 < tO%cC$$БX" wĴpfG y~رp )0drPo2W=@ T"<,Ky3r&khPa1UW6*Vr"h DKnIII@/9a2˥ G.piq}q)zCУQ\t0&\+ #+:gsn4!Z:IL t5!]0 )` Q@ijGhO ⅤWd8LPvBAK 0&&&&Ye6AO/9SFc fT܋[>z[|b/TvC#O `bMbF]( rI+*O׻73#B:l흾$uxG`E9]HC㖚z$p\XO}ISWAn|zIZ^ΙkwW]Y @Y>X!BG2'2y i6d.6[7w1r扱'<*d2;ȕy>P+! xBȺ "alhhh&(:?>1/~/>/K^'hP*,P\^zb3Oע-!:A/*9B{.glS¥^=uP0^p)Cri&&99`,V &J4!/3FǶ#?x8 $Jm<K㴥Kc&žXa"g%⽪")B೹ - :MUAP"E[3\JD` gt߱Ѯcm.@^*dnqW?a#|-5 4 4 4 I拱 \:IIII۔@h*j/,^2kwi{~ݰqO_Ɗ^CX%YnR |eՅ^ ]HTGd>9% &1׹v#pjފ%iIT[KMM*u <*}`og ĺG{^C ™>&%8 T u7Z+]v,,A 9YQ= {./^=")L'L$ԑ.꺺uM^oIIII%@K8-~.yTG;T{}xXܾdpΦE2(L" ou䮫œ_F8'alcC`z׎K/0BzDdx(e6JW-5 8TEGR$^@U xRzn71I~LwP|"<5@2Cyc]$J>DK:uU.8xZ? T?>O֟9 Kj? ڮIII%`^=\WlQܵ~o,?{f|ƻ>zKLJEi+Q#`WԨ؀t q~F"'<f[8X@, rp 2,֖>1iK$ҋIԐ@4=ױ˰@/2p*xO4bjv#{J\1!S^ҺL a/#@4 @PTA NYd"HTLsl-m=B-c EJV s0Az1NK-,py?+1ި R^;(iU_\FGgqҦC <==6e3BB5X&y^C,0> ׀s C#q/>^Dkj YI= 칧J^VR>'郰Im{%Chhhh8y ܳgMCrkϡ\1#_^;RWŰrF6Cu< 5rnA'5DZ,J <`Uy_b D!C$m8+ہn;ݓK$E5fnrm琧&SA3lIIJrNVBc`Q>vb,߉Wɇ᫱M4zXԧ/=Kfs.kY-~RZ~쥗ǹ;/~`_,>cF|#kx @^.zˊ lD M/30?8Uqzܴc:7X!r@ A/+R?VϷM~v2Aգɣ*$$$$xK VXꧧ%HTس&[ز8y LpKyȓ d=Kx\!,3?m X۴+!WLaT\O}:NuB*Km$#yIs8=QcQB[͉ʱŪk58u,&~x˻W>ȵh ^W9& Yg H Rކk>@*MesO(#6LKªYQ^={{ZR#|$l VCH* hMMMM, &/νq©qvƻw]Lh[0sJ") N-sL'K Lo٪ S4F<W6a{(}N6 OS*wrl5|g$P{6|?`S>pG@Zk,}4^ri<1-?WoB8 *J<^6g?a,2:*CZ*W#P@qY7x}2:$(#i0zƃVRTcy4crAweԸ{`z/ovHyDs01-O#dC(!'?Au?wH!lH+/Xc@Ri mmId@܎oZKMOz  JM*+St޵ o/nMuū3F^D#iLP6lZ;VGF;䈇 GK#OPyu QF?H/Riu. D '0Ex-sm/đGPDXW8y2$)x K^FDBፕ{1Q%VP51!pJԇ=lpVԥ]M 6W\iM' }}$𤔀f%_b}ƝirH0 %.Fczw}8oq.;;' /wEܙ3|L.P$D8PNIpN蛰 ! 3[`cj 0H ;T5):BX7gBTym$$$$I?c4g7!>uF9(lNⱂ5!x/Ehtpa{g/ &%I*$,.uob(l(/!)$ ل>޹e(oI`z6!޹sȩD!s"5F:rh'wXVZjxI uz!-7˞xbBS !Lxa;zK̻z ؕdjҏ]'N՛TJ pۙ^ĽkH-x? A,` l(Ya,C$ -D4x/Bgx^Zq i1m ܂ꀫo fR>w-5 P8.vB=}I/^"P0 DKN<%jӂ|wɿ^Ϟw?Oxs/ : f]}Ӵ#A Bx$a%X,~B4<@%f:o~z@yF`X0Y2bYZ*b/2+mMMMMO* uBϙKЅiX~Ѭ?+/}?1kqz,+. "Xk90bkbP ;Ǽe!b[0L]eiY׸*gbP[D0Q^2bPB4}C#`-5 0ȟNKM'*2y~I|9J&Q~-G\6=P"E~Wyg wH_Y`::`śe^OR^rMHH=iI-1ݓe<AK'pG}j P"VW2+>@:jeW Fc3foKOɒy% +q'0 N,ˍ/oR?xx&$}{CH);] . s X(Wk7$ݑxǛ6[qKM'+R% @AA#)p>lV<`&;5L Sq߾8wΔ|p YW]Pb;+E@ڰ!  !eYn,ᅼZ4qaȝ( ! EZJ])]Q"xVF} bh>iBT뜵&' ks|SG.k-_ ( T%MŎdF\ࢬPe߱&73CY}3bIqhl/ĉePPs # o|@(̋2+v,H~gdbD* )ԗJx&2)r#N LH:J}zZ 姟%qñ2Wݳv8=adľтo }0Ϫw\L)$lQb4)1Q ע0 [H{LE z᡽eQr /jguENIsw1Y wʡ\oIऐ@/bǒ&z$(yZ%NDMb{.'n׿d3C柹".xIYxcp.9(j# @א!!@8/h,W'ȳ*A QR&,*<D,`"Ń `螶a[fkIIII@]~9^iqʙ>À'II?E^ A,>`B14C<`  a"$CT{0>"eQ1,`C~&׭x(ᓢ;nԉhڒ*m~>( ׷&[E#PpB&wTB^(w $ iX`&wƮC1hkvySc=#.> ѴϙB,EXsVGӦ5 r=N;2 \jptX[9:\ HW#_R@@+S՗g5Hlw$2OQ2D߿+A*/ś\6Nvsxɋ++-IfL/$ eL+bIGn׀+:9GYbk N?D˷ #Dχ|yG/rYq][jhhh8%л4}F ߘ i;mᆴ$n N-+ 2!]5^^Iȗ0x k aIL9u`\e=؊wM ϰN> Mڄpu[)sEI8I z-5 X%$bozIм{%Zp`y!$\V>8Ǟdj>k+6;?W=sivtpF8yKHxN0"bJ'̃0iB`dh^Y F2 ?&lbhsϼa DkK(HpAyÉpw{֋1t;C۝<^r&c@#`,VwRuUȎAxܗ(`J.RQIH%hONyS%81˿}_xۭ♱ mƤxO,@xhڠJ۹cIbBAq  C, BX&@3:*7_S rGԄ#Q&$$$$prJ(h,Z0+~0zo|bŃeqG,^$al˅9Ҡ(hXN")&oX4?2GUBD 5`/\0H71 "r7Wn!fBy`hDIP~Xz8RF;|N{0!cO ?'"f'7"oW7)șH\; KGc@~=_N$p$P )l܈ >KR@R$ wi$:@(~jьO ÿB|KsdygsbcDb_QԬi6*%J A Ś8PBG g = 9?!jIk,+ q^!jW˴}@@@/$lvمg;xo^wܲ#V'lͶؽg_܏~w>4! hۗQ#}w*1!-Xf9B-^y3cyH-8 ϛx0}$' 1:p1 SY1Fc*yjH>nxߟyIm1y0:FF=B+f5_bnX[c@~5CmI8J uYIņxQpGX ]#fz:-h~m+y$>~s)欚 7C;y23T@fbĴ!>9pJ!yS0X\gYLgsK>3?J(hP5юˆ$w~BKMMM!]4/Wq99'lC_tlJ՟yN,HK#XF=x' A1 '!ɱ`C,p,,^>9,w.zU:ȑG76@k"KK{<[Ua}$ sgɯJ`rKML}鞮ߗoaF3$ϛo9.䒸kkЪen'M߂ʗ1?2XYą& ҵ%ʂES lwh,ҳq [o|wl3wƫ~ş [dhFV~1TQqK&S eV 宏}aC\W/V6)^_6SWN]C~V>j_*Hm$$$$pjK' )MKG6Y &8^7 }^,9kQLLZ8}4gٗ//uJ,M׋ BRk]L䩄QՈk0:,…4Xkl TRo5D{oh;K䬎7_!IB-5 <kRCJ !P5(?!SDRib, +fΘ{uV^'@aϺ#mVoD)gR.S΁kB K2gJ\X!-I +$$$$pK'v_Ăfg ƻ߽6z׎v<ʧĶC1{XbX; B! 6 s㐬7uORfp~oOdD e\t Ӧ!vG^XQ3f`UE>`tLM[_܆ ҩ6z풿kD+{HlI'UDQCyNB$J΂<(bX({ S&Z@NL3p]>.3+Aes/g LrBՕ7%TGj<G! D0F^3QȢzY rg>PPbNzuIIIIK  [~X?Jl5$_??vClbfӂ$a%a/0l0$:չR0(8>)sE `V\䭲N09u\uW N|Vf 񈉖Eb,sc"WC`;oTۃ蛶8s;fp}& z~=v AS M ZjhhhxL0SI&(?M 8u}H<N_/Y&1bI_" yp 1"OCxܳ Ex(%|S/,}p^=Ln]WOH~D _0\[~kߦtSyI9}1>ў~<#ݶJqJSO>#nQB(>IX/bүF(Q A)I*RFŞX?hjqzjMU?wҗx O 9K(T07̳i@ %ׁ02~βGSn112z~Jlhhhh%pSO2} 7̧ u lc0^OC0š&Ki)_VRy o0ΕrOL\DZ%f=(of+y'GT4 㥶C[cnJ_]OC_z }H}8^+!GKUlT*G+ۮ8./npߙczJJz{RHW=;B:B$܎JT|Y(7dRŢSƈeo֤,f/}I ̜r/(~=p+/VШj+RB,,iM-y(|/4|}4 4 4 4 zOx;򿾖`/f^1#vm g8̋st_y򴾱(T'.JVH3+`rT8H.i96$HCa[r\_*QU?^CbkUu 3,s~}~dR^O1gY18_(czO VAteb,ez16a4-8` \g4G;K6p+uw\X AX_򶼙yN yK es₳OM2[0(&OLKw0ٗ7yB֕X/ Z@&f?`wxL5[1F=1wnz2}ywk0"Jp-`ḤMXnSVc<iUDϣȦg՞<ҦF8LJBO/]-TF%D[!uQ%4M -PN#$A[)ʉstRpխ+u9ټNu%%yP\c,VT&Y6E%\eᲄ>+9CwnLȔY:UodGVPDž'_8t?GSGQl(E RpCP2RXX*y(zBѮz!Q=h>b'e w{w} Ŋfw߻'/P|U$a81VR^)Y!WF[UB>ůOh` E6'z 7a9bdl"pl&&&&&'`E51"č_ƍw%3 %'ЬI9?~4dd)yΤ:wjsڬh8=䙳b޼1wL&(wќ9`BLI K,.FRU,/4>+cL,&ecc c!׌Iwn# Y4.@+j\7a:+:H9eHeM9GQ?f,a a,=Z7Mu{?y$p\X/9 y֓"ۭ?#>߱*%D@jxPd“ʑsN9P"P%C(8J^`G?\a*3[c1%աM7|XbfZcWwY n0|Y$Ic^]ٹU<>{Ggx+_HYe֣N @ `uW ۘ[MqMwֲJ W#^7@,e,V[Q:0B5bs z(S)]^~ \MV q!`拘i/b~BjGP*GǏhUXe()*^-J(ׅ2(J1R@I垏nROe$&rMO~+gR3fdH֌+te2Aj ѸD0IDAT۳?2fR@@@@ - l^2v [ĺ/cڭ) I֭ժ&ZrX,DIa[-td$v8ͫOO[:-IΖ,10sF ͞Ƥt L8>]qAn $x3`xt|Sf뵉Ɇ=G⦛ĵ>{MfO6R9o+^̘18[d j(Re8zJMPCʐiJ̶|u1eXlhMye׽Nd HD@شu8v{7 ;[rC%'1޲m @Gpe]Rw9iE9khoO_oP\lUu{oQn"Npp\)~Ĵ(+Q!eR> r:YmsgѿzqMZ~e|א ٷi={S);Z|Vı7kg {ILE6vʗBf9{,q",,\(ʢLJSyI?Kѹ>NF X _!.uE9k~n5 <1۵{o{`Wmݶ'ܿ;lmL ޒ+c)rȐ} rR&أ[;@^-$ fŢv{ Wך<=&M)ӦEX&gȤ~#dVd,<660:1a=g]'sϐ'ccJyr[MZ=Cߚk K5QءMcc+ce쒧eNEHӈA3P#uw=뽟uSr<=ᣵ{*+?AK) |k~Nz^*M燽T\zQjya}r/ܝP~`LH׆M7/Gq᪅E;)+|ykZdWVb(G-.O>NM ] ,' 'Cm1}a\F8U2=r #{-ۆcsqw.5~{lL*0,f ņd<ܱ9A>}, 9)V,+;g̘=g0/dzbF4ӧO .C& f,Yy,c k.2Y^!5?6%2gfal)qWY#ۘDB28F}gt6Vȝ^Y浇?[=7xU^'>[9=/űWs0D=_/??u];!S}2ġгmS~|lԻ8H/uSR3q\\y8EvˏER_~^0J!@ 6o7romSՓMe?O;o(~UWW^[ь/C>pA j5^B&)TP=]L`g)Ϛ<_KMMMMMM@!d= -1d>;!}OF2we@ZKl}(;Gb]eˮؿ{Oع7ز?vl?^6.P[3f$k̭]+8yݦ2q^leU ftP'q^i1̙ IFճs،vXx8,;VHSGiFl$ yb6kgn1"flDh)/c#lxӤbT7M6un81XtF%gLudXnt,ϟu/+᣷6棖GihA/t?"[8$nn"K[oUKu6Gz`V]4ޱz%qS̲e"Ryz**뒫Ί|IǏշv5*cׄI䏬ʕG|dI(ֽP[T9bPlvdoZ۷l 737m-D48)Cru WNr(^+9}ad=\e|5M)Qtxy /wz+%c\0@~=e1⥂&N%;r$DG2HLh;_wd_پE>|88sRcd?WMZn{ܙJ2_|+d)j836غ)XB]5//e᎗#pY(#ܜR6!,y2rt=ZRV*9oMMMMMM&xqCombAb+O잗 oԌj[2\?$f{sәov=q=~pl w ha\'{cѸ (æ :r!ˆ⌜cvf8B `.6yI΄5Xe4Yw.ylZ*$R"pd_\Eda69ʈܟc x!EpiOTos9dUU~9޳?z/vRGV׋%u=uSڗz>՛y_B Q^Odq*)I狑__ y_$ޗMFfILFw8|PDŽ5 =XVڿ@D/?ڤr7|86efrq%lt6j/DsWe_ ~-> /iZ'#jM듋C:$HuȗgDf$R;HoWei pvZs켡jFٖ' ?gy\s⢋ωK9bR1nz˲Y 2L$>b6_yRQ7 4 4 4 4 4 <>/,2l/cMr̰ph_Օ!hfehXfȱ@FrI6|;䜳\F{Iȗ[0>ʶbz.?89f͟8>8`]ntqe0ұ,lɜX`FlF̘5Kό9lVOk6-fmJΏg6*+?Wr1AG%,̽+$)|JsλUxÖLK1V9`je'_/CHj~0.,eˢr>H_ʖ.s+óoX~c:}4/[w=kw;> Asͳ_S:2u-(U{<o8x9Qlb^zY\1}gé"/? !>#;괫 f9 oǩ~ ^[]\|)}9K1r- 3VVOoS%x$Ҿ$Mr?&{G`>D+ ֎ ~sSo,J#+oB;o2'Iʜ w˳[:ݑ}>VY{$m!z\ۂSMs?13RqՈyvєI$-g_uf\xeqEE,FGSMJ pF֓ċkJiY]\gΏ5ʂuRqn/IT^kMMMMMMO <CG7dM720BECǼ 77rQgC\q@r<mk=#Ҹ;6<+vcm$Vo[c4 $i(yh76ܻ#]T!ysVFMΕX3lg֬i1-9=ꍃy>% iӦ;ғ6}J,Z^Qe41-Eײiq/0 D9 Kd\x0LK?LL̽'J&L9  CG9!rڎJ]K[GRn>b엱yyIw[k[\r6]U?-Ω+r~-q!`FD_>[s o$@(<$bUb 0@B-;NNi;}ksZNUosj"Ԇ`. 9jbZY*Au R4>'Y;.NNIt+C"kZO*Qf6IlȲ[ P5(Y\,fXbµ)*k%)*6-uH*-0,]MBT^M~D _]ko2SUʹ0 }k1 ꛸:,0-Ul\0iנ̎7UbeY(gbtHolm@eK61mϡc„cdYZ8~|[uXU䝣/!BI3p0(jȗK%EA#>JIyTa&MFG5NF2.fs"lP!v\R7[L !J0*B+i7EINfĝ<'E $rبi/ӨnP*c47N85CZZQeː ʁtVM+С PnTMIW E>"]4LNwY(xq1(JVH(afL:gd!򌝄'5e 6&JL7ER>:'n7R3.Q>Ȟ2}FQg\KeadgeUdUhaI>(W[[e4E[,*P'3 2*RZiQ fskubqGpG BAFَ[&"0%ȁ 30J[r(1*CBVoSWȑ̚{e̚Dfef%  v$reHUdU-a2*{ 1"4#=F&.g!+tj)pb&6\r7e(IQR +L26?*MLߌ9;g>eL&q´nBvIAHl"&RJ'D!.`,c9YzLDɕ!-\0L?@-l%\_;U7KRA,mr U/D('N4_d/e.&a"IHP͝ N¡rJO%|$SLGK! dC/mՒD.rbE Q?kISa6Y>.f ixm͢e -Y2X5ZEC|-2$oL aE?H(t9%~3[p~ɬZQXlQZ6Um ěuwc֦*1GVosm,~Ve|zE,Jx999.0uYHJKfJƳ(j"7 y,gAq&/|y(RKᐋ[d-(:)m'J3a.)UR:lcw8q-Af~yws)?5Gݑ`|p-#vQ|.4F$|)ׄτ#;P߳,-gȽ^ӦM [R*tji(rK~#B0i:R@0ElrqP.R N+3{fEqܚ2CfW ~R6~_-þ:]JS˗XVheM;mU$FJd$#\5S;_EP2VV>ȲUzG6"fmsB2k(mĄ e [ &)WwHwS+yY:>L2EDG8^ʠŋeU * e8X:]& A2"On&kN $h*! BDo;F OV" ;Ȓ"۴! [c|Y ӉnђczK {QSZ(QNP*6R:8QS ~e4QCP il4,E׮ /W%'es0k,Q–믿^9F]mcZ9 KQمkEK׭lJ`Ohiu9٥PiB*_mzAfM_trl]reqf̘!FVlk lٖ0{pwh;yd9ji5F@EX`i1Ј2fJgΜ) W_}۬.b[o YlS>xeIS&˦;iB\2^bPBAqyWć %WohyZG[~{o1-SwfUZGRyۄ#P|B&*u0B1Ul "MDdv4J* [ޑf-(GGzV$]0-v/y I݅Z#T>h`p[*?LQE~p) mvN_ʝOc?okxfwj2k7gFV~-!ENZK D}Uvw z1IhvSJКieמ6kRE,:%A*1R@3򳂘UV5= F7x2ѬsSbYlj-U jE,n'ukNivϊbg%1|SY]w_ KFᝏEgŭi:UNWvL'vGWgO0t ji؝"3\n)Š8~%n+S5RŴ-q\d|+y.L8T?v[&ġp}"#$ =>Ug9".E&q8UGMt)TZ'Tfgt[rq[D]N.B86ز%XĔ}xp2nC\?Z.Jv8̔ u#  Sgjz!oFKO<?Gcizj\Jeg |idgdl7*``Ci93aaرP! F\1JLjK/pt7pRScfƞzpwQgN8_Gt4h .6@!`䌙*+F\ U;uЄvfQP0+B |~9֖VN?` 8=B_ne  . ~{x_ !ϙ 7{\Q- ^|0}L!#o㏁%nGo/eyN;343T;ff a;Lg>SU@>|i^xb%!#s0qİg< E1V a,+f&P&& 721sԿl1z෺E W!y`l5g7L5yK#9nooi3j~yg}6l:?0?>qǟia|4Na#PUl 6eߏ2bɳgeYe˖d!K1x?Wƴo#-73D2_Ar&UW]>,%K12,+1ί CjY#CKӈGAaO ƗQ7#PGQ ]fx=rSO=5,1VRu ˝Qw ӈ~s"`Bq]b6[eV 6>e?xc}# !N6Bc,e3<f Wo7OglSShw5~Q6lؠ ǦU >AЍ#:^&#㜚vgkp}6ë 0h:ö<"w#AF},OgscCݎ#P:83=>#~+2+C9DGՈ jGyg׬YLڟ*`Xh\Lڈ\Er=1+{MuerjˇYy睳% &c`Ny4GO08Q aXo%A=#;'x={ "[c_VECc|_^{5m=+b? 5ĺ  |&KEpc%9grT5';wvwpWP8 IgqFxO4{(qg̘ޒ~!ϖ r)a(i9Bx^DLfK΢E KN3=묳4oMؓꫯ3<'c֫8*~s<3Q_|"407Sc!ϻ<:w4Y:Ro1}ݪHd޼ymM0^$a|OM%9~c(dM# ?jY֐Xċgm%옅Y#E#y,e 1h)6zGDY> q>VTTi_J>>%J' d 1H 釙c:ʗ7GZ<E |Qr(j (˾ OcwÀ &p>주k|V*# (?;@̷x5'|~~5/obA.Rq#T-쓝b>Y_Tm)R^4&3<ݻqE-M\Ń+p>ߟs!_&|׹6[ų~Θ#P 񧕁gO8Ff sd?M<@,)pV4Z89qڏ״y6obj_CϱR]pGpGp@-AyGpGpG.u18#8#8@py2GpGpGp+`E;#8#8#C\!ppGpGp" Xw#8#8#3,_j<IENDB`bayesplot/man/figures/stanlogo.png0000644000176200001440000003745414057717550017057 0ustar liggesusersPNG  IHDRwx+sBIT|d pHYs&:4tEXtSoftwarewww.inkscape.org< IDATxw|ՙsf$w+$` ؘbQCB ے'7B6R6uq6e7M ل$ ؒm Л$W43+WY{nyޯ/lIw >̙31 B2J #7¡# #a@H P U] ]tuW~V-nUt+ˊ@l sy#/f TILxC&f~I&`= PX]&b.{gʘɋE 邞0t hrh=OuO\Κ;gnnՓ zt2L¾xYIqAsb?l_3bw끳1s+WAŮmZ􇕻OA_LӀsxH`9pO_Can5 j.͠gڪ' UX;i\}2Ə A|g2xEnE٬Z;),V%sNLbALpCfX3j8w5O+~WϪg}1~X%L]PSyL1|/cʽ atC=؟{9ROLl;-!/aKH> `<` 4u-7%ʽNiܻ ;)x+֑|1c^"Qs.ȇ} hLOSq#cʽ-p+5o P;)7Ŵ0o܋|F dS |1J7(`-Nczʽ,a؈#~ܔgw3VE`ܗyBwS o0{V,sQ?|}1K"{/Y.+q5Jy9NZx "j9UX\oӶwa^2[xmoG!F@ǘ,٤׆2O2X{Lã)A¿6ҲwrdgK?%F#c]JF>;H9rϓJ?#ti;/evyʁ{4Qs%AFb_ .YB*2wc K ^;Kri*oC}1@J;-ߙ 0=Q=S8NRJܳZRGӠ_.[|s~5wS JBja킾 ˘ʎ7՞6rfjߣOASdb1E 8y)PF҄we߁ʑ{-aї1hnY@ʽG1a8wc Jл,Exq@f_VsaLy%p",CþYTFnwc r =U[(H_,N?+LpleK鲑;ɕt\/;}g1&V.NpTi/}2W徘 z+YɒdFɒzd˽ ^ r,C<{hyt$CʶR}&{)R{)-`ʲQ} VĘUnw*{9+EԾW¦mDe_鑲*&j&` J5Kgw Sʦܛ -=;r\Ȕ(&j?s^KY;)M%_¿aʚMޕ )|wSvv 9A;[Y;)?%9r^#ࣾ@,]NߙLy+ro?@;)i1"ДܴLfnrdP%Xs(%5roS5sJE2^n1Ţdʽ+\O 7oV.܂9/E)*%Q~ <5}" 9~wc˽F)&̞*"ܔ.%AQd mĉ_1( $W69I1ٗ۩{AP!Ug[S2r_ȸG,003.;1&rA5 Z[hL}15O89}4 5U|'1GNK}؍)/9-SypZ.a0B"Fq xN\t뮐z˘ÑY{sO;hnLƏ Vӕ|bYモc= [܊"&p 4a/71 b؍)5xSLSXHwyܛȋ@U6kЖ&u-y4,er$S''L&o+Hl;#wV7؍g9;U0i S#'!> |*[6rof\<?dϫevA)TiB2k$~*?+/z1ٷqnT 2 =϶vO][V-e쨈j`@6gzF3 9zk|g1X)d"]8&B8ɄY=&(Vy ؍f L z2ȉ'v]qx pe9Xhg7f?ׁ͋la\v(o#y/Vy'r{)w9$`*N2S+'r4/2zYҟ+H35O`F5&sSZjXOG+i2_#b3e­L<"E<]$EO9`-x]Eh]L^o ˜@j'(LKΡSA|BKĻ1sKЇzg;}12ۀ'+:ݡ')LVuG`j=ˋɻ$-T pCNQS]T[?^}'(7&(-3K"_ie&?1G"'55'_{DVA+)\Z]U]yBJ ~ړq rES>lV|*=NHftɚ*7.zX=ZD8Vlk> Cꩂ:8;) NՇ U4p{a۽~\n68Ȕ%Nu]#1\;y͵ԥb*SaG~ȅq{&kuϋLo88d3ɂW}M\Vy߳bYc# z:l8͘Cp!ɥa]!kLOll}(UK86">8]f88"3zOMqpn˽R&IoRHe5h!JR&W=[3߹ɂeF6m;t;rBA$sh 9pTzZÖωHW 6hJKcC}ae%V55ss 3dގw)u̦.%YOd?P-vxΑmph66*7H߬ Z|qȟ&jM4y"i;wBڣ8`&pv1HN͚nF\2Jpe|TQ{<{X87A'eLq.Kn޴ V!e9(3Ag>ksw$g*6Le2|#m#W.5g8$ru9c~;D?WթzUvB$:̍?}ș 5Cs@,!zKqtu;ZE.>v#azblbɳCh=<#?QB + \1>}`;U]oorF&VˠԞ -L˸JTo9vO >ҮɻSW\8G!` \'.慃س}ޠQc;Bڈ.$S#!=g&`TOjuW>fX|a_uLz7:.ΊǎQ#ԖBm)}LxE< zZ>s~c撷"8o8* 83d1Y9z6}0SP"~c_N.ʘqQ`+yc"!5sorדRږ_]~q+UAѱcZ2Jޘ~C'*3 88jB{*zx`.ΑmR2HLX'u{~ V<+EGhn%(/c␩Q@13ݞLF>zn7=η3zsnv\]ld+$!p|r|ƌ) `o7E\½ 4(dBߚ81.wE&o)cB-scae~*m[Dy0ˆcc 6ecʀ1j2Vd]wRuOJݛ\2WrK'Ȉq(({p)aw 2&ϡe{j{ڵo5 q k*:88ҾMQdr,%Ikw?t^n+a vQ ##jqH͛1]a(5M+ { >w s8`R؍v;Miџ*;9m]<FK<-ܘ;YȸG'dҗ]bJcj0(և<~d^ҒyKAĈD8&maSƅ [=/Vw]Edt8P+wpVg :*Xś%_R, eN r/E\Qh?5%V0Q|RÉMQゎ .`x,XVfˎ"i)PF694/\|YivT8W]sA !S P Δ=ӵ<qVgtӣЖ^[nHžw sU*483p^N{8HIKvb'^q / !τ123  A6;W|1sd831]Ɍ(dXsx;*:Xk-EB`&;*T8. &R67ފNBlRxw]Bf)qzgA Agĺx$"R P`j”b^ bۍ-f?/u}_#e{9%dsed 'D!6Ɓ-4X'>;͡WrJ=mSGM.aetM" wWtp~Gm%MQ, Ч|1:y]5U8!VE'ɲ jS3f(mABKK솗25@:*f_TbD`<@Eiq Ͷ /;hnQLAT8Mԧ+9% 9v,§"kX ]7)V\QACΐV%o(:mGҢ E 6r76H)qȔ^vѝ0IDAT .Rgv|G1r+Y0~RLҢuYԊb&{jTbRccbeKX^%0fdaqJne2WgD&Hhu1ĊH)ʃN.IWlrU>ØBLNx9Hhski+1Q cN陂tM,Ua^S(뜲&iu VE!+` zZ=K!Qg2JJu,]ɬt%ӣБV޼:{K$gO7Q 0<ɒK,c=|$OБb\bw5zHUgy]3!P;jbv&$]2g9.x޿٧yr7%Axqe%%촢Ϫ];dL 0:qNu+Niu-Ab ^kSiyv4N0"IqJ]f+M _ ҜzD^3S v42nEct>Bb}P˘0L9J.(d-{wn*\PצnBNBwc|쒁*^nh6Ӣ.aUb6gJQc)/Joc{ bd#&2,,FnØči¿Jճvd2x^GFgeLQ;岢 O.TOeŖ?xL61#j‚8Si Zu..7$2T;v8 A61+E湱oHѐ(Ű[q3Dݦ;*~ R=htܝ"ywci 'D'D] fK(7!$M+_QJ.B7D9cLu.fe&(i)xaz-)TN8g[zWS`|03EcΐE2ms4$Ċ!]lݘz%J.8,إ'U~^y>;C.9Id9]*U\@J=Az[N"`D9C}>ہrsHU 'DJ蘒&?͵ w}KNyc{cU>{97d71$1cgBbuM Wo|mlcYy `rE c鋁*{.cyCƷw}c7L~h7ЃuM> z\"cay*;wHJwmof@%h M_h]7ݘ4> :*CdItŞ+P[ \ϒhNA_AM85Q&jZKk]a+g olߴP_LjGi0onɴ 4e-1&%uTpNg\x Ck+vE?O;LCoN[~2q800"sT"EaCǺ!ȦdAOG從Q< `S)*!prrtH*]RqM?=@9џ]\Ý@0!*Q1:ݛb,2 Y =|u/'&E>Nk]#-}Cw;w!Yzp=MAy8O1S4'Oy8)L߭urG]flnLaFZ>| =-v` 1&T`A@2bM[0Y 7/CAz:cLN$@Sۥ=6S}"bh7/c1~%W+ <+I "z~cX k1/z^ neq+3^(6Tŋ޼3_cCPޓbpDƊ`}|zy0ч17t~-ٖC E_^rn}}1[OhW='3ۚyBo19w_ 4rPGZ=?>Rws֭Դ>z_ OY+D3V8t`}}u:kzc \=`bm_YQ{AgJ_D2vTDq)#i&%[RWǸ )Y ;#YM X<Ê|2"_OB*v +B"ءs{"G3ۂڲHc*l<;̡dls=AۋYK{cJD$$pˌ@Յ\ U؞C[/#0_cSYp pͪuMԾ'KlHS6*̇y_¦T Ɓ2rv4oBЛҶ<|3ɍ}g1;V5S}"1)iл/f߁jW`,WO뙽yRw6rHo ,1$ p.Re߁Vj @;9l;dyǰ.ެ7r@5QȧJy!@yEy\cr(^'pk#k}ʆLJrC?pnVG%dqLYwlzԷZqs@coLYwl[L }حԋm Łs2r̕_\Ø hSi!Sx;Dq_s:mL!ɃaZ)yw ڜ.߁r)˄K}?h=P;ɪ6\ >nstqk^Ϩ?^ÝO!$ﳟ$R@Yyrk?>?Քd K}?S4_ne[@;-FZs~g.4QspIg*;,ͮq@0p* odA@8SΖB>NpwֳY߁e)+#җ]^A६DDNfjyN㝂> !s=XHC\;CFZ)_kgvzmGeB5^S.s@13tu;9M959.p @ܗd` \͡\\Oy>gپ3%)NEt$ֳv@LxE%3L(H{}޼]P[@>od2S-LqoF \Z:@-M):?.7Qn|Vpp#>3=AV*:T%(:[tY@l_g2-GĖy!w[PM30Uq 0))&d[@Q |+w2g"] ^;!H) \( b7י,R}gDR;sdLѻqnK4!""A.dJZ;i":R80w".Kp*S9 Id&91QXƔ0J|,AR@O(,sݻH[.oo#zp>0^2@}o; y{H];Or)d΂|AO@މr@[<~20SLY v(ٴ\;Au[9@c:oȧhSD/{.p"h=ɩn8Aꀩsiw(=яU) /)Kۮ|?0iBBtVW}yNeܱBw{6v5f AuJR'TcKam+QlȻOf98vM|g+~ZNƟ )rt{j1EqWLӺcKymS^Νͪud{7v/?k9rcJIK@xlV$ܻ۬dZq)r}VN{e]pϡe$PN}m+Ӏscf% Xw\)r_DI7KɌk}g2xd@Rc_Qs N#B|lZ7kw|hdwŸ|g1xs_;Y[e2-R&WFo.W^_9ޭvoP63ƔE!o+]av&Y-3crGJG[VʲwkKW)ƔLė/E^!诀c]};Oe_ >! )vil~A|rLxyQY;H!(u=QOۚv4b-Czk2imT+czJ{1\B+9&jjLڮiY;H!rBj:t0wc>^ppZPٴL7.ieY|Y1{4gXwF=DA Ř2+GiyL7{g+fwcʉB$idrYMB=kS.Jd+ޱ{d6 `<Ɣ]|Ra1G'}ifbLy( yl<;Hi~Cˊ!wcJXܳd5 ;1E5z FYHCh?i'[gs 3Z4Y)pwXrR1ǘ +|g.ľÔ"+~Y) H>lLs=O~ A?_Oo})VyC;IY=jLإ*:b\X{̸Z} ]؟)iꕾ+R}f(:Y.}TOF=S&)7&M['>L/^YTB>%9aK$?gNa{Y!~8wc' I;1[|1r/PVm}s-cd^S;9gv+m89{[1[BywO<۫^~y4vq>>̮reoh3q{6s +2邼O@<&o^+zs#m 4z >]]r們w@TUsKo D7~1ʝ{jv8wu nZִˡjWtSw.$qoX

Vf>?+}piܱ++G0YS 4^~әnD r{gC8F05M`U~k'yZ&>00<)Ky#bڴkKup\!S9 Hq;<,VfV14wC8y +Vp{.fzUU ޠ*X|X5j9W/ׯyAEy qK鱽oA )9 3"2p_}x}qOq$sCuO+o}LJNDÖ+w'F CdFg98ɶ)fAy6K|Yk++G 7*=`GPy7/z\lerj5*0MHLf|gˣx^yOͦe 9pQEeˍ#N ԝae4`F,\|Y[jd (0O1.`+dUׯW%z<{5wzΗs6lS]os$7^%LI4!@&&1F(:BHō t3f 3c}f]yJX9Q4Gn@~NERCI;D8'WݴsByK)j0~D%P! d޹EQpm,Fi*RڂX U`$j2G1l?Πɡ"^@p_zNƙa$FF:u5ȏ2IENDB`bayesplot/man/figures/bayesplot1.png0000644000176200001440000022411514057717550017304 0ustar liggesusersPNG  IHDR` iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATxU,M"* tAE{c/n41c&ްa{(߼=slO|;wo3snSX/T@" AD@D@D@D@D@XV5" " " " " " g@D@D@D@D@D@XV5" " " " " " g@D@D@D@D@D@X&ZQ|UڱUҎI,6Nz߬?=~hd\Uǎ 3Xڿ<ڙm[Wu;TT|rEQSt EhΝ;7Y|KU[p_[y-/n\K:+&Ty_Q>%(" " " B1&}=֠AkҤIʅȚ5kVP߼ysk۶JR#!bPaY ӫj^z 1mI7j5g?zڷoo#G4ҏ?0m4mݬUVm [Y^v=#N;Y׮]S;h'm裏R]w][D;}]c &$qe+eZXg"gٍ7hS. 6{=kӦmbdĉֽ{,)du,;Ξ/Vadʖ{ 7GmCZf͖0YEFD/BK.^u `og?KccƌY>dט\D?$VXa;ӳ/_n]vYze.MwmGuu)睿 ~PX8͚KЖ-[[omݺu'x^yyDqJoygtP bQFUXhs\.K̰alv.˲ l=3Ia$D5\@_&QQ(dO<, #]Xమ<8Xb w} !k[f.4ys4;@ի >ܶb7=, " " " " #lf镫Ƥb˯%%%i XvҒ5:+>VUVYI* X.XZה uqzʈ<8,-Z[̎ɇz"_I~EӴid!M>iƨ4l9#,$|qZk+g֭NJi!FT)k"i7OdAy闿i)+GpurkSΝ*ODpԒʎ4\FysX-^8h [F'[^LR9\gB^E\6}#1(" " " Չ~h֥C$,8O>ǒՋ#ADI!Ƙ"bbX`"Y*Jy^z%/~<:ziuOpK4szg} u"w\sT)ks.r>Ow)疚>saSh)S ܟO}.7 {1C'橌b"_:E_΅Z =I\(<y .mV鞋ɜB]tQJ `1hss99){nL\|^1t1r-^T+Ci~u=_x0E[]\Iʔ8wظ;܆nGғʾLl2GL#hUKBآـ XeM9矟qx?Iޭ@9 }s6(z3Va?1"=:yx3܃yV@ĝ{1YvϞ[l #??*PQGM(YqT 3]QɓS>?Xwj'AvVq!㾎" " " "Ph5 'Zz, ;#;u. o[ZEZ ˰|r]ا;dvYgebDCZG2^GMd.c"_7ųkJ˺薘d4C1 -'i#"G`?/LtM,AI;ur6 25K~]S([:9uvʩevr/,#|2ΕW^ZRɽXJiRd@XȻX<o0(-c*܎^c (+>%gY#K)#x.>3\gq͒xnXI crCN`#g睰QRKl5o 06ֶtjg,;v5u@@{cbޫ*MX_Kl%v=*&L\2Qvo?[c5҄Kv)M9܀W4Ѥ\S& b}@5e2qgf_UvȤ=C1A`L!}p}Mb}JO>d>/ĻKuo+EpuS.M=ᝑ2>y:F{󬌐fkI\Jm]g8ؑ]4ۖNm OE`WV,H=UB#}d/ {`|G( Pg q_M1e#Rك޵V]5ec<`wn]vI YLY$!؄ >?{&}hKNcǎE!}@5  'SpQd_eLcBi/p@ =*|Rr3OLh Q65_ى/K0{aQdG/& uq/1;1GX|9 E#-׈޽{'G| Q=Wַld^␂1]}͗ot{EQb3GRs=<]+7> "OCҽW%% qrޱ2!]PZ!$9fi-a+{Eg/YEL傎,$`*na[P mwcͳVUg8(c;҅{ouƋϣH"%" " " Մ &c—&eKO\xǾdqa9B< ;H{lx7{K{{b!&_ee11E„HaY8\4=֭l.#WNNSD%QgE7[e Xv^rM`駝6Ј2#׋Zgclְc1xnkcEl=ٶe;xu@('dg Hl "اD۱vu~(8ka#wtoq"qtϋ(8i~~qiv]^ۢS!MX.-@b;dlX&~Ʃ<10dKasj>1(+]fad%a؋;ְ TP7"%" " " ˙X% &L@֘ؖWLLZN !^bP }yKf~%(Ŏ{xg^PL: 6H,=&&Gb2Nb({'R8e1+:_Txn$+s/D֡{}#yHc(eywN0~,'2b9%}E:GzA8р'1w%u2+ʌ|c`8š##H0~1O(Iq!P.,=Sxd)`YXRr/HNB p3&^="@[ ϑ" ^@1G􅠦>U=PF|/yN^*yLE6,ǂ 1iS+"%" " " ՅOR@'Os>N/@C/%>yN"}ubaD]r%E/+"(KKn۔]ٽ#Yݺ`jRgqFJ^r>/˹xKit/=z|ybJC;]|rs7)=/)w77P瞛}᥾Nt/ㄜϹ5.T//nE~POӋ~}^h[:)6V/mKe}'^ sI2RqKˣl:#dz!tp=sҽO>9Rz^ ^NMpu97WrO?P G# a_ҹCBnDSҼؽe@3f.rرcs.hSy|W7Yzqvѣs1؅e-Q/eўx\Rl }[/p.T uKݹK-9Eև~x03Q3E}c3"l3G^^M/po:xy7< w.%" " " Մ@= _q,*G58_7k1yཌྷ=YX+5'Xb!XQTa`"?mpNlXY|,={L/ oq>iOY1cƤeܧ,,| ,X{\x,[(,9 {ZO-2 :*S9 Yl GW^cl#ƋyAq_{~Xmr//ۯ{x%K(Ltge^a n{$e}`)#ٿDpA>O?Nƚ㏧vvzQ>}"ųC m,R+LbKZꡝ,%k2h'*]Ӗne),Vh#'|)j[nVpOLR#}KS嵉(+-CE}(~ak;#8Z^[ˋrR^^6M[Ԁ6TԎ(g|Qm2K0Mq^ўHep2GFhO!d\D@D@D@ E&x䰢4PZ,(qLW~1t4t #Dc!ODTX\eD\+.2҄~q|B<3q2efD|yiK9!}<&-?g"킞HyW-.S" " " "P]HUP;D@D@D@D@D@j=&ZMuPD@D@D@D@D@? ?j@! VGZX$" " " " " uXhuSD@D@D@D@D`[c`U4мӈV&,JʔWiksyqUіYG)x&,,"uWޢmOD_"}M:]֤" " " ՗VcD/^ HǤ(7BeF>>Bq]|]:ʎ~e7>$yOIw i</+eQW啮?˫]WD@D@D7}].=ݬYI&16m)s:[LR\W^,9~f̘Uւ0BPt;"O(y~B:V#2jQ>FKJΖS]h'oZnm y5\c^xCPfB!a > W^yŦNjw'aL7[Sv[z>4h`o9҆ x-l}gFY׮] ,Ϟy[al 7nݺg uw؛oipG_0olС?wׅ,|qeu>CXU6?cd))tDD@D@D@-&e'z8}1I^qStjW_S~qNݴ/ۇ{!.[.q![C RB^\>|1 ~_%UK̶% RHl=z*YG23rg{,YdJ̦O 6LXWwa{Gm)$bkذavM7׿.U q|(ʎׂU3O x =͚5+s1111S΢4=g[߾}ꫯ:YQuZD@D@D@*C@P4L²!&jq1xrD8WL@_sQG%k1$OXAv='N"=}2(2HW^&ڄH384iҤ WVG|(#ιN{2`FHLgQG6IY5qui`=ֲE4fMNcǎN8!- [wuoL_LbxӲ4Qg֒Pt&,k{wm.]J_Թsp|` HKh{Ę>a2Ge XbO\X;i#mDzꫯJOW;Wʩ {g׉!RL,,[m mEİ C:tXǠwgW<Æ]ӠA=qUՎqu L΃ŲwCY}?s?5 g{ V ~8?glI +/i%,ړ"3_i)c?K#5wƈ~gĉ[o=Ǝk_1'ePﳾTU_r%ed/K<'~X}y&ʁ NQQ Yo4~a} >W^Ǎs-C" " " "PYUno$!S&kZնmT^&L?6f̘4y%H&W&xL_I6I&I' /#P'N0FrF}0ezᇧE«*9b\>ee2as=$"'lB/F p/8adW^N}f'|KBxt61"-!hu.[k.$pa!H$OO&FdwYgr'%9W/46`N0D>#7 ˓x饗,fdOSZFA4]z¨x뢮z76΄G@ %СCt9q*xg9q/2hoqz>GEb//8d/)wK+hlx:wH (c.Vu1N@ɐr7Ɔvr3пb*~8SRG]hD,p),*R/9 ,疑ATG')-Z9 r.| \8P2}S[V >yLq>NqfąO SOsnQI')-^)n]vE~29|V') !')[$R_ʹ/H[(roR}l}:묓k y瞔c]GydskP.GYo'ks.r_M&:]>a|\r`Ǘ;m)-v'/2Ź(ȹu+B 9Ź̹p,xgYeNvq{RZҟ|ɑ$xwQhM4-.Lmz5,@a}a֩, `Y.r*KP6:\h,[XK],3$Vt?[?޹c #@O1#q \0\?Xb)>aE%{XF+T,L ҃5fS_z,zeCxjzG,?ewNCU1XaM9EZ>eL/X.&sq$.?EQGquc%&[L,cbX1IQ^#Kث^0&LC v&ڗuHK}Z%BࠁShLj#DoKg"0*ΉcyzCp$>Ɩ&e\ vGYb-iic):'֭W/,ѭoiy I'S&Xxz ,1|^lqˏd'=Â6۬)PfGS(9!NjjLJI>iml.:diBP"'/'m2l V;!GC05J{yNE3E<`ڭ;1_1f]F Kk~z2C-F,U0 g=fYdc Ct}- Y>psV6Jf(Ok}a qn =!n,)a+o͏!6Hƈ}zdթ,2 J"\౔J ]N(#bTbB+LhnIh6O29BmɦZ>&∃bD*IK`rP6` цCa@0`y۷8'хaL{s-B5b}[<4M}H=!zrN[YjxIzJ\e,~Ѧڃ%XrλXNz[ھ-R!:B) .,k$Q'],S qc{<_xD>_XIgs9}iXK CLb[%0v((su|l)+'BcM5IClSE! VIZ"/3( ;nq+99~ _SmLcJ}y8w)e_^!DpJTEt|g5,mLZ}C,s;!V|"8E[H܋'ׄ HߤIHVCt%}y,mE!DL{- 9ˆt1W'`)IsUus`E}fu'ڇxY+ƞWNa* ɒ;!1=_y\G߰^#?c$}\.~;|qy OvqĂ ʒXh16yba4); ="gs~E׷}jhC\(" " " B@lhdRFN] V#ZI8`2"%&ĸfw}%L$ "cDA:&<ŲAZ=~Ӯ#m#0g!!*L/8 TƸ'tQR7o[sv/ETWD<= P +cL?#qqA>DK"ɏ00". aK%DewώqXNa!,h[8wM4w2.c,C`mBTbq g[څu +$"w}ps\&S_Xx&YRMB,KW? ;y"pd?Fe;x PrW'01e/|#Zsc/LL,"1c2,&LtݍI3Lc3ǪE4+@{'X`|`2aRɗEb:ʧ#Ԉep9a„l+}'{:vb 2=#9٠Oݔȡ=,JY=ʢ],Mij !cO\plAp7A9WHimD2O~L~DqcB;{U"(X'؅E( Yzȳ%Mwk!-s(GnvO-sU#"w!X~gr5F#жltgƎriRE=q=&'0=6+ xpo<')pCOPE^>#=l\gC#^d޳i8f&_Sa=W2u." " " ! VJK)MvrHiryy,_^KWф5[${L W^ tܣ C&k@ys~q?"}yYYq}Q[fZP[(<7Ţ1 !j"O{󉾗WOWq)WQ"m :9kB6.Edee=%-!W\~ʔK*bE@%HURyI'yIӾr&6[NL@ӖG9?[fqʌ6Iq(/ۦ'6ɶsa%^p:Wo~9KzVپȅ|<͖[mQґq[ų\܎^G_,%ړmkE8Fyq1ҖwQNɑƅzD@D@D@D`QH- -% P%(PYE@D@D@D@D@D@' V>ŊR' ԑ@(@y[FLD@p\^d=QE@D@D<rQLLR h W^I/ͺ^@V:A`jR@AD@D@D`$*`ո[=쭷Jךh$ 2;l3gL%u-" "  # 0B~4={v%R+n<?H͙3QD@D@D|`s/aÆ麤dx]@]'ϷW3QE@D@D`A$D^,9ҚJR:G@6ֹ!WE@D@SV"q qR*Xb`KP@HUR[b*@D@D@D@D@D@*G@rJD@D@D@D@D@#T" "PVw[X$*N&" @r(QVE@9$ʁ(E#P([ZD@D@ 1@5 V AM$8" " " " " ՀX55AD@D@D@D@Dn^T``A@nz)" " " " "P HUAPD@DЋk" " UE@H"Z<R% Tq0XltGD@DLD@D"Tni "2Tr V@IDAT:K@:." IbS60 0=" " KL6%.R@$ V+U% XVm" " 5X;\D@ YP!" " ՜X5 5OD@D@D@D@D=cr#% *a$j؀" " " " " 5X;\D@D@D@D@Da技& {T@M& VGOm@^ea T@$ V#MEs{}k}7ݾ93ճ՚4Z`Woaۯjmڮfjgtlkm۴5Z , WEmE@Dc!PWX^e˾{{7G{~YgZZ~-*ͬj-qn{^neOv5>۰]lzݭwζN5e GSAD@D}cTd/3$9V fvMkzckocVYZ5j֯CaWl͜9Ӿ;oO>Wxߞ{=;lӶqvGa{[kYXFYsL6&a蹪C@$q`!+jL 􃴲y[Dnދ@#4嬤ą:7o}oѶX[^ֹKG[uV<9Õ $)pѬJֺi؜9st}/]|w_nAg6Ƕd Ǻ!Y+ĘK1RUb,-e"5Sy{*/*YD@DE"dy_z 2I|y}O57k-S_o]Fg e;Mlw1k,˕V UW]V_}Uݷt3ϾbW[N4 ; . ikޱVLB.G2 aze/b(3{:i?HHfȜ5iȚ4pG+$H" "P gr~M;褫瞳mmaQ1Z8Ven=`Il4i:whgAns1S/ٵ>cS.s+a56=j;UVne{@-Gَ| ?ڧƾk/>?}K,k{o탯4wFB+XͬKU װunض[c5_J|]I {|\姢/%җµCKc[l7~tS?UH/uY۶m} ib"eY;^-7zv.tCo>Ntfi!Lf`kРa>MC~oۣh7}-vk>=v[Vr ~i/}~j//n{>fѴoeki5zAԧds}=^y+Op^2?mm{zZu;Zv'n]sREt%% VA (ZD@2qՕ-o{ݏOq`ɶ&XwCiiiO;pR/CA!,S|{%r f_#ƚZ!m:[ߞCɭK-[6OyB㆙t-Z?8fL,|}K}h?9if֣m:_s$R۶YŚR״ E/s}r3݂8mu3InU[=mؾ6[}Ֆpv;BND@D`%*h aä+,zMA;G۞N^ nEblO<.z_JC 9֠|W_~m[v%Q.v^ڷY:/U@7"0h,{_3?ja o-ۭڹUYf5=]eSGF/!Іކo>vOgl̖m͇߇׭ZeePK&K>Ԭ " 5X'VE@@u`<~k턣Vh?vkhzU҄ciR_&0cYb B{ o죏>|=ObO%3%)b V%غF+[0h{+gG,,x~t1yQ(JҗTfEr[}eo\]zcnys[u찝G٤GZ^u/ݬNUIJ&" `HCW" "P$‹_xԻ'c.x܆Mi{19Yȇkx:cy7 A \aݛsoJ KZ6#Yu]_J]!؟{ܭY+4ib% Xcj5jȒy{XK#՟vTE"= }|;OK~y}l c\$q28&5aO;8]p~TWM7N}unm  -W^_ƥrH<__|i/$ ^u촦=؝^d7~ܵ~yxyMl@߮JyEBMP}@ 0= " " 5x׳/i;ۨ[&'3H:aGtD˥drs6qfΘiӽL_ޱ˻qٺϞSu񛍶A>nNzn!;ksa[؎[o&6r񧼪zIUE@DX1]yK{9dI'mǃ%޳~mͦ֩c{zRc! j'="]_ C1˘UF#_n{N=j=ٶbC۫sA|cD\Gyհj$`zD@D@jdϾ/r0KW#N{+ڌ3|R_%$,U—yicY>mM۵78vmCwu\ͳ-O5("| H-_]D@D``!a],9|/'^d\v b$ӻ{?R-BJZ-$]İJKp0w͞|]|v䁧ّjMl/vg##VhF,s`*X^gw+v;Э^}h{Mr*<X/MTtbLH:ZV* OnC{T;dq.FZ KNC-"SQD@j2 ;ܫ?_j֡slA w>AHiәjVQ֫=b>ƌWM7 e!s*,7\c6iq6hH{'ﶃ~}[}7nZg#/gE=L@:&" u@?LKjq;l/4ynRWøTC=b8hvufl谁OeKϴCO䬣GQ˟ݮ\aGztY$0" " A ,7߷κ;r[e@o;۰YF + ySۯan >9~Cϵ#ۖF.$!a kD@D`[ƀU@ `Y_,|ۯ>xy$~mu;ٳN}zr RZXB-bpZ٨QCo6i1OOn|(;j쾶5,{&j!*uID`9[U@~z_N) nXc55kVKN p,El{G.pIfkcmM7=cI,/"C&VPJHGEq" " DUeac`Ž92퀟oeF ^/+֣t"©=b5!ָq#[q6f0{晗=bg0niy*+75_ZZy~D@D`qH-5@e0}fx{˛kMbuspQn/-9.۝̞snb_Vٽ>f=۸CC BlGQTXe()b */e\xㄫ|]akQ?MƍLYJӒC&,,6re$$S'~$5k̶+4N^{Z6t=SvUپomP:(MP2:H@," UA <Ͼo~yefgmV^YÆ%m8UF!A Bl1֠Aݻuwm{g+_uu bcZkyJ~@9$ʁ($~awvuvuwjگ;І`/7,uyb֪l"ȋ}b%pwѩ >sω']t}&&cX֭iR$XVuJD@/S.)IG=vڹ'w~g ;.ycK@}U+0>YmР:w^whkC|N=Vcmmھmfd-5,y2D@D H E@D@*EŤ4!b+g_{Sf|birjе[g[`TK28E2(~Tgv[tbk\ vםۿ~q#㾛v` ^,\:O  QBtZ5w*>s{Ͽb w'ykѢ/m3HQQ^Q;.fs.]:YmmvweN#?M=vzv~hz/" uX]}]D@@ⅳ Ƹwѧ_Dx͝;៞Zt/2\r/'oݮk۾mH>F;'ٍS6h5qϢp\}(O@: " G ''|fcR_j^mG֓X]y,R~+W%,=xM6 6d;w3|myvA[leEW " XmICD@*I «ؕ'y.j;lCmIOּk,x6$LADbY"BiӦd/;Wؙ799SljSvy~vOw !Pe " 5X:5\D@*OOL؃Bߴ˯Nˍل7z9.Θ F:,>g-[4I7ֵn.=vȿ`n?Yma(gWNG@lW" " x]l _yˮna{ܗ6bˑ6хW=mU[%LK];XFo-uݵ/ְm^~3?>lq[م!L4%5X/VD@*E //^yۮ~;6xƶđׅW֫=^3fH2]ZT)J$KL Q,ϢM7[.xl;l oI6lPok؀Ubs~2J\aP"Pe$ *eO7?o<ŗ󬍜8ֶxf֠]dcJ% efq'Vی}٭ky]찿nc;n).+"P]HUP;D@D` b{S^_ϾپxqvNqcꫭloo}ŷ6'ѶMPVDPZϘsKWϞ]}6|ϰc.ݖ6y([ӅZZʘTKPX&$ V*" UC<_۔ϝb>ιX|֮ͪa>O(sl,Q$BADHiK gz&M\g}IC;]~_?kwRzW"LADz^ֈ@ \#k{Sν!kۉgh[M:uhS(7M\p=$in&Uf 5˕kvm;wNSvck1V\q"&!V͆TC " 5@񻼦(}8z钩ޛvıَ[ol]л|>({<FuuuXkTD/+ʾk=ܫvES_ٰ]lzf-eZiX5N[K T%9.֫:儑.nO.=vl6}&!VK`$# ثf4հ=^~];C.i/HXڳ+eJ_Xe̋ә@M YwAŏ2|6o#^vGEWNsO?7n_ִIMm, 0jcm$ VGU}5(¥~f7pUf`㶛h1Fo0К4Ϳh7/ZFo)XbOSɆmz\tĩv/ύ4qmh4h&7#(,[`˖JE"K,Ϟf=mg]s^V;lx{6]l' EB"P; [c0b{;oQaL\a9tS뵮5N A  v Ql(Hd;7M IHri;߽s;!f!h^S+N%(XqaA4ӯ?o{)8qkDWYVE@@M B]&n9Wp /8i_cܳ׭)!V S Hī28x}/<aIp a7Rd"L>Y}Jͣ@!tUzqb& ž6zw#X/^EcMܪEcgAc|㓅+o!YY@! Vj.NDD8WlX%Vf>7:~#tk.3 mԚիS#2TNM rM^-ѧ~߮q֕w߾h WQY[ Ѐ4Oɾ-TB$ Vp@7aņ&|ay==?eym;'6@Z ,`U@'9n{9MK]zvDn~bM7<4W_|-sv.:N:U,"d+Π` H,O&"W:a*5u.a_m>->E Dt5~ q2{csq+łX *@I'Oxl}}\}ᬓvV8\ !bIѮ@V}R5~(x3v' @v=q]H 4MgCIJ@,I/N[D` EP̙*$⬛l"?pgmsNED@b gUb?HOw낓=~-|S\ٓG#]wkM9tҾv` D@ @%syz`Zx9>\}׫D4ݹ7.yr 4KYd>B)ٶ2UmR@kؙM JfmCd'~/?>zw9vA;h%YGW`:,D@^,9p—qww_ΧӺE#WʊoSDE9L(S" "'K_m[STկSӚ'}#&WokQpghؠnVѓ*OCK vT\C '7S`s`qa텝:ڱ+Zm@V+cMCŸƓ}lX޵/N'صڵiVVX!X]&eTH ∀/Nx>^YKW3/8:u'b!ХcZzL|d5n9܄h{_O՞Q^ "\Y,b9,WL H b~/bv˚ ,^:ƧxAZn]pa>}xhl/0%gs6D@D nUs??'>b2^y{WY+3hث-=W :Bc7^tbY +"=?'<|GCa:>ԫ喽腑ǭ̋Nط≷gLs>h'6GQv&*l,ge|6k|Brئ8 G E@ X>OeoNZ|%[?g̶Ꭷ/7N)m0rtݻCf fz熒p^̴A}*2%P?cujV{tđ6ESᓯ~PǀѣKkjL4AV5='d|Eteq~ZN@,̔BD  PR9t"M{F_Xb5-[<_L<7"Ͷ% {wy>;Vh԰.S+G3_A9bц b~$E/X0>,o۪[N s]i)/~}7eR zB^нs 'Z6o:k:+Y 嶲8mZ"n<#1J *kAm-ћ?DǰҮ$o,ă_Rȗ( xPĬߡ1Nt#+meZUa5%\j5,Z?9ǯq?6b.*ХYvFjaM kת 峚&vkg[Qg#"P O>VfUppa¼ǹ_O&OA*>MNѲe#31׸Q=ԪeԮn=Vpw&_{܆9yh<$xs7юeT˛[/%ם.)Dp { z;ӆߔͶdڲz:gZj ֭]+WcŘ=w1wBW~\iK-(ױ>;擱un֤>jԨuyy++6N܏yr:+$$Tv1XS˚+ڲ#v?iђebbf̜I?OT|C]uڵ!vwK3kޱu4ɣkլaBzZ**2wwZlc?d{_4>+`u#|sf PP[zxdwh N+EM1M0"=w5 ش '`Y6mڄ6`Xc:^~=6l؈ ̒ ¢+ľL.[+WœE_&e-HU -nhӲ!Z7kujakը4,Ag=$F҆@&y.߉ժK-.ؘ l7 g̵IOxmaչU-3KYCob:5 IKK1Y%T E܊ u~RDYUlSyqF3{62RśN:eF*C珑[f>ի?ፚ֭[B4iz&Ȫ[}6Si駟F `عWsD7BwxLwd{GP+[67s?u:78@o;V~?\[q86YX>}+,oX?Zo޼y馛pg4H<cͱLKucРAB̙3?@qmِ͜Ux*UгgOt &LĉUqwPD`; y;Lơ o:?YYMRo5ӣpbkb-Ƭ+1e}}f{\(ʼnP49CtHCکhT2Zׯj&?楈f"/ fuh"[V\ )M0:-˗wgEy._ GʯI2 6[%Zs*s`yqA yr=6{|Z# Md;rMr}9(c&1Ici;qwis:&Ѕ9>[/^Qr nrT$QJVCb be%6n~/=˒p_x~>,N4Oc\r1;τy/kׯ_{֌G>n_~p9,^$j2YszASԠn 0>f-[on/\\bD3w5ٔ({hSm*kb6Ѹ~ T 5Mխ] TRe2="*ۻBͽl,OץڼܻΙm XAί//_/8ПupBK.aAP^3 wULLrUzugcH ˖eL_۹ǼNfcF9>Ck_g:k>OmmYMKY W+%-5Q\hrS[4[PMoXihi2뒉V,O5T)ɬPaMBdBO>P0y@>e/'ʰeEs[aD=xqbơ?ƋG"=f|xa dTH?]vE^ͱtRO6JcFi^fJM8Z b-civ#0֚1-q^|9>#w|17hZ@^kgCUj[sq6~+uLNAӚihR;=;7AO~OPlLJj/_Y*8KkFQ8YeݾrƦ_*0 o /t>_+6q~9myg˔>*Tt_K6kV mG|Tju|ņı[Lb|(ȕlv YgŸ}LgC:1]n> q:6_3?Dӄㅷq~~ۯ}ʐVXG] 6y')Գ@G.+m*v`~]|.YabmVklLKV1>6Fn\l_Xuq~[XZСV*X>VbKztaK"6wmoM/ȓFM<ى.:qWώ[ooUW]e/ 8qcwvcԯ_5K‡G6-˱N;_|<FѣAWN72/sc/0Ŧt`lw߹GW^=? 觵ȡ{_AyVۄTUIf|%_Ng@Ŧ+s`Z0]< ,IG~}5?.d2sߦKcVب$^6mx~@mg/((l`"~4y-{pWmڕ|?w4K,ٜց5̓g+7"b9>KY%Ey׋hY)94e]o25. \հBq*kU^]6(ٗkl0-{֯3̚@c-:0ǍnsivQ,xr93M)ZNѹsg'Oiaѯ_?wڵkk-^{7hXb?.?R!-_<nfP <=x7s8~їRAZ\T A Z7\Iپܕ@vUr/O9mK/Y˅u>s_l9au}nr1jt'W N Yy^\qwZ^yL2Æ ԩS]3BI&xt}nE/'`oVy͜9Ӛ_䑎i}GeayrqⳲ:KqE{eYE;Sppo?v:6}<,0_F͵_>b;in;w>9'6n8xa'~>Xpb×||z:pLýO.Er۳h;iWzB{X򰸜={ZDYx?G o,Dt}8۪r-:Z(b(?p|NЏ}|? ͛c̘1N=6$c*\+5kt&yl6d99=wr"{ϝ҈@%z*ъuɋmU0DɉWmț*欌7c-? cP8 8 ڑ1cMpܸq{ ۺxpˋh"b2<=09 Oˉ_Ÿ4e|#w~'Oc>x[pܦ N~x;2e*oO ]8ď99ll.7z[uU1?:bucpZㇷ"ۅu4m.ҏ.|Aqc<+?ĦKt?c2H4O>]~x~S>vlhs'n}4~$^~(y6cSfy\TEqH`+&nN1)K8?n{_8:_ GHL+k`ҙŋ.:4ŋmslBp戽{v#(9"uٽn0+-b RŻH))6 P |hk&r"PP"?޿Ygψ__8~3;N@~2RwcևmGl< IOLK0Bq'&"À.sf2|>>߰)<Y] 'xy`e:ˏyc18vȣ1ݶ\8>cŋdyq.[2mUܘ6g[.^Y\p@C0*xx!>x)~ߗϯap:l>c[Aȹqc78ㅷ'\s>}~M~x΅/^߯ q1# ^ [\|_HkYDm-]"p~_n''6 c ci;x&~~^7|:&m6vᰜW8,>n>MxoǮ}xk76,:7It;t9V8Mx;8M1xJ[x8,odž3k֯_{yikmm{[:6pذpxq9%'_y"P*sJA098-C^xeZ;βiغU+_~q,d8 GF+F ^\ӿiӦNX5iče< e]\YZ&Nwy0-holHǡi91xӧOرcqi3K#?H|&oذ&|y,Lt" " ",`_tuʼn'&l^HQE M`q~0~e[P0)8_`lةS'ϋ( (36cy2k=t c)|3GOn?amw@D@D@J,˩y EzGq>oy0=\HsRHqh5" " " " " "P`<J~{[ezD1Em GE?`VU(t" " "+ \(P+[6ov./=?2?'6 s.6!oB U V jez[7guPZUԴp-_@ͶYmkq t" " " A@,9Rr$@+b:ogYzա6ծ+`u̿-|-x]`.MѵCSjZ71aV B8Y)LQ1Q]U-'@+:WFQxQ,Z/F:tK{vQS{44VJJeR Xd9Xr5oٌV!ͤTԊt5NӦ8bmг[;tZ4Fj1b,cVXq%r>~J-%@r`w?Lշ>~ץ>}{5+5Q4+ͮ Pr%DjLMC1o7|-_ cjoĎ-5og۷mQ or" " " "PHs<ȡ/cy8#pѬyc뛵l 6wndDdb,3X6ٶ-̏֫ԴIܳ R6Yi?wS51r6dKW4_+*2MQi_׼D@D@D@M@lیCJ [&f<8w@z1sH3kE'EP3QE F#DZ1'BfΚŚ5;~!^z|-i8k~w@huFQ YXI@}uQD@D@ wMT"(nyS`DKw?| 9BelݺN<%k0+5נr̎GeY_Ri mog~lL'8cĕhڻ.=k(5m-ar[+SZb,`BD" " IH@, /N9),Z+9?l8HC 0?b”B5fPAw '/ل)&:}ث|8˱ǐӇaP]b̜Q "MkJ " " IL@,/N=9xEa5gb\xCx1d!8Ѹq_ ټ0#OdbM!$v1 Ę ^1-mZĚ6ml'qߵo7/93F:1( >Lnp2m@KKN&a58pqPZnD* JD ;cMmrhժټa=lϿ;ox~+nDk׉D6itY1 ۠\E% Vu4(2_t*3fٗދϽcO8kW7^l;=i#+Sz|֭#4m^=)\ܲ[8dN;+'3F@,7: J˳BLanj1{Ks15b}AFW2or#)fr;l 7<Ɯz f] Z5>k&1O@9$Cv[pu" " E > (WD >R(/sn55\x > 5Ze2fQ}d&&[o=\.lmaXLi,ƫs("hF@xISsN™Ç*nC/pL=kh 6oހmZsGLw?5kβɛkє.Op9( `;+MB%81绿0S1l`7;-J%A|pyZ8X8ye+Tn ԭU +#^" " " "PH@> ׸Đf/ @UHa(խSNfջSPJj 3~>+䕀X^)# mɉidg_~#JX?x -lB_dQDтjeݜe Y3'Qv5\xqX\&.FTE($Jٕb_\(VZ{yо)DK7%aN-a%a:8#t*\qC/IΕMD@D@D@D(튨<"fy ϻ>_wc}[B߾=dp 98YqYGj68߸jr" " " "PH+6pb/a*_w)" " "PP$ B"n_Y,tث9k8zlls 3_HUPٲƍbyy,\ЩC ݯ:K,_qw$H@Mh"#2y-N|tP\si{'d@E0Ǝ1i㷑3c1#J$pK@_GxV^} G|V=q6|sG4qLi|.nC`HKLcn:6yqdorBQJ֦ms0zt{X|Ut@+,+,ܔJD@D H%5Sn/kv"z 9vp:v޹ M6Wp]wcFW`3T@+38 05F,kE@D@D H%/#ѽd?j[/b/Fwkh:un 8 ڨo" VP$xw֯hecQGG5|0RS,c%l:Ұmh}>GĽ7ߚNBZMKÕ9@ VųQ AnV֜mX1z^gdlDpG`OSq/^4E4a-'" " " K@l{ *d# 0?1gpɇ"=;e~4)\SDNlhϽS/G/WJeM@d_?Z?:oxѾM37PF֯bt"nܸժVI' A}1?iD@D@D@% ()\Pܛ|xs5=6ef7k^N"kͺ޹5nD~8G0yN@K/_  0"gg tP5=eTQNMpӦMzɘXf-هwmOKE@D@DT(_*J'%EH`KdUV9>pxS֑RaH.acg1f[FMpiG9(Ҽޮ*@R,.N 9h.?y 8?Ga؁{CqHz7|` ++"`׫\rn jTK%w;*{O۹n<+" " $* 4_qل1Ð! SXtm&Ӭ0{շ?Ӳp6VDR$! $:!YA-\+oz2]:5weUSe;(Eۣo7Yy8GHFVtW@GE@t]OM 'i3U۸1dM%a(_~lDwŃ{|;EB@)#A8J>/ {6aP8zb_fa?˖ĕ܎ SpuШ~Hs{W"S.M$vt,[A?8ǝФ d$׭*efX@UՒx~}+U9g6m܏Έ0^ae/'" " " Hţ"?C735d0sףgv.ޥyV>7.㑑 wDhָk!sӞ@ , PcVw"\|#+e~_UK=Tַ-a5Wf#]ۮ},bkqg B!Nk Hih[(xp2h \u3αZs3DI.RH R%W]pwLpDg-tt$kRxuJ" " "yv*LZl%q+ LÈ1_ĘO< "4aLWF'|3n\/&exoޑ+? # @=?C`uk/9ukUw@|%IyW$~V#}k׬sN tx1nYk8eZڄtxb$7 :{#@ŗ׍wzj'ٕ@(" " "PH˥n/_!t@^OW:?~?Q8aBSJ:xkحcֲeK̵Mn~ g ;r0حYR] G K@^:< ݏ`Y w\M껬Y-ˡz ~Жa`yЦBث>U_'js{tZ|l+" " "P H"+\džnxq%gqݭk{%al)Ԅ/:Trl R\9t6~{='{O{ PV5QD@D@DX+E*^H VY? Ug]s*i)enX+r(%r58殻d8~8gqi~ąg]m4Eޓފr" " " %Xɼn*u.bN M<{/Cq`-%{u* d#5vV5 ztmx7_ |<ĉ8>Dg;#A' P." " XIup _9\KϾ..ϋ'}yz6%*E°*īF\r7d)k7Kv pݥO8'qƈk1?pѮUwzkEAȾ-H;" " " !`!,kְklt?<6;.:0g)+͹X+ߪVGV<R\BrqO9n:z"J%UE@D@D . XYRysUFX'OmVf q04+*rXJMb9J 1#%yܩ FB|iq]^畲⋀# A[n? }YLy!N>{Mt{Λ޲P+*M.d)g{J/j%S޳WuIС]s\zS`5v4\|19-Gd2@&i`a\+ ˬ0[xm5h.}> ^DBʶSD(ĞR~!>=Eᖫ+Nœ7hMB0+Fw8e!" " EJ@Hq`y%@E״ BJpr|d<{xmpC`6mTr9*Y[' !Qf(N ÉG] :Fn|Mi+Xg(" " " $'J h5Z?r0_]p(/o*v[H8~xO+,r \zh5l :o=D=OwZ@2GM < y.Dkoԩ 8-+A߰`y+6eRAJ N\DnY;ۯmm{ᢛ07>N>fe!*1>u;F()%K8z\%'evN8ׯw`yTX5B]fr͛r.K3g;V N:n *9Ͽ?[|A _|32z;w 6;t ~t u9w郎ZZE4W,}0Sn+Lɒ7f~Ű%-2;WνMkxɱ0h׺XϊQ׼1u@Zl/m  <3Xb 0{q2 WYq`%|ҥN@BcW{.j׮>uE \7|3LsOzh֬(ΝD/J*oGž& wY'E؟9Gq"B=[iYj ֮]Ef7w~u&a~tȖ*h{kwsٵ=ԫhb%HaJčvh7~x~9(0h7{ <4>\1xx/ ޻mի"5+K}gń qF#_w_ʾNm˗/ǝwމ#<;vthΌW8o_|}K^4iիW_nY.2ׯ_?'($4:ʄY.PRR YӦL0b*e ٶ̙3O K)_lSo/tDѨA]q`7#qo|[1ZʕGPњsW\ 82 ~.M4≀@ %'ʯ|?3fqܹk8>WӦMs¦M6hڴ)֭['|v:uYLۮ];'>uT,[U7|/V6Y/ 2︿Y[_0:dsA=E w,8 +'N5(KbD"W3Q5?LIAuQrj>kz,_X?kVMKWIVD*P;+W@˹{Mi=@IDAT]Ymh4\s ضVqK$vZD@D@A 6>|8v}w8묳ТE ={6*^t+£>d=s:tָ̃ݼysjr-217G߾}XDy:@EǼ6X? 7Z|SI!1c+SO>EonRF3fhtŕ֨z&/Xŋ;p…?,kV,6{d^{ z G˾[Zrʕ4iR4>`2;KV YɚiAY9 fmU$a^n!PF.J:|aNCN`Ħep:x~ۯ}z ?pr;vnargRB'yJ\w}mVVZuȊ{Y6lyY j0zfQM;mȊADI OM|_06)Q^m͏7ⅎM6KTJJ*{wWT0-\V1}qYOW^y ftP|7Fw!p yFҹmx!s馛}ׅ}Z,idĊ9h"LND@V؈+V@\GKT7@ 1?e %l=e/%eg <؍8οFSq. .C qtHqa]w~Pqݻe 6eX5Df yHHGMlԨQfw50H [eMۼ[lأG'xl+Z8ojժKl0._"˸Ʋ2G9`bKD@D@HHQPPp~xf̑e?6DytQq.1BCчq.:zO:ML|8~Xd503fت)c8E@D@' Q8+Hn 0"[bV2/cǧ ljY<`yƵcOU͚5SO9>eяV-6Md9Î0L25kp衇:F1I&^" " &ymqCD@D@@(TXWlxa}|'̓. bǡU36ȆAܧ)E@D@r'Wq*" " L gR ľ"6/H" " " " " %@`d횹/Qa-fLCh (qYby%@+QR'" " " " "PFSD@D@D@D@D@D`k`[3  BLE@D@D@D@D@D`k`[3@./,$" " IK@,i/N\D@G vJ/+n%n}9tv" " " "P2lil~j?SPٲe4Oɸ* " " " "PR l޼lYkHU.g7Q11V+z*  D@D@D@Dŋ I]V[U5=)\Bx"F1VVMK JX¨QD@Dps-J" @Ye*j݆ ۟vo4L1AjѬAu4hT;@v-ЦeԫSlG&ESFVw" &ESi(Q:RE_vf0c_~wͱZޙX`%;cM* )QUBIERz[oz6-*.%E}6{9s;sgܙ{{<9y﬍u[dߋdn3_5~v+ޭt9iLT`f-ab"0*bMRT̒ @xXpe$K|a?wS}CȟI~]w$YcU3Mrrd'嗓7IES!la,XFd 9gg9#A58|Ȋ$͸KͨHHHH  fko˔?)s+ՏH\v\tQIOohdeI[&G233%';[\ssYՠA]9ush`oåGoJǙ;*0na- $*` V -[{d )ii$3#?mз~ z.qkv>bUN*V(/ڵCi)=z/ .GzO}\043oʆ𣨙?sT⼀<   ( /n,Fz[ky)R|9ٳ{UtT its \&bft ZL6m,A^}=y7W*9YʕM*a!2A~e fHHHH/ϿCZ+7O\!eeϞHW1` #Rv J֎mZF^=H&%R\x3~첻.B !D$D,UHz ⌆a DhFIˎ~ӇJOgxe,R;4wV31AT]vKӺJF ϐl[TjT‘`ӕPX1$@$kЛm`YH [ͯW{e?ʍӆIӻY+lQ8dJA(fffQv+˽1{I7 jŹ 1y'@H@0y0WZz\=YrݔarS&>5aHn3ִiC1B;p]O;RekŠn,PuI$@ FJY(0@u_)FZq,|}rc|+W`mH!*0JXudc6qԩ&oX nG @IP޺]ns] 7m2o|"czIHHH0#_99dcs4Ǥ9=Kϑڵk3|!Ǒ'':=;L<@Uf `JB1ܻ7'>PZ1$@$@$@$PAOڭ\iX5lTwȲQpbmAQ4G8 '#^s,xay5;bJJ}t2~(*ʊr#   nƻK iXƘi~-Z酝Qh#]؁r ry'ȿ{R,F^(i x0/L$@$@$@𭛂RJ0-v9͚=p?a;r`=ZÆue&TwɯmĮT/cTp4 GCcڙ&HF}o&=*+VɄ.vl3Ϸ a1Ces>G|E2sLiHcy\ 5P;u:? 6̦fe}w- SN=ތ=hMxFyR{6_11([ȩ&']iY*iH${Tb_L Dl7_S^)!ʧJYv0c!/e0Xnm8d"^]Ƶ`y TQNL% DLJ*W|"#/X;)_OjJ3k2M JHn׮\s뙲eחOHC^!P< `:IHHH Џ+ʕ=\iѼMBEix:ҋe˦H'Jӏ?;Ѥt?=!8"@, I!   %nl߹[=]\7tάʶ[@)VS Tzf*%a_N&Yo"ul7 x0/H$@$@$@p煷{ϐzureXL&F\\9NSl,}yW4W%Ą#@,ړ `N=oKH{KZ%||T2eWҾg<9yŶ^x$#@, %  HL{͖P~o0)2vҪeSk=*G[ d?rzGNE,RfDE$@HHH⅀n9׌<=ݗ}:}h/%m"cn?칲kw= ѐ@%t @0N^,oxVڝY=՜Uο+jP ;) _\L1tW޵8yeV D ($+]/7&2rг~:vݗ*gQ4îR˜kv9`ZZK<"|mS|s=X*`! xڥȮ=2KϓvG,ULLܺLمdz}Grll% $T;/S#?Mz)yUD0(r˝sdMILi/KB    ؑlne_$H2hPi%X\aǬlIM-'yl}<Ҡn 0vTjQҐ@<4 @!?2e"ȤYcT撕)QD*a=XZrѠ~y?2ǥZJ2Z,xFA    p+ғȠk't2j>hmr>̽+aS5\yώ2YvܵW/婄o0 P @l `!F{`rǤ}嬳{J*d=MinG̨ߞ=Ҵi#~ lUӵ)/+^q/#%O1ƚX'   @:{"i5dгqzV(U*^W˝x{A& ؀QFFlTn2w2rm;k/5 60ʬqOC%M XIg|$@$@$@$PkM2"?#Μ}e}ŝ"QjW^޴bVUyh/wҾm+6]ZgPDC ^Ʃ'w HHH$Hfsȃs^Ls3]*aq'I *` Y ,sl~ 7wsyo},5CaLץr衭$  ؾ\+>,30WN0gIR2UړI%,|%T @4ׂ?3Ͽ"9D:t8\mVb JX9 X{{ ̔ΣYa3#;wgP +& 6wAe;  ""&H n`y]ӵecQɐisv80|6BP`3YaBƙ6gM;*c ʗ;be˷E#@hHHHJ|3-JNlN<̜1kr ZT#v`q+Sl΁#-Ya_wL5Ϸ\?SRSʵWreRE[.%)   1ߔB_"j"'9qr"z %y&2f i{rˣOjp[ԛ(iH E&" $%oSmH |ՏrΕ߬"8AX6S=|d)k e<5e0Mm`GLsVؑ\bޥșCEKRhH@ P;PO$@$@$@E oo7y,a7z33|3RyH6B6[{\"k6ɐo_e4,T1D$@,Ky" b$bˠ@N^{Զdʈ/ΐ RA S#8#Ea\eY6S>> 2飯gʪ5[JX\m=U\L, ĞWzcO) 0Rڬʑf(\~reM[K9K!}h&d 1ep9=RU)WI:5WJr) LK xLci'vٻy1Hz5_6Z]+@ ۳'Sխ!#'l{&ϒjdR+U HӐ@a P+,1' $'fUpvs#bI $L],L.pToZfL.MՕ]Y=V^BfރrkiT5HS>G*U*/sTZJ5L,Ji  ldRcB(`YYbcSJ;}th*&U^ UQx,/`¨edˍB!'=(7XUh׌NIٯccerKͨHH Q $@[+Q{n߸Yn2;Q}_㤣),mbwFHo mVR%~ݚ2uf}X9kd%V 3x$c=D/aHHH tÝf7{Mu5ߞ6]ާz%Hwƾȇê5np{hM8Kvub7_wԩUݎ@ȩyH   /'/3̑s##'.{v7=3-L)U]J$+gunSw>b׆M7c)F|^;^']M$@$@$lCܯ\_\5Aiu\GdmrF[$-ʸʭar j651c6mME "@,ڑ @"u*tLJ+3jk4>R;[4rh>oP kJl`XO%UVLyQʭ7Β~G=*_9M \ j@   ZatQ)ݺ@A E'<1EO@lPn8.Jn挗'*/*nPJ\SBD X"&B$@1"40ZvS ޶cqӲr+~$QiRZ# +Q(&TIsLfhJf\|<%OY3$@$@$@LN;3'fK]᧛%ȯ)AQuka++W]~^R% g>Q^{&*gLuk0$*`S) j};?|,~c+Ηe}jgq01<#.f *b.ǧ{Xx % J;LS:;/(Ҽ\py7lV`tyT<_ ,6BJ6Km`c4a^g}do7ʵϗ |ʗMtSмLt:wT<\vy^}V c4O X1sH$@Q%Pi8QM#&Xa yW̦ [&m6[(%+~aCbͅ{_t:!̹AR.t<8gdde7V^CKŴ ;? V^M~H]F.+իz*b 4 *dRzPA7[K0\5m>,\/.}N;ў-cG Yt^dTIH 9 jKN:u<@s ]ߴAصG5*Crj912=Hz;Za6L7/Nk⛂w\lVRɮKo\W^=[s2zqiҰ0 CK !@3Eń ojʳ^keY L;[߮rѹC2 :6:xav@b:\9ˆVUWX 84oPL>~/Iw*+BIf1ҡE+JBqHHp~-/&#JiQǕkd ˗|dQ[.=m{P@tMzMpیH*Bݾ̾g<ۥi(lr=㑇HIw:H a"@:gH1OEdP1e@MI'o|wF) ! "s/<\}Snӌv o<4C6eݣ售GI 1 M|mƱ

툁 hDhG{`S )SO9(|23e[]O~ y[(cm۱J#r#% ?0MBe-r 7ȗ_~)UPi(QE"FUԭ[7}oƍ2h ֭\{Rzu)WڵK^}UOo}&9DnVݻ)SƦw2i$B/TӍҐ ?|aѴ!| &o##]V˾)/=qH2nһ{g9ʌ nf~muS2W7?}XL|"b;%UJ*E츣1P.'_|hVOz\:k)G\Huj*vK\,o0[c.)Ӽ-0LjQJJmV1J 0<èeO6϶B{}Tg3J5yd۬;U|W iEx['HG}$uՓӧ˯*3f̐Yf?/ҬY3i.GqU4^{^IH5tL#(g^+}nټyL7Ms޷ {vaf %lnsGhNZp,S+76~7_ګ:UӁ>' `ݘ4?,w oUܴ#בI 7 wzu]}0 1o7׾"P``7Y-5&\Ʊ?ֵmֿϺO/ h~q_ؘ:ިDMvw7?/?E|S.WCZX(e-YzCW_jUU*K25dyR~R1ΠJ(knU#b0( TooWVV(*6U~')[l {naTX1ClRtb*UHxiG7=Ѽ^ӊ{M#iHH ue` &`M- k eku6Yfd?A?_c4C[1ˑmfnu'ۼ4m kL{C~ _rYVSNs} ~֨\@:„?^Igu/5pUմt#$ B{1( Z;i^vpQ_Խ /v\NoK yCoCpꭶ}Uhݺ969y&Yn|j-ZJ̑L =֕COj"tj!-7ƍIcstU\IUd3*QtWy WyYMHR[N^{5Yl4ib S~v ŋeڵѩ]کzcW^yŎHp 6άM6IZZ:蠃@-T Q6.L*^{ `J$&.]TvnP iHH|*eO5FFF`}VFgg|VVdfe,A%knٸylsVYa,wM"kJБ}Av=W捥u|pS8>^7U1Y^^6 jtHK ä.\L{)\˔++)e̟qLyV|Tib]0aś[CySZ>>#>i JRg.so7폿Ques;ƅtJҲI 9imIoXӴI):K5isc`K{*W`TSΐxc3JC>00ӌ"a 'l]|2l00a@т23w-O23,0UXN>Vy2Cz_?M \x 2 lQLb6=/b +H&uijYqȖn7o?SRki"M^5\>ms$̏+K0x_aLΝ; VF-} N'NݻGmGP1c}NR`9SbQ~C&Zr??30Ǝ+3gΔ6mڸ}&/ (k֬~w`|&  O AO|FxkqaQ'XS573 Ѭcb.Crc6-fLE4kKBkyдc'ga&Ffv2f;vXgPB{v[zLmF-t{i@Vi7ojJ>J$@$@$?өomQ mҘ^gF`|6kFFWN"MϾo;` ӄ8/&8m?auݹ{Uwzu߹/[_~^ֽϯ@?Ae{ᆻv_({Q)(BopSA"SL +jذ=#\؀o9huA1n18ڱFɺlҁ a 쒈Y'xb ~h(3>#>ā-;ud!^M7ʠA{예a$ =cSPS0g?3+;IH ?07Us Wnuʏ )ԫPv{uݹus z_T5~­{_]~Bt^n?އr_P~`_p>h@D j׿(k8cxF0:zy(o pGC$"QIDAT@$ GB$@$"RÂE SUɁBE W(Cn[!=ʗ[če)n8 p׶m/nڴI/_n VHHHHH@ (A0:ʥ8UwGn2=&w4ßkw1a`ܹs)f4MÅB`4\M#‚b =. [ZZZ?$@$@E"5`EFO$@$@IH b lT{9;&;U4<Uڃ{l0}J~/hA$@$1NA $9B)`fe)$(T0xQ1$!  _>9\ @L P)~FN$@$@$@$@$L%Si3$@$@$@$@$@1%@,9 @2Lͼ Ĕg$@$@$@$@$@D X26J$@Q ̯PvQA @pE +*`Z2L )P.3Y$@$@$STb $*`T+ @L P)~FN$@$@$@$@$L%Si3$@$@$@$@$@1%@,9 @2Lͼ Ĕg$@$@$@$@$@D X26J$@Q / a0  HVTo ("\DpF$@$@0 *`%ѐ 0 *`%ѐ 0 *`%ѐ @"\ @4 P&ME$@IJ['i3$@$@&@HHHHHF XѸ B#     (*`EF_$@$@$@$@$@$PhT HHHHHHh} 8 $@$@$*`+  p8 P @ VB P @ VB P @ VB P @ VB P @ VB $ }HHb@ X 3J 2R^N~7Nz%}]vW2A uɼyW_ɓ'K͚5eN4޵.Adҭ[79sdΝ6K4Z,X@}Y;VZSP#@o`ڪnEw ^x0u xKʙF"1X%ռQ @qISbE+$ժU 'JޘZсwPRP##bULaf𝁌@V`Xİ08jȅ%VR%Sˤł]>cF0 rKt >T "dޫE2k>8g?FJaުYa3zͣ7wร\?kB٫^mע _{ d4dxAv{OaÅ^_<Ͽ N(;}$#ZFӫ?\9x]:&O]=1]8{׏ ?)o OpZ\ 3CQѼ@}wH5MѸj|zu„i&v%=L]}=\D8{7Hܨpn]{^ǵq |o݁%aRP<{׫Pvw~v .7>?Y?PP9 _gYv^7}`?xv6ܵ wEyO8{7mF;ܫ^]{<dpyƀ ڪݨϐ >WLDcX WlłV!$d-[Jz | 6IFZg.T!%X CIFgKvnРϡcrzBmrp,h׮(so֣7mng~o J/ *SDK9,}|ؕk`,1n].]ذrx-_|`ssl_yr7XQWˊHk8@Fg?r)!IH9Nt^оcg]cǾcvw֭wEtP@gRnzv [1ݱcGiG8A/0b!eYlRv~ԯ_ C]>#rV:(9CKL*._<3#۷k׮L}:pP0׍՛\ @2& uֵ\P|ᇶ.A}=X;obپ}|7ҬY@S6n(_ 2rG!(xM0FqZG`Ap9`k>,uO|:SfB¶?w2rHl I~iSڃ1{~QQjoxw>z_]w%P:wlυ>}^~h ':o '|6ҬP2a@ _z%yM6vW_}U^6v0Pe?Zy¡?}'۶m~XX|ӄ 8b^rqw-P>ظ5|1c?q0Z?糷6I֪Urٻ'[y6èKvi" #[K,߉E_5Bɉ[;V6'O?TN?xK8PdlZI&è F5*ٳg=O[ƌc1l)n#]ty+R0` u(Lh(?}Yge '|mCfaApB6Fp.`}QmõE\ٚ3gC{C3Ȣ /` @53p #ZϨeQR 6 %.55Zp-  F }AOpLfff5x)#X m_HЃ} 'ȤI"XZT^=ƩD٣@5G+ȗ ~xm/N2q8'NvPĈ]>1 @/v΍+[-Iq6h a .4Wl ]A%Pa:%n{U@ ʢVxpƒk233ڟN WLO> a:iU(ίW+NPyAJk͚5 u&! S}WBqo¬Q@&Bh4U͆Ph(d%TC#*/Y_ڵeĈvZaCn3ABF' K.Au ꤡCY:~5_K(7b8D`(AQ9A/rsLjzЋ^K4]g4/,_|a7O2L߿]h Th= npv 4>xƘhZ p۷]{|ЀFc:===0^CFiӦ6_XhG6eTi\Q 6w\[A=z2\N.XQy98M2Lu(ؤ us-o[F'j 'jT;؜Ah<%IEtrSA͛Us &1 N@}zBݜb]yiB%h@Щ)Gֈq(&%rWD3zhX )*5b !iŲ4bhfB'Fa9SK$gt 1Jr7 6׀4n>C~5EC#[]`b+Xl.bO@isQ˗/;bjY׮]CG s{L֘ݧOACٰ<UqAᣝ1hLae˖Yӟ*Ap6ςb-mk9 i}ocwzg-4@N-6љ0*x2!c"tai]vU>^e$,|x  e^azJuf?pbbvm^F A 7|6;zPD F4p?(*wH?&?-Zd9Cn$֬Yr]w٩Ϩc0u:8}/mxY֙Bo8~8PSӛ!SPo%8^if Ζ@v.)daĹs*|SK#0;<3eȐ!gr?й(={1YFJOa G Qj6üٲyhnQ0wSL!Ao7QiejDcyŊv4ra̭~0LXoCvwύ4$LrxPf@G #|1 匳z02重5 8 ֎@$ vXD [&fLr-ںF XH1 +>v&l\4:؇~-I@e ͱ+'Wzu$r9U?F s}kZ(9Q%L>1GZ%{Wx~nxM PeʉW Xb,sA$@$@$@$@$܆$ $*`Q P@!1$@$@$@$@$@A Xb#sA$@$@$@$@$Tsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o pHYs  YiTXtXML:com.adobe.xmp 1 L'Y@IDATxy,}I)ʤE:ZX$q(!@ 1! 0b(DlX$HǰDɲlPC8C93Y{wTWUWwW]zvUw>g;ԩRGA$@$@$@$@$@$0sHHHHHH0     *`shHHHHHH  ̉9f4$@$@$@$@$@$@eHHHHHD ؜@3     NkR*\.7 K%U"ֶ B# d೐%)" }OΓDr\,$@ P҇Xbh#_Db| *221iKDۂu< dGe. C Zׅ @X o<套^zJ~i!eXύސ$`*Mك/$:T*k')[lẒ {...d}}=ө0ӵauhZܕ*UV[m)MeU֢<8ۡW Hץr Š$@$P()`~ RH`$VYϲuu6nfeliqCu Sն,Zs8:Kޯ&H N&|;E_{;I60Z ra{tm{g`שsmJe6S~$;Hq8R Tѐ O X!D]0rH Rs(E"[fu|/"ڹmcˍHH vUw˵o{-Id1a+@ d"@$@HJ7/"TXNAT4y3sR @c)Z< 3d@,Kc-}]Q*P˒s&S8zc$@$0[J`j ,XiT(,$KS"Xnl!HҤ   bHJ7  ,&Ez \A39{ zUv0=OhaΙ薕d3`Ɋ(7 +]>>`́>phL9%`Yٺ_ *zlFH`00.AL$@$cݾY!-p8mH`4~kfTм;IF'06z|#m]mЙtuwl/H\B$0#]}{5IT e 78,[wrrP ^~Ay"jl+Й` ̥&@,3#x @zG)4)0:&V*U[ͦWwdƾM3,X.nٓEif1 $0!*`\:QGߑSI*bۻzY_aK*`Ls L#Xjg#FD$@ >AEg.&z&s`1r( A9&@,Ǚ3 Ѡ\+e9=8+{BZ5mllϾ*??SvuagI$01 ݩ82xbM)oIaDž݄&[cNH.]C%i4jFseGyy]Яޯ >XY ¡dI` &3t@28Yrrb\61©J1VďAWvG|x& ij]ٕgd;Hx*Uy_ߥam8)b_lҮX=eǔŽeux1%$\?$i#1 LuEƌI3[-yCZQ蜶t">łC7Ց^oʥkO4.2K7 HWx}ߍ$_*kF֜rK=!LcE8X֒}|z|ut >~ۤvֳ\rՀT*tuXn ϔUOr/^{w˕JKy'0QK DuTaP=@[0Í;^ 䐀\DeBSKHr`Tġ 0*`+Hr/04-,RLYK~GnɃU,me@H &S8mL_5L΄=|r$n [E6@Dd])`cfyѡ]Q L]rK(aG}qܑv[7PfUJ_ٹv925jg.og;saZ ꎯ9aaހg \ #r{ ey[ ma+.W+w^?02X L9!@,'A1HH`o?g˒'r챩WuÍX ̏fk  %WOM!*g96?M آs @nXvʚ'N*Z5ꪔj l. @SS-H⒈ٰ6 j=ot[-4M{2HUuM(&*`wH` DgT9:0_fˑ0vqVsw൬[Q}[:؋KH$@e|nUFgD$b2M$@$]w7l끴%G?~HEoj0ㅙ7z ӀH &qLqH# r@$0Sx>Sĩ_Z^w/#KX^@+K?B\zY1bSQ! p)=1Mή5H I XIJ c{>0,7\- Dl+1s'SY0ѿas᳄H`!&Y=Ý I%#%"@lҒ @&6u'BnZ}A7uwV=L0J l"‹`I`S ޿ґiFVQ$$PXQiw3~iN!@8y͔ @ս6y @_Qhw\es/@1p b1$ @dH$0R^ϦtF^5a0] m5 P[|eHH`v|͎mQBK qW(z&X.A\EF^-RM$0OԝIq@)^3ţ ̖Gw<]Ѱ=u+ MMS K 'ƄgR ٯ1լ7!GY Mvk{ZnClG!.*`~'z`{wWժ6m.5 (}M&E P?g_{\QYc݌B X^rbFrܹ'X1.VoomHX)kg$%>ؘٯ"•Ms\Wਬ٠j[_z's P[\KW QEKK:+j4&{W/K4mQ0I$@ $DS"H*%Z4: D||}jGX@7ps` )hCL˓!ߔ+ņMMZjjъ&H`(} [s* L40;jT>Gq c\uKCx/ ^BR*' "9m7dO>*;檴-++RoK}Ǵ)ð!_ L @*i/>oI2VuYU{FgH`P[ Erri[d H.$\}O)b=cc'@iJ)D22)F 4G}# =@-ABe7hڏvНBCcnk;e0{SL;t)iD$0:wjBvZ렶 <3Kk^qHc QP֒ڴfu7d!_\OC$}/>Z&-s+ W P"کc8,c0$@c6&8z# ENPs /sҪ7VZm۠xTJ 5*7I.ZQ&_}[|: #?gekw'\ $@!M89d$<)P$.N" UZk깩}.=wn]٣n,"{,¤6h ʾ]vBX+q,Ltv40L @uYɬf-/'^߼+7.Ku}]"" 7#Q2}͆ NkRJP{}1ϵ]EF1} ">N$ދ~]gZ ձJ 0Xwm)W.rLf%zkݖ.Mk(\|aS `rC}QH&]Z >(Jz44a9 5Y% "^xI1R3͈.z킱]r` XjÐl}Ӕ G`2p,t, @ؑ @~fv@U gt><G |p]dNHd FRx,-Y^zQ$07鲭VӁeDj;fq#yinhc#4;XY)`+ c[Y|f*.|5W}(l+vbnơ{ker,W"dg+D%"dbAP1"c14zY)TV*; !#ӬoHB\v^x׫,u݆a.S_= ~V&c(SI<[`d KL g^?ѳ6lY$@ P-3 Qwժݫș΂~yv]' 0( dNws"bN3XmTV0bS$j6t;x﫬KlXL]C( , 4h)( ̄`]lT˟ hwVҨv[)3b$PL=ղ(jX Yҹ@aXTI`$2o-FD$@S&6>l+L6Rvk+p60$0@Fq;(ڑ @$"dI QFYϝNmc{m}XJSyIF#+冭gt F::$I&Rb02[|.s/nl'k!Sdܼ'<\X mN$B#Om6G~ iHn6ݻ z⾣38R>Ʃni Tm*8Cb@$xH Xs}i4Rm9@oPvmmK[j?'n|v"2*XYDSLސ7ꇦM3̆A!Y1?qͶDO&lb݊7YEx10lAK(*`D0X@N-׷~S~NBG"rW(?H2F'$@Hq(aV,,AGo~ڂnIGW ??:G?x/XisaE:'*ahJQT4 v=FR#;R^u)+C .ǷfY0L. ,L}StUZ+e5o}G~̵ Pؒ K} ֒|ɫuEܽ } R)U/;- mAG)}m8 @!Ps*խxݫ`QcU~LLXG$cPd[tP2jdHYg V~*EFalÓpuIkN/h0ռhl_$mtC:{xsڃ޲ٱ6h4.h:cԇ'[nI#C=ٳ̷fSJ9dȁL~@\^}yےnօfus]yqy2hG\_aI`2,iZj0;j3]¡-g?# D`PfqFII7%'ͩ8My7PCv?'):*i& ~0[v~x"MC%-V$w=NoW` wz}r}}r}XܡIF{9*`3 ґ~mFtN8£z[}h086ͻJBB 襖Jݣ>[]'ɛGv a:!䯮_eZY@gmYd$\A>Z@vN><_GnjI]ɦ\{"tʗsؽ/Y΃"et+ ^Qf'D#lkM_[;]aPںC*1tf~_/ EvI4  FMݧopmo Z f80!$@lڅk0}c RYֶֻNF[NNLʆPDU5){E唳F`?ZbBF6,!-IfVȣ3h찍L$d0 FVq"[iʄ'$6ke ճ7 &M@ Pr@*RqS~3{tMXwi|]ؐmlrjXe5/5=on--5YKgSNI\FG۸zI%i% "c#g5EG/jwEIVvV vm}f W(g e!V}曞K02T~wb#4Gw7o;QXzY bCpfG6v\00k+l6*$a$&Sb);w!&Y,yE[ww^ץ[^g5=:҅{ұ._e=+^e9g'<r81p eN9'`賗#ZBT/70s3PY΋rB)҈I`2,"3 *hAquuus}.7jٽ~MX6,UEՑ뻲o`;V%G^tsO9#$QZ&eT.iGqQϘ%7$ԙ,nVEKI "M{틦4}P+ |bf> LJ`x]"]ϟ{Lh"#8 }'̋|9SVd#,-? #@}sc\;Xzo~_ӊV@^M3Z&bH`ekz/ ϡސ@n LA Qxd#9y}ieLˤ2 Y? fR)Tgm UٹRcRlm}M6vǛ;  -Ћv 'L> ,Yk@oɞ慾[]ξrVJ)6ڢ[ޯs_5V %G}Hh}}x9tμ[hy,)^kƑop…z7*kIARVZY[ߪ/ hd Xlb5)Ko)OЎ~k]59;?fݖi4 ,œVz ,#a+WeiYv.}|1NkBtbaH.+Y0qy~ " ?Go?(e] fRHݐJ%SԢwo 4!EL+@$bU\6҂Z_٨J5ٹqE+ΊeFdˡ٭/Of>/Li+a53`^жJV[tV`ksW\vmŴlFV-!)/$mH`:&S#CCtvSj1aYeؑpm  GFM|?kɍK,khi^Hv@n ;x &%rmM>~n'9㞼 7,mF`p%smro/xet*c1 o"%b#m XI[QV2űDņUpRUP &qL7m!RYES>j'm(@`2,)X h*$h'ʵ~z􋖰onW{QNF[6.u.[5c;  ̙uY[ށZVc-Sާlʺw]&7lx~{OYy@}Ag2< BkJI O렜z@+6H M#gj, 4j:cupu- F3#=<|-ٽqٖˢb>uU!k#\c6^cz "e))fV92Sm[(+A Jd$W W$aLƪ@Ae"WyL.=yݾՅZpHZX:3G P8Ճ|䍽[pqä ̍ ڴ-?FcA6hۮcՌ/I汚t:0"=nN+,q ,_tli X_D;Li Q:Sx˽5D0yq2shS"\Olw@v Ɖ~N P@nyP>cuҥ6#L6v݄vO 33+9 iD6S" 6j[sdD6\;̰X&cI ;lXZfk#Qlg3 YBPJR]#]|u_k&néɹx@)A%3< 9$aA$@$0hou콄.GMƘ!}F gؒdE7]/R! ̎d bs 9D9h@.̪FM.|tpv?C FGflD6B39լ7ڨY9~lo{^nn3]Ҹ>&LV[%z5ns_Tٵ 0exM鍆k*`8RJJHƯ9Qҕ\"PR= *O]kjlCQ_U{Fz…cuiOZͦ2-e9{t, ֆ-GeR][χ8(ڊL[d}\ aHk'jxc5Eq2]Eƹ7lq!4I݆'A+4ʒcic%a>Xf`JVnCw#NaH[ ~7?eaѬqv!|&θ# Lr9E^]dѷ< p1D| 5K ºnCFS=6a*w-=ta>CH F%$/V)Ǯ|<]jZ_zG/[y֐』Uw%6A0^[li{:[8)Jޑ}/ ̙d ؜etVaQi>{긊TYϰhۋnG'5p"C6 Z7a3&贏hvm: vD颅"evFoOgXCl;,ǡXNy?u%;k؉J{y  ,0Nu䣍fiE+gY+)\hS]v-kƠlk7ށބyg!H*+|U}xP&S_˩?f4JE F{M@_u_8̧arN;~Bt_bhL`%CY PSRd7NSPa-ECF='Ҽ@' UdSn<hX#No[%7bQ IޭV%nW(V9mj=Pva;h(o[x)EØbDF ^EL\d5XM $ eQO@U8 .)$ E;_/-{yHK0%AeRċSپ|UCꇥ#T~}g_~E֯h]Tw7_3_?n&g*V7C=W)ޗdsʙn%l롢2qtccԮu)80 ,X?C@2ǟ]PΟ-]x }];mVDZհr ؆ECy41f! sLI/4O0,>\^2  9v14g>aE)qH`T|Џ'v%Ggn,ra'ollm;Lgƪ;zpO֯lkG8҆F#-+,;>pٌ>,Y󎺭;yN/Er3xp]{z! @IDATB HFKJPגEuC$x]|'@,"ttETkKۗ fi${ڥ]..N.k~.j댂.үkɐ TbF.E#?._9A;fK?kT74&\@3JhʙDqڹ`5thD ,ERzwbn7T ptTBfh*vxҝGObdu-dL;\g {v wCsay ;gpH"}7H+遙Gk @XG.iisRIxcLoby<Әx&(3y `]h2S`ԯ> JRH_?vACܥF,BfȠhGXZ H'Rfkvdsh1Yr.}+:n-{r~V4f}`l`DҦ&W/+;/Oȋh7pã@[ԶyʹW4\lY+90w.NjږV=K+3(7D$ S ;GAix3wwk/Ëx&pTfcn2`gxPhy콘φ~"Tr{ZS>M@`@xї׶.y] vҊzswEk'NC"i"AFp]89K1VRT^s7_.-)g1>޼mF2aSkrC?nb3 Y3Ns gd~NvOiaIl }c ;kuұka[?Cڃ'(K9qFDϸ^ɋȂ=BmXq7Ip« ͇܄~b!{ !o(w+!z+⯃s$B Mzݾ/_WH1KCcwEy̜ftq EBߺ-_?L8k3]Q0gOv>:&X!20+W29ֻhŠoe" K/pq`[uܥ a/gCsa#!eqpѮYуoKPh{gaO .nzA Hm3~,,\߹urkp44uk\*O/|Ѝ2kf5sٻqF6#щtsЏe&Ⱥ@Np#`18& Å`h#((?#lQ5sm{ A~yW6toKW`0]^;6C7 "1 *|^jZQ7 P߾>ɇH1;0qEB ]9>Li٥ vmQ׃0mkg||cf L_8y0d-28ίF@vnw3i;xɦ2cu(b!  E.;W.Q^jYT[=)5 %jEE' t~v\*m Ȁv޷\2k_OymTuv0 .K]4.Qx궿v@ Ĥf[G9qיy->+MȎ~,T9L.S5^f^ك@aUݯ.'\ oح7d#6h|mD\WK66鉔/_Smp†?5 ČM$3J{w+vj!b>L%}<ͷNA},DJLs`3;:{{jYB `UHhnJ =MG{bm V˅rVv~\mS0R> {9RWa*>paQYvF H\hCaBG*ѳA=:5.[F:9øT֖]Xq83iJh 9c2P54&8M3ٵaqi>ol" 3ÆIj[4yڙ7kxOG}s x^ )`xgPhIÙx<)Oixs!WHneyS0fMh ۛc >x"j:V-m$p@Υ^kP+3ǶkQT<Pۍ`{uٛ m}\qa= v[bꦹ۸01҄G]J &C}\H_HxeZOHSymr߆^%W['u@#c(`ƅ`@c"TJei }8}_kqyFi4{Hސw|#(?^%<PG v>v8J/}{Qk-NZ.0V ]q嘼ږuuY8ʠ~#r-y ~u [":޿ O 䂝 *py`k02iv½V<exQ;WT.!< 9G;u>p`M7ju9xNo\j|vTs'f 6~:we(t"lV½oɭ|MneQguM㹖}Eץn" Bv9{ eʻ:gUxUcET-};< OvV4{_W.χi̹ 4ҽuɘVWoqiG ҥ=X;dΪDi}uw7‡?RP 0IFCߓf ~,&R0R>rqqa&y4u*@U?@e;\#>r[/]:΢v[ܗ~En)i\Q/SBtňɋ<>뮆pqihNo&6ݵSU;8i/]x!ɮgr: ^4.4sWWXc8j\^籚mø}\GC!.8nvyN깯jXePć {`ഥ6 i TU\e!?zD]}p,`$MOV!g࿢,-_%ٻr<%ʧy ~e!C^Ep{C/ȏȇ?0ӅbT@uV3 00a#;ܣo>ủB)?}xhK0;+===8l{mA~Љ{`~tvXe*msޅԽ|i!)gZZ;^CG6㲹a_(Mu @QM^;z\Օ˒<j̃Dξ]hh=I-g*_%97I~L0nL<35 u퇲{+.n2#hFyys_: .݉,'EށHDzkhyG]Ų5+~43-(ߨ[ڶ򉲎b3VW1tjPuU.`_U-?c킮^ץؐߖcF몦L&,멫*v"Ovےh4/uU햵7 OA!BϕǎqrC?iȁ0[gIV|KZnl`:byv āLL IJHڷe\ɟIy1}/QIsiltmPGgR R#_,'茑|Pˇc0<k8j ‹fQ+*,t$$w;Cԛ_a\0>Zg)q9O Hv@x|/ (;a|@r~,O4MNuustG>q㆓-%~e~My׺˶R"]GL͢yTQ71>1؃5}KFA0McP ˓,rdqg],ia1(A &KqWa;R*K:~r&W4i7 <.ړhn~Ts.R@ Y<.&C u0r'( ̎@^_^]N0dֿ䅗dl  C7ڡt#+kFYA>f.O4>5T ?.zu;λ4f\3s4aa&rQNL80X08]8ޝs)[?#ެ'hi#i}xab2BN>3yoV)`"~Ig;!лW< 1&Ʃ`d $@$@$@%Kl ̇@󉗱 @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"@lQ/ @P+\3$@$@$@$@$@"0tn +5'\! e&0C_EyMo3 @A D2 / v Z lH?/o]H- @LUUU(hL, @/"EE ޖ$$ &R_7Z >DBA`bIb킾8 *RV    4%ڪ:jk LqktA$@$@$@9#` '&s+gU L*HHHB@gjG'R?;TW<պ|}{Sw## ,/N#rIZ=W~ ۲#fK1_.K&WI_V{qy|    9K_%fjg!;W.Ia XEw>iљ[mUԹ2g9 *`L L& ]nجVI6^LLP9"z *`,$@$@$@$PpÖDU:m(dE8*Eis&[t98vm@Q/GeiMyoɃCvu>*ݕw?!O|{̭3IK$aVy.4"!`E%h$PTTh 8[kuy7r#eɝ=:ǿRֳ\nPR =(p` K~k0˃H$1tmkSwwe[zn6MϪ\IJ mgJtڭ}(zL6h+/* N qHsm7 Uo0ËkXvT=ǕRڡj^DPR:aK$@'oav!/֧qr.uYmJYj];c@.M>Z`5Fe,pfVhp"wU6/h[-K_Pqv!w=97K9#aX^u?\j[ *I6@=w _{u<mѠmc|lloYG{&$@!Qk{.EIJ’nՎOmTyߑg>/&+ ̏@ D"P 1Fc;B00Jڪ{ߺ/eF Xr$G6~7sr#eݪy^vSn*`9FBRcaKw?wi)f.Njz"2J;*`yϡgm+e>1R N6!X>^<$0GPR{!/dM=L/鷾0˃H N XﴡtXNү$%򈵧&1SF"b],KZ_yJh K$0ڃU8;lZ_:ۙ@I` P[ N[ʺ[+i{1z ڨyh[ʦh=X~QL)r(g:I&!OSlƮ1ڗxc$Q/ *`+%]1Lblwu;]ʖ~X d%.~VRsr!n6܋L$TU&R ~#έ旾D0#@lvl.d(^njږn)k6Рmft$P0] s<0{7\FN֌b7G$q KB@Z8pFWdi>ZK\ _eYUh6fİѱ~۟|yFKAû嫟x־i˙Bs}/ P] @n @a Dvw0lںx܂`$@S%vZ2gmS)y[eDG$L]پrI0P3`&ՎN"_˔*J$0OP`[/l1M6 GB۔kQSXETV WҀ#^NmnI-#Зjh@!`H`g w{QݫВ$0 YB>l1k_em  d ؠ)bsKȢ}x뎼m{Xc?f/ʖ?f?P[Q/Ub!(wYQ{< w\D!`0\ī>^5fn;[ k{zR"KdFp$&S8RiNޑO]kl"vxllnE1(`mPG˔"ɨ2MG+G]|eiZ~ͺwB=5W(r`aj n+ ~f7ߑvFQ]_S7:PX7ki ,eH m-Y"f]êz1uiWv]wBÈiԱ`ShCKH .huluLuMj_ ɐ'łF%< `v)RuuO.i\W-ihe5+UlPh 7v2d(.0޼SӉ Fo*_Nf`t0JL̆uo|äͪC* r7k".FƂd9tz($΀.۵m'(/(WۺUniݒGݑ;%ڵЬP 4.!@aL[At~|& ;;0V֫R;|Xf\S}$x3"HsfhH":iA|X|qV.ᦺ&{;nkzрH`:.qcQG^@z=7D+eexKG E?#iKOǑ=t;L)]RYQѱ:;}꫔,҃%x g}}C\}qdVAxP[\s#V}0Pd5ݑQ09zYB/;R6Xڒ@ ('Sz0Us9~u>:pxuu'#hhRۧbgSO%0y'WY MH e'!O-Mi0)'UٕSyE6=Mau Mj\TfIwa*WΜUin8q33Os9 ^4!-TH"9YW#Vq@9~M+,S fg>qm55KPxL@tctvGp:00 \2=Pv[ꁙ Sx=I3&ѐN''C0&wO<ȅ0/H.+/s6@ǃHH o}[#dV4|*)rbj2l4lq(6y"M9l23Xf# },3~l6|Y8W_CBq]|S[$ nLP|PF_ѭmUʺᩴ-)>Z jU~a4?r: @~D({Ÿ!{OZ ScV͜6t)u C&Zt|M͹ 30$"@z@a3^B!f#èV&-Z>Ν3_Woo_z(?m_|QݖĐ՘>e(Wh`㨶yxPJ#}+nxgA 6E})DLЉf\nj6گ7}=}__ /\S9}iә6j~7Hrr3aD]n4 u ,A1ԙrضuv{pZg(L555e>泟xb(>!;;fuu y38 S,ҳ1j!]w~5hM͗LDD 4# UČ$D47YHT- ;NG?Qsesυ[^^6{*q3l-Ԫ-+53#(_)pnIiiqL^^ s8XIU)Y5 pЅVm>S5? r7Igj3.Vxrw}ϙɹs|(h@֢^%/JWJȤ<Bzy;&}y/WI:`!A`̪B&:v9YRM:,27rBAY͋phH?pw "KFQ)3C'ַwEl1/ȩE" vOz8h~Q>nВ"A )1.#PԄ䊑c_rx`)tʁ$YLYJd!UB@'!Bj|A~P*נ%N"#0׺A ̈`(kt 'Mike FG G EZ琄RO?m>O__҉* ;_+`L"Pq2%W`J,DJ-b61 ĚUn?p#w㕋j+wb<,Væg-'8՛a)D RLHLxe֌ B/\]Sp:\bQo1S7&&tܠNx^%ߑ̜V+;v?vešh9 \:`Y >960b#7ݭN~ đ}͹g-V]3y'>"TE喂 " _i**@ }ULul* b̀˯IxHFhEl7sf|Vfq1ѮﮁA޼82l564fU(ﯽ[U/̘%3 {Ujfg}4eBX*H)al54DP@0 MMo#.\E0CkCֶy<{98f?1>mvuc|8|U3/h 37IbS&&͡l?MMc=Yڑ$gJItVRJ`aRrh؍ wTfe ƼmƌaR&j1?=e./3 A,))$&)@;B<`#*$D 3]BAqmO+&U4f06Z8C;]Vmk_ww@IDAT6%P ?`MK,/+p(f-' vY}.n/+nj _~5b^D"o TЎ6QLFt K3ϝ[Ɔfeg0`p @竄vE䎲-M ޕZjdWԂ_Y֭xt*mI # tA}U8 v怅hWՔ}5D?wC!j^.2(pO"y4 oشΓiD`h4qW:WUj\߯ɹfr~V&ĆVRYL:F8mgk_9`U='D 8-(uQӋ.Xᝐoŷ^S뼛gdc:=! )SM+ XeA{V*dv@o&q]nQ~geel#(0x'N"r͓%߅U "aF!CD -SEd #-3hf3r;l=$4M̊kؙ4 ;Hd)wNظhvx>7)*3C0=(U|JdO++m"M˒BGP[*MMW.'!=t;.Rw f5g>r7 |;Jח0ZJgX@ z-R\nkAD`pqdС/6˨P!CQv@Qk| ZT>ZX I*.) #0\:/܅ ♓YJsF^j^z%Oя~vm ϡ<7홟0ym@ L_Saie`;kcfwn?|3bZn۬N+My gB#k 鐽AR)adgDw<;U"PqH]t U ,ūf&ko;1x`@%Vv!b`0Ν3a/˿4't~s3ͣ>j6q0E) id0мHj~s<=lWus>`҇Ktdټ R!BmL,9ڸC8>ಣTl ?`eËa0*=*LL'(G,]̳Hp=av&+8^E Aѣ.E@׾7Mo2>q377g&''͟ɟn4{13}E2t@ 0'W~̓O>i^ש(=YZZ2w}޻gNaL:xh|P G0˃xE.A41id踩ٙBh[s}KHE,~iVFE`"&k;,^@Jspƥ`kLOq#?Q0h`S#(YC7Qo/yG̻.wts&E؍Qvp<._XXW /ny= )(6IeHCVU/(]2_ GA2K ϟӇ,b]8yeIƫ Q, QFG{|꟝'+ &(_!DAGGٳ7{ԑj*ϛ'x¼6_+b>O)2=G~G]wewc=f/ǟɟ4 -9a܂8p0QqbӇk!.M@1 T٩)/?56EJsڜV!<{Ȋ4}>T^- w+'.WW/3&]WUu:L.by]#/Ktd<Po~U̿ۿ~p3WWzT??|GҥK3oVVV4 q?3?c.\|0_͝wi__0gB˭奅{^0BDٙB^wW04~p lˆ~|ZN3ZXfuCN1L"]^4O7era^B`:pP3+" e гE@uF{Uʇ~گNL\]]UG *1_W;Ns5??T͏菚??Uz8yu6o^n+ӌe3(щdW/ }EQ"4Q]`H}= bc*!-akziqqrmk.Sl&c?dluuiZ[ [6pΘj|4N߱=ꀹft!ԅt>&t{X߶:^%I6D)E>&ٔM&+?6HK~E%@0Xz(ؘjr /BqMԄo"3+ WWvi.+a;;;fooOn5|n>8įT6/ӥ4I/N4…ӎ`+':}z],#@WZL7lZIȽi`|rRi`/uM3 @ba'iغUE4WV)mȒË l;p||\O=|ꩧ G q88'jV>28Z333.٬J&4 p @e&;kKBXUtݚd{(vߔƝ8q*Jn!\t+?x]2^6&߼7^VsiFrBgBBR…'77nCO2r@ǭˌ=u6Ɗ;mx56 : *"0[[[Lp0̭ުp.8f8!ѭG {_xwlR&*lS|^2~a[rGѱ)0գ5g^6/~Qpts̾,6#LX׀U"I)kpIΩ1q!aZZxΖ Ϝ5/˻1F,vmi=1qvI35jOk|*`>X6,`U /'UwzxnHLakmm|k_3oy[zh꿽z:"/yS?SDP7w}5޽7MNuF- `xWfԲ/݃|dbָ{^rb{z~6e38&J"`7kKzjpmeRJ*XTG,\6;v7N8yU)ɈC}MZ229Z`K Ƿ~w׼moSRwA*lv٦ :gguyt`}J|ߠcv˧luj :`YȔ6Ž"ܰPlrլ S'jAdVykOY-9;u3-3oA: ͅ"J׹X|~AHu;~FYf3ȏ2cbSa1 >!^Fߏ)D$!bR <-eE}C[ W%װ2?J9s]خx ar|"\>w_XڥF Z\U]m8lm c)ݫ@S!K6 lpRT}j n=Y$C@`&$P5LNm%T^: [bLD0]W clp<9`%9 ̈́t 5O#GmB^Flf|:4K7T\?IAgsfjnFV`  4X5_> 7"%yfͪK~+Jټt?o2 U*BAar:휿ݲ ! #`:VpX_f^r˭؎^\H^N[0 !Fy:S'ρgFڏn [%׫}yg[l/`b^@|pgmmp/5-s7sˋf|jBG[wV7ۨ^`s%rX$%tt<PTߞY^|+]9 a+iDJ'-A~jvJ˦N|Ҳ &1g!Kwy6rX1:(ⴸ.@w ,0nH@Wcgi,ݣOPS* +^+DW^;Us%oxn gWx|̝\2'nՌ#Bi^+=@f/2n% M}ƃ}!C FnONzK0{7wd܌8UxJ793m+p",N gL\!׹!Tǭ/_7^5]۴>c*@m[V'ـ,y"CjRGP*!auMlG9AQzl\n_Ik:Ik'-{[fve!bT4MJ$@Wzk)^E:7™ w.4qqúr pyG:]yN4$~I30@7WoLW],tCk*'JX.A "GL;^+ha88kDr4ii#oᬬ3 xe_LJrْI9fhC<{"_~\?x몙Y#baF'i3D˜Mc99d,u +7gj`j'#P[N'޾0۞8"bwsJgR>xLa-VrU#;R,J<՛R٥vp9>3q_4VpM*L3) u퀰)hi+ UZc`RP 0pe>Åׂ>e//C^Z6,dr{WygV;^912wEh8 U( DS~!06W=sgux;xonӧ^`"b->1C@QN8p|nZ۵,p a` +aC Wn k̟c KڂT2E0 K9![ Dd+ѾcKC %ts[&aC-^YtU=[:h&Sr=]yqzKkWvlqUu؂:{e :]! 4QHqZ8R@È]S\xh@?wY->']ɐ*h y^W͘R!u`3ż8_wfx\}:dV"'`ӈmԀi!Wt\׬xDW~9CiŲ%T,H#䑛6fثBn ."""CtТ.4O#Rñ{uZW2"u[n'o"C`(8p$,H hGXep+1 :`Y C65e[O[L$%"lƮ؄g|XNږcݾvS?SKi6#UgtJ!Z,u5Vv т,cǜDgYmYX恑K7^h/3p߾yOCGFÿOȸ'Mk}CȁGY33?g&gqۀr| ڔv-K~rF6aZih[ Dqs a-JҖ([$'i$2 &]J;15iO-S'Ʌ)e{wW8߮ 4uί|wvAml ]IOsC dm*/mj~VɝR }߯9/7ŭ2^ {UɺJ^~}ݽAZA86)F(=2E NeD :`x K܇GI>2sađ/9_BgԔ~|dEl9qm} qa"]\ a? jM5O~T)mT*$ ;ZKθm:`,k]jo6 ݺr.L7(D!% &n:stq k Kfbc|@]NRK}cLuy֮@.޲jf尵kc}ff{@2W /,xq6B'i|OtH-#m(Eswa81aF|iY!ӥ1N3f)3!vPNDrm88!ֳQt~9-)e.bAj܇!F )"!@gX)/}UAF/!|8G FEuXk"pfLg"S4w'Np^4E`6Cwzd!.>kQ/DW띠ltRjݼ PdS5RJo3ItZw4uO+4&X ?\/Gw+E 6 w䀥,w bZQ5ޥѧ{R "V܈k+Ywq{^UZ,d6 tVA:4d(e.7>40௵%Sc 3dlr/Yp+=sgBhmн6)uP_:Z"q)*L'-Ii-WmW+q\0w[?(S82h8`dGGQS+ƴ_%QQ,C 6xi]M O ĮDі0چH[;&>e/L6x GS|t[3`7cKĝgtFWdk•Vî@ѝEV6ul( ]LG?eE'\`C'ͮ'*x(H-S[ '?$eH vLm&̉o55 0њp׊4%e 0R:] ڭ#vCV%_Fښ<o^f_i8hmuf<oXx|uBߒ;r}F:ff~N1l# ۩ܫIMU3)e$/A"+ A1Kk.SHꪇt6/CƱ1P[p,:`c QDwsk!k:ѻ*H¸ܰ >kf-EiL)^izjo^kd&d" ѯt.yh`y<0weRC<@kilؽe6.\~Rq' aC'[ /;S5͘S$n!KqI _D;<"ς@0NzJz#VRt1&rp|{}?}"+"=v)78~PÒǏiDdzv@I$.f72<]^4dKÐÓ6Q3W; 0Вdya*h"cаml!j}ko+d ALK\e Li<ŵ1A_AsCg l#::>#qoSiL񈄑K gR8}}s7B1HAXz/2-?J:./Amx>mEXG`PgTL_fY2u0A mU<=o ටaK-aNs{8"HE]3 [k p6IX~kٲ$xr@nfT~zj؏+)z~_X%}y%ޑV9`YǪ#BQ28slFR 9ruinҰ0#\1򲽋=mDjq j6"TH$IH ./Q{GUGr!0KX`@vwj5; lD@ɊHG@It(N3u<`ҥ/dQLv[T*ɂ0^\缎wU@Lp7>[+fv4a8%Yz*|]vK%lNGґ{~ϴhOܽ );Igvq#.06ytpAOx)]0ar{q#`:)aH|5>a'$mtXt脓AP: ~RޞLԦ&0tCh>| ya]6է# ɛ87ѻX&C~ ~ҟ S>~L) SP(d? M TR䵅9`Լ0Jq q5208aGN_M`guhP$CssSZPEXmtB8o!iJ#q~Y38'/۟/K>#ʅ _#6iiF6;^ޏemNJy rOH㢴!oa)3"{nF`uW^2O5s\p f%7SrSrjreDV+\5fNxmq']k)&}H4~?/6>jPDۦ٘(/'Jߠ U8TYyHr:tuU|gkm 'a%<ݣ| /l7'EA<K줿ݼt]U9&`7ym.skEom_;ȳum]Wbݱ>6K fneʍhȗR$x~l⿊=f-؅<$#>'C˦`>!׊E~p :zȪΔ+TܻQ1gVQwm=ygcx| 4 .'Kռ' u(R"ۧ5G,}:[vCF9A\W2IC~?g A7 ʎ6+= }pK+:ɣ q$J7XT. b#,fffF{uͥ'^2s5 N{py|P}x\ye723K|Pl<$a0UĘbk/j$FVdٛQ f͌x_& ߬9( 1B'V ٝUِlY~ȧeIamQsNOȷ, a_4 %@HL ioJx p[%gv<ȇDAb ~*p4ecr\P FYލID#8I{AvZiRڹ6 p:7G{!Nk"W KRژR| 3SҎDm}K3';>-?w$_]5+xギzmgpB1N(Ť%N&|fn~_xYseK\mWUvI?YOsssƮoa$UW3;y].5tmC郠}jukZtYWDvٴQ] l]~?=Q;e5#ݖՃU? lmZRW9toF?삵'`A y'm|a#'[=k'!r <+؋;O|TrwrMxIVb6_gڜ{T{m_qe9vz&W;vUsWlda :- 3;^h8`32p6 }AsBoi?sUɎ 0ܛi}*y`}6S/EW%d;3{¦9=)Ϲ4]͈~]+~c ؠ: 6VT1;͚)H1 /vf\~SrpAvc`lڙ I%ImGa>ړ-qפ jƗS?!3&F e4x]< \N:Y0X꼼vYWxٱJV e@0 '#AYe ez Nh nO&'Y6[^,X<-f`Q9Ⱦ/]y'2uBKM];|Π)N] a]^l,$+3 Ap]O>mVWW3"wwwc=ff{Kf"69OH'#MCQɼ1w`q]퓏WjNǜU]2gch!$[Ĺ},{>i|>0d0_nY4`YgN" O=U4%KI!=pRW>Z*M1K^Y8!W+y@/.zcdJV;an QiG-l4b D"@ !t;D"@ D"@G]h"@l1J B*#]F[\D'i:Ay@{ X G.nAvd- D"@܂XFD"@ D tY "@ D"@* 4E$D"@ D`86Z"@ D"PU(" D"@ ÁhGւ"@ D @D D"@ G;D"@ DT:`h$H D"@p @l8ڑ D"@ D@#QD"@ D"@:`ю D"@ @X""@ D"0vd- D"@t*H"@ D@p#kA D"@@VFD"@ D tY "@ D"@* 4E$D"@ D`86Z"@ D"PU(" D"@ ÁhGւ"@ D @D D"@ G;D"@ DT:`h$H D"@p @l8ڑ D"@ D@#QD"@ D"@:`ю D"@ @X""@ D"0vd- D"@t*H"@ D@p#kA D"@@;@%)" D"@ D`Dc~߱NX1/ C CԨ څdv"@0RpX"@ZB]h :E~xh+̊"@rhk 3776̷msyuϋFkW\1׮]]L^tܼyv!D"@F0 /=_r H!Z܄@IDAT?~ae07O>&"@!Ж% aetpQ;H @+ #A:r;`5:`#uXe"լyqv")D Ҭ# h0LV3x;ݵى/VE/"n4f!C{h59q;"@GLefڀ#D%( D"@P ġ@`+_E Xg"@ D":[,3+_Go60vRM;0w1`3 "@ D.tF% w=mostpH۸t7͙7c& bܣ8j=%Dt|71t_r&D`6ӹpҳ~ zPGc357c܉EYvlƧ&Mmf&'st. 9"@|"0t~ѫ@uK/"_!|OLq?% ,6,-z"9`-I5!\ms,iIZc?/1z8RD{JYO"@ Dd"Йɖ }E[qxOO[ !$pv׷S1:]x‰ Ï'pYC"@21T7[Z?\YS7$~QmqūMɉ D"@WVmIC5V©eu6.'ַvOLD"@F 3"P}U k 91S>:\6p b>7"@nACr Dlӵ&8u8Ѿh:X  D"@@0n_V/ DEm[֌tq ASN,mq-A D!CD ܂85ƒe.vrؾ臠s D"@ j6 V]"N C@/o襛i$ʟý;"@#ଟ+)0p:ѹ@ C@Ya6w1Ig{:XK !@LEjy"(4v+cX t6"D8OfSKZC#u +7̮|X+Ȼpj.)̼(P ! _t6KW*8˅>x"0p+hskIOMpJXgms fvuVܴn51B~p׽>S6D`!kZxQ'qqے ߩ)5ጘ;>>Q|IL@8<8 2.28u}Wt`ǥAA쇣5lά 77uxjՌO#9 iGJ[" Й̀> ЦLRԸY{ysalv$՜y=zx^DTx]ޓK0;kf|jn?Aw7ke]jל >;}V2:u,N֤>;`ԤCbMpL_"D3,ɏ1B~O70ቁ 浵^Ւ"CwfKfjzF&_ph f7mP5PWZçlC_.4|a\‘'pЖᅰF1@@:` H*ۻ4aѤ䃽1L%:::ԭoh\JVF"PuD'gʒ_ pM=oD7o4>pEH"E acu ٤Vb!@wV2^* bKgP {;Vpg`n"@ 8XG vK#9'kL‰ 6q d+foA[bdE@ce|xv݆mHs+H\dbǽ[4#@1ȢcAq` @l0ڡ)hJ,HC@lCu;r-o-:u$bƖqD 8Z xQ"@-32'UD8 9mniQ!=^:anwzSB@Qc ]ohj\%1%*/I  !9`x8ym(VYT*pg0!o^ffbfJ'Efy{~OE@Et!uGC@gT=B@lƒb8jqppjWΕfsw$ -87w Tc_"@D [^`cOOch/gHF/{qE[2L@7+l!ԙsD*wW3XZYq08ӏx";6W)Cwꦾe&='SN'{ט,Wk$"ZY@ d"@ ZQG]M1]1č>R1c$(jѹǟ5/cfԲ$ 9 >=1s:e(5.?܈M@ƁAF8=8cRx"@&1 n6Ž͇ jM96S"턈DX^1uz;29`iiq@cG>MqhBd"@@K ކ!(1UHjib&k\鑜 ۵Nyۗ#CbgeYswnN&"0 8g 3z D%mdp~)xG@Y`[!.utIcpYҐ]:[]_la cF=Q^1$= 522D@?Hl]ğsf\pt8 cvLmEP!=$D,Ƿt$x{A. $Y ;tX  RO%b$ D 1+/}Essz:/߯n\ F|hRˢtM0 9tK&ƥ{@v&3iQKgN`V=1,U2#D ٸ|tn+]bx;o1NgCڮC~Z*ǟiDTqz-G :`UmфEn˨d//%K}َxlwܪ8:`eND8p]|E/~̬,7$Mdk[$lxID:vln! U-I/"ZV0C腘, =tc&ܖm/h3KfI k" qvk}ih eE@8;0sf7}hu%irpke(pt9[ebϬ*Wr5:UI1 l6{`LJrjPn"08TOkmfp!Z];w8 oǵw̉ [ȭgoܖg|*A""0x6)&Qb:QO;Tu+a&[  jHQc!lSg1(+ E@ `5+/TbbOk&?Ӊ"@l@bB=Qt9~f̌DW Ƅd߹)[L#UF\x98g>*utphNuƜ6/`1]$s®xެsI) :kW :`UkLy;?)3 +:̀)Dt2d SSSbc<8{i݉PzAzi9'^2sKʻ8g%zOd2$EF:`C'K-r*qGa"PXaˡUtu%tn]]7ufے'&M}[>,'.ˠ+"gw!w"0@&f&ͼ557JPq;6_ W9KN_pjMЃ6`@gX a$Kx@ފV.Y^Dtטѫ69n>=sJ ([wN=d, )D be-hX?KaO;5ʱ(("Й)(7Xuv7*v+Y1˅ {`d+aX% da**4ĘXylPDtԃ}s| ZHkCa@?0s LczT]T.49EFUof`k˶oYDl55|ɾt}G-'}?6]CD*ӡ7K|BVf|/Kk()/OLqqJ\(p2!(ZltNm{zqr⤅U:G$<_ pNj29`=yrEYXDƌ s0V-[2n~ϛ&6!".2پq\sffaNG\23󶄖lu~*&a28Tvn)L&UrkF aw!^W\>⽸F0?A E-qwh` #6rӝ2=kf~e\mf7A"@:Clᄱ%y'ڭH]V;%mZKɱe\86ဋeD"@ZC Xpq9snGG,),"́mA8zćYxGFQGoK+]M>@vT3rdg($) X:ܓ 7fg|:E0zhK@5PH&>7]3/\p8"6bON&]8uB*PV=V 6Η.8|oqtX |(mSl]fU,FΗfMQIaZAR/Dk; M/z')!c(ɿ225?cN~fA퇤8%XM97Qmm| +(&}`wnnZ !ЙƩ S.+YJ/D?9IUJ0̘&D3iQJ" nFaLNk+JᛚXJyaQzލ?dM* ִ`rdTVr nibbaM>?ِ$:Ҿ;kfJ*XRGpPjB|ΐ:D/'zș2qjzھjҶz(/Pss%Ï@g`1npw_lFT+;~CFeh:D+KeFs d^1  5iޥb$ E. Pu2>5m]WK68`7֥V .̔V2n &x?3frT;0 a (D+*P# Oh.=YeY/v3{[;=[S4wt0~V\qY)QE1,Q^efx|8 )@vIoP[8 1Nh"0d% ƕfV*htmJY9sLN1 WC1QV&;Y1D`6cÅG̵gΚYϑl=FG#Y%H>EL1 T$̊ڣm<'=R~_N &q\i:޵S͓'#rB;&6pl-Fy' ᢺs!["W~W8WX?=Ve9!̂o^_ 03L⽨Qn-e%1 e# ْND\9eKA~D`A V^8VÀuP>ra'DԤYC؀ymb\m2&C0/[*fȊOBTp-`v=)c@nC *3vq 7ISbS$IHc4#D@pb77WyUv+8knwvY-dJN |\~|Rv`_}o55QWʺ" #P먈n*}GU73^d= e #%IkUp,@ ,'z]^BF""\S$,Y4 ,?4mz^lv;{2690G%YvJIJ{T i_dǻr:WkkED` 4B?݂ @ԢGYBٚCF#}&IarW8 .,!@V!*T^"ӈh>wr,ZWbv6̞/z\HQrWæL/͙y9 >5Y3..Qw^D`Mz ˡIJgnld!@3R'[;!>ɧ yWEy$&e= F D@wňG\\+6:-,D\NiP# &:0yaA3lXPR=Z20EYtKJ\Vr @\u dU=)@ލq|3+EY,x÷AdN?PD~2|H$TJ,GHNw]O̝X W&զ%im?v[#r#DX?ѯpٰTZ]ebq<ñژx̗3v ~\ 6^Ik>YvP-E^8MՀ:1Sa0]JT9զI7v 9hCVۅE i)&-E.Fj"@V 3ҫF)%h:sK fjv~Yx-n{r䕍rND0iaaö* °< Fgi[<t}nyLL5llޔC|UթC2P$"@@cl142P6Ssp{54E}k;pbEHY59bz fgWG>swx)"oh %֨Q^{!:=9;To6{^Eo%>gT6<.' Sw\LÇE1@ ,/'^)5\Z"%֡|l~r48f3KꀩCʖUBu*i?zh%H*>#`; 9+},^\7`\W_w,1D`6V,W0ΑIDC ѻ` IМ[*E<^F-tnLҏ麖[*-2yΤX_ܤc,:{˹0i`zY"b(ȍO0Gܢ+.:IɲʊOrԸkNȓ5c4͇{ yppFT>Jnj(I1)-U1ڒa$;"####2`l5axDc#7 VBm5/)as3N,kS#\c2 9;۸3ԮrYȭy~JFVWqbbJRr\NReՌGKI|qap7@);LdHDY6NΤ 6- REgvv|ZmÖ qZr\ze |Xށٺnfv^֍8 Ts(6(FK9Ӹyq NDX 3y0H@/H[r'ea|敇0gN%ǯcݺWAo/[Dl*hg 37P ~ Z=U˦F"C !(/vmFb6tpÉBĨ`|ɻ^gV]g]m|\~Euʆbwg̐=YJ (kimrF">R$KK!g }F:`UCX[,r71ˇr|P5w|yąg]DjȗP!2Io;(4a *4K("0TtgD\M)^H.? ߷ѣ0I,kE7%LSEV|Q]fB #ЛV2Kh\.,6Y-V&2 !d98pBYfh*4X<tJV?&*+\7/]5#AQ8]n;"V68!ҬmZo|rІfh"t=-siõsȁ j>t#RӔJzvv ×5%;kf.`{hW~1 31CMqD$ O".?5w<[ q:eYQxvtuܣz:CaANWM/͚+&+`G!=9P&v쮱 ǁM}Ho%vML2&UF MOߨgzjZ(eI(-~gŻx>sLV51l7쐉 ~L ?䁍aql-waj-GeD|耕i d Nz"WbO@*vE[֥Ŧŵ ^Ǥm -tǵ&\SH|ӑ|bjR&peR $DD[zʩ2Z9O$@5vϋE J'lQ"`15 &}GKP!]M˘g5N Lɗ'ӈ@UuP3;P}8e4{uNhU}XPt`CpO@UVjUFTP(֋̈@I@7hP6M<%~VU2Is95w$m LD`p+_/gZ;L`L}s,>)q}R+HXdvN(JR0T:`iئ#KbyilT0+-!\,n )cƙf\dN$H'B:rY<F*@}k۠c~fkWj:W:Y@̦G ip\q_.q\R\OuVyvc@(i/3(v쮴%BB 2m ac08FPlc;0H Hniu}\:U~gͼ~3U*++3+++>QZe$ldw3 "KXl7\= [voܽg_ vuɋ~w`n/'JrZ%9g zI\!. Xo^Tu6B (w褄ܖn[TZXȿPmq*e0W˵yB- :JF[=h 뜊,U v1d:+!^Um=Gb-k|M8VA [VOi~&y$8[/ϒ-n!JXJ ۖieb\{bfMovb@>fesDރQTXנt[eě@WDj At.{O'^{8KmY:B e#CV 7x Tg I߱KA!>J\qV.zT/6l|Uɚ{1g@&Fu\c@$`}u ]> g$|:Y2L6J%u{0o4PJ,!b&Jwy %6 !8S.Sw8\xR ޻خ+9$+N3yʍTפ;Ka; ѷi*)0eSYT)7EY8 q,k Q(8ya2%ɩ4 U\q1J`H s7΂xWkAS9L>%S)$lh MXiS5!V 6^,^ 6}GnfrʭJ=V^,P4l>BHLBHtD)z u@OJTkY=f%3}Y%%immUbLXy]Ka gCV\+H|\x$\6 A}@%Qq++7V?yv3 V, MXhLӛL$w*+i&m1abK ~6vȒ/]_X&MW)O~5ll/{9HgFt%)<í;2w!D Z^e|nĝLKડR]4Zci]U0O8,͟O?gf֣B&q%X)`ֺl~p|kFWPÇ&qUeg<K+MIoIz%Ps X+6veZ3 %g&ܞ@KN|ҩlYӟѻSn5:~tlFߨjV"W''mnKс+:0f8:"Eq:, X %%@|djMDy+=;eaͫ ESWLUc@AC^UypUqV`tjfЯfX%=%UN>NW$#)SoՕ2ŦY.~hdu)ǜGӚGuGrl+c?7^DuBf*G8BD [nt%}}dwxmuLW/owe+ToSCqRWh^W1r#^ӆ`j<Aqrȿ7jY Q"?9 @IPG >\(HZJmL hH[SbL@@U Ўf0g*5pUz(F؄F'`g}XdY%K@ X)#LU9G*W'Ӷ zS#<&#IӲu0-yfw'JFiVmn']b*r2[›%Y@JO~x<D! uBӣm&d, 1[.28_~%LĤ jJm#?%P' Xj -mll&^%3pUl.CVb4['~muhVxl\F֯n(C{*fS"p1w7˷}ƝoLڽ߱Vx󷶦j*OL -']ץ+&!s^\."guNoSl;ɩ,H>?ǡ&}7nޣ[2[]fSK _+͠-CQJ0.t3nj߸&bhqh'=m;yLWҺPV+1Xn sf7< ig`?&M9 t_zlb'Ofd9gyWڡo6#xJLg&9l*}\dcgǝ}>%9%!6P/ g; (Z/ӕA_{ 7]3m[qqyDmٰέ1ء5о)9(Kvpp)Qnqj2'&CY'< *E}jiP)l.a.@el9A#mw0ǖܖX^h(=m1j$\afzZWv84Mo!8G=b֨ $iӌULG'#bHyo`rvR?[~"[c2;X9 QoӦWp1Dql)y$̦zV `'f]x WWeF{YYvfd \Y39RpD% XwWX̤vU_X%H@>nAQz2vؑ e|c@O)4LgiP%u>C/+Oj{%-H/ʝfMobܒ@\r/70\#(yJ )^ݱYxZfYB>KN#R~LOwVˋݺQVȶNǓ t LQR])tE D d$-7o8B|ƦΙZgI%P3 X*#9]/]@j:Clk'9Z"mڻq16p\65ɷfޥ|) #DGD7OX OhIB؝NJWX`wX.8Haԁ.PB\Vz VXEnN3ԭ#Dn֦ pp6Wlx ˥CU!Y}r^H nA,jMe|ww#@eE(ZK j]= Cܜh<ZbH+-cW xQe=FG].}Ɓ\йrA|e)UKl|!VYx孻2l`Y| R<$`9"XBzItk"|%Rw ;Tg`V8A!UD^^ujE{V94eLN'YR%^Yl8nR%0k ڮY*"B*E2[a(UDZbtE1.J`VYslm,L vG"`@ %@tea`yoq%ͽs{C4wse. ֶEZ"E&v]s;[=:.4;c;³Y YF D Iخ f3He3,g i !J:BV4o AUpO lz|ףk $~wrk7n'" DZrYsT[CJHE9dgJ wRIr _\#ePIO^>K=ىTE ,a t?y+&bi L=ѱܪ[%H~5cIo8lPM%`]hDHА^`LlUnw%}?Q ,>3S3kovIAW2Ӫ@BW9Q7s*C&)ٻ f)'V"WWS+mR&J`%P6y$e7mvcc[;xځpЖ9X)%5yw{+/vǜv#wuSSn nD y2ڳ}O*,D}5Ik$0X%Jk&MΔ[T*p]E@`?-_zGw5Gӕ#`7Yypұsԕ1ĠSf!C5#nd-.M'+rĜN9*smETTd((Udq${yãis&|Cj#hZvUA^*9W.^V;!;OeY`ؒxA'|M?Qs`2XM E;Ȋ&²\[DђG^,T+x'CAe}ǻTGxbt@Аgd5FC]ݍEE̕4_+()ߒ<)޵#4$VS-l%] , m~|-#tLd0QsD4'P>-"ipV?5")3>,e oNhvc~>+C2(6cQY>f 3$e0)EYZ[ћ-B+#Mo,˜ɕonH.&'A3Ї>3C7$n[L{ѡ^xa^͢mkr^VF6>:%:Gf딱Ik.wݒ`ݢ.xY܂Y̲53%ߝY0vu3 gsi& Q@AflaZ}%S ߇ܐ4ǂ %P+el6g!1rI|:QE x>.*z!*qj3(X8)ev,D @=5GK~">qh5=aiQ9 Gx}dKk=% QlSakPyy2Ɂ/Qs@%K/{6MhG~`h ʖC`ld>=}yU1aX *#0ȕR{z,:٪ N>Lu@P&Rmݦ2@'{-mEm CQTl*(n6Y ', {+O-xxsZqcXzǛܖrk4^zlOfor_U'C cq{"LgUZǘe)8ڥVqp08;d??IDAT\9;1$]U ynWV'ec\V.8~ZGϓ]n;uhUTmY :&"̌M?y h-_MB $+%0K ,fhH\~Eܡ]܎y4#]]Wʩzò0RF_>| $#]]BJ(km>yTd;߼>m_H--">R+~.:^VtUO˒/''VeS4d؊7~0X8ֹ@m{UC`ES8ԑ:rm.2N6,ْ:c'0I1,m Ǭ> ?abl\lƄ[q^ iؾ*)TnHkpvYᰶT]ATKL-!JX0H䯡I·pr[{pI+'GsyZ4 .c`chJiD !L9RXYqdzD'cAWŌ0sњ+2vH^g;N~Kt*{6-|b Jcv-'CrI.tR[Ŗ-o<ιeb1Tv-#Zl/l#صSu|Y1%qEpS'|pt5lAoFڭ|j9B<Q3! XP1vNaԸ/5 !B,w;,Hg »s^d \˯#'U)_Je3(rXf ާ#Wt#,&1hEKo ֻ ҃eζW޷B1R)Qq蜷8_X`[6崶ɔAC;I9XOe (%}7:&ʊj! Zp䋡(֊_!BUƒEȓ 5R|W Ua+˂ /)d&񡉢:ct-#aW/OYAHnTygkov{*_>Ig,{W^g@ZbTvC-8+t{qS =%(2ٰ-5FS_}Q9%X$e0%Ni.X^G'vj/V<0R>l͓(w}Rꇺ]ӆqY9-daZrFXx} Uxr'Mkgz pnsw}{i\;9#vlzLhLɮ ͋uk$@-m<1Hh{ka L m՗fm):jH8) 3{-+MoZjP?{է -4&I\dKO( "W[{CMuf(Krr0FV4س=sxʍ78:~j]a@.x tß·w|',Ǚ:IW7e1@{6)1ɳ&y{<>Rm8R@ &<&`hly>i~Œ'i`2?AA%*~W#k2G]J} uLF)V9m)3݇TջzhLBR:Vyj͈^!!U:}[r P&ɃW[@4s'p5uc}/YW?t4; F3&rI~ W0ZVe|-W<$o#䟏ph$SJCKeM|6uk޳ ڳ;|Bc#A_2-Ъ!K]icr}> ]u dKjyꆎ,F˽?>ws`<`(GtT @^#^$8}IWs)6 r\ 'F#y>O5r5C)iJi>^/yr5^I`ɦq _fWҌ&GAdi u(N-%>џ4JɭiPH\61H`^0P]=0fnQ:aV1([cn1G`dynӷnX:MliqBN=?y{ܮPgJ(kRʙ7l[_/P+<>A ?)\ȉ=v'U U'^ŭ%9Ik.*BS华2< \W}Y>mXaK%ݓ 9юon]r?!ؠ Zz#|܎ *nRk_W.LoHy:(:]Lڷi iϒ|?t 8y%me,#ɽvFI OвexI1Rct!gh7^+ >Mڽ]x/'pP%r39YI9,/' pU|I ҝСNxh#2gZJ>,vnl~oDNw7A7#zF6G @ḟlbͷmr۾dNoY w6zꤝ.xt4VSUt|^#zj-C(i'm+*th8'wbAJxm'-m2-5m/Eh#ڙ71SJq^;#e.v5t%}@W`?[mFiHCLڷZO <|]njb2ǐ s2)9܏qГi.K|Vz9移Z2Lj`:[({U(]YZ+bvȡ;~ԭ;q6(3"Zl9K<݄cRUay?di$4;mn<Ӑid"&8X)N]8.̑1\hꌓt 9'OrG1z1ɓg8|z3MXԲ|.M<i"dH|NOr>y\*|c(Sٚ&1g(B\!u Yq  VRr-5vsn:ϩÓڙI%{';H:`Jn׳9A tt u|N篎t: ^ 4h?:?)IpY'eOx)zȓ`tnݗġBj~ $ek7-'NUiYvϏ ({9jT;W483w 4) }h>}l5[o [1 6l(֖ V_->׶+<1+?.a8(dHVjlMS~SiMȻmt2ZSйpiP$[3sgY!/ yY@Z1P1G>,ZVIܪ"څF JOlfI][S(ِχij\&e5cJV&vB.) @(l':Sݺ6z]( 5kָ 9b~Mbq~̽{/ܽ/W(R~w]wun\lMgJ4)TQKhIC1|=|t%l3LYC;apDaԠ颭r >[IsꤾWFb[8.9JM "ֶ:/=9-FO 2?3Hm)Q AjM-?&qeKoGۧ9vj`ȭJ{Pv̱s?  k%&x-MeI߀](j}UAS]T@m*mp}[U*](i@MSȦɖ[h! :km?|[G* ,VN*6R+՗l aJlrRHF䥾(WLi/=":iZF8[ylmOgBh|p1ھF<#vA溛F?s?4tZ)>3`KGo~:i AmkwpM oy\23nc[2AK] 8)[}ssթ ñuVw.  %kA(^-MC!m5taH)NV5%ƘL y03XyOi̥eOn&w/q}F 2RxLt44MI{4+F#3| >?}!>,<2|~'[),dA}ݍ7]t rB ·vfGiUw$= uLZ,'2y cM}y`zr'tROa6Kw}}CCBsHbݛ]]qnƍRJQ>۲e{ ^vxf/GmmFVyឭT4:d=֮gDts]bL<80m<RUAGV C $۶os=;sɴd*_>M IY۱C2%di}[hⳲG ir=ȻcNw}NXЖIdB(zRxLN\)+SB ֱH2~CX:S/ewcw(LD|!(ݠLfxu{7hz[y~p^zE+賟{N>d4¦MNѝ/",woүlۑ]@"Q 쀘:NI& RS#Ɇ44x UC~⯰@oJ0pLA-zIssdR'Um?RȣBhVቀCN0(Ualmx$tyv!hR6;vp?g?1۶iJCObL4u<C لL(Ž\[2\'gڵyyn: ;u䡿)6CG–_GpPA211|]r%3Ŗ`,K2#)8Vt @zw'p:5&U9"Fqć0Ǯ3!KHi%(tke;pWʌw{384kBR }4>(7ռ=ٜLM"%J%ϊ3x~x6WWϽ<$3"bQǬNM,J\HʏI4c'/L>4sfg@\go_e&N:^:6zE@r0A}_wy{ThL<;n:w5רSw˝|):KY(wڵ:I}{ڙgqu`_lnr{[ߪ VJ'C[&Uc:Vc>OnɽLw0i0Up]_?G-Y[َ~JCN=Ծ]Gwy{_RsAv _',WUn@i!8!p3AĨlɌR+UeK"%_&,u~y Y f_^E:{ؿu¯^i7K80:VϥNF_oud.Zd]}7u\>g >6^Cb[ath.`@O^uva)~;< l3׼aWf V tv=Cx*_+=!IO-S@R~8x`N+}䠲)(dj$Pn) }" [ 7 }K LK$__xs Y).WS7))Z y!-JxI`Or t_#?mRPKk9௮eCG<阰 f'OB {k2Xfy y \NheɳA`N#![홫K 4&x[*\"9K3\Cx`_jZ{4Si@%8A#e+^v)j heL:"*_0;TLI0 iDҭoD*K4OM?"`@}QuxfyF6a侰\+sp|(# ~ü]_ +7:@2 ѕKR^|B]f7iVWP6 m߾]eGqMCx$j)0_QZW)? 5'M)8޶m[KL]ei!|^3ュ⋮Kkv%_5"=XJ> :niPT񽕚IC^t,Os:~'2v8?Z~[K_CDFGRlyv׮]iݷ?KՆqcdi֏ܮLY">-/c턁lBOXNb sO'iM $KI;~/(c\%%)7忌4^(nk.9lґK`c--h+Xv -)O?/i,Tc\x_^OQ !> |'{9ʶ,E~5|X:l09*hŐ㳞,w1hYK~JȋS`’cb>N^-E~ی>vж.e~KVvt8tbvfmɢvtb {>WW(e)[w_c?K`·ptbS8_S~,U 3P2تH;إf.vbv?څyÐ.Z=*( ?vG dqYN9аhęQcL.pEx א"zH7X ޞ7~x\P ]V/Y؁tۉ[!S^D׎/` G;"SZB,E4>vv^_e1y9.fًQ_ 8C?XD oK#}kfϳ.Si)[X,>CBNQGi?mj4㕗ɂ9GQgD>f$v5k'~)\zH-2BCmoER?1Rs u NBҚ票~0E&{ ,>V~fqvLH_B=WC-4}Ƣ 采3q{ e2&! ̑r-n}:ԧ>՝'_')g?:ovwTK /d0O袋Gx /Du])OyA7 GRNbaڝxI2*uA/uDiO{ZJъ<Ǘ wLGx_'[oU'e{K5Kttddu]vޭ/8pa~g6uӟGyD ߅yX#1{WP~?vϙ>[Y2hGGg0a9ѣ.P6mrϐ~Ǧh~YK/ԝuYJ=|r-C.Їec7zTddqùБ:ʽe/Kټy{q <% G#m};ISsۼ/ p z<܀|F={(<j hD~B*@r~Th4;)/$p$ϡL Ɵ%/ܹsWg7!<ȅr >1|'EW?74–-[ܿ*_?qmh|н}sK.a O8F/1K-WWcr}k??n9[g?L>_W''W0f{ɿ ___5yvEGD' g>] ]s5ӟ YNHُ޽{UW]PO+`;p-|SrW_}l5G>w8)]$L`` n@7ިԁ甘E17ȄAy(#쭅~ =?vB2p_@oG~mɣW?N=>@}3>9%i De1c?ڗLħw^׹[*ȃ?pU^ ?ČL/~QLşő(μ(?s?אFksېo^h}p#F"fgq,;wlHgvW4wĽ-oiHgƅHY l_;Tj\ve mlk0ïf5792{ՐAvCf4vڥ22?pCf3bt5/?2kӪq[no|=7ifHj[gԐx5~W~!)kh5~@ W Pz:ѐկ KA\.S)ؐhl}3ioJh #s??jO"T֡ /zы]3~M>dXn]{iG8Vs] d2|hed?5SƟ6IA.Bzy5zhoځސI %K&0*+ Аɩ\d 5%/yIg pfON? ׆,.4deOy>l><6O܍o= x^W2 )f$00iȟY VZd>̟U%Ȳ>w<؂g9NEg "҉ KMx_ BÌuK1 C-Dl,dpN*ҬN#}U⑏}NxǻĮ $~r=)S #ȈUЏ22=F7G}|lUd]|+Jmç5:{_/ȄnIY`W}.&:@ie n&G?y4~NNcl7.ت80/`H˲yLj8Zސ}X4 ghu3(JXivl'-,3UŲ!wc^3Dϖ 2!9ĘsH:%`x~ : 1xo þix'_kti'zJ'o|ý/v|+t[ 2B !GCx.6c 0UhXbD$1u1X`w+PCLG6C-^h\Ȁ yL6!^CK~H$y wq Ǡ:Iduje9]g=t6qO~Շ5'Qx+gzMLCy~}/`:N~~.3g&'d]37E:8UEM؀ڄ Mf.?A1!Rdvɳ6YZ0SA!M2Q#i"?KZpȷ 1j| V-_ְ0"`JCc`Ik|ӮU 84@8ZOj¶A.BAse]peӟ,pbO4n2pl1iNC!ur :"W7g_7wDOD| "vfj>cdjy{omoZHk3L%Μ,A[ #+%) K8\|AF>0CCFY`$A31=C58*U/fDnI>JW:ЎQȇ|D=EVxznd~ktwL: Ncm-pl(ދa:`H1a`uPp1wY.q8ىϘ՟MNJDljxx}.N O;t}2XgVGYC=]`''tm:±0‘:5nؚE>AZu*NO5Nn&PqL`_~J1l(62&faը.:?'Ҧj$C/'Vޱ p~f\d4^l)o9; ^/r 1Emx̀F~2|EYf{LhS,lDx7 H7S09JQd<]?Pe ?f=Xg>Oqm^"='~_wzՅhz pp?gLq@l[qU&`iE &&i.Pa}/2an3҇%еj<.N}Whl~/ ,ͮE|K+e\;Zúl.-v١²]>ӸOK[!܇p~y.A&l`:e[;LeBcepLW/hY2* _Wvϝ]Ӯ㣊]v8gK֠P8 bEa{-W:4Z䐗AWa4QTEpd˭ LL<|t$M;`_giuoyL[~ _@Z/u8f:Ted|Y0Y3Yry6oӏHyKt7h|V Lb?<*z5RFv+˿◪/]\;:txhf|U1^]CuMǽɅ*JqK_ 6[F D D D D D D D D D D N]݂8#t@@@@@@@@@@@-F D D D D D D D D D PqCǢlyw6J J J J J J J J J J ?%%%%%%%%%%$`˫#QQQQQQQQQQ=O+IENDB`bayesplot/man/MCMC-traces.Rd0000644000176200001440000002536614057717550015343 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-traces.R \name{MCMC-traces} \alias{MCMC-traces} \alias{mcmc_trace} \alias{mcmc_trace_highlight} \alias{trace_style_np} \alias{mcmc_rank_overlay} \alias{mcmc_rank_hist} \alias{mcmc_trace_data} \title{Trace plots of MCMC draws} \usage{ mcmc_trace( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, iter1 = 0, window = NULL, size = NULL, np = NULL, np_style = trace_style_np(), divergences = NULL ) mcmc_trace_highlight( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, window = NULL, size = NULL, alpha = 0.2, highlight = 1 ) trace_style_np(div_color = "red", div_size = 0.25, div_alpha = 1) mcmc_rank_overlay( x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), ..., n_bins = 20, ref_line = FALSE ) mcmc_rank_hist( x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_bins = 20, ref_line = FALSE ) mcmc_trace_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., highlight = NULL, n_warmup = 0, iter1 = 0 ) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently ignored.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting.} \item{n_warmup}{An integer; the number of warmup iterations included in \code{x}. The default is \code{n_warmup = 0}, i.e. to assume no warmup iterations are included. If \code{n_warmup > 0} then the background for iterations \code{1:n_warmup} is shaded gray.} \item{iter1}{An integer; the iteration number of the first included draw (default is \code{0}). This can be used to make it more obvious that the warmup iterations have been discarded from the traceplot. It cannot be specified if \code{n_warmup} is also set to a positive value.} \item{window}{An integer vector of length two specifying the limits of a range of iterations to display.} \item{size}{An optional value to override the default line size for \code{mcmc_trace()} or the default point size for \code{mcmc_trace_highlight()}.} \item{np}{For models fit using \link{NUTS} (more generally, any \href{https://en.wikipedia.org/wiki/Symplectic_integrator}{symplectic integrator}), an optional data frame providing NUTS diagnostic information. The data frame should be the object returned by \code{\link[=nuts_params]{nuts_params()}} or one with the same structure. If \code{np} is specified then tick marks are added to the bottom of the trace plot indicating within which iterations there was a divergence (if there were any). See the end of the \strong{Examples} section, below.} \item{np_style}{A call to the \code{trace_style_np()} helper function to specify arguments controlling the appearance of tick marks representing divergences (if the \code{np} argument is specified).} \item{divergences}{Deprecated. Use the \code{np} argument instead.} \item{alpha}{For \code{mcmc_trace_highlight()}, passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the transparency of the points for the chains not highlighted.} \item{highlight}{For \code{mcmc_trace_highlight()}, an integer specifying one of the chains that will be more visible than the others in the plot.} \item{div_color, div_size, div_alpha}{Optional arguments to the \code{trace_style_np()} helper function that are eventually passed to \code{\link[ggplot2:geom_rug]{ggplot2::geom_rug()}} if the \code{np} argument is also specified. They control the color, size, and transparency specifications for showing divergences in the plot. The default values are displayed in the \strong{Usage} section above.} \item{n_bins}{For the rank plots, the number of bins to use for the histogram of rank-normalized MCMC samples. Defaults to \code{20}.} \item{ref_line}{For the rank plots, whether to draw a horizontal line at the average number of ranks per bin. Defaults to \code{FALSE}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. \code{mcmc_trace_data()} returns the data for the trace \emph{and} rank plots in the same data frame. } \description{ Trace plot (or traceplot) of MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_trace()}}{ Standard trace plots of MCMC draws. For models fit using \link{NUTS}, the \code{np} argument can be used to also show divergences on the trace plot. } \item{\code{mcmc_trace_highlight()}}{ Traces are plotted using points rather than lines and the opacity of all chains but one (specified by the \code{highlight} argument) is reduced. } \item{\code{mcmc_rank_hist()}}{ Whereas traditional trace plots visualize how the chains mix over the course of sampling, rank histograms visualize how the values from the chains mix together in terms of ranking. An ideal plot would show the rankings mixing or overlapping in a uniform distribution. See Vehtari et al. (2019) for details. } \item{\code{mcmc_rank_overlay()}}{ Ranks from \code{mcmc_rank_hist()} are plotted using overlaid lines in a single panel. } } } \examples{ # some parameter draws to use for demonstration x <- example_mcmc_draws(chains = 4, params = 6) dim(x) dimnames(x) # trace plots of the betas color_scheme_set("viridis") mcmc_trace(x, regex_pars = "beta") \donttest{ color_scheme_set("viridisA") mcmc_trace(x, regex_pars = "beta") color_scheme_set("viridisC") mcmc_trace(x, regex_pars = "beta") } # mix color schemes color_scheme_set("mix-blue-red") mcmc_trace(x, regex_pars = "beta") # use traditional ggplot discrete color scale mcmc_trace(x, pars = c("alpha", "sigma")) + ggplot2::scale_color_discrete() # zoom in on a window of iterations, increase line size, # add tick marks, move legend to the top, add gray background color_scheme_set("viridisA") mcmc_trace(x[,, 1:4], window = c(100, 130), size = 1) + panel_bg(fill = "gray90", color = NA) + legend_move("top") # Rank-normalized histogram plots. Instead of showing how chains mix over # time, look at how the ranking of MCMC samples mixed between chains. color_scheme_set("viridisE") mcmc_rank_hist(x, "alpha") mcmc_rank_hist(x, pars = c("alpha", "sigma"), ref_line = TRUE) mcmc_rank_overlay(x, "alpha") \dontrun{ # parse facet label text color_scheme_set("purple") p <- mcmc_trace( x, regex_pars = "beta\\\\\[[1,3]\\\\\]", facet_args = list(labeller = ggplot2::label_parsed) ) p + facet_text(size = 15) # mark first 100 draws as warmup mcmc_trace(x, n_warmup = 100) # plot as points, highlighting chain 2 color_scheme_set("brightblue") mcmc_trace_highlight(x, pars = "sigma", highlight = 2, size = 2) # for models fit using HMC/NUTS divergences can be displayed in the trace plot library("rstanarm") fit <- stan_glm(mpg ~ ., data = mtcars, refresh = 0, # next line to keep example fast and also ensure we get some divergences prior = hs(), iter = 400, adapt_delta = 0.8) # extract draws using as.array (instead of as.matrix) to keep # chains separate for trace plot posterior <- as.array(fit) # for stanfit and stanreg objects use nuts_params() to get the divergences mcmc_trace(posterior, pars = "sigma", np = nuts_params(fit)) color_scheme_set("viridis") mcmc_trace( posterior, pars = c("wt", "sigma"), size = 0.5, facet_args = list(nrow = 2), np = nuts_params(fit), np_style = trace_style_np(div_color = "black", div_size = 0.5) ) } } \references{ Vehtari, A., Gelman, A., Simpson, D., Carpenter, B., Bürkner, P. (2019). Rank-normalization, folding, and localization: An improved \emph{R}-hat for assessing convergence of MCMC. \href{https://arxiv.org/abs/1903.08008}{arXiv preprint}. } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}} } \concept{MCMC} bayesplot/man/reexports.Rd0000644000176200001440000000061014057717550015361 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy-params.R \docType{import} \name{reexports} \alias{reexports} \alias{vars} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{dplyr}{\code{\link[dplyr]{vars}}} }} bayesplot/man/PPC-overview.Rd0000644000176200001440000001502714057717550015624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-overview.R \name{PPC-overview} \alias{PPC-overview} \alias{PPC} \title{Graphical posterior predictive checking} \description{ The \strong{bayesplot} PPC module provides various plotting functions for creating graphical displays comparing observed data to simulated data from the posterior (or prior) predictive distribution. See below for a brief discussion of the ideas behind posterior predictive checking, a description of the structure of this package, and tips on providing an interface to \strong{bayesplot} from another package. } \details{ The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. \subsection{Posterior predictive distribution}{ To generate the data used for posterior predictive checks we simulate from the \emph{posterior predictive distribution}. The posterior predictive distribution is the distribution of the outcome variable implied by a model after using the observed data \eqn{y} (a vector of outcome values), and typically predictors \eqn{X}, to update our beliefs about the unknown parameters \eqn{\theta} in the model. For each draw of the parameters \eqn{\theta} from the posterior distribution \eqn{p(\theta \,|\, y, X)}{p(\theta | y, X)} we generate an entire vector of outcomes. The result is an \eqn{S \times N}{S x N} matrix of simulations, where \eqn{S} is the the size of the posterior sample (number of draws from the posterior distribution) and \eqn{N} is the number of data points in \eqn{y}. That is, each row of the matrix is an individual "replicated" dataset of \eqn{N} observations. } \subsection{Notation}{ When simulating from the posterior predictive distribution we can use either the same values of the predictors \eqn{X} that we used when fitting the model or new observations of those predictors. When we use the same values of \eqn{X} we denote the resulting simulations by \eqn{y^{rep}}{yrep} as they can be thought of as \emph{replications} of the outcome \eqn{y} rather than predictions for future observations. This corresponds to the notation from Gelman et. al. (2013) and is the notation used throughout the documentation for this package. } \subsection{Graphical posterior predictive checking}{ Using the datasets \eqn{y^{rep}}{yrep} drawn from the posterior predictive distribution, the functions in the \strong{bayesplot} package produce various graphical displays comparing the observed data \eqn{y} to the replications. For a more thorough discussion of posterior predictive checking see Chapter 6 of Gelman et. al. (2013). } \subsection{Prior predictive checking}{ To use \strong{bayesplot} for \emph{prior} predictive checks you can simply use draws from the prior predictive distribution instead of the posterior predictive distribution. See Gabry et al. (2019) for more on prior predictive checking and when it is reasonable to compare the prior predictive distribution to the observed data. If you want to avoid using the observed data for prior predictive checks, then the \code{y} argument to the PPC plotting functions can be used to provide plausible or implausible \code{y} values that you want to compare to the prior predictive realizations. } } \section{PPC plotting functions}{ The plotting functions for prior and posterior predictive checking are organized into several categories, each with its own documentation: \itemize{ \item \link[=PPC-distributions]{Distributions}: Histograms, kernel density estimates, boxplots, and other plots comparing the empirical distribution of data \code{y} to the distributions of individual simulated datasets (rows) in \code{yrep}. \item \link[=PPC-test-statistics]{Statistics}: The distribution of a statistic, or a pair of statistics, over the simulated datasets (rows) in \code{yrep} compared to value of the statistic(s) computed from \code{y}. \item \link[=PPC-intervals]{Intervals}: Interval estimates of \code{yrep} with \code{y} overlaid. The x-axis variable can be optionally specified by the user (e.g. to plot against a predictor variable or over time). \item \link[=PPC-errors]{Predictive errors}: Plots of predictive errors (\code{y - yrep}) computed from \code{y} and each of the simulated datasets (rows) in \code{yrep}. For binomial models binned error plots are also available. \item \link[=PPC-scatterplots]{Scatterplots}: Scatterplots (and similar visualizations) of the data \code{y} vs. individual simulated datasets (rows) in \code{yrep}, or vs. the average value of the distributions of each data point (columns) in \code{yrep}. \item \link[=PPC-discrete]{Plots for discrete outcomes}: PPC functions that can only be used if \code{y} and \code{yrep} are discrete. For example, rootograms for count outcomes and bar plots for ordinal, categorical, and multinomial outcomes. \item \link[=PPC-loo]{LOO predictive checks}: PPC functions for predictive checks based on (approximate) leave-one-out (LOO) cross-validation. \item \link[=PPC-censoring]{Censored data}: PPC functions comparing the empirical distribution of censored data \code{y} to the distributions of individual simulated datasets (rows) in \code{yrep}. } } \section{Providing an interface for predictive checking from another package}{ In addition to the various plotting functions, the \strong{bayesplot} package provides the S3 generic \code{\link[=pp_check]{pp_check()}}. Authors of \R packages for Bayesian inference are encouraged to define \code{pp_check()} methods for the fitted model objects created by their packages. See the package vignettes for more details and a simple example, and see the \strong{rstanarm} and \strong{brms} packages for full examples of \code{pp_check()} methods. } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/theme_default.Rd0000644000176200001440000000331114057717550016135 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-ggplot-themes.R \name{theme_default} \alias{theme_default} \title{Default \strong{bayesplot} plotting theme} \usage{ theme_default( base_size = getOption("bayesplot.base_size", 12), base_family = getOption("bayesplot.base_family", "serif") ) } \arguments{ \item{base_size, base_family}{Base font size and family (passed to \code{\link[ggplot2:ggtheme]{ggplot2::theme_bw()}}). It is possible to set \code{"bayesplot.base_size"} and \code{"bayesplot.base_family"} via \code{\link[=options]{options()}} to change the defaults, which are \code{12} and \code{"serif"}, respectively.} } \value{ A ggplot \link[ggplot2:theme]{theme} object. } \description{ The \code{\link[=theme_default]{theme_default()}} function returns the default ggplot \link[ggplot2:theme]{theme} used by the \strong{bayesplot} plotting functions. See \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} for details on setting and updating the plotting theme. } \examples{ class(theme_default()) bayesplot_theme_set() # defaults to setting theme_default() x <- example_mcmc_draws() mcmc_hist(x) # change the default font size and family for bayesplots bayesplot_theme_set(theme_default(base_size = 8, base_family = "sans")) mcmc_hist(x) mcmc_areas(x, regex_pars = "beta") # change back bayesplot_theme_set() mcmc_areas(x, regex_pars = "beta") } \seealso{ \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change the ggplot theme. \link{bayesplot-colors} to set or view the color scheme used for plotting. \link{bayesplot-helpers} for a variety of convenience functions, many of which provide shortcuts for tweaking theme elements after creating a plot. } bayesplot/man/PPC-errors.Rd0000644000176200001440000001470514057717550015274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-errors.R \name{PPC-errors} \alias{PPC-errors} \alias{ppc_error_hist} \alias{ppc_error_hist_grouped} \alias{ppc_error_scatter} \alias{ppc_error_scatter_avg} \alias{ppc_error_scatter_avg_vs_x} \alias{ppc_error_binned} \title{PPC errors} \usage{ ppc_error_hist(y, yrep, ..., binwidth = NULL, breaks = NULL, freq = TRUE) ppc_error_hist_grouped( y, yrep, group, ..., binwidth = NULL, breaks = NULL, freq = TRUE ) ppc_error_scatter(y, yrep, ..., size = 2.5, alpha = 0.8) ppc_error_scatter_avg(y, yrep, ..., size = 2.5, alpha = 0.8) ppc_error_scatter_avg_vs_x(y, yrep, x, ..., size = 2.5, alpha = 0.8) ppc_error_binned(y, yrep, ..., bins = NULL, size = 1, alpha = 0.25) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{...}{Currently unused.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} \item{size, alpha}{For scatterplots, arguments passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of the points. For the binned error plot, arguments controlling the size of the outline and opacity of the shaded region indicating the 2-SE bounds.} \item{x}{A numeric vector the same length as \code{y} to use as the x-axis variable.} \item{bins}{For \code{ppc_error_binned()}, the number of bins to use (approximately).} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Various plots of predictive errors \code{y - yrep}. See the \strong{Details} and \strong{Plot Descriptions} sections, below. } \details{ All of these functions (aside from the \verb{*_scatter_avg} functions) compute and plot predictive errors for each row of the matrix \code{yrep}, so it is usually a good idea for \code{yrep} to contain only a small number of draws (rows). See \strong{Examples}, below. For binomial and Bernoulli data the \code{ppc_error_binned()} function can be used to generate binned error plots. Bernoulli data can be input as a vector of 0s and 1s, whereas for binomial data \code{y} and \code{yrep} should contain "success" proportions (not counts). See the \strong{Examples} section, below. } \section{Plot descriptions}{ \describe{ \item{\code{ppc_error_hist()}}{ A separate histogram is plotted for the predictive errors computed from \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should have only a small number of rows. } \item{\code{ppc_error_hist_grouped()}}{ Like \code{ppc_error_hist()}, except errors are computed within levels of a grouping variable. The number of histograms is therefore equal to the product of the number of rows in \code{yrep} and the number of groups (unique values of \code{group}). } \item{\code{ppc_error_scatter()}}{ A separate scatterplot is displayed for \code{y} vs. the predictive errors computed from \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should have only a small number of rows. } \item{\code{ppc_error_scatter_avg()}}{ A single scatterplot of \code{y} vs. the average of the errors computed from \code{y} and each dataset (row) in \code{yrep}. For each individual data point \code{y[n]} the average error is the average of the errors for \code{y[n]} computed over the the draws from the posterior predictive distribution. } \item{\code{ppc_error_scatter_avg_vs_x()}}{ Same as \code{ppc_error_scatter_avg()}, except the average is plotted on the \eqn{y}-axis and a a predictor variable \code{x} is plotted on the \eqn{x}-axis. } \item{\code{ppc_error_binned()}}{ Intended for use with binomial data. A separate binned error plot (similar to \code{arm::binnedplot()}) is generated for each dataset (row) in \code{yrep}. For this plot \code{y} and \code{yrep} should contain proportions rather than counts, and \code{yrep} should have only a small number of rows. } } } \examples{ y <- example_y_data() yrep <- example_yrep_draws() ppc_error_hist(y, yrep[1:3, ]) # errors within groups group <- example_group_data() (p1 <- ppc_error_hist_grouped(y, yrep[1:3, ], group)) p1 + yaxis_text() # defaults to showing counts on y-axis \donttest{ table(group) # more obs in GroupB, can set freq=FALSE to show density on y-axis (p2 <- ppc_error_hist_grouped(y, yrep[1:3, ], group, freq = FALSE)) p2 + yaxis_text() } # scatterplots ppc_error_scatter(y, yrep[10:14, ]) ppc_error_scatter_avg(y, yrep) x <- example_x_data() ppc_error_scatter_avg_vs_x(y, yrep, x) # ppc_error_binned with binomial model from rstanarm \dontrun{ library(rstanarm) example("example_model", package = "rstanarm") formula(example_model) # get observed proportion of "successes" y <- example_model$y # matrix of "success" and "failure" counts trials <- rowSums(y) y_prop <- y[, 1] / trials # proportions # get predicted success proportions yrep <- posterior_predict(example_model) yrep_prop <- sweep(yrep, 2, trials, "/") ppc_error_binned(y_prop, yrep_prop[1:6, ]) } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-intervals.Rd0000644000176200001440000002461014057717550016060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-intervals.R \name{MCMC-intervals} \alias{MCMC-intervals} \alias{mcmc_intervals} \alias{mcmc_areas} \alias{mcmc_areas_ridges} \alias{mcmc_intervals_data} \alias{mcmc_areas_data} \alias{mcmc_areas_ridges_data} \title{Plot interval estimates from MCMC draws} \usage{ mcmc_intervals( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), outer_size = 0.5, inner_size = 2, point_size = 4, rhat = numeric() ) mcmc_areas( x, pars = character(), regex_pars = character(), transformations = list(), ..., area_method = c("equal area", "equal height", "scaled height"), prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_areas_ridges( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_intervals_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), rhat = numeric() ) mcmc_areas_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) mcmc_areas_ridges_data( x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL ) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{pars}{An optional character vector of parameter names. If neither \code{pars} nor \code{regex_pars} is specified then the default is to use \emph{all} parameters. As of version \verb{1.7.0}, \strong{bayesplot} also supports 'tidy' parameter selection by specifying \code{pars = vars(...)}, where \code{...} is specified the same way as in \link[dplyr:select]{dplyr::select(...)} and similar functions. Examples of using \code{pars} in this way can be found on the \link[=tidy-params]{Tidy parameter selection} page.} \item{regex_pars}{An optional \link[base:grep]{regular expression} to use for parameter selection. Can be specified instead of \code{pars} or in addition to \code{pars}. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored since \link[tidyselect:language]{select helpers} perform a similar function.} \item{transformations}{Optionally, transformations to apply to parameters before plotting. If \code{transformations} is a function or a single string naming a function then that function will be used to transform all parameters. To apply transformations to particular parameters, the \code{transformations} argument can be a named list with length equal to the number of parameters to be transformed. Currently only univariate transformations of scalar parameters can be specified (multivariate transformations will be implemented in a future release). If \code{transformations} is a list, the name of each list element should be a parameter name and the content of each list element should be a function (or any item to match as a function via \code{\link[=match.fun]{match.fun()}}, e.g. a string naming a function). If a function is specified by its name as a string (e.g. \code{"log"}), then it can be used to construct a new parameter label for the appropriate parameter (e.g. \code{"log(sigma)"}). If a function itself is specified (e.g. \code{log} or \code{function(x) log(x)}) then \code{"t"} is used in the new parameter label to indicate that the parameter is transformed (e.g. \code{"t(sigma)"}). Note: due to partial argument matching \code{transformations} can be abbreviated for convenience in interactive use (e.g., \code{transform}).} \item{...}{Currently unused.} \item{prob}{The probability mass to include in the inner interval (for \code{mcmc_intervals()}) or in the shaded region (for \code{mcmc_areas()}). The default is \code{0.5} (50\% interval) and \code{1} for \code{mcmc_areas_ridges()}.} \item{prob_outer}{The probability mass to include in the outer interval. The default is \code{0.9} for \code{mcmc_intervals()} (90\% interval) and \code{1} for \code{mcmc_areas()} and for \code{mcmc_areas_ridges()}.} \item{point_est}{The point estimate to show. Either \code{"median"} (the default), \code{"mean"}, or \code{"none"}.} \item{inner_size, outer_size}{For \code{mcmc_intervals()}, the size of the inner and interval segments, respectively.} \item{point_size}{For \code{mcmc_intervals()}, the size of point estimate.} \item{rhat}{An optional numeric vector of R-hat estimates, with one element per parameter included in \code{x}. If \code{rhat} is provided, the intervals/areas and point estimates in the resulting plot are colored based on R-hat value. See \code{\link[=rhat]{rhat()}} for methods for extracting R-hat estimates.} \item{area_method}{How to constrain the areas in \code{mcmc_areas()}. The default is \code{"equal area"}, setting the density curves to have the same area. With \code{"equal height"}, the curves are scaled so that the highest points across the curves are the same height. The method \code{"scaled height"} tries a compromise between to the two: the heights from \code{"equal height"} are scaled using \code{height*sqrt(height)}} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Plot central (quantile-based) posterior interval estimates from MCMC draws. See the \strong{Plot Descriptions} section, below, for details. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_intervals()}}{ Plots of uncertainty intervals computed from posterior draws with all chains merged. } \item{\code{mcmc_areas()}}{ Density plots computed from posterior draws with all chains merged, with uncertainty intervals shown as shaded areas under the curves. } \item{\code{mcmc_areas_ridges()}}{ Density plot, as in \code{mcmc_areas()}, but drawn with overlapping ridgelines. This plot provides a compact display of (hierarchically) related distributions. } } } \examples{ set.seed(9262017) # load ggplot2 to use its functions to modify our plots library(ggplot2) # some parameter draws to use for demonstration x <- example_mcmc_draws(params = 6) dim(x) dimnames(x) color_scheme_set("brightblue") mcmc_intervals(x) mcmc_intervals(x, pars = c("beta[1]", "beta[2]")) mcmc_areas(x, regex_pars = "beta\\\\[[1-3]\\\\]", prob = 0.8) + labs( title = "Posterior distributions", subtitle = "with medians and 80\% intervals" ) color_scheme_set("red") p <- mcmc_areas( x, pars = c("alpha", "beta[4]"), prob = 2/3, prob_outer = 0.9, point_est = "mean" ) plot(p) # control spacing at top and bottom of plot # see ?ggplot2::expansion p + scale_y_discrete( limits = c("beta[4]", "alpha"), expand = expansion(add = c(1, 2)) ) p + scale_y_discrete( limits = c("beta[4]", "alpha"), expand = expansion(add = c(.1, .3)) ) # relabel parameters p + scale_y_discrete( labels = c("alpha" = "param label 1", "beta[4]" = "param label 2") ) # relabel parameters and define the order p + scale_y_discrete( labels = c("alpha" = "param label 1", "beta[4]" = "param label 2"), limits = c("beta[4]", "alpha") ) # color by rhat value color_scheme_set("blue") fake_rhat_values <- c(1, 1.07, 1.3, 1.01, 1.15, 1.005) mcmc_intervals(x, rhat = fake_rhat_values) # get the dataframe that is used in the plotting functions mcmc_intervals_data(x) mcmc_intervals_data(x, rhat = fake_rhat_values) mcmc_areas_data(x, pars = "alpha") color_scheme_set("gray") p <- mcmc_areas(x, pars = c("alpha", "beta[4]"), rhat = c(1, 1.1)) p + legend_move("bottom") p + legend_move("none") # or p + legend_none() # Different area calculations b3 <- c("beta[1]", "beta[2]", "beta[3]") mcmc_areas(x, pars = b3, area_method = "equal area") + labs( title = "Curves have same area", subtitle = "A wide, uncertain interval is spread thin when areas are equal" ) mcmc_areas(x, pars = b3, area_method = "equal height") + labs( title = "Curves have same maximum height", subtitle = "Local curvature is clearer but more uncertain curves use more area" ) mcmc_areas(x, pars = b3, area_method = "scaled height") + labs( title = "Same maximum heights but heights scaled by square-root", subtitle = "Compromise: Local curvature is accentuated and less area is used" ) \donttest{ # apply transformations mcmc_intervals( x, pars = c("beta[2]", "sigma"), transformations = list("sigma" = "log", "beta[2]" = function(x) x + 3) ) # apply same transformation to all selected parameters mcmc_intervals(x, regex_pars = "beta", transformations = "exp") } \dontrun{ # example using fitted model from rstanarm package library(rstanarm) fit <- stan_glm( mpg ~ 0 + wt + factor(cyl), data = mtcars, iter = 500, refresh = 0 ) x <- as.matrix(fit) color_scheme_set("teal") mcmc_intervals(x, point_est = "mean", prob = 0.8, prob_outer = 0.95) mcmc_areas(x, regex_pars = "cyl", bw = "SJ", rhat = rhat(fit, regex_pars = "cyl")) } \dontrun{ # Example of hierarchically related parameters # plotted with ridgelines m <- shinystan::eight_schools@posterior_sample mcmc_areas_ridges(m, pars = "mu", regex_pars = "theta") + ggtitle("Treatment effect on eight schools (Rubin, 1981)") } } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/PPC-censoring.Rd0000644000176200001440000000640014057717550015740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-censoring.R \name{PPC-censoring} \alias{PPC-censoring} \alias{ppc_km_overlay} \title{PPC censoring} \usage{ ppc_km_overlay(y, yrep, ..., status_y, size = 0.25, alpha = 0.7) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{...}{Currently unused.} \item{status_y}{The status indicator for the observations from \code{y}. This must be a numeric vector of the same length as \code{y} with values in \{0, 1\} (0 = right censored, 1 = event).} \item{size, alpha}{Passed to the appropriate geom to control the appearance of the \code{yrep} distributions.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Compare the empirical distribution of censored data \code{y} to the distributions of simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} section, below, for details. Although some of the other \pkg{bayesplot} plots can be used with censored data, \code{ppc_km_overlay()} is currently the only plotting function designed \emph{specifically} for censored data. We encourage you to suggest or contribute additional plots at \href{https://github.com/stan-dev/bayesplot}{github.com/stan-dev/bayesplot}. } \section{Plot Descriptions}{ \describe{ \item{\code{ppc_km_overlay()}}{ Empirical CCDF estimates of each dataset (row) in \code{yrep} are overlaid, with the Kaplan-Meier estimate (Kaplan and Meier, 1958) for \code{y} itself on top (and in a darker shade). This is a PPC suitable for right-censored \code{y}. Note that the replicated data from \code{yrep} is assumed to be uncensored. } } } \examples{ color_scheme_set("brightblue") y <- example_y_data() # For illustrative purposes, (right-)censor values y > 110: status_y <- as.numeric(y <= 110) y <- pmin(y, 110) # In reality, the replicated data (yrep) would be obtained from a # model which takes the censoring of y properly into account. Here, # for illustrative purposes, we simply use example_yrep_draws(): yrep <- example_yrep_draws() dim(yrep) \donttest{ ppc_km_overlay(y, yrep[1:25, ], status_y = status_y) } } \references{ Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) Kaplan, E. L. and Meier, P. (1958). Nonparametric estimation from incomplete observations. \emph{Journal of the American Statistical Association}. 53(282), 457--481. doi:10.1080/01621459.1958.10501452. } \seealso{ Other PPCs: \code{\link{PPC-discrete}}, \code{\link{PPC-distributions}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/bayesplot-colors.Rd0000644000176200001440000001265214057717550016640 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-colors.R \name{bayesplot-colors} \alias{bayesplot-colors} \alias{color_scheme_set} \alias{color_scheme_get} \alias{color_scheme_view} \title{Set, get, or view \strong{bayesplot} color schemes} \usage{ color_scheme_set(scheme = "blue") color_scheme_get(scheme = NULL, i = NULL) color_scheme_view(scheme = NULL) } \arguments{ \item{scheme}{For \code{color_scheme_set()}, either a string naming one of the available color schemes or a character vector of \emph{exactly six} colors specifying a custom scheme. For \code{color_scheme_get()}, \code{scheme} can be missing (to get the current color scheme) or a string naming one of the preset schemes. For \code{color_scheme_view()}, \code{scheme} can be missing (to use the current color scheme) or a character vector containing a subset of the available scheme names. See the \strong{Available color schemes} section below for a list of available scheme names. The \strong{Custom color schemes} section describes how to specify a custom scheme.} \item{i}{For \code{color_scheme_get()}, an optional subset of the integers from \code{1} (lightest) to \code{6} (darkest) indicating which of the colors in the scheme to return. If \code{i} is not specified then all six colors in the scheme are included.} } \value{ \code{color_scheme_set()} has the side effect of setting the color scheme used for plotting. It also returns (\link[base:invisible]{invisibly}) a list of the hexadecimal color values used in \code{scheme}. \code{color_scheme_get()} returns a list of the hexadecimal color values (without changing the current scheme). If the \code{scheme} argument is not specified the returned values correspond to the current color scheme. If the optional argument \code{i} is specified then the returned list only contains \code{length(i)} elements. \code{color_scheme_view()} returns a ggplot object if only a single scheme is specified and a gtable object if multiple schemes names are specified. } \description{ Set, get, or view color schemes. Choose from a preset scheme or create a custom scheme. See the \strong{Available color schemes} section below for a list of available scheme names. The \strong{Custom color schemes} section describes how to specify a custom scheme. } \section{Available color schemes}{ Currently, the available preset color schemes are: \itemize{ \item \code{"blue"}, \code{"brightblue"} \item \code{"gray"}, \code{"darkgray"} \item \code{"green"} \item \code{"pink"} \item \code{"purple"} \item \code{"red"} \item \code{"teal"} \item \code{"yellow"} \item \href{https://CRAN.R-project.org/package=viridis}{\code{"viridis"}}, \code{"viridisA"}, \code{"viridisB"}, \code{"viridisC"}, \code{"viridisD"}, \code{"viridisE"} \item \code{"mix-x-y"}, replacing \code{x} and \code{y} with any two of the scheme names listed above (e.g. "mix-teal-pink", "mix-blue-red", etc.). The order of \code{x} and \code{y} matters, i.e., the color schemes \code{"mix-blue-red"} and \code{"mix-red-blue"} are not identical. There is no guarantee that every possible mixed scheme will look good with every possible plot. \item \code{"brewer-x"}, replacing \code{x} with the name of a palette available from \code{\link[RColorBrewer:ColorBrewer]{RColorBrewer::brewer.pal()}} (e.g., \code{brewer-PuBuGn}). } If you have a suggestion for a new color scheme please let us know via the \strong{bayesplot} \href{https://github.com/stan-dev/bayesplot/issues}{issue tracker}. } \section{Custom color schemes}{ A \strong{bayesplot} color scheme consists of six colors. To specify a custom color scheme simply pass a character vector containing either the names of six \link[grDevices:colors]{colors} or six hexadecimal color values (or a mix of names and hex values). The colors should be in order from lightest to darkest. See the end of the \strong{Examples} section for a demonstration. } \examples{ color_scheme_set("blue") color_scheme_view() color_scheme_get() color_scheme_get(i = c(3, 5)) # 3rd and 5th colors only color_scheme_get("brightblue") color_scheme_view("brightblue") # compare multiple schemes color_scheme_view(c("pink", "gray", "teal")) color_scheme_view(c("viridis", "viridisA", "viridisB", "viridisC")) color_scheme_set("pink") x <- example_mcmc_draws() mcmc_intervals(x) color_scheme_set("teal") color_scheme_view() mcmc_intervals(x) color_scheme_set("red") mcmc_areas(x, regex_pars = "beta") color_scheme_set("purple") color_scheme_view() y <- example_y_data() yrep <- example_yrep_draws() ppc_stat(y, yrep, stat = "mean") + legend_none() ############################ ### Mixing color schemes ### ############################ color_scheme_set("mix-teal-pink") ppc_stat(y, yrep, stat = "sd") + legend_none() mcmc_areas(x, regex_pars = "beta") ########################## ### ColorBrewer scheme ### ########################## color_scheme_set("brewer-Spectral") color_scheme_view() mcmc_trace(x, pars = "sigma") ########################### ### Custom color scheme ### ########################### orange_scheme <- c("#ffebcc", "#ffcc80", "#ffad33", "#e68a00", "#995c00", "#663d00") color_scheme_set(orange_scheme) color_scheme_view() mcmc_areas(x, regex_pars = "alpha") mcmc_dens_overlay(x) ppc_stat(y, yrep, stat = "var") + legend_none() } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot} and \code{\link[=bayesplot_theme_set]{bayesplot_theme_set()}} to change it. } bayesplot/man/PPC-distributions.Rd0000644000176200001440000002207714057717550016663 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppc-distributions.R \name{PPC-distributions} \alias{PPC-distributions} \alias{ppc_data} \alias{ppc_hist} \alias{ppc_boxplot} \alias{ppc_freqpoly} \alias{ppc_freqpoly_grouped} \alias{ppc_dens} \alias{ppc_dens_overlay} \alias{ppc_dens_overlay_grouped} \alias{ppc_ecdf_overlay} \alias{ppc_ecdf_overlay_grouped} \alias{ppc_violin_grouped} \title{PPC distributions} \usage{ ppc_data(y, yrep, group = NULL) ppc_hist(y, yrep, ..., binwidth = NULL, breaks = NULL, freq = TRUE) ppc_boxplot(y, yrep, ..., notch = TRUE, size = 0.5, alpha = 1) ppc_freqpoly( y, yrep, ..., binwidth = NULL, freq = TRUE, size = 0.25, alpha = 1 ) ppc_freqpoly_grouped( y, yrep, group, ..., binwidth = NULL, freq = TRUE, size = 0.25, alpha = 1 ) ppc_dens(y, yrep, ..., trim = FALSE, size = 0.5, alpha = 1) ppc_dens_overlay( y, yrep, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_dens_overlay_grouped( y, yrep, group, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) ppc_ecdf_overlay( y, yrep, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) ppc_ecdf_overlay_grouped( y, yrep, group, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) ppc_violin_grouped( y, yrep, group, ..., probs = c(0.1, 0.5, 0.9), size = 1, alpha = 1, y_draw = c("violin", "points", "both"), y_size = 1, y_alpha = 1, y_jitter = 0.1 ) } \arguments{ \item{y}{A vector of observations. See \strong{Details}.} \item{yrep}{An \eqn{S} by \eqn{N} matrix of draws from the posterior predictive distribution, where \eqn{S} is the size of the posterior sample (or subset of the posterior sample used to generate \code{yrep}) and \eqn{N} is the number of observations (the length of \code{y}). The columns of \code{yrep} should be in the same order as the data points in \code{y} for the plots to make sense. See \strong{Details} for additional instructions.} \item{group}{A grouping variable (a vector or factor) the same length as \code{y}. Each value in \code{group} is interpreted as the group level pertaining to the corresponding value of \code{y}.} \item{...}{Currently unused.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} \item{freq}{For histograms, \code{freq=TRUE} (the default) puts count on the y-axis. Setting \code{freq=FALSE} puts density on the y-axis. (For many plots the y-axis text is off by default. To view the count or density labels on the y-axis see the \code{\link[=yaxis_text]{yaxis_text()}} convenience function.)} \item{notch}{A logical scalar passed to \code{\link[ggplot2:geom_boxplot]{ggplot2::geom_boxplot()}}. Unlike for \code{geom_boxplot()}, the default is \code{notch=TRUE}.} \item{size, alpha}{Passed to the appropriate geom to control the appearance of the \code{yrep} distributions.} \item{trim}{A logical scalar passed to \code{\link[ggplot2:geom_density]{ggplot2::geom_density()}}.} \item{bw, adjust, kernel, n_dens}{Optional arguments passed to \code{\link[stats:density]{stats::density()}} to override default kernel density estimation parameters. \code{n_dens} defaults to \code{1024}.} \item{discrete}{For \code{ppc_ecdf_overlay()}, should the data be treated as discrete? The default is \code{FALSE}, in which case \code{geom="line"} is passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}. If \code{discrete} is set to \code{TRUE} then \code{geom="step"} is used.} \item{pad}{A logical scalar passed to \code{\link[ggplot2:stat_ecdf]{ggplot2::stat_ecdf()}}.} \item{probs}{A numeric vector passed to \code{\link[ggplot2:geom_violin]{ggplot2::geom_violin()}}'s \code{draw_quantiles} argument to specify at which quantiles to draw horizontal lines. Set to \code{NULL} to remove the lines.} \item{y_draw}{For \code{ppc_violin_grouped()}, a string specifying how to draw \code{y}: \code{"violin"} (default), \code{"points"} (jittered points), or \code{"both"}.} \item{y_jitter, y_size, y_alpha}{For \code{ppc_violin_grouped()}, if \code{y_draw} is \code{"points"} or \code{"both"} then \code{y_size}, \code{y_alpha}, and \code{y_jitter} are passed to to the \code{size}, \code{alpha}, and \code{width} arguments of \code{\link[ggplot2:geom_jitter]{ggplot2::geom_jitter()}} to control the appearance of \code{y} points. The default of \code{y_jitter=NULL} will let \strong{ggplot2} determine the amount of jitter.} } \value{ The plotting functions return a ggplot object that can be further customized using the \strong{ggplot2} package. The functions with suffix \verb{_data()} return the data that would have been drawn by the plotting function. } \description{ Compare the empirical distribution of the data \code{y} to the distributions of simulated/replicated data \code{yrep} from the posterior predictive distribution. See the \strong{Plot Descriptions} section, below, for details. } \details{ For Binomial data, the plots will typically be most useful if \code{y} and \code{yrep} contain the "success" proportions (not discrete "success" or "failure" counts). } \section{Plot Descriptions}{ \describe{ \item{\verb{ppc_hist(), ppc_freqpoly(), ppc_dens(), ppc_boxplot()}}{ A separate histogram, shaded frequency polygon, smoothed kernel density estimate, or box and whiskers plot is displayed for \code{y} and each dataset (row) in \code{yrep}. For these plots \code{yrep} should therefore contain only a small number of rows. See the \strong{Examples} section. } \item{\code{ppc_freqpoly_grouped()}}{ A separate frequency polygon is plotted for each level of a grouping variable for \code{y} and each dataset (row) in \code{yrep}. For this plot \code{yrep} should therefore contain only a small number of rows. See the \strong{Examples} section. } \item{\verb{ppc_ecdf_overlay(), ppc_dens_overlay(), ppc_ecdf_overlay_grouped(), ppc_dens_overlay_grouped()}}{ Kernel density or empirical CDF estimates of each dataset (row) in \code{yrep} are overlaid, with the distribution of \code{y} itself on top (and in a darker shade). When using \code{ppc_ecdf_overlay()} with discrete data, set the \code{discrete} argument to \code{TRUE} for better results. For an example of \code{ppc_dens_overlay()} also see Gabry et al. (2019). } \item{\code{ppc_violin_grouped()}}{ The density estimate of \code{yrep} within each level of a grouping variable is plotted as a violin with horizontal lines at notable quantiles. \code{y} is overlaid on the plot either as a violin, points, or both, depending on the \code{y_draw} argument. } } } \examples{ color_scheme_set("brightblue") y <- example_y_data() yrep <- example_yrep_draws() dim(yrep) ppc_dens_overlay(y, yrep[1:25, ]) \donttest{ # ppc_ecdf_overlay with continuous data (set discrete=TRUE if discrete data) ppc_ecdf_overlay(y, yrep[sample(nrow(yrep), 25), ]) } # for ppc_hist,dens,freqpoly,boxplot definitely use a subset yrep rows so # only a few (instead of nrow(yrep)) histograms are plotted ppc_hist(y, yrep[1:8, ]) \donttest{ color_scheme_set("red") ppc_boxplot(y, yrep[1:8, ]) # wizard hat plot color_scheme_set("blue") ppc_dens(y, yrep[200:202, ]) } ppc_freqpoly(y, yrep[1:3,], alpha = 0.1, size = 1, binwidth = 5) # if groups are different sizes then the 'freq' argument can be useful group <- example_group_data() ppc_freqpoly_grouped(y, yrep[1:3,], group) + yaxis_text() \donttest{ ppc_freqpoly_grouped(y, yrep[1:3,], group, freq = FALSE) + yaxis_text() } # density and distribution overlays by group ppc_dens_overlay_grouped(y, yrep[1:25, ], group = group) ppc_ecdf_overlay_grouped(y, yrep[1:25, ], group = group) # don't need to only use small number of rows for ppc_violin_grouped # (as it pools yrep draws within groups) color_scheme_set("gray") ppc_violin_grouped(y, yrep, group, size = 1.5) \donttest{ ppc_violin_grouped(y, yrep, group, alpha = 0) # change how y is drawn ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "points", y_size = 1.5) ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "both", y_size = 1.5, y_alpha = 0.5, y_jitter = 0.33) } } \references{ Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. \emph{J. R. Stat. Soc. A}, 182: 389-402. doi:10.1111/rssa.12378. (\href{https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378}{journal version}, \href{https://arxiv.org/abs/1709.01449}{arXiv preprint}, \href{https://github.com/jgabry/bayes-vis-paper}{code on GitHub}) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). \emph{Bayesian Data Analysis.} Chapman & Hall/CRC Press, London, third edition. (Ch. 6) } \seealso{ Other PPCs: \code{\link{PPC-censoring}}, \code{\link{PPC-discrete}}, \code{\link{PPC-errors}}, \code{\link{PPC-intervals}}, \code{\link{PPC-loo}}, \code{\link{PPC-overview}}, \code{\link{PPC-scatterplots}}, \code{\link{PPC-test-statistics}} } \concept{PPCs} bayesplot/man/MCMC-combos.Rd0000644000176200001440000000624014057717550015332 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-combo.R \name{MCMC-combos} \alias{MCMC-combos} \alias{mcmc_combo} \title{Combination plots} \usage{ mcmc_combo(x, combo = c("dens", "trace"), ..., widths = NULL, gg_theme = NULL) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{combo}{A character vector with at least two elements. Each element of \code{combo} corresponds to a column in the resulting graphic and should be the name of one of the available \link[=MCMC-overview]{MCMC} functions (omitting the \code{mcmc_} prefix).} \item{...}{Arguments passed to the plotting functions named in \code{combo}.} \item{widths}{A numeric vector the same length as \code{combo} specifying relative column widths. For example, if the plot has two columns, then \code{widths = c(2, 1)} will allocate more space for the first column by a factor of 2 (as would \code{widths = c(.3, .15)}, etc.). The default, \code{NULL}, allocates the same horizontal space for each column.} \item{gg_theme}{Unlike most of the other \strong{bayesplot} functions, \code{mcmc_combo} returns a gtable object rather than a ggplot object, and so theme objects can't be added directly to the returned plot object. The \code{gg_theme} argument helps get around this problem by accepting a \strong{ggplot2} \link[ggplot2:theme]{theme} object that is added to each of the plots \emph{before} combining them into the gtable object that is returned. This can be a theme object created by a call to \code{\link[ggplot2:theme]{ggplot2::theme()}} or one of the \strong{bayesplot} convenience functions, e.g. \code{\link[=legend_none]{legend_none()}} (see the \strong{Examples} section, below).} } \value{ A gtable object (the result of calling \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}) with \code{length(combo)} columns and a row for each parameter. } \description{ Combination plots } \examples{ # some parameter draws to use for demonstration x <- example_mcmc_draws() dim(x) dimnames(x) mcmc_combo(x, pars = c("alpha", "sigma")) mcmc_combo(x, pars = c("alpha", "sigma"), widths = c(1, 2)) \donttest{ # change second plot, show log(sigma) instead of sigma, # and remove the legends color_scheme_set("mix-blue-red") mcmc_combo( x, combo = c("dens_overlay", "trace"), pars = c("alpha", "sigma"), transformations = list(sigma = "log"), gg_theme = legend_none() ) # same thing but this time also change the entire ggplot theme mcmc_combo( x, combo = c("dens_overlay", "trace"), pars = c("alpha", "sigma"), transformations = list(sigma = "log"), gg_theme = ggplot2::theme_gray() + legend_none() ) } } \seealso{ Other MCMC: \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-recover}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/bayesplot-helpers.Rd0000644000176200001440000002602214057717550016775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot-helpers.R \name{bayesplot-helpers} \alias{bayesplot-helpers} \alias{vline_at} \alias{hline_at} \alias{vline_0} \alias{hline_0} \alias{abline_01} \alias{lbub} \alias{legend_move} \alias{legend_none} \alias{legend_text} \alias{xaxis_title} \alias{xaxis_text} \alias{xaxis_ticks} \alias{yaxis_title} \alias{yaxis_text} \alias{yaxis_ticks} \alias{facet_text} \alias{facet_bg} \alias{panel_bg} \alias{plot_bg} \alias{grid_lines} \alias{overlay_function} \title{Convenience functions for adding or changing plot details} \usage{ vline_at(v, fun, ..., na.rm = TRUE) hline_at(v, fun, ..., na.rm = TRUE) vline_0(..., na.rm = TRUE) hline_0(..., na.rm = TRUE) abline_01(..., na.rm = TRUE) lbub(p, med = TRUE) legend_move(position = "right") legend_none() legend_text(...) xaxis_title(on = TRUE, ...) xaxis_text(on = TRUE, ...) xaxis_ticks(on = TRUE, ...) yaxis_title(on = TRUE, ...) yaxis_text(on = TRUE, ...) yaxis_ticks(on = TRUE, ...) facet_text(on = TRUE, ...) facet_bg(on = TRUE, ...) panel_bg(on = TRUE, ...) plot_bg(on = TRUE, ...) grid_lines(color = "gray50", size = 0.2) overlay_function(...) } \arguments{ \item{v}{Either a numeric vector specifying the value(s) at which to draw the vertical or horizontal line(s), or an object of any type to use as the first argument to \code{fun}.} \item{fun}{A function, or the name of a function, that returns a numeric vector.} \item{...}{For the various \code{vline_}, \code{hline_}, and \code{abline_} functions, \code{...} is passed to \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}}, \code{\link[ggplot2:geom_abline]{ggplot2::geom_hline()}}, and \code{\link[ggplot2:geom_abline]{ggplot2::geom_abline()}}, respectively, to control the appearance of the line(s). For functions ending in \verb{_bg}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_rect()}}. For functions ending in \verb{_text} or \verb{_title}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_text()}}. For \code{xaxis_ticks} and \code{yaxis_ticks}, \code{...} is passed to \code{\link[ggplot2:element]{ggplot2::element_line()}}. For \code{overlay_function}, \code{...} is passed to \code{\link[ggplot2:geom_function]{ggplot2::stat_function()}}.} \item{na.rm}{A logical scalar passed to the appropriate geom (e.g. \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}}). The default is \code{TRUE}.} \item{p}{The probability mass (in \verb{[0,1]}) to include in the interval.} \item{med}{Should the median also be included in addition to the lower and upper bounds of the interval?} \item{position}{The position of the legend. Either a numeric vector (of length 2) giving the relative coordinates (between 0 and 1) for the legend, or a string among \code{"right"}, \code{"left"}, \code{"top"}, \code{"bottom"}. Using \code{position = "none"} is also allowed and is equivalent to using \code{legend_none()}.} \item{on}{For functions modifying ggplot \link[ggplot2:theme]{theme} elements, set \code{on=FALSE} to set the element to \code{\link[ggplot2:element]{ggplot2::element_blank()}}. For example, facet text can be removed by adding \code{facet_text(on=FALSE)}, or simply \code{facet_text(FALSE)} to a ggplot object. If \code{on=TRUE} (the default), then \code{...} can be used to customize the appearance of the theme element.} \item{color, size}{Passed to \code{\link[ggplot2:element]{ggplot2::element_line()}}.} } \value{ A \strong{ggplot2} layer or \code{\link[ggplot2:theme]{ggplot2::theme()}} object that can be added to existing ggplot objects, like those created by many of the \strong{bayesplot} plotting functions. See the \strong{Details} section. } \description{ Convenience functions for adding to (and changing details of) ggplot objects (many of the objects returned by \strong{bayesplot} functions). See the \strong{Examples} section, below. } \details{ \subsection{Add vertical, horizontal, and diagonal lines to plots}{ \itemize{ \item \code{vline_at()} and \code{hline_at()} return an object created by either \code{\link[ggplot2:geom_abline]{ggplot2::geom_vline()}} or \code{\link[ggplot2:geom_abline]{ggplot2::geom_hline()}} that can be added to a ggplot object to draw a vertical or horizontal line (at one or several values). If \code{fun} is missing then the lines are drawn at the values in \code{v}. If \code{fun} is specified then the lines are drawn at the values returned by \code{fun(v)}. \item \code{vline_0()} and \code{hline_0()} are wrappers for \code{vline_at()} and \code{hline_at()} with \code{v = 0} and \code{fun} missing. \item \code{abline_01()} is a wrapper for \code{\link[ggplot2:geom_abline]{ggplot2::geom_abline()}} with the intercept set to \code{0} and the slope set to \code{1}. \item \code{lbub()} returns a \emph{function} that takes a single argument \code{x} and returns the lower and upper bounds (\code{lb}, \code{ub}) of the \code{100*p}\\% central interval of \code{x}, as well as the median (if \code{med=TRUE}). } } \subsection{Control appearance of facet strips}{ \itemize{ \item \code{facet_text()} returns ggplot2 theme objects that can be added to an existing plot (ggplot object) to format the text in facet strips. \item \code{facet_bg()} can be added to a plot to change the background of the facet strips. } } \subsection{Move legend, remove legend, or style the legend text}{ \itemize{ \item \code{legend_move()} and \code{legend_none()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to change the position of the legend or remove it. \item \code{legend_text()} works much like \code{facet_text()} but for the legend. } } \subsection{Control appearance of \eqn{x}-axis and \eqn{y}-axis features}{ \itemize{ \item \code{xaxis_title()} and \code{yaxis_title()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to toggle or format the titles displayed on the \code{x} or \code{y} axis. (To change the titles themselves use \code{\link[ggplot2:labs]{ggplot2::labs()}}.) \item \code{xaxis_text()} and \code{yaxis_text()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) in order to toggle or format the text displayed on the \code{x} or \code{y} axis (e.g. tick labels). \item \code{xaxis_ticks()} and \code{yaxis_ticks()} return a ggplot2 theme object that can be added to an existing plot (ggplot object) to change the appearance of the axis tick marks. } } \subsection{Customize plot background}{ \itemize{ \item \code{plot_bg()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to format the background of the \emph{entire} plot. \item \code{panel_bg()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to format the background of the just the plotting area. \item \code{grid_lines()} returns a ggplot2 theme object that can be added to an existing plot (ggplot object) to add grid lines to the plot background. } } \subsection{Superimpose a function on an existing plot}{ \itemize{ \item \code{overlay_function()} is a simple wrapper for \code{\link[ggplot2:geom_function]{ggplot2::stat_function()}} but with the \code{inherit.aes} argument fixed to \code{FALSE}. Fixing \code{inherit.aes=FALSE} will avoid potential errors due to the \code{\link[ggplot2:aes]{ggplot2::aes()}}thetic mapping used by certain \strong{bayesplot} plotting functions. } } } \examples{ color_scheme_set("gray") x <- example_mcmc_draws(chains = 1) dim(x) colnames(x) ################################### ### vertical & horizontal lines ### ################################### (p <- mcmc_intervals(x, regex_pars = "beta")) # vertical line at zero (with some optional styling) p + vline_0() p + vline_0(size = 0.25, color = "darkgray", linetype = 2) # vertical line(s) at specified values v <- c(-0.5, 0, 0.5) p + vline_at(v, linetype = 3, size = 0.25) my_lines <- vline_at(v, alpha = 0.25, size = 0.75 * c(1, 2, 1), color = c("maroon", "skyblue", "violet")) p + my_lines \donttest{ # add vertical line(s) at computed values # (three ways of getting lines at column means) color_scheme_set("brightblue") p <- mcmc_intervals(x, regex_pars = "beta") p + vline_at(x[, 3:4], colMeans) p + vline_at(x[, 3:4], "colMeans", color = "darkgray", lty = 2, size = 0.25) p + vline_at(x[, 3:4], function(a) apply(a, 2, mean), color = "orange", size = 2, alpha = 0.1) } # using the lbub function to get interval lower and upper bounds (lb, ub) color_scheme_set("pink") parsed <- ggplot2::label_parsed p2 <- mcmc_hist(x, pars = "beta[1]", binwidth = 1/20, facet_args = list(labeller = parsed)) (p2 <- p2 + facet_text(size = 16)) b1 <- x[, "beta[1]"] p2 + vline_at(b1, fun = lbub(0.8), color = "gray20", size = 2 * c(1,.5,1), alpha = 0.75) p2 + vline_at(b1, lbub(0.8, med = FALSE), color = "gray20", size = 2, alpha = 0.75) ########################## ### format axis titles ### ########################## color_scheme_set("green") y <- example_y_data() yrep <- example_yrep_draws() (p3 <- ppc_stat(y, yrep, stat = "median", binwidth = 1/4)) # turn off the legend, turn on x-axis title p3 + legend_none() + xaxis_title(size = 13, family = "sans") + ggplot2::xlab(expression(italic(T(y)) == median(italic(y)))) ################################ ### format axis & facet text ### ################################ color_scheme_set("gray") p4 <- mcmc_trace(example_mcmc_draws(), pars = c("alpha", "sigma")) myfacets <- facet_bg(fill = "gray30", color = NA) + facet_text(face = "bold", color = "skyblue", size = 14) p4 + myfacets \donttest{ ########################## ### control tick marks ### ########################## p4 + myfacets + yaxis_text(FALSE) + yaxis_ticks(FALSE) + xaxis_ticks(size = 1, color = "skyblue") } ############################## ### change plot background ### ############################## color_scheme_set("blue") # add grid lines ppc_stat(y, yrep) + grid_lines() # panel_bg vs plot_bg ppc_scatter_avg(y, yrep) + panel_bg(fill = "gray90") ppc_scatter_avg(y, yrep) + plot_bg(fill = "gray90") color_scheme_set("yellow") p5 <- ppc_scatter_avg(y, yrep, alpha = 1) p5 + panel_bg(fill = "gray20") + grid_lines(color = "white") \donttest{ color_scheme_set("purple") ppc_dens_overlay(y, yrep[1:30, ]) + legend_text(size = 14) + legend_move(c(0.75, 0.5)) + plot_bg(fill = "gray90") + panel_bg(color = "black", fill = "gray99", size = 3) } ############################################### ### superimpose a function on existing plot ### ############################################### # compare posterior of beta[1] to Gaussian with same posterior mean # and sd as beta[1] x <- example_mcmc_draws(chains = 4) dim(x) purple_gaussian <- overlay_function( fun = dnorm, args = list(mean(x[,, "beta[1]"]), sd(x[,, "beta[1]"])), color = "purple", size = 2 ) color_scheme_set("gray") mcmc_hist(x, pars = "beta[1]") + purple_gaussian \donttest{mcmc_dens(x, pars = "beta[1]") + purple_gaussian} } \seealso{ \code{\link[=theme_default]{theme_default()}} for the default ggplot theme used by \strong{bayesplot}. } bayesplot/man/bayesplot_grid.Rd0000644000176200001440000000543214057717550016344 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayesplot_grid.R \name{bayesplot_grid} \alias{bayesplot_grid} \title{Arrange plots in a grid} \usage{ bayesplot_grid( ..., plots = list(), xlim = NULL, ylim = NULL, grid_args = list(), titles = character(), subtitles = character(), legends = TRUE, save_gg_objects = TRUE ) } \arguments{ \item{...}{One or more ggplot objects.} \item{plots}{A list of ggplot objects. Can be used as an alternative to specifying plot objects via \code{...}.} \item{xlim, ylim}{Optionally, numeric vectors of length 2 specifying lower and upper limits for the axes that will be shared across all plots.} \item{grid_args}{An optional named list of arguments to pass to \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}} (\code{nrow}, \code{ncol}, \code{widths}, etc.).} \item{titles, subtitles}{Optional character vectors of plot titles and subtitles. If specified, \code{titles} and \code{subtitles} must must have length equal to the number of plots specified.} \item{legends}{If any of the plots have legends should they be displayed? Defaults to \code{TRUE}.} \item{save_gg_objects}{If \code{TRUE}, the default, then the ggplot objects specified in \code{...} or via the \code{plots} argument are saved in a list in the \code{"bayesplots"} component of the returned object. Setting this to \code{FALSE} will make the returned object smaller but these individual plot objects will not be available.} } \value{ An object of class \code{"bayesplot_grid"} (essentially a gtable object from \code{\link[gridExtra:arrangeGrob]{gridExtra::arrangeGrob()}}), which has a \code{plot} method. } \description{ The \code{bayesplot_grid} function makes it simple to juxtapose plots using common \eqn{x} and/or \eqn{y} axes. } \examples{ y <- example_y_data() yrep <- example_yrep_draws() stats <- c("sd", "median", "max", "min") color_scheme_set("pink") bayesplot_grid( plots = lapply(stats, function(s) ppc_stat(y, yrep, stat = s)), titles = stats, legends = FALSE, grid_args = list(ncol = 1) ) \dontrun{ library(rstanarm) mtcars$log_mpg <- log(mtcars$mpg) fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) fit2 <- stan_glm(log_mpg ~ wt, data = mtcars, refresh = 0) y <- mtcars$mpg yrep1 <- posterior_predict(fit1, draws = 50) yrep2 <- posterior_predict(fit2, fun = exp, draws = 50) color_scheme_set("blue") ppc1 <- ppc_dens_overlay(y, yrep1) ppc1 ppc1 + yaxis_text() color_scheme_set("red") ppc2 <- ppc_dens_overlay(y, yrep2) bayesplot_grid(ppc1, ppc2) # make sure the plots use the same limits for the axes bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2)) # remove the legends and add text bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2), legends = FALSE, subtitles = rep("Predicted MPG", 2)) } } bayesplot/man/MCMC-recover.Rd0000644000176200001440000001271414057717550015520 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mcmc-recover.R \name{MCMC-recover} \alias{MCMC-recover} \alias{mcmc_recover_intervals} \alias{mcmc_recover_scatter} \alias{mcmc_recover_hist} \title{Compare MCMC estimates to "true" parameter values} \usage{ mcmc_recover_intervals( x, true, batch = rep(1, length(true)), ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), size = 4, alpha = 1 ) mcmc_recover_scatter( x, true, batch = rep(1, length(true)), ..., facet_args = list(), point_est = c("median", "mean"), size = 3, alpha = 1 ) mcmc_recover_hist( x, true, ..., facet_args = list(), binwidth = NULL, breaks = NULL ) } \arguments{ \item{x}{A 3-D array, matrix, list of matrices, or data frame of MCMC draws. The \link{MCMC-overview} page provides details on how to specify each these allowed inputs. It is also possible to use an object with an \code{as.array()} method that returns the same kind of 3-D array described on the \link{MCMC-overview} page.} \item{true}{A numeric vector of "true" values of the parameters in \code{x}. There should be one value in \code{true} for each parameter included in \code{x} and the order of the parameters in \code{true} should be the same as the order of the parameters in \code{x}.} \item{batch}{Optionally, a vector-like object (numeric, character, integer, factor) used to split the parameters into batches. If \code{batch} is specified, it must have the same length as \code{true} and be in the same order as \code{true}. Parameters in the same batch will be grouped together in the same facet in the plot (see the \strong{Examples} section, below). The default is to group all parameters together into a single batch. Changing the default is most useful when parameters are on very different scales, in which case \code{batch} can be used to group them into batches within which it makes sense to use the same y-axis.} \item{...}{Currently unused.} \item{facet_args}{A named list of arguments (other than \code{facets}) passed to \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}} or \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}} to control faceting.} \item{prob}{The probability mass to include in the inner interval. The default is \code{0.5} (50\% interval).} \item{prob_outer}{The probability mass to include in the outer interval. The default is \code{0.9} (90\% interval).} \item{point_est}{The point estimate to show. Either \code{"median"} (the default), \code{"mean"}, or \code{"none"}.} \item{size, alpha}{Passed to \code{\link[ggplot2:geom_point]{ggplot2::geom_point()}} to control the appearance of plotted points.} \item{binwidth}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} to override the default binwidth.} \item{breaks}{Passed to \code{\link[ggplot2:geom_histogram]{ggplot2::geom_histogram()}} as an alternative to \code{binwidth}.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. } \description{ Plots comparing MCMC estimates to "true" parameter values. Before fitting a model to real data it is useful to simulate data according to the model using known (fixed) parameter values and to check that these "true" parameter values are (approximately) recovered by fitting the model to the simulated data. See the \strong{Plot Descriptions} section, below, for details on the available plots. } \section{Plot Descriptions}{ \describe{ \item{\code{mcmc_recover_intervals()}}{ Central intervals and point estimates computed from MCMC draws, with "true" values plotted using a different shape. } \item{\code{mcmc_recover_scatter()}}{ Scatterplot of posterior means (or medians) against "true" values. } \item{\code{mcmc_recover_hist()}}{ Histograms of the draws for each parameter with the "true" value overlaid as a vertical line. } } } \examples{ \dontrun{ library(rstanarm) alpha <- 1; beta <- rnorm(10, 0, 3); sigma <- 2 X <- matrix(rnorm(1000), 100, 10) y <- rnorm(100, mean = c(alpha + X \%*\% beta), sd = sigma) fit <- stan_glm(y ~ ., data = data.frame(y, X), refresh = 0) draws <- as.matrix(fit) print(colnames(draws)) true <- c(alpha, beta, sigma) mcmc_recover_intervals(draws, true) # put the coefficients on X into the same batch mcmc_recover_intervals(draws, true, batch = c(1, rep(2, 10), 1)) # equivalent mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws))) # same but facets stacked vertically mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws)), facet_args = list(ncol = 1), size = 3) # each parameter in its own facet mcmc_recover_intervals(draws, true, batch = 1:ncol(draws)) # same but in a different order mcmc_recover_intervals(draws, true, batch = c(1, 3, 4, 2, 5:12)) # present as bias by centering with true values mcmc_recover_intervals(sweep(draws, 2, true), rep(0, ncol(draws))) + hline_0() # scatterplot of posterior means vs true values mcmc_recover_scatter(draws, true, point_est = "mean") # histograms of parameter draws with true value added as vertical line color_scheme_set("brightblue") mcmc_recover_hist(draws[, 1:4], true[1:4]) } } \seealso{ Other MCMC: \code{\link{MCMC-combos}}, \code{\link{MCMC-diagnostics}}, \code{\link{MCMC-distributions}}, \code{\link{MCMC-intervals}}, \code{\link{MCMC-nuts}}, \code{\link{MCMC-overview}}, \code{\link{MCMC-parcoord}}, \code{\link{MCMC-scatterplots}}, \code{\link{MCMC-traces}} } \concept{MCMC} bayesplot/man/tidy-params.Rd0000644000176200001440000001570214057717550015570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy-params.R \name{tidy-params} \alias{tidy-params} \alias{param_range} \alias{param_glue} \title{Tidy parameter selection} \usage{ param_range(prefix, range, vars = NULL) param_glue(pattern, ..., vars = NULL) } \arguments{ \item{prefix, range}{For \code{param_range()} only, \code{prefix} is a string naming a parameter and \code{range} is an integer vector providing the indices of a subset of elements to select. For example, using\preformatted{ param_range("beta", c(1,2,8)) } would select parameters named \code{beta[1]}, \code{beta[2]}, and \code{beta[8]}. \code{param_range()} is only designed for the case that the indices are integers surrounded by brackets. If there are no brackets use \link[tidyselect:language]{num_range()}.} \item{vars}{\code{NULL} or a character vector of parameter names to choose from. This is only needed for the atypical use case of calling the function as a standalone function outside of \code{vars()}, \code{select()}, etc. Typically this is left as \code{NULL} and will be set automatically for the user.} \item{pattern, ...}{For \code{param_glue()} only, \code{pattern} is a string containing expressions enclosed in braces and \code{...} should be named arguments providing one character vector per expression in braces in \code{pattern}. It is easiest to describe how to use these arguments with an example:\preformatted{param_glue("beta_\{var\}[\{level\}]", var = c("age", "income"), level = c(3,8)) } would select parameters with names \code{"beta_age[3]"}, \code{"beta_income[3]"}, \code{"beta_age[8]"}, \code{"beta_income[8]"}.} } \description{ Parameter selection in the style of \strong{dplyr} and other tidyverse packages. } \details{ As of version \verb{1.7.0}, \strong{bayesplot} allows the \code{pars} argument for \link[=MCMC-overview]{MCMC plots} to use "tidy" variable selection (in the style of the \strong{dplyr} package). The \code{\link[dplyr:vars]{vars()}} function is re-exported from \strong{dplyr} for this purpose. Features of tidy selection includes direct selection (\code{vars(alpha, sigma)}), everything-but selection (\code{vars(-alpha)}), ranged selection (\code{vars(`beta[1]`:`beta[3]`)}), support for selection functions (\code{vars(starts_with("beta"))}), and combinations of these features. See the \strong{Examples} section, below. When using \code{pars} for tidy parameter selection, the \code{regex_pars} argument is ignored because \strong{bayesplot} supports using \link[tidyselect:language]{tidyselect helper functions} (\code{starts_with()}, \code{contains()}, \code{num_range()}, etc.) for the same purpose. \strong{bayesplot} also exports some additional helper functions to help with parameter selection: \itemize{ \item \code{param_range()}: like \code{\link[tidyselect:starts_with]{num_range()}} but used when parameter indexes are in brackets (e.g. \code{beta[2]}). \item \code{param_glue()}: for more complicated parameter names with multiple indexes (including variable names) inside the brackets (e.g., \verb{beta[(Intercept) age_group:3]}). } These functions can be used inside of \code{vars()}, \code{dplyr::select()}, and similar functions, just like the \link[tidyselect:language]{tidyselect helper functions}. } \section{Extra Advice}{ Parameter names in \code{vars()} are not quoted. When the names contain special characters like brackets, they should be wrapped in backticks, as in \code{vars(`beta[1]`)}. To exclude a range of variables, wrap the sequence in parentheses and then negate it. For example, (\code{vars(-(`beta[1]`:`beta[3]`))}) would exclude \code{beta[1]}, \code{beta[2]}, and \code{beta[3]}. \code{vars()} is a helper function. It holds onto the names and expressions used to select columns. When selecting variables inside a \strong{bayesplot} function, use \code{vars(...)}: \code{mcmc_hist(data, pars = vars(alpha))}. When using \code{select()} to prepare a dataframe for a \strong{bayesplot} function, do not use \code{vars()}: \code{data \%>\% select(alpha) \%>\% mcmc_hist()}. Internally, tidy selection works by converting names and expressions into position numbers. As a result, integers will select parameters; \code{vars(1, 3)} selects the first and third ones. We do not endorse this approach because positions might change as variables are added and removed from models. To select a parameter that happens to be called \code{1}, use backticks to escape it \code{vars(`1`)}. } \examples{ x <- example_mcmc_draws(params = 6) dimnames(x) mcmc_hex(x, pars = vars(alpha, `beta[2]`)) mcmc_dens(x, pars = vars(sigma, contains("beta"))) mcmc_hist(x, pars = vars(-contains("beta"))) # using the param_range() helper mcmc_hist(x, pars = vars(param_range("beta", c(1, 3, 4)))) \donttest{ ############################# ## Examples using rstanarm ## ############################# if (requireNamespace("rstanarm", quietly = TRUE)) { # see ?rstanarm::example_model fit <- example("example_model", package = "rstanarm", local=TRUE)$value print(fit) posterior <- as.data.frame(fit) str(posterior) color_scheme_set("brightblue") mcmc_hist(posterior, pars = vars(size, contains("period"))) # same as previous but using dplyr::select() and piping library("dplyr") posterior \%>\% select(size, contains("period")) \%>\% mcmc_hist() mcmc_intervals(posterior, pars = vars(contains("herd"))) mcmc_intervals(posterior, pars = vars(contains("herd"), -contains("Sigma"))) bayesplot_theme_set(ggplot2::theme_dark()) color_scheme_set("viridisC") mcmc_areas_ridges(posterior, pars = vars(starts_with("b["))) bayesplot_theme_set() color_scheme_set("purple") not_789 <- vars(starts_with("b["), -matches("[7-9]")) mcmc_intervals(posterior, pars = not_789) # using the param_glue() helper just_149 <- vars(param_glue("b[(Intercept) herd:{level}]", level = c(1,4,9))) mcmc_intervals(posterior, pars = just_149) # same but using param_glue() with dplyr::select() # before passing to bayesplot posterior \%>\% select(param_glue("b[(Intercept) herd:{level}]", level = c(1, 4, 9))) \%>\% mcmc_intervals() } } \dontrun{ ################################### ## More examples of param_glue() ## ################################### library(dplyr) posterior <- tibble( b_Intercept = rnorm(1000), sd_condition__Intercept = rexp(1000), sigma = rexp(1000), `r_condition[A,Intercept]` = rnorm(1000), `r_condition[B,Intercept]` = rnorm(1000), `r_condition[C,Intercept]` = rnorm(1000), `r_condition[A,Slope]` = rnorm(1000), `r_condition[B,Slope]` = rnorm(1000) ) posterior # using one expression in braces posterior \%>\% select( param_glue("r_condition[{level},Intercept]", level = c("A", "B")) ) \%>\% mcmc_hist() # using multiple expressions in braces posterior \%>\% select( param_glue( "r_condition[{level},{type}]", level = c("A", "B"), type = c("Intercept", "Slope")) ) \%>\% mcmc_hist() } } \seealso{ \code{\link[glue:glue]{glue::glue()}} } bayesplot/man/example-data.Rd0000644000176200001440000000562714057717550015705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/example-data.R \name{example-data} \alias{example-data} \alias{example_mcmc_draws} \alias{example_yrep_draws} \alias{example_y_data} \alias{example_x_data} \alias{example_group_data} \title{Example draws to use in demonstrations and tests} \usage{ example_mcmc_draws(chains = 4, params = 4) example_yrep_draws() example_y_data() example_x_data() example_group_data() } \arguments{ \item{chains}{An integer between 1 and 4 indicating the desired number of chains.} \item{params}{An integer between 1 and 6 indicating the desired number of parameters.} } \value{ See \strong{Details}. } \description{ These functions return various objects containing data used in the examples throughout the \strong{bayesplot} package documentation. } \details{ Each of these functions returns an object containing data, parameter draws, or predictions corresponding to a basic linear regression model with data \code{y} (outcome vector) and \code{X} (predictor matrix), and parameters \code{alpha} (intercept), \code{beta} (coefficient vector), and \code{sigma} (error sd). \describe{ \item{\code{example_mcmc_draws()}}{ If \code{chains > 1}, a \code{250} (iterations) by \code{chains} by \code{params} array or, if \code{chains = 1}, a \code{250} by \code{params} matrix of MCMC draws from the posterior distribution of the parameters in the linear regression model described above. If \code{params = 1} then only the draws for \code{alpha} are included in the returned object. If \code{params >= 2} then draws for \code{sigma} are also included. And if \code{params} is between \code{3} and the maximum of \code{6} then draws for regression coefficients \code{beta[k]} (\code{k} in \code{1:(params-2)}) are also included. } \item{\code{example_y_data()}}{ A numeric vector with \code{434} observations of the outcome variable in the linear regression model. } \item{\code{example_x_data()}}{ A numeric vector with \code{434} observations of one of the predictor variables in the linear regression model. } \item{\code{example_group_data()}}{ A factor variable with \code{434} observations of a grouping variable with two levels. } \item{\code{example_yrep_draws()}}{ A \code{500} (draws) by \code{434} (data points) matrix of draws from the posterior predictive distribution. Each row represents a full dataset drawn from the posterior predictive distribution of the outcome \code{y} after fitting the linear regression model mentioned above. } } } \examples{ draws <- example_mcmc_draws() dim(draws) dimnames(draws) draws <- example_mcmc_draws(1, 2) dim(draws) colnames(draws) draws <- example_mcmc_draws(params = 6) dimnames(draws)[[3]] y <- example_y_data() x <- example_x_data() group <- example_group_data() length(y) length(x) length(group) tail(data.frame(y, x, group), 5) yrep <- example_yrep_draws() dim(yrep) # ncol(yrep) = length(y) = length(x) = length(group) } \keyword{internal} bayesplot/DESCRIPTION0000644000176200001440000000425114061724612013767 0ustar liggesusersPackage: bayesplot Type: Package Title: Plotting for Bayesian Models Version: 1.8.1 Date: 2021-06-13 Authors@R: c(person("Jonah", "Gabry", role = c("aut", "cre"), email = "jsg2201@columbia.edu"), person("Tristan", "Mahr", role = "aut"), person("Paul-Christian", "Bürkner", role = "ctb"), person("Martin", "Modrák", role = "ctb"), person("Malcolm", "Barrett", role = "ctb"), person("Frank", "Weber", role = "ctb"), person("Eduardo", "Coronado Sroka", role = "ctb"), person("Aki", "Vehtari", role = "ctb")) Maintainer: Jonah Gabry Description: Plotting functions for posterior analysis, MCMC diagnostics, prior and posterior predictive checks, and other visualizations to support the applied Bayesian workflow advocated in Gabry, Simpson, Vehtari, Betancourt, and Gelman (2019) . The package is designed not only to provide convenient functionality for users, but also a common set of functions that can be easily used by developers working on a variety of R packages for Bayesian modeling, particularly (but not exclusively) packages interfacing with 'Stan'. License: GPL (>= 3) URL: https://mc-stan.org/bayesplot/ BugReports: https://github.com/stan-dev/bayesplot/issues/ SystemRequirements: pandoc (>= 1.12.3), pandoc-citeproc Depends: R (>= 3.1.0) Imports: dplyr (>= 0.8.0), ggplot2 (>= 3.0.0), ggridges, glue, reshape2, rlang (>= 0.3.0), stats, tibble, tidyselect, utils Suggests: ggfortify, gridExtra (>= 2.2.1), hexbin, knitr (>= 1.16), loo (>= 2.0.0), RColorBrewer, rmarkdown (>= 1.0.0), rstan (>= 2.17.1), rstanarm (>= 2.17.4), rstantools (>= 1.5.0), scales, shinystan (>= 2.3.0), survival, testthat (>= 2.0.0), vdiffr RoxygenNote: 7.1.1 VignetteBuilder: knitr Encoding: UTF-8 NeedsCompilation: no Packaged: 2021-06-13 21:49:23 UTC; ben Author: Jonah Gabry [aut, cre], Tristan Mahr [aut], Paul-Christian Bürkner [ctb], Martin Modrák [ctb], Malcolm Barrett [ctb], Frank Weber [ctb], Eduardo Coronado Sroka [ctb], Aki Vehtari [ctb] Repository: CRAN Date/Publication: 2021-06-14 19:10:02 UTC bayesplot/build/0000755000176200001440000000000014061476543013365 5ustar liggesusersbayesplot/build/vignette.rds0000644000176200001440000000046114061476543015725 0ustar liggesusersQK0dzN7ET!/>_bc>` _C`ӆ4z.z5/3BȘclyLaH ө, eU1*W:+y*xVʷ;Yé(YxCqTC00TKnNP VbrA,]/ b]E-?dZJP@;TP9:= ͏&#L 7 ̄Kx6nGӥ"GU𻠩)Λ ~E= prob is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, prob = 0, prob_outer = 0.5), "prob > 0 is not TRUE", fixed = TRUE ) expect_error( mcmc_recover_intervals(draws, true, prob = .5, prob_outer = 1.1), "prob_outer <= 1 is not TRUE", fixed = TRUE ) }) test_that("mcmc_recover_intervals returns a ggplot object", { skip_if_not_installed("rstanarm") expect_gg(mcmc_recover_intervals(draws, true)) expect_gg(mcmc_recover_intervals(draws, true, batch = c(1, 2, 2, 1), point_est = "mean")) expect_gg(mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws)))) expect_gg(mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws)), facet_args = list(ncol = 1))) }) test_that("mcmc_recover_intervals works when point_est = 'none'", { skip_if_not_installed("rstanarm") a <- mcmc_recover_intervals(draws, true, batch = 1:4, point_est = "none") expect_gg(a) expect_equal(a$data$Point, rep(NA, ncol(draws))) }) test_that("mcmc_recover_scatter returns a ggplot object", { skip_if_not_installed("rstanarm") expect_gg( mcmc_recover_scatter(draws, true) ) expect_gg( mcmc_recover_scatter( draws, true, batch = 1:4, point_est = "mean", facet_args = list(scales = "fixed") ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = c(1, 2, 2, 1), point_est = "mean" ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = grepl("X", colnames(draws)) ) ) expect_gg( mcmc_recover_scatter( draws, true, batch = grepl("X", colnames(draws)), facet_args = list(ncol = 1) ) ) }) test_that("mcmc_recover_hist returns a ggplot object", { skip_if_not_installed("rstanarm") expect_gg(mcmc_recover_hist(draws, true)) expect_gg(mcmc_recover_hist(draws, true, binwidth = .1, facet_args = list(nrow = 1))) }) bayesplot/tests/testthat/test-ppc-loo.R0000644000176200001440000001136314057717550017746 0ustar liggesuserslibrary(bayesplot) context("PPC: loo") options(useFancyQuotes = FALSE) if (requireNamespace("rstanarm", quietly = TRUE) && requireNamespace("loo", quietly = TRUE)) { suppressPackageStartupMessages(library(rstanarm)) suppressPackageStartupMessages(library(loo)) ITER <- 1000 CHAINS <- 3 fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) y <- fit$y yrep <- posterior_predict(fit) suppressWarnings( psis1 <- psis(-log_lik(fit), cores = 2) ) lw <- weights(psis1) suppressWarnings( pits <- rstantools::loo_pit(yrep, y, lw) ) } test_that("ppc_loo_pit gives deprecation warning but still works", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_warning(p1 <- ppc_loo_pit(y, yrep, lw), "deprecated") expect_gg(p1) }) test_that("ppc_loo_pit_overlay returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(p1 <- ppc_loo_pit_overlay(y, yrep, lw, samples = 25)) }) test_that("ppc_loo_pit_overlay works with boundary_correction=TRUE", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_message(p1 <- ppc_loo_pit_overlay(y, yrep, lw, boundary_correction = TRUE), "continuous observations") expect_gg(p1) }) test_that("ppc_loo_pit_overlay works with boundary_correction=FALSE", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") p1 <- ppc_loo_pit_overlay(y, yrep, lw, boundary_correction = FALSE) expect_gg(p1) }) test_that("ppc_loo_pit_qq returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(p1 <- ppc_loo_pit_qq(y, yrep, lw)) expect_equal(p1$labels$x, "Uniform") expect_gg(p2 <- ppc_loo_pit_qq(y, yrep, lw, compare = "normal")) expect_equal(p2$labels$x, "Normal") }) test_that("ppc_loo_pit functions work when pit specified instead of y,yrep,lw", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_pit_qq(pit = pits)) expect_message( ppc_loo_pit_qq(y = y, yrep = yrep, lw = lw, pit = pits), "'pit' specified so ignoring 'y','yrep','lw' if specified" ) expect_gg(ppc_loo_pit_overlay(pit = pits)) expect_message( ppc_loo_pit_overlay(y = y, yrep = yrep, lw = lw, pit = pits), "'pit' specified so ignoring 'y','yrep','lw' if specified" ) }) test_that("ppc_loo_intervals returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_intervals(y, yrep, psis_object = psis1)) expect_gg(g <- ppc_loo_intervals(y, yrep, psis_object = psis1, order = "median")) expect_s3_class(g$data$x, "factor") expect_equal(nlevels(g$data$x), length(g$data$x)) # subset argument expect_gg(g <- ppc_loo_intervals(y, yrep, psis_object = psis1, subset = 1:25)) expect_equal(nrow(g$data), 25) }) test_that("ppc_loo_ribbon returns ggplot object", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_gg(ppc_loo_ribbon(y, yrep, psis_object = psis1, prob = 0.7, alpha = 0.1)) expect_gg(g <- ppc_loo_ribbon(y, yrep, psis_object = psis1, subset = 1:25)) expect_equal(nrow(g$data), 25) }) test_that("ppc_loo_intervals/ribbon work when 'intervals' specified", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") intervals <- t(apply(yrep, 2, quantile, probs = c(0.1, 0.25, 0.5, 0.75, 0.9))) expect_gg(ppc_loo_intervals(y, intervals = intervals)) expect_gg(ppc_loo_ribbon(y, intervals = intervals)) expect_message(ppc_loo_ribbon(y, intervals = intervals), "'intervals' specified so ignoring 'yrep', 'psis_object', 'subset', if specified") expect_message(ppc_loo_intervals(y, yrep, psis_object = psis1, intervals = intervals), "'intervals' specified so ignoring 'yrep', 'psis_object', 'subset', if specified") }) test_that("ppc_loo_intervals/ribbon work when 'intervals' has 3 columns", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") intervals <- t(apply(yrep, 2, quantile, probs = c(0.1, 0.5, 0.9))) expect_gg(ppc_loo_intervals(y, intervals = intervals)) expect_gg(ppc_loo_ribbon(y, intervals = intervals)) }) test_that("errors if dimensions of yrep and lw don't match", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_error( ppc_loo_pit_overlay(y, yrep, lw[, 1:5]), "identical(dim(yrep), dim(lw)) is not TRUE", fixed = TRUE ) }) test_that("error if subset is bigger than num obs", { skip_if_not_installed("rstanarm") skip_if_not_installed("loo") expect_error(.psis_subset(psis1, 1:1000), "too many elements") expect_error( ppc_loo_intervals(y, yrep, psis_object = psis1, subset = 1:1000), "length(y) >= length(subset) is not TRUE", fixed = TRUE ) }) bayesplot/tests/testthat/test-mcmc-diagnostics.R0000644000176200001440000001113114057717550021612 0ustar liggesuserslibrary(bayesplot) context("MCMC: diagnostics") source(test_path("data-for-mcmc-tests.R")) test_that("rhat and neff plots return a ggplot object", { rhat <- runif(100, 1, 1.5) expect_gg(mcmc_rhat(rhat)) expect_gg(mcmc_rhat_hist(rhat)) ratio <- runif(100, 0, 1) expect_gg(mcmc_neff(ratio)) expect_gg(mcmc_neff_hist(ratio)) # 1-D array ok expect_gg(mcmc_rhat(array(rhat))) expect_gg(mcmc_rhat_hist(array(rhat))) expect_gg(mcmc_neff(array(ratio))) expect_gg(mcmc_neff_hist(array(ratio))) # named ok rhat <- setNames(runif(5, 1, 1.5), paste0("alpha[", 1:5, "]")) expect_gg(mcmc_rhat(rhat)) }) test_that("rhat and neff plot functions throw correct errors & warnings", { # need vector or 1D array expect_error(mcmc_rhat_hist(cbind(1:2)), "is.array") expect_error(mcmc_neff_hist(list(1,2)), "is.numeric") # need positive rhat values expect_error(mcmc_rhat(c(-1, 1, 1)), "must be positive") # need ratios between 0 and 1 expect_error(mcmc_neff(c(-1, 0.5, 0.7)), "must be positive") # drop NAs and warn expect_warning(mcmc_rhat(c(1, 1, NA)), "Dropped 1 NAs") expect_warning(mcmc_neff(c(0.2, NA, 1, NA)), "Dropped 2 NAs") }) test_that("duplicated rhats and neffs are kept (#105)", { # https://github.com/stan-dev/bayesplot/issues/105 rhats <- runif(3, 1, 1.2) rhats <- c(rhats, rhats, rhats) df <- mcmc_rhat_data(rhats) expect_equal(nrow(df), length(rhats)) ratios <- runif(3, 0, 1) ratios <- c(ratios, ratios, ratios) df <- mcmc_neff_data(ratios) expect_equal(nrow(df), length(ratios)) }) test_that("'description' & 'rating' columns are correct (#176)", { # https://github.com/stan-dev/bayesplot/issues/176 rhats <- c(1, 1.07, 1.19, 1.07, 1.3, 1) expected_rhats <- sort(rhats) expected_ratings <- rep(c("low", "ok", "high"), each = 2) expected_descriptions <- rep(c("hat(R) <= 1.05", "hat(R) <= 1.1", "hat(R) > 1.1"), each = 2) df <- mcmc_rhat_data(rhats) expect_equal(df$value, expected_rhats) expect_equal(as.character(df$rating), expected_ratings) expect_equal(df$description, expected_descriptions) ratios <- c(0.4, 0.05, 0.6) expected_ratios <- sort(ratios) expected_ratings <- c("low", "ok", "high") expected_descriptions <- c("N[eff]/N <= 0.1", "N[eff]/N <= 0.5", "N[eff]/N > 0.5") df <- mcmc_neff_data(ratios) expect_equal(df$value, expected_ratios) expect_equal(as.character(df$rating), expected_ratings) expect_equal(df$description, expected_descriptions) }) test_that("mcmc_acf & mcmc_acf_bar return a ggplot object", { expect_gg(mcmc_acf(arr, pars = "beta[1]", regex_pars = "x\\:[2,5]")) expect_gg(mcmc_acf_bar(arr, pars = "beta[1]", regex_pars = "x\\:[2,5]")) expect_gg(mcmc_acf(arr1chain, regex_pars = "beta")) expect_gg(mcmc_acf_bar(arr1chain, regex_pars = "beta")) for (x in c("arr", "mat", "dframe", "dframe_multiple_chains", "arr1", "mat1", "dframe1")) { xx <- get(x) expect_gg(mcmc_acf(xx)) expect_gg(mcmc_acf_bar(xx)) } }) test_that("mcmc_acf & mcmc_acf_bar throw correct errors", { expect_error(mcmc_acf(arr, regex_pars = "beta", lags = 200), regexp = "Too few iterations for lags=200") }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_rhat renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rhats <- seq(from = 1, to = 1.20, length.out = 10) p_base <- mcmc_rhat(rhats) vdiffr::expect_doppelganger("mcmc_rhat (default)", p_base) p_size <- mcmc_rhat(rhats, size = 3) vdiffr::expect_doppelganger("mcmc_rhat (sized)", p_size) }) test_that("mcmc_rhat_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rhats <- seq(from = 1, to = 1.20, length.out = 10) p_base <- mcmc_rhat_hist(rhats) vdiffr::expect_doppelganger("mcmc_rhat_hist (default)", p_base) p_binwidth <- mcmc_rhat_hist(rhats, binwidth = .02) vdiffr::expect_doppelganger("mcmc_rhat_hist (binwidth)", p_binwidth) }) test_that("mcmc_neff renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") neffs <- seq(from = 0, to = 1, length.out = 20) p_base <- mcmc_neff(neffs) vdiffr::expect_doppelganger("mcmc_neff (default)", p_base) }) test_that("mcmc_neff_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") neffs <- seq(from = 0, to = 1, length.out = 20) p_base <- mcmc_neff_hist(neffs) vdiffr::expect_doppelganger("mcmc_neff_hist (default)", p_base) p_binwidth <- mcmc_neff_hist(neffs, binwidth = .05) vdiffr::expect_doppelganger("mcmc_neff_hist (binwidth)", p_binwidth) }) bayesplot/tests/testthat/test-helpers-ppc.R0000644000176200001440000000625214057717550020620 0ustar liggesuserslibrary(bayesplot) context("PPC: misc. functions") source(test_path("data-for-ppc-tests.R")) # melt_yrep --------------------------------------------------------------- expect_molten_yrep <- function(yrep) { y <- rnorm(ncol(yrep)) yrep <- validate_yrep(yrep, y) x <- melt_yrep(yrep) expect_equal(ncol(x), 4) expect_equal(nrow(x), prod(dim(yrep))) rep_nums <- rep(seq_len(nrow(yrep)), length(y)) obs_nums <- sort(rep(seq_len(length(y)), nrow(yrep))) expect_identical(colnames(x), c("y_id", "rep_id", "rep_label", "value")) expect_equal(x$y_id, obs_nums) expect_equal(x$rep_id, rep_nums) expect_s3_class(x, "data.frame") expect_s3_class(x$rep_label, "factor") expect_type(x$rep_id, "integer") expect_type(x$y_id, "integer") expect_type(x$value, "double") } test_that("melt_yrep returns correct structure", { expect_molten_yrep(yrep) expect_molten_yrep(yrep2) load(test_path("data-for-binomial.rda")) expect_molten_yrep(Ey) expect_molten_yrep(validate_yrep(yrep, y)) }) # melt_and_stack ---------------------------------------------------------- test_that("melt_and_stack returns correct structure", { molten_yrep <- melt_yrep(yrep) d <- melt_and_stack(y, yrep) expect_s3_class(d, "data.frame") expect_equal(nrow(d), nrow(molten_yrep) + length(y)) sorted_names <- sort(c(colnames(molten_yrep), c("is_y", "is_y_label"))) expect_equal(sort(colnames(d)), sorted_names) }) # ppc_group_data ---------------------------------------------------------- d <- ppc_group_data(y, yrep, group) d_stat <- ppc_group_data(y, yrep, group, stat = "mean") test_that("ppc_group_data returns correct structure", { expect_identical(colnames(d), c("group", "variable", "value")) expect_s3_class(d, c("grouped_df", "tbl_df", "tbl", "data.frame")) expect_identical(colnames(d_stat), colnames(d)) expect_s3_class(d, c("grouped_df", "tbl_df", "tbl", "data.frame")) nr <- length(unique(d$variable)) * length(unique(group)) expect_equal(nrow(d_stat), nr) }) test_that("ppc_group_data with stat returns correct values for y", { for (lev in levels(group)) { mean_y_group <- with(d_stat, value[group == lev & variable == "y"]) expect_equal(mean_y_group, mean(y[group == lev]), info = paste("group =", lev)) } }) test_that("ppc_group_data with stat returns correct values for yrep", { for (lev in levels(group)) { for (j in 1:nrow(yrep)) { var <- paste0("yrep_", j) mean_yrep_group <- with(d_stat, value[group == lev & variable == var]) expect_equal(mean_yrep_group, mean(yrep[j, group == lev]), info = paste("group =", lev, "|", "rep =", j)) } } }) # is_whole_number, all_counts -------------------------------------------- test_that("is_whole_number works correctly", { expect_equal(is_whole_number(c(1L, 2, 3/3, 4/5)), c(rep(TRUE, 3), FALSE)) expect_true(!is_whole_number("1")) }) test_that("all_counts works correctly", { expect_true(all_counts(1)) expect_true(all_counts(0:5)) expect_true(all_counts(matrix(rpois(10, 1), 2, 5))) expect_false(all_counts(rnorm(5))) expect_false(all_counts(c("1", "2"))) expect_false(all_counts(c(1, 1.5))) expect_false(all_counts(c(-1, 2))) }) bayesplot/tests/testthat/test-pp_check.R0000644000176200001440000000201714057717550020145 0ustar liggesuserslibrary(bayesplot) context("PPC: pp_check generic and default method") test_that("default pp_check method works", { y <- example_y_data() yrep <- example_yrep_draws() g <- example_group_data() expect_equal( pp_check(y, yrep[1:50, ], ppc_dens_overlay), ppc_dens_overlay(y, yrep[1:50, ]), check.environment = FALSE ) expect_equal( pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median"), ppc_stat_grouped(y, yrep, group = g, stat = "median"), check.environment = FALSE ) }) test_that("pp_check method can be defined", { pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { y <- object[["y"]] yrep <- object[["yrep"]] switch(match.arg(type), multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), overlaid = ppc_dens_overlay(y, yrep) ) } x <- structure( list(y = rnorm(50), yrep = matrix(rnorm(500), ncol = 50)), class = "foo" ) expect_gg(pp_check(x)) expect_gg(pp_check(x, type = "overlaid")) }) bayesplot/tests/testthat/test-mcmc-scatter-and-parcoord.R0000644000176200001440000002761714057717550023337 0ustar liggesuserslibrary(bayesplot) context("MCMC: scatter, hex, and parallel coordinates plots") source(test_path("data-for-mcmc-tests.R")) if (requireNamespace("rstanarm", quietly = TRUE)) { suppressPackageStartupMessages(library(rstanarm)) # also fit an rstanarm model to use with mcmc_pairs fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, chains = 2, refresh = 0) post <- as.array(fit) lp <- log_posterior(fit) np <- ensure_divergences(nuts_params(fit)) } # mcmc_scatter/hex -------------------------------------------------------- test_that("mcmc_scatter returns a ggplot object", { expect_gg(mcmc_scatter(arr, pars = c("beta[1]", "beta[2]"))) expect_gg(mcmc_scatter(arr1chain, regex_pars = "beta", size = 3, alpha = 0.5)) expect_gg(mcmc_scatter(mat, pars = c("sigma", "(Intercept)"))) expect_gg(mcmc_scatter(dframe, regex_pars = "x:[2,4]")) expect_gg(mcmc_scatter(dframe_multiple_chains, pars = c("sigma", "(Intercept)"))) }) test_that("mcmc_scatter throws error if number of parameters is not 2", { expect_error(mcmc_scatter(arr, pars = c("sigma", "beta[1]", "beta[2]")), "exactly 2 parameters") expect_error(mcmc_scatter(arr, pars = "sigma"), "exactly 2 parameters") expect_error(mcmc_scatter(arr1), "exactly 2 parameters") expect_error(mcmc_scatter(mat1), "exactly 2 parameters") }) test_that("mcmc_scatter accepts NUTS info", { skip_if_not_installed("rstanarm") expect_gg(mcmc_scatter(post, pars = c("wt", "sigma"), np = np)) div_style <- scatter_style_np(div_color = "orange", div_size = 2, div_shape = 3, div_alpha = 0.5) g <- mcmc_scatter(post, pars = c("wt", "sigma"), np = np, np_style = div_style) expect_gg(g) expect_named(g$data, c("x", "y", "Divergent")) }) test_that("mcmc_hex returns a ggplot object", { skip_if_not_installed("hexbin") expect_gg(mcmc_hex(arr, pars = c("beta[1]", "beta[2]"))) expect_gg(mcmc_hex(arr1chain, regex_pars = "beta", binwidth = c(.5,.5))) }) test_that("mcmc_hex throws error if number of parameters is not 2", { skip_if_not_installed("hexbin") expect_error(mcmc_hex(arr, pars = c("sigma", "beta[1]", "beta[2]")), "exactly 2 parameters") expect_error(mcmc_hex(arr, pars = "sigma"), "exactly 2 parameters") expect_error(mcmc_hex(arr1), "exactly 2 parameters") expect_error(mcmc_hex(mat1), "exactly 2 parameters") }) # mcmc_pairs ------------------------------------------------------------- test_that("mcmc_pairs returns a bayesplot_grid object", { g <- mcmc_pairs(arr, pars = c("(Intercept)", "sigma")) expect_bayesplot_grid(g) expect_equal(print(g), plot(g)) expect_bayesplot_grid(mcmc_pairs(arr, pars = "sigma", regex_pars = "beta")) expect_bayesplot_grid(mcmc_pairs(arr, regex_pars = "x:[1-3]", transformations = "exp", diag_fun = "dens", off_diag_fun = "hex", diag_args = list(trim = FALSE), off_diag_args = list(binwidth = c(0.5, 0.5)))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(arr1chain, regex_pars = "beta"))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(mat, pars = c("(Intercept)", "sigma")))) expect_bayesplot_grid(suppressWarnings(mcmc_pairs(dframe, pars = c("(Intercept)", "sigma")))) expect_bayesplot_grid(mcmc_pairs(dframe_multiple_chains, regex_pars = "beta")) }) test_that("no mcmc_pairs non-NUTS 'condition's fail", { expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(chains = list(1, 2:4))) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(draws = rep(c(T,F), length.out = prod(dim(arr)[1:2])))) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(draws = 1/3)) ) expect_bayesplot_grid( mcmc_pairs(arr, pars = "sigma", regex_pars = "beta", condition = pairs_condition(chains = c(1,3))) ) }) test_that("mcmc_pairs works with NUTS info", { skip_if_not_installed("rstanarm") expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am", "sigma"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts="energy__"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts="divergent__"), np = np)) expect_bayesplot_grid(mcmc_pairs(post, pars = c("wt", "am"), condition = pairs_condition(nuts = "lp__"), lp=lp, np = np, max_treedepth = 2)) p <- mcmc_pairs( post, pars = c("wt", "am"), off_diag_fun = "hex", condition = pairs_condition(nuts = "lp__"), lp = lp, np = np, np_style = pairs_style_np(div_color = "firebrick", td_color = "dodgerblue", div_size = 2, td_size = 2), max_treedepth = with(np, max(Value[Parameter == "treedepth__"]) - 1) ) expect_bayesplot_grid(p) }) test_that("mcmc_pairs throws correct warnings and errors", { skip_if_not_installed("rstanarm") expect_warning(mcmc_pairs(arr1chain, regex_pars = "beta"), "This plot is more useful with multiple chains") expect_error(mcmc_pairs(arr, pars = "sigma"), "requires at least two parameters") expect_error( mcmc_pairs(arr, condition = pairs_condition(draws = c(T, F))), "length(condition) == (n_iter * n_chain) is not TRUE", fixed = TRUE ) expect_error( mcmc_pairs(arr, condition = pairs_condition(nuts = "accept_stat__")), "the 'np' argument to 'mcmc_pairs' must also be specified" ) expect_error( mcmc_pairs(arr, condition = pairs_condition(nuts = "lp__")), "the 'lp' argument to 'mcmc_pairs' must also be specified" ) expect_error( mcmc_pairs(arr, condition = "lp__"), 'inherits(condition, "pairs_condition") is not TRUE', fixed = TRUE ) expect_error( mcmc_pairs(post, pars = c("wt", "am"), max_treedepth = 2, np = np, np_style = list(color = "green")), 'inherits(np_style, "nuts_style") is not TRUE', fixed = TRUE ) post2 <- post post2[,1:2,"wt"] <- 0 expect_warning( mcmc_pairs(post2, pars = c("wt", "am", "sigma")), "parameters were dropped because they are constant: wt" ) post[,, "sigma"] <- post[,, "am"] expect_warning( mcmc_pairs(post, pars = c("wt", "sigma", "am")), "parameters were dropped because they are duplicative: am" ) }) # pairs_style_np ------------------------------------------------------- test_that("pairs_style_np returns correct structure", { style <- pairs_style_np(div_size = 3, td_color = "gray", td_shape = 1) expect_s3_class(style, "nuts_style") expect_named(style, c("color", "shape", "size", "alpha"), ignore.order = TRUE) expect_named(style$color, c("div", "td")) expect_named(style$size, c("div", "td")) expect_named(style$shape, c("div", "td")) expect_named(style$alpha, c("div", "td")) }) test_that("pairs_style_np throws correct errors", { expect_error( pairs_style_np(div_size = "3"), "is.numeric(div_size) is not TRUE", fixed = TRUE ) expect_error( pairs_style_np(td_color = 1), "is.character(td_color) is not TRUE", fixed = TRUE ) }) # pairs_condition --------------------------------------------------------- test_that("pairs_condition returns correct structure", { # default cond0 <- pairs_condition() expect_s3_class(cond0, "pairs_condition") expect_equivalent(unclass(cond0), list()) expect_equal(attr(cond0, "type"), "default") # chains cond1 <- pairs_condition(chains = 1:4) expect_s3_class(cond1, "integer") expect_s3_class(cond1, "pairs_condition") expect_equivalent(unclass(cond1), 1:4) expect_equal(attr(cond1, "type"), "chain_vector") cond2 <- pairs_condition(chains = list(1:4, 5:6)) expect_s3_class(cond2, "list") expect_s3_class(cond2, "pairs_condition") expect_equivalent(unclass(cond2), list(upper=1:4, lower=5:6)) expect_equal(attr(cond2, "type"), "chain_list") # draws cond3 <- pairs_condition(draws = 0.7) expect_s3_class(cond3, "numeric") expect_s3_class(cond3, "pairs_condition") expect_equivalent(unclass(cond3), 0.7) expect_equal(attr(cond3, "type"), "draws_proportion") cond4 <- pairs_condition(draws = c(T, F, T)) expect_s3_class(cond4, "logical") expect_s3_class(cond4, "pairs_condition") expect_equivalent(unclass(cond4), c(T, F, T)) expect_equal(attr(cond4, "type"), "draws_selection") # nuts cond5 <- pairs_condition(nuts = "lp__") expect_s3_class(cond5, "character") expect_s3_class(cond5, "pairs_condition") expect_equivalent(unclass(cond5), "lp__") expect_equal(attr(cond5, "type"), "nuts") }) test_that("pairs_condition throws correct errors", { # chain expect_error( pairs_condition(chains = "abc"), "must be an integer vector or a list of two integer vectors" ) expect_error( pairs_condition(chains = list(1:2, 3:4, 5:6)), "length(chains) == 2 is not TRUE", fixed = TRUE ) expect_error( pairs_condition(chains = list(1:2, 2:3)), "Each chain can only be specified once" ) expect_error( pairs_condition(chains = c(1:3, 2)), "Each chain can only be specified once" ) # draws expect_error( pairs_condition(draws = "abc"), "must be a single proportion or a logical vector" ) expect_error( pairs_condition(draws = 2), "draws > 0 && draws < 1 is not TRUE", fixed = TRUE ) # nuts expect_error( pairs_condition(nuts = 2), "must be a single string" ) expect_error( pairs_condition(nuts = c("lp__", "energy__")), "must be a single string" ) expect_error( pairs_condition(nuts = "step_size__"), "stepsize__" ) }) test_that("pairs_condition message if multiple args specified", { options(useFancyQuotes = FALSE) expect_message( pairs_condition(chains = 2, draws = 0.5, nuts = "lp__"), "because they are superseded by 'chains': 'draws', 'nuts'", fixed = TRUE ) expect_message( pairs_condition(chains = 2, nuts = "lp__"), "because they are superseded by 'chains': 'nuts'", fixed = TRUE ) expect_message( pairs_condition(draws = 0.5, nuts = "lp__"), "because they are superseded by 'draws': 'nuts'", fixed = TRUE ) }) # mcmc_parcoord ----------------------------------------------------------- test_that("mcmc_parcoord returns a ggplot object", { expect_gg(mcmc_parcoord(arr, pars = c("(Intercept)", "sigma"))) expect_gg(mcmc_parcoord(arr, pars = "sigma", regex_pars = "beta")) }) test_that("mcmc_parcoord with nuts info returns a ggplot object", { skip_if_not_installed("rstanarm") expect_gg(mcmc_parcoord(post, pars = c("wt", "am", "sigma"), np = np)) }) test_that("mcmc_parcoord throws correct warnings and errors", { skip_if_not_installed("rstanarm") expect_error(mcmc_parcoord(arr, pars = "sigma"), "requires at least two parameters") expect_error( mcmc_parcoord(post, np = np[, -1]), "NUTS parameter data frame must have columns: Chain, Iteration, Parameter, Value", fixed = TRUE ) expect_error( mcmc_parcoord(post, np = np, np_style = list(div_color = "green")), 'inherits(np_style, "nuts_style") is not TRUE', fixed = TRUE ) }) # parcoord_style_np ------------------------------------------------------- test_that("parcoord_style_np returns correct structure", { style <- parcoord_style_np() expect_s3_class(style, "nuts_style") expect_named(style, c("color", "alpha", "size"), ignore.order = TRUE) expect_named(style$color, c("div")) expect_named(style$size, c("div")) expect_named(style$alpha, c("div")) }) test_that("parcoord_style_np throws correct errors", { expect_error( parcoord_style_np(div_size = "3"), "is.numeric(div_size) is not TRUE", fixed = TRUE ) expect_error( parcoord_style_np(td_color = 1), "unused argument (td_color = 1)", fixed = TRUE ) }) bayesplot/tests/testthat/test-ppc-input-validation.R0000644000176200001440000000500014057717550022433 0ustar liggesuserslibrary(bayesplot) context("PPC: input validation") source(test_path("data-for-ppc-tests.R")) # validating y ------------------------------------------------------------ test_that("validate_y works", { expect_identical(validate_y(y), y) expect_identical(validate_y(as.array(y)), y) expect_identical(validate_y(y2), y2) names(y) <- paste0("y", 1:length(y)) expect_identical(validate_y(y), unname(y)) }) test_that("validate_y throws errors", { expect_error(validate_y(yrep), "vector") expect_error(validate_y(as.array(yrep)), "vector or 1D array") expect_error(validate_y(LETTERS), "numeric") expect_error(validate_y(c(y, NA)), "NAs not allowed") }) # validating yrep ---------------------------------------------------------- test_that("validate_yrep works", { expect_identical(validate_yrep(yrep, y), yrep) expect_equal(validate_yrep(yrep2, y2), yrep2) colnames(yrep) <- paste0("yrep", 1:ncol(yrep)) expect_identical(validate_yrep(yrep, y), unname(yrep)) }) test_that("validate_yrep throws errors", { expect_error(validate_yrep(as.matrix(LETTERS), y), "numeric") expect_error(validate_yrep(rbind(yrep, NA), y), "NAs not allowed") expect_error(validate_yrep(y, y), "matrix") expect_error(validate_yrep(yrep2, y), "must be equal to") expect_error(validate_yrep(yrep, y2), "must be equal to ") }) # validating group -------------------------------------------------------- test_that("validate_group works", { expect_identical(validate_group(1:3, y = 1:3), as.factor(1:3)) expect_identical(validate_group(as.numeric(1:3), y = 4:6), as.factor(1:3)) expect_identical(validate_group(group, y), group) expect_identical(validate_group(letters[1:3], y = 1:3), factor(letters[1:3])) }) test_that("validate_group throws errors", { expect_error(validate_group(array(1:3), y = 1:3), "vector") expect_error(validate_group(c(1,2,NA), y = 1:3), "NAs not allowed") expect_error(validate_group(1:4, y = 1:3), "must be equal to") }) # validating x -------------------------------------------------------- test_that("validate_x works", { x <- rnorm(3) expect_identical(validate_x(x, y = 1:3), x) expect_identical(validate_x(array(x), y = rnorm(3)), x) expect_identical(validate_x(y = rnorm(3)), 1:3) names(x) <- letters[1:3] expect_identical(validate_x(x, y = 1:3), unname(x)) }) test_that("validate_x throws errors", { expect_error(validate_x(factor(1:3), y = 1:3), "numeric") expect_error(validate_x(c(1,2,NA), y = 1:3), "NAs not allowed") expect_error(validate_x(1:4, y = 1:3), "must be equal to") }) bayesplot/tests/testthat/test-helpers-mcmc.R0000644000176200001440000002677014057717550020764 0ustar liggesuserslibrary(bayesplot) context("MCMC: misc. functions") source(test_path("data-for-mcmc-tests.R")) # melt_mcmc ---------------------------------------------------------------- test_that("melt_mcmc does not convert integer parameter names to integers #162", { mat2 <- mat[, 1:2] colnames(mat2) <- c("1", "2") long_mat <- melt_mcmc(mat2) expect_s3_class(long_mat$Parameter, "factor") arr2 <- arr[, , 1:2] dimnames(arr2)[[3]] <- c("1", "2") long_arr <- melt_mcmc(prepare_mcmc_array(arr2)) expect_s3_class(long_arr$Parameter, "factor") dframe2 <- dframe[, 1:2] colnames(dframe2) <- c("1", "2") long_df <- melt_mcmc(as.matrix(dframe2)) expect_s3_class(long_df$Parameter, "factor") }) # 3-D array helpers -------------------------------------------------------- test_that("is_mcmc_array works", { expect_false(is_mcmc_array(mat)) expect_false(is_mcmc_array(dframe)) expect_false(is_mcmc_array(dframe_multiple_chains)) expect_false(is_mcmc_array(arr)) arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_mcmc_array(arr2) }) test_that("parameter_names works", { x <- example_mcmc_draws() expect_identical(parameter_names(x), dimnames(x)[[3]]) dimnames(x) <- list(a = NULL, b = NULL, c = letters[1:dim(x)[3]]) expect_identical(parameter_names(x), dimnames(x)[[3]]) dimnames(x) <- NULL expect_error(parameter_names(x), "No parameter names found") expect_error(parameter_names(x[, 1, ]), "No parameter names found") }) test_that("has_multiple_chains works", { expect_error(has_multiple_chains(mat), "is_3d_array") expect_error(has_multiple_chains(dframe_multiple_chains), "is_3d_array") expect_error(has_multiple_chains(chainlist), "is_3d_array") expect_true(has_multiple_chains(arr)) arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_true(has_multiple_chains(arr2)) arr1chain2 <- set_mcmc_dimnames(arr1chain, parnames = dimnames(arr1chain)[[3]]) expect_false(has_multiple_chains(arr1chain2)) }) test_that("has_multiple_params works", { expect_error(has_multiple_params(mat), "is_3d_array") expect_error(has_multiple_params(dframe_multiple_chains), "is_3d_array") expect_true(has_multiple_params(arr), "is_3d_array") arr2 <- set_mcmc_dimnames(arr, parnames = dimnames(arr)[[3]]) expect_true(has_multiple_params(arr2)) arr2 <- arr2[, , 3, drop = FALSE] expect_false(has_multiple_params(arr2)) }) # data frame with ‘chain’ variable ---------------------------------------- test_that("is_df_with_chain works", { expect_false(is_df_with_chain(arr)) expect_false(is_df_with_chain(mat)) expect_false(is_df_with_chain(chainlist)) expect_false(is_df_with_chain(dframe)) expect_true(is_df_with_chain(dframe_multiple_chains)) mat2 <- cbind(mat, chain = dframe_multiple_chains$chain) expect_false(is_df_with_chain(mat2)) dframe_multiple_chains2 <- cbind(dframe_multiple_chains, Chain = dframe_multiple_chains$chain) dframe_multiple_chains2$chain <- NULL expect_true(is_df_with_chain(dframe_multiple_chains2)) }) test_that("validate_df_with_chain works", { expect_error(validate_df_with_chain(mat), "is_df_with_chain") dframe_multiple_chains2 <- cbind(dframe_multiple_chains, Chain = dframe_multiple_chains$chain) dframe_multiple_chains2$chain <- NULL expect_identical(validate_df_with_chain(dframe_multiple_chains), dframe_multiple_chains2) dframe_multiple_chains2$Chain <- factor(dframe_multiple_chains2$Chain, labels = letters[1:4]) a <- validate_df_with_chain(dframe_multiple_chains2) expect_type(a$Chain, "integer") # no warning raised when using tibbles (#160) tbl <- tibble::tibble(parameter=rnorm(n=40), Chain=rep(1:4, each=10)) a <- validate_df_with_chain(tbl) expect_type(a$Chain, "integer") }) test_that("df_with_chain2array works", { a <- df_with_chain2array(dframe_multiple_chains) expect_mcmc_array(a) expect_error(df_with_chain2array(dframe), "is_df_with_chain") }) # list of chains ---------------------------------------------------------- test_that("is_chain_list works", { expect_false(is_chain_list(arr)) expect_false(is_chain_list(mat)) expect_false(is_chain_list(dframe)) expect_false(is_chain_list(dframe_multiple_chains)) expect_true(is_chain_list(chainlist)) expect_true(is_chain_list(chainlist1)) expect_true(is_chain_list(chainlist1chain)) }) test_that("validate_chain_list works", { expect_identical(validate_chain_list(chainlist), chainlist) expect_identical(validate_chain_list(chainlist1), chainlist1) expect_identical(validate_chain_list(chainlist1chain), chainlist1chain) chainlist2 <- chainlist colnames(chainlist2[[1]]) <- colnames(chainlist[[1]]) colnames(chainlist2[[1]])[1] <- "AAA" expect_error(validate_chain_list(chainlist2), "parameters for each chain") chainlist3 <- chainlist colnames(chainlist3[[1]]) <- c("", colnames(chainlist[[1]])[-1]) expect_error(validate_chain_list(chainlist3), "Some parameters are missing names") chainlist[[1]] <- chainlist[[1]][-1, ] expect_error(validate_chain_list(chainlist), "Each chain should have the same number of iterations") }) test_that("chain_list2array works", { expect_mcmc_array(chain_list2array(chainlist)) expect_mcmc_array(chain_list2array(chainlist1)) expect_mcmc_array(chain_list2array(chainlist1chain)) }) # transformations --------------------------------------------------------- test_that("validate_transformations throws correct works", { trans <- list(x = "exp", 'beta[1]' = function(x) x^2, sigma = log) expect_silent( validate_transformations(trans, pars = c("x", "beta[1]", "sigma")) ) trans2 <- trans trans2[[1]] <- match.fun(trans[[1]]) expect_equal( validate_transformations(trans, pars = c("x", "beta[1]", "sigma")), trans2 ) }) test_that("validate_transformations throws correct errors", { expect_error( validate_transformations(list("log", exp)), "must be a _named_ list" ) expect_error( validate_transformations(list(x = "log", function(x) x^2)), "Each element of 'transformations' must have a name" ) expect_error( validate_transformations(list(x = "log", 'beta[2]' = exp), pars = c("x", "beta[1]")), regexp = "don't match parameter names: beta[2]", fixed = TRUE ) }) test_that("apply_transformations works", { trans <- list('beta[1]' = "exp", sigma = function(x) x^2) arr_trans <- apply_transformations(arr, trans) expect_equal(arr_trans[,, "sigma"], arr[,, "sigma"]^2) expect_equal(arr_trans[,, "beta[1]"], exp(arr[,, "beta[1]"])) mat_trans <- apply_transformations(mat, trans) expect_equal(mat_trans[, "sigma"], mat[, "sigma"]^2) expect_equal(mat_trans[, "beta[1]"], exp(mat[, "beta[1]"])) }) test_that("transformations recycled properly if not a named list", { # if transformations is a single string naming a function x <- prepare_mcmc_array(arr, regex_pars = "beta", transformations = "exp") expect_identical(parameter_names(x), c("exp(beta[1])", "exp(beta[2])")) # if transformations is a single function x <- prepare_mcmc_array(arr, pars = c("beta[1]", "sigma"), transformations = exp) expect_identical(parameter_names(x), c("t(beta[1])", "t(sigma)")) }) # prepare_mcmc_array ------------------------------------------------------ test_that("prepare_mcmc_array errors if NAs", { arr[1,1,1] <- NA expect_error(prepare_mcmc_array(arr), "NAs not allowed") }) test_that("prepare_mcmc_array processes non-array input types correctly", { # errors are mostly covered by tests of the many internal functions above # data frame with no Chain column (treat as 1 chain or merged chains) a1 <- prepare_mcmc_array(dframe) expect_s3_class(a1, "mcmc_array") expect_equal(dim(a1), c(nrow(dframe), 1, ncol(dframe))) expect_equal(parameter_names(a1), colnames(dframe)) # data frame with Chain column a2 <- prepare_mcmc_array(dframe_multiple_chains) expect_s3_class(a2, "mcmc_array") n_chain <- max(dframe_multiple_chains$chain) expect_equal(dim(a2), c(nrow(dframe) / n_chain, n_chain, ncol(dframe))) expect_equal(parameter_names(a2), colnames(dframe)) # list of matrices with multiple chains a3 <- prepare_mcmc_array(chainlist) expect_s3_class(a3, "mcmc_array") expect_equal(dim(a3), c(nrow(chainlist[[1]]), length(chainlist), ncol(chainlist[[1]]))) expect_equal(parameter_names(a3), colnames(chainlist[[1]])) # object with acceptable as.array method if (requireNamespace("rstanarm", quietly = TRUE)) { fit <- suppressWarnings(rstanarm::stan_glm(mpg ~ wt, data = mtcars, chains = 2, iter = 500, refresh = 0)) a4 <- prepare_mcmc_array(fit) expect_s3_class(a4, "mcmc_array") expect_equal(a4, prepare_mcmc_array(as.array(fit))) expect_equal(dim(a4), c(250, 2, 3)) expect_equal(parameter_names(a4), c("(Intercept)", "wt", "sigma")) } # object with unacceptable as.array method fit2 <- lm(mpg ~ wt, data = mtcars) expect_error(prepare_mcmc_array(fit2), "Arrays should have 2 or 3 dimensions.") }) test_that("prepare_mcmc_array tidy parameter selection is same as traditional selection", { pars_all <- c( "(Intercept)", "beta[1]", "beta[2]", "sigma", "b[(Intercept) XX:1]", "b[(Intercept) XX:2]", "b[(Intercept) XX:3]", "b[(Intercept) ZZ:1]", "b[(Intercept) ZZ:2]", "b[(Intercept) ZZ:3]" ) colnames(mat) <- pars_all # check easier parameters pars_char_1 <- c("(Intercept)", "beta[1]", "beta[2]", "sigma") pars_tidy_1a <- vars(`(Intercept)`, `beta[1]`, `beta[2]`, sigma) pars_tidy_1b <- vars(`(Intercept)`, contains("beta"), sigma) pars_tidy_1c <- vars("(Intercept)", param_range("beta", 1:2), "sigma") expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1a), prepare_mcmc_array(mat, pars = pars_char_1)) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1b), prepare_mcmc_array(mat, pars = pars_char_1)) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_1c), prepare_mcmc_array(mat, pars = pars_char_1)) # check multilevel parameters pars_char_2 <- c("b[(Intercept) XX:1]", "b[(Intercept) ZZ:1]", "b[(Intercept) XX:3]", "b[(Intercept) ZZ:3]") pars_tidy_2a <- vars(param_glue("b[(Intercept) {var}:{lev}]", var = c("XX", "ZZ"), lev = c(1, 3))) expect_identical(prepare_mcmc_array(mat, pars = pars_tidy_2a), prepare_mcmc_array(mat, pars = pars_char_2)) }) test_that("tidy parameter selection throws correct errors", { expect_error(mcmc_hist(mat, pars = vars(contains("nonsense"))), "No parameters were found matching those names") expect_error(param_range("alpha", 1:3, vars = list("a", "b", "c")), "'vars' must be NULL or a character vector.") expect_error(param_glue("alpha[{lev}]", lev = 1:3, vars = 1:3, "'vars' must be NULL or a character vector.")) }) # rhat and neff helpers --------------------------------------------------- test_that("diagnostic_factor.rhat works", { rhats <- new_rhat(c(low = 0.99, low = 1, low = 1.01, ok = 1.06, ok = 1.09, ok = 1.1, high = 1.2, high = 1.7)) r <- diagnostic_factor(unname(rhats)) expect_equivalent(r, as.factor(names(rhats))) expect_identical(levels(r), c("low", "ok", "high")) }) test_that("diagnostic_factor.neff_ratio works", { ratios <- new_neff_ratio(c(low = 0.05, low = 0.01, ok = 0.2, ok = 0.49, high = 0.51, high = 0.99, high = 1)) r <- diagnostic_factor(unname(ratios)) expect_equivalent(r, as.factor(names(ratios))) expect_identical(levels(r), c("low", "ok", "high")) }) bayesplot/tests/testthat/test-ppc-scatterplots.R0000644000176200001440000000464114057717550021705 0ustar liggesuserslibrary(bayesplot) context("PPC: scatterplots") source(test_path("data-for-ppc-tests.R")) test_that("ppc_scatter returns ggplot object", { expect_gg(ppc_scatter(y, yrep[1,, drop = FALSE])) expect_gg(ppc_scatter(y, yrep[1:3, ])) expect_gg(ppc_scatter(y2, yrep2)) }) test_that("ppc_scatter_avg returns ggplot object", { expect_gg(ppc_scatter_avg(y, yrep)) expect_gg(ppc_scatter_avg(y2, yrep2)) }) test_that("ppc_scatter_avg same as ppc_scatter if nrow(yrep) = 1", { expect_equal( ppc_scatter_avg(y2, yrep2), ppc_scatter(y2, yrep2), check.environment = FALSE ) expect_equal( ppc_scatter_avg(y, yrep[1,, drop=FALSE]), ppc_scatter(y, yrep[1,, drop = FALSE]), check.environment = FALSE ) }) test_that("ppc_scatter_avg_grouped returns a ggplot object", { expect_gg(ppc_scatter_avg_grouped(y, yrep, group)) expect_gg(ppc_scatter_avg_grouped(y, yrep, as.numeric(group))) expect_gg(ppc_scatter_avg_grouped(y, yrep, as.integer(group))) }) # Visual tests ------------------------------------------------------------ test_that("ppc_scatter renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter(vdiff_y, vdiff_yrep[1:6, ]) vdiffr::expect_doppelganger("ppc_scatter (default)", p_base) p_custom <- ppc_scatter( y = vdiff_y, yrep = vdiff_yrep[1:6, ], size = 1, alpha = 1 ) vdiffr::expect_doppelganger( title = "ppc_scatter (size, alpha)", fig = p_custom) }) test_that("ppc_scatter_avg renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter_avg(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_scatter_avg (default)", p_base) p_custom <- ppc_scatter_avg( y = vdiff_y, yrep = vdiff_yrep, size = 1.5, alpha = .5 ) vdiffr::expect_doppelganger( title = "ppc_scatter_avg (size, alpha)", fig = p_custom) }) test_that("ppc_scatter_avg_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_scatter_avg_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_scatter_avg_grouped (default)", p_base) p_custom <- ppc_scatter_avg_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, size = 3, alpha = 0.25 ) vdiffr::expect_doppelganger( title = "ppc_scatter_avg_grouped (size, alpha)", fig = p_custom) }) bayesplot/tests/testthat/test-mcmc-nuts.R0000644000176200001440000000522514057717550020303 0ustar liggesuserslibrary(bayesplot) context("MCMC: nuts") if (requireNamespace("rstanarm", quietly = TRUE)) { ITER <- 1000 CHAINS <- 3 fit <- rstanarm::stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) np <- nuts_params(fit) lp <- log_posterior(fit) } test_that("all mcmc_nuts_* (except energy) return gtable objects", { skip_if_not_installed("rstanarm") expect_gtable(mcmc_nuts_acceptance(np, lp)) expect_gtable(mcmc_nuts_acceptance(np, lp, chain = CHAINS)) expect_gtable(mcmc_nuts_treedepth(np, lp)) expect_gtable(mcmc_nuts_treedepth(np, lp, chain = CHAINS)) expect_gtable(mcmc_nuts_stepsize(np, lp)) expect_gtable(mcmc_nuts_stepsize(np, lp, chain = CHAINS)) np <- ensure_divergences(np) expect_gtable(mcmc_nuts_divergence(np, lp)) expect_gtable(mcmc_nuts_divergence(np, lp, chain = CHAINS)) }) test_that("all mcmc_nuts_* (except energy) error if chain argument is bad", { skip_if_not_installed("rstanarm") funs <- c("acceptance", "divergence", "treedepth", "stepsize") for (f in paste0("mcmc_nuts_", funs)) { expect_error(do.call(f, list(x=np, lp=lp, chain = CHAINS + 1)), regexp = paste("only", CHAINS, "chains found"), info = f) expect_error(do.call(f, list(x=np, lp=lp, chain = 0)), regexp = "chain >= 1", info = f) } }) test_that("mcmc_nuts_energy returns a ggplot object", { skip_if_not_installed("rstanarm") p <- mcmc_nuts_energy(np) expect_gg(p) expect_s3_class(p$facet, "FacetWrap") expect_equal(names(p$facet$params$facets), "Chain") p <- mcmc_nuts_energy(np, merge_chains = TRUE) expect_gg(p) expect_s3_class(p$facet, "FacetNull") }) test_that("mcmc_nuts_energy throws correct warnings", { skip_if_not_installed("rstanarm") expect_warning(mcmc_nuts_energy(np, chain = 1), "ignored: chain") }) test_that("validate_nuts_data_frame throws errors", { skip_if_not_installed("rstanarm") expect_error( validate_nuts_data_frame(list(Iteration = 1, Chain = 1)), "NUTS parameters should be in a data frame" ) expect_error( validate_nuts_data_frame(data.frame(Iteration = 1, apple = 2)), "NUTS parameter data frame must have columns: Chain, Iteration, Parameter, Value" ) expect_error( validate_nuts_data_frame(np, as.matrix(lp)), "lp should be in a data frame" ) lp2 <- lp colnames(lp2)[3] <- "Chains" expect_error( validate_nuts_data_frame(np, lp2), "lp data frame must have columns: Chain, Iteration, Value" ) lp2 <- subset(lp, Chain %in% 1:2) expect_error( validate_nuts_data_frame(np, lp2), "Number of chains" ) }) bayesplot/tests/testthat/test-mcmc-intervals.R0000644000176200001440000002136314057717550021322 0ustar liggesuserslibrary(bayesplot) context("MCMC: intervals") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_intervals_data computes quantiles", { xs <- melt_mcmc(merge_chains(prepare_mcmc_array(arr, pars = "beta[1]"))) d <- mcmc_intervals_data(arr, pars = "beta[1]", prob = .3, prob_outer = .5) qs <- unlist(d[, c("ll", "l", "m", "h", "hh")]) by_hand <- quantile(xs$Value, c(.25, .35, .5, .65, .75)) expect_equivalent(qs, by_hand) expect_equal(d$parameter, factor("beta[1]")) expect_equal(d$outer_width, .5) expect_equal(d$inner_width, .3) expect_equal(d$point_est, "median") d2 <- mcmc_areas_data(arr, pars = "beta[1]", prob = .3, prob_outer = .5) sets <- split(d2, d2$interval) expect_equal(range(sets$inner$x), c(d$l, d$h)) expect_equal(range(sets$outer$x), c(d$ll, d$hh)) }) test_that("mcmc_intervals_data computes point estimates", { xs <- melt_mcmc(merge_chains(prepare_mcmc_array(arr, pars = "beta[2]"))) d <- mcmc_intervals_data(arr, pars = "beta[2]", prob = .3, prob_outer = .5, point_est = "mean") expect_equivalent(d$m, mean(xs$Value)) expect_equal(d$parameter, factor("beta[2]")) expect_equal(d$point_est, "mean") d <- mcmc_intervals_data(arr, pars = "(Intercept)", prob = .3, prob_outer = .5, point_est = "none") expect_true(!("m" %in% names(d))) expect_equal(d$point_est, "none") }) test_that("mcmc_intervals returns a ggplot object", { expect_gg(mcmc_intervals(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_intervals(arr1chain, pars = "beta[1]", regex_pars = "Intercept")) expect_gg(mcmc_intervals(mat, regex_pars = "beta")) expect_gg(mcmc_intervals(dframe)) expect_gg(mcmc_intervals(dframe_multiple_chains)) expect_gg(mcmc_intervals(arr1)) expect_gg(mcmc_intervals(mat1)) expect_gg(mcmc_intervals(dframe1)) }) test_that("mcmc_areas returns a ggplot object", { expect_gg(mcmc_areas(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_areas(arr1chain, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_areas(mat)) expect_gg(mcmc_areas(dframe)) expect_gg(mcmc_areas(dframe_multiple_chains)) expect_gg(mcmc_areas(arr1)) expect_gg(mcmc_areas(mat1)) expect_gg(mcmc_areas(dframe1)) }) test_that("mcmc_areas_ridges returns a ggplot object", { expect_gg(mcmc_areas_ridges(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_areas_ridges(arr1chain, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_areas_ridges(mat)) expect_gg(mcmc_areas_ridges(dframe)) expect_gg(mcmc_areas_ridges(dframe_multiple_chains)) expect_gg(mcmc_areas_ridges(arr1)) expect_gg(mcmc_areas_ridges(mat1)) expect_gg(mcmc_areas_ridges(dframe1)) }) test_that("mcmc_intervals/areas with rhat", { r <- runif(ncol(mat), 0.9, 1.3) rbad <- c(NA, r[-1]) expect_error(mcmc_intervals(arr, rhat = r[-1]), "'rhat' has length") expect_error(expect_warning(mcmc_intervals(arr, rhat = rbad))) expect_gg(g <- mcmc_intervals(arr, rhat = r)) if (utils::packageVersion("ggplot2") >= "3.0.0") { rhat_map <- g$layers[[3]][["mapping"]] expect_identical(rlang::as_name(rhat_map[["colour"]]), "rhat_rating") } # areas with rhat. # layer 1 is maybe line vertical line. [skip] # layer 2 is inner interval. expect_gg(g2 <- mcmc_areas(arr, rhat = r)) if (utils::packageVersion("ggplot2") >= "3.0.0") { rhat_map2 <- g2$layers[[2]][["mapping"]] expect_identical(rlang::as_name(rhat_map2$fill), "rhat_rating") expect_identical(rlang::as_name(rhat_map2$colour), "rhat_rating") # layer 3 is point estimate. manually colored. [skip] # layer 4 is outer interval. rhat_map4 <- g2$layers[[4]][["mapping"]] expect_identical(rlang::as_name(rhat_map4$colour), "rhat_rating") # layer 5 is bottom line. rhat_map5 <- g2$layers[[5]][["mapping"]] expect_identical(rlang::as_name(rhat_map5$colour), "rhat_rating") } }) test_that("mcmc_areas_data computes density", { areas_data <- mcmc_areas_data(arr, point_est = "none") areas_data <- areas_data[areas_data$interval_width == 1, ] by_parameter <- split(areas_data, areas_data$parameter) # Manually compute the same raw_values <- melt_mcmc(merge_chains(prepare_mcmc_array(arr))) raw_values <- split(raw_values, interaction(raw_values$Parameter)) do_dens <- function(df, interval_width, n) { x <- df$Value tail_width <- (1 - interval_width) / 2 qs <- quantile(x, probs = c(tail_width, 1 - tail_width)) dens <- density(x = x, from = min(qs), to = max(qs), n = n) data.frame(Parameter = unique(df$Parameter), x = dens$x, y = dens$y) } densities <- lapply(raw_values, do_dens, 1, 1024) for (name in names(by_parameter)) { expect_equivalent(by_parameter[[name]][["density"]], densities[[name]][["y"]]) } }) test_that("compute_column_density can use density options (#118)", { # n_dens affects the number of rows in the return data-frame areas_data <- mcmc_areas_data(arr, point_est = "none", n_dens = 100) pars <- length(unique(areas_data$parameter)) intervals <- length(unique(areas_data$interval)) expect_equal(nrow(areas_data), 100 * intervals * pars) # If these raise errors, they are being evaluated expect_error(mcmc_areas_data(arr, bw = stop())) expect_error(mcmc_areas_data(arr, adjust = stop())) expect_error(mcmc_areas_data(arr, kernel = stop())) }) test_that("probabilities outside of [0,1] cause an error", { expect_error(mcmc_intervals_data(arr, prob = -0.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob = 1.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob_outer = -0.1), "must be in \\[0,1\\]") expect_error(mcmc_intervals_data(arr, prob_outer = 1.1), "must be in \\[0,1\\]") }) test_that("inconsistent probabilities raise warning (#138)", { expect_warning( mcmc_intervals_data(arr, prob = .9, prob_outer = .8), "`prob_outer` .* is less than `prob`" ) }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_intervals renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_intervals(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_intervals (default)", p_base) p_outer <- mcmc_intervals(vdiff_dframe, prob_outer = .8) vdiffr::expect_doppelganger("mcmc_intervals (outer)", p_outer) p_inner <- mcmc_intervals(vdiff_dframe, prob = .1) vdiffr::expect_doppelganger("mcmc_intervals (inner)", p_inner) rhats <- seq(from = 1, to = 1.15, length.out = 5) p_rhats <- mcmc_intervals(vdiff_dframe, rhat = rhats) vdiffr::expect_doppelganger("mcmc_intervals (rhats)", p_rhats) p_no_points <- mcmc_intervals(vdiff_dframe, point_est = "none") vdiffr::expect_doppelganger("mcmc_intervals (no points)", p_no_points) p_mean_points <- mcmc_intervals(vdiff_dframe, point_est = "mean") vdiffr::expect_doppelganger("mcmc_intervals (means)", p_mean_points) p_sizes <- mcmc_intervals(vdiff_dframe, point_size = 1, inner_size = 5, outer_size = 4) vdiffr::expect_doppelganger("mcmc_intervals (sizes)", p_sizes) }) test_that("mcmc_areas renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_areas(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_areas (default)", p_base) p_equal_height <- mcmc_areas(vdiff_dframe, area_method = "equal height") vdiffr::expect_doppelganger("mcmc_areas (equal height)", p_equal_height) p_scaled_height <- mcmc_areas(vdiff_dframe, area_method = "scaled height") vdiffr::expect_doppelganger("mcmc_areas (scaled height)", p_scaled_height) p_outer <- mcmc_areas(vdiff_dframe, prob_outer = .8) vdiffr::expect_doppelganger("mcmc_areas (outer)", p_outer) p_inner <- mcmc_areas(vdiff_dframe, prob = .1) vdiffr::expect_doppelganger("mcmc_areas (inner)", p_inner) rhats <- seq(from = 1, to = 1.15, length.out = 5) p_rhats <- mcmc_areas(vdiff_dframe, rhat = rhats) vdiffr::expect_doppelganger("mcmc_areas (rhats)", p_rhats) p_no_points <- mcmc_areas(vdiff_dframe, point_est = "none") vdiffr::expect_doppelganger("mcmc_areas (no points)", p_no_points) p_mean_points <- mcmc_areas(vdiff_dframe, point_est = "mean") vdiffr::expect_doppelganger("mcmc_areas (means)", p_mean_points) }) test_that("mcmc_areas_ridges renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_areas_ridges(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_areas_ridges (default)", p_base) p_inner <- mcmc_areas_ridges(vdiff_dframe, prob = .5) vdiffr::expect_doppelganger("mcmc_areas_ridges (inner)", p_inner) p_outer <- mcmc_areas_ridges(vdiff_dframe, prob = .5, prob_outer = .95) vdiffr::expect_doppelganger("mcmc_areas_ridges (outer)", p_outer) }) bayesplot/tests/testthat/test-mcmc-distributions.R0000644000176200001440000001047614057717550022220 0ustar liggesuserslibrary(bayesplot) context("MCMC: distributions") source(test_path("data-for-mcmc-tests.R")) get_palette <- function(ggplot, n) { scale <- ggplot$scales$get_scales("colour") scale$palette(n) } test_that("mcmc_hist returns a ggplot object", { expect_gg(mcmc_hist(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_hist(arr1chain, regex_pars = "beta")) expect_gg(mcmc_hist(mat)) expect_gg(mcmc_hist(dframe)) expect_gg(mcmc_hist(dframe_multiple_chains)) expect_gg(mcmc_hist(arr1)) expect_gg(mcmc_hist(mat1)) expect_gg(mcmc_hist(dframe1)) }) test_that("mcmc_dens returns a ggplot object", { expect_gg(mcmc_dens(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_dens(arr1chain, regex_pars = "beta")) expect_gg(mcmc_dens(mat)) expect_gg(mcmc_dens(dframe, transformations = list(sigma = function(x) x^2))) expect_gg(mcmc_dens( dframe_multiple_chains, transformations = list(sigma = function(x) x ^ 2, 'beta[1]' = "exp") )) expect_gg(mcmc_dens(arr1)) expect_gg(mcmc_dens(mat1)) expect_gg(mcmc_dens(dframe1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_hist_by_chain returns a ggplot object", { expect_gg(mcmc_hist_by_chain(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_hist_by_chain(dframe_multiple_chains, regex_pars = c("(Intercept)", "beta"))) }) test_that("mcmc_dens_overlay returns a ggplot object", { expect_gg(mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_dens_overlay(dframe_multiple_chains, pars = c("(Intercept)", "beta[2]"))) }) test_that("mcmc_dens_chains returns a ggplot object", { p <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) expect_gg(p) p2 <- mcmc_dens_overlay(dframe_multiple_chains, pars = c("(Intercept)", "beta[2]"), color_chains = TRUE) expect_gg(p2) }) test_that("mcmc_dens_chains/mcmc_dens_overlay color chains", { p1 <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) p2 <- mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = FALSE) # Only one color when set not to color chains expect_equal(length(unique(get_palette(p1, 4))), 1) expect_equal(length(unique(get_palette(p2, 4))), 1) p3 <- mcmc_dens_chains(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = TRUE) p4 <- mcmc_dens_overlay(arr, pars = "beta[1]", regex_pars = "x\\:", color_chains = TRUE) # Chain coloring works expect_equal(get_palette(p3, 4), chain_colors(4)) expect_equal(get_palette(p4, 4), chain_colors(4)) }) test_that("mcmc_violin returns a ggplot object", { expect_gg(mcmc_violin(arr, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_violin(dframe_multiple_chains, regex_pars = c("\\(Intercept\\)$", "beta"))) }) test_that("mcmc_* throws error if 1 chain but multiple chains required", { expect_error(mcmc_hist_by_chain(mat), "requires multiple chains") expect_error(mcmc_hist_by_chain(dframe), "requires multiple chains") expect_error(mcmc_hist_by_chain(arr1chain), "requires multiple chains") expect_error(mcmc_dens_overlay(mat), "requires multiple chains") expect_error(mcmc_dens_overlay(dframe), "requires multiple chains") expect_error(mcmc_dens_overlay(arr1chain), "requires multiple chains") expect_error(mcmc_dens_chains(mat), "requires multiple chains") expect_error(mcmc_dens_chains(dframe), "requires multiple chains") expect_error(mcmc_dens_chains(arr1chain), "requires multiple chains") expect_error(mcmc_violin(mat), "requires multiple chains") expect_error(mcmc_violin(dframe), "requires multiple chains") expect_error(mcmc_violin(arr1chain), "requires multiple chains") }) # Visual tests ------------------------------------------------------------ test_that("mcmc_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_hist(vdiff_dframe) vdiffr::expect_doppelganger("mcmc_hist (default)", p_base) p_freq <- mcmc_hist(vdiff_dframe, freq = TRUE) vdiffr::expect_doppelganger("mcmc_hist (freq)", p_freq) }) bayesplot/tests/testthat/test-available_ppc.R0000644000176200001440000000316614057717550021161 0ustar liggesuserslibrary(bayesplot) context("available_mcmc and available_ppc") test_that("available_mcmc works", { a <- available_mcmc() expect_s3_class(a, "bayesplot_function_list") expect_s3_class(a, "character") expect_identical( as.character(a), sort(grep("^mcmc_", getNamespaceExports("bayesplot"), value = TRUE)) ) b <- available_mcmc("trace|dens") expect_s3_class(b, "bayesplot_function_list") expect_identical( as.character(b), sort(grep("^mcmc_dens|^mcmc_trace", getNamespaceExports("bayesplot"), value = TRUE)) ) expect_length(available_mcmc(pattern = "99999"), 0) }) test_that("available_ppc works", { a <- available_ppc() expect_s3_class(a, "bayesplot_function_list") expect_s3_class(a, "character") expect_identical( as.character(a), sort(grep("^ppc_", getNamespaceExports("bayesplot"), value = TRUE)) ) b <- available_ppc("grouped") expect_s3_class(b, "bayesplot_function_list") expect_identical( as.character(b), sort(grep("_grouped$", getNamespaceExports("bayesplot"), value = TRUE)) ) c <- available_ppc("grouped", invert = TRUE) expect_false(any(grepl("grouped", c))) expect_length(available_ppc(pattern = "99999"), 0) }) test_that("print.bayesplot_function_list works", { expect_output(print(available_ppc()), "bayesplot PPC module:") expect_output(print(available_mcmc()), "bayesplot MCMC module:") expect_output(print(available_ppc("ribbon")), "(matching pattern 'ribbon')") expect_output(print(available_mcmc("trace")), "trace_highlight") expect_output(print(available_ppc("grouped", invert = TRUE)), "excluding pattern 'grouped'") }) bayesplot/tests/testthat/test-convenience-functions.R0000644000176200001440000001477114057717550022705 0ustar liggesuserslibrary(bayesplot) library(ggplot2) context("Convenience functions (for ggplot objects)") # abline_01, vline_ and hline_ ------------------------------------------ test_that("abline_01 returns the correct object", { expect_equal( abline_01(color = "green", linetype = 2), geom_abline(intercept = 0, slope = 1, color = "green", linetype = 2, na.rm = TRUE), check.environment = FALSE ) }) test_that("vline_* and hline_* return correct objects", { expect_equal( vline_0(color = "red"), geom_vline(xintercept = 0, color = "red", na.rm = TRUE), check.environment = FALSE ) expect_equal( hline_0(size = 2, linetype = 3), geom_hline(yintercept = 0, size = 2, linetype = 3, na.rm = TRUE), check.environment = FALSE ) expect_equal( vline_at(c(3,4), na.rm = FALSE), geom_vline(xintercept = c(3,4)), check.environment = FALSE ) expect_equal( hline_at(c(3,4), na.rm = FALSE), geom_hline(yintercept = c(3,4)), check.environment = FALSE ) }) test_that("vline_at with 'fun' works", { x <- example_mcmc_draws(chains = 1) expect_equal( vline_at(x, colMeans), geom_vline(xintercept = colMeans(x), na.rm = TRUE), check.environment = FALSE ) }) test_that("calc_v (internal function) works", { a <- 1:4 expect_identical(calc_v(a, "mean"), 2.5) expect_identical(calc_v(a, median), 2.5) expect_equal(calc_v(c(a, NA), mean), NA_real_) expect_identical(calc_v(c(a, NA), min, list(na.rm = TRUE)), 1L) expect_error(calc_v(fun = "mean"), "'v' can't be missing") }) # lbub -------------------------------------------------------------------- test_that("lbub works", { f1 <- lbub(p = 0.5) f2 <- lbub(p = 0.5, med = FALSE) expect_type(f1, "closure") expect_type(f2, "closure") expect_identical( f1(1:50), setNames(c(13.25, 25.5, 37.75), c("25%", "50%", "75%")) ) expect_identical( f2(1:50), setNames(c(13.25, 37.75), c("25%", "75%")) ) }) # plot and facet backgrounds ---------------------------------------------- test_that("grid_lines returns correct theme object", { thm <- theme_default() + grid_lines(size = 1.5, color = "purple") expect_equal(thm$panel.grid.major, element_line(size = 1.5, color = "purple")) expect_equal(thm$panel.grid.minor, element_line(size = 0.75, color = "purple")) }) test_that("panel_bg returns correct theme object", { bg1 <- panel_bg() bg2 <- panel_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(panel.background = element_rect())) expect_identical(bg2, theme(panel.background = element_rect(fill = "blue", linetype = 2))) expect_identical(panel_bg(on = FALSE), theme(panel.background = element_blank())) }) test_that("plot_bg returns correct theme object", { bg1 <- plot_bg() bg2 <- plot_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(plot.background = element_rect())) expect_identical(bg2, theme(plot.background = element_rect(fill = "blue", linetype = 2))) expect_identical(plot_bg(on = FALSE), theme(plot.background = element_blank())) }) test_that("facet_bg returns correct theme object", { bg1 <- facet_bg() bg2 <- facet_bg(fill = "blue", linetype = 2) expect_identical(bg1, theme(strip.background = element_rect())) expect_identical(bg2, theme(strip.background = element_rect(fill = "blue", linetype = 2))) expect_identical(facet_bg(on = FALSE), theme(strip.background = element_blank())) }) # legend position and text ------------------------------------------------ test_that("legend_none returns correct theme object", { none <- legend_none() expect_s3_class(none, "theme") expect_equivalent(none, list(legend.position = "none")) expect_false(attr(none, "complete")) }) test_that("legend_move returns correct theme object", { left <- legend_move("left") expect_s3_class(left, "theme") expect_equivalent(left, list(legend.position = "left")) expect_false(attr(left, "complete")) pos <- legend_move(c(0.25, 0.5)) expect_s3_class(pos, "theme") expect_equivalent(pos, list(legend.position = c(0.25, 0.5))) expect_false(attr(pos, "complete")) }) test_that("legend_text returns correct theme object", { expect_equal( legend_text(size = 16, color = "purple"), theme(legend.text = element_text(color = "purple", size = 16)) ) }) # axis and facet text -------------------------------------------------- test_that("xaxis_text returns correct theme object", { expect_identical(xaxis_text(FALSE), theme(axis.text.x = element_blank())) expect_equal( xaxis_text(face = "bold", angle = 30), theme(axis.text.x = element_text(face = "bold", angle = 30)) ) }) test_that("yaxis_text returns correct theme object", { expect_identical(yaxis_text(FALSE), theme(axis.text.y = element_blank())) expect_equivalent( yaxis_text(face = "bold", angle = 30), theme(axis.text.y = element_text(face = "bold", angle = 30)) ) }) test_that("facet_text returns correct theme object", { expect_identical(facet_text(FALSE), theme(strip.text = element_blank())) expect_equal( facet_text(size = 12, color = "blue"), theme(strip.text = element_text(color = "blue", size = 12)) ) }) # axis titles ------------------------------------------------------------- test_that("xaxis_title returns correct theme object", { expect_identical(xaxis_title(FALSE), xlab(NULL)) expect_equal( xaxis_title(face = "bold", angle = 30), theme(axis.title.x = element_text(face = "bold", angle = 30)) ) }) test_that("yaxis_title returns correct theme object", { expect_identical(yaxis_title(FALSE), ylab(NULL)) expect_equal( yaxis_title(face = "bold", angle = 30), theme(axis.title.y = element_text(face = "bold", angle = 30)) ) }) # tick marks -------------------------------------------------- test_that("xaxis_ticks returns correct theme object", { expect_identical(xaxis_ticks(FALSE), theme(axis.ticks.x = element_blank())) expect_equal( xaxis_ticks(size = 0.5, color = "red"), theme(axis.ticks.x = element_line(size = 0.5, color = "red")) ) }) test_that("yaxis_ticks returns correct theme object", { expect_identical(yaxis_ticks(FALSE), theme(axis.ticks.y = element_blank())) expect_equal( yaxis_ticks(size = 0.5, color = "red"), theme(axis.ticks.y = element_line(size = 0.5, color = "red")) ) }) # overlay functions ------------------------------------------------------- test_that("overlay_function returns the correct object", { expect_error(overlay_function(), 'argument "fun" is missing') expect_equal( overlay_function(fun = "dnorm"), stat_function(fun = "dnorm", inherit.aes = FALSE), check.environment = FALSE ) }) bayesplot/tests/testthat/test-extractors.R0000644000176200001440000001061514057717550020572 0ustar liggesuserslibrary(bayesplot) context("Extractors") if (requireNamespace("rstanarm", quietly = TRUE)) { ITER <- 1000 CHAINS <- 3 fit <- rstanarm::stan_glm(mpg ~ wt + am, data = mtcars, iter = ITER, chains = CHAINS, refresh = 0) } x <- list(cbind(a = 1:3, b = rnorm(3)), cbind(a = 1:3, b = rnorm(3))) # nuts_params and log_posterior methods ----------------------------------- test_that("nuts_params.list throws errors", { x[[3]] <- c(a = 1:3, b = rnorm(3)) expect_error(nuts_params.list(x), "list elements should be matrices") x[[3]] <- cbind(a = 1:3, d = rnorm(3)) expect_error(nuts_params.list(x), "same column names") x[[3]] <- cbind(a = 1:4, b = rnorm(4)) expect_error(nuts_params.list(x), "same dimensions") }) test_that("nuts_params.list parameter selection ok", { expect_error(nuts_params.list(x, pars = "apple"), "subscript out of bounds") np <- nuts_params.list(x, pars = "b") expect_true(all(np$Parameter == "b")) }) test_that("all nuts_params methods identical", { skip_if_not_installed("rstanarm") skip_if_not_installed("rstan") expect_identical( nuts_params(fit), nuts_params(fit$stanfit) ) expect_identical( nuts_params(fit), nuts_params(rstan::get_sampler_params(fit$stanfit, inc_warmup = FALSE)) ) }) test_that("nuts_params.stanreg returns correct structure", { skip_if_not_installed("rstanarm") np <- nuts_params(fit) expect_identical(colnames(np), c("Chain", "Iteration", "Parameter", "Value")) np_names <- paste0(c("accept_stat", "stepsize", "treedepth", "n_leapfrog", "divergent", "energy"), "__") expect_identical(levels(np$Parameter), np_names) expect_equal(length(unique(np$Iteration)), floor(ITER / 2)) expect_equal(length(unique(np$Chain)), CHAINS) }) test_that("log_posterior.stanreg returns correct structure", { skip_if_not_installed("rstanarm") lp <- log_posterior(fit) expect_identical(colnames(lp), c("Chain", "Iteration", "Value")) expect_equal(length(unique(lp$Iteration)), floor(ITER / 2)) expect_equal(length(unique(lp$Chain)), CHAINS) }) test_that("rhat.stanreg returns correct structure", { skip_if_not_installed("rstanarm") r <- rhat(fit) expect_named(r) expect_equal(r, summary(fit)[1:length(r), "Rhat"]) expect_identical(names(rhat(fit, regex_pars = c("wt", "am"))), c("wt", "am")) }) test_that("neff_ratio.stanreg returns correct structure", { skip_if_not_installed("rstanarm") expect_named(neff_ratio(fit, pars = c("wt", "am")), c("wt", "am")) ratio <- neff_ratio(fit) expect_named(ratio) ans <- summary(fit)[1:length(ratio), "n_eff"] / (floor(ITER / 2) * CHAINS) expect_equal(ratio, ans, tol = 0.001) }) test_that("rhat.stanfit returns correct structure", { skip_if_not_installed("rstanarm") r <- rhat(fit$stanfit) expect_named(r) expect_equal(r, summary(fit)[, "Rhat"]) r2 <- rhat(fit$stanfit, pars = c("wt", "sigma")) expect_named(r2) expect_equal(r2, summary(fit, pars = c("wt", "sigma"))[, "Rhat"]) }) test_that("neff_ratio.stanreg returns correct structure", { skip_if_not_installed("rstanarm") denom <- floor(ITER / 2) * CHAINS ratio <- neff_ratio(fit$stanfit) expect_named(ratio) ans <- summary(fit)[, "n_eff"] / denom expect_equal(ratio, ans, tol = 0.001) ratio2 <- neff_ratio(fit$stanfit, pars = c("wt", "sigma")) expect_named(ratio2) ans2 <- summary(fit, pars = c("wt", "sigma"))[, "n_eff"] / denom expect_equal(ratio2, ans2, tol = 0.001) }) test_that("cmdstanr methods work", { skip_on_cran() skip_if_not_installed("cmdstanr") fit <- cmdstanr::cmdstanr_example("logistic", iter_sampling = 500, chains = 2) np <- nuts_params(fit) np_names <- c("treedepth__", "divergent__", "accept_stat__", "stepsize__", "n_leapfrog__", "energy__") expect_identical(levels(np$Parameter), np_names) expect_equal(range(np$Iteration), c(1, 500)) expect_equal(range(np$Chain), c(1, 2)) expect_true(all(np$Value[np$Parameter == "divergent__"] == 0)) lp <- log_posterior(fit) expect_named(lp, c("Chain", "Iteration", "Value")) expect_equal(range(np$Chain), c(1, 2)) expect_equal(range(np$Iteration), c(1, 500)) r <- rhat(fit) expect_named(head(r, 4), c("alpha", "beta[1]", "beta[2]", "beta[3]")) expect_true(all(round(r) == 1)) ratio <- neff_ratio(fit) expect_named(head(ratio, 4), c("alpha", "beta[1]", "beta[2]", "beta[3]")) expect_true(all(ratio > 0)) }) bayesplot/tests/testthat/data-for-binomial.rda0000644000176200001440000001216614057717550021254 0ustar liggesusersY <]d Evc[J{Y*Q)kYZhWZUD쌝1v2c͖%KJ*-TJ%w<Ӽz|{{-Uov!M_Mpx F(,A_G*l>II Y\JOZ*7Bn(B寚%yA,?G)s5$^˯e/1F͒gs+(sƝaŃ91O81  _OK$fo {AЋhQF3^m~F-f.B`l:L{?"^8'7iI\ \&!q΍ǘ[haƈ\l}v6؉Qx 8?qr5\;6{l3=cƓ8l<ϙ9L_ĉdž\l6@=~S 0BcǙ~3_6=k8Q? ^3O3Vʷޟt8#3W<Ôscyƹ]Wf;L9?3OE ~6 { 8}gٱDZb+s/f+kiga͗}_}#GeBc_3Ʋ)}ThE}n X4+3jԚ,Zn3f|&;ӨZ3D./4mK/, Q(;PBMϞT+ͫP]ߔ|߹RޠRX]ᛠ2uf.jSf,BJwGa /p轐⎌gRhUYV6@+W|en&npEs_nD{Л$<ٌH[UzSWWUdBZTej*!c~9Հ&?)BB n}v V.PڡW Jʏ>ģpS*%PZ/kNg^PuO|uUҭMu[䷁.3i>j?؋Nn@vJQjb?CFC}ŋ 3c:o 6ML=_-BdXo? #<+>Ry-H{Q>nEvxq5,g5+Rw&jv˹B M;mPtRWV Y鲝[:&O6z9}^/7:dnPv=QZm% j+PVz_r;nȞA~Jm[lAen*r8cD/P Tk'OAj톰 s8rsm2"nA!5')o׻"GqwGZ7CMҒYa#CmDu.];P4.2}S\ Pr{/ ηuоUTP?{b4-'s=A3w:1yǛHd5P^KQӞj;0r;w|٨4$;;!//iÔaw[Ѯ!h&2q ,^&$+nGJ^QlWd/zmLAQ1fn@ q|dzVf.I\0RYVi\\/5TA$>;#7+&/Nl>Acb=OQqfT,<^<聢umLzPt@./JW[rg^x0TN}1; rQ!67 ICCrȐL=? vzzH]Y%m+fSpvy Ֆ} >(]םGd(QxЋ;:r5d2$~;^kxݵF }Hɣ+ˑk(CHLtH_QTZw·wDC.IxqS.E'1D}GpoY5XdT_='Qp4 VoIWh]_}5uXtvm47=#qٜ4ۇa~|d[г鱉)I }KR>b9m'܇Q{iGB:*:8yG(WRW-1Duj`Lfz9 e=#֠>Lf$L;XP|,D.F5Oc6[>Hx2U:Du?z٪t[RR2J.FdͅraT^`҇D/WC⺌nqA Fv'/K ݥoVoeyMޛGg߁hz4y\$i"HxV-|R@B~%7}!6FŒ4,^)\PT ܖԺi@FנIJ#жҊdM?>w/Jҭt{{8^D%S"c-ٛ{ t`>=ƜLL$—xI_CS%f-2dCG^dl)xRii{xK:SL獘#"5[.pSi9 =y7 $(*>BTG?o'/[54!w#u @kMx.D|U=шeq=aXdnCMEky>7U|NVnCә9X&:e#tQL'P_t  E@G6؃{FS&!a|ڢ~dͳD˭ q+U(7ĮCƢ]ibwkP*a)&UTg,xo`_ +-VC[CHQ6+4GyP|#{ӂd2Ur #ϰUGD8_םW+Դ] )G+Ez iޜ4u7m߆-Tb>W_\9m賑_zahe3T90'"u:iՒNZJw9 l}?oy-QlرOobE~BҖu2WA~ۍZnhew(6$<yy-KA^;eAU2)Q쑰gȠ ^ tggڳ'O.$?xMo0B $ekrr"}ӤXPL͝+kĥG-w 1$-~jSp(UGO{uh.߿.Q ףDRO#C~ ^z\v8>։ǒ7-ău7OGio9Qsx|``u%dW+$#˼PL|&g>ce7~?UȣT\ugoCojfO/zJrǽJ+kCIDOPLU۷g!P&+V(r(,c bȑj^{5 <%Efr.Tɓ͖H=7adz)8 b' $~i暈[3 Kw (!ykg' Sm< +]Fȴ9#Gie"bf}G܏NL{0Nf"ZY]}0rQ>HFkW\3./2"S-yT sFĽ6|nXח/6vVG* ¯KX*3&dLFɨ3 &òLY SeqDY[X*,  CPaa0TX*, * CPea0TY, U* CAdaYDAdaYDAdaYj, 5 CPcas#~7C(dluCB`d7$7bayesplot/tests/testthat/test-example-draws.R0000644000176200001440000000244214057717550021144 0ustar liggesuserslibrary(bayesplot) context("Example draws") test_that("example_mcmc_draws throws correct errors", { expect_error(example_mcmc_draws(chains = 5), "chains <= 4") expect_error(example_mcmc_draws(chains = 0), "chains >= 1") expect_error(example_mcmc_draws(params = 7), "params <= 6") expect_error(example_mcmc_draws(params = 0), "params >= 1") }) test_that("example_mcmc_draws returns correct structure", { expect_identical(dim(example_mcmc_draws()), c(250L, 4L, 4L)) expect_identical(dim(example_mcmc_draws(chains = 1, params = 6)), c(250L, 6L)) expect_identical(dim(example_mcmc_draws(params = 1)), c(250L, 4L, 1L)) expect_identical(dimnames(example_mcmc_draws(4, 6))[[3]], c("alpha", "sigma", paste0("beta[", 1:4,"]"))) }) test_that("example ppc data works", { y <- example_y_data() expect_type(y, "integer") expect_true(is_vector_or_1Darray(y)) yrep <- example_yrep_draws() expect_type(yrep, "double") expect_is(yrep, "matrix") expect_equal(ncol(yrep), length(y)) group <- example_group_data() expect_s3_class(group, "factor") expect_equal(length(group), length(y)) x <- example_x_data() expect_type(x, "double") expect_true(is_vector_or_1Darray(x)) expect_equal(length(x), length(y)) }) bayesplot/tests/testthat/test-ppc-discrete.R0000644000176200001440000001074314057717550020760 0ustar liggesuserslibrary(bayesplot) context("PPC: discrete") # bar plots --------------------------------------------------------------- if (requireNamespace("rstanarm", quietly = TRUE)) { suppressPackageStartupMessages(library(rstanarm)) data("esoph", package = "datasets") fit <- stan_polr(tobgp ~ agegp, data = esoph, method = "probit", prior = R2(0.2, "mean"), init_r = 0.1, seed = 12345, chains = 1, iter = 500, refresh = 0) y <- as.integer(fit$y) yrep_char <- posterior_predict(fit, draws = 10) yrep <- sapply(data.frame(yrep_char, stringsAsFactors = TRUE), as.integer) } test_that("ppc_bars & ppc_bars_grouped return a ggplot object", { skip_if_not_installed("rstanarm") expect_gg(ppc_bars(y, yrep)) expect_gg(ppc_bars(y, yrep, prob = 0)) expect_gg(ppc_bars_grouped(y, yrep, group = esoph$agegp)) }) test_that("freq argument to ppc_bars works", { skip_if_not_installed("rstanarm") p_freq <- ggplot2::ggplot_build(ppc_bars(y, yrep, freq = TRUE)) p_prop <- ggplot2::ggplot_build(ppc_bars(y, yrep, freq = FALSE)) y_freq <- p_freq$data[[1]]$y y_prop <- p_prop$data[[1]]$y expect_equal(y_freq, as.integer(y_freq)) expect_true(all(y_prop < 1) && all(y_prop > 0)) }) test_that("ppc_bars works with negative integers", { y <- round(rnorm(100, -10, 1)) yrep <- round(matrix(rnorm(100 * 500, -10, 1), 500, 100)) expect_gg(ppc_bars(y, yrep)) }) test_that("ppc_bars(_grouped) errors if y/yrep not discrete", { skip_if_not_installed("rstanarm") expect_error(ppc_bars(y + 0.5, yrep), "ppc_bars expects 'y' to be discrete") expect_error(ppc_bars(y, yrep + 0.5), "ppc_bars expects 'yrep' to be discrete") expect_error(ppc_bars_grouped(y + 0.5, yrep, group = esoph$agegp), "ppc_bars_grouped expects 'y' to be discrete") expect_error(ppc_bars_grouped(y, yrep + 0.5, group = esoph$agegp), "ppc_bars_grouped expects 'yrep' to be discrete") }) # rootograms ----------------------------------------------------------- rm(list = ls()) source(test_path("data-for-ppc-tests.R")) yrep3 <- matrix(yrep2, nrow = 5, ncol = ncol(yrep2), byrow = TRUE) test_that("ppc_rootogram returns a ggplot object", { expect_gg(ppc_rootogram(y2, yrep2)) expect_gg(ppc_rootogram(y2, yrep3, style = "hanging", prob = 0.5)) expect_gg(ppc_rootogram(y2, yrep3, style = "suspended")) }) test_that("ppc_rootogram errors if y/yrep not counts", { expect_error(ppc_rootogram(y, yrep), "ppc_rootogram expects counts as inputs to 'y'") expect_error(ppc_rootogram(y2, yrep[1:5, seq_along(y2)]), "ppc_rootogram expects counts as inputs to 'yrep'") expect_error(ppc_rootogram(y, yrep3), "ncol(yrep) must be equal to length(y)", fixed = TRUE) }) # Visual tests ------------------------------------------------------------ test_that("ppc_bars renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_bars(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_bars (default)", p_base) p_custom <- ppc_bars( y = vdiff_y2, yrep = vdiff_yrep2, width = 0.5, size = 0.5, fatten = 5 ) vdiffr::expect_doppelganger( title = "ppc_bars (width, size, fatten)", fig = p_custom) p_custom_prob <- ppc_bars( y = vdiff_y2, yrep = vdiff_yrep2, prob = 0.33, width = 0.5, size = 0.5, fatten = 5 ) vdiffr::expect_doppelganger( title = "ppc_bars (prob=0.33, width, size, fatten)", fig = p_custom_prob) }) test_that("ppc_bars_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_bars_grouped(vdiff_y2, vdiff_yrep2, vdiff_group2) vdiffr::expect_doppelganger("ppc_bars_grouped (default)", p_base) p_custom <- ppc_bars_grouped( y = vdiff_y2, yrep = vdiff_yrep2, group = vdiff_group2, facet_args = list(nrow = 2), prob = 0.5, size = 0.5 ) vdiffr::expect_doppelganger( title = "ppc_bars_grouped (facet_args, prob, size)", fig = p_custom) }) test_that("ppc_rootogram renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_rootogram(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_rootogram (default)", p_base) p_custom_hanging <- ppc_rootogram( y = vdiff_y2, yrep = vdiff_yrep2, prob = 2/3, size = 3, style = "hanging" ) vdiffr::expect_doppelganger( title = "ppc_rootogram (style='hanging', prob, size)", fig = p_custom_hanging) }) bayesplot/tests/testthat/data-for-mcmc-tests.R0000644000176200001440000000271714061476147021174 0ustar liggesusersset.seed(8420) # Prepare input objects arr <- array(rnorm(4000), dim = c(100, 4, 10)) arr1chain <- arr[, 1, , drop = FALSE] mat <- matrix(rnorm(1000), nrow = 100, ncol = 10) dframe <- as.data.frame(mat) chainlist <- list(matrix(rnorm(1000), nrow = 100, ncol = 10), matrix(rnorm(1000), nrow = 100, ncol = 10)) mixed_names <- c("(Intercept)", "beta[1]", "beta[2]", "sigma", paste0("b[(Intercept) x:", 1:6, "]")) colnames(mat) <- colnames(dframe) <- colnames(chainlist[[1]]) <- colnames(chainlist[[2]]) <- mixed_names dimnames(arr) <- dimnames(arr1chain) <- list(NULL, NULL, mixed_names) chainlist1chain <- chainlist[1] # one parameter arr1 <- arr[, , 1, drop = FALSE] mat1 <- mat[, 1, drop = FALSE] dframe1 <- dframe[, 1, drop = FALSE] chainlist1 <- list(chainlist[[1]][, 1, drop=FALSE], chainlist[[2]][, 1, drop=FALSE]) # data.frame with chain column dframe_multiple_chains <- dframe dframe_multiple_chains$chain <- rep(1:4, 25) # for vdiffr visual tests set.seed(11172017) vdiff_dframe <- as.data.frame(matrix(rnorm(500), nrow = 100, ncol = 5)) vdiff_dframe_chains <- as.data.frame( matrix(rnorm(4000), nrow = 2000, ncol = 2) ) vdiff_dframe_chains$chain <- rep(1:4, each = 500) vdiff_dframe_chains_divergences <- data.frame( Iteration = rep(1:500, each = 4), Parameter = "divergent__", Value = rbinom(2000, size = 1, prob = .02), Chain = vdiff_dframe_chains$chain, stringsAsFactors = FALSE ) set.seed(seed = NULL) bayesplot/tests/testthat/test-bayesplot_grid.R0000644000176200001440000000317314057717550021404 0ustar liggesuserslibrary(bayesplot) context("bayesplot_grid") y <- example_y_data() yrep <- example_yrep_draws()[1:25, ] gr <- gridExtra::arrangeGrob(ppc_stat(y, yrep, binwidth = 1)) p1 <- ppc_scatter_avg(y, yrep) p2 <- ppc_stat(y, yrep, binwidth = 1) test_that("as_bayesplot_grid works", { expect_s3_class(as_bayesplot_grid(gr), "bayesplot_grid") expect_s3_class(as_bayesplot_grid(gr), "gtable") }) test_that("bayesplot_grid throws correct errors", { expect_error(bayesplot_grid(xlim = 2), "No plots specified") expect_error(bayesplot_grid(gr, plots = list(p1, p2)), "'...' and 'plots' can't both be specified") expect_error(bayesplot_grid(plots = gr), "'plots' must be a list of ggplot objects") expect_error(bayesplot_grid(gr), "objects in '...' must be ggplot objects.") expect_error(bayesplot_grid(p1, p2, titles = c("plot1")), "length(titles) == length(plots) is not TRUE", fixed = TRUE) expect_error(bayesplot_grid(p1, p2, subtitles = c("plot1")), "length(subtitles) == length(plots) is not TRUE", fixed = TRUE) }) test_that("bayesplot_grid works", { expect_message( a <- bayesplot_grid(p1, p2, xlim = c(-200, 200), ylim = c(0, 200)), "Adding another scale for 'y'" ) expect_silent( b <- bayesplot_grid(plots = list(p1, p2), titles = c("plot1", "plot2"), subtitles = c("plot1_sub", "plot2_sub"), legends = FALSE) ) expect_s3_class(a, "bayesplot_grid") expect_s3_class(b, "bayesplot_grid") expect_equal(length(a$grobs), 2) expect_equal(length(b$grobs), 2) }) bayesplot/tests/testthat/test-ppc-distributions.R0000644000176200001440000001555514057717550022066 0ustar liggesuserslibrary(bayesplot) context("PPC: distributions") source(test_path("data-for-ppc-tests.R")) test_that("ppc_dens_overlay returns a ggplot object", { expect_gg(ppc_dens_overlay(y, yrep)) expect_gg(ppc_dens_overlay(y2, yrep2, size = 0.5, alpha = 0.2)) }) test_that("ppc_ecdf_overlay returns a ggplot object", { expect_gg(ppc_ecdf_overlay(y, yrep, size = 0.5, alpha = 0.2)) expect_gg(ppc_ecdf_overlay(y2, yrep2)) }) test_that("ppc_km_overlay returns a ggplot object", { skip_if_not_installed("ggfortify") expect_gg(ppc_km_overlay(y, yrep, status_y = status_y, size = 0.5, alpha = 0.2)) expect_gg(ppc_km_overlay(y2, yrep2, status_y = status_y2)) }) test_that("ppc_dens,pp_hist,ppc_freqpoly,ppc_boxplot return ggplot objects", { expect_gg(ppc_hist(y, yrep[1,, drop = FALSE])) expect_gg(ppc_hist(y, yrep[1:8, ])) expect_gg(ppc_hist(y2, yrep2)) expect_gg(ppc_boxplot(y, yrep[1,, drop = FALSE])) expect_gg(ppc_boxplot(y, yrep[1:8, ])) expect_gg(ppc_boxplot(y2, yrep2, notch = FALSE)) expect_gg(ppc_dens(y, yrep[1:8, ])) expect_gg(ppc_dens(y2, yrep2)) expect_gg(ppc_freqpoly(y, yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1)) expect_gg(ppc_freqpoly(y2, yrep2)) expect_gg(p <- ppc_hist(y, yrep[1:8, ], binwidth = 3)) if (utils::packageVersion("ggplot2") >= "3.0.0") { facet_var <- "~rep_label" expect_equal(as.character(p$facet$params$facets[1]), facet_var) } }) test_that("ppc_freqpoly_grouped returns a ggplot object", { expect_gg(ppc_freqpoly_grouped(y, yrep[1:4, ], group)) expect_gg(ppc_freqpoly_grouped(y, yrep[1:4, ], group, freq = TRUE, alpha = 0.5)) }) test_that("ppc_violin_grouped returns a ggplot object", { expect_gg(ppc_violin_grouped(y, yrep, group)) expect_gg(ppc_violin_grouped(y, yrep, as.numeric(group))) expect_gg(ppc_violin_grouped(y, yrep, as.integer(group))) expect_gg(ppc_violin_grouped(y, yrep, group, y_draw = "both", y_jitter = 0.3)) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_hist(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_hist (default)", p_base) p_binwidth <- ppc_hist(vdiff_y, vdiff_yrep[1:8, ], binwidth = 3) vdiffr::expect_doppelganger("ppc_hist (binwidth)", p_binwidth) }) test_that("ppc_freqpoly renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_freqpoly(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_freqpoly (default)", p_base) p_custom <- ppc_freqpoly( y = vdiff_y, yrep = vdiff_yrep[1:8, ], binwidth = 2, size = 2, alpha = 0.1) vdiffr::expect_doppelganger( title = "ppc_freqpoly (alpha, binwidth, size)", fig = p_custom) }) test_that("ppc_freqpoly_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_freqpoly_grouped(vdiff_y, vdiff_yrep[1:3, ], vdiff_group) vdiffr::expect_doppelganger("ppc_freqpoly_grouped (default)", p_base) }) test_that("ppc_boxplot renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_boxplot (default)", p_base) p_no_notch <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ], notch = FALSE) vdiffr::expect_doppelganger("ppc_boxplot (no notch)", p_no_notch) p_custom <- ppc_boxplot(vdiff_y, vdiff_yrep[1:8, ], size = 1.5, alpha = .5) vdiffr::expect_doppelganger("ppc_boxplot (alpha, size)", p_custom) }) test_that("ppc_ecdf_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ecdf_overlay(vdiff_y2, vdiff_yrep2) vdiffr::expect_doppelganger("ppc_ecdf_overlay (default)", p_base) p_custom <- ppc_ecdf_overlay( vdiff_y2, vdiff_yrep2, discrete = TRUE, size = 2, alpha = .2 ) vdiffr::expect_doppelganger( "ppc_ecdf_overlay (discrete, size, alpha)", p_custom ) }) test_that("ppc_ecdf_overlay_grouped renders correctly", { testthat::skip_on_cran() p_base <- ppc_ecdf_overlay_grouped(vdiff_y2, vdiff_yrep2, vdiff_group2) vdiffr::expect_doppelganger("ppc_ecdf_overlay_grouped (default)", p_base) p_custom <- ppc_ecdf_overlay_grouped( vdiff_y2, vdiff_yrep2, vdiff_group2, discrete = TRUE, size = 2, alpha = .2 ) vdiffr::expect_doppelganger( "ppc_ecdf_overlay_grouped (discrete, size, alpha)", p_custom ) }) test_that("ppc_km_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") testthat::skip_if_not_installed("ggfortify") p_base <- ppc_km_overlay(vdiff_y2, vdiff_yrep2, status_y = vdiff_status_y2) vdiffr::expect_doppelganger("ppc_km_overlay (default)", p_base) p_custom <- ppc_km_overlay( vdiff_y2, vdiff_yrep2, status_y = vdiff_status_y2, size = 2, alpha = .2) vdiffr::expect_doppelganger("ppc_km_overlay (size, alpha)", p_custom) }) test_that("ppc_dens renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_dens(vdiff_y, vdiff_yrep[1:8, ]) vdiffr::expect_doppelganger("ppc_dens (default)", p_base) }) test_that("ppc_dens_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_dens_overlay(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_dens_overlay (default)", p_base) p_custom <- ppc_dens_overlay(vdiff_y, vdiff_yrep, size = 1, alpha = 0.2) vdiffr::expect_doppelganger("ppc_dens_overlay (alpha, size)", p_custom) }) test_that("ppc_dens_overlay_grouped renders correctly", { testthat::skip_on_cran() p_base <- ppc_dens_overlay_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_dens_overlay_grouped (default)", p_base) p_custom <- ppc_dens_overlay_grouped( vdiff_y, vdiff_yrep, vdiff_group, size = 1, alpha = 0.2 ) vdiffr::expect_doppelganger( "ppc_dens_overlay_grouped (alpha, size)", p_custom ) }) test_that("ppc_violin_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not(getRversion() >= "3.6.0") testthat::skip_if_not_installed("vdiffr") p_base <- ppc_violin_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_violin_grouped (default)", p_base) # lock in jitter set.seed(100) p_dots <- ppc_violin_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, y_draw = "both") vdiffr::expect_doppelganger("ppc_violin_grouped (with points)", p_dots) p_dots_jitter <- ppc_violin_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, y_draw = "points", y_jitter = 0.01) vdiffr::expect_doppelganger( "ppc_violin_grouped (points, low jitter)", p_dots_jitter) set.seed(seed = NULL) }) bayesplot/tests/testthat/test-mcmc-combo.R0000644000176200001440000000373214057717550020412 0ustar liggesuserslibrary(bayesplot) context("MCMC: combo") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_combo returns a gtable object", { expect_gtable(mcmc_combo(arr, regex_pars = "beta")) expect_gtable(mcmc_combo(arr, regex_pars = "beta", gg_theme = ggplot2::theme_dark())) expect_gtable(mcmc_combo(mat, regex_pars = "beta", binwidth = 1/20, combo = c("dens", "hist"), facet_args = list(nrow = 2))) expect_gtable(mcmc_combo(dframe, regex_pars = "Intercept")) expect_gtable(mcmc_combo(dframe_multiple_chains, regex_pars = "Intercept", combo = c("trace_highlight", "dens_overlay"))) expect_gtable(mcmc_combo(arr1chain, regex_pars = "Intercept", combo = c("trace", "hist"))) expect_gtable(mcmc_combo(arr1, pars = "(Intercept)")) expect_gtable(mcmc_combo(mat1)) expect_gtable(mcmc_combo(dframe1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_combo throws error if 1 chain but multiple chains required", { expect_error(mcmc_combo(arr1chain, regex_pars = "beta", combo = c("trace_highlight", "dens")), "requires multiple chains") expect_error(mcmc_combo(mat, regex_pars = "beta", combo = c("trace_highlight", "hist")), "requires multiple chains") expect_error(mcmc_combo(dframe, regex_pars = "beta", combo = c("dens_overlay", "trace")), "requires multiple chains") }) # other errors ------------------------------------------------------------ test_that("mcmc_combo throws errors", { expect_error(mcmc_combo(arr, combo = c("trace_highlight")), "'combo' should have at least two elements") expect_error(mcmc_combo(arr, regex_pars = "beta", combo = c("animal", "hist", "tornado")), "The following functions were not found: mcmc_animal, mcmc_tornado") }) bayesplot/tests/testthat/test-helpers-shared.R0000644000176200001440000000706014057717550021302 0ustar liggesuserslibrary(bayesplot) context("Shared: misc. functions") # suggested packages ------------------------------------------------------ test_that("suggested_package throws correct errors", { expect_error(suggested_package("NOPACKAGE"), "Please install the NOPACKAGE package") expect_error(suggested_package(c("testthat", "gridExtra")), "length") expect_silent(suggested_package("testthat")) expect_silent(suggested_package("testthat", min_version = "0.0.1")) expect_error(suggested_package("testthat", min_version = "100000.0.0")) }) # check_ignored_arguments ------------------------------------------------- test_that("check_ignored_arguments throws correct warnings", { expect_warning(check_ignored_arguments(a = 1, b = "2"), "The following arguments were unrecognized and ignored: a, b") expect_warning(check_ignored_arguments(a = 1, b = "2", ok_args = c("a", "c")), "The following arguments were unrecognized and ignored: b") expect_silent(check_ignored_arguments(a = 1, b = "2", ok_args = c("a", "b", "c"))) }) # parameter selection ----------------------------------------------------- all_pars <- c("param_1", "param_2", "param[1]", "param[2]", "param[1,3,5]", "param[2,4,5]", "alpha", "beta") test_that("select_parameters throws errors if 'explicit' not found", { expect_error(select_parameters(explicit = c("alpha", "ALPHA"), complete_pars = all_pars), "don't match parameter names: ALPHA") expect_error(select_parameters(c("BETA", "ALPHA"), complete = all_pars), "don't match parameter names: BETA, ALPHA") }) test_that("select_parameters throws errors if no regex matches", { expect_error(select_parameters(explicit = c("alpha", "beta"), patterns = "tomato|apple", complete_pars = all_pars), "No matches for 'regex_pars'") }) test_that("select_parameters works with regex", { expect_identical(select_parameters(patterns = "param", complete = all_pars), all_pars[-c(7:8)]) expect_identical(select_parameters(patterns = c("param", "tomato"), complete_pars = all_pars), all_pars[-c(7:8)]) expect_identical(select_parameters(patterns = c("param\\[", "tomato"), complete_pars = all_pars), all_pars[3:6]) expect_identical(select_parameters(patterns = c("param\\_"), complete_pars = all_pars), all_pars[1:2]) }) test_that("select_parameters works without regex", { expect_identical(select_parameters(explicit = "alpha", complete_pars = all_pars), "alpha") expect_identical(select_parameters(c("alpha", "param[1,3,5]"), complete_pars = all_pars), c("alpha", "param[1,3,5]")) }) test_that("select_parameters works with both explicit and regex", { expect_identical(select_parameters(explicit = "alpha", patterns = "param", complete_pars = all_pars), c("alpha", all_pars[-c(7:8)])) expect_identical(select_parameters(explicit = "alpha", patterns = "alpha", complete_pars = all_pars), "alpha") expect_identical(select_parameters(explicit = c("alpha", "beta"), patterns = "param\\[|param\\_", complete_pars = all_pars), c(all_pars[7:8], all_pars[-c(7:8)])) }) bayesplot/tests/testthat/data-for-ppc-tests.R0000644000176200001440000000134614057717550021035 0ustar liggesusersset.seed(8420) y <- rnorm(100) yrep <- matrix(rnorm(2500), ncol = 100) group <- gl(4, 25, labels = LETTERS[1:4]) status_y <- rep_len(0:1, length.out = length(y)) y2 <- rpois(30, 1) yrep2 <- matrix(rpois(30, 1), ncol = 30) group2 <- rep(1, 30) status_y2 <- rep_len(0:1, length.out = length(y2)) # for vdiffr visual tests set.seed(11172017) vdiff_y <- rnorm(100) vdiff_yrep <- matrix(rnorm(2500), ncol = 100) vdiff_group <- gl(4, 25, labels = LETTERS[1:4]) vdiff_status_y <- rep_len(0:1, length.out = length(vdiff_y)) vdiff_y2 <- rpois(30, 1) vdiff_yrep2 <- matrix(rpois(30 * 10, 1), ncol = 30, nrow = 10) vdiff_group2 <- rep_len(c(1,2), length.out = 30) vdiff_status_y2 <- rep_len(0:1, length.out = length(vdiff_y2)) set.seed(seed = NULL) bayesplot/tests/testthat/test-mcmc-traces.R0000644000176200001440000001577614057717550020607 0ustar liggesuserslibrary(bayesplot) context("MCMC: traces") source(test_path("data-for-mcmc-tests.R")) test_that("mcmc_trace returns a ggplot object", { expect_gg(mcmc_trace(arr, pars = "beta[1]", regex_pars = "x\\:")) expect_gg(mcmc_trace(arr1chain, pars = "beta[2]", regex_pars = "x\\:")) expect_gg(mcmc_trace(mat)) expect_gg(mcmc_trace(dframe)) expect_gg(mcmc_trace(dframe_multiple_chains)) expect_gg(mcmc_trace(chainlist)) expect_gg(mcmc_trace(arr1)) expect_gg(mcmc_trace(mat1)) expect_gg(mcmc_trace(dframe1)) expect_gg(mcmc_trace(chainlist1)) }) # functions that require multiple chains ---------------------------------- test_that("mcmc_trace_highlight returns a ggplot object", { expect_gg(mcmc_trace_highlight(arr, regex_pars = c("beta", "x\\:"))) expect_gg(mcmc_trace_highlight(dframe_multiple_chains, highlight = 2)) }) test_that("mcmc_trace_highlight throws error if 1 chain but multiple chains required", { expect_error(mcmc_trace_highlight(mat), "requires multiple") expect_error(mcmc_trace_highlight(dframe, highlight = 1), "requires multiple chains") expect_error(mcmc_trace_highlight(arr1chain, highlight = 1), "requires multiple chains") }) test_that("mcmc_trace_highlight throws error if highlight > number of chains", { expect_error(mcmc_trace_highlight(arr, pars = "sigma", highlight = 7), "'highlight' is 7") }) # options ----------------------------------------------------------------- test_that("mcmc_trace options work", { expect_gg(g1 <- mcmc_trace(arr, regex_pars = "beta", window = c(5, 10))) coord <- g1$coordinates expect_equal(g1$coordinates$limits$x, c(5, 10)) expect_gg(g2 <- mcmc_trace(arr, regex_pars = "beta", n_warmup = 10)) ll <- g2$labels expect_true(all(c("xmin", "xmax", "ymin", "ymax") %in% names(ll))) expect_error(mcmc_trace(arr, iter1 = -1)) expect_error(mcmc_trace(arr, n_warmup = 50, iter1 = 20)) }) # displaying divergences in traceplot ------------------------------------- test_that("mcmc_trace 'np' argument works", { skip_if_not_installed("rstanarm") suppressPackageStartupMessages(library(rstanarm)) fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, chains = 2, refresh = 0) draws <- as.array(fit) # divergences via nuts_params divs1 <- ensure_divergences(nuts_params(fit, pars = "divergent__")) g <- mcmc_trace(draws, pars = "sigma", np = divs1) expect_gg(g) l2_data <- g$layers[[2]]$data expect_equal(names(l2_data), "Divergent") # divergences as vector via 'divergences' arg should throw deprecation warning divs2 <- rep_len(c(0,1), length.out = nrow(draws)) expect_warning( g2 <- mcmc_trace(draws, pars = "sigma", divergences = divs2), regexp = "deprecated" ) expect_gg(g2) expect_error( mcmc_trace(draws, pars = "sigma", np = divs1, divergences = divs2), "can't both be specified" ) # check errors & messages expect_error(mcmc_trace(draws, pars = "sigma", np = 1), "length(divergences) == n_iter is not TRUE", fixed = TRUE) expect_error(mcmc_trace(draws[,1,], pars = "sigma", np = divs1), "num_chains(np) == n_chain is not TRUE", fixed = TRUE) expect_error(mcmc_trace(draws, pars = "sigma", np = divs1[1:10, ]), "num_iters(np) == n_iter is not TRUE", fixed = TRUE) divs1$Value[divs1$Parameter == "divergent__"] <- 0 expect_message(mcmc_trace(draws, pars = "sigma", np = divs1), "No divergences to plot.") }) # Visual tests ----------------------------------------------------------------- test_that("mcmc_trace renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace(vdiff_dframe_chains, pars = c("V1", "V2")) p_one_param <- mcmc_trace(vdiff_dframe_chains, pars = "V1") p_warmup <- mcmc_trace( vdiff_dframe_chains, pars = c("V1", "V2"), n_warmup = 200 ) p_iter1 <- mcmc_trace( vdiff_dframe_chains, pars = c("V1", "V2"), iter1 = 200 ) vdiffr::expect_doppelganger("mcmc_trace (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace (one parameter)", p_one_param) vdiffr::expect_doppelganger("mcmc_trace (warmup window)", p_warmup) vdiffr::expect_doppelganger("mcmc_trace (iter1 offset)", p_iter1) }) test_that("mcmc_rank_overlay renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_rank_overlay(vdiff_dframe_chains, pars = c("V1", "V2")) p_base_ref <- mcmc_rank_overlay( vdiff_dframe_chains, pars = c("V1", "V2"), ref_line = TRUE ) p_one_param <- mcmc_rank_overlay(vdiff_dframe_chains, pars = "V1") p_one_param_wide_bins <- mcmc_rank_overlay( vdiff_dframe_chains, pars = "V1", n_bins = 4 ) vdiffr::expect_doppelganger("mcmc_rank_overlay (default)", p_base) vdiffr::expect_doppelganger( "mcmc_rank_overlay (reference line)", p_base_ref ) vdiffr::expect_doppelganger("mcmc_rank_overlay (one parameter)", p_one_param) vdiffr::expect_doppelganger( "mcmc_rank_overlay (wide bins)", p_one_param_wide_bins ) }) test_that("mcmc_rank_hist renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_rank_hist(vdiff_dframe_chains, pars = c("V1", "V2")) p_base_ref <- mcmc_rank_hist( vdiff_dframe_chains, pars = c("V1", "V2"), ref_line = TRUE ) p_one_param <- mcmc_rank_hist(vdiff_dframe_chains, pars = "V1") p_one_param_wide_bins <- mcmc_rank_hist( vdiff_dframe_chains, pars = "V1", n_bins = 4 ) vdiffr::expect_doppelganger("mcmc_rank_hist (default)", p_base) vdiffr::expect_doppelganger( "mcmc_rank_hist (reference line)", p_base_ref ) vdiffr::expect_doppelganger( "mcmc_rank_hist (one parameter)", p_one_param ) vdiffr::expect_doppelganger( "mcmc_rank_hist (wide bins)", p_one_param_wide_bins ) }) test_that("mcmc_trace_highlight renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 1 ) p_2 <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 2 ) p_alpha <- mcmc_trace_highlight( vdiff_dframe_chains, pars = "V1", highlight = 1, alpha = .1 ) vdiffr::expect_doppelganger("mcmc_trace_highlight (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace_highlight (other chain)", p_2) vdiffr::expect_doppelganger("mcmc_trace_highlight (alpha)", p_alpha) }) test_that("mcmc_trace with 'np' renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- mcmc_trace( vdiff_dframe_chains, pars = "V1", np = vdiff_dframe_chains_divergences ) new_style <- trace_style_np(div_color = "black") p_np_style <- mcmc_trace( vdiff_dframe_chains, pars = "V1", np = vdiff_dframe_chains_divergences, np_style = new_style ) vdiffr::expect_doppelganger("mcmc_trace divergences (default)", p_base) vdiffr::expect_doppelganger("mcmc_trace divergences (custom)", p_np_style) }) bayesplot/tests/testthat/test-aesthetics.R0000644000176200001440000001612014057717550020525 0ustar liggesuserslibrary(bayesplot) context("Aesthetics") # color scheme stuff ------------------------------------------------------ prepare_colors_for_test <- function(scheme) { setNames( bayesplot:::master_color_list[[scheme]], bayesplot:::scheme_level_names() ) } test_that("getting and setting the color scheme works", { color_scheme_set("red") expect_equivalent(color_scheme_get(), prepare_colors_for_test("red")) expect_named(prepare_colors_for_test("blue"), scheme_level_names()) expect_named(color_scheme_get(), scheme_level_names()) for (clr in names(master_color_list)) { color_scheme_set(clr) expect_equivalent(color_scheme_get(), prepare_colors_for_test(clr), info = clr) expect_named(color_scheme_get(), scheme_level_names()) } expect_output(print(color_scheme_get("mix-blue-green")), "mix-blue-green") expect_gg(plot(color_scheme_get("mix-blue-green"))) color_scheme_set("blue") expect_equivalent(color_scheme_get("teal"), prepare_colors_for_test("teal")) # error if not character expect_error(color_scheme_set(7), "'scheme' should be a character vector of length 1 or 6") }) test_that("color_scheme_get with i argument works", { a <- color_scheme_get("green", i = 1) expect_equal(length(a), 1) expect_named(a, "light") b <- color_scheme_get("purple", i = c(2, 4, 5)) expect_equal(length(b), 3) expect_named(b, c("light_highlight", "mid_highlight", "dark")) expect_error( color_scheme_get(i = 1:7), "all(i %in% seq_along(scheme)) is not TRUE", fixed = TRUE ) expect_error( color_scheme_get(i = c(1, 3, 3)), "length(unique(i)) == length(i) is not TRUE", fixed = TRUE ) # if is character it should behave the same as internal 'get_color' expect_identical(color_scheme_get(i = c("l", "dh")), get_color(c("l", "dh"))) }) test_that("setting mixed scheme works", { color_scheme_set("mix-gray-blue") expect_equivalent(color_scheme_get(), mixed_scheme("gray", "blue")) color_scheme_set("mix-blue-gray") expect_equivalent(color_scheme_get(), mixed_scheme("blue", "gray")) expect_error(color_scheme_set("mix-green-reds"), "should be one of") expect_error(color_scheme_set("mix-greens-red"), "should be one of") }) test_that("setting brewer scheme works", { skip_if_not_installed("RColorBrewer") color_scheme_set("brewer-Blues") expect_equivalent(unlist(color_scheme_get()), RColorBrewer::brewer.pal(6, "Blues")) color_scheme_set("brewer-Spectral") expect_equivalent(unlist(color_scheme_get()), RColorBrewer::brewer.pal(6, "Spectral")) expect_error(color_scheme_set("brewer-FAKE"), "FAKE is not a valid palette") }) orange_scheme_bad <- orange_scheme_ok <- c("not_a_color1", "#ffcc80", "#ffad33", "#e68a00", "#995c00", "not_a_color2") orange_scheme_ok[c(1, 6)] <- c("#ffebcc", "#663d00") test_that("color_scheme_set throws correct errors for custom schemes ", { expect_error(color_scheme_set(orange_scheme_bad), "not found: not_a_color1, not_a_color2") expect_error(color_scheme_set(c("red", "blue")), "should be a character vector of length 1 or 6") expect_error(prepare_custom_colors(c("red", "blue")), "Custom color schemes must contain exactly 6 colors") }) test_that("mixed_scheme internal function doesn't error", { x <- mixed_scheme("green", "red") expect_equal(length(x), 6) expect_true(all(sapply(x, is.character))) }) test_that("custom color schemes work", { color_scheme_set(orange_scheme_ok) expect_named(color_scheme_get()) expect_equivalent(unlist(color_scheme_get()), orange_scheme_ok) random_scheme <- colors()[sample(length(colors()), 6)] color_scheme_set(random_scheme) expect_equivalent(unlist(color_scheme_get()), random_scheme) }) test_that("get_color returns correct color values", { scheme <- color_scheme_set("green") levs <- scheme_level_names() ans <- unlist(prepare_colors_for_test("green")[levs], use.names = FALSE) expect_identical(get_color(levs), ans) for (lev in levs) expect_identical(get_color(lev), scheme[[lev]], info = lev) }) test_that("color_scheme_view returns correct ggplot object", { color_scheme_set("red") a <- color_scheme_view() b <- color_scheme_view("green") expect_gg(a) expect_gg(b) expect_identical(a$plot_env$x, color_scheme_get()) expect_identical(b$plot_env$x, color_scheme_get("green")) }) test_that("color_scheme_view returns gtable if length(scheme) >= 1", { expect_gtable(color_scheme_view(c("red", "gray"))) expect_gtable(color_scheme_view(c("red", "gray", "blue"))) }) # ggplot themes ------------------------------------------------------------ default <- theme_default() minimal <- ggplot2::theme_minimal() dark <- ggplot2::theme_dark() test_that("theme_default creates ggplot theme", { expect_type(default, "list") expect_s3_class(default, "theme") thm2 <- theme_default(base_size = 13) expect_type(thm2, "list") expect_s3_class(thm2, "theme") expect_equal(thm2[["text"]][["size"]], 13) }) test_that("bayesplot_theme_set/get work", { bayesplot_theme_set() expect_identical(bayesplot_theme_get(), default) expect_identical(bayesplot_theme_set(), default) old <- bayesplot_theme_set(minimal) expect_identical(old, default) expect_identical(bayesplot_theme_get(), minimal) }) test_that("bayesplot_theme_update/replace work", { bayesplot_theme_set(minimal) old <- bayesplot_theme_update(axis.text.x = ggplot2::element_text(color = "red")) expect_identical(old, minimal) thm <- bayesplot_theme_get() expect_identical(thm, minimal + xaxis_text(color = "red")) expect_equal(thm$axis.text.x$colour, "red") expect_null(thm$axis.text.x$size) bayesplot_theme_update(axis.text.x = ggplot2::element_text(size = 13)) thm <- bayesplot_theme_get() expect_equal(thm$axis.text.x$colour, "red") expect_equal(thm$axis.text.x$size, 13) old <- bayesplot_theme_replace(axis.text.x = ggplot2::element_text(color = "green")) expect_identical(old, thm) thm <- bayesplot_theme_get() expect_equal(thm$axis.text.x$colour, "green") expect_null(thm$axis.text.x$size) }) test_that("ggplot2::theme_set overrides bayesplot theme", { ggplot2::theme_set(dark) bayesplot_theme_set() expect_identical(ggplot2::theme_get(), dark) expect_identical(bayesplot_theme_get(), default) ggplot2::theme_set(minimal) expect_identical(bayesplot_theme_get(), minimal) }) bayesplot_theme_set(bayesplot::theme_default()) color_scheme_set() # Visual tests ------------------------------------------------------------ test_that("color_scheme_view renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") color_scheme_set() p_default <- color_scheme_view() vdiffr::expect_doppelganger("color_scheme_view (default)", p_default) p_red <- color_scheme_view("red") vdiffr::expect_doppelganger("color_scheme_view (scheme specified)", p_red) p_mix <- color_scheme_view("mix-red-blue") vdiffr::expect_doppelganger("color_scheme_view (mixed scheme)", p_mix) p_brewer <- color_scheme_view("brewer-Spectral") vdiffr::expect_doppelganger("color_scheme_view (brewer palette)", p_brewer) color_scheme_set() }) bayesplot/tests/testthat/test-ppc-errors.R0000644000176200001440000000530614057717550020471 0ustar liggesuserslibrary(bayesplot) context("PPC: predictive errors") source(test_path("data-for-ppc-tests.R")) test_that("ppc_error_hist and ppc_error_scatter return ggplot object", { expect_gg(ppc_error_hist(y, yrep[1:5, ])) expect_gg(ppc_error_scatter(y, yrep[1:5, ])) expect_gg(ppc_error_hist(y, yrep[1,, drop = FALSE])) expect_gg(ppc_error_scatter(y, yrep[1,, drop = FALSE])) expect_gg(ppc_error_hist(y2, yrep2)) expect_gg(ppc_error_scatter(y2, yrep2)) }) test_that("ppc_error_hist_grouped returns ggplot object", { expect_gg(ppc_error_hist_grouped(y, yrep[1:5, ], group)) expect_gg(ppc_error_hist_grouped(y, yrep[1,, drop = FALSE], group, freq = FALSE, binwidth = 1)) }) test_that("ppc_error_scatter_avg returns ggplot2 object", { expect_gg(ppc_error_scatter_avg(y, yrep)) expect_gg(ppc_error_scatter_avg(y, yrep[1:5, ])) }) test_that("ppc_error_scatter_avg same as ppc_error_scatter if nrow(yrep) = 1", { expect_equal( ppc_error_scatter_avg(y2, yrep2), ppc_error_scatter(y2, yrep2), check.environment = FALSE ) expect_equal( ppc_error_scatter_avg(y, yrep[1,, drop=FALSE]), ppc_error_scatter(y, yrep[1,, drop = FALSE]), check.environment = FALSE ) }) test_that("ppc_error_scatter_avg_vs_x returns ggplot2 object", { expect_gg(ppc_error_scatter_avg_vs_x(y, yrep, x = rnorm(length(y)))) expect_gg(ppc_error_scatter_avg_vs_x(y, yrep[1:5, ], x = rnorm(length(y)))) }) test_that("ppc_error_binned returns ggplot object", { load(test_path("data-for-binomial.rda")) expect_gg(ppc_error_binned(y, Ey)) expect_gg(ppc_error_binned(y[1:5], Ey[, 1:5])) expect_gg(ppc_error_binned(rep(y, 2), cbind(Ey, Ey))) }) test_that("bin_errors works for edge cases", { ans <- data.frame( ey_bar = c(1, NaN), err_bar = c(0, NaN), se2 = c(0, NaN), bin = c(1, 2) ) val <- bin_errors(rep(1, 10), rep(0, 10), bins = 1) expect_equal(ans, val) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_error_binned renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") rbeta2 <- function(n, mu, phi) { a <- mu * phi b <- (1 - mu) * phi rbeta(n, a, b) } set.seed(100) y <- rbeta(50, shape1 = 1, shape2 = 10) four_draws <- structure( c(-2.118, -2.061, -2.069, -2.011, 7.604, 9.720, 9.7186, 10.1888), .Dim = c(4L, 2L), .Dimnames = list( iterations = NULL, parameters = c("(Intercept)", "(phi)") ) ) y_rep <- t(apply(four_draws, 1, function(x) rbeta2(50, plogis(x[1]), x[2]))) p_base <- ppc_error_binned(y, y_rep) vdiffr::expect_doppelganger( title = "ppc_error_binned (default)", fig = p_base ) }) bayesplot/tests/testthat/test-ppc-intervals.R0000644000176200001440000001314514057717550021164 0ustar liggesuserslibrary(bayesplot) context("PPC: intervals & ribbon") source(test_path("data-for-ppc-tests.R")) test_that("ppc_intervals returns ggplot object", { expect_gg(ppc_intervals(y, yrep)) expect_gg(ppc_intervals(y, yrep, size = 2, fatten = 1)) expect_gg(ppc_intervals(y, yrep, x = seq(1, 2 * length(y), by = 2))) expect_gg(ppc_intervals(y2, yrep2)) }) test_that("ppc_ribbon returns ggplot object", { expect_gg(ppc_ribbon(y, yrep, prob = 0.5)) expect_gg(ppc_ribbon(y, yrep, alpha = 0, size = .5)) expect_gg(ppc_ribbon(y2, yrep2, x = rnorm(length(y2)), prob = 0.5)) }) y <- rnorm(50) yrep <- matrix(rnorm(500, 0, 2), ncol = 50) x <- rep(1:10, each = 5) group <- gl(5, 1, length = 50, labels = LETTERS[1:5]) test_that("ppc_intervals_grouped returns ggplot object", { expect_gg(ppc_intervals_grouped(y, yrep, x, group)) }) test_that("ppc_ribbon_grouped returns ggplot object", { expect_gg(ppc_ribbon_grouped(y, yrep, x, group)) expect_gg(ppc_ribbon_grouped(y, yrep, x, group, facet_args = list(scales = "fixed"))) }) test_that("ppc_intervals_data returns correct structure", { d <- ppc_intervals_data(y, yrep, x = 1:length(y), prob = .9) d_group <- ppc_intervals_data(y, yrep, x, group) expect_named(d, c("y_id", "y_obs", "x", "outer_width", "inner_width", "ll", "l", "m", "h", "hh")) expect_named(d_group, c("y_id", "y_obs", "group", "x", "outer_width", "inner_width", "ll", "l", "m", "h", "hh")) expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob = 0), "prob") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob = 1.01), "prob") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob_outer = 0), "prob_outer") expect_error( ppc_intervals_data(y, yrep, x = 1:length(y), prob_outer = 1.01), "prob_outer") }) test_that("ppc_intervals_data does math correctly", { d <- ppc_intervals_data(y, yrep, prob = .4, prob_outer = .8) qs <- unname(quantile(yrep[, 1], c(.1, .3, .5, .7, .9))) expect_equal(d$ll[1], qs[1]) expect_equal(d$l[1], qs[2]) expect_equal(d$m[1], qs[3]) expect_equal(d$h[1], qs[4]) expect_equal(d$hh[1], qs[5]) # Testing groups and known quantiles y <- rep(10, 4) group <- c("a", "a", "b", "b") yrep_g1 <- matrix(rep((0:20), 2), ncol = 2) yrep_g2 <- yrep_g1 - 10 yrep <- cbind(yrep_g1, yrep_g2) d <- ppc_intervals_data(y, yrep, group = group, prob = .5, prob_outer = .9) expect_equal(unique(d$inner_width), .5) expect_equal(unique(d$outer_width), .9) expect_equal(d$ll, c( 1, 1, -9, -9)) expect_equal(d$l, c( 5, 5, -5, -5)) expect_equal(d$m, c(10, 10, 0, 0)) expect_equal(d$h, c(15, 15, 5, 5)) expect_equal(d$hh, c(19, 19, 9, 9)) }) # Visual tests ----------------------------------------------------------------- test_that("ppc_intervals renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_intervals(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_intervals (default)", p_base) p_x <- ppc_intervals(vdiff_y, vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppc_intervals (x values)", p_x) p_50 <- ppc_intervals(vdiff_y, vdiff_yrep, prob = .50) vdiffr::expect_doppelganger("ppc_intervals (interval width)", p_50) }) test_that("ppc_intervals_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_intervals_grouped(vdiff_y, vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppc_intervals_grouped (default)", p_base) p_x <- ppc_intervals_grouped( y = vdiff_y, yrep = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppc_intervals_grouped (x values)", p_x) }) test_that("ppc_ribbon renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ribbon(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_ribbon (default)", p_base) p_x <- ppc_ribbon(vdiff_y, vdiff_yrep, x = vdiff_y) vdiffr::expect_doppelganger("ppc_ribbon (x values)", p_x) p_50 <- ppc_ribbon(vdiff_y, vdiff_yrep, prob = 0.5) vdiffr::expect_doppelganger("ppc_ribbon (interval width)", p_50) p_line <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "line") vdiffr::expect_doppelganger("ppc_intervals (y_draw = line)", p_line) p_point <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "point") vdiffr::expect_doppelganger("ppc_intervals (y_draw = point)", p_point) p_both <- ppc_ribbon(vdiff_y, vdiff_yrep, y_draw = "both") vdiffr::expect_doppelganger("ppc_intervals (y_draw = both)", p_both) }) test_that("ppc_ribbon_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group) vdiffr::expect_doppelganger("ppc_ribbon_grouped (default)", p_base) p_line <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "line") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = line)", p_line) p_point <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "point") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = point)", p_point) p_both <- ppc_ribbon_grouped(vdiff_y, vdiff_yrep, group = vdiff_group, y_draw = "both") vdiffr::expect_doppelganger("ppc_ribbon_grouped (y_draw = both)", p_both) p_x <- ppc_ribbon_grouped( y = vdiff_y, yrep = vdiff_yrep, x = vdiff_y, group = vdiff_group) vdiffr::expect_doppelganger("ppc_ribbon_grouped (x values)", p_x) }) bayesplot/tests/testthat/test-ppc-test-statistics.R0000644000176200001440000001041514057717550022321 0ustar liggesuserslibrary(bayesplot) context("PPC: test-statistics") source(test_path("data-for-ppc-tests.R")) q25 <- function(x) quantile(x, 0.25) prop0 <- function(x) mean(x == 0) test_that("ppc_stat throws errors if function not found", { expect_error(ppc_stat(y, yrep, stat = "9999"), "not found") expect_error(ppc_stat_grouped(y, yrep, group, stat = "9999"), "not found") expect_error(ppc_stat_freqpoly_grouped(y, yrep, group, stat = "9999"), "not found") }) test_that("ppc_stat throws errors if 'stat' wrong length", { expect_error(ppc_stat(y, yrep, stat = c("mean", "sd")), "not a function") expect_error(ppc_stat_grouped(y, yrep, group, stat = c("mean", "sd")), "not a function") expect_error(ppc_stat_freqpoly_grouped(y, yrep, group, stat = c(mean, sd)), "not a function") }) test_that("ppc_stat returns ggplot object", { expect_gg(ppc_stat(y, yrep)) expect_gg(ppc_stat(y, yrep, stat = "sd")) expect_gg(ppc_stat(y, yrep, stat = sd)) expect_gg(ppc_stat(y, yrep, stat = "q25")) expect_gg(ppc_stat(y, yrep, stat = q25)) expect_gg(ppc_stat(y, yrep, stat = function(x) median(x))) expect_gg(ppc_stat(y2, yrep2)) expect_gg(ppc_stat(y2, yrep2, stat = "prop0")) }) test_that("ppc_stat_2d returns ggplot object", { expect_gg(ppc_stat_2d(y, yrep)) expect_gg(ppc_stat_2d(y, yrep, stat = c("q25", "median"))) expect_gg(ppc_stat_2d(y, yrep, stat = c("q25", median))) expect_gg(ppc_stat_2d(y, yrep, stat = c(function(x) mean(x), function(y) sd(y)))) expect_gg(ppc_stat_2d(y2, yrep2)) }) test_that("ppc_stat_2d erros if more than 2 stats", { expect_error(ppc_stat_2d(y, yrep, stat = c("mean", "sd", "var")), "argument must have length 2") }) test_that("ppc_stat_grouped returns ggplot object", { expect_gg(ppc_stat_grouped(y, yrep, group)) expect_gg(ppc_stat_grouped(y, yrep, as.numeric(group), stat = function(z) var(z))) expect_gg(ppc_stat_grouped(y, yrep, as.integer(group), stat = "sd")) }) test_that("ppc_stat_freqpoly_grouped returns ggplot object", { expect_gg(ppc_stat_freqpoly_grouped(y, yrep, group, stat = "sd", freq = FALSE)) expect_gg(ppc_stat_freqpoly_grouped(y, yrep, group, stat = function(x) sd(x), freq = TRUE)) }) # Visual tests ------------------------------------------------------------ test_that("ppc_stat renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat(vdiff_y, vdiff_yrep) + yaxis_text() vdiffr::expect_doppelganger("ppc_stat (default)", p_base) p_custom <- ppc_stat( y = vdiff_y, yrep = vdiff_yrep, stat = "mad", binwidth = .05, freq = FALSE ) + yaxis_text() vdiffr::expect_doppelganger( title = "ppc_stat (stat, binwidth, freq)", fig = p_custom) }) test_that("ppc_stat_2d renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_2d(vdiff_y, vdiff_yrep) vdiffr::expect_doppelganger("ppc_stat_2d (default)", p_base) p_custom <- ppc_stat_2d( y = vdiff_y, yrep = vdiff_yrep, stat = c("median", "mad"), size = 5, alpha = 1 ) vdiffr::expect_doppelganger( title = "ppc_stat_2d (stat, size, alpha)", fig = p_custom) }) test_that("ppc_stat_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_stat_grouped (default)", p_base) p_custom <- ppc_stat_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, stat = stats::var, facet_args = list(scales = "fixed", ncol = 1), binwidth = .25 ) vdiffr::expect_doppelganger( title = "ppc_stat_grouped (stat, facet_args, binwidth)", fig = p_custom) }) test_that("ppc_stat_freqpoly_grouped renders correctly", { testthat::skip_on_cran() testthat::skip_if_not_installed("vdiffr") p_base <- ppc_stat_freqpoly_grouped(vdiff_y, vdiff_yrep, vdiff_group) vdiffr::expect_doppelganger("ppc_stat_freqpoly_grouped (default)", p_base) p_custom <- ppc_stat_freqpoly_grouped( y = vdiff_y, yrep = vdiff_yrep, group = vdiff_group, stat = "sum", facet_args = list(scales = "fixed", ncol = 1), binwidth = .5 ) vdiffr::expect_doppelganger( title = "ppc_stat_freqpoly_grouped (stat, facet_args, binwidth)", fig = p_custom) }) bayesplot/tests/testthat.R0000644000176200001440000000037214057717550015416 0ustar liggesuserslibrary(testthat) library(bayesplot) Sys.unsetenv("R_TESTS") test_check("bayesplot") # Alternative interactive tester that doesn't bail after 24 failures # pr <- testthat::ProgressReporter$new() # pr$max_fail = 1000 # devtools::test(reporter = pr) bayesplot/vignettes/0000755000176200001440000000000014061476543014276 5ustar liggesusersbayesplot/vignettes/plotting-mcmc-draws.Rmd0000644000176200001440000003020014057717550020631 0ustar liggesusers--- title: "Plotting MCMC draws using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Plotting MCMC draws} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") ``` ## Introduction This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html), and graphical posterior predictive model checking is covered in the vignette [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html). ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example model The **bayesplot** package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model. In this vignette we'll use draws obtained using the `stan_glm` function in the **rstanarm** package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the **bayesplot** package. See, for example, **brms**, which, like **rstanarm**, calls the **rstan** package internally to use [Stan](https://mc-stan.org/)'s MCMC sampler. ```{r mtcars} head(mtcars) # see help("mtcars") ``` ```{r, eval=FALSE} # linear regression model using stan_glm # using '~ .' to include all variables fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) print(fit) ``` ```{r stan_glm, include=FALSE} fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ``` ```{r print-fit, echo=FALSE} print(fit) ``` To use the posterior draws with the functions in the **bayesplot** package we'll extract them from the fitted model object: ```{r get-draws} posterior <- as.array(fit) dim(posterior) dimnames(posterior) ``` We've used `as.array` above (as opposed to `as.matrix`) because it keeps the Markov chains separate (`stan_glm` runs four chains by default). Most of the plots don't actually need the chains to be separate, but for a few of the plots we make in this vignette we'll want to show the chains individually.
## Posterior uncertainty intervals For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called "credible intervals") in various ways. **bayesplot** currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases). **Documentation:** * `help("MCMC-intervals")` * [mc-stan.org/bayesplot/reference/MCMC-intervals](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) ------ #### mcmc_intervals, mcmc_areas Central posterior uncertainty intervals can be plotted using the `mcmc_intervals` function. ```{r mcmc_intervals} color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ``` The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the `prob` and `prob_outer` arguments, respectively. The points in the above plot are posterior medians. The `point_est` argument can be used to select posterior means instead or to omit the point estimates. To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the `mcmc_areas` function. ```{r mcmc_areas} mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ```
## Univariate marginal posterior distributions **bayesplot** provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate. **Documentation:** * `help("MCMC-distributions")` * [mc-stan.org/bayesplot/reference/MCMC-distributions](https://mc-stan.org/bayesplot/reference/MCMC-distributions.html) ------ #### mcmc_hist The `mcmc_hist` function plots marginal posterior distributions (combining all chains): ```{r mcmc_hist, message=FALSE} color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ``` If we want to plot `log(sigma)` rather than `sigma` we can either transform the draws in advance or use the `transformations` argument. ```{r mcmc_hist-transform, message=FALSE} color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ``` Most of the other functions for plotting MCMC draws also have a `transformations` argument. #### mcmc_hist_by_chain To view separate histograms of each of the four Markov chains we can use `mcmc_hist_by_chain`, which plots each chain in a separate facet in the plot. ```{r mcmc_hist_by_chain, message=FALSE} color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens The `mcmc_dens` function is similar to `mcmc_hist` but plots kernel density estimates instead of histograms. ```{r mcmc_dens, message=FALSE} color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens_overlay Like `mcmc_hist_by_chain`, the `mcmc_dens_overlay` function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid. ```{r mcmc_dens_overlay, message=FALSE} mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ``` #### mcmc_violin The `mcmc_violin` function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles. ```{r mcmc_violin} color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ```
## Bivariate plots Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. **Documentation:** * `help("MCMC-scatterplots")` * [mc-stan.org/bayesplot/reference/MCMC-scatterplots](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) ------ #### mcmc_scatter The `mcmc_scatter` function creates a simple scatterplot of two parameters. ```{r mcmc_scatter} color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ``` #### mcmc_hex The `mcmc_hex` function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting. ```{r mcmc_hex} # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ``` #### mcmc_pairs In addition to `mcmc_scatter` and `mcmc_hex`, __bayesplot__ now provides an `mcmc_pairs` function for creating pairs plots with more than two parameters. ```{r mcmc_pairs, message=FALSE} color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ``` The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting `diag_fun="dens"`. Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting `off_diag_fun="hex"`. By default, `mcmc_pairs` shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the `condition` argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette.
## Trace plots Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that **bayesplot** can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette provides an example of also adding information about divergences to trace plots. **Documentation:** * `help("MCMC-traces")` * [mc-stan.org/bayesplot/reference/MCMC-traces](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) ------- #### mcmc_trace The `mcmc_trace` function creates standard trace plots: ```{r mcmc_trace} color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ``` If it's hard to see the difference between the chains we can change to a mixed color scheme, for example: ```{r change-scheme} color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ``` The code above also illustrates the use of the `facet_args` argument, which is a list of parameters passed to `facet_wrap` in __ggplot2__. Specifying `ncol=1` means the trace plots will be stacked in a single column rather than placed side by side, and `strip.position="left"` moves the facet labels to the y-axis (instead of above each facet). The [`"viridis"` color scheme](https://CRAN.R-project.org/package=viridis) is also useful for trace plots because it is comprised of very distinct colors: ```{r viridis-scheme, eval=FALSE} color_scheme_set("viridis") mcmc_trace(posterior, pars = "(Intercept)") ``` #### mcmc_trace_highlight The `mcmc_trace_highlight` function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the `highlight` argument). ```{r mcmc_trace_highlight} mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) ```
## References Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. (2017). *Stan Modeling Language Users Guide and Reference Manual*. https://mc-stan.org/users/documentation/ bayesplot/vignettes/graphical-ppcs.Rmd0000644000176200001440000003634314057717550017651 0ustar liggesusers--- title: "Graphical posterior predictive checks using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Graphical posterior predictive checks} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") set.seed(840) ``` ## Introduction This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and MCMC diagnostics are covered in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. ### Graphical posterior predictive checks (PPCs) The **bayesplot** package provides various plotting functions for _graphical posterior predictive checking_, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution ([Gabry et al, 2019](#gabry2019)). The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the _posterior predictive distribution_. This is the distribution of the outcome variable implied by a model after using the observed data $y$ (a vector of $N$ outcome values) to update our beliefs about unknown model parameters $\theta$. The posterior predictive distribution for observation $\widetilde{y}$ can be written as $$p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.$$ Typically we will also condition on $X$ (a matrix of predictor variables). For each draw (simulation) $s = 1, \ldots, S$ of the parameters from the posterior distribution, $\theta^{(s)} \sim p(\theta \,|\, y)$, we draw an entire vector of $N$ outcomes $\widetilde{y}^{(s)}$ from the posterior predictive distribution by simulating from the data model conditional on parameters $\theta^{(s)}$. The result is an $S \times N$ matrix of draws $\widetilde{y}$. When simulating from the posterior predictive distribution we can use either the same values of the predictors $X$ that we used when fitting the model or new observations of those predictors. When we use the same values of $X$ we denote the resulting simulations by $y^{rep}$, as they can be thought of as replications of the outcome $y$ rather than predictions for future observations ($\widetilde{y}$ using predictors $\widetilde{X}$). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation. Using the replicated datasets drawn from the posterior predictive distribution, the functions in the **bayesplot** package create various graphical displays comparing the observed data $y$ to the replications. The names of the **bayesplot** plotting functions for posterior predictive checking all have the prefix `ppc_`. ### Setup In addition to **bayesplot** we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example models To demonstrate some of the various PPCs that can be created with the **bayesplot** package we'll use an example of comparing Poisson and Negative binomial regression models from one of the **rstanarm** [package vignettes](https://mc-stan.org/rstanarm/articles/count.html) (Gabry and Goodrich, 2017). > We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. [...] The regression predictors for the model are the pre-treatment number of roaches `roach1`, the treatment indicator `treatment`, and a variable `senior` indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure [...]. First we fit a Poisson regression model with outcome variable `y` representing the roach count in each apartment at the end of the experiment. ```{r roaches-data} head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ``` ```{r roaches-model-pois, message=FALSE} # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ``` ```{r print-pois} print(fit_poisson) ``` We'll also fit the negative binomial model that we'll compare to the Poisson: ```{r roaches-model-nb, message=FALSE} fit_nb <- update(fit_poisson, family = "neg_binomial_2") ``` ```{r print-nb} print(fit_nb) ``` ### Defining `y` and `yrep` In order to use the PPC functions from the **bayesplot** package we need a vector `y` of outcome values, ```{r y} y <- roaches$y ``` and a matrix `yrep` of draws from the posterior predictive distribution, ```{r yrep} yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ``` Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in `y`. Since we fit the models using __rstanarm__ we used its special `posterior_predict` function, but if we were using a model fit with the __rstan__ package we could create `yrep` in the `generated quantities` block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with **bayesplot** regardless of whether or not the model was fit using an interface to Stan. **bayesplot** just requires a `yrep` matrix that has `number_of_draws` rows and `number_of_observations` columns.
## Histograms and density estimates #### ppc_dens_overlay The first PPC we'll look at is a comparison of the distribution of `y` and the distributions of some of the simulated datasets (rows) in the `yrep` matrix. ```{r ppc_dens_overlay} color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ``` In the plot above, the dark line is the distribution of the observed outcomes `y` and each of the 50 lighter lines is the kernel density estimate of one of the replications of `y` from the posterior predictive distribution (i.e., one of the rows in `yrep`). This plot makes it easy to see that this model fails to account for the large proportion of zeros in `y`. That is, the model predicts fewer zeros than were actually observed. To see the discrepancy at the lower values of more clearly we can use the `xlim` function from **ggplot2** to restrict the range of the x-axis: ```{r ppc_dens_overlay-2, message=FALSE, warning=FALSE} ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ``` See Figure 6 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_dens_overlay`. #### ppc_hist We could see the same thing from a different perspective by looking at separate histograms of `y` and some of the `yrep` datasets using the `ppc_hist` function: ```{r ppc_hist, message=FALSE} ppc_hist(y, yrep_poisson[1:5, ]) ``` The same plot for the negative binomial model looks much different: ```{r ppc_hist-nb, message=FALSE} ppc_hist(y, yrep_nb[1:5, ]) ``` The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in: ```{r ppc_hist-nb-2, message=FALSE} ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ```
## Distributions of test statistics Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in `yrep` and compare to the proportion of observed zeros in `y`. #### ppc_stat First we define a function that takes a vector as input and returns the proportion of zeros: ```{r prop_zero} prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ``` The `stat` argument to `ppc_stat` accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify `stat = "prop_zero"` since we've already defined the `prop_zero` function, but we also could have used `stat = function(x) mean(x == 0)`. ```{r ppc_stat, message=FALSE} ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ``` The dark line is at the value $T(y)$, i.e. the value of the test statistic computed from the observed $y$, in this case `prop_zero(y)`. The lighter area on the left is actually a histogram of the proportion of zeros in in the `yrep` simulations, but it can be hard to see because almost none of the simulated datasets in `yrep` have any zeros. Here's the same plot for the negative binomial model: ```{r ppc_stat-nb, message=FALSE} ppc_stat(y, yrep_nb, stat = "prop_zero") ``` Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson. However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial: ```{r ppc_stat-max, message=FALSE} ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ``` See Figure 7 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat`.
## Other PPCs and PPCs by group There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see `help("PPC-overview")` from R or the [online documentation](https://mc-stan.org/bayesplot/reference/index.html#section-ppc) on the Stan website. The `available_ppc` function can also be used to list the names of all PPC plotting functions: ```{r available_ppc} available_ppc() ``` Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in `_grouped` and will accept an additional argument `group`. The full list of currently available `_grouped` functions is: ```{r available_ppc-grouped} available_ppc(pattern = "_grouped") ``` #### ppc_stat_grouped For example, `ppc_stat_grouped` is the same as `ppc_stat` except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level: ```{r ppc_stat_grouped, message=FALSE} ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ``` See Figure 8 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat_grouped`.
## Providing an interface to bayesplot PPCs from another package The **bayesplot** package provides the S3 generic function `pp_check`. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis. To provide an interface to **bayesplot** from your package, you can very easily define a `pp_check` method (or multiple `pp_check` methods) for the fitted model objects created by your package. All a `pp_check` method needs to do is provide the `y` vector and `yrep` matrix arguments to the various plotting functions included in **bayesplot**. ### Defining a `pp_check` method Here is an example for how to define a simple `pp_check` method in a package that creates fitted model objects of class `"foo"`. We will define a method `pp_check.foo` that extracts the data `y` and the draws from the posterior predictive distribution `yrep` from an object of class `"foo"` and then calls one of the plotting functions from **bayesplot**. Suppose that objects of class `"foo"` are lists with named components, two of which are `y` and `yrep`. Here's a simple method `pp_check.foo` that offers the user the option of two different plots: ```{r pp_check.foo} # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ``` To try out `pp_check.foo` we can just make a list with `y` and `yrep` components and give it class `foo`: ```{r foo-object} x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ``` ```{r pp_check-1, message=FALSE} color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ``` ```{r pp_check-2} color_scheme_set("darkgray") pp_check(x, type = "overlaid") ``` ### Examples of `pp_check` methods in other packages Several packages currently use this approach to provide an interface to **bayesplot**'s graphical posterior predictive checks. See, for example, the `pp_check` methods in the [**rstanarm**](https://CRAN.R-project.org/package=rstanarm) and [**brms**](https://CRAN.R-project.org/package=brms) packages.
## References Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ bayesplot/vignettes/children/0000755000176200001440000000000014057717550016067 5ustar liggesusersbayesplot/vignettes/children/SETTINGS-knitr.txt0000644000176200001440000000045714057717550021223 0ustar liggesusers```{r, SETTINGS-knitr, include=FALSE} stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ``` bayesplot/vignettes/visual-mcmc-diagnostics.Rmd0000644000176200001440000007731114061476147021500 0ustar liggesusers--- title: "Visual MCMC diagnostics using the bayesplot package" author: "Jonah Gabry and Martin Modrák" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Visual MCMC diagnostics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development ``` ## Introduction This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the `n_eff` and `Rhat` statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and graphical posterior predictive model checking is covered in the [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html) vignette. Note that most of these plots can also be browsed interactively using the [shinystan](https://mc-stan.org/shinystan/) package. ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstan__, for fitting the example models used throughout the vignette ```{r setup, eval=FALSE} library("bayesplot") library("ggplot2") library("rstan") ``` ### Example model Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we'll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the [RStan Getting Started](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started#how-to-use-rstan) wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates `y` and standard errors `sigma` from analyses of test prep programs in `J=8` schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates. ```{r schools_dat} schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ``` The model is: $$ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} $$ with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code: ```{stan stancode1, output.var = "schools_mod_cp"} // Saved in 'schools_mod_cp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] theta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); theta ~ normal(mu, tau); y ~ normal(theta, sigma); } ``` This parameterization of the model is referred to as the centered parameterization (CP). We'll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector $\theta$ with a vector $\eta$ of a priori _i.i.d._ standard normal parameters and then constructs $\theta$ deterministically from $\eta$ by scaling by $\tau$ and shifting by $\mu$: $$ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} $$ The Stan code for this model is: ```{stan, stancode2, output.var = "schools_mod_ncp"} // Saved in 'schools_mod_ncp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] eta; } transformed parameters { vector[J] theta; theta = mu + tau * eta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); eta ~ normal(0, 1); // implies theta ~ normal(mu, tau) y ~ normal(theta, sigma); } ``` The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the __bayesplot__ diagnostic plots, we'll see that, for this data, the NCP is required in order to properly explore the posterior distribution. To fit both models we first translate the Stan code to C++ and compile it using the `stan_model` function. ```{r compile-models, eval=FALSE} schools_mod_cp <- stan_model("schools_mod_cp.stan") schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ``` We then fit the model by calling Stan's MCMC algorithm using the `sampling` function (the increased `adapt_delta` param is to make the sampler a bit more "careful" and avoid false positive divergences), ```{r fit-models-hidden, results='hide', message=FALSE} fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214053, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ``` and extract a `iterations x chains x parameters` array of posterior draws with `as.array`, ```{r extract-draws} # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ``` You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see [Divergent transitions after warmup](https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup). We'll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.
## Diagnostics for the No-U-Turn Sampler The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by [Stan](https://mc-stan.org/) and the various R packages that depend on Stan for fitting Bayesian models. The **bayesplot** package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts. **Documentation:** * `help("MCMC-nuts")` * [mc-stan.org/bayesplot/reference/MCMC-nuts](https://mc-stan.org/bayesplot/reference/MCMC-nuts.html) ------ The special **bayesplot** functions for NUTS diagnostics are ```{r available_mcmc-nuts} available_mcmc(pattern = "_nuts_") ``` Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The **bayesplot** package provides generic functions `log_posterior` and `nuts_params` for extracting this information from fitted model objects. Currently methods are provided for models fit using the **rstan**, **rstanarm** and **brms** packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the `log_posterior` and `nuts_params` methods for stanfit objects: ```{r extract-nuts-info} lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html) vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We'll see examples of this in the next section on divergent transitions. ### Divergent transitions When running the Stan models above, there were warnings about divergent transitions. Here we'll look at diagnosing the source of divergences through visualizations. #### mcmc_parcoord The `mcmc_parcoord` plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences. This function works in general without including information about the divergences, but if the optional `np` argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red). ```{r mcmc_parcoord-1} color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ``` Here, you may notice that divergences in the centered parameterization happen exclusively when `tau`, the hierarchical standard deviation, goes near zero and the values of the `theta`s are essentially fixed. This makes `tau` immediately suspect. See [Gabry et al. (2019)](#gabry2019) for another example of the parallel coordinates plot. #### mcmc_pairs The `mcmc_pairs` function can also be used to look at multiple parameters at once, but unlike `mcmc_parcoord` (which works well even when including several dozen parameters) `mcmc_pairs` is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes). Let's look at how `tau` interacts with other variables, using only one of the `theta`s to keep the plot readable: ```{r mcmc_pairs} mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ``` Note that each bivariate plot is present twice -- by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the `condition` argument for other options). Here, the interaction of `tau` and `theta[1]` seems most interesting, as it concentrates the divergences into a tight region. Further examples of pairs plots and instructions for using the various optional arguments to `mcmc_pairs` are provided via `help("mcmc_pairs")`. #### mcmc_scatter Using the `mcmc_scatter` function (with optional argument `np`) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a "local" parameter (`theta[j]`) against a "global" scale parameter on which it depends (`tau`). We will also use the `transformations` argument to look at the log of `tau`, as this is what Stan is doing under the hood for parameters like `tau` that have a lower bound of zero. That is, even though the draws for `tau` returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming `tau` is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative. First the plot for the centered parameterization: ```{r mcmc_scatter-1} # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ``` The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal's funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space. The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of `tau`. When `tau` is large it allows for large variation in `theta` (and requires large steps) while small `tau` requires small steps in `theta`. The non-centered parameterization avoids this by sampling the `eta` parameter which, unlike `theta`, is _a priori independent_ of `tau`. Then `theta` is computed deterministically from the parameters `eta`, `mu` and `tau` afterwards. Here's the same plot as above, but with `eta[1]` from non-centered parameterization instead of `theta[1]` from the centered parameterization: ```{r mcmc_scatter-2} scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ``` We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. [Gabry et al. (2019)](#gabry2019) has further discussion of this example. Ultimately we only care about `eta` insofar as it enables the Markov chains to better explore the posterior, so let's directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of `theta[1] = mu + eta[1] * tau` instead of `eta[1]`. Below is a side by side comparison with the scatterplot of `theta[1]` vs `log(tau)` from the centered parameterization that we made above. We will also force the plots to have the same $y$-axis limits, which will make the most important difference much more apparent: ```{r mcmc_scatter-3} # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ``` Once we transform the `eta` values into `theta` values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution. #### mcmc_trace Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The `np` argument to the `mcmc_trace` function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks. Here is the trace plot for the `tau` parameter from the centered parameterization: ```{r mcmc_trace} color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ``` The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the `window` argument: ```{r echo=FALSE} #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ``` ```{r mcmc_trace_zoom} mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ``` What we see here is that chains can get stuck as `tau` approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at $\tau \simeq 0$ -- healthy chains jump up and down frequently. #### mcmc_nuts_divergence To understand how the divergences interact with the model globally, we can use the `mcmc_nuts_divergence` function: ```{r mcmc_nuts_divergence} color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ``` In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn't being explored and the plot confirms that `lp|Divergence` indeed has lighter tails than `lp|No divergence`. The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown. Specifying the optional `chain` argument will overlay the plot just for a particular Markov chain on the plot for all chains combined: ```{r mcmc_nuts_divergence-chain} mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ``` For the non-centered parameterization we may get a few warnings about divergences but if we do we'll have far fewer of them to worry about. ```{r mcmc_nuts_divergence-2} mcmc_nuts_divergence(np_ncp, lp_ncp) ``` If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (`adapt_delta`, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution. ```{r fit-adapt-delta, results='hide', message=FALSE} fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` For the first model and this particular data, increasing `adapt_delta` will not solve the problem and a reparameterization is required. ```{r mcmc_nuts_divergence-3} mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ``` ### Energy and Bayesian fraction of missing information The `mcmc_nuts_energy` function creates plots similar to those presented in Betancourt (2017). While `mcmcm_nuts_divergence` can identify light tails and incomplete exploration of the target distribution, the `mcmc_nuts_energy` function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution. #### mcmc_nuts_energy The plot created by `mcmc_nuts_energy` shows overlaid histograms of the (centered) marginal energy distribution $\pi_E$ and the first-differenced distribution $\pi_{\Delta E}$, ```{r mcmc_nuts_energy-1, message=FALSE} color_scheme_set("red") mcmc_nuts_energy(np_cp) ``` The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right): ```{r mcmc_nuts_energy-3, message=FALSE, fig.width=8} compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ``` The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior: ```{r mcmc_nuts_energy-4, message=FALSE, fig.width=8} np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ``` See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.
## General MCMC diagnostics A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The __bayesplot__ package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for [Stan](https://mc-stan.org/) models (or models fit using the same algorithms as Stan). **Documentation:** * `help("MCMC-diagnostics")` * [mc-stan.org/bayesplot/reference/MCMC-diagnostics](https://mc-stan.org/bayesplot/reference/MCMC-diagnostics.html) ------ ### Rhat: potential scale reduction statistic One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-$\hat{R}$. The split-$\hat{R}$ statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and $\hat{R}$ will be one. If the chains have not converged to a common distribution, the $\hat{R}$ statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018). The **bayesplot** package provides the functions `mcmc_rhat` and `mcmc_rhat_hist` for visualizing $\hat{R}$ estimates. First we'll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high $\hat{R}$ values. ```{r fit_cp_bad_rhat, results='hide'} fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ``` **bayesplot** provides a generic `rhat` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $\hat{R}$ values. ```{r print-rhats} rhats <- rhat(fit_cp_bad_rhat) print(rhats) ``` #### mcmc_rhat, mcmc_rhat_hist We can visualize the $\hat{R}$ values with the `mcmc_rhat` function: ```{r echo=FALSE} #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ``` ```{r mcmc_rhat-1} color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ``` In the plot, the points representing the $\hat{R}$ values are colored based on whether they are less than $1.05$, between $1.05$ and $1.1$, or greater than $1.1$. There is no theoretical reason to trichotomize $\hat{R}$ values using these cutoffs, so keep in mind that this is just a heuristic. The $y$-axis text is off by default for this plot because it's only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning $\hat{R}$ values using the `yaxis_text` convenience function (which passes arguments like `hjust` to `ggplot2::element_text`): ```{r mcmc_rhat-2} mcmc_rhat(rhats) + yaxis_text(hjust = 1) ``` If we look at the same model fit using longer Markov chains we should see all $\hat{R} < 1.1$, and all points in the plot the same (light) color: ```{r mcmc_rhat-3} mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ``` We can see the same information shown by `mcmc_rhat` but in histogram form using the `mcmc_rhat_hist` function. See the **Examples** section in `help("mcmc_rhat_hist")` for examples. ### Effective sample size The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The $n_{eff}$ metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are _not_ independent if there is autocorrelation, the effective sample size, $n_{eff}$, is usually smaller than the total sample size, $N$ (although it may be larger in some cases[^1]). The larger the ratio of $n_{eff}$ to $N$ the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) . [^1]: $n_{eff} > N$ indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google "antithetic sampling" or visit [the relevant forum thread](https://discourse.mc-stan.org/t/n-eff-bda3-vs-stan/2608/19) for some further explanation. The **bayesplot** package provides a generic `neff_ratio` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $n_{eff}/N$ values. The `mcmc_neff` and `mcmc_neff_hist` can then be used to plot the ratios. #### mcmc_neff, mcmc_neff_hist ```{r print-neff-ratios} ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ``` In the plot, the points representing the values of $n_{eff}/N$ are colored based on whether they are less than $0.1$, between $0.1$ and $0.5$, or greater than $0.5$. These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any $n_{eff}/N$ less than $0.1$. One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of $n_{eff}$ to $N$ is that the No-U-Turn sampler used by **rstan** generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs). Even for models fit using **rstan** the parameterization can make a big difference. Here are the $n_{eff}/N$ plots for `fit_cp` and `fit_ncp` side by side. ```{r mcmc_neff-compare} neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ``` Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization. ### Autocorrelation As mentioned above, $n_{eff}/N$ decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the `mcmc_acf` (line plot) or `mcmc_acf_bar` (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean. #### `mcmc_acf`, `mcmc_acf_bar` Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, $\theta_1$ is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is $\eta_1$ (and $\theta_1$ is later constructed from $\eta_1$, $\mu$, and $\tau$): ```{r mcmc_acf, out.width = "70%"} compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) ```
## References Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434 Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695 Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906 Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/ Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. *Statistical Science*. 7(4): 457--472. Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. *Journal of Machine Learning Research*. 15:1593--1623. Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. *Journal of Educational and Behavioral Statistics*. 6:377--401. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/ bayesplot/R/0000755000176200001440000000000014057717550012470 5ustar liggesusersbayesplot/R/mcmc-combo.R0000644000176200001440000000704514057717550014635 0ustar liggesusers#' Combination plots #' #' @name MCMC-combos #' @family MCMC #' #' @template args-mcmc-x #' @param ... Arguments passed to the plotting functions named in `combo`. #' @param combo A character vector with at least two elements. Each element of #' `combo` corresponds to a column in the resulting graphic and should be the #' name of one of the available [MCMC][MCMC-overview] functions (omitting the #' `mcmc_` prefix). #' @param widths A numeric vector the same length as `combo` specifying #' relative column widths. For example, if the plot has two columns, then #' `widths = c(2, 1)` will allocate more space for the first column by a #' factor of 2 (as would `widths = c(.3, .15)`, etc.). The default, #' `NULL`, allocates the same horizontal space for each column. #' @param gg_theme Unlike most of the other **bayesplot** functions, #' `mcmc_combo` returns a gtable object rather than a ggplot object, and #' so theme objects can't be added directly to the returned plot object. The #' `gg_theme` argument helps get around this problem by accepting a #' **ggplot2** [theme][ggplot2::theme] object that is added to each of the #' plots *before* combining them into the gtable object that is returned. #' This can be a theme object created by a call to [ggplot2::theme()] or #' one of the **bayesplot** convenience functions, e.g. #' [legend_none()] (see the **Examples** section, below). #' #' @return A gtable object (the result of calling #' [gridExtra::arrangeGrob()]) with `length(combo)` columns and #' a row for each parameter. #' #' @examples #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' mcmc_combo(x, pars = c("alpha", "sigma")) #' mcmc_combo(x, pars = c("alpha", "sigma"), widths = c(1, 2)) #' #' \donttest{ #' # change second plot, show log(sigma) instead of sigma, #' # and remove the legends #' color_scheme_set("mix-blue-red") #' mcmc_combo( #' x, #' combo = c("dens_overlay", "trace"), #' pars = c("alpha", "sigma"), #' transformations = list(sigma = "log"), #' gg_theme = legend_none() #' ) #' #' # same thing but this time also change the entire ggplot theme #' mcmc_combo( #' x, #' combo = c("dens_overlay", "trace"), #' pars = c("alpha", "sigma"), #' transformations = list(sigma = "log"), #' gg_theme = ggplot2::theme_gray() + legend_none() #' ) #' } #' NULL #' @rdname MCMC-combos #' @export mcmc_combo <- function(x, combo = c("dens", "trace"), ..., widths = NULL, gg_theme = NULL) { suggested_package("gridExtra") if (length(combo) < 2) { abort("'combo' should have at least two elements.") } plotfuns <- paste0("mcmc_", combo) not_found <- setdiff(plotfuns, available_mcmc()) if (length(not_found)) { abort(paste( "The following functions were not found:", paste(not_found, collapse = ", ") )) } plotfuns <- lapply(plotfuns, function(x) get(x, pos = asNamespace("bayesplot"), mode = "function")) args <- list(x = x, ...) if (is.list(args$facet_args)) { args$facet_args[["ncol"]] <- 1 args$facet_args[["nrow"]] <- NULL } else { args$facet_args <- list(ncol = 1, nrow = NULL) } plots <- lapply(plotfuns, function(f) suppressWarnings(do.call(f, args))) plots <- lapply(plots, function(x) x + bayesplot_theme_get()) if (!is.null(gg_theme)) plots <- lapply(plots, function(x) x + gg_theme) bayesplot_grid( plots = plots, grid_args = list(ncol = length(combo), widths = widths) ) } bayesplot/R/mcmc-scatterplots.R0000644000176200001440000007716614057717550016300 0ustar liggesusers#' Scatterplots of MCMC draws #' #' Scatterplots, hexagonal heatmaps, and pairs plots from MCMC draws. See the #' **Plot Descriptions** section, below, for details. #' #' @name MCMC-scatterplots #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently ignored. #' @param size,alpha For `mcmc_scatter()`, passed to #' [ggplot2::geom_point()] to control the appearance of the points. #' @param binwidth For `mcmc_hex()`, an optional numeric vector of #' *length two* passed to [ggplot2::geom_hex()] to override the #' default binwidth in both the vertical and horizontal directions. #' #' @param np Optionally, a data frame of NUTS sampler parameters, either created #' by [nuts_params()] or in the same form as the object returned by #' [nuts_params()]. The colors, shapes, and sizes of the #' superimposed points can be customized using the `np_style` argument. #' @param np_style If `np` is specified, `np_style` can be a call to #' the `scatter_style_np()` helper function (for `mcmc_scatter()`) or #' the `pairs_style_np()` helper function (for `mcmc_pairs()`) to specify #' arguments controlling the appearance of superimposed points representing #' NUTS diagnostic information. (Note: for `pairs_style_np()` the #' `size` arguments are interpreted as scaling factors). #' #' @return `mcmc_scatter()` and `mcmc_hex()` return a ggplot object that #' can be further customized using the **ggplot2** package. #' #' `mcmc_pairs()` returns many ggplot objects organized into a grid via #' [bayesplot_grid()]. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_scatter()`}{ #' Bivariate scatterplot of posterior draws. If using a very large number of #' posterior draws then `mcmc_hex()` may be preferable to avoid #' overplotting. For models fit using [NUTS] the `np`, #' and `np_style` arguments can be used to add additional information in #' the plot (in this case the approximate location of divergences). #' For more on why the scatter plot with divergences is a useful #' diagnostic tool see [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme). #' } #' \item{`mcmc_hex()`}{ #' Hexagonal heatmap of 2-D bin counts. This plot is useful in cases where #' the posterior sample size is large enough that `mcmc_scatter()` suffers #' from overplotting. #' } #' \item{`mcmc_pairs()`}{ #' A square plot matrix with univariate marginal distributions along the #' diagonal (as histograms or kernel density plots) and bivariate #' distributions off the diagonal (as scatterplots or hex heatmaps). #' #' For the off-diagonal plots, the default is to split the chains so that #' (roughly) half are displayed above the diagonal and half are below (all #' chains are always merged together for the plots along the diagonal). Other #' possibilities are available by setting the `condition` argument. #' #' Additionally, extra diagnostic information for models fit using #' [NUTS] can be added to the pairs plot using the `lp`, #' `np`, and `np_style` arguments. If `np` is specified (and #' `condition` is *not* `"divergent__"`), then points (red, by #' default) will be superimposed onto the off-diagonal plots indicating which #' (if any) iterations encountered a divergent transition. Also, if both #' `np` and `max_treedepth` are specified then points (yellow, by #' default) will be superimposed to indicate a transition that hit the #' maximum treedepth rather than terminated its evolution normally. The #' `np_style` argument can be used with the `pairs_style_np()` #' convenience function to change the appearance of these overlaid points. #' See the **Examples** section. #' } #' } #' #' @template reference-vis-paper #' #' @examples #' library("ggplot2") #' #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(params = 6) #' dimnames(x) #' #' # scatterplot of alpha vs log(sigma) #' color_scheme_set("teal") #' (p <- mcmc_scatter(x, pars = c("alpha", "sigma"), #' transform = list(sigma = "log"))) #' p + #' labs( #' title = "Insert your own headline-grabbing title", #' subtitle = "with a provocative subtitle", #' caption = "and a controversial caption", #' x = expression(alpha), #' y = expression(log(sigma)) #' ) #' #' # add ellipse #' p + stat_ellipse(level = 0.9, color = "gray20", size = 1) #' #' # add contour #' color_scheme_set("red") #' p2 <- mcmc_scatter(x, pars = c("alpha", "sigma"), size = 3.5, alpha = 0.25) #' p2 + stat_density_2d(color = "black", size = .5) #' #' # can also add lines/smooths #' color_scheme_set("pink") #' (p3 <- mcmc_scatter(x, pars = c("alpha", "beta[3]"), alpha = 0.25, size = 3)) #' p3 + geom_smooth(method = "lm", se = FALSE, color = "gray20", #' size = .75, linetype = 2) #' #' \donttest{ #' if (requireNamespace("hexbin", quietly = TRUE)) { #' # hexagonal heatmap #' color_scheme_set("brightblue") #' (p <- mcmc_hex(x, pars = c("sigma", "alpha"), transform = list(sigma = "log"))) #' p + plot_bg(fill = "gray95") #' p + plot_bg(fill = "gray95") + panel_bg(fill = "gray70") #' } #' } NULL #' @rdname MCMC-scatterplots #' @export mcmc_scatter <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 2.5, alpha = 0.8, np = NULL, np_style = scatter_style_np()) { check_ignored_arguments(...) .mcmc_scatter( x, pars = pars, regex_pars = regex_pars, transformations = transformations, size = size, alpha = alpha, hex = FALSE, binwidth = NULL, np = np, np_style = np_style ) } #' @rdname MCMC-scatterplots #' @export #' mcmc_hex <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., binwidth = NULL) { suggested_package("scales") suggested_package("hexbin") check_ignored_arguments(...) .mcmc_scatter( x, pars = pars, regex_pars = regex_pars, transformations = transformations, hex = TRUE, binwidth = binwidth, size = NULL, alpha = NULL ) } #' @rdname MCMC-scatterplots #' @export #' @param condition For `mcmc_pairs()`, a call to the `pairs_condition()` #' helper function, which is used to specify a criterion for determining which #' chains (or iterations) are shown in the plots above the diagonal and which #' are shown in the plots below the diagonal. The histograms (or density #' plots) along the diagonal are always made using all chains and iterations, #' but the scatterplots (or hex plots) above and below the diagonal show #' different combinations of chains/iterations depending on `condition`. #' The default is a call to `pairs_condition()` with none of its arguments #' specified. In this case half of the chains (or roughly half if there are an #' odd number) will be used in the plots above the diagonal and the rest in #' the plots below the diagonal. The `chains`, `draws`, and #' `nuts` arguments to `pairs_condition()`, which are documented #' below, can be used to change this default. #' #' @param lp For `mcmc_pairs()`, a molten data frame of draws of the #' log-posterior or, more commonly, of a quantity equal to the log-posterior #' up to a constant. `lp` should either be created via #' [log_posterior()] or be an object with the same form as the #' object returned by [log_posterior()]. #' @param max_treedepth For `mcmc_pairs()`, an integer representing the #' maximum treedepth allowed when fitting the model (if fit using NUTS). This #' is only needed for detecting which transitions (if any) hit the maximum #' treedepth. #' @param diag_fun,off_diag_fun For `mcmc_pairs()`, the plotting function to #' use for the plots along the diagonal and for the off-diagonal plots, #' respectively. Currently `diag_fun` can be `"hist"` for histogram #' or `"dens"` for density, and `off_diag_fun` can be #' `"scatter"` for scatterplot or `"hex"` for a hexagonal heatmap. #' @param diag_args,off_diag_args For `mcmc_pairs()`, optional named lists of #' arguments to pass to the functions implied by the `diag_fun` and #' `off_diag_fun` arguments, respectively. For example, if #' `off_diag_fun` is `"scatter"` then `off_diag_args` could #' include optional arguments to `mcmc_scatter()` like `size` and #' `alpha`. #' @param grid_args,save_gg_objects For `mcmc_pairs()`, arguments to pass to #' [bayesplot_grid()]. For example, since `mcmc_pairs()` returns #' more than a single ggplot object, using [ggtitle()] afterwards #' will not work. But you you can still add a title to the plot using #' `grid_args = list(top="My title")`. #' #' @examples #' \donttest{ #' color_scheme_set("purple") #' #' # pairs plots #' # default of condition=NULL implies splitting chains between upper and lower panels #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' off_diag_args = list(size = 1, alpha = 0.5)) #' #' # change to density plots instead of histograms and hex plots instead of #' # scatterplots #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' diag_fun = "dens", off_diag_fun = "hex") #' #' # plot chain 1 above diagonal and chains 2, 3, and 4 below #' color_scheme_set("brightblue") #' mcmc_pairs(x, pars = "alpha", regex_pars = "beta\\[[1,4]\\]", #' diag_fun = "dens", off_diag_fun = "hex", #' condition = pairs_condition(chains = list(1, 2:4))) #' } #' #' \dontrun{ #' ### Adding NUTS diagnostics to scatterplots and pairs plots #' #' # examples using rstanarm package #' library(rstanarm) #' #' # for demonstration purposes, intentionally fit a model that #' # will (almost certainly) have some divergences #' fit <- stan_glm( #' mpg ~ ., data = mtcars, #' iter = 1000, refresh = 0, #' # this combo of prior and adapt_delta should lead to some divergences #' prior = hs(), #' adapt_delta = 0.9 #' ) #' posterior <- as.array(fit) #' np <- nuts_params(fit) #' #' # mcmc_scatter with divergences highlighted #' color_scheme_set("brightblue") #' mcmc_scatter(posterior, pars = c("wt", "sigma"), np = np) #' #' color_scheme_set("darkgray") #' div_style <- scatter_style_np(div_color = "green", div_shape = 4, div_size = 4) #' mcmc_scatter(posterior, pars = c("sigma", "(Intercept)"), #' np = np, np_style = div_style) #' #' # split the draws according to above/below median accept_stat__ #' # and show approximate location of divergences (red points) #' color_scheme_set("brightblue") #' mcmc_pairs( #' posterior, #' pars = c("wt", "cyl", "sigma"), #' off_diag_args = list(size = 1, alpha = 1/3), #' condition = pairs_condition(nuts = "accept_stat__"), #' np = np #' ) #' #' # more customizations: #' # - transform sigma to log(sigma) #' # - median log-posterior as 'condition' #' # - hex instead of scatter for off-diagonal plots #' # - show points where max treedepth hit in blue #' color_scheme_set("darkgray") #' mcmc_pairs( #' posterior, #' pars = c("wt", "cyl", "sigma"), #' transform = list(sigma = "log"), #' off_diag_fun = "hex", #' condition = pairs_condition(nuts = "lp__"), #' lp = log_posterior(fit), #' np = np, #' np_style = pairs_style_np(div_color = "firebrick", #' td_color = "blue", #' td_size = 2), #' # for demonstration purposes, set max_treedepth to a value that will #' # result in at least a few max treedepth warnings #' max_treedepth = with(np, -1 + max(Value[Parameter == "treedepth__"])) #' ) #' } #' mcmc_pairs <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., diag_fun = c("hist", "dens"), off_diag_fun = c("scatter", "hex"), diag_args = list(), off_diag_args = list(), condition = pairs_condition(), lp = NULL, np = NULL, np_style = pairs_style_np(), max_treedepth = NULL, grid_args = list(), save_gg_objects = TRUE) { check_ignored_arguments(...) stopifnot( is.list(diag_args), is.list(off_diag_args), inherits(np_style, "nuts_style"), inherits(condition, "pairs_condition") ) diag_fun <- match.arg(diag_fun) off_diag_fun <- match.arg(off_diag_fun) plot_diagonal <- pairs_plotfun(diag_fun) plot_off_diagonal <- pairs_plotfun(off_diag_fun) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- drop_constants_and_duplicates(x) n_iter <- num_iters(x) n_chain <- num_chains(x) n_param <- num_params(x) pars <- parameter_names(x) if (n_chain == 1) { warn("Only one chain in 'x'. This plot is more useful with multiple chains.") } if (n_param < 2) { abort("This plot requires at least two parameters in 'x'.") } no_np <- is.null(np) no_lp <- is.null(lp) no_max_td <- is.null(max_treedepth) if (!no_np) { param <- sym("Parameter") val <- sym("Value") np <- validate_nuts_data_frame(np, lp) divs <- dplyr::filter(np, UQ(param) == "divergent__") %>% pull(UQ(val)) divergent__ <- matrix(divs, nrow = n_iter * n_chain, ncol = n_param)[, 1] if (!no_max_td) { gt_max_td <- (dplyr::filter(np, UQ(param) == "treedepth__") %>% pull(UQ(val))) > max_treedepth max_td_hit__ <- matrix(gt_max_td, nrow = n_iter * n_chain, ncol = n_param)[, 1] } } cond <- handle_condition(x, condition, np, lp) x <- merge_chains(cond[["x"]]) mark <- cond[["mark"]] all_pairs <- expand.grid(pars, pars, stringsAsFactors = FALSE, KEEP.OUT.ATTRS = FALSE) plots <- vector("list", length = nrow(all_pairs)) use_default_binwidth <- is.null(diag_args[["binwidth"]]) for (j in seq_len(nrow(all_pairs))) { pair <- as.character(all_pairs[j,]) if (identical(pair[1], pair[2])) { # Diagonal diag_args[["x"]] <- x[, pair[1], drop = FALSE] # silence ggplot2's "Pick better value with `binwidth`" message if (diag_fun == "hist" && use_default_binwidth) diag_args[["binwidth"]] <- diff(range(diag_args[["x"]]))/30 plots[[j]] <- do.call(plot_diagonal, diag_args) + labs(subtitle = pair[1]) + theme(axis.line.y = element_blank(), plot.subtitle = element_text(hjust = 0.5)) } else { # Off-diagonal # use mark if above diagonal and !mark if below the diagonal mark2 <- if (is_lower_tri(j, n_param)) !mark else mark x_j <- x[mark2, pair, drop = FALSE] if (!no_np) { divs_j <- divergent__[mark2] max_td_hit_j <- if (no_max_td) NULL else max_td_hit__[mark2] } else { divs_j <- max_td_hit_j <- NULL } off_diag_args[["x"]] <- x_j plots[[j]] <- do.call(plot_off_diagonal, off_diag_args) if (isTRUE(any(divs_j == 1))) { divs_j_fac <- factor(as.logical(divs_j), levels = c(FALSE, TRUE), labels = c("NoDiv", "Div")) plots[[j]] <- plots[[j]] + geom_point( aes_(color = divs_j_fac, size = divs_j_fac), shape = np_style$shape[["div"]], alpha = np_style$alpha[["div"]], na.rm = TRUE ) } if (isTRUE(any(max_td_hit_j == 1))) { max_td_hit_j_fac <- factor(max_td_hit_j, levels = c(FALSE, TRUE), labels = c("NoHit", "Hit")) plots[[j]] <- plots[[j]] + geom_point( aes_(color = max_td_hit_j_fac, size = max_td_hit_j_fac), shape = np_style$shape[["td"]], alpha = np_style$alpha[["td"]], na.rm = TRUE ) } if (isTRUE(any(divs_j == 1)) || isTRUE(any(max_td_hit_j == 1))) plots[[j]] <- format_nuts_points(plots[[j]], np_style) } } plots <- lapply(plots, function(x) x + xaxis_title(FALSE) + yaxis_title(FALSE)) bayesplot_grid(plots = plots, legends = FALSE, grid_args = grid_args, save_gg_objects = save_gg_objects) } #' @rdname MCMC-scatterplots #' @export #' @param div_color,div_shape,div_size,div_alpha,td_color,td_shape,td_size,td_alpha #' Optional arguments to the `scatter_style_np()` or `pairs_style_np()` #' helper functions that are eventually passed to #' [ggplot2::geom_point()].The default values are displayed in the #' **Usage** section above. scatter_style_np <- function(div_color = "red", div_shape = 16, div_size = 2.5, div_alpha = 1) { stopifnot( is.numeric(div_shape) || is.character(div_shape), is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), shape = c(div = div_shape), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-scatterplots #' @export pairs_style_np <- function(div_color = "red", div_shape = 4, div_size = 1, div_alpha = 1, td_color = "yellow2", td_shape = 3, td_size = 1, td_alpha = 1) { stopifnot( is.numeric(div_shape) || is.character(div_shape), is.numeric(td_shape) || is.character(td_shape), is.character(div_color), is.character(td_color), is.numeric(div_size), is.numeric(td_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1, is.numeric(td_alpha) && td_alpha >= 0 && td_alpha <= 1 ) style <- list( color = c(div = div_color, td = td_color), shape = c(div = div_shape, td = td_shape), size = c(div = div_size, td = td_size), alpha = c(div = div_alpha, td = td_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-scatterplots #' @export #' @param chains,draws,nuts Optional arguments to the `pairs_condition()` #' helper function, which is used to specify the `condition` argument for #' `mcmc_pairs()`. #' \itemize{ #' \item The `chains` argument can be used to select some subset of the #' chains. If `chains` is an integer vector then the behavior is the same #' as the default (half the chains above the diagonal and half below) except #' using only the specified subset of chains. Alternatively, `chains` can #' be a list of two integer vectors with the first specifying the chains to be #' shown in the plots above the diagonal and the second for below the #' diagonal. #' \item The `draws` argument to `pairs_condition()` can be used to #' directly specify which realizations are plotted above and below the #' diagonal. `draws` can be a single proportion, which is interpreted as #' the proportion of realizations (among all chains) to plot in the lower #' panel starting with the first realization in each chain, with the #' complement (from the end of each chain) plotted in the upper panel. #' Alternatively `draws` can be a logical vector with length equal to the #' product of the number of iterations and the number of chains, in which case #' realizations corresponding to `FALSE` and `TRUE` will be plotted #' in the lower and upper panels, respectively. #' \item For models fit using NUTS, the `nuts` argument to #' `pairs_condition()` can be used. It takes a (possibly abbreviated) #' string to select among `"accept_stat__"`, `"stepsize__"`, #' `"treedepth__"`, `"n_leapfrog__"`, `"divergent__"`, #' `"energy__"`, and `"lp__"`. These are the sampler parameters #' associated with [NUTS()] (and `"lp__"` is the log-posterior #' up to an additive constant). In this case, plots below the diagonal will #' contain realizations that are below the median of the indicated variable #' (or are zero in the case of `"divergent__"`), and plots above the #' diagonal will contain realizations that are greater than or equal to the #' median of the indicated variable (or are one in the case of #' `"divergent__"`). If `"lp__"` is used then the `lp` #' argument to `mcmc_pairs` must also be specified. For the other NUTS #' parameters the `np` argument to `mcmc_pairs()` must also be #' specified. #' } #' pairs_condition <- function(chains = NULL, draws = NULL, nuts = NULL) { .ignore_args <- function(..., why = NULL) { dots <- list(...) nms <- names(dots)[!sapply(dots, is.null)] if (length(nms)) { inform(paste0( "The following specified arguments were ignored by 'pairs_condition' ", "because ", why, ": ", paste(sQuote(nms), collapse = ", ") )) } } .error_duplicate_chains <- function() { abort("Each chain can only be specified once in the 'chains' argument to 'pairs_condition'.") } if (is.null(chains) && is.null(draws) && is.null(nuts)) { # default: half of the chains above diag, half below cond <- list() cond_type <- "default" } else if (!is.null(chains)) { # Using 'chains' argument .ignore_args( draws = draws, nuts = nuts, why = "they are superseded by 'chains'" ) if (is.list(chains)) { # list of two integer vectors, each specifying a subset of the chains stopifnot(length(chains) == 2) chain_vec <- unlist(chains, use.names = FALSE) if (length(chain_vec) != length(unique(chain_vec))) .error_duplicate_chains() cond <- list(upper = as.integer(chains[[1]]), lower = as.integer(chains[[2]])) cond_type <- "chain_list" } else if (is.numeric(chains)) { # single vector specifying a subset of chains stopifnot(NCOL(chains) == 1, all(chains == as.integer(chains))) if (length(chains) != length(unique(chains))) .error_duplicate_chains() cond <- as.integer(chains) cond_type <- "chain_vector" } else { abort(paste( "The 'chains' argument to 'pairs_condition' must be", "an integer vector or a list of two integer vectors." )) } } else if (!is.null(draws)) { # Using 'draws' argument .ignore_args(nuts = nuts, why = "they are superseded by 'draws'") if (is.numeric(draws)) { # proportion of realizations (among all chains) to plot in the lower panel stopifnot(draws > 0 && draws < 1) cond <- draws cond_type <- "draws_proportion" } else if (is.logical(draws)) { # T/F for each iteration to split into upper/lower panels cond <- draws cond_type <- "draws_selection" } else { abort(paste( "The 'draws' argument to 'pairs_condition' must be", "a single proportion or a logical vector." )) } } else { # Using 'nuts' argument if (!is.character(nuts) || length(nuts) > 1) { abort("The 'nuts' argument to 'pairs_condition' must be a single string.") } cond_type <- "nuts" cond <- match.arg(nuts, several.ok = FALSE, choices = c("accept_stat__", "stepsize__", "treedepth__", "n_leapfrog__", "divergent__", "energy__", "lp__")) } structure( cond, class = c(class(cond), "pairs_condition"), type = cond_type # this attribute is used later by handle_condition() ) } # internal ---------------------------------------------------------------- #' @importFrom dplyr pull .mcmc_scatter <- function(x, pars = character(), regex_pars = character(), transformations = list(), hex = FALSE, size = 2.5, alpha = 0.8, binwidth = NULL, np = NULL, np_style = scatter_style_np()) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (num_params(x) != 2) { abort(paste( "For 'mcmc_scatter' and 'mcmc_hex' exactly 2 parameters must be selected.", "'mcmc_pairs' can be used for more than 2 parameters." )) } x <- merge_chains(x) parnames <- colnames(x)[1:2] has_divs <- !is.null(np) xydata <- data.frame(x = c(x[, 1]), y = c(x[, 2])) if (has_divs) { if (hex) { warn("'np' is currently ignored for hex plots.") } stopifnot(inherits(np_style, "nuts_style")) np <- validate_nuts_data_frame(np) param <- sym("Parameter") val <- sym("Value") divg <- sym("Divergent") xydata$Divergent <- np %>% dplyr::filter(UQ(param) == "divergent__") %>% pull(UQ(val)) divdata <- dplyr::filter(xydata, UQ(divg) == 1) xydata <- dplyr::filter(xydata, UQ(divg) == 0) } graph <- ggplot(data = xydata, aes_(x = ~ x, y = ~ y)) + bayesplot_theme_get() if (!hex) { # scatterplot graph <- graph + geom_point( shape = 21, color = get_color("dh"), fill = get_color("d"), size = size, alpha = alpha ) if (has_divs) { graph <- graph + geom_point( data = divdata, color = np_style$color[["div"]], size = np_style$size[["div"]], alpha = np_style$alpha[["div"]], shape = np_style$shape[["div"]] ) } } else { # hex binning graph <- graph + geom_hex( aes_(fill = ~ scales::rescale(..density..)), binwidth = binwidth ) + scale_fill_gradientn( "Density", colors = unlist(color_scheme_get()), breaks = c(.1, .9), labels = c("low", "high") ) } graph + labs(x = parnames[1], y = parnames[2]) } # internal for mcmc_pairs ------------------------------------------------- #' Get plotting functions from user-specified #' `diag_fun` and `off_diag_fun` arguments #' #' @noRd #' @param x User specified `diag_fun` or `off_diag_fun` argument to `mcmc_pairs()` pairs_plotfun <- function(x) { fun <- paste0("mcmc_", x) utils::getFromNamespace(fun, "bayesplot") } #' Unstack molten data frame #' #' @noRd #' @param df A data frame (from `nuts_params()`, `log_posterior()`, etc) #' @param .form Same as `form` arg to `utils::unstack()` unstack_to_matrix <- function(df, .form) { x <- utils::unstack(df, form = .form) as.matrix(x) } #' Check if off-diagonal plot is above or below the diagonal #' #' @noRd #' @param j integer (index) #' @param n Number of parameters (number of plots = `n^2`) #' @return `TRUE` if below the diagonal, `FALSE` if above the diagonal is_lower_tri <- function(j, n) { idx <- array_idx_j(j, n) lower_tri <- lower_tri_idx(n) row_match_found(idx, lower_tri) } #' Get array indices of the jth element in the plot matrix #' #' @noRd #' @param j integer (index) #' @param n number of parameters (number of plots = n^2) #' @return rwo vector (1-row matrix) containing the array indices of the jth #' element in the plot matrix array_idx_j <- function(j, n) { jj <- matrix(seq_len(n^2), nrow = n, byrow = TRUE)[j] arrayInd(jj, .dim = c(n, n)) } #' Get indices of lower triangular elements of a square matrix #' @noRd #' @param n number of rows (columns) in the square matrix lower_tri_idx <- function(n) { a <- rev(abs(sequence(seq.int(n - 1)) - n) + 1) b <- rep.int(seq.int(n - 1), rev(seq.int(n - 1))) cbind(row = a, col = b) } #' Find which (if any) row in y is a match for x #' @noRd #' @param x a row vector (i.e., a matrix with 1 row) #' @param y a matrix #' @return either a row number in `y` or `NA` if no match row_match_found <- function(x, y) { stopifnot(is.matrix(x), is.matrix(y), nrow(x) == 1) x <- as.data.frame(x) y <- as.data.frame(y) res <- match( do.call(function(...) paste(..., sep=":::"), x), do.call(function(...) paste(..., sep=":::"), y) ) isTRUE(!is.na(res) && length(res) == 1) } #' Drop any constant or duplicate variables #' @noRd #' @param x 3-D array drop_constants_and_duplicates <- function(x) { x2 <- drop_consts(x) x2 <- drop_dupes(x2) class(x2) <- c(class(x2), "mcmc_array") x2 } drop_consts <- function(x) { varying <- apply(x, 3, FUN = function(y) length(unique(c(y))) > 1) if (all(varying)) return(x) warn(paste( "The following parameters were dropped because they are constant:", paste(names(varying)[!varying], collapse = ", ") )) x[, , varying, drop = FALSE] } drop_dupes <- function(x) { dupes <- duplicated(x, MARGIN = 3) if (!any(dupes)) return(x) warn(paste( "The following parameters were dropped because they are duplicative:", paste(parameter_names(x)[dupes], collapse = ", ") )) x[, , !dupes, drop = FALSE] } #' Handle user's specified `condition` #' @noRd #' @param x 3-D mcmc array. #' @param condition Object returned by `pairs_condition()`. #' @param np,lp User-specified arguments to `mcmc_pairs()`. #' @return A named list containing `"x"` (`x`, possibly modified) and `"mark"` #' (logical or interger vector for eventually splitting `x`). handle_condition <- function(x, condition=NULL, np=NULL, lp=NULL) { n_iter <- num_iters(x) n_chain <- num_chains(x) no_np <- is.null(np) no_lp <- is.null(lp) cond_type <- attr(condition, "type") if (cond_type == "default") { k <- ncol(x) %/% 2 mark <- c(rep(FALSE, n_iter * k), rep(TRUE, n_iter * (n_chain - k))) } else if (cond_type == "chain_vector") { x <- x[, condition, , drop = FALSE] k <- ncol(x) %/% 2 n_chain <- length(condition) mark <- c(rep(FALSE, n_iter * k), rep(TRUE, n_iter * (n_chain - k))) } else if (cond_type == "chain_list") { x <- x[, c(condition[[1]], condition[[2]]), , drop = FALSE] k1 <- length(condition[[1]]) k2 <- length(condition[[2]]) mark <- c(rep(TRUE, n_iter * k1), rep(FALSE, n_iter * k2)) } else if (cond_type == "draws_proportion") { mark <- rep(1:n_iter > (condition * n_iter), times = n_chain) } else if (cond_type == "draws_selection") { # T/F for each iteration to split into upper and lower stopifnot(length(condition) == (n_iter * n_chain)) mark <- !condition } else if (cond_type == "nuts") { # NUTS sampler param or lp__ if (no_np && condition != "lp__") abort(paste( "To use this value of 'condition' the 'np' argument", "to 'mcmc_pairs' must also be specified." )) if (condition == "lp__") { if (no_lp) abort(paste( "If 'condition' is 'lp__' then the 'lp' argument", "to 'mcmc_pairs' must also be specified." )) mark <- unstack_to_matrix(lp, Value ~ Chain) } else { param <- sym("Parameter") mark <- dplyr::filter(np, UQ(param) == condition) mark <- unstack_to_matrix(mark, Value ~ Chain) } if (condition == "divergent__") { mark <- as.logical(mark) } else { mark <- c(mark) >= median(mark) } if (length(unique(mark)) == 1) abort(paste(condition, "is constant so it cannot be used as a condition.")) } list(x = x, mark = mark) } #' Apply scale_color_manual and scale_size_manual if plotting divergences and #' hitting max_treedepth #' #' @noRd #' @param graph ggplot object #' @param np_args list of style arguments returned by `pairs_style_np()` #' @return `graph`, updated format_nuts_points <- function(graph, np_args) { graph + scale_color_manual( values = set_names(c(NA, np_args$color[["div"]], NA, np_args$color[["td"]]), c("NoDiv", "Div", "NoHit", "Hit")) ) + scale_size_manual( values = set_names(c(0, rel(np_args$size[["div"]]), 0, rel(np_args$size[["td"]])), c("NoDiv", "Div", "NoHit", "Hit")) ) } bayesplot/R/sysdata.rda0000644000176200001440000622051014057717550014636 0ustar liggesusersBZh91AY&SY҄,Xj% <[=v޽9:ܽ{vzm5ǽxeנ=[֮ރ{uקWo{f\y2ӳS-{mVMmveV[ݍosEe5v;Yݺg㽇nf:M׬mJzEuٍ֯jG[Z^puowt[C&z57{u1]i^Ӫ=vԞzhh{^x- zwv^ɳo{[a靻z۽z΅-zNom9v{ѹu׳/{IAh^QƫMUP:hpW@z{a'{owz{z!סʗ{_\gmJ6ϻuQEGqݝ PU"G"TAT7(CB (};}(Pzz-1ávNL>¾q040voAk1mzz}}ޫ `} =σ6aiֵ:hסxZ6kmZZ,4`wFP{=ùVUӹӼDFgzJ׮v5L=m3"mAŘxvԱ#Kӹno^l(彴wp轇^{͍NMJg]znGrZtݶ{3^+]ֵS:n=UzvݞnٚGTVz^KٗnU.wvٍzofvĀއ{]{Qv:ѻ{v^/;^vwh{*NM{pn΄b뺺{uӠVB{FG@K#ûsw(c^e{Y{ۙbtkN]ЧttwvowwsS{6w޸5޼{7t{n6ҽ{]+Zf{;gmsӻֳWMs:in{ynѮw;ۜjS޷/Tvt;t7u[wKYۧ=w vSvOjzm{blۻvnՙl7m l={U^ca{޺J鞺sWAwfHrڕ/.{mίicۍWJ)V^uwz:ǧ򮞃lꓽo0ֻ/[{/5w{5 7N^o.uZCOG{YzRkli׭nc{ovoq TsڞZޭ[ý'{^{ۦֵmwj;7rXd]t'{ roym{{mPunZ[<^yv:Lzt{7x{i{BN]݇TΝ{7o[9oCm]5uٽvv@ӻ;]zg/qoo{mnl,٥vPtgwR/gzGF[u;]緼s^{{v7wocv+TۗaѓёFr2Ov+Ԛ=zת^<Nlvڀ;;+מ;N;ov뱐=;w ]-sf鼬ս޽ ::;G]Ʃݍ^jYݱwpSG[R=u]ziz7,+Wwtwe˯o+z5lwumPͫkzjm6ު:g;jd{m63Gg{{޻k@/i;JvqBo{v=nm^:zo{mB{[A1-&7csEаHUG cD(\̣/%=oӹ$e栽FɂXىxz5MhM0wrn@ n"+bURGn8y=Kn O4 ߨлy;c^fRӽuA6 x b pw_Spv r"Ӻek>qOЕm{~& @fZ*պZ={[a~ ;|sgޔƴ7xrshl5 NpEgx$Kڰ!WD4;{׊qQ\4e}8Em㳈g ՗>FRs9CFSG.ځHKmǽ[UȻ+jRV^M4U-vo޲] @Յ6;]}c)QuC{m知7?PsKx#.BvRX،g>C?Qz>6v8Ȣ[ y Pю3ۂk_vk 2nT0-Z-/KoZHݝ\Ňp}8#[aEnGR<.nùĝЅ)̸ Z244ӕ2fꎚ;/ 3brm2kJQ@v Xr,KSkwӼӈe ކ>a; M~(Rii'̗~ͥ+?({EP_t=j򸅑ܹu9nW )A g4d 4TǨHq5VڴDkpdVN!{@y0O8sfez$xD0`Tǁ^$"s!8&̬Fg\pAoTJ[J~ţS@5l7I䔘ZǑHXl lUwɘ1A0;8)дe_?/a0qz31GEnZ P-oYMk[D_77!tSYQPG (mGr?#mxo'qQ3q(ySԒh w98w7nݏ 09apQ)ض{e)⨚$^GgI<(BѲScv^Ro'4RTP@vg;/#jB^XV0"%77δO„KDpEј9 Ti3GcXA(H Vk~!=0Sdv[G%7H}n_1dsyP4 : @AfJ~ᇡO*ֲ^8(J >>7]<0/:4xFs`!Dg֜:N i,BXIХǓxF8^%QA ^ ܃ёQ T"úoƽP=Qq[Jdg԰ Gl-Uk´bQf Ԟc{Y#%sAFU eQ۲Єضխ>D% ##߱*8'vHJ 7mB7 h82G hV"Y ^,+]P5?p;Я5,25c="w0?Q4ҵ@S }\/(G@Ps3 M\膖!u,rͱ;ߏ\}xBA!/yvl^FN(q@h:iIê>Ɇ ~_BDp*Yo^O쒄6D%-sMS՟py&)gd~H "S .=_J qx@ՋR80AߛQ/0Oרd4<Llw(RlP="8oeF@_8nFٺADXy* aJQ_=`  10lZor0%FuSs_RUx ʓaGv]X:gv2Wq;i/, >KH|'7oS`C3vZ:k>`1!ۤ¶ `puIa6xޭtc١R78pI%~\/&2}$WMP67o7;/O넟.T9Z1J6륒$6F"`)`# =oJWͲ1(1-O[˲ !'Oɠ#-*A|p MJSp&gy%`t,heQtnopqn%-R]DEIl4kOa^EۺpcB*0%+T~&1[HulZa)z?N&f8_9XB v1-ζVbJ!:)9!/C9IUD-=l%&J]7 )# e6qilLxVW3xW"/éDx+-n~4U2n"j RWroK6Mf&~W ҕ'˒&}_DUhl}: ;?}Dvgf28UDVSL=A^v'OK#yf^`~h$E:]YM۩piBnF39)oz%`uap0ϻ*bxy/659A!*n#7~T1:O8d%l8A.[]Emݲ}د˞~=Yj)%bV߃{8E$ϐ?']>gHܼ+ď#ĒFJ؏D|6uݹgq:xsz̢I_ MsP̕ޚoVXh%Fx=)-{ ~2$GFNd ]P_W*gгR[3ӵ0YIcAAƽ)0 Ee*!m`ùȲirBx4*&U:ȪfD~_| M,ϊ9ͪBa7r9.=7-B!~ WRO`DX)q@Ag-ύsR 1 {`Ũ["r8%̀m~!/Alo6{GH)f} νWJO>/E2epod+SMS ~cb<#$nVt@[%*Z^S 8oS>NF=1'6u=,|zA@SxDt|m9ٕ[ cX[%z؎b ܷ9m&EFylEM{]G_ gQJxD}K%d [\4=%y7co.Oρ\DhՃUȝq`N 2=b5s{΂0wP<*Ӿ#R2n8~Ԫ0l#dיR@6j =M ( 2pG͘K|)#= :}WJNԬ`+͕d},|pbE@_l `y<gqShildlބxm37KpM0Ff/_\;iۀ|T'ς@6p `Qݏw:NQQ)X 9U/Oyx_dL=j$NC5qU$QdcPU6c`$~^_V} xkVNB?4,t9f8,m@ydGre&QwB97 8|$nPClK2*DԼ(Zͧק2SݺVO^uӌ${Alf H͎\vØr&C!RKp79~L BĐ,bUOě%W+&G_\m(x@X16D'D e(MMSIpA8$a콕D\TÊQTCyT; =vm=Fm$z* d"r7Ip4 b^X`WΝ+HZm,&ACdWJ^V(C_-:Ҍ. MyE1DÐT@G:YMkWAy-Ij+Zo,82} tG^h01\LMzxTl:RЦd qKcG#>#ƺ d)qt<ݡiiMGiwXA8T\F ZRGBeR.=V?}DBrט ɩ4Hjw[l2^t#؇@U58q"uhX=rF/(zxnx8[XeU.}*FHz R6"t0MS*XkC1CZ9H.Ԟ(=y;A ?f/j]ܑ )Xh8,4IU$vK'}_ծN"Hlg/Ş>&e\aTEىK*Z.V"Ř$?89yչ rl%ўK<. jV=,ʪY;L%_GȺG{=-]nc13A0тY׭ L$Bw";# Ac0Г,jU`3)Q^2%g*n1NmO۰LM:hJD[0PI^tessYl<}A% u#JDk{%\92;]E"-/,9:2$J0{sۡNǰd0&,m.Hdv)Ch!S=ͺc-NM)Y(dk븳ҝ*Q ]6%,_'n}| b#\NUtUS.}Q4}'p.YV7TwNMtʃ3P#Q8)p}KOj ]u]SivL,SR #5qHf\'ad$e;iH`C2^3 N7I wx^a7(oXb~6\A? yC)KCa{a׿QrM_?S}>22g7N KuV>* I=[a,$ Tlrז2 v,eS\rRqh& &"V+ӂ`78fvE#kPDMi!ﱉ0r1إlwq`kY&S0It&ʑIdsi_^SDU[gu WdŞ+#l. \eBs6\G>͂e> Eq~.TDyuTdeμiuEwVXi3NEIҒƃ|(XSmJ,C?mgHsǚ܌e)X q __W,COU5vt1dds?+/:Ry n5ﰰ*m҈7$!-1M덂K;ʜmFɏ=7zekxiWI˹ SإeoK&EoouAX5=_1 h⊽^uW/|froHC0!(怬ztͼX{r2(hY\Ve#? mx$jfEb6 JxuK"D"u;D64د'yyVbQg EAO_eB +PBKEa$pɜJx7SfHxfnS5!>lPz%qe PLN(  WYH&ۮfFΪ+bPAMOֿq7xCTH9c æI-vr+B̷ο8SS5X!­xB䗏 K0̡18]3-0(+\]W&` W:7U9cGvs^.NvN(; !1K~K*T c&ĝYC qS{)<'qؗʀHyE>*3P1tpLJw 6$U ΃_?^V-3m9 gw!YWqb-(}eɷI\9` mߐ}*1g0}C"GybYl1 ([w@Cts(d@L],(G5A iLA2(q2]ք2RR|Srœq; xwT˓) O ٜL\PΟG恸4(Y1&3EY%+/m#Xs&6fe1q>~zgHh5'_z6+i~ΖTνhB&J :b߷~7W*7 _hcVQv5H*`Oh}zLoa>ͭD6uLS0ؖ[CeL3kg~EWY>1a.=ztC Ty=sJzacSbY {2@0t;+}<5>ȇ>KSѴr2N ,qjSvƋE 'oTg[u6$"x^Oj96?i|5ëlqvFoOl $`<  3dE{:'AXsQٰH);uG.g&W&Xn; ER*H?I>8P:A`[Muvd:ϨY'sb bvmDǦ5&<7?"hMz2^tו0?QZ2[-̨il\%3n |lQ#眜Gd>ö-;5Yq˃Pa&1>ү5:6&QF:\#9^=ma1B޷B|IύBk2T uyj Mjm{ R-v k3CN,k6?cvU=3݈F%so/. J (5^J)Xvs>KR hܨ:ਘm$ Yq/ A|V)dǨ@&ɗAz|+~JK~Fm)'pE$Ro Qી@ 6j ~SpEh|Q|yl.Z捸mYy/@R;,TAYTkVa0԰@Fw(T'yaMTL2Ն})ܶTţɷK?U@J?Ƌ~d_k؋뼅u11sgGy~]''SzH ||fVp#>Dr!-)1qOqH`|]T28h(oRcBbA%Yƕ((9@ +BTI~1q2Kƫt(הqRz'ԍv\-cl+ HFjEONz0ؾ$j0^Ѝge `jP`fcZ 9ˆtCy3Wag ic3$3ʩ" ~dLGkCLܒ6GQVIX`"H=4V_X4crتa'@+Ka෈=a CMџްiP'3V!PP 1&6m!;_JHna>9GEZ"ϓn`+'iIp\~L0Dc_2>RxK'F*e 9uUL2 nAI||(v16Rc9j vTg YlOT2[[4dYe=Ű5^.8e,YWF"BYsÿ,Z5**Wvxo@*6b́}]뾉',tMJX¸ R|(zZL_vZVc'C%uXaƳ6ߗ`D$v݆tʆ7geR/ Q+-l.h;LwϷ;bdžiwYƵWhVvZмX}xF|{Xi^u$ZgFew8ؼ>VEx.e{@(m7 e8QSHMQN {n e;ppyDH6]KYP_6P#?fB7we5Nʼnf)ӗKcyK^|lcj?L{jxho HB|=Fw*8--gXۮ"4U@ЖfbǏ5WsYWTÚ@IFp P2wE&zC3nQb 5x%vBN{?9`ہ9?ϔv dRYI"D.}??tL6g:Z2Tdp;z$\21yZUG!;qkҹ'ROBm}U5eIR*O}IkmGߺ̩ґemyz/82Hh2PWy}hvY9pe~@03*Օ: ڀÙB:#VҬFCFuq Ff7@M]6Wڿǒ}! u$ڍ{w2z9[uF˂GWb3<=ٞBT.Yc1]G^͍6$Cu" *~woa>avi\m?~Κ%&x ѓmC_hW"".8b/uяUaKUAhet*IZ~x#H nT LҀ{J_p[qt?*`!}}4X *ߎ٩g>U>A m I΂C?͋!Ê0@ܿ’Cx39¦֨-"by$Ugfdbu!Wk0hk0/]} U2Y\mUs&_M(X Y=čkL$vR3 tm Sxa{\EX|皓_B*rpǬ'I#zЃ`ZZn#$j2^Ջ1mC@ϒwU\6WA%nc5;Zt7@M; )rkrk [e%Yĩ״; ' xC :~]fΗ[U6T,3qdg,@tHl`1Tp%9Y'( >k&IG-ct>q(;DcNO`驯OxANVw{@,VbT"]9qN;Lmz;ǝ|^Dvl,:{lE9-ߞZp=s0'ft5UFȳ5  #xjW' gpP'T#4H ^h!Qnv\ JG!:ud5KxGՄ7kT^tvSmw[]b>SVvB5sxOI?Plp=|P34 FBoa*|+"_ܖmX{%I#k yNoL1:|e|umpI! ti hLj2g YOEh/{ZNB/Uږ#8؆uRV @/B#,d[+֕ ZT-j’w\kQF4[U.4C^)W8eY S 햄*H.htg# {.(=(d$/.grt|!lNb8۹\_RuƛX(&TB;ja-\*S#RLcf =.x%azV3ٱC/#rf؊jž97GQŒӀ[}vPr%ɲ`aX&OI)7BRu|Pa>9Wz,bA=m{%>烰b]D0@9NI]לE'+(y6mM7 ,Ť91) 5_^K" ^MoJrŷX'[zT(-aKvC IkiuyzX8JQawdN7QrZ[2ɏ2vAj%/T}-cVنDDnj[BP i߈RU+iG۸e{Uf&#9u\p9p|V7tt Oe_{?pRUWn\ac2h ])v2D[TCܧaXƅpPBμ-@|'E6 4U{gz & ~ÞA]*\uaKQjS .s`&j{1A 6Q`KhDajj$@ (Z•#f&:MWVbKo>hFۋ鼊C'}na6.F:uUa=^'TyhLhcK%-lwS|ta||+UĬaObQ:H52ȳ)W&cv=l=\xap #vo=a orqׅ.OR Cnw)+kZ"0+ebEbccDOEų ž&Jr-ёlzΈd"|d`3״pOGnR}HemA`nB2%aP%nKL_Z[J\3vc+n fyZp1c0u֩QvZҧ }Am&["hJj3P(^Jds!QBE2= `0R׹\ʺ` T㢞nE}l`zmP `ScjY|cV{T xޢ#&\d9gέDܦPSv6A #O\!}y膖=~QL8 *λfH3 R%Hѕ~\5fkyn3э/\OE>qLZ/~ h:A fu+bn0)UGS#"dF(09A5wx\?}'& Ggڽg[N2Jn[Wqd؄ځI%a7چD<j/+bӷHnLӴ$5J<ғ |q\Kho]ІA !$/؄ 8F9 aI(Oono$2Ss7or 32cuفQbbF4OWP֌JiV[r 0D#^Ύ) fFY^E7!#['^ 7ݒ[>YGRmrRvǢUHXЊih]E⛣c'f@;]K օ"YW<5 v 9B\cdntq $c/J>o1qMX!wJubSơ%g'3_Ź:<ز{Z t-"ؒ"#HPm{g ZXYB*J/1_xXg##8I{QTdޏX2zf7[`!4ba&/gę#D.Ǘ@BLaMC3K}8Fex + hg c HUFVo"hf KeY;;OpߞCaU 3C_732NM즉3 -IWNdåVv<MLףs܍S%Awa^ !zo\hСOa''O{=_R~|8@0~+t__aw葲@TBnHN28G}Ee%u0sH@"#R6f++)- XeGO*J wrdcfl !)SaGޙ0zl,|f" H}ň zR9?ӚHI#J H6%/­{i!.# hS[nIxCC6Cl(v>(t!5HXLn\zoJ!&6ËU9]KBn(*ߵvnϯ]3Q)6-ooO.6%7MuNpdj>XIO;8`'_?RT7J 56xq8hFWH֘/'nkj=VQAk5 (-TU81nE1Co3.E#W<C:ER61Y+̳8Q}9iob>=C9hz4(˛X_@>B1QfYZbE gG’WSt!#MSh|ꬷvw9LFx#GDCk-Λ]_ծIb}‹ j/kKq}y7d-4sU:tJgiy<ǽX:oLL˪Sit)@+O+NLXturj+HD?]7;g)y+OY2 } QRY38+tTX8%"fw@D9V', 06N<|dI {JAT6e [q8ڣ8 5d/Y?&k=dNgRf,}`xe/72m|y=\_ɫLaւxhKc.v QǼ`4Mˀ@j|l}ܦJ" =(a%ڪ }>8F!PTɱrJwOHiEsX`l4P;%X~:^^ɹ>mdKjbe9Җ[$H}%Й{"FwcC>(v.G4OdOw@YL#ĵm l!mب/6%<LH4<=0bkáG:7P5 )i֤&e4V o M=0x1o WYUqG E ř-]@;OFʼnXYroDLsx8)PɕκHi[/vȕiҶFETѢ), "r@:mMo ҏ+q` CG@r 3 ߴ Er۷T+* 7I#F#Fq=&S&_.vt߆r\ x$A'i 5D/_EKޔn+3D@y9̶>fa ->i pSr+;4i}z7L7Uhqܡ`[ڧLC $+H8;17P1O@teP)Ŝÿ껳xBzjAnyeЍE⤨nOKR}ȑGt y DOmpC$@=]CED$؇ gWHvgw;~?!eb-<CbIzT6lGP?3T+p7oJ4 09R$ 2܂3S8"jZp/ RFc{ `N'M]NwIX035U&|r$) |;H:v `,xQKI4Xwͽf@ ^@Ɗ,Il|7S9YYybtA0aC6;,u~6#v=f!zDՂO f`{$Mh\_Vh(^_.XjjO[2R^*$?n?9| #==LB\9fO7%'0L֯='Nk_ Jv A=0⅘ Mj| yâ XJf~^O`3Go@_\ ܒM$`py_ yX*4-B*@ dcLѡIAkh,txR8Cs},W+Bant,#tDc?Y t^[eE( ۽}kMHi7dI(=)VC@7믢Sz\ń*m\$ޖV95jI LxRˆh>"o!(Dc2%%6)~Q,D L{ ֢@m!GO*5 nL1&hSy7@Û64A]/m/:FX֐9>biΘם+cRy$K,ԘF0`>`_dp>n_'..!zUo^']<<*, ;("0ZQ{6qNObL=|QUfEUP` ]+w5P'OK4I<[Bj6-4r_Hi~ew:^yl8U3{&lBy]%Cp+Ol9C(}6b3P "$\r~tmkCzF8?ca8 X1@mcüZEbYYUTL)glX\jo2%Ɣ #I, 'b1S[R`;B~|H7h)#0 v4Q|(eU x6P\e4\9(2#2SoNK+u&͌чM jS3VPVΠI.ߦHhޟ^Imm@bvw_u-};YSiSI6,F{j2L(HpdԎR3q}Ԑ] ܏|2Ѩ};-#=rSRaXcU\USsԋ> +=Χȴ*'2{z@#c9CcxҝGrw1 K ۨ1s I@<,Ϗ(պn~3{`eF`K&L0z̤$?eDAػThA:;QO$six7˧Vd(51B:I.X? yYLVm(l(;y+VW+oax`8I>pyE+Aߟ]h?-qjs\eJHՈ'lMyPqQ|dumGShggr^,(FExu{4c,%}NT5 VD;%!b1;dTǴ9ȇۙ'GHmg0x^3^_DcT8u(ۘ \LtraR*Sx8,[b AYW P`J"_dz[|ܘؐqݒ"ܨqδ@9uKn }N ur.U0s^gIEȵ&a`eȁ>QǷ*~RP8UA~Te RߙD_OyE і'"~qgy\ƆN>ytt1X&imvfnKNEWVe5#uČseW~\k؍cYn rkʈA+]xqE^#5u" InRSsPpCYz?&θtyAlL6,./X 9N\$F"M'^͓>3>nʳ'8ⱡM iFo:"KPQ>qɈ**> ؗmT}*3:ٞ-j˯a}j?E5z)/ZX )`"/>ۓNUܖL(Ɲ HX|)i뾐*۴WazVi 0_rFD'Yg,iE/৻j?[Q7epRnal5+1wT(# L7&v[r ǯq1Ҷ+~r/l 6,d<,PmJRbUAIQ=J8baOs0&'vc$ć3`%(YWːZFv-ڧ~:f0b!)bBx}S7hU Ok<)6 !It@Ϟ iƼ9 DN󁘖'ߟOL9A3B3$V۳N:F_ uMDz6M2j˚Eb3ۣ}|+0ѳ˛VC+EJzOyQ,^jfŢNm(eD[ rv|PL\wxD,@9cVael7j`+WQPz[3(G)[Ň1)&{ܔ32=oǪ!(PiG):r"8u)x/v lAVY&{b?߆1|46iA.mJU-&6TuxqhD/6^ﺅfg%+Ev"ad=NH w KCqe%0rIED(j12.%Ŗ8 [5ܩ{SQď,9jv+ f҆46O6^iĸA8|ZAup^c By_LK)5`= 2Ɂ>Z~6cOj\ڀˏ{̓]#wcdW;hq:BVa|^1=Z-%‰,VI+'2C/]k/C`<8!+'YvJKMzި"^kE|Ȟzf !"9mSȂ`&gc׃ etU߻?U%ֱͰ_wrG,͐MI`\pzYuy0L]8~3:@IJF')VFuD6Tn@ܻїn2w.]52(Idoy%[W3Y6:A^;B<}:4Fθ?g:jNaFw'-R4|)>K7d;or^Lz· Z9S4@'biA|ذu@d$sJ#fPOä}C8L9Eˑa-sN t3%}N;Q(T4B$EQDƅ -p %#,o 55ebUN4GmYaPs([x̜[/٠=('b]D&9B)1k"&n|c<00^)1K:tFN[}GqHPP'_`<z]PK&җILyʫ>ƞVB#5pUN[XPTS::6c'a_+P1f-1j(cwzGVldvBygIv uMI_" 7]t,p@Kf/`Kh`QPNςĸ.vQi:me*#HQ-؂u9C.6 .eEuA_N\jrJ\jL1DK|\;-Yg퇅< &\Ɇ;e1e(//C1!7b"'Hf1~Ω~P o%翁`Y$x(kwye|`U;(]Bʀ2rՄG(%bR ЩZ>ŸŇ r-R>#XPiT1#;h{7?z٢$/z7c9vr(vю';x.fSn'ǮDCt 3>ZQ&Y)̎= @џ練/"E%|.&A[rkצշ hǟ14g|DQ7Đv|^C~o~hkH\5 b22iL׺;Go "xjvH,ESYqg7%=(QԪծܱhA7<b0T6։ ߋ΃}spKNh8:8k4Wx`T{]"Nzq.i 񉃃9,];~#W^S>=`"XƘ8GrglfJ-xq_H NQIh624X""F=김4-A x`g!%7+ "a~F?qdO)Nfk!{s~d$d`w>M24IP?]S MƩL]jSKޭ} ǵ3wp TYq'8ɁtKgƻc&fC#tD֔0&VT6V 7?ɵdxTýu*1 W`㢌ؖYY%4u0gU_uB\ȥh9)/>=<n*|7pF9/E~">'CzĆҦW'b|Z2髳T)1 (|u0Ȯ4CۥĶ eQܳxZƫ$GK\oQ|C(Q6С|p: U$!`$0 BlHЮ^}3vu]6E>b5S:gTc) }rA3g*hdO^ԍ@/ p4mDRxU,׽at- 9Hn7L N:I2 cCy)1 t>/ܕY[sD܏,* 6ѣծ5mQ|"QkT&xJ Q v&S!:4K-^ܻazPC5,7}S\5ٔws`$f7O>|$_{3mC|W]jd|#X{gMV3E-{V;.Āv$rk^/bfJZpaXiakHbĸEمL OߏQxX mCW/AI-QIF4)i/|`7"h8h,%($otYhf& IeA^'U^L*^7% 1e* E-b YPvm}TIfæ#l! n7O(SpB!^TYcmBԨR'TZ&8ؗf$>GY"g Q)T'3C <b$4V6ЇAm޲*ۘ]>Ǎ<AW|:=[r+>\3F丩6"@Ģb3:{A==S>J`&vzc^E+M1,u|ߵF;|b9YF Z|NYż5MB=JAͨ`$43߉#yVmXH3}Xskv=EX.$PDUVVBK/_CSk<#9,S"x?$%/ջwsN\,"eh>%L̹ =?~6Ya?96Ϭ3Rx뿔UڙAZ1Qɍ(G'}쮂'Rz;/( Yh3э!s-ϗ`梯 t9[Ӎk0xƝh.hoD=O}gst!g`!sv6&5_oBƪVu-zOS]w.TPq,ͼx`7L]6QѴxӺzA82.N^*H 5^YFRY4 OaFh wsx|- a,Z)ўDZ ~bS:JpeYabEr8 =궮HfPdj&ý7hkB fZqN7, ށSe [ S|T`z҉cҌ Q|77s8oa>bZwnĈ^.aNgC0AlJaU7ܵO8J)+U곟ȩS¿CwbC?^%BVʟ9npBXpkX0W"!E`( l Ӈ㠡G°E5@t{;@cPGʆe+w#u=Å&M݄6G&ew^uez"^ T߫OLȟQPgl rXiuSA?h \6 ޹'>G^wȄ G(+J}jzSX(<)dO{qn'Gf() p'\t8ي?ƕS]!waB^riS!;4׎[qv^hɔ{!qa_K{ǫDs  ݥ"+`<;AߦmS,Eav˘]H b;ɸOU(5".&)7ҟsJvkQ.@"#^[5T<~Dp8_.[ێ;HPA",bv䷷<@Tv(b;NjBӎ]+IL! .0Ds~ ;\v %3WeSWNW2WC[ {>|FwA7j- ~jKhײh4}s\RF_d&&PF8C?;^%0r>I=?tN=9+c20<^mi2&)ACAF fxw>O'x^X#T#pbEW[44_ҕЅjѥ3X )РݭI^T^LLJ=V3k :v"\-(6H6u;d<b2N Km(K:$sQ'~sŘߒwd="yZkJNEYv Ϲ1h`Ankˆa_p&#8,qǖOw1.7Bj@R`SC ˇçRؿwP/ _97ij^(TH=prZX?Xr٪~#5><&HcfA072vqUccY/\b 4<T'Dyy@1iC=k}k71g6f9(g'rIH+q֥أJZ-uvҭ}Փ?\ܢHZkFBU+5SxYӴy= {tOm1fsji Dߧ*yGYʯ''9daKfz}=pKcC -(ɢHlI(?q9p[%dZT^I޽rI%a ,Z\LwJ44k43.ѭ"Ֆmރ>ق ѥEˡ}Lu%$ `OqC M*dS8Ж67ϔEh7{c7-ܥrex/Z<־g˴|YYsSz+2 mcy~ 6L=9k~KÀoenZ4Ľbw@SWKVAE3)*sVlK;!"/kZ:,uPc)ߕbUO|Z-(v5m*Pfa|,o<Fi1TjQuBu7B ȁnTRX#mM}6!`v4{HvS\ \R隵>!x_Y t?2{bMK#iCSf!+R'qdŔ0Lq`fS ް9MVSc@{ g5-H֦gנvd/lEidN<(ݝ"k_ pϥV 2!Մ8C{C'K@ xE.+B sH5Q$N xK9W_'lV["o%vI'e zQFdEƨ ]2[ G|{nn._PvU~H?[WӤZDcEȊeX{ ؓLr,AO ,oC9ME5]eS FlԪ-ˎ}vieIJB/Q=lM9.'k( $˵WCxTj$4 9BRdgmoG v+!i\1[72zșD` ~;w <}ߑRJŊM>Lu;5~tXO~wb\qsX=XNUuǰj𯩆 ̦mhLBa5 0CZWF>w0>k@ /D@Lخ)F9 =#RJ>3Tq e&I Ka r$z(uean? [0ޘT>,K ϵ4l2B-3Xk$ 0[c>'ƫ /a"JS|QW7_Ʒio}Nfp.GUyEabz( ըުrT");T/:C W> +_k~50Wb<)1#ebFS@w[_- QW; u:a^++tɛF{7ɋpɁK`~@e1v2r;7_ ߵuVxƏxr+gCp,cO+Du]<$Ԝ)k漐oFeמI;jwG);qA齏N(ݣh `ntн?-W|y}`G,p'/M8!Udd A:#6ͳ2ES8?8pe!>vA'5%%e-܃J0#fv|H} op\(0)W웪m5ܵiо*霔kДu HE-ٍQi(~k\E}T^Vy}7cMA_rs(ڹu?( t SsG.MHFG'.9Tz" Aǣ!N{h~P=vie_G33q(ʯQ gTHsQz%̭u5Ĕ`穱ߺ Ot\-xMɔ!deê՗m_؍ srXbHdĚ #+]y&\,n$A!qlT:Ez3yʃja{܊l͵},<+stLmPѴ;s7/vo_stqZ&8r)4>ԄKH@UrW4Q/PpY.[{\^xO_6u}̓%No8;[zQEkeL3??[p$}K ,eiE(LM+ :Ύxu8lAJ)/S.yg=grLs0j%DC,"eMJD>aaV3 kvdYM5(Sd&[@I1-*bZx !aDd ǹ-]bt+:&Ɵp,wL6*-!GXJt6@H {H>NwIo])%5ol:%\B P9'^S_4<,DBE=_ `DP@B]W>xy:]99^7X"Hq ch|&]ܦ.OM'Æ91x7/J7A'WJ`?8XaSh^Tb-TTJ_Gẁ1lxXq\F 2-E\tf  |>R=,\l(,gK` l.މfړ'Xx;7ыCJEyPk@|Kn[c6ΤUZ]VoÙX;֤D`R7ckRh՞3iq^*:<.x '" zko:CJd2͘jq7ph9Mhby;cm$KkK@=m{ƊAp8o+x'3z0Ȗ/DbG4W4 ,M6!&>If  ıs1Qt]bLASq3eGK o#_ec2Xx(D$#/_'^Ap-1޿G?˷C)jIoc"kըubD0҆g.hKgY5Dh0vW+F Nws shԝ"aM@}IDD⸶K.)oX9/ՖW?w,YJ3LzR 4Xo GD˫^܃h_%uQnqFv| A69Q=pchu= 2Ei*dl$L0WJX i#9|{^/aIQF]N(/3Ó[wrQ+FGzdJ4.pD$uѨW)yS\R{vi9E!5,? 7dR۳1*`4Iq7co| әkPd kًGTbQ!#z Uk03?tږv5p ; ώ_YOP_sC]7$J;ϼ^"dNGݕO׃dt}*94YR\` 4pR -j^$Xz20\- ɼئ4NiwSz[Xwgv05rwr@aHM:00&j 70W*`z㔗#AqJZoٱ3UmImNXX ]tc}ᨋ;˵koM:Nj7mA҉/DC.68NÖIzWDCGdpi 1V#nI(G!hmBGh(IH~tn=h8`30_ ߡ=%bL[Y1@XR^1, @5q|璼ށD'M QL4.- j((L,]\dWy3/af?iͧEЇ/`)Y=wD \ p!MTm`=9?a8 zj|Qkͻ bWVnBAH+g 8&s@\]N_;6CDeyBJ&f֋)40r v8GDι'KT~4_යÍ}C፝Aͨ/u&+lG0ztsZ/-g' H]9g !r.9~a02RFǡ &QڇtȊ#Fq. 4үgN3a)k&p=$3K/ebt8;/{# &z \p3LgNk vU_/Z}P:BN͆.gp \9J5n\#Z- Vءs} jG4YJv,},K[)V6ʨ'OѠˆ߳d܈)_q.swڀd2 wo]`:VDK/QoLàhE0kVD8l:6I ɲԨP`W)<{cmO%hB dSZm `Izm~ Z3Ӿ[1Pƒ\ H e{V 'ܓKk-Zuy v(hr@:-ȩ.@åTsT ez[H#Qnj2 &~MAn,\5(Y4*ogxPOb9l_nJ3b]9G\qnrenUwk|WNҕ*XXhǝУ..eh `8sX9qlo0{g13B$} Xs^P~p[W̽ifNV"Z#- u~1Go}.̶*&685LMgbMH'|E%z^۟e*̧k|+51]^ SjFQ&k^Vt*Xcz.IFjfR$RDk&'FD4_,4.V۝`X08 IEǏ:R BWNpkzSX8]4h:#b"wq/JiP=ekW0uw*(HC=p T#8 G_?Nl)5[Y&(Sx~4%HwD9& R:{$ӂQKI4zQWƥ$J3 eo'ZR-~/2TC'#C&M:+ж]Hً=| |ZTUv:m&Q(@#:pB6*՜Ss> me7aqD!ODH m&Hϼ}i?A`ߣuhf򰑭!RQ:Iw/2?Jz}w`Y!2_^A|Dʋ0xwᜍWstT*LIKSF  ?ȡkíTDlm ,~rxI3\Lzrq\*LJδ?%4LJ4Ȅ`񆖷|R'}xUZؼ 9@0gA\׆l' jf x8Z[=wq \%eqO||Rdw~ny_*(sA׃0#_1e^^aJo1 :jFx@V luğ/EUoжmHQ>pB6uh4q{Rhf9kz+ 6`r ^:;KA^.ANM azS0DIw(sy",ЦD:HG'hHjc;$\ր:~.S((O6HԧGmV[GxWP1b߽Pd~٘GxԫYg]8"6W:^J;z:yP+ ؝R֮Ud`4)}sg_ Y !cK tw7|u@&GCB@ _XGɅH|S3aR3mP\ۊ<-I~Z҄b*?Ʈ V>f^;:#c.AF eVa_ ^и>F4:3k?oǦtf|ޙn\V)@t ,0*t+,E+xJn(bߝk1&fgN/| XtX(E{j-}dI)(^_jl48>|% ?aTrE{OZHy &,6Kď=xndU#]`Vp? rhhF$U]Fki%@`!eVA*)s Zԇ!s!J|:S0}u㜢$"R}{",U .roykPyW2dHpO~ݶQ7[@a Еb5#|3S<\T Z D2m1x&1CYRk]#%p|GU-UK9q~%ଢ9:!Ƈr.Z̔C$Eˡ¶MU?3m. I8d8VeaJka/9ls]~ma$=_юs}-^^J]%j<۶ɒ mPJ\E8WE_ذ$k왺?T7P_Ere žhtt R8A>ҝ,H+qUzo;o݂#dQyag':)A{)DC+RТ|k”jcq!dƐÝ\LG1{ 2]7kGrMXϠu"deQMZ J:Ba+j`i3S=Dx; >sGS /;5] j т{!.ض 4ԙ o,<*}\"sC]3T;]wU)( /ow҄\t!j![ #\BZ j;оZ{\Z!LK *͸w@ ˾P<+wU(d :h7jG|8-+w&q}U/ss9C#pCqme?@wH Ss8a;oH H&rG.5w1Ղz vo(;(aoFFGNðsh;* cGCK5vJqN]7 Mdc*) !$K} / 鯯6 ʥh:Qj XMBskOv#?N=F*: |?ms8p!o,ŎM?EAM:1()?ݮ'$=")D-t&f̖"g[LNM^JP~ zoy';8}oN,IdEeMV@>AG8ҒڪmQin*QB3ty@:BTsdR06^tyT}k;۝p Ȍl(u 6BQLrNMi$]dRUȇ?KE ۽i5K{7e| iRC ֡\];N_PQ=t-mjv*HK=%k}%&k3A\\W95xui\#@;:e-Ɖ3pH z^V,&Mb4,v>b#6! ~))"\]̰ttmucs4¬D\o˟ D@{ou-e8\U4 mDwYT?oITLo\w[fJ]8vBHWZq^hz^UU`ʺ`4(@~5Hddt%Ֆ!ވQWBc0TۨϵoR 3+}JwIn6OYby|8LSsjЗ8%&5u(jp!5A@;+c(n Dx;NV\JS 5ydhWn.VOs‰w`PzܐstJѺqOlUO <zQغTAĘA)uTUlAY0 +L ,n/bPtuvP|&Oz\c/%ƀ0|qOe=Vf^&( +GpWΈrk?&pJb)T{9K(sYyFRo`*b A !d/+ o'~T5]V['X'Ѐ6^+1& Ȭwl!Tq 6woؓ 4DfW] 2l;%a n3~~(4;$*H:F֏DL7/>'yImMT:F$yÎuJěœl~k-%DAG CdҿP%Hocrᶨ↠Hn3\h]ZT4홵T qUGX/ո)nfv{/ңLKu09JIEݧ@e-c?{+W ګq D,w .ᘥ f[1ob/BEq m4BCP]L@g̴\Gd4Ѕ>Y<_QΌ,Əv* ʝQ#& :4PC`yOM&oej%x*raJkQi7:R;e2\?-/\jrlH4Wľ5Sȿh24wt48 j"xl@Ap #C5zYY%vp嘉l%S=rUolY_ќH+VDּ, TbY]]Ux . m块֒ 3XKcLnGG3Ǟέ,QBa!+1)T*ɑFtict@Y9!ӿî=gy\2JEl^($(˽ՐE :N`E.`7*3GB"IC1bKbQ8&2Pnh:,uk5Ne*֧vJ7%Y ZӼ”ڽFV^KӦIU&j$\YZʗ!t$fkYYf̧ćg`+ِ_â hYœIꅣX}.C3,X_ ӈt [4D'$ RA?CNrg:f1Q#IyKFo+O|ڨX,"P2׮42XD E/tb]`E~5qi#`)oB1tkbi3_ZN=Y/p+x ̜iv ۊΕW4Gi4{SW񃸦wDZoNz @t\d?C6`yGL>,ʜ9o3+EIы Fx0?Y(SL$FqeH7]ri/0 8U|C;spL`p%A6O-$8V#zdLЩD([S|P'YQD匧"5O(*._3j-dznH'ۂ?zvܷ-|d8r쌍)_q|:b(D8e  0J^S\B}{_U`O$HҪ UmGA`͇PP}w&x(W#Pl0iD 6zw"+Ξ@J'-@#|p! Dh \c2x/]|z͢r5V#Om NU\~m)O QuGwh=}*}87[B;0U.D2xrԌ*=1w >:x8W{uH]c*?yVPֱVyqRaySFi =.gi{G JI*'8[#xC (SZ@o}xCb?r4IϢ # Icaciz#2=4l&-"%d'Mk-*V@KBB@1\5/"PE7ڽi6D8Y_t{ʨ/ /v[ӭ] Ef;<:_D•ɚՕ/d5Ӻ>hnǎB)Ӆu|0XNakL|!Q2`OYT^:^/AFDB3 [=m*2 ˌzpOk]i?!>ޢyČPo!r{Yn%6?',7qzk6ӘR?)R-^PuF0~j1#9SuS۶l!(z'zԵD*#J FbW h8͢7at\dUʡRP-*ь) PJ_Х# mӊ6D7O+85\j^pc,j'8k; <ku |182\:SM=nNm6;_Gd4~!h^{2#a{ܪV}YdUBX\2T򮯯> "ވ`61d,-⇌`O4#RjwO =4jc ~yDOC4AkhOz#5z n1qQĶt* 546(/\O-=,zJ>V/ EZJ~x "s^_©loouE0w͇n4lfPфU/ $,[]lIkgxao.~4Rᰗ(бCm!,kdPqS| $?= q?8h@@ j@dY8odR/-)tmW{; I_{P"W}IϧPӒ''7CAqSAvM$PF9Qlf򅉆Mb"%1P=L0smOJS:mS_JfD&Ȉ-"UGO33G B)+[P 6VВbX Z93) ݻEdrnAȐ~qG_ r-6ft;#} cs;= =L,Q9G sehyM'*U|4 :BdFʹHs|SeD젽&(!ͭXȃnk*i@@誘yZq"GCaɍ@C͊,p)7%(Gv<٦0ΌG_,8Yd5|BjXKK6JrmV8l>㗍m𷑭]37Gw0 }~V(Q^GۄO v|.6\0(:hWi2yR+T5qΚ>K8}3Vo&I]6η@OA; QmͧUn 1IHBX:LcUM#lW>5%zEd7;BU?Qkf>(G'g IJB/fj+$tD2_9na"cr,Δ?${#p7E'MUI3$W<\;`2F`İ3!S9/ ߘl9Sle"IGd.`Gd  #v62oޔn/P6;fs| :t-N.I p Z C&#wr;xS%̮Jk''dIA-K65T2av 2@;_u J1n1+xஙH8wD]hUZt!V8c C|%c=`6- *Y*>՞wO1˺-T~,}9?.aE6BZhn-yXZ|_4{ܮBޣﳦ3AzJM:;/V1czCf%\Wd(WK3$Tik8e^=SB H&#A9Q/CRantIh4@n J!:pr~ܔգIJQݼpgXb5qmiv}p kAuKNϖv]R␢, prv7MoM߄ (~dW}F^sFIW Y{Tp;&3TLsvsF >,}K Er8rPH;RUkEL ~hq(([E@s:[7{ HoRO==ӍHN5+wCbc\"^_%(p!L =GlRX~V`O P}kߥ$[#^Wd:#pmhb./79Y ;G 9İ2{PbBfeק>=]C_Bj:7q"ЮU/#&U8W,Qݲ"<]33oy2]idO|imKnD (lE.3U@;Ҝ+ϽY0`\ /0k;XWSօ?7ۡp"]6jЄU-׊IѺ)9*>~{;ə{wFP;Z,: o7hdNF OX q}xgYkB*c[R{^ ;&/*1߿F{Oz@: xהƪ4gł\Y s.2 vT}IB!gY!I/r)׆L)?ĸɌ9$D_gM-[bFUۈKd698|6Ll&ھ򛄬 l85p\GE8+lIT \Ua!8YEfΆyZ5ea%*|Sλ2P*n! M+QW0;/rݐ YV(_{\,,&'}V 껻V.ԧD;d-ܚPlBW^ot؈7'[t3U66 :=ϧ}m4uIrl{N;=G\-g s=Utk@68 hjB̤+kᾘ =߂𤶆+~E K]szge/B{8u4ju][_d:ԱQ|3݌.^ZqJ:c$jDQӄY@=셦 -iKh Y[UHufmC>@'Ak\X GD uFuϸmB[g%P5;m=eͼ ~ FZ*[$%]|N8 OvK<_7K?)eaT*Ez8Xqؼ@*ڲ<Œm ܘjޡyѐnelG ^˷f)_̵6IڟA:|Z}u(bvq᦭Aڶj{$&P1khe .?l L/.&rm\$<1ёR;%vUۿ`F|[%MC7^drk.Q|_ۇi] pfR+q!􈆪ufka \N]3Np;.߈˷M he“U"_f *a`ũ9ODF[02Y7h㰛*M7hS@7U"`0<2t%}8长NPIi;q)m#[`Á;#:uV$ـ- R4T8/bdƅ#2bCut1b>0Y̊8]-҂Bۛ5.賱r<`>ۅ?4[2pdlb脒ku`sdWBrsR)7 W'Ariwfb_Nel=&p1uoV.R ^Φ-Dj s]%<HY刌X o&KK핊ndƊVnt(~φCz :LY87>۞gcOWʛ?/TN` "v !p E|ǃ, ʎ%ǦdjY 5C<_j~:2wԗ48d:HMgk謪zGYY[q=n:Ǒg,vŌ {È32;gy,>$N3~7 ./z;u Nm=7D.sCnE+r[\F%$c4iܡ*.}q qM1גyv_{` OEy;! }n#; 6 oi-{ozC 7H׶8|Y6B܅~,3TrsB]R3 Ϲ AHVO}~X)ԕ-݊gwZF5Kw! p/|oIBRRA0 8a%؟!d4-wɇ4n(5mLD@SuK#̸XƩ}( o*h>`>06/6DLhԙˣ̾qIt cc \sIWH,L'n1~`*@bh!PCz |tg*'ܦzO)#F~k@ءm9Ñ ;ⱩyĒt m5frJYzKS6v\x`x2Rvݏ, i-\W&ozG@`u.9tAƢ;o`)ex$zë902;?k3G؜Ho`Yt?8o)Dɏls`; (^u4D<[FSsϣ~Uga'cyZf36uKh d\G(`"K"@;Yd.B89 |o'3ħ(+6gYAoO&b T)b47Kؖ*Ga4PdeB6 S³l]c rd{$a;E5XETb^/87^ѺkHG:)'(*H+~=tjjԼ 57{.Sǣ*Uof$̀LJ1#}zlq* lF9 ҎKFg WSR2Wx{'e&B’uyǑ!!;G 0ssA ^- t %%ǰ/pac|,=uNi8wdE#oRI$o֟taاC'CnZb+G] Or\ *2'ε `y/Sb67lTXHW³LUL"<@ff $ (FTrUB% )A nScoTru1ucT/6(iGƏ]HZl+GWe _b:тu_3!z~h ?=/n$ZnFGdhIi\|и'G2_?'i $Ͳv=&pkʄc[HD?uރ)czYtӺyDЂ0_t\}&iH#AL4,@=BY:G䶧AEɳ=ܓA߷ٞE)y @Җmw &/x%C6Cxj>mhh_,zgq)Y2xjwM'a\es +ߔ77͉@q uGܖq!\KqoC4 >D_lG\Vz' 7ɝPڂ."_%+{Fn+^D3 3V)pӲģl]b+Un(P}`s(z/rż@'ڕ+y2Ry6DD|L s$]MT'.~լ=h_(\g/l?)sif2HW?% j[R=wCMK"@I.~99 .; ֑ Zl[o5S듋[jɄ00vyR D,mXtmۅm̿(]0*/UHcO_4k >ja@Fڐ^5h?/UdF3!+GEL(ߧ^K0ϓ,xZ6R@ZXi g|d5w-lhd2Rc*ԍkO1x#U$ q 6F1cM4';PBRȺB %T!bHZd˔ܾǧ&>{g#} +唳OJ\AT'|iaf# ̬: NX3؁73gk1:׀O\SI3ef+WBKC`a'ҋ Yt{ *6L'fbd en)>/"an0g^GdvQr d<-ZWk2 mkLq ?; ~p %1|Kx%SQsa$kax !^<:9$+<\`#fv?~l.1E%LL 5)nty Q*^wz&p'X +nxn;h~k^cսҍY+_K t*qgIXdLZncǜYlA=-Z&xaXѫ eJZ؊soCY\1۪W9d`fv壘`v *@+언 <L@IotFcMicNj?Zsϊքc O9UibB 8;j|{]5̧oᭆrqU.hbLjI-WYD@ l7|^\ ?#r6&U,J02 {7CKU]UAfz!"H By *[aVv~S(5en8Rs|~k/Roo\۪kÀsΛe>nJєy^"1¤; yVGL w_e!&sO| ?|bxF& pEV:[nmL;1Vc#PdKkTy <[M:bLBU/EQjTjy@ͮyaVjBk`c󟴹O|P Ȩ,I&N؃t$QuLskCXϻÿW3_c_0^"B#Щ+yßf.L,LvНS۩FL.t&[oWZC%UKi0P+t&1w%#l*gU/{lND5"r\zZl)Df`|Sd Q ݄` tXp:^\"f$yS6N+B? ^ ~ "BTA&-x7ҊuKk{FOyO =FԿ1+Cܦu>^{Whz@C[Աx1_7RY3zgdc׷N`-F?u TnˋyIO?VI qsKGpwmDL>8|$ˎИ$?{VvЊ]Xh׽:/ԟ 7G=ϘW . YU*Z*JڿIH yZj/uV}!oym U?hd{' nw9Gi@ɽ'"0(ިY*J^ AEPepBջduJ>xiWB i+C01v#+#EˠuE?N_Є[WYR< Tz!?o'o$Fy+ϕ6(MİXܫݶ-E CKqF/{_e]쳟dgO/ ohoh''c$~$] @x`y ' }.%ͦu1l^`f`̳PPF'Q)ɉJ|dwrWlᗕ<ک-q~<>A-fqV%Q]2z~yf[FZ=-DNc~q<ʠrbs)5mR*DWKDb`C xwKaЙ\NN(7)f?чm4ޤC8aU9 /sThNjj+X6I>%X~ꇆWϜay䜫yXC[B_GiIG߻9w0ϛD*@>i3dD$z3.Kgx$PM@}j")!G̽cMK~Ep}ZgTWpx}&phG&(1V}^u'zMdh~{!#ۥ` &`g)]uG"ճaHޭmr{o@™TT_x;I*\蹬5*BXDaދ %ى_Gñ̠3s?;)I@Q<k%yq uo6``x9s8Kh G10ͣrd5+5#$ VQnkt,D/<Q33Uzw-qa/sY'Xf^ ԯrN1r@zTn[ea)K[j5Zy]\wSegdS\hq*C%n BDp~VEsS 6ۙ!7bdH%Macwr_6uUK  ö>3Dƍ~U[F hXCnA46gT+' 1$_-!uWڤ ϺUitl f2br,ܥ8l; oaD.9a~Ig[_3Թ\2帽0Cٻ#% V@e$_R.|wh)c`+^B_~p|9S6 @SA}lꌘ vOm(Vx~ۗɛ3WDCj~ G<=-˩ 95Kʇph2bɈsWwc`*r.5zӁ&g BlAreͅ;&dpA34Of/_!w0C73LDwv ,U* gϩP:`y7k2~E*iw}L~Vq=L5ZQ\8]7ۏW,ڳ &䲂JdhgQE;0p6d$(xw-ZSH1Z`ZS.qV %q<eqdJ-(R/8E$Squ.T۽7d-)z79v& ~&DtF̓}١bY1`DfT b3k^kőA|9@ üXB+baЀyXfE1| '|o]Xˇ5a'ϥ_%"rұ; E$q^~3L$5ȱkh|ڬgԂLhCz}#H L1!%ki(u~}>h2Wɸ& )W,/j)%0?vR*S>ɗnjiQVp+: :̉ʘ|˶6*_Ypڌq|`fLY(!jSw/xǔ1W#U[ i^8L/Jshms^yɚ%gOKh77H>w0K|1hs /{9<)\SQqC0A&&.3J?rwe.Q0PyN`T?TJI\=8{:D\?_j79r6Ȯ+CާEvK&nd bi }`?!ˤ4?`6eہ|MA_6Pp:HɃZg=FBBz{-8.ׯn@v}2rx9jݭmn' &؊#䠮j[]$E,AXղ2 iA"t!@&)9s`L%XM6Ѣ;n6}H~ș$(w叢P}h_Bezyw*OGod/X*Fn.w"D0X^!Da2l _~Ftݺ6=T2pV049h32Ustap`E@?LZ0YlA@/nBPߋ:w#xqmD5nL[2P?wYdjNziAC¶b5i/ğqp>b&tӒ0P^ ( %ŷP紥j#ɑj=`VàPɞ#~&#T1 OĄ\JDāaBΟђzw;wu~.YVNCGxttV9@\{0 = ^GL 6K#7ǴD"WzQ7Xx~FV_ON be%{&zg/6Bp*CĈ @%D2*Oi)8T=~Aӗvfvw~)%u[/zuwdx6cEJksl* s%GT=J|耜@ YKif_܁(5rFǚ,+9yP!| uRc)&\nOQ3Zt!R;(4n0٪Rb&W ޖy,okjЩFGW!$Kϫj#xXAS1#Q mƑjQC+uZ}q {* !јoA4TeYI)QjV= !Fv. vs)Mez JUi.Ϻf׽:5`)]% SSg{/`ю ǧߐb&@] 81=@r=SD`{?E]YkZ7PP@y;?pe=;V~ 5C+ĩ}-J(&J'耼7K@,CQ8OϴoǴCfP?mӥD/ [Qn.+`͢tOUj%8yضKqF^Jx(E*$0P'%ݼL+ԐSA8}OHwrD\wAߙ<‚dxϩRfsјX C $fC[u\; ;#l "*pX@ /gyC,xgMLӌdiu$9ѧZ PRVI9}(a6.WQ!(ax(̉U2K):4őAj7zBL.>Ic"|4G$fQqo: $IÎCyrt^;YS˹9dk.gO}QD0'=}EN|W$].!rFN@BwcsYEePs@*z[hvhkf1\.(K8a$$Dxdvuŧ2eA4:=.%B"F+Lj#9>uaP۫_L[Rn SV$dC}2]t0IB[hZ$[6"ώ_s`EYsduy?pW w|2?`h{>p~~"#UQ)%z8l6fx$/b;Nfr_ \S\{:ruz wN] bĞi6J 3|\`sePW i.;1V]Ӧ|;C@z Fi.ńC{Hg5i ֟ 2\r =z9("rB!z utr_?^nC,Re9\Hu*$<>@%Wȓ)of0t8=2_ESg7YplR'6p=-O4q5y3d;=Bn񠏜ćn_1}IrR5rpց;|X4A,[v/Ta߼SSsRQNCU&c\77) ,&Q@Me0zPwj&G׮b+>6\w䉮;*Q<#imC;a TU\GR4`AaGw8L@6=&#a\@ BT[9Lz'e%2Pbt,s~Z%/~O0i`C O6%Q?96wpWg[Ib"/\v#'Xc煱QkI wf$>A_0xgҲY(LwT##c| nt7!֡m܀-HbXqU9p8xz_퀑[P>{d^))kTCE.&J/Xg(IbGj1IfL统q"NC;[kga}U)E 3uIXX/bIf6n۷5hᠳm&^T m1RK7@Z΋;tqah&"P5<*/A^EwU+=+YYRkctUV m+u8t%{,EF:#GERk×c$+_8\x0 %ܐmz* B{Ɔ?E`PGp9'C_YWN8''n\S(BSK]CBٽ&a|TF2Y˒(XF#FWG)d~Odo-Tzy>Oϗ1;4X[:‘TD ZfC } !yh:io;4a 7lSSpΗx!7j"ALR8t^Ce^Lo4!WN5P[Y gE’<:b6_%TҶt njk'!er`cD.6%w9g!쉳iZ;7 T[4%v@rAoV:hhz JŌ+pP%Ц7MNyﭵKix{_Pf8)l)Vu;\1I0[ %3BhիV͛ ّ_ xs &tK2{A;<^;\Q IN , ~z[kvϜd20KzB;F}v2ʷu2b%>5NÔP :\mS}4y[&u:oWBAX(}#{4@5Kp:̿SUn07{t#gaEz2Vh:lzbZ]~N'%bxr:E YB@pC@H5fzGbz [@Ā%a 2rr̉;~1}:ׯ_N>DZLjdY<GT!x+5&I:&"qd4;q(5{i'B87XQ5p0+lYLp1£tSϮ#'~jQ3ݺIIlsxcZ]57*wswZ|(ӨTEʙ!֞#7 ۇ <3e?B5.B;yoqDG >yTEH8*i4oIi1|ʊ̌T,|,ĺ;85^VKf['*Z a@Q*~.[-i? K+$+ o Q" ۯIӀ yK6^3 eahm_tL!%0g}qZe2$kp73{{>fz[+ @8Ebs r0,%[D&(bbpvPwRDRl(A¥{_7(VhD͊Y+Q1>3cYBn_ˊ * @{cu(Δ{G ÷=)07͂SoY]]lfЇtSxݏx0O3>] #1a&W`m<-MU: hh@=9pd K(Z2s>*_rI=$1ͼ-ք~9Nv"N6_.{7d2[h4XsVԪ7ɩϗ %S Ia)&,zH,=6e]g0<_r'TrAe tRRl`χԆtSU,a%/SUJ/U5ɏIқj< d()KǣSĵ"b /wA^=P =*ňͫ}€ 2Hua/3PSV [F;R[ JLցEsTΑP5_3*BZa.RSdp_VK}GVc 1 6מ) bCy1X %!/'N#P@TfɾPPuQX͗pD-m(ߜJYڇ:.\}US g]3wB;8m[S#/ e7N1's u~y(0dCN~;YJaHZ k0`?$Z^oŵܘ55q#1Z9 qZZhdЂmF'AV}(ɦ%LhR DrVgޣ؉axhQ}RKVҺK;9|gEv5_J'1$5g$IR\}YwucJiPvgcHVBI@3thɮ-y„2?^JAX5Yz#Lb,ydꃣ_Մ+kFl 2fQMg u"GҫH!+}r*)baA'Ǩ#جA+NȠE(=Gz[eM_ƒ\TNTݛ5?o2}B EkY9-Wd梨}B{* t\/a%i&89zL[bJ|Z${,#DBg/u=-D}&G?$rۉ>H[u|E H` ޿RkK 2gmXlPnqWw^kx I<Jj[> M'Ji-ء1x@/EǴ'M\}ώ4$Ayo5#z {`P crOxC v-r*Ι/8u:(KoyNO)5۪{n mWSݍÝΟ'I y@%:xoiW% 6XR!Ӭ /M͈>*H \1|U5j-U ̕SR|iklYi`^QC_5ɁY KKhVS @[_݊cV-$Sw߫Eq[:]9{IWH'"IȰ'd't([m&;17655^>\6#+lɻHҙ42d'n c2t_KY_ IGM!T`p!` nycڽ!ByナڻJN͐D<ߑBTXA^+xIcWxj4N;4SC "YnNx[k }ȐH#=FH$c.MwP RW wb~`|K:k(ObhB"_aQv2,{wϟdiǕcr-{Q2=JH*% s"'r>вumbofc )V x 0(>#@>BV+- *e#*1;g}f^"ySh[Yf UTvہy6<3dG_*D8.4OfH@]1hD x%">x /? |9\N*;*F%g_p-S|"|'2M!L(Ak 3ވ@x͖8FR`'WWgə.8L[wټYSyoU~r9ڸg _dBnfJ[5 ک$rOVXG0n5&[@'PKf1 \UTe.| ΍ C%^)J!:}|Q~T( ,4bT7g/H҈mK@hjhO XP u?:MHn.9V]~),IÕO v}@tP1[!'0d/RSD o+S5RZV$ayiҖp8MW/zf&B"+홾mPEiX3Ю%T ֝]Ogs8X$lNK(wj-.\OZ_酉W 4,'aUrٺc#dRjk*>JIF5dǞr^䙏:P |B?.s`bp2v32yx[,g^H0ʳ%^n1Jc*/ԷVI &FxA=ɇ=o~Ze#8`v;Xsia_ƃI$"bE#޶~DY<-=@pE;l2&Ytqpoڟca۬#lyյN"I]W]kԉat [7&!y1g<'n͓ف4LEK]WsR-dPרVt1C3%SG`9Xj_ocdʆt΅FnXNLT {눕>Es Y5݀OowKHq7@VQqoKA3iJ?#5.Q:=Sw{WIacT?ATI@-TXe#PMvVBAw*4dbn_9Z]4+4%ϓBzicYN15 n҇.Ѹl,Ef@\R&c$N&}>6"+A@rKݢiY/$E9^5S^ y]yrpŐξ6bdhP<_yFn%bd~|39 (cڇd>G]&#T,u&vR4ɹ'3?lCKD\;F;{^z2EnxeS2*õԲZ_/;X(/B.gE? o w86n!a ŋo St*6sϻ{NTAےVaPN"i(=  rټqn=܀X _7";x7/a_fbzqMZkШ  r,ڤ ?? _䄧O8"; "-NŴ ljl 1_p-mZ:nX˓.[QdT>.$汹%Jo+riҜ?C%ɴyj;\]Dr9oֵC1T 5ڀA^*ܶiZ.@\"3= g< !cgZ :h/b"㘌[RK74)y2h%6 5}.7s =S^8wKW,?Yj˂88mҤY"')˔̴ y -)xڽL\\)gOLuʗ`~ ě^RccC'rˤmˬfS=)c7S>/ O;xA-D,9b\`hq7_*EpUZGbf-"Y))o`G?[cpAXT0 P%DRZ)^O2q }Z{gYg FM;50 ͊-;3ROMR5(>$B7a@U MíP։E_x[3*NHc7xXEúPXUQģEPlW7#jz$cWHnoԔ D JEBƯu ωG& XZvB~<>߮9M۟P2mw:\Y -aɿ؄ o9LQ268sҏaWYAD8I+L P CN,z0sT8qSBCp~8*¬o]KX?6 ڰd{Ijjj5(K-aƂՁ=RxXS0ZxaX ;IZĖSE* hQ 6Mi4eQ_ N o MJk4G%%6w8 (PWߎ $Sce p |>`i6ǥYo,pzٗREQa M]%0>apk,Q7OgY;K' 9훕ҏ!R?%,;եq7(Jy|{J7bG[mP LwCftKJlaMҒYw<m!onC"O(5W&\Fql! 7H8^PCC0)Up'> za[`cAxah# \)yg}o .|^ɐwQ{J *0|3Tˏqw8Ls4N{t:M $u,c㿎=ڟɔtH>wROáO+RX{ ~Y"C1MF막/bimx]A7$Z&xWL%PK${eA{Gp2]sp\فT4z2@rH95,"]ٕw混rMQrEk L=c˽Y5;@hƾ=s${ÝqawwReLpwVhz 7q&M$y0[֟9oO?A{q#tb ݌iϵ1͝\KP`:{G~Z<π;ll[dw.jYTۆVWNA8K2''QmQ{>ZȌ &8+[|ū$_Kߤ̈A@^ԉ\ӫyV[|~?ͥ&UeBLa-^#]R(-d]tL ͦWx@WKĭy:qp>КVpZ}%P6X(G߇xd>~@uȭ^Xyv,Ok%Ss}mѺ3!v0o%z}21KBA)p9[,kI{0e^UVvz{9&vG@hIv{~-> QFq4 i9 $sR94srD+όvwG7&46q&b!c!mQ1|D߅&5+G 4Ҭ=Xؾ@C1"zɡUbNŦgm}d2'UV4N?GGP2_jgX_+ڽs6;!ܬDN8SD?(ymMܹƳssd$w iv7Y+w$+9E2WY6{Bh6>".𢟤#m˗b0~Odי rkkEU&^o[A6oltTd bzԈ -{ѻ{ѫC,NȝwsEo!İeXRVӓsd68 1kˮ?q9 dj@hzhMO;^AY" -bf2G3ZtK>6l-tr_+Ӹd+h}tR"WX*8O$_  7He9RJp7m@?爩 i&7n{2& 8o>2$ѫ:T4#JmHmt.h*@BwqFn qdvXY:њ%`E4`52!ĸJtUZ D$v"p4!e8. ,@72+ܚatd VeFS"1d| H#N} G;wy ecOq#Vw3}uZAh!=S垫3.!q#JG ]AL5_ïrdu`Y#0|*;4*-9^p+Q0iޝ(`FF\lG_y2Eem^-@XуΣ::Q&U`(p…sޑikوK^Y*u͵\ 'Gi5a-sF7ݱATq?meKweܮ `<:'va)m K$C h;hc}![kWfR',6xc5ciZi0a+;GՂOm`6 !6_Mw.r=&z~fv Xw )`5hna$5 t-~&gGyW ,e; G0xX0}uз8=mdm='~@s~.7DJC\1z34- 7%?N@`愛a ;DIGR8`ZE;Ԡ pDK4,z37w._riy=9\, Z1gі0k\?A8)zvO HXªy5A*3VjH gIkiP='8/ DUږ*Nb^X&]ͦ8aH'Ey`KةVsJtrնҗ^y2nyrE k0;!gJÔKzMwrJ#E^|u6[o.A:OF! J58 ]=je8p4B:ݻGlB/tT@`zvk,R`lGKHD1##8äإ~o ǣikC(at)&})lǬcvӢQRf(Ӫ  jgHS^p'Ǧ+%>yso< 1"ȠRn%a#w]ѼwԮǜ1-5I3&:LOi9iՌ8m^~!ZS>yj,a\ MӶX:Lysx4 ͻj*nI6NчTVvv.MSӅE<&DZLW|(l4/-:NR.)gjbk:OaD g|q s!,J4DutY*<~ϙ@i$1C;c;V'ڷr|D =Td!R.@mpjDN 2iw}"nk0v QRx6h3j-ߑʘjWDc;B?2)z$X_u!s О(yw^hAB_L]r`z4ފ'nRdrHP%yf`XȒ!>Px4pwjllPR{Z'&(4zuŅ f fkB[.vX^nyvrL7yǢK%U(]f׻j`x2yUd"+UvjL\)E3v:Qt-&1 ]PObZS}]С&[|u&0okgyf?U}k'! @GܗCZچ>?F` @aӨ +L\( eSI a (qj5~% ~_|AQStudT2f Z\ SkO7`fx-W`5hVJ 9M?^h A{LCWoJm*8qyl}H6 WY_T߅!qQL FeUSl$0r߫2 iu~ V)P'JxPWئdrlJ @{ުE@D~Ȭ9wV5Xv3Ȝy .ۉH:$y8pm RF$fJs&Hf d=`/Y:|;]a;Sp),g:B^̒{&X I }ܛtrqS V"9 @UiFEY@ BImf#74U}_OXܵS{UZ07sɳLym"€_ab $W¢>8jzE0h'H5]J pWPZhʝ;LD=7'ځdǏ/h+Ƽޅb*{lpyf粛W\Nxƍ- 1Tyވ,>z dD "?sÙjAO=B*ɉIsjV"[Jԏ>U*Wn7zL,HE.&JZҠ e,#t%o\ {8d]oRFv*`opjZr#.UЂlJP^x!::+/v盎p 1%6¾>Ы(zKӞU:G4`u `=ipb{QpzK:J`vWy3>P :#hY [Ax.aGwEE\ c`ZMZbj [¿R~FZ^$HU@&^g:J$QAyEG5xK9HץVI~!(;zGT8 5F^qظDNܼHTfaTC5Tʅss7V2>~׮- W52'tJ?IǺie']W >'E] '-WP^ Rќ0qg>ז4FW>Җ3t=b\^s%{ f&l9F^S*299%Uզ}#_LPGh~ўGv ! S MT.Qb1@4̅$=,hϒYpIx} bmʺv^E !guʂaIȽVگJ|8&2jU0M?c[D͠J\cDe dFL)W> ͟hxAﻝhTeBt z={os׵Wcp4SV6"H1{+<01F& ?pH~{󉠧CL{t鑜J59}## rS0a!F+K"~ ;:S<{aӻ/A ?`8ʕo¾/MS =и#HiNM &v.9eOpf-!7Pqp!P'bLl% 6ΛK"'= ֢e{yhqԃq ]B2틿[3y Dlɞ5X B%%)>yP_^*+8 ?ڛCU\caTUꙩMα}刃H&YhH.mAܾ0+I^w10rj 3ʹDx cg)4K ~)>cT:w]-$;Ÿrezn;0$<:kwzN*-1tv [.f_" Dܬ2$[_cx:|yTX64+2X2$to٩dyM37sB'%-cKL Ѽ#S`M_@ Hw~a IhH1f**0wc8Dh U閇 Hb}Ekդ2M0 =u\[ R_ ѡry /ܧLeF]1&Xz.nZWE?C1 j..ı>dӕ|3vJ`I/M}zĸCGvD9;}C>{kM:_J4,O5\Lz!ӧinӎVKiwxIBUˉ90XP@Y88W, rI\m.%L×wuxrP7&GX%xy6^]+xYB5+6{="[iW"]+;+t88_֠hHc26sEk`?SZg~x=ʍ!x tc2Ro<.yZ_r3uT*imhFF%:x**%-9Hd:t:.jdhpry6 8kթ㕣 ^sHDJFA} ~| σ%rkIJNbZ {Ak)23W&4u<:.xFg EF`4!Bo6ڌ{vC[k*Ғclk? mTOvJl(@ -K} OyF y\ŅAú#{Bae(uuȆCUOFdX=@xhk#9 $:I`?N$wf2#{J Ӗ;6dz ԧX`[M\]?kH8iwRy>BgdvlH꒕DDEؕK L3ފKH=SvkM7(wQs SAW)EH$w<+], GV۳&[Pቌ֍ٲn oD  dT\´$S_a# ,3s=&r>fN ڈ)R/-eF;\N:TOeGU9@39QA;/ 4x0ѵ#^}@Y"5dhO*+Ӊ8tEUWk\6vοM7"̌#X냃:MJ),,E]Ud؃˭iTm_Cná(bϘ aRw3\ya*wc]4cJ ᮀz? ߍ KM;̖wQqk-x?T+Į} Mi$1wp6B.sKaVx7%d#_f%25jJk{døQ@*z=lQa4_Agpz D5jj 8ۇMbH݄7%EӲQ9g!yљx^6JGY6/K%<43ߔEC D _E&͐:!R!OK_-YAݯ&»q')+mLuljo,X/ eYNW%4333ljɶrOpW)E ѶrAQ\D=4ewKHp;|,jwfaDTb:XWq2yS@J ]Q]POc '"52+~i%o0hđw5נ.z^p)@EmqIf͙H#QJ|_ɷ6ͬH!ۨxi&wExlbI옝kRʐ)@@ɥI6Z6!4 cDsSd«vi5H\fۖ@'RWt!,TZ̡S&PD ` 뎃I^AycZF|:PdW8F+[ׁ)]RLAv 9!ZTaۋpOEalm)\WWFJ]3ޞwPWG*kmEg6n6Ō!KРelƸ=;NIFaK7=#8L բ7Wujjy د`]g6Iaџy){f\[7do@(sZ ^/ )rjx#ll -!>J흻t[(LjGa4oW%@MR>bm+dxQʝTdC eÁז,D2? lKf"!63a{oӶ>[GBЂ#dٕm|`bc*詝0Ǥ^)<zm ?U`tD/\/څ  e{[9PE*MwplC\ Y*$ݓٽw"g۶~ 8Qǒo:iPJ*r\ ]<2!3c*p& |2v T<{q{7 ܟ"_JI tJ)NI YUBC kGv?g:S {LX@} SY =]r‚IfttXC*\ mҏupO,A<J:B)b*gV\pmMm}J'/.Yn-y#?0/hP /1B'I& [$qw6r{+MXU)~pc#Y W&UgO47,(-?Ju!GJ|J ֳ ru J{?L͙E Ҁm znH]*t#9\$Of"L7cMvjS4̸@M$~{=R [q_6v~袤U@҄=P-\%rꭗsaz'-lbγmDc0A~]Ѽ sΌT\,˜[.pMNjV+nRf bX4Z'&~­=٤ t:) |Q#K4} BPyY7΃΢|CA6*OP2ƿuAύ7e ȋ\-`J29).&~\T$FBN3]$7\ ʘ^Wmsq5XsR6#rESY\\S67^:%;Cwx_3b(C~ !g@*+1X[-ӧb,ܳFM=:Ҥy􂰫 sX_U1 'k9='$ue~ 'F \ՉɅ@n%~jLcϪ;gx'YSEZ(ﲌgDm7*5)3<>^Vsd|ti<wJ姗&(M9D{24@yQDcNeq$>=*0)V:8iW{DHZ+J  ,sD zZAz? ء 8X;"r k6E ۔2yx[i0 ƼFj3t: (NڝW.8E=0u(G.U&ЏҀ˝jHV {59A0' C|ʶ:^\N>_\.jgPw< C;mȀN &ps VJlm>1&>BڇDpD+hr"`%:(y?/+TeKU_ű3qݲ䘗#(^2z( ;P -sQl{\3e`$_X @[7UPv*Ýo5)`m_ue:V<{E{` ǚ*$t:dBToE;7$di:vtlb%ӭebX -xpѻݪqDI.!Xo>_h|q2I)l2bTg l9$b cq7lgv[fbM\ ]!I:V}_$"{Ss(g4D *5˚DoW- Ӓ Wq)>nbHKLQaVKxAAȹ,'zP웨i* &ҁs|rx-l6!щbN:MD#uC}cE/6zR^I轾צ#Ω9`psrne9} dXh3Y D6wM8BJɆ$TA>2C9S|ۄ9ZһuW3C/\irJCQuX;pGpUS vyޜ#Qiq" 2~}ɺ6jZ )J,Amc|9Rx?\[ף񣇫sS'ԎeyD:F H:{![UvQa1BoMCgww3peejy<bKۨQN.;=/^%,aDnӹ|Fb.8K.WlT<FQ[yZ%QOBSPJ؝͸?\[A ⾖_9ÇQ]놹n(R̨;F|S㮠RjpbQ$0vR;0?bޝg1QJ- is%WzWm =6j=}!WuG[hq|ZD<$MP//K:og6狀wPS]B&. ΤȐH߉FW-!2i_V 9sB/'1.ZUiɚ!, p F*/L|CZGS%7Tc9"RX2_W21ĵ`,2kXE?r+e|IsL=%r LNPS7#i^a? 9MքH0Ad%5!q? ̷{L@ -ZPĻ'p {!cʏG1R&f eT4ŖfkNERZI B7ںk ESL˫!ίv]*RtBV ZSSO(r]#IX`e(C^3H.fd/)`MhETl(Ez+4J$fMmmkr"W<~QVNu@f*F<@l̞+pS Z}9;k*={ћ=|3vԁw;}z]<p}'rz=Rni4k9SNl+;w֭vpMU Tt"Y9LqKv3†l }3.uLYHޝكg<s)5͐`%5ﴑ{b iZxu禣Wvy7=.w*8Xi<}jQzX2VBlW#a2ˬ- KM6v (]n8]4L֏f/ t&8/z=zWᨧ:7 ˆlQ&Yq.A.e(bĻͻf&`Kx8tΆRMQ U7 k% G귡coYei\"H"lnH3 ԰;T!w,<|]0O3Bm-"2.spV=Teiцed"/,d@Hz *氇~^0tHf޽<*uEzo8E%-F!rzR0 _l+gX8巠=@N&PlN4i8 0{e K$ j: ڦE!eۄ}@GN5wӽW4!4>(lhofo%羺pX*ޱp )b;橪̣Tg,m[3e 5]/mz~(W% 9\gP {x̯]*R4ǝ #0ʍ BVM^ sgaը_jw/ʆl:`|,!18__G({Tjս%j큷40ʮ8p"JP EgAZL<" 묣`n+z%}a}OvOO7D8*^)G9R^P"hԹXEo}G"JwcE,NSSm;[};d|ܕ%I$딤0{{ % +wFX|쁄BQy \ZO " e:!ƮAݠ/V=>)#c3|@hFw!W(<%`l˼WexZ!Ou(p:XTy͉-@}^CIdRY|ct5U!\Wc$b~o0Ӱ ~gc] a5]uؾU+P;D{Aݭox̻IN+Ԍ!o4-NOƷ]c%V0 e~|쪔1GET& kE{0oK7,T# @5fY@j@]mk *UDyA#C1{"E|D@$Y dirGm8ZcS$_[恖X:W_HcZ)Ұ_Ѥv߽{6l>>=$OlIJ8+>ϖ,Ȱh:fﴤ|(b t쌦,F\GmlBjr&@Jg(,Rl@ 9,d:uUoxJ40Cѭ_h XxT-XzgpYe';CANte$Dx +yY"DŤo}Mj>~3Y\IȯzboWƧJi;>'V!%o5b ,u\QC=k Y ${ɕ\zG:GJ!쏉eba@^f~LWNX;0y-/)TE*GG.&Cle-նAR &S ƺ :ǾJ[IghniTPs#O:ms; z"/Eeo͛4JKz͑O@$c@Wы2 A"Rj L]o b:ѓEÑa֟ s2 82kDN uY"HyxC!֧Qp}|{^ɂ"4QG_T[=̖+RϧUbw:o(pJ=KH% j}H;uY\''129J0#/:ߓ$ SdfVԵ-0>`}\:I:?CwC?")HT=g JxO[ :׬i(czxDv,^MN=Ɔaְ8k6^;=pW}cٱzB~sNiWrNEr!]S| t_$UZ!?ԀghC;!3N ez?8Џq~l}CS'iӚ1+[v:YJ4>g}EʏL7M1]tU<ggS׍Z.;jnоj~{̵Iqz兿΀Rbe||5h-%X)Si%ɋ|j9ᖈ /X^Db b<ͳEVkO7eϵ lX@Ab{Ux:NJ 3ll_rCNpɰ&]lA,r}6_!tT@[G{/cR/p'Y&O "G|!A<\v%[t\ %TiU*柿Ze}peN$g8s`5N1RYɉ[HlvM`4BeğFsiܷ,wMmA! Da5Mj7S/klWc^"č&|^U]Tt5XIhвv:9S7/c6dqćPO*"ܫ/ dUv-^oTV+Ak[^$x4ݲt/ͷͫ -;ō.f!JӻF'9Akh.yo9| %7yCxH \%POI!Z"jn.be1YRmF='<Є(w3y-lj_HS lHcSBk3C}OE ΀;q  ,6/ XXw<(úܨEoTePB214·.n]doVaoQ|ardž%Κ/ ɲ/b{ }O2;&]>2ӣa@DA;F\FM3 9JX/)'pN{mse_i{n{voxGXIc&r}s$m}Ȍx8V+ iج][%Pӟ̢9j\P*g>Yx(7uf| LJzA'6rB2EK|sN Rx=j `=~Pnb: `GT\ 7@=c7L%$!!`kGIE5{03 LP;iH9RObXSuSLJ񀻆BKhmaedR肋WNB؈ 9u(x0WKN&ֹx%f yO/(s 1H*d6DcpX^TZTYRhMfj~1x؟RQv$kjPp!=('gs^=I>T8_,'FJxY/bmdT\10R7(^ 3{,y;+W.ֿBDpɲ!>tP%6:he_w*ky#^1Ы:uk Jp473YVb{:-{ky)A,^Y,v=7Kα̯ኗ-nc"8+;=.H/3 )8"b ‘X3.࠴q]v;~>OśH J||>@q!X] IU5c6UnfyX\I3+o`fo<-an@k`eorrX-`x8lΉ`j(u<;ӆFZ0aƄ|C?^kWTx>AZAJ{HX3Tavkm9Py1;;hEf5c.b #aʝ2{9kqeÆ`c?B^bTjz!.2h3V{;]A[Ə!DžDNªU+ ,`oev Wn^jy.RnYɀ*[l2ٔ{pCBhȞT|=x38M{>˝ɜg^5m!99ax^? :ݭRa5z'e6#r-H$#16Gd߰7PX)E:ͮ:?VԊZLz3ĿS:nBU:08Y} ckؒkyʳ캮iyn.lmKo%^tc~F(F 7#~>fEK]%0rpK!i+L1chĨ8b?qSUlU%J2F"REC[/k9GRiD@DJz*CLeBXV4”N8 T;?, g<טy,yÜ->f|e7ZkaHS$4Oo Vy1ݱxi&H*pA *tZT)#mDA˯} :E Y$^<٫q X}<4V@TpN] 'OJ yySEd`To h!I>M%ܙT/M]Y=U)ʘ"N-*gi1@ Q,DP|[_8.*…y$bi ٠kdO> Um91A`A}}@;]m.3 y!%Ď 6ƀxY>bZ6<وH.IRzoe)IؾGvc`Ӄ6TC4j˿`s3\@śHDK˯%K `<pc_/٭LIG80-?ƠJnH$MY D3h"N~^ cq5j(u6/NHvWA?q[(i"mMBd7{Đ_!!vl\ʘ?R-wvV}2 MH BPY;dTʠE͆X[YNuAhl@ 0(rl,,{I $Cӯkx+#*$ B0g)u-b9ЃuS+f5@ Bĩw난3PW J a ωďgtP ;t9,r8<4rw#tMi._OF$#3V q9"k2xZ-%< KkZP҉ҸykyQ[Sz8 Yex XqkK`ava6q0}^ Ĝe:bl %~.!O:^X$CWaU{2XP$m=&Z( <&Sx;Lj2m^FQ閦S&8d[ VtNHcfuրZ "Vf'.FϒcMiٕ46Q|LTMq~좹֯!Gm?EaHĺDkPPunSv[Jav, >"ZиJ' {#M|,6}q4\]Bن #ȝ(x)Ϣ[N Z=ENsPk6P#.X^ҡӳH&vL2\f>g%W&qÛDiW |M[d w!$6+a] bcY‚ A 8=^f9y#l1ޛȹCQ.dؖ2F&1VT[_f2|cdV-g8i|Se;n쌻sޤ`1eHJjrNHmzoޒֲqsP?ٌxhy/gMSy l\#:$`咥_WJo!?vؓ)tzA"ń))^O %D-V*ew;\w7 e|.EXکM?J =y;/"7# 4t%{% - \XH ny} ൧`֬u&Q gbl V@"\J,#D1h. #'V|_Rhdӕ:)EE\&wg/Yܯ5n`N=ЩR] >=>zќ9tiLze'L!8]Tj0s$v!i ̟Yd`-EZő|wkUʴS`Z*Ez)H˗˿) dUF=ka7l76*r|ėyOlhsJ>y[udQ5gdcARnVyclbI)y쩨<2[>^ R ®7`u]nŎS[6~N:r"Qv[7EuUL ;umFwd'aXf$Tx[s ,eT<3@^ApM2=! =bEKdOljYITĸg{g$rN)<@G&+JgqgޝڲBqhw_6s: s7Ey5 O;x)7eby%_qbQ9a__H(BU+уT|rzO$IB]YGzFCK]N:@tfvp-gD0D=rcSlGӥ_sGez G#7Ϳ+ f|N2 G:"31߳,gaD}~]0֛i`ͦ#@B:AZr(} %-c; zW$r jZ-y{wY~vDd1J˟<ďg8&q+Ր5QpWg׻ 2CN4FjH#u4]XAo9_$w7x΍8-DJgnԈZu5_2]-|rtJ(6vm8#on9pAK>"HebBL{>,!A (uUaCm6E ߎC#$_ReM@biW @tݩF {l^e{Y:%"! gcʳiLuTvE(,ztg _.#O}I ȈT`v2KdyӤNK?>-&3.s1..k6[ h QpR05 g&3gD!)oYnUp ƈ2 #PS pF+.ݱK3s03̲UZ$<ҨlDh!Gv."ޜ(|9Ky'*gKvYGnI.xf2x D S3a)m_ITKYEtQHb&*/ 7W$'Nż=SR% d\8[& ;bۙCh:9V@2-a1C^> x^v Mrk]^mz /iG+I 0Q o(m6 i D<  |4jw9}?DIL1Ur:D1Lhla,۹0 3&]ә<~I`Jg}|Y¢qp\97Ɋpv'){NqCc1%aٻrgѣ+)fa.]-?:d6 ܻsdU}tVF CV*9Vr!6)/twܤ %VrB:?H{gv^2J $u"Ѥ'Jx^?=ṙ0%XJH$>v ݎ7N),Ŏ1nx3nI" *e2kؠ0?p}*3Nʡx=\SL]ըP3SO@b'w{7ݰ1"f\)gy4,k('LfI؂;uYd#vrpP4;T}(haD $U%Vhk2^нcIJ8D> #RL7_(J2 *hʬ|v"ga0/@6*/atI&"֡8f{Z\XT,h03p7;S|N!6DgB7m3@B7 "X1jr(]I#m?w*>`eNr1HEWIL?:Z?SxHnƄSDos h4l'oYﲈ5.I g$YT=^-bA/10_}7v=aM!{)֩j7 IuՃO;~AB接'pʜs${_r2rvrzVj(26=Iex>zE'\OraoN%5 >bq5@!Í Q4ĸ7>8WQdn-$Ro0Sz,F5<[#f#;we#D^?eGǰz֊Sy1FrmM:}59 T)i( 7!ζ/ϴMO^RZ^=#dp/돱/z׫%o\q1WעDœB6,' pe6 lɅ6Ox['$m܁Oq+z;UWT~]+ت_F]_{= ftqO ;Q̢ޘbI'1KieS0@ %@cR _. 4fK̓@Y;iݭl9CZLRoբ;,r&Ȯų^oV'FqFrQCFP;`l#V=P~D"BBS8FӤSqRMP-`#䊲EG*QTD˴/L*R@ \)Iv_B|synG!35ՅH5^<9!~ t}yNd0C'W\!M-iEZ5,פ{IiS>Ȫ7uK+U(ZP҄ $/-1NLmR|( f8] Dc5v*mU4`BR4M(⚝CW}$!cok#ƾIn5/؁?1b|AJ(SzQW/ 'TMA8TC)#u4*s@SM(=ȓ#0lB$dGO?fSVHe78I zLx̉U|ܷ"Kci,=%-yfBQ,I^Ū 頧8S| j홧 hu bH`#{#@WNI)#=/ ,-g@ifBHa &48!'o[i?Sgat{J50eIFfE*2QrBkvG'RCc/hb}T!wH+%Fe}NȠAk p;@yh0&HJE _g1u1 SJMC4v-pȕUFVCQKPo_‚RW:^l)fk̟toNR߮;Ȃ8,d'nk%y^4kOܷŶ[ZE+;80͇&@Lq'D@>f=p|\PƍiGn)@v88HGxos"2*A,4S=sr VRW]P0+i?%%0gI jYjoxzP Sz&町Res; LF 5''Év銽a6Z%-|9Wdz*^er<7 >mX fi#8kU߲,8^^3V.!%UL@ƿ]il< #XZ [:x(B qOΛGU`x9Œds Dv8qapJh2*jS x]%A&v2Ga-gr;jBX I5gۊٹ[;mJ)g4&7#y,n~R^d!;7n Ju#&2M}JJȐo1:y>0n 5qh޺ɽ{ Nqdu@\ itq2}R[yWN$NyD6#TRq4Ωy?RlYwS ܹ/#"?vo;͡vӬyTۅb]~F'i3]`K6CsAun&訃'2,ƙLO8N1׿ y" eqY)+1o/͵ڦr1>.@S=|[l8L[7В)2J{sdoP!?$pG+ wr'G'sxH l[MNY.ؖ'*b̀(ēk6YQ \`>_uit,16/.x.J /^'la4& 'Z(nJƗ?d\Yq^&X: j )cbycfs -Vȏ-O% n9JgƂ(窐6d< oW$K )[ҶF`O$x~ʌ06˼ߴخsQ6SpH)G|HzNwʔуU[`9n dyKb׋P~ݯˊ 1(TG,W]h4+fys"39Xi(Wr/L&]%/[T\-e'{mWj ͕{S4%rΎ wѠmR\B/r-θPė Ռ'i-IMc{I{:ckЄ%6b-ZiP8|CdF]M`|X>Gk,`P\acSƼP7 fˑ8CCR“Zk,To-}h2&o4qK?}B魒umϴjC&Cl =ڭ;9Ӟ[BYwI7ڂv[Gzhr_BQS10oK!¢= ` ͊hȼGd..s g2(&^e- QUEy%A j>-23I~$E80@Dv~yzw&%Ѣ{D ; P-A`b "H60r.I|rh(/&G'jv<Ҏ]I=in4Xb*\'Y͆Zl,)~hcuPu-{U{x藦2bHV2CeZ>230(9ވ"\%͑g8띱7"l2施opL "1x;MtY+8HK\LYX5N > شt18p~/:xLo~?V6YQN.uIT2[Ӊ9ȹ{*Û"s;$llt+1,qM&1A`PϱnkVVkmF\dhWKU&LԍzcJp9r\~k)[[aH-[L&d"C$@+w>* V0`>s/D|wZgNw1Qmmb#*4"a K6ԣXxp.Pr8,̔.&\XhJI(yC' areBىqNi8I|9~ _@ͺ|-Dȸy .JߦeĐ eGbYv#kg:@* vbBoLR"b&TNi4-`.4$E~UE{p e u诬 +;Z {ICc7kb.s-WvbLkEi *`zZ1yM9XEBwl4! $`&~3w"H+ {ct'S`,qB6(i.2t$?lf`Q%9ݣڞQ-9Bwr4gXV?]y?9K?9o kl(hR3Sz[˵H<'T"c@x[\L=rִmҭpGP! M-j.7}!vq֮t=WÎ4zF..-g0$x#0Vj/OM#Kya?T3X9*?RfzSv̙)hBqfUH~rC wiT.G&[qm*ic3 a]rBؑ5'Dw5! TVa|2YEܱvfHMo,Bݥ?k~.┦Zs@Fo)S&SW+GT!n!gm+[. i $nI,NJ#w  NsgȿqEUԇbZuؒF?K)#@   *W-!˖rN*#Fq5oҫ*9c cd pwjbix2~X쁐0|R9L hip#Cn1:|/(9rkƌ 6Ouk 2Id1O4e= gl灟ýOsctƾ7eixx/>zW,մ3np_g|w㐖j=-DN3(5Qy17}ȅt/X lBzuN!WlAe _­ ^aVhsYE6*%$j<ATDCsVSKWc5.h%CnY9>+"3H-yQޓ[46㕁y{a%w&,viNE-`a[y9I*ErH}T/.,eik8v J}00 (p?悋w+čzi(Dv3rz}v~zԏA[Cם'FwUt_)[OLj80})<'aC1r$vsлK#NFO]x]׆';fTLnrvg/.F*!@mLߜJW.+*t>VǞر"0@ZAUs9`舉hNz`f?hmluv`l'u awZ8KO0'dˑuIϸΈ[.ʌtB{Gln*EYx t9uPq=Ӕj oǔ1fTPZ`tjhihFOp씗lP%(\{dqy`]4#9R+9C%}ä[A'&3tl'Oۨ*QF%\*"Q?FJrX愫ՇlXd;;dbNJB+ )H7t9IHܦΎ`e\O uC=T- [Ņ*#o˭N8Aj' 3XD%]yS!$1M\R([,my~ٵo1 JOBvSeWkت>]_.ՎwS~~I')c(!VL7t>"7[ BVpӂґ;h;?<".Fڨ|q> ͣ t,wa E#]2n_LQ~+,RV\&hLO|>dҹaJ!Wf8:]ʑDCF:קw X| ٷ3?_ԁXY-c=(oWR|>/ VHbV ^UKB=ؚNʄ8y hI@[!L}kQV ^mfĮr<%E9!Ҳ"F&4-8g1d wHR4/d2#*\no SjxNyLdW~Ч]}bv3hRwN}C&n=2i(8&hPCQ0&@*G[C; _V@d#_l7=,AF>ɲ#{!3ۥdv 8}ʯUGR`F#$` J LwQKle \9};CIN$zo0~gQ(km8'Y18xDYx\{3)a8 8u%׈J<7cG5uDoYޔ1r oYm~(x̠m^g負135` ҇6~ocV7D}ƒT%qGnVXu @7L u=˅%{_<@='L#z>и7g|j?-dNpZ |R寙C/5}W=v-滹}MEb!-t )^x$6D: G%LJG?R8/dB~~q zItSbRDX\6}h EiC]P5's0A'댝{^O_+E5:ȥ{n@zsEpp"-v [zlgN>3pכ⇷u;~'<22^"dCnY? xKбG=wU)e~eZ {tC~I,/tkI=!rSrmq߬GA$ip %dەWmJ"_9Kש l 0S)bK귷uh3[$]%28z l30_\6%vdӱT8la?ABCU#S*<4cM} $r>!ˮ s;_u^h8-f&ƢQk@u _8ἴ_욖YðcO(}: %cB6ӻh89SލQ?#@ T&"D3ѹ1s6?3R!uzi*D8ikVEI]?`VQ/%֡>G^1zU|Z>/%j(k:^u^PXu:~M^S ٯg E*VLfZ`y*_YKSBn*82Azu( σ l"Z_+qb)9Ƙʨ">jFm3\︀>By|F秼 G2 nڰfB9yQ3;.[ )e iǣT\E"N-͚ !l,T놋Y=,bdoQlx l$۪~ѓ"Ǔt<:9LbPfNlB؏/ŊxD+x/tq#(UWR˼OsS?%c Mxu%;yK82¼brD*)(m(ȎENw.2[37!]ݽ1shR6URF{5w-&;)&: >mD{mYGjW"y»rA?y]w9shKp}p,Fj4 52WZuSD̾’v06w ?vw3 ] 0k}c[F]VXL+VlP[y8+ ׭~BTtMS8jCwdGwK?G2.Pj#R@OCeO[٤c+?d I[yџsr/f$s~m`,>F>yq4r:Ec<;5ZWL ϱo39VaQ#A~l3 ;U`;}hLb,!O 7;`m[B۝#韨EF5ӯy0f'3nW .jOjz,>s͗{Yy\Уa{m'/{PS㓒ĒL8m\T~>zdM{+I"@v*D mZYTV3bz]X9KXX:\E #dq#MNIt1D'B| X*in$2<~HՆSi13ʑ!1ڛ,RD'nAT7rXA+@IH{qW`e@Oj"[̢Ȓh fbՂ*u= M,<33NҚ46JԂ!Xvh"bJdS8V2m,dq?_BfZX7/]yi ͥ0T`',E͠,쾻.12qlG[~̈́fT6?(Q&oțwNzvX| ~j; e6dI6MD9[6zv]!$ QIdVxHPVPTlf p*rCaYX\" uހ<"k |VH"l5*㚂 &rz0Xʒ3a7gΙZ!=AcPJ< aR ƐBNy!N.HT%]Ja4?=@U g4—ͧ" ?60QӤ\]u= щC!׵#"R ##ŒA1@`ځ6mm2KdY'r"5T*0(ZsTf ~(cpD. DU A~y\207jl7D|`^ }?jcD8#`ZKJ7j(E1i= Ǩºɒ7li& 9!(nF/"vӂ`tmMvG|{l/AVWhuĚ(h@)҃:@Vw$bx'Hw݃w?t jrZCK}B"3[80+ ٿ\֟& i8^lnu"D0>x"'TAW (>lTMESVRZI4Hi18DdImZ/  /yսe|QSe&dklg|_b4oѯ[P^^<ɥT2j7ha;Lu2jEWoYI\q T# A qlלcy M¿} ivY&Ab[MdSޝ2ԦX` \焬T\IxP_e.q1qaf,(BB5BE~g ǘI3d[!(^Q{d\Uː& x#Lնf_9?:QL $Ss`ĄJ.ե*mQ gSWr5r(t~Nr@]9A+`*ߨo~d@FR:"XiaTc)}8(*0l] {~FmχQTe,HXR(Y`!B;ԭHJYlC)csvB86bᰠx8mK2ə2ۯ0n0hw8/wk2rLR+bHzaU"nxL3?KM FSs@v7 Pa`M5/MӚV3R*O%}{R4%.ǔPxx}*aJ$r*8ea{唔'HqJw͗`}+K$kunVQG*?*~zp JqG x=!XJ=|, B>}>H Z#jNŶR#<&;OAA130R>DUۓ?l~d_A}zz9 C80z4W!ɒ+:V<L'T Ct.N5Z3'<8>^I4kװǺAJ,Y(INgc j=9Ty~"5v8%-B]vԶ>4DQ*KxcVP6״nF!)_,>$) j<k!7>3|*{4pVl%wQc$ZG]C;WѬ/|0k%0(֫"ō(0]جh3!VB3~H5^쓜 JPnU`;అ[H]/8"?R@'RXTK1r 9<)B0_jf0P W }]^ IF5NBt[K:{Ym,.-FWSqe^;j`edb,Q K#[px?u{7Ъ603=,)FWy*ac=F: :(FK1vZ,FR "fŒIÝT\Oʕ6羭E`z B Ƅ˪WAȡHm0?]119bU:قno ^&9[J%C.7;VQmЄg,ڿlSarzrJr?Q5hk5QGgd!`'s:W5)/vPW:dGpV)P^#B^Ǔa!5M !]i\;l'1tsFaDide(n-:z'Y[UMY^&9dّwəR` Av}ͻ2GLExi3 =OX;(ehEyg, [c۞kcݧSQCE-rӜ,c!.u_l#*c)=.*"%KEHu2t&fFٞFw0C ۆݵr>,δal!7(W= zzy,Aw[MGsiP'{i&` M8Ryz(z567i.HIC@/?He0 Q5q:]$ʟ1k+̼ k\*A Gei8ɞ__6%5`d>CQV`7O=??ޟ_1-IM;6ؤ +tsKkd~$1p:"5Z+Fa%WD _,cžG4$f18=BNﳲ.g+!|4ڹ%gȵd$:LX,to$A:higwxSޞFÕ7B:Ҁ;Ajހ}8*$a{JtkE0x j9 9Hz33L%Ill2$LJNYgnSc/?,c,ZUsXCd?^\|n^G5|k7|Q*&j3An9=BP7ze!%гf!OQ#,G{ |4>gFGC5]JqK{CT@Eh[-&-p1,ALdIgڣ#ԁ0$*o;SvlkkHX+r?;|;S}n LX XyMrm 4/Y`;@V08u^%'+Y۳Xv $_F~#h0w2m_ɗ±ĭJG>[h(_.~uT6'pݥ?j\sVdrpHf{7pKh!uPyժI&.cNj EfWHe7^3ûyHDVAgaE\.F]6]T#qPKT%Z|šڅ6ó*@zG 59[oq3g@һ%+"eT0qyU% ʈԸ5ܓ{󠸃aP W KÇL܏Ha6NVT4<$B7K+Md6{7e[FճhA `-?-.Ei4CTxwM6 4{N=pҬF@0c4qܴ̃!2oVw^gU촡ɢFNeNąå"U0_zitr"gVp)s`ڊdk#4yp$g)[WĮK)5pjh{?!*X0e SO|eQѣ foh>Pfsrq;  RY5բ.%{W@ "H&S3tV}N WP<4'U׆&%  9U9lO.ζΗd% ?3@bت |vr}+>"dሑ2\j爿%Yڌ1ernb0\ {"auQ6x (;s"éqlW7K\B=j\6KS O;.-^hⰑZ{QƈFOwTMt匀tmwr UH3pqvqŤE(*4XZ/JԴ ;i8r:V 6ͧ#/oބ^Y8kJ0YeXN4|udQX[M:YoM\"|*HXYy[ZIv"H11h9S`S+;D x$~A&PdUnƶ7~A+5ĉrP%LTKDGCB)gZ wx CLApp=h0(ow?p~a[Oj>QIvξZ4uLI!c1bPJq[˜߼5|Yµue= R4tJN;o_}{) Xɑr =,PT o (S7= g0= _MfH^=aGL;[D)_$ohыs/$,7${ ,T)[2-I{idMP;NOi He{ [u9wvj3‰*fj7pVbvl@\祑k]:ޖ8OθJOdV<[ي /!f#ޮK4i/U]cJ|-`97[ifE1Y;gFNmv26izjQ(4ďmvIO8q|wuÀWT]} zAV 1iozP>% 0MN|S4(S3ϊ!dHp`дx2jJ !L$F4?e/ 4HsY(1KpU _ob_&X͠vˀxilzОE״zMA80K`&c!BxkWHa09XδAej>ޠEfJ9TucxpJA4tmfvˈq ͌1ǿ<#|&BBn9r6Rj9NLC6q:v|ƥ~]ˀH(&b:rC- PYtIB& 5ep 87dmf9Aeƒр5N}U:]\aoY.P@5ZЫ}=y gO ӿ8XyKNL05ףltW&笕#HZp0HXyKw` %`/%ȖX8B. F>˼?8|lM ]%&c <9Ӯ.5-.H\^5GIxCH| 5kKHDc&Ri0e_ LlozhWɣ>D5_Ջg|Wz߆g\ L_`nMenT< ^[T=ed5 5O(a\O/tKO"lm-ʪ6 - ےt"y|lj@Ds^Ti SZA;.oZfd}le*W0f1=^(L8OIfx4AFfہ+;߬^' c>8e'3xkQHWĎ1њ!WibA5}1ytbo2h#\a7Ź<묿FCuIm`Bm!AUOS/"S6A(n h|K!/.dXW#3Ey|@%Y_\$'ZuLDrƥ#lN^jtRF b'I>~|: iw Z*c| V)wrOiAWҎk1 ɝ`8?FjbwIUQZE;q"QoP0>Rk' JWm9Ȃzϻd?ztɉ7PS.^hpAE}S-(}Aq-^J__0yt?n~o23t`9 _MO )OFсVT/ F% ׈Cݦ֘i%dhbE :.ꚤ7qhR-ֈD6U5;eV#v-~63akBdU)Xr0d߅Y5m9 _{ vʨ=501EBsᅭL# ]N+-|5`Z s'Њ<Ԇd oۛE}HS)أ.u،v͈>*V5,)%)oj"#wDwfp'%SG#Q@hՙ!@ުaC"*1ZMS ,zA I9y$[Q3Ne/ƲEo>!ũTq:u~mNm;pX``pA5*D䦫o>[hT0{ye6yS[XbMml 4I6' Q5Xh9QdkZoUko}#ټiu2K%b7ĖfRW(D1BU^f- EoMjfJFDms#8~d#g}YSЩ&8;VY-xk¨670kP0QֹVL1s7 =^cJxNu %Y.MZV-6 ajw@}/z:Yj7uٯj"Db .MA]RڋoМl*R>GGp3f&" CWh]`-ĶQ!|NtAQ;WR>sOܪ=_'#as~Bg/t#y,l;'ܭ`ܒ?gr 8@i"Cc {杒CI}J]h0E&ZEFP:[sNJEՐPmWT C>4n>E~7vxd|Tw~00_Uf~rPV12/99l6NR~V"pս:,BI+ T~ Vf/k $F]hX ^ה_京h[<{`U)&lpJeE\ҁ({\qd{)'|NHJfytF/R(qu_xM'HV7O(|k16Kqc>V,d-*Y ;a^~+]ty=$WBqDмM}E]UR>?^p6  Zla%*BEPcAOYP_`Iz<NJɍfm2B61V41`i s[LU?AVtl&xu nmR{/8ȸxeZ) K5}jH:< *A⅞gË+ nq{Yuh- lv:7hv㡕yS3.#Xk~ނ5vVfD{5nR[{VOftI `^TJEz:IbMҫ4^v~2;2%- Eܫ;fۘNd'Cw5l^\FB?Ik_Ǒl`؁$g9Ee?>oSӈua#. }לY0לw`U5 ;y$~VdVw$H Xj:ɺ:;]G6ɽ qTXevqI!^[{&w$(2Dwn  Ke r  mGJ=6!m-r,:D7LPgJ>BKCO%`@rkti-; Ɍhḿ#z t@]Jp{S5~@e>Lq.t+92aR4-Ą,]V暕񏆷);0.E=_,f(K6k׃Dvz D4&dHDnq~S~J 1'.FTTR`es3@敿^JUq6~SBȢP6K@@QoRcvƃߌfcv3$J<ᩄd%l|Y;םVw'(й/-9L7 kȿgsU`(#RwJd&p%.Q ), D_TH5ꉂ6T)eȃ flZIB PT=$ռ'yT;X%iƬ7_zA >$WX'Ge7VZ[Se NC#G)9-o&a O˖*KI n 렆Fä͹knC SM$+?}MHִ'k`]Zևcqp]%sY{D8tZNŸ}>mQS0J̼P"8x 3[wH#DjYO5\!2,bMkUl.a_ڒ{~fM_cOrP6čTUuo::r9G!GTwXg󾡻/]!Pe ^Cv~t9x2h(RB^/=M=378)T%t.c [؎ӕ8pTbIvyȃߵyDnY2ijV+}_hMG*B+IR3c}>OQGJ phW,.Ĕ t\dܯg[}[_O9:y(zs^M5F=X/PtUH+=liP*/˸Occ=`gb$Շ-@˅̚ی ]zp\8%&#?wJ ";GE+@B}ْ +*CJh_L.v\5S3EP%_)#2Ok3/J(&X}hGya*02kWQ8+[EůR6(o qw_ blO|;.'Ặhn&=WPCo B_4]THRـM3naVA:а 2}ub{gu(R0Ղ}0jY9ULuqrr8F/n&EH> u;q N6MכֿV7'ӃPrfDv@+bp3iSR-sꅕpEdLJ j'd(AWL =d @>(y V١\6>z0?qX{j@Xޮl9Vo?Պɕ,K1XfL0T< >lE)am"Nt: hW-砑T,D8;^ZES kư\r[IuqE\Ì0"lU))YKƚ1 :LϭroYK5zhomUW <yL~}eC6X]&;n5MgQf=+Zt8cق % MR,Oi ̶@(Hۍ z[ _G@UQ&b2f&פ3yܑjL hE)o ȕC!{kCTnΉJnfU}HpFõ81 Iu:2%XS5YT@Ǜ*KvRcEg1F86޼yƔiN'I[qN<.T"5yQ0g*AAqMF_ w3"Ɨ1J&^J[Vlf_X2mF8FedbNq8t@z`PCM";K(}g) ؟SI w2d?$1;kBtՄ|5F"OУ#g,yC䐵#r}BDb Hy׌&)"k>N_e B~!' rc5 c3 X22ϋRVQt/d =*BOUONaEӃM'3ϏആW&2DpŸci^X :p{'On.CDѻ-[RmfbN i T3w[؄\ktX_sb"8B0oҼ "GӼ>ʄZ\Le@}'j ̏sЊ0:$"O޻}5o52*9yBZm,r ż}'J!13q8i?ߛ`% 7'%R@bN[B݉6/"/JxAe#Ũ0ѼAPޒ81\W)$+rgeA@f0[OlFXKo]J HWB0=0_Q:>6߬>JAIVz8$G?J:zM%VLAŰ79-0׼P۔F شCG{ͫ'l+A 7]]waoN`U0\K02=`clHĨo]jLgAKXӌ00ѫýz؋7lB*<[j1l!ߣLbVdWYWrwdҋ`=blt=ȧLwR-(d"Iq-EQ TPcJ%:b` Fo:Xyt[(-b|Gf})5)@2_ mOF0oD*gbcFQl9J̝赮obF޵uo*$U8k;nB]D08YcP’䟠\ژ>"0y q{ ޙaG(@<!ux?U|1 +`q;ٞs[@Q?X3n- -Mp ~xlC4  wFQ8*q )rNj% , G'UXM= ;= +5y}"t*eHxf)fCt35"yHrA̚unX{ɪ]>cZNY/b<'fv$F)U@8l|Вwgg9p^=qib2\tyc\`#MyMg]Eh,ZX\N5{ o,M-.kh躻U~;ӣH ٶڊ*%DE&i}cOAʩg㥋"^zm)7CiğcS s6@{?.9RCڃCkj2}6`h'Y  zƍXk6Y9yB`W%..&aabYgfnd]$k,jYBEº~}KG20ȁ)}&m0pYWF!\J{HIho(j{&YVH|ŜsSǚB):isb6|~zQ*WhhNCP_O't+ytLpXbg<s7K#RbZeOڤA'jjO޷.tuänʫ#4$1?$?6Iڇ'KbI]_/Z }Tn˄K]:~t}KUSkkQ6XG)Ip+xj<l6ҳ0Un5 $mI/ҼtCtiS] + !W~lt+PW+Br'QaNJ'ai:M6n>Oq8gll5wmzJ+ȾE(c :o kҠiDbOZȓl{G*c/P8i+C7o}ThS&XOmIN-:^s\j}#TnN=b/lN`|BֳV#?DpH 0Hav^a{!^! .yhNT)8Ys&ǵy쒠ެ0# pTځp–"c&|`9e< IR'vøf(v lL8pXt ÂUΟ1QMO6^rƮ{]w%.)Xd@o@gyڷ:1U  c۠=obb@?B6CS.mp[Ū4[FUP)%U +nB,ƯqLG F񓝏آr얜c ?e "^aJG 9L Q9TO ;P2P^%c569-:aUޱu[S%{ :kk-.,Q@Qi+7 8dMϬpk$_%= 7 Lj&R .ij2g!\ttV.$2%8e-4iySU4L!Gafп .glx3:kbK Bi9 ;lTh Ũ#S| Vx%Q Q`4r=K(ޣ 0Ψ~Qk|9p 9(ȑtb M+ȵ,{%f2AgŒ .VG%[}xR3u"GmlUS!a02˝>yD y{z%cDl `mO;l0[ZGhdj z X‹cՖkWFWs "vo}e_o t" s $th -rxQp}VyM ?3:h¦o lgd' QAdM".9K\Pq 4ʊbl_=<~# ѥc" @fzj}#I+[F`oI*cv O1[#|cZF'fpdᷯfh>G@BҋB,$ HVB.䃩i! +o[ӡ8$^iE$p6`#rGOqUw*4-j(N"ؒg31Wsm~@R}2ܬv4Kao0Vq}-U3˲t28aD_cq~P,/aB(JD"xo& XIa bэCx9>V.8c[L ZocK`$_Ծq-=k.}*q|Ht!žIJ'<tMs6;?2[ 4lqMD2T[ :꺜M{:"挌nJf|JkUtLCbAZ{wāݶ_\MmBfW9 Fj)4W`Kl͈QV>:(I6hOmW\r f@uZ~!y2w߷?| Ylk~4ȭj0tKޞrD 1FJ>fxuJ!k$CcFf{l,5D.mxE-%F82̪K Q[MD.ǭ6]KbLc&4V:7ɵQH6lO4{ll8%T|m129!q{gGT\&5 ˰%LY.wZr+MC6&:Jm1yvW:u(UlX5I.o!mءrM8q!:Sj: CH#6seSyfs;P$pLrVw(OWDjc@G\L[n_KP֌ "mJ6,})1^3qhq@U/4 ȝ2NcxEuLdhMFe Vt&)/"zA4mD0ϳ)&  ;ǔ6`?*2Wndk>ןj tK՚0S*I s:?*G4w2)+<#Уmg\`\j bY$OM,4jbn'H s"qՃQ*A.sHEd@oPn)*"v*:( n{l th"հ?ZnxݼtcQ'opс+хGvG 1[ YY!ާ- p;r"Ʋhc3+̨We\TH[JxA^L%e$* t4,uKS# okd0kj{ a@ 0+ss,n(NwqY yaCo~h*Qդp'%"gzM|ܥ 13ZЍ-2oJ@Y贯O}[Y?gցU2YEHrQ>LruI:*+)`S`Eb')݀]}.e$8pBLm󷰋2J <BB՛*if4ݭ0᝶F~oVT?7Tl-@ N,tACLQ2 %6)Jтn㶬iDw3XE=ozz ڹg}0}D ߌ]@fJs2 CG| ,:8V iEZt!Ee MqsRƪȜrK翤G٭s 9}1A8t]P-@Cv<?̀O駿"Ha%9q;i_ m`PTo'7`Twn9EM?ߵ%;Zoa_GV)^ʫ:8Sp'wôMp6ܼqGϊO:8xO0-=r=qSH1/;9ef5PeEVfUΛaҭX%Ф-4쉣FO&I`n|ٽ׀!}/A䩭cSs)d?ILs؊ sL{GOA)ru>S@U<\2! ZȘyO bԪ,l46nd⅛8A^+{9 Ưt-?sak0tuэ ieu(0eM)f? n"ۚ7{&)z'Phwr"a=o9 /|qc*m~e [[쇴CSnWGH9 h%7~ ܞ@\V.m?^ "ؑKTyZv;o'UiO̡nu|7?$\~Z3tXjz 0^CTڀW$ƾ&43p@H|piQWl gcg?H*Ƙ̂FdCd~|E7|&*aԲ cF7+pmA. ?hYE^h[\ L,ne7k:@#>~_w}?qh]\lL6lèrdKпoj%Q-rCXWc|2cvOmVO|񭊱1YxN8k]j yjz3'^Ќ , mp@rdwq/FhƋS@*ݨe5G vp =:f4LET .[ȸpKɗ CGzfgaQlX[vָo# [gx1,FrPT0 еǢjU,}\C,ݞE/V)%-jbm$(yz/գ5%SQ{(]3)EFdy-l,?1HտC@!o*-Rw5{}Al>h␝qvng8\M+̚0GƊL#%Y8^9m/~)9s,s"&*vHyMw1EXE&oa-!Tx9p!]:Q =B3Ӊa % xe6Dc^^i1,ꐹPtzEm ;@~Ӭ49 g4)Y 3C"eM|eјȓ7o"3MS--oc]x.c32ɫd+ Wwy˂n-C=Σ_d]&R\u[+x= ~%r(4(yT@ZK /UǑ]Z giSpt`'/hc@w6[?jr=oA*p97?VZMHiuL*ئ`h%5sC< /| 4oOkz[<#,dǪ}h HT߽2iG-3A_iO @J`"6ϏI--"^XnP__2eU` > X*hԍL3&MO`Y[LUw;%tۇ(XXl ?x$4`c>x5ΰ֎Z.G-j_q,ToeE9 U8)gj_ @ >ʯ /%3T :FnC A-) t`dixƠ1^i3lil8ǡd!xAvl;/XP< } "vR g&5ޕL 'XgOr.9ױY~̲J&@ b 䦇2 S/;gq*p 6Κ)/P"0d%G:9p :tǃyֲ](OL歹-ǖn6a qBpk$stu9%gju Le̲vr;5| /UdMx%̣u٤`0FH# FoC>6!t :ԤO 3U7Ք>o* &fTʕo/rRMl?.l9rbИ Ƙn , A:YJJůvӆet4@j?$; Tzj \"2ɸQi֗ QxT %r0k]]1ro f+Cj<]Rϸ݈B;WJUwJڔQ +6G< g-$s+":%:PswyƩ1+Nh尵FdV 7*:⽾M0èja`d)8X;꾎JL,!ԉ(^k%1quiηJ^S}j(L(}i"EcBԯ~+?]W| eɰ5:si,SI1~0 ݦՕr!$5JP12ѵRe?P"Sj?q˒[i?AX᧒"+ᙡ 2"% NmAV~AHlW᝺y=&,BU4yJ/9DΟBmӶ^7t+h>i=P|[ƯX;JdG;63_mbR5Ej7.¸]-?tQ2$ݍuG i(_?}dkp̓&GNŃWn 1lwP?sNym&CO ;^rDZO̲"9MFS6pX܆JxEνּ`N5;Ms0iJ8_ >mj3v\#EA(:tCc"ӓlrAJ" aI:,'ņ5 ۋt$ 6ڥL}`#.$67YK딙b'}YO% (ApWETNJuCӷ'vjԶ(o@;`W_M_kc8JF )?XO#ʴx&]ĭ Mэ*ϷfA6,ɩEdXhb hi( ë#&]mx ~HN%vH-_BL AJ4sbxv!g[0cbםI 8T.PY~28z=CoCЁצ ݿ i ɵ?}*dO0aQ,0=@a,+5H%>G?!7Z{_ ;)3Gұh"OO$TXx]Y =ᅡ{zY*pWRA;H9g3U\9|P(taRcFH2VNoNbm󘣠ƵQC31BIX+ :Jca!h3G@2)NWefTXط" /=ůUɃӡ= zÖ I@QjкXQh+YiQC*x7^\ 9j'IET!UpBVǣyG7nCܛ\?_2ߑ۹/=~Lr'!YJB=Rϡ=jTn@I!62xQ9SmfPiHx;K:XEL{kxkla֍d ZQ d4/AcnD2Ǹd9ƃ|F9Z߹Fn4mWH_7(#L?6 O;V.z+ڊWi)V5yBBPeeUrv XtfLs`”!45u7O 0[3WKŎ؇)WȬBGj_0,eP#AG%vp+ӗ!yEėR@efJ$a(Natc!ǩ_ ~pAyCNs8ɝ1/ܮEWE7<:*٘#_vueď^ k?ԯ[."(9ltHtIOa{\T n@Xny I{P:H2I*S̤D-ӀߥB(;\p¹ 3 ŷ].pLHBGvm'O揷ahgM(F]SΐN{ʯވUT{@Wr'ZE23++.9#nw+0ӌ=BQ}:ExjoZ`` g,7ܪb߮eh4R3(hz+ cj}DGIt_uc .z2 m0kQWð{նYc9k5*ix7fKIsyXg\nڎgֵuQ9穕N'%H8RhCW)u9* 8,PI\] Y̏us{Ԭ Z9b M9֯UCe*y&LK`4۵5_N(7/M\㟺:l7)Osiw h*s$~(Jm'0k#r 39so(Bror/(Hi3;{؝l3Oz 8B.)"FAFOv 1qT llk\ν=@|Kr2kH6| ܺ⨔ZʺF 9ɮ#,x:bEBԩoTEU}b)?(5&(b6X5~²UM(@ý*rhnTe!V_0+oUv>20P5+)WϷ ^ \: iJ%XGphv Rgo:`|0mXFr]]]C/m.kBբI&u쯘ꈰ0UyVL?٭w9߂w)Xa{y(/? :FT͂Qu?"'? G#E972XEd{lQ|31M!gJb_k1.>ҾxxF:T:d[r1q'&dIJ#gw} 4SQ`(f=!Py0HF~0U3 (՛'g{P솲[O@uN*)I42@5uNz+C)3ZƉN|F۸u&D4pf;;iV@o30[\ٟ,rM yv;b%I0)=[m$vI 6Iڭj#meLf :K&Crx?"AY(NBy9+8;|fl F~MK؊ O@WY2@hO ۿfpteB^GO^jss{E"N`:"׵r C3wKr0ݲy-a0+7 é ĕ5xH3L^vQKG#4>!Ryi^-k#Jn6db>cЖv< loUjC$Ж" ՁL' DZAVAylVEY5L?ӻB M;p$r{BX!B$K]FGI~EAd>똎 _ȃ)>XS 0&д*i+LK/=W\SҜ/S/]Gki.cM]•ũl9JG`tk8_Zc-C/ xߐZj0}I6-7>ΜX|,3c_ʧ|7 \u.LWDd*'> H jյS0Q}uE4<ʄ N5ٴwhOEcwPQ0%~Y~<%sq h]& N.AyTFXFhM\$@ڣ8I?([iLaPQ 5"s X_M}8:0םj#3=[& ^¬k !qe6⇬v#U j^}y1.Vڢ $J8|A`aJ8?xuB# NBV֝r?e&Qيz১rGbJblj%iwG |D,q fft"p&ljlhf<>؅'ڡ Bv/yظtΒ`V2:|#OG9 GҀo_Pdh|O\׾r Z*|ht滛SkQLIԔ-n$gX([4Q49xe@Ł0Ip}obp YwWƾe:ChXeB=0+ew$D R,Vk+տ9| eϓR.Ik P4)}~{Y@9ͷlt$X4NSʇpꛛi3|,Ńe-@A]A,sum Wl%)f\<3yEo=v gYBE0=Z6Vaqz^& l$_ܑ`ə;(A|όX=.S~YA!"d4rghLu\_DjjR9P[u01u7LJljQN.sA0 2}s ~ 9ӉyM&8gvZ$&TyOgz;h}[HYS"$} wSh5M0pU ө۝H) $t2B 0%h˥zCUUdM(8#e]EBUlP u~.))ޚje8`{b+NȹY , ۦ J0ޚ)\ GJ`xx$!&h85]D*Kܿ)SzPNiXtӀX2&r~W1GGB<HȚ/ڙ\Q'TG<%t 8_v8"ץ үVQcH"\0iFXFP]WGzW[WJq*_Ց~,+ ӏ]=q2[F-}M"qpl{LT;j Ij4VzI] 1RA$A>UR)%wPK@ޓRl;X|"[]'i/S AFT g\3.6K m9@L5w N59F&yʝWY^hs sz (=+RNAِ_CS{TloO&!O*]7luBpKLP*Qĭ,.a¨,!r~V| w:e`U#pՐ_8EڡԻDv@\!;5,ٲ(ꈉ4Unb]8R C4-kfpImG= \ ;*0Y(eL{$JiVRU4F2A~{\3#KQ CvQuo>U4_8ʂb%pHBl:'H<:otf#kn=v)Z׺&c؟7 _P}mP Kmf(^frOt"//М,"-ek:loSbÅx5ztM"[bl@>P*U}RV =pHͼ9*0&^Ve+VM\YΒS)fKlT{q_G;hj︶>\kNAwAzL\#T%]oŭxMgjڪvi.R_[F+Geߢ6χA&@\n!jߗW73 aF6hite'gLf"1tXpը,ta &)+_>``DOa ٫S(n[_xQ/x 2a{fjEf.Z` ZudC,.1¬H ^%b%s.,8*2vTvt!p1a_5HJ[9P)&E@ܣ%_ȆM,c%icۥUv&"wtMgm.2S#F=]\G}m%  aYoR'SX +.+X怨B{2*")5#ƀГ!J80^J^*u؅9ݓ&ݸK8:ٔ'P:cb nNBM~AxoZzU/r9(#!L5;Ǒ4ASW9xu;{H^a-~SCѮHEi Jp?7v/#JP +qney$_rp:e:G2j[),l{'LdlCq~@Vɹ  ă\)H/  IJSsk I~nLηi07/$[_#%;%shGMm)>#@ӫ;j'T 0QE-l& /xwa?\R~I䥱Ovmp{Uj ,T*I2HО~1lfbTLPJ #dM|?^5vѓUg"=Gw%uՂMhL<` f1;wZ@Y:Sq ?{">Y0|z1>3R&$|[{excL`L\ZtVnb ĭZ[wn"zUk΄m.0Y82vJTO ,"0ԛhfF:>&Xj}g+&Z 3Q c!sAStI-REYĘ_ڸ+,.A}$-=gHĽ}- SvLMb?0p /73*~g %?==. &=1 ʱ [P\hæX.n!t㏫IhlCҾ2ksdƌңaaрzA혞 RWk+ņ+|jZtc0 |0JE~ @XՒ@ W lh0O ,[or x$pWR\)6i'ف)GkB d}$Ay&INE%b-#ՐT\6 [nkY|LK¬fs!N8f~2"dF=B7FYi2dF͎8`45N+SJwND|"_iC^nP"7acDX9\-@^f3' _;v/ "Ķ Fb i%puBjoAX)&?`D' uNǍL N`-RH i}AsZe<U^@=iG!Zf1hJmNo eyvxLA* F1ŠM2a<+9$NC>sZ 쳳VLQ27 cfyXJٴtO"\cZ@ؾN9'^dY?—c"^B 1)]TǫG4dG;M cI2Wr+^RXeD2WҿU~y-N$B@} YޔWu+#af͏ju3+אRT3VXҼ ${ŶiB__T&]b q45$`Bm #k^ 1E5X1-~-U%B.&F0Ur8l[TmPU~4x\Dp fMk Is:eڶ~z[_5 EG^H{w"?B5؂AU"BMh6ÏQдhYLv5B1敊9Q15؋ sr,rG&FP^${&᠍3?c$AQDt{ 0-4L F!(ɂ5q.δ O.0euCW6s7B9#^^ V;֮ۗxnՈ2c+g_6?[vZGl>@&)~{2i u̱]7|vШpj\ե33#$Nm3_be`pg&$6͖0Kt B}tRsШOEW&-GHOwX14 c6P)a-p-8A3O'@6(Ϝ#nI?$I} 5Pz^d=L$>z1I@݉Jzf8ݥ$KCfe+l>p Ǝ=csZ#Rx8["rjd^o>̣SccYg nLAI/i^zQ׭C?V^q] У挿}q]c`-yTݩ~|"[ 4ĭ$F `ʿ1;,ftqǴsh nPC <{%KǛY*GX r뾍`~Ⱇ:E9ǝ?J\0 -)⟌0|v M7O6{<}v6}" t(h [{|>kw!?JD~\ʎo HSA84U9P A{EWp0XQH)ybS #JC,q Re"&PgNOJ>.ڶn5 S#Tcqa,"},j/{8/٢q|W: ZY!@BPU٥zqo@QTOOg:[J|hOw7J 9F^7@XDL |3ʫ.ōY3IZ2opx:?Ox15։0R@v OշIweK|I9]Kg=e~yp=cj#,3;"e7F+o0`ë$G?hID6[d177&O9C9mk2PBgG1a|yTdU=5}4j+WZ8[ diߛ]HVP؋@X#]q!!~Xzht;b9*y9*ү5h2% > MK집J3XwqP\jՆ2nӘ9zx4&Y U,:5lF$#g]0yf) F@ {' c+QSfF9{|e:ۣ-? "<[p2g$j xtx!;KAe/9~G/ry+ #H>} Vx_8+hݸ$2&N*\b8l\,(CV0倔RRlClMʩV4+9C!+ukhY_7o\)RRcr&`S#;DSh^`dF o*+內'uZ)M?Z3;ޓ "48}9_LvS"&eJ*j6!_f՝H^e5>QZttEkD=Y>k?UkL#7kR['C]E:0UL-l:ӲuyjoƩ+wp*xQ `[0)5 ;[kV|\KRTohTFǭ6W?TcąXp9OZP+H=?G)$!Mi ZDnsVǔͻzs:m9սPEt؝ݦ$EįJ2h:+,uמ 2L|v}e1B*ϒn:QiF-C9aWB,"ieʰ.ǀ%Ύiӈ|a]au9Q,3N8|)ǯrr/e7R7erTf^=*AMb8 8;x%T s q3爞OKx6S_|H}g @ȷUugzCH0PޤYz}TeNq)"hD[D'}| N0<(Kq,ryUecLkGG_n1si#0`/Ut0uښS)QKƬᫎj z?>hxP[[$`6C}PXb Ғs(dڬEl ̵OZ)So6 _eEq`Ah^kl  Vx@Tn݋V$פ T8c=$j(ÍViwoɭ p僵J BxhU%@08!~kiz.mc'")F\Y%tSA+En-O9\viIk1o\Ҵy9oLnǂKÑ.J6T6U@KUDmhAbl(u Fby_Jy_BNbPLYSA}PsqIj`lht3>]#ʾk!heKjHKv>\5щ뿗`1h_}#c< N:fM_2L/X7Ure$MU v_f'c)$m2[ RSٛ5%!FjNٴ7Q/N zp9AѰ{^H#EENAQIԿ~pȗoԗ>׻r@ 6gqof""S^Vx4 yVqj]|:3=c9>6&L*9EEV}dh9: NsJK,4/7>N"@۞nA&4=Q aG5( IqJPΜ*hxQd}:B%dLFxقD'vg|OX! չ LΔǙ pY͎X]nӂ/,OJTVLup]#JDqx36WFۼ1>aXn5\|@xÕl29 ٫ÁFObbQIa6\H$l!vMcN6zpO, P;1!@`vQ58y'GH[Q81PT3(܆LEM@zkR:gXe!4REXm\Ri*O"úP"2gTPxI#וPJUŵ!t+|]Qx90f=v4S_62, E< eqGZGPi0 |׭z.%gscoi ˗n`Zbh Idr֠o%鍥iʨ_ұ+ _ؖ^dos80҂bhZld/H`yO:}$EO1N?mZinl9C$k.D4Lr٦-<7Û 2ky)ߺ6SXZ,ԯSq6#n &WHzIǷd#uWFXy] 7@7E +U{V'a-("*ٶ jaU&6 8F3mBl 0(W`b跊4C)ZhNр .;# ̸CTRY o@sv0 L3b< R+zS6C.6~AL{|sSqBdJNy>9RDȔ*БQS̊ZnG4iZ5BAi-DH%>[j]8%>3ckHeP^Y7bEI^qxB?<ڊ40f4ntǮ$3=/) q=;v0'C*2a-ebeD0pPJr+{VCL.n/OW٪K67ύBFbpFvEA&M>ňG@5&] s[-Z %)lo;2ѬEyg̉eyLf`kI2g~tx}̲m CAj Ԟ-*>ߔ$PzEfdea}\dV(îBj q OnWl@r\(FH$gi{bal(KI@}}F`{5)쉡e1DBaˬ*͍>3ȾF|_DY 1 =YfgNy}Ys( *^[[i3eht$A>_"$}1Ȍ)(߬ FƮ\&8l cU0ӑ)a4hg%h, +Ș/L$;?S<^~CԾ؝t<וF}$ۙRW}5!T!KݐN!YjuT́s)sd'GhWB&T@]w>A91-x j5־L" $TL۬X8F۸7R% ۦ@olӮd9F!pfD+Fãs'AYFo'<ĄEiHTkDF@lP'&YpS<\%XE]M0t 0ߙVO]^ΜwؒBs齄J Js;̳*I0e5L`j`8|2X⏭Pk53Ia}hPg}U|}1(ɪP=UAr(َ1SA{On?с}[M4h̜WG;8n O d,cDv%Yz [o]^T. khRZJ+# BFOV*isw-qy)Z|(j G26Uo4G_bgIqߌ" _/AYz<%IK6\ HD9P]? yUuP7!'aD/k}-K@oiFlW0E7sDBV5R|˔"G^/C?ďl­Ɛ:#wy~|Y 7CKU "PlɌ<«g淨kCvnQltg×rO #sAxzA2e `N]Ez?sڧ-g7[Qm/ _{lwQ-}3(|VS&j|褾#Ye aSr=vC͠@- ]!y 1QIsЪ!Q/(AR r?.i;fL|jE5~I~:x-.MiOqhlLQp3j^bJn=z&6ME,2uL {fyqɕ&{MicY ^_]%HWKiYȲs[wb!j%tϫ]v=5(=s#U@yU`3I=[ tLʴVw#^Ri u$a6-ˮl-hGY GjB5F28ƍn/lZ˩`(]Βh9)AXZ4+NNLGi[p ymDoFQ&`ʱ_|ҹKjeO]'k#=P_]XȊT*_a Yū$917Mp <>mwOϸ񿥲&I\=( ffvWRǕ7v ̱eTPɿ!CqIvqE[@*xc_>thZxS'2a2}dRMPwPrz~ } rul X⏢ɪqK@/br-R3F>cyb8PWq[uv4rϑm)P7Q Bk@) Ns|]wQʉp( z=- 2`+1d닱#W-Qk+qjÙQdzzY8 B!!2hE> =9 [59mFLpˣb(( 2(u߰cjS  ] c,#>a艂E{@ZO;c"T! Km\䦖c̬Sqғ[A*^S, /Z>ʈl=3_X",u:#A -[65ۄIIv¤wR95IMU1tY``)>JL-!GNn3%-'xpa?{VNM̿ Ah*,V1g Sb"s\ 4f7\OZiN&DӓQ,E46WĦ50x o ҵݭ=N`56*~Ay n0[=]5~_4b5ї\%I 7O=$/c8ӫEl;fm^?"T{f..2qK-6iDVbN©I;z#}vf~\YwN]=Q<.z4pM 7i;)b%S. tK#c,,(~`|;گ}PqA~-tZ=4tSQ(8Ը `N@-c'?WC<1Ȧmb9Rf_\7*=Mە)W[1!یgmjr9eO}¡<4Q|Uhylw p#ٟ<78T^ 4 Kmdl?ՄUZL9Cn@(0Ϊa]{bVޭFv]CsLSwB$"3WurZ|N4$\HH`p v' ]<1i9i\,3& K24 hF?H$N=7{Eh7 "nKaҁ8¾MREhfM1Ni&&-yǷ Q9^H1 }alN=:%;2TJ5ry e,1Z8\/U ɘ K[ F#woq\#a$dq:b6_쐨379WN@r݋ !WQނVnϖHxM0"(k04j&$:/ezt?vz{-mCK)l߻]X%Y gO7w7a5 ϤmĪ'>jB__;-pϼq\H '% !զqp_E )IV9&{`q4$ 9:P~+yAD} ѧJ;-\d BZUst7K4ైnuHiF473dNY͝V'$=ΘDߌu!m^HWnDcՔvmQDb܉hCOh ZǤAm647:/ qd_ a#=AUOxV@5V-upt&ҊK8HSe`3fmNgbE0:_54A<ǏR2WfTDUTT_S ! /UףI2[^dФ1ӓs+wo gC0,^!Ikuu2fZ4Cy$d]e|#wbŠc2+m/sy%o`@ a281xp>ŧh_7\M 1#IsyrW'Q}ZكtИr\XpSO*sNho\cvpa;-W|"؃B($Lq)A#A7ZD9U Q<;wx%-8boмݟI~xr^|b< n;5'wQhNjj_d. ~OrJuAo'z/DE4U; mFToT 2Zkj*O||jtxA/!ϭ"Ojt Y*QUDx)X3-|jYdvRe@I2oY˻2!&xrǬCHH4vT$ހՊ0$AI8*$6XRWl\9pa-tUlnI#'bs̫mΓB<Na"o<:YL+60S`䈤3tkn.Ck*F(i) VmU;2JXeҼ0S"ҸajV/ڣ6벛&s~EkB.J2o YbmNHPhR.𯯭 ,8]J?m!Y <2X݉1ʇX9Ͷ ?Aem/"E&4#.uTR @KDۃpiZOfXyEņZuQ_~wM~# gzoW$H0lg*CRXN~%L[%=*ojWRG)2G'X-Aph,HLKZ%?e"mwAz<9"f;g,{YQӜ+ ]~B#֊ v%'\6[VrmgeQTRz/x(n-KbQXOb+>O16D\i kct*ųLi=|BfփtUX6ZM& fcE2)hr(\mʷn)~B feAbX:|H|vpA WFη9"ȂoQۖ`v.w;gjXpȄPSLUNƉּ8s?.υVlmY5fo9Vyɀ,ۍ%"ԔK23l#]G& wemc!ʗI2c,[l2Z@nJХ{+v~g@zGm\H=. FHCdČ7!Tr|8>QExGt0ƚ;+/ 㡲kȌ.G*sC಑~56v ).+Ϳ{ۢقzmZgJ=|a)"wx&0QQq !AmWBu!Ѫ͌*CHB >Y=@OՕ9I<R-`n$hgi8on&OëScO>s6ʏ"J5 ; * 6>@b@jwƻGRd\ĻX!S9r[Ȋύf MpCVQDnWp{#Dda (rtWiomtt+.\5ˬE'5m ^,=3ӂ e[fp@P٪1a"%ȒH* $S~bp~a-_[YAQgSZc(ԋzp$`ч>4ٿؾ$X౬ VNI%{=ɞZ^V K\33ٯfywOQHQ@תk<7\W@;VI2w5jLskQ vL|EA&$f nbh֧[҅u YT/l XcbTғq<Na؞>(M-h,V+T}v3~pu 'VP/ S` ^ǵ]Ej!%u Rã 㨩s0Bz&AH+|#*΃1NR\G*fvDzjYj4,dVdiMߎlr4<|| *'XnP:a?v6!NmuGM|m.X sd]v$|1i|Qާ'OdDg&b^0CSQ3JlDI!רUudF|7 7CDï~/)-2 ntJsu5}^lԛ׫,AME,Hր T,K p8mӝEH,&Hx vy6ƕ?6G); *[%I8ex(&j>ELqipTA~r8ڽy[C7>5T[ar2AVl%N i{v\GP{_(&aZ|_^'GF-R f;2?W)$29}8xf0HF~D5? ڵQh=y3wKP 2h6.κgod&ޗw&t&p!Udf)HbfhU5Ektvr)uRW?H tLgT9yzJ(B."9URLEV('j2fW-,[0<[[W na0k9{] ~)Ǭؑep:jXs䉽4kFl8O4.gq F޳cs(VAj;Tۃ d4|w6]wbpjճQ{ZʹIivCeZ=4î:nڠ OQ`jֿĒq Qx 'H,Oc|vF;Q='6n=ȏe%,Uփo Mn'fG$F\hP (I(`'-^fcU[8\U ΞhNA 61Gnf2(9I-9ޅDO׋-6WVe<9a}%lv\ 'ZƋꟇjج-ܯVL0:Q\9oKo]+fڡWL0q(tG_3=k|ݎ,.ñOƳW^(| u+;)dJu;'8wum2I[<0|[G}F[]Rcݶt~!iϞh[L.m';x} o]F5#熿V%M~9WrCSy`7fC`*g[eM 4j-7B)\G ioX̂(z(PY1padJ]foN2nuҶUWu3ȣYU6ϫho* Zm` |k֞_{U;ѝ[߹!) `Vs&N]?1Xb^3H>򼈡&"~NKrO@ ^lck XDoݹ|@Bm,)I ̼D$zQz(Z8ȨXd.]Ŧtb![ oB{1402Xlgū^LeT?GCu iަ򎈉6W"|)YXtʻ a><.wdfAdMm!^{L!,r\E Sjz! #K{2;31w&KEiO*xFeWI3+soPD~eAG&d N|&TUp f/oTb8y*eʕ U88hyR.td(B K\Qv/i8\)4 V|MΥXr\"AH[kX2~oV[D{o4MEAk5\6[0( ܿFl@)||_%%x=:j9Q çH<0%;E)F$ץ^y/k*R"4GփWr,g'`AHh5&xγM/^HCO߂^MY~PekU/7[d~~kh~%kQ, Ǥ Q] w]2xSK`(S>6d(`(A< tF&φ1(%[{߈zBZvJ[ѻ%_)3kSYCRѽKLmu#liyL:hB;nQ4/F<|\o*hLJ_\ݫ A-/@[h5hҢz'p-qP}@Z]݉5Kbܚ-]QәU5( /!P^z#O )@8lH-V^PR0E0?TC& Jp!AQM2xw׎ɧ6N'7\2<tXhd \D'p '{*11 AuȽ]ړqe1U qa>1ԣ1aHpae9dIl<ݠgҎxa4k|r@\95?t_89^܎) +M+N! !R{Y1:yD LjrE9H'5{!3:hd@AAPs@eq|O,=ˌ6 WN%];}sOKr)TdPd]CSa[eV?hToFDP͕ B XzIA7nxNG(/t4d2_%Dbg-"GRMeU9$.,tV3WS]ׅbFҢĐ"hS/mCa\2ݩl z }d|684b66yףVr! x#{5Kor'aio~.;zAj9yM5 {}W@n7,eVroe!̪FޅVF}wb QexbXSz%\]\bX_GqYQ}ש^&;ɣf Nk\Y ϼe *^,iܮ:I5"!erP!1=*~GK) jy>;ሦM5\|dw . CmIў~NRvX 3KzZU|۩ ؍c`4:14@H_CD=.:‹S `ʺ ]ɓ_f~ѵim@e5M6.4zvŒ;pk;0^G6ttM`ؖǚCUPYcf|#FsA>f`UA#"{B0l[fn"a26প26Rc,=ǾVC]Wш*fZW_RϦ  <8uǷY;Odĸlt8bЭRܽ&i/vP. z\|ٸ8Œ/#-]{GEtZu4I=RѲS%Au2T(QDZN< mWSN]F_b{3s*Jȝ; ur$X[LIxob*n]pϙjW޽]b)34AKcBWj=>*jb>?&Ӳsf"jO fÌث!P >d2vZ/ctiFzR5 էgkuyGzaG8dnfUu re&AU#xQMW܉h ?E6V[w_G4Vh`%ϣ,oIw҃(c5\)ɠxǍ<QkY8AIS)F!+?Ru]hDB+bNr4h~}4h]u}Gx&oOJ=}{}`fsIftl=e[c+d$泺Qx_[\`~ 췛Ӣ@vF@lD0%I6&S?xH}S,^Fg44hhMecgii>sGu͑QSahR<pNS%Hc`{l!تF7ji/vaMjvlޯ9zȜW4DLђdz0mzuAƩ:JJ[8p|!1(\jқް/Gd`Q.JրL~OI3f_ XuqHm)QsFGz_ULEt a,[Er)fX+ߪMkGaaQPǬ`pV66DIGҚ=N &#:n,?vB+-{FIV5#{'ZyU^99~geFPjzӕcq,ʴS "~vF5Bv.kc69VPeyp[q/gt9*D-朡 AӾܨ^Zgb3:E<}͆QqRlm: M rɮM>.NdI!'W9^vL1._ڋU? * (fGң!X$嗪%<9Tf'\a1Y-yL8ϔ~4Ef('vgp >T2R!8T=/Xd'-ѣ%fL$Ӫ@v5) }Tq0h:ka?JD;N;{эOj+ "98̋_w!x3hoAzO{. k^Rm)/&%|qy’:T/&uXOKpZ)v.0)q-&zDϖ ͛ N:X!񜸷yky-hRFh\uمjKĜ4uק$h͢=ejp(yřXgfpy%2aO*oY_@qz9ځD%ʅJp/dzx6DAQ*8JX)S2A{h3B$+@hdw>|!G1ߜa`˽~&(уftDI8|Rzܽ^_БnfIIAθ(da, B l}nzgS?F(( ;@;,<4+66G&zI6ZCMG(p=x@y,&S;?tg[]ȅ_9 ?TP&}Uc£ɜi33Br~_\]tYP1nmB`O-Z']͍/,PdtK•x `ݱu~`c9)1e#}w!e쬷!M吏Й8Bż=] 4N7ŊwX;zA vY3zFukG bP9W@ˮVȱq8R^RJ`S{Խ95J۫ ^0^{{?,,?ZQyaS!WQT$mBt-T~@*Q7wyٿÉ\;ձETLzߵkWvm@O:qwSA;0!7}4v)9b()VwW1ڶ$皷 jD<&]ц@KEeaF6ڤ 븘V4M,?]{jc=crj~02I3(I3p"=K+!E$ox覗-y(jaȰ=,ïtncmZ5CSF|A:\Dr-|ϸn'^(v dgX{tTkWGFé+O9RDݼP—Œ ~Cv̲F:Nu~e=s+OAɅx(L8@ 3I!٢TĺX0U$Fǭ[I8b MAU;S/]pŐ N!O$mVY@}j>452=.Xvݖ>mg+#:_ѨDP="?$z߮L^f)eft@>(.󑞥q=?7UVo3t'E}LyHovY^?.Bd o(kF?,RE`5m#ƥW;ZLY2{ӵfԱ\2MKn4D6C?wtbXdku?8^ҭ!mAF %" ^8 ଋՇ< xo3rbR6bHֹ>XFeV)"~oSVd*.*+P4 #(p[ EҜZm35cZ: CmVGoM.3nlYMkO~&-(&Fc\.}k%0Vwh2󒤥xf"tHp &>W1v & #MO`:M:rhY4",![izh}t=<,)׃Mq"X+/L˩>)Ƭ8[i&Uu[M]4}d7|Ξ#y2 q9cZwIxI@ϋ*CG?9P-nmdFq>R2jk;<׮G%E ܛ #R燝em OGw~!E?.GM~PDk!H.4qm38 AY6M~pvpUŸ0M`Y:>[{ 1<†#& X֥O_4\===,}"dċLφ]eMlL!կb&ٺnU$E_n;Ꮏ7WۀxW%UA3K1`KqɇFH hfX8.iv|"j).ڌ uKYi~M7prF'DsEVf~Yf>hb%K5d ILԔYL:XR͆,? UyҡsH8wdYaS SK~U[5Ouq|% +)id*3 ?yAlh SkQO'xohz@= P`#Nh|oBEW ?cK:OZt.hUQ]?BR%oS V:m|72['mЁ)rKlm+>p5^\|G6K~-amf 4)ޛu8`CLl\"=P~ԕP2~ n/ѽj?ma߄)*ɞ0oUh(2җKrL=borbɚ0b s 46:=QwM,?$7at|w5k|.D P,Rq/aWaO!* k1uR71[(&=a{97g*x7mI74.q`!)# 0&4š4;9i@bJ>Z4FGߴO lt~TԸԟ6:eR\Bˏ=0gO{uPBE5y+3aZw|GP8i[$Yw)Cby~ʀHU$nFi9`,Y늈CYb7e @## #R2zƐ7vo3/K\;3U9$̠K$S=-X&vp:+z)LtpC$jv)![惔gVNבb6Öl6.Pr0պuNL] +*"s繳$6aZ-L3{k{˧tTՂnpOmMge\aFH/F h< ME(#@v_\È۪!ϼ ٧$ٻz(zo/y5Ba*+6Bmf%ZvTu*Orl^ F:0`JjxyJ~F||hgBİ={U ڧmE8$(SE:V \?BAyܗN?tK,mj6Q3FQ<%|IJU2! o>QT];MLOF.<:E8I sơ۾~P}aYڈ{$.nQgλ)ص޷<:Hi ʬef׊\$|oЉai,Vo@҅LQ>lz.:S =ʉנWe_c_C]w0wh+-U}I0Du^ 7[ 4gcWl *#=n<5YUW j.`Xpx):jFYɑ0װ꒶ƺ+ۛ/n8s ݂nYL-Е뼂9'%LZu[A6=!TvaGꉛn³MCѪ΢@ G1a"f(VmΥ^{C36?ا@'RVoмjR23.8T rnj ?2g'p,IWѼHǥ|v롗;quConae D4 JVugg(dj>WM4W12}قٽ_Q϶tO.yḫ!'#|QNv$a-)Ek7 m[-rВndO:@zzخ(J ;+)# loD7p3\fKv s _HPKZ+?$`M'lq $#L3PL4jJҹܔOۗƕ}I:tOfWJAײ' (ݲWIcQ^@c)6!KXj< Vl-:BՏ"fC4E6s HNs_g}Ufh9u+' <;lk,uEeOs *]!+kDFP(b{iQ[-(11" 9eH% w jA32[ z D L#M I@BqeWyH"R@G+' PҟL`tI@.X͜4V}<`#c[doD$VʠI̱v^C{n3Z?\Vj.lW;Ww5a?Xm@I]sH~pk '|P<OF~L-?]R  5Ӧ;xF#׵D9S'(f=-qK{N-r%]p6L/CZ+I2]xY!?јrI4*XFbm5CpG bFGf ^dԓ8BVh+h-,Z5RzoJx/cbVj/aXb mt4i꩗cGڙz+jDp@eGL hZ->I\%PevI=x֝QiJ47v@k41Gtc%Gl7+xIm"Y\]+_t}FowD!.CSMחAhYG=x-TI)!Cwz(Ci[LIáõу%Okb>f=leđE_-LAw6u䞠H3Wi<탓?aEPCy|dCZ/wNbpKTSC0bDA )@[lpY,QGO֭zX$׶h<-b;}7Aj4뭇Exh)pΥn  Da-3&axF`$Ӭ 3a@3_^I!mh@ص b|tK{ r9pi),R9ň0hk*!cĆIzy@+֠hNB>e'53᷋G"Lڄ\Y<7`G}X~ACVvqTn#uh_8㲮MD sJ?B򴭠7k [~B LΖxprG7/ W^&/ Q2x(>y14fIJ^80vl= O`8۩1 dnjKqGE;IjHC+ɀȚ%ciѭGElGv7>xŪ=iGD?gD*i^HO|*ͫeDTݴA h-J$/Ewae;냰yDEn]I=ȜmIWS[mZ;L0ufӣmk4$^oQjܜIDVmhxZ!9TٽdoX%[RL)3hp>beo+7.%їgPoM?E9 %q0zgem,9mo'RU߳5$i)B Fۯ%'AN:q&uEwqS-٥-c>Zw= Uw|ׁ ğg2IO 8w/i<IF\D.GR4{)FOv(ވ Ps¤Ԥ. %䣭ʾU <]`LzbuAc U[XU;i6n~F/-PHz7>b AN3B_H- %M xyeSikQ|ڙ1S +XZP5yҮ~+<5/?kp.BrA.AF/,^i5 Mǂ#duwMYa/w] Of[}9/7mLAG/*MA}/ߡ5UTYguuD=%C8 BbZFm1ڃ91Aφ` *AT >S~tر>'fk7D3exu&mq}OonjT V61 2H*~D혞k*es~Uf'W?ַg}]PTG^¤LV>]`hC `J%oNUpbSe$@]&@[rL1FONuRna-5GNH8"fs{ZHO|;Љr]~׹̇)(xd -sxa$::<(&ū@ 'Pյ$9 MbXˑxS^/c1:|W {Eohrؽ :zb7MlO;g70.8D GAMI w ̹BA $R&O,$>jᖌ4FհgVv/3GQ9>13۴K})V؞Rss]@y"X둒lHL C)$)TrPtqlz;ThD{ +iō {Kǀ7-*?1<, ,g%mDe^w1i bCWS  &sg>]w\4Ė ad.nzX_k-4| )CigScfη!qq*h%-0fe>C{ΛksCʕJU,?MՁ,Z.4l$“P?]_$0;LJ¾^:c~ͻ* NIJro2B5l@DE_hxCp\ZVkR$uhg/$劝t\`R-5O}ySO #BHHL@p©g5P|%u 4@4arMN[CVXȬ_ô04Pv P0(:Y==8S joV"RzÝ\4)-w4MLM9:f;5 )/j1cB6 Vxkg1cc]hP=o[1$tRx⾙IE6Y2RC`߂= O!aO pM8M`rkw/?Ũw`\Z*5.Jw+nݭ(ҙ:%3A}QqyZtߜ8w3HJ%y0䫫ISB M+yE<ڹV,ia%/x#x=¥yd K=t?dT>/4(z{Qsjʩh2櫮sf|j{ SP(H(fcZ`yܕ㜥E#1U-+ؘM0bujk?uQ!J+9VE,M1J^_H®|".FHd#[@Sl"}ĿoޢN"Q\,tp=;Xh~f伪vfSPrG50]d} |%HSluEı-.il̃cFOl1?;cWO I)WyJ=qm-^ gF@5Y}W4Ot]ż44!:QkO<}]xWBũ\LNSMAp`xftjTP6I5{fI`I_Siu?J3( ڨ &MOA؊Q)۶=切 a Z֥UFm+Y-{52wF@}a~4~G!2Ptѿ=W+FY34a9%#,&#{E$:Cn `耊Wvš,aWJ=Ǯ@T[\ tܕ~bWY򧐞Wi7<Өys$NǿT,Ϙ'TIBb;AACCK$] *4pF9d< 厔3AWl@4Fn@9.uQ_Q dUJtHg,tq^ j{d6*:1Gnن k.biSs~90vP]Ռ('O<$ίٴ`K8 D=!5LALk]Q.439/V^l=e޶›N[ M\a H~ Ǽ;; bI{ZSouwʪ sҟr}\R=,+wGL #pљMf0 E5ܭ(JKCoh$'yBD"&7,1ʐװjPjLxGdD4 ͇(I"DbZ$NgOUD߅Z SVg]qd=s|%􎚹|Oh-Nt-gĂݦ]w< z/#lbFF㤹e0%I+e7 łnyBݻ*éۉ%!:z(N+=&2v-$(Q?DH$,kbj!V Hx8UW_$;"dP'q;gCe._(wxU*dp=D_7` й/$9keWI˿ft3X#\]"b/vV=@=@.FPn0g0vreftzlު-ҮGtfQ;>g/q[vN+9%!~RU#@t! f騊ߢNN܈C+~3+ Da?<)%KiNzQSM&: `,QAq5GYv܋T흮~ ,g`2|RoN(,q"rOl-4 pJwByl*n!lxepG"!Dj+?uRMvz7e䟎UvX)>.ZCuَǶ_y~"17N;ݽɟXx$ Ae R3"=5d`T *R;-@A;^d OuLḽ^iC4oo|h8BfsHPi(dW;š/֢魼9c 8;'F<&kj$?D}_GA@qnzv?]݊9.hKy=9/GX+Ycة^M6v %m%4=b:7NLK42;l&mFg0nNic./`M ,F\evq 8߻Y ;g^O)mI?VAc=W܈ڽ2Y#8 llLkǪQ<*Xq}tr{72t\ v~bmhT:Sv"p!4cLI ,2ðc\%H?qO%L -s??4}a@Q S߃F,"ܚ/jEsBQOE.D]UfaH{7UV-2M6]o!٘k#4lkStɨH=vĺDJ|Hv{nnDAˊCO}'̔5yNCa,ϓ`]h=4(oρte]r)בϝ$bä%Ch nW$ΰa߸]nZjiv,]"r=s'.Y2, E!Lh: mԅź85H"%55iߢf%ݨ+iw\ω F1=fO!k 5Zi6ڎmjڜa]i$MO62r9`r1 6x-,Eٹi"(N_ q4tv0KM2.Ӵb<| DÓI mt/૬ o;79795Q?h16w0M˒ ~n=nB;7Q8["#s};f)$Mh6RBwnL!DjsmE;P' pk1tCj /]7O䋒4ReXt߯ߐÁ*ڈ1<>ԂZEC fU2QqEMn 4p AqN.Q8n>ꨓW^2c{Q+e*]5% ai%<YΒiDK.ifp0.O F^k{7\^jF/@rU |$ւְ F;Z #k7[,[31~G6Mb%z6975#N)R5uCetYdnw¯CxP!nqv~;{<]*8*NT#: _5 zL\R c&L@E 2 }8|"cNkXGA&ŋ֯a4bظ)_XVkĚ"=@71>3u2$}!4U^- <fvN\{S3%laslFr\kUmHi{z$$fH`#@ɈIfʏ~&m\Wڒ |qFNK䰭)H&;0z/, ǼK*9*3C(jQT}Cv"W响Y)$!=# &^p;G'aoLoߴQ"x ;>nd,H%#р2kFx 3 ,[5đѩI,3o25^\x}tk鑳b>N@O%^ap!"Jc=kA9ؽ٤p@wa/AQ-T ^!1R,Q223Cޮ{}< G"+$_o=U0hݱ/kX7IŅ&1 i^!AIMV]onCiML.7_uTx?;;^zNP>7h\-$TnLLdRZJ~T%wcq}UrE1"G8ƊCB[ٰq+,2tW1IJ3oR⋖_zHf?MG킷"ٻqscGM=jSZkGTŠ|"8/BB8bOS<)ˊs1A2DvǞ끼_(2G!ul5sF$՟nmM1`-w1^}>~9u3~0EfRűY3c 58B6IHGܡv*(1Z9v=- %}>_a8*%h^JȜGdB Yhe(wk管b_ok⸚LdA&!ѯ9釺^BA2Wd|p?W~8@hf&H.UPYZ2^̅ Ofu:(ڌ`Og3&-קTsvAánM̹E=qw%YɗaЈ9}J |&LZY\G`"F& {S ze;8>0#=[+[yN!˰E–Zikm ,9V\ L{pɦ':z¤i֠!ύ Y[±2ż9Lhl ,B# 2[S9T-gSP-IZvPմS{@2M%c_:NvJGL#}CzU ы>FؗѶ/O&#t- 7jųm!"NFltIGmj-mV r3݌,DyA,SAN^l+-4:ONJ+5?,>NI_=B,=w_Վn]*|>)P €"QIš&:jnKULgiPކhDE~Wo]%ssC#@?UzRagWwlh!v KLCUO^ufRņۅq0Ҩ *F)<]&YfoI,Y0ߢq3PAGea/YO7PMIܢj0ZAH> =){}4V>3; DR5JN͛_֞ uj0V.zgCm5^ՃL2C!'H6 2E IѽSSRk>ѷkތJոuvYM2a0XlJ?RvBwO.|< /Iu% $iɾMy; oX͛Vna*$h;k@ #Q*$& SW}uq5 UUdsnig?ͱ 6 1ֹ)INO9^~RHi;6&&Su?! !+NOZ->`޲EN2Sz8rHK0;Ab7 xjhg vN K.!cBM`nXfIp]@yKPK8P=ĪhUbNH$2HE3L1 8-OpN.VChiLX+MRg9v\\@MBopz= ;c S96/|38\a!7mʊK%$?r=Adi"b{}2PMO*M@q]w޺Q2ǡ$ G]t 9;sR2<tI%ShHn<&z1oh`ը;SɵU\aaj,P|}]5@4Ȏ`̪fͲ9XQArȻꅱ;wyNqY,42|_ܚV|>jHᑯt5/֑e4Π~}foM{e'w,owV{1">ń^ ba*h`Si8v5&F,0h ;'w kujT;wfVdA.r'EטY>В54M"E[ΈAw*+ӾvF"'[7?tTU:Pc\9K nZEJ6NrDJrZV)%+F${ʳe+(C(4l  i4[WTkX gIBUaQ>='nxv?RfZ [cRc_.QPxew5 a:TH2h2lqZ#3u :>G K'"aU؊Mʌ/RZGڬxLYzz\9Js9  >gSLKN6~ ]N$OF( RZ9~Y].k=jnɨZ!457Cp mx PH[d!4Zݽ+ og%@]Lj:} LFIs.6sA>ɣ|[aw" [{ʪs(J\?CmPϖ dkea4Ɇ㗱VHKw`~;!V,}0 .kA."Xoէd4yL>8=ԉV9 s4r b杀+鑸uU1{ yi8h!4n!RDMK˔[m0Nb!,`}.?<&G+"xñDÇ^D~ Zr L S\/j(9r`]B4sM(UFp5_IF;4/FiApT'MQuhb6\|YɉQ |wnzq,I낟2EB_e*7L Plj 3/՞Uє\"WITfLS~ZuMYҰ<0́dd)ZIА^7Uk@)0uo}yvV2l~!VgA +rj~Gw!.X}묊ӁE$wX V]о?"{X%AzXn;?WY[bWa.`W:ncrrb;.Wƺ$XQFxXB2Ƿ"N5 MP5nfbLj=Ө⺋r__EF4U%+ýDuxL]uh"ކf1ųu#tS :HvtPM{ʐQ'^αO38 ~}?,uhskDco Z6hX'Onچ i N}S^_>ROcL0B_P-~1 9ov`]pOɽC{>(YL^KJҹ%ojpaѿ5)JNs Ȗ:vɻXRgf7-JHHõSa)*|}A^҇ݯΉ^ԛL[ּrs8!1 I͌w6ɝ[];c9t,ԯqM=x*ު H vT? B[1!F +C;^I{) ҔRŤ xZk2CdtFM+ij'ǰ9-R7nHȹ0̆&xyxn)C0E\=MF@WЙQC"[Bl3;B|E)5SV*KhA U`BY݄yULq-`O18tJ1x*_:&r5w' Ll|XX!#EuLΙF eWHawH"\& =صݷ$$Yaԭ:py3rI͙ly#H:&~;BVDfϕ|,(VNN_tAv8IVpNؐl6g!Y"ګ{O0QF>٣2Osq]p,8X1 94L" +rRHRz9/{ )Ey-R`lqHP0B M$;J5mo@?Y2U^F ",*ʬzbpq84*h5l ^C-i Ħxc,He|H u[X5ۋ[mg * ;e>:sez\e/C,-ũib7RW1EgK1pj˘< aswڎD7Ѫ/B{,HU :e0Md`6gbQ.lul[an< =U0::6-ćsQNi!VۧmQa(YJCB0 w'Z(f~gJUjZv\.طS-c%S;-l(p3rVP_OG^t0ɍ,NkuX{ꫣ4 ]M#UrUk J m/@`I L/j i Dm43j7',y6_^30{4`S$4:~}cXA폺)${= i53@p|9MmDHW a; QG_$@c>Y%Wvw>RuE̖El@Nsp jzuKh pP1]'ZTV_M7*1&N-g Xs`q$0G#m3 $ǞT6Ԃ-*Sn|fy3+ͻĆ3(xTb*(_2 ] |ǒ[ܛJDT ZI!yOiDbl+4Ni+C< d k_2YV!9X;ZK\Ɏk<R9e nDnvdw%'c~8GiGjd>c8R+jm323=f|K%vX m#3@xp2oƧљ!Vh)^Z T`#m"usšC adh!wbgL",A.5FF2l.2.rʲJ ąE56mMe5\̵G-3?^<~V:Ǣ%2s[ {z R3e)U,NHvw}|,@birS^t4I?ck5N8 19V\d*4  7U2؁yS?8vk"g:=6i#JP&u36a[R/ grIdp8W}5G׏0!G&ĬZJbrNg**!ZoARgdzulRw'-p]I2 LqVSHK-pM 'R2.4Xi}opOG$IlO >QЏQWb3Z_^9-]7+JǾ#ooecd5J=.e DEk: 6 KJ򭑬ۚ_n*"\JA6G02K fɛ=,3C71ۓrU:v&rq]R`asr1dUjY:*1XV@Mk%C0TE2ɖw@ٮĈA2^EF/y>+u4? OQ2 XuP29_ᩑFJ??IOi  ".3jy{UGыw]x"X>%`i-a+P50]Ԍ@Vi ,E+Rk#U {J%H|]ӢqtHg0F 1^'r}%ţn.clX% d< MiP 3|DU{6{_6QcP,Ls c]cbq8^Nv~|Fe=VZyNoL qAMZzle['Rd .YN?80J N!Pkz6*3$Z*+Os.%c\$T-˟5ko\j`8SHPQDl)[OR Цj1u?e(#=:cB%Ӊ tժEc?d:=˓ܷ~ g7e?h '&ͣEQE@MHVu^V7Z}_ 9s8]Wv͉"z׹7}zx(䎈)'k_EXH 3/J]zl\6vN:1'b}YBRPķ~.gk$کxV[m:A+5rUCMlpQ$~<6рJRX{4 OYeFq:i 8s%=*iFC#zoEU "x{p/ g.GށB# +%AK 94Z3Yؕ. _oCKr)5x-,=L, ,VQƐ&zzA^bAj⹄0 A;ϼбQf2V[ZF}J" !/gMEȈfZ+rqQm7 ZJg>;z0-ܘѷbd@뫺"XWz)vv2F Ms%eyl`? ^˺4"|i&2D9+hDO/p>sO A52;fK,lQ;df2b="yZe<%{H KgNYƂi3`Jj6K)~seq^M'9+!"ơd}@Zx$ҺsG-4Nzi]0$lB s֝3ṋT|yv}Xmm\A/7@JdMa2٧ \+/XNRWvJlQWsQe:PMjjs +[F;߆N&WN0 aa&#/]8_(,ʈrs9Tɼ:GõɃƈ[:{j8c它qK_R򝹙-gzFMď{8?|f$OLř(mSKC٭5`Cn9H-gN}o]mO{y0X]Y"&!vd,w5?2𯘴lahIKB2=WtH$J3mA?gQ1(Jn S% ]?>]k |K$ǣ\_5kI]J՚&? .ፊ1vq5Tb4HpT dS{K NJ1Tp>k;}aXC3lj@oL yZgDFd$6۔ma9"z&,|X]) 4o36ҿ|Z&υNMk&{tòN)>sF^֚iy.((mE_ ]n >۞[>AkK#K,},6eoط[GѝR>|ykOF҉liqVg.h:hsaMs1t'dUvYVq]u7mPr[d0ٵIg3N#3-M{ַJVvT bd KxW?_6q%D?ҽ@2[|i*bccUb| < ?snUI~O9Ρ{& &Z0[wRy] 2=mCuwPt++)1-by<,$|O1iW؇>ݞ nކZƤџXfGg_:괚ZB'03%~Aj?[wܹ([6Σ{j.& 0Sƛ!8R*)eߘt"1<:%mk>pLn 3<:l0;FS끽C$>jaq޶OӶFxB \bI C +_sD)A lĐԜƺ՗IDc>no5ˬ7(C-}$@G B /-Ρ,'Q2CUj\W!dbg[pӜ$1<\9wGK$Uzȭ!TiKP3'rߖ0XQ*'qׇ/O~ o _= E5,}jЀ3mԡZc*5RC6E تT 6 Vk$'yJm,[4lH$Qb El,cG½e DɗLin)S2`,q9jDm(aُ^G9B(Y g@UtQ8%:) ,IkF`cOvTQ4 [Ă/rag(O/I_Il[FFIV僲=D0 J`7"\fo&+цDZcWGjy;_l~^H:ȳy/T~Y)(1H7Z`2`]\ǘuZ9lX<Ȫ9d6;#zc<!ڪOb_o=VyPef%ovAd@nt~r\YAe7@HHH&l2A;nJ!mzoKSްD Y+aڨr+.{7dqm+C}z}t؜ȩ,[R"9U`=%#-i7 '+j.K>N%lz% UkfzMӵܭ i/b"?pRi$2й<@V@ߒ*XZ%Xv îUx,JW9, _E"kv!'NK8|`G {?VH2|o|A̞DcSG:q(D6O;mhve"5>SZT 5YDpVU_TeUyh`jw[ uۻjyԂKϹU!T^C5}Rv"3*i?]RXFĔ7fǃqgat - <vL{+{-^Ȫ#ǧ6F!|o#2hW;R݅!BZÆ[qvBumӱ%v(1Pn%*9p]O({bZs 𚜱 Ds͙\LDl'0pD˹mG:T=g| -༛O?p~R2y:R3;nO֬Fw[Ӎ%4]-yd;œ!iV)Lp!}VضNhan6Z +F!@&Ln~nK/=ΞT,6*NP b}iH17F#-5|K̵'ZC لy%~3E6Qq8BLHCw<)8yfFym/{m*ݑWVgtCֆDn;yI&]EmDR4wEx"t-ɷ[.xIͺXuhs.6eBOQEJ#6%o,C*bsEfx͖:)LgJ111q&=Ji\5B].Q2Pa$S@IG?5KRbD=Z>yU'nӵt۴M(?5&")9!p>p4YńzmA8'`҉7X{rC(f  ?\F :b`y5t3 QG"fMo g5j[?[!v(˹a⠊ŵJ(rU͇(i:3Gg` ܣ !2h:T!ݰ2|5B*Vlyr?Kaib^-Y$zO7˅liœ~VE$Qltz}6t640`7\Y{^ԑ;ൄ)D,NEj,ΰMk VYBYeNK_8ׁNf?&r+lv4y^]1s3GIkL'ji8M:[" h$o/VBLI!HN犏"tPz؛|zE=:}$QQA%togv(9 b+-SvIV;(00LykcǦhM[lUZSt_)*d4v(+s bi"(XG3T`]B\{D|;Kpx6` U 2=:M˜7#@ Yؚώcȥ s!Sm9 $oo8^& %R5IEyJ%:#(^qthW^J L4|.bzoݽEwT_W^w ~HeigK˞vρ\+)gC<yHATn˯K6Ad}AeDK)%~DU˃1_T'[\3(fNlq$m7 pua\&-+F“Bb˖*K]pd3Aԅ=ֻF&'Os(Uʨˏu^jt\ fVrh4gCv+$yۋL5FjC@#^c  $i- j+ߪ F //~<ҳۥ&68u/{j L ]zf|CS$qBkvtZE!~I\m%ě#̗xǁl.2VV$oYV8ճ%awndnq5#`T4چb}q[kA͗< g%qŦ4tk+ Wl4"$L!QX Wn%i}Z% % V`pc",O#ȠoIKB?;7M5`c) ߈ey]_ knܱ*]2"5į8vdyC:s{j4lRuWx5]hSt)uO6x HG(f}|Тj򛧨i /5Xz#ZtγGе\ˑ앤P4WM1a\\7~{iuf"V>>$M1Tcfۘ5"&(Zlj%Pyf*,PQ 27F%zmvB΍F*6MVJ45⷇ 󰅈NnbyM`"oيwXĂ'|E{#-3mB/aU0ޟ-~ iqGKc/G4P)w"а ,qsOXuAgLo2G,xZAHpsÁR_qm`3:~ Oi^|5YsSPejO| rQM_-"EC7cTNIҟ˪MP߂@d{5}uE̚Xf3l3W:W M>%c?(ɹ[IjD|6kNq)$!߱6@זh'R+k]lmad[søu:SDQ⠮Qs}ͦƪaG qWIeJ4&';t5*BqFw}HVx}B^Cƿ =̈\cJMH=!EŔek߸7mmRzKir&rҪ\Wдr.9=0X" SQ=&s6Ԯ#&mWUWވP4*_a=X0mXJW,M͡PӋY O3_4 0ek*FbAF{<ecH a5%rWafLUEk1 (Fj;yW04 ӄfbd-8 qpAvyi-5-u7I1]k>Z_żmھqS7Hi|}גK]rėb-aѠ`'Na9R!٘M`3sg+/<[bF7, K͛5?>u oa? qpiyڔ n/ m?I&ИPš#z1B.}'B oYnēy_E>T5 ت8|ȦH_ "o7I.[!Nim4xXK~MG>+1P 9!VT'LW?D2YV0~ ɕc'd1_V?"F؂n{')?G U.eR\a j_B>G-ڃ(N/ѸG.ۜc|"&^ 1qNr6*k4%,nbe;d}+&D!BWu\.<%Y7ڮ\anXdWo0\_n2\6E_OQʭ).eNiX01y]tq@Ǫ.DFe^!KNeKt;k)ڳ bٗ 5Nyg 1Ne lYϾiG1nWb.* sG 6U5[E9F3PIwx#(3ѭ,L㾹͡1DOOP*PVCφGkKTd+g}V'@_l΁ۘL0Vr`n`PCBg=j$6J i2 ݃lԐ 'X}-ŰC$1O_PA=QƖ)n˫wȔeWJȀNfd?d|s%yd;H̠mv;U%?rxC M!?d~ڡlߺkkdKp?ѫ-q`aɧ'f 9AģRpKOIxn<~hEbRN,X~i!Y5]uo 2fe$?q!= CX*{<]Pd)"z;-Ѧ{ 7=OBgn9 C@nFݛlr=0Ɍ[52%;AL-^ڊd._Yig#4rvy 0 hEgL̊D}0?c.c3c-QD~+wa]]>&VxRdcwO jy< c u(^y2 s$eGB!}΁90ϠU?iǚ2ڹh-=ZhjVQ` }JZzzI &Uqh{mJ̭%@7:7Mmp HP}TY U" n VY%aQU)TDo+zчGje|Qw8gA03h包pj=*0G\8h,RњA(}Y >b'(")*hAɚao֒e9A@bqwEcפuJwROйPK S|!xLFu+:_c^N=zj&]& by8LY<^o6~pL@XSC((^k Bb1bhQ-ͧxy;j*(,We2Ĉ􀩤L ,3f.'tYz CL*2~/C~Gbz 1X\`X7 @ lTRL&2ic!@Ń-21C՟{O)"'/lyCϗgyTbgAnD^ܪsg3Z:UiQFH2nyC3[ XW6OK;P%h;4,dF$JKNyktUF4F&VpelKbU-u[Iybsj'Q:/ȎbVN,5QԈ.g}SGZ^t.T6E7S0@1P<[x*A9K$/[H*,t> pX}`6*ъ1Q 2-9u߅=gF\2v㭹\4a0׾T~_aF  ]$k%Shџӝ Ztd*>8(;W 5!Gffe>Nu(T*U4 h$4eZ"7qB-`劲&cCJƀ.nbƨw ׹$& -֨E`.2Oڠ=?U_G4.j/9N}:/tp}ӀZSGazW 4H(8Όt9 nf5Y At ~̙m8ދ-ޚCv4Cxa=6IkX"f^˽uS֊png_Akv~;F+ؼ&"27zݓ0s/âQj ㏻QH)-$te~+;oF:< mJy#fadOԭ:aZs=:b}UmdE£"P %US>i҂ h3^[~iq'W-dAD=:6DqK@8GHjK@/d7Nq;x(cWQ )aODP67. {}tӈMwؠs 8`znMw#D1`! 櫔n9MP5 % izW6:ʹyҭ<(3Z{p4޳ε^&sy7;(+toD=$ʛj<[@Pzcf5\H3}4KC^& >S?|u B@T[!(˺kbQٸ%}$@܎d-8BDr!bCe*ԗGwBXD"O*YyrgL@.ˬ^>qG'` X-k셥!wM-} ̵`P8,3[iSY+RQyh'~M3ޅדsvC$-2pi)jG3d_ʲ8|za_ ,| T&1^urLؠx?vPGapRV1FYPnjU-cx0ը&D£uhb'~{?`<| ℍ Jmzҟ"UN>ř*{_"!%b>c1kA[nL0ZvHd=]EX\pn Z3h8tĜ n `@頶aծ*w7l|N]'qg=}–Iu'#j3~PR\^r^u4B x0|[MlAHTZm aȕܔ;X>"FE3\SF5 _9rVn[yXgI , )v*W(e}WgOL3=S2{6ڏU %\=U+v6@ރȎ0_Ajȓ#QZ1(`g-ʲٰv=׬ ;4VTYeZePZ)ޖp>d\_jjYM8L>2)7C1la |I&#HjYs0O>uWI^ő>iLN;^x7η)7c")0TC[ɒz_"]R%BHRրV+vՙ 6٩"r1Ec{3E]T4+t{Kow-GL6br9_@ .t4}[C$t}BqFKHR;[Պ)c*JRܮ@5eC(CFчT%7_InVSR@ǵ~"Ӏ69rtuo94ZffAmر"[8RfmC@y`c"co`h?JW@r#֫s[jE$$8;V~17 TۯO#,-쐃4WwrReXξުx!L`w$&^q/+N\ 1uUFqMr-:;g>s_JTuN3۽Q"p]bW}QrlX%j&#b3D n7O94R}FcA{%>7Eo6N[_!д^myB-Ga`  ]uv k/2v=nX 2>OFTƐpE'$ڇT##<jx pҍMʴ 4 aQ.C1GQ_l`3Ȩ&[9 W{PާmVWUll @lSr#y+ IvYc29`w2/~Y $u@ >L>[2 󥫙3m,4}ƟV;y>霄l> cH&tB$>e4\c2̕#a|pD`ȷc\9OƭOfrD#LzJ=F #v'U?AМ#AvP &ѲR[mKQfOK ^>jp ɜMD`d4Z$7"+f H^#| `TPvPˮ{9za1 >p8`{sa~=chSƓ=s{\,-]A1z2 ywģkkEX2P349(Ej!:gFOO\0qMčX5GIl \k67|(]kճ$!Qw4:WF6]tlaװ֧՛x,F5$MDWMtdjGJ v),1vYس%tU9]?R :㍊@p +3Sbꡮ~o]Fҙ>غpd֖؎vH5x5Ո֎'!:k3^^j>Op5RI)T/on)iM'^!\mģI!Uʡ<)č_4 @6^Ivab A`, '{EnYE ylUx%\>8^ٕ.@u[6yߌZƍ{~s1~;J )$dLO U;s 6F|阯V?Od~p"I2ƽO2 `Gr'qEZ kJ3CdJq Y<"t  _j^΁4&$e#|+|I{lC"Zk6}gAG©%h'Ȣ.fu<=@~2l2~4n?u?NV = J 7RP'픦dz_D=UTI<>_z?8 a pC,^">?Ȯ"KR{9!ߎ1Df6̤Ԓ7Mt̯3{7B>~g_odq}kx.k@@-)_7tM.nHºŷ)ZLKޏ  *TV9u^&i}w}E{T"dnS75Ĉ@+ kLQpKzB*q=PO91nztfU7 4'ѻq߲I'B x$[x)Tj@EGn!&.:5lg:C#Prr)h}FO9Rtu ϔ=nU?3AG„y~E執*蓧]}6KXF|Y;LH(gը2B\fetN8K:J2M0,_w~v5j@B'b>nYݕ$ CE,OW\zVhC`^\*MK=ڞPraGx"݄!.>Mcz 3BlV@AI[Ev>+JӔRĝO'ݚWȈΝ# b`(b9M >Բhlg^~m@ 7E} u$nT[wswBcHOOgJ˰<7O.YϟDZG*eu4]qkkli*|OVYcz\b0p#/^pzѧrECc ti #6wH8 ^Ĕ g,]N#8@,hdUGwVEt=, ȣFhO/K0*Z eR97,# r!b-@i7Zl7b8ՠ򠥤!ZSM6kePF.2enEq.8_CMt#= kl"? jÑծO9r6N(iFe -Ol-\M\cDTўd+ ፿;X;J#je_/ke4h.ھQj*C+ynYf"\^xDO2!yՒ5yNh"S5@A,=lȥͩ;U:xC'rD5a 1(){wIE}?+h׬oM|$zJ/1^uخ02ĺDYDH{!kڸ ɡ'5=Xm^rPV6UǦWBrT"[z92')etd¢k[ Y $$/984R?>+/ l =meJL 5 C=J ~ƔE6 bFd,:r0#>^Ń+$ L̒ǵ %Y+Xb@QBxsAG ͘q-/gV"#TM8_J0f=~Te)MxI㳥)[(3eAHhZilʐ/Lk%O9Fnv(#JX>r̤:t88_E}/wLlv!pYAOz$hrED^)] a)jw+8K]*AN&~܊[B6_na՛moP"Shhl7u6Ͻ14TVSc'xAUᖥz@v% ·ܨ5.W"_^O M?M$B62sO 8Bf!?TA^qc/Oz'W? )t;A݊0 h0skANT4j[UM%^ 5 i ~z<G6|cK)je,iv_׾[̇@vkjajVq2hKt*62im5olTA\n"}sDʇJȽ&e=iP\3j7 ,TLgR-Ay'0ay> (΋]-_>)#ti2UՖqIђ;3=kpk+d)^ dn!-vUn>l͖S~C;hޭF`b4 +Uz[x kAwtm1҇C?(6>h8> 6BYp.4F"`sv!?V\7F@.dvB8EJu6W7 0.#>PJ<8^?&hܗU91RtRF|ϳy-”9*Dp<ŽnU{L Ai%gޣJen4ijGM$Juqo-Q.mQQl]+,"'2уoέz=Zck gg? V%3&Rxj'Mn<6k=k>olVk J ]LuJ]f ORtnnUo9t)@@% "#/:}RZA=K<RcUp0E!}&ytFP̸-@b*DMe|jzz+.a`!>D W肈DVSFH'V/}?zM ̿t鶶sҩ8/<AxCXœcƢ$gbѻ8AV.jV!C-|-zts8>ϯU6wB*0+e>&v݀d |C'vM=l@!Ȫ`أp;}US./iM"N6IG~eQ2oFFt#gH"AKs+wR+qجzj A3~<Le]fm Oi :.͋s4a<5.FDd :1kwֲ i7|/9N C' ަRFn'Sc m)! yN:5l!f"_ Cj"%\$~ LPspy5GqmrnxFF:nDS#wl6V6޸o#x6j퀤0Zpqbگ g@}w&ԉ<Áa,<~wl|cU ^%~0i< APi-OXtRb4vG<tIF\z:y4mbZ5UĬ=;Q&+jfz| %OKθӨ^+,T)yVBh1י_=B3)n3 lC KP>½;H ) yF|jHm3 S;E՗Ґ|e}ehSA'd `]·UX:aܳy0cLU&qU'C@V9 t``LX:.:ЮSfNahP[ezE1ymW7kuQ4K =VIbc{(~XC{s]җ[*fָiT9Ys PeX+9[Rv3촌~Ǫ _ @=qPGDؗ2in!lQ *UjOP Imh`V/# ;v3bFس<4pARZP3=Fd`*iiێ-媏TT-NYPG !nuet˸m MxBQ-d5p-_;p!⁒-ɤ],g [a62ՂMfA&'e^x=+frؘɢ8WXwةY΀ @MY\nj#~X.OvX*h/%GY> '(D1f.}ތ2=wҭu,WȠEgoWWR[y Ay5/C 'bǭ BHEZj2x/w^w(O˜n߬&ӔRc)]fWzxh+`R%Deܢ`[CC#Q|vVݝH2~GAhշXv ҽ`sF*e HSN ~DۘRN 7czzyT'WLy=Fcvk3OHW`Op t:8>;H]I JZgO}Hu.G[s nl#Q#pW`+"8L9;KѡK/tCj.’d02%Vœ.36B8ef@= " Ga#[1_%O~}aEz~Ce4M;GWUQy*ä p@% ;DԐQZE/2ۣnwZEL70pIgJ4Zc%/s "Lʮa.B&}IL}vUMw9cqՍdUcݬiEqx^$!1Z$U0cg>]=OG eW1Qa̵ί ~-rJ7%3$\f(o\Qte?% _#oGM8`C`Fd(sx瑔ϠGj 9@Dt9pnM)쀸ّ^ !Ң$_c~l ?EI$ A »78?-~בye@PS]q6r/ *ׯfwwcW.8+KM#5Jԓ˾|]7H(q Ö$?βh g0BdU(/8JÅȿ6xʦ@]r&ʀ92@# 楗~.ys LYvBv#M"*(eBG/hJYG[zM[& ]dLq?UNL5#{s#잕8\"?,z[xt# 6&Maw2!v2P\FsӢ9'8hV퓞C4 1oY<\MQ۬鮦zH^k5 * ݔ SKB~ծqsz10ި5Ԙ + ʁPĻ5~mPrF:֏=D9<ےwM~ A.;W.ͽ+YLqlzI~  ]8@yX:93_6M1O Obſf&;$(}kZ۷ttq%߯P!m/novPh3UKyѡ<Gqm=waf(2aې(ʠr#Aэn6g,[sC0I`<:R~ uŪ *7 C " 5S ЁZA5hm. g: c`er.qٚ|3;2AK_9OPRz!4BG9ug7T([V2I9m~){5t_Y!m!Ѱ-ԭ&"m\;s5~Q?Sִ2K[Td<*NR7֢T}R̙\xcyPf^<'WDuTH^%t<][A¤^]ef ֭V )^IJk= hrR}v>uZ^,cL+ $I2*rwRj[OڛJ3q6$Z7ts =q&yoz:nj+Cogt#Ckܴ-BFvc*B .s/DYݤPĵpU೺xK t4%7VG?~bΐ.yg0}3^+VJI4VT-g.)2{l'[`$ݤC8Li ,qp4]HQ-*Сɪf8(d΃}~BW# .}VL kE(F?! z>C|x1~Ԗ=cuwxBfDޑq< ao]~hLQ:yn`l2|uN %ዺ! eKƭquESA#%5 虸3<8l"3Ff%'ChQ"ySq4 sEӠxx0ց x'.ݤ6X[MN˕s *aŪA'%:ƉMhyWؼOlHx=0G[t3q^夝OAIƋBYov{0/ɪSr}mv.ڙy#w9;_F Hl ?ugmTȦS+U%Ou)L,%m׾%Q7ɷ,Gb %jg8<ş+sLqiض4:`,ThJr|)8Y1 zhᮓ^,:bRCLs ΨKI#Ӻ d7ǯfX^x-CP{TaRy_%+ƥ/-0t',U:z43x?\ QS@GŤ[kdZr\D#=gV~[voQE]YAOZJ-\ xJ5~;qDw"Wo[6T}]VIchY'>ҿ-g'!bzyI:ꀴT%u KxfhUȅk)F=\W8%ͥ]PJ ;=zkyu0"#,}n*Ys$wSn\B!G2MFE*y g$4MnTy+״SPKUI:܂܆t2Q届Rd*dR!3 S/Kw*4v~DYoe!RV/a;}x~>0܍PYX[ U1")psD-ۺ2g"ֳjrlUU]"UeO6l**,EWu>{]{1")+{^ NJ>齏lɋHoŽYeRlR{>U2ڏFef5Ӓ mlFsN^/UA'%7w~!#xK|ih߻F;c0ߣdx6j&ޔ~{͂ëLz6FK\]Nnsdaɂq ]Կ<7A.wbc!2:]48s(+g"T¶ #c@Y6'Л E6S;8"ZS dt.0f˗j?hb OUB"ٌÿ$ &rvWOB,]͵ L͌5e4Dը쓴?!1#g-:%vs$pZsA9}~30bq.=͍@4t>vUHqN[ drB-@/.ZDw:͓)e۽D/ۄH v^2&`ixP3@9>LoW*s!;v2b1]L uPy6:P츃%N]OAЅ "7ƌ{~c屮MIZ|s@Ff\lO"?#@MG۩D(lq'TBxhn3򲐱xcLq園!y̧6d,RKs#)q!NSiWf :nv`G3=}U*Cq,P ֘/> n(+)'ysk*l$t D+h*f_^|X,W XL ;I8 7bL+HPZPݿ$BB)x7zPK[>l+\b'~0dS,i+(2dmB¿Di<%kvuc4wkv& iW vV؈ʼneKL GFO[g n=4ɝc:t~ٍ[FՅeJ+&~Się(sK}Y,j\- E`׍tKBq}GG kk=ԊDÖQ \1FjAY,fQm -j/w=s2@I( A /ΰtZ}`k) 6p,ש:Kg0Cs,ڡ ɻrGݘ' 5#.J@ v1̝ (8E7 b+Ăx.uGnjY8oMh/V! DpdQv@2hh1(gi{(|ZH@G T#"gCQJc\F,B9sDusaKZE- vpv7(co[YNq|g;V@l89;˂֧Uw`aչuK]&Q]QdNqj#U#jެWt 1+z‵ JGWG un[5C%?3^WAcea/`|8J0<sdMdjRfXȂ/p$E,p'6):\㜀;0?]kgR`,Yʖ51l#ncE}b056dZlLv ^#ؓ?'",=1)G RQRJ2?dT)!( G  侒0e- /j8&iB^Sd:+sч.=|~xهvr.hC\GOJg+&XxWt4er Nh?aaO;A8IAښ <:Pn٩@1*\m1ȭ $e#0&`5V}y¼j8Z(4/-O>cO?l@m# ;>I-÷pCo5 !3{S%T#%/Z*(O :؟>fl/WB^h lo'}"ZH of [LRT4+}obD\+aNz+9̯YZ)r;щaY|TQk-~n"$P hE54rzk A>, _6%$%i05smL4==!ܿz8(Hݧj"`1bWcF; kdPl{OY-%3''("j,ix(eސ60]]rr,lda7/MR1[v;X`?Ϊ)֖~˿,4]wgOWv?ŅT /da_8O`}qG]JBXtWܽUK-xbUu:w&wəP$U "7Џ oe Y3mg%NjpUD ue^t6c(:Nlf&&r{C},}#WFA͓ ?P^(uA+7(ƀ ([0٭ϢѪ?dbÌIE78WķT7Ӽv6rٷ׼ "Ѕ om"EcK24fZ<]@?W95s_mgȌ? auu"Oӣ;;VaAP&_Lxa斝cgf/^ 9S@OjYB۟\Hrܫ/fOT&d`6}19?'o=x6X*_Sk݀FPс5C&ܵJ$eJq&6.;v,()D6RF`P 䌜i;V1 56oV$J'"gw 23S: 2N/y[؉**r~D9O "V?ya%A@xJ*4ƲqV(3W^;,]4n(وaNc9ffU wIKVa_1HpG' _6;ѯ9VmyHĵAHpg[vy}FՃ$b>"Q] VDtNR;:? p 0X\Z O|ߨL5ދ]julvRFb0!]&7)Z.2,"3m08h/釬v2z6-3C# Uۉa*+̼4%_:Uz.ZrFϊ,+ bX (4~@ޞ%Q ˗*>h n{S Űwp.p_ۍFħhk>"RGWZARƂm.,N[d_]]Ő^Gug>D*:hj_8]h۸\]Za:۝kN{ME靌A2a-|qInJM#X|cz X SoIANb@+P_^m"9z;вKR FhVh ΁.MHmApfAd3*Qƶ|]Ŵ I+i+նNÅԦY3&QA{m$,~ԡ[dK$txƆoQecXh\^60? 룸 5w'm&E=]aC[Gŭ_jH~ݱ_f~)k5.|~ M9I|XGˣd7F dđm #"O 694pi7.?!K!/w^S>50ӮU*pQWaK"UĔ|L!" Fr8>`} `YnW;|6n0Q%c"(ye%]eX@Sl(&"0m^נZFdV/ʶ /DQ9VSqqՕE9<@=uJ+)bR|-FASN0kԗ%vKxsr<BCK3M>S%P'RbqyaʄӐ&r/XMi[|0 ]/0 S2I>d=(NZX\wғ+ V# F2^r[*Ž~t]|Vd1)%l\D6N?2TߖQBs%JJK-d"|( S#?ҙOl,[_jx8~!"xe *?;8YD _9/ 4#bSi @{WG8\$ 5e\l+?)@zKVӷfD_|= < xSJKɽϿ3|Ky VH*rq%pcsxxk}ERmj#(pGA읛3Ptx~hyp7vH>Os4qL%4.ʷ*%ڽzz@֏-{%0j~1??;l, UӒX]{CoK>T$C23e+d ^BMFWVzG^d]aol 4X!_IU݆2%W`F/W 6GUd_EN 2&GK-)u73"?9cי緒QüG{1I).&J FP 6 p#~[6X֒9'_u=ېÐF;\C/]z+뿤PQo JʛZCk.B@N Ĝ*i]P f ]g \+|,frmx׷#,`QNj{Q?M3+Y*&Q ܮ0[l?0:bΜq}{icA,?Xf6ݧ\VD!>BFL-Es___ʳm~(Es#/N\穥, ^?1C֧r:سUR>W]l2@ : L}Srㆲ+d^갌¸Qz qDzU5aHCZnR lTG~ݭ }/iu!x(9dqDm` o>zWsbβ {FNf-GP( & c7t"]P2kMK2:D?A..Ђhݿ'۰/lYҿ-){rEa$?Usdүzxȴe|DGӇZ9R9L:U>2'sD:-sV EO1tmldp ; %Uh hF,q؉;)v+J`<H)w43/v E;uɧ,e?X1p*0x+_h,L&;}!{c)=Vk4MГk w xmQ;][3.VPDžY9k,^[aX~%?MQmQ5\HC;Feq˞Pkġ0\FFlɬgjN>C~VRF̎A)ؖ~/3;O#{Q[? VB֪vT5VO$!0lҵ%vv;ggeJOtcennArM, _(f'd00bj{Mb4m- yP/("E&K68))J~{Kr9(qt%qVgLR |2I {[3mۃX֙,Yl错CMulK8|06`?O/D_DV0$+Ö,pEq+ոec.8O&@=3{co~g"ҖmPަq50]Պp^[ vlX:}(@;n1Ȟ:]ןT M; [Y>x%5='}Z ɋw̟S_[b}Jؓ*¼9F4%*HH|XE vȓ,KIqv?1 +l> "TKiK˒)(b^gJK-NlC&G/ (p !EKDF͟Lx3MJ ?gݖyȰ?s13 ]Y̕C niHQG(`'RfDu/+M/J֢B[EZOZh2-uh#`` P7Ff*bkWį)w7.5y`RiLs#>khe+HI B y]sht} h4qY44ɛN=uPM+_isuSlpS|LgQ La̽y{z6ܐ`(~cc2|N*HMyuڌln]!x#Ӽۓ et_uIDM΋;MWԕz}5v0:ѴWG$A7B\e:{WP9v]xeVIQ8= klg귮byhCʶJ`Y}s䙙 d=||`Ijݫ=ܰ0ܦP]IOă~ZojځBokW,nU$2ANSQ:X@"80{M|–/@sCG>d45:nNkz2= _kd*VR:(RG { CLN~G>G^^ ;FÓ~zxs$M}e12r'-I-`өAũ`򙋛38>N竃bfkyopvU+CjP/ԋ_U0)cSz‡MHsQ膖$gQ%΃r)][o5,QAJ7R QZ d^1*IVtШSeޙBg";J IOV ݴ撓J&#A>=nJ~uJ ֳD_FFT㫈n^ӆp\ˢ*]~Az7Y_Eij[Q͉\LF^=ܧG eY]A>,ڛ=П<#,~m.jER:݌YHr%m9X馆8Qؗxfld4A?2 gYK8Z]~bEsavD_7Ќg9΋aե{m e}œ,Va)wgdF{)2R o>5F5T$ -`i1缃2OXF&tҭNJm\\K OTSVYi9`ZY$Vj %7y.`ko.bBe?ʤR/r}ͶvVnXe9^;`ƹ+@9,Z袢vxk !ǵuYyZpd(5vZ*x.H|שQ6[FN=`͠Jl %&ZDz7sUUEy/كX8GHȓwB/x p!{,o~7Dڋ&EB.=Pɞ _D⥇4~p}>jvQ]X~}1e%8zEm'OxlYqP{`<nk=ISsBe[1Er b$#y]~́ʍúLTm,.V4K e~%~6 kb1oRӺ 6~͟DEl *)Z26@~3o( i{ )@d@zhZc>&54BoW[76u>>ZRIQI*!ʤNy@D;.Pّ\%樇]߼]pv'0E >[ᩋ8Ç]2C=$:^hHL~n#rT\fiiOM}Q.(HׇxI R YN1Aa}pvUv&@5i q6Rwy. 70,W:Nh$PjU Rj| ꗨifZhC(t.Fz'w&/rR (l&u9zJ^ڴeنP.Z~5#1#SJ^{T)C@I+d{Vt]$AAQ?l Wwx#bIHMePƒ[?<|Yd;ⵠm2sCHv/Pc+i)Zs5de'WP_UCC GO`bPR_|_'(D[dQ ?c ;#>J_/G˸xl@r%60ǂx>23jƚ&&oꓯ@VS0W*t3KSAL-cl~hNw݀fK'luo_X3[i*W 2@L= !} 4I~] ݼY95CG`qWaƂ Ǔ 6} )_m40ѬSL/`,}il ךYL{ x!x)0:P6-JXaذ\2aʝ.P;f#z{mR$DMr\H5dIrlp3|t5JNT>@)l5 =J6X%Mᝰ 8Ss8"0pnhm܍aP%~xLΟ9S'̟y g#7D=PU#g7 #<.ƏL ؞?1SG)M7#gLۿz{d2.há@`"1sw\̴DȘɎld}e1j{XĴuy l׶ik?:^@:R w"_pNKï횖2#c6;dU|8:l"9^i.SKLEB{Y5WoYH|A(ΰFYD WPy>c1i9W.0kK:;I")jǽr&3O)'XA 4ytJCj v-W~U!bRhe9ng˥G)!#(Cl#L7VKeܟ_(R$yˮ+fôOA=c^р2[&"q}-¹Tf,B ݻ h,pUԍ'kC>:yWb3$꫿v]HBc/Ap Vg-Y`p%5};VU}Y{0d{CO[q]nm&y"+xݠ</ fۢQdc7%z;<ڴ;ٖÉs +=Q\ttʟG#]~]/ˁDb!RDG_o͞ecܟ24ޥ _bYD)?mX´ U|q$JrxUpJ7.?YUmpBsW_zZ3d9hn@w$?1e8·E()8F ۊ!4 G8q-$I#Wŝcx[E"nv ΖscigE֪m4ԅq8K/|N39LA`Mc@1 bVC XHFbV_z=GTR,tqak㝁)lDh-A_wu7|VxVnf`(l[m>W-n<#38o r""4M >ix]!փ]|1sd' y^s{ߞS2υ`ZX'r_R.RkM !5+?;N+QjKb"l!~ĆlR?wp#{{!x0Otꝉ'gAJhuӥ& 7Л$DPsG;R#բ ksEݐU5YEsjOth>{GYu 4 Ueeڸ}FԲ&8t\cCFx|lFƇII͔3_%5z 9:pZC&:-^5)r 0O=fSM$2Ԗ9vzݧ;"YG, 0 h䞨d)Up$#tz/u}ԏvOPuLլJdS]FWlK3J$d<;b?x$it¸ӷD7qD=Z6ӊ Qڇ\^ݳMt$ ;BԌQ<&7 S^K5i"I#w cJ)C|M vQ=*q+}r߆'C_յ4sȟ։ܰ5OTxRO ֶb.'O(⑲= ۮjYZ$Le\d򄸭*L&Ϟ\ &]5e_Xk(|>ƢǑQ)zp+kG`+βYͣqlp(EO^%92#e/wp+Q9k ;0̲WD :*2G&:.,h5gqN(@Л bm\N?#%;iQܰ*!B7=( xإZLɲzv4c#WXv~gk_޶lT"Ҋ"澥m=gzAq({'#@~:u˶(Psk@8.$Tnɻs scNlo)hb$5`ښ+`p08vxMM`$Nfǩ94)0w!) 5,ǚxȰ^_g{s5'(ͅ .q42 -[y:/T ^=q Ayp\n;tL]}h9.Ig[7ls(&z*OoUz/-ގLR2(b_gQ`ɨ;/=e;F͑ǻD} YsjM/8rQ?Rrd+ҡrC6g `>%M1bKT.ɖ<{H5"c6#ll,m' nБ:("VSjCzd oU5͆$s?"sE;~uq(aʬI}򏘉9ySD)K tO8wg8`JvbM("m]pR=.g¬:1/-N2FIM9@nNZ \DQY)^^vrΞ0pcm[0fl>#B)ZXg-땀)o 1,h?ǥ1QYiIe(t",ӛFIA v岟Ch:Ǡ4DlPQΦ'5hsyM:9"K~2{b䄯:Nq5<ӻ$gsq_Ѧ]őd8VR+v $`zV ։sC2T.v^W $5o"_R\(q)3*{qcNkkEfmZSXsp4Ef`?UbO% APC>K0_[@!.%t軹Pg2DMIᆏTK,bѽeke}r%uoBğԉ8W>1$?˽,L{7 l(3RR0 [-- 'E#1!aoAIo@Hj0}. bqzw`?i=D;d`#Y{QpPTda4Ꞣ/܏ |S_Yk9 0U8ѺLP!Yw)ؑAU~Aw݇3`m" L]VWɐեK ִAܺ9zP @rZ+޳Y])կ̝! RyW؉ie㼞r&%-tr +yj2yw Z_DvP`^մbFJ3b1hI:zn//{?l`! Z[KZn$b&Ri\b1}jX6щG@vp`j;B).2ވ2%\`6UR3 dE羉aN"*~czc^&>:N7Ce:P};UTT0&#rh7彲oK5,5F<. _"ev9 ̯=;PKnSl/u/l"f{e o7¬Z0Jx ^2Y D%eIOڭf !a^j !| sDD.F#^l\3 C%LR}1/o` +ݸl$C+nI⚋S2 FQK%}t^-!?xqNPx+*)?nȷӂAEǖGZEi>[/`8ԳRh$I1'*5彦\Qdwu#$"iU#߮ A5罳~6ݨWI#.-qi6 (dSP+/w7r<2SYH>*FK˫䙋gaOŃc <[zeD +OYI>0i3th* jaz~CWyg({hUڮ2{/AID ~-{)@*א'YJW{w{Nߗ)ѨSZ柦ۦζ`7~ nH3c}̫bROW9h = ;i0 xnރ/4X}RLBb]w>,VZ ÉβW*;_2G >[ʞkGֈ j\V7ԍ_rm;JD[O u0kUbcW&:\ 2)P ZmGf6vU"=O)xuU̢&_NҴ DtwSRIL8ĦD#`_2NvsNdOD $8Z YǚWAHvaǗ3R0m ­G4r.o$4#`^~Tdfk圫%3RxX{&=fES=i[y/]a28Yl2\ds\@+"$S>ӫp#obZ=X|T:v$@ELإ1Gy`̧6#:aA1`ɲqZϋZ?2bhgiLkhG(qtR̓ށ̯߄B1׌؀|]J k@TWl 14S'S^ YB3Ǭ^4'ݜLB~zn $xǬ8̎boVn \E)1TMd͍)YP].3YJjO8-6L:|5C`ߔn]PMZ (eM iQqM]5rx_)Yسf ?@lOӛ$H)f3P,.ѭ<3u{ z-5P#fw|f@l[Q ֩te~b}l0!E/hsph*nR:Yf7tMH_yPw#ZMz%0*R7 #[c0to_6io$N]>| wIMk;)\InòcoT<@|Xl9}2QttcRSoݤA‰,,Ax-_>%wb"tefI,[(P9 L^sZ[l8m3'0_aTwpK~d~pUm6E_ji3_2FGFfa)[WB,C*|C GZֹ0oc5$$Y:Sh krl]sԨi]|HTfܒyZT7~W[eQ95;\Emc1{UaApJ[fb6A§¼nkW&R?^(f5]( ~:ǾZך#W) sGI$}Tڒ.XQ~r̪w1<Z@qR*Q1L>K 4^tnrY3A,UL@P78CGw5=E-Dʑo<.TYSrxX3~Úu63zKy1G\k??l>j/v9lxF[ZTiƹ={K,Ȟn]II=΢ {Dr|(S# t p$7YŸCжj\r|J֦mwNtC.q DK?F?(Y&q>3 e>owՊ *?ʌ~o"_6DNhZ9S*BMʸPiGZ 8^8_~oE|Pf 2-UoyvOέ @0#%+nEu%@*XzY`C6Pߢ|Ohnݷ/Jts15؏pj&%`GZL%}_]\+K739:4fs>KD7W{<8& ho|#Z׵!4lөl||5jMpFs}&Puf #>f*9#gcW}֦ F iȨj7Z-\qȐ6ltQ1pTѫ&pUc$ A,ŌTZ,N'+tݸAk n^;-J6%Rѣ#XYeCVI2B="ztM2[YWӋ~WľƀO0D*S*8Y:(ӫOMpE$0}V=6z [Mpf'fwNWA5z,~oeҸ =K4{ UT=2s#t@fL;9^ yԗHdwt*j\T2qMV3$B%Aveg{u*J`vٵa`t%;7ZkULxר 6ا1];84&(Gil/{C'Wʵ:v ɀ :3}alf K(;HFc)@Ql.[oyN}`\@Thf-ͅ>E Tz32FƁP|P6? oVHm96+_7Bxjz}DQb]Yw~#.-ͮߘ_°*4qT ތ䇄8v9Шqgoep|eB\d#u6]]NC;?:^2]z+[{|痰^hG(^OoXz/d"인F@RFu )mR,Ӟ.ɸ"BI^2#pA NEK:r[LăDZ߱[Kt䱿ui=TCd2(<ɫL6竃kxsw> %ȽJ e-nKya3&RyisXĚ+>u\>THwmD1c Rwsً X5m re/)A#'ym "['y$lB&]xI! >(E3T%Ok dV :b`ʕR:FkY(rƺ3f)YOE,K灊~1(K5d۶h jG F邐MGmENh/.|!{ TtbE5\=!;3&#}IT*{붇P_.e漄 V=P%~4t>Í?u}'64Tc:6NxϺCW'v_LRnjiՙ\|"$|ɓeA3vwpV@{#t%ɉ]Ksp4n2OySKOF]3`w;g K`?W 6.2V "@jϝ b$3r[N/`m'Vsoy= [?wanLc\4x tLnzAFݚVkxsp%a}_K [Vl㉘W^>?ψxܰ%/Q|2IT9+F:avDfqSM%Pmg leBJeR0EFa'Wi+԰Eg(PHGeJq̔Q4{]~WC\~DpX򍟃C+nN`~/P3 tU.2`sJ_"vPv. FƎw-لEڏ r#dPC呍z܉Dl2)'8#SFhIUQvpF sfj[jwKRPqN"4Q tG )~Rt0d^"} #'^_?_]! "o3;@ٗL6VK]-K|j f_8 C* )f69B-Pn{Q^E83![}Rj~i5`ֶrHk|!W-F==݉^8gѶ7"^|b@=5 ZŏfXUAgn2"S ż~VtXg)6DZYs3'}xZsmO=LeP} S}x-Y&kuDi&pOjxz|Ĝkxbuq_RM4ۺ"RhəX|IƟHع>WIwo3bA|L dPCܦL" s_[r-lp, Tfʱ>ߜ?~1oGag\l 5N޴А3EixE{۩2.nmA[)u75'҃ld_?95S9Ӻ; WRJ\r;d"0rekz7a$קtKzݧmOunͦ>zJ3P%oyH5(휄N͌xP 8ŁD+,mثrTxm6bq̮r+ Rp)>Ya?QO3 x01UFKg*7;6Ӎ=c3bGEYԢ7j* mnUZwiFhyĚ1cĒ_3AE:Nz4nW+s-Pt3&)Q3ơ~dx^]Ť? ;Vaŭz>=ଷ dPgʗ/BkqSy@r%Qp039lz^Smƽk7hPRtTx%tsP 8 >u)0{@qH:¶ $˒Foaݰ.%꽷 7auD2]q-g j@ @9}nS{e=~۝N(>PhG]#M&ǿv`Y 1 י6|,ƿ;ist3P=d yxi7XDr+Ƃ~tk*~{SCǀӂYi~r𯩊-"]MbZkh$[#AP(#/0O:n9/AFXBBR]}bz܁FȹNΙ K[.e;,y{ZDGGg}8;_9Mӛ5C5Y2}GSv jupw{Ԣ,U4v):S*aC=q"P<tWBchݫg}f)mBgܻ&}%!p~5iu$ɡkG"R#[v">ўv,䣕<炒{>wŬp(ԭqoOm+|EjgKb)1?5ʎ3K$bYbNW$+^*\8 L(!aoq0ъS2m{?YBoK3캧G3LB5Ho ~L?,ETў3z}g͚--ixsR6'ɣ =C׵D4%251U&ݱ.]]gKd쵠kׁMfakn ϴ 2HG=B2,Gܲ2%Ǯ{+kE`lSڷEv?o߽MZL&]LJk Ҹ|RTqṱ :oTREœ7aG4ΜAFsy5sHkg2/)oOeL,V"d‘]{!QL@ M in߽Fʪ3GiJWR$'y|Q~-K̗#Ԕ$xӼreAGNuПu٬xYӠw#>kܒьS=SvZCPY`.ch 4I ُ2&&0[XB-a~v:5k@U8O.YwT_K69I`GL$~o3M I4632nOZW_ro3\Wr.;-4;$h$u:Q>:E0`hQ mϏ3bgպ01H6vҁ$Ӻ82I'N0)~$z{! ֎J4UF hAYzsʝ酏ENɾt cM/|dY=l7ʝwpko-Yk8y.Jb&Wm ?xE/N O>=^QLŕ cJeﳶ6C)E_.0X~4YG 5 z\[6o"ugBF䤱 hgn9 Wfi, -O{ *i]!{li#HYsta .V/3U#RQAqB0cdu,^LNXPaKÐsD(=S׏ZJFK3D?qE~%2T*m0qb[~D",hU o'O*`~JU%s0 Ə!iS R P` 6UpSMp2Onq|Vqň{uXb s'JRFkD^uk0&!YnҌ~h)G̑:?@W~fde)IS)n;&z  3XL?iMUN;'(ϖp8BYόdk濤+ش2=$++ي{-am;#N @riv]g.,XHB0 ʇht`T|P ̀]@V@^9 tXF5+DGRj,HgSSsӯC5e HkKW/k-ᨴl^QY0^F[ [avѺN}.eRVq }>'^fQt Xa]Exrzƴ7P'r#M5f#a zErեuz0Dzy ?+APZF1xFqLKe+Uņ@ HIՈD4^ (`GSQA.8s=N1&p1 77C4#ϒԀO @iW/QKۛ'рFs1ͺ׋œ.vSx<iTxtr=kw.g3JG85$v Z;ʂCh%,` f L@x:nUr c66PВ!J 3]i;J:8VZy'8 g=:|+@2R}˝ R}#q=9ZItCd̏6&Pe( (Q/ p0`y^QCU7+ aK]04l{p525DXp J&ņu@,lc;-L.Ìy䀚 m5ջoex}e6ZP$Euwت d{9Q^qm= rpFx55)RRκc爁RS.Yjx߫ȜQjD`ϯ ͅ}2&NfM9zZ*Zī1KNM1~5~Auꙥt?>q[0׶)Us= mżh_: mYB&HM-/n5 OMVRή18͇ 7kQ׻KTCᰤT}ڂ*.0up[T-Y&}qq0nOLLY X'"_#DcG6߂ 0iPh9tlWڥIv|'U k\#@($/b1O0.;$ gm(m2"~ <)=V=+?Vj9"+S>?1և^0}n*}GO&zacURsu1U.{:g,(_^fK9^/!їPpdo08;݅p G< {DO5 Uy9YX|?bP .rW~F%lo*oh/C5֡(#i XV#RSwD챴k#_YӮnd%V L c"[T"-:П#=o6%4׶eR ?ā&Y`uO7T|aa:pz$Ql|M<:d=uu#Xc!V/~@PYō:N(w &奯hP[a ,7!<=2&"}?C;MX5ێa똂@%W1j$v:es(^zByB}WPN u" 6bSAGc&&jaei-dZV"1A6R}}8Eb.҈zP)(q.a J$NJ*u[ h+Of*jW;X8%x("`cbxcEuopU gb4nи'spΘGf˷ހYa/8-dzܯ$ݑs*36.9K$ &EI@Ǫ ҙTLYRߋ٘N2\=܆S HDG/UDT|n[PuQqShݷt6k)eQu\{na`jV# ʈըh;ɫ>HK>rYIg@RUyhZĠNʻJ{X/`ɱ/c1 .|Se4E<%+DΝe)J~b|Ugܬ3nRǴ] b=v7 | [GppTOW##ZAzr^ë=ich,'Xed|gIbO:¸"N6ɜBz炍DvxBv¦M{ g1td\kHEt&(g¶tMÍ'Z #&^41\Q)WlJW>F~tN} m^={fmYȮ@!XZg\UH!sI2+pL4tVwtد'v/ԇ(Hr'p{Ǵ ׈I p4HMܹnt;K%5q޹7-e9je- 8F<%9b^~r81}?zWŻ Z@įI *|p .C)ȎyufW经v܉44|!Kfɴh)°JC԰}EY"TK6tv6qhYκ@ };g]OTO/m=`&{W5w]MMrـ_ѵtAͩ~2'.@򽡌=]X|_W >"mj9yIۂqH( }GEy(q*brqNi@`n/ ?_)|P`!VJtM2,jz#{_,퓦dA&)<@+'Y vD1]ib6dP Ƀ0,WzO"+~Ֆ!A~,Uo}2TXPl4YZhE~V]90bU44 5OG`}gHC~GSM|';wr\! s>궫rJԅ$;ZBfc&iSM!z͞zsJ#]Q .jC a23N"_L((gՊz ~ ~1-cTN8xX[WJ#~fm׼K?麄h OgQG>:eWn3=g$]8)X@V% VX0x@U\pllO_gv+!ۂ*) ^2bpD2!a=nDS/E'b l5%bK('Um539;>61Y038q?tM)'xp<`Z> wgڃK/)6Pm]nN:5[-FWnB72چD*͋y7F[;G3mz&:_䆩|T6һ.$P94{,^p&@t~K0EC)N,0c}K|cNqIq[J~^(jQ(:XjB~'MSzR,Ch/ % GZ9}LCBa>u|kpo͹u1Ɛp鎴J0A>*;[}7-)VRI\=3;/d-.o)T, lDeId0~s & a@ܪJB|o߈!zݛ3 /`V T bj|;cf3P&E)+we+ J6v1|Sˊw{VJ!k5ol|nGΰ-Wk0?ig_#XU;vrDZj'C' < &ľF TݿERasjUb0O4zKN`ЪCvidnBmWQ>9DߨWoư[H78_Gq|Dn3yD$*riۓaڒbf1 ^r׬tӅ\:2BaҁdXp\+=U|RfbDubY^&kiU(Fr~CMo-+_ WD{z\3Tf;VLO+CoSCQ Nb@)O^ jnZIlEL!k?:--J}Mn 0+$;]Ph8kaN^ % f,%R%nzFgt!0k(Roq,v.S"OɯJv5C^@[1)@ hdZ60o c7YSj \l@NJHZVv6zh.=D]MxW(wV̡uh/ғD[+cHúld1߉S5YKԹ}$(^EPVz]w;8 7Y7Hܛ?(*wqn?Ol u.r=jj獫j A3Xd~ozlRѾ1c=k%݇fd$uAca -$2PBPJ\\΅=\yQMK:j(a7pdҞ$>T2Z&w~8.CKd:^UiKFrzV7^=o1!bŮsn']/VxU|,)JΎF$Kb1bҀS| lҶec6U$f-ݖAKJԯ>I <.[=3A,]*VG^҂x̩i8lF.fQC@_,0XcB7;)ZNPzL }_LIݪܺ~_ 1K@[5QpY%I?;*yJvJ&[8A˅n!8קjn>ͺ v'l!nMcX-.F+4-sЅYHa?$=c@3`.K, h]yހ,/t:}_#xza5խ}98Aa旹Ècp5.̐<թA_eu 5X|$5-$As"+\];"13H)9gza:%ؖ(m{&2{Ry^'_༆dvxRMoWՓG EL>{kk dePdanw}(̮bXP@ .\ܟy:-輂j rUs$ i8zrr-f&$]ڌmj aE@@g!O,̐SMOJY/eGerKN#TJv?kU!B&gW`p0꘥fbu HB2jczFaZ59,#(D="bngyD_jݙ}.\ } ju\yXlwwD:uϽ}+ŰCCy/`4h>.nqLp?x*!hg2h.bEԝT(xzBK08~ BKkTq~I YǸta'^ v+Vvӏ-\X}z2$5"z5.{bby &?"6e@x+4\{lԢo?CnȳyN;^OG?&k~.qk^qu7+&G6#qiF$q9.}|gSךYky)[%,˻L&QZ{#OsrS}d#HA# Q ]QF; bW`SҶHMo!4 o uL| #|,:6ߞϑR7Ams"dǮV\$Ag$[P]#E-y-qLSMGB[ч90QȦTޥ{Ⴞ)+9B*&Gfě֠V[oז,жo>]T=U3倭VpB~jT;#GOMhSgHHC,I΍j2pR_DmO ӀIY˧% -+Pg?q.=ѳ N}{^ J,}"5ZeљFj./LtYMa`[{pU]B(Y~f5Qn@I0?(G ˻I߉#rX1Ć݅WSߚƢdYo/kOT.st$xX-4[>4c]=dgb*⺔~k$;,Ƽ)aڜӿ`dԨWYU=z#3w`p"y q =D]5 *k %v(Y'h~r9DGu%ߙZ oDR9X-S!3&mPf,`=o:6:4l hzVCgw^6%:JS#A Pjmwmf~wW]W:̈́xvuׁ+FEtƁ^gUGa >-%Xmxŀ,_sA;؃d%'6sX flt` tTB)F4̿>.@6PBf90|jAEVf0YTp`I1\LL0eoJTq:A-qm4`#8Y*꥕O1en$/2 5/xR)2BZ4@V036+u J́htqoʵ9i~__i|$%3bӞ:m(pzzxpmJI{]VlϏҡ|BGFn.9J1P^\ Tg*ǯgu>]|,x T%3eₗD93<^JhzT\J<.->L)S49PƬSsK AmGɸ\u^Xd|s6G8Ek5+|向;y@(6Q:PL 0Gc+X\O#/*(ދ 5Wbۈ3 cy$am-Zd VPʙF5 Q9A nIŽ]Ȟ1>BU !"f} q>o('1+i^TT1 p}f[[&ݖ 5ED쪛вY]/43q ]0(Bb6dj[vzTRS.X]cnTщ:r&FrsU\%l\e2T7ȴۧicIc"Vqm%_:F;!܅CbKib-x1F]J6)O_uÜӾ_q0v:B~ oVYwRb1ha c#ù]pr38X+`_R$3OWЯv4d,[=&Xcm\ [n9Wq0О843-I@Ѯŵy&ҁ)C6U܇Տ1t|ˉ ̹rJ YJ2k7oCm d9uU|CzP-0昣V;qD.WT {p\t'6w5Jkb}8]/ܷxnϭǿTA8W]٠stedvШ1PAm} goQ*xt;*|(=Ƭ(1j.Ϊ&_208 i?Re*3e?!39Z`wJm[롡.#_pP&Pz ׂ1$\dnO'mB[^g.kY _hASzsf|ԮKW7fb?h| G/o@ڃ:uN*/D`G%F* ,fvk@fe5)?YW} 0 _ |Q = ؟#ϥ+A-EdC] ;0~Z ^cM`'hu? E`t]hSn!򑅱x7SgS'Q'Z3d)|rם)G$-! iY-bbTKMqbq7CL'{KcDzHHzfb"|yl<кmxMF_/ +vu]Wx ,껱,?I`#0]㴛q7d2r~"ߘ fEA(uzqǛ y0=vhVg2w'GUUnvz9?мjgV(}3_%tnTO2\}MfQC ptټʘo8g Ť CE9< ȸT1`q#]?FSP~审<"l>_Ny甂Wᐝ ~EpVB"cP)Gɫ!pZ&-AuiWhN!z^E@:yJ7rq<>3 s~l}>묹ޮ!$Ct~sScs7yJ*)]0'[ۧ Gtlʦuw^D)Jy%]=)[=ɺܶ=stfD8?bͣ6j"ȍwEH*R Āwv0xs۾?K^ v Jk\W Z9n~Qf0}s @jX+&apq]ׅ鰲am*jL?haч[_< Lie&7E*mVH۸Su@rA Ynzg%BxApC)1XDab?lCkb/ټXi&-=Mt29P>R|/.DF "t& &FmiB6hN6-s[ NSݝ!vㇼ逘_}`&Zt>s8|0}{-50*=zDYz$ 5n+Z̈́Z|fw דG_ȞrvH%})AI̻+i2\jG%SJ旹ry $n >B] IlaEtS~@WgY+GrN=}?n.aV{שԕl̾u;Tj-0(W>I(Q4yrk*zR\bqRu/ߴ?*V9sd4SdYZHKW JA3[N?bу[ @\(ehR{ }6DM7ZPΘKrMLAǥGu򈤑ƉǫUDc2[[j\֒36sC|4wH!'ϫ^zY^gjNYaj lxs|XajhfNl8]RBʽ uO-LAtX7O)}Kȟv'_j2KEpm+ԐIE56q)z u\Oϥ9|~. t%lʢQ}\AE2g 4Aѻ1iI>Y$sw#r1%q;51TY V(q{R8h4xV,0kyRW &5G>cyWkc7Οage:dpIJ˻I_W+7 -Qdaޱcxh74f:cUF=b-ΐ(@m?X^EhfwtA099!j X*;-]2>v'Ϧi:oiiJ%Y JM1OH76ԫ~uߜmڥg_v%Vԏ![Qߔ1h*>7v# ˜]bSR=MAEmpSY^O/YxLw,4,xx|[9k=MI2o[_C6hsD{+NZ jjiOtf*XSOҍnm 6I]0s>R?jF:jqf<9H] T FĴIVTZBr|m{Hr1M iXM\ͮۛ#q;|X़b&tiSA)Y>h6دYuPu7wWҌr|8ߏOhn`Bsn|Pk/]Mzrɥy-1kInw0fjyes7=60Pg!ѹD2m fy{imW$dDaheVxH? m<oVdUx䉅:Ju!Ĺ9~^rgtJ,U8˚0EEH$p m|r۸Ա*CF.]sWjM?Msm(R<&A]`2XDo1He+3]g)q5UC`pucdj5zݒpi?*afX`4(6fhvrIej7L_BmOl !ˬqm;jl7|ʅb3P;6~xty,+sUػ%ݕA9`ik sFREq0,:H1FKG{dߕy(#nK&)P#yoϻ#feu WXNFgК.m 0RgGjO\E(8lvԼE5ݦdP#^UmfBR;7r\QeK5v GvٚyQSwBrI\px] .3K(Hz758 H{L!7T=Z1&)ZJ`yuCdƑT)t?k |&"4YY&鬜R!Qxw|[ ]C[l0QUrYzSѧbCˈrMe:;T%wc$qujy8/ Rk(>rPsmyu}׊jD?7cr/W٦-n*cLc0-^/2 :֖f`ct T6 D5cQ; n Y^IL*Sg gKb s03mՉlX& ^ LD5m5 P&°;Z F LLiK:)okZZ9n ?F^s|2J2:r!e3R l /`/נh8^#2LvC#*ûmjX\٣XF#)'RݾGޭȸvoǼFGB{Xeߥv 1˅@8)ѣVM/>U泦Tk~fI`.& AP2NH Rtmc Mדy^dc{tpeTж]׈,y_llyWWo2!&D#-.s +@\p%i ]f˪U^o [=]c@x3whxV(%Oc+[n ts.)Gg|m}0F7wiUn4#|qk60Pl^R,F;IKbY,=H"@r?(Le`XQddEYnKN,~s7|GP:H V?򳻀95g;qŃ$f{n>hf7G?Y~g2TjE7~|EdB%s\0ah^VhoҀ%?+r2{XpF/45ZR7mu:p~7gN޻/Yytzroҳ#ʊ_ј* -}΄^Ӕ xxDd r?JNMz孧v{(fbU`$2ʋN4ta :C"F:;V$hen;Mi 3++!,pao7( HW!{LF!Jׄm~LuECRe RPb7o!69L0ì{ 996dzU[2T)Lm3ƿ Q`?gQkGY+gE~B;&,;Jch ͩ|G;԰B#(;ք)gG1R_MYB}}o b80ʬa~ʉy#fiFPM |xj+MOBF]P"4~J:#HDB7@ hlY:yyD=`\ױ~̄*ORpsf ҥy9Vcp-pH:zL붦ˮpM|h34}1'<MWrK.oB_>]=AT̯#F~cmXr/(Sp QS F3j䜐q #gijO=l""N; +/3eҊwWy[!.UuN{m$`-ldM%\jrr2Oc9 hLRɗJ)ZP"e<g8Cg}YXKxQlum{A<ʝbݎ_)Hy $m9G 7K˙sC }ě"uOlU)l*@QCH1v!+d ջֲ!Gb"~?ɲ8 zL >XmoR}t!d`kFu-R\5̬+Fl"9[ޘV2oy5^hKt9P H o#jԬUsFPq3P`Q/ V=Ew!%%@8oXq=/}!p"nTɂp9 5ҿhS-}thwm_욕"I]^fDԼN 0v}~`˼~v7>*N95$SH`r fPfj.68DY@{ \ǩ4z{JcDElK Qʻ9 h[][ē"ӈ, qDQR d .{Z>G4qYXlC"\1OŖ[777$Nq t]m<΀eHX]%6i3g|XJl6@M KGWpQU^q{4qt-WVPĿD-أgVxh16(QZ_|1';/ Ȃ J ,Kepحdy'AfתD_R ݍ+K2o* +ta_[fHuKL<4V䜴ЬғO"h)(E{ZOLޞ)cH,7USc6oDvw>`^&bK Bڂ_` ,Uk&"qB]g*K/1,# s}p$x)#0~E5[XNrAMH ( `5*mda{_dشǩHLƽC%B7Ϛx7}%qA kX;#XlȆ텅i5a#~AwI6q9fqwuɷ]EgDD}s-K`\kLՠa2nP Z+ߑL l݇v}{95zμYg%6PL|~F4s_Y̵#]@,wDZ Y)YmZ^ʉTËFg/85y+jPP' ?S#Gg&/_AZ©wKV2>vp͝A6)!z?|5 ")nQ6<}'%K"/.tt[p60 a[-!_ z ƖN{+[MdP6izAŚm+C=3 Q|+\CytNݿ S/GDtH[ s.70K;ڹ,M}76,AgG9?Z:h֒a.|MQ`(7Lr$j_ˬ 9<ݮj{/ l2Vw@GBM6_dW4ZwÀbS6,Z&VIbZ|7zk-#B.P^[*TrfXY Wev+f) v='2%OlFwAP/%m]D޳kHT? >FX zE{BB2b-DD⑭d^9ЋK#( PWC*ALn"e-N;%.ߔl l5V 0Cﳑ2 ?F5[}+Q)JGɗͱ#-4LFQm'mWHeM&/D_Z)bpTyLpDdk"ޔepdIP'1+f S{bpIgٵ[kLq@L{Pff(NjY`aA &[ivK#e;+@sqyQEr<}EѻMJYxmpe 95ojb>Df,9t!|UtܗA o~VKxqf7k8616|)ŦB7qw͆kFSusS~~jB D}3dQ(>2}cCs D,$ٲ\ K3HLТ) B\J<T8NCJu#:͆FJ'"gr52WM`"r+3,Dʮ /%J1r<&LeHt# #v` . ,Ya-U Rɫ[$Lqc-suϟ>T[#v̂uxdKHc٨:4D1_r. 6.a辵y%~OԠP}:F" 8)H+y-agKqJw~hV]< FTCPmT~~UqwzXҘzLgh禺w@H`!-4ޓ^b\:ݢxk2/#3 U1vGMbXn3N xadr,\mia ˆ*k*֭R0ZHoIj>m'=2Gc0=N䠜͘| '[PoGI Ri򪹗-Hu'̋_5n͌oa>:6恍n')#£_Q(r$G[Q%eG9x8;-dؕ [-RnPȀ໩PUI-;PmoyvoD`ubjW8Qmzʪ~ل Wz_J){uN~UނHTdf"9?dTAA45- Ef2Cj @P{WbG7hhr=@HToa0Gi5/tmMokٮr9kUAF"k*} ]S[<Ċx\mRG+M)P I5G CZ&`5eVzIX\4r4# -;Q?<i&ֶU5[GGdTIa~FmcJȮz9t 4G˹ =;m^]ዖ۴LV@wDoE&}J-(ZjȠHģϞ}ghANLk&3*K"!nZ%Nd{Uȕs6P{|-Za]9\vDqu„dXX68 ~VųYpxȼAc"!Ύz; #?#d J$1j!qRB luSR/ýޗlLs%s5> !%,/YU_*)K*%j?[H EՇ PmΰT/q)p[gLe-SFYWi0._傏 @0LP_7OYU˓^RN5{o5;c>B(40-lj{:߆h3t نF=Qͅ E$㤪uVܤ~ޱHX %ADt"~EWVBSrsT ~NE)cJ:+D8P\9 Dz#jJsg-߃wʚ I1 XLjqpN! [ϼ]lyjz#DG={AV*턠Җ͜Rئ?::~]+/CwR=k>:4Z“$:0Ln5儱O'=4R+ +,$o0d"&$(jF s]t\Td dGQ Dh# !Z7/bVԓP~Ț&Ih꽑֪bU_-(-O:hdGiDع/ 3uk@!DY@ :ˠW͂K#Q^:.j]_jn9l3].}vBiGQP[G?rJuPw/Ұ#qNZ›^`n3ۘz!X2Ȑ:DI/^= f6F -p}&`A+8OA:'Rb0Euu\OVmWXw9oEn+4;O?eO,U`FJN$:ybJ9@LlWWG ۜL#jhKi-yq0c,nga/  9=u]% G(]qhސNv{dK^yz_잢Dx|lڭdHR`"Z3$q< *e?bs' zFugAŒVb qeO)-I :k{@}Ah׊nj:Le20:Ŵ (Y'K!Q)9bm\3 W;Ⱥlǫi2Oa0qAxyʘJnlBHv VgU.t~?6f=4MOg^; ҥ?@!Q:u%4w~gl gk1Ҹ&8mAݪJ 3{TROМ `T@Z̼i[5;@B;;VQM<P1Uխ{ˊWrX1} ]'&̣z3%EtLP$:@,aCE[::)IE0MkTgOfi/1FݓEq(։;ݙTR@~#{{ VVG # {hqn5]-%N10f}SOXI~zzH Vbzn+S\)bq]X\!8=ҕ 9W̩nz3?a2#*nlQ!J b0QC=iCN/3_?1/mȟڔ.=<ڈdCr. X"FY3!b%jl f+"@5(.] I38ل d)Cɉf;0U;rzp1A9t! -j\LsCo$TVg_(rUv~Hk+ y==]f ]m0p7](lSǞqDOٱZĿ-]NYk"t6V#&Z(z$OK[7 )""i$:ĦT[?h}I ejf!_\q˳DgG۸.l]K}g6 *,hI0S\+{/)kzamI 9Q q ;7CK-\ sIIL{ExW5X:fխ?=Ź0{3WO4Cl\Y"*%{j! ,eBDX$|pS5BO34zZ3yu8׭8Gqه HNoN.9=e zz[F|$ DA ¶.fI ;vyun>&dQU=d6PB@F=P*Z>뿏 hH.y{6yT_eS%*'}& ?BGlq=.6"YQN牶vB];S((lrԤПadVtw]xNm^pJx_[7BjZ5ŽUyQwQ9A B&@7jk'4Vυ8͊"ɏt/ C2-줬K 131oĠts#JT#0Y)dOŢR<)π"C>ρ8H%E2-+eY_D Q'º<{Xc# ]VWD1߳ߑsa1 J~"]X@EYqY9ލ)k 835>RPxcfV[as@ oɀ Cg*j^,'r9QR% h뻂j\XC_σOG7', @GgDH`[ ' a.}{!Ih.=_4aR  d}X!R.q[m/o7$CIu [n-K 22LLaAauؿ{8ZYn&EGk4F|`Ou2PM/HVA_/ލkDtI?rApIwla`@u:5y ry;7SC,k.Ig B ?cd;SYCUh݈'PO@x|NnX;V!,x랲 'c{Q%p[~RWte@х qo ͓&萭[)m.\pP"XzsUrU`D2 _2M,X[|vEH-ߴ=ЬZXB1Xy44ނIz$ {/1-E}q izpTdP:ek 泓]xtx@ypoEd{/Wm>{>GŠ[vt \ÉZL[PuYU1W _Ds}Ѣx+ƎIF)C; tG|Qv)O&>.UNZizl֌J6 u!iHa4{:9v6IP1 G[\Be&3vJ_/=eK*7krlƵb~ s |9uJN`(=Id)c}P܅3$Wls5S8eVP)jU(esЌ&.~,!,$o2玴 /K1lIt7ۄozc'\'$q&DǩwZ2P~>[<I(#t3u*= )<|<Rs6O<&J3WP),&˃Rp-skPL #Fڌxp>//8~Ol?1;fSáq4c%AaDIo G.T?Y!د!|2~:I(#`.&PI4m h])ܣ t(muX:Jd')'Kћo.~36RAsT5  2oks3k6k;J7hr0&QHN]L]^)f <`~8J ԧL,V`"V9]j=vHŻt6ɹTtTr bGa]=, th1eIDa8P#{}.rTnDN;  y6j^ Q s#{59jK R8!4x(+N!Uﺌ\1>fqDU (KrVӮS7amU >*5ǒ۰&r:>Qp%b2峹c vre *v{$u À<eMgҩ2J4G)G,'BڠSp"സZ^ckHM`9\LuN6ȑaMUy_V>>#A~/'u/Cؘp.a#LGcM7W՗{͹:&h=t_'{_ϲŀ;gT ^ :.Oc-!dN$ᲇ&R k)ՙu8Qt'sK)ۊ68찵сD,0T00+{SnW$(;A<,y.Y2yzJ[| ]j>a#ilTV@uP:xa+vC0uQDf=dM|%c"%RJ(^g$F}^\ѨbͲMaru[v"X퉢RnCV[kaN{}6bL` RHC"M'93=]\E;iɵ7y*$ɶA|>˰C<&.|' TIQ¬tg%q呁ܘ98'kG9\/VK' *ATʃk\l5`;iRDmzj>"(&Oغ/W)XSMD 9,b𑖴P["P ae1i`j>f8Lz\DI!hXTm[m9[Mhà Ι j x^]̑OmyaWߦVIawKWfGkxzjc q RlFO-1M+7- OǃҊϮ3?b,OO&nFLkSkar )IrHmkIj\SALRTK4tV/ް^2+dl' pq, \` 8#=3 @Ѡ i;d%jǯ\VL e+` :\FC eWg,8qEA\Zl[f sWqп2|Rqu>fLl2&u%`-IA8,#ⶄWuCYS}Hwf 1"4i!q acṤOd]pZ'`j3=AJ蘼 /}gh9{(* |- 4[S>|]YL-a's靏%8EAރ mP xlg"~aG#,wۃ XM>t)}vSgxJ}/^6,v{9m7+E) yg-S lru#D NW-k~hh"Zp4b2C  ; fj2LKIYP28'Ͱ]a 3|Uv>6;!쯑iBc{W>2I }6C)La9eO&%sq2psAR|C}XlЊP " nb]=|]_jtX;iC`e'TBOB;8$TVwS-ng [qힿxBѧY/ &Fn3 Q&*Xd^Mʧ W5q UR5tuqZ)L(p4)i!Uz .ٍ\5!wૐaC E/HxȠkXZg6lwA/+iXOG9 vJ^uӠde:6z8WW] w %"& j#ǂzsO{SEOc Gw*{X` CZ$5$_i}%Έ0"V&DJkGo 0j't:4>Ca4 &@P?Ng#`PZ:o5xb ~>$  >tri"(dG9`gZuwjq@|/]u߆mT{ ى]oT"e_ѭpG%Z~&$*Yo~a:$zp×Pe(#3Hsoٖ2R(BZ7\<`/VǂX&12-"}W-<4SKG0ѕ,xE QfACGyX7EAB_51G37;ʞ2TdRzlA|g0 6}3d>EuV)@Sb$pFn|Iު eg;Q>ç$#",Xp/K LDēVNʀ4 ƈ!tPT4.z,Ju(%?A<*!0ZaB0H 5J!Q]A__|lq_D O8|R8V.+> F'4̠X@4%|*īW^>&.Mgګ(P 4׉x+9,0K",7bQ<1ĬbZ<'y7##.qD٠'ZO +Mv^F=gJR`ڱD0C\wD:aAq4c?+>SĨă6aA8G} XǛ${N-"<ψ)B|=XG~5It5 a꓀UO>9rOG |x,`@!7l\t@Ҿ^ ؠ@=k48I! oʊLdFNsg5R\j8[HO嗥UQQ>?# 0 X11VA"D8K4^sBž< O##a3bt젔w &i8·7E9WZR2⬳B@E`ۅ9(3EyQwSbK3@ odt0A >\2Z ڲIVH ׮\qW\ +Cew4[B .- Z6\[PUɧ5d1ʡ0a'ZnMK^R+v`"&e,hc !yrZ}xum;]6 јc=| <_!G{Qm̐;RM υ(BVAî Ҁ.iNb4q6Br AƒE,ڎ2 i@Az̭opn{Jc"@1\P$|ou Tu$7=|MVg(R/fet*&FueF4$R4m/E`jFainovqܻ)\Y+#͍0Dkۋ\8 ]Aܐg^NH eO'͙TGǕҽ'`Q`6e}VLQOY x ĹSЪw'd:qJ{FGm ȅ_JKIӎ\n[;h뾿 d\^Lr╡@kvG7ʼuŰ,.XĿt9YFHR$I#0+PL=R9 Љ(5K؏֞~FNv.d pk o_K.^ɘX?C!9H#S>KOX42j2,<>K|&|q l)F9S6֍)L\7>dxd:EZKή@|boV j5HX ґA~3;ki6vW>ˍ7ܝ{!NM2sOXRC@Ш*($$?xR%=$FKeRlp>DUÛv.ccI^)T$PG-qN'4fiEU=rh [|B%,GjB9Nx}87iz1XИsoS#Mh ܶp6R/ 0X"=a#qڌUc"Tᥥ4#]pOl4OaDUB^ZX`YzžhH@ ͵N=(3y1>w"dH2RҌӳ"#`\u^TwR{THP 0, K3SXCl80Hitŗa)T6l׊GP27>-QR` [r(H0m-_?ҎV%h_9>JjƛK7` ^8Ť Vn!1`7BHq* |?> %h*oAih_ܵSͿHŠݽ<,POsC($$C'qh.| h Qmc9'>^yiFn:wmh8䕀bl(E=v%@(Tweӡc10@#?q5c)9}AR{^R aaU4!bp]v,"N͚Ϩ''V',xfS}(y:fL.ٓPq]1LN\3oQ4bk- `uR|DZX=hAX};xo.peU U1 Wk3^=wf惙},Y{q܁!AZ8–0z(Ʉx`Tii#$ [[.nj 6*erX-C*CECMO wbY0m}r8z5$V/v:@@jm8 2hecI9@W0(v'`ZkqM*p G4 eqDUW_~5ʼn/r`ZX~"qbk;P}q3;+p:/\'d=ĔVJ֔X&,-h B-gt<ىZaQ3G BRpRXLA(o "fvL ͹bn ,~ d"[wJg<#}PTb$ 2獩j=tB8us>cN6F`1UE 7/3O&>u!?qL!`/p_Ҵ1'N4F2Jp 'ׅCxHl\.>[?B(Ed4H kv 6MaJB x}허<"ci"Rkxd}$h>zSWK1G;W=:@AШ@^vDIF zd4 [b4pe"Fv0CT>3Ν]VAlk{gDfsdžRۥgvs,+\.řԓ^NX5q)QL5+5K^i fN`;?@`ϊvQ}{M}\{Ï}޳{FJeP%2^%3AY |4sڳ|'Q X]~}>%߈ݳ!K[vAH:q?HdJ/J8?"LVj.ͷmT-$1ߩ!Be`-hfns4zlk3 f XJОΕ~s !N4zDm>rD#Dž''% ' `M FnlwRHx8 3 &s-3HDW9ө u5L>tn?Gm)"Q#7Wz~ ݖ`# (q|'(dzP)찜ШZ@CplEkP2<1ZBY@E3A&Ǝ{e M,wGO\zNgY)N<EmMf%Uaza Atg9#\2Iư~  v4ӥrܹL[Ix⌉jR4AZJN,^pj@6x|/:3C?OTscŶU{H<1%fR `C)dpk0,CʓX(ʕ䋪+$,*Cq(>fX3_ fr=IƺjRI-/~;렅@VГD]3ʏ@V޼00tVu` o|K꒯/= :x6Ljf3[#mz@(O[@<*9vv rTF9OR2 F!?NfUpERXm>\vR0LhIgh%h=[La"h G9|Jh<Ļܩ'82b&$l] rS +')o^*^h|/M 5g;WT< A#2M nx |V@{`? CԒYxZQp) I)O ioo%IQi:dls&9.ضgÊ("+_@I@+c^d򏾎X-|Ab+TǼzʐS 70yGڮfXߩa@O` OXl; Co F\0ڕbL!N3R5>RߡA,¡LE~uB#l S)`#0@Jǃv`{ O EjeOo^@mOed睏Qj.:dlUSKL*/1uj-VD]k_v{s9B3xTOX֔n!ho c"" O5x=M _ qvT1MePu Eg[F/]-~R%ƫ* jt ࿬A1'μD}ʪO{pLƼl{NxKAhܚk@K *`Rhk@<(N0U6fXRʎJ C#9DƠssL)~,2  vPZ;mV"IMw(o XäCa]Vgjݭx6\cˋ ^̊ LMKL"xNW;GY݀˪hj=pDPv(;yhm):96穘;`uW%rfyUA}@f`M"JSv;fEdwj|0N[ጤ TiW~/3"Kp NH +"G+n'84T`8[-[`>BE€#p= hِ+V a4oW-V Eh5!ͫm , 7t=kl>K^"i@G^,5@8S\,=`,W&uH v]RѶY͛+81XA"AO$@+A,WZs H3;o&ւGiY ej<rzO7("I&qZGoy 7i%L8Φ;Ty{CHP)Ë3-κx5QO9iz Ъ?R;`?Sv̦Z|B X&3l64X'AA_ٺ,⧍y?퐨w[8L)N$tZ|v}}*^ i$`'&ybE>m#Jڝ(1J[V$G2iB+G{px/i-#_ uNVTi|9K r+5*wELMZF`a =[m gWqSv7ǭ̮RD5 (+.,KQBz}(CpծZX;0yt)]l6|usܨf:/Gx­e+򫯭RSجlZtAxJNKB!Xxsteh&d*xt L)R`v}lP p,Dg?}@_b,3$m_GGAGWA0~`XPNA$pf\v;`X_> XnC:2)%0;#=кIA#m7(! 6mE!/O|S$ |뢴B$iq]O F hB ݥ*p0l[^ [w>B̟ܛ[z3*C@a "k B̾uF\U 8#PqNuF^5b!PW!*^(\oB_LsqY&?;Q 1caS|:t j()ڐ!H,LnO&pp"v[r{RJ! *tzfc>&JD%0EHox':2F[1l9`;ひpWw:ᬡp,?f&V`?": 1fY:Yl냯P;JP<t{=+şX2; uTtR."`q9Jt` ؈q8E҃%z|b4ʤڊ vvB8ϴ9$l.@mbDB‡w5Vd VYτ}ps( G/XP@LȔ;T,^97+d9>&v@b)#yb Y%kn(xzXa ~_yfvp#ɚȽhJ;4U8QDTM1;#BE5o7(0`#exk;P/$B[|0x0#-[BdsQ& sJD OXɊ,e_̂C/I|ug-4zVOIxjj}r_5 Z\N"9s)@Ѽno̥gۇb]1m<>HI vxlɆ_&T(U(6.x`/if 7/ ]uZ|`FAp;B₢<\RWq\ 7TC9apAGP83{Y^?vˮJyQLh8`w 0{}>Ȗ61t'P0&r0!aDx}jN|$Ca'+SMg.̒EW cn))/E9Tz'{zSs'lO&P~mc…<盬 7wh0K@`࿤mf.Ak-දL3mXl .@ IS"(m8] B5m1P/捶ƉJ Jז>v ȋ2jR__R-7v(x-U)ߗ ѻ˹`W,Jn<[OsBVfZ;;ښFKOXB@?H7!)c 2<{\@ݮ6䳰Z,c lbsp۴ᕨQc-#F}O; Ḻ8KY㮅a} fy" \ǏVX}ם{ PS3\81 uW>$ttDf%sJ% z? X64H=) K@4հ''@LIx>Ȱ`O$ SgR7XzG wnGUP Y&˨I`D]v ϵ?!2X2dA3'iR'tX14-/Y:._r|Q Uhد57>CY>>dK!}Sga`AkK `)1V!e%{ij`@@PG_Iq&*(qlB3i;XΪ X\ªQ>Q UZ toѤF/Y d@`42Q8wq .T\`xQ\@ u\R  bi\uze,7;Q>ee>֟~h6EOx5i|Cbw}Wt2mw[YC!}f1~%b^_i%u:>ơꌎs7f  r$KF VIA"nG ُh7"qG#]Q`GJ`m_׮ p6&)iRjN~R%0^^5M P#A߁SĜg+>L8; zH`.3Ž? unޱʷPy &ol-213T-ho` 4 jz!WGn0g`҇+@`B/JvuJ λ{O2Gp)~ pޖZ8l\4.M:_^T0 W@_4 ߾fg1L)]&βy]~^.OAx6+nD s,Y^gS^,$K5-LY`w_6sP ݁o[,)G $_&v//8 5B{?\N =H0V1XwmLDq_DžLƒvN[k)N{Yʁ;ìo8=}`P/m8zK ݃lpPIA}= KGy~/sW>@󙌎/c{V $r:ԭsRP+1bkA]4Γ@@ HHݻ5"6Sly P/d]mZѰGnyPf 蘠L 1E꥗@(FX׫?PY)Bgr~M{c5,As=9ICi;*0@wŪ O:2,`p줚5%m8uQX~i3) ՙTvQ ԒN$H"+")x#Jq$T20!mkƍ L fn"UMʎL0ӆ')OSu>3fV 8v YAY@`5R|ް}➿ 8+"@v `(*@k{a|jLMeY4۵Zr`$/HOɚR>tΣQmu >M2T*~ʛhնh} U/鍝GS̲(n9eVڥ*<2 %1jQ֠\Gw͗Y@:if 㾹7;rG:j!-?>EN>G3-AkV'0oUA(\'?7k ̚tqܴ+n&ŸUeEf_Vl*z=.Z9B8:[wͨJ+)bfp"RpGhه["MҲ!a`W y%@?K Yt}YXTBs]J,hl)ǚKj& O4MrD<|f7h=Dn{F['|YģzY}p7U2YL< X n Xtv7.܀ db"@w:|k{= /qA0/;Z" 3Sv\c7Йl?VQr24/ 6 ⢃#fT L@ހ Swc1:.o:VF }  2 $f^^%a H0l4~ <58 9{пTy,WCUyj 0~(LfA3. SHrScGZ{~3)ªۛ6jeIAPr͂|Sjr RtZסfp4T0HEtx)\yI>4GW2ʧwt9W줽9'&L;I8_ f\~$Lr\{ s%''Lh/zt?Cd'P}l*9ċ<% &B7- o2'\Yyo #Mz!4Fms<) !6Vu><%C \@ Iu9'~`.[ >yp(GqqTϚi= izp]ٙǣ'+ÃypahJa=k3GYy3fU.Rp~ů0@)GྤPw[Y)ٕAw =qOY.z ].z,_PQE6Oݖ{汘1({NYqv~le-r(@(SzNSuvY~4Wqkq]{8r5EGKG; f~$VWoFw77Oifv*?%/rosL0 y|N~Q7MJOoV1aUnzE1+<! w`^AM{0He? O-{.vd3=K߼;ڷ$^?,Pv\lQus5UYf70"tׄh X[0p1U}n,2wd.ܗ^dٹ_Utϛ8x]%}1m5<D[aR]nU + Y6frB5AVqoD{@ C/u^`t“܉[(QLEUt?vzـUd h? ^J ).,A4K4JMB@2W j㛗=%dY`fN۱l2EG ">gp"Egc[]jf]l^4^8=N`բg苁u%˽&aǏ ̯D8 7K`d^ z{1z/&v_u4-Sxօa =XyNrgd{8Sq^',ױ~M|]^TkΡw5߈1> mD8ppdڧxv4O&D1IJIK F]1jnO-X t +5 p 8"}3TSA.@]0~t6~ƙ2̡Nkw?4~|^Q~Un~W)y}Mr>䇦CKu3jW* W u>@`ئ 5[58 C6w[Sテ`|#-@RX9{8_g`2Wjn/]txeW)%m1nYFOmzJTs7/=UΓJ=.0 S12WV&HKJ -%W Co* =lcA$a+!G-^ (Tн[PEx$EA]* TN~)r «mM'H#V,fVѦmٸTlG5qf9V )3䩌x,j5S*}&9┲"HcĞh*f)LFP tC.^:XiF>G:Fr9WJRb׎E|߳븪4@90UgREnDtP }xܔ0] w9 ^}Ո 7/[,'<dP+\ Fk-{v&Fb6{^pP%{L~a;pId溋M tݖRĉOweo/J.ˉ *U[?J%|각e֎oۉ]OՊb95H >%0&*꛸k7 r~]]`1jGEgegvIϫ=ɿEPu/aT^;ږ!!Y5Qn7WvZ i.m}8<-\Z_H ]i\߲QMK[tʥ2./g%s ;S#f9xvZ|{@6% %pQ1< [xdKޠk[MP3r]o\Vp=Xp_ D_ڷȮ'U)0܎ _xѡ@ދYP>Y/RSO9ǰ˃lf| RCAAyw4\o}jq~1`d wM1uV&>{[#ڜL3O#>;s+=&pL6&฻+~>Seg:[ggӾ½2Cfgu7j^<.e<*}~-$=K$}U\eFn^+M0UjT{ݩnN[1?=Ft# G;mfn6Zd>O55FT>NC/,1ډgsQ`*t0/Wh 2d֓\^TL"g5t/Rϝ6WA @C͉^O@`b8o c \qIPTWytxhMQ@_Ԁ]PPM$'oS*ĩgAhy|!|`si֏(&c> #<ȤymmėLX+22}[Lu"2}$0jGG 5P@>X[n3y,)" r0܎ @UeQĻd&ostֽu:d-XjSgio $wϿe)0LZ>GϹL#ɦclٗL/+W&E34xẉ{SyuEO fͿ9jypi"وh`(fJ@kLerp}{}s R6GzU̸j*&ͪnՕL =+Qe dtڅ $=E@YPR\I; #TOx+>O;_> zJNN-LURGDd.3qe.}t})H)a@HBa2fHLF2qp?,"።7X5븟m:y`Nu_GYOtU[U2"M0y?r KHxt(n@ꥻ?{OHMӑwrFOWvO5wy.n_2h@@G|B 5(ke$" 9PϮ#x's˜ L>^\o?߿ԣ[vI`,ȬDF/ .+ ?dx0VwLp/V_wg_-`Ս4Р{7>րk#JĿgr]7.ߙ{ O?Y+19'Q'5yQDE.s^9w~;?y E>  &fnŅ`z*K 3)8<߫-ģm74*vزWI ‡z/.x T13k ߓ|zj|7n3-2'xtyjxj>wǡR t_fq#DZ=JcɓMWMa㰷\b_g3}}_?-҃5Xq$fASS9zNKWU>=Ilπ`!~͡U_3ʓ2/EriQ@{asv>O.1%rM,T:?u_IZѧ,5W<ξus rLKǟy&pQ=vGM?Kސ_8T,ڽ='dv#9)}bg)+F˺ݦr}Jdﰭw4Q\VoX ϞOnFKeC {{ r~d||6xs$Wl4u@UU`D !(l p 9oA*TL)jwsKW_{TV~d{ku6sw <}}. b fҟC-0mXA΂fB}Z:8DO”qAv>%6rgv\Ryt##U5i}3ߙmg;w'Ui?@xgPS򋿥l;{dUΡJ? ~ @?1[=IŔ\>[+! < ;doރ/B]o+Ϛǰ^\*\YMU3ӚR=G὜ex3u,ru>^f͇ΘL?3PH$+w;t'PTכ.*EbHW7.łmICgiΓS/|`9>.]JU5 M ^v Ez2hw9U寊>}n·7^5?wߑk?pl;W?= ls 3>}k+ؿ}3ʸ}rX.۟Ӈ?=R e \C `Eg;R/%/D&̳APB rwKX:) R5KeӸ^tFn'YML98NLخcw2oxPsϦwc뷠Vԝ:a@v9| $J3 SHxSoT΂Ӯ2z4.b_ݛtkq?ۼ΂P>)6uRA+X:eLw-Ķ>r&yc XQa^nh{s&!}>'UĊbN$'4wsgU}Ns=Vw_GBj<Ú󻜥k }WvC=B^ :*O\th?\do7 j^M?.N~ӣ}-_;od9yY쑶w;5;v[k?{7[qn>j~R{׬`)Nv=ubEs'?.3 ?| eWc*֝Ovv2썭'1p[!X}T-i RM<Ӫ23k]‡%iv$XﶱB2M3n-Xmwf<^O}9?:GO|nO3&%ʏİI@_kK?8,'{;YI{PL{˴_8idv +OBf9oXѱ릹^7NNc?џɵehqXokCG\iQM+l~ \1}{4/"̅ Ԩ]Ml4ZOoF9-Kezߎ_[xՙ~7"se V?C'{m Rkytl('KuN={Nrg3I>g׼݇0¥R4_|^|ib${$3ee/[/ cEVs,^^G3Ξ'_$6 xv? ⨇ضEQ`OXAA{'f&+ԃTY^wkVT?FѦT$c3?ifb/0Ÿiqy٠7e[,]A_*v/{} *7B8렆Y^1H2a5UOZ.αx]Ӻ'>7lnNR/A%;͒b:;!y{1Ms=թo7e1ӹLn/otY`u*_Vy?.KtJf}IEkoq2SMYv&h<9|P?IVAZgzy [㽅9/by3TJYN7"f{2rxeךazϊ.t '&y6;Q.r…G2uq%EB3njX00(@5m)箳Ijz5xF/yP(.~^u~ymuh-/:*w񞽎4.MT4W>lW?LHM}WL\ 3Juɤx.a|O+sP+;xx^[9"s%A8Yن ~zֿ˪ 5 & Cr15"~ x uU>vtE08+f5A6\æ$Н0P΢_V5'[/  D|h/a۲u% ٬'} Y\j8N]DU_K$]xh&α] GM;fod .Z)}.bvW1u_*v> sC妥%""BxWi3܌9;cYgCw0_,Xp._ʨg†hĚ3j`o`^+LbL-v:k.ͭKtߝos0XFPi͆;KfOٯu7Em*xaz|x 9?I[P R@\vEHlJjzmvG}8DAk^~?!14N|w&CgSTvXdͷj<6=oLC.lܜ#)U-?nRr$3%E2k";nܳeqd/OLUg31tK{<#;~Z2Vg_'/h+ ϿKMu;\IkY=eey,%5nϺs ~Km<qw-jFcn;9:r(zA0O9599~?9 ِy?/&g3ݕk<e>rp/t$uyn򘬬s2L+g]k^4g^|R ]{> ϗ7U9l/P܏Q)yy}3NŒb0sv-Wy8rE?lJ/7ŸhVk? aYY]6g0^>NhGąs~^gnn4 Ëtu2ko&{ga5][ijEg7MJZ_UHx\I?3Izitkw~~kqp_zNax:ܗ2N6/dL>џִR|(ٽǏmw vVؑ(DаW;\wS6?/I^ K]x%Y?w13u;ֳ/5K5\i+$wpqވ-ynTUC 'cMn*│X,gC)=n_wԙ?H)~MM.K>faܻTu8OP|zΎk){>uq=))Dɔv~1J$)~[S,<4_ Be3̊Zn=~Msv>+֫n[è9'vHRr*J(y)08;MV?ZytI#)`uV:[ϟ{|ϱ!nSʌ=&Eo4 RV"Jk9m1wZ8SDKkd/ny^_߿I!ϳ' ]~aphbzn!@E| #>h3C _u-YOlpu&"l^cx>}4&a>֚27fRM9'_gb#ئ=;5ahۄˇ[=qʉe=WnmsYHk]3R+/JuBa/jiѸW Wـޗ Sж- // _n4T#/R*=|:8~]=m(@3'T^>Q;:n #ʯhcON !:U MX1Hs RG~=8NR`:g J ~rƶ836WTG- 2 D/%X0$e>uBt,b)5?J菓vsL[\pI'8jX3UbZ$0k}?Ye>0Z ҋ`q{^"dp֛$q45j-ڣuo,Z:E=\.Qt21HâfC91u2g\=U;dw Iu_}տ}%n1_Ԯ3;>"/L)_7K83#rh <{z:ǡo|o{<"MjYo]3dq: Wl#9bIݬsRup~7ZuY|SZ&SM}9ZfmqL֝GyAL x^^+ܙ_fY8Xhk uXdR&oԋ@wkdK<oOqxz}۳= {>l_u٥̜uunZ_5<,e{ұtϴO&`%:?Rjw ^0=KNb0e H*7'##⋫29XZd_ײ$><+ưd%JkgP2Kq:?7Wb$vQ//'ck|uѨ\k\u٘V]Ӟat[.љeohe磫iyogv+oQ)r(]U zpd{3Ԥm @Iֳ˨|i^z CL]w22X[WG4TrԴsס7g{96'^Yo}75|Ycg X^r0LۤoNMhT/[cJtMP7Xi ?r)=9EEnHKFL,䦉򝠞f#U=[4]esӦͳR^ݜc|ɛI6RAڲ/E55::D2/m.{ M18SkkԸy)<8f'b~*/\g6S 8JNrQֹ[2ty6e~jD;&KLQvhV Guo{c$^B<'TbFuo:G@|k(3}[$l.l.qrcN(:'.eTER4'J-/WSw7){/qYX}s;dfչ?0ߵגw4l ZS<?C} W}+o9|횑{?w> DNx|_ik-ؤgY3)=t4l;"MfQ_XFM:-c3YOas q={h%gJu_O!Xx=+ vt.CCHlcw;E mkd|y5~ RuZð#k)ԿM·Dޱ> ǝڲ祃s.ڎu?!l疿F)ݷ40?~Yֺ߳ ^~=/O ?:?g)TEmk?mw_JZx)ɻIgQr;^>4g=pd嬼z56kԾujYpb< _EQ1A5]ozgu.jϊffe(?&VY cm_wT*]ccu2xM6 r 5 I1*) )74P qGrW% juTo*PY10Om,:4t}wLO{BME=<uf4 x;a}9gi\NXsEQЭF%x*WCIut$kI,t{ )*Օ.$TbY}SZ }>mϛ>?i~ :B~$ۜI64=?aÎ;l:S>Rxg᥉C@U2it䏠#Z@ŮѦPKf cWg+*(pw!f(Fo/=l=˜2w}evFZhٞ>sF1i+R$ `y+; ӽ9- _QӚ%c׵ѱKP V,d)'`V.Z&L؝O:dMԝl `sK]MK02r߮MWҼW6zNK㳡b]{;Bv7tW I|sg3ה-/yRWaW3e5wd=~$Q҇?\>zsWQWw3)5k< fEwjd$G#݊;l@0Ğg$׍%[ދw/RԻ$~#uXeESگx5h|q魝Dk+ENO꾾Bsdm[sXj5}R<|4C\_%j\UGv'{e_cnHԬV\:N'fGU̟˾PQ9̷\[]f 3Mc}щ.g2g0Owd;I6fy>+^˒\ ̎7 o?sKhd_-"GAs}7/.Qhsu{wMfQ5O]g96(%oSwt|ޜtm}mWrys˜s^]z݄y`д K0i?wFҲyGdq/̤xYl)?_??S5ӵAwAűiNwB|'@w|w+ &+WCaٲ|#gARsmD0_ZI62Dܯ&Ob]dl?l0^f8pK3s u/YG%]%G(r <|kh}YL>ŏ vtKIF5;d2Idh **sR{ITvuCRk Ot7x:f4T-i/8gvޢq};Y#yXʼ?Vk鏹aBɑ|r#9lR_)%GW>OC25yI#x^T˫;"=M\VKDg[ig@lYj|\7p3`%Ks]/-j_5|to̽}_S08&Yřs`{hZ'*O2kGujJ;zk9+.g3هVEӳzu PeSkۣ"_'uBjeS2e2 ~fG} E@ovƻ׀k{Qkh ߙ}e( ]_&έ)oi_vR۳F. 9}ř4"&A'͓t*? s;i,R]e]:s\skY2/9gy0~)lm(?$i03+wg2lwbջN~^CjƖb~ {bóee 4=.7o3ɀM=WƗnQ(?̅= &ڑP.PުkKIeȊ0-s(<͔4cGAq?.?[6ٷ飫i FoPyoqi-ն+]#frIk.CW:V:]t]^)m~_3(̮ؼ.˲N)VSH>ޒv-=Oנsl{bͤލZmK.޻N3;<\V9+sȾk]VWѨFC/̑{/tϙu[2* V+L<o3~<oZf# o[۽u!통!>k}*~_9ƨ|?IF!ߙg>8>>V08t5qr\!⸙`ZY裾>W-HX9wˠAef1Uc6u;dcQߴ6EŶvHahU;L;r˃NExڅ՝s5lb*i۞u~qg{>uz_"e10?ͤK\9|H3j_g󺹢x|V^/L9NzCn'OI\dS:E^g>U\zeԭ?땓Y^֊f98Oz/d{x5r?h[)7݋{OV8qi`cٻ4OywJ]GO 5ևE5|zϢ`#-F ܟJl>U?Lϳ-͓VtQVF6S™X<љ\$;tO?oiI%IGrMߚ_Qx4E5\!2LqRV:j `<{8F'o!Qo!Ѡ#h;,\ҟ!UL] g}mCIkz|[0w=RLŸ;7iWwz|$Z2\I,.iV&ÉR@tRҘ{EVYmN։߉b?™3h;=-eP{.]siQ˒O+{% 7IȬ/ݿn7vOCױHvXޱϮ(?k0"O߼_m!U|)p'ȧ:73T[|- W.jZ&*+6fCy^W'קbx|WZ:g?%3]C-?A'Z)"Ř1C*4nb >b`b/( gxvkiTZE)ziP8Bk툈..\hpo4:XqFwk\;sٵ ꒍$h]8IrԲ h;:ƶcQxOsNJu!Dopekip 1.&am -UFb,QDf }ͦ/_!eg]תJ?Ds#Й 0qW}Y Q]=.g~yZ 4_YOt_{>GU}^mf>z2zȳB+8^< {_g癵}!t6^m\+L6󰭯{ǢهZɔFgcd[d(P׽B1~7?iai NGj.N%1̛Rxqz͜Vz mz3Pbmu}FC{F~22/TdJ&^cmջTX~[2yR(m^d~ ?r}jLe9wYem(~7U|1FEJdh|'ߍ{ےx.{tlQ{\݄6V{z(uVnaeeSX_Œ5xp|r+SZܻ1|JQPu+CuњeQ ^ s;H'tTIi6 )k頽5}Uns7 XLnju[C7d]t{ Ve G2JEGyzI{TݏU5}]wa20v>/2=zCҦ~jb]ćA:}>B|zΥBmIDekouy{ K͘޾ax,7OXG ӥh{+5FxY2M߻Y>T"fr5XvUJc1ۄν eRǏ|Ffhydӽx6a3g+$/N|M]Ya0N;/*8MSiQ>e`i+ܩ0La`GdܥU퍖v s[{꿶brѭOy 2䵻*ll̾):ZnEv6 %'խVKe9ҕLQ-v6$HҺ:7DfA뼐; &m<2/AdTN3K>2RC]gZ~P3s头Nց5oLVM`vf ^L3 L TpŠj]U9bA;^rL^ϳ?`m$iԴ\鿌)E2k S1&#)ӳz-v~3O0 %ǙCſQk ʽO_zA7*;Re.R𼜿Av=y|ܙ{|tl<;0>9 2ս Zd4V$OVu).L&Z~rak^̳i?ԫB_)(Q1tőJoPli t6]Xz~ŇESGW EE}r)+Ns\~VI3V$gN'>@zߍʋ¿ot m(-V5of]r{L+,1qxY fpk_umNSY#26\aU'KLձXy,W͌Vwp5+Ekd#lLVNzۧg`^1gy4͒gd5{%ڼߣsg䨾$Ia[RI~îdp,2OԨ^_aXT 2Erxul/TNDrY''YG߽fKRf`o}Q3?ǜrI畕X:}E&ph5)JTT 3hzD߯6+e$ڱ0~P.KW{U>n,̥aֳ^3)UdMǁh{lw,*{b7ѾҮ}mY=~./6w>|[=)>7j9'ݿ+sǔ˓1MJ鏚_`,:ddi =ʧ'IN6~@nCNA^Cfq m?V!JTtܳeM{ll{a3Ҵw fj9j+UY+-=3^-c]_l;,Nk?PszIjwg3L-V!4l(w{5-W;>ީ-Qiٴjͣ|xH5}K*,$su?~^`' #tv4x̳k$~?޵gTM|U2LY T{g=M$8 ٬˻4.-ξW%Dv_ ćMdUY'lR y=v3g͈̎1f: T&Y&E^츳|OS$`Pz Z|NJ[W!`eck!8Pi7LXQcأk.ADže ؽ,n>inBP `tZe5,R\06%7VKe{tp1^u- 5M*ۺk\㰱`E>D}uXZÐ\*. U9);x>*W&vK*F[e:|K{3}E2sVK\S{I({.e?m o2Xة9lsv{.u3Jf ?+N4YXZ6vñ>MC00==/w&Ylaߕ'~ʓ(,WvMo?Xuy ԙvv^e^">ͩ1Zkk V_¦mVsKnp JPPg-f&kb’UEc{V,'zu "v容Xޒ*3m礹Iae=i^!RU 9FbPqmn SYouf(U1E''rItEٴ_LG뀁Jɠ!0  ^2ʔ \uA4mٽjg$0l!UmMJiyejLOW6-;=ՎU=<%h^["XX"7 bɦ,:#*l/Z?~*55G!W-/^He;EQrY[$mk;? Wz ~0Uk'g!i|O$0+^1[)vi#0õ^eY3k!;uZgQa++whڤz\# ɀXu @4v>nKeS!0vF>";w6o(u|ƱT?(_rZlN|xZp_gI|ae܀xaVY`l:%oKI iXS>d6Cvit\%4SWS$V}m.3XqVkWTfC{<ˉCA4]S^(->}=k+L1bhu\4-s&? jgOiP0W]R_B2,аL'' t+^ōzk[{T z?6(SZXZyO䨵odAAH\葞g, Ӡ)+h1a5دɝÓ}| ?&U-tZE ظB:g.:77ʜ-))L>2Hb`GBŦB4ڵgBx݉xcU|lнj e%I2m \ 5"V6M/٦פ H ]Z [A` >/AsW|FX`Z?'JcaZvM1Zkjo*_AbUJ]#^jU5vsx=ThH/jw  S$dx9;P>; |;tף͊>kh-U垊^)m  +3WmRɨ=mI6 Ok#`STGa۱ kj(d_'/(aW$;[.~Xir3ejRupTYu030>O[> ,>vDknDY4,kOfuC?;.?[:b\}ī4Ҩ V)O>qX{A<~ۤm4R{LgPӵ~gA+[gU%iu{)ab3pnYgwZ\~WOϵ;Y>tR#nF1V-O s*quF%4PY}h S琰FG 2 )<ܫJ]ԙ}r0(G 8w֨E %fUm"4.A yp.k!\k@eD:AEIҞ2„bg[#"[z)~`}/ @0bҡ.׽ir٠Qa=fA 7}_†jUɇ},[.w,\GKZ4i}zD"׃Jb?e{ A1gY4gYIguȂ $ʃd?Cix,7,ڹA|R 9=6ne;0Ӧ2ڌk E׽JڸSXtl,]c* zwo@VE@U[DъiYtm T;e =ϝ̌-}sȊN K^ѫ˼caAd9 xtD_Z QƩHq) CAE4v￐NBR9l3i3J+= °9O=lјj;Yvwȋg Gi:twwR;sry}ƒYl7#az6ȉ.{MO3ȐJi#[ oW6Qh}ܤO#G u{Qɒ{Z/13GPYP@dťw=UqVf {9֧3 땣Ŧl]lͣKK@ZP aMzq@jkZ0;Ӻh=gkezVv؃m.eܴWӵϳsXtw+ϔYa^`tl CFmNKmdh" Yu1]F\u50+H\aJXx,َ^ר]Cgz󯔯+b!JI_qq,e6<H`2Sk2bEKل<PEzT*x)J+?ҡ|-}6 V}0BuocB5ʇ~bžැ]';]uʅt`K&/YvynRѨ>n~t%S*Zҳ^[9]KO&iWC12r ʀLCǫ ]27X@qsLRIkђZô}L(xJ3>܋trZ/T5R&lft,Y q,PA3ypz^%Nգe4 gx]핆boDcҎe!lﰸ5a5bX/p#ϰUhpFT?ʏ݇l}? jY>a2k.]=Xv{f ˛4XAQY x]RnW|};t hka^ۜ®‚hxиi)YY,{։Hs\G ]S̍4+A5*B-S_Ò1OO_s/›g|l<:л·&㺘U!Za~{c䔣V341&ѵSEU@^'ّ-ڲёtLY)?KF\`(Eh+^/!\VHե<^rW*K oDAAg*^凞c1oZ=" vU,%ka#Rh3tG4d50\U_498n) 2{l3Y<|x^0OimP/̀1j{c =` 9hO8 Ak*+(YQa}J@YLGE_"pS8iPijl䴩̭9,9. Vz4tJDؼ?ݐ=l<׳|x\ٛ-,+3vHZ]bwgPUwif :ƕ_j5z.*L4ZwֻcJqlR׸Ρ ҳyof)Yf\ā3XvIjĝ*Q\FTj3,VVAߴ\N勡yPwxSdq [VVmvا0߲ul}9<2s|+鋤j_9GGrki|-+s %f"CF)S ozej/;g'8f+uC`3h:p&oKk5Hbds[a#n맰H ;ʤ-^j%]5r~Й2ì~{JZI3aP4Y0v?͠9ʳK'm4Qsi0NҐ |=\U*1 jŀvQzI#ˏ `V]m"|~>Ӧ$mN溫^4Y*y[ k`aܟ"Ķs0jخiw.BF'A @N`_?myT9^`R5afYh{kVFQX{1+$Xߖ/J΍1un@*:&6y80o [H%`Ee{j^_ qFA̅akr$i*KVѭhڨ~&+h1~{xt.zy1{j+\cg(*sKkk`{" +9 {u0wLΕVQV|.A0oJÄюayB;VQHgGY+SP5h\{_PfaKea Þ:{ #ZS+ձ~BUFTU_&ҝB`YkBV!*RUoi ( 4m[#`)IZbkS\[w z:6x7quV"J}SӴmX-#xh1QnЀ[s3* *sAs-t},,m~@KȮ> Z(M.٣xO礐[ ;CGb(mvxUF*K T^4sMQ R?%جw'֝ *ޱRTDiuL-QY~{1<,{6t:ԋd)-~Jz<"x90XX]бn8nf5%jȃdG{ɮ*N,9O?ȏ2ʓx%hZ;7:O4["KNA`h 4,Bkch(lU9;z"9Y`pߢGAӵnX/Յcf$fCG kDоgL٤2Z]KF~}-Ot}TGџkqt Tw* --vQjOX)Cl]Kz߻^,:ֈXv4/%R/:MWRQexxNm+;c; bq;dо͠k\L $AR3[9O`DKIҚ:4SV)Wljj7 whaGcU D>==1 /BۏAH,Ćk2|l'LCw [ھ,L:[.ъ弫P2AaƓAULV$,BC^t{ƃGSn!S5["nO÷N`ͤ3`4.k_ ;ڵ]}`rˌ`nit& Rdl$C";AEfxRK-4uJFo`< Lꝱ|'7|hXu/iWG Z?jaa}kT&|:iL}rda>a2/ /zHhgeI%شvXWXV8pSKSz]~*9ٲu Jմ>s:ZQh:V@f|neb3k"ߴV,1 /,&؋ V59ajg~g|Ҟu8i=o')6*Eݬ5:sI{L`=vHfxY\`aSa@$׻ c9c( C GBO'goAhc`Gq0lc`O4KZ3],8ofڠReGuË.${Ja*?5S `}/-k6wsǻ!5yra+# _ux2gY|:=ھy&bvV3k٥<&+50Pb|h EO̞2WȀUf,7RϽG0F)iS+,lB #ipSf۵̲:)ǡpb5vt'Fh2ixz|j|Ňb4ZrY~slʗwC)Ve.J 0S ~`=^\,PжL;9Z[ } 5/ v?*[5kji Th!jlf7=t?v.pFUg/)-R1akdAdұ[}hFi4r <VM g]xb0~VJfm خϺ2 W_jʣ5\FgBָ?&]]cKw֏wr=CidDTu>nA}-*@ȯm/bPkgNhDĺƗ?ka}Fdi<V|Jґ}GthaWDs6x;L ry0Z_k@Iv9 W#`huĿ#2/@F]}E HR8F}^y&ՙ,ZV#m~+Ah(MuIԄJkfMHڣ2m/ j_τ=߳odV-{[WBk3H;_raHRڧޱiTҤcҟ03Q[%FD·pE>+- c]EZe0-$nǂ˫<M0ڡ]=]N{s4} Ce8AFFfj}.EAg=i699 Yظ(8Vg`Q+ бA憬N5C(LKac!Otl4Fe`[Ei1UjfeE0T'fkU=:}m+3ؐa5S=&@_HP:*m <&.S(m/}lW)v@4Z}S߹4l]o3J 4ZKij1rj1wҥ4v 3ɇAC?Ém|'I-k~-}oY<r븳{[yPnokT^Y1ck.gݙ8Pr?'hZ:%Ͻv62@UѤZKeZ{InUn1\O{)yLZŐiKNl(4 4M)ݗX3/m]Qtuߟ./b ][ce98A?h,+VDe "/#x]iH4LδhNnb;GF 36/vf4R,Aaq{Y{fWlTe+;7 S[ZGxgҹ5VhQf#t\Oe`Jm.̀z%R$*I/`)4l2̫WlwVB=*!k?A)fpiG`-6א+EOސW6s_ e *{ [ FdP3 K{EOgȃ]]S`Xe:TֳVS:v1? Ǻ iChm;GD0MA3j1,0XY#J̳p=>Z`3ȯߤ }(]%l:ƌB\  WqpLݽa),?Sb:/G JzAReͣfխ_VhKC[ ִrab>{"FƗ>Ê12FkEܺ+kb)eҌ<gSN@ź}QkAb: 72\BxSFx'Gy$=Ɂh&E̘ei,k<9Yycp.۴eIV5qhHi,/lWw q 1~ZEQ 2 ZQ(oQ`{<<:L Z_R=|ixQ+6FSQ`amh_ H#3Eil4~ 70WqhMۧX2s ֌9^\+^ýgҩ>}F[Z19>pS-#2ɶe ;?B:gjӻYuh0Ui슒'J hUT&ɴtn#N5šݳ(Leu9o0,к%JA@rN;/**&! }X4E;lM>_V+GX\&fφ\*D)b+׬,'~@$,4'C?ٯ>~âdCɺzLNH텸ZC<~ܢI>^AԀ/N@t IK7%w+41ԶH ,Zb6Ls*a9"ځiqa}z1u >dcD5gRUd*utk-(7]`]5iz- +o_6[Xbb>(l6,~a.4ٚQ(MƽwI!3Ջti^!@i,/:3.[x3ݤµb0MTF2l '= wEE\Y^ḠXfHR84E: _jqvpff[#*l1>n}0Gѷa<{.g{v3X8oa[b?oPٴ~lihǿ lPjsb CTV;8 "52 [OV.`^UտݦhJVWp\Yպβ`iJn[@V^{0WZ&.sCsՀ}$e20:VݷJmjo^vT`^;O#H3,Z'3tZؿ'hdGcK*0-5-dҩW2#vfYcrf)S M]ZYwLa`ah3:0ӳbfB5b嗊sSm: ёb2VfZ.eµȳL\IU4N49}f7G}ژ0ɴ{=/m3+c]; VݦJF'46*M%ϺA}vƑbu'gqX/UZhKa]bQ`X\Z.S/.̴IjH*uFm.BS۽i *mYTwym~  ]OJTYTb<\Tա+]!j`}- ,^;AqhPh*UNjH-#Ih*ȄQ#~C@+^3HkOV Wpb5DZDWZͳ`tVփa|jFvj}ȥa75OY3Cb4M,cFa5rhTb=MbUax\ ^вl֙hl.s&r| G h5݄#:Fjl#Hm+3TOn1XZlXxhİʵ;0K哷( 4 X{l#,D; Ɏc?7S 9\{h^TW+ _Aah^S8LٱWFZ>#-̖ndiUPK?hоV|L4"Ўq+ypst8,_z0Zo) lZ&qb΅É#18$8MUU.Rפي;}ZZXܶ4 \#kAb>kiƯ.95oCd цBMhni}ra`n4y#U KI|UA-Ѕ\hummN’?VYB$blw[}asbO~Fi{* 0?V'qL 3 :s^uR1-/ug_FUH*FyJIefT_it Ҥ*;^zhO*}2g 1O]o+C<&Am^]= CBT>~)bWb>zTcE@%fFKWi*B\WvϪ DE a0v$Ұ?=Ђ-5a`uY޻̔2lK "5 Bȴ}m9ӵ[^X1q"h\p\i] 5y:`VQG@Wؖ!%fWкshb2\fT eEab7{~[tҼ҆kkDSh(.,_{*@}x ;B0k^sGHju ggjRfr?lÁl:z4u8Eђz[~.׽3~^1#Օ: }.z7e(*sLh(u ~ HGkfG<V_ ?́P`S0cXVsn`X֊ ]k}L6$^/u?uakhUvN:ʑq:&~fY0naQMv9 J*D_Z(/b  KFquxSH^4 yr}BWlZp6-|_ K>#hYqM4Pif`DGR(K|ִL+\[] 0Fy2hU?+ ϭ*p֕3YvSWwf>DbX)N׉e\},Z"qZ\*"-+mP^ؕ5,bon%1}aG~|^i’Fkhk/݃hňk~ kb( GSJg+9Z;>4w,"M`umYǩf&>T*1xwKuxJ)Y%K/@F<6' /10  BV4f3g@0 JoR3NtU1x (ϝ_=yWaIOyo?p L/B}8lnUI]k> FWe ٜL ii;uڋk6>m>| |ͽb"1u._ߨ!xEmǖ 9jb"nX0YPI{ *zntWy==0ԟnh%.O>kpO T3(eE:c1vyARO͎){)/\-HXAKn"\o;7*!W4Ǝ<gg.Cvc\''*qӅ:qUxa}H]!Ht $bwMȰ>zv-atk,=_S,=q[{TgK5$Bo_Cs/e@nJ4-C_)tU`7;oVfJPtbTl):dt-\{6D_g46)$L\[r#iּa=; l!m, Yh8l#M 9.{JaLd]l^ oZMsn-w xFXKۼs^;eos\?V=L,Lشû`hф6XXH2.&ŊI0/Y~ݼ+ _ZjNr#Kb*v.aa|x^k2db̰3!?ы ?rK4xX\Zt:Ϟ/, {\{b_GpMDՃl@, Z_AJg:Lg֑?U5aMiw%͜hتf +7M/Ǐm.; ;񊙶Cg!b]A1]1L!-ZF){kųwxټ+OzO%h9e2 IV4nTd>Ãr4_.Wfk)) ͹։Xh UFh)+] /郄k`a!|oeQ3(L5HiVXii5YN\=\dJ°\ulXڡ2}(>3 zʓd=4Z0 ;&My'jvcW6 AA:u5<,=H+o= 7ISF)Q3tiZRAwVV˭jD{,(5peQW2ϝ6aHgXE-Y R![!wE1Z4=MPA1v0Do]]uk Q8rCfa0 ]FzN+FqgIpt+XAk!7 BR)_o91 q3K$\Rמ¥oI[}e;6O&@ww81#JT]XXai#0|$u/L:6sa]eY vnl qQDl`oM=DPXF#h]5Wڻׁt03b g/n5h:x --`uߢRэLL%3HXZT洮#hj世m!i>Te;Cѡ wXQm"*lX5_RҴl<&%g4: 3-;Hκ._@޺1hU AeP*TwQ~[JANj@us 3hѰ N ^8NUgṬ ;s|FMigYsֳϾiLt u74i޻k)ti}-oeczhͣ6֩s]C,]qCG}<ւå0T c(0Y !wb5L3e2 dSa~r%赙 ' d^Xvt, =*HTib7_RbŹu/Jvqkb),)OisIgH'i/e%O|YeqVP _c2ӧ|/`m;r 㭵i,L~My Op-$ҡ1e5kͭ@mLb 5fRa`qqZ e&9 œb} $ylFʒiTXw 'T,n:7+09^-K!F,K9`uGx3ʰ(-[[aq!~dPbmUK 6 a5~kmH0,}^Tu^ka8Ī/Աl4zMkBYFv.фkH`N0Z nNSP!%1v,|Gf]VnZ+l}0Z̺,l( ;A4σ.դTZ8̷ `#tf㜋IvSYe}YheuZA:۞[0?;o=E~Iδls CBPoIJUZGĻV׏JkIj =]wHPS|F +5f$oZrD+K_"澶3/ʼ~o0 ߵLaeܴ͠?ܿ=v E~+F):ޤzM]YT5>`Y0X6mӟ~]O{LH+U7]d8/%`*_Hduh[Sm3 +0蚤3}G[_%4~ȹW/F+Kd矫kZKh5-%g ұ\u/K5:g _~roP.iRRc}]`g^ũAr7DKeZEssYn`ZL>'6K1ʼnZ ,裱^ ,o ձn7,$ydy_fƑD{6/BU<"2"4 8m j!PX+3S.M<@,_c6VPj^4< *q!i Eg+|=XSSnԭ%; Ĉ˔p2];з4<&1 *7!t@R4H&"^%f̟ Hə%#o}8]@](48V! x 3촫]-7xLU55Y>u=L61 }wXN 54GTһޣvIk5LKhS"ϭ2@_gGO|>-K1X_כIxb<-ǛLұ*kTXQ강'%)~AhU:glѰYhhX$'.G?&ŭb0S< n<]q`4Dg㻣JѾB'V"#CN4}ѵdNҳb-NyWG6.+} 3 sZv%iAjm/zZ|Ĵ}Hћ&R8zCxVYv2M/ɣ~}lK>iUd*c0p,,yVS-c2m)T0aBe %sbFZix~}rak~4Sp$sh+J%dbUgҹd+ ^~^g+,Dkf?ג?/*MV5+,_ߐTx8Htx| lXX,.Ŋ]v,KZ~>mAP_5-*$Y7vM هTrb#XUYy??):SZVQil; Lj}ad=ּO_7Yh H) ^<8FB= JbTv^32#j1䴪٘1i]]T4?XGڰFh=GNB?ΔƢWSfB εfmzL'S,,;hd?= @2@h+y,,{M*SFҾ@Aw]iThO6-6})1SB3kp϶j=l"'OnP/ /UOa}k|i;&q,0p_r{ H-3ki/u\ 'OHoUVu#]gJš3S* ?b3q|GbM`{=Zx-/d!ZTA~m a ׂK@x D>1\0P%ϰ/%_i6%1Sf  d4 Fš.k ;j~H, -}D5~ƴ$B,:Ѝk HfC`s]KKd ^ʦZ!mCGFўڠ[]F:T,B3[zFbj9VbXtH(.3Sl,K`;+h7ߴWYUh?ڥ1*_AСmWMKj{v Z]3+ sAM@fM<akd-Z\x.\B>l4;7eaaPiѹkN4/%aO>暬5=+&ul^l2vkF_gUJigSbb4l'xZ=- pF s݄QZ3xt/mfm}DǼ[]s`vUe^al%^Qh~ZlkYnE֖aTr6"urء/)|f4*BwFy_%kMfu[ nЌ;4cK*4lȴ.氶4iXa+հ _[L`.%a 1WXxnջeA0I[Zq>GwdV 0(9֨,݉q3b5dzqZUC+,K4ƕ(- Vb(R3c,uu,A* f)Nà~30xm f`kP2ӿ*/ KAf"VfFb+-Tn\QBZ!&[BteY`~;zf.Y8'Z1t/u4xN{@TzuuKkþa;<9;We}iZ{MwVX/Ak?)Ӛk(b3 ޓM"GjZ0۵aeȌEi|#j_,&Kk$Khjwav>w-dZj{ ` X6?֏mbij5a?Y_<=aֳh4l3',Jd}h?6^Ezh:6Ljfޡqݴ<.Pq:1neÍb߂0\#h_ZG0 GH=?M"-x$B+6V^Ej Yoh:l/FH3lFܰz[UuY&hˤɪ!x!>kh0߰>\V#ikboĕI4j04Jx}+;}#a4W'Ѹa4Eдl K uyƑ_4gEٮ;]VX޲Wݮ;+Q̵!3⾑Dul4w9@XՍ~Ţy/Z)ю [BTV2Aixo\뚰0yεCV'4_/ujO}qfD Dǹn֭ŵtЂcFXvPi۰v-H״X,sYŔb ՖKL!~23 *+P_>w_kJuxH`beX6;V.b2+pHy 3~Zo\%iU䃢`;^7{0 >Ǝ~]'@gFh54#b\|ƙLXN>X뫼+!l8 gY1N"N:0?謹486m .YkZ2݇k"U*7Zrfy%Hdhóvq Ʀ{l* ?4u:# ^S#i,31Gcs `7 cH,+cYvgRRhgg BI@vH;SqV_V{ٝow7L=+s3Ovυ,m+M2s9eHz_}Vݤ&_OuCTރRGhTǤ# /Z ./1Z`V6XrGZn >8]S#anO-j;|dF" g-߫VNEWXE\y=JLYBx}1qs.,GB+,0ځ* WYv`d_SI%C`,J‡+AOgҟl ρ}MVH1w,MM@k(U} J]h?7Nh`9uߴ*ު bi; axjŪa5uƎySY"ў S! =FI7yxDZ&DY_E庋-+ T ?ޢ{ H>_aëmFHρB]zxJ<\PIͲv~ + Rz_)5>`.0;T=41;{ hX/M̨UVVƸ5(-mw`S ^0)kW;<6hZ]+ /L $s}XL(mWXosk#$ў};4lZx4h3#`uyxH0>v%0_2ҡ4m%dBK_>];[q:H:sB髖0 ۥc2 "|mc as_Sձ;]k6@_4h Eu#i]6qI:_ټ3 5@O$O#a{N͟K+:״>4HEbF .|qm;YwB5y AyyV#j|%A~C˳<]|j EN{mcZ߿8  s;LJnϠKYBT+Kֵ@_Z WlZup >%:iS~M .@tr$jݙʣH00Z5oNm* B,{ID8/ՊcB;V%BGꝜa|϶\3ұ0>&ØҢ|br0%a^,]Q޾{b YV5\~]] pLGU~ 0Dobоp`-`>iT:ĈĴopךЊ+)eYugQkb^?7}>.6/9Q >߻!8 ; :M[dy߮v\zEMFi 3tLX䈞Idtirc?r4? ۲Ľ6#FTV,KkYnai4 ,Z4l]T^X8wPZ2NĨlgѨbTzS!o7SS"YۘoyFh0cmi|}d,Lѥ=;|DWߵi#H`ba^>qZ k?F#J,X[h'N!6-} =sl*,YZ AOv _F="۴+kh;(eAGJ0$>Ly ׆<، AU1TYiz9[*nV\>h Jι'M}Uٙh[f MBF wuaٖz)U QaGGA?sDJ~U{'kSZ5e؊;qb7, kGl!{ )XUF6~|AJb+ *Kk@;GMjyHʭ&(IŏbhrZZ?Fsm 9m űg}AwLG2mV+-ê-pXr`-['*KR8ճikػ =>t޽ [6bq<а4qZ-],"q䘗уz- aW, 1c_3H'ᰆ .,T W #Aec,;јp3h\n("StS QYGvK ^ôc-"*[ $T0L)<46;qs o+L1&PA3.,EAUᛑ-^Kb3lh>T+C] BX5!W-tW#XžqTJr}_Gh2M{26Czhnا W?L[&#ubB [ OO@Lk\{\+OR~Օ-G1%9ưaIT^Zұrk46Ƒb< mZJ hE04tݬŅ+KH'ZN eb楑!xLY=hT~-jCHMa]5Ab[7ŵ3W2ö,#KgTXn](IW8%Cw?V۴Mf[^deM lfl2%hɻ7 #a6kb>\FZhƺE5ؼ( ͈k#,4ŵ4%԰+ {UZjbq(`WYW@,V)Cjeaj>va'XMk =f{4 Xղ̇O7YZ0/MD먼MTؕ}4WT:H&mگvlG8Ç1k41Dg|/Ik %0/c% h V4b5Xf&{vT6*YM A>~LݡOIm_"1>|gϴQ4/y=[H ͳTzy0Ua۰4fڰN`dIG[0/ǡLB4mZ\62{F՞n5bg=,+}Kz iϘ{-"?TZanZ7.KgjfIA1R0mu0U;#ŅYϑdѓK{7EkҞ]X ( X8дv IJZ[aui/)~Dui%4pX*ݪ#ݿ%09y}+B3L GX Gpձ}sEkrЋs/ ݼ)1j !~ Aa颪5GaoiO^}ڳ!X՛}Ɣ>@YE8vFLϹո{b /e7/xqr¸sf>,d^>M0^&ii 3pb)\`ZlP^n=! QY/i fl3553jL6"cSب<9x{q8x<+EkG6nx ZqP[%3Ȝ.# GU16g_Qx=員R:®&9c>6ѩⲦݶ %0l)#~S]9wϱ H 'ux6Ye^hT*g- "*n7VshixJ-t8,OcUnhWc[IVk$­B/_#\#xF#b5_Y;"GX+v Z [4 `c||YX&cٴ/ ՅJ mpSLeU_e=A5Sky -`ppxʋ+;$Sh<րj6Mhع~DS㠾wo_l;i54t-q\]:g_ʒ'$="t&"hyh.5 ױ{IbZיhHߠXVb1eqͳurKie;Iw[Fl*ipsgN0tN@HȂeyDP]=mvka0uKA%J{Gb`V'/9)x{P7 }o#^c~RYbʰ`W֌r!u&+].;UpUOdذ*o`|<_˽-K0[W jZ!J#1051aG׻?k~TL09~Z9 >Ga4ߦkzfc[&ta״yyEv"$A:9h-lZDAfGhE9SGVvh˰.D3ab%V(=9 {8H^X}^1Vaagqh"f=v%5h:B ˻ n,ef ?ƽjL` H~ C!f A5ۤ5a[`8g\D{M Q`V0ֻFl/w"=Gػ#F::= '%s=iO1y"OMi֐a}iqvh:IcnF{A{\ @1 /C¹JhΩ5B<]^*}Lv}KE[WZIm¨,fYf=1v0򘹬 N=0AWbW>_XLEѝMvSI.d0pXWzж.#\ Y6.@bT1wM+#GpALhXl5hg+e R2gL:ɤaGFgX|8E:MT sfB_Sb:_3NP9ָ=%PbGPXfٙki~,z_KsF،'u|Cdw ?`Z؊:ߟAXܤUfnY0Ay`s,>?$U-Ioz8J4LV֕ \gN0=#i[]Uf$U7mN yٲɐ!)ehݵb^~? CKbXEU ;K]}P/|r)2Dopam5>@y 0~a4Ts=!4Ut.ȑjqiCd$ѣTKeԴ\+۳z8 ]ôjEE ?eO^!MHX!&+3|ڼ İ K]cYK`tv,T!/?eUt ꘗћkܠQ$5gbм,ɮc5kCGa_ju}ŰW1U SJUuKAZh4VWʼna=k`J.7#) k0tĈ`Sz?06~lYlODFzyi}|bTZmXEHh gbc= |?>eɛ&,7y1$;sE+0/TKLתL; ^JA1U0mc:'4."=E. ˆ0-<4 !H㴌 @I#?3`OYFt_Yji1n|&P^.!M4OEM}+mzNx݇̈́xoHØ4ƑB2*ÞaB(̺'*ߴ6f)f#b-,&/g=x3'pYOPi/]%6,=E!B~_JM/ `Vb3ש@)Aisw{#Z_;Y&zYgy0."k9?Q4IFyц|Dַ" ;X,۟8\wx%4,(1:ϲh:|[h<_Zo2Bx8A<+XO;iir5i Uy]egzŴ.1_+dX 4YhGYz+Άxyaд*GHdG!yRw֗\F  Wza!ZY z*1eh b3wHB51ghyeã=vZ<;M s Uv`W٬ϰYV-[8 }poK OP%3G7T-%4+롄-/Q;hJⴼww:Fѵ~3S`W޿!/M.Sy4 3w"Rk8t̫R!o~8, 5}@#J>㣿f*>bV.Dd$ sZ4LR=6[)1TLXư *zڌ^;cV&ْIs좰;[j=3, w=*SGIm*AwknV18ZaDkFdѲy+)7b?Xӫݥe7/P> `RZTVq k+l=]4 9~l/m# f0F]ϧEUs; ΊE4R.#4LK3iw 4Iv*$Q]%Ql9:Mq%ҵym eҁKi;}>D76tanb: =!B݁kb1,{hA`zD$nX+ (Mqy ٗ4_:3&%g`c8&"崼oZxd6"mUa4WHigwgL7yL=<,u^FJɰ˽&=dIfc׳Qu&نeѝ '2MB]S=Ei2Z"c옎۶?Nr1*C C ֗anNPV?f/ <Lk~\6?c1^PXݽQuq>!al㠉@U\o>abza2xrR{^ fL|?*/17kTtȝM&L\WR$U1Ge~nBIS|r $oKP(D4b 1j,^iS%Y1Vd)wd3שTLT)&%Y`bL>1h) Kv#ԁV,T+ĪXh\dƂXrёaJfe+17.ױw?q@, hlSH|xD/JAh-l ;va^eѬ-l5lW,[),18 U v[Hp̗E1%4Lu;KYdW܁U֞ m̾kH;[^"V W?h4{Łggbqyw]dwb:V=ksbus++ XUkF_ًg߂RtPUؿ l1aͳ H~;WQ 'Z5f aa wnʓhYgu%i#G+.tWiB?kx Z aC_mx\bPD]۰SIc;օ`=vK vF,L(Tƍƌ[H> xoHiy/Ū vv(m"޴b3/0ۙ@T)PtVJ%XtVsS"iJcִ1.Һ_S Ala?v+3mwl<ڬK*„) UwV2+W$ h>v),ι7)jAcB4aZ֞6 Sn *BPRPU|YD~L=<V\(3vy Wk T4.|{R+M$"晈g VA<kJh53b^ DϏ˽4zl,b1F~e:IfΰhI3ݽ»bP /GԄ 1mj(.tv8:ǰdeط1fLWFC_=7wkaW5,fbYk9-NA^Yih9,`<y-^X,;Kxu9h4rj- 3UqJX%h,RGɞ}Gg1-+G^캻-L:ݢkhS, Amd ^H46f7B4CYj$5"9՚:8^Y=V6 |ĵ(54ݪ׳bC0ذ]]'AһmJsm%γh:^eY8O'zcE?&`Z3[ _u([EI`W*/a%54[WVwmhӿh)_CKEѣHci`&>Ѫ[@`XV&MaBjZab*M=EbF' emb Kx:g$온 NAsXHmDOgR x,pFKdA:KյFh?NZ֗! V]b:h2,FִOgЍK>e "0 ;"cX_B&adaj$>ʐ>/l42Zvx5b#G-7* ;HfFGAggJ2l阺&;CpXfh]fJ1Qz/eiTW``m`U$6<3FcvL@LtVFW0';>rBЯ-YCMjţgX*T_zIvmuOkjf{0]~ {AMjvsAiy+۽SYz?EFP0G5<3B_~eS!*0=;ih=\Wsh. 4Rئ뻸M/?XP`]y>-LS֍1P]ߍ?5eeꚻJda ܰ\m>a4/,3-TםŘ19ha$  -:6x:T+A]{f\Ũh/L A|86>r$yTTa?/@Sl?NWS\I4q$E,aYm`XoeY.kg}؉ޞ SeC  4'1"9v>fȬdX02Ks(P|0( g&z.̓+Vt5 ˴ J&+$eK{\aﵛ4Kmdݽ#]Y?zҞz)* Pn bZ=w[ 7L ܴxa1 `Pw_ {Za9 +/ 2naS.9p+9;ƻ&owT%50P<%.Mᴦ9Ͷ[44*vŘF%B`] $)Y}m {@CeZ0 /jTzgKa!}m}~vZީ&w FJg]"3_D!=WvO )-/`eX/={YTܬF)no0Yi/m_nqX}]lCIAtgZchŴcV1P_*+:"i4f/‘]3]v X^+;Aj|âh;U5aW`u n/]LFM}.vȷ ȵaMh۰5δy-Q>O؉rV_0mJWmg<6| +Đ+o%JUrk̰3_3h.\G`LixOïk%BB4O6m-EҦRSl04exϮy"zbbu.d7G\P"EXp+ v:3XEM2ŸSn#e@΁Fpk۰( ~P%h6<"îhϰ:YOf{Tu҉21l??[k*lZYM<gO$$\BSl+´;\`uO`j+ Y^xfwE9Qz#vt8#ANi ;\|kp42pZ*=ׯ/ZF `o߸iSA}B_Xfnv ~J%hwT[4yL5}a"0I=ֿJsi1U\bb!NvL<e,4Є.K[ٰTVALhIìH1#ΝH̓ ֑`ŕh}i/JNuIa\?U}Gձ_1Bh̳e-_䘕3ҹM?9;$]NagX$٤bqo VXXΜփI{}&^Muϡ}l(󰏯҇0 }x]V2u#Ȑ KFͅȋ WP5Rgga_Ņ5͵FRTG4Чá2UٚFnwr{P.\G!o3kfa5 #l}*`Rg=4TMbP{RMzȖ)}Ȁ\Z:!U+{ Zf/]NO&O-ִW>wvSXzl?GlҺ fٟ[\H)|~b>\^nnCa}s|i{25d8qacAYb:{*b;0ˤOiR.ɇS1Ҙ,ڟ0 ĸ){iLfaQI+*Ka{')=gQ[4/utR^J ֯wЩ ܲ\\!?e m#ϡ]G)%Uf J㌂CaDt;FH}7eMAXphiY|kM`YX5`k`Lv0N}ʄ,齛ZyY-VR>Zv`]tw-|z8VY?id]7chZTpp2/s7lVw~u|F>6صEQrMdR.AiFXcJayI 5uֻB b=>m'%qpah[` oHy 䲈ٲL}TYAh&Efݔ)W)c={K`IT\]U~m!l –QY379< $d!Y753aak Bش/n Gpu F!<;smwJv) ئ琱Rڦyl>' Hb5=ө96ǰ> x̚e>?:"Bqj*ƎV(h5,vb5ܸ=76ror|>gz%<Pޏ[1B^_e B0Ыl$G-=9Uv/-Lfs2qaam^4.C6̜˳ȵ}ZWVww5h{A3a04 [q-H?YB騞V2PgR"h)|M"16R'Kq!΍И #\>emXݏ_x0]4,WS X[!aA4ZʵAkM {FtGH 1}a}Rh{\50>{I[ b?ݤ]2k 30;g=~a3, 0]|R.;=LF Dz nM&Ŵ&~DhWK%5d!@x.G}vgtemSNwl?7 LŐ)^)3 _Z րõ>`cZ݊`/[K-,EQ)Pw1l0-,IVip'bX`N4^Z\+%5ov5ku-,^B׈3hYg^ʻFa;(*5Rb3dhArا\ c q\Ni <&? 2: 9Oy /g ؍cjzPvk F zv9ΰ̲s% [`TW1kVv~LU$FU%FB5?$4S?I5h," {G4u>'u:^z[~S5,[*L Ani]HѰ=;3d76xX5կ>`-Fvq3Ȼ<ȿ, +{UO 5Z]`:V Ϟ> Fq7C1*=V,4/_Z&\&D,k!N!eiGlΎX+4-f5 .ZJW89SbײZf^'XvJ%^_K 敍|”k1i_Y5)yX|x-"zy0'#FJaKa}3w{=JOg X.d22 FNf\ĻZwH,C4-Sf S;/>!GBݺcEé ɕLā5وaY`ikX`+Z2_b|kP]XwtHXZf=g߹| 4FS%Hz w(LZT kH/z?>l{tl~ H> GuI9# Ņ[4H;ghu᝛Ihb`~u)QE`ɢ}pX3@=D#b(-ʳ1$M3jPX\tJoиM-[\mfah^XmWH皰zq:M~|}ra|{onm`[L κ6X \/kf?]&) f}>!nb:ݰ{, - *GfhóeeIyvh6/9@yxz9 ] k\ #.,X0γ (@6,B1Q߈O"`?_5/9WC_uʸ=|X^vg_EĵAijzֻ_=)J=%1Ε7(Y֏]R)f^3Xv%>}smc-[A{pxHA֎\&154/gl`5X +L.XxlmAa33;6?.+±#9X%]?ObVX UVsR;hO;iΙ?bav {J˸Ȭ-.( (UEvPE{.&/YiPx$pbVY1nYV`yF^l:FƯՇ[_66ԁgѺkbDƯN3j;ni.޵<=$OˆZz]uaѵݵrb^xL4 g>h]H{4~J:W4)dvv-;Wxjbi` Jzչ%p(XO=wRLeoB"2mPZeZ3FU*|PZ]2u{0[$َauiO'),ٿ!4lrZ{^_힡 cдg~X4ɛ'u0RywÈ~0]G-P3c6,_XqYtMKf1w2CΕ^R;S D|7vxе͂@_b,_0 K@\}YPUͭ[A@X4Sj3RX kᓓ!, Bs`^ޙ Ff#4Ѹr}/֋/]i)tףت8 𦺙/]|6[QvRpisvF [ Ⱥ3'Y{bA`EHZp~gHb׳g<칱}FTjZ001J!ҭW^a,R=6{ͳ7\_+Gz󣀽Yb3t3AJIUꄼ#֮ 6bN4+[][!K~CAO6I2l,-+;Kȑ`ºC>ͪ;9<^9oh5Ch5㴕M?v/@7Rh9-Sؖ}L<+%ka# ;z4SEfϾɛHuo0 ^5+xV0P#;~]ƀ4+,.veU)DekCdsv0mV%]1 :*"8)ΔíBʴs^[cFh4eV*(\5sKkn||+)01x<,"lZ/(Y ~:+NcwdȘNvpvjn=ݯ]{3ZV%1.%RE<F =|f\;ުAMj^-3oe_@eGmŮ ٵA}<=f/6H2;fR٠\K}[ְǻ@.7zƫ [y]&ZT,YAg\,Ka,KK^,([Gkicu.;z** H'ia|Oft Moڲ6~o H1l\3 @ƃ rqi~p?D/AIȊSxřVK9$( )r<Hx=P-EنgDѿi$!r~Eni)fU_14a;_ ahOyQ}eϲҽKrwT]b``y dKJ s>z}KKŋ.҈)1u'D%'lZ;flڥS~fbһ=gb-,.L2 ֏}Q;wZeI8i$اlFSIܴH~97;\Q)U<cge]홎v;.\ƍO9T 7.3@vcXbkYhNfmaR{kTzdZVXtvZ35Dt<)+ 6ԇq)'[5ܯSo>ͅ_[+ĝɑ_}4qȻ"k`ёY|?CeYE-Ǚ41[Az9)ER{sqߋ}$g+Ş :}k̳-AF 'J~{AELp.k֦E4p1 HJ\~r"O'Q(MS ſgA]y9@b哴KO$Z#iGUGL: a;wΞq@u*,EYdy'fŬ\v^T /2YsyxDSa0=cRSNBq£z?rYb-[4LGf?Vn۫\9PbX.*Wiglw`\;yit|khkYVٿb6M;Q`PX["D:Ec'Ȃ;(6Ŷe2˦ s"i՜^?O% 2- #(dx3"ˋ!wE B3} Jjޥ(yl(mr/QY>a~}J^,.3 h \j* +"|>4?:l~.x60 9eaKfwH%daoޜ%a)QwijMAR]aMS:sδ{~}(do6Pa"֞,V R=Psr>Wtc J]ymsUar9I@Z>wGoSy}y6M贏/^\{uϽFaX670XhjVy]Ne<=o+76h/|Oul$_>Á%U'`@4a`XonBŠyL?OB"S(Z6ZBse]m*^.Di= &EBG<(6*EyRWZV;Ybryf .Y/wİ4\f+Ñ@q}~P[Ͱ*DxFvG>vɯY֊]e{W5fAQ>J`߯o5=I•Hj܂+ \hTdDZO݉F1) u{& !Z1DwUxݜ/t\iּ氘-m}[PPgU^PY泶tӼ#] 3?߿~HXoU2г,s%e>g$GMBKƟH{ u^h<k`X٪q.?k$V'ִk^<+/ݤ $xm7d"SXF|fIk9AaGia;e/YamT#f\jum=6khf#9ӽbr]Y߲w{:_ sF Uiϴ-ü3iRYcSl]=s|9 ; JD" â Advvp? A0y%hցf-[F`%5ﻻ:^D2Le>Ajuڨ+k9㕅喏 L̳_ěW@q쐪4j=k< [ܒ 3^aYb|ur4 ^=ZU~^\{t&?_JUf+KU.CT&^#(Mξͳ,-uZ2M[I;^ ,ر%u?kb½˕β%HBwRfL4wk_ dKߡ_)-/ =D[a./>a,+OgЖO̓-M#"׳chlOYZ1Z J?ƃbijhZT6%Mle]0oyJE΁lhJGMgW'׷Hg5LA4Żkר@h60DC<浭%l<3sXlڰ~k3LvgOohjj,axn~]=Դ/Iy2-NW{_|PZ}(]\/qReӄ[Z/ajdw$R7E ˳M5]3Ki.i  =)^M}]!a5? -L;*o"3P\g {ӑAn`4,;>$VyOmJ=hX-ggY)\FhkpZ:sg񇻾L*7m+g{l[ڶws锻. X [-_0V_aٲς;wY,⨽6P8mcZ7^g5B/H3:0#yzסD?+s$Xխ6.јh}+Z萕H-ik54.[l'W#eUy#A%>%Udŭ߅)99ߵO#xԊbxCf\>GչNjn?20yj4D _^B%~4y `f֧muBt YEw""@6O2ee?}Ւ>sHY-RiI~֞UOO% e_ɇ&-s NI-ьF^C _t:ԲO.78P6eSFJL]+zG'QΧA0 HrF_x>Hpg%Aﲍ9Ih8V;bR~#U9tͲ3e/?4}aRH {J̺_ s4.d3O#R vEOm&mX&aY˵Eל Q.Wsf;֏Ѣ{7p:H9Ob_D$;ׅ7 mZٵjH,Cq(W]zkxvbK sb݇nٟ$;ةr%4g>P.PzZJSOY̦T$_K-M?uOo?R{y0Qo1&x}, O#`y}ʪZiiXb|žOfgz}ܷ wR+ v?Е`}S&6c䧲%Rxюh>/ `岩eS+RoX$Ӱ?DžBg{9.bʹ.HlaH1pzFkzfT_AjM/1"]H,{ ;Z7oMV斥>6ڨ2"XвhݲѓhV2j/Rpk#{~bյF ɂ. m 84OW3a) *:J9%ŭg+ӡzH;tx_ G4w,"ǛvR\/p_a+#2nԌڕ-Xm%vR+++8MZ;[DKFe3|QYmy<,+C 04-i :? ]$:gcjXb1FȲBުX<93)5<_x5b 2-xLtsݜ,CIO {z%ӵѤ\='Gꦋ#]󪴷W*cfUIENz1{8!pSm:*ły"05\s;O6º3U뵒oP7KȅCL?/S"$vz82}9ʘeCkm{-,] E+a!|ns5 cEӤbeV܆ms!@^co?{>;4|"OdWIBִ}=FVMx{Ted㢪Ѣ|"KK5w ~lV"Ea=]^kVtL^FI5bwy@¦4,'vg ߃F?dt\Ywg|}R" vJ=׊txy'8FUy>}ϿLg? PDn S??}σDP/Ͽha*/?LǍo]ڦ@sM;lNظ59C]}.v@ܱo`qRfYhh i}0],XWB(^_JUX5x>/A'cԘ?l_M 3~sgZ ^r8qdy,4.k} Uk=gt -*79xȍlp|ئZd,OejɏÎ~9;wvEgZc- wJV^ro1PZ-N}/[BvjT%O$5`/lFZCJez٢ \+v\Z;R!R_„h4OXcZ3ECRKZK#,H #=0L-:MTYZuLfjzkdaW02:VezbYca2}~lҶ-4PpKK!:/V*-΃U K>FfO\meW&]4">H*3PvLa[d;Vg̾Gh py /#kLr맵YaS{޴N3aPFќ6be"0R%bR2c#Hw=ijص{ 4v>>+_}gSHOrXe:z uS1m&.u>b$cFLi)Ͻ|f^4s m x:.}thĿӥ0=Gvɷk\~*\Yِb;e~[.\G>%; ,'ɩdW+M"]׭{D%1sX8д}kw O :ʍ%zzGssy6vP] ]%bŕuN矎c;"}j¸ֽ39qqyǝ! ~#a{X4h:{)la`VF^V3iK2|!Ѡ3/-z\(Xܬ5> nϏe7H\3̠c ])uk=;iBVBt:[ 9=\*O x&UZݵa;lM,Q_V/^&)ssߓl9 ROeZc~_1eٖ qHOɶ) 3(Ѓe=kL!љ:gw$w݌KvQ\O[vγił>Viz}'!X|߬kx`ջIKe;wZxKgˋT>*fvZPIњ}E-OZgWzʫ(X(}sp65e97:\Gx>?Bw_?C7D\-+1Td]VPiJ2*Φ*L.D"W64X'b˾!Ӱ Ckɫl;pw]w>3Kܓ-tΏdݨ:^`b?H (ĥ %ru1OQ;dq=zXmRǏ.`br+MHV4^lt{@ TF2怏0IU pmJ QH/3i\Hd\B1O4 a`t+YaPߐ>)Ju3lΝ&AG,UroJ~- ִ`S'j}ãm).-o0ޙ,L^ڐ?Lz_NؓaݹXjgWDmC+;&Q3R,{ _c=ypؽ(-Um) 'Bkqdw{&S*X2lwQH}=- +޻uTϰo}&a8fXk.{ހ4P`Xs6ܡY$(L9kM%+%Hlw0Gmއ.dƩ^Ax -t',F6U\| b4V{^/[|ԧװ퇳9eyD~{91C߰x Leٜz9.l^E#T+ ŝ׍WvxSnZ/d*:vtZUZ[}_-2h4rZ[3V>JH=gC:8GjL%F!vgX-S'<1u:OgؑNtм6iɳcUXFl9?V-FH+{qj=STLA{zvO8x8 Y,LtWMwvyKmbEaL@tLc%%k`_`P&X{,gviؼS*<(+%:O v'ﲄY;Vvl97sij}c'|ުj߇ZهH-J[]ޤ.@ڸ;5u6DZݺ#'[u \yQ`YeK&2| 3}KvU} OQ|I.=VsZlofbZﻝZQVUIHvU-O|I@Ge3)ۦwaXsNݕ+Z`5w_mysghYH=.o"3 kK92BEֲףֽb=;ZmJayY?&fƻlO?8%kAGWOWa{5zBc(۹7XAѳjX cfX2l䵧@kkce$!p)֧_e?'IAؿŘ@Vc˴ՔY׵)_T<.At6va^&=WnizL}^܈():Eq)}Sv ;NNơPa-:ySח>O=̫akh]BxS#BM;k^'Z75Q*G?؃}Z6nZ?Ϧ#eT?d_8>5Ӳ|ݮ,n79.i*V,]XPB^_Nfۖ]#(=>Tt_)уie?j-og1n;[-sY~R e G2 =Ta}ѥM2Άy6}~RmJvL{E[`uS3avb_źGsea;025Ob([TcwPpZ[t {>l85ѧUTz fzp+] ?~Sga7ذ[w JE?7,ֵYn/>=o~p2;R\S@Ѳd4岞\6:m1`QXmiOC5lSc/‘i@FHh¿I*?[_'j۲Ρ#Z5^=IX(m"}faN}nCoE'g3HôvNp[Ôx6HӳpQ~ZW#"wEM|~ü#)U$Vfw}cfoGp9w\fG郴8r7HrM .+ҕy<θZ@ͼl]]]JdVi}6j$u㢶QZw\1(v?{8~ L;5T$H1l=ޯڔ ke3͜MHoKedGͣ_'ʜXmseZl߻ŕZ)yzO (M2d_/_+Ku濧w*/uK:/T'-z1s|z՞*~ռB$PQ]=hn(#g":}N9I3s\$_ 3}ϯd$͆Y Ge"<555 cz=d;F2epX9-\tLcU#e~ݲ*~{^?8&>(&L^ Zyz >ô_o~X'ヒGUƕ%C1l[*~SU>$V oH#?=kgS[7^k&'m(Ȱj*Ը3q$~5V.74(/&C/]2΁$y[Uҵ~ƨ|(D9zOjo`~\{T ɑ֍Q32y.l2.A[ g!:(µCU-y9W-/v1/蒶jwh_?je&C/$[7CY$syWrȯ *~D\?s&~_=keXWMQRb#neDptQCsŚm6 8/$~YvaW?v\2O/v8I%Ķ (b9*6tAUmhGLڅP>i!m2FOE;ɣp fI}aQOobɉ]*a!QxE}1YݶYp>SwFIZES$;4)/6]M]\Fi@^Pڧ}t-Vv_x m-, X#0>(= W(~35_8{>BP)Rz FRJ9i\F"7TT٤f6T=qS_RCl7@.f<slfI& ǒDVGbZY^ jBE858DJ&,߅Ğno? ;s\/mG|?\*-|۸W78kh~Vr8ed8{}mذMWsd;.m+NKE9{P-XwL?Z2G@YC|~lIK~˭vTe$)OۡdUsXB/8(;|Eedw^JC2L^'e9PT(-Զk7QL5_ S{Vx ܪ$!,[琵4VK[Y&vniXԿI,cY}\_{0}f7`aw_j%WuwZ;n/\Ѭ[giduaji_A+_FOZپR *7M_Ayq`8Ќw;6಺N33d\-޽'B> = [MbO}9,I)Y6,3eݶng˅!t˟wf2Ubr%*|H8/^ϋM9]z_NeD\eQ`w,';zS/qi3GR2KMAXָ؝Pcsʌ}.4t״R%]C/vXjyw}ܳLeVaQeG#)x̛=&x q7k˜;F\anЋ.4*Ƣd}\4+.)>Cͤq)uٜmrsKg<1*?unTe9L}TVz[r'/]!zury-sZ`|"HɃkk^k3vVY`,ob$/h)nȦ 9| V13>g]rn~6&i\}O?݄MS9æyw]yjV}5נ7A>@B4܁~" kTl~t 27:x3k1wQt`ka_\Yp[w[M=Ibz ĿΛp}zRMI{%scyʜOO\if ̃iq^%^ǸvZ$X/=~l-{mF.zj):a V5!>9 VwStXve@ԌoBbgY X}_Lнs4| R<~ȿտ>Fz.֠|(VZ2+'ϓ9f!yl=IyZYL93;‹+Tgw|4i-oJgq~/2i^C -fDUyY+˪z-s/}dX*,nRgoɫ}&g焎K{n/{L=$6UxG~_MY~_s(Wߞ/L /k5h[6PP.=;=r0!R%jft?מHLwnZ?*`ftl2nu]|~̟;;U|h٨nRS~O"+ȼVꭵQ`u&L*_;"_F{OT~yl-L~X{g\ z;$"D+~Ҽe6 /|K/?.GEDn}'#_٩$P;l=ݯvĵJ6 ",b.|mn2۽BSWX\fi.ߝkVhPoƚVt0w rtYgbO5,* a|3n'K}zZ"&>W/oӺn\%Y-G@D(!ۥ3F:ϝ# lsz@`ue]//yw"n/a^ d*6ZO ytkzzL׋|"abCXtj}N*6klr5eЬ_Z( :+!hy9oS$>WIizg.N_^),sg{s@,_a9)2~,M$8+3&-K_Rrr-pXR:6RJKˏگy4{ة{w" a?'L3Al9-_E&b8ԝF~S>aI&Yq3>~ l'OeO҂x֢zHKU+ӍjݯL޻*#e| |L𽾒=N=o&}tgɟ{5+ųTɶP<3[eb"Ń䷼K̳&[uqvsL^ 6Q&VFkv o1~[*ߟ|Nn)]Ϗ r+F}Y&ΥNfֻRSk<>UξW/2 ۨY.G!g5깷|9G}PvS_g9/EfC*p;ixxUGhJ(Y27IY+YPrݞ?/ngn>ֲonyЋ1OLz-^zW=zW,vqlw}%^cyYeyZq%֝i?ؙxy/Ɯ(bx^AM&/㜅ctxq~e}YH^n̕kM]e> XUe7Ʃl,03eBK{hgN͆㋷K}D;9CE.nXe2-̵'S&߷;K^^ctI-|SXO$Ojy):T+ #%HTR^{ u滨xW^s$eIHai5jb3/b0qzk?6f}\cٷe)u)ZZEfj}+PԺN^<WmujeqI]KC0*AQgI.%~CF`'p?@ Mݲa4NOkV^iz fmi'V 3XIǂwۮM:9AuWذ{,ܴWObVJ6m,4 Ґ9?sd٨GvIh? Ckhi{X=7Rc҇Ϗeq^Ib[xx/;]Z;WK/vRG{``xܗWnSdYcvO}n_d*[ow|h<nZtSr)v ~g[x3 ->$G?~b-?l_'Z̍SƤKӮ~X:UF)34;/wތ7e!jqatG:˵#< -j;Cx6m.akOsKPizĨ*E +NUjQIoB^bɮt7=~sL*.'k8!ZWlG }m*Qt XZ[4ekr#K쭰 颕fMAݴ!䣺߮.ken{ v\QG$9˿x,=o֑mMEus3>]AAh GY*2ϩtY$ eO!aWd-zx1lYt e{ɻ%1thvVtEsڿ%#K3 wkkV]B?'B1>U(|ZrM+݊cޫ Cjk+2\XݷfتaKzM|~zr0P}@Za~XTbgZ4L3rYd \<[*LDP T*E-c'=ˮAe]ӫQm+Byk&b:$p0NhRn#:ceU·'idϳ<7<55rE"wb p oewVqhDitsx빤iXB2]S LпaO/e@s^f#O _=hߛz9L1yI3߮/H;\t3leki[sz}1Gqzɰ3Y /P\Ǫehob1DoѯWM/J_{hנó" lO0WaǼ츒q5u7w\/̧{/[-+/챳&!Ieēd~w?;y.zPZdzR>l#W)fetWDZ4bM=S)WByꬽӲr?Ŋ3~g7W%!{?')@a?5^qӼew+6^m~ag0bFfٸK4RVc]Һ_[7d*Rus\^?(p>셅o~6*9UIz벒9hp4=ON3ۚ9 !I0;. +0LoG}3HNNQDf=[2Yy{T_{^Dsm<;ch/3낔boj6\oZf;dCgcނN?ow {σK9J^: ڴMl%3g*F2=wYso=5{Vd9.UVC#WdMWGթX_GOJVsGJIto_yݾL;32jd Ѡga04G8quyC3}EWe4ƞsqSm44V~~R.Ã56gʛ[w^aڻwҷ45eq_;OZCYxrm;/RǁHm)ѓx'A:BjCDV|nѣ`첻'f/s7)W t`Z?i?<R(\-Z$ebdͬ=F9}e'>lfFY+kdqzgZ]ַEO[賻/0: ;{tFu|0Wz}|&ZiGMLyW|09ȧ.V >pMѫT?jO-jb^&y&͏Tݬ}'R}j3,ϒXZ:gYgg({^<.oyΧh~ϻلvt˥7~pl{M7twTwU]ח(|WYKJjQVx?ARpwM!fP+k>Idfh#CYmpUe118`tOnvp%ƲuW)[; q/9>W^gY3T_sкiVQOUni/*z) l'ZבW|yΖ[GqXƬ ן(lu;YQp}ۙbhz߂o.$F[ g.RMtߪt{\=.d}5;Q\ҪW@NK:FS.\iHKTw4&X|('1KF лvsV&|jGw/mߍ_4z_ܨg(p߃y|2{9k=|wzāX]J%QemYO-a3;麣p6};K%wMFi][g!xtIhH8-Wޙd6_ݦ}>φm2s\MzMqZk*棨qaZZ\z\ flr}MVaj{Gr̵W`/UMޒ9/g]u5ιfU;rZ$wp~9jk3P-֡/N$?y K3F~lkO^5GtzYVYMG'uS__IjiE-˗h-~R 0W&B9 B 5yPB(.3uCdfdۧy1=OoK6S|'%I̱I[>S'^,Ι|QUu&j4p: GeCW $vrOeRLyCk} Ÿ8>[cwxp$:./Kb w*Ivk66NQ?e GēN>!9c2 Wfcl]\*yTLN?{Fg >gd 8CÃsRJyZf nٛV>yW?8-oQ*E%*){0&0Sدw̚^m9Tl>A7a C @]ճf8>cP tLU7E["d:Y2W"San& 4F*?Ւ's-KZwSI%'sOvg:ؤNC.qg/`4O#94G]eL< Ac%)ߣϺFCy.غzx_2 )[#ea@ؿuXGM ε$׫z@>`lT"@oVp)lwչwvދBعMT:)NMOc0G=аjytF3o|5G,bNt#=oZ<>2JfSO;w/@f={9V B"Awcz,HtpTHW!H+AjM{wN#fDuB6?.ߖЧsߴ׸oA?XMR:*;kc 4fIzk1_}Goj2SGGx?S3tQbխ?BIܛߗ9@ NZW}3ju]樟vg:?<zqO=5[q7_>8|N;bΜ?':0|+RH,}/t[q6l3 5Db Ӝq:̭e#Wh E,lEz;P4PLBz!]q6Ia!0LLF c!$P@ -: j2.~y:CfO_+nJO3hj8kT̎^j =*WOi_ǓYw~Vz<^>f^gvw|ޝ0}?'wz3f!o-7Og̝4ftkɕR2γMe_Zχ麙^&YM}G(?LQaxܾ:eo#k| Qi>dN=Lعy?v:z5jq{c3y/|t߅z+5vϲ|˿8#\\XC+3@ ~͛ R׌Ǐ&wC :/\?A~9q]xA"]d/f0Pz00 3i/D # P:@[%[54{ 'PWmASsi%N}w\uGvy|Qv.[fzJJI,Z֒.ji=M-%7O>uZvN'1=9wZwsvM _?G\u,rzou=jLOK5;Ic+s%5[=?͞?tjޖ^8j?]G  0 g&6q;*-U@u/Ϫ9Qk;_\YE9I!1Lx˻+8f.% 5 {y悟 <߈',b<$\!!ցn(tNBOT@|`O;iI4@O@x3e4 v~O^N7|B; }!iHrAZƠ~-1 fǸ 룰ઠSgzt~ál*='UN_Fx\$׎]gb&@@;| ߞ;oeo8ll`@"~]eX`  (E-wAfwʍf i}8=bJO)kk~> F aF1Jke:odHV !Ov a~SkƣVeY/K&Y~ *- }u)(PׄwH ߬ N)!1IYIl؏ .K>g;ip9O6ǒnR>BwR j_QP XЂ. @G:^?|P im#zAuM'>*s`T5^fL/)l0fUʐT2+P  njB]oe}j۾L3Є9d @_cA([jSGTN͐(opæ@;|xnO:(7iB GEL)S'?:l9; 漇H٢sJ `[ 1*$3;mFk:}8t.*Q 9e0\(Vv1pj+;2ra|iج^lO Tx8>0ss JdV)$s-f[LjkC%Kº:Bùhz]W=V.=(Þ á.+Wz!˥X! /cÅmpلځV }/7  `Xhݭ&ʁR'yU"Yg@/f[)So9F7tPUw\Pw΀^LF֟f1XG&pnS\l ݲApU,@hM? jP37;P/oAqCyu6.ܨ BNDvR?o~Tz@'<(9/ )Z>ciC*z [*|C@(Ko) \NE|ģ=]An+!S2n_BݦZvX/b@uXPt?9G!4n J̥-8&(”eF(f恃sURսaSeFl-+Yok V3J !ی?W|IU?EKh?j?DŽ `k?#cb|kh}m-w0N=v!w]}?WE9v܂GsuF(oR;6 %*{͇2Q Tꇒ}7J{ ,nA{'h%sbQ;XUj\:~JD{XI ih}J +TjVaW3Dķ^;v7_a؜EE;[ߦo/%G^MS"@dK'f]w] %h }wb|rv,Q4߇:0fOhp:{:>E񐷚QB̄0P& 'G+`1 8@zAC\Jd=ݠԡ^#tIAw0\֞TⰔA(5czDΝ8BOq.!qCl:L!CY +7zLCw#qx%K#܇ ZF#M9nQ^gP~EOyJ~Ν"zQq;cD/iC3Ő ?@_C`_ZQc"~iW *RC-- V%#|aOمg kDH?KhWO%:[`0 M/mE&$J0VopFHD= 4cbֈ-u(\m y yr"IPz]SD)sY!M`>aTеḃndC8BlIi?#1pEPw%w][RtTBQI£xhp; VtKzF Ǭn: ~]+Nk8$Sׂyl,o\<>ǗuYuyٖ>z#Ul#b^D̽͘q( &`\;@A)7[@'A9ib'B2%eBɀ]Д0Dnp7鈗.H!=g5:ie=z5~o':1%N2A}@NJ1'hl3"LSs~t€)x"d_`j tIófnbIN.WAc}Jb1C)Kt!g-y.kR~Ǒ-#Ӄp3h< `A_7%БxSP#>šAǂf#jHѨ{K>tb@Kl";{~A~}ǫ疤rU E@Iꂾm,b΄}ę&kO pYow  d!Zt(ͽ (C:"`kG񂛠FAD{(\Ɨq ȫ(ddkQhkX϶ c&La ,??r" rR=H"~+X?pr8,"~i`oQ"9@7zS) [S\qx,Qs+kV{W(ѓ`c'Kú;.mc L`h݆7ifvO)C31OKICR!s"4O :%`z{f;,U;AM~*/Za5!-YB emX|!;i7b\Ec\乕-G\9,MRŝz2=;(S|UW>k2Pmݴ#ғ!q|q3@ zgkD~Gf6xA6:*xF؍Q1^ڲ0[rG-xMRAk Ѿ^E41<RiC8" 1mBQumrtT[W 0C'f˸UYmDmAiΆ{a I-gj{Uj#HkxPqoFu>-]@ W :gowgnb:N|"Jy? 46s 1"x\&Sa'Y ~1{?6zLTo%yr~+0[QfPn$&Vc6}Ϟ@`nWc:1XiX @ *zFRZ \ܞdl\U" g߇*I""Zު " ,t{ QT+1482ԅ Mō>\rl]B_38֬N6x(Ho[^8mA@sc4û}WЬ!Z~r`\l_:p\ tˢ;j2B,LL?0o6O0̛N?+4F:죭kN`“aYD"e`'-WFS""rVmwMhmG$H)vXp 3I>A-A |@ʫ>3 __-tA^ Ɵ_aOp^[&gOLD'[/mOEGb2]ўUU֕+hoao&p譋]e") R=O\VcҜv\sRnbv< Q x@{ueJކ\D,y:) *[[ ?蒔:M9ySC/fl{zj^u${xpBb|n(Mg_FP|"tQ TS-EyqN))`C\L< R76} Q$"Kc !gv.3K\1$\c 1qR] &կWzQ&R6(l3iT j1JⲴ}JE =R~b{Ǫ5#&>znԒG蚄ì3IGt5ay Jfzx1"igTgB}]bvGoxJQia}14;c,@S54_\\MOr3(R2InBgyڬq*I%rJFan{ny$SA](=di4ѳWaz9(:i;2h\+shukQg5|)9 =8vѷ[@.m*wlh3Sp"ZύJ*fw*n+.C{G46[Mg]EMErĭǖwjV*4N(w)8]b!o2f+7$UB V= !VXTVTÖKPTx!ǰHJ/jҮha"Ydt0h7y)G͔yt&uSD1zk9w07^"G-Y{CltpetJi * ,1wwe8+FE8guLS#>' >)ΐ_x^Yo~WTO LM|?^m'Կ$J uZk,&$H6g~P֋4r6ྜ],jtf؝KVjXX_Y]) {ǻ^e =PzVU;2޹I1ycC{^eUSMXY2t'sCy:L.)G/t%|(4 1jn"$e&FNLuא{^mkGbFÐϳtev䓻(70>B'zёQf{,^xf*q;CvIM(=I|廝H峟ԁFL[&R /l1Ѫ3dJdXa\/7'|E"Jo(~8/4gֳQȲ-zX%y5TkזxO'D@ ؅osY\\O\=Z F6[X8M\i6q~#҈4P6؂iSI9츯g,C3`)iH2x P+߁ҟ>CVqQP>7/?=+wIcPXBkp՞#= DKf;`vR]JL m(DAQB'euB;}hڝӞ_HIcp;@%a}8oE\8.ZGG$ ,ehh;hj`hUѐo₡\M4ϊ<~i srkxJ[NQ N򏈮@?iWN//nU/'h<d&L  N^c8㨛+fXJ`ޞ3a< gMu}ʐIE V1> uCtQ]kz(.B|Eju+k,6y}x3E{uuV-}HKiQ̱\D.mx/eRY=ܣ$ZaBǫqkyB4LPfD4֏KeFRzsedg|"b4(-!T簿[9P&Ee]] , WHo9l_b&^ ʮV. Ď'C9".>Cm7U(^p$6ɱPBmx?*%%k?Z% QM6Џy@@{Bb4q׷@_+o $@WX~nawYm{9t>$TpQoyy0@'#CȔ]ҚR2MпGN:!%$Av"ES~ȸM}::@8m؎Uid H.z]f&,&-ϭ젒QgԐ [*i!!nDy.@9 -3 :9m&?&X8jɌ }JJ,N&$@%j+):GiLZ dC=:; ا3ZʆzaP{Q;vhޒloceAd&莥k_-r'0{\쟔B막GfWj[-ٜ)\S!op(LC}d3fʯ !1~X1-H!za< y0( bO*]}}lqMuWc^sTLa&F9_֣q@qO6g)`T&T<4Xf?^#U\=Mǭe|k|9!xSk`>sG{~auv;3O| -*34y8vs}Hn!FVP;_%KJEh P$!pFA՝EgUp$ijnz!|Ph: ͳx&U'pX]@Lɫ^ ڀO@o +BoB0|$Rƒ O @~@z^1ٝʽPBh#[x.{*R5:³GOiJ}QvWvİu*zRRK&z"X7Ӿ۞yioLbV[DwwJqNMO"31pfexB%̃&9nW1ݩ?~:bIULUpfP~miʓq*zZ _C PX$NZzK>x ЗDZHRgpYqk;D`A\bC_:}t Lu`ל!rxqbK!HΗac_,#NBvu ,FIgz1B7۫ۡIL &892^KZfdZR+C PmQ" s4GA.h4>V?\*'xO(|c$Ì)Ssb,µ3$ԓ?2L5 `」<h/"\;H# 0 L2'NC{6x2<xB?rJ-% lm&)W"8ګ*)AT"9\5rJxn!h95I45lVl@eo[J=\aNVU*Vlylw-栳zUVV6(`QwvoF mM=*D&҅e[dk5TE:[N,\hV ?y6A3}Q4EkPP x\#,~/Ix | " QXS;5uװK(*+ܛ3yTOyQ{~qKX ~i*0wRr̀G$^!hEX˽uUJslhS~@E3wx^\3T3?={tf5;< li9 SWOZFkE*Wa~؄\[wT>ҁ~NydgP1rj0agAkxZd&"o>#0P͖7WWVǫ> ޅ{eir"a{W/(?KuLnֈDS?pӬ3EV~,eЍH$\__'$tjCuLBout'T<'BrsE_ue1G5ET #-'},=B9`$F9zASHћhuV%Hn78l -R:G"y}mk^͞Zb+gl8 Iif5?wN`מOmmjwލ۽<5trXHh| l'NE ;ND 3rDG 6`~bChbU*ڧ6Mro!dWpJ]E/樝ף O9ᚋX"lj=p[VG^{ZP4H"$qsBwy CvlVhnZ !f1Wpl!Ry̍ԡ |,~C%cYiI2ߚ^8%1!|*^PY V('D&"7I(tif"<ƒ3aޒIۙ[ ( MRMrk^O|~X' zie86Je$T\c2PWZo?hAQʰ;nvC&C,5x@xwH^OZ(pS1EN>tU#8q)G=actr|8]ɉ`zq)suYAZ"9RaL `:i9!DGBš ԕSE1t-6E[[kNPrf$ ,?p=HsVq=Qr;1jd3Z+-Fy&50'\BNlf|NB@gcim0i}%T=rxkOza%HM/4aB {Gqǟ<+tމzD8n{ \]ɮO6ʍ_%D zT5ciKӠ{8mC^&XԚPOe*Uc_IxYJ6yS [엇ZRn<)&OxB/nSTCaIha(ă{ѸF)܄M5qNBK\+VzPMRxq NFkY+~ \RC%:kGy6﫮 "HQC*v/@y~ܮ&fAq镙*)!O: uBl۴28 B2_6@F]NdlpW&!|Sv;NARJS d%@ WkN5 ')F̿Qv1U-ؤ?4 پPo Qy٠A }'3RxrRKvNt #zՔ ZyL5*YQGiʦ}tG䶣妞e K\]Ɵz2a-DL[ a  5>_ɉ ^sK+(@mRO'%T_*ZP_H-ε I7ZDj}J臉 s|2atGJ)x)X!vJJףݺfdۧ\ hɂdPy٭{WEm bO~+l1=ks|TB'kFW~RK@s[!OɗA,f0ċ7fh+H(!:`sl,vȾTo˫uy@^FXU<  W$ܽ=_ĪJ 9s&VM(mh/b FZqV BtpZ6GxB%] <HeUZJG: 2b0oz1rl#ȩ򫬖󄱈k̇OuMNwu"6K136 u`&R}n׾ٮK?Wvl-i y(47XTEyš[a cBQOzzbD6I-܊>Rga?׳A=ѿΒu'uVi'! wWaZ?V<6|e2+RkYFܰ6tM6rm  @5{b`_ :BXD$݄KU&*V9KxVz ҳ{Cq{۠ulӰ?ۄ+"R@(Ɂ$`R ϵQIb0mu4$@3GgC #\q3;\< zRNM'ukbh"32P]y] L,DeDΆL,4[tP -e1pG<Ņl'iy@>>Uf=.7evߋ`[lE5|-,wTyocim:;1mUJSNCp:Y9#//jHi ajqs5ѲQdvO{LJ˅ádIGQ}4q .Y5#} scM^p֪m7' 0+fq3,l̳f/PQhU򉍗nmpͶ""4۟(EgVmCvDNv @c!7I$b w Ϻl$e vK?jBH{WNK4)Fӝn;rN24T7|t8dQ)\,~qY&%~ފi0z%:>;8PlMDŽi{ Mˮ@FtqQxG9Y.8֘n/%%I#3p0p97l_MX͍,I w2;2U"ܝsIh%ڃ01R^<=(Yr#Y̜#혧и5Cpw;Xsy$mp(|\;|/y]Ӡq#OM l E)'\ikN|c2籕lS͎l_#ԝG 3WaMO3cenZ8YjX ߇t,o Dr5֜vѡ}f~}Mn‹l*@e& Ǟ34feĜM_@Ǻ* 䭏 v OuSiS$ɢ4(xYȳ0UG 3'aHs&|r/%uݕUDZ2^VEŘVmIBQWWrb>dӐC,Gt"NRV>HO tLGB虞 MbT#*A/z 8Xψ)g300eZ: +w }2_Xqe\h2vљܼ@LdɁc)dlZ,Uqnدޅ`:DxXR-{?`\hZ/jtr_ı܉mx~P8)nsZ#)7z/ϽXg]Ђl?(0(GL-Q3`rB2 Hyr (.4b!k}-a՟kߌ9#W_<+pbYg7溌t76L'[1 X9C%FBl\+8E ٱ?t;O0'1 6!eh;p6,m4+vM] jVnXw=yۙ>9Ñ)–[&]]!ڮI; mL7-=~Mzm{^SH"g d (` ճ^ߋUw254 eb!~?E|L~_ lͅ.1K:zn{9':qDuLj*_$~pW6;j03%ܪ:C(oŏkJEYŤR`JCIew-6ZnmX`qڸEv̩ hPBZc-qn̑Q5G:1׳X?dS&\爵fՒF~o(XpGkiׁ0B8*Up cvz<}/7tmXs(7xa-a%-zm\&Ney/MjAr0Hvk]ф6M!4'_W+n*B󐐫/Dbu$RG8pNKʵo,bDWkK/eVN'?'6zb"EBt/'\:"MퟗTwɞ3*"FUfbxoyUMRl[p`+G3" 7H#Do_T2ZvX-\8? liI#tSLE 8Lz.3OwR@H*޵c[}:}U(FXd@)~b`d`BL*³b xׇXƑKɃQǔLGo1Aͻ & ōdt[ҡƶ·lQzJ$0:,8uC'G.6,ˉnm"N)Dn5FGHC N7`5 V Ue97pY뼶y,ZO𝉛iEv G#aֵt4>jryg7;QLϐ gSQH4666  "8t3An@q"͍DWRfE፰܆wy !'X_vg?S@HM,D"D'$&RpC0g[ܻ"KY-7) xsͨ,K&Zϋ}ypaJR)$XĒLi5"SG}Q>;96G WCmE.׌Q\ަY3b%M_[{p>=Em>nm:sb s[(Urt[O<"P ADeO>b ߟ֪m+!ylq*zֿJe؎0cS'_o畂k+|\(pugI^.9i0 Gg*U'Ւ%ƪ4=D=xBfٷͬR9?@ 5.a pRrF77( Ʈ~2R,(V31t`FKՋq6c NxiRDI'6Λ}-K8IDr>ZѤg1&{!1+Nr$5m$I9*3R+έMS1:4|c2>LabdAP}6տ8gdߣ. P`{'S4U]X<֤B4xf:K6Er)w vBW<H-axRIs>e|s=@MJ- T-_P~uM7\+Mzܳ# F1A>f1@]wݡ`4A=*ܒhIkjqV&abPӶGQ%kCrye} 3Y7TW8O+}x%gYUEx;g\7VtH+I'j~^ҟ/Hij q7PGOBsm;VP+g xxϘg:/#D=.>D?tت>| (F-;g'STۘ>:7$䤝K}Va}r%ra1Is쾂b-ID҇(0A>dNr?NK oI ߁)c%I}5&&nИ$#x&-_,>z\̕wէ{uA>[!5}m~y\݄krU ,(bB{-̰;eֳlX?=ѭI@e'^NGՄoOU "j‘ul^X儔&&s'"t< P9!JRƮOXDƧ(wY<fj/vANU~ŹFP,;K 3f;CctRrYᵻ,wQooŨOAm# ǷbDll^֙cF֕8Ȍ3Y|_0M:Ղ}L95%:kp`^y8ە@T a(K])Yp)IH=1Gl GjLx[tpU7L'.h:VJJhTr֩)Ce (Y?a*`n\Z r d(*A#V0 S^e2ExPMmT7^@~9ȎFl&ǟ=Xn PW(ki(f=}%Υa' Ix>ĀtĪسA!)i**H2 kL x\ gzL%/;OΓLFw{(N,̬Nf{ ^/{+ _4W]8i=BI Î7'p*Bރպen39߷NV-@+IJkV ;aSnnAHɥAC aֈ{UGͰt`E[@gi)tʌTwFE$#PL`A U#B`jX sPE"C|pL m7kԛU{ %A,Hȏ/eKe0ǛcuB]N85Kzq$Cx%ݝGyӺ45 Tᤳۼ2]UzrhP&,j fST%9X%jȪs@Qks n NҴX8qҚ,vɻ ^km"8XUg5Mە~% 깡 tg]0.B>)gWOѬF[8Wo $\@]!z5Q&*-+uۈ[]xThG h{)rbcx$`ҙ#I9ɴ=Ǽr*=hq21Z$TM-̛-~ 3[M䙃 _6nM w 򕌎M5&  M=X%dbPܢ1np%_΄sIb}U."zBk*# Bސ2:@!7ZntEo_uI-U5?d)0 8>r˿JMXtQrB!HҒNYRwANZ] ".8yɮd! -F cK-ЅBOTRAy+LJ1چ+ٳve4z,F 6je4NN1*Cf蓥 ۢ%)=+[} 䔪TXM=yUH~8ڒGWk Jj "_p֖!*vFZqY/^kzvP$2c!B^Tc*GK`rV{%*#˽TxL{|@VtQ.7hOQt #$^h (i86Vƺ(%۠r>θAg wjlN⁚"4%{Pd=ݼCZvZnEP:4j30ǝ/;%/5~T~i\tJəG"V]P4oc. # a@4v0"=K%csjI=Y+u)JmK}lO2JKMt-@I_28<^I#;^d:NHG yxLF.5<}F*!1#EhdlwR~AE*0OR/.i# ҧOkw$9@!P!A[ $leVZӫmx7U_Il=6 ar!X1`,܀V=XxӜl谅{xzNiֹ:mxqX%E" go vڎ)e0%":". vO\gn4^ƒo@یlqGnĪ̃K}_:<"!eLb9Icat !7 #zQ o̅#TQi,SO&ٽs0̋ugrHQfү}oYa fC}sG}\#}jbIͅIfZ6f¢@f1xy"> ?yub cwM@gG 혉jiy}|U.H_ڟI&⛔_ ұ˲#`͠zyqŶ \gP 5237SVcKdM{!1Q0~\@8˰{j3r| RbXHˌo0BuC#@#C૬cnt9(Q ,|pb$f kM涶 ah/WR2]8ܮ(+k^)xjh8κA*A0}Tǀ^8Ë٦6

)FF@Vw Bx>}$3 I&~Ƀ؊=j016?YNqeO)oE)+|>x>lCY^J~*Y%m:X-֩"+i߇O~UњՊ /n.[PLOL}gjK&w55rxL׺VUo "܏5Ͱ4:|RGCwWt#z4fغwt G{8!TuvwuKu?@֝yX3{t^:mMu^p:G?ĀVZ #cXEZ_~,}i~ <2,&{o_z14 ɍF8Kgnxh3J#l]}Gg>2`@.8u6Q!4𘷏I\.#htOޯ*Ci>P0?yc֤N_$ >^tSBJt o>2BSiԋ׸*1`z ^sqi{7 \l]P4<7y XA7h՜_ѥHjFBa~+hi= T[&#cJt#sEDže¹C!Cx {d!V:A%Zh’F=Pڍ1hhJ&,}؀Fz. e¢d'P bRA8$&\I~@N k `Xv}}hݓPO*Ho3r˵-~1fNu (: $I}eņ{9)Kʝ62Uq#ؘ̿vn%iPFcwH)/A="tEP;-?[)f3[Д @c/GF\hCuT !/#5JǴmA=}HBWAWS:P/.I_Fl<Ѻ9]v~}_F >FuE:|6]t|!iP3jN R,}Ky`n (2׻)m9|nP0IF~(8"NaG>N `حdRhm~ޣ$G'?|'҂zh- Es?iK92*_U1 㚒uHGI\7&u|r &7}&vM QMJiKgΧ% AAA ]4(ϔaTc fi) |p7#'?A>`Lˆ;^현i@9|^UXq$GJ5ql^n4HF@z b&uJdx_'27*|=*!F p B4]]3]4 Uf%sJj0AJtA8 h_!VEeTItTaExĵ{j2 D邅\@қI-ꅩq=h*)yވ[LB**F_f/ {^U΅d5E$`WL5콌0s%`߃xK|Z̗pqz˃ h'gK ^֜:fMKQR:zB&?w&tRn"P3ZVt 7M#t'n3a.&s36>eKoRJ/HF؍Wn6 T~[L{R"#7 0oCLЃڏi1x @v[۷. Y0IJ$z% |b7)*}4COU@ةCAAjɮC8W־+qKm3 r`"ɼ Qbkh\qm8ŭDRa.9hnG3k=?ȾRsP 7|FHRui]}eʹm44C1֍?Gٿi"]V]Té;c`g&N< 8aXX Ro8S%Lzԯdt{%!H؆x:le/IܯF٣ K$^-+5VPRTPedZ6tZGg`fnn#|7].Ӝv2oCTi?u':? >qa] 1/ՙΦz0lj'I,K4k^2@>>`/K.f^ 4rA 9Zwd?J:~ucnim쬳ADU Q :7YJJYt8^ *=R)yiV{)!D50C/i9#%Q Q?? B1?*u<i@ ejj$ts[M\~'²Krw\'?yyˈKo3],q{+PȌbAG,#[-&h:MIaH.i` *FI^#r?ʔCQᴝ#+̀x"߄ROgܲ ڈH %R_3rD vME}Cm1)cmj7@AA%Pa9s W~czy l5#e(I^&ׂP{17qn:{.GO&GJʅ[R w=sk7FoMۥÂAln{ f^xG%-䌊e|*l55%=_x/-XB6:0WGRPgI]9X-n!מP>~@8e+cHT4YYPCcZ[u!ZFO!o.1ܔC3'a!Նy|,)2s!ʍ92P&alImjQa/O{8a-6Ff_M,bgoUl`t](C 0PK leL2XFA|S Y8kB.aUBy~(#qZU[d+dzğpݘ87ƛVvˁ:;VP83+A=РZtoTMMF1..PY3/OzY jq.34$eK\ gfaJKjxH6$v2n//{=uOǍ%0f/ 2Ѻ-F32p Ӻ셁;Z@щC0)RDn8)͌lVIA ZE=6ln(5M($(Di'~uٽZL٫sZ';_,"{I(\eur \XV`~.䯍#"H _$P~us*\uUE<컻ܗ\^|2 .鿞 :[lL!ݨINsǢ7qȅ}3l׀gLuFmcLs&J} _4+=)\iΑdBC>腊&SOl,pd ={ ΝVJ>CпF/gLBLP+XmZc&Sd')d +ƃu*D;Pl+oe8LJZ8ӟ#AܰlCV0/buP /W̞V=q!(@^fzDЃ .ݐA2)V. OW!pJ|QC݂M lC. _ōUQ ^>$Ϥh?\aA+tB eHCBך&c4AQDbHҸoEt{01d(2!Q>lWn`9*2_MZQ+'U9}x%>s/ }!SleJ| =M`U䉠qPFC5~b 9xFƀHbn Ű{]ƒx?p(G5ȀLNti2,X)E~,?i¡JK$kw `ΚGT"tm5{Oy-d;˼3$ZR5M % 8ԻOe҆d!t|WLd >(=h)7L>/~&):klL . =m5zʱ<0!6la2ͨ/U 3|D@x`j^NOMدp"@b L`,*x'.^tB| 5XMBʞԜri2iN_U4󮁸`(bѩvW]ziXjFfh][\j =L\I]rs[|þʇk RJq\DɵC< TZ(}hߍ7辄-,b8euWaށ)zy0 A~$9olGvsk;/; ژ;|c+MA'EI$ˇyr<2Twz;#ddHm BjG8ᇮ]#8?h^P䂽?n]->JvmEw_8CBof}1>N! J LУ$ Mq=AiPv0=w[i0n'DBaHd/'{2'ɷBS>.D@,Tx_q'`>Ѷ /?#حtAQTN]<$.|C|3JoRl ` N4*gx9))ReRrX9}q-~AkrV/gyȝ0.^_hq''CY=zDQ]Bi6ŋ̙7۫=d4"A枘C~Y5͗\k.mrM5tu7&\ @ Z#s+6/>7 x͇IX)(~-mQURA6.3/~n"Iལx856 mQ+s=nPر$' -С>,Mk)Jlz8+L<ɘ{"q5- z,9e%|*XZC@Qo+ ayG n8FrW M;qI@RygV2aPs; Y==7N`(Iˊ_#H* lԻ֒!n{!,QGⶀφ!_#-^PM3; wH4Wn د&?,qev%:] 2h!iW-'E7ߌ(@Ѣ/;>!R$Ϟ)ޣHˣ~!G0J}UQ&<,@>oT7bsH |W-w 8H\auHCMF«EBr!ǟQ;=:jGc$KD+=4` 5gCHUoRW;EmHk)=yKZiC# `jpsK,Y [:pHBF oD+4&t1+IEA/6R~mGK+),rF\Ũ~Bk:޷dNB}. $vttWA53~/W⺬Z N4XEaeۼ ev5pC>2zEDxI7IA%&^Չl۴M/d'Y]jH1Dn~M #6KLM$ sĤ Q wcL#%4K02HpO&wnZi 0šE/Sg"*G _>$ [hImpՄ < 7= qݒb\M{Ok#4ZO5~CY@qC⌭ َ[txe8g8h\mC rG- na\i:lՒa,{gsp2{X o B _HHʾ mYTIuEmSiQTTlTV\; T` ʾz}x9f^` 'n{N4RZ84-?j fL [#bBrb_ a ɣ(/mlO6CCJ4+EA?F hޗA1O`L)r㧢#PPvDK!c[S4X71ZK}cLQpJTlD!D/SК9a/T;*h_"\\xaso\u*TR^w;7tL 23%UMiwM8;"  4AUb JPpV}}Bvu`dqSa|G^c5\K*GJ(yHR bKalv/ejh ^^2MwoȒۃ'N(!7.,̠#u2p\n9V,lfCeuv}n A*<J0Jz8'yM%'Q&tk[HYw{K֖B4 L[ cXB@T/U 6wҞPrLOe na\?3LIiհGN֖2 )H&oS=\jzv! Nz$\̼QA:-x8st G( "ӒhPƖ4sWaȴQ*8oACjuaY6ribh*c4m1k*WY |y3Hȸ\p ySd8+]:})O84b<(( 01lȆN<潙? '*s&>yBCc)cN})`%)|c(t73 ҳe+;f{4Dx4!׏lcQy%foj!КZ3$5nx@umS R$}hAQA-Nn6kb$E0Ӕ*FeC#ӷA!jF_6Hp#fyr ]RBWиcw(e28%"y ?oeY+Y>(G:|{i=]QP [:>#ܖu!K֢8d8i:WP,1h;+O^Dp) FlB'&`04#jXWM Ϛ]by>`w2wL$R|U|_3)(@'EѮ\$c(3 5rjWmP&%9NCnjҠѢB)Ɗa1;DUC(yUTl{O?~bXb/Ψ*UזoPk Y'W®QGjc$dеv`k+X'< ߺ4u5hAqoٌx`?\HbH8a[ܹEB)`z0BFc 6$)i T|F3c#V֑EkϪlmƛt,AM+ZIt+Yh're>"䁀G\2VmZ'~0Յ]ȝN툰PEUT0{=X 't2 !_{ AkoQ"uKL&Dqa]lZpm9*{r*"i斕IsӼq711t~6V]_:佥($pC4ǵj\b̉/xP2\c~z#*7#:1WlmiiARKU4^1/\/{eҼ.Rs'jiȈm 06;7aǐ(68/ăyG QY-}\ g=DjW^8RMܞj&(/ YJ[;LZyIE2=u承pq`P P)쥻>{ZX1ͶЍ=B긘 0 y q//Qwus^=qh{{4p._1V# 8!>-2+J&n +&O*R'u^#9+kur5%>9оq`h*2+ɥ8.GcmaPyt] N}Ԅlgs}bj7C0tY nEITE)ޭtn뺲r>eI\& j́! 7BNJ&Kõ$HDxMY{wmÁk;׀b%[;̊OuuP-O;z0jo-Uk#p댱bX_ׇEFxB dS8Xk2 m2.#_y2ب-,XJ}٬nGuotqc);@tЏ$9%Nb}6܂g2_u!07@PNl3q[2JAȈ%;P ~I3H% XX0oɃUԩ t=P14Yɮ@1 M'3侱<5+Ow^ Kx9+z]\ȷjgs(JoX+5 /;{HjDz]cd!( [A7#Ag#RM$QY+NF5ds.֖DB0>QA;%Ӄr5{}|H7jug =uBSxu&2,[dK4ąm s$ƽ+@< 5Bh5e) .qa+E3Ytf|u)Ar)ޝT* On&My)-:1J'N] 9 -sH*6 xpRϸX𚯒q&Z㊦ߊ.pI֏tyd0?-6M٪ͯJ}by0J#vz*hkՕN۟uYVR\X=Bj+ S^=`#8Ͳ,ʫ; : ĶV!ѱ.*̆V Wv3zw]jmYX;2(.3I0Ĉ\-:/]u؂ϡӶ)LWs]צ&M% xԵ{)4 ,pQeQ Z8;bG1684?, WK)xwoClOCh1E@aQyG\EC( 1#q>cIStxvCcv2v:LI el.c^P^RrOmTZA7eRߥ1+B2]b[y5mTyC6@QT>@rCCTCVuቻ7o /RivSDu=si 4y ÚT\,l"}eM}?VfqNPIKne mR[2 N^Yu tmi"o˨i8>bR~2gDt'lócgUmC֐NѲ;Jz:O ℇ$/xOQRR*"H$:uReDNǿ+|*h V/&bjes6gux^Ž^oKzze9FSJtTkW ^IugL|f$pejH,l9frU31ѤpzɊ@f߄GX^zURd  Q[y5n`*<^[^Ab{sQTpc!")!j@OJ_'QbGG(h>̌n^3b ҡ~m1ǯ5B}&{T/wqi!*fQMΔKw^i%(y+tX]Fs2YU+}Z[Q'U(ZbuY:V /Y%UY$#f$V?u^ቪ ?E cs1 2*R^Z+^v%mڬ&{>-.AeR5C61O0ڏj_^@BruR[?MECh+'(q*4Fązn#sb4pW)o|IDFBKR%(*M%EU92P*n=_ i>-5W9JTtS0OߚcFTk{ߊtBcY(k͖ߥvR΀<W4X&1BpfCvO>?x7#W9&d[fvK0 +*f(]kmu^_O۪Z#V/*XMםQ -A5f0ch/wo,MD.z  h8fb"V3ݎ> qAgh&FB6l]f Oι:2;yux^gXmЩ_(V\tlj-q'>JBuQ 45zfVOʚn[,٣=^`7*@uh"SKIn5A5Η;L6(p?6vھ5evqsMѼ/lMd ,tA~60 ~s\}{(e |!}E $+;N}Ȭ{Y%'7pDԗx7p#)"|7NJҼ"ƀ[)ˍ j*2C8Cj_Mx1eɠas յm,p[[u|i]",Dx㗎De,ZY*"9]lamdkCq^B1>7d鸅[KhLǎHd@Ƒ9 =}rNN<Lpü׫˄blo#^{CJ0,f5'UTR sy&%Ż) !,u9FcSzK1NLIO=d!)U| EMQsz!s3. Z5lލLB<"084¢V'JO-cZMJmqLDT }qa_((X$;,J ۈhmUg+쉌 ,/Rש=:i2[c!8Rv;T26r{5&T+q4TmvIP?<^_Μ6')bWI;,XF ;ZŖa6Ȫ=Z>w`4cuAbODүժՃ>^Wi -yC$)b 18>b>F D1vϬp2~\N~k,Ttd܋Tmr?mذ$b+ќxYex F dE,vEoFn#Lv%2$pYy5'V@fexC>qM}Ns.S;Ujc/E[eHɭ] i %a1u]% z=p(>dh$,Æ2Ӄ@bV婧H #ÛAfooa# $]S#P XΤq#h8҆=˶1gbp& Wr@SfKm&~݄/ 6sZ9)'Y+ohM@lb}Ol\tU_2 k U)̺$9^t*ї+fGRўaPA~+p' 5HntڐFDƻfQ͵KwEK;8jqa5$(\z%I]=PPn p b[@>;5I;߼g#4BtW;h5⦋hA#]w pTK* 6gSFJ׉пlMhZ^h ;=Of_̷Ԛ‰lTƚZ#;|)\),9=@7V"*Q#-c r'N.ǫMp2j멼=o "M7/=hI14\ hv&*Ne Φ:}JU=U9:]RJ4vw?5 OL^"6>El WػI2I;plzrbޤQC[ΦO#t?hTCؾoVTT5)6J]2QdżzZ:5FE9hJC cap3Gс{4єg='mJܐ- P ޹7"y ~y4cīN4ྠ6-XP%R]-*h軠▨- IK~Lt*@fw稖4& )!mr=w%t~32)pCߥq&]&񓳸M"e<4&wI e֔9 4rR;_l}3pthsqyRΑ. T;IwwDi|{Ʀ{ ),_OϧǗF/Sؑy+'sҞM*}Ƣ7% a[ ߲9?{yjS T20!K ktF5 33̀y,# acRLF1=OE߯ bo7.y(>DUW17b_)!zp_qU91n!͇Be8|=aո[ΐ{F)؆) 9x0tY刦d& d-l<[Y&Z>R?8fhd$ȁ G@v[J لa*莢`ʳTQZʷ ߅cёDTl7)KK{m:!N1H`dAO<Ӧ)ؾzu FШ v doEDxdD .orڋ?9.{ʻ˥Yߒ{"|%-S  +MCZ TpI]@>ꎓ & "꡶$edP@6>'/>aj 3/ Hfɰl]#1Itk,u\}`lCk "b^] GMQw\x崏TYr@^r ~ I8It} ñ')p} u%Fò#DŽcĽ(xJiM26uNiKJ^՚d5U+ K){/rWTL oq"6Hl2W2DۢAδ ]XXF7j,h\G- Ĭ(Y'8> hQo!h;cbE{NE"M"m$CzŜ5$h ]\ѡb'uNWyw+T5=7lU?v wkݿzA2Lo m%fG & SDR?Z)n:s-R}>|`$d=|lvڛ*xH'1He0؇հQ?Sq3Tgl9.\cأ="Ahi'#ƹm"{,OCuBtQx*;6#!sY4Еq/ n~T߂})_yU$ QsLa3n!VZBdh *@e4Lƶj^$Ylh?bq9~՝f ěi =ؑ||ha^0~'֟{%CHL " Hƈclt\mT<ɥÜLӀ|x!lޡ=Ecm=~pgq-@3@K_Ӿn(c h=;G 2JXz\o*%_ xX&g xtB,@&0NGf%۴*KZ`\7r͢WsZZ`<| |A=w{z ,()'neO iK1_<3܏&kPUg$<}7p][ʶqGvrĤ@ha( ꁱJ V\jxW iVYcDW4["Bv`2^#':=*Hi$ik@0GgyҁhW7:ϲ &΁~c`$ ͂r uuȦ.g'zs, ;**N\ox_$# 45M¢h># e8J [׏}zfInDb>QA9[H ^*Da82B:^-ڑlTHƿYk)r ["Lm(cDЄ>:^OނqPx'~Uh-(KBPN.#UifK%$&F:ġ5k^Zw8pau0Q{a ^wFc 1(h|[|X0J[BC$2"L(e Mp񞐮d5ZdIAB)-N2VaRbȳcTE4w`Ϣإ\cs$IdVKP辬ل@:j$V.˿~܏)kU}i1PPidu*+p$4$&~PF ݋ko2O$@'!.TNFm.I!Ec_f0(R+3_WP[e#3߁]AJC"|X\Xm#-E6P/1!<jCG [g9ֿ ,Pf$>+8Sl^c֘xr6ċbٰ=¦G418>,t7蹧*`?*/\^(x C,x,巽(TWc:˞aLrsvB)zP_ZҀL7]Pn山HfW@׎8IvJpR>47d(*_N΀DCO]2A_2/R;NM,OK{s+V1g>:5Qt1YOKߋ):\ԝ#D|j3Uf'H[ C5LejL կ 58e#o-:TMq&œ6x:Duȍd-vt^ N=[+LޗΊΏt.qNDN'EgLFSwL̙tn%8Z;}6;k5&fHSG84Q&\P"Vk*FF;=<Vp¬:mN*=JdMQsf#b-UW`.>@V0r2*O_ 3LGpX׾lg"3-Xd KbѼYHzFOc^AtpIB?.Ɋ^xj#UeqhygG )TC²́_?p/n$@u,Em6aC\2t ^,UbIu$wϼ@,\܁ySPk6_Y9N3-}+PL~q*R.z}{N" 0{P$([.%u#C `jNM/FH4yI;ȟ KF{p)zD;&8;]˞ B8z\9qOPp.} L+ !KlTb"cE+uEӪi!]dzb+iǘ"|znб\:Ƶ՞qs4d_B-[AP4'l>` {x6XťER?U3i&w!tledMks%^b%ۧL?ê{ߨZl͵ѧ?z|BFRn0)CfsV9F`$2vPa[\"PDo%ͤpE4= v@+07/.T$'3n(FȚ7%G~襬ƒJV!7_x/!t_B̴j} ` !˫>[hTgff֗_)?.rX&<zJ0n1eqISC`D#63>yeP%>;vpDR^V}GwR-机 "vJb' h͊qQ q-L0;l)ʣ+\BQ&vI{(!PRꐸtx.sŮ eƑ%<8]̄NBb6AK)FvSj p1݆rfEq=$ב&|vH)S 7-X=\hweuW"@|3T2$\PT)n qQķxTX= erŀآx(]BO@YßW%j@>Ҍms zRvTFCB_=Dh1O\^i%,ÿnּYπFMpb %yNظX%uHOdm~ᑿ+zN~.ҋ- Ii9dEY ZH/AV:c VIZ1 -_W&Wffb k_kB b;j\Q #i -8U|;UUhRz/`)T=4!֑n5&O Md&r)C$3:ݖ^ m# 0$r Ƈ;A(p uf:a؏/[ Hq5a/U4cŵe].rC?-6f}E#;B4YezdG#rtmbXqr]BŔԵ&a];hl£i ZS (@Xsxۖ!θ;oiD(Sf`6 gu] HMCc$CDrBЀczB1"MR79:#6iXPܕ\̄$uߩ!#}?"op$#IP53B+0 vJsn_}\'߸]WUXTIxk"(~Ng7"dNCśu'jּzeɅZnșSK=.͛,YOG,xFm9HY}63U _F_0[; Xƞ7mBi@2dV6Y(j5YSS]ȩM Qk/"[9Xg<,5_ 3l@meQ__ID F#O bb5nQb&9SIh^fPbXFYO7y%Ȼh  Pk Tɗr˦No&aDc2ȕ;$kHo5|o!e?į1M5~mG@5m@l!r)M_n$y[Go@gJA#o-zԥhXbN:!8>}, cjd2&ї9k⿼VjjGgX`t`b xb(4;ɶb5A)SJ sÖ ;[ip&ڲT@;˅ßFFw+7~E{zE #t5k,h'!3e7Fi2z4/5>}zoz*2!wPi|]"u7^G%*CFtG,G$1 |͸X)0Q L5jـסBl~5an-3r?W2rL9"X\kЍc!ѸHjUP~h==p,e7$kog9 ijrf1̢<LË^Hs(ѿXG"4j3Cn>?C{*k󉕏ahb(Q5/O۲72cAi {W`:\GpO{s %ך2\Y"CSO ]h,>e ^zm`'-{{aņ Je{,f5#- j\okz';phEVI"KPw*k1ϧn)m"b'Z݇#ȡLZ1{v5^_Ft^,x B9KD"g_܂dw(DgcaKQY!tc<XpJ{3lwӞ2 2qԩ LOENˈN8H(^r{S3ʻp1r_o NhiD _U,iazA+!x ώpTg_m"<=FʝcôIK9W.'[ ,D~0rr-pW:9D.1U&l0}t7|=gf(țYRXо|CB0a<Þjkyi=YtGZp40SW0c!X3#Li l|!XpW ]S)~ LfnDq߆6 kvCC 礣LR% 2Ŧ[Xq>e64:|+ٓ]zyt'/aUH.TBJHzq6!Ј$p6+Oiwx/sPyjV!ߗҋlw>]NX<}O `I>b]:Z:A:A9\˶Jot:ooJѳGZK+Iz]KV3["Zng#p^5d5c30] 턠hH;EmNN%y%g˨K JGK'uqf~'s<۹#: (Ŷkk"T&w[]#0]\&|4WL.^S ٔ+WJ$G(? `7 "d7Py?3òI <*(ŕ/Аy׫Gt}}z `Ns2 $6??;;asjs^Vv@.h)Z` ex7?!/KEuFP (!` i,Tk0=( $-} cɇxT5Pn̼Ve'x†C+tǪF$t.{%0e[o9s;;mֈ<ږ?f|H kfM9=C˺W8kB2D'>1B XTx2kn!pWďIr;PMe zwJU=$I*d \K5! NI]&e!g G@_]Gˉ/>2,kPCAp&3x8 @]۳?뫶:@ғjb:CE7:+WwMA kpGF5TIcD+c1r:+Xj:fO~?X}]3uӶ?F(?%7xI!K -Nz?Az3R k YB0 NJ# s!/=ɡ䦐^=49A2r%t@N?a2+W4B>F"!sA.PpH%NGJ. ((bY"/{lIN"5!{1nh.H\h QnW[7ÆUBWB1Ɋѕ18}Tzh1=+ۊ͇>`)N82f`:FcJ5O* ضx%|t T4~TpO Od=05Spw_)VK$fy8e?{DiF^'?>cZFFQ чC,V™a OEy'ꏺ*tpJTq=7-b3*NTfg=Qmk=AX&5Cj)o7lNk6!Tџ3ΡJo◚k-3nsL{E߰K~?b ,Uc@!m-RfO (`@KS{ZP\$O`|OgƆN(qϮFVT_DgU|oUOzo3I7tBW& #,[e$L+5OUxglU:89"Zrt>7jbS1d5g6 M_:j?}?Ewʱ@;f%}5{!S[r,kB471c.cc! ByK: BTJq !‘*E~8ʗWJ9S#`a Z'9^`f uj~("NةJCY01qA 3"moDj=^+{CLɗlx*=ԩTy@-rѾ9,KW 3rs*XFfcJz-?WDS-"1C!r^ޥ[6_I~dOԴP$Aȿ91"AUhEb5 Cė@22WNX܌rzTwZē8q|*3g\c伛/( A2?#Ms\hᣡIQz{L '?LhT5Q;-Z7_\$-6.Ƒ*l7*Rrl9X-& !H$j Ъxu F KLX$oVOAYK2MBo*P%D,ҿ9<#Bv_#OmW%L͸Jov,k5[ۮ*;e  I։~I/ 0(l&.See&<2 FڍrM8$H˴g8M:]ǎd8K]VGg{๡3q&s0\d 7?·#l&܃Ash"D0J|4jMQ(=Q2Rwh{C@uְ@dzw" N!)Qn_>ۍ^!dvٖEIDeӰ^IdF1dXI| n)H)S2GFcQmeOɕ iWx SJ@a.PSݱ`N!Ef[r" c{Nsd 3Ib?Xy溍p(D&Hj02Lov׍WЦ;n[~Uu?ͫWrjm=zH*$9mbu]'K;}Ҡ4G/gd[dD*pj~axL|}YTxPgv.N E5&z(ª` E}}4摳VhҔ<tƧSrQ"[*<'N۱s4V(oi7L9"aP*I5{Wfr_?&9#Y55x6q~ ϖ؂J*9v(-XrEފ6†̲t|&QWq۝`8.n t>\;eܿ/QAӣ9+8DŽ>ַeZ.5Ѫ}*BsmdGľCj6[2bGde4gN݋/ӟW~dy>CȡR|ĦVሱ5*>4%v(HkSD2|GlI(tXϽ&x +Nk/OZyN98bb`,hk~2SG,s^GNS&?Yu&ABChYXKn7IłƗ"=)W =4\e I 0l`qgLC̆bSuRYB`2k\*O=gOg\%_F{jd%Z~G;jiRaCƜG`sэe͐RL]!7lE'dEjVpx1GK-~w1[,o0Lb5q{G~ 4?_&8cOs =z׵!3j :&}fk?~Öý,|ۘ%^p|j/ڝCC#/rZ te& 3hzr5)$66zP Z#.(ߒI߆>aҳx Zc؞z/.,%m@dH-ߪ96Z]Ն(GQ}׾Cc|aI*D;:=2[;ڑۡx5b"V}Ho:s<bI#;R*5W`\~@5/m BJ[SAK[ES_q@iLvGDlFFQa'^b&ՂIa۔ / pmB΅71EJ|p4ʕ!1})F',%PS1Ibg_}E{g=OڳZ]-s LBinM.a/e/SDDoAyLKɭ!RɊ:[l`EB.U$3TGve 5/R@&!b6Ul8 . {A*8OE((vE$tJo5C R)6 ]DJz֠@ # =En?7jŘ*uewt׶!=w1@D-ɟZi D m'yݷ bTyNЌ;.T:筥 !7K+ eBgi*,RX'[̭/vF3u'穚{Uߠ̃Q==t^K~_1MSX2 LbBv7Un>p3ۈ"ʸC#w_9 pSY pn Ԇ=C~ڮH 2Cq&<K._[\J3Wm(]V"z!rtA`pśּY J$,[^,&yx?1Y˅W,Bo)JO2++x {qMjYc=1mt'`w=<HꩅV۰,=o2ﺧP *]71>Gruo>W 7%Ÿ%qNv!h2l lޓk~F 71 ZN$.%@֡f~$2ǀ%E#Z+RngvPW|th\¸P*J6$ D.=6MZ Ʌ֙k?yoJ1t?}Y{T&aP=S+k?a5 r {"Ģp(^vϬHUt /lx2@ɱ{ԍ|?PfeRΞx2Ǒ FmrϦb=Q$Ĺ"ݐZ "\L[^lH`qqPYLt0~~ahNZ¿`dlS]l7T0/vcipŝ+EmYsMbNXyrDw!NE*8m}oT"Av$%Wv@wO E8[ >i"&i/se)@&4v ׷dɾvH\AhT~7R*d7P+z`(^ ؾgJ,7)K]CӚܝܻ/S!(/?5Ϊ䉔FOZh;7p.TDffӡ0zb F|xmHZIkGzeS#~TkXeVh*¦rKaFN3ڰM/#,cyz#yGwWÌ&M-ýA5oP9~5 !sN;ReowLXSB ui{o7cN녍c6#ҒΨsb)y?b7yg2siI }_|\c=dz-\bZ*VTߚFBgf $"Ut#azA ''uի~2j}=JaSӐEau5H$*xsZ>zXDG?n*8|-˃s>,Ezi9+E3`M{+t3C MwJcA)]o2jQ?z ?ñ{vi(kQxЃ{u)PYE !¿D9965 ;C+DZso0szv3dd ǡs4 ֜SDc C̳#!S`KGCQeJJ#cW ?ё28<4ADHf+OzWb:hjx];=]xϦCܧpdo_!*&6ӭAOVyPB47"m<6, n/p``;$n Tmq>] 6M=-ˈ@LHԤ 4\d)(R<%UmCŜ\/s\hb8wi<+Lkqɶ/zuEX/d~M/dd[|"H.jf2͍Hf~(#qJMW&00 43Y bjv Gezےۋ ܽ} 53S! }I&^4 @/1N/QʹGW ķC8$p-e/o>"sgI3[9^,)_ym7XĹ%M#DW.9[dE@!?E! {1jF\ _ط@f$ \:@KnǂuZh{hvuݹ h&cوQ-౷0 XպUĮgTpk6`6>X~3&%%jqs~. ("޴t~DfɖxOLfGUG+풐ܓ$rbO> VFW vb*Q& ͝(fNT kPd k^ƃ+cTj>_Y6I=w OPFr<^89P^5|n* 7w 6u1$": )Dȸ= Eʰ0S0V&%Z"Z(ᅨU,y%n0 coJI+X(eyvsޗcH^.f$^s5Y*ׅϴgI:Kt *VG+*9Hw "ŻQf%à /k٣WVF `aMw-po\2+!FCجs%#EWi@:'6 4qaυiG-O6ZՂ[& =DZ0Jwړp@j2YMP1QTLi82#w@ p4[Pr&`Ş ~ȗX=/ L] ESghIu⶛_eOv]V&-3w C!Xږ%]xB K qS1J>ACWgԽʨٍC𞢄8&;CXG&9;I;D/l7Z=*= ױ!w°;Ǻ|dW{d4@1pxv, }z-!KKiNjtdFMk˘(aJ}I%gpLUҍ,%xɘͭ>G/t6d:7Wn=NW YƔ{t%/RQB .0s+"- 5; u.˞Ӽy7:nslZHh?RVMNiVd=~mD@S@~NRoɒ$N&FV\Rc̍3PM9J>0% 6O?|VO <7HoIO\H.\@#Ltq#MYD@vSPVQ,<\~Ro2K:ղ޸λ5E%8|iJ]i?/TӽGܺC 藓T+y(S[R'D7’ÛV~9Db6&ԴR2S!S]tq-`}pQ$ZZUaƍ` #gݲox⧇A8gR2NSê6.v6t۶t `W#r,gp酩dݵvv,6^]<3_U`+l5.kj޸*7˵/ leAn,r!= ~P>i;Ul@)tElZ6OJq@/PG5(yMvnv]m'9Rze%8bm=}8hF,q2΂dy yjCH<Xqw?cW>џKaQ]ԯᘈfBqM(PѩtoL'͹ЭR$ƪ& <8"t#Jƻ;  BCA i[{$)^@C.m,c=D6&9_csya>{BxQ~{uT 7w6C$1cŏzi/Dl6DOR*\;۟g|PXZi]I2ݕVl_x{+"bʊf{juKz0gtϾi \jk_vH7k#õMaGѝx⣲Zߪ mS<1Mβfewю9A$9)A`UR&(c, %@S;_%_e $4k;M.땡o<GQ1KBqxO?W=jϿ;hl(/SuM6ΠJfp@h 0lWtc|W7#c|K@)dWjtɗQwNԘwqQO n%riCy>n35$)<:! ~e7"='eO%|Kˆʑ{6skFcct)76.ԲI1XA1ܹ1siGFjmJƔ~O"bv98D}e1H@(a+XE춁8`$Ȃ"Z~ nwRCVSHQ__ ӉQ{ˮp@rsDa[vlkXh^" ΰŵj-(#)%Aml2E=YЧ9)ę=ӑ~8X' TcӉorBpp̔幺mXF}WT9ǫėnMˍg[t`RMqlY-s˿MM/@@* Y2gba r5f ,H**BvӓIuАv :} 0˖@u db[lχoXl:yLvrNکi2E! `YH<9>S]2ZuxjxBSb2 PgG$nJ\N|ZQ-`0'O@*;Kа@5J[xлÂ6cڛY)왮=M޲{)hJL봇Fvy*՘+lX2߫ BM5/$ "ӷOS}/sm9S7gl %X|-:|#E^IoNjj<%tG"# a(1=XAT~Jǟ؋W/,?3@~^tcHCJP9@m%e9 DX#VZebNnc56}L!Y~ te@hlzh߾H5Y/2nm>cAex2)+'.9wDH Bi]UM>xťq P"c2:ꂄ#iҁJf+]|QS_SjU ~P=ȱ7PN)(G89Hm %HCEۭ;IhD!);\A% Zzַa{k5;j@E.\rZ.^agLږ(qM|O!V/s@Y `ʆ`_P @CA+*P3DeBl0JM'U~ zV $6o+`p68.^.oX"ޢ<}! i9+lm㷪8!Q_.ڜPAĤEփ9n^n^vJ@WJ834Gg;ac ݅>`>N.pOG}yEbM6Su7Qٻ217RVf8RyR(?:Z 3XLNj˒0D -iX0A1b΀ xL_z$ ;@;lvx@fn>v=)L&e`!}`VJg`s{ׄU⶚Onj$91R/jDk{'V YT|i;vLW6N燌IV+_ Aʖ47B Fe L/""),G>4p -/CAGxd< M=د' '/DPwjp:؀X!1I.A܏t6`u?My(+:oB˓TlP磚םB+^tu~Cpx&ձkRN0)m2-_&3,⨅']΂U8wU݅WX "!ig6PְWq߫OOOX~,KĴ'tFd!kԈO\##%mR2De˲BlϚ_bZ=;DۯV/G*݆\ {XA/_OuӕQ4NLm^1.w(xyg/t38_PkԮD=R+ ]\$@`wUl g8' (TLFtc'g.xA]|ڞ^^B¼,2HЬ;G(|Ƅ˳TDrLDI~-HM㪋IyaVOΉDk{T#Uk[}zȶD[ubL>/s|d -pUm ?{X0w "w0(M UTY6X~+[߼. _Y FF%i uD 3P[wwMu%|WxӳRwȤ'֑Yh3kIA$YI> ٽ2D/H7p/\|q&wWJF>Q֮E6 pHk," QwQ0\m+-s=?G"ǿ2l' w[ pDMMa4/Z u+4ZW'YA uD?rIԴa k;&3 Is64+ <16pd!$Xj2ȁZ3.# p,A, _ǝS(Lv%fO}|BXxLΊ$efN0 n5Q-rvϘYӅʯEl;YGsN!$b؊cѪH XNI3|n7{. "-L I棟z3s%Wza Aɼ_BwzWN}y1&}ŞBAV8]-=TLnCcmWDղLEk-so|# ~D魪Vs ~xZ2dU|[!?qj ~,'/"Y8:oؚV~Qj6WI od.-#a iU+]CrGkJa /1:ûj-'>WvғrPJئvDJQqz=wPᾔ.v+. ʢF%%*1z۹8)jc{1^۽u[%SЈ0 mSu  ] X=:?\ 45@K>nиFJK?gbB:S9()>^<l:xlu FrILp8)6M7W&w`8Aђ-b'au`2MXCv0y;*JRI%%X_+{I4#0G sJ6zjQ:h,$D4'օŇ|=݃P{ P{ezWi@b ! +mSǽGG q Ld\WEEN""?ꆓGhP%%.ڳRrh_tЈtIA*A*FUe, +Z@*֌κƾrlvƎlBy~UIq*`r(6N=u4Ilp%Dw׈{5(/9L+Z뺃sP^ ¢7UkI5{aІ0|o_N 9Mi *mQ(UΔh:Vp hlCOh@ȊX.n.Kǟ?j,>^Jq)<{ X.j14Шg۳>P?P) G[kE!x9N)66tLh\A/;<~8xsL ٳCxl҇\N֒y,;=)f_lTO`͑hYsa>q+v|ɸ\vC}aTSl<1hc2݋tٛp'{CP ]ہr\ʶ/dos˟~:W&˩ڠ "J#;xOcJ5?mՖF+m o\cͨK1%#8oOxđ&XδFx@͈U^DMeY~4  -|l0-̆ M~t`MvKa^j:HA )kVQC)wwt1J]Ńհ<ԛ9f>js3"<JU #x>:e)6rN# S9:Bd{s[z:Q(a5xai"v̑rsO@HZOZ7*UhO//FOdD]vW}t y!`0d?6>pНwúwXtJFF-= ds)L >w^=ْ-~Rpɐt/b0K v5-)\I.pDDD[zUo#²5`ڛފA"b!B ğ ,x>3&I׃%IW{EbS =B^6M+?R ƹRyX<Srf5 C@bՙ_ϙ5oKTNS"¢7:Eεs҂-Ggtx#]ڭxhtp(Z4^ `Unۺ)5dhW8kV2L̘gZ<aQ[.==e5=s Ӻ%^{ QbQƝ]_}J5:!_d$1彎%Moa-d[-NRf҄3T %? k2^Ui{v~\-ǵe `IVi>]oFց5ldlͰY]̎zCM+N`Ɛ'x`B+˧,^GރwLNK1 ^;skmO f&ώ,y:ہdJ]vRE{lxV%/(H V O P?'Cbb;VOyRPBݜ<)Aٽzg3$8UG/RyBwf\ cɧf$S"dW3 Too.<ѫ3v wy75v#"1UbҖֳ`ɑ5ԵzGm;* tkRpXO!;?RE[5s ?>łwe|OI UY3K`+v_8~Ɖt\Tq_E՝255%]͖*6d~EiHc0:N~OfU|lj[$B'c,x $5?]@3uΐQ1o=>y)HY~  (bZsr^Iv .|IdBHd j~ITk~}4?}\p>B@{+_1 'aBF1Cwpɩ^Ӟ{%gn *]b4waOoQx/k.ݺELE c}iNA]ck@9AD4GywBm@ڒ]jvY !GQ,LUr[yʷew緂ɞ1[| 3 lf0|8BUP#;eh3ZS$)0 dC$_ڀÖeyuA(nlLd{|+;l%iYzv;IzUGƓfjdV3%Mַ@_ >@,>w[V<*0_BJzvQY?m tt^I%-`='/,hDV\+womhqPBxᮀ/4 S`u!AV$w~%ω:bQ2lٳsfC 1[ʀ0$$Ff*=3Cab$27/q`AϺ0q,AIEA`a@fX5&BK@gYҢ0ʉ"!E,~ԃÊ|M-.̈^z'iϣ@X,O=Jvح+߳pp%L7=hP;ɉ Ʒ S̀񐃰BA\"ȺB-B(.x9rBkFx&nyKOs^ma&Ut8uxϓ>eSD1½Gʧ97i%[TzmMq 'q};*뭃=9O:ѷ!C*60,E Pw.z#G!tP@m9i~r 4~ /u\Ѐx!I)ul>@mlC&NM_=!}AcRL[=\^l&"PDU(ZP_l7lWQ4xkW5Z]޶3SQDu'{#K4V)vF@=9r; ] eߘ_?^,GLbU(ePXS5wCu|j$'<Fhe:Qn Y.jRaT3"_{3sPcxUJJuZW/;ݷy]7UX>{_iZ7 \/p}Ғ=PX+ gȳ0DhX pNi)cH!MtQCF&[WcWZC8>I4p3k4{9/1u#%Ntc|=L`[ /wS5 3[yDѬ`f~bZ0_4Юv|Ԭw3S"֭`gҵaSFnnp2޼S]X"UAGPN {mo 򾃱s65 nM6+Q'xbe7\?wY#պԂ\ Ĺ*"lĵ8߶3eͱtJG![j"uDq83%_ZhqZ'T~(JBx;Ұ#9xc`[ ٝ˳wàPc>':sPgKÕ-| ~H7Oj kֳ(J"d^(ĩutm<:/8J)ԼHe8'p>dk}?dnosKMf ;@r# U7 vna>wB5s}ee^XsBu.{m^O 4/ԅj 69\ TzVǻ?.=3J\sp|~[ھgRn 7  !V#%ɠ{i.KT3XќX JيlCу'BS !%d-VJ@~'$ r*9GGȢ 9]"}eZq?Y|_3&7槭j-"ݡ*t ;IwlX0znfٖ!A,DLy=6!/n2@ 3dǬP +m`D/Iz,xW1Q7ֈ4[n,Xĕ,(_ng CXbAy{*srGo1$g^0NG Okrm(|Ymiֻǘ =7Rq郗1#Q8`wtM=*ECNMh}EPU+L{\A'kY}]Q̟{@. 3YL,C Y8NOַ&W~pd_Y'ȜK|ưS@<cz2-`t 9holqRԱ-&>1+[6H 'h}F)E);gſN&+FeTUXr k7r\VL늢 &N?9z!zW'/3 Q ͯHZi3dګ)ISRZ#"C0̋!xCSZnU? \nDc?VEwikA֓1pt*Y0?ʟs4eyI粶:dNnV1%#tK{h,GsJ <)$ LPT8 _-%[/;\xЅ1@uU-mgp e"*OҒ+È?T6jGL {V ]Շԣ2 ڔo3BXN;E~0S[ڌ%jaۜG5܅UuKs2'<"tY{M=9/C$VoSj7eԏXIS.4 ?6W+aNCFI!,݇xz#Z,M0Y&aXB" m<}60$ Rho90*Ku\7fg v<ژJdV*7tp2?ĘY+o1#|kJ 6RS[2Q[{퓋ӫ'# ъNWa՘\(yo|~*+p1-jzõk 8W Bv 1(hK[᱔&kVHuc 5YNB?C@wӰ -!J vDn)hm9-2%,{9R o3Wp=8*hD qɵ7XG^ozÀ$nխ!,;pa.LO-A ꖈfz7nmbZ^Dj$ouEЄV}0M>dQ9ntpyL+$2"Q' ȼ*@̀HUSخ_ъG6~gtbj%)NF{9l-0IX 'Djnf=}ܟ=$˖ўA 7FNcw[V[B]zԭ; {bȈC\&&"Pd~/M$UC7#9Z ,$"BMY>Q=)ԞJj'ɶg;΂T5qv]gġA pu 6_iEI#[ôg-]7EIJW'Q_D2DBP¡31I(p XE(izC V!a({ _?86'{تP{&JX !"pՙ u!q@„)RqM!%~Fh9"{zsӠ&\e@VI]/e(kt„.ʁD!h2=ym3@c R %.. sDJ5ϟݯfO"SLJHm@ n*x18yIJA9J+gnFꆇ!CCTހ%t…I'W5,(-6-:# 8ѷzه1ƱW|ɃSLaxhOy3K]_("w(N ϧ|x*}1';V(aΚ#6ռ%4I'v1{Y6ruLN.r!r\K꣝X?~ yv* O.:L}'Q}Fo[/C- Dž@龣)K*O{[۸]1?Q>3qpnk~v}P$M ko&02^te灘noEi='Ucdr:Wl.+31jq?ZoU%.$D px 1k^2jFxgMkDg3p H8>9e"*Vǣom^JTOP>3t R"}~tM9 o)!*W@W5||PʒTY*Ă]? YU\WQyB0H|ئ]॓*5@FQK`5`j 8qђ LcQ>t*iZ1QBAi a.@-}9US_ >I]w:$QJnzYMT_]&:h Idh3 }R$ .,4X;w2y+/zjzoDuR!i&YijsS!,lW;Mϫ^hp4E?~P+M}ww4KHxKZj3W=5Q3]?D-PL^,lP2alا\,o̐pW;HeMUI#TNܑS\ Y%"4RD>S#H_EG\ )T s7DNW_9M+b~aiEb9Rn~z~yE`|/'a׉hKMʵV-v3hZ ,4^&8Q[ €ҵ#y\-EF?{Q`nlMWQ;J*^lPF<6gD㚲INgH0kiCKśq^LsS@Gi WnRq ËL'iD\2^*7ԴĩQ^E'̈]$_qr4"% A6dŴ?-ՠ r{AWڳ;a8gM#fbCeǼ +7 wǖ( P!5eY q48됊9#`OsP׆8Ql>Ύ[K׼v~MRyh3?NjxPMz7{|CnۨYʎϕOKRM[(c `e\3_%exDqP Fq}uF06˴ߟpɑޥf 5 ɄsSy6~4ZpRq]CNmVTIvZ rd=z t')‘Xw[% ~ި|HS-1NN` cV Hh|h{,/i5̃܃{ɮ6ui;Ꮟn /hF\U2AnїVvMf =`ENXw8GUH˾s0u`yp{AKD)?cE.A+i^-:^R'|Qꣁ}W 02mG 6cveGG xńighit>S;y]@,_$o#Yc>Io̧j^>ЧUmt]4]h U-8\ ,AtC\a]Eܥ<`Q׊^w?Y% 1#+Aoᗞ%:K]8h3Ǖ#8<(ùHQq,QwIaJΕa.HhCG&=A%e[wtLFpq(cU۰-`jgkZHPu9ceh13LEHƇ R$;ozt:p L8dk;pC% X',}k"A%sklK'7FA%_UDny-=*KȽw|PUW?gςYtY^B>1MJ+"<I-F$߸? Ya«K+a!N!t&VvgM@=3Xᄇ&`' L|ad[EfTq3:!O-NHɷ߈:~\>~BH,l ^ .FK $ˆ֪2/n<"W@Ow*[E!u?B@'h8c>9at`CƀGnWĐ&RK 󵘖Qq^!3u)U`aNS4#fظ>T_@N5bn&X?DE8av>f,(cGD8]L.n@W烼A1Y'9]]\ɞBp3a#i8!${[Db;@7Kۓ8b}bZW:\t6(h H J3b{cxWQ\x4!oK+&U {xA08s+dTk^M(c"tr*sHa%DP Qy(.^Is(vXPY TS. 6Ye+ous>{jd! <Ż[WKNZxjDt-2[e1C+{3䛠Xd@T7h5TA}9;Q&#zTf {1'D VIChAaܘi, toX! k&ms߹f`BAS^*md1eLf\Ф`Bb+6XUIRGo%10/{#H%0WیQêb8Vij̡ޗES4,E:)I,Q)$Za[e[=>'5) VH6}L,r7Xsf4A{:Ȃ1P͗"Wܐl.?%  7#&n;;l=5n8g\@h JtG2[dSP/)^!ƫYH$7;9Һ3Ro$GQlE@| +kpM3]ˆ9=^W#LcZ]^:G\)r@5ï~4Ga$C :>`;{̇ȸtBwls2I [{YFaYz<\p|R t6 U@ΆЏf2@(% $A@6~ `ׂb̈3SZmli$o}fAD4Xt ߞds 9ED؆jiZe2 q:Y#Q]y>^Now(rj[lPT宰Pӈb7 4WPD/|^\fa¹Rzb_m(Pt@۸{\f@6 sFܥ!|_y矚Y' j'Mpmf6ca)}.1vy8}B>@U5CҟMO;g!Ip@oH ,c٣h9I5C&~ho<qdASNp3O'vC-I'e qIG'6UB]C k^xv3Q|2-G\@+!ym yUT"A)5TA؅ AQd.o\h(!J QɮtǧCZ,'%7\Edq@{~D}eZ S0SGyhsXؓ&)Aį>xؠ^,^~\Ԏ/I۪`Katf^C -GX/L#%F=cDme.Hp#Ijىhc]H6H/;75wORW~)]Hr -Th3p)t{ *嵹[9 r+lH"1ww3S65Q@|!/@s Qj\My)nGTEM4da',#*VK;!nD=9hɜ ,_VA6Ӹy(Qt&Eko/c7K#rA8@PYHGC˖ "p`aSmZ!&".ąhOs ;RȖbJbf8b5D0)0?neďh3rdMIͫwl{L>3N I'ʛnb6u/&TJ fFb?/Zk[RBWĿަ:0#5/:$2׃}]Bo k d$!@jb|4RuP1{Y7ͯBseqP}bȊ(mۻ | G2֒C{Jӱ we+Ά}9Bsm3-~`P*WUu(ݡ#ZnI9A5BmYbXzF݃-Qa Y<p+&cBc@0bی@YfQ)T"sISfF9ͳ/CYJy~7/ʒD ;TjrMD}qxl6|g>?O# s}LW%? &6Ɏ+HL$ =&s$Ȏ궶 E %f7(#gCν(nt 0S1},>/[i/{SdzbJzcIJ.mYyR*B*OiV|ӈH`1!9d* ̌.w wUkv[azq? U fZ+U7_mPg=IQ8gS}(HKO*ǫLN:~ n`dvV@-5>g  9/38ÉY-U1}W fɯAq-lRցnr BBqh|Ohhzr(q:IO[ߺkWih(٪D[BvUXTΆs'oe˿2ܧ{S%_2>6fx]vP 9HNsKΡK}蟭F|Ӡ˟|[LZp߀ul5|CXl/pQIj[Fȁ*aTx-8?V|9sl(Lѐ2+?C_oG>{Vvۡvr?;S+I=/e}Rgsv1z~+8xgkR;[캻e%CJ{1&qGߧ:(wdWl76y:MOw4kNs; r%X `wpS'hu(̛׉ : N@wLQ!UWS"z aפpϪ,4U1 xq"QK,lJeȕlKeB:,{k uhӦ NzB@4'"x#R$C|/Y1wl6eu$۩lPv'XtZ;5/.6f;TQ/'ϝ(_@iztg,d &58FӶ $0x S ;d?.jx'(&iL(l&sF ,n:Ncë6f>$QU;sL2Ă>fqn}`zR,QbLY;zr>!1lh9`7ζV̅=I-DK;o{6*>@-m/Iʁ]j&]O锟>SrUB[@h>2_o.-!&-f*(U:wp_u҆yf()o"vV݈:1hҾD+|hns2ZҬ3n Zl R̸c8\xE$%xR彬>22+$<hj+ E"A1&~!jfdO|. Q>C~W%XU/15r:J+.~ pUlN`87Pb i k/@`mA>0}Yyβˑ ah+tj{릫L~/u5JAJX{caRuڜ>uS'iI+ ݢ8-!x<-18LLݕ!Vz` (_6C@ƩiKM#*#!j>>v-^nFLcx i.?0c8^)ȃ E?K*^jY3_rĻ;'gFKz)xZ>f6dbYH|;߆zg'2c ν)dFnt{.nlQlO~Zɢ5kLFd)[1JhQXoG#Nb>cs!jG O^3u;[c^kg$'jg؅"|\g.go횏^R|=ڷJOėS,w/2V_|ǝow ^i K`a{>iK[تq<'b**`\U3 3^BKso/umAnG9kqc Q7x ɦ=s}PUbrk)EؓKI;S$rAkc7cō0FFt^O_ˢ2 "1UW1 m^ç#G#f@]%L`J;Hfx27FIJ0CϼF7vD?"u2 0 ޥ o8xI9VߓYs"^wH8p?N!.g¤r"vQ+@F66f~"°"8J͛ Cln,rLB{Crr)*8a3O4b}QPJ( !0sW^LtuQ/=R$E2:t_Ts<]:$}s⿹u,LUޏL ]>,)O8a^yR^T5fyH&bc}-TvNx{6|r f#ݸn^~!)3jG9Z+pl/$FO%-ZGH s UY7(ν Sm[7t\ kvj gYG\@\cK!E@yѾRlօ w`@;&1uO2#L{]8MX+CtIk+bّslմ_Q-W9zͿ#NlKWt$.dMEOmYlȗ;Jw=&#PI~F?x"*"?U8Oaj]ǎ4k1@փM Q,?/.@ʖ*7X"POOPq6ʶ$ɊMA 'NDl_r+ LDmfPaCJUc 띅`K"3xP {1&eخPp2d婦1]И޻gnזol]G'y3yAD)1d8g~S[ʅ@ {OOt%v2A 3Q0R̼ щX <_xV.vAH ?as:HiTTG?0#~+7҆2uk.4=0s/nz6:키zv3ܙQ1`͚9YZ]H=ybkND7eI}vv= $T(5+PDG81Q ﻭFhA®F)3Qz3PXYDQ2 !:|DFC ]79]MS8(̾sS #1ZbEmr_L5)X+jZ! ,QE%$ (DN svIz!N$4(_% \?d#hCd5y4P7ewf߃ 0k/G;Fy?ncϡpwt̎TMM|H<RxNQW2> بc1`?aLUO=z"AGԾ_rH=׏͢P)$nXrj;yQN° MC1?$T36%gSXUSK]o}L'SQ %9?^c!ִ] 41qglnj4> /?%[[lD@8,_v3/ gf$3,q>d7X,J7wݓnB3LMdqrzee~Vs Q51 ?}FO/Q) j6 z1Xu 6 atpQENE66gr4֦3C)㗭1e }&9{qɾ9@p( qڹDu=q%h+QȐ-P#Z5P1}Έ[Dn#B.Uw\qkЍa1V*QRj÷SyF231Tv_#ǹi4Ϧ΁M t7M}h Ɠbm [øQ+H.춳$)) (iԹMhc@h(Y8 23Gi:4wtTd@0ڴҖ{y (bҁ %=qDOǵTF֯ԝA`*gINLiRxom50.mmԠѴsaq/Xg4 ?mz`}Hmgǔ͐ڍ !$CO 霌$N)zBxti^ p6ΐ"P& R4y^G` dKpz3Z=ߒ^oL.lY*@J/]//-rFQ!Z-Ujqɇyف #3xX)&8s*-.w2D)!1UOCz|{hU'Ɔ/)qb9⾗ ώEZQxhBA<%])6"2OKV2\܂;}Ѩu c4ѱlF/I+(Ȭ#lmI_3"; |Q)F8~g.NPߏfP7xY|j+y j!hCY3s;uiyG &RiqQZ6c`ԣF)zW1&*ty`Kɞyy}yӾY+\V%MMt};/pFDu#,=/[rZkGɺ; :dGh aDјZI|H XJ+cd΀a)-I/Bkn454B%#Ktc^ S2̒nb>^è/Tn;e:)8>2qy{Ǭnq]Dyc\#{ Rzy0#[Cg ,Y?j HAVzty9 pW4.@<7a6"䄸3S;ɚ;u44Y,KvЄċEĨczV;VD'E,~;;JZy,atيʭO*ͺ O8s,O1s$#:8_6 |ܧ!;\ p55,h7)hC ༫34~(_@E40!\:(C nQ(|YUj~ug;:wȑh$RVdE‡L^xdしFUP."MF,u'G0FAB:K0H2L7,a&T G63jsN=} }&:nL+he{vw.6B[h5WF8G&BahFRdĚ>Kc=ݝ-J<}a8@|AU ʿ7uwM} '6}-C7<[޺J[$'8G("18lem$"{Ͳ;8X.i;|BP71\+#ql-FR{Y/5ƲPѠKJKg 4Pt Ny~Rrm#8ȿ9~Yx GA͏Lkou/J0 ~%eXMP:BdL6Oy icuv.lvDJ8_RIgd}GTb[`|x|, ~ =AQ$65z}j Y*`adƅݼ L.$"3C޵3`Y 8u ,VF r=9cV{dM߼7}j x0\Ve6822gE#dvtj˾h\^TBk B9>{% ɂĖo}XEqF 9 wƕ}A׾BPYum}P>|k 3`o.pX¬Y9>.rtn},2B$b@ƝxQLbX?WunV69m^$#++'phmsր3$2/kL$1$ [iH$Q eF`,r-NXѻ?oG1ȿ3ndy|+D {$I5TJKvv9w[d3wѠsX qnĽ\?F0< @fq+|5)ٙ$dAKDדIO4/ 2+dKUdr1u\8tF p6Wh!w6/sa^"\.^ ۨk_!:4hs_}bA#X`9S#Ƿ U/SE^%;,Z*r'0vGUGzVpC[-Pt qܷL4ᘶeYaPL6eg9NL!$WVh$f=fFxMC}(zz13Z?tTj~EX(UA0-ܟbqomtK:}Cp㏏HVb~SѦN\E);6ڕKnEEMQGbϐC{+"H eZF6," we|]$#^7wt 0nO "6'S}pஔ@L|5 jsdm|k 8G|i 'spC %DAr0'rept"I,By4-꯴T.9niz I)˟h9 =13W"b`iҼ=m2m Ŵdhg]dRj|*B!Ss( *ŪBrND\QA$Lk jj~iOERV(O=j׻0Lag9),JP i2T';;܈9їbBSPё,^crӫ,}YFAld}$:iOЇ%cz:)kQ EJ:~ש l@xO_NO_AGVaISK#ڨeH2S-G?eџ@ɵݮL$xӵ۲r}ƍ|"k,UzFUkG3:[ϖ)( '}!zePӋ?F݂`q ѽEU]O8JRH&(ƴ#a\ ,Y잟YDj~Gu\IJqQ}=O P}OO =4RHu[IӥuF@676pg=6~&g魲6.41I*#+T22*=j&o|CWC0X%B"iU +$߉PEhᆙ+MO <U`| b)b6 q5exeej8íl>Zuf@?3pa4.;SjP? PsԟuW*&2t4ҢlK'8ȽdP$-US0//pu9Lơ&8أyo"Ȯ2 B]oA)y1+'_\E#x7 jFI YAQHk6g^=vM'Li5DQ'MXؼ oWTKe:]-:A3(@dVӆ20h'tO5Z ɮةL {ȵgu495A cb2lG|Ys}bIN;!?|ږͅ}۽%Gͬ=V:(^2`?0+ڴ4ͯ)W)e4A= Qq3[3e1?xJ" "1ح=FϧH単MNm?@kXALb˭-R^Rk<.,oB6俩8#pYڸ0+& jX wQ/T0der`08?Y"|O,6U8<84P S <Wi$Ę}f ɜ ӖDD^[_eaGj1;[NgM"CT~гUN=F6UacVs)7B Gqp;d;хK89QDn#{Ӡx9uFv( DOӼ I%"OX1] 1:˘e[ ОƶN-6cpH># `nEE@1_iN)m{~YcvW["b/&\T9+O^RS[DXE I*\^aJ*\'wbXike!@W|NYMDF>FJhMBIm5@;kY_ -4L^|N+'CEZjuo컲3 FCR[hTXy }=lu/nC9L8L[]/z(+S!h6 Wub( +KŜ8!VH*?\7'W?@Wn!5mw1@YI?z^fGTuס}IƊܜoePu^UkUV#eDe'QM1m.{ :\DŽOv\Hh}wA WjCʾYB5r6RT@筅.*B\׺.€d8>ҭH!rc;> "I61iJwbl20;Ki@ ْ , 4H+'t%4_c%*\fԼhl~: $+YRuiTgKrfn%D*+cqR\I@@o$ӆҕtvGpzep6,f1Z qˇiIWƨؚ;-]ryGqQuwէBt* sp ŏSVmt#2Iå_< ̤n>8)AĪ@ԉӤH-_~n?r4/K;h[raM1Re:$wڇbE &/Ug Y_w~|8\UY{*6bgQ'&1Nܜ} <;8ۗ9 R BYà'7+بgrq\rNt,Y᪰|EEpI'g<**0fPMfrW ݊\ Wa:$#?ä%L;bk?̜%ȦoǾr-o\P*k-)$Rj7`_L2vw\"_Cn-/.)KG)1o^7`_TTjugz(tHu9 AoY(!;bǨ;esu>G)֖U{?"9rmuZNz0ou#&f}Hm5'\;Pd Xt@'q ǮLHs=mnaU1P~g{V~O1V .lpYK'åL/7IpQA|htR8MJjn##V$bĖ|!%-sى`se?ʸiG2#'Sf(k@J ]ٯ7"O*-JJjPkI5eȷK>yN#,eC\TkIoc^1UNHV<<7>1M2=)`NR%i,I;L&P%r#%d$^>`}aaUY,Lg?25[ ǖd0LBf}T6ݐYr42je.)]6ocGq(؟-A![m|?oUWH+ ",ucc5WzN8L ?<0uXg}hUI0=PFĦA!{Ʃ_7*ƨ!F2l^k{%"qJ$ɐtm@Ui4$Ft%8h$)ڴ :LWOH}f) t+]3 yQ&gpG,ZnO|`WS +Tq93|hwי` aN8DI7V ש]l0^kׄ+Nj`~sCS iQI+tթêBA{#Nl ǵkiYGL@GFM0p!5AvvÎ-$z[.tF't-$z!w?(Н…zcX_`@h1;4$6&=]åHFOX|7ycVmݴHegIg:QVr8c.]?>9i5Z%Eds(Ƀ]kN*B +s&8|@6uNpjthv%xvZ~ e X5Ko}L÷05qܫ܈M/B|<(HěCښ~IurIy?<%@+9AdꢠH5 c p}&]0)|/_j=?4q9w'1wP S0 *BF HSJkfҩPCz_@=~O;6%n;60+,;xLh,/ZR4:w7"ImVˆb3]L/;pe"KB-b$fgUΏB= sT[)lyэᏆ26ۊZa̳d^|Ne>y[p"uWҜKAVAfd@݊F|*Mx/C‚ O\vwS)}$iup!hhh>hB=ssثcyJ`CŢiOkBD|i/,M6^ ݷ t-|" Ԛ*57?^yM\6f1HC6Z}ׄ(69qicQÏuvD1*d a󪧼 `S9CnVւqCL?y?`\Jp6UC«H13C!bvt-X"~b~QA. zP׽KZD/HTASàFY8nj6zͽE2*owsG>CkG.!' ~Il dPЦ/C0gά\Nw^A\4eϻ\ˀ mj$-wϡVh0 3Yt56j5BZHܗop_{["3%q0 .]vf3OO<őlT No&P/V0zIZ/ *0[GQyEH8s>]CZx&|p|iloٙLW{PIp80MJ,x&4J-,;N.LP6e10a86Ok]9iwl24;cS׆$ҋ_0R]$Q}nLO];IǩUHre#'η/1QH%,[iŇsA ͜9"ؒ/kx2;uM0  xT~,m;l#zh;LfB>"S7z%!Gp׼hZ–OT:=SiG dѲ2KQ8^Hi^@ii_|KK ipmEhEkcF*ԎMq[1]0,N*c4TA$GuP&#}iT$aAQz_'&OB<$j>i  +F~PpM4.AJk0x w4u7Nfw9J0@\n .a `j]&"bQw1+oocKp&tAIهdffln~y={+v0 p~uI^&vB-MU5T> q,q_etr{҂UQ?ՔK5Pֈ$EdzXUNFZKm.^(\Chv+ ^~σ$/ h ^*1%njl3 s }&eET8|N˘'>2;$ X8V~wQ;VM_'&.Y\!&Ul[gaѢd9iɟ  c_AQ*V?1I̧g,%+!BMsq3垉Hl|R4$x%&K;ϲp\83*An&iK U17& Zq@v;]R9}bc78aK,]v'Xݝ 4<7Kpn!!euܪ'4tc:7=Jl# d&ʪDBR֪x*% }Ԉh/jTSۘ>6 PSSf֡l?yzeW)_Atv陡21 zspxoc]q8xMԈ4N bfFm ϔSQ6#r[ ?_6%W?,o QG&UR/Yqt3P+7H/Kmgrx=ߔbv酂;L GYD[ xKڰa*f"Tf@R&&w,\<閭E5r3(taԃ!_\̓B6WAyþ(fR-+ xG\?h4FAWߘ)3Q-ZpwiL;kp7\P:"cY߳mPz `EIgaװTX0Ԋ ľDlO [dH~Mf\o³{mprK2;R!qMY!h~M&U3|pe 8T[!GD=:91朗&D h;=8Zj =̵%}峦CԚ*|VT$m".gɘvGvno}P눳U~]U/"yUy'<_uFuoA͒`c]p%/4 $X`z% D N7wIqe>h3eGؔXND? RSJbrOfH( Pւ9, wgfS>  $qq5a*25.4.lo;9+7qkOe=x,-@hX٩ h>2%`fѺ󁀀v-`6qeL X/a7U%~){a\Zc N  }& i1*qQp:uK.jgj5U6 r1~Vy!?Z-iEjK\)znT)79KT եY\\Ekq/Qo.xgB`2 Đ7Q:j\}VOڼ6w`U'F&)d Obd?-OH6@Uzxq<^h!9bp6jC褄&TtۓG%Eptჱp*7{Ki0LP7*u&b;} Й30[h^0`"0` 47{k̞B}, rliRY> oHl_uxU.mAI +/$a, aȠT-G噄jӲ`\]Δ:vCiA6Y ߸7A?q%db U̍%/W#'z (R/G#ډāWgAV8|vXT& vIף\ޝ\dNM| p@d5d\xSm7l:|v:^D[׼$Wj/~0Ԍ8{ī ڭ*&`p#{_pM;DD"4lK5}.vz^@7 ln <ɟӱvo6L1ƣ\QͬIҀ݂dt  S2>1IXfȊk㩪{j[[v`>1q JZحBmU mZ4qb(ӺBʤDՕNoT6XZbŪ0In>*E]r/i^&2m) Y?]uY\vܦg,o|aX qh {߰Ũ+V&ޥV-祵gU:L;{Æ[.9KMUOph`M)o69t^Ksh!:)FD$*- 9lZV[ r҄A7|֝ÿ3 c u{8Ta&چ͓j#elb w|Hk Awު&-~?5tˌF==Vh SL]ʘi$.E΁.BB9@Oχj;ta:eXXrHTY(@ \TFU;[N0DQ*)UrVX-.c^m(xcs@b=Vb]rB ,)1ZlDmP <&9u܎ < %>Ym뛲G5LXf0kx}",x`z@D3HV6|IglQΫk/cjaZKT8+H4@͓Pz.@O}㖮bc5@#;U}C{s?l QV.q[mXHsk;7U6a=BP 9G*82]F)C6Ti#pv?ȫFř3 q#gέhQb5Ic**"Swx:y$};Lr(~0#ȼd5/V:Ê7xn ^_a е2?ÀL1ӠP|e9ɵvcVv>kޛF+x'I~' aC&Dƌ%RpW}4bMœ~#&Lgpht_y%l(0ǻk{knBV?SHa?(?;3ܹf}XG_~]-Ut}Yu-@wy, >Yϗ 7 [N(1*nx$x¹Pti̳]RVc G)SL8cX&x#4 dOɂGFK7LM)ҍn ɯF˒#83XnukxKyiu +ՒUإS+Ra(Y= ^4B;#TjH0 j(!jc,{ t AM$QAd/^ءf0;FA*s@칝HS5>"Bi9fl(w(@]рwԳef\H˟=aU"~纭Xx&X4 u=K+Bld8t(ỹ /B$zCK"yE۪ zpծMn|;ґGݑRM>/KdӒyA8 "GS=Yx^{\C81nM!i] $\;`=F4=>. y*Gx^ș{.8J_OyƐg k$r?gz!eP[+%r V':͐%@*S6{o5|g)eQ`س'T$/,|Ļx*Bst[pdHJ BxouhNяdd:@9v %lUœ"M~ ߢAkX?}.,IS LqNr*18/.to3_y4y >]K'lnqaT毓_fb:LNS&"nRGRܠzJ_Pa3-fWBŷ9Ș aʏs~1 9BwT{Æua_XqV6 q} B=LiwgV7D\&A)#2S<]3\aeL˔goaϛ!7޻K Njex]' 2ch%GlÖcbkQ/.&15RqwLm{#r~)ɕA&'Y5UWeتG"Ϝ똋Hx_kV߳{˳B+_N,{[7h[G/"ӸDfHC:œQ l;AS[M4,Q ,P>x]i+~aUZ~O5VtGa+ yHdS,y 6O@iřepuanߋv!3Zv:A ;F:_ gL5J|2@Vxnx3o }0}8xMHۖ+S>p Lջ&gq*cZx "ti/9akFANdw&^UAmAFgu>`z-΃/yK4~xbCxlʑ2F{}`Шj1bwP}Kv\"Yӣ dri/i ãXsP0<"iz\Tv3}cht9`xHC($ eR9 ɯJ'YFnUVQtddwfD28.: \r4, @'*-,K Nʂ,κ``k7 N80奄䃁-MAr:cxֵJr.yʞYEq>Ũ<+N>oWO\S/n/MGnV{_W)s!ǹ Y]o[I\2I0,:;in\E_GY>+D8O5k^`%a~ ҂rՎeNB h؟3Mq٥Pʌ]+zƥd57 lRv*eRJĬ) Ä 9qW[~!ԝкEp|L9` fetU.yd$$|`g*pg(~h:GjQvп?~N7Ķs9|diD̦1sVeyzpZ8'w턪#FkCL)q |`"ZLkΐdԯFrq̵f RrnE5g0, f*_m0$u!UMJpzcR bb`E~7*6dɜL~ }Ր)xܚ0֪[d%9Z$4Qn\LHVƩ l$99VĈa F*YD [Tpc<0Z ; ]uW_oJ,NCcxu:9?(7%6g.4 3?@9X,4T^}ss"@'3p)<:xw3>Pv#]W~a< -hYba|j])aw:{K]eW:Gȳ^mS.p eM=bRR3pѮD\;(Z {gp xƆ%EԻInV&g7#zDĻ Ƨbʋ(t}@xIO,Œ:hC:n{}!*eQGKM`Mp "Y>ͨa:&5M*5tP;dDVɛk-iK-PV-vz,-@$yY*.9ŮDsT#GCHZvkyZhXT5}@v2YSK:z~  (93kfۤ,_K?uNq֟91-/.$) P8?W0F?9i _ (A'@һ7f>Q1Ja& VÞ:f@)V1-z.Swf0|@my>C~)Lng쁒攩#x4,SB|v֚Z3v%JK Yɺ)dUvܐh?tV;[=[ 30a~}J*rmՄ"%~1Q$z ҦŸ8\ 4p7LK]U$njw7!i&6u. ST\e%:,>4N_3ΌW?5a(+g+N'uNP (p6^‡jFbF<(Y[C &0!9rEsW[4'YFѽII0dg21"E~oZJǡI9 }0ꋽw9mM4=pۯV wxot#էN\B,e l"4W4:HIo[op;Ah׌ !nLRuxI>jUųT:uqkV2Wȁ~v\J$@r3!W`'S [nނIg\1KmNXBa,Cb|Nr>:h%/J,`qI2!MCZX:XLp[hi)x8l 1j| K5»Bn%-5L ӱ3GQSN_!dx-&\aOX>5iU!X$BgߴhOknI6eiygkt3I6n4Ki}VKп.),\wG{Յ|K9yAg tgQ{ITh}q`=UNٝ=c'"-uS+gBUO]EuCQE( ]aZx򔼴<4YqjI8n$"V%!QX` >YEOAІvG׶$IZ Xe|T 2 s3@&1C"e, 6Z;ըlL9SB~`ć,V⇋[aa7'Fvh% jf-'A;P#^F$&D&IRĬPm&DZQB1,DƇPcɛ? y5h(d-U(&Kt sj41^qq lDWIݸqdJ!9p|,*KP|(Ư7SC=BFA\.qBN@ցF_FRgRWcYwċ*!!Ts^̓Uα?uRˠ@2n? sNU]@ Y@U\lW_mgzgXf?{PŹ.uCݥYOpR|szTGgjWR۱Š[VHpչJ5YfR'9cbcṮ EfOE%l"QT )Qmu}}Eetx[$O(=@BFk? 8U`ygvNW7M&í~6-?b{3kzp5`7i"<̐`3_Ua\^>a;D&6Xji#x)p56+t gv+IZI\0ԩŒٗtB J-:ܦǮ'O준9!K|0͑{pOǑ .1O;IRA(0wR# bZd[ᯋ s)y6xN<{RSƏO\wmMm=Yavf-" Tڪ5Kp|rZhÀ,I̓X}lp{ZG)\pM-;Tbsi/A|>Cϯ@|k(WL"`PKGUL)т1t#3N5Nnq DQ?vq]Z8lLGڲtÌiL 9'9 W !7!4(5WI))pZHsZ෮9S˯r`vͻXT(IO5BZk cjْ8`.:˺e5WU$yg;&4~(w@{L5>Q"40ѵY,h` #M۔3gnQ$ i-ŕ S_H&?lKCX%?) 㛏$|cPu`LJ5*ID Ut $I}9?LrrD;!0): -% ,w,1хd;,ƻ5kiքᨗߎ`{ -p"P݋!dfJ&*V-BcƂ6}Z }|,!p?-NHmX*Bp 5i dV#O9vi'X^j8Ȧ Ȉ _P?nWPXQ0.&^IД-ia̦ᤓ(\5_wHr'Ӱ8+)zMF*h0 }yN?B\59i*LOy`'hQF!Ș@| #J_p si\,>~GedUdeb-2TeuUQeڢ~'2@3$!m X%,VAiX My ~DmߩE Φ/'N8)72<򕩻3FU< Y=8O;u~xG"6B)^OEl0reI=M^ +q*=Þ2vEDO,Sf$Poâ#K7" ljH6iSC[8TF6l)Að/?KQcQO(8 4E*gSKә3ۘoў2ǜ/D5lfIq!|yn^0:\VipxnFHVB2n.٬7Bce#[k鿳5b"r Js[*_/6WɆq [ $7/3ooZ^ET`y S5c|e!ڻf/NTMU)@BB= xU0뇥Z_!U"3$;6RK7R[jWN#OJ6'+AC# 9ߡP :@D|S^amJ0RDʠO֚#Z4}ޣXՇ,xI&SrzNCpO _cla :4x? Ɇh^Ԃ͡2M6[x><g!FDjͅ{CJ'.;)K>;{{Z@zzL` ДerYbE.]xz;6:577?c RN^ x &itߎiEKH҆`#cD4L!<$uGM[FK8[Iǧ6u|CZk q0ڜ\iエ% ^:CH  /=eNۻt.6qNSjŒi S)jǎyHUZ<δV $K_jEd>,VJ41|&c?LS,0;9^-{vCq%G ۠]m}3).^5%_eך$jd# yyۑ덡j8P㣱":] (Ҙr%ȳ cx!9@Ş׎uBStycgS= o "c;ƶ?-]t 99s٭oEcf))/%{Oi'qN%@ | NVh)Ġc 3L7?#<Ԇu˦[*9;p) 븾()9 3CB rF;i1U('Jcq$KEPPHC»EDWcĚ"n܅e5*-N&V &WJ_y`N%'j%ȺzKUBa,Zɳ.5> rJQ-^D#Bz&A hbQWId+:`\(Mpкxtnlj8RO*Ĩ'0ëdjۜG㖵 LKOGe8#QzKAr{nSr)Cu1vbG!pI Z<\QN@#_/ Nq}+QQ >U%C*p䒉p[anK~@"=}L6iʜ%0D Nh! _Cd#p$eT5,@iv ƽK#fr왂w=``sz[(Ѿ=!e`ز(kUFgqWЂѻ 0WYzz,Cs cE-xM%xIbt+Y?͘eצfu:KH1?͓".D@/DI A$1<')5DI"" o jhhz Zrh2H99Bp~t  w(,`;a9yk~Bon ˷NvMYZEAo^@)Q5ԃ ـ_A%o {2qNwZ0%@~BYLL|.C!V<αgP>t^a9x_$Q{(}V{v܉|F٣Aɺ_C֜ VdIlï'VR*c!Bx`bv.zeTT !8}|vZݿoW< @.:e-&=AArqj3%{+Y^!n`}Ba۴u [&>3vgZua\qvX^Plbr[}meev> (fA twrq!FYx4Wh<{al7'y*i yz7YS~K -T3@?D1 z@0 c(㞇v/D4+#L)*ݪ`^3zߡ(빻0z`@9F s/,fE.VC/QS8&I~riz;GuR\_-G!~J?Z@:gAhgGՒS35-(VU} Ls!āIb5Mh)%h1 G9,UVN܈dtALBp"4 ]c1dF| PsO87eIrqN_PD(jX7.aKwM !(L>WX@&MT7/1A.51 2=~mVfb=t0 ̷zǘL$8WUUiuT<5$q:MIy30*mԘП/m@ʒwxYELT e}Qkbvg3_0\aAۜʓ{-˳u}ϋJd8gu;D=OF2RZ:᧔n0(+:]Rh :>OaLù$~r[zCPm/5oJWk'?'ܭ ,е0.l닧055Cķs?UĔh~ޜUZ3H` J:Hkm;OMcNDWoHч퇏IJ\4263jph0h3d M.O~J%XB(pyIb_ ̆ nPB=N"[75i]̾˓q0v8kVZ"5^ tjiPˠ'm4=eNnj2"+:褓FYO &zs"[E?Hxz|:#OrYO=\,Fi.YꜲ M7hQ?x] iC)T@*ӱmd,/5j\}\+8V"^ET\T\a<#-k0h!1ׯݡ0'/= 9-_Y5K^Ik;,۱pL<<)kIlB8q+3q"=p1K^7\"V5ⳡm~F(gX6{F74D^v"sSL47m:" Uݒ9dtT#U%t?D yON6gW09y4͞9ûlؕOPQZX|W}j3KƺDEMpMщKq _*cP|[v+te>%|ݡ fiY qWt"޵%4cU+$馁s5F m٠l)SrtTFj*bSxX$.Г8JAj\tZW9bk"es:]I 5uALA &n2<1$)N=@f>=1?‰ ePZn^& u|iT "^VIyBi1ŲvUZwdT%dj7*&z 0ia$ONl8K&EItl(0:*Mބu)՛d ;.͓cR VqCKa#䔿!\>QR1FY/e {s~Ú8E T]FD =;nMȠhb&`f^NQ{H7nf߰jtsmmrU2rR4ֵ I|7Ȍ#  ?a[M6Z);gq pi7]GR u1z5T='o>3:dy~NcqC,*&yC4j@ιmoW8s>6:JJ}a+Li)2> q>Na3fxǧTϋ@Uj9b85'ߴVHF|m?rQl$ Z-їW É5agŷgVNN#sհ?Yʄ|N-ʼuųq=0F{+ 0"F҅ hSYz"*ߥ6!3eMNP-KMߣb2TkƠ"_WY;O5JVK-E@M*8SȪmpD5 98>sCuH9 _˴c`ӧ)w;Wv,g:hૌ1wPcfr6U%fU4竛Ўe'ӛqPb Lז:I" $-&4lbg9{\8p=1Dʙy9.S|AFW]L5Ui7# c3 =.P9Mp|G.h5`űUJ@w/ Gxry ׏jfG=v}Pp欓(UBoQFS', ~sعxOQ{Nf+Q?gUY +Rz9'*fq+z Ҝ% u*= ҥij7l%GwøB'[ɦ'zx/SsvvRQJu=iLs"4j+Gf-NVD>GeX<'_]Ɋ͚gSg[3\V&a-!BOXC'z͖Z).Kk"\MθVK:G2.$kRS :fv$ϒ:uz`OԲ˙WsȃjROZBNrJ$e[]`ƽ >{<a a Il$`M8 k8R([RPxӈmz;Zj]@j0rͰ^ᜌ[4L3KF}ܾBonlQNmtӒ)4g),k^]/C%hT8uCf٘*Gdb Ҡ\X&g dT2<[뢑H4 Mznpqm-|U:a1]`KyCYp63w, +3l'T]D='YY;19bͩsr @~xe~lL}m~\@2a+CM : @+I if+^߄Ķeo5f4#9nHFd??+?S?}Spf1%ݭСZmo0FzMt @qѶ*M /84= N=m2Kg'^,OJp,A* u] P9h*%&jΦҌ@~B]0i(*䥠Dq@3 0FE }^.m^nNc[zC?Ԥ~ ,WѼ;C"2(JU_6L=4_#RL up},(p҉5S0SN )"ESdF_;18U.Iv͆i7_ To-YQ[{N*B<U ^ص#rD}w 5D``SHѯr[q'[/`#>;mÊ}ٓ0E|S$+&pA8Sr {jKr/r(=HZ0NV_McEnB_|QF.蘳p s1f[sU8ÇaTP2(DV^L5}L:Ae?8[fK8ϖDaҚ4^N}rC3B #-K2KLaMLrvTgHOFR.-N׬Pϡn]'EYDXW9[y] m6rJ:`+᷿Ŭs 2tr3T@$ލfv yܾ/ϒȢhL )Tn t ev -mS . kbZD4h1p2] o 1Rq]b )ٿ2.4@Ab([,8u+F혜1@}%tg#Z8Suj7_I)^DŽVCW5w< - y8HǪ{fzPq^flxܚw~N~Wʱ@*ySvVL:9NC.jcPwK[59ٓ0evH 1|paQT}|cD< < #W]4)󭻥n I f`|'..\,k <׷FDEbD̘֔NKu0 &}͢K7Q:j FqmNUYxuVY=~ }C3!8#o'11*i*e,ŢF`}A=Dolؿit݈!> qfN0uɽoC"{2\#q$o!Ssg}N'$|KQkW0-#"ٛwnS"eX;fO|7/n.l v,؍@7*̀N$2?,+~3(F2F,g4⪰4h` \-VOJHR/F{Z P&kO@32MH>0(3Fctm\6@H"%y66K@ }AY'`.R7c+~SEa/92ͯw*[$ln'O aYgI%}C̊!TA;\h}Աl0ybpS]1t}.b+d%|ŞD*x%Q^aH䑽 ɥabc)e{fEeMW9Ḑ/eQII︶} kr1אÕRmTX'瀉H&y9eΏ!Y_кg4A<^cИ0C!{Pv6-uqwvٛCB|zĐLc,8}e[W|4D.qQm_U7S>Ե[jl+"DF9A4|3=UaϺ0:?Eu 3X4=P߷ϞiZ88( UUhI_rd ~K<0h郻ۨ@y˞ºOE(~Chּ; {yg\H.j)Q<мe!cyVbGTy00°j@bOQC Z&\>zG/aSϴ )& j@S#!qP HBU]"dph)HgVՔ@Pޠ# L0|.9SрiWRsV<gYuEQз?Zd ͩNq@uU>6ȀYܯ VwCi#>qnT$Rۭ 9:E􌼯asCe\.qBC DkKoB*Qܪ+(p+mJb- 719IرӬ EMIMUBWu# m//ąƧyK+ [Ďe ۠ziCS87 Ԁ'?fY8O57Ciud"edHF迄ůWTo}2t %'h.)׃1 󾟤fe5wOUr`֊fy3` =J ]K*7TWaKOozP9@ÞDD6>S/`L/ƜADj),5(3|348iµ)4Uͺe-+@Iwîd'Q6(iǺH1R2 TlW%Tŗ"HR"ַc9n .o;mp27K&M~[F> YWZz^$w +{T2]f$=z$[4L%E IS[H7IR+A;u{g^g?971T eÁg~Ut(͛vۋdE)5 6J`ZO/mQaTCXl8qJ007U4 Ĝ|ޜ )Gx5T@ؒ*2JZdӫCck5ӊs#? m#vhmҶꐝrHCy朢熻İ~؍S$; "/KUfEXIglj)XPc G)}xS3P)v$-Ax) 8tvX;tP)9C^\kD.8n|?P )JV{اl++[xoY=cΈ'VbߤJ5a0ᵲj>=bX,-oDZq0U4׹0J!wr!ɦ8'ח%t#&'}/)Aa"q^"ufvbt'q*m3. /[,EO1Q<VA,>;Ń|D189= ;"сCuߚ" 2X\SJbY4]j{:V+L0զ3_#*"$,{6b; Ag*ޚ*cʊ ہqӴSa()1B.d @+? H.krS[Thn`pyvSJ<7Uby>ֺ8QzZ&ϔLC>=~pihUm $ۈ$gvQD1d)y!%lhydS P'Q`]P䕲k<&;YǝU[1/Ls0 ~&ЅGus 2RcP7kq(۫j=l:-hVDE !Jɫ/_''TYM8Bd!X&毂d7h8X&_Y:?Rֈd#P%훣r 'e09L>Ov/ %]4Gu9#8 jYbىPnw)m^VGD cInM\3Y 4`5D緂;h܇$U0!$VEK5V42vEfp`4ժ+Qvr.Ś[9QN,E(M󾬳A{F-ydj;ʭYʀ.s!cd4ܭji]w_"4)p? 1zF\[;uzC^'נٸU :ѪN6k0rUa{AGyySrZ+-{хsm VMy9?e& >sMСɉJ"!ْu50+p֧ξ?) >aMɐH TmuNf1`yodx(/I7w%7" 8j9_ejRj{c8M!6) []65U0F2Cq\Dhx%&«oRYFvH9טaWFViP/6Hi蘼0ԱU>e4V{hU0KI2O YڞFddQ)$:K|z/qDSW>U=.Q* μw,hh+ CXVۺ D=7V3;PmN:V7%9xM\x*^gmh8(ԃЏUQI1 Hzg+/ªgFYӈxHx< P&,1D8[Iَ~LR(;\6/j(.bӏ7"剥S9IE!_FVajr}Z&p6ݥ)GORx^k| dj-Lɡ+fڱZ%/ϱ%.g/Rp)x.<"RXD9 FͣL}wP:b;x9alZc*K4 W+Rcs`T| p..\zpQ:)oc/C %Xma3*J ݨIMbDCn YWuSQ۞[Es֣6wy'+oWs '$P)h g~&!eM>lRJѻ!QS'VˊM#MOsS*Ew)|846=*u!'b zC[ĐK7euRJ }nD\afux(1~{0gcsZn*ͮ4w >; 9٠:i&@C (OTI=~DtDe36w`rKp |`%ƀ9و,7&(PC"q'(wi&ںoB7:  n-~5l~ukuhѤ,{1> rK!S2֢McIkJk @j뻸~1X iPEIj7uFOfqɌ^H鵇>^Eeinl"?I}ط?-'c gjbP `@}*;@O@lyM9`::} 6gjR.`LmKD-ٻdh4O-vV,uh+o&g>)D{2?t.f(9DpeK3"SNg6 7]xJFɭElv5cCM7.?dA@0矖IeI*1SCsJ1ʂi5< gDF*sf[WJZ%"mwce4$Myq,Ã0@ȁU­ & r._)msB!3~ns#*b=1OΥQm%[ 26@[y"+UUS|!\ q7)`DKlPs*"%f\fOFGXgJLeט%w Uc@4<9޲uzK%<ēX 3DY hAeg}}iUed6\tq 5P~T2R)lX eP3CY$DFѠuPEGdodu[d!XTtS}2bÊ 8Ƅ:N0jaB 8"\!* }dWS'͌yjDRѾFi:?9K͜R4W(˾[,r#PfChΗ*ys0f?qbٳ:W@xQ{ؒX;;iףx$A<3Ɵ< ,L{6C'WVf D1@Dbොa{!*ヨ!㈖+6Uy3y+΂D N()"_-ȵqp(C>ᗌGԎy,YT 22Y2KG隇dW.𬋭H鈤45J)Q,U ,c@i^LMcV^>YmUb YY8 ^ds? ,W8%+Kֿܿ=~i 3SB$c|z\(`6Vcg!Van⃳`)O?ʌtX4]'g+%m(1QZw+M>#6F "\ FHn&l:Aq_,pv K WcI`BkdyCik|90f)P_ õP]9jKՕ(%#:їD^d'\@h~@poD;70[峟jӘ"Ԍ8=z׻ lHEKX%Sֈ@+9n)#}4= @"orKJyXs2\R?*U蠕;RU?-~OTͩ>EgV?(GڠU- %ZlIbu#QpCkynYj\0%(gtq&n āk1$3~11@Ѣ\Y"H5hH$zy =F:VMF$ɨ]Nt1{LKym"U{p,EAI@a 9޳%Pz̰{rknrD[S ;Pm[\;BQN(P; |!CMJ4h4#Hٵ2S w2es@ | o, h'L‡\%org E <9f g6=uLdxز3GN)tC-+Uni~Q[T(B Xi+J.pU A&fz/UT!QPj#beFlV[/K?J=DL"d %@+tnhc'dv*ux号`S.(z9:_Me cPZ=8Q&iD: j cz=&a`A%' >@.V3pE\DE ꕛ`FAh:75մuk=]Wmlg!7q+rDxZ>5zP8VvWT :s*9D[@@L {d_*iY]_muJdV(>au I{AEW.8[Lׇ6YdENwdo 2EШ6[rQ{ D50m](E@*SL6< WcgZWi00/9a3f%vHp9_:V^A_ݥc ?BXxX湣#e@^D~  ҃ޟguI6I$1q~\G1Eד@HqMqvE^6xgIfY^ld7g41CG@:|$FCW_κ}RDrjpu '}rN E"/6V . sa3~ z%8B>'*hօy8l˙"Z|T9G'Xn a@d,PC\5Efv_D7]a.\y'e'&℩}I_S~b`}tQ,DJ1z(®l k5q[gKwUewJFPABhqXem~i..8Ε7oVXA<7ǤA:%^u-ts1.C96⏘r˼}¡#Bu6 U)Zz. sebjd'_;ZCc\P 'ǜ]-w%2X\K ܾ]W2\QzO'Z$eQHW}*Qjf<"r|WO{+DԿ%cjr+}\5"'͠"J&1!|ɗL}=x``]@0BQߧ&'}]vGyE HEO Q{N &6uC?R_@?y <`%a]#jJf7Z[,/>gǔ9k qMb}xNY`lqyw~зlC'DhU8ڊ|V)|T&-Q[uyV5ڷܘ${gxk(U3Ѽ3 F.^G_f6=#ʵ܉Jk?dipLrm[k<P +keh}Մvh ̇l(B sgkxU:s&̡IbeUS7e?C ^ _CIa+KoǦ1\4`#Z1F&fSB*&GhY S4?r'"[Ԕԯp/s 4.t!fw3.8|TsQ 8~niI4E^SXYYqe/{l&ÏʙUmAm9( ;ik]5l@f)nܻÓ` AEg^' >⠋X 7>G( ḪL9u&KZw9*QXb_B BY>?M\`_ޔ6XPQnnMKQ4⢀E;< E1dQm SKĂ pA!|!g_cj~Kz2悯 +``Ћ,Ąw 7MKJߌb[ l~QwEȅhKD؝EnT bQ#fvEu@#/N@zX;#  3<)d!hegHǧ׆iW%vL?яArZ8O |a3S&N- H.qDM𡂂$_ʝm)zp&o1iOì @u΁>bIye7L w,aχ(;3hЇz5]s6a6u|xl3̌cl %vbd엢܌ c3)fgb'HP yTʡz3;34ӎᲿsKpX6y!_o%PZ'chK9_t;UĠ*_C +PKנfĊɴu J;&2"36_26dzW?±{t'd{wqS4c2n}qP&rv+ǁTS+Q}8¿)sj1F@yyKt&EE+Y,Iǽq$ KƵxۡ0ccjKiYE-Vv9xINR[Rw72cla-cv)FwLjWd6Q. >Nͦ`Ŕ4ŠSjr5(~]ҝ3[Zv& N+vN%k^fҤmh\pl|]7L'fHph2:Qz;WfJ%G9M_)SbODaidR,g w ƿmezFC<Ǐ.,S1BocOCj.o!,?l u3 kG0Rz4; 'E]=l@jk^G1FV^ФWs0ύUQЭq9EX)d+NkJNpJޯ1W54nm.]j`(<:vtp$P҉"O.f{ri 9x+7pq`طqtu'8_\m Bu'Iz2&^dvWuѡN6t#fU=C5>~^K[NW88=듓 5voqK<* K e+ݣt6qDtգ0+1CA"a[xNj'lƈ r9?ђ!F }ؕ>5~1toV d?^f`Zӎ]vxy'6 !oH@]t0S$ a ')a0ptm#A tAZ0^7SR%?05#i;y$l9Y#x=cK;g-2S(+bO?sh`0Rkހſ7^0汳Ƿm9oF-m$>Sm)4@T{*AUv'N: 'sQ~Hǖdk_][ 6IJSk<|p&E]|2}%PA:XP7 bh&Re5ԊbGC xZ8f GTJXgxLxb 5 "-hK-O1O%hYO)%o,AF;|Fٶ HKS  9 b r`y'+uI v䐙3Ԏd.b ?_lD3ʬ mFWu}k dsE2GϢ'&#?kɾfBүy<\_!m2ԅk VܞG?Uɟ%q-0NM xmimR NZZH8V;u}9LnlHqb6eI(Ae~l!+LDuʻrC 0C\IJ{UC*FQV8{cbu@3NaӀ9ܮ GЁ-vi>l-S)~҉*}5Oj9q( 29G<(gE)lx;x?7.|z;!~Y LBK< -Qr3ACK }v:G$X[71AxI/R}. EV!-!*nFyI..gy1\?~h F$ s{Jo `K%O##<+ęJj/$8K tĉe+8}Ʋf]Ɩ.$M\9֑SÙRJrINgnkx4;;m/m9yxjRhPOi0JߓCC'j;S+NIu\T[w5ם(Rn=n6LcfAYb< S~N/8#~rw٢_0bePIp?.TRc3`"8.ө\{N=fLOgeXPnhQ/X-]tAyޠ&4}Xv0 ЂQw ׁ6=,EŬ~J&&֖C}1NNȦ}VdEKrMT(4b 7{󀲔t@coz#jmkND l#ؖ Ӄpc72gW 8(_ 9Ҭh\8$?h `"ޚOWDߣmgᔎ[|!E1/0JFIa$zMpqD<6c,8pKa_ :-S3g[WIpHsekJ~`ڈBmRWD?JRSsSI7*&MO1ŮsWGiE(BpP15Ն@}\N=? 55gWWID= Ư7«Cs1gb#΃%TW6Y+c5J}{GjRTc(Zt ,bvS&bN`tݳGoh '#޶\ǑjI^)LKOdC%AV* %PP5=to>Y:ٽۣ$mu]"e#BJͮ jR4 Y sTֵBdA\e,=Q%)V_3_QCYƒ~QkYЖ Cۺ9q.,{zI|5qJ?nY94UM]1=Yu\u y)]yhR__XF,[/Pai3]nFo 㞳Dpoxhʺnʇ ׼ꩈzÖh]ҿA?(^*-L{пij0z s攄S9V?63z6KrNv>JMŬihkqvi8fd2Q_}V8쀠)z/a.g9UUUԗW6'R`h:7ߡֱZpita{ h Fw,Wޝ}A_a߻m9#cWי~+]n e= r Z/Ye>^Gm\daXXKEpiBs.m㨝K({ t%Oa4+fx{X:<_j345JvK=鸓ᚭ+#ٲ\Sn!z! DH v|VSNE颣 zHagQ.n dTpB#z5ڪ13"Ki!6_yr}|!|2m#c #zx  R͝;TOk&:y?-}讂h{LN /2_e%tBofn,CK9&γXj'h'Z5&(Ԕ%G+K-:UbޙOFx9 G<7pp)$ ң"](~9OO9' "){ ,&-R|kr<RBg%:BXmn:0V(k.pvB"DGuM1zqg_ xe%(+SJKnN4B9,TB׉`&5\kXD%4/z:0eqlR/hs7ȝe/HxRӿ%;T' ЗNgr 55TS$ ɐ|Njd_9abb}NI'GPbw''0~ B%ndl>pjhH[j0 Ou{'hVy=_iv eK7Tۗqȵ5Į8^-nur }xĿ|sh4mMۢSGHUX ^,7V\!,z7h쭋/(8<8l.h`h̓[k\l짬+zD޴bGwFX̏hIоt P,b`N4_= Mh&Ze$Z_Wr]I#7,ۗ]?ٖ~}QYSy A^+bן2.5-lNii6ޱY?&Z'"xEp7|SY%.Nh_oMBKoPPn 6|p(ږHv?hA8(0MAJ= b#ڱ;!x5U _R `h6 /e\zB # ݝ~̠7EU~WA0ߐf]B p23&܎x^+t{w!U~ucƹ5y~JP/ہ}kAO=A'ǒ){qҚsx٥5}!*UvD2 ]hJRE0svueB73ѱO@ ۨ*$e!rރ{cOU '(GGRaw3)zq8˾[gFҥi"pXR*8S1gK`MZ" 7L7YL DP)|IΣ%(E1 Dv\0qjU 4-oҜ 1gw.* g#A3<$#@j3ՊGL1V1xFG3n@(]Yt诼̉]hGdru:|o_3=ؕ5Oyi{8zިW2@£_v=T3 rx0ӎ^ެkpCV玍a2O%oU@Ӡ^+~j| Is @+2fK±8xLk` L >.]Y>H`I$J}ڐI͆W]&E|]<;ŷv:q&v5愽QNWW|oHwKr&8+uB*ÛQdYJ)Q"1j/n^:NzB$Ywh_?{ײ 8%+jE0N(I %ɇedϋ1~C& RK 8eX[`~Ghs& H%V>Bz/2- Ю}Pؾμˣ^mL"a_PQEhSI ;>}_ɣ8C[ӟ]l UrmL#}̈́yћsODM9ꡲP;REĝx쯕Mh=9Lmٶ%HKU&9~qq nޙrA1io5;g*M(Ӳ7HAK܊iKV91- VxaHVZRn݀T6FL$]{i?DԖleVב={:Z^Ϯ6V 7Qpn*Ż?gՐ;>#3ƍ`5c,̰!EtI("Slpg4*7K΃Qb5h#U[L>4ؽDO]dca¢bcq`w^~HX'<  ^nd.kxỺwBRnbӊ1ծ€.@@;ZYv_n)|,'.{ lj́ 9}Z&}~+rc6D`Q(< Z"c~Y_=Yegn+0h@v|< ;2޾ws-#ä&099\{(]R 枯+0AnwCM_ᬠk+2.m>#~^1-t9XDZo>?oj-$|%y&J=NLCb"J7$-PF-END_:(:%gO;,Md[Yq?̲6(ݬZ*OHjk;9>Z\֫{zN-qG =̀|P(AZܮ,f*7Xڙey|to5SU>0^ϟ)>޾GW*8v@YLza18n:4gz썀X<eӻry lF[\,?9 5ϲ!Z O+:|pmdcF +H p[m4Բ BEjIr)h"m¬LdP"t܏&e4jL]fj9Z@5HŏE $3׳o a}"MX,P~#L|ARN[6}Ifчֶ\t ,Ugh("C;4`!VPmP#%jJr0}P\n"9ehF&ΜCpuO g6#̒za0zZxI,Q0I\[u9+?t|bG7tddc0ZWJKD$; ˁ^ @k@I#j1†؅ш6i4ujxkؽ44T;W_ĺTfg̐|CM.J ,!n?`Rgdx<,B~B\Bдf9#t@=6bpd ()iC$mc3`ҵpii2<i3f^9րY"CWQ8&>LA3q9J5ǀa,E$8SfiE_[=jD͢}n"e~Q8Ni`??5 `oYY‚"*@h`FQ{|闖wqh nrM_ܾ +fl3z~=7J]]?Yԥza Nbcʟ MehG>?Ͻ‹X6sW04L1!Ac&sח/o2p>GSQY| #KiP0{u=]"lR&uwKH5JbM|{-EMh?ؼ@(=Pݸ~LgsE4 GZ jm%G~ʹqcEHJ8Q!јų 񨦎%=' 1L\kX 5.zR$\R׷&)#=]<"&$$_/?XzLc o̽Rͺ{;]9`[4<u8.>1{4q;6:6cY8,8Bqx=qܸ|KfxT\կZQKehv"FV{i:i=@K+Aw0\  q KOd5˄c;w#E^2qtj؟7^Ip7WQYE n]|[G msEEq&޲o)1g6[3%[#WBFGBb6O\+ҹ_F.:hۿimro%l2(_"uq|}ޘVHPxwfbaCrU *>h ˳cg4!8zLܸK# FP=I=r; TuQb,+/$eqrdŠ҉,# fkWQO J/E|G '@ kL=O)҂)b~>RZuk؆GtA9!~Y`Aj_D)˪bE_yd"Fm-:mdɉ`޾>":=n"@XElgəaz RMhPaHaHG.A]HQF6΅MP% '}p#/cQ/(m"oDXXM#LӔd+ MԠCAqeXJߕdm8bjЄ!{azaV˄3/TKF!~Dž{ PPI5? 7f2lWv?oCSn˕>GGh J]{ʭaQ4ցp}2'ՏꍑGg,,F@b?}yu"khP.Ő|=ft#QgTT9}-g^!LA%(ttV@exXD3GKy/8 `+ղj_DJV>^9eAB=L'~3U-N.z:oXe{sqN c\ ׁQ _p5f{Ɋduк$ˏg.!u*ɦϹM,BhE!$ZF0)x.\Ҷl&=2)49v<|~!s٠5)T4'WAHi>9hjpzrmYS(>jfSc}v^XhĉEI(ȣc2ᵆҙEY 3}c؎%Ȃc@IOM'Ӡu;.?27TOS̎)́W= #&JH@ÅNrA_ix}JId<Ƃi: @W4(ț5{8m,ϋW۟ lacA`@=Cʂyp@5oAU6yKKa2isCWF :8FV˛ EX) /M`˷a/ =JZQE@~D fe#04J%*&pYiܙf,YZi.iά=.gPxdzl+KL.n7KƖK#`99+1ʪh*}3Kͩ=F:q h"1rgz+1(_\ك[˩-VdTԭ~kTni|*(UKrB&E6 lETk]N&@_Yf _Ex:y'b\cs^1 IICb.2 ']iJu%3X`3;)%$=担 ;֯ wyM}תFKZi&{x~{Iޤ ðo[txQUAꁍC@ph`Oךn=Hq}<4&kXuΔ0ķ. v_ \J0O%u55lKYw[LɶzFp0K s70Zx+z%)[rߑ @CX`a#7UsrJ.|C( 3mϭ-!!Iο*n褲Ĕ jc,P6/e%j'?p;< o2x* E{[? A`@B᫘PymAtFOEa`B ܩƪ ȉ'M锠Da&f4!HP:T OQq յmBM $R LrݒmK`N;(QvwϑxؠXx&N.ա;PùSCU¹#3 8ǵE0x*r7b'L&KUC:Hi@YÝ߳VP'$pXbfAW,!q uϑ8v]5Df>ܵ%wBbH3H\A|&` ~re("Ү%oR : alֲ=VRA2ٹYxoS%c Ɨ#*(7hQkIF hr~qﴉ.֡BP!zP JS mK[2,E#(L,76 ;ȣ;l7R1-h/ Uw}&tV hw-B9*$'Oc5k(?(qEx^RF@ n3$.?q>gr<SQ}Bx`ƙ'snoRBK,Oc*bFDV~/il'HDf>Z 0KjVoՄAGĀKc!e뤤{(͂jGI7j`oGx=դY30D̼LG55\dD{|?6/`DZt+Mu1]ϨNWzXTтxӒ]8d[yI!Z 7*/ _J0,8q(qhP)|TDcy_P/65-3"wU:M_ꌨσzX?$ TbC{)$1 s?iwpB(kPB|L0ֳ Ts4ɞ%kmfe͍62$I>1T%_ ¾oRh^̥k:a;unh5,KU4!, _ӽʠ} n7/Si[DAb#V߾ظ/@^ ^Jz= {#YkBS [ņl\/BIOHCuP Xi0?tw>d|g1m)OT:(a+ǰڢLH ?KV_)MGqdeåo? ep"@GI_ uiJ% H]:ċ.VX!~).~)+{XRaUs*E]}ȵ2^9(oʹCu` H&*WM0d٬o7whAMB5H"9!s(9ݘS:U4,,߈ڍWE|*mP@_܂/4¥\mN"bPA#C8C,,4ܒ2u zXX_">m gj>hIIBخ۾΂7:4Ҏ %x[M9[J^3qГE,3M Cѡ5(3{VH]:#䏑7h%T%P+?)\Y4ge k*e.(]]']56O2juƹQ.zt ?$YY>{ A_HP[{6IAgLO@i  M"tJD5xA mO 9i >vH0穂o i6rp-8Kq~J!.Q2|1࡭ٙC3$}JHSէ*'by|Q!8Imiqr ]`GYƏ>Tvs6ݏF;~/m,*x;֓Y#i ߐ<]+m"χ oܹ\CLjg>?I|?=hI.S3P!P;|"eK|^z4"2.JC5Z{Eu!F:lzD'ú=]g6Mԭ YzU SD74u"!.JmErϣ6=AfLTApy@ieI%04p\79lϮр60TQ>_jA+[ ^V1ag'(6?;^롬3 }jGwpu33$N Ze!"~Ny C#G)0IW 5aXDa0E'}A5{e]n42}4qֵ>A9aO zum(:է ᷥf-/Ԏ1J0Hc Ziѭbp# hz\]ۣֈR%~fK~ް;gL)9[~[Qл dvijgwZ zfnk2V,!k>" JC!mm^7IPdֲ?.;pV'pNxڈV^4 _1rz>VMS-&VF 6ZGb  \H;bdN`+;mˁ?=j~ʃJµQmNY1{hGidU$7 3"-՞oUZ IpҞT~&XҐLNϹZ-cXebc?@sLȁ!WB9@Ŕu*&swtl4[" j"y'*1IuӉ3sL<]/L@$ǪD>sH/9iWOP.0HX"35:Dd/ "̳s=3 uCaB V`!*'zR3bIN G%327r{X}&q .gn~$""(`|KO"o~@ ǯ!)"p8.̀3Jo"F¥$zo[Ec cwu>qy-uU:AS# aE֐zZ=lfb3!I;0o|jAFQ<ՄDtQǹ:T'֐~ht.dp {1gĹ/r]#6<vKP?s u`;QM`. Ʋ"4`Tt*kz$Alؙ{'22맥Vei!NLM#7TDD}.2izs`"1лw.!YioȫOT<|rk>TρUa\~)(G DCoP=*"8P-qKὪVY$ᥘ!d@[hwTOZc[@+ѾH [sm#@YTcRxpW6ĘcP)S";rA"; LBo޾r?8 CQ1w;JIb1jtC: uN 2R/4sCsuI饰W<+g IqףXڤdNMr9$"wrTJN<+SqP Į]noe2dvl@Z/$RwvwҷW8X"lQlJ0-6W $S~/>1p,`A7Z<<)YYęB!t>TL?z J:}Ѫ*dzTH6bX MwӐUY:WRG*oVi_ EL;g8Je'a$pСriD:c =Gq\vDd|RO&k@; FҒ(PG qbB3C=31+~7I2W'见["0xL7%tm&$bo/D;, ܬ8}Cq oi 7Z,}pzKVO^DOԦ=RE~h l(XcK6MiP |E]еSZxY+1FFc k7'2KqBmtgdSq@|\5.3fLO׶Tw$ګ["xGO/!`"{?Ήh@tBit&e)-εj5"(mJ&Qݟ9݉joqgN(4ŎJ߯Cg`6 8*tAJfdPbCi,O ]0)d”זd]-옣B/כK1e铹,@ ܃}90M,x8巕-)3d3\[Uv5*GH >$SRRxJ|,Qjڵ V~-fиբeE_G'S&5nv'LzyKi4S_wG8mۀx_ApFlŎsL4h~EbR~I;S# P;޳kP|  TS{K!5Ej$UP& RR-8~&pՙvKwx;xRʄ2h!RlSXkDS`},g(k ghߙs>HΫt`.]zo.VЪUìlt,g q+-q9јe?P>#LRX,~Z_ZQCID y{rw42ڙRv2N`C~Y% kt7g$QLinE)?ij")^ՕXJeq ~Z")2,Rx6ڛ G=LKc &OXCG(. fCSd*ڹnMdZp;bت^>q4·;)]5zg?i-RLG׿+ ]u:n: fY,:>i|R$ |L/kO*E-EkeCNr'k `όiE@{)RhOT4ck$sMXM|وs痿r1HJΝ1 aR}!#SZL?c:I"k5ejSe\ 6r-Nr)i"E!!tW; C[[|& !&D*/aPTgpcNo¤ áW۴JueM1bgWδ2bXk|_u͝CCLVޔJLz c4筼N~;qlp&8ΙDz>(o^}yIx޸U0hWMKxRE=@֌r$aa [\c',:"3$#;{n QHۅ3EO } )}љos9b)5u(u2Z!23yc-e< 8g@3ۍk;6}(t̗͖`m ގqGE[7.yⒾ&03xmۿb8ZaP!⮶bmD$ k n244r< 1.˥[/嬁Wmo ::9C }\g?!_:E)\{I>jsQ#IQ+(1ܪAz<=MñCmN%Xz9`0d>xYߦCLOnOqIRCL>P#D/9X]"D2ݝC&f+av'.~!8sԜ8,-̰'$3ҸQoQ6OtۀS[.Y |U@BDNGО~ހ)+#9!>nDNC 5"k$ 2hv\[z c}(Dmrhvh քhAm ~UT$%h=1Vb^ƟO$ˍ`tt=I,:2-mŸ{DmA iEQ\s%ۄ8@;MꮰXi Ucf cWB6(%'xVTS(P/jtۉ5B4e4BkW~|MW0eCS2K\gڤ[ cYG-Src!UG~kzGyw  8=6jLY / eodZα6,w {S@ @Pmk+z+V weT|!x;7IIrƛ 0tL%G,Vj`($ dSS9VTYN+&N.ZSS-FYarGu4Q]%mQB&@@<,,(I]f_xʒ;'~El4eT}5*ےH`N#vPdzWTݭ2&3T;R]tL*/ҌJD ʊ6&vB”G_nҽQᰖ^Ndc@G! [F,@*@SX+`/1k sky!Opqe+'~.cTUh*}oͫRVfW'ԜEQtM@-yd>2 <:;`xʜ_r 欿c>m ag1z }g4b jȽ Gڢ΁=P#TD_̒~m=r}!.2 #6}|Ya?|ĺ. bYMO(@@S:Db,Yjy4h]ϚQ)1>֢A &R0&.c5bIǸml]d1~&'jB8HUdpe>.՜>(@ w (@f>Q!{9g~CuCTwCˮ,( G2S8.粳l )oډ)_K .m<= l.`ᦍ!uo\41vII ǺzhxI/藤#eVE f`XtsZ3z$?mU SZQ֢gefS4zKfimҽ{Gg۸5e*o-^_DeW6պA;Ǎ\:vz|΢wϞ柆:T1Le9J6A)jqԍO142Kf|3B9R} nn"(Q&ͮ3 N;0c&]YcVG P;` o!LP׷aAy*⟢RN b([C /چ p-pX__ٟj^G#M LE{Ν,Gy&,E2 /;^uL | UP N@}ޣ@cZȇL(Тc|z" 6ҷa,|9R1 Ry)"ƈ"JS]Q\ (ws-t ={fI顮@p3!Px !m+y#.JєCc镉qVkQʹ9B#cmVLfԙaؿɳK(6*BKz\Q3\$gaԞQ~T{3;{G #FB%Ihf b,3}2$z, r琢)Є,`6@r⸑"1`R\sn]ŵȏvHԥ|.qOXu|FJ')hyS [O&P}GXcNM`,ALtv T.hb.{V.Btfg܅$و{xaϩ Bݗ p[kր/>.bZyb(%Ÿ<%} 7)ψE;=!4d+mṅDP_0OQ2)flg"2`.̃K}:vD,*l*$2H #ZKI W&~ƒ! V7 @D0cVhNގv7'_"##O]RV{nyvrC<, Zj3&,Cqx;n+@@5[(:q.8CZ Ad=3H/C,f_aL6F{jU89 8L6,\KtXG\6u"&w5 adTxY~W@(߉Ta+*RqYZmC>fBTGg$Z(68n%K9{x~]ܖK)2(BP#_Y[ M]KYl^-EY3>5kڬH$O4u0܉2 ݾ:U\ 1}os+WCW D#DanOh]z{H&顴+V/QVe!zĎ9,yfĥdWAz"Ź/5M5Uv3ž~D43UVV[@*{3*V"dbrC6rWص01& {,[WEtvIjG3 Ip.oM60`g!)!ي&[T5;o/8o)\;n^D(R JCٟnE~*;jz!JgF1sBe}sଅ?ڂjh)i. |'q.ɔ`1t_'oH~NJ^Y/Ӵa-Ku,8N-}JFm$(W8\R!6a&ˆ&JX#Aݢ7*S9fߌ֌<¬#`j 9IԮrK\Y][?w2z,ݐ0aW +Ά>))Kj;a:?h;ank}k!r1|00㝋LF\>.L"xG*2E N+UC:E 2Cݎ7yKm[lg j;kjPqDruF\sZo(AGTqc^ޅ~clš ۋBCۤHW SU ǯy[{^M烂~vjRE鑶#ط"D흟#{ф~ya֘MPuDUх&lvWPu  ^dJFmw*j;U^R(}w "f`(K yR1 X).%ZVU%ԷJ.6F{F9:VR6ː?ٝ .^H Wx{ fAu{# :ncb{mŖED`CR=HI6툄5P!Qocd|ˠɕmS1:"` Tg|wb,r{Ѱ DG=m89L$.Kd04/!f[R8]l R}{nh|Pt Qj==RdtyBLlE^l5((L rN|=u37#V/ ɕ6drO1 >4lgp9Nu|@,62ZAmcZ,<2mJG/+I6_-Ld[s납4(d3ܜqcymy:~ANY_E9⭏SSc54B`Y;}Dzٸ S z0KƨC{炥J RZ@2sWMCИ(<= (qi |ձfS)Wiui;~1$kΝY>nг9x_c0*$.Ϻ)r1:U,`?'7"L$>L_ȜYMw| c@0 !&/<`f5 x%>|Xo 8?',-e^eZ bS2s9anq 5Ǣm0[@S2ccojzn(F2NV%-h>C >JiGggLGw$7:7N6y=icX$.ȞK ĪһsHT_y i[ƯGIzȪPIF.Q peq,ˀTJ!UN-6XIQ.#O0]+46Fc’MWٴՋ<rRX Irp0`!!T-"Keǖ9Ci"I#e9 e/T Hǚ$D} Xyz^v9&}W _&3#B㱦e MJ 'm65a='ߊU*IyG=SǨLnpZ$aq{x< 2~`rjN6݁3 y,=277 m!Y-zdE 2k <KIh$Fx)vO"569 rD'ze7'dx k$Ӕm3%ƗߤuՋ(+!Ia_jf\oMAƞDVXt%%hk_~Č?8n [g o 7YUBe*ےY䈣Ґeuܡ.A2p9ucˋtqgzp7xu0Q795n5g=O]jw[[g-!X0[.@I,"O| TaL/kُPa~4TlX=V%/و@lε ,RXbPLR:ˠJ e21]RbƏC<c+uL8"xvnaNEUB\U34ꗁ1a<]wbj5/#M>Nh!.Qgx{Ibͷ,ۊ?Af7yK'U?9tpQfX  3X}kq"5a()B. O6WOd*qmF _5 ;?NTs@/n]ġ&qBۖxY=J4-{*J[W1'iU[S.a 8R(c¹VGfWB8@Z-"|eaq3GMUmxf߸bb#{^`c UJ4cdu;-J⯏,2e=.@摠EB"^v ՙOLX3Iu%WSEpkq^Zi%+%BX l!s2dN6=m^1{"IhTF~_6`S|%]CEH[^ۊq*8ݔ4t 3C(9I;LV7_7~*|F!6h]%Z; gSߨVoaԥ8ۥӛ꟔ 0&_" GrH`SDg[@ 5 T)J[WwE4?M5/lsc^@Mr Z9,d5NgdR!x!Y$(p]O{>D*Sv2/;&[l$t d*%*w"_ncyzÙҸcEM J U%y_!@ۿ$DcP3W<\G]5_pN%̉HOSإذzcF>HzNV]q.n’߉j N3먐}Gkt#޶M-Ӥx#mx_zJx G4L9X޴YZ^ 嚾R !>Li֒>c8kS5yȫl^]d@#bU}7bwz zjB C@#!Xp,AjC:0i|~v%bubh-a mKjNBHo\m\;G ?S#k{Y$Q Ex!x M @=$B=գs^_O_Umbd]B\C*qR I6XjyXOUc0V1VYdcOێVad {i1I[ٓ$_ n=vC!JdX ( 2s;>W;3&,6lcGX="FDz DUG6إaztMšj(Kzx%F/ҋ@T#8B+kHfF'K*(ٻÄ5 orܳW6b@z8_ ~y`y99)K D"/1`.b}RCCGRqJ]!WMЦK2&!oxܦdz fe%Õ]e`6r-o< yzGn^LcRRU,TKa}'̒krg(xj~mM |RF)7WU* U]lF3ʈ O{.^<- ,[7X 8]Fs"B+G&o10lR.vVGgg,"kq)Q_2.7yP2&BЧK4HԨ /xgޥwsN =C.+ z^e_6إ&)&F/d~ܦƐV(fʤ0#E*MwvN06$9U]wXE' z:gWm&!+UOLMtx0aǞQ#W{Xp>eiトQ~V6G=o%VY0!qD+8(*HL+Kx?G\\YNEc$C?k"^Pѵ#fXԑI'%EY.h 5 ӱ-T?k@/MI9֪Yk),S; |ţ8& _vYi{qka=v)~<6i%/ `1[@eKzi'6~H:ԳՑEnIʥ]$dqU׸'3հ z]i\)*9}Ap]F3H Qn/xg@ʉ8N]w@z7˽n3]ʽhsvb ਪY:#pkPh~ [0վvA79Ku`0^"D*eZOC0ytl֨в?v2HU_}0z[aAA<$Rn Q2 |qC"&6Љ L}sfkԲXx bPe_D^' ]-AfՎHǔq XF:$hc?47ߎhe5N"XľsFzVeU@o&EwC d' pK,7T AiEץBC60Z}$AUo%&/=@$f=5sſxN:bWsXȆ[Lᡔ49 ?n(QF2s`{  n' /dfa'SPPVv~ QIM:NH5B'4m‮aF\c"`Xp *Uu7j OSͳ|SJkͧłE¿Y,r? >pfUo9/r]N%B y6D*WMX"k;5-ah6}g`!2OY42jI8 HǾغʅo!%@¨ǕfC)g)3 E+/$Ci>8ӤF@хG&@ o+Y¿]4_;Odk)tAlw&Oȍ;@)3 )p2q900A$Ѐ vhA>8f>+ v%ژ޻/e\5L=gy&7U C/֡P`W+CآAtfy͍T?WӤY(;G3fZQ<}H.W3!z;a`$Q~VHH$t@2UN=&yҍ>ՁDEezEmH(踫"  =~B/ '[qLX T&IZFwnvYM2#K-Բ"6sQOhH9h>C'5_.)<7+=Jhfs+S0UAjp%SclG0P[ :xe Ͳٶv26rh)};VA u9z$#JR7um!Gb{wѯ8<qX;<-][ˎw4VkPPd7ɓ缎T\j݆)8r]|c$En&{f"9>OHM7k"?WP+t\ tb I/PQriua̼=k_c.ZEy}a0#?AtjW"L'=E7#u"u.\m'R`@xb#rD>8(^n֪܄@ⳒVjA)T2ܝ#4ag_17]0?2XnFJJjen4kY `QZ9?&.Ag*J'jXðFItΜ48x|.OER82~H-=/`0IJO?]S>쇞 'LD.HpO{>!S 5/4ђH>0?x8\$O~4 `;SK}5@U,`B; HG}YLÿ11l:S} $Jژ<$8>)ʘ *h-sWh Ifyn/)K2۩-3 9tUfpLhp{YD`PA!6%fepH8[D'Hn2L#oJS3o?sZQ-({)N'4)K&"уak\VKUO~$yd{ǚTÓ^k'u/}3&RhK&mͪëYʰJl%B0{uSM|Vܰb,Ei5CI*eou?uGE>bMAfKD1hXuluЌtVcB/P23q't"> ߔK(rxȢNiHХc2q-Jͧ#)w&ʥCM(Hq] ʨ`~.-&쩈uKDaa@.@?"nR#ܭ *cM-:s 08!!CR֋VҤ[̾$Vp}D fuAakM.o àBzf3 $#̀DhP9#}tMq`vo5E֟~]ڛd v!%"ف)qB4CWx=4b'!\B(T{64gix0G*r~@fT;dwHz-2X-" &OVȫL 8@Q&KBquSg&| $Ge'3J=;,ꛆ,`r#-U[K(f d+\‰8($Cǥ|I"J$3P!>ӬQu@% v\l}EQ i(=^vKXXlQE>ijO)Cͽf  ;*DGk>Y"_T:Q̬0q ğW2UQIU}hqb1QE&Թ֔|Co;]rd'ݶ-=f5P"?"D[nqDhl W|RRX Rw^H k2Z}6$sB2i)ņA7~e0&=B k+ł`#+k{]FjW?) lpMOX{P.l_K.54U嘜 [1J^K:R:TI(bѰ*\NURKŅEƑbpGl.(YbWSЄ!8&'$hx~D)i(Uӿpۚ2pO+85-%v(֪ψCE3_QI NE3hSKEOUM&&ɰ+aPjFDe]!\5XJF{\_J[ jC-q(EB2V1T>Aւ*B'Q0Ue V`bre݊*xM 9rL~DوmufDE򞔐&9LÏj~-zρKV2ڻIZ$`EpT;}e-.9~df,=Ae#Dy@$[NrsVvZBx!i' M p b쎺|OpP#`,7%0s)ƁGd1hm HA$/Nʗ D3y~bߤy[.5>0svxS`ZuM%X+"/ :L|NIqL ԳECnn> 31O@:m|2 R!_(8lr l_aݜZ8e 1RRAov g> rXyc6Q7*S,' _CswpN4AJK{ q .h_#~l"NҜn4Yh#}V#Y~)ǽ0vozfE!D-gA(q!p^·q,-mL3X~Ԡ+QRm_+F\Tw,KԔpg F>7!67Շy]+vS_c4!H-,蘢0 H58%a {,czJ+G>~Lcux8:9xe@]>a մr<Ik|ҡg1ܲLyb2\z4 F tGrƞ43i1 [ BtqUʏPRYMUQwDRG[6g*_L_a ,Ux3H%>9ɫ%KA "|e oNeN}f PFܒdF4@3!8=U/p,XeO&ZK4A8H 1 NAt Z (\lVYl' J%/,V(xC jSG'moi$Vw;Lf-voEf0PEK/4P(dKnI!%t/P7M7+Gd 2<GHgx? f^^,b47Hÿ|li먮3R4m̕&!5F4B Aj?%0ۚl,hNPȿccަv KdW#̉Mw+fdSX+3H$_ t '2ڝCu92&*dfHLuR$_' ZќqJ(lԽ 3ן\!0[ouz$gplh&ޮ෹oT QTDF!:TFZu? /CrN㎍"VC4vD ^S6 3 T1qOJyÛP׀%Q@~ʷ|6A:9/pO3>N;9oGnWE{de/(_ .sq`\,7td B"ndX:6kU&YJH"S;VW.Y?\A.M봐ҏ0H]%s  >Iʥ[{x$Nsxby=`N "[B?cU[R+>:aT|Ok-ub)O G0~ mB\6j eiN'ݎVUBQu)xW+Q[ X<ËD&a.׸BG+R@Wp/H![jhGV8I0D9^8U9|莎5&( 5,wlAl>h;:cu.kVçC-_V:VHăBU4&ps€rټd|g+ c/M?E\̤@{2HЂg+@Scĩ/ŕrp?M8q yڧB.J pMA&;XDoW?<(Hvŧ\XUFA wtjM@=Ţphƽ۪yݕ6|$n€ɡYX2Be+!mjjMppBq/0Vik s  .d?E6AJK˵xdd -d-{&sQywa_-⥇F5Z jx7rDyqɄ}C3rndUY @HDNOꃾOL"qu#۾MdZ ˝\85zMguFͨliv"4 .LPimCRq-նxl S*S&4V;'XM-u9B9s}$8&΃!z\-H2 {#+xCx}bilAg e_MbXb9恬O+:&8򠮒*noec2ԡA.+KL͇כeF 4b\qPfs6I9K6# :+M¶^9wJ %.sr6/[O[K> W~yL"*~u:=X0_ :Z1'٥uHv)'|f#ـrjƫ1OEA֫9-Cd+~[Z,F̃  C^UP }C%1eVTWCZ^B)\L{kC"XY å^?G&۶3GBfu݂ lul H@ FOJHWlpTԹI-8+*r( y n7Or3wR|C';\o9IB La2ːv rnLW)6G*\^Oea%! b::3svz bQx{aiY MR- \zsKŝTr) &zw0ߏqph~-E~=3B,v畜K )7>GmbAc 04;Z#GfBQi]%u6/ΪqK'y5԰5 <V(:P0酥#GQ=SB\ހx2JC(! c]1Ux/9׶?D3ƈRၞ=r[[B;Ғ?u)/! ; ;^yg?ozΩ-=I*:JIK # U+SO"̆*QB[=[b榺e/Kp4cg=rz=<>phx@KmgnVMzI\A4hf p-G r-$1^ݑ>ь0@Rpò B+oñ+vMlmF|Oo(698]9C)M# E~%T`@$2It ^y~3z[)}}H);I"O0~@j,}6#\I\ q ơ7Ep` j /6p1-+ 2BBSf*Tam>G'r.}0 >V9X z_a-^Kڢ3Ɂy9c'vy cGzK2ν:}"dH`ٖn蝅"Sk|(`%R(Fp3|\ES:dï4/`E|G7CI9_D?vj.8w'V/Ɩ($ &@;_d(GŘ*)l},R/HFܫB'n_JgoEƊՕR>8̞-Z{c.FwĪT+tKΥ mlhJ}ré96{Ed Bc;.=-2V4,94A!֔@-̛'C@"1B?W ("⣹$+) 3`ujHWhH?a H |!c V^-օ.}t!>?뤵s]m2z\@n;e@+bpwR(|:*L^N 0h]q̊[ TepPWsuO]wބ0oI>`qUW[}axjj((Ȏj:dw;&)*AuH}EѰ ͷkO=Ҭ46Ûd׽_I=z*ⷠ}n~a.^בf1)֥/4X!T\0EJP#qcV\ ?14wh~B32?ZuҽaWkOZ3@-=e8s)8_)"Pd좏^ATK2∌Еl>W@M-y) Za9z6q{JD#9"74C?-oo` t!}0(h"@~OW@/#&Z5!Ud) jo|N-7}468/]vE`&/R^NmZg_nץۃWgѪMP@1f%(ѪN ],uq5lB+0&G "U+o(/s JmYf_LjA}h`bT@#ON~r6Ʌ . i1 XY0*Eoձf]eNY=9]X汑jzOBtR.%Эe ݛ:_Ee!8]=ubL&oE1dJ84fy $) PU׼Ȅ4ӳ04{C3bL t$]]"u(D ~P\&V&L35$rvpH:?҈nimEg~/ y?33ς(IQqE ",ob\C!AC\r]g{s)hК{cVa,TCq?l+^@=ŵVp. Bz,ʊI0I$#YAΚ!f"~92WwO)*c&sK|:gI[\L~r^vN Z稧,H,c>c G^ye290bٙA]stTpsn]۴V НМOװ_e-:D~|Q-?t)Pp k'[[D;ǢƬ{Kc>Pˇ/0p+D6j"1?ʧ4)c_Kx¬G psv|>ԩo֡pB4R"CfnWi/\KlY'=U5|'/& aF+:r/C|nrƴڒMmҧeAc˞\)XaY xW§e%T4(lzsC7Kr5U5/q_:zdJB9* {CpɖkXQ A&"BLr` ŚF ['n&w}tPJ%a%aáFe-iòFyzRu]Y KmBxA:/tT?(,VG'rX8B"cQ[0C   (S}O)Ӽ='%Ls㣾5@B&)nB%şӒC݈]"MP9Dm_M*@bjQba=Q\#Fk'F~Է rUgq ' '3@'%ND~"F"oc" $&k:*iSiXV#?4aUx=#e2Li&9L ۟57YXH@,>q_udK})!LS &k5A6PŶI'bحbMʬ2 $lr2Usn;BEݬ͏Bӎ`ld*mc(sH)ق ;}żk>>\wnUH'NȡEqH@ҵ{McO̧\ m*ltDZ oLx%-GK8y#eV! 5DBh_I,>KigC ٓW#ѱלC-ȣ¶\>uƺD)Y8Th GZFUkpA/E Z [ ۳\[ 1f7x3]qNn#,jγJ;|NqWED7űjsfHc8ࠣNUzDԨNA5NxPF0+ǮG/z=k ;f?b8zjغ vQ`0 5G-% H8JFDq!G%+{L?K]5Ÿ,@6` `t.ңe5Z C6N#jG.-׿g\:6;5()AXopL T_ ?1W_bxH'D%/@wZ hgaf3UwѢ:hbco#.UHքO22JB3AAP܅dz{kn^{ّ^To]PNKi07K KNI&,ϓbΝ2pX VxO^alFDl~=4]8?B49zbV"^hOkoXBWbP`y'h͸)PFҔ>Ȉ҃őHVSU.s{(NN03j L<{ Sx໏Y5A]c/Ք*8 kN=0/0s}py8bPe^fwbFcu d5}@|y78Ҕhf?4%HJ BIOM5nfIm$A~Fvou^;ZWV{ҪɗbJ>8j -[pO6>fe>7)1Hʀ~@؂ ziBQWö\7}KAvY֤UZ,IwH*/d7Z\`juHDZFVa A;0c AKTu4 䀃IuBî0D<cAYJĤB7`4{,{-7( ]#b.?ɷuFdiXh?j2IܪSNA%WD<4amuKxSn+ ܚLۏ[=/(]Ǘڻ4nG >axa_pIlPe0#VgO d*QF= v^."Ysv<@N$PS=Sp+IDtY0E#ʧ9~}Q>.& ?sXU[o:2 OExY%?@ds'Š⻶^\n;p; ^ kUn ,^X[*< AaTkhtc< 8#Gb]F/MFO6P6tFkw# ނH8*Jݥlg4\]ωwOM< T"Ǒ3SOkmCD{>Ι Ƌ"p; 0Q3gn4WK >/bLBX,HCP9`-њ̺d ;9# }6y,/ϝ!#ː`MQy3!P2DمA`A+-gn"6MAcvߡ4 ; yhHVw*cMhkKX$JOZA|xͻ'=_@,bfj3 i`N%[ɽ,p^A(U'  \Y1C|Q7Ċ :ǵ5k-쉻' 4\Q$gbx5HgOv4/mŬ-.h~\_$Vxh(M-G-mUdglH,ڛ qފ/5Sլh${3\9>f(~PfVP| +g*&4WHӞ=bB( 8![qt ^Gq+0SڒU,#saw6|Cb*-62+y6<`ۿ3/i[e9 lc)d& Zf>>j'+*_(P^9k OJ\dyW8o ~V+!/ v Igu;`;k,ȇ$Gh{w1cv!7co:?P. `HSW\ <ZQ7h>%c?"85'ۜ)&%'B ^tv8~DuΩz־u="XWC;܌-6$ąsg#*֢D?H~/!+]OTq-ST\[p4|tJf~Ĕ29W5B 'j?Jgx8ҺܮL_}y;}דЀ)og˵FCr5B)-0eܠy;6^4N(AIAoWO4A(eWhk\( 2=owFn?' "FŠ+B7k4NޙurqX׆MtՋ^es`7D+[ɦ';ث[bqER63RE*Ho/$^o>ӎ+*E\: !ؓ}+:R8\By-6{F.FY@z_kx )2- FpSp$ a&d{!_82<SF,ȂbLã‡tw|/K χA5&pltzpce7ei7֢edV;)aN'# gmCa3RJ& il Rw >h|.w"]~_LsXQR@TR σ%#b~>$}d.N+gZ.} 2;&ztXw7'<z<0蹜V\k1fg`q2V |ZEzTQ?:fOCUXשQl6B5 Dφ%%2'f`{гY0V ?z*E\ @%MG8ù&Y(BDRы$n3OɒurE1cyEW|p  ߃±^`!z23b9ecg1_βgs-L0-?@< a~v C+eHy}InqHͷ+B@Fdکta WD7ug 5^VfJ1Rzr>A0 2V[ #_Rfn&'TTeZҔ7-'=X\:] gU-Ϟ/D:;EYBXXvy`?0֠JX k' UU?qUςڶuB ..)[FBipdw@9֢f^Hd9HưpAB0%!Ut9E PT!ẍ́i!='{FQE#W aռ[c@e`Vxb0钭YA6J+!~cYy!gQY碛IO9_T8sNuw1T.4omqֹEr$u/tw;L2zEp̈́]{OM7 coa~%y/pX|¥t* h}.gY'릆9`x/7ʮƜ7E̖9PîGj(Nx6JJՓ_YN>?Qnf%OU&9}]Zse>”םܑ+e>9rX|MNkUٶh$WxZ" X,Eq (f40w( FrdhD.wU`wF beB,ȩir("lϞO kjOt ~52kϷjb+<@;1{_d58K% =oƧ`h)Bk%1|$Y7:ZlF:7}ҿ=6$2{bߎ/2. , lv7ZFm>b`H2d+<brV&v)HJqOvT^n~)KhQld*M=7 Ϻh0ԥStFM\z!Gg&Z܊|@ee `-ϡV-.48B¶pCٻ1Y~+,\p73^|Pϥ7z{0ۯGp1ʕIJ;}b+|jd N !u`Tb?(yZ5uϘ!(\l!_ch#fDzH,1q %k55~bwqWD zLW/ $ԡ偁Aşa Gjᑔa׿nc6B$=;Pۊ%)2Imܧc#C9.2oM4۬m`\+-$K|A>aghvJtȼew8&<~b.WXZ80>ri;8'# .="oL͆Y;z63 øK߽Ndz0Q*TWa5AVnn6{*9ʕN޸TaQvjSN65;.{󯽮[R7= 5m}ýtd+e Fo#p߃5 ! ::#~;l.k#gr'Erc_ }ԉ9IL(*rј1۩[p^?n2s;"x\‡uaUP\̢-a1tQ.g $rfW^+is3.rlLuhm޴لulFUJԭE?V:{XQI  t22W=fȄV4Az:Ğ鍊u*0I VV\5Hi&SiGs2B*MWU L*aQ&PS gUmZx]&Yx%|Ok\<7v4YL}n!fgBiH!639SViwK(Muf#sEfNYetxHaq5Y֒4H;Ĉå %0|:# OQl&xtDJ/yDB-qÉi]Qژ5kcx)dJ(pX 1Jh]} Wd*1IKA$wRopW"}J < "&+I!`Yh*I}KSpEE@* xJn}ۆYAJ\=KNU/)尲rc3kA?"z(4 DY크,`n.U$=K %O‡،(X)B ĵ)C陥13,\f7`NA,M`O^+d:Mzz&RzՒD;ש'89&*ψD|5Jԇ08wܤ˸ _*-2#~D} (&X nJ}AWdǂz`gs$Eݥhw<0^fѼ4,#/G$- 6+r, Sq!^M oCK ̷dvƘkԵǖLuIuw~w=9j) zdZ* j[Dx3+~^ hWJ8 .[g܉W:*X% +mah Sڟ TNi:[SYglİnޗBTbIZHeNa-;\\[N/2JS!|W.0EH𐅠Q\^0$H?ez;tU\?QJKpTVΡy B5|b/1_YEs 'ۆ@:2*a#Z=b:V4(lhGnYyq WTm`O g+9yB^5ms1h`'8֚Ueb~%?jww-w ]*O@OMs2;J>[!PdY\nHiOc3u YYW PTi-EU:&UPtG.?HO&JIALo_R4c#rﻡ圭"gx㹨}E:*(b UnRbc97|hB;b9Icr әv.TpSP)g=^i J\KDrT_4iTE9^@>D>54zNŬrq>9K'o>AV_^e'NCʿW.H* Y9#NRת®gE/t5osOb=AK':+r,"h<{2NrQoDyh܅*tKjep5#Gf!cȮ™`ⷙ>!Mش?oawtzJ ";E)v#*q;DG/=hPX( 4EpK;̈́C@WJdad#lL髤+yY8և(rsTKv1VX3м݁ہ #;e:i)T{e 8*p ;quKPdd##NfgMS>E>m Tkو naM`BE-wLq_f(`jAoM-9a${=ҭ8Ч'J:{$gZo8 ׂ"HŰk5m6b(XjjZ8MC-K^m'&51],w\U H _ aUΛ !.Y»n$bD:w|֫cHlLj`@nX34@Lf̙fʷ3Q XR1gk1K hJJ) -~^NLEwhpl$imp)5K8YPr~kddbcTig%! X *éTºLsӜ"w> Bm1a쳣X "3`"q{PCX&8\O /a3Uv=z/_`%%9o\G~]<q {6nk%eԒC@vv`%5Lj{o)jpwEjWTlOHA:$AWI-GgI\'b,?s#.y A1DbdQAC-3d#NOfemOxc] ީ*%==қS'V^6ye_^ =B3ewo(u GDJ^!'ƌKeP{m",Uj,-ZfLJt0 "vk252ΨVސdZl=cxGmɑ)I_4Np!ixu+";B65y W gjI?{ͫdsXf mx&k\/U*a65ACz{WKQEi2escvAIG~5-)>^*32gbyYwm, S u,~,bslKNf6e YC6^d3Ym|}HM WucJz#F`4;WOᷘr,mV yp 0}FȚKa|Y&!2t"3۴d{1"cᬕӃS/C$+~;. 6CKAQO$6ȡ({WQkMCiˮGbckX$2ZV;=G J8i u8Xl,hg!8o/`0K?r Xa:Q^Pmśgl!G1v%i*BIcs]蛴jY+ls1w1+fgCqF[3^Dچ-u ß`ɏXg7xld΅v6"j BSV8~eG/goN[6S0C8מ tH/|j @d.U~.s ^N PqIq]Ɔ|/iӺcnxD$Ϧ[@̶Dܦ,(F6XWE싆6 wF]/_Ag1Eӗ1б7U*ct"(ٗp c%T<ƀ B%Dz߸b塇t.da6XDR3"S #w_b2_͡V-V%rbL;8y{![$7s"P#Vcq,LJLtǾ|0EROT{I $PKy@*L1|# |xd.p.wmJw\\GEFDs٠;ckZ"t~"ñSHV&=Y0%̬knun)gR3Qx,cax疮AbJnLu,`%/0OGpaJ~lDBxȶY¹ܱGIPz߽ '(36|qЎfRDBñáMi|:Srہ|!jyBr}1# p#@$n$şxeAEK{$rOՀܫlMD }<#TJ'Cjb,?P|J,<9wr>?ӘPIJJa9)W  SJ )<v;&a@a+7Q̭Z2k\k)7NVdh`)\?V b]~X=1&GN$'v@#Xµ~ U#xಥ`g闦`S!4jpJi{hj2͎D4+L6$cMR,٬M 6GVH QP=D̿!h [OktH{tE= !b(&~j& re., 33@"rcb{p+>Y8}h Dk1@іL=jY*qze8Mb/*22X_~͙QgcHP[}8<HT;PL9- D=. cX^w;.JKe?[t<<. 7h<gAsxc)YÌŐooTTJp haDD"JZHF'CrAr*`7b4R"Kej-x=*=B%S9,ڻecW VǴ*;xykSw ]9uAHF tߕ#.rP6Iwğt,ɳ~.Xe'O⣾h/5d–\Xא"E^ke4!M<֦"8f%n+%z0K"Wno^RU EmZp3]~:=! Cc]Cڗ&Ra6Ե(S<0- c6>KYS~ I"v}(T4pLI/E4O,p̗_hlsNJƊuu3cj\@c;j%"bGڧ3Jc\-I=]~TrEg!x?!ݷ(raxU5| Cؓėm}9\O߽01TK( !qT4QiD G-H,0Ÿ6kp_jOp6+}T;G_R-\w'K}Mv3PrTL< zvW-Vwa ';!xPNՋqABt9X@aTi  qtW#׸BiGh [Ҍ,s9aRG,KK@ݲ! ŸxΏ H^^`+ZeƜUpqVW{2tպV\(V+NrkQf晷  rH~)/uETT?^jICVǚ!n\Ώf}blu[aZRh8~(vc9FsNX@RSi=QWEd ڔ$"w".V b&F0 0kY`V*Vr6ܽ5RȮkf ̈$8iiTɽT(Vc-b@IKeF?Hv׊L\Nocrn 8ډSpsDCb%VՖ/Eߊl/dq `9ۚQǭlᄊISJ3Z / bdsBE"hq^j28x]%N3pø$#.K[.z|w5%%4sA|չTt#}hvTHGSH]@mJmuzP-t%߾,nv\W=;CfҝRɖjP2^[Um`=]R=jd0{‚ʯ<6'q`*v`gF+ki}o|s<ҪFSduo )o|?p.'϶eG)' }|D9ŭHtMMNיj3; A͜6*Yt.0ʀ g1HM^RݹƀsْEʪ2>Ub'y2\C'd"1a,0gia0x VlqH:A$Vw*"BȨgg לRkn~9RMcnT$9[U # fx5xv@:z(y7~ǹuXZzH֞3E^}M4G,-z٢u ZZDhRUtҩ0p=$utv#0 iEy5b!l)& #yhZXv9"UkRn@֚W597F'T|e$pq##w$#~\;^Ԇ4[}L'q0?)atpL}x?X*ηVG۴ŮCh\8œ`QKR=[+u ^=^]̄? M"HN8# ֘sᡎ;z> %p n{ճyФn4=Sw%?.:ڃ%E7$pٌ0=uh ›RkXݦ M>"#AF2 ocrVbmRqG๢i;cay$I~G=b @r]\:,TRX }/)8 Z,T#xt"y ;lW<&gU .J56[jŽT>?(ъa; zS?KL/wqG v2) UX:G.u,5 􅁴j*qCƖr=PB'piͮ+59OgfږmQMG C{gc.Ė~r_7$NᤸGF{Mc*JK;PQ_Xt>u >>Y+Q)sȰHᄘwL aYZ~ƅO8@(O9qɄX6/c}4/^)FgKJU,?^j@5(m-N J@۸UߊU/MH(Ad*_h*1G*1+#xaaj2Ji8D`9hg=!H]a6sHk4uٌz"wO s9&kRSUk4DZL- X{X5Xr yb،Q?j~BVˇޝPqAg#h[P0^^@yiH]@Vhe-9Z [H怋G ,n˸K.Do۳|SsEzx [͹Vb~( lstkKJ3rV?C ΰd4z$e҄d<݇n~(\î!YQ*~L;E1g`p=1IQUJfS=Dh`II@{Z\ GORDk"FP萖ࣸbBJb9pnoR~*NXYVR@EJUݭoY|F0Y鈱@v)-VkFu=<J 8S3243iU\wx5ʽF6 FK>|RUBj5}ݕJ:PCz.ԓP2́:xߕ~V3MC%RF(]W8 v4PnW]2:N7]KCsu0Q31&vK+0岚,|"z2u\q+߅.Pteb+ż>1ψ\FBP[rvɈ/ ]{;NeLNs'?.dtFBkg@}=`%,z:ҵ+ {gSf)[jH"rJƠiO EFpͥ6 ,c46Wydyg{]7Qs9*q ׀^Ah  Ga[N %~d=۞R"`͗u/%xPaj`?Hi\stKKQLB]j*ŋt2M-[}C k"罙Ccw>JnqdžϬ0ivy9&(kp+<OOcNџ*J5=gH=<;33aٟ$CK%AѺڴkINw&TVX_ԇD{ryE9MJTN<1~jB晇Z,b 6L/i9 adY.3Z!1:u<ij+ Dpj70bloϿ=Og@8m'dp ǖI܌LtL ,EV |$wBعU@ 4 ,Zib;\{pX5;$lau0ŨX4+0uM(1 `6ZD\eCo΍;x1n&UfҹHQcaIQx:Áw*gy_{\,CZIGĹ) 1Hj6 f$EDR&Q-p@`{?R?9 )Ob'erY97Q-hmyuN"x4mf~|LNB)Spc3* ɑ!]ҽya̔#xFR!V= Q8Z7p뜡|Tx.~'leieDFRchA7,8 pG!]T1slb=hE?5GW hM3=m̈́[C~_͵_:Ti&X)-.o1z,1jڋ"4ܪ2@/F"1E3/.Ke'Y0 vxBI7Pt ~L1\D:#ro@bGcY)Zf՛9rl},{}{HUpcƇ^ש%q'4ILIbo37[XP}D>{,;ГE9"%F;%+M#,]-T"RSLhqUTV" urhJH%CJP!:>f4Ä't6h@$4'j)[i ŬC<9M2^3j`Vf#߇P$,.nY,l\O/aww+})nap T-hUl1_x P;`]_\M/Zӓ^=j#zQU8ɁD.a=YجXm>R͝;mPֻ.|\k1*㭡ӯg9D1IghIX"_I# ,e&dv˯ O9"+cFp z;tѷ˹C}搃*yjRj}w,LW4:AZIANHަߓB8B9MfZDehS0gԃL96a6]$*)8h#İP% ;am%3õ5$W3:az wV1`z^07{ue@5O82ʟmVm^3DZ!}x@|}V_ZιޑxuQs ',@'g-1I6OcNF25h~ qȊ># 2$~#2څр Ćo^Y:5yJ2QU n|TV;`n]JQ4PjO2Rtg47 :*^~$W} =x Z044gc)LG9C}fǖ"TQCƸQ0-jʯj bo|GTpsa HS @_Cp;kl3tj'mu6Fy8) G3pjuu+l =Ŏ Cۨ(L:40 nm9*/Y\MD~@ A_*08CӨ򘱗t5YHaTخ0wDBmj h'kUSE^U;Q<mp+C`swUWs4jIkw5~a"ոGiS+AqjÁS/ 0%-ýBh¬FAǰbR*RPO}dFߜQBD]2'@wQ9Çܚ =SFS; n\U:eC[ )bXUH22aUn]93%0B%”H7k#3T`ak6wwusM9..bZx)u,)ٸuBs1eVS,TbNZ81K&QM }~2M /uLH|S+p} Ci(5 - 8y|c>$odE+(Pg?o;ngxIa( P)GL %b5SCE*<.rK+9緟T/_u /J X3|*$u]ߗUר3?; v| wcYL)5mX95WՄAu62(iP ) ӇzPQ| j8v)tb>eu';`&ũ|RON#Li~<З ߻]yXtOϯU2ڬC{HEd75JN)5hNkH~n}EXi)TZrSZ+H]cVn&FcYQNu)Eع?ȥa<=QEf? yZh309< -o:`ܼtnr9.R-ʧrEB/x:R.:]4Wz 1ZGg!\4)XzIDIЉjnCt@V)qzI$kbp6/5S5 Ҹj>Ǣ87ks `Q%jޘyd^~.EQ|#e] M@rޓDDW͈ rl^]5?I6o4 !>/@ڵz˧#.PJ7$[Hȯ 1J Ȼ 8g9\8W7{WyYR :)=!5 C=|$ؘ0nM㪲"iɗݩق(`ub;<7z|\ 3OIDEE;d~Ւuk9;S]vVI:2J!ְia|L9A <@C (vx!ˊx\L,Pug /,Y3: }M@Åvw>hnjKoZeDb {jh#uA>k:VѼ#<#pA&?ze"uHz,>8vY./`;Kk&7MV{ЕDan| mᛜ B,Zn!fzeGׇM{kB%}gRFߣψG^xցp {kmiAg;oJdvIu_`BKiwC(Rz={oa^ѫ]zkcBk"S'amT:D'b>~jr6z:Coq1 A,yY6 ?<{Bs:7%S@Rg,ofê0f6cɁ&={bpMEpU]_%lɂL%C$NkR=A撃΄_ 8slb~iǴL}}剬cC^!7)795G!.Ҕ{p f_A{l0]A8҅$Y[]izڶ*VD) )PMKX V2M 43CMol xn(V[%υ5( :@KVS0>4Ջb|0g!/B1&\ؚuPMڒQKAd؀t͂'[Yxl 3Ojޘҽ0}TO6bn,~u:zˑQBϞK GuΆ41@əT>J ,ETYROzXز<7<S:7F9y&Fp/VA4E !u|h]proA \6PsIauGrpr%)lνhKƚX9Ni"*/M(HmJkj XmPMR$@٪8kn{Ia׺ 9B뇆}l#V.ζq]_-|7*+|VR۷"sGW?/NJ 4Ō$hg}k9OwUTpI)PgUU%ЅJV5',TB|N9d] 1mYѣR}7;YyO+pdP[ʔ|xI;y-#D@nzœDI ?2̖#7In%id46m;yV@D ;Ga\4{V711&仈ФTqW@<૬C(?]4HE~nZ+lR*d&M)tceaa2f8:8Y@[y4`BҒa:Z8VQqxSv[@ѫ]W8Q(c8ʋ "%:4}||}[M%Z|(A~UB8S]]&=Վ$2=zL%>$A8XT3_ "Is>oߵ*./gV218p~Ut 6?z&t3K!8zJNmSL" t,O&Წ 5Wb82P=]X|;_=LZ(V2TLod8EGu :[TxOaY"Ā06tRX;߆f$4AN $I1+ wx VtP"yQҜMaISgʫnSLYkzg8ꫥy_&ثϷ,dU ӐG=~l8Dʳ`Ζd?tX v16+}UIVo_I[u/lSqz 3 ) ޹N} fp=.<_^&%5Ȟ$4qT1OREkoFJȍf-yZH!=t^jԗD}~AϪ**tG_(\8]7\cL)H˶)''L7Ȧ!ze`@SC1FM9Fb%D:Akeb&ZO7> P}?Q&f]ra'LpMJy.L4$#m>~: f:y'׸Dјʚ2_.u| O,0ͩGI3,CWaax +K<}M M_ ϼC\]p5-֠}5O#n'$!7,C_1m/U /Y:>,'b,gf Ťr*9r-]wI[A\ x;<+Q@69讟8nq5dzH0 ;_[k92LT7k͞ xKf!Qٸ֫42]7p0cz T:i3$trrwѽ펩tF"au5+S4~lT6%iN0VA7\I`&ĹE(:Q%aօג% Wz0(+iR6^B% cIDay3ʋ$"B";vvkIyRf" è9Եe 5jeĖS0 >䭎mG a'fX@2 3k B&Lzµ}?jKtнYxl/yh}!usi  @F-4^^{|`~J6@6 BHo1sEh7mb#QoL6Τ8;-IJf"xwգ0v:S΃%-Ol6LNaщ5贕 ߈+HQ1x|V2u3Ap!@[?^ [Ph,H%v9l)o[.KNYٵWA$?h+fdԆpJTFUla:^R:Zg~6x@cl#^l'넟D@X)*%%bݯѧ5Z- 'P8 %7j;(;pp 9>s:X%цaѲOϖTYn{Тwl5>jQ!pf_K`k?ck'xUZM G8囎(9H V q5*g4\*F&> "#cyXAi'=7Fv}wp@ͥ1ԀzjWvٔ^J(yD05h}تMc4aVK N e8f!ry #q'd4[6,<" nnj[IbѺA XHc :'˹ր²:f|3NZ` yq~2P KJ^ETe*}ʌW{Ͱ*-sMRɿ/?&J-#˵S&3S7z$K@k>?Z&"@r{SdW4%>%Qf#< qPcSV0Awb'8:fzN}ɷrk S6Ѷ;SOPd0Z7.W;ZB2J'9Fncpe,A!*} Lm n"Ϋ'Ն:§Ա&X5#}Q(:M0>l*IJA or#4Ǯ!pGXN=_5gcEV(K(fe{ľ:m :F:Xyb}x #YRi%zgv\IrLwle^4gdbА4ۢVZm-U!tFTX Jy !*+{!4f9p4vtH4@>bBU%CA{ =WN!B;Iqy[G"3"m9+دO0#0nF\ĿZsE# xE;¤E /igpP=oڄ%crp[ڳ(iu4hhǁvu+YgRpv0M?c;9g2/֍[]@k[޹Ыpr\\&daAGx{`r08I140F6Ɇȋ;D`|KЮDmC&+~/egXN(@9 VJX&sO3F:1SywEVHW#1%*%ӟoCmWoq$n@bg=S+&?ޜg5ΖBnqX\ -K[F)AgpW>/n8[f}_ +zns1qܺe6%"hfANy()KaYO<^妏+ڜC[Ya%<95DkbVnٻH.f}9BN:0d(w~+iX B˜}?lhcuW9 R <SFY3o2 -0u,U17~uɤ9ɣk?$+8´OpK61@od~`wMQWA Q\Qw:ܗz>sͰdQ - l׏ ԦcR/I$֗Gxe44 l(\`JOƣqEgL5(Gb6U0-uMJI!'' B];^\_ f`c{U {٤u1Z.*^r+7! QNhDF^o,Ⱥ mfɻ؍x'76/]P1inC7j ooE&uÅuN̔[B%T֟/L)<3u+rcGܯe7գ>8fc?, DrEqx܅pTȦ*͗2zcg|=E9 ZhD?޵1Þ .zZd6@ޣs6K6ئ~z/ rrq'FrwȚ1ox'gf0wTYr'A*Z\ ~Lb1y 0F\aȀy(OsWj)NYez"IN˦!Z6e.?q5 SL{iF"u$Lme`bEKJXY%EF|ߝ}K#^L['"N%i]l+aX=9{9b<븠 P\,,QEz\JI 2z,H~2fv SvEtcj`pYLRy3Ҳ5kN[dN!w\qHlfCsWOnE~ּTmj5h|uuӡ'._x'izaa)&S"yʷ'ԛ QCa{'O+*Ah=YУ$6?j&,dG) tVki+׼9u9 ո<*}4~d篙XuKj3rra Oo/n)_u|ѹ鿟t|v&fîy~RdOSOp~#M ݺ۸v%e.쥪~% &XEfVsꯂsb>FʺN*2BKSy{_߶h8' }e\~,K(P:URŸEA&4vOx`+._4pL櫊k%4ʟlf2xx5G۱2?TfA馐e}ss$rt!5=~K)#aGx3ȝlt [ra(@֞?sPAĝSa<2Nشۑ9T ۅ T7-0 #.ƙC  ws1e(&RCD)%4Xuk{XC7Ƴ6'E`T K(e >Ĵȼ0B7|Vr?ݏ{%" GJGk^5Y"ygUm͌Ұxಷv -3tJ v?`]WUV?V6W)}ہ9s.$c!5h`b'?)_>'!7 /|! URhg%!$x Yy2nQZ$ 8b}—6ѝ^%PZ(({6xW^~mr<E?yoJ*1yTtm|vsUZ];Adֳ졨ʇ^[Dm;b"B8BASA Qaaiil" GZeŖoYq<92`"Uڃé*8M&i2Cfi2f)jVaQBf.26lvgvqƬ wí|*lĆ]kW&" gÑQx6kuZ„u=ݻ6љj|TP$8ᖺ\?|):pu'+QX$ZZ=5N8Ӽ^@)jS9'Pf7rS69)cU/=\rujG[m]0h'C?7eN p%4%+ M025Q&1Fwe`fW0H\^ ?=jGI(5@v$O!T}њ.31Rng(=LXo"z $uhI auO~a Pl eY>ܢ V.kďNP/r5% :׳T;JjB_TY=0ޭu,yu,!?]Fv.|y`٧ezDa-aoBm,`` z <9*&󂵧{˩q,F.ݮV`&ҸPZXo䅉OzήQ-&BNJѢ^SNMA=f6ΧM7uB_kH^a F:χʟ&>AN[iӆ\2a PoֈlCD}U1բ2sMV" nKn>syc{\Z'j^hMg+gj{4!'wNٿFt"ŤQJdrEV/!݋pTj啬i7-Ȍ*t:V6,w=yd͎o٥3>LvDjo@t9z+]Q[Mmi/\;SF,Dc ˫4rЙ'f$UX&O:"Lr{8DCXJ}h.A,%=Z}il~T8uscݡ^ H?³2F+%BzF39IGD5R휁ۭyLhaVx.wybx% _^E1Sc[ տ0FZFٽ!Fd3A-7tBzsS4"dD *Ҡ2>^H}0me₱R6pXâ:&M2bOw宊ф!#R''42H-)c@&Su[ cBX Y3IN"},'`[:0n x053}:5L6XNង5f?|]d?My@[6 f/PjUh-59R / J̕7v2ge<1'+%-sur0/ۀ_61?w5b*ylLB5NV!式r\4rW~D@e0AZ8A\W+Z0zU:E%_MЛ*Zz g7tZHDJj᯶?'ctZGeA'6h4 ?&E0"EĊY 1uFV*7534P@{ibPn߮os!%޶6%rܸv%Z/EYB8YIe63 x`2GbŲIt9ô !őm{fڠЩm"N|bzY~g^! >"loФ랫OAgAyat Wl3!f*jǕPuS9.<3&܂aWsMmVq50A`NJ-q!y߻diMS$LZY2/ESҷ4]TMq\A_b3t)%8>bxxL*tO$k1\]9\X ^[*tʵ9A4.8VceVJFA1un`2GN#l; vfpKriE06 2@ԑF'bi6Pm񧟔$NR àw yu"/ͯ{''C@qod N{ns@]l/ %24afweY5:Nc*Gt51P2L<'ŖkʏZ-LO%5W$̾ah|thEF΂~Ps-8@跪Gȅ_Z Y-ysmz(>$ jvIvўh%'9F6ڥGJ2b.891 E1 .1~+ FHԇd8Uw;i2kh|"#/*Թ:2ZfIo2k 34{LPjՑB#puRUO |>Y+HToEIq}"VB7dϒ6KO cM{^4[+nEu >zGa]WPw&-zdF٠=&&AˇhյV{Ļ/@`~ c%cF!W.(&+JtX;)^qj~ c]@ zh3ڬg7* F|ZVXP;O~ѡry bDSabY(SwF"%HBRqA#W_Ys$Ew9̄ԛI ^1*Wa6vd=6#Lا]KS?<[~Ą)J7({ӟ!Bg 0yO2ش3y**RRZ>L4%>yP|]*A~a{z=asPKwv%t׋ywP 2@IE<(솛`Kf_K|l|C . kK!FfaEKgb6u>P d :ҶX#`aUsZ}Ac'uN%䛛+#edZr 3 'njSpJBПG]yO]tJxXa%F67_z3@"zI%/#r#\HGn"lg΂Rf#(3`շ 72R,2`fRilj QP5nO`en+'lESp&3*[4T]r[@kVaAtAbUA)$(t֘G` h)/åAE}04\䭗K EDҜ,D63At'7z"ŅXs9..S*H ;~Y%j֋FX"vC3%ze0 'lFn5HZZD+x#!p   O%(}-;hdWgɔ'h=k1 }~78?jI 51eҫ3[AFHÂ'Y+ aW|b=* $NGȧLQ:ǒ̽.x^j #Aj=6&xW;!r:7 #c~rυEgc(Kg!==Q:"ӉWAxP'x`snS`~PF$ʹ0ˉwBy žkASHeC28+_,Fy\EOy?b[H-`o[,l''bվ+n}Лv%.gdj4~'DD0e*_o]hbR" w77ƅ1ET,<D܆7/ںNQ3)LdOl|`ဒԩPenf:Ni~q ;5nVGn%%ip LfE,)m={=z AtQ ,;`` mSPƿYYWsVl&dKpaji6r#^yժ&ǗS ,9Bu)y5\9 WbQMC—OUٛGHeh X" lB{r2X2 E[!~,$}SBFpΠh+PqEE,((w9w VEb:~z9a\EB4ILKYp<# `mnS4X(㿡6+ԐB꧹,Q(^Eya,1g3| N gڎv&~:翝T2;60V\ 7o6 |(O47:e U+bֿVCD„WP.'/ZꚚ kM^| \ڋsNІzT6$SS ۆw49ۊ<^`VzS'Q_Lgno'[9|3W4S89&0Q *n ]]E&"(/Hٜ%O@Y.XVC Ai۬:kh=aHG*k=4'1-<a s`J Na$MȄ}L3@T.d~'Igr G6OoeL,Wz+4%EK*&ku5MZD6?I&cE8l[JxjV ٺLDP˱LF=/Rp uKu]w8L8$#a![C88Y}ek$|?(WL!sT.\> snhs6rM LBU0Xf8t Xʽx# 9ѿfnѳ2ZQ,t`Ͽ9G4t nܖ]^49uGپ^9iPBo-qBEvHf`%+{Ql*ؾz\ 6_ I9H__ U716 +n%x>,' n/s4C8M%&N'=W `˳;=7e8zO=S//08,-5^?e՞IyQ@ى`|cAv.7IZNӠx_AWױ]W+]LP(2?GUHj-x=~Ȯѫ{-&.hyM, {\!!_q {qH0 p)~&mu0v:THWJǀ9(k%q04_ڪ`LN++]Kg; ʫ)~Hb?@>FUȓ]ʩX*+B,i?*w1`}=UG84c,#Tf-4j0V9~4KI\úq+㤻TӾQ:xp6*4+nh]8"+تx4%> T`a?N ٟeg5avT@dcX0n e-#kyB0kW9 Y OLY|hGn s4Yi(cD~#WARwqFV#ZSk0!Str`ÐXjO"aհrܛM>md,0Tou3{gN G#QnA&xk`f]Y^Dc l 3Ry˱G>շ5vvFỌVXڊ)B8~ %GEYc?[y7. $VrξXN2;8mS:at |$a2Cĕ8yĬhtP\m[NJ#J'ŘŲ1Elf0TO[dD<)W0O4Q0H7b3 >sM@EAej`AnX '=brN;0ynY1H.\}TQߥAMz {>X/qސoԤ [br P.c h^d# w"ua7̑I[).0dSdȕ8VZ|3F6+Ky .j^jqB=̜…XB)npF#l>JyMQe~ĒLѡE[ Hii~*iő/PdZ [r.OGq+tQ{88D y9rM  @h"EDz $4CP abGtkXv&p;lcٶDjj_(=z=[8?Y`uG)`)7>sr:3HMFt~! FgA饗/E+S5缾@ WK^RIf[QQU)5R B3OC"5ͳmYuoSvn=3` iP$_oϝG9 v>Of@d! u8p0Jq<ֽjt{(l+癙: +7(osx;~t#=qpLoS$2cϣ&`g[2&2n,"6zVFR`#\> _^; R!(zgBs9'ϏE"sy-\M]jo$j>D @L F熗HRA'PBStGxI4B*gKz$A޼xaZ@b\k-~hbd/PG)Ne+k5}u-?ƠVPm:Q=apU`͸o.9f+xNm>G#>THzk0_5I}0)56|D+iu!Џ&~|ۜD`4*&7`(cyjL=K?<$~eZPYn*'_cȠv/y= 5Śa5j0=4>!"K㋠ CyiSN'bL҉Z<~/j b{v&m s h ZiE;)_ҍزepF-tO62ݰUh(&Y3G@**T5_X:*I؞JIBv)/hC=qQkRKim P vYش+ ĶG&uױP0p:M6+z˺|ls٩y2F'Bg'}e)0J4"Xg{.^]aWƨxeΜ }M$|Ư!2}aoN~ӈr=G?D";v&2f8`ըW9>H(O6Fq?̮+F)Z.S Vx8YO%1SO"V.`<*TدV (<ErbE'Y d0 k&T;EyUvhqxfY]MZ/BbpPX7l,ZOh+Hz$t B E:z?)G)-F1٦[Q"%LP&aC ~-QpeD&n# }*`;ka4`wzsH/\>䂰, 3,GtԻYpdfN@qz^9L|(U>XViג/Ѐ('lRv ^ pP( q,V3\vAz21o|#rl3ǝTŬev3%VnN 1!a+܏Kz`=.= %H 4M_z-pwU]b]W/F7 ؅c `FITN /&kטmzxD^򺣍p&(!ZagÆdlѥ !vѮт?O`2 1; rc~gN֙UDc!Cb0wεR$%x 8]kջZt;,Vg ? KPs"{>õfDECjGo7YR>b}_K AA7;cI |rpFvDH_ (ߍ ܁GYu~5u1]R,O!zm-vȵd9jEIB.6h $-ojړ _]v̨W)5! zRnpV$.޼TũR%A;^9!cR) !Ԃb{2 Њ Q3 }Dۆ"95|qz $&?]w[͜rB w\ j_VX K.n,E# t;s9pm͗<">ƩHLk| jGeC3RnyߛXzmNԋH|3o FW9?m e>Y[eȜ^B5nv E,~Xڪpk'H&e&Hfh^) u6R 1Z{`g sXC/zqӨ3[ oJjZp:1f0a+%򢳩sc+{JvG!Kֵ%S#lkIsFA q6Mpe'⦖´I P)5>kM890Υ,+_oQCWXD}\8d|AOvdbk=s6\3,Rƃ*HA0:(\%|J?^Ɯ6=Yֻ{e|y;A dv(WD5/j]TJおqisp|?Qf }`ak:88#ag#'Z(b=u@>Ww2a#]yۡ]TƾB":e(H}[V3IĨC-L`p hr j7Kpɰ`gt;HJyF+ùmHF[RdY=sB D *-{S/aXMܾųNTL@i#s0|ܖ(wmgriނLtŶg( …EFwzQ!&/yk{J6R<㼧&^P "=T= ]kYk弓p21٧>{!ޝ,r~{ZqAmk|ۑV,hzq|F v[@4,j[Ou0"$SyI|4617$V˺DC`fP@wl;ta_il}-…(h02 <3X"fA!]aHM0\ DJz5k;cU(vrʚvFO9U^T&o!7ƿ_K%W9yk9c=$r_/%Ȥ.'v7u J**COŎ!Lka2ؽIMK7/6g/i/Eآ`x=5t+Yo$j$Hو /񬇔?g21 44`5+È |0p)ɋC2&R*$M#ʨlO5stGdPA$;^~9P܇;r8UA%^Jn!*ߥ-o%-}|X &*عY.}dLK(S6[2У|%t V~)UI tͦ?EڋEr[NO}Gb/ڔO{֔ϓ8.sF.%M%83(]=zqejBºM$xyk8ȹ2$0ӿwIY  Hv-2W2Ucep68\xm>&Zġ2aI䛚XOPX&#M?XDpq]Mh 'Sg1k٪9&Dcq~jW%Zr< *V󛵛ɿLj^o;>fc<^PV|JpgM39aV*exDHi Fq8Ty vML+Zq_A eԽјr*171"޻ ǤaAD͵>/J  0;k#P @(]dH*m:$(޺^O6 *A-^Lj_Q+eUIS0dw#NV+}bhNqȾ7dVh3ԞJ Ոۣj_#N ηѽ4w[b.qwa`tq *:Vm>*lhaۇ1,t'"|0hJL5WM8ĖL 9f-<͇(fJ,5Ԣi}"0JDSghCis,V OD _baF~F]/;;b]4pF^&zW461pH_ A<Ʉ~,)KE69*8+hTEr*vJ,eNʻKȎEc=Qr-sT'f\q٢AԨZF)Ll]Q>pS18g3Z?, n:cT^Do Q lT" IL&D^{\cڌ2m 1Պl>Q$QOHCOVh^IV+춘VCP;lP 'g$jAe{#I$db&5m3D?]+om-pw-.r$qzt?vّ*u_j *S74vOwG[q٧3 0gO҈ŖT8DNףյ';;TX<5ЦJ}APm( uurwCFlhRNY }6NQɥ \!ԕ]V 7\x_QԁP+Ʊ;LP:Kl.aP"SMO_LKZ ^#řfy c+8+üoa%o^(FbYko[8Ly3 =rUUЃ70Eգ 4VU~,+J&lG-xRў"f:ɚ.1TB(:.=SdȄ/^iB CY"= 'qNYE2oSk wMSG˿i;yqPy$ozihVo0%WF̌Ěnqy4 5.e/3[×r%}C@-yvmӸ%- ~A2ФljM4f;j:Пrr#RٰCBVI30 8bXkˣǨR jQQ jF%%3]876i} ZU67_#9#^ 50~(ؤ-Is)d`MM%0TRt2*$Jl+.9n(1>FaqG-PׄO:AWL FOwuⓙЖXKeM0aL%hGb者Yo[w.QUjsOqUA-n yD;p 5W1 \ʉhtTASAT,x JTucܔ|j*:SA JMCҏY/%&_ݏy#/U&`Ủl=,s\/܏UE;Ml ou%WBҵ/C2ƟAC5rVvOwh`Xe<__Ѓ V )"(X,?ܫpEļ ORToB åζQKmӹpXK=V)y0ɮn:xnɬA!Yiby`9fX0Q Ph~m0tUFfy69=,gZEnvxgs!hTm%Fiⓥ2tV,2u=!_3!h `FSlW"6uHZP.7)]p(> g /<\U /qۚtwà~x~ 1yӽ}*{[tt o U\mKNg2j,JCJg J:)_l+,/&8z5KB4VNp#ҋZ@frtc~q! EXIM:E~UP-HY-lqMke[m{nHRQsz'oPK9yQP-DUȰ|.ßP7M+1NUaaۉź'9UjsqT.^#^'anw[& <}SdE~ΗY*qXV3;YC O(7o9#hQSWGRmIvjUf/)P]O/fAkPIx"JػY7zl26S_H`MQ5rK38J^;`YOUy_F>C+=KC;.1>TjVå=JBz >&%f^B_x(l&1ѱq`ڻu MLv6[^t^k - W.I%)*0B3[uS7 I2;Ka4ZhIb"*Z[HFkv^Q+8d,'`iLf ʒ mܙì6f=2UnQPtяM霣wy,SU@%֝ksOks|爵C8VlcNl0fWzWo$w GTͦ^<.LO*"s&<}Gw]UekgVmkS(Am*i{C [4? C,Nq$Z!-oK[eD8>T!QTfX^  @ }IV,Y gb7d$S OE̦GC:WgXI(4?X\10ܰ9F͡dwŘa*uLp$yC,8Αj%83E #QnʈxԱ> \iVyR/g{85ZX+)7|@/A!vx\7Go!t>riNb,q??R!F?kA©t,ktKpz)TnY:r )_bArg^1~37s. ETިWؾ`"w%'̜3Y4OQc0KE!lЌ#^)9AA2CkKb3L Gsb2zd>Ao\g-'e40j)'>EYߘ=@ `1 ]4lEjZaΧoH8YQO.񞲼PGScU˵&:(i86ß}TP*el ^bnTmc1%UY9[!_'M!~sLL ^]Ud` g" O$E[]e9Oy9JoUNL™=1ۿTzJ&ⰝZfdŕ8-`\43oxB>\SsM 4/xn$e ~FĿ y{5\ \s@,M\PƄ=![')Xe\E"9v2Kd'98%ICq̘K);5oEAX08jwV sJay;Ƽ"%D%%HzYJ{&R篬yBz8)EDTUHGA 󽇙fbv{q I:ՎXOG་v(I4,Hąe[T"J3IȎbBC¬yڦad_F80ީkfv"ԏ墁24F7`߼?q@:ئiQ^ϽSg.esFwD9:'.Ɇ9 z ezCy э$ɳj;u 0ryw;$s7 ȱkQkco(iFU%h4|X_.l"yvn"rDLZ<`@im",󠞷N\_lŰFBIq%X$mGF欥ߗȩ㺜|9% HcrEt=.xv"vQ*RvӨZ\ܘ+@&W N#N,m8VKƵM7!z>.וpX67[TFӂAc8o#IFJ( Cs^@]2|{X1COfeRIíimTɇkb7~HeXsA2y8c([;)?BP~d#縃jr34դHSg^s/JWFãbgoy2.`=0<۴7ehƹ<8sw뀒KJ/4(C’U@ yfo琖i1%.ܟ;Q8# +ğ#b d $?[m'u(%AҀj]s lTP縪蹥[МNge1~:'e狧|ٕ!TsbW6 1T1KD謺 l9 v#P1;'r  ɋ8hږ%ʽPB%؝"@ ^/g"d0 L)a;Rt\&?'B7)Sɜ/VtyIaK-v Zk:4sGQ|+߻l\?ʹ*)n|W]Td}-oGr12ExVz<$Jqa*M< wI6 kq 5F $rngx1,JXQLoPʁ2ي?P/qȎ8jbe FYm1o捦~#JizѥYF Il}*T=~e~ UIxI[5,4ȝY'oq5VmOM<@\I,ǟ^B mEERt狴 fxq U&%B_fPGI²P3do ٭h*#;\WMK_Xm9Ψ#ѡ4Қg {XiŜPiّFJU6XNCo&o}'P}`QD~q]ȴwr0gi;סK| :=U+‹Eu Hif>&^&!hj`#0}w|G 'X=]q ̱6+G" L`W:7ב&q2NzC,fHS 78Rͼ#%fznmCt& ؤ7qY< Ѻu ;A䚧'>=&'8ʼLU}9@v+n骚>>RT[(ʕLl^?՜458*܈C%1cQvBjSE]/~TӘ;4U9Q@|9wpp``|=7tAL R0nڟzw1+Ag[vy9bUk;9;YZo#uAI$^AGOz4ѵL{ubP5|7jACӈ v@t;<=@͓*qD8K3M"08Yeg SwcAϊYضKd:Yga0Ԏۻ8b$N:AﲶFvܱ7ߎk HB+6Ǐuu,:4564"elB۰ֿf)"-ҹ/vGZv! )n+!bs`6?WI<: kP (M^$.c{7HW0 XckV[Е)nrVŏ/ӽ%#siQBm8q\ <ٞiaˠJPSXePJrOdU9*eE=xs2nxߪ{c$Yz1a!s;r EN| [^"d0rò]',%W {=. N1I2x/zP9e6 ~C'#,@ ¦"Y$_n D !" QZU:}YBW3GM؅3ˀ$"X*z7$ -9#nNxhY^R~X8[W7ǎ]`]tBHv2*5"/\HG!m벋#P&퍜n& c2 jkuW#W#Ȇ({x툈jeF;y(^6ST'2 DPV80"N, Y"[v b :GJ`)a;4(H`C]@Hfx&Bo-mYSkd.(X}mb8{ne< N'!۔]+gR f7p;lg IA̵t n"ބAgI@HET_G@W,uĺ+0DĽ>[ Ĭ = K~kDfa.wa$|+m+F9<T(s"ӄvvɄ]{;$!%hI[ŔZDy!_yˬ̭`ܔ*-:CM`#ăz*֭,FۏGȀ)xl 9]w(}}%.8{A<>ZH ~LMP#8ep1e^q+D~^( h 6pl\-Ơڃ*smݰ 9)_7qgOCfGUn\-ܤ74~CB\L-L=@Wr?,g1J", e<֖<$eSs;3wtI FڈQ.bw/v=m) _ЏxAK|qT*JK+XkFAym#Bɞ7%z<[Mu3?,aCĿꡓ5Mx.):NEHDֿ`_aoֲ<=a^:$*pZN^CR|+mhZ"iF#iDU S҄ } )n %؜XhQoP ?}( k8/;>3 0~*ƥ0^}$u :Sw*O GXŨXf8ő'd1:>w{Ap tH~|JשupݰۻvWMS% c~~CS` yvH@QGL$3d(׳% £;~a_vUQ#+%DI C䱨qNNV@[mlRtA8{EejD,Y}pyFz!i~5^]U$2Cپ&`e=u'+6^ r59;Q+?Xl*k[lB ߪuIӂ, tia.t&HљN#^P^Dc*'kټf <ߟqѶ v_ETD[~Pry1 }'?o1p@e FecpGmӝ'˄IWHX<L׼  &SRUo yՑW-J32fǙ  5 \s{^AB=n跨>"=3ZtH(f2!4fF n.7x9ISi4 ~Y쳿Oڇ  ;./)Aztod؋aF#,`^/nW QŬߓlxra'cA'943}֎di$Ɯ}W ?V HR|ϖthKK@Z#[%o`]Wqo-]?_Pxy972Neq Ir\JOF `>F~Oy{n"Ll^=#R;O>.'-˭#AQ\۳jĢ*o}g0rDjBsΎxQGR&|4x3MiMJ)( 'gf%δHPi@h( k Q d B+/\ +/onzSe7E`SU a$x1VJoON=}ts)_~E ݏ2,zP- :uyA,$ dJ TbNFcz `f#76^# 'Q_u42$gcji8ru8ACo&dN]$dw`(5B_ \B |yT)J3w6\Lr\*E]4.+D3Ls;ʾ^uoK\\ ?LOg&&-k|;L9rHv+QiDeq넷[Е?r2"+žKe@4)Ub7i/@ݠc{xa_R Mh/wu} "x-û>߂>`N⋇[|{ ́kh._.oK$DC'3?vsqYm!4XHbF:' 񿲪t%/}G):O|m}!q%)37G Pn1v ́YТ呶PW┄{۪l'*RdIvsRxٚWR߲e'֏Pv#X[|WF;=Yw9hG7{W@\`H#8);]+Q К]+%AHLjx95oCZkz )vɖ6N{]=oh)Q >vijV_fIqu6_8m‰N&ԉ:tk&1~OEkqs(r!Z4W!35&{Й-J @=par.HGgc2ˁ*nHqm7' '+qf7 ep*8ڱJֵqG s y^ (?y@bO٪,%W~=D8bA'$Fʜ6*4#EG+1"d `Ssĥf*VƟ\_YkB")_aU6'o= dEip(GUgiluH7v3jĨÂ5蜤V_N*g\I ?BS9F핂Na^`L L\>cqVSp]R,C见MgP((WtKZ p&W, Rl~4z&r_Fd'l屁ccD̘ cYqiQ?U S19[L xK;MBڈħNuS*%fP$pxc.n1T0Em vZC;3"%N! a -l@kj^#mi&1t-D@FvHRÜhDM2ᄍaG\xCnԨ2 C|F^f1,p(F3XyL-Ҭ` ו&fy&؆Ƿg}h&? jNC P_sԂM0WKMnʵwWSo-ټ[e:5wM!̗kQ,}i@}]%nr-`eY$x l"\NWz8N:t-/|9$ꢸHn& \'?~- לlk3KE j ty9 W($uB6v̖+(l-(g+(z5C'ylm@Zm$[`%GKLK(o6z/=jxra%#2>:NYPG_=N!&1YmRG*SȜ8Zv+Ie.7,rQPlhS,1ś:;(Mc`~Bto<'qٳV+3v!)'vꐤ'~wш)K>tE"E f3݆]fyP>T%MbP|߯v!8-E!rdn4 D#BtjvC׀AyH aj-!vC&s2vkupĨRk> r\]3P ra e* t,PpYf Sހ I=~ʡ)3ă1{qi- XaczNCU(ʳP4oߴt#U!_Z䦶.l$K6Po%jh_>ž#^Q2In<z>Lo]l2}Ji|5| [۱t% fM]χ3Z~Ѓ53Hpt <~lDD܇1CV])nbBJ/z0 qd߉Mf׹?@f+%z#k-9 6Zt|E-R8s!# "hpԫ^5i NWy(»s ϷJ{PG#l$4b*\x\WW82=~{T(b/i[ޞ/N l.@#1_kHQKB1;/f` yՑʖdi&;_kCҀN[Ie3=~ԺC-(Wx)ŢG.fqscp@>C`Ց^(t9[]s 06 *{Ί L(m1=jMz$V_~#`,P2AGiҀT=/ro٨cq\@Hq.j SghPJa~Vbao;xKF,.>$?YDMWY9bgŌr׮lIBjs~o`-cA{]X {kiɇ<+ϱOF~)yWtwUM(:xLV׀GDj9A8Rxd NlwWF,}_x>#ERUMx\#۰7i\`|Ol2x }0ht{hAzq/%/v5 g/fYrlOZl9poՋXp5Hɿ?cCEBa%za~0i焰 b qfew 3T/n :GO!]hHKぞ:_M#xF0ɺNخ1-J0)(f;:f&N$Zr>^UPޘ:Vc_ ɬC #~?lQ0*0g#}8fL<+ް>-/&^O q1^KmcOy^wy kޭ*L'g51NdJh?3[D*!kkqx n fWMjWl8|gh, \gsW(ݠFf6vj%C#V!l*@=BRHabVmn\A}s,ljkd'3’L 55to$w\d3XuiIBDLTA[9 b7 FXlEq({Ǝ/O1xa"a#*AvbAa-St cWkq)t]Qu<M&wSiw ^a[#[,!;J&k>o/׷aƷD.n2ϥ͝+}gyDpJX=}R(Bטm k6v" QHZˀP> ~F0"lyȰ8D6w-Q:\Z.PѺ(|fz%!* x>xcx$,W֣G&pgR)X&I=at0 jn+ c*qfPĥ7\^=Dlnb0!jD132hgbz^ԁϐhmI&Xi{A$oxjnj5L[ۇ%h7uэ nkKlVS@w_fLY*T}㚾ueZ#<իm㐅IGT0nRa\cjrAh#ofLCnS%Wa>~i,@@NIpJBz3M!5)?\`R<ϬZ~X'>q~pkLo0~Kl@ ! ◙+b:d(̑i9͟NRD)i@`%Ra[ \[vu짹QLv ؀RCNL$7n>LorAs{Š\GJJZ3ooN !±+ZbV[t7PZbۛdw{~8ԧ6 n r= ~-Tpځ eUkȠzMToݿ ʻ?% Y1f/ QJ21h[J.'ӲahFQ\-0}1Hj)igԶ P#Չ!"}u3@&7 nXk* %hI}z$s/T;ˠbö#"H7;'XT6$~S@ozlr&k t/9P2rF)r_mh*X"gg[`d=>pwg[j hK9Œ0`ʡR˾.bm~^ϞxHI B'QY 飞Rxث4Ei ୕yӃ~iK R Rрц rY*ժhl*_+iFUؗ;h}ԕ֧1,}tn2@+,JsF]~w,IZ9kM $B{k YMJA@Qh&eX6{5E`D!,3v`s}^\4(SgUGq*J[2̑koT5 `Y Fk)PEwd擶.+ x]ϲd| o66@[atq59ӣ < 2hlF7p/BW-Iy~tzļo_7 **t.{19(1iYݡf񔲶Rj2˽gHOgXGx,bL9m[QJ#Fm p> ڹXb A{_GalK?oMZ@ bIZpJx:y1Mhj9:NdUv>,KjX4gLӰOZP 6L(+~9C9Ru"#L'|X^4y)4V\i(Ȣr'p1 gxɣwFs?S@OɔnFGї[&*ӊ ^S *NWo i ]V㣁GI٧!4@}wXfׄ^xD]n TJƗ(ʺLw Dd +(hf`l/5児C!2|UC j!PCɧK2?ezؾz/ܦvTJzPRT#AeVPء]1bu%;@UMkl$];N-y!k<0y5p`^hb%K4reV-rVn]s2It $y||ѷ$MyT}>&s|R"Jգy @ W}Ei2LִvdǍ[ *?:\޼ *q#c]5 p0E Sg*b!7cn\Eum57@XmH0,s$q|JʅTCA<{ʔ\0(VvٶA\ixȋFpTiq an.i{J=Z, qSc\wXH^J}@pak! rUw PP2ͳ*!`X.Lq&46mV%[Qj'KWQr[rØxSzU1If: P{^io\y·.y*;pr_CAAk._15䙞8?7*)@ YO:rgUZ:jp d\ez<}sOt.7EY5K$>mEO0M6\tPv tՍK-W@fad2u1Q'p,YJ@"f@B[/x( Hå (}PnsTr#vd`J0 8}_6LwjPAηޅr7d`W XuuG~!e 'f3@x;| H $D K3톊}/%?$4gƁM#WU$W{owYNp7i&X}( w/D" eY@Ji]y?O264e@/9PqIq)kL?N ZC ϜU>K)Z$2-͂gQu)ײ?YySSNi-At:?. ګX:nlBV}jm]`KL-_YRְ_I I<qܑȰ^y`.gLu.OGG.G~M#37-Y5cNC4ƉSǸC؀d0 =zȭ4t>|{ފfE=Æ<"</FFQ Yf g[.#Aʈbf996>ΆUYtDa;zXFsHp|\c sua _rlDC&w7<IfNWྼ/mM献00K7{:ZUWrlwZ9սv|W%[5ܦҟ6S 4FobY[Ҋ#ŦƂiTwpB7-¨* 9ն%vM:Js?MT2MmI(^cȘezK0 ?~uR΄qf鴣+և_] g'+5Pb՛(3Go6/} 䩪tF)C`AWH G~%,рH8r>4 qgANKCp}301)J:b:$\YU~ɳz?JBQ.1MsfUNP.3nrPrf!u E_&p('6mL>JُhEZBŃhQ 65W0 2Qwp`Gk é`]\#@sh V VIq+'Jv3oe'1љE= b'4 Q2ƉY \>rI q~)o 3ګ(:{Nhda"/YÄ·+39ݫ.yjH;{}Q Ǚt鱯b8pzrR^b>j )zmzgAc> 4瞏"'"SPnxI#c3'E-HIj.' 'g>֍Cu$dL.k'!f U3&|& ۢbE b DQꏇԿ +.`l18bnJEEv4-u> O ʰ~Zfhn wcva U q҄/y ziy"DVcF'C,t](ė_@*LJ,zlMQb(:gvSGߪbWHk7G8IQpb8a _s aw (EVL?/F/ymf9BpW? Udz@ u`Ġ[]E덉uqBRPur5H4*;Urࣞ%AI^:q} 򕫂yΈ!}m}G` ,8mj01n +dJgT;;B ӕ0NFӚfd=S$Gro@OXځ(ZPkP'0I2ܦ9$STFfip}oן@SQ'ݨj!SCKh/q.VJ'GV%ʗ_1È2tt*Fh d7ruTMk%!M -LRO6HУjPw)"%Ja9" t awR+QzdGpUR1,9Sr3{L{I<˺Mհt<~t]878;6NP .B^M3;ʍrwWE њܴ~l;)Q̧M-Ulo0' Mx[ܖT, = $ ^}R*-^ݡ/oRLɔ_:[_,urTXD޻=zrʗˠ2Fzrb}%_gTarvE=+M\IS4;Jk w+HG)AoqeQU QWWlؠukzgK@X_ΩI`ӧA)g~FDAya#in 'ӬEGTϟ Sv !`6`|u WςG"vkxQmIP pPUf]KZ*[) 6@n=!AdR)ϕoAR?F;6e A _X`q\9ͭC[Y/.iTXl̘wQJ6j@vP)e0'kJf #sHpa"[+fF-Π2S@e\O蹘7OCy4< aTM*sv^Zfek<b(z~\s'[DKV%#xDظKڕ+Q#_'˜½j9CF!=asw49n$z U;n&,gj闹vh8z~WfǹuL٘x7<;!_,"Ԇ Dr-.i[QXŜ@cǃ,]@;S*hDC2BPuP.au'pX"nQ7W-9 "kϬ5RbN9n7[5ksLkYÐ3<ú|&w;zD!IV4Jt<ņ#dHOؿ+E aR,,oujU M:R:fD|'З1 y+쵽vn>p|{4-#<Oz{ƽyh,ՃL;♆2=Dú֒"DKkq tbL|-BȻ5i.co O;?nDwweeh'DWdvI҇**:v,V3/7CӼͯ"QF@ -}d/?pԨ-Fy't-朐 ]Y)<!l<[s n,48|\טJׯ*.1 àb}>Ƙ07Z$\(ۯ߼oKtSǙf4^UC04kt~LFrkiк / A^롙 Leg"]r{Z Ҁ/DS<j]aPؠav84Ɗ 3qj~N q$T2\]@.Mfy;JvƟ,zLIvhdQGI⚼MACBaMQF*7UpڡٍdYآPp~b&dQƁ^ݱk4tSO`(nqi7`^{iCD pdԒ02cYzxg94CoMʿ.@X~8K )ѾʵXa ͏ʻrċ>ŊE%U0XN iL56|%5?- N:t:WှܿZ8'o>3sHJHCs {󛲗{k8I h$ Ãa;MoDNQNo{^ݣa^-'rO_!s]<`XWdlbC\E*2L u!zL N&WXE&"yJxfˑƧMZ*rf+}({ hj)#I8~{?a?Ya䨻#K^p^KLyC@-(pЁI%KRR$R@bkۥu ߵJXz{,č%S@mJ#_)ftlgY'lGӮ@܆ٹ!Mu%M]@-P"ЇKU87>GZ)WZ7q%Kf^y}w\s8R/(|JEEu=ӎ{ EtJͥS|#΍@ K=:^-i 0LF0G4T. y@@qe)v@MkG/O=o'4?tӶɻ?MlE4HK?W͝:佂=Ax/vZa4+Y,؀9t~z3H C MP.=ǯnG"^v}IM/&8ɉ5|xMzS/E$s<҇Ҋv?bC4 ByuOWC_ EaAfߘB@:ˮgL4 iQ܀/W`iZ{ck Ѡq0. +<:)%CTaHݻT;1 X\uX޾Dךc\<4pΖ0GLФ"&+o0swVvg82j*rz c;W_s9ZTWk"*UCYM2&hYIr3z<МbrciRGFr>Z rlEEӳaq*D\i+k]@_+ԏI"EƗ|a|S< 9 /ڨH8M.ET()\0l!r^:"DH-+#:Rdo: Ĺf=ͳiN;y1ϯq"$h )D\ \AuR&@ñC-`^`*6`4*C?xLJS:JGb^~Abd/l(-c\1fcg,9_ᷮAUدBrs"Ѣg0GvS?#( \M9~N=0D:F^UB)NG~Mh OjcQi^"`5}#"vT*F]2[O^T'|Zcvxm(J^tn.6\H q+%p ˚h$[}eE?^=~mTgMܬn|. ˋg5_qJn3`]4&hW *f)e^/Jbjv! ?*S,zk,vt$s !%?6qYvx| ڮӖ_!Rk+I:t2`!/PJə[IYU ijHaex|QY`3>͉$ɀ( _ 0}VAS*TUr_f|}cfgZ/G2m)D4`O(z u(uaɰ:n/Y~^u|Jpm3zRdu kD.zykk>o3~YbIS&D3|u3AI%%q}w L3tF0{6~O7Μ`3TIѮ?5\jK_;ܒ$nj|Gcyٴ7h+ L0U͏H/| /'̐򬾝(s>//'oS PO^-h¤_rwi=&83|HG(jd|IepAn) O[qs _us2:rC<_v !!x&RD֑I i]nU4t؃'7Nˢ"n9 XH&LҾ>c9bGEaEGdG.r!ՒPz8H 5V X @N  Q8? \O ނa(d.F/T_t'02G&,jŠ %=kqBZ=$ӱh,+;[#}pT/ؼP,:UFxX8:tZ!- ȷ=y-'E OxRd^{&d΀ .LDSn^ cMr4rʑ˾gZЦ/\-4qqd;h' #;JKvY+sspoV>:K+J*YʂADDܠvW>Y4_ B+_:ٗ|wƢb  .Y9y쫙}([Kk9o/=P0/_a* y@u2K tfA svNOw[HuPI]8| P)+Ŝ{#c:s&I .cà T[ڌ[nMaT^9M!/B-Q0jJg&~A&'tF5[4S~7UŘPĬ;H QR w_~)nֽNn$}jug;4O=}Ņ#5BJ[ack#!O8݉__/\4@l]|`) n}WLwbR|v/k;4E2nH;]A^zĥ&95$h^:wzV\;ز1JѝGQ^nE#jM}?b>V34,n ppNֈrV1q^-]LIоn/W/u`YU*П2a-`bb._:q&Ybd[w&LAQ[-FˀKI;o]ʟDT-2ɽV Ƭ(ѹͭaL"]WmX q`"ۊP\Aȼ$qy\[M5 hE'8'qxBh{͓sbN`CsǯBdJ;uG̎u<IS)U oy5YH&bE$NdΔ2rz]qc6,2ϼPvW%kDQ9e@dIpRbYY|Rβ % .њQ2#,j?]0;ЀLZ1qRTv!#n' =3$P/a㛶zah˩Vj`>u.K8S#PDq|vqiAKҞ,FQSSSHtf/0ZcT2Vѡw`^)Q)JjlAFÅ@M,jʛTˍPk=`#׃6`s1oo#ze" rn`ƉoM B/E -Ud5gA)Dnkl̢sޝP|ӨsxYm27_ꋉaq..I4%:!›@ dHul֪dۄ6!3Bi@1s朘=qD%s+lH },~BeHRSz~C0&IZ]MM]/yΰ}{ڀs Av\8xdW)vVǭMu}̒FeB7?)? M|_*V#א΢hj{3\SʃHWOB^& tF7ǫt`^8`SΫ&/9WS i 's VUǛ{0o-9V݊H1J.j Xn\N3Pm=4$TKP1s))_O.W엫)b|.3Qyӌg&ߴx /zsҧz+ecS\^c2/AhH-GDӜ@!֑4}˵gN F42 pSD="H&Eud."K|AŅd..KcK6C;g'r1 }u@hgq ΚU_dFroSt.6=[>i郡? B~8׮hLp'cMBо2{XR -h԰M9.QƽY 츜yY;h^%u_#zI-!0"B 4ʮC.; byuׯ5[t@6+f4I[ʹPK. +!?h8} ThʹOz<5QF ;86r%y386ȅT)`Tilɪ.C7=pI(:qS*_YF!&I8ȃ|oyNDoʁjh/lT$8bQ4P2Lxp GR뵧>ecp_LEա˻L_eJ,б78xr9^g.VF$U)uͭt*r#@2>5ٲ*{/ WJ |JiIΑ+CtGmX=<'Z=H2Q^yԀdO(kC5h 6-Tڭ!m _1[4_we7[*D?(KuHЇ񴏛eKF}d-BŮ[Cֆ|,K5B+E]O'%p)wuzc"(!2:L%TwǺ aaw<{ B*hy^$#y\thcgv waod#Tmtkq á`.Ƞ?&&9=&{[+Yg-s>oI8AlU|b.V1@soCÇ= z&iGo:o/[kDqe рDd=  sU]jDvu;1vk= T3tl}>m.@wG@H{" X4I1"=b޶ /ip%gFwi'z!?fŠ3!Z+`xW6Y E$(Oc?W*#ɮeoگm,]~9v [f7Ă|Ԙuk0$`ScZItta.QƳ.`@6G)%AiF+tLzcMx;荖gϟ3}.4b;0r3jdg}B \qbhNgtssQQNLɖd%tg ۊ•n #E5yP66HXz@ן||Ú6v(q$mP@቞zHYaC~t!1\ )o|J+ *<ĸ_*3rCu79W\; U7&#lV2 $KLx` 7ռ XTjbBKƧRMR#NO`tjf7`*FPL@ů a{9V5DdwbRz&F+.sod> jOf'EJKvfj1 |K.-{azp/#Q,p3K ~dG.TЍYmMh0FyaJ<$ =A<珎EZV&bTI̽J'[xImLn˧N ]w1/LGkwUP"Fs"vteK$chARN,{<23̼J8':sNu9i{.U޽ž ؕ@ͫ뷊p* M4dwH-4{6sMO`wźp)/YM† IEfW`$;tU( db7#),` > ^m5HASHf|[Ħg85FpԈU@<<"j{P@FZ\j1vmX@#'+wIvn0\  w/Qao2vZ!nQАxoԬIaJvp"Y>+.-:뇖!`7NY6L2mSlm7-UWIٮOWh;?GɊے\G9-Va7>s@KƮ`#`ksY uf$V24gRYCx;=|YMz9l[UOMWV~|Hp%Uཊ^Nbpݝ.eo3[}mRRaM P&kĽd\H9.3_*MoUIWW|Kc6!̯~pt{s8l3GB-n! |sybP a9 SI?24NrK,Rg+jTY?wT #K#чˠJ4\eXE%C&[kzy8?z@-?#'^ isq Ϣz #!,sPƌL[^EAX'"$ȯs({U>Ru聘!i²{ /k\5tJٺ-#*s:ēh[b|(%O2|p@K_"ef̓4^bVƬY,JHĊ"!lR1?3,K%RI v;"2? #sh"6c@E ZBy~:z}H!q,s]&[ HBL:C~\:EƂ @yR?È#e#ĊW@P]Jv_o+YSЉ]Q4gbXDJ]ƽr2䞪m8r*C #D P?[ 1 ~ِNF5_*KTF~JPNno(smu* c ,FWCOvC_3{#;X⮰rLƾwDU 7sԕ\ "\!6 `=r7S8@885eòRkZ~CʔDROb ,Jxn٣mJ1wᖠJ**7bXceGH nf!4n(W)&%ojtuVʲ.R.B;E ܗyUA @:|`6a'Lk:t}[J4+ dž'I#>u dv-FOP uaYԶ`v "* <k~JB#3Uӄ[dxVmldHu )UT~u/ X q@M-rm3j{0nh rr!?ex?)N@Fp7cOy¬L0 pz!7ASlwX_r2:->Z`*TZgPKJ_@ʮ hZ%q%NHXʎxu.S Г8X"3[XOSK*nClB28܀(J#kZ~'_؀bɲ.Ϋ 1k7z5%W.5#u0bs^(ɗ'̓&)3 F ^P8)(LU8)XaoZI|FZHSeɻN(d@)ޫ$m[ԶUYJG4J(6-Qb;= % \cDAS]f3 K})W3ư$;UvG`o>U]EnvBS;V ˮ9j~ '9HyӬ+ik/(ǃ1MX˛ >\ǻ\*$ ~ ^zbJWQ]E_62d8;ІFi *%W(dsVT @BxG20lbf'MihWqi--gio|*8}"Gʊ!=\ap zNa*x)ŷfq$1@Yc{ 7 pIӊǟ$ޭ/~1BuU7} 5 U՝! 4 >NhUrv!q ^atND _yPlcX Io"ܔ$l d-tZU,e{e}ǘPuٓb#B}0`chu#x%M-"V!9^aRu!qZperu& AE͜MxY\qWeؤ Cje9e> jX?u{%݃UBhQ,>hǖA2Ӈ͢T;Qh8aOQ".Jȹ-:G /[v<($ `$eIԬ%ag;=pT3Zx& ~EKdRL*Ȥ9+#./* :o Ǻ^ga~rP1HLqFx KF[ »^̈D$6K?A@s)ĄZtGn&wV=qdlb_#aVDMex,w, gퟮp"-lPf ea6(i[0̍i^ ,m9|ŻQ>*pP կر{V'o&}CyEbfvPJO/B\\:M}o/Fέ!X$f VF} T:z-f !Ig 6Gy>[?qBgK8I!QbI& B:r!"Մ abhԝ tԒnP.gZr!X?oAB ),^Ex#e3zD"4n+N3é-3E!E٥SIG17j&d_E*[{JeYR0Y0\Uswr)Ek\bj;8H `X[k"5=~-![K%z,< *H|ywLug?m2,OoAFB>b9O숹63Au#<>YnSJ|8fSG藿hmgpMHF<'N*kTPZ\cۅ׌U7FܹiYh6ƕ!4t迂TEZjva@48|h?m`UhÖP[Sn߾2v7C`&;p!ou߀dNy%_K߇ܥZ:rTsZlc'aq $Y\RÀD*sEuO܃ |v3ڤQtFa28 \2H j/ϡr$)0i&+aIE"4/TD7n U(x4ݾœaFC8 ܫl6t8p;`) >[nWG Әo<RhOpkX*Ss`[wp7jJ*CL5>r+϶;ҳ⥄=Lı `Y}{CQf.=p(N.ݙd-O(JP 9Zϋ>xPyF2cqkr{_&^ ifN': z5` u^/EOoZp$Ic@LFVk׬C7mM+E!(e%!. Sc7F,j"g bbG 0<cbUjas6['Cb_6I~>M:}Ԙvt1>ny )$A<݄&t6V-%JW΢)?iA)1 zbFѰuaޠ錤>):QlQ_sddȇ~!o)ZZүkT~3!Ieh_PjٞpSޞP+(ʶuώ4r?Q~XJh*+ a-"಑gCg8B8T0]{ǭ@&s7u H@R}G .R:Hbf ͱ vt8r^DLbt:"W]z2gP*p"[(#9+U";J[huPc߁,s: kIAEIPˏ&| Pa.Yr84$arz0_|-G- ʚ9` DOwsbUl#a,q0/cH|CA`dDA15`[ΚJ>4?{CF3ڄD(wU.g;~!-"I5,V& JTK?U>WnoVSF/ I2? ^"4@x_8+z˸rH~t,4,1'M(L%o9eC`uDאkwI~)sR2d^T}xфx; -Za 9`{>y%؀v(\JHBeZaB+(?SO\MvZ¥>{Vm#WgYf{Uoٷj JgT{B$?&,hiЈ4x=Wsj(`'Eb7&כt} ~IIT+$ָBVbKws19 k! B6vc!Q y6%zYkbi,[áS)\>!ŒK;ɓv2{ArbT]?QtmRto( 8ؙbD=5Q*X=CjFm2bԖbłQsR͙_ۏVImdɢ<=!e!'*v_ry}xh\D1]yu4MgZQ6)K磰$qOȌŪqGD/re&93Ljf3'4"UN#ADGC7RM!n3u$L&yy,dK6QN@))[4FG,0 ĖY0u|i`Rr di# a74񇾱*LRwɄ[#כ)[X}Z紓`j lCZ L +F`)άZ})R%OwUV m0],mʯӫ:[C mM/8<>*4qFRqX`Ww\}'Ws)`[ޛ}"F_W@5Ly'R, ٻg;ɫUÈ[br|H8$Ur6zb^ [G[y>^Q s$Ҫ>$1UĦN1o@fY!ևNAMIоNc(mHoM3mic#Ѿ;]jP*H{Zqq^U*2`_Yo"mli.{*d\WiEb%lj?ƨD \p%+FTj;"޶dg0Y+&u4Di}y5Y{KA0f{yo}R P AEߚpc(vf.n"0t/Oעha&Bd%'kK\ ֺI,@?Ndh`p)?:RSV m : ;- YԙbVI7 ?뻞_za6 wգI}֏]x)Wh3طqmE3^;֪y?B#s~{Q)d&_}m@{ßH7ǼB~ a"H3#n! 4MBZ1ׁ@nrnP2$D͍Xsu1|=qhj}r%~A5kQQQޛzSz }֟sR8zE_D x~k,I,U12ޜںc?4P4I*k9g9^͕tjG{s+r{կ3#~7(cK_}Q'RΦVpЗ头Ȕ p&䖸2NTU 8*ď@<%4"PX=)HA4S_LзcOŵ+YV&rXCG}+!)#%)EF&#mp-I{ _BB$NP 6؍̺|Kðd?~Rދ.ӨS<&!6P't+Q/jQWF8j; [Pcl41}9 E7}v\\ߚM[7ՕPH PZcۗ*L--LQQ_n8*OB }b!'3b4dZn!do '/jշz 0Pq͔oj*UL̢C= QJ ia~0ȃ]  ܀vv2}\Jrw2}2S"rx_D^*$/oҮ5_ XK51cOg,OWvIO7-=Ud7@L$AF.m"c_QH(k,y ZWsXR[q%DZ.s78Y 62 7,&UcrQM(?/.]>EʌWSdU \o=`Î-@sH ' T&8x\%q3IuT_f2bJ3Ua&T iL|0)isA Q^Ci+9m3$l\A0GXfZ&9+چ(}GzFd[ Tl\[(sf]{@fL $9)L(sW&ѣA O* =jy_> X$]p'HAx6N/X%R3 zl#UA"YM:qGڎ=} eې*Q7wCfl:yo.cB#%Ho5OJho7+6l$60/zr]#>(Byheِl)@*N.Q(5U> ө8S~{Mk_Pcs1`UB= }.m̄DvhVx/ ׆ǏCJW4UTȄ:%ֳ<*;6kW&L8?K4!@5 thԀDT!12 S[k3]mtzFBJ_c_$'$57{Ded(1։6r԰WTP'F<ۆZi0O5 R E~bolH_fedЂPT-@vP͸9~4 cf3(rwQj 5TMK=mQX.*0Jo+! وvװ"G/0ذ.Z<Ǟ[B$ l!nxd+$'63 V (?hȊ(`;ê '7מNl;dM᫏唊 [m p; p3Ξ~ȧm Aӭzz q᭙đ4ieEUl ڀ<{kįȋwO,‚xWRf<ΐPD6cw X1:S8 zN&(o +CH'R8)ky~C}$dIqKΪ@asNq}"Ŭe/>ATBY:2. ڴ7zc _9"Mȶj)AjQvӵey:+El+<'?&MױjY5WqPΙ mRA5{f[Liѻ X%;CF}!//Ҝ{/jtIG*QP[<$J^j~{%A>&TG8#cBpg'XEw⢨j:Wr&v"SѦZ)(qf 9P7fw=S>Bz^ABt>nw{1Gm2:T PeVBy0'.켬*,[<z+V<1>3W zͯ4Cp XQmp;' L7xüjMxJ~C?-RqHBgdR=@x?DXms%6jNpdIIAGI =7jży 5/eό [9fN t UВz&fL+? ǀ3쏞_zz4Z$0g?d @iS,:gS4{{sX ݧ)1i!dOJlf.-ȕ;4&I%Ii[paeLWV,A-t'%FDGDBWR Mi\Y`0d"줛>u2 Gy}Qs*b(2Qz3X%O(KۂR r#ފHoW;;TF?zxnR h*?$!.7<&=Jdwd2W8_C^qHY9Bm*|fTKL-s mюȁ4=* Uג$ y!0U!0;`ۑ``@iϴr +A˧\CY3<^-'NG"a!z L7U1n|ͷX=Z!W.29g'Vh`n0/֞Ә1e WXe/=A;Z:b*@kS#ço(9-Q}zW@`ɖP5hrU- (F'7Y(go}<oWv*tTG0{ =Xb`$fQY6%̺EQk3a^-gSKnlI-=Bc]a˴Eb.:_GƇ~&d=(!eӥPDϬ:O+\N8 iNMS9l@*߽װ)El+ QOR E: )bn.cTi.J"6;5-d(e`YKZuڒX&C-׌6_5 lQ)l!t6EDtlx@.C.70ŋ\wOU0͆]&K}ĸmL)]?g0yɑ!i6$'Xsڡ\NRg /$Y;0 ;9rLk 5q!abc 3wZ%s]q:C 99LR9F&D6َpJ ~J,$־l|0]?O@AC 5u_ZC\q pISНޑK@`l  v L4gGR&rvfiv23UP!C7g{09ϱb+wB4[`Պ~Tl$խIB$*>bh0O{犳n2WyS(/mVl#0ǐvkq:+ 2\J4=3KJP1fFOQ5* QEN~oP}3s}p@{YA{#˰K)zr朿 ZO~IթcZ'U`0f\giZrK>wQ@po,h/I"$m;y1Vr rdzX:Ԟg ';+ie8ZT{ϲchAxp# ['\?[0׶&&%#T 3E3(\'gPsmeC j 5{sx?*Q!)bYd-Kv ʡg"w"G{ nlpkc$:$4&u޹wadYxĵ&;jŹ9>RܽE.Ӯ0YlKmsv8Ckl7 6rOLYN3aR \cEqwaLh|%g ÅrU:8"²T8jBhY>[P[ bo4~gSA$<(TLjݩV6Wm'ێ*1b%L{EC#[ y5@aQr¹IByh)VMz/>W;R=؛4h(ϰxSwCB'm|Fqٿ#~RzM1LVՓGCȶ)pEp  ~G͎"UfTIG8[Yg*8k\  ƓఆnkZB ڒj}OLnDee")p6HGH5l8AJ>  m&pט`Ƀ,PuA`U(nf>%eP!̉S!Y|fٽ_0os&-W+r١D8HK3^ivBY3:5 2,ۏ'֖y],-.~ت?>0B6N! f}7txDW\"o91k64o?Z _J{b.h{ȝu{[њ*MyCDLud>ăRq*%n<.@RZ$rQJJY7|1i34 Vps`&9]!"+@kcbZ"|` N0#ք"(<ͫfy4ge Q{ \⩠szxp{L3?~@BI}W}iwU91Pͥ;QKY1Qi|tv5`̟"ɭJSɲM2{1 1Wh]4ۄsI^fIiEPGQj>ItUkg7YHA?ώj^:.sG}"y$y֩O1c.fcL{1W4bB兼vpݓϬ?8n8#zj%5%DyknjHUӰV؃L? D@1z@D ܔFn#IPNVgKqhWU"0;]+r:DlNvJ U0|Ks} }ƅz5mX8=y4t]̍ #K;s:t!)agwc Uy,Hd" ৫`KY4 9s^#~?oZR?LB[oi5'8P+T='5k+KmF|^7!j{ ߝ)B{;@\jc^{`[KߒcTaQG8ȥ8k WbVqD^GhJZQΐέJ4,\9 ȷ/8 #t5m݈^d?ye21?N!z fD9S}["ŎesKBlXP*޾_×bdȬPTQP1|Ξ65yS]v{@L;bt鳇ڕn0aax)bWZ u)*tsjGVɴ #32bwyh/Á& gG p%HX}~ 2qT}=x !ev/Eaׂa4ĠQЗ>̄W0Wf {zuw"!k 3֝XPqy >|P p/6XO?,ҬZ7k<7nQ;基C\K:q W1H7\(U bqsp˜q~!Hr$YKGJtR!߸h]kw;*ˀ<@, |Mvdt׻8A՟< [@.WrSk r}v].ix[[5uZ,=.N^aK1W@NJRZ<-BOPpmWl#$N ّ&Bq5?/ņr xlS-l}iҬ5Ci/nZi (d:]-Һ^Ux2p磾Hlڟ2F9f 8rb-*<:LP?rQ),YCi'ğsn󊁅eCDxB Jܛ|\XLD KL.a@tD7K+u1i%W{*$o%qNU7v$ (^3Ut:yb_u^wa(!5g|In’fTZf eXF; ruUſaRRM! !J~BPK9` AI7J<|&I R?x\p}Um- ?iy(Oݜz*Sr4{0P}SϣxߺhUN9s lu _jβW#&$N~s yJQ |$̠V6Їeh4%Nqh{Y#DGh;=#d.o/?C+m;hFWBmHru=_>(oJ D8v=Y.O݁XTJS' ;=KBpA{Ak1` R sۜO`fQeѿ 9ʳFH+ZuN"ŜH=NR㧞$[54[> zFi8[.ьy k"Z K/t?b᫼8sIh V/q9,cI>[O NQ\R@(1Y XCnؘ"aԌ113\`|"ڙ% 2 #tO d*0E!] ġ+-kz'g@VzÔX7*FpF $0(s X0\&H9[NԣXzent8@ lek@ MBĂ*i]5=r r%0}bMsnӗWV$]/uR[4XUTD(cϘ'UbìiB?)w~Mܦ3Z81P3:$ {]E;vG@a@^Wx*{}WX$R}7 @ ~ psm~%GnMrޜE\&^sD̵aAA+O7ZWx'P?ͨ" hB]!g҈aZP9/ZD>nw{'&:͓!_~{yUYb$ߠiX@>#4lLԵjhLp|-öWp뽝_EʼnwO1@ZŬVjWnS1=M~OukRӢ<~C$C-{KŊA|JQuB[]L0ԇH А|2FcNcރ8I.`>nKEݭ|\:9FW|煩0Sj,tPx F( :Oad(m>`A=?LNzVա|h?K͏enZ6Cީ9esJD1LN*Z.y}~QǠMq=up ; ad4Ы֪͛}bٜ:֠G۶/?`PaX̞"ȫ|9"cm%~m}-mZO"W9bAO1~V+e~ h5 8U{JA]@{sZePP23x3?x _HW%F?V&h1+DIKyf°j0vc O#/ћ>H QC>!?oZжBxIC6wG]xv* jgG֖.m ԥت?϶XtI[jl0":O^rtycgUKBai^%x'IL0Xѩ9m~/ McI-DHf)apvxS G'{T0O+Җj>;XP,OH/GC-uWcK?WVL\g ˶oT..V͇U79%a/P>v-M,+!CK0'XNa8/w% *Vn~i;:CM8 ѥ_5Ga*J,g#e}nƻ]8 ᭔l+".Ij)Vt2 A&'Z,mO 6a+=yD.;xFOۋdE871o.rҎv쌦jP 6aD; \'}ӗx$S.s]no56ֿ{B49cV J\+#gcJ*BRTU`ohyJռ@$$\`E}j(Q(#:Ǹs}NyLLf&/6xw"HPY a[K90v$`jJ$`G=djGwAZ4E_:d[g"(SO3*5?80mX} Pـx%N.=|˄q!F %[sl WUi.ށ) 5mz&~.m2q3N%NԙX@ TS e?\nfg1qx5i u9;.P3cZq05|EqڭhgFw?u+䗍(;UM⴦;i+ovwI% :;WwΈ[-m-4݋ѢÂvl\:wkV|jo.܊M#aq 4Nұ 4\I/iUjG2ށ\o8oi}Xa=jhuP-d6hNkÒ|={-YuXiUz`HKSg}зBZ>fb&Ӯ)zA?0Ba[WziWFZَ,*6YMdLZ#pV^5۷F^h0㜪n(gInۗw(Xy$dqE%>7o&-ݡdA. ?YD!D u`mκ\ (|ji`hiN# l*Q'wæRDiFDvjN IR 6Ǫ8߄$tC6ɦ\̸FLK=2<_AAxf)z:"na0"U^Mmn-늠t%fT~>wx[ v^%CjEo[w"D{];gՁܫփ#dfMۢ qf9`u3b0U3-5VP:λ)Jٖ͖ ȴ^_}O~E RcV'ݮ. ZFޜ y7IkRK$6k?h9g/voZ7P(4+{@嗼'Y5I.8MP1\Ăِ!I-GolY^NB@3Lʧ$? qORt9&8 PoWqOjL.7|{%l&$&>Өqdɶ2lu_m1)q(2'#` fS& "]GW;3fK >9͆SMP%uJ s~VGB$ 2@ <,q|?VQ`6\jتx% IERay(!aRؤ{ (|UYB^!`PϤV<Ł!v`z0]|$eجL wjSF:1'tF`L2X#n2kqFhV/B3 D2CMa*OvZx*L~)22Aʊ{y#=H1HiL?+*frL$nָj}Y$,vz6䥆78魘c `%އqLSF~V[a8ٲ@E*K u0]yQn.Ķ=Ê]y:Xpo{"I(Ch[mo$w0C䁈sT!QXod0}m0ΌG)@x4n>PSs7¼3a@G.xמN;x.9֐f:tB"PnwwYW:)N)<8sV4N39reBr!?7{P$2%n2U`gM[ILħ6bx# T ʾ`lTsM&{aYAe)ŎjiW}m7ǘ;BI[V=fF'=\SI0E <q%q{H(堻k&?̡b̘Hs7⤫SJ#q Klv I)_|l#8(Њ?Zs7kS@O4:rlދ +g9>p*rBXj$3ƬG?,6vMx18YOU?Cf*yГӼż g 6'aT#jNAa6C . tjք w4ρ&`2GĠLSиFPup(J|ڳ:dFhnݭ[W ϜTYH,?K DmPyh{U*r:Jj{PKJ?gϞ7 +VGD hH۶pT=ǽ)\:;$̱r[ C@M[܋nHz{6Nڳ9X|ڨ:3g5DwqkƀI;enwRf{Rm=PRѧ݈|tlD󦧾^?gFYazL eڅ9BW-cOgS+ ^ %Bz~ wb}ǒd$?A:e!`uKyt++b nxHar4 .tzoobzRu,!: n產-ÛO48Qkzz1!m6F6B8ie#I#8A<#+/񘡘(!JX}):WdMHs]e| V'4y[Oؚ#93c%d<=ٝA|%}ά|ʓEK 61|iЁ\/LbiN{wOh@$Z>MԚfa\%Ma 4.7I}ob<nyaA?M5\:^qՎaT!xǿ"5qlc@N>fhQV$2عlO^zrEpĿ[j r쥲?S wD+#v Al-s/7Ip='5 ٹTEu.wVp."UљuQ(֙@w슢2q!KbL8qΝ t3Rq<nvZ)`.Ǝ ~(edȏ򾦸% ('^Uo&=l3J]x0vئgX xRɂfɃUo0x ksVؑK-H@hm#x Oݳ/-POvH]EBUBeK<.D@\\ t!%H0lɪvE cU ?u1MThX@k,gJ9bBA&z8Qq 5i2*l)ޢCi;rf"-'2jTy9̇j_K!yFa ⤮wL{{,ӥ{X҃Ľeh $'G|{_gn[xz]I XȬG41Poȍ`lއ&eC}f\衇u?'GkiQb)U6i==¯&:L(LxX.%I_x/Ȟ.X@4n!a<pVL@27nBq2"e֓3̳ < Yp [ {{!yG/+J<5 e轹ؑNË qoo[SiqlpB{&v8+tVF/>1it7M p\ _Q 9;bp1\]۱<#vj׈UhAc;b|dҮ {ZW|&g?<xtwU>A"M$S]f_^8l"4&rO̢y=iQ(JWInRF*cr0~+-V۸@'АpYl0]ZoZdVڂg[YXfZ~#Lx^lc'0fsnX;8+rN)e 4gh 6-]1)N{`}\9%wZ# ЅG:OqDjDW ۉ9cpA$2yh_ś\< LۿAOy)ßPᒐCMQRr`1] J0}l zSE< ohB50:=v_=5A8Z|ne2v]. Т҆HJ-)rLP$( N"+ ohAvT\ZiO!n&2V,Kdv4gU\$sЩ՗&wn/_9Ҡ+èeb<_Ss̼> (РF]KӘVGj#N*֒Qk"b_䋦e%O?TrB9 v6i<{ U#d&Ldc!X}(A}+k挷=쏚!67=dޜ>(HI [Ai;#(*6Ƣ!,@wznTxt.iTTpdgw^'y-omDF~BӗHOC]߸JZ*X͑XnY*~JFZt;uY{ #Q}cq,c¦5q/¼1"4;PI5&68Ev7nb.Wΰ8̇NHvM7VekiB/ߔI\8VF{J-+Rg)-s;܄*P꧟8\KxFޤ{<.H4mY q9X*yHu4_Տ'[DruwT'5pF `b+*#AK..ˍbz0p #By eh_T*i<hQR. O`I8k::ʶRBS$&|85e6u!_&bH@k7\2ITu| 20+E]Fq8`y1Ŀn8/q^!lp~M\4,֫tB7F  9" m*Lu.t4dͼJrɉ6M1>lMFTPrY6a)>o3KP_5мmI¿\de@|93-; /X@ mNOe5Pd^X{o|IIK!f65ȏ1 ,3Uͥ]K!8`LOC5$~ H\a(sors-lZwE+-(Q# AE~QW kj1?~w"?EC -?)ٴ4դҶ-)ίPO3i|0:]^mn^u=:P+WMԥܿG1mH;N.К}-r5]DGQ[Dg_gp> @!~~yAZ%*kr2cӷKRljU$Da' F^j:j/!BtOzE K0[X rBilnpv/kpGJ$ c0UDA1 " } :`UǴp,L9I= e)#HzFw&R` "zX"̰?20TH\'8jۣSac!A/]^@ՅsGB)Z.V:"CS9F؉Rglquadax.Y /{ƀO鸾y uO$On ^.9+qn2DV3ӎNoU5Y~.-q*MnVOf/@K-^t$JXڐcE"=AܣӜes_ ICf N,d,} +`|}D*etŪX7LA>Ü ė_͗,C*;ghH 3 vϒM,FAZ;]\x^%)w%^ Cj?"~~]oLG#D⡴8{|7ͅ#>>s:(?%·˺|aKgV54Ol;@WV4YI˳#ȽzϮ^5֓AsPv-:#4G7 3mM2~phmp9Ig6 E/-@RِR3E5` ylp;w2NRSBʡMz: բgD[Mf6 jw;R0L$ QqGj GOޅ ug Eܞt^L6K=gtmFP<4V03g,Nbp*4{Ƥ4{eĥi-9!A|eV%e׎bUUnAx)nENJsTcTZ$w!]śI6'?H}'* k&uǕ_aj Bv˞9 uj_6Fxu[jޟ|LFvRZ2v@[Bu%0RqQiQ9Yg[ v1T5 Do Xvp!CSI eXro&qUe:9H]fIeQ l8GRO[+Q ȩ2X[7CgA~$`:(`IW%xPO򿃩JE;45Y(PC79vHpΓ7FqxS_4%K݀o{ !8҂0p^mFůA5~Gumm zU58ܺ”-`1>#C%9Qs,S8Fٝ!,#Wf*a/hUPCTپf$ qf$Pk NgS*. i 8aDk O45ӱcNDM ##" ,pDP~x5&[FXЏXWY S=@ȂdNČXD1Ebo%/4Z 9^ĺ|~; QUZf4c>pP>\{|g Q )/jY;ܮNW@Z(pGKQ=SRNw k\b"I B.ufg S5ew=O0-o.ج.=1Ηײ@ kߚk!Po0yXTr''JAvwKZ,xKR}(޶) rCTh$ljUIEEu7`#'6'(K~:i$Gz y3P']H^%_Nᥢ'r'2&`M *t(6`Sf5b@3h&sIORWaf`HسH i<[@Uα_tɖ0H"B2&/GRRp+^HɱzIr豨fVJʌxE ÚcAˆP'#t%-dME".A)ճyȅ-%b(upKW ؇ʽ\Zx=Ӭt0G )bCB6 r QbTtemAVf+['h]2Yu3>Aa^~ gET eۉD|+o1cVwxo<]i%wNZ-`Aߐۣdm l km=|Q"dBQ] ~Au.POi"*;MH~Rn:3!s묱qø떼?2|Y!SN`+L߹FPy?)VS xc -5=7\Ԯ@At%ʴ^;w7ɝoaBHR55UL9KLוՕ]W#Ik7i lU0a:_ux_r0͊&'%aJ`E1 Ab[mή Dj7^\pB Ypu FY@jvG` t`K4 4lIq-RT@AQ`k(/d￷g _l<B9RH=A"~`as"Ajpigꕠvf[Z{;SHt#18L"?Ρ%f>_̷ANШ ;`XܹA9پ>doteO"W>QsߖG[`jĈ4\;1VF b\PW u>\N[N[$]A`Oy3:0ĩ_>Z *$M_}BF-.9ك҉͹ߋݶ\Gg@rTòݣ!v7_{ oEC8unP/(`!D?x)tbf}Ƿ^ t?s|8|?m8vT.=dWi.I֧ÉBFcq>>dtXa2r)+zvE!g$&Zo"!µ &ZmDoIpo:%8?ONdmٖ]^E@L%ct_іEd|D}V:q# ާ74=z$VzB\7ZY}O&JR5;7ņM1^G2s[zWw)bX>&ҵfoS$D-ђ1s fs{^Ȧ@?wDpޙo!W[yxlLe5h<Z' Ky9 kfJQiX[OX] K]Wfڒ#x@X*,f/ޓlXa~a Qۼ+gTQP.)W7N9cOuL5J9eRYW)s6ٴK%͊,jd({b̆Qpa44rʖnn05ZNq: Q<KY-!~AtXVnUxDm{~,G5MxGlYgB,*BlkGd)6/wrbk\,jk'^9B@0Dħl䑎ڎ+`s=zM8bW7$$!49sis[ o>1vչA=H=*VPHehVVTGa઻;\g\L !! -LLʋd;ϡpʓ!<8ǝ́ۈ?)D)EQ{g~Vġ4tGJ$\%6.c%6΂mKlp]H8^'gڭ*g^^BHIgEb)wX^٤^Y:jqbw:`6LF_ V$l+^FXĴF. 6ꇚ[M UvY2[4})HJ?4顛*qJ<Xg@lvz]pp+5#6*e2$D(OZ3gP(} `ZQZ,PP|O͕ӛ"T.'o]},Jj #gK](z&-zʯzWqCc%,􆞀(i*kyh8QI"sj3PʈAy[8lc#sIMT'[}Y._u%{M$T^@Ƌ(kr{rch5!N)%DR (/{q܇u6⋋ܛһ{#:-U$n ]]CJUӮ;^LrhN뙃C7xyw:UC3UoBskDkKIXG4*X5tVHK+,)?#!rcGvA+$|G7n[vY dX~\SJw5[DI%a >T[z?P%Ig8<4=4!ޓ4xė÷1j.a**:&v$%ߋQލ($k:W ^’³|8.{@')\E5-IaybU!:C ˀaN#< !s-T®DP 2uxO8A `;bhv>7s &߫#ŁߙJ.6J>#`ɏ z l\4?@Fcu`sWP-.:SÀ<3בm -ZKt(&%:Ղa4oi:q=m1H$:ŷL6g_IOv!2Zmt=SȔߎ&ɡr5Ei7R(DڂSCZvf.1W'_5l~@/s4g!/oN{Jdv:(MƲ$pVUHTܑvjZ&ȴh =8i"šҤ5X؊`Br9BvMo'ϱ5hL߬(S?}a7Fؚ(pM+ih^,qԁlVce_]Z3ĸ޶j=7-:?O\ia)IqkR{㐶fiz[Hl:=@^G:(efN]v(^Ί%)}Hᚰ daB\e0=E g@fm!֜.IUVE~ATmTdRZ)=/FO7莉CxK2PQJd3fI2昚1?[YTK.!P*=!\HvVS i$=ZȑV )}i:;,!V0)Esلpyǘj/%(*ǟxH֛VJj=Q^0`@46ʓlxn Uב*l Mwf%G)W?chSkGh15R%4Qf꫷~PO,\9xYg%5D Z3{; *{NІVj^ʈFʼn; J̋[VRPΛJrF6R% rw'Ѓ{K"IB9r=DŽoc%B'RuPk ) 0XktVG`٭>:B~8Տ%qǐx]!Zò컘]qw6R}%N e**khkCj&nl,X FAk#jsQ|+I=B rNP 9FiV%%׌ l?d6)@5Gh 3i/hgFk}q0"޳y˃3~߭-ܭfy#ٗuW+6DDyi!B#vCucZ~EHt`,EdvjY_EMʭxcD'kU/!>bd2Q&B1Щ̤ʤQa<$" F`rk&@UXRd\m4 GqMh$s+(1#|?nӜ@>u"6*j(?5{a E[_A:v9@Q :I&ޭF@H50ѺCA' \CЛ & +jJHZ– \8t-JIیc!8}Ȝj][{~$kCʷaR["Q PlQ3 nd̄iX`[4Z&nXU J_9V@{dLmS ׌\kIFR>Ό|Dl~N>-;iٹ`m!ȅz̝ܼ"ޙG\NrB \pvbby{>O:Rn [R҆@  䣉eǬr"7 J|sR.Cb)|y\ $Nۊgi OˠjT׻YPWV[O\mSۂ䪿)Boux;̧.KHY4\pIщ⊟:Pn?)Y|}fj:8s\i\|uRws1'% y;.l"2$aiӜD<ƙ 4& lʯׅId`NUzT/K6Ž X>o01kF&%J "+8ܿgAEY'>&! ,@tORtz'jö%;0뇝 LMCP /w81/jQʮYJ%Nk#@kmW%}r@8{qa.Nl\L(M9kz+I"Fv&%Q[b֏`4chz*$t/,A̾)d&:Z$=PN.G|`y@Ϣ?[).%/$!B WՌ0p @\7<͓ n$d/y|Stg|G 6HF(8fF hrުۍIhIzCF~RӉ4ML?i @ ƳHxlqiHpſ\4c5}.u{M$'ųyUV^# ڲIgx~U*qhbz aapW w io3!tg$Ku Hy@+Rbϱ7:ˍ1S9ߋw>TL M劤BDŽQPbAs|sA21ѴF[<ɟAYY0&aQ6kYJ^GVTƌY[@8Nzÿ@e-.h3t+0Y8]p|jLW"P˜dlrBxmF\1\%>8X|k3ۑ*KzWXu-quNkk76wH25\^YQ@gd0^*'[9"=Tw+$dKAETZsb*~`MC-=)@|3`˳q-qK # !]L ߯=F:Csu6j7֤!p,d)6R eyg&K%UBs)O؇4>W:;44/,OjYްc(Rղ&ݛ8B'Q# 9mk*ɛڛ%-R-')G:Q`Kcnh3Ңk͹X@Av] Ĝͩ)8VMխA+A~j˻sfǂ#b^)ͼQ1}x2WX2`ΧkV %A$撒Gq)'KuOǸq(c)UQA.dblm'.84183EHHQz1&lGu#HoY\D7n]TO!@^BFn'm:cNД/2{x,BY8;ܴ1)fxS9l` RhYZ٩k;FK@_<`df.>uv6Ẇ 8 yAc eՠ[mp(7X"/u#-=wAzǙ4 ϧDmyXB*4v ˱a! T < „x wgUVh^*[`+s9SQbfCwC:>xG!$6V%q(a24r,iE&*΄9/E5Ui93QbxwZR2/8 7?`bٕG/"nMnN.)bxUֈKGg`ďW .ԗ7@j5 | M@ؤO1 ȲTj-QKKoOSCJq cZ-g|BwF`c39Xѹ0*%+(5+s #H5#$@-h3e;lfC+)kٳJ&^}wʢ2n$ }LUw5\1๥? ,#.oB+@3*۔;2C]z巷!@Ӷ%XjE$ ) d9̦B#sߦK\V=OLcV4j`$Y@I P^ێQ ɔ.DzYZ pMs$+Z97JtvQzX'|oYsw(;1x}\ T5Xvf^qp+ 4i#G*F< te=DtQY ;0Au؍/\Xv$ˌ$X 3i # o3ftr 9|<]FB8yMHG~"Ջ:op.c^Y*0Sf!;D7S "_lu2Q+H LpO !ӿA- H`s"afde(-C5;V/e>?IZ  ]Ej<;-OA#+k\,o SbC#.=؊XG T |XXf8]W#qDU*.6=]v$~ KN.ZdZA_" ;p&8E 3'ÄƤ`햟#"yY5fIW`I412%ּFhb&UP@ݷk;rHK&׷+Nl1m f $vg=TQ2>5Dk*z+t褹 Hw{`!|M,q1=t?U `;W9ceTjتQm!1xŒEQO[4 ;We8@prjoQV[;`Տp琣v12"< Gq@PA3jE&W\gL "Z,y쩭=pFEJ,SZ85i [h?Ŕ4%6kE?Yn䥷E3bdfkq-3bJN<[1JfADHҵA&Ca\ *D 73hOB20_*|YǾ!K^#/@0˱!|ˠ3,z x'G%>b2g>.8{PΐwUŒ1h*'k[!;ҳ s c<~j};KpLߺ[ 9g3֜i *I6ՠ'I yChzɑUBl^G1vJ,Ʒ}J / WpRYe"d."G+-/;*}'(WxC!KC@[o͞J:7'X0F4W{YNY؄ᔦ N .A#NEvb]6pxY&΀.p͚TQAm*+Jz+E/FSWh|-i$lWI 1_$~a_85t컛"[[U71Q>{ Z,K̜QGz +̨? m~8zڹ(=kn5Ja&f`.sT)i!TGafbG*90]ހiC  .S4 ʼJ F}Denj2dhJ qwj.| E?E KB K;F:|S)8=`;9=~F%tc ϐ\)VWI95%pK)Hba kHY!UiڅqZwtQb73UUwDZL@4w$6#eQPG,n:|:} 'HDYq v eNte8H ;(*#X"4o1oDLo'{[q ^WZGTM=5z9˜5"(|"ȳ=v5Aj &#uYA?UkGS=oR) j2 /9*aY* x  NF*gr*'EN@;Qw|0*e\2 #"!oڝy.S| A&Jey1I@v Ǚ&KuSd(/]5:![4ﺏe]LjYH0~R$߆NkLuG%0Yx<tbm?O MΎAocMbxu-')=ʎ ЂB]":ڸdͬ51b$gA/` sDaYD*Vl܂m{EK_92U9$ɇQd@pVkp=AiyRZwkB)84]T}X2w>ҹ2e&)ie5EOeOg[y/ ډVVHQ<ʚI?ɿ'(l](E +{ 872,Q(6IJX8[j7LMk(cG <qzUUwm&15AEHdu=&t͕N" lJN o}x ^Wlmи8%)^w ,Pˬozm㗁_zZe?|`^URM>־K~I5 5Kӌ._I"N aHlW6 c"X!ZϺZ7gk p( tl%KȁJ]X;O /N<X.oq_0q`ed9^uO^JB#i7N;@8Ԥo,pFxT NLzK!xQ@+sBQ< u Cou\K~jӒ}ţU%FNݩA Ü3U@& }i% 7v|=D<˰_Z|ۙx t69(3 :T~&OQ9;gzlFeͨ>~n} 1=e T\Nmx-)#h^w2dEKW1rV죵Z4lH ͢x~Hٯm Fob!36h&79zE5rkL2&j>ycQ?9Ceڠ!|upKy^]gĉo(^'+G7[֯X3sY}#<ѩ,fOP U +V2dz+:}E"h]5hM?ό(.mltz !G7g=q0}b( n<0_P",o&Ix.JqCߔAp}L'HĝzEǴhb{ rB Xw!h q`%#$W>GEu"6!vP:7Sv KpfTaAGMN# ti~5#?oy"!֊$C8YR۶(pŷəрn3FaT{?ܨGaE*&Izmn0{+sC+ S5ssjf̰HdP.j>r% &@lހĺ0{|)[|Uu Ɖ`Uڭ|H^3~`-`x)Ѽ>Aʼn!7#MXQ%ix,|ws+ j{f|f1Nmo_HuD2 RVK`e}tgIѨr!oై>XoQDz5?^c#l9mښiĜr]f\Fn9@JK۱S4ϱ5k7tn' <8v+3U;!{i7&`O' %H~a!H cZ>6p ٪Bأ]sftúz!oas) aF@7&%X%6qj{jmTBx `9¶m `-Z9Jr{xdu Ϙ)˵{jɹ(2֒8"|y|5H92J!m\JokuE#]M09Sc'y6)`NocE.Ds֡73T{BVN&͠'7V"fw!OB,O 4'vI)Fo6e,%LFVIڟEڋ"A"H+(*D)埁ahq1TrJT#5TeS{"1K`JLg{Lگ2;V/10C.%ΕIh($x;L-!oF|lAI*) <:i$ݻ(ihEPnZb\mXPHeh dF[Z4giw\0Hu'0!6DD_)T D h`qWBRۉL>HpKAϫ60]V B juT6/ggX lp^[(-} + +Kĥؘ'K0}Co\CR𐶥6Jyr;]ΐ'W\i#L`-'a@cdT>\1O=xvȣtd-,wO(UGUV1|sitk<%T %0mQ L_؃tmG( _}y@/BWwLJD h3v3C(q8f2rߙ7?w-;>< g]J,:0* (u77e~)>S§hi9gg0~:CU+vEvEĈȒ6S eW3zv+qf9 j:̧s;Ųm-4{S!EQexJD?)m)Zu,☦yh &\BMxm/3OgQyBі-@1t ; 8=aۧɤLf~(V(g#^dD' G~w1TϮA|7m `z2sƞpv Q&_YdD((CE-AlU &UWܛC9t 3Ra'ta1+)S-Pս xw,O+;/IO FX#br ]6*a?TzLH?scH<;E:zIMI5| ͷIH"-@|7Kq"$$}_>:\/A XOq<{z6kO;b%$bXT A"p\]Ǝͫ{#nE5Y:`)ϴv7w7l{1``ccIF05'l-oܶ@)UռamEcts#8<*|-YbwltR'9՞)9 6pTlNkGؔNlЂQOp4zsr'x8/v7w[:sgZw«%9YIa @ .SL嚢_k(e@{W$3̎Bz'2BqPXym54/SB봮fh/eĞcQe۽T |3M]<2DMD&oș QCY`vݵ՞nr'1סg)ч옞G٩rPsq"iRd&TO0^nrmG&|HIb(iR k.J0L#hsMl6&B|ѳEU[xo&~/PD:᷒JeE_*$LHl M,]$)Dhpw6*Ԯp1mi+{ Xʺ)ݴޔPk5Ѽ;:,ly>/nb)TI372'RȲ*_ڣc`c;~謋qQd[h>c`sߔaX8xĆ#Q1Avkpկ*g˼3򳬊Hbf L,2Jѣ+{ճ)m)GA?\>< N׋Di, n:Fw{n.}l['l-Kvqmꩋ1p舅Zt֓tasᡄg;D^}|O~CmLa"k1^D& NW Hv 9\bjpmhǜ?HLHFh ;IkE6M|z[k-띭g4}LhJ)夡xc9QJ\\hJeDPoQ{KQM`Lesiz>aܟ%nl:5) Ihn$-toWzm P,WK"[m[%D9A+2Ŗdtb!myʊUQTASSi l5nayNiA{aɩɱI(^HiNXU@ cZYȧ!hlhd[TLRr+s x wkUIϊ)Z(vC~grH\ғa%JR` ^L#' x1DOC -X6ņ 5^A|/DrG@'z#^PESzpXW4"u .V6Lՙ<;=눎ԍpGj%]CbNSoH,MJKBeN[#bZGd@8S'_K_ՀXXi!$D֚72DDK sBrbt+ڸPu!?^ѡ'd8 ۔\ a:@98\L؉*w^⤷G_x{7+=PBn}^D>Aq2&V%DW;HgCEjSf2vSRFKS؛_n˜@riczvLmJ$"vYi ^d ZbE/fJUR}.8ԎgF`9>(1\,(Z\޳ЇȸÝIKδ Е Ht7pC5TCd|! IxưmH'ih^_kB?Q[ܯVռdq%Ls|g^u,}-$搜 ;Yg$,K"0vM4LuXJ= M|R_p-PqPR065Su1Pǐ8Wi$fiզ5g r./F[jޓ]meCajM Zȝٺq <tK8alj^}#l08% )ڸ%&./kOdPDd߳`G1Xa#84E B Vq ,܆LH||60ěG͈gxب)R0=.R,r"(6VY@iNUfbl/XxU9JԬ裐ޗ!q"l ,wne⁠ɢbix)N a;T@ m'5?w8|4@*mb腜O=aE+̓0a %uDE4zgt@]s;k‚Ga>+^H QQ_ ;=bE%ުDmhW'g6Y]J=׊z%B|v>him u̔N:L9gaI6>{zJ J+ (aY3igW㑢 %Q=:rx"VQaZm!?Z8LcVWr iA䫃  1\J`'$B']h,O( ī*SYCc CfȞ1 ,D8, hRx^$'ya͉;pWv$dpoB kvPݨyx3!67w -p|VIRDZN!ť4z݀~c:L4cA!(`ͰZ2 "Q]VQKS|uv)C=rp m uS`\ SⷣL<>[r:ŝwKwT %[5#zE)O&2\qh]@Ydc0!MjїMJ`21)E_RfnQ LC f.޷ 25 ` ?2u.5wG h!hQʑf7 y$hTЃꅓ <1rSMAG#FØ/]P#]0tY pG1JқNIjM\.5"= v{UY i%*H Pʇ!L29"u543TG|*Dn>f01cG=fM;_1/QActC\H魆 0fvr5|' @| ic@OrdH7aI=ygE$3s{xv=NC!Y_!C55:c( `yNEw<`./4eb*fk,$L|2Ɠ@3m0^q7R4X-#K \KR("RU? !&)cOmx']9ςâĐVOr ?П_8vq>  (8F|3Ͱ0`=or|'2-ugUE+AD;}6&NՓ$`βY8O" 5阺FKٹ؅nl/&E ܜu]yhp c^Q͋ =h]Yh_K | |=ρ2K~ =Jϭ]%idYE)䇜)_PJ4C v[8ɔ~="W#oTPǚH(zrVd,CQcϲQw{Yӿ)e@MyL 87/}ʕ@"AH9n8OiXbXZ"`*ؙ Gp9/M*|T31@ m8dcEH5]>u#Y9&B&;2DX׹U&mٰH3l.B`xeCh  {r'2]C}4LgBjC'<m8LD'4wt5 4 s!\4~$zde#R{v\)( ncnl+)VЧYږA "ՉUFV,i~ZOu ^0~˔ȶ:skyAfSf.0Uqy&'i_}[GEW7V[+J7Ldm jg%@neu _0롧g>UcFbCc/ ̞dpS6:8yT$:36 xSM3z[8I{ ~5 ~%fv_SW,~P| I5~R]d6A:~y!qH.ՎsR5AbL%L XŪgwՄ?@Rg,gT ʛ@B1EF 9@>%~/ Qi& ) <ݖmSŲfk~qm*@ߧQmJaI5eFbF5^P[&F(epl E~X ;tj̰yޑ _?.[J^釴o /SWbE3`_ff.Gjnf!1c+qBPk"/H|>o:[':O>X]'OSkkFSBDӨ@WϨE)((]+B@)#ȧU-n^.Ajͱ "uIRp&@:47kVB!Jg( {6 3#WlX`N#EзgElhupnۆp_w&}RSIަhT}&ޤ ҇<"zC,뿋(Ƣer+$uBdvIOcZ@Eپm` PV IH3:B~ᖞ KM{{ҭ/Ujy0(vm)G| t`@F"1!*kZh !y?Wݍ3LhTz@Տv{gʜjOLHjA Y9p;,_%n KSѽ'rJv do;w^s&* I HH$u2@X /A"am^x\+VU- [єtp F F`LW{umk+P*a@75vX1u㗖ӶuPP}M_FMWHX[LA˴Zz҄Qg%lL~ `2gcO-_ML[Jnc- o2M웨2(t|ؕ9`h8g/&Y{]Z9uSL1$G6Џ!f@]M{򁧛\UiQdn~ G~ &rߺ\8yf֑3>4ʶG.I3%ȍ]3,xlo[ՒI ~<:6χ r" B+X0Nc|idMZapm/2{ ˵h^$vtOBtu<yt5.Tv_&7H7AS&p\WkJo"((W9V#0e0aSP ; -7#: u3yh?S[PȐ[mVpw5 GoQMMI[[)O )ieb}pHWSi]ksU[@(}'AuB )$4B7 Z#i~ 4RחA`0 &r>=Q{9 z̧drN.=e6P៴DRO*_Y= ^zʟ^xE^.5?<ڭ6;ݢbM(M1%/fINĩЈ۲nt`g&%ѤSphisUs?/*\hq q+IɐŸqzU=^Xv 22 [kficm=pԄ Vcp<œ|➃8_ :J>۶b5CC ?%xe|+$5D-h^^B5`"q9gt^uD -"42HRLl$9 2Dg"(ݠA쯂O3ha$J T"3爹x wQQ̗G9Oj%c2`t]lZ.QIT'i PAƎ -@ǫG`@l5.G½$ 7VS=t([Tnb8"(@JS͕`@ՔKmHi$P@wZ%^3{2b63ksq‚Ad/k;7|{+#E>ekF[ JlRStTƾ4y 7]h] [H6=5@Iaw7U(ܓzqsֿz2N`A:)ͦ5̂F&`@72My ePu*'y0q }&MSc/E`$_WʪIr1=t%6@NB$GLg>!-g߉@] fyP̌Оy _Нn:HL$=H#y^?_x *z6?ժS@Nic_q"_ݢnM.V4| :aޞ'}FdLaO5tǐX#@LّWM%K^华P],΋]GU谠믛Ez=Uhd4v&DX i ^ٿ_&4HМxte2Ko JD]H ,FONLyNQDLRȸ[!숃0](Ws `*rB7:S= T0o0rLQi$//s ")i(mL4JvN?Y'4pM'&.dxotqXי˱<=){C%WrAMTN:!A?-__cH5vW7b _l;Mӻw2%M:t~Tbڥ9#P?/2,#d88FMVac@%貚JPQڇߟsyήǘ\;}+ޡ;9TF{rQzxp 9&j-\>q7bCN`|f/+9zΨ|@U,E]ƶ[ƻ#i+tWi)IǬunbM O^NYqv(; Vel$kE6<+nx~L^:Ljzȳ#!ZaƼJ~ gMb沱Y$P4] bk?0bo\%ИbL*-lw 4|->D6h^xmR#cQL[D&N sp8},#~AS^c{NQ R7gAn2U. %j*w%sA"ʊ 0vx}2#kRWh7B@,Bv Ͻ"#fxgI\Hҧ<̅}h1`$x CВ=qhppПFtLL!oTFK5r⢤BSP[a=>s~ܝef7d :*JVm0S\վz~Kg˺ Ε=)^UdE uM]0%Nq!{/sγa}"k_D\>}?Rva~ɴ]0ut':ͦ|cCy>fGOu+P B*u['c^G\x>|h_cd?vj󁌥"lGdSjg"| ./[{Rֶ`"&!|Zjxj4I#-.*qy) 0c+Kd}±+7TAs Ka8U1 $U7* 9U+_vZ:Z%P-azi#_ex.wL| T>;X&uT7Q-`7<$Ҩ~{|FX_Oڊecz(*]23VyR_~?*$`%+ҙIXѡz {U.G 7PCstFR,X7KVVI>n7PLC3<^X߸Ѐ\aM%p;{HD I]cx$=F~[D!{?3>K;Ri.^L54biXܸH%=_AV)l ΰ"!l{1S"˗ۿoB_5๵sqaB Bf+/SVt. }R(ԆE<^r,)J nj4{~B|4j`H'JdQ Of Eet22ʆ/GX2T/!mt>,t9.FsQ&X WTuʿ ^``APQy?&[SV袆@> Ҧ)W+7kd?~] k#N\9nN)b~'j0E7Sm@Kb+ar#WRx />!Ԭ| $"#O'%at2-O3>Ye~D,H^j F 5|o b6ZUUH_11_ao sf cQnWZ.rY& J9YB}ͪk!ɼMm؄W&.1羺+ajK12 ?Pt0r'ZHX};WmVh RP7M\;iTaQ?QN@xTsVjO|c]`LƈTo ֫y{ VgɎ}H;8x?)xqvlDk}RRc,B {"~olepWrE$18ލ )^s6Cr&^LX*.3b.JM=zΡh,,s%4H}E ̍8lkɠ.#AFq<0qC@HJ*hќ`[Bz}Lk0eoBWZĒ]:~nדKƱX_9XHָ[N=hCj{^N5GqE64&#^UVWq6v F >+zF(#޵n|}(pW;`.Y7347܁&..2& \hL0vF7v0X+"\ZG$C> .=;΅[H+GEˁ~'Z>NHI'$>J-Ȏ‰1_e<\Pnmf0$:FQ{tnA-VfS8Gi{=ڒ[<:3Mp>_VY%ҩ!KgVAq@%K{idVgGfDAo틭ay zxpq5qmDَYˠ".}2>jE\(H>+pϾKZ|+ rec!pe 'i\3Qui(˖g _{[}akBֱL'n}%š :uY{{Ff4  0%PY5-O4Mt!g 7bkaɥ1we0?9YNe)-PNTc#T|Y|cX5ڢmU0]͋ I[ }qz=Ǒ+\FKq_f%wSd8@Ed|f'>LՉԸ! PB'W*װ\$ աl|* b^x=)1bZ8AxY)Rh~3U 6}r<ҟ2D :oYz~ǀXvR>@wg~NZߦM=lʗ8yDW2m8Zr *4I1 c/$nB%XrP)U.L1`3st2:$4F3gױU^(0۫kQ[4IR~\{>^0JH_>fĈMrG ;UPpo,0рIԿtS4[v8ꧢx,ZB0NfL5)cFfOF>aiBP M[u vGpXa\j9 UU%{ݹ_y;*53۶uFJ1M 0ֲqW'fWZ-+k^.>?D#I!QيPtvާI(1T c/ӏ곽.CƂɥjKYn>P~50-Tf<#563Rؒ#4.Ǐ$9"y&9j_p[}>e ESۯ[D_5%Et{'edl*oAhEA.# r ¨s 8㖩fGY_WgGu;Qu 5Y[ܔtXb!qD}=BƜKJP|JI ~ A Q.ɳ6 NQEIaKl6 +\h0C<;/;N%@,@-U='6_w56~Jm\/_[Y(8JGqjDjx` Ĕ)Ϗn|5$Ng]R(vvm?_&, 2͉5>S P<`=SpYw|_fU2]9mw7U@rX|A!hAꦵcV'R?W"gRr5T%q!A(ө,tWPUfQ0Z兞Tp硌l#=BFas;M#;\xmdGFfsIl@nJD8~JR/{ _m}(Ny$'\zs _X K\m5EG*`f G[𾪀 5uLCEF\Bfvf28p:>vI@OcC%ST'NPZخO<e7KBj_4%P']1q 8)FQl`MYE):o l_8hi0"!?tM z,۞%Dh8o}bdPu=vޠ$_F, /_* CEy[_ },  묟w4ZoLOЄѥtAѹ<UƓQg΢Q@ľN\֓+}vyGB4~'{[aOR5$Ipw~#s18懲h"< vJl0OR5WЇDB.;/h{im9j鼄^]Գn )a{nXԄ8Ek0|K:o}[Y0P,Y*"xzh?3Zr7*bk"ta>A#=sU Z тy|y --<6ڸ ku+J_NAnXø MCldX 礬!'6 B*ԯ<M3N-A~spx=6<` ^i`g^#iUAI،&M VX@]=q1z_a\-!~CFiiMdVqa.HF腝5r:;cLX?*zɁ2ߛa [*vzn>L߱[!Z&89vx90W>(dFʪƘµ 6d쭉*\h8LE M@/#ZĺzFBtB:-RQ݄Dd3Dis .6<5nk`Y]1w.AmmSRM  ٦_$ie;(S `-p^~s"~)te[NgBLjQypR Vjde: >f\"^!flB,Z- BM"}T"j'a. ’x`Z"@d-Gh˄<*9\jSj) N& fa?2X8ǷbQ/|5>Zh 鏐rņ W{U#ġaD i1Ww-̡A*nStB&.R"%i/o`ZJ8(rk$sRP#ef+ԙӎ\&a].ާI=~1;VYlK0ris+:Wf.87Γp__myDsy SEeه~=E3dz1|^&}:39sM9VޛA9)ZY0e_ @XFYz_Vo+eCq2/dIoCPT p~ʙt顓>o9$x9hWV~5OALUWykoja*wq:_7yZjWup E(|gvU+.fyO_f7CxVտ8woh;b$ИMK*pA'(-xر1ݛVk_.-&Q; }qeed!Kj:,7M ' UG}fyr) ISPYzqW=_'reJހ_0NKH,Nr» t?4j.r1\ H՜ zI֚03__'9\&C,W5y;uDRAfjQ Q`+ѽXqf$~lM@rMՑl%nNcc`f&WxiY_ -H Ss }ho!2kT4y\a-6apCLhvĒY/fddI ;UIx51x)0pJ?r@n/k4¼B(OP!PM=V pnzMvqw[Z9<p)@9l.r R⾁E>Z9F xWgt%3v| ~ yMOTp.#?6,iAxр3rڶ؅ wԈHTފ,)7h+V3C6ʏJ0D-A^T\S:E~`n ]5AZf[=sSރh)Ҿ_H\ȝ!^njbfA;'w\tN JY,1g~VhkcHVՕLveL _Q Lڸ3^IH㌳h5$'<+g(lI!t<AX]z$ a23*DQZr NqP_8f{iW *vUpl ո_˄+C>~?C\oVT[ԁG{WBiŞѬY)D|H .hä.Xpbjm~Gg]K C D$+ߨB1)CϯgyL.hoI9mrДhݰ5cdv :y(&ɁDU`o/ORu37>  _:In04\ La \ؓdx Bt^@8HZOgIt:yyBuH;JxX{ޒ A9An:Q \mT'N,P n?S Tǯ܉2yC L< ^;}~VxJYܙxs 3gºl|Ru@'͌Wω*0iɛB<_→HYͰ1t {Yaxy$ VT!bom.a@xx aBYqp-z/sB(wuCP 'SN$gXF LbAG4ϝç:BQ|'E-LS2RG& RRE,q6oeKG78 v\|2"r{LQxaC^03|kAf.1q1no ʽE[q&:X"pIUfXAuͳU=iW#%zҥX+h^z Xq2ݻDQ0LjuFKz{(#B M/Mjsv)v~a+<* KEi,9ILZ` ܵ#ksKV lX:<+3@ڳ>[}mk|^$RSI44^p<$k)7s5;~3Llqی 4GmA̔D U nr-[hF̈́wgw 4idܖ,v@ҝҿ`f6uG2F+$=3`}j{ 3%[ѐe2pşPn0DDK]82{GyF2?39qkg \JwYB*_%r(4{PR>#mpMT&RZ%,5PSK93Azn*cG.MCzc\1-31MA; Ã?1JwuAveOj mϟ6vb^ ^[mU0_Xb`^xbiY*C@wg^$Hˍ#~,ngT,)4*e7U2_4v_8p6Oht|8Xv ԦeJRn7p)uKbsc y_/9g ,[ZZm6>g{6,);ev?Ht {/=^I-*RsQNPZԖtl N @)2ecqu^RTc<휺*>{,DɃ->[ޭnǼV՚ts'xR:mFp4sh=v! x⁄ ڃqs'9Q #m@0oO(B;~rK)UE;ǟ4GR=وhO}Kȹyδ|єtTA&O/pGr/8qp;*-3=,@|1<S wex{lU'Z0[nDj .:S}\^-x&Ή;!'e} y.{ZuPP{3Z˒ r@VCQ/ȸ;▫ZS2[kt' QTwf=hH+Nt G[]i UMSګs`ri"/44 M4|;QA+vµ_W9s`A̜knY & aNՔ!rM[`s|Ŷ%X3k(Uh43xSpmB}8yy?" qCips'>smWd#c~ɟb a0 oGD+֡"D ɺq)rLXL08%3BD @mS]>,]Š Y?DwZ gg~,r`́jlPg5ާ ;0`BABJ{5$eD.?$&PB1+7 VCa'BK|jfGWe #* DGod qV|W>f?[1u[zc5n~F&t>kĊi[-WA_]S!2ulZo9E?"+DkI~ )tХ̾,3cN0kmP&u5(j j{L Y8PQ.׎Ա g%,*| LpF/2?17&&;41rDojǢ?J|gR!zuUiX{10$Qb`_ hܲzdX1_"1(,'9T'_5Z|P,EaXWٔ`A ]3(/JѰ3x{5w[}"z.gE>Em+6IKPܕ(Yu: ,Y} )o;h&k} 5#6)gmԴI}$8CC!%J\#lM<b cѡ 1Vx ,(րzHIDC!Fo6"F4i @* qk؃kٟgV 1sZN냒fqc 0DžA"eقg`9DO{>C&0mAGmJWE/ /x,XH5^U6x/chSbule (mY3ֈ2DyS "TfrmWQY#K ^+,T]E;feQUDWq7bNU^n -ݰj+zVTEf΃iަ$ \c~u&j񂱍[!mОn*?Gs+!hx4ځҋc-UCW)oX͠fi|2iO5.Tfcż9EHz5j=3(~ene G0zRh٘ dz0F)DR.^!bYji@ᘊmP?7t=fD`]D{(y@8? (p`1{~ >AS8)*D|3|Z_/[ ӜƆrU {Y}0ӶA( v937ߤ`C¶؈ҟ9p p L*ovqt۵DzikW;?0wu %l!:]`5#Sf&KJ>˦8%ue/0Mg[dl! V|ȭ$n-ԡD\ֿTCM\ L oLAĝMSBїO[el@Z`Sۚg >|ۗ&#`3SS{6 g~ h=/}C*Y,2eNs'.5 Lu.3Wa Z_֌O{C.5rK0O?~66}Ɋ Nl+S:!&~Y^;PCDЛv]cW8;EXO9 bqIU*_AGZ>Xs 8=6` CrUA;ӄ4+_-wݻŸ>Q !3ɽ+Ʊhqxp^bH $(bQ-꣈HYZX.Μ)vhlmt ]4HhHt9~ds-!Vw#$`'3,9G\azݖ)3"TKnOzoZGIB^l7`\x@SAO/@CTTI>1xH^DQ4[5vDmc/}o}VµlOMZ^!e)E*qP @ZvQh6*W:_eLS=#[Zj ѷ%(9ӵ R?Ҝw7B?lLvBBXdd9lhnu[!~ n[ɂd;^hkd،Ec"\:į˖=~\5 )?*>p; l+|>.Tw[- K^eWh}U8ir)nM?ŀ_{:lŔA dF&aTyHHB2'cNG=FH] 23EDh267&ԐfۗYU7G~ÅfqUwAm+lC#49Icϟx2$O8Mxb %02<5/YYC¿D/ }tln;yrY-8~$# mfH/JնC= K;'GR+:=jv\d[,RQ Gihcrq+gIӛbH\C~0ɘ}Yc;3BEVȤŎ1d*>` Yyw5 ~op68h!YЮ or6h~%i=G_Zr5Ki_MїsQbA?fx#C (B7 7{A%ߙa~ĥ x+,4$rZ}*J{8(R+loW*xlP#цadB6JM dfb%=o/$զsXz@O%o KwI)n_/1>O;*X~ MS")^B k#kAzl|%FդŶ6z0?MzrYEEHB E7wSyrm fkw!l8)8C)ʭQaTEz#M"Uڢ=boCKr3>EZ90Q~C%Bo/h/o@7:$tzP8̈-I1ØaFƾ %> V ?m+SUqy,!h *3wu u(|#KFGA4h_=H;x*w%'Й~^RϗrL<:B,MM5Ii\aRӝ7h$jyHn'MBzm&ȂX$#BҴB~.AU@[x^Orfmw !uF#|4{e%eh{]ּcOltmٛj3~?C{|z9-kh;`&d?smjjCZB4P.Bّ *`>[->h1$f>XH)o^#e` gz%n6ǰPBMZZ̎ޫcgT}vwPIQX5GVdzI+BBdE\w!51&nÕ0D!̍CN|942+ vڡM2,M-Fk;s+V&*J*IFu'Jmٺʬig#.9mk3PdzP>Ӓjʘ(+e6N!7X'(7zu"_9 1Hmc}3zpC<N/ٜ dbH޴D2Os!!4a{{|בc|TLVy%s:w/IXoLyGmr4c{gJ f;<o]^2hb"N@m ЁÂZD(԰i{t&<\,8y{i 6_Z `^\0P$mo~a%\hr4$-rZ^H~y^3++57H{id,|f*yhʐopd#1IT9~_wެATJc\?Cl#! 5Ƈ:f{h%Çd6^=( &PaFr ׮̬`b,5=2Чn=cos{ &4&Ļ^=M $Ɋm-aytMՌؐ7~nS~Es&m[͝nq,]B杢bL37sO$v(1Hu"(.IY_Se]12sR֚=X<ն.Kc,w)i:'Ɲ'>Voo&̱SȪqN}&v{Kr#f+(p`929-B;._ wUM漏V‰[vmgXzSpɉa>N59bGH!PF N ʅȇ"Aϙ?;[6 ƐqH70?>ШYKOŃ4| GcHjaЙ;xHhNP!P]1S mAos%»yhJCϕRY_EVVdCbA\\@9K|dDZ^i$yĒ{ :edN%d ?p߰nf2R]zh1Iel_Q`e}1d^%$m(,]~~.¼;zrJ4鎓W@)Mq7xT1~ʃG/~CR"҅ ,%N,oDqشn-xZnr Wⱽ#4COgޒg7~݌vЃ*%1`A)(|#|왱phЀu?%jjXl^GU@,nQd7)NY+mv$eRwDΫ |P&hm 4gOЁl 8h=bd+R-=yoTUwe %Z<;_wKM_da8C+ىxORzټN9"H3ʞ9E9Y /kY4l$zU蔓ɚ|ÉZd6N2W錣p5q6fK%(308dtЧuA{ %L8ѯVX:['.H(X!JVe˧H7;l"пrQ?В[a4~(E~]|BM;|bU%W9]%POjpuq]:5x]5ONJ{q}7jEӑ;_=zosΥpVrp*fbзL\<RŶ"\:cSBS !R_Uz"xyG#C"$` %˔܏wyP y "`_ j0Sԡ2yuS'9Ǎ߂v;6/m{v-`?$˫{t/$V7$w00Kw;4C;\ ),*dLz,:Q4n('\HrN? [жDQ!p gk&4@ QcK qԑsLo97RG<&T̔#3l@Fq|5Q'?0aJSԈ"U @D֏1&\G$@eBZ uȺiwAsGC Pa(ᡎDҳ8@Ɔ FχTx`xB{[H?c,%|#g6([t^WfzzXBGW ؎;{aM'GD~*Nl:EfH܉t1h8 wI = #WS?OIUHa,g-ᣄp$e@r ?`\X*k+9m=ڊLPJ,H&F҅T&LX.;aRS1T_][l88u9= [ E "=RfSv| Z@OHZHB^BgX']B@'NWN/HM]j]Gܱ 3XO5:fT^C"[85\w~(>C@3~$[8!2x<+W(\ 8ˑ'AO?dFOZBcqPv74QƵr\7GR2Isǩh,RQp.u^L7o.\^].N=*Tzn~=$C@Z'o `V":iM O_Aim׼SJst}PL>>8{af4nrLn< agDy?K۸=@i!(~"bl05G~KH\\QQȾʔx? HśKTB4h>n!Xn zq発+#qUBde@HktZAg$KV'A(xnH@.e=s}tA:M:By6:WbJlPJ.J%N~\3_IXK0*!c_Is#Koyo/%ReCL0ޙ`椪.$|(.C ]甾*(GnjAk [%*Zhȕ`A~t B4UZ!Gey;%ZJJx)PFcN|U &r/0@ tP:'9;*${櫧u*ѥ IMT::=o:5-v1'G*YZʀ4EMsLJB.J ƞ^08~=Ț/ C)uª{&C,5& `2 /o'`E[ fĩՓ^1Sw?h15zW$ftt$&|zԒ^r{\'4* P8Ҡb@0:XT>J|9E몐ѣ`Id?p4O!EP>xqd/9L22/t%>0Ž TDr#^4fy֩ny[L%o}9׋W0ADϩe 35tf ,ks#}jvy/{i!]UI#t2{B3M7E iڱ sŵ9J2wv5֧xc#?Cj]V|_5sK⢎-aCZFB? E `ٸUm2 [;(𫫙=_RA= WHY`Ic쳅䲒f3Xp _m[dg}|QT(.#h_*Bfw skKqF%z Gdvqol8LmL;@Eƒ.0d8wF7}[&`O . wfiukD Ph72Vn }HŽqp G.QTiqv}۩I-G&~/u5v n\U &Q[jQwN×xSj{ ~R`>yh)c/8P_ֆgܗTd [m5 [ԈCk1DNL+lݸ^6$u=// Ne<$#ٜl[ -\3")?tO{IYa}EU;^½Q*QD(3~W;o݅y4BYY3Qz#q p҃YP{"E~H!7pn]<1pO0Ǯc26ޮu1DxR)ɑ+~CpFUA+[Y*1MȐ{A")9mOh@PhRQneQSӼ[t`\KլR/Ȭ{`YHo`,gqj3̳ŞQU Mj=0pSYuV(;UV;۵-J%fT-nnK1K9JB]h,ӹ1M2RȎpzr8Qi+p?}~#k#icyiͶ%!/v) yP#BOYua&md")a(ΑM8I\S-1R"fP"ȏ)Ϧp#qc{Lt}ހQ,$11$y`H vf[/z]i\u{65G~"P,jClUzaExeDӽ/m@yֿ-TY<]xzkb5Xb!Hݱ5BKdup1B@u"- YaU+=श͠/з ?,ކd>F{SC u&} %K*aF'my%b\BgP[g>¸/ˆCoA2 QF)-Tum)ɬNCKTA3Ѵa@+ܪշ㮇Ć .g9nz0!ғLMA 4zN1~:hA5i#kmGdRuy1…u[=Obo`%ԁ%!OH %ǺC@Jڊy+Qn])l=]uaVeM rOh}j˴[vzr,㢀-y\F& GX 0,|6 ++HQoD+T+%5%W^jhP KԏP~5,+iH}vbx7ai+eJ{.q;vu1|w`;h]#ӽ~+*G p0i9*/"WZ(+_1teDpT5P jhv&Q[ŤUѸb@rI&2hp=9Ȍz=R[z)ݺYNcj0McGƠ\g*|*l8&}[hQ{84 Yx4 iu)"Sj-u*\! ,<*hp Uƌd%W]+hG#r(2);&&jUmIf #eI=m:"=eGy)} ߠ 2#A^?b lᾙ}X*?Wg$z@0@s]%WmLzanaw,@&N%(AD$b}ҡ.қ jOuH7tѐ'^dUgx!!1߲a>YTb^b˖CL_ Mz֟볓+O*z{n^5w[?ߟ=&CNb\vaNĉ~-"T 1-4vK` 1JI:''R=2P]AOX|P\x퉴aEmEdMArDLqh5rM!IKIK:":0)LnTQpM:|=w$%`Ԛ $]EkbhN١/zԀR(I*p'VeL%S*9wVIɴIf-}ئ=U]P^1(/>:p4M"OD}H hp0E%hzr~R]NkZN-U<ɻYT,,2L ?X%`1?p1$,y36Ɇe.Y0`vZya]hz#"2 D]8ޡ0(0keq.Tx@e`DK#2^< Lڊ !YTvrG\ oqV} d!z%ҏ@( eЗmgsW Ň^kRPO92) ӯp{2#zv:$9i'k. k" ). ͸gp3EIpayt`"S0%yUfJ"^ȇS)xI܃x6Y-%>)2N֪3"/͙u=3ftngkS9 V[a}~;lA1;؅.>YĊiio^+zVImyH e4t-PG[m]~t"igۓVq1*0ЯtSS5'DE;o;)\m{XPoց-*pX&LprlST =pЛ3/KNꡔXCj^^ߦ 'zb*ůD!J 0݃M}@ 9K.u\yWڢNjs:|%UĞSE] 8j>~Ӵ\$E#U< E@`~;Hg~¿ K=-ĝGC:#/ Kס~f UFɧ. 7`@HqB ][9,/ӲIP?S S|&8i}<Wu"qz€<zd&9:sdv;PrR (Ś ;ش]} }zMZg!Qr𯱽U!h!|)Gm0g:&<4j,%uogz] OM#Z"^ɼJ>v$W&9qfCl"lb/@jnħ-wBWKN -DMqƕ-E ӡ4CRbῨDb l%L<)p6WWP*Xt~TYGYTg& 8U) ٸKt%L3ʡ%9wA*w; ۤR1-߅WJ-b^l p&!)}_(J0^-MυAX8z:)!ډ cb}|\2㳯1 4Ԥ(Dܓ~(=]v8ix>RJ |oi2:$HFcHxoJ=tSz:F`1F| 0ɴHꝁ+J8j|hoPWELnڑ7ܽG"'RsAllC_||ЪBd]"JD+/'G^%]WҒ KR][լxw54*^]wCPPv|Yq`4`4 Qz0juT~H8 pцt m$I=0I# k1sJch3y._gZJ45a/䯓1콛us[ 7F[2HxziUo^m2cV߽K"æ ʱ7^ϒ95X *ľ!-w o;3OUKPֽsq:mamHOϹ;x;D~2ԩ>O6mQM4[aمK q%Wܢm:tU)4L&^T]x`>X"Ng8Y*,N\ћH"'vg)6d5N~vpcҢ>r˽|S`l:Ƭ);\ `z菍>@)N`&ؙ8U%R@ߏb^PלqTC!#,CO))/Rgv&qBAp%p?O5L+zΨzӅhB5=\IQ,Kᘇ#DQ`]=bDEGe^:eWx&|VojjCbw9.7bPo^gJg\- g~M[ 70`|􌀼N7\*z]v5.UJ#;e0K;B"[0T޸^#?M/ {'Iqe\(eŋkyy$ #_33uMQ hFqKSXSf^z1u| ]uaAэRpZMY$޸l->n\< F-__U+ouy@Ҋ# KiEV+e&awKɰf[+U)R)xtNSHs}k;0"Ke/qL_aK%[.gctye6*=:&3 CD`Et>ibTCc / *JU8V1-XV3V(c dU4A U\gI./}qm?A.zas),MvWRqH4|3]@VC"ll-uNC-oI©&k陂΃w:!.ؾ&~ȞM,{'Z`G@;8-?=zc_YT,ƒԌLZml{.nd? NʓETXjLTcu\zG˶=b Ws:EGYqVB1Ӗ,HZ$\?J==CZ/GhdΕ^z:ra]"EDxugtcq`~ӛF7SK;bF7À)JƘsǻ&ZɃqn<+ H r!֡GZ*4,B㠖}-)\br[,qZ>LN\CYrTDa"z64E.a~;: 8^|;7Ò|PHպ&44&'mr4ޱI4d/򲀰+D&`j]Z>6B?v‹tEؒ_NowPCB-Y@oURI),XAjL<*$MH+CR1V@ Nj٢qk5H`I'Z3E|"&{H{WIt JJ5^(;l.nw d5N;v 7hB& ̡i|F8]ޔr| R"DEI9Z>Q.Ҕ ]v%Cذξ@Do YP%Uk w/Ĥ*Np ^cdm4c?*)hB(LmV_G_&n\Q0U ߶\UMN%E[5 XPV %(ȎB=oX8A0@Al*%4,>Q7qiwݏmnJ}cVLF}sb$ Q snJVnǢ-}veM O0i|"̥\u@2Px󐢁zz-P=yݙpÑ͎s$lZM>x_%VoQ{V2Uogva(K)@fg"MݰymB/}QkP ^c*E k&[ܣЕߖ?eT| V2p`Fhl=2$"?cl!h0 v=,ȓA„s7QzC468J:0}\)杍tS\2̇prCOjK `BռlǾFV?.%{Xnf]'N/im`p0GW#[(9yK<9)epTim@| {jFWI bX.mrN+ G| v˴9P*NE s6:c+bC1WO(Pbզ|묆'Lkfu*T+iMYWReSqƛY& ?u"ʂNvX;,0JuR(-Qz67<>Q\ urj-$-&o=D8$y8v| 6F]f]Pms1b̶ @X_Y56b1t)S}nRsQr>>)|LiZPF_tCXC#_1j46v8.̊.4Ov;WA@< ǵ8Ғ%FdZz(2xzef9x%k?4h$y"@=ldCbKOHTx. NW+g(/0<$\/Fml}xfKߐjDLpDj<#˕TuoHm+it |M<PT?.;c¯8Q%˝S _LJFw%߆Y|K(I$pR_FRQ BTKY]k+-{,>ByuD+x9n'vl.ǥ팪}ac>DP5a}gD\\[rgɉ%kcdɈz DnC4~Hç $G"o4YޣH Cmr]ΔoԒ)x~㭐\: x̿ #S3 b0Gߎ8YVBsO ?4N`S4{yZ$Fy5?Z)p*mSA 4ŧf׊uA$LV QSwgV9#1Ն1Łq޹K[9I swcl~$[ZDĸ9j!ŲRM7y^>)%1`%^r!jnwxLܒAϙD~+*J7Ztzsn/eT]x ƞO  A 𽖛Qi.]XooA/Uv)W PbrW#0ǂ)c10-sa"&*Am p3u ~iQ;o @{Kf}ɈAN: |0_^8šXw\}t;K0 TZ)2尮3Bzwas: mhY4[qQGnfCɷ[+n)jF)`?ڻ]1(Pw3y@uY8ILƁQ ¶u\oO&|$T蚸#$(H؊6:\[2R%eb `7JT8S_#cv…S5o{@1{MpZtìLiNП#F"[xfCнwJlT#rF̾ACT1́P< jɢu:]@\EbӚ9>@ f2]P )B"sSؠΥ@U" p~nuW^~c@u׳Ù`N~.7z 2޿c,_ U>rlρWqۊcU&FŚZVrEI 2Akpmjo9wZs5ԁ/>b̭8XF䯗BVoB;Cea_FP@~~ͿsXo}B5'OafذGj+,uǣE`v3>Y+ u5tfpY}@)":La3Eb_(&'TN:m(49}}T3dк %7f5=2T"7ƭWՍds XRwDQk8%jN *gt+I8H~ BI&M8md T1ɲ-JOOPZ6h)#$(3f|"2a^f7i#O;[pN{&4) C̰w)90i\} ]fBYڈ޿3+ (W(+ k% YLOpx>mЉRS9*ç);ȯ.ؾtDm .q %Kkbe~H9ehi!&am Sj&Z(r+'[NŠ}h0D r[=j`X[XZYEY;X&c=1= o̬V& Y QO&|5f8H4`S\0lj䤥9H4Z35?[x8 Z!&Og%ZnƧ4 hL: f7G;+vcj^ҏ Ohy^U7c<%߃NZh%,)|^*:u͌ =T7}罂*}ɾ@0D̵`GbO;ĥ] (z+Yz⑊bojك@Ps<Uշ]J=B錔-Npz͵un2̩oK?mGLtx$V:D9aN $Śnjn7bՋ෠LD~D_4g5mP!+Da[GWצּ9%/pтA2z+ ~yqVAj&"un߭bá770DaƘr.A #(Z4b?U b2ۣW~j^}uNXԷvIKݲRe|,9.fb]adiD=aq*Cٰf8M(!>uWU@ZAY񏉭0o=ɠdY n˃Bũ#i1WzHϕsRMm(bPa1؏!1?Q= D .FG*hӿGS)t~ roPܴ_1[? ;ƼMz8z0$W_Bh)-PHeD^#Oqh NbA9D &1',?CmPщ3+d;0I>"U6¥[y!D!yvzYr\Me`y.Nhþ ~ N#.(sOվ'q Q` J̀FX 0ww obNt,GRT1q"6fMaQmC&V-5ʋݣ4^*'M,0mUqagR"BdUO'ƶX D#DYQS/?s&`8 UȪ54hiDQU4 W,,^Vkbmҗvk9Gcf/Smlr jKAJf0y¨N7T̃16tdUC6Jip`zdao WaIB\H~#[pjSxjvl o7@X>@1k7?l148a3O=x8(\n^K, ՚~N; rhYII&D`a5rkS0DV'a вPuEgr6EddS'M(bL7)5M ^wʒrPtUD/vK%u$LM#V?oE;aSIbw Wq"_|-d 4}B{c{ gs5g>;DfbOSe&}Ț䱑_쟃󏠱ݑS ὑhB!na5FM6@&\7"uȆ=&r{돿J;jgb VJ+ĤiCWh`5urӡxߟ+àM2L> XKJHխ g s"J`usvgnDoqf .;ZCIY>J*Ngw e)cp BčʣE=uUc=3T^U IC dhꑁN*H%.|o8=֎itj#'7+;mj_I,)0$g蒎B4Ëx-}|ÊLP *w#7tqS\DuMئ 2=e㒈z7y"Kٙu\%KLr3sApo9+2'I#W7G퓑M=T\yOBPgu"Bg-0$hr  &Z 4G|<"X()0.%:R2`mIX-=y Fh2j[[ E=ab) ;|QvXE&8X5%{*3.N/@uaHlp^ı(=]L?~pu940Lŋ)൥A!qdjINH w;((6[5eEF0 ,7Gt"uq 떐"Y3=BSGEb&@8N>J ѩSY2L\]mm H#NK<կskS@A Q@X]^cUDj ag!ʰᅥtRpDN4wb5ԅ ӈ2`1@S#B4 3 AOHVynw^ "`PB0s:dºf\jcÂ^ =19@x(x%s!%zXH-@X@esGmSH G uITY{8.@Z1Lt  "Vw+D=R 9+G-٣Rߢ1CUj~Q* ?4_LHƖC[Ȍ =s5U;#Mx9T+*:Ďm˿3¸xTFHq0*bSMkG-{T/t3G-<3,.>~veֶ#ҹ Ý{/ m[?n!Z90ŁϥGb~ֲ'*pm5YTEX=FƑEp qlf` 64cٻctȝ{";4R@`chk SaA1VaIe43{B8Y<mh-q?<.$wAjsĪ(J{C8;r ﳖ.Wae;?bPCGC-Mp! {bttO(j;cgbZk;(mΖ@GEH(/H $zBj)192cϺu.?+hH&M[ D/ə _:8 J}w˲Y{/-GqIKy\RwԀ :&tEb(*}-VdLm']WXـRapv(;-?4 t ;[H]ٱ*҇3LT ^V%{2S ސtaDp%;",RgPzsgdg~+yڶ_p>?+v ;Fgu5 |tX .`5Ǵ(9nކ"X7s1g`')?ؐڈv(:G4dn3_ 5r#4BDf̮hҾ\҆?M9&0|ŔU['ygxy)h$ &8@K vH ꐷ\#sqx7e0nϜp2e SwAuIf[{zklfGNLu5S]`Ѵz0ᬄr`ۤ85&9Ŭ*srq!fLmӡq9c0W~:I ?%W !cQ&HFЎ앟Yʲu8e;r?EZ^uǤY֒gOTYlH.X,!篈=B~ kʂ1S%;7NJ3>Q"Zxᨱ0C5XP2X*M)ݬ)N.S,gdE!?(_ܱ)`^0(AB(W'WK rYUՋE0ΩCVٴig\2W]O yd{z):iRM0b[s#0`pK,Mu@*M$mޡ ?cjGp:1)]HX@V_ȸ5ę?IN+awS^'^ΡazTА7S)ףp+o%Sb_c /v1Bc@˫)f;'T" V,?\?O/( YU@L~") NяS`A3GlӢ+Wx=>lY?ר , -I}BX5 da]|Ì\ a!̢L|Tւċ'o+ '|}aPg[xNi9GE߯DP@ Q܊dPO 1bVآrB.  !mG:&<7-F!5(`ڌ8bhy<ʿK-e lؒ`szE;gcMu %0L"R.T1L۳}82"l;O:[cھ CRgb1uTAem"` j1ðQfkLU$[{5!(d׎{ǵyi *ƣmK Y^p^KX;D N?O6oɕOR }/ Z݉n8%Vj†7;cĢ 2(cg~ d 0 P>ѤG g&a8َ,ЩqQ+RަD`{{#XT x^C< <~ 4CE`(_?#:Lߍd],?&|˄0Y _$8n'c/2%w 쾪X$;{d6YΩN7޶5@LȕW x*8m!H䛒`O9JCzam> bZ'iʄ:Oy~!9XM& х}_;:Ю*̂(:w-J=fd^mSc$[7!v!rk FZu KlF8l=Ī*S VJpbN؀w.)M7=Mٞ 4I%ysq3zC9ľ`?OfةJzV|q`1K~ҕ|5_\4Js-[YGД8 eS>7zl#PԨ"y 6ݐ!u M>wPd`-LƷ:&C!8o:V4 K|3:8M5~ŏkSKp2ev!GBV@vhd ,%RmJrr$ Zvu("σ{ {X1EV0!(.ټ߼%`4-Ax(c{"hη4xx! H520#7ME\딫dt#N1K s^rY|T_frZZA;nM篻Խz/˳0(=5.pӈ\ZNu[Ǐ\P}SɍȒcj^lUK+hۋžE@)f3T 4;zD;{İ0z1cp01b 1|)&.SdLѨ)_`PSb1-9AhÞK.f!)r,  0@y8y9ֽ?0ޅirї(_(eϬCL;80uk+3XQF%ώ_>Ӓ}2#& f l_EN]y]a1z9la9˜=Sz6?` 0Z,(L=(:#n ( FAmB>JԱ%~dv]` RP/z8W"hkJI/6Qᤆ~R&tkԭ>WlhS24Lc KG$/5*9޻$2[~<و *\<$!1BS ӆ\AK@Yd Ҵ{D*ђF4J411'knXX2 T@ˇ"6aG*mچ%lk漣} ?o_)_btDv` *Xd%xOSE+o)i}BI]k.Y\vfҚi" $#0(r}|>$'eyrQZfI 4KB"ڗ}!JSξ}|NM+=)R#U\a1FZ]ޓ!jJLä|WYȃl(B`?U; DkYZKHE4̀+ 3@`Ow>ؠ"P.(/Gn6ܸe<]z *{y;4Ѝ<I6LKA-7kt9{~.R-伆tNvx(u2+l@Aɓ`)m9X~G04RoP7"wHfB&5 { Y6t=\'u c'mw bTս,aJr DȿY\^W|Iۛb~nn2I ㅴ f 8cgɧc̀6TFEr`KV[ImcZM9ó:h.irg ]7i@o h's;J'n|[;K-8du1qbl WDWdY@혊@iekmJ}-c`4"HW,h70ܮ61*k9CC SfߞGӱ?2c M +phL>eo5LGd\$PtxcQKq$MϹm K. 1goak W̌o7FZ|&XsT.?c~yOgBYj5<;*]N\l©ۈo26Qs֘} cjH0jibAyL;a(/7f$ gDf! X'%c:V#OP_7TXܴd$Xu/6vh|ʫ?m>IqłvH3 XW$%MBFMGo oFB/.{~b ɹ#daȤs I bO(Э]43tSg1V5%`9BR  *(.W+{;SgI#\g}'!! *O~b#2&J.d2"9ThbSh5 =bl}[ 3q 9P2i䖏MAC*}EPsoz]7@8t 1߀eǩ* U`- qoz:h~ a=HDeOgz^xT  >X\Σv2,>@x 4EaZR8[@[<,ʮd! :H?% _$ر#)ṸE;1dV/a {j^jRKϵJq4KMfF~ lH!?t@-^Xcm2 z"1 zfG;e,4F0AjG𼽉1%A.#q[! y"h@o [WA kј6G]Ҽ[*^Xz-܀*6-IvUK|`ЧR]j ?[U4 d`>_7C/8D:(ٝ4ޔP1C Lxr0Xwwr0 pw81N鬥IգUU6X0w1 ]*'cAե30yf™)30n`Z\TDxIO$0`͠VMP iɆP4WBo48+_Fqy肞ewdXg)h usOUic)l;}d P31!A̛4[v*⠜H2k+_gGE~2}>;1L7 wj+FLNoO6j -_*nCS5}'FX> ^ *m3tVtL}"BlxX.FFo@y09V[ '_cë 83ʷ%Zj-+Ud+2|)31y,ZX'l;p191S뛸 QYjCF3[K e뿩Ǯ0rִNfR`'KK̳y^r'WH=t& ԥۂ]̜ތ^"')J@CZ D9Y>H%v{|XL4`"X#ct]etnO>pY^C+b>8fdOF"3wDn/˚,Z Fz%wx:rO$ה8edFfgut<ԓSQUldN;6Z͊׃l|f>lUU#<&H0nh w`fK hXLr:kbCD9/pqwc J_aIH A0(dz~e^ j;H(PG6e6 Xp7Tg]A V'}q|zVJ/װ\\Y:XtnrfFނ[-_,zsLXtێ82&Uձ$og:${ > 13DzF=%T 4%5#;oh{ Wog\8VUnNl#5D8]8?d'7Sdb8צXZ3qz3f_fMf:zu~0q]g֞otqbr@hB0qW/!Aq@ZW*EwRم\vV?;~eV.4В)GX?vZuc@@-y(á'oMަ% " ,mƬ=+o aɻ{_\.)LL$!ҒSC` Rzܾ@]_}ژP6tDllKyDL6 jv0)ܘ~kYdL#8Q( v0Rl>!Iz"*cXQ < YRNM RL{rBzC 0`o=ЛrG2j<~m!ֈ+Eͪgw+QH9gjin2Coˢ-/VϱS& MiįwȯnYz)4y}Dh-3F!MK*6<+vI$0<~Bk' N) 0$ ZH6zyboH#MRcG֤2T;Y_d 5ƚ 𽧢Q&1d+R^&<_%3otKE@Olb ]\o4?L'IE&=QuCl ]c_0F$H "+ȝo/ީ:]yyUwyWtxRhXw>%77DbrkҀl8׍2XzGaWY%3۵iJ>Kھ__6 p Tpue#/cpK%7kpvwU!N:Hڼ@l1WH*nʈ*S'+]kc<G`QNM X|xw?{gr@v>9&QB>uJ =j,Y";;7d)s,BSɨ^H{kQp G@0 EY@Nn:wPC>8x3X%̆Om~[GNtϸ A5 Mc(pϛCV8t `0hc㥙}rI .{VjHa\~+!Iö>\ nHtk#D0y*40E]gIt3imd/&v:TM-'8W\? &/lQ9f{;T(*oQW݅ܩ;rk("ÈHU *僧p"o:ʜ졍J_'SUM3p2Uj{p9"LYSa'2(YbV^ ~\یD΢~-8u˵4\8F4ӦS)uw'5e TQ_ zܘP!C+5ie.=:LPLQk 21`t@UzCPYhd&fh|\2 ﮢL5ϑґP jy D1fH'RwCۃJZJ}[:zdՒ˷MFVu H{߼N o!- @ܐxFMౘ :emDo=V<).D_br#V7aD !FB؁tAh"[K/Q"ڍa M_AH 4;HG\(zCRjY屬]0D[:*K^Řڻ 8L<$9`вn-b_ eف;Ԕ[O,04r\RQ:/@j'\YKh&l97n_ADqkZŐ?0;UHFqN=LPX#1ƮU Ep],{[aqʇoWR|@{V[):h۝u:Z&GU̇K[*J1*BrWDD0 =:;uAeQ5TgfmmYu rI/19fRj Ω8wʽ>ܼA>Z}sWKt` Jq*IMjx V<# Z23 aeJ/SBc%Mh%L=@d4-L5| LRt{,F7qL͸R9}\%.LѪ /2!_MY/]ǡe6itاDDwF}]$ݸeKzU>9.qNwO&HěN}?Htˇ#(]ZEJO*\uf]C#[ #.@F=$ƺɅIKLqT' GZ!Ȇwm_P͢-4(J%bP<]~%?Xye VD9b:!8뒜]2zZogopr(2G.H PTP婱g$f=< Vn{#?$j.*AiF)TAgʹú_CJfcX[v>g$yp]i> ׼!N..=ғiJak@,MG|EQ@)}$9zGcӣx^h6Dۻ&Vƈ5@ &;Zo,/nT.y-J.oh|-zח\ eLpoC˷|g<#j&ٮkd |O\'#]xqsn" f15%2DŽR qn2Ș-E:^CgjԩG(cEh1|kcl Ud4t]Ry%}uj ?ߦTtH K(H-ÅEP7QZl8&K#Ęsԫ8Zn5DOXi-*YjOx]m ~ى8XeFrefсHY$36*Xn6.Hf^4׫KRI؃[ЩsR:w\l]Zl\g7垮/lW.S8͆bDUT_uRw _3%ߥNm/vyR^Z$i|6&]Ex;V%ɦ;dʆ@;<GX@%w} Q-bBt˹H2FB; kNZPjhyixrLK ʟmXA䚏2]% aQ\cl \ _}6 S@6"ޛ~ r3,|Cv z7p \2#xC{ћl%|Ōx5Zz<݅iܓr+vN&1$mD{Bȴלu x#5!O|[r1vLUd= =R`7@d (^8q$"CF:lYkn!"f8ۜ"8!?i1pDrS)Afz __zPō4?^,XY}-z> {;SB*lHg+ʟ1@)Gg0ŵ[q"G}/`Ģ>[j1 eڇbY.7wxPm1 2s^nSϐd8bJNk*Ũ>^I$ך"ro~x6Pjts 3OK[zMfL6.4TMҵPVcFrd_ybؖiuao QC6d!ע,42" J8NH"L}Q ]Wtdd ]"a 󍤃v1AQDX6U^mK!Iɜ/XT/G Q 1x QB(L\kDQH[BlZ04bǑOgnL  Uob [m]қQV6#|$+vLvZ7'?6ૅzJx.'[1U L代n ʟ"BoM:d?+Wbea2桤:tBJ#QD-̵g<@zOJQ+fh.xED`f[w@͖O/FyH1B?1=D\4JRϠ]Ci! d aGhS%Kt>.UTwKt%Fh14PŚ.wG<x&UP_s$l$.{ÝL25rFp]J['XRѩp.Bz\A9gZXq(A!ʌR!L9cCB ݃۷[0LfT1TLx}Wsny:9jM)!_?=FlJjmp\UQaelj8pxN@k|3挊]B+) ?fA5Z+I!+ /`ZgARS R/l љ2&p Z졳-ʠe/_ ++fhzX``GA\X_1>yL*yG\}\'nٛ鳒oq LSEǯVŭ*w3mrRUW ŜMWfpvD&k|V+[eV+?VjkI^[n.Y<gmq5ǞHrJb dꨬR~jي\-OQ͹sxʦUi,daaioO0lEAhK)jwnJIi^ܶ_'4-t$`rD"w1'570!FijDo}ڥnb\@-xD-xx?T{T.fEi~;F?" h黏˖Ӣ~Sʾ VAn;ahvd3 SGԲ1OHm=+~B6:i2E+D= \h.n=.'il=1"/XP={o,#D+5aa!ź`F* !S@[زbr; 5Ũ!. ~>a ]3 6=hͳe*C~z*$,SNWAq ?bRѬ/>OрhMF Y|@߀J4 TEQZFrg.: Qt`* 8(Zt}bY pGE /@>CDqOW(@/zꨣk[ 0ڿNeIpg&$qcׄtW6 )|h>AUD C]қ PP7ijQCVWs"ZD$~MM=ߋ'^vXqrm3u#u}TݮpHqJ ى(Jo>;&X#'K:|>S0ڑ=M%\ *v "U7וp4~E2 B0y]"m` ;IbZ9ߟ~@@H&w 'cJvmRMLBo'2Z"N"(,?.V$aFS.D,ZklڴwDz *bpT^90YDB86#Ԥ`ykO 3RJ'pR)$Q;Q ic5F6xQd _>qH?Kc ^.7\+`njRWs?I/폙O G1l*/p!U 54Dr5d`ٯ3q"<[B #pI]a7u`9~c Mװ+"|hB,x$mZT @mPJ^䗴jV/WWd98жj5&?lXػ~JCI\-) t}$5IE76?E^RH758hl'z_Ov]~wiL_!ð](Sh*]Xw4I]>|)o`Fզ1^#8\)J.f-q#%0:t\y_a(Hbg^ r_;/?>:0D3{RQŎ34~@&PXwU \xۂ2t4Kko0960/P8 bE^S͒YgXv K,6uZo- PE C"r9 [$H]f !kt'/k%mɌvÍ}*-@&< &<:Vtd䔓rŌj0p8oUHCDYSI~K{kHӒ.`6( FqFI)ms-o1ށTt3drsLnVʂѝ~ JerJQu|el8\hH d AeS cW`/ZntEu\uts ʿusdkf*z7c{׀.L}pG t7PnsӇ+Ma02"8پQ\3cHg=GX ͳwXQ~ [34x~F UCFPmNC&2ȉRB$ !e]'WIbVx\6bܶ}ZU|ddwB a*-w ɰ<ѹE(w h%BnQ X=fo7cH`*պL N"¦L_y&YZQH2p貫Nk9%BT:lH.tmq 9aa\t@w lEvlAfnC9[gjqcW߇8i.;]ڒLǘ*G@>]V<~)kucp_)&9 o)SyG}í/NE8TLEm"fku8 YA-QNF+ޓʺ:gbLoD"Eܡאgha Q{ |p7ӡ^n5'mĤζNW_4HK5"r_6!5=!Ps</{JyH͍;f1d͙3xzD*@x?1c3bZUg,Y`8(JuO۷SO|D][ؓ<;+ ]AfHe_"e LIo(ϓ(MgxER)7G)DXp%+QP %1@#>ݢB~lΎ ^Y+OQBkƂ;~ُP1 ?z6^ʀ֨Kv5Y]/)-$M8H*\O#A$#J!覬gjdk\]X[@Zh]dG(hS;02yy4.uxC[>?쩒GckvA>kU1ಬh6H*Ok0E~߬,<)&OwS[ﷵ^1Y4\4rwB%Wݬ5@Icx/n>F71EylN}\`(ZF l1Bm<3au6\ۓxF/>@jyYc2yo^T="&h[Pv=k|fڶt#ru上G}EL_?ެ -7(S1S^ȟؠsuAkG.]ѭ 9C}Ty`~A5:L-PJh!Ct4Q~s}c,:$Z%}ٞЇp1[WJ04" (~"ǟE<&5~@c㚋LLI_#,Bで IpSФ Q#d)?`~~aE܃y1fdJ@Ae9*;n2^Üpl.iF.^H]ڈμyT4wM'5+w+I.!2M /(L0L['{ Ck>qaBXeLxo;Yzo_kMkR (UPZuTn"KjD:"k-mF7:tgA绫=gSfk&FpSL싋 yo P%x,ʾ"čUxZ GG)g{j uIA(~u`a|wH. pkaI!u,| x]nF`%#(`JJsPx$[/uMed5CHÆ{1YB"]3jY3i/[w(3 C.//9_ܓW$Yb ݰY>`J!4ras.QJ` Z-ϲno2r)Ϊb{!= e:?@w4gv&V/|`!sonRV]B7ndqNkM-)]BCx>!,(ΤݘQ0>->dL,ii}v1Eɓ AsP!J xӝ w_PalA{ 9mcք&YW$s1?9r'}C<ҔOTGZ Jc9ln)\ՅWˈiz]L HE P΅Ȧo&@EGXj' )l'I?_Fk?Dђ*WDO95JD>h]h;XqL)|f̵XŻ ?At:G$zJ0G0_:"<mJE/AN$}sµjdK0"b?R@_Dk֭t(\Gg7v0K̨عWd}dx oy2=\&ힹ1rl"M-zfeexQ@H/,n׷,;/i؁FcAB/ Ak&Zo<5MHy|h!3 ;XD6XQ1nݫ ޷4vxgp:k̆vfn6pT}!-^qq/&^N搱=%h0E1-dQΙ3ld5"}oe1P&[(e_^_7]܉1(S{%njYeŵ]\e>85E26 ̙ީKP]%w3 Nb_=VF  ؽG`|Guz@Hh~ R5DBSkE%P\}!_Hk>$9`!$ JѼJz*zB r9735s5jv7/TW4Saj[8f8Ee3!9@-3pNiɂ J0g>l2"Qy|,SrȚW!h M_~ ֿ r;nsR"HM=G' 2WkzTp2Ί[mK8('n֎ގ8Bf:?>YyO`y]o"pZ7=%r V'z\,͉U/G]ִ?,ks %3C>k-ܖ7AIÃAzm=`ţCb³kݦckm ?=ĠW}ZU; %Xbc 6zSLr"U 2(ɋ0_MZV*F^NGE> F^[IxԲ6{7+O HD#78]ʉ?F~X"" xrx$@,%[8,_ Kt 2*i-`J_-Sڳ:_~5D6A^JjUIopt*`v[YOsQEqmѿc>^- quO Txcق=0@<p1,zqLb+rJAir*U)<]fǫobKXLeMN*i32bF T-B8$5L4f~ٮ,D N< th'o[(xLrBFv+㮙0=7=V B#uk"+:dpPG ~ĕSv8Яg*7"_#c#; XN-?K/3k,)%AOW6)- 1ad&f;eB&8@Qb%GT(5,}Nvs(G{8Mx3 ޖ+~̊,4B F{?r% \/&8 PݻP*-@~̬LjR@7I7Uʱ7Ks׎jYM/EGfqy3A_Y`f5||j\41Ac'hj఩"xU(/*X/>{TX#C! ,/<* ` WXz%nffѸ4saʐ1݂O*~Aٝu<鳂23dyb:/5% ^u̫< uU'sbz\*"N, @ 0|,hLjDd/2s(&E@rBPp\ZI+d'=x>wSnJ)6Rn@y4oذ:ڠ#Jc(gQEvagÐm9ơMA>NIkBDAwj2ps:jANTm =F{,y ݉z>ʰ$%%U\ro*2 A ܤ"{+\F<+Đwԇ)u]jGȖ{WJ)4K Ԟs<{߀^ SRw~O&j)_غݹaNkY`ƚvLTFe*0ŋP+\8 jm# LE !Аg!ݏ,nW ǡ8I?QR)Sy}2LJ#Clb` ~{!ԳAW+wQgfHSV^aM'{XxS%iE%0څx3ه.>6i kD n|bLlvBǽc隮?WՂJVfoC$ 8N9$ysbFp͍}.֗]q;^ ]_(Rkјx2CȪq\ٺaĜCqsh ycT`7P_(~ۑEN ͪcWwV[b6x̧OA_z}8@%d!&Lj붸 @2z ԖRhMNҩz"\֊'$יJY DV ?(Iein] x[~VJM2:!+DycAQRk-BϾn U&Q`N)gDd|aF`< \zҟQ6K[ E WF>BhuwH=/˟"0ݛ=bƷ~rp4-N_`:650ce֑+oeTɝϿ}>7dOF%~`ifᵆoI^eƍddoLjFLHM灄#$WȈDŋ5X^A4O(X7j_\ДUM4˛ܑn~e/(=_Nb *΅@ &r*u5q!&|agCڧ.Saz~iSwf.O~XqǕ_O *,Ts9VTS%Ai@f %goΨz;(4VIOKD_PT]݁T+;Z'cj$hyAjsOVy.Ф;c!;B0x0Ŗ;;79cB"v8@,1 }ϕdC]n5i6,`Ƶ- =ckԠyw~' >nXIx0S,MUs~D Tdcg iCoM͆/,|#a1QA3ց?V7gF ] YL +gb̄#vRMLo@*zH)MqqA~:;Z8"4QWp镛C-b(@O _ЛƵ-6h(~fi([!D^]|0 ȋ(Υ|nJ䥛cҀ~`4d4Gn+ӔS~@ jQ bǞ2lZU po^ai1K"'j@InO[0z@5$G+f|M Kx@7i~$‚OC)b-̕A9'͌\)mI?>S$tKEl>%uTYNEа˳jq0Vlsln?,N}?gR05{Iq[=jCf1/"6;3 >KTqao)Ӡi'n]WG] k*@}Dt]XQG=~flx!VA(SI UHxW T0<8occϸE m CθpV{ "K'`WFr؃Es{)5U1CRRxv7U˦"K)rOVDl>eU?I'e&WZv<0n6hl>0o?1FkVx}ZNPag] UG5|D]A⽔[]hR}feڦyfKW6bsɝBl &^X]hOzf1cGtx 7J" :}d?ۥ"(C}1x3sT'Ω G? 8"蔿=V06$ đtТ̉SmNZMudѷNS'^:7*;h3ӌ xEK_aZm g")tgCV7ΒSCidZ:WGN+Ĕw7ϋ)SЪDmjH2}(;+@ E,/]/asy**0xd|`)DŽJZ%ʍroK4GXi425[{9?ɮ\pB:ռ@_/D$DTyqY =8z#iW33Є rs H8u|T-ug2A_߭*u )ҕЖJb2pbqv6%ZTniQRH3Kߔھg?(6';o{`qbVvC)]M1keA}/K(` [/(kgnb|&`!Pa32Q6:ͅ? I$o- E'$YOnSy#U̠2[].xk$%af8QW5x,en8s.N/HgLtN풓 8=ua>] '8R`BF \: +m*qR6Q/ʚ:i:9GVېǏ#]E&4utnhKѦ1}A%|Ag ߐ'uR8f"Ͼ9%4veHka-5y8E Y&CXl܋n]7"8DiK4pHufށIm4אsLJnڛϭlek?=. /*LdX~ngUkub4T'5g,zE*5CHIy@FM9*qcHq3 =Lh/ӜK ׼ -6NGJSRR ։:&2_Qgnloc-T/P [i E:@w ׂ@7}y!0Q3v[8uBgZ?bA;Ӭ4zQyBp9ř+?SP+WV"87H .l}CчY!ҽNtL"WȐ 2u:faBD1/f1);l  $[`C>X$WsUcW$JҭfV?WH#Oݘ|p~;If>zۂɋ_|p-^5t6hE "_6qݩS AOcV(syԈRsNB%>E7^ia(_K'r0=tT_-+ך>HCؔ{ 1=H)|\+@Չ`niqg%$uUzHwI|.iG9x#;=oB\iѡ]͑ z ffu' 5|tg[f:;,2x5#IuO„-̾$- 02ļ Q -z7Ԕǩړ+D $<` &:??6@roRH' 1*,j+ :\ǻ7*9L /T1s[&ZJDM8&3;igI j߲[ٞ`0[Ha .'/A*&uy=,(%-H֧bƕW|n|n##0[DQ 61T("3jP(zc+7 2}2\⾐^ڿ2u%46yCI. 7 ʷ$vUD.d? v<߷v`ERT`'31c:L:[:EI;Jc%sV#fj}AqԄK:6_D(~"=bwׂs_A ퟂJM)u3$L)DJaUs0ċ6D\uȓw<C7LnWu%P!*aǁr*4\S65B/}"*L's,xP+o8GʎQ32]$~ۮ̓jL6f+1+5nAhiqY1!|jh@^WWhCώo>LZFt1 O_AB#r4ix]6lOv57ga ՘|5i'R/Xn 2Vca(#4X+Sb?f]PAy58|x,ZܦHE$@՜pq]a:G6XxSuT 0I{ŔJH^cƍ48*.:e9, 40tmamM*ۖfj,w:>ݝ[;5˔n%\|rnk`´޴aȝ唲bAɾ܆-#K,2'1  ٰ-0~H/bwޛ,?d>uXnDs9e:~0ۣ/ځ][IS裞BW| DbݎKlQӮiZkںG:i?k6u38`x. uObP 71XHrWb{ ?(=E) Qx)q<[3*TmaRxKO٢y27HJk*u) *`?喰L/<׹ˌ`73el)!*ZS^ϟ|tJt <6)L {%>#QLulJ^BQ6s U;~Gx6F3|^,ƀd`_] p3ͰGU&G]tz`Tg\#A,-r;_uk9}$%8*DsJ&ױ;Z24+c/en_ /tߣHhNЄ_;m+ b9+a9໿c^p#:VQVLNOVVe= N#ZoLRxy-Pӄ,F:Ꙕp ܋MPv㽍\#҈ZӺR)8n&*~H9·_ Ҷpv/ *_Oi,e©i8Km:wNW)J# pVKrM|/eaO?3ԃk|]<8=+ʙ̣,L8dSVmT+uwK"D `y&"Me*f.ES!S$+7bpg'6 Lkž]4oA+[8٘+Du?QT&L4PGVKpGp:{D hX(/iSy9P+X2 ǙGY+󀦑'aY4Ѧf=d8\wQF6 TggPHVsqXXfax<>FoWN!Ub:Z+ˇPa?m$\Iz;J`C la ߕjB؋>1rgBX8WM_ǭHz|jf\`;k`Q )mN'R׫Ͱ#]MLtj^rJFM{2#\0m|* h Q)!?l8Ycab?izOh{ ݂Ѓx ?׮販n4:)XQ։ AR0J,q0ƂEZr9@^5o~_,ȡ1M I|TP?<_Sʹ1t/EDW_IטQrR4hW௱+_.Kg^\!H|iȒ5sSu2Rj@?<"E3hdv=>:TTۆ*0q2u _Vc/1Qۇ d/0M @2FP\Ō)H-]yպ 7Uc#N؈ \} 3i؄Bg+[:iMWKJ7[M[J<4@cgt3陽 @GeG &=- ެ\6@swEd45"TkG~`:3O&Uf4NY2HVʷ_5q+B:VҤԜ`L XH&s6ϻܧ7ȹ:KD>&vi۾&}4 PL2AD ?*q|x]h*ڞ#Z#$-h1āg,*"Aq"OQ-0:n+xATh8)buyeVAk<|3crt^[D?U)3gElj ~uE$mB`#"nKNRv;У`i=q24P2.Q}1?1(4SwN%g~XҒE_̤z$ԸI q k*qԟ4(wTR䷋=#Cm3N]'fTuЧ z_M ɩr̂a3-T% X.w}Ut-S0(khyrfH"K? 5 ]^Ta;f-N6$r%,E[[%]4/(8 bfu?N i1C9TliO4H9+A" ec8p-V~'9_<%d '-JeR=f%\3 #A>Z6 lAN@k·9 3>x`h ?vGQLR'ܽ `2c+U!-/V&FqJ3zkX@t1i싰⊊< j exg=mxӑ8ubfIJDBؤ"e2}o=\Jw"PMSv.};'1B=3_,[}#A0{#fhgrAh_DK%~Hcj!6aW? h?hĽܑ8]?yZ!"I:tiznw2n ~T$bxɕ=흀 a5P+[Oh:4D*Da| ( ȴvov}E,@_Yմx=M$K lиh1{}J 78ȥ]fKquڏ+>k@!4clQO~ 'pYpjiL*^"S%XBm]UM ?"RBԀ)Rc r뛱)5m&؛M2 g W-(풴'28&v" 0T1ڵ"nj6"E2LCn`foP&͋SC>1ÎD-$ oYH)MQӓ!0VNQ'ձF.)/^G", 22KdeUUX4|Bs4I9CJeɏI> ځ)1$sc_^Q1IH?8-(XBu[L*:eYB8v!@h[kEgMӘr2C0_~x tצ*&1s3rt!viN#}if=r KY6c),85L L3ckrn{YO awI'Q4ZX$>Q^(>(Ü {&&[,I0r[$vsꢽ$fcY(Q=Q!fG\nΖh&DkzK+ F;L^5MoEz?$eċMcOQ|^ёQE(P)բZJt2" 1ŇbA [ۿ1!C"Dy_aJz1U@=\6I4g91橗.Zz%!8}a#@aRȱc 8 4 .\&Z :ߟl(ڋ)ƋCf򝢖93_?jn'`O\a>K˚5 ȳdʠ9:@)݊ HED RORف'%f^360tQDcxN9ؔuPKCB.K* G6Խ^Y$%OkVsƁݗR_أ* 22am1y$>CXKRʧF)Ӏid/ܣ,T:ӓ COg0ZWX"b)꾦!X,_Ox)A: 1_ OꞖ',xSP5⯂>9&^Cɸ/HPOa(w@H T+J*/^#ffy/qP0_1S\D!VM-[\ި̊^4c[EGƁ∷rcӆ=wG81v Mg-8usl MRNى+ghqϱVA&Cr Oj6B8bW*†&j6v.<%}5UЄ +KE߸S X ffwOA6vxǑ:1b7>oMbK[ɹIXKRzȃIiQX<#7iF$(us9-*c"35mj%*P7i7aʤfr'0޽$NG|w!8%Nv*L88 *W+Tuh|wh)jB~ͳ3 U2i-">&w%IDFLg0%sNVxb Q&9NX Q` ׋8`eʾvPl1|oWFеʢ]QXWtPhC䬿PdF1N@ ݴ{1g)0 +?((>,)e+Zm#M< '%r!L|A;jeF_Bx;bt7߯ `jfq_>Q*pA1Ԙd\2W/5^_v&׬ y HR~0'&1Kmw$v!|AtĔ +@{"E_+ ! ux+"SCCZ!X  $4FRkj/ UK *(iN-j~۠oؙoPq?dC47UIPT!vgf75.$n3@F-FoKG"I@⟌|om,>d"`X=r1F㕏Vu,FwCQO#( B$>ɛy>#6b߄f'uѐ*NXnGm ҦZSx`cM#uJXWXo xŁÛ>wpaA}< ?I&Xp_ѫ32Tfs>[Y%W֤gVncm땭56U{s dP牥.9(,%"v7)!۫)b ^PzmDNI*%SaF -C7iՔN=MR[+7<7bpԢ*MYHHЏg2z,p8AOr];"22y2X|K@i5~7 R nVTޮ3aNcl?3Y.qv^- Ap*M6Ii #CKytOaت|M3(ClUP~Vir^BI%5ư>LPESjN$g,۵,i2EdR1[&2Pgh.,_qfV#٧i7SiΉlKs]dq.)+^ ׹<~#1m8k?CHB;g^ Bv;EjQL!)0ۂSk4phJ)qJ2ƪ,I@A[~r9]>~MXLC@FGY_olUElPHq{_!8_Van3^6xys>r֩h}O:fה4V ,< #@+Fm[2o"*}[qpX*=^\a_V0+Odt=ml~r($ݢk%5_wWzAW}#UWecKaRh8m<% p&4T `/J#^0)yɲehջ>k[#em58xo!?5 BoCsNav-0s\U2 ՓBd3HKg0! h#Br7!Lz>3V ^qr=Cub줩eN >ʼnqȅѲeHߑ߆G=gǩZhMy$B[g2uu 9f{ DvtwE5lG -җN}IJďCIL5'!5+Wء*"!@3%L-$T+[I]Obp-ƛ_0+6PG W6RVu&7\/jx􀕴^ҷb7͛4{U$ڸfyp[6 :y[Зj3Is,_5anW ,aŇqYyhp"-$@ Y+v"-38 l} ~Üg߉~O7?&!@=]G+FzAyՎm#=-oM!WFթs-D8V8%j~Wmۀ[4a~rkr[U6]%K?,Z∽?Ww]h\0\6*NK tU wCa߼")֨B gKF] ?02/^OZt)9(?""{LZ\+:GȳjIpdG:0t՝,z,&F[ MGmEsUQ#B /ݬ10:0,f z$wBN+id KUhõ6dS!dkA Z.]&ae׋ O3 w0e"GA8ҼZ9:fǚZ=IC9ɂ@2`k 3Te%/^I%~Xd Me/gHSlt^0HTw9 YX?$fxR-%'Ďmb"w_\MSL wg nlzH4 xZ9Iﻘ |ZHxΞH-mDjW,]w2<`<c0Dž1Ysb*d,'ꙕqBvH=!5LF3XM=KMʉ!]/ W@tS5`[&,+F:=Iy<*엦 m}&fa[ ]pl7 g;hmjA V1Rt [\s$({ rH"$/.L/*ZzN(#pl-. _Hv6H9g!8xT1(L1(8Phʕ7*mD/okɐ+]Wt0D*א>pk\߭YѰ!׋qK`9[3U]MX&R+Hwʌa,[yH𜶐0g_;󮰚W7^Ǥ`|Q]kk;F7hܘÝـuu'!@>A7 5b<(L-4z\)P&FwCa#(>18-n ?4yVEGA맥H#>۹ ̈{϶J?9 η|^Cxv3i0zލ5f5aK_k BxʽuDerPЉO:F?hA\O jexmmcBkH8WO-o'EpVi\I=˺ћ=P  RD,e_!saO^Num9cy,[^숢.N|B&ըxQfO :vt!%q[hNq盙qKy46pNsP<_Tn)(T$_F@&yi_/>(U#3 Hz?CILw`lvo@+AX,R:O{XOdMae]/kQEr1Dm+DF02?pfjzd [ݏ XQbG.9zl)S|pY,U3iJBy-"{*v 4B6)sim0!ݼ#39GOhqI98JV%8e)*HIygTΊkLΒ@L#Pe]ʮ^µ?ӃTjSwUk!hSxEZ[ҹ%_km AL}߇ #-iXO߆0<+tfͰvn<"drR$fL~";ok!YEA|xrٯ;i$ǂ&PJlnEeXj}B<;V#RR ҂P(J9 ;|0RaeZapق^bœ %-X?iq4*`?c* bR<$*u|SZB}N AUHWB {CGQjI)`?ռՏjg੏3)PfEdcQ"EGd^ љ4w-b@[=@Ć#ي9@Ϋ} q2 2~k݂" c4P^ -hPJ^ K Ifݴp:f8i "2CҤS?ޘd )*\R]|VL|)g"*҃IN^cWg Ӗ!-SIaM?;dMƂyhpG}C ¢Χ(;Qg0wh[^$Z*Gfz#*{0ڜ ?L=sV HLr`q:XCQ c0Ik*!t+ae03Qś?fch4T/ET<0¬cUfg߃Qkk/ф6:rhxVH~jr7q/E9iZRI@99 S+/~f")Uѯ}|}+UrљNnDPM=?Ol&ÌH>!s3H=__s{ίXp~ ơ:MW_4;սHhwfEPĒV3g*!@ʉ^Aڱڃ7)G}Z,v2iNaQV?f,"ٳWb.~^t,i*@C ,QUhQVöH>6u.NX=nz~Kb5vswh,qI =_/+!a3b 9II{N%a<)N?|(%}P÷>,G1 vI瘃H(,R/û/*_ Z9̎@ PQGq8 -8H3+%;M7ѝDDv%vPO "(KL6dV#ga9NT6N^O ?!DNͺ,BMG9qXPK|31tA\g;{E(݈XXGE>pX0Z(YbS}JBڙ0f+ך1" |fYJI!̄+qqAY[Q`Ӆ=qiԔ9SG#-P :1%܇aH*)[ Zcٱ@| O gDqnHxDᮢKֆkAL{2mV뽽'dl| l8j,@F!V :"K79Y9#ۻbixu~jqƕXyzK@`J@5F:١rnQ O'xy+D]L*Ύh4O`}ː#& Xn#T,i06 MT92)״𞔭qEV.Kթ]6ϗ+PJ9BawT,>8!c 9jiǥb(6~-Jo?=HTojц E9EڤR/ou1@?AnQ{mGM9'!^NkdEwTԳFh@ߓ [jsfL,l ƲD_7?L]t4}EM!:t?ו6xek7] ؖ0  # "PLAb65=cA<;8&]o& Q,8ZtG)S&HsOLn%ͪH MO0!aBJTߔ] :h^uR#1a󥑶qB ^j,|ݠ19)Eq`Pd,Yj߂uYYkBB/%8̥GDPe= )wDIO]EYCQ{\qР/#9`!8lqNJ?ԛM 6{ȩ^g`96&Y [^}[N+Rirt Zܮ!RՄD~L\5dL G|o"Pc /"GoSKPUR o6i=[.Z/1Kغ 󂼪3~u+chrwX-gng*BXi9-!hٰzuP.5,sLȡ)j}`)Ζ쭒3O!B"ޣ8l2f#3g؞;b3n"A{Vo\of3ID^? ;IMݲF֊RV= sp"8 RSb0G^:DKjMqĽbC$0VY@g` D΃svZFf&[G!% w v |E{`v϶ʏlgn:P>om}Ewxk tm Wo9z>w<޾ Gx̘O `sϼ@9} =p(f Kw>۹Bt__>kvKNs7NwZ{xvne{vuG{=[Pzq;vΗ;gzힺѼwz=$zs+͸Էw{ٮ gvn{m^n[ǥ7{3ٽ{ܞ{9oz{Dž姺yv]{lz+E˲뇻:n[l^۵]Wlta{uֽz^S٭¹ӣonn׻w^볞s]{v׭V١ninF^5]ݛuxw]ݻn;we7{V yvۛs{tÓۮ==+l{ǭw%``IHKSaH. E5 @ '.A8@5)bdž|F.U6]19q\EI&' MD9&W“Nd 2$ sJ&י&2%l $ [6}E2HK *R.N8P#,PIJ( S§d`H @4a7FP(H_ $ pT*•bSI,٣ApXVVC" >7t,T n^K(D59Hm'iTJzXB*4di iCWJ8AP?4*&s"MT3 p$"H>ֻĐA@a L{#>$8fHIË!СƵy<ltGf"۹hvn̶!7"ĺ(9_yAb_ZPXHR>*e5VHs%,@:(r=tQ< jkdQC6dJ?Bze;\С#YzS0dH 6/&/@ #@b+e\Q{0Ƀc#ȗ$,\Dx$UZ}R[&(!a%oғ'0֛ [V˔'LM^ Zؔ_16Ok=f%ɐԛG" 5NU ,|R^Cǖ"['b(p|Bį t9Ǫ0xR qrKIWP$"J[D3θXC> .Z:_cx\p>./lo4IvtǻBOP ZrŬG'W B53+m_.mرeрz2=$#וm4 tyyj'`8?nUN(Aly$`e(D.2-6Z,mx*>h65zU yx=HCaTI;qҪ_Wk  tN2餈g8E^n%yh|!{7N< C'Q{ [X}#j.7*I־qWoXd;'L[nFNSi{; u1za^k,oR0NfHw`s/Ŝxt88P`XQcg?Vg',IwFUL NFoDwtvclS@c m32MW0B:w\ѲV.Z|]|)aorX/ @NM Vd3N?HqZVƟUV*N@0{3c9tAKw =)a =ӰϦ&۽W$}X+&?^zf/_z\K;PUԈԦAr8qR//GeJ1br1ȔgLf.yo*/.1-T/HJ4'&T&|8 =@1Wbא؜;lH" ˼7Y~`89ZD$~ *`{ZzLڻ(Lb=&ȄJ%82+2];E<$fky#Jo<2Gt?iu?U˭/%RVF`< v1= +ӰeJBQ'E~ 7ڿ")%}2AA^ Ж'0 Ýl=ޞ "ӻբ\i $L[>=lHP`b | &TRԛ @~!ܿWWwx @jڿLEYO WMޱ1rL _ Xdvl&2vY*M{prt"'ys?MZAk"E~ Ca[ܢ[-'OBך;)p$rxYzs a " #tiYT;Z#._,]Ku4'G"Dg9^*E> 5&Y c,)@g0cz Фb?OC@l dZ:-jtaL\8N|ma,bJ?@m< /J2Daqas(m ?Tz.71KlO,APs^A42zAV%xAؑ!~R\0f%c ry#aQakg]ڙ44}[c<^Q8!cMjS8]|htHQ)Уt"b&<)ИV,:Q5Iƒs0>77Z_ ! Dj)B;QH njzXDWI*_NXG8Hb~J -_Wp^ݸx%+U>[zI[u]z2ıf?S.eQ_3Fpƃڜ5Ī*DcX׾yKdܑ4i&f[MpN'}-[gj2m#tTcZ.^CN;F{L,h,oeB2xV] zp~FcnzVecAh.quW `phk-qI9TITrgqߜ؊#a5/pg}I"=dN+t0wE7LonF osu`iM@?;o!f;’懲ڷ >l`cZ؅c@v{ƻt? jb1LȒIl=KAz;8 ԓM1y%r蒛T][a9`8vkI -hS dg}@(I$NRUoBUğjr1Crc@?Dq=uϴ>{15)A~! B߂_F^Dt,Gp59Xl)qSv[@Զ.ԨlE D%^'ٮB>蜄'c4V! hFqs=!5̘{()dl[C1'c"xh^Aᕀ򂓘ia\;̀*nW(G':. {+:QWFB u4v.uy'' } )TZKU7CJ*PFGmLWÕ/quʲ;| [jLQϾr}އٖ$AjH lKg"΢c5͵a̲7I]$פrWw+2~⢣ETxDx+P9p闆>eTZ4o怋- D*Sv0k&£$B'qHY!QzEܷ~CXt3=Nnx>_O$ Ӓea`[^9Ra̲V&w3=o P>|3)7,䩧Es]uo7.9f3K`iH(q9MJnfO9Ա||0u*w\dގ(%XR=i>PjֿڪFgeχ4O6"$^÷B^:gZ5`KղQBHQ/ ^e#<s~}5:G9oL@@QY)>(E V*#@}Df"L L:vw!5گUĪ`z^hZhsg;`Y[WdcNHmlb*ΖnhQQA±4,1@-8`S*L^'OGt!՛O#xZD8UXȩFDP>8})Mrl>gPrKeL`Zbgz|TdnXnWHT)kF$%! e_}-Uub_ih&|UG"aX!a* V\5`/ ⳻+}u$"n\HSw>QscO[0)%'fo'{v[rV2v vCJiL/H A+G%RcCӎrFD]H^0=|MQD'x#Ԟmۏ%GdQY7@'ĠRXo'bgPOh??1wӠř|!Tq0|Ѳ7nnrܸRE7k/0G\,cJ+^np] .4[!G2r_4%I%"Mt>&g`4c`oQ_^> Y_GDF/, ׁ^a<5b9]^upGF*0gMty,F9-vB@G4anY\.(*)ҫۊXXw'YA.fdBsӜ"dFu)S! XsRc7>jja^+]O6e:ڨivqY4 de5P=~ Dyp$"T[Oc P@ MDl2u$E>iճ QzI3x*=f:DNwVa= dP<8j+X*r)\#F}/3<̈za< !j˱1Źϻrv$G'e(uGvٝ %N-84A~ .|͑C%{383[p3}}[Ad _Ri@ UFċ"_A׆(`KA0?]wt[=.KoRO_G)VJHi-Ϊb+n*2pƑ]k̂l4|I9d~c+ /٣pY"@OFfL5@uJVi*IԟOTJ'J Q."ɡ_g[ظy3IH k)Ɗϛuh"Ж€c^/d(c6<Ls80Aw8Z]M N7MNJpfngsWnB1 :ew& i W½-hI) *jQ%W{g겍DT)HZ FoV+XR=*.Z/7C佺6C z!n]TsТ$J~&^iڟhfQҠQX- e*DٗˏM?2{I%Qٌ0Y?\Kkk(+y'T?6)XZp'7p#֚*>B8fH[JJD[~4 G Z x5/1zHh{!U/U<(N&TI;1u-q9q 'zJX$V3G@b*UUD./~/<~\]gG~LNs͊`$E*EFcP预iv|Et~& e#zОA?y~3c =᷉&&w"qa$V$ q2π~|Sl{ W]^F @M@!$ȌE\ <8!!NW "e{|%q=QLF["6/>9t޴iA#== U[]hMoўFHܐ* B40a> +*cr8F, ~=%}%sJ:!=1J.%"1#23kGolԃm,{rƱG׃GFX\V` ,\mt)^ l߄F%3IAC]|RB}n"!=2CtчE1ʑ4iBW-C<נ*y4VAytUM @/Y_ 1jMWϺIӑUI9P КL/F;Sc`Tˌ(y]Ʈ V6elw<3],B$uqT#㉥Y^ؐM@qj4hs];DRf+sc:z;=+0ȟ`ZX 7Yo`aӝQ%P֪HV k_ᨈq݉~KM7Eфt+xY95pϴDw  {,oXpHݘ -mm,rCpUXJ|_=GA`OZCXcxH^b v\Qm_D aBUKM(1/c-zJv=mqL|Xu,u6X,uzPL9ռ1~-:+%Smn*H9/M}1TRe\lb0h-Й C0gbRq}Rު'8PO>xS&'Յn5+<尬 h[ҴC,ft65G%(5I9-X(2.Snp[Tz&78Gm5~P^9ka{dsOf[a*@R)Qƕ~acf4[HY8MKUss>Ϥw `t #PM)0WʱQ KjЃVZ9r/&jpIix9&749+c[[n}fr}!IүSy+:w-sNΡ>"ն-?b 5@RwRJ#:^[-9ԟɤv2arD3r۔W綣ʉal%_+;zGNgvi.ϒa䎵p*,?^Ֆ" TlpoP콴5lA@ϗej YaP#vRniL6b^Rv25@IYv4a1lP)f;w[GoxfΞj) 8l*:ȒI@ ,#fO)Șfk6(b],}%toJb G/Qph`E0p`㎠%KOA) @h) i}o:d>:"þF4 H%о瓀&ŔMȺXXymGUpI6Sbg8ِ7̿g ك >q= ~T*}dND|-99tTp?4[.>(Ɍ]$).BpE_Rќ#FW<"b.DDiL#es\zwsf"9=^ 2JQ5f'pBN5!q «p^1N89"e?KTu>>J|pj8 ÏOt'fy8wፎ{Ƶ)MHhBjOsǃ'>H(<&`$Iٔ.(ꧻ?CTB]WJ{}>CCßPSlZ!JwTN̶(et"-a-2dP`l%(VF*?z6(ëc=aj1T7Kp Ew_C !ŦR O)Z9_ m8p[>tH)*deL &,{+h"/ ǜXU_ ћLwt)3xEÙ e⭯7@x[E~p.3&{{53WwKSbPYSv=lD+2 zHt%1 Q=UnDžU/3~ӳ vz ×tgS&9jϜz'm (SSRdjΰ6VIf·t')V.Z-L=B!--V[s"#% Mmcٻ eBXlSD3st|ҼjDd\El pA6[LhdߵRP91M6p č(77TN^Ly0,:J0ؑf$ S:^nkA!w>sƏ Vi#PHd;ɣC*}!2^ -m cʸ>dva rjCL E=_wOϳ1; ^%.hT@1267!RZDafY|O/ygcC)b |I8~Lp "nvHX2'A 1\&9 D:mCQ7Uzn8fBjO ;3"\zo4m =˫jn&^d)HZsIQŘ i렌y7bw:ma &f|K "JH){ӻ=<i+eQtXFn?y)G%k*o 2~џ%N t~S N`C`Q 25س _I(N$9r)U6_:t-fYXP`|S?$Bq 6lUŵ(, x|I2ǣEy.0"a}.'Ƥ-ƸkwŖq2%%"^C+V"Hv*ZחTBW:N^4^~o$UHFoDBO152D4#JgG4Ý A&4ZlCȅlߤYi&a{#/.%x,D^N)z[4i>AFE8Vb+D;ך`@fM!̂u'6Z?nH MMGkm ;Y}}M}ؠY{Og/.OLnd) Y,ϚcW ω =鏙v f8z;Fz%_ xx6&^KBFuU~S.B*W`=I/B:87WLk; }ph 0mJF.a"8C9wmqejW_[4b+~"$:F$1%MDYe"z(4 qC؈Z_nꄄɝߢM%kYk¹MN?!+C <́6aJw[%aC꧶Ҡ?՟m_5 +^Bg*D6W8dJy=TQ4RMS zg"Y=-YKJTTak\IF}Nb PS9a+VpVx8!K6'ڂxhsچ)rx j p%X @ #9/NZ oz-|OHbCx`' FM1|Ro,KyJbst#6qjS)٭dWyw .!֮Q>UMcߛ!z>/mS\nJ*U&^twES,'pslx<>MY'Gl+壯)i Q:9\YҢA$D<^) G yihAY(T׏@O~43ڸ&Ԣ儦,#Xӌqd{$D}t{k V{Bkw:3_c4CCIPA=ZﲰMfK} fW\ mTS`xC/C 74")K#+d8oNvي!~Wl訓~T@7M7P+wQ! yXA{NʿfcnܩaV~cKOq\e7#NFeݿ8vW; 4:ۑ`éXZ.m#Z Ak.J5xvK4OIQ-ea vyYB%ٰVf:dxAJWFR*$Q(D_Bz Z寇H҂aXڕGaG a.#(aZJXדCr;( JsS3v6P$E:ZyxMBD񥅀*% 9m&@쓽Dŋ!u*keNsDjETM2hO}\bsQT^ʟB!xpM2Kr: Is˜cy7O2%a^ `}xyIΓ۸X|A(P7cyV>DO jo[ gIZm=*pB2~]_3-OuUG-ی+J!j1#H1͛XQ5I*n:XZ]: biٞ%i&}wW[ذ{/K{ MsBnE!G12M~[#_Q\ S>;Z.NxV>(dQ KԖl.ֳ.܊l~:H׵44*Pi鑃p3BL>)1S}lA~b6*a(t`x;Yo[g6V[Da,S/cD$\"[-DNU9sm)_ku%lex!ݓ'{έPz|B.89e*`!a}+11q"}:Dj^3D8CF/׫:e2m{RIqJX"AAN󧇚 *ы*rV`zt _! 03ު'>[NIʚns(i=dmFd^ֈEu%vv,zS3B:~&ev5tX)6-xB[3ʥW$ntmB_"@+ou~ , hDUT{妡.L̙EpƘϦOyTW,R,9v&)j-̹%Vn瞬 ,mT]+۱?Lq%h# qt,2IuoyX:_4$x#=Q.]k;^6 -? uecGd}--·8o7kF^owFF3 .;Axљ:?'ĤUvڹ)ɋ49u%:9f?qv$ UaA',<=g`EKO0LVW˷M}9SbW!V==Y*r/t{V &]:7XoP3_cskcε0e-\,AQČ%fwIVe>v@MHv2pâ4C[)[kK[P h3C6r>z[%|G/T7z:$X׻^üǵxu;F2z?dGl7#>}˞aV2()G2E oͽ?'-S>E:gtfC\(Ot^XrC &YB6kOfmnҕ/ՠ{ އ{NSD{|3҉XP3Nr&G9 jkpEEK 뇫L$Wq(qnǁJIDX Pvyj=71cq-5#^[aϊT6?m#:$v -A j{BejJe]NueӔKpSl2\CO3)dcJÒ&#,20X::}]py^ H XĻQ9U֞ 31s^_ŭ~D̺kVT4Xl'Z۹9(!_벛dVVٽX7$ u!K >p hW$ipɕX!5˜"E`Zj*EK$t"sHE?U\93k!% k.'|˳ti #B8C: rAPΌwKԈ{JLAT0cjUJu2[Vo^:Ή nN0D[13㙐!ڃUyA%WTS"7 k_K놽ԆS$#|.~ s8Lfӱ|- j #5Viq1(m#lZԞ=T:p2 s9|цyE˷.<єr;Wmy\X'T綴"_)HLLnv5  34cN||4 5B .?Hx}7E ac y J Ez@.>]Xń:gYV)2 9$F(.?7+}D=CQ~ 1n/;u22dHlG>/^P&𡧮 N7ڤVP<<ߴ1ln\KI[9{bCr>CtR::T"OvfQJaENzuMb!U }ŕsM +A')+ [6f',nՐףp@%Jc%?[{A$hEH[BL3ET+0 b=F°4"% i-޸b&E}Al4x4pw%!N=h|V _+'0w^{+{*L.JJֈ 9oN*'UOs[9j 9$vҝf0A;5c=TӤeXë́"aj‘. Z%8WKӠ] +qj,vh=WQ Eugʏٽ_ Ї"V*=/)z3\ iK *:axX!̊T]?~']q-44Y j4(w%W`A,>UNgMIÞAL>O{~ ֦anW*!?EDU܋)㛾yNGJ?fmmT!\z~p?Q܉MBҤ.&7Z V:N[B!ۀXxrZHJI Pbg5ա662kN ۦhCwIbݥF=9, k]&h8 P'x.׵/> ͅ{,W! g} e[ x8H)œ;tjK LF~r8ሾdeu }vSTcmϓ͎2^5H }1;a%9r$~WCqj4$+-Bul{IU{k(Y}iQiS  4yⶦo9&S#Ax+&?* ~? AVfC%ȯ( N7jsHpe/fF$ae _`xO\[ 4$:7El0QQV4RW~xm +n݈i!TJXd(t#39W/L0VԿN]xS߆Pd,q|Z"a&_(f&^ Ix(te0N/_xd46%βcY _T;ɢweCR@8 gFH7Q."z|>pDwh^_ |5yt&|v? iQmƒx"`*kȾ8)lI;Iҷ wS4AƏ *|7uSjG |x_3x]pq}7E6mk IڣDІ%6bRV}$hyVC1{me¼=CZԛzdxM77LҰ+/wX0 (\Tp_YWb8MDR˦N) ɒڀO]O  ppNk!v6?'mQ~"{>~1;zl;T3@qjV ƒJQ_A, %T>&V7.@xcH^#v|HVNPu]3eh:-l'@̹>p?օ+ /CFU5w}61KPJYB)q9Ǩ$  )]9U^7AdLS(4W4D몚f9UH8dn! V K@JYkx4' ȶ3 >}0D\^64vӼn} v$A]/(8~~tb9b&Nު0!Z%)# yᡀ=@B"擯`ŌpIXE,9*H{:_[{$[t'w|O)26AerkHݼ҃ pCH 42eou$+fCk險qLLt+KbëIm}qkV_69q£pV$.D:04Z|xǐv,q2kx-%[/f\<'!YF8D*4'e$2qq4Oo#4Cdmyv[`:J :͐%U1'*X4,X~O`”WKs1&%PiF&ƌCCnkud|qq0 ]"=] jC#b@/O} ʽEFz/q5TNڡiO1wϔnqXuA"Sީi 4IG WH-+xWojDI*2Rѹٿq3*!*7eu6]-:iO.n OV1NĄ'4sl-EL`"3i{0A$րhCyCbWNט"h/i?0@RјmfNQKMRRSw&f~pX|PM+J)|N>l<ūfO$LX2ԅ[ovuD[!Y`L0aTB$ ڻE*Bm2w_c!niж,S)) udZ%EYɺN|Fm)Z{c wh%4)dZd'm@ېB=!XAD߱q@0̜,Sh>Yd MGp TSIH#D/ iv' dHkg_t9M SW;4)v1)Y Yx,!|AG?8m L 1 l< jA OTsx̌Hy& }G OMzbfagC|cl%#}㫸(rfmeh  m gUQ7= "k)CgZ &{)am+f|I)6>e*ծaH/x{bP4*+q2):E1d,DAX&pp\jYH0q06҉ʖi_6*6ligY:'6A,lb㙦klE ^C6G&)˒5)'ܖSv^zeVM8m {߭ u(T%dKJǿTIG5'[(c-Rgt B}$pCh^/8qL67\ M,/&D]cӉ+n,ۡkN&)O5>/hkASt$Kbq ;!3bZYpIUۇSdnRrZ=?PGLV(H}ǝ, $Kiy)^2(FcpW+1H2O U[OWTdZdzjH,1:k&82PƦר-il R k޺`a6:e W spiw:Xzތ<ф>c: 7G(Z,7 U:9)5F)_&o>'d꠆A'>WDKʘȡ)/k.'4Ps I[)j8ެD:Nz2@2_U7ʛB5LZZ M.4LkYE 7_y0 O89;0 j쎯ƑJuGG.O5:dьGoZ?n4) KK2Hs8~N<x9Aq#%^7 A(v[J%Nf? Owf]qTbp<*tÑUuE‘p<%t} Al {&J[_0=Ou:};pD]T%ŀD_H Vj7^6T\v5jJcq9Q3~̞xxk;=ljH˞D߶*r2dDONcQ9ߓed(:)^w6K \ENax),[fb=b.ڰ3HFw)HMl|c%kdmTyQ ~1#bL?ZbHGʸ ~bx~25QKopP7Qx-K7hE)\9J% γ:'J@CffB!ZhwE `^2a rlx͏ˆԽ@Z/ٖDžfSHEtT`<x0axFJsN#TJˌŠ!GzC%Y\"$9d-HI!ՂHw-v X<&vP9ڏȟRB㞔}qT1)D"ZΟ t9'7or3PT4!U]_K Iࢫy[2vx;U (Z'褑Q v"#?z| [J

D H#H . !x_#j&fwM<)ujJQxPG^M,P{ܥ E_:9'+H]R8Y<Wf'4{{# okų߽WOn$εwG rc.:~[]0Er4ũXcz KiFm 7ENBf;5y;0waDВ%Xef wh{'Hb'fy}0w2E%w}˷mGH GS>rآY"4U>ГM{'}m(wyd"̑O"EcB Fˑjy/d4AʎܒO#CT(_xEg_QA7'e_gѳ(>hwWdNDChĖuo@6lIJW)}C3Y5r_~Mۘz:u$C}sf%ݺ$ )Q@:cH:n֜ﮊCsGi"iP֏^ڧ;e,ZgRz$&=@ Wux6? ҄TZ3M%_O_/4 6V1"RsjZ`#CN{ '[G8o>26NG]=&Ћ QQwgD(]/>tZАrADE WeO%ִbW׮krsebg,u`ޮP 2>IiEZ Ź惯}oYq-S:,F 3`!_Yvݗ㲐fz6(2Fw_XdXM*KsTh6 Ӓ .'J 8e膏]5}O3ÄRfXHC?~YH#-B_JHW,::f|O*|( 9,c/ I{\MƳ6(H*R\3|q#7Ab/KC=Uzh;3)KoMTOM ݜyꨔr1E.poBk6@:=TD -9 ȕ{UD`5?BM,Ȣ/JF@r 0~89%Pu$kұpXJ;wk .g- +|]*Y HFVIsf#WK.UOg`*U+riOGuҀ"nfN'~/]4"C%9A~s1s8!12`9_3^ӄçߴ*Dx&8@)C^8T !Q:L|h3/vk ʶ3K"vD~I1dw_HCK64Hܹ6aڵ9OםT@E`D'j࢞ 8vyLKc*son y{_VA-M] 3T.[g-Fn):xS3n]떴%`9`6HXn(8ATUbQUO'miSh\MV9̀1tÙ9Kv7(~ƂXd~Xzb/#Rh;aL<o˺.X"ӈoT= ;I<"#Z΢tq c{dN3Y{|;XR-}CZy [P"gp{#7:GwrL9++"Xt 4nsHS4] LHp96Sƅ&fVk;[mn`W')2?}gz 4J$9cwe?C8|"gwKxGMOCވBK@kK3KPa`n;oT~1m?$z@)g/p<(K'.C вT{†&Qڨ>I& Wz4hBpCNqЀwΕrq>Tz:5\j+3ƿEB|S+",jn<4Y NIr;] ۀuܥEO11N')vkqE'orl><1f?vTffq=$p9u &={R_D ئИ;sOm݂XֿFY# (P}vzugO9*զ s_mʥ%q'4L c}[]Ꮍ6]#kxxsx}J^ Yj&-̀P *s/LIWk/h&D􅸛_Z1 AŴ,o믕+cR4GmZqO.1*l2uoo7]ƔKVsiА%Q ]W{tRa̽vt4n4T`‡7[WF%^: ^sjEy3ͦkȼ:]vzA{Hqyq 1 ""tM^4 lI[ā%*}n|Rb_=jr"@[C3^<> pO}b0;5\"C;̇aPmL /h_lsqAR)׮ޤ~ry:y|r YM"cEUnF"׵]LsoJɨ'|$[ ;}Ag=?~ZAvÕD AWiv/녣/pVDBt.Zf/۴Uq=9*$Œ):t4o'vW тt!qyxyXPޗr/^:Gȃ<J4uiMHzQ>{4EiVqDVDIF{s< o  șnI^s;֑!'NgŽ2-T[8O19ɯ3=t^C+Q t^fæAANH8GGmbSf7Dl9hO! ^or!4 Y*X->:cR$׶c$Z^R` kdYt8,\+֑ <<Y?v]lHI|#%PJ6c%2NAmQaZr(02 }$yXK) ~+^ =S<%!ɧIJ L|7^< P(.haS=7-]vwϫYwqȯM P[妧pFc<(j+2(s,KMc7܊AX =}P4ym7XNw: _vXE݈m߮B ZDuǸfL4ۤKΚ6aad f -c ՁVJBrMEHm] .f4ﵞ$*\A"1Z30֬KwH>1'mn<^$o3lMLdy5td_ Hvp94ԁ'w3ŭ*˞%l]WHc` (j6[k%e$EVϙL[&~@ k;p!Fj:%u[7;F F<MYEB(d^BN17)NFu5'ؐ$}B C3_5 QЉOHKC>SD=O>Yl`![ 9trFJ9 أ@ ; *W7x볖fT$GmM:?ѱhRTw?E.A%O*Dhn#+Jd;՚sjſ7 o'!^S%OqB+g|Qeuul=$XYpؤv276^ ILtؔ4 8X)cS ^$^q3LaaU?J'%2,y4Wš}V 22jHGdG;6*.moTlBXa4K99wxǖG[j7'ԫۜ'MMI×bq 9JNILirE֥Iڝ!FԤɊ Ɲ%A@%*𪿁O CH0#!D[ޢ *|*@\,ҕ.؀:C=58oa3eۋ7wa6r@9;tGrCԱ/ ŔFL4Vbq/L8ɸ?yxmՇp@4'mSpݘV/8Z.n8${gM80W)JaR$CXqD g;GTXsO.^+cIJkvя |DŰ RkTh)M}&| L?+0##&Y0U_M-1Of'_msqc*=ϛcF+ bu*s+*UsP߂9e;Qvf 2HtT@MIpoNsucaaL֎2Zh+NUx fHXe5xk:MX/ >iy\!%D͊!bg7|<,| 4ΦܿިnJ !^\莴^b}/u ٩=|9#FGC*dj."p`=1 AjX%ҵT1Z|DEV"%E~eNyJȺ ~,M '$Ez:")~(n/`bzv@,6nwY)*u-uiUׂP4XRd7٘يoq\"(ĥ~~z=clX&%҂7>d@?7$dE- g1Bgz_'yI eX(~GDDD.9G<)1JGf`.PQj6Oc\udGOE%̓$wupuf'\mig.|ԡ?e!]=gn^lsq'p`fsvwD? +ǰLMƞi5R[|ݏL:8arNɨ=WMv'T~f}$Be<<,Ͼc;N+6Ο;b1_GOI5$JɾhP_A 7zo^}B8HReS%zqZÅXP(i8Zм&yQ 3 ܅)t' &lXbII_Ogf׵jk+m6P_~ǣT AԞp0o+߳MKD%>'LF3| V̷ M NIT5Dz$Z)kJ*.bxbԲ§lොqzL:ΈI34gtG'M?qNl\K$ObeoHnGrT Lܶ]B7FRꖄI>?$ ʜY> SѶLmig±E1ݐPvẢ͚pOLf@C$Cʢ9ʰP r+7 xb1eIaD!`a~dץB3j *Ǖ;dy!MNG%,odЌEHysDIWa^Y?q/0L#?F\9i&CG Mm9JYeanz6ZηyѹjB*20\[>9S)tմr =\ܺ\}l2%(H4/{w;?xύZ{{!F4З⡷,G\Ee(^XGnG[95sРvca}ABڲR9){קE9N{$A+jd/'_K8id9I7Ҵ`vs]vprV_i?>TEC>6ԯ n{2tVaGvK:#s)5"=D[webwT!Qmg0{ x;>9F9*z<[ƿD5qWApwݴI$\WaWQ$24jPs{&>>L=54cF2k 3ٳw1ZȀf6aDҥG-ceZN.~b8Q~y8k*eu3`M ,f<LAMѡEI?JYRɤ2isf.bAғh7JYUz#S^e-lѿBX 7|U\X5}dC;й:;Mr?>A׆6^Һ:rӺQjw8G2H!/ Pڢ;kiA7]xC#[ oQs[4An(*`^ =+q^QqE zM7=ۂjѣhhoW."R#e0=#\WMWXqv Z!wq3;o,8:\@M.T&K'9w-`W K8/̷L`_SE ͵f?Bh(m49#Le6RDXke4TderX0X yů4xKL'*'~6O׊!|h3R$c>``_Oďm^`lj,AtVz>}~$41׈#uNw /a@/.edHOJ\+0JQby_$$SբGI׹UfL4V[.XdYOZl5:J W\qk*sػiDBUd,~~h/faxvhIy(y84ak+Hwx ,W1UܡlBE*4kxu`N&MڧXki$wJAw\gseSa^ uԷ) Ft6GVvQhE٪M 2uY$g.!FI⪰]m3)o+.y=vQ/SRHfYñ]Z6Ȁ=8mD=<]4[RvOdi:b_4 WsE4qW38o3АG(-)mMl0V}a!@B ^@7bgm 5ePS)`$d^A:b(|'+d{ulTẙlDent/ELB) \$3!MéZF\Vz궴=dXT ?J>LWG>r\_kWb#gr é%J xBW8 bOH&'OTt(x'N;i%m5 1&䍰f81 "=%\ĝg׹(2yuYN|*hrk~m@$Y s(Rմx+)Isݒcu] oȩBЗ!~Ǵ꭭Xʽ4^\k fJҁ %ZD.Rhk Ңw EP a&O#2 6xxU. B@x5'xsJ R$w4Kw*Ҳ*}vm-2KRh`/A)gE9Q+~ +HPh}("}Lfx~ ETHL:!6~ Gg!.X\T(I8ae!qLpJ@r+aA]vnxȮ&u" 6z{o`4oTcX8Ծk+AG5^tcGqwqгG ]jbR A:O 5(qB5gD#j-ڳ!<1&\+iݗ,eycl2 COFx6xY2>Ц3((c1Kwi{,9YGF|8W)K rk5 5–H#MdP$]9͌ǾGnٵU-S}n)%vJXZ ء9VkX \Vމ֍q 4־md}EL*TY5mcLٔ@3i og Y`f~{`.?gtW{';y M7)A]6>=OYw\7OB/#WWOqTGL BsSoPּ4`xiK6ҳWRn]ݴ-s* ~insBg[>*mO83tF4e6w1-hfM\4' @Q@?e8) iaxZ,s ;84LI;y߾HFRlo:o:zsTC_q1('0O^Idv蕘Q|ϥ\9*~a ORɳ  esׄ i}{wLEzHC˄O֪r|ΙKahW,Ro$m:k:˅QA*o NbivCB4Ub_rKށA]DcɈ,,:an)3KJV8*A鬁gcW{azj,1؅ӞM{eB>A7`\`xأ!vhu2&EiY:LÞ`Z`ݳt}ݯt]xA#79WV"2Y>^!YFM RVcDq<â.nFc8}u_Ov PHV?Zy];Asrs Y9}\ QJ3ΰ/\hnwn$?Odw-۬,C(,_j ^G-U:y)U+1zħAQ3=uŅ iSጓa'"Y& lm6MK_;rȺUj0vA{F$-Ƣr†O&+.P6^_Dl bkⅼBss*%LbM!d\-6ֹƀȑ(Z|@cZm,Uyr.gsbc2\A7'r2 H, WS~qvHB)Wqne0m ,0܁ۄQ{7VPRQq2l׋n&AaO is1~PM>pdWl@ EToJDLKg6!_*R`[6FcNF#t{fޱ9Ɣ%QjP]m9([L51!&XLFk"3X3x4"m Vڔ|>Wzɝz&ȟG,[!R#LT$2|ߗŒUPrGڇI9Z7!=A~[tPb݄#<ǿ+BC saϞb&vH!`i\m’+/'<bt_t4TAJt%t"F=`(p;$HkW9u3j|`NI ́MCѝ=B}^vdXV!a!*Z%8Y&[H#n l1)wˈ5j1h[4JS&"D, J1r#a/[ǽl?˩cӛJܫ Lrn'%' d97ħ*\;Mh\V>,(!-1e–T3%h׽yt+ xֹ=4X1ʌIx!;Iy1 qd'~#3}siN@}p"6Ϡgm[/KOѢ$ ѝ6SRcF<}$s~ Zu+~HBC3jDnԵ\ S{2)i\!n>QZ2Hp(rɤwL YF"˃ƃm$7ONR+=sMCWEQ|VY2-.[W֫[/&lJMMWi@޿$3'qQ;rhfDu@P?0\:`3v nMlgKD2ۺd a<|cux.7H6^s(H_>"׬7|nwѕ,iܷ|U0#: ӃᲠ tx70ݧ )k:10{q}u %s Z1s79 3*"S&f],<8GDž\@{{yOV@,Og&eu+ćr\5V? Ў-*cq6 A\ߨĒlh `B(^Pihof0_,Bκ"OG', xy޵Lͤ|?*npT9C`4~ћckl!0$*^b=%j!BP4M{x#U~Ufԝ:)4 @#+&") ,3'vʌPr!Hb WL+*C 9mhᲅJqVRvh8^>E[>RpR Ǣu&WO]3 ~A.ڟ M۞qkROH;:|hK-Ig{L3!<ʄ !.c$J[PT ,H7Z dHX E*MC0 TVBqMOp(>1߷Yx\@6Y'3)W1~\QPu޸cDa~>zCHbUAkF9UU1:>ey-3*ڋx7c~4:˜P@YeONlNf%}fޔ>mCRTǶ Dk{ .Hy+Z hU 8ԑH-RTAIUeVE+TJݟI&Lr:28v:clo74,m9}'G8f 9IthufP)qLE$Tߣ'RVb1߰H)byU&c$V.<O\Xa"HZY*=֊FGq%$R~܇/QSZJ*)yMڂ^4:MO%kA& 8x7ʲ,+njO$DBSQlog=NT'Pn3S7g_όtJrE0>ڰR]PUb8du,T({'V(}?M| @ŭjZG*[NRqS8B 6R щWWWat6xE5\ﺢR_\6U.&de ]'l ,)ue}h^(& ㅴ[Ī#LAs{ÅHDK۩ki êH4='NH^f"ء'4a þ01v!3S%9lV.]0g Rx_B32BUN7綴M3ߒѴrVψqav"͜"~(䧃MBQ,K@<ċx]bʝNVԹoL9& kqi/_@yLub)N+f4Rd}Kz y`CVr#ðItC8¨2L &K Nd +!DSd6Cu>J\C"GvNSøw$]o4@,F`dd%>N56y~3Q'Ǔ }C a 93 lՏSB+y*A^cC`ۖ޾!O=+g `V]!rq!w.gS/i,+ P®(uN9cˆf:(|B"wck2[v{ӗ r&xD֞d@AO^: dpٶMf #LYܱIMX{: bT ;l17 c޺Rӑu9I`}&;M^;˷Q#~q8* a7}?Xb~G NJ[j1-7e‘ sA"d-~.ڳF Θkher+8CBEv4_ `l [}\boT" 3eIKMF44E5F}Y Q)]I٤՝[={WCGN|+2<ʽ~b!8&WNC`ZxtPtZT2>$7|d2Ρbu{"AA) hmg:G1W%S6gnm3J+T"f õ:]k]ԧHR^txbس%A`pSx&t6߬I8834T9`ܑkב[PP5ءP1CE.}9$Һ)I&8F`F.c838TQ)*jg]T"z,uWF hy9%glgC4 Ӥ4ѦBtDE]38,ǐBf7B Xd)$; zYu m?sm\;ugOg3z,o+NK2RIF3aل|kwe ߶ԗA4S,S7^*˕1RXAPpׁammtfU.)4!\[+21i%m}aU?r6(lgk|+ +0++BCH10$ǎv_] n >-Q0Y2GL;܀t_]H߆$ByM:wc챬9DީB yHf'P'ugc!GQ(K'ުiaF+{XV̘nRцilDRD8BĜ5j*vc; nK&vv7!e-@0=yێj1ߩrįE463PEW)i4ә樒&E( 4?rE8NG!fWQ2jsC^hTDh e3(@wYՠF3czaZnvJ &؆4`q'fn#&&u2 $ f 3_;%Bva@9;ՌT'4b^ K]m/;d"]7(ۑʁ3]V%T@Nd@?bpZeŒB3H>eq#P+gk\iE T9SQ94>›>F^29%сk/wvk^%Z#Ze$O ?t=*KhS\qb_"3s 9!nv [LuWWSwǛDwnQK֪2O8U9)Ϙ .0I%P!o:LHgh{;8<0M+J"^7QKRrWsj;Ï'+\hAzt.Z xzPQ# x'UnӕCAjV \rp9N0`>156.iw=RGԴ82!x&:h65yI} XԿ_ij`Gxc< I,?h)WU [o0UϑR3#> H|sעI VTq#ڠi'(\ڷSG22HuWꫧ`zZ@InF4DvݯD"|8IQ=L0%RV`wJ?ޑȅP(76ef?(M p!~0~Kuhi G[Oa=pYG)B<7 V Ccz- 'tuY5. Ewr~SW|Gel|,m>ʥ3pb\i<W⃶c #1Voz0 9jp ^y %hkZ稓BC0 Wgw3沓c#wUgDX0JaC}ph!%0vv p!E3^O[sG>LStcUhGX-:|#W&k/@mO˱i9Bp_5 8.u ts+wn4 A4=RSuh- 0:J ֲes)!V?Gd8 KvX\[xVYl}q..cNEnfYP+>{GLJߺ*LOD&~{]_P1 ]6<'ψ*I* >,ڃ_mR$NȍXƨ[!R70T]| 1 |OΓQ2mny8+M<*{cq.ߔN}~JTNe<ȎPx'l@"j ?G? A 8-FHP>URˑKNxVD!| 6\ĉ8Y_947EW*Ay#wc;G4 |@ ۛ(ټ-5A+{4&ۇ1nd$uuC [lxCo8l)c\x֯ZOYuDv8`TݓlB$-49 3u$b -V`>!=[+'ٓ%Vy@G)5hjMgs8fM>&=h^A76 YOUcrss± p*T1Q#d5?Updb+2>8G㹌bp+ޑ=Cb|۾g3I:_-޸ng‹m,w0X_`3=U׻D=˥=]qm>]ߴL;偫7Tb#P>luhq$=!Q$P=+PF +u][̽RѾvN{76xlH]PBEƗ0)aHz=zU{\,~hztzS%Fbt@Nr4 E7|[>~BpL0Ⱦ@,[:|!9#~rpEUO5U@PVJ8U (BIr`:hGNsG@S~ ~TNqZt2ݽ-SyJ=2 8QTvD˒_s%ي{p[א0g5N.W%$]F2c6IvM*`*7&1!e"DwLz؝uRX=ښxYMrYnIQz4+5)b2MTek?A?w>gTbY?{O)lgEEr0`4RJ*M;BL-Gyт4'vD\.ZGI},&E~14֍7 ;L %S"mȿp5ɮ(o9WDzgr1ݴ؁^Vh)4_. h~6f\no4PhW〘Ƨ wh@]#u/@XCV7Yբ}*E!®'UDyQf3wcq{h &@_!j&s`, m*y\w8:䒬q۔kma'PW| |ŀr#c:R0WV)][V`toxˇ JDvXK+|z d+x?x5){>1o2N10N"}}Yϒ*o Y[*lgJ\<ux BTͳ}x6"x,^y+IWJ64 <;~E/EKF=)Ywn9K{  e s|0/ }V.xx]@886 ѭ"C7"H濻HId $j(qgXwrr5든7'TɟS'cݗz$s_4r♯zԙHR  r&Anٿԛ%j~ÎQHca82+c .SX\} ȃ\oD r6I2_F su=f<(@2ײ.!?00,ȌfI $qY+~Tӊ;Mކt#v\Ghia^)/IuRV2So#d 缧kagי~UwjiiqnecM HJ ~#[8)S1YXSB?au.[mJo#JBMy:PΙ7WyGuBڪ5*[5 |#%^1!ۻ& 9kl}D##\n6EI>pl&&4_9>ďse_ƄƵj4 3V(JVݜ|d\H9\XBY%@I:%\VEyYh]b$nOW`M(6Hqe̚[^YS9X%¸/A&%"~-DgFhb-[-p{9ړ%+xU*xz8 - 3R;^kSx7MG9 VNe6ԝK +ȵOO^2dyVB\UiAi87}s7%t$\B?#7ǧggEK{!(>Hͥ &,˅6Jh/4uWX U hYV)ŸV`US6Px|GxeUJd47j"W2>r`S_DyDu(\G&+aJ3Ҹ >j]Z7lr)d{ q;pg:T bp:P}J[ ]CD+!.i@uœ'ғ:N!9r85R=sK%'lbLa+Ybz1'᜸AHRt'Z 8cdoƺu\k!* ޝe9i]{LJWmi--s%9,Mrz.=>-o'H9%!FYGl\%_7ᜡ˚V@ݺ)kT'w!/Se0K?"đ7RiR8cqC$+ly9I|P<닲Xs{ axr$AhOyNSdhx1T/gMD˗~Xz#Ϛ,{+IJpnUL! W:!ehHƣJOFʣ`<S ^Ybny>?Z XLlP싐QtxI#H:yx6}O&Ӊݔ@-9:q\юFm,HAg$d9{9 45DgN¬H@O~;6?܇a6X؆IC)}>$ppo{r$~!h)xYj3eQ<()kiڐL "-tF03I3#ZtIrnt',XB:T~,0 :ȉ19mXw 1 !8!84P?:]0[Yb:?udӟHô% JlR-$t-Gϫ5mb;6 w[iHO@oQQ`@f tLlTS|ظӬNFE71JYm9gAcĂ)ٚjsF$wbd2mKV#ퟓhʿ'!~6G4-+@@PXcfSXX s.Iesj8 a3IEQ؅g-q3:ף4!Zfs^oiԘmvI1f9,p{Y+?ms7nOJxg ETܠe7AtEq'2^ۡ[޾|Գ}7!Ap" 7N{̋am \reؘCw&^}Q+t{7Shei 7jK4ܕIQ3е8kNl/gԛ,)A KnUByVzR;h+}̧'8gύQIu]`roLx8F6+󞷊~Ɵ̉a74B: L|i͗ԉk [_0iKx^"̰&pNKƗEV<#dk6 ,],^z8BĝsQ"Ȱ2d,{,- EliI'3?*aF}k="BB5aVP"Z@!zrEkpEO^<St{)E ؽ @7K>wRlQM'ht9z.5F &՜T!LxHB+ۀ mܻa/U_dA1?R ^T0YVl~jA@&^շJH6 M޸l\,1FhZYi|$<3X9\DZwܶ׾߂Yo3ZFs(DA *Ӄ=\4|Pu0m@- ωbP FEvbl3J%`?K8؊x֛5tRסĎhN> EFTsέ>X.B3/^XdaDuA+dwί/ttڃ;!n1qSwt7F/F7)[˧i H%HC@|tƸ;QdZ[_Qu#zJ]~\DCPi; tRa7FcK6΂A5W('O1JC=vZuZvezQscv5#3dbN@c[1uzLy͓YoZuoEf'4O@9RG8\ҳ}/1pS}%vm xY BĞYsx31G(oCC7qgPˍ©L4OVJ7:m}'."Mx )[u~fi=C̓SKDsrq4I=YGjlVzcIؼpdGn t%Wwrpl~M ;}E<֔*lBA&('pfp %Ǹa@iDȥ]t/0N~- n.Rc[t;f"{SM]?Aыrإ:m-mf_`DX,n΍ePC>nWA\CiCE %9XM\NEKa$Rz@S ;Q#1Sl@r(r>loKUKB6٨&` ͉͑6P~aमnuAXeQ~H˜hIUv%oVוF:4Z5HGW{rr?j9K0(uIkP$:# A,Vf-Cbb _}⸃s҉d@ңmWE~avAN ͠'ՖTU+ GtOq.Pml7TsH|R': h&vW29_%/c*{ !c,GeuwAZb*\G.eP)mHֆUHi޹wZ?}tJ-c3#`t+y|oZ TljCƳPfbƻT{J%NcCg/!ɘWBbmV1yY%ޚ97 t&=q.lF)K⾴J=IhI %z dE(2ow~|n&ǯ> 5[ԗʰfP`jpV Lm;y2;tݤstN8tjx- $C $@1s-3X/5Z48dv+R n,*O_*Ը? 碀j|=8FN‡_soý Mz9H^ 6Ѭ^oh5G5mC$aDA2;?bތ:J F2IȂ;`p;:k3be`L%~2:(4zrz.pQ`eǎ^ڜpЏ:;G b>jHěxe7\9%2Ub\аdX2v?jwZʧ`r}0exXf0hm#JtV2G:JbD67EצSܘT}_7Z)bjZ@&  ?Se<$zK8AF| cgD8+TEń[g®./ۥ{Nb7BqI?Ѕ! ʄ>݌s2^ɥ^;FSL\l 2k]Op@/3HNvRD|^4W\t&;K=1a:%6C $7m莞5뗆`byQ]_"X8I:JoljT;" V@1$"i W=TIFڎ9wwP,|ROJ;K,l94bp[fGciCZ}i~;N$²^o\Im#wa[+JUzz1tc5p1E6Ղ\&Y+12K`qmBǦ+#rvO N(3cM=ijGy3e)(1.̆(ŀ-2SyĈџ# iA3溆ſ>CH鑡b9c+փ 4{MIdB|Ul 65|!,9E1:z$/}ȗ"X iq06ƹx2K+ oQ}ɟ[ 4K!=[-$#Ҡsy@{HO7# ZzUxu饋5:=~Ern,sc(۳ͅp@H:̇e;B3~.jN(`R)IML:tE ퟝ6/"ےYN K^ZfxoJL,S|{Re]&(2sN eTulb.w8 (*Q &a GۙʓSDI<.-@MB4 TEFH%&?kҿ4t>@cåvi>)_%%alTݣWFCtJi~gG*TTVa&7XEr5h7 k, (ӡh{{WBw<ۢ0Z]t]|;(8|_>2/xNY+(BZL%en)r(A#ؔ9uA%ՎiqFI-~{t [vyM}\4 2s +VuTIa5q4x8(R03ya`g|l`\[SpAD6a'ҖmXt8*sEA.3VyEyp~Cax懮/(ʂ4& loZӈ]Q GjȄOAs) D<7q0Eb{pyZhN>$AyCgƾi߼"Jto3EɆ@}ޚ>&qp SHv'1g Y2YDC{#Vq3CH4M)bF3 hvVogVVf@ i&u~ &-AˎkfBnBnrmƣq/ yQ͹^obprB춫S֌i@GݎT ݏ1pi$r~j$!<# lbv{ %s REC>̘\n?KN͉x(A)BlR{l/ufT_lWXE.%"jӘY#f8ɵYf?/zEXK!l2S}4aĮÔƔgv>s0l,S7ܑ9kz2Pv[:=QCUJ0Ge[ hF9P9Sz2P&6!B!BgIIs@J5X߮ }œA) UX޵>$j$}e#jh&f ArdUFHQx!vNv&}Aj 1nE甎t+ vaimhŢ;U |\opہɳ(ۡb_@ނh MrvG?#m'c\b[Xy[Ld9[˙?; ]ΝWՎA{ O#ˬoJh^AMAzS梻B$>92I)WE4`|{[0w LT-˒X $p65j vA:= Hȵ fq(?rB8`wqbRycpgemna]J̮16{vxNy}3^B+V"t Mj3t*jUҒ.ZECQueuwo%:8}+wdGz]d ԑw hgeKg~=mCtբwi "v\5"vǔb|k6;PϕHP|_^ p?/-aƌ)zi⺫?MJDLdqQ9WA^ g 8 ,"$oaDNaTR8Zʠ 70ʕA]C{ 5 ABF#KVwQη%Efl3#_*ܪ4!Rh_|uv+V}lYw>2w8 R js^>F"Cv--ǔ702y]^}5E-M%@MY$T![]PLX/$2DvEdLP6NhPIO0Rg"W|rTA'nhH\>_R]jL mxDŽzКh̷[ ܴ۽lb('j <'gEQH+{X/3xpAXUe_@yugGnU <=x $e /R6++Asb=fۭ/+]V!69^.| [ZH|\K'I (4fIҤ6nV D#k I-f{_"~IoJs%X 'V,"RUDoFqauЉNT &Tzn °1cD-d`AzÙ&M T ^؞PIb~'t5}*_ #9j 'TYOBNKzø]E# UD%^2Nu%ʤ_6<y';P"x]@'OzsLvWx~4_-51\l)5 (85 B$5Zs| xK2 su!N Np]Qpe5y,MtY :Y͖V@6,|UJV yyk!j"e޻+TcsBj ů; lN˳QkE V`84+Y X >;%I_i{Wϐ}{;3|bC/U1ԉmJݟgD;&8,LC0ת/(K^b8vrKRK&]1;nE7A\!.0GV%ל74.h+mQӲ 0m"j_:'T*-=I߄4NnW7q:2,qfdF}Qe M. H2쎅B͏j"-P:]PD gU4ZT%sdk=~6U'\OR,j_ D w]%Ȱ7t&*{/,b րWV^?`D QT"l}[lӁR'wc灥uGR)Ppm̌uM&9 SV# Dxq{E1U^Y͋[b?<$ajH*}́'+3U9rTUsצ34a6ܪKap8b]&[݈,pu$m쳋CnXwyqC˗I* ?ODsnQ MK.9e>d< ,ezn,#y5TZRNA-%2J?>4p /f^O ϕE<ΟG;60bsH ԸG4D\!!(x^(ki t]fu ܓG'N= JT8eD}-}*ͱ]|GLzx B^XEJ:KW߳wkLV6LRe,0;~SNaLWՈf܄{)3c)0bysi LdD>`P?t.ůF%%k+p8Th5;1 @d)gLe䠨Lf2Xgvi@6w1왞*wni!M7(b_hS?P S5n+A$Q`;ojc2MXv}T;(Ue+uohk,Gy>jhpQe-b@8^N]ІYm˸(x<p&[N_RY NXbYX}N9/>,l6xhJ(U 2>c^F ײK}Q峧ʂ-.9Oj[{$]?i,:J` aHH27uq!UϺy|u.UbBa{ԛ wJD :M9krr` 1b׋@y :l!j 5W] o:n}gay2x.) S4WY9[].x UژHwE.%'hUlm&Zduˆ ov zFWT'WmuY ;x@\=ZO j+[ynɡa\Up-utǫ?ӣ 7ٵъ&\m6笪 ܰf$1 XN'3P^VIu#8d>ҹdj2{0igiGG2q ^zj_$qH!>*~ 4]f(owAaưYZF4_y$Šs}ƣP|1`|- Jaǩ%"ʥWM gl765u PK9@g}b7 %])>~fS5vB -9iئL\6obټmOH%(0J!;} 7?5#ݸ@qn?N.F'H`9 #E%f2s(MKa wNV@RC #}},=S/) Xe!YXpMК`V]$q_WFi~I ʹ #Y#21Nί;|yUWFŲԹ(Nљ`b]rTGGSs/bRh$f5ߥG:T5NˉqI }zGnUﳲW*'& 3Sko֍xc֏NO_ RC+*3ű"TGm>}k{_VOTѽGDTuTvrb1;&[RE7Ud@&vcI)lrk[ u #lke,VET9x 39yaJF96ux׊0}s见`YC 0pL=S>QJպkjT*L#*p;uPS^T Ι| 3a].Y;Qp׉-dFܮzg=cs$׽R$2NѮgi4HyJ^Urx() 膹gfZB<  1w;[:yN$0މ gꦎ Qy\ \V< DZ /| iԠ$XVErW/Gy{І ;Y^wY\~fMnj w)B>)o_Ñ+e|fN7VR?؈i?9fFh΀ JE'#fI alPN~ SZ9B‡1PT58gAS%,Yb)d2B!G{5}feHWCAx0¿M/P"ʽ"T 2 [of q* Gmv_JrVWS6s_@u7)]cLNM,vZHa4*eufXurJݮ`/.jrfLUUaq}4K>  ./Ť__ Wvi"<}#,\S:x!b*! Ўy70̚A w>Q>q+,PvgW%l׍VQʂ}@Cec#kU!TDTOnO)Bx vtVn>=>i,~hQ5n+jRE+\ohF Bﶎ)%}*৿ĪkSzU˲U[ 1n KƓ[ oArzIhE-wێP]1⏈p>j ~kW=-$"='Sq+w&S@ZD>ETN>I=BӷX2dL&?`yPdqgۅBPzLKA+.h.lY74nj&q+}#ETF{@0#7sc. -f5ʓĄI6+oLl"1h@@^tjSș T_`=[$Gvන1ZY%t֗9pgebjb,W9fQ7X{%/hrF0XkhJbas9!@RZnuxd>C2-srP"I&,^g]%UeI(Sc4O+ Ow}o GLZǖ* `O=Czil{g-~k,JYY*r &Zq0 )}OQуl0sR b\z}3/AsnH9_^ӡb -@LZtͶP^ e\^r4ʥ=Aʩ!¢-#/>OGܖ.ń8T򁽛fcxdD+N0K#Q[]`v,2:^SJT'8 $sl%t""=%L擜FKKP} `,12V7LBZq7*c-@Rg) oIc=ޥ$Ǯ>HdS ߎ6EGX6ho#@~(?.ʛI)x* :xZZř"M[Sx_q i($pQ &dIb (ttJ,&Xk%#xn.Ӗ|2-Zp׫ᯝ D8K=%y 9YĄ oӷ\F͒ҢL#X\hw(=QV}:q󱐓:&*pI5c9NdH5yF3F.<ҵ!~Y[ awܓa@+/_2\sE̛Bx#g-oWTb#gb_-wK>g(6(5$!m/\)mY T6T'[֟alP!I7tW.p +j1 p'4}j 6})R*lJQ嫇XAuu~CF)5@l@ztCq+ Ees쇈fIn ܖ:7TQ%+˔bqT S^b⼞[|z;chFmt0ɱYXd{1}}u/EAH.yH$GpiċTS&S;eNsgs 7Xn8.Q;gLmt vq>T|U<'qURYb&5v zfMe6h0fHsFrI/6lp"H7 ʡ+fGQzU%ı mvlIvD'ƯH+xAXܖK%NTX_~ܤ?` aQ07H,a5gB>`hnLsL*$ٮi@Rz2%㮰aɲ~f>A> /)q2tWBRL&6"qc'bH)Vx8*,z+>uc$?͋J5WzWEVS:v‡5;Ysw4~fPNX ݻ,-M{Of|q\мUIF ^Ww}L>Y1w2A@}1[^1J!NeiRxly"!qV"sE}FFW5!`>NK3fj-cAN: jqj8dGvc[[ETJrG.W'4#Qx6DE$d, EnnS1{+$G-lP9lI/57mA}7`#Vb 6m`.-vg R(XF0,ொaY%xt<;^IxbiP$SYdE ZTYU܄w #`0O;Z3EKA_*_{/S]0^{~SNdѝщ ܒˡGAl[s{?_ڌs2d$jtf!`ˍ*QMp:{Bo|¹7 _ÕCu{( v{&sIST]$OK-Ae)SV\ p.S58gZLL*DhZe7G"cC;1q]JM'ׅ9M:;bcgPXfxw[ wV|gGM86)E~QE .RDqRS :#M --'Z6ȿumqpUT#,m| UؾvoE5?zEhiN#?>z[׹Gzխ^OɈd}ݵx[ﱖxFN^)U.@E|,>gH~?̒LeKťL#F Q/,yN!=O+XŃp{ѥmTLycQ=1i(bkn1I@=wE `,^BXB>n\7k/#D@ s%:%.D:v6O0̹`='QgQ]L'.e$ y +w2ێdQVEpA ~F=s>NzzlK3M`J@ }?h5YD3`kO-WJs&])Bf~xk3܅yas4G~@bڝhD @XIQfgF5rxys#DP޿pcoxc2A,cu`n1{h卢%$qA}^t][*ɱB;8+X(z#ZCB[5tqp6!|b*ha"Kc@SG- )JL2uJS4v4v +8HJI<9H*C鳹hZE GR6Șz%I1ǥdvp10og??FںzU\>Q5eI-,nv}LU@6͆s5Q꾅}R/uFi\} ׂ 8$ r~UPwr@)togncڄQBB12@5p[+C*8^.2Ha!|;-}9e> bJ57-ѥаrZ[ehP.5'-+ ,)k0~jLVOmq"ˑqbN{f]wH =Gsi8=d HtXML2吸';SD;TU0p>"p>NFIj_޺S$MqQ=}~ ?˅`TDjX lB/2_ H?x19Ph s:SgIoUBɽ$31(xq>1IvhyΎO">mPB0A 1oͩba°=(;i>>mN׏]8Z ` =ۘ7˝OհPϵk3 cz@t'g4;CEiPf@j}'{f%og|ؗ?K)e·v"&`8`µFڒC qkzeee]D|FR ϩM*?}QQv93MkO6ݛĚ7{^ht= 0J)qwr>VP#?1_$Xr./Ka@B Q~-f'; NJ-sBdaŅS,n5{Pq9YB [RKgUM3:{!CL<FY>LWD`Q~ݾJW9NZQqSpDq( ]D DZ #Kx5Pi;TՕgY2 r!Nx">!MR^U8`·+Vl,U=%hÑ]߬&]O*$yKիLW`Bn32 bYJ+[as ^m]_ꐾ'ͽ8eLKBFBx'RE,HH&)66@,kA䱇0d$Cy8EfDgW y~Xo2ː *ue*]vDi ;j B)0O^]ĜQj~[+K@67Y 2ݓ?}4L:'zEn28i]a!S>,@_z]bA8A\*C_@A*m3tc 6 } IUJA/]* F) T8(Dh=vzU2aO1sͯwjM4c&fA]+ǸVszx*;ȚSmI%/J8rP|oZI^t BI&n)7Daa}."' yo3mjj1cd |bxȒ3& [ Luݞ*i/A *BHׂeЧZ03ctZma$(yTg̣vKqXQ<9jމ4M]bTCDtF}aJPM}3( #o W Mۭ++Ί$Ĉƒ.[>5*E/S]-$E=`G߹*y9Κ; [î22ںfW!IZsUjqk-fHn1 a@p܊xuֵFyc V5RiS(5Y`FCB] :rP-[iXbTǢJG%qt>qߋp '( ?3d-7V53$s}_hF &=6ݤyƦncy):'vP+ZTXGF"m烧@.)Yy yESBD9"WvH%%k'p\X>J+;vaYⲞ s(zN#Q;m]adyN-͕h轺:(/Xd,,# HH4E*wpT-tۧ1dlEAw׹taDLI!ȗƼ+OQC!ݱBu1,hZϗ̧| E'Eʍ%zP oOugnCkVPcT:D]qgVv\߿7"A#Qҝ Q ,uU$csJ9.DSX0w1CC|nƷnzX$|_7NSZȜeR0z\+axk&.UV>V|8c[)0 TF9ုsvlv1kmrh.SoO\,0ӳC! \Sx1%7*;[i)Л^_// ijp =ʡ9D)<<8LBdQƥF+yc,遨?`Pշ歶t2.r")lE`0wd*NaUM"ju&SDB5jsTjOS:x*'b^57IfK3mP^n{s$=y.'.ѱ˼o"@%ڱҏˆەFV AO4Ts lyD>e5zے&NA2˓.p`^D}}@|bA{YJ}N#YP@T,qaA2tdb_+R|ƷgJ3?U${eK\qڔG p>`5n}_5ϑJZs;lr$AKKR :mG_D>"xK.Ǒ ]驜QBl*CўglQX??.qԊ DD4:~|I 0t"Hб,c<]cgvpv-"s{wxHs!Vl v؊c'#`n5Z >*QP&.싽HHo%P%G3ґN4TD{OyVaUlQ(ܦXu1xj<.s/O3 -!ف/ j`ntP$-0raz'ɪe>%u(Lwk3hC&ChM97NWl3hg"*m?#Md9Nwmԃ.,rk$ )\j^E;;]amHZS*0Vg<!hCLl~fe1^"kkd~{0iRH lCⴭ է_%57<9*-]K1G>P@{`7ЈJκ,]H @. W0B$s&]\"$J^})&o[ecKht-MGOSYd_ם䴟յs"zXO<3ؖп6$_vzћ;X2\ JhboE ݻ4l#m; ̬n>7};oGc.]p&5t^_?Ѿ庡Iv٘ 7ʝWl%@9ei 4NC(k6*C`F 4#[Ҙ43LŦ:P>p/7k|[`GtES>r}́*I]1T2ׇw'C0$w{+3 j/~@I}wfV[h􏐱|<b~Zx+bjsD<'z"-oyQS2Kc&vѸi"qK n-$Լ2@0a/fUyIϨ([4?Q9b RxTe:)mSv;jvEn-X/;ܹһ^/y"(1& W. R I-W0E"dvbĸ(kٖXi?sj& 7R,lIBzیLQPBhFVer.N`_9sMT&Q#̸^CKy#ESrL_u6FC9sv,PL%_bE\61T&X?!A,HW& &grNjrVjOPak .=Ț@%HU2n49hv >"*Rp'y3hK<"[Z&i-- &Lf6ѷ@AF%fb"9Z߫Citv_Hx7c (.+148~efwf#'q:Wj㟴=.ĀA@Nt:DShI8jMەDYnH0䃬qj_N.3Dž\0?;V4en-Z*ĩ"MI5zJ~Rнޘ?V J:q :~nv$d_cU-Ϥ6"S~ĂgHKI*!MBvAH@*e{H/_]8T<Z _E /0ã!<15<S ?`1)e orx(Ą>mo+ȈʓfH/;AT8l;"(fIh5Ɣ.4%2˶-<SaQ) [CiOHs~uz]/&JH/RgȏS.%,7[} |2`q >4S:ks4*Y6?HO.zIۺXbek65o$S;KD7X'Mgゾ=JA'UŽm2}Y4V$d+LߊXp*hߋI#?Cګv ֫UU? 4mlAx.:7w vX%b̑mD+3Fѷf6tQ*f )_6CQ5GĸhXFC>4'Mpi*TŻсR@Xfo3Wyf&Cz+N,qy%Y`Rnv7+Qx<9R4^Gc$fgհoFl"eޮhU0m:8jIp/rRQ &4p]HR+ij3 <ߡBnd`\P\uhcpDQ˶fgS~!eM-_m:FhnD{ϰˠQ"gt;TV1_sA9oYgIQ_#ʻI>YDʈV[Zg-l끔= d/,$BYEqXL(Pm~xl+k>%d'T9=;.x'0d5c^7i)nY<|*x7cx}!5)8>Z A@Ǘe{u]Wy89ts6[㧡G:Kװ ga5b$tcNnsl%WNbEkhYrr醙>lS"zcStJU0k+1- ^9;yסKF_ `|7Ot=ͽ$qxhg҉ם@' ?CI+-w]Ϙ%&z@p9I3g>..֛x<(.̪6] [E8(^^!MB`rl̺Q3) POߎ*V|)I%L7{Jm;*s6g+Hl6u+ğ+;]vYܧ78BWK!3F]렊S՘0;ޔ0Zk+&2F.QSVr |3T#Nb7d7 b=DWM4$z&=d#sC磸)ت7Bu:_c:|h&14-tkh!%KqFd(z7 '؁h-U,R<:|9=A’򧱮"5b􄷯$>#\bPO~_k,3)R.'ËR=h6}- QɚeGukq ’=H KobC\-Φ&Zm ZWB Ke<?Le%+BwX {jț)` uwM)Y3WrwPA8"`oBUF3̈egvw}s V e2s7:lzD;(zwй")?gQG}ڱ9xN Xs6D֐ -]r(%*]gŸƑď'[#Moj.6gWZH{];]2+HJuSd4l<,>끘a<%K@2v%0,KFc+  `R+^]_. xo(qieFpCji;t@ - ;MgZ)vZi|&lFk(4?&nE_$4f פʆK>c,߻]F9?4 XνuB+i%jQiMd:bjreT V*N츟*ƾ>dMQYM%mzDS9FK=O34vk|*Z %R1@M}-pbݰ[ nBTm $tcQM绸][]~ˉ2B9b3 1+ZzF}J} EBNeD:LFPb#xoH_ @Fvi= 4Y%99Ӱ=ഔRWKbuQAWmt~zKk-4{<ôo[1?Rz/BuJHqo?tE-Ž '%\Β04%Kh4L(*Nnb÷ϰM[\l7tp*PZ~B/<g̽g5Lqy94l =j$ DĞlWƱb^sD>Q1H$Cs;rU"dר } O,VII푴Rl}mGSy'0돑@#^I@zil1Jg0hʟ*KL4&\ЧƥGJ,GO5uϬwJك)jANraWYcޅz~@ H0wH@=| 9eGkl>TCJ9Lڃ [* S rR/y#E.ai,n8(6)CBphݛnP;{ݱ̌Q!9?]n5\d(n>j5r;b&v㕢n-v BrHZVkOD@. F27hO{#Ѝ;Ӫ(=Rx4[Lkۘ TfS;<ړs=,9Y5=z ~9wF8녘T} VzT*RU>=EtׂJ/4"/hj+zGnK019=11kLz1F2e NoH*dfҁZkn_VER.X#x.lM%0OZv&BPoXj3hl!qC]1P7%f$`2بbBkۘ>qzVHh/@KwTFLe)cAn3<6R&¶qj1}duEJw`Q x┍t <7l(P*?Uw йٲ`ɣ[@|zpstY)y*ȉc!|pUl\5Ԑ7ET^O<'6t9Q:?1$ *ˈec;&hCv}jQDvs:D?XX,X $_mcǜ@OiJQp*Lk(vmFF=)4U|gq(ݫطLWcZ|ɶqeg %&E [ZOV߻/YxVvZP!7[HB"f̷å 9dS+Sxk *In1j%O fR3mr%%O}iG%MBГc#A 0VIǑ<)i@}SU4ӔeDESK$0aԀ;7֫6x-Z-x)['u7o$5nZeW2#+C(̖sC1`>$O?S; m h6yEIw`/a L5)@ c$zf ]يA_B'G\#nEgy1بLKgipٹ<п1AE]fDg}ףh2sMnp_,,틙+#ԩ>s/mHNOg8`30d427$&%,sÛ.$Q_8.h`\z r'A`;䴕Vˈ; !RIP*c0?SD#Y玱#t@]U_-ę >H%kb4.52AȒ Kr-_n (46Spc*~ԣhƝ}兗S`A = 3?/)8)̝#`3n>lˋ>wS;MMp^F؇RI. >6$v܀'~ 4%= }DkDD<(dVjW9t &a]R|5vx,'[`OlaF:\_veA:^ji"l-؜gW|`ioup"EaQJpt1M),uE Jܶ ]R>K{EyTL4fw^ ^=9$i=p<~ ِ]#+Ns,S:}FG/1R~J nRt9i5;C/CB؇92[W|gڡs_ j5wTZA!7rrZhGv'|䖞vepVE?Ԋln6;lW ={λ|tgR4hs8Owe^u>utӡ@"MxTO_CcTMv8p6ڧaVU)hM6Rr &mn`j3X |8$jot惠 |-cWTs0%qB:gՀ4$I!H.T0[Ky%!JWbmqpTEAdURgպ3q)lO!܉-ˆV \e G>`)jqe{893{q&-(,s?180Y{;vap3A}qa9eFƌ))?Q /zf$u밠(F@mv]:wH16=AzG!W]n-ŬE8}O{xӀ4K49'2o+~<5U/lҼh hfQ*˔ !5*6(ulP&%Ke2$#=uj|ӈ}QCBϊ:EĊϫY*P9q {€SCsF,jp/ ֕}6f Nǁջ}|-]/XdoXr|z ygB<R#%\sVͩx#zpBS!)UjKc;g)ť~䖖.N)$LMW*Cu~K4᭄p·OG+ա"+C1ix;-<3 X]+RmG]02OoͿEeCɮCy#i)tžwa<˿&89W^@h<^˚Ʌn.%yUr-one`$O/ùv&q^+F,P^FuHAkD8Ap߅UtVIAIwQCa%`2jQAd%RW}i,D5Og[K~z~a*NhUlQX4;5+1\c\X Nz$Xm1 $0 IUAѥZB9Z+ZZB,7jx2!q`!o8)" "kVcOQs1n?<B,R oZz5) SQ=AߦsoK8=v?<8p5-i稽A|Ny3B!dCÆbh|/>Xƾ{Mh=zx>"_0.S*owLfcd4e˜/-v``5:TAh7_ӣc} f~ؕ288yܜ~;Ll8Js=ҔlWM =BhI+Yӻ>:ZvkCMhƗd1 #tj.[ăf-gy׊5R#=k_ QrO ,М7/ƽ߳]s2ц#YW -SY4s lgp{|5a5.29dyLC\cɑiӃ.] g8QX "1 5Y 0++]@gQ3n,-.MyHJ>a1{A Sji)^m}k_9IyE}-O(tc*.uAs#v A#ʚx%Џb{ )̛C7L|.w2ܲao ]m'tIg% ÷d$!&k!q8 Om &TT`~X=;;0Am <%iSTmb~GkfdBfEg }Df闆۹SG4y>lQMqEH! ia)\oО]#܅uz1?U0&1}= E~0 Xwc ObE|RZĉ{K?{QNϡ.+2d7DBMTrَxFϽa1d*45c},PSrнza`tRD;|`^NfRƕ/:t ;I Ԫ:Y4Ӵ  f44*TП{Ci"輸s2Yу. QXW௳p*Pz&x"Mg8<R4?K!p`TDyWh0{sE_Ђs4!zU7L}8G8vNy\n^ufl+_Um_W鱧QpP4;A8qrVXoKĦYo'DKyH;B@%.tLWL_ehC{D ʺ~`=1N!q1͡\+|)L~a>i|a>e J6sTQ&DXVV<4_>Si-N^8"9˙'0x|=ޑeG"bdݟ;-؄74>AhvGi6 \dz[rkŪbcu:3IOe /5w|L=!Y  '5 lxn sI2 NZeb%{x\qc؂|F 8Oz%Vi%.)St2_$8-}1~<ݛ&EރīG Iv=f̻\uv/ FwL7INM: vAA+k1W"^=ÎC6"_ri NGCNA&j?YRE`\/nͷvuub Pva\qF)s]i'~g2ģ1L7̫&wAH2:EG kT)Vۻ T.ڿ]Rcf6EVCܦ͓Y5" ,aRPۈ4G`ذ&6M\(?hxcXy67RB{q2o+{n([2bXAEIAV);Z86)FHzf;Ciϯ^]Yɸ6#o7 ־gLd`dcH˱N4pSaqp*͉-&Ҋ7d:QLXz)XAך*ܺ|-o,l9{7Q_p6K`[*GgRp4j`R;VK/b/r%=x =F/R[)V,B@g OU$=U|D 37#7~ t6/%$˿0!o@&lnR/q&`ZjK+۹٠ a> *]|:)J<-ЃZ 4F-HP S&\:kHÇt3v_У>iYEQJ= \VZr1Iˆ6@p0H;}]0-pϑqbp<yƸ5" {Ӕ~a(X6z~NK6@_IvkƕuA<&%E[uNMzMu: Su!ukϴ]4̶:stbLrJڣNr.͞{-N#/(d)k&򾺊&,z,$pr(e)Rc 1=jos%/]*Aa8oU50stxhɌܷ#q'ƛrX^Wq,;_R_eyiZ^':ZnJ{Ӧ*zG;u.fr4Ǧ#=V-󳶱au6(8S딆)5NZHJkZV%c^{LI@YiHf[o`~Ƽ BHH4?WCr"vjfv!4h !1 Adb-!cbxLT-{WG @.n$DPfS-*@=AQ\._1m F˕o j}ZQ予ϛ O3ShB vrceYv~c$.lAr ~HY7$ۓ'&yƣہBqKH*= X)|CG Z xHAzAaӉԣGL<巵󳵬gWB;{s&5raBC>\g ڝyL"nZ7,نd=0;rO5 CU`wCKFWn J5P pհ/5^<:9!N.Tgo"7bKy;$sg+) }Jш+1@?2t HTam(hE"Q&}kFew)aD׌ɺʒnfkmsyg 9?F^JDqa !+nt%nV _ktnƦ/ U+3iBu֔c鸐RrxXs~nğo}a3SVnmJ;!j.Ja7G*\~<ЄXl֮.hLc!Y}Hy :wx #^0V@g$}9%ýPJ}'򴾌H:Qg.uֲ=[816഑-H&Lq!R S`\8}Tɝo` $nD2BƏ7UP֍ص_$Y%_s ~?ݛ{SS&g3`lh[oƸC8ƭx7!%kIB80U6mRf_iU H R%$Wǯ@E0oBow^ܞ &| d0,| t5.$;ZG\5KZV߂[0TޖZٚjRR̦`ژV4+$}B^ |rlC؈vV*lUP^ӪEy xNLKF@"ALOÈs$}pp*aM)O̶ H;BܲEF EץI~h$M"߄p&UųDzd~ jFhwKW~dAO4 cQ Y-!Q#%kH!_ (T`pL~[JqGPVY-j)"4&|*24h?Ƅfh/EMNmzS|`##ovP|Wh~_6E[o-QBݯZmÄy-B#3|4;4q[%uƺ -ѺFɭyS{4w} VN!Pbza֨ZޅNkPhc5?Fʦ /g>EZe(ҊشLQF㿈T%ՋA%'^f}&{?qR+1*r?pٲB脴HqJpQex,k{WPz~ɢ~*:PϿU.2/*tJ<.q`75L2 ?(]e 2 ;&vDDM︵`DE/f z}nՋX|F݌SdK CPM_؈EV^#1=c>Dž]U. EP)0o, b~B;cLs̠jlh;єw۳2 vEsՁU2cKsA(Vr?==kmTתl=/0"S7]O?ft>ުRtYdW D#OJȘL#*j6;m7%Wc1QQj}"൛ ]I_K0+qFsQ_OIXem"Unff=*a D41g9/_` lwt嚣"S̢& i"&Զbc9>̿r22xX@ƪpX%Ds'CuTH[-QM6/Kjf*  Y<fuXiLlJ ᆩs\ƆÀ]cdX'' k-JQYXk2Ih* ,Tw"ffzzڷ')JÌe[}R+P@eA> #hf)%A%>A|R t;χq>oR}'(Zs ~zۭ9nW2>|r݆^e{6 `Tϙor!ؕ$#hvc@8; A6E,A({_{c-. MϚrXgYH|Je`,λH u]#>lL'sTLA@A}W 4R-3'ԠSPyf4٘3o; Uԡ"G٭߀&b= PKihɀPX8ޙ8 tRa PbtWvQ@|X| l,=gANJ,𥲳nj9s\} |#) 1LwG8OS_voGTLyadԆMvϨYc!LLW} 1I;j:S4j/w>9:`{;,ymg1DhYs~[u.HDÑU<@BN #/-sL( w`eW8rp>AvfuJ{9DT,OΌ99|YCx P?` /Ҁ kۂ}V3m/\-_6HqfeWDiKs>ME+US5-ŤL~MiJwJNт%!~'k|l`K9j8Hl?whG.T/Ζ[#kM[~+( v˨w^KS"'^C$١-1v3yO&#ٔMpB9ء:]~dowEC^>wtR]JbWz- )Y<&Dffv YDaDc|1F.ɽQ?7"\"@>ٍɂsz+a.?kl߾JLLy۪bɐ3>"RvjFk{$60Z;tdU.b⤗'tx/rD +Sٶ~يN`Ĕ>li{d~ʚ#4_,M3EU$0dj,hmw҂jx~KJՄ?Ϩ /1I&kjo5Yx"v"֙d}HB\뎸 DžEi"7!Ԑ1GqԡcL 6|@g\#%8muĽR5)ns9^)xj\H{ӓuyL,!(gÉReϙn>H'Le O_fa4VJ7E$y1Ӑ6XOkAJ>w[Wc({`WyQ W&ʊVfkRi+3g|s$PfVF}b$}!};GY/ .b{{7yFdkpdyC발ԥxTӻ򱞲fmvYf=~鷨bCk՝٦P'Bc%9<^gd9#*FրhY7hz]WӕcN-7gO&Opƙ8%bX7zFX^l(rW7X,$aoIn0w!{gß#23rM*P|x/bs,C$g T}(| aC3 ^*c%Jkv8x\vN*+iޙBgGֲ hᨬ0`u)c",fr /Z(e r)J E|K!9L> 7 /m8JaKnmߡ g4dYBP4/@6»e@>oޅr,ó`?qα]ZJf?>c]õ0L2\LC>;#!VRl[0*33dt+KQh8W£Q<>$m%LJ6 .&OMS3߮i1[nuN%IAĊ'Qc^>Ux@FᚳSt[S`#AlJ1/#EʬHR+,Ei~!WIu-'x\/|h%RȖtQAsRn'oE²6D$)|g{ ,泌{ A$|(gv6׿p\1KGz.&e䠒*?WCSRB/|1Ϡ7s_^UcCH!ϰM,Ĉh3R^E ȐQKhyGzi%37y-[᐀TP6/e}<}YXpBg"w)I/p~ŴJ6n KPSn!_pZx<"s']GGItNKйԇ?;uI&'5C5EjNTo~FMxĺe]SrRh :D1oe'S#UX@h[\Q<^ }j.ŲN ƻS yxImTX>J"?f֒hqh0$*Ѕ5aH-uX 8/tǝ 4ys&S(O9owlD]HȣH|qr~єB{-m} rRf=1m eb5UspcnP5ք_03]€j} K1[NF@Mlc\X%suu(k!xh]+ i#Hr/fqEQ6҃pW] @+ᚔn\n}2K ~Rӽa2A];RQ-OͽEaЃzBB*܅ A0yd1Xo֖7/)u(5!TeB{٦uff4a^w]^GNc zK%'MvJܵn \/vlWI?G3  AsЏ>L1'lDˊgE+oGդV(Xr>U1K=#@wU`"xnS4:^{5Hf82m, - .bkxuf&6`IN< g{|fhaAz1^qϪs/<6S#:wYhz A G^=X$Z0_at*}ZCB)'?_oZ <[xi? QtO` cIL^w &8EAB)bݦ[QՕ3Er[V7;߉\<SfSgOelW(s"qCz T8k ~\J q')6V ELfۿI BI)\Y ]QZ\O)_;/r=[΅@2/$p}7W+M(&')By7$ir#$d>aad5ri؂%%wy9W l2ug^_*sV+*:8;9ʶ s+T>|jiﰂ|FnNL͋Fw8"<Kď,ܹ3)‚z\ 37$NuFmռ+?;坻Io,Oz'Jڕ 1<{ȃ3MVMύyD; % N :E; Q5Df<v:tqV:VvayDt:2KZbh_M#btd8PR_XRpj'd\4L^#Mk 9pH6Hµ&ܦi \@L1QyF8nN,}{A6^IyY[ 6Esait0Tc$PHz A-i;ݤrbBleluaPHxk# }2zwHm?(lYwlhuZIJMh3NrZXea"zJ$ˊ!ǕyoONݽ]._٤yJ 8*{?gV5xE"Ƈq7 s0$zMi27@d%d@cvH\ݱ uSX&H-"5Zd?fah7˪4p_$NdkJ 9&,fp!:WyrыA۩0^"mooQ&\)oQHtb6QD+.B"&^& LaNqPS6 ^t+3"R1ǯNdP` ]DX4H)qT ͘sh<~4KfggpC8F8ɁMVӕ :py n@Iv` )xYLWlOC?\  ~<2KUṒxhn!bЗpVbSD:UEg_<5By5bSR(G/yj.뤖ڊZp i HRH1~A:S #b&y*j Zt@9#;ʂU~?\fl0]I (ރPٷ%H]vQ&8SٮY= PjJ9}@Ub, JVrid zaf5_n?{IBAs`3h!BDmU[K+KxcoKB4AV(qs1{$oMa5gO Z morcP{ڠ} ]∑Uܱ7V:HZR^ [j=ҭ榱5s:$~,^!RjVKT]sQRv5vIs5HW3𬠶yΕ,Bn*0~F" g7̆tƏJǭԕNu03wH>@/p;/1-lZ(؍֜`c'U.( gبɛ'{'I!-4Vz'p18ʤEárVʮJ8ҁ&$*GhpdhnՋ`tTLbm~i/e^ pij_Xyr%k2z.ƅa[t [W|8&Lx)< %I+NLzcR^6FԋxLy%JO[Sk=:),aG>򶆎j7fD$Mo/?p7F]'O\mcgbu82ӯ1\,j044H}P'woq1@^_;ciG" #&<_MFu,KN,a>^-Ś5@va,ڵT39FIpnVBKd(_. Y^4`3t(ALYU a2ASy<}/Za7ԋ}ugm~5&bY(.5}*R ,#Z^41UJaLXd4uth"u'wɼ6QE;uщ5FYDSo!,fm52Ci0@A[Ҭ+5BAWF:hD`p_*J1(VZe^Xwlx78%NdIԟ/^RZ}}Wt^y|#is␄4ɤ o[<=8؊>2w55ؐڼſ0=b 3/@`yq;'bq!,ɂt̿,L(ZAY{nf 2A5[Ǹ4Ž7ctTF[oJeq_(xMV(YOoEzWEUU.Û=y|R %xd1c:;Ғukl3y# <'6YWʇܧ{B+n ~/k vӭJ2mE@wL\'eA2F7iIt5h9tr=8K GiN2bnkl"&gn ҔfEûԤ@%q.3g4$MOF 9Q${LBwv7*BwwlR(e]/@ح/m= 9j΀"YS6,8+)aF:;?W=Y;";lqcP7GU^2r㈏4UN#\IwkGkSiIq7𭊷rOGP9N$ɓdQ Z=Hf*6|;(1SI5|=hg{]e>KmJ2_ʴZQi ijs?0k#Xvg}Bq'ԏ]!xvVk7fVoKcegS 0U=c!q  -v5ӳǷ¶"!'LͶk3\%$3'{GIݻ17-;J#I߷ ì$e#3jvQ>Q}YK+Kk΍Y'+h7"*7BN -8whJ_TYXIR[Iÿ-5_y%D3C1@77F{ɆĹMDK7yJy1:1nb~EN1~ǟf",oCi/b3.c͐;*qAz$P}qZןW@;(=Ms;rqrƞ)&Yh*u+Erb2ЯDo= {SGc9.w%[W@+%ـg *+]UUSL~:RֽQGھjaIm3J Jn _ԉ RyصbW9zr9:` ;TxV?UNrߋ!n:TCJ']t5j6i&~Qm Xc_ bW鶫c%9FZ|.h@-ww/̀v}aisba74;Hq3rN2qEzuaPIo~Ζ5 ּd[COMsD=em3}oTT3ݣ wlqQZ5.Ӣbs~_ Ip,[JMo_z9R4-w%1S4pS6B_A);`o3U{H򊛗~ :pswȨj eFy12)q7蟤FQA;t8A/zR 9C5Z `TV #Z$~%_~Ͳ-q3C:U0*T.f&HM6V,u8%>})jiw:qRi^# RGQAi!u>)fW,wJf6n,cF:CLm]u>j0 #HGC ; \]N$[Ta?K<2VUq1pqʝm>W w|<P^|Nz&pL9o$Wl`JЀA S{LC$\<1qiݧn _) P-m0a+j0bwp/ Gb81ǯ< :l6Mё˙kֵ*{EM1B̮ 1ڎ {cJ }f!ʧ8vZ*)Nś)IA)l@#'!fr! m㕑HNV_(g)T6񍐼z;ap3ؚ іZYKv a@2X%IcJBBגQNQ<7M1P_pIHt. _tᦿgXӦ#ȘЉ;+\ +&*JVdzqp"hvdn5:ي^<}$99&fx5?)m)<|g c6"38?icKT+[tyP Z)tA:IUV "=c׆tPo>6)151~M1O ,O!m(’*lƋqGn@) -~@b  ߏwفc30Sůk$]ˆC{>GR|xw,'So=n*HO佉&oh$V1pD@y}*eի}r~&s)8*B ݧ47=a8&eO0F}9 XM+aפDr1RMjFM\:_\?F=; u4j]W:gSMftCH1wYT+{rpwD1v Gnѫfm z;ЀPS.YVPU&H;T "?&߱g^{`taf>yNAd Q +[YW.%A\SRCr "4ioTUx=!'\'tci_)jޜQ%3VI .}?9:MmFwJ @Q%UKxgB+f[Je!&-UG];nNNMG9p-w.oMޗ%YNvQ W 2Ǯ Ew>{\,wQlCyLsճjOgs./aPk qw l+}|m +6#-X2Ok#3=:KnTx+ʳLaf|֫v,KTA0!}<)p_7|-]9H95Rb ۱QR!XimA%2EȈ-Nژ%v<_DcK1ij0A/R^w) %zDUn&jvy|I.NM U v{JWoA k闎5J6#JnR9ɱVL]ژ:a8AED(,9.Z]>i ^_G[P?39kȡ_(PHx1A-p@'x!$,'yjR:XS:=2Z/k/?NId-.SYqؽ)=k9[I{S\b R3V3:iiof[·X,*CBZt|)J\:%b͊+uC7Cr0'aNY;<rІA GmzrN/l *~z~\ح]r jMwXnԨcHi{SWX&EJp-'p$G9OeعO1^/IX0!6O0.wZZ̮ycjƦ ^8Gw$SУ@*m- NL`@#9aSɐdj@1CkQ^I?D7#AZ5u¾Y5XNme0l+F|Y V{f Z OqDӄ4GLK!7PrBK-J"=8}r8VedKw?fk(YH}e){RSɊfKP9D_i+V~aV_kaնК%0ëaD?78Vo#̻YQk{dG߅M<1ePogRWd0d>v7|^K l!q`WVf$)f,NG- ~I'du3Q Ss;meoU$5ˇR8P_E j;eO GBd<{+(Պ8eˍP訥NT,yt C[m)([v/ĀVs3ci{T8Pg0 *riF1d5t,ƒ&WWqWi~ˍPKH5ӑs!hƓzZrt%H絷=FRe,5|x[՞u͸[E HY-mMlNeFLEoqx{ܲfEE**Hz޳$r2Ty<> іV9H32:*3T<`hJi+Z:(|*Y0RU0=Dh}XU^2n|Vm#DE.$@0k#ImN7a,-NP 5:}:ȕJtriݱ[zNl+(?oYF,Ӽ"1t2 ʔ'W8eM?c0r,lY-v2+LSWBؚݓPDB4:r 88h rڼ|8Suj adSil2Ӿݵ`J>6^h{S{3]]2Ș,+dhXTvdO ʝBRr;x _ʆ֡#Kfƭ-R66M\ 7GQ9s tl(ƈ)s$#0ٖ%A:̀VsM(?QsBkPՕA@vJkqDvYVř "`V黐·CNU(Ar&Tŋxt*l@*u`;S|ψiol@ (+4һK+zɏ (A28Z'nFp6V4w% nQ`bV|ȿf;(Ú4\V^q*{O1HΨ5UF;HK,܋*u+Ag!H:R*/6C.Q7&*T37snHh zEΉfc%VȺ k R)ip t {jLNMocAt%aµ h~+vء6!":Z4tK(6X(`/oE{ q JZ@ȇR6; 9ѯU5Uu)[aM/d?,jC#atqE~U^F j(JCS1dPdLKm2 y3 vtS1Ҝ :^E:/VjKI31S9Nu!_q3dX7lW;RэR DYXpzqdfF&Nx#clMmŖmq:JĆߗd_P/Fs+r#VRsF9Jp͖lg|K.P4UKHt-nwfut6Kt> 7 r ᛇL 5vy_$H蠟w(}"VN:k( s1FϾOҫ `G(}3 n+t{o#:9ߏ-r7+q w+o6IW!& VuǤQN?S_ 71٪m@tE/s*Y&NUAH_pXrE ɿhΙd% 4j_{>(9ThT6!lߊ5u4R q}h?doȬnB9Qv+:W6i>THR,oZɃVm՞l/]l c"c$Jzat6ã gea"wZ L W#*CA9,!C o4Pf3vBLVe:6@MIeJ͇aDz"D'XFNVXF}?%ڰ,_쐝o׋FQcʗZ~։b_Q.ʖ+MG1xbQG1bgC.WǍ &Ϊ(ɣ o"C|2 L, ~~?{@)$^,? "4iXmSǝ aX9P 1[#^mU93do;Yx##["Ri+^x3z+C/4wߘ/ÔD#88%//fJc كvJ4ނVJ܊3$n!_/ SF[ӴǕZ'\]/S^௒h nMZdSu,:0C?qa> _7d&38UD仡e5%Vq`#*C2dpEQrrNF4JN(c#x1 juG+["zwLetVn5_!3a7y֋"[ ]٧@,[d fVV0`, mS۽2~ep⬆ ߹5|t^LS늤H8D6y]U(<^~3!0([2PuMw֚$;Nd|.8ZU0Hx-`VC·f,b)Ź$a"JCIv_1K2%@Y9+K]#5#گW^@ȑl(xزظ5%#P U2xB#mzN hؓ<;J6hr%cWU@-١mWGH0 6ƞ=BM! ΀NJe6K*= J'd!!@sZYٝoldM`g/wꇞ] *`hze$E\Xw됗bkpĖ8J5OSW aAxI%HHjӮy| oE"H,vt|}p*5FB)4,aF&ÿJZ.~ {)N37ʓ)13_kS9V*F,pS}sfBF%~zSԷR{ Pg?=u{JIC=*/]hcxضr?RiǪE؎ cLt8]8gKX&HһF ;M칽Ն@ a槯o51ͲAGBJV.CzN.\{&.JVjZ Q O4q7 9ru ycIpp&2FRY06ɰ`T:5#xA_aC>s"Bg1Κ-ˈ`Ƈf c[]#fgx2KH$&)p8vF.K8[gG4@hs hD* jW*235yeuB4 uXV˶A 123Xzѹqr@}"hfj-$!K SxMq^RMWhh&JE\=O yhM0kl0HVMP3T495߮CgNA+E@ ^C}IW [36Sw~6w{5EM狢 {T7Nu5LG`׶WY+#aM|8ę#ԸOd%E׸3>RYAy߭DL2y/% ,p#Vfդw@qr O l:>`1߆ _'䘸/C+mHmfP"x1f(Lo00|%*E*"du>tnK 9:He9~. h9jgUYdz]fivIHWcwot}`s""5+KaƄwWf¿؃!#V*\YwLh+ԇ\QNc0˯Q'ۨȃ7{1r>fwVbam^䢔/bKPN!r.4TL;A랜k_zF }ڷw~E6_xӔfR]6JoX}4_j^{يl ͕s ,9y/ws>PCmZD9.B +y H)e;u԰3G]e ,gtGa#ew4B13Ѓp,(t kuYr+n20 {$CŹ*!Qrq/ϒ𝬼IZ-OAnFM['#~ „RMef '/Mz'4%ֈQw։VYv>?s9eŻ͵.:4 uma *!2mMzR3y5IBnŴz[EVadZB^[ĺWA9yp[S~~[_'(l'H9S4-Bl!"iw1k1ӞݣN OQS q/RwndތU'?3Hhvd=Z#9gS*f aK yyW#zW^#)6IJ3uTg;"7jޟ^Poxd7F|I.q'Yz˃#Fwcd{>ЉY(0Znn{B4=|5E@!ZE]g1@t6 < c'.L>h4p- U<86ų2IWfSl}t4Z]Fp t%,F,KMOax!;Y@+>eHg,TZdOtVs |bڂf n cOz+ 0c{{{{96aLѓ{A蹾 'VI,M¨ne=u/( UB\^GLpt$& i3c c8){GJGxy ۋRH GU`"Q A $V*eFKXx5yCj;75:8xVrOv`h|[жU4l -96MUV~$ЛEwxLd~yQ7?E\04񾷢Xmg@͜(O[%Q):040H`zfMNE Ey=@CvHe'FxT_@1-[3q aԵ?KQa}YٱbQ}*Ls1Q\.| =ABp=B/F .ؼ {ȕQ#VƮĈϿ:V}q~b`[Xsa]!b+" Cɏ-iM+GBg?} y6DDŃp]B.i>-7Y=UDïOUeṒr 'z˩M ܛh&>(j ˜= ezv؎KzT0`c"}`vuͿ G>xf$'fQ3?\'#i9YD) ЕLhLC?:׻!9;u7;Ef9f|Ӎiמ{ >E4X9[55A[S߱;cIm] L.NwJ(${_t%{> DoM2f6nJAJM0qzJ pui^lT9?-2f*b(;_gNE_@;F\YPrLaU^y^VZI$#_@6ϯ=7G-)08?-W;]&0e/6 dsurz"̏{{H^s mrP޳Q&@u|07"s8IKvߴ^&p:z#er$}%%>@ըC raan lwmXv\L{ܗpaa{Y%vuqTH([xK-`| W˫:IoD{)z 9N;ap_MI kOuxTa [&5l4p2 .LhWd 4:c]IM4ą0>ёf$ }Cj]v\#+@'Ly2XVx5ej*;'{iVC\c6ϭq%]. g/G8B+4dqr2x] t5@le$>I9|NXQ *T䄳PGBOD+OϬ*$&kb>sxNlKJBZϮq*x3_3M/GFBHR.lͯI!3 !r &k|n1:u^8%3<1F]0?`":" a/+ O(p_8 LX"s-Jؠ]cFGϟ~e'J''m|D91PoX"Qq[D"6 9"Y`ogq > W)q"Ol9ULp@!q4m~F 4 KQG +|<6ß 7&yL:mg|hё"(Ս K-`e(d[|m| r ,J(z(пk$JRMMi tLsIaUPqhU#.S :mwYXI'ޗi*K>B0Ï V~l8!F=h1cwDAq!;`!m1{cnwx 4)zE0[QG>38v:l AJόp׃/_6#O ǔb/y8B&xa(:JH-Շ~ (ED-7+[ϊ}VM,çCf4rWNrx^+IT1Ȱ9: Nt"~,vL;D?xA'tS (due(h`XB*Z~3Num1p3NpJ'>~ݎ C=Y쐅(nN#dT@\c|>GW͐"ȁ3/Z|hxi!?y4Yu7D_Ka HZ1ೄW%$ߗBO8Ɋ-*n/ƞx6 ϸP|яf1s0n"m-NJQK] `^`ª 4a ;Bnu8g=ԃ r 2wQ‡ ٝ, y(" ҍ Ռ?œߠ8.m>yC $ '{2,r k=^}OWAtbgo}R]{ӏM_a8@g<宻M$Mӥ̈'HbK4  D{4Mc2U:jbL!/_ɆyxG-| ~Ҋ'%2.eI"&mF`^q;1{V^aWT8%xB)xFHȬQ?uzaԍ5a8cl͛ekjP숖7VM|w:DS1eT|!v&S%槞Q1l7򦔗1Gg-w@X,-Mnʢ8{G/PGG:0a>ec5.XW]bN$۾+PimG:n 8$0>nwݟ#H UI%G̙ ;,PߖVPIp3 pu  S.g *~@}:S:}."KE\8GyjrX@6ѿJD}B2 c=tRz?kP֞-ȯYvݐ aIۂ:b/r5k8Jc |P8#N 4$/@<ےd!y< 5H  KB&[zˏn3;9T;UElX:OG\ uq!E;R&hD3~6 };lr&3qyUTnfEW~)r-wČgԐ* t8b$W.0-yz,NCK+hq DJh}H(ZCY<&+qO(zn! p_84^{gl|V%ѝAA###3K|x0t?fp4Bs:oѾ$; To>q0? DD`G^zIWe0O"^ZI茈?HWsB9MG8ұ*6!1s\:Őh)q=46Y~~ۤxWQNp*F9POF4J7b\)z&h-zm)!MAE3in<2m,ZLBX8ȰޣBBŔ%0,U#u%U)y} -ڇ^M ͂&JZ]9T[G@4A &cesR^xnĈXrHJJT7:J)G1_{W&>HhG0nY$:cN&u&3/@kО!(Q'@r( Iyy&-ӗŒu G-2-!cL;0;̐e<7li(R/?:Ц LD@n#ɹW:ODt]jaJ (_Ht_K3ͫĶnkZvi LUW!GM k0bM4 i :=]nǢ/@G_e=#n;>D tFqՊYѮ\CrW8[ c*sBT ǃDܟz1d;`W.1dĭ#CAKm1rl{@T:I[7I&S8QR@ k3٢X *1)HS_d"X{Ո!MYr'Z^>A͝8U}H$?'4M9mmp(P,ac¿1c@44sOClm,ɽZS_&3tf @\FoP8#iPDL'J;ac<ٙ|í̟o` GuzjďKU'~W3uL.Hٖ`䩯|&kԕ+1א)ZPB6ḓ|y 2+JHwQ֍y,fo?N&^>H7p^/$&b&H5yUNR覵. >(c'RY0⚿ .վP{"^bXl׫ %K(Lʼnf |"lEajtkҢA+ 枴֗ oHgcRRѱr,_(P#GVB`G1Kw؈ђ'+]00w 8ˋ3_&$J KD̔ۨ;#"#-Ō܌ '}%<|uM>b Z|acEϬFE4aQ'kd!u894dp@܈~Dn4u]/0lǭE@OZ]aR"˚ګ2nV7c?ZWDqJ$qF[']mEM@wT*9 nD_Sr/s[9Vͼ$ih\v" 5?2k|,Gb9  ~. ӽ)AO 8ټ^ bĬ`mDJwJ"oLv(,Ӯ_({j 4u'h$ȭK&bsk6*8@ErvU ||BZߕ͒%gRuXW3oxJu},x`y Z|j$$#fٮLk UCgHjSϳPׇrGgOwH6a+*JB5̩1nM_bGN/flȢ ] +)/פ2-?Lk#Xj& "* 0}ҝ# j*J@S 2RY0t֐Sy>dL F8LB=y;|A\ri"V2OzvvntK2x]|sRh$6Nj)ڇ12*7v4,p$p$Or 5#+BbxM@zogOXS-c( C-V+nthlQvLzuG x}y?M(BvY159>s ̴Rwt"U |? J(8x m, FȻ=o #Ar~o("=i[#6ڕ^2-¡vv3f^SB!$2ugR+q@!FL1,y&ADzs8ҭٜD5r6/  VS WA@Mz}ü-ʛ|]ph^t7Qȋ f'RR.% Xh'yJzBope<N84.ڮ<7ϒLr]{({-g$hֻ|籱S34X 4 ),!8%ޥP5>Rnߴ—8GE=~GkA7?d{41izMq Wۮ9Z̈l;FM۹3Ve {j謹~`la#Ѓ ڛ}%ݴO"Q6|u(~()8JeG-;5^OY#A>M@=8@_1AI`IMԉ(}i9@ *1#y R:K$-Ͳ OdžX--ò 1(uD/tM*@sd tR3ʳ3.50:k|#DR}Gu37]la3Z^ T|lxȖ*e\Qvd`*;j)L2YU'꣮W4g J24"E&Aє=P&%ʴhyr,[ -~UJhОQ\x~mG\{R?*tj/U{'P-sx79Ts Qm)?@C6%F;PC4J#xay$ăIHICL-#/u9_#1H0A X%jhx$r4TfYėOaWK'.$ok-^~lA$5%nfe5p n~/:97 Ct ZHZAʒ$(AcYAh nӑ6*XͯWf@zxVA|R[pG D 0=Dw&ri۾[7Ia,t/o$?N8LtpGKJk`cufk~y>trR*59Gw#0^;ǃ7}HXG:X{Ql y`@࿹/+([bQj21o-FZ}m). ҲX/%ug,l,i>MKӅvGjdyod] ( F~+ifJIlԎ>m(o @ 2${4(ԷP-8Qcsnu<'FsK HNUl]d}5H$FZG'7A&'߁l`#gY(%ؽ. f V !falc>z/̭3(sM9JuUD W3PUٕb$EkMRj95zU٫k8bb.e=JlL7Ne댈4=X4*=w 0n͔_v5ąJ9i-O9Y ʟg~)7J$7aĤR۹´+cfp.bl엣gfI1^-9JNlѧn~ n<ho0>Eu|fs_*atKs9~ ,嗼&8&7cs2ry6S6yW2rm #;U .څ=!0E 'N5k5q%' phKڛL5q;:2p"ᘯDwIJonZi-ZR2S- H}lu> O_L8CW]yÖ6>6b$r|W=TE[|/=\kbqN>h<_Lja kyW"34`U!|_Ǿb8d# w&3PD`M2lI68QC].G*ڈr`x<-eZ$cuzd)Ahh'R`~ό_ x9W@4}vs혚b3emF[ cC7ŠZxw$4VP+wɂhDOEj>&|F\O6{,><ŗ=7 ~k'qe'=- fkhD\;]RS[hoW2М(MM?hLtؖWO0+yzc4cB n Zk4#y[vՇ&-ی]13I7ŝ^jtOqccc/8QNzjouM^Ct^1L=k0d<=@f@R9nj8C r\kNUIe+ƝZ-:e,FEi\Ʋk1V%AV; G`N[,G~a /ЍȵXEj)E _El !2R.0.!\f VQI9 vX,؜:"0TF=܈$SE Bob@CK2NwSgAᬖ-WtɈXCƠ*"Hf[şZFJ/JSk'%XOyhads2߭Vpс 5 *[~,ȏFCK`n&52nIH,oٙ<ܪcH<M@Ki`n0D. " ]aT7{+&PA#ڣ,heT+VmdzE_Eͤhg1 C)XZpyJ߁g[Hd,Zas挄6F\1tfH)F!Lؼ7S^.xr*Md1p wMK4%ң8p,:D膘F̂xPQ0,zi*7=ۯMаq[ fËZJe<)Vi^_pxz\PV,s}jy^[ђ{1>m2J>}u6~&n|HQkdM@"t ]YE/gxXW{'Uyp7E"oi03F *GTn{ynaSZ᝖Z4aqV^3thSiy/X8}<"YV8]֮Fz}AB?Dt+5"4! (1 W9* *>K#R^3$;*lE>GycFڰ~.KZavBu j 0CQ[u?ȆWٞJj(T4{Rڐ:j Q>[~L̆&4w,a`3@;^㤪)Bqz=JG%4iک̧k22rNLTžN'-74cAE`;gAJWi^34x,^h{ُ%]~T[*RHm+lVxxa)gWz~JS6Z~I#:MD7Ҽ2MVx~hж< vJm]eT5+]=_sTE-jl˩9jw ͆B gWrӵ#5Q8B^΁將 vm]Q! /CT6C酌Єm c8*%WNr: t>[(p FNiy;7 1.***.M5֖lNhlև??-)v!=Ǡt-#]Ǚ *H}-Va QW1ƨ8k%ͤX􄿮+JݺϾVp2!߲JYа#&8*'ښn֞fKB :}gIOA眒adǦ|޾ʜ 32hT6O> ;̓gZJ7jk~ƭoߘ# I0yKsiQ8fRT/:uyb ?ܽ]>5EEjxN[0QSU!8 =_F]pD mfJ){El45"BG V`\da-5:2b9+[sLBSk#F#-1hcr)i]lC%/*̝3})pR`}&4)^ŔX?dmI=^|S#kc?@mᑯn#MXf| b㲺Ԅj>u. νaJ*b"Z j@lI\Zt@U\drU5s;1/pkLK}`MG=@S>A>z4kGD0Xm9 FjWPAf?cq(-bw ` -/9+(g3l-L^zJ]dvÇ[DT}خYvdIHLHAz[7p_*ƨdCS&{`/F3 +j&0q 8cLqUHP!6$$үUzbgxu:!C ^ 1iGIDFU' "}07$ѫ ;o[ L=٢b,ޣ#d?PVLG5 B0l. UZYARݖbN$2Q_!xx&>aN9c|`Nxa 'E4{;{޽Ĥ"Dla>ͮIG왝%]tkb\PrJ^-V\fJo9:q _ԅm^zȫ24i ΦGkxcd% 4(ńYP.!kuMvb0gۿg@,i;L+4|\}F_%9pJ_լ䝤{  қ"9" >&Zq9r‘HȂւc;DKի\d8?Eqʲ؞HDR ziX*m4[3V?䥒K-SӃՑl{1| 90#N?]H+ Lh{8F[s6ކG WQ-7R[pHؽ.U-DzW}W^w?ۊy)&W>a@}.]ei}a-Huԓ=\h+–L8 ߮?#K-L0kT=1jE?Z alt9Df-Vb‘wGeO H0Ƽa/HS o|5j1 H~&WE{z5s 9ҥqBs苆y?Ș"ת4G!۫T.ymar@@ 6N@ky- [,Sy 6y$aj] YC'%Q{RHQlQoWޭ̨h/SurĨU:mtkBF+'i}Ȇ+^>-Z4;o)o-B֮`o'Oxȼ^;8۠bGEMj %%RϷF?<iSS#؟SYTRp$PSaڧIwA7 } "!#gZqm䌆#*/)%-pXP#XqԖPɦFMP 6-%IɊvu{3"/f­EkOvC* 7'{R&>d3|GIk6W)й!a&K(TB֘e.鞮9<2 tFd%;|lalCA Oo6tU4kWʲn+:e\=/>!e#^ \mH-XBLx84CA^<o\{CYt|,A҇]vJ0!벙LS ޤt#>l!D6^cݬX^S,[%(# Yب$ī#Y޽ b,X jI&3At) ILLoeo^ѷ"7{ u=:PL0NOɄ)Ť9?:/BRodZNjr<`h<]Xf~? `Z;|}*&-Ͳ>j4pyN%S07s/ ,h A'%|^! ]0"9Cg 9W; ϛm*}bV (ȟQB_NNw&`Z0@:< p}PAWYbקľ詩87xb!I~N[#[̩PfRi& H@Mf T2)݊-x>V3ЊeTK&%BOJ&Г] 'hѽQ )n6 @gtr =\( yF͜@Fb:;2CkpĐe>WA)5D!}y|CnA+v {$)@:V( -*㧖N!wXc8bfR*# u4*8 b*zZ|쒂沁;/NiZc5{9-ZJp( l7TSP.Zq󘷱A)a(|WL顠F@p2f"M|g%BxRE/+LԹǡ-Vj 4Ca& H=gIix9Mǀ:TJ7W⋉dD ӿB7Δ>~4& "нz I˘gAp뾽PҜc\[*Τ!'(wwy{*ɨ<(h['ͳvؠa|Zq-,IuB&@r7O8Bd#Mx,Y{~wci-74EEPR⹑Tzf@0~i,C||"r*_3G褓]֦6G% O=7#Żbs"gI!Vb,%ň&`"y3*02Fǂwyp I4ɆFFzt1Ȗ~x$`Y$"tf ,=6kcaeb. K`Y- k|C2 jGk ],cZt.]ĉO%C<քkNn%,b9 o76'XP['ƫ 3inRncq͈_%2rUb:Bms:?"_*M/0;}Q!Wc;Z8jKW`ҌW%)M|/GspAD~@- F#C1YpQهPeDxh.X0Jo|oPRͥ42@ĭX`A W0qjԱ`!'T"*!vf()=O4)ۿ@ŭN)/t;&>]ͫZc2EP83r3}a>\g+XoI0@6M;J8&2+px8ዴBxw. NE18 avM_ *@G8߅/r$JHL[׌ dڲ&:|:i5bY<+r6eapzrʻh20)iR^k˘'/(=gHk eo B8P/;µ2_m4Br0!H(jPKB$$%08t d>#hw8F9Ob5rod,8Z>lb=^zL|.>#{?}4Iדñ!fڠ".;M)s55RTfB-8oZd\%lM}JJOwin)?kT$0#}y-1K mqٶQD )lK%=|])̠;k_\a: .K8ow3OsN mg=<ʻ@y|̀z&s{ Ꮣ1z~o٬,ƿ@V5b>Y mZrY1Z/#!V&ÜyP-V3~T_YL Хf~~.QKY8ג6P7b4W8L>" (P0)HBF*H,%iab( " X],+Knr<-Y]=He{8c<{J@oӀ̼? ,?0 A/f CH<0JcOsMr)Er!_/ I/x픈zag\L @۷ zNP0CX(<[axOh AgFzܞQ}]#d )'2^}QcM7ɮ3Q{ f-#&G*}GzB_2 SO;b " &\+I;.$< 0HN&LDZ'Z_︬ vV# F v%^e`RU9ɇjI-%h-rd).5p~YJ޶%&m\B{) dgGyf?PWd r jYƾhHDt Jq, #)1s`΃ӂC7*[Culy5,"w/]/C-al̯6c{wibtY c;2UaWHa@52*k `vBuEad)ۄ ND冃+!8-PА65\"L4)@YmB ttG}R8[[7luC_CqѸu'z E^2JV3AUF"vwWO6v2E\@c9GKD ,(]KHz!cl[֠Vr5oW=ti:(ud)eqޭŶs7A9qbiѵj~ ~H낶5yB7 O\BFLؚz,-qM,7f~$,n~& 5zx=}/P%["g8#䡵͠0Ok׀X5"q,2"WqgA<] z ÒHb @=$f ( YD:>I^M# 2[J%ai0I>lnqLLb,oNPPk[-O%H>0(#D|lKy@uqbѩ`.ehR #-Sƌ .8m9SҸӾ@ #P}3`zT'T@=dzY&1V4a CKuX"HH@<@jێDa66(`NA*MNaANF]{&Ä%jֺ" J mP:^(["M]ubJK{='y u?: J ޤ 7H5* ι+2 >4(3I~rH|Ɉ>c% @;-; y:}[ dW9k00 S5CZS%jVG_1FNΥ:1ck72|u]vƜ.+$GO '`bXh(Y2ӐwQ XI!.}*YnX`r{F.(w"i9RҌQ^>f}:afB@tݑ<u!eXl1-1+BG4bp$O,3 ?ELa;t4`^4Iכ$R[o$OiX9jD` :ԛKX*z%fUrTY?E ,ͭ#ωTd\aLrM΢>]&ͦFʰ2c+XFdNK l0Y9פo VbtX H&>QZp> o=L`l=و Q0r(VFw1@ϽM h43_\F~&RЄrƻ 3E(0M؆!tRAi*j ?x/V1RCi!j 1*3 yؤ 1T\QSi =L)ӞIuUY/Ǩ?M  l&Oik08,MH7%KP>ᥚْmQkI|Σŀo x N&<Ťrd|d]CvPjd)P Q',+0S3Y%ǽs=`Š (_m!0Zx*3hcOP`I j~ć}.{ʦyCBx0rHJ( "ܭA{g?~xAe·qWaoƘIOhe*Cs\W{A\L?]?Sŷ_qPK& !@7Јѭ;A;Z>+P #ׇYsw]Ht/%P-1yˣ\Tsf|m7p2 4Aڏ;Ǭc]YkD6 |D+A-,~_.r>(<YA#cwYtW󍴤㋻p4Ȋ$Rփ5f g<+SJpv{ v ?QR9x o j8Wba*5#53ջ?QiM ie}s`AߕFXȏ)dd/M甆yGZ1q SKbUdCy[hŅh$"l*D*[蝈?}1,t]HFࠝ<1mhi!m !PhO,A|F,0gT&Ee Z")563g  `+dNyQmCr,Z|z<QxOk66mEt?\u;?Hpss9eQlɒ\4|# l\$"A '{Z &\@U@LIߟK/ŦI/wԭp'i6}Fr dJD׺.vk\4kRsG'氒NTp/j!I *P6A VP'}1 MhLɟq,?i0QemB#5ΐBhIy`EauV^ʙ0˰GOƲ)ۿa2>WTDAX,(K,'gYs &Yx$@Njo¥XVwRs?SBR1LoLl=!h9UٚJ!>ԓriqG[AKZðKr$?LTuM.wRʸͬ1;5qpw@A5)қfÑ`(EvSPhKK p%Ѩ2!DҪ/@D ԹV'gH>co"kWyDڸ؂w^%{U1 !DGs KUȹi\ܧK."f=FH$2(M1+%%BX7C ܙDH=#tֳSd41K0CzQ|\PcDxMk}j3m/449xhF|%S Q0OfSrj*b+'6?kJqvx6VJAFwkێ:Wд`Q3 wOe Lg6i0 X;[ȥJd9;h t's?awliDtRob* j=6Fe Zؠ(aSvž?ew8jxgHD/rt U.$ޖR 5HUDkB{>Y7=8Z>J ij$cP\3"/ľ@ ٳ(W,W 5x! 3JÉQR>!39mJ0[D-?i{Mu*`NN!ߐA5хފ#*K#s&B_ D΄Wo[a'1R%mrYW O9Oh[͵m'xJQZWi IfODjʸv{m0 I{I'ڬ\u v6 kŦlYE(kuS5`-`2mINX0 ٶ̒@=y^9 ʨfCa 'کYN=F;zרISN9(CDQ1@Z#GTzBT)kI?Z϶bTbktpZɯ>W.+W\"DHzzƥ]"V3C}rqi3â'-B&Cˏ#!^Sg@|pVT:Q5 }nY{->C nqe dV9jCjng-Mf2½/&'F,HaTJv$$Qޏ~5ִ.t#BUW]p;s$Qwo^NVo$ɵ$,* n,MɄk Nϑʒ.  "=e9*7T+[o>*>5֨ yL$uRaJ@vĩHُ7'OZX'Q[q9*i6,\̽7Q ÃQV6I.mx%.R$"!10 sg)Ɵ['"։Z$d–bV"ԿߦAn^#>=9 hǩ@s299mLo6m.z0(q$$o4-ZYDfpԙE˾/WIx fq24h76g~e/9臕7^s"3pe9G R*v8a e~vMr*[MK踩k:0S2\FLJ8j $e̦+9\̟LMs wRӮ+هD=\sh~\g$8,,K{|'TRBn&,ی ͆‹dH'a\*5GK EL!"%W k5"ZgI(I' kBgOrO,IJ@'u&o2)R(M @92 Rb}Q1i~!eHo?}]+(Y^[u}* F'jN^7Ws@3DN{XDeFq ZS٣Aא>MUv,8F M %É=-7RPx ?I5$x 4U_(Nd#IIwkpwhWn!]!.VFrZ=48]ILvV_ټhH>8*"cXq>Czj]o$("O'#wBSdl/ -em;oBt䦄 6}QpVI뚵{K=u~|iq _̪g' 7F!\nY > `IVȃ jpZee VΉNFcPv=21Ϋ"K吉?7:Dqُ,BlpA79wsUihq\ & d] ׮zro6C%pҡ~_ 3!4ʻU 1%6ƊQJ!BD)^jp&m&>ne@4j <*&)s/LV5g,l:Du>kX(n#a!cV]sЊ)HVX0} hj BnuDZ7* XظhO( Q( Q}Tv̰ dP^]T@uYR3kuT<6Q^ h:1+aO:D2$s~H=%D1֢A) P0Id>71 Hǽ2}$ :o+ .GVI 5[x#\!Dov})F0Cʷ4vwZ0"C=WJ]_ =r6Malot+= ЅZ~2sCL?X_r Aʯ46@%K@xD;*;8?&uP*Q7c ?~w mp7]{EkPwHghgz!w119[~I':/1Tp1zЃCv'E/Ie*I2G|^ b zT;yazYV *0a< >IErԵE%zgd=`)M0+Nΰz8rD3<{R;_;0|e2[ʲA0e=g۝5?ӧ L@&2@>|N !724IJH6m>wZk5:{ ĩȐ' &ۑ9k =..(&JTɗ1IġқD1KNGr#ܴDyr @Y]x3Uܼm \iv/LQx "iɯVD93 FysAI&:ʈ,]ĴeT&3p@,M"r=N)*Щ,MZX~o{ ck>q#Ť^MȽ![ "AL!srsv>-y\6z5Yt8M`Ԥb@4`]y<*8 oGWiF NXaJ}|mHՃ:" %,OiB 4ޥTr#el)o F.O~|f.v` LYC頃Z,`>up"ԮLNu;ۿ#f?>-Eh1^.A¹w^ysgAY8)oû/C7]fD/'9TO6K,k*׍rΫyZ5xjߎ/LK @lRݑV6`bBa$[iJsjcorHAL**٪лMj٠>8h K`]S@rfdH% I? 8WFI:@duXˀA"&I81;ށDluex5(xv܁. M&<\knc[Ų LT4|ߎ,/z#I8SrΈIJZ$m"31shBM~&^2Dy+ x_>K bКe%DM!RpI Dq|~f ӬZ晑 n@s5ʮWTf&J0BtH,|XDHT+_j>J:/ݗ:v$8?ӟ6}Q(#WWX{(l'pK$́*:e37 z1: 5 irB6BR(7Ъh89y[TH{*C X-= 0;Br"7Fх)Ixh׺CE|`n.lF1וwlˍ9 D !I9CB2t7p_0ނ=HoFYC;. n <5$13 x4zA$Bs}ll)SP$i=W5)uX>c㠗`?*aC%P{46Q*K<.Ї+9U;n<'V8Dsޠ!@oԤN>\;ۼ볊5? A eOiqq\[3 :ӌ a3/gg))ϫp}9'+ŔsuYEWPb@= >W'nroBt^Ʀ񔁙ڀ#c$)aCeqB( ޱm~IΖZ=EDud US#r10tgX/.Q f9q)*Gn{lZ-h5^/4p\ىōk٢ 4C"ATR=X)|!aK/ k>xK>W9bƉEЎF4Z!g%݃1~ԨW?.QrVSGLjHkSdmw=N9эGwЕ9ʷ@ϼ;*sddɮ&iы{LH*$tOc x ^<|&!+\|;, #EOReP[bRbθףAwێ3i\3:#+QQ$0QRdf|fĵ#q``zss6Uvic+񢆭}LMd-d:X`Gnb=pT֊/F9P2֒3s<% O iD^xd5Ohᒘ I2yQZz]AUBRلA,PVDԊ|; IbJs!7l{M`'O 8}ak?wѐJG.FTef__?+Isұ6vPŸNzNбL̐Mg]Ak"jͣqbfq6Ct @-Mg@&aG34TŸ|>'bO@p6q-PN'v5Fh];QI)q!;f|Ԅ`GlL F߸0@&Gdf.|2% kz*[,!%(mbRJ\l(;GWCCq,?~6S=ss<$fsqt)o䋝Xb5ΘpT`~TP|j%~P#Y<88+ ]!fFS5\-OȍiB .X}ua;}X+YOxѧ.}>Mݞ{:AZfז~3bo  2io}ah2Sk`  ]hl+eG O|d+?`њhwBr^"Dm]*qUKF-M|5}(όDlyLshv]mZubƝZij@?*'}ƅ2p38ƾ%&hVA=ۭ!yX\76JBp\&_JS)"aޢtOm{-Vtqݹݗ.ޫ?.+$ѧp1) F/]h.._ؘ۠272"Τq+z{]Իrq'jLjv @/.j,RXPdHO6)ǽcSbbWmP=#SJ*mCctj [o*+fC'4>j,ugbd LźhHm_,_VR1CR~8˃l:&zp,ߺUzrȜDA!Ut8kd~cCf øi>a̸$AL;DP 4D* ]=Ɩe_ܣT%)*Ƣ} JDrjws(_=$a"yn k%lʦ&FkyN&q!V!oQT SLe|ƒQbΜojoq]BkA.V35O6V1V,@gt]Kl+s0EO ^ ,B6\PG7EtYWp"[}+'^]%~b2@Jgu֘F GZyxpwVӒBsK ?h>xٰz"zD̫f~8_P$ Cd.E#uQj\=0i,ФY~G䑷,΋- B SfOn@V||5]/><[`u^MwK:s EqDJ0"A!U65*2oHp SL[Iw"i9a#XΫm@@%E |xu0zCh d$H!okU{!oD^A+!^;rO͖H׫ ޕt'[m xE `uJ qa&EX7MmH p#jKk]`6 As7c3o9#w+ӝvU `ԻapFR먎8aD2,[H7 P5r"K{~GB9/;ZL2Fi]ݩCN,.왬c;5%;q.d\a9.) #FY9Օ2-Q\+SΪL>YFJ+6D_asn[ XĴ _9=_%fÊҽB%ڔq<fO(yr(!K [MÆ|ei\1W1aWXmkd ӎC.lQEC=$ρ6kڈaAusE1<WGgۥbA2{ad  "ъfWA,LJsPo]BW9 g 򝘋*7>vYb3SF(]iqV4{S Cl^=H\RPpEQ.e8! sgY]&c11 ,Ã"}<$1 @E?9n,6LZ/7M-5XJ^)pP*9:sQQC}nNǭ}AU9U4'? ,k&noŠ śn8J ,N"B68u'NFLDl7-yޮ !G@o'x^y뢮Ț\GVF^D`Bp? +T[-A l8m=Dp"A"r&`h)\vWdBHbi91FM57OQ, CY ,㚦j#™KElU;2xߐQo%'"D=0W&?Lj 2dCVH?@:3!!;eV1r%ѫ7"RڀTnPvjnm4Yw2lPPmVy(εo\+ʔ')6 ySPԎLȲSPw:왠y}EሶSV(FY}π!;df햇 cOQRipW9H))5*8̢lWLO9kdj$ 5i8YehR2#H+z[>ƽ2lf֠c]|£r-vH!v56 Rŝuhqʀ>͢oWmٟϊW@·~րA~>>ƽ^K?!lHqM ^Ϲ( i,~$r}?V_MAŹ3ٓ }~N& };/a utWfœ[T|)rv 7 cC8D#TW:=$ )αjHt%͟6 !6G#d5 '3 뀝ZO@uwgzd`!l27½ڵer,=پi.|CU_:Jmٍ_`ՙ"um|]/J72^&QxYJ.S_殹QQZD`XO}Rv%wstUӅ%뱗7}7LcУia+~VsׇH< ۉ<顧[ X/p6GzI*nIעc[ǫb9Py6->Ah }_ޮQ7KP.f:𖾛' 5Aғ=U}%PZ@Q\&Mݟ  iBpOEy?4oJR%9xQe빋\i$Ϩ?-!C6Aq~RN\7zAx~#AvcH v+M2\ciפKKG:|I:t+> X==1Pu4- 1-F+F1 uk/% _PE#NgAq <%R//J/Ƚ($^a^3zK|2pUߑ^ Q@z\a0=ʱԉ4@|k`TuO:+Zե]FY )%de"}z_YĀz+!5(<(Jd !{Lep56j{q"Kg!`i_Pm6$уU)fg.z?fhBez27A%0׿ЗCIDeVAr݂*{?L\~"c,F`<\O\i^yyK-N~@3J$Ɯa5*b4B4hcf[U3ak0 軄P#cIƩ10ĥ\L3ÑuI>’EILܬo?9p{k!a>_<# 1W%+YC0zmjDN,0Ѻ1Mgލźd\6 5eMz NXL2vyqmeUlZ_JP.(, Ffe9)4OFMyhL5PN%XC oZ070ٴ"෣zdlg<>-EFpN7M]lݽo an#JnNQ vX|GHx֔hg"\d].EdK\ a#u3jS EQ z79tCLU(Wt3n:β cb6+!o׭y"IXg[|ƨ;on\LzQKPp <|ɤ z4V/ٟznJ-(.tCUW{kxi&A wO"[&ϊ %6UmDo qSQBL/B8!8TQ. ~L~5:ΈRZ >/@i X+ZQY*P;^ZdfN_Yr^)M<I Yz>:9 dĉ-M?ں}pn׻`2B2< Kj$f V-Sy UY'آhx&da/JVjHƑ~݂c@a"βeLz]FĂ`a{\us eÅM%y7 /O"s"%ޗ6]U tdMgBD &5E \cI>@SWPЭ\)C,x6uw5Vjlm!QS'{T ~j7Np_P!,#dA{m[Xth1+= $(rs[GPIL/vBہˇn,O?ܞwH&sq1)O qB5%KrkX챪Vf-b"]Ϛ$ۓY=%ZqaYVya2r%gR/ek5 HCj@E#b1N@Kc k+b`i7 / ZZ`C;$^= 0Zx@Ԏ\Gק@[[5Dd) ͖Җ$Yv ^*Gȳ%%Hc0nŪ/̨}n_5(`iZ>ѬSPl a"H0H!ޠ揳D'@R $ުU.}':yh7d`  ՎSAH A_$"rTzYZl1ఖ*:NTyjʽav[ȟ"ڳÛ oGPc_pe`x _QV)U!~@n< 5Rxi)]z/W%jɰA 420a ͱHV\6xBG(;|oP%T}]@{4yƁo͓ 2+z4(WkCxX/ݢ fhxoNF$Jc8XAM t]6qw(+SGANd]I?2N[%_N-ťUĠH<;dBfXAD\>gUvI58$vqd'WidQ9x<IkدHP} |D;F|\%mOiEDIY!XVZ.B,Q6,3{gP&6| wZmI`@*ӕ#Y(w%=|f#E0/o(VH0%I/rU2K RpE&0hwAMvl_3궝k9a+nP5CpMCJI_I?ɳ&+!zi;5#1jR2 rB MbM;FH˖[m=( z.$,lR+Wzg+t RF@2jJm Lf6Iz]L) \4xtÿ]?wv'{͟c RECR0~sA5V̖x%+ifԊ @kQ?eD[=vpPhU`G'h@/sYMըͩi&.$H_"l<2U8T5HVx90MF-CJFǰP_fk"aP3|u1jμAP >0rH2&z/T֍Dh\eD#,9H 0t^Y+t+=O:B ^M3Z)|G׌5aM-|uODr @f)'i\ [776S"%W0f11gܠ4^JFrJ׳iSpv4I.:w*CdHv4 2ERM4Le7 )I:e !A!=Gw4nԕ,G[]u 6lAOY((t5dNMQzϦSoZ,sIj9Woa#ֶ:9-ϏLcgx-.Z*aRfăl4V+k7)@&Y6jz26M)yݷ|ςVLM}t|~凗yJ YQ(_@F^˕d0&|G܀EZI"S54TUM.2"+w? O+9LلͰXnT/3~OY1󃰍ﰍpU*ioywtvzѢY%vOl=AM5lGD}Kjj=QJ&f?!*_!לۆ#xb ?&H$4l=l>qe֬'zw?v5tz vGD*e1ˤI`47U!hl ч +yGꟁjtN=#f WԠʂP &׻#VXb<^;|dUj&5&bڙ Z86\%G=6 T@ [)h& ^ϮCHq@(%[vls+WM IK) T +,mRmHK4( UY@2D2~RҀx&)4/(]~f+ia_%+.(X^-}*A&58TP1e-=.U+JE jq̜ij:K| nm$ Bc @ƶ+.@j?ENzceH%W Us# XJw(72lkԼ!zjJޥ e/`zZOx:~1NlAv# ց>f6ɜkf6j7,NVp~(;׬ SwMu7FPN Lku&26J M`_*d2ɽ苬3qD:smAw" )j>ݼ ]# ME0SN^АVf]j̀c0\$42U]Xtj?̮#Bh8b7WӖuJR/E_OH$2r$gEC:^Ҳw񭨘cvŤB"H&W0 ltV/Y{@DB8<.(׊ȜYpca{%N=-юϑrڑ%{E2ኹN%1\{&*n1U`T_H Ǜ;ml|DEt<kJZ %2kyE}Sj)IJUWtg^-Vp`1T1۩QݒͷMֽ|Fc>#U')Ǵ F/PuH4_X6*Zd8%p5M0YHҎ^%!}dkz /ddQYei$sXV\-X7Z){J\otn_6[؞FhHB|D!OBr' 6(MV\ZLa"ԇkRG8ǬlTokrh;?<YIsBqfg(t. j!lha C̶@A*&pl5Rh5~V(qp>6Juh9t5%T6qrVFH ĎL 37 w%TMkz!C2BQ"r? s<Xnlɢ^'aDQJ{ȸXTnn<ɾ'4G|R~*P Aq\A 6nb4EV<lyfΪD,Es7ś16F#s]&'+;tԆc՝,Hr5{TƤ&Hji Y[UCe]Ֆ88fq 4 藾=VK*7tISWq2H=(fy $6ex%a`,%iij}l&A vCͱBjk4!虸n☧vZTrKakd~!,;+>Hlv85<{ٖi2Ka_4!O ޠ;VtS` &h[*ї>K}H:+"gYlaJi  X./Jr+;^J\FEDupk(@te|}qGBbfLT~f9)S1, bN/s>gS0GSqQ|_9li7t̫X& ݟBmMQ%RCGWz?H Ei^iC^s8+Fiib3[He, 6/ʻnOSpCVK:U> E'Ņ6O[psfwa}>C߷,8?!e?DFƁo$zQ:qfы[`:dH=XP77 Ђ0<:L;< {(<6Jdi/ L6pCG"aTܲSƈݤ[pI1p*%{a`Pr_w_O=Ck:@T9F~i(}FX$ 1x@^ 7y9l%$Eޣ+Q2s]OL[O|i .,C~&,& KJUX[Rq</5t4d(_Q6c6d IDvFhufb G \>*F嗽6cDqټ3O`䘅/*^H\,Po"]cIhLOIIs mU YNnU1b? n28la8L5gJ9*ܒTu# q¿^!UvT˺#'|sRDo<*+3'W(BW{m:/j,+'wJFpO􉙺j-u8xKX[_n{ >Cum0ue51j)(U8i-.l>jF<Z֭.Y;7(ݬ_z`; wPâmPNW$Hodhn(DžEwك_2lȅծUBdAYJYWx#a<јo\ѐ2G^1; @4LkoNE??*CՏpJafu!5YXhTf))(BVs=liĬFQ6&nd+\܄&ܶGNhVAyV!$`Kcs (:VQB';T)yQ\H* A=@h!.,s(I$4U̳+gZ*FHqe`$K/im _i8 \ J-D&)>L8ԣ kϣh{EYc G<%חR;V9¶x|t9^I @P/_\*3&}ǧQcc uUXIE|9Vnq4OFK ӲjHvJ "/hXDDv;nӌ` Ksi#XE*˩xOSDƣ.6 R}G)#`SS])agW9q/§57⭴ :M]xޟfc:7%2PF"mXh;k8К0zC*7h Nw i:$E[m4Kw`>Yt]'z Z:LS&J vӧpbxQ|3p2-$ǝgY¤:h|h՞{6W80 ^e՘H8 4ͨ[x!Fz$ c^DN( uBTJ sM1ҽTꝌܤMm!ȌLIRS˹ 0OER$ƓOp;bǀַ$stFF/q}`Ғu="t ŷ@oP&]e"rER#e,oW\QXJZȸo5I6Wש#&F ).UpwxiG?]żj\ӻ3DXB9+ 21V<_eqD7n;d`C|j f>th ^ o\8`39 1 2]{Ք7>He,v :%>66xx̢hd{V>&ɒ0'3#YODwquBTiY\Q{VS\ SU(N\r{Fd9u3ϧCQDSYX A)m -dVAX⁺Da&=R u. Ι2FawGô(Y-m`*P|j 5GgZ l$(C`\aU\H% ѡ}[!:*:C-!>;KGoFL : hmŠ;1\_aH*g"zEڀ-VRF[zTlV&U _ /Md0^tO3EDn'~ v"`h&{Ce_N* #HԿ KNwXFhlqĄXDhEZ s)@Qٶ&$ӕ"{~[ FE7ث! }HR:W4AC9 >Sl0HݜKX5ݻlш89.̩i}QhUmHۅB`wS nq5,pr4yփ*]TizQzn2e`~!Iq+NU%7/O~v&?LY7O5PA| w%A f0ͣqcB&CƉjEsGĎaG0xNDƵ{ov_PYŵXtޣg:{W+p@klc̙e[\u`[`:ⱓ}wՠ854/Ғ^3ڟ\ ̤׹%Q<OdmKC]+R;x2:z,Eg. vW`VfY)zמl@)@J eV@ؤ395Y*wl X`Ibd?IRy7 XLO7/OwX|H "~F֏Ro_`z Fa91~B 7nCa$8XeUS: vkg<gWҞ;*a/]つ"Eʁ2P ~F/Q0,VWN:  crFXarKJ#[@BOo 0̊%i*:b+Zx)}t)@M`E4p!ElIGx).1bR#fDJG;Ad@׏M^acm/&?r/S+JBk%eoTzqdBo@@Qh }p+ZvcxE"A}d$~!"c: \qdK g}&׀ڳ3ҏ2#XAqi|q2`%]_{,Vp=TM^ۡOJe؃^YWQU1 քV% sFRSp{N$G'~gQCxb-b` sWsCG$MybgS'Epؚ%шG=kn:4"Xh__HDY7kFL&^Y'̮ Bs^ /蒶ٕ?A`,kҰ*qtCo|lTLU+4FCvg͘j-<0F`MsAOy؆2d| ].mq:tIj: 3MN<" #N?azM| 8`AKkO"C< . '(*J>Vs'v*{.Ϛ8-pq&k %ӿB`܌Fz_Jj S% yW '*v+ɘt- %lwG>w6腮TtVffބNR^B/#_3`vo3s#k)g2^gV!j @MR49-l0QB:Ov`J\JMѯYX U3YSLF+:a,$%wgMx@Ű@d{1-g9MTϊ5gk!QMyct#tP 6r5d|֤LJ 8q)̴(sN3=n7d#:bCxG+2Ns14Nj VvY"mB` ٪ d S#+ЄY2= ɋ:o[(ʿ_CcS.{ܽy:[!%IfAvykX$喋Gsm3]RT2Aq)$ aT-|SKg aDjZz4/syG:?kA젷'pfUs/܋AL0[:ȧҼ˕LD'AR)s)c?rXB8ѡ ?7>FVK()x`"C &XScd^&hؐz2#]WyHn&m u߿g*;XRǕXۍJdS:\t:z:. A#zz^Gkb=6% $ %yu(5ϖIaE&p ~]8 `הW&7h\1"N1ў CSA\C#4+cQ ",X?RTb+ aݩ I0́zG4oEwsSnbJ 1>Ft7ڣ*D }Ym_Ķ3NDQy.gP}!cDQ|g@R9{~ :(mS|^lwPF򧼒f 71N3K_VJ?/cYI74mdB01v"nIGpE4fd\P7Q8 J_ d*L#Z'-fS^uzIA&Mmxq&+۽+;u$+s!^-@{L1Hf}p1 >Ͼh1݂"(x zFY|t<PĠȺ9\QMP&!b{<`$99 F)" ^?MYBMt:A8r/m\IӔ>MArKɠz[U/a!)>_qWf w 1Z?Du>)\ۈd.mήQ){'ppjBPx W'&m7_2%”SeT|"#zBGD WIZN9J۪ti# gEDBpZimt#̅&6D 3sSH >6c rEXʉq@0&R5yҝv:S3XBaH'5*V |A1^IBzk^>-@l+`hE;+vܮ6U|trYuƏ|{#i~ v'PUo].u^㴝0姬&&±7QPT71-0B\!N/>?={VUz9Qk4:N|!A_#<6jښ$-*bpo$%5QKel$F߲LA Pӻl1.5`9qw(;hpO6"hg~|TTR#Ib;͚R@Ԑ_cR" p]-4FmKkFFf5;CY㊲|Ҷf`'2%% w(>*GL,54PB#5 8v_u(Sz ^/XRj,Ii,2y lZ2z%Q}6zb﷖D)T&&LGdgˢ NJ*.F'~L7U =]V&Z/ #1QidX߿좻_TdJUY_`&<]Oث:%Z{oNRE#XyIoӊVFAn|#$^/vʐvkXXSÀ(S7PzzdduSFkXB-oW+.J(]͌{ [s䕉 0kZ1x_sqsVͧcT|7 ^E켙PQ~0suZT-CQAX9:pmL>}  aBe;F9HZM1/aK< \7@ }!ۛp3ΪsVgK?g4 |U @a|$<`R˭}zěfQ<e)_ }SΒ\xmGv/ >cQlhqR^^-@twە ,Bn0 𱦮uz !*E͘FhL–fh#1jX^*;h&@E*{N( ڂ,5A5G%yx!}@Sn0-1L8Rr@mKvTkf0ad>nHDjEE#Td'{gTŴPx=9p'UK()k DA9ߓ_(@hp)Esj0 gENq6fS{V9koJaF_57]u[w"DM#J1REOf\xoy ,`I?F@ v|NatWTaDD%:2k%ȈكQ8.>'?MS3 r=xYBL-[yWh6018/񠫬-R FJqqDd@+@4ioF7a191 S_"OňQ+"@vo9 =@(ـ%DH1EauQ9J@0 4y+bj.IDAjʊE| Ʊj1۔I; :Ą}kATy+*N~V;ߤn5{D9L49R$I9IbĮSC \\$:{cgB0$VMKGMT~3DnFÁ s`g[eY!:oJ}LS~1be'1@ОGGuZש>=h`!9]((Djy.-q.R~=e#olw.ߐiĆ"/ݞ],n?' چ}l)5a$FI%isa+kUC3 V18_ZѮn''Wy X-^Ŷ:W9>CIe\ZWՀ6Mb*Hse<69*MrRCKoA i--[M R̖Js%#6{騣h{YCp6V>541s p(k1:R83B%T& aBS*$Sk\8?@~j5ɒ/GzUS"ŗ@^OnbO0 ^|U {D~vHa$ dlC*C`?q|(]Qa2YvH%Uv~tL;(FÃQH"2VEM! xN5b{+z*q媼-9'q_ İ~,ŦH{pX Dv4̊W ))Qo)'QAX$_6o|H$^R' QGG-.Oo)A=w(KI?#t-&ՂglFBO:#Sa`]\AV<;><۷^p%UJ_(M)!cv!v}bZ7exY>cI=[2KsQäFh6MFr0/$x-5?wA`<7n]bo<뛿U[t I'3#aoU q[)ah!BҪ5)g 'E,J#@#kY9Trk I;J5 (s~}4Q$gjxBvd2]x֗X)Bm(Y!YCyZYP&Ze9FHڑa73V[>H@ !C Z>.'Km~YG6rIzR1h}?~7`:nq&"QBkyʕYGnV:AD &+{ > 51,vtI_,աntD~,| r_0 CL"tT jT%dGb[K=1he#P(4ƫF87CQAVnɆs0,qYhrY2x ~JxCշMr#&T|,5(/SusǞZX=pLg*?~mlG칠kE݊g3a.9rk W ŏKۙJnCj3^UJK$F)@atlpg`XviƑ+*zdq';Aof )A[֛B+DE]fi"8UJ

ơ>`Iz.U=iԖ|6{d<$Fƨ: 0i Dst*&9WM P G]\cIW% :5.c-ry*~ KLG`](;=%!udFK$d Qp <*bȷ?!w]`3*lMSήZnD?`w|z(PbRyN.N^v8$}ͿWW;W@ AUL1{:/2"䩌o%?@Qr9= G ԋ4lv@crq"54;ǜq6Ty#ڦa&;)x^ԭZa6f&ܥw9kк- Sۿ/\ !ZA'N;L\9LQo߇}U~&};U8(w iPÊO%T5aE {6XՂrD$YG"%[}2= Key+Xa\˨?kMwt9=6qmE899'S9=G#=H@CMTwH#85=jsm4IKG0mր&_Á%QTrh&W#b*~JZm @;x±u T:g ~:{t$~ ; G-Eh![yd0qԈV)*EEFAt{THeYtT#f8EV<+vZ㙰|)4™ʌ1ƒZвqfapb ͐ɸȰ׳?  ~m&i.'sa|s]gb.ҵUn/Z'| V4 Q~XAeV%΃P#鼕D .)ve SVK͈WՔ.pBYa𐧾mm򌬚VmeWi@$Z8y"kvb嶮)n_i1OPe?$f,u.n8HvQER"4 r[%xs@1qx2`v9Gf ] K)kpC^:-=gE(&#uiC=g:M[\FR52X*=\Y ZRigZ!WϳQjj2~[vFN4x2e d޸nAswxQZ93.qAPTD]#Nk`ЗYF5* ZS/CxWrD>{O':e|<-* RnUٲjMjfl3 "c7HYnnNǙ?{)-78~BUPqd.b^g?ES|!È4kL+ }4FE[E+iT X\R+x(]Svܤ"%@FA>:.TB/x~X;*#& , cYkab pL$+d Ѽz/A>ZT]lz.%@B4w2 N Z=ZP =$Ke3h Rj+ʵJ}rE0 V#CF*͛O28߈0j[O{MUx,vY{)cd-xyǡL3fb=!mJ?n`R3?ry2,i gsSR[/P, aYը\mGZ#H 746zq5&AjN9VϽj>{LI:Im ΔisJ^Гi%HM]H>$d3tN#cIïᫍӾաuZ{!]$ g![F<`elhRg,&ES!|4jydY/PѾGc|]vHp<*5Ay J >\#cK鐗 "d.n(D:׈SBssaXd/Zi].*qӖ5'`˷{zY4gwӪ3wrq3%%"i6.SNUbSG<*P{d,L>u} =IK[okdC kNj*35 DeL H`mMf=x; B/ f$i  0;Z9fy#XB?X# l"MHV $*tB8Xg*,/2)F:ُ2@A(*{|^;<,SApA!kCTРoC3DHT? bFRRTD3ݜޖq{/]*g+[kHHF@|cR  ON!peVe0BqO4}",HxSPd?ɱV1tśאFWe!%~6 ķ Eʆ7 vC0ȼnC:<x ͇r`isK&/?JyhEM$c329̒2bJ&Xd${CXxeK߅֭~`F}ٻč#!V%OL@R*F>'K:HUKGeo$L$*I&nH+vVvs"Ͽޝkk() h8=34l,"_/?j(Vಃzt:20z7QxR]y*!jX' JgI!Rc`3B,CWuzP):>=_ycBљ͢E =֮-'M؍I>El711puo-R~Q( uє8K{4uЮ8ss⽷VF-kyojɠ:Dw=fރ۴jW6ZdgUme!f>HܗoD:زx]dsCjdZKdPh Jb৛B.f{~e5LUy`_' PڄGCm A,-Nd9X0F-&&L!zi\2o}~* #1mp7xnzi5m3?3Ŀnz'4Z `,$"H“6pq e%Ӳš'\h=bx2f?wV"Dpug4F%?>˚tد*"/ڧA rZ(΅u/2 (y?dLxN^2 %ڟ>f=T9`[ L:n#]V߸Tiz蛾 jo-ѪFiF[gaF ]```M] ؖ=]W,qHuHĊKbҴWDI#>O~'u [u\k9*L6v脖A_rk8o7PAcjE2tf'S=N7=T-Խ r1&Dp^#%E'>,=^"=kW ra6`ڨtS@R/nx1bc Sy 7Q^P$]]dsnOK)n*lp[rN6sR mm݁F)UW&M`#"Sx; r8oc?fV%S6>e\NXV}fqUP- gI׵i:&FPJ7Jg8q^_mDȖ ʃZI|Ls+ SM]%)ͭ"đvS˓v"?ЄG`"c|vV|۲dq:DtNr~rM~Hv ̍%VG Zo/]%z||jh1{CaenmxO9؈ ۭwBA t/` Q#V\E=f>սuK"i7-rf>]ǁbyuOq ޵Viuu )]UdTa\^e'_`W9>4;[Z\$5CDmDGcB"&reTNqG^SلkCT*9PrʥwWDR 4c}4ӅP^= r\ogQBn?sQG~iÒ>,q:7|~>``K35F;/w)adQ&EԳ #DK$FHf YEaQR bRcDWg'PX'KՂZ{]<(78a|}\2>!j鄻ȈXj!  ihǷn@eT$tcҤ|:ұw1-Bl*=.TSdٺ[X Wt,jkP7݀.`Ÿg&sdfׇ7=>h^{?Vݬb*FZ,d*H&Sk :#q'\}rQ멃vB zu \HEbx_w'BMg‰bo$U"hwbz=@ݳ59arVt OC0ww4Fi ϔF9/}&b_W^.3t.]ECe@}O~ W9Hraq:Ѽo*nã- Vj;'s0 LiOKz9Is6,3i}SױUҰ~uyM1Y\cc7,\ɼ_?2{Iu}Qpgeh;w"~Ѓ!Gc &ç F20.]02oLL^#vQ B>y `T .=#S.12Q[9^%qGYrC{dH3MX L?)BPr([l3gVI_cPSkvM"mmb'L-wr=#CƒFou։ N"RaktMծV4c K*yoO}pmM'6n}~oM|wJ@X+hM|D L8QjA69̯c|u4C=aUKHV)6  *A)U%HGt пj.c,}P3wkhl0l &+oW)NҩXOEMX17)\^ IR.qgfMk-9}vyGJaF7Yb:m˙zuy\SyP8Cl("uzEae2jI@s^(^J{hQ"nۖ$/Γ%!I-#R/?W =GnOQ]e{0w@% ZI헆;EJ^fAȌߕ6&U3C!3Bj SCK;|bCfo;Hą3wIs. q3%iw<+jֶUAɅO2v}‘w SoDX XsE3r !h&১]*+NM׮l> L?UOV>Qa㝱s;RW`w·FI:Y'h 1,cϣ 1)xNhZOwS#6}83ɝEU&oH#]⯝.VW2<C!"dWzӔ x-:MyCdu VuJKl'%b5ִ*}+{F:6SX?bV(VxtbP<' _ f" +V +NbD>%O ^WiZ`_Hp, Z~N]{b,هj54 J`OlMUkѨ5yql~qyT22X5d 4b9/P|r}7!bԁd=w|zXbJ$8i@zD6QO-S3(T죃dhT(yɮ-c17Z+~̗4'Ϻ'{8 ؖ=+ 0'YDi5'2{[ eTZk6SVtdt_by-:^UFO-|>ԯHvΈE}kZףêܵ%B։lmVȀ`x~ňNJGCǟf nd`&&%!\x}̳!,P;^ovm^ J_RKr w3;9 U+j ͡鬺ero;14TKZxWUߌ6hg;_4f Ǫh/eMmG7&=CA--Wi0/#WTC`gdc-s9L8+ߟ8\oNw 2<˶gMɬuxw 9P. sa2$ex?yhǒT\3tiʟ8a4@m,m4\-.A (ۻ$ԍ X ոϳ_vzEp3Z r lz_*-G4-^P#Om:C.eEm]OofzEgTbZoHpNosZR>څŴDp$,^/$K|u?j0!H) +Em\R7ROvAwc/Ew Q﨣?Z+ñBOWurw1q5xقƉtNJ|0qiX@Sԛdr~xwM ]Xcl ,:j[zwߐ&>̕06alf3^2vRBeQ.ē:6mth΀{R眹y6JZȿ)(ڮdCо2 ~6_LV%چD1\ZѲ˜ap!Cvh0|KҰ̸d݆| ao+7SKlL si?8Nl T?D|*KϜ=)z9"~xlM C)WoQx`z|(D@%LɌQ/-ns4 2d}ݛq=i o'a嬮p*G`E[a=?0%o!LZ Wj\i/W PGȍ]1Z CH*vXN/d#ϙuJQ> TГ;d VQWSnf>b*Sm [fG2ijz5JIS~_8ԡv`*O}P*Ad`΁$HIԻo׉Ծ LuMjL\E#ܯwb['UJ9X]֟Ȫ2joDd4-+/].f>ÔPcڣC .i=!k~=GF;m3$sV7.%= +cb tim8TV6Ե$@,@K|'0J[ uzzYEv&:QlBJ{1IIlօ>Tf!;RRSZde M2vF"kd#935FN*~ʾqQ;&@^Fӊ"o36T`Kn֭9uC}:"{NDK`:%ݝZAO)jV%/"46*kԞ@5C18l: 3 i7adˎK?~,d/]"+ʍ6/wv5ؘs6)dNw /̻1)6f@""yhmᑼS5.V_Ô%3qtrf0 _'4%#.VB>;ZLwu45QOޱDgM96WMUrEO;y6j-IxrjQ: G ;5z=G-TU>Üq !+{ʺZfk3 {! -Wrfb(MQ=S3d"0|6Uast,yGhC_*Jshv:d3"T 3WVjq?72B4ؒÃذpYzf86 9:t QrE1n%6 $ABxՀ#wd,e5ԺnkHqCXo |SDY?F}BQ z}C=MocHgi Ok2G/L^څ8-Ԕ; z5L1b&EQejطē(f)\w'jxf!UK Qb i|(yJUzӷ%-pp-e~@Py `m.:>f"y?17{3ra0gm2/Tg?V Sؕ',HްpMק;kUtXs}qBc>D v/gģqJ{WT,Cm> /;{l{ҨFױX6/m I i*OE_!Zf קBдA3]dNW3]:tߘx֝A+g'PoY9)_L%37]Poa9s:rd T*'䃺}?>"^ F%* JPiWglX%Cy-_> v4\y21%|mCFb!bvk;T^%ʦrj {?d\{}e?"iˆZLbQC+T$oF/.OȜ.L0BYbgB@7vCj hx!6b 0gʧ,љū^!HLG(RoNzw}7;  f'w ڈl]{[^3_2ekj`b/!p>/NcLnk؅|Rs6Sv ̅3ra|+ꨟz~ͲˆoWdĀ}o *3PKޅ9}ZICyoXA`ǰA*$mx, s,KBgCvKi!;e76I}WA09C5߸݆WCQSV3*Wm umaIEh!@vc[&sFh) M UY͏?L 'fۮ`Ql:R^:=±J8}~:UA>% ߹}vO OUQ6aA 0Xoƭ~핸R'V6LmFkw8bp4J'{Q߫?D2*ZCg85/4Ds  D׽;QRkȻ\[Q rWr3āmfg{j1-ixW4^b*S/=&+4"R Y؁9q8UdW=vea/|~T&4aB80@{9;oݥ|`Nh4KRdfOZ+&'Q6bI( P ̃ܓC΅Ҫ|<Ѡ"廼[8k Lg9==C-'[x$渞H)1|@. AM/y$A cw'o||8+5/q wj ?1p8MMJ n0ebWId hQ֌ 8 ]rAheuid+`P~OyЏM>^n_J72A(& 9W6%3hU93)J} OV;3Gۺ}K8Z@-ϟ"#^ʅb%7B)bUm膼Ee:0t+-E;ZY g}IV,b>䇘3y'-ȍ6olYΝ[27lI]X[ifURsg CNuz΁u>#q~;Kwh/3kj ^BҞ/rؖŪJPREg0kkVIΏO]aHz *];bn#s e!/4#,9O;.3ū& &V 2?x"P Dt(NG;BW)Y)4+ <`)lQ̿*+15y&X+A6<)1DktV|Xx*m$7/YEGm%0xfz(,$?%ݸ.MjQxX5lHMF}2Hncb{`&b`H/D`1}-b%PNj o>RT h6P9(jfջ4c`tͽ`+ 36MC:*||)wIliۥ X!|˓C J%#ņ9B_ N( + b ~ mT!뾄B_,e}}(Ȁ"]D3,J/WdW&#tx!޽aS$-6YϮ#y,3h-|Ead"v-G:]Y0(Tѕb mt\]~Z?7UH&lOԋVKlǴ|=5H|2)_f9ËoPFLsEl&zEtP L=G#ŵLw9zJK"1UJǩ!ry wX{#ӿ>;AMW42O( ГUJc =b WɄ]|x|)侃 򏩒jZ(Ib +*zl/!+􀓕n.?ð w,Y>_X). EȬOIe.4O[P 0擛RXY'cE?Dɵ%o:#؝$ ":Rgmĕa_~ ?thSH=nɯmbm]F}مu_N4 fjXTn?f9Dfv}?ۖ(ƦsgQ WDЂMYu=uFGA6=1{s,#'Tɼƞ0vffx>&6"j1;p+p3kUkqE ֞7&5KSf$<N.Cs$Ka~ao8j@A!yr ("G PYx\rn@ؤ/i;g^em8V_R;uj M%5F-ϔyхih.+s;A4{8ZJĶ8eFob>CpSkvfN? NEJ}V,Ee h'f25Dg r;]DajmPeSZT!6WF/˵4q7}Daۺ{ &#e7jND!J>Ȧ -?Ƌ-_<܅8+֎|Qй;@UXfYզw?0V׮<(fؤ#_FF@>|՞u0ӭ+4xSf/4B7vI ki6'_EL/w;f`r^4ݾ;ZЮ -7:]K[1M+}# 9rߪpc,=lvt%*^30ќK)l,7)_X\KYLNn{@t6`a5xE9N2[FJqዽ8F!mv|YXf2e?vSJ/,k[jh4c>>Uz9Hap֪m]n]ƪ֜E(1gߺ|vܯxͧz)'-u Lr`c5"hy4n(U:w7|>S^y Q5]@ȵ 'f(`ӿQvE[EG 8}&F^3⒠oK}Df+M2V.4ϾFN]!+KlwPvL\א*}/?V`͆uoyc}w~3-vt ip~eC`T:+tz` !YO/ 2ပLSz~Zs]0C5L (tHSE }G@"g`|T7,ކv9zQ8fHIqB)5gVKb/)X}w?މdeRbâʚ=-]C+YR+`V2TwX-K(T'دۢ-Qd"RF!ma4 5{#75l2%Znk{i5ʿ%ڍ,tsm+\M5I{ h;gRl F6 o Zn@ q2hcy=f4sfiJYFcǓ|Mj/ ܟ[-\P;o&$-_jE$;^ab0ykbRDC>@J-go0݅%C\$y\ Rm[PE7tDOza~W4!H߻򲏢 9gtxz$yhɕzsQ:VHQOOjIUDR/M٧cou $6[UH]-|,[z_oYY!5jR2f=tIH[' jVW}2WX0cl5q3669t$+(mHb'_"*WF(UN]>ʲ ۯم= @C2Ʃ8bNJcu5)]jCΠv \ Fa#B  ќb1{Bq4Bg+"Ep>,j3Rѭ]yɜ:xp}T&>N=huHKBőy"4{qNɥ''^O uHŶVQ,J; VBdYNN"nb_U?_:;\4^`y+1֢݇(r>Dۊ%ߙ5g8@Z7ݕ)9LQo5X` 6{vfQ$wjRX^2QP6nvK 1&4G&!14F^ Yv cumr̪!՘Ki-71:JhMjjމbcD;@a|5\X=X;dՊĬWw ˒S~h ;;&q[ TJ ^[q:(To۶6:@4ІqKQ p7v\RC!,,u !-F}X! H71BݚlF +ߧh#>(Զa7Eo 9C[)@yG\Wx 38,I풙"CYݩsv,. ٙDj+ѳ4pԈ0&OڿRaܰO]eo$i0GU( K9u"ݢb"s~d[ =ݥkvx1\ߠd•Ξlx]֢_ߏu!BV*]beϻ=so@ P/cYָ3UPzrbZԟLNeRxб tᛧ]H MO%bOB* ;W&,f¤/1ȿg##QV\l:K-ŌҫIDW kЛwГl3(Y/^ImDРMf`qP;0J:-*F5iЙq]x Umomoઠx.B}$ΟX۸ڈA9_1~KWD;ra-S=@plK Rj ՊC*ITvAEsi6!??a |+9DdPhzw̚7xuҁ$ٴ OJ؈GB 8 `FDA$\2َD"ca#u-znI(8I5#.a#LWeMb5"! ):ibFpǕ@"E܁)3IrCr})ċNaCÑ9v&f߀&YVٲ}>tYY/ƈfbViRxk<-I7`Gϕ_p9B'F1dźaG[inF#!vIˢ5AKP>"ȝd̛w$Q4Aˊ?Ԯ麹wf\]沪+9:1&U|F=P.y/CUqYme;ޠTF{%մvz2n^V .yCY9drpYqml,ރT)6aa]4&%os39χ7A1ʽ)`>]|2r1}g9ץ2}$~ EN珅ǸfBdSaӌQpBaWea?FxO\c%|v?S]39xcSPZ+kKɣ8m?$NjXa;2KWBk&vQٜέH_M\h'o5AWҘ'\,g]+٘^i)~R;7GO]c|2H_!PNL' 9oHxtlYCp~aĚ0f *@/BA85i]@+sљ/M(Rƞ]F넆us&ZWhDL8 ݌ _,zrWp >r/2 PT[Pń2B,.=BNAc 'Ė-:Ė|%a1?3ZF>NvDKEU=8U"WtWnV!etc-`ksuStGMPv?-ajHS5?"YlQS㐃<鈃sGDkbӬ8o@K97-#\!4:krC., `2򯴺KݗX>Q?WЉ$ښ*ĝGp] p3/n-,)8sN&}#I]35(/~(vw_QF̊NcuݒM&2cT3_>ET34mbLY>`|!Na ҸMų &'ݶU F#* f#]"kCqNQ5sCK`9k1"aQ3,PDzJ9 GAs#F;طvyrS\a0!ӓ5=vHX򎥹CK0ѽ0EPCVt¢g*ׯE!|_k˞PN8£.U}byD:E ;=!/; 0.zR[ (&!SK T|7GndtKr>Bzrݢ+ࡳB1YT)ڎJ~  \[kLG*␀R1 h_ $wII^ .xpax7$ƒ%$I*c6z m hZ@mhXV&&it{kw 2TZ+j*^(rش.]RxQKX+^lj(I l 0 Uk\aZ_B Fd#c28SO%S|S{i#M`[:?CY%̾QΠ@!T0x}y.6O.CQ@嶞қ'!id-n/wZ2+Zr4eQhOmؓvR<9VKPAg^dRz4-qҬ̜Kϳx x"*]YZ1Hv~UbrZ(v߼/+(3d761! 9 儭G'yP]L{`ƬSUU5xG"56֮V0dqd#HnnNی3^C&x X%hzcF:-3 [/(]G.|> xg 7*}AAP ڢN: %KWB?A%! g7m$i. '!`fmb s}%f̿rfza5*.ɐ,q-' v0Ѻ1@T1IhI |=Lb c%tⰑZ5y؜t"dqnepX++o=MCO0!Wx90"3WspɴFM5: &s5-?-Ffg-7崍@ܟ@"'A;tˀTN|b-Lwb*1Rdk-ƙ7u?&3ӍC rqJ`bژ=_?:OE"(d@xGh:Њ!K)T[-Š%^>n3eKk|QE3Ҏhv:U/Yȃ<1m ·$M; ;LBNl/we qƍ=TRhT  X.o@!$)51Ȧk*ϻ@KU4y:Q[0s K5XG|'9 <|<+N36vM=/n#+oT4IYvcGridU]mAqGB ў$*.Q1}[t~ve`<.E3]iQyE0;E[tSڵ$ 'BeB1O"3Eo7NvZ6LEgn@bSP#3:pkU~jTO}^ƫj vI#ɘx0*̝Jmd=_)=>%lbw^MCٿTNRօ \ ~ںc9Վһ( ƭ7p$o1;iIÎ)8F7ء+f jKBm:T_ED0.VBD /p!!A6:†N<ʛd t!Sb&qu2_OOsQpqvDNHiu+#kҝ֢{CI]G-:8x@M£~w@{(aNUezҢrj}>~ yGc))yN?nz6RF&̪wŃheQ}筩;ib9Ѿ<*^vb%( vVL ;>SW"GĊ׋ +{/ 8:*R[3Pg;rI/ 0cN.Y9[#W)?أ$`m J󥖄|D?Ek%k.;͡8rQ̦kEiWϙpc˶u(r+FrF7v\1 ^,d2S2)UQ&%˄a!N{agtnt/3K@nD=~4sJ? loѲ%M: {qߺf=މݜ6~'(a9E;΍x̩[ 嘯R8jd>B7pdO` 3#L+*ICrsJ$oBhyDbP} l0zsR!{U 2I6_a/v7Dΰ(S} UjL*8pUr$ɭѐjZJ愆DeL.; d* |qxTb<ƱMt|TΔ JHUٟVȿ.ѢLɧ(#(&hnR9QgeQ WMA)3Pf\RtTy6uIm~܆̸?-1^w\P/>#e&GD{GSѷa_ȵ.CY/Nm YK*5YzڌVDU kuVh#lv(`hpJ:y֬xiWBK\piF=h#r@9> KoUؽw#L'sFT{֦6}t#>n4 ;XSRqFRY;h-,02W,\FϺPͯY9VyYdvSNF"'׍ zpD޾cJ>2Xuߦ@VN[G#Pr{:HAfhڤfs}:kzoDf,z/>]~NvQ^jvrť< 8ZR>,crl7億*Sќ"WYFVC_0NzJ9!%ۻg(ysS;x׬6Vk[=Nkُۚ/hzZ"AtT4A*GO!!ΖuZF]Ǹv/{f=-ݪhPj?gf$ i.eo)b xc7 BsnbNmFTN ݕ:*},65߄9UNŶfxR^UR|~LuL3_͗>ZnRBgTHlxr#AKMpo6xƤ> U;#"kRu6H0! Gs.wF6&gKcH\87-Č^K͐$K덯lDZZX6>!wh_#2h#y ~Rbe&}>8~n.w?hɿKVmƖ |Nʧ^WBj?L0ZذtrX4*ilZYp6Uq!է.9J ( NeŽR#D%/h68Uhsn\0fKTt]NAO&?ZG+t ΌONYb C~4t6*9w<^;iw V=M=ѲA?\p'^NX) Et/ 8o7a{C\a%oܶ}i%1}Ђg:ݸ?۷g2xG,L-aj=zW({C2{Qk3ج7hP7:AR7@+mYgjh}Jb46 AV(梀dUgP 1zm[CyU<;h`6哪% /͏?K@6v;V*a/%< rz1dc69RҢgPO1׌tC'5J?uٹt.e=Td~x9j&D%=p9fL4~xVS}k'{"^]fi ۟lyENJšc XjXAi!i1.KC< 9E)bt# @E7I,ygI n4utЉ!>l6vHav"<>@ lr&y}O?wfʅQ&\aI8tT$M?ȟԻ͚;*9G(ɟ3U5Q׆2cu2_zx色I/m] r*o-Nb/Jm_)x4$ nJՁ8"bpE{bԞ,UJ8 ΰ]^6!N('"'Jbͫ>cqjpWBA]y%(?^9 vJ([XЙ`?K"f> 65W ȝRΘ$] N_j=vdf8q%3J%aҬyͭT/),4t˽X'J ptXtӞҮ;T-ms_;ԥkR?_$rtY^apT\^jU5SwlG ږf!-{{ťPJ{>=oWZuWZ w"xȀ^z#(b,?BXۊgC8VwcD!0U&>,qmtz{>Js?_`D4`uGد.lm sLC%}Ƃ>V>,Y8Q[hZKKv䟯"CB@ b4q%&+Ol#T_@ѯ1wG-A) L-uDW=3)áB)fz1è{iH_Ɣ ݏ, msqUwїXʤ-F)҂зlaZ{cc/62lC i2D& }#3k5wu(iElhӃt "\-݁;65^3 l\36MCg~}lhh|Պ!g̗f]3V,&{AC=ˢa/{ Z;h[@$ûq;] +c4u''``HI^0z+}&{!O;Tgxf(m^}1jhVc3p]QsnbO#=\qB[f')~+d-hizQ鿕"Q_Aoƽ}a]nFGҙ4A )肱]1er9æ@;.蚃k2zn~ƈ4v52 ,TJo_^Tk=Kf|o*qSq&&Gse[ȆV>K?^Mv>K ]z󼍍_ov9( erd;n M)nyi8y;"zl%oCW|Py̲@1U-RЕ>a{TPȄÛ?F Pꨛ2*0!VmdsoCRpKSr]p!Hky;40.{CI3}MR h%zMb+3|f:m6 w2m::iKVd[zzb,{8( pܪd`(eG*wĐH3χqn!3gJ?,wT.IM6]p"~2 ;55?-4.IR֯ꦢz`N`L~/Lż+8[55ҝ r:k?m aNZs?$9d,e U&UZ8$N .عfμL۞DH RW8MWs/DRu_qVY,2@.]J$QeNKTՃCvq0| $(iqX\~d B*ߕ%\Pi~b"Or}lVK:B9Cfm/nڬ};DO^g5%ҽE.lx(It b<TMpU e l'MI0zU$#{O٢z2x'B覷@2aqd<*w\PoY{18`@].279 O4 ͦe?k0ȣ1 (zQ]Ʈ #^oS 0w83!odruaY1Xtջg'7ދA*fblb=Sp*7Mqf? ᙱ5RyN#߿b9SCGHI8 oTr֍0#⿇rLǣIwvUnNP` `WJ&nwȿ?B]B.~澧00[S:d5 0 sM:@PMW|?JE7R2tw (DB+fEYyG,K&,ksҁߩ>]^pԥ* ,pB&:-KpOX#ZS~x5] ڸj0kѲz6{Gz]Plnpy9NE FqW%VMr^bN{XJ^./H,!_ 7 `tdZ;;?>ǿv'ɭqn9GmuYrVtͼxph[ͨu{c! H%a ʏH݆qpʳpYk7*TΪ6$ @5RٳuoyPZeIbAE9)ζ*fasRZ:^RæMZ&(* ɿ#H3j?glCCkhte1+l2خҦNݿ}d] F喙Xj^8쌈_]&f,MV#rN4AQ{oh: 1~8KQ1¸^19SBo(-U(U_Cٗv杣!]VGX~d*Y7 fK\B}QPVB aKp;%ͻ^+|]' 7:p˝_bc|!Z!|C3oSL4g-Ba`$0mw'Y @fY1B钅5@̼iqZ SPRXIstdzr[BպD?.]4 #{ :rA8<-l"V+e XnD;J;- N& e|e6&- 䘃 R MUc! }/ ݮZ}œӞ ź U-RƠuaR8kQ۷m?w@LΛ09?x7+r\5[ɝKb,M/e!SԆ!_*Jl[ C XtvҖ4FjB⻸t:Q~rd>zzbbBxl_Ng7k3:91`SS1Zw!`<5wL訮Gݑ՞.}䢫N7el]E%J|$<{p|$rטLOq>H]S(?}kB{@n ns`KM[p$e|͝򲏓ȶ+BM0Xoj+Q2"JaqqNG6Qad:K ]@}ʹP/5P .k>|K^`f6ld/bh=,ƢtӲk[L]+Xv@ ZO>^mi) qNSOs]v}8e$54r&a5Ӯ9J`戝*[0lõ1Q{SÖPR2PK7g$o0?:nxlj[}ƷCUȞ3WH@bgr,uO̬:ɏ\'}2KmFd{ah6g˪]aO.~\_N)BuOM%*퉮?ɮN;nS 4Cdy(^7:hpPFR]߯+YUmX)õ4nQ8``Kw'Ѽ$U\z!e}`TMv#WNA _V_B٩ i%gRnq>m +,(r%Y=w!oɰL%V*0u=d{\O fmܵ"W/c7 )~"&׷b{ dNj""ukL[KG0>O>F?n4|0W7G0R1; W* y}HB#ο? H UȪOo!<0nnC٣~zMgoyKNk7gV[-cc{REoE9-!9fs+tͯ oO޳a1y#HQ|_"kom߼y,?!|6g*Kts( l)TBo>hřƗUsa]O߯|m01RME;0L]rdn9φcߗ5%ڰ/H8~ ͙NLmk+Oܧ,a8 `ݖOߎԴtNb!2  b۾T6øww`H$#8]l-Kmu.o$ʩ"F`,ɶĹdwI 4 %1¶:@Fy2[ 4Vc(V#Hx fjȄAo6kId枱\aƾ/qK։) nCjZlbF^' .C̖5k@ahJ2C Z+#.ފe_Bx­0RUD|a4N!Xq5x7edL8j ]Yz4]'.mC_[6w_IAݧ ama lEQJ 8.]?CfaiMk_b*Hw6S2"U{?&};*^V7yQ#"寀{ |*LM99X**حo*֙[Ԣ>p{K;YCl poʣu[PVfZ~n@;!Z7 Φ6^H؝١ɰo  AK3>vea{k*@B/̛-j{IxrhƞPt))# my7Aw[/>c=QsR5`|ԷX1rpBh6s+bz-i +rA-<޳lP4H!5 i?Qjj2 U@z` a7d;@$4I25ٛC `:wXTk8qaEsFQT%X]#;X],v r4)t붹0uhyˊ J D\SYUWYo,y9u@zԧ.Ȥ$)_\Sa@7o婱 AK*Aq]%&d0hjs FKwM~ 1~oɚePu5\2( ;һ'.㹥?= E>ǡ`ujz;֬Y(Tgi~_tWo o~^{OGYYM- ȷJ2Tl4$V0jfE`3h7 izby|EvSvj g7dm1漡ޘxcS]*[N"ޔO}NRD@CYYO`z.n{a$P%my{YvJ=ĈXL$]%m2mڪ7OT$+K1F "'5H]x!j={+h(ls,"@$r!qg"C Ƌo\u "!_ӭ~y+wh3y Gu$6 cViXPu 5dUa0.:]܁=TBˏ  ]w EЖi:AfѬRkcVv;*lD#Koa=2:N'wKɝ?oV'_WaDz&$,%p\=  *%Fog3T9fDDO\q~MX9?FZWٲ S0E0yHГ-~Qyc\X}km|.J&cs/ X笼wwQ9I;bơyB_C[W,'`0q‹&\==I/0m4a&4=Ǩ|?bF 2dL֪Ht{Et WGH.2E-HwPA-ao1-fïµVF@98'[Osnl$I |~ZS{ %p؈~$*uF ;bиoY%n i}GYIBWo+b_'r@u 5"h(Z)"\f?!Uk&l9_Ta½/9A%bVC4%MǬqԆǯ9²̓9_Bs<+ͭP4aoIG3SN `jYZ;?4;=hܭ|œ]gA!x˽Ȼ5kmYdRS@Zˇ4{G{aUaKnErAA&ܠZĨ3^*~/bh1ѐ4FU+Hq8Yfk"jQ"S %pq0ÜmmEdc Tw#!ї7 :-a9˪AxY&B]Fgۄ3+g) ҀGq 3#sWoRس>A 4z=۰]oXu+s~QT9~ʋD)w7*[2Wקu{ SMS8[1HJC%+-9=BC+!A TDR#EY>.q%7Ϸ88 !V kRA'O_0f:h-њT gPD=?glu٭)BIM% SFTSz?;$vnG*_ܾFg:c ]'Fz+OwXQ8C-&뷋lDZ_ňF J˚)efn Ђ)<]+M.YkߋADo6HZmbH~5jDmٿRXCjKzNQ,ϰ~T>\afUiZ_% YN2YΖnoIz<HɄDC33,i;ΐS_t\nJmoeis1m$J;0E0YVJi _!Px],XqK *~QY@41A]G?b5UP/E'•nMQ-TuΠ((zўsFG#ҫ6.lTԨWjșS@M7*'YuKIݟ^-4FgH#5w/OP!mCGOP!!j;`ѕϵ`ɱoW}Aѧ~]VZGwR0\}eBVY01 !%0wO3v AKgC3gxy7.޺]K; u3~!-A=WoY0s3]{Cl/9c/bM/vtȫ7v8[v>LE}VSc{{$00)bO6ei4PE7:B, $ɚa/^$O{ <{e#͖VF{~L{7F\Áфf{1^&O[C( .Z#'+Q?aJN5󽊟JU̹ ;W 9wOZ4=N#줏`nM:'"{u+uh3߰񥶝cɆQ'#ug7WCɽ{6#%u5m_JL ™U Bgo N创ѕ売 aօCW/A@ JlS;6ܘT2Ў{wBqyjKnwwIV!ZT+eJ@uDܱ$旑 Z6U#KηkJܤQST6p^83lsd6WjЭ8TZgٹ:ډ޸V9B;WtN 2>^rNVa-t ]IWr=U("HHt15}Xe4?,8OZuwV9:vKzf KRߕ .]w)bERzެr!7VΧ?H!Td; J*HɑHN̸_MĪ'{2ۙTs)5m;L̈&`ӼMEȄjZZ g}\0ӷ_Ҭ,Rp6ltn"Gmh6Tffܧ&'UZTT(QcWxXG#%-ң;K#7ޘ1XOp\KӻIiyG Yp˂I5,:o2 X{d(EzvPL/PaiPՖI[lU(}l'tQ s3]$NWݒhrWGpX?QdON=jS䌅$ѥcy+ @}r뼣qnbfka\pS5Waa I7NӠTL:rb|ԛP޽"m|7QlezI߃Vy*&L#<4F!b,돪  w15s ?ԐmY4LuRp -{Sfr益 WYz9G~R0|/R,k.CdOOE~nHOksb %Al;W4S/k4ʟobuXѵ xL*)KZ>òa>vQBnLM F?Dr8r82߳qc~!wYVkr#ة[%#)؇\ӫu9'XcFY ݮ%ж7w$E..#~J.}|6σCI)+sx@!/Ѕw%@xBlU¼S 㘘 N%8 Ũc 7:Ӄ[f&0 -Ed-ʼmsȸ0}6`j$u)I0ɜ:2D h?%jK*C_BӋXl$C?⒟Fe=6^Ag#-hyAu:=[Iҏu|JkuuS&8NP坈[jCN>IC^uA77&YgݚB—[n?y e dB;2p`cW|.Ts/(~]'P$w#S[9t%Cw:$}^e_(#Xe(ŖS:8SiU+&dsgݵ-^/97H| lczU::C8-,,egg5B,pI ޔ ʳ RhmtIF$x5`/ xJbDZ(%O=m box67qxk剺 4"NOKsIkyKi ]A2U)LNةhA禥yy?Oʎhi_Q/"g-"@ÏAZњvgeDnG$B5کd/\z_0Z΀$W'=LI'+ ~VK{K0k(EDR ܌7En?'=ELnc:c냥:s1^לd&tTvh07=\rF w+ggc1^֡K&UrLGc5mԀ-Y|d?Ƀc 4:!i{s3dh8/URpשOiGΈK 6\E-f|"6Qy^ 4ew Nƞǻ157״m 4-] vl-T-nsoBܰ wEkGLجk'w*:N R.Iw/Hf@U<%YZwӯ1+G_ȒTf =5[YԲ@|髺jl.[ ժGtG1< Aő2@4+G[v9JGژ *Y' 0ndq^W H=mј&g X]I2cR܎T1TĄ 2{VC }*\ItsdR0`v]͗Jr?I9U;10vFPw)NuDZ" CNeo[Ÿs b`B BL ˬ[k抁ЛU4UufiTR&E"gIZuٹ򉑏ж{G,1Pc}TiJג2M cG, ΐ !'ō`դOmWyAx3)(3G5s^gܲ-ihv1Ad}d`ijh W=eɌIy^]nndr%Xox.=F9Ay?FWUj ؛ 81 ࡔ7yKq< F"]{~srji$5so12>u_1$ 09gx!@{ Ųߴf$9pT`-K0Jz† / 2n X_Ķ SXK>g(#W-?̰(zb/U2mihBLvEK͸Ϟm6b(#A㐅ga1e?ȗO-R^nNm XRLˡnxwMɯ*x/ Ti3?#W1R97DqZ =zsJ3YΘqD6!@TS/gIRAQ_]4?/{ݞ _j!EXxyDЩduӆ00h h}֪=LU$+8QB`׾2 ZtyKpl Il|G4wurWsvK3`cs=3ђ'"פYܦH>)ETH+. 6ð\Ű4._XF@Lf+՘$%OFPX 71+#x 44\()B__ -d»&U} %B\q]ocz;0Hz]y݆9&Liif*%kD?ix5|ߠw Iu,'P};R|5}8Lm/eã~+ϸS+5L hr}g+;aUHAJT+dRunIމ^q%{5˥Ss5Jtjp:ò=Oo}X3 0hU;\0X?-![O!XpP1sOd>%G|KzCnu uXLVL FqĺJ2yћcI/W#9^۟+G11I(hqQb/8x?4B !mHIY %T"u,ǚ4ר^>F q:X+$(1P]iM }s#vK5C2Qm>딶-}3~^SxV$jf&x@,Ad o4{qw/)EcJQ|)^*A^75+K`9#mTmO5Mtc鏎04,O͢[Ml,S5^0Akf/uS%`=Fd%КS1d6`P1xQdu rJ|6A ̓yGwPz#d4ڜor =!mwj-=9u$2C\my@NAp” w@MͺI9$M̸ڏajKv¹$[3+x;CXd_Sm[̫Zi}@^%Uȅ_5_b4[ajz`Py8,bI{e_!LaR__x9i/;q_ }[Mg4Pê&+(~Oy{I&6E3mcTyQb{;+ęώ|Gk?\&dѴ {tk̉yQG`C0evR~(ܐ|}y+pc UtX?A@gLxK8FλekgՐoE"ʒrd:FW: $P%іj֍6l$|N/bAu5/Rz=qv_pA= * ,c Lh vt k*,@A}Ju)旭4ޞyHcq4ԅXawl1|/E$|jPLݯtAiԁ͚o7wH ̭z3e5ۈGVKh$S (W}߈ D #<`9\:g]~Y.Rw  "vD,8,5:6 6PqEO" mN,Sx_gf МhQ_oŘixK(.l˕"v;Q&Ѫ1$9vdVU}# [`ֶԥ) /tr~;[s,ԇw):h!^=ah}Lw&dv#=|Cn:I HI5Ŕς7ъɲ&3k+,(ZsC;>$Cf 54!q&葌шFc[CR4C-<` Ub!<~Y?ɏHPq &f tHt-|D˨Zn>ˆuقrLUl1 It!]6!SGt#O7XA:3|%Yi,|<KOT+Cƹr䙏LX`e?bzgj$?Ι%CTleLl8>JnlhF);Qr |_6 <ėQ>̅q)JHO+) Я:Yf=}سӇSd$2ۤź͉|VLHZ+sTD\9呎BAHyypgPH,*',KE_2b' N:+3qQwvX@ȅRrKd1m@ú _ +g#kp8`諅8pc_9dPmWl* cOl9$pD?CI}|\X`m6)t]z6?lٝ RŧhJ?{]9hP=%$91BYh $i 0uqo;u M-SO tHUu%[5 > Jgi|\<.š+slEm{Pf"d7 B-1E`i.֗u(gWDH2XXe9?+No^1jɑmjbNK8BxQ!9x"Te~$7oXilmjR%<?l'P]S)iaɂU1Kj_Ь cĀ邨I*&*MFM" ̦J?bDn\=c?Nb쒵*"#S=^::anqPmz9:ރKbLN0@7ky(+?lr='?qk[> uL&y4m}„w6!![@k͗2mߐn4,$wQzvӰŁc]cNiAL'U߽L"#lG4KbqbIu qSnYK跨-W 3 л.Q*BLD^ɏHuDT$򲪴zdZ[L,#^B)J֫ ^oTDJPdب0ퟘχ2I\DH`F9m:kHMﴷNp7q;S#K]xLv&veHS1Vߗz0QsY޽_t'IxhNڞB2/PlFq5"lǖl e1RX̑[TeyXŀ! ",y^vkϤN&z{SVߟWFTj# d"jy!䆵:,*ֵqP RےW2/ (IڞxE^Ko# OxH,MB|߽25<_l lCmGv1IKAr,M|I[I(~_EޒsTAZ|J,d;k*V&xq=,_aM|X>mYkAG7+rб Wfh'XjZxޏT iW:y?l],T9n^ҙMFЁ̑݊ҙ@?=)QAYqxw6I V Օb߭:]󤾫bv^yUJAs:rW:z{'ǀv=yjk-9ɸ1s`?Oiܮ\(ExZ[_5KFH@(?6*0S ..҆ЎdN[AZ-`w'id*ac= WAY(_5;&.&2F9 V}j{0 l`з|:܆筑}N$M~ #ַ'`ynUB̦ t?Aqդ.zj K R1] pt635jq$%{h$rd ŁDXNlfߐ-JW8jh{0Mq &(ҲQ\hݦGxU~dB4=#фL+XϻM%bdsU8Uu@Ϳ *XѸXiIi7-9TSaߌ/:eПŞd/+&ya-#A'-% 7ԋyetx/ #~D,C aFoWk'mCbuZ>kN/7ע^\F)+iZ Vh eU?/-A42ηlcZk3[v6H)nrveWd9Y /ifc<fڌVi%~A2I̵ i["szQl2"r0by8F0s;:TpĝFZS9H GkNBTY---;);Ճ6#g|\PwJ)T9גY ƈ #mRS}!xKEBhEqBYԕa>|qHxwu0BQ?7{𛭵5@NHB^ 1d֌) ad?=B]0Yw%@Wz~\Kt;;&4x0^˨E'jb lY<ʼnAlh(.>l-ͫ~3f7)=V8#3e1Aޘ'רIFݎ9ƐԲ'\ Mf$~Z}̒cE/ӣ F&R *X̪ETXW}BUm/t$m§XX.dz%͸w8W>vZ[o.c <oOa5C}~V`ILx{+@@u 7LE<*(rB}叫S7uhYM1bmmةp|d9mz~6E9H#& آNw:FpsJ&| 0 2=`:9IiV/DwfC4GDmjo7j^ KBcX14Ʋ'qR׻:oQAxЁ_F.yuW]FQvS&\ՌF"\f[,Px.0(SdSoC}?aj6(bWqK%geXLuZ9 iC#}x |M bXoP9U R=c!M/ 7ք>z9bS7i(L%H"q3:. Vpbr:fS,u00qIzJ%N~.$ jԎԝ( +[=H)#Y5y7$O!P\\sGsAF.dsTA.r+IfNu!ysf'jg푝PRQe:>$H %f 0?Wt/1:7P̉=whD)3aBVoyW dQ@uQ)%j)UabOǏkqgu6zxL/*99nm>^S4-©n jl45AONNˏ]33ċ7 {!PyTwH( *^Crg9D/^wYcL‘oI8CBC6SOgy?7L pyɘpp VBwjӁee 9֚4] | HTu\d^ IkwsF8JpeaoFbS0!knC R_6`iţ1[=1t a8api2Zk~uy.O+gGI! ^Ru&Ddu07jBFh?*~Ca)=j gH:r!"#6vÖA>y&BIN&c/.ez' CؔiH\yEBIQ.NlmgVVo `)m(P/OdSuūS$ Ay?>8TrD;"2& A:Mӑ&H9W(*Hw`$ٽFag5i{XooE;@[1U$W]~2IpJ>ȑp\U"]ޒdx=/pPF$ r+{lZrOiڨ*x13="s IMļ, L⎅(cɴF8HHdWrSs}V旲SP!5q%4݅^YK㺻 ‡\*4O;skL"Hhd笤_QLr& l>?nY2,ÏX9/nŹueT44*kVkSv&{%1UQNn{u%b#/w!RS>n3OʕG& W:9}h<6L@ ER>5WdȖ/$S&298<s* W?K ۦI0!vdH>6{~]XǺDluf-h;zӷ@ـG90+J'$ǒ>FxϬ!VVd쯝PyOn{6."o+ OEy,먉<'يz7pvd?zeՋsxu5/CXSۭi>1g4/ȳtEL0*C5U╩;T MQbEv0I@6ߢw4ALFvנ"$/'- OX)4 luݾ|L#>j1-cY]q9Y~P0.흢"?J۬R3UYMIM\NQrFأqi")sa6I|ms<>w*rS= KCWۄ8ď a#mP԰VB%{&@+㭃]isXa<_Amil _,\95Md8d' 굻C;?UwImd7%jUϢ ?8NRDuIK&d^>@b݅z@UtgNH{vUA؟;7TfɖIDͧyY8.fL2c%?!:Qrqp2X8[^Ve2yl%o+ 2zqqg=86'թ "wN6EC*ХW99\Bf-U/%HmH};N 'mT漢s^[|u'r_g=P}h}FPɸ$~!޳=f$GBXǮe1Vn&vmǾ&[d+=B@i*/q4[#7!?l*#+Yt=K|)>zۦ(`"-`RQQM.BJDN DBoWt]_>WZjX)T^0CeDY #\ȎG[ K'aK(߇jWgc<.vځn̚*5S" gʪl oxDz (_A, 4=zf]vUW'})iěP٣jJmෟLb8ٓ4Dž0WcBPN|t}ϪIm69e^H੆#ZΔGTSwmƮlNxp bw_@83M@{g)Abc!@`#oXTF"t/,cݲR*9'LV q Bۀ]X4NQ?ZKbh١?mq[5[Zb{.!ج}[ Վ>ۖmD.9ti\nMPMwW(~1 0M1lzJ_hDKlaYC$W,=aO-pMS,k>hF +n8~IRUml= aA G<{ [fvDg7ukfg }$D[i\͋R2JnP<}Aᬈ7WvR`g!w40 ȯZ44U}LBŒ &| ^Æ?UgYZ=n&/ Z ~[n͑?f & <ф-ނїNNYEg!ͭ3jnhst8w@d#ZLK^qa%]יBn[̈%*j)emfS8:7FoGV[*DdkZ{ʈBnՐAhp=Heɨ1wmn04X'+pԀǼS33gsLܜSl| >*ƋxcVX0w+Ƨ<a-1J>tn0bŊY%v3>3y7ؾ+'"|7w:6biT\Z@v;7xN݉ADc9 ' ÆT5Qd$SnWa{ڳFع{E hcB(1-GO`1nO9C 0AHGcJE˼76#7 m;Rjl [Yᤍo0qc-)6Uӿ.wǦST_ŝ:.Ba8xn+N\qIo<"~< LV3Q3Efa3CjoƤVTb}2" A֧g F\__vw - 7+"~>+OEZ"j@ Qrin:ݕvaC-eݛU/kK֌4^G4v%Ow?DmV.\$?g)7'ѳ0y>e(:H;ZD[eߐR%7\"+OI-j|-\fq-!Q'?/zKLKJCX_E._{x;`'p"$0µTibvE~F^ObΰNԛ1ͧǸAٽGlta*cKkJDnjw$]$gŁ^R+uIiY!y>ys01~ԟP ! & w\K ]̪f HG> yNûǵ L poawv8G Ll:)}t$N`GvۮV}&Mq莘Qu9=J4ibtH8+σjBr tL@s! ./UBM!GPED񿇎~Q " =vK9qWp!b wps%i>)Rsg KԩJ{+XjKŋw@}I"V8+˟lד2odcÅ= Ҥi` ĪLq8 ڃD:5.G~[<Ȍ\"M\xw%-IUm5R.+z񟈷D٨L%ҘW~ o+O*ef]XsSwe=ׅWhxrm8#% ґ@9og8|Z*Oc_[t*`bKװ$2}F .L[U'2'4=Li$`{آ%eFd.d>595uZC ,2۵DŽOZP3劁1`4I56 -ZN3ߕ&ɘJB( 2`~f?;OAo3|-g 7e͚CQϊG2f#|^*)[C3e>j>L7 4i%8$L4xO#qq"%<8Lť[wzcՁ+s{b]%-SZگz'_w&B>np{.h&9J3Yb,3Nm6Y ۳{qݢC/zn$-5k ?ZCBwC[ H_Ali%׾f-1i('4i2K_<jtzCxtˑ1)If\sH < Rx5ID꫍s`n I+M?l7v#XJ|FbmG||\?UY>GtVتU`fu<e lh F@8Tmͷz,ތB;ŅLry$)[~ɱqZHP-?3 ˒Z1\g8ѭ_mҔ&3f0<0v01הfPy4Zc^j`.#|M+TO/j o^ow=6k5${o/߄"_ * %@ܢuɮ(vP HKxLwXCotmM]>qPmȃ_+nS~MR"bγ9$fV-A;F>+dgy5];K7ϺyUzڵ9@2C;-/ Tg#~;="w`CZQ0qO"\Big< K2 4ה@~dHa68o?1B% wf*]G)&?%$pRakNMr^1WnR/[SI?pU?p> |HHE>E(&aڧUq;D'6>Z$Ku 9 {bᨱJ ' ylĎWb=tr[ŋ ×m],[J@LU[S%J1)yo~Iqۋy4bI)G4B6t"Ԓ)f6,Ҭmz.]㻗u^)LCB9*pO7Sy 8zP9"zrN^:#RWm7+@wW  JlOdjK}#zy8I5/ab"{T xw`)8l֗>hd6mjo$QʵEQ(Fe"lոͼ[#uM@*\ ٜl>6gr`}~Chȩ6"*AS6Q$ m8la72O?I|/|>&h&Bm@3ڑ4rA4C2~m)FBn+bIiU%}-?^ Qނةa~SOXaEVRY0 *Jv%0 *D{Sr!jEp=7+{ Dx>*a+@j:9I8`/ہ0wM ѭMm\Χ9\.g65[pBp}1^tz/)҅qAe\2`@;/_$*Vmo=&6ti$1ӰJfKj:E^*ȝ w^-'Wخ@."TaRl׀*L^[Ap3y4sEpczJ[CPr$Gڲ$C\],:U$*7~ j-#c5|II$ccthAFv/Dua(]s|z'_d|'i&XFkRh.spFdߤbga^4ㄊ{7RtU"Y,_p_ޒ=wg(Uؤ~bW;813ۉiWɆpϫĐ=Yظ\\(J+^|)vV[ 4/ՐE_-sdRXhɷَGE\b!hth Ou?2zy ݑƷ+CHƂS)22$XDyE)FW P&9j9(L(&RdPS rOOֿ@vs;NelAƷtɐM%l9c!+(رko4܇y#NsNdy3HjƾPꙪ^.Cn[s7Ċ}ܐ.4zϳL035 g@2Mp=AUOTMuRm/W9Fցtz ɼ`J+ݬxk9 ۺA0F޲[ts<ŮKuyXg^_w|\}rFcL)SϾsz?ƖBOȗOwF|5 -\9 p: -{{SO4&^{Y: ^M?@D+ϳn!đLmN{-𵌻NV" i5_!H{Xi %W8??_(FbBςBvۺ~ꈍ *,v>k@~Să\؉i+Jv{+ '7M'g4ggvzV YFM0cywOp ?fPMdtID$DS_F#4J )X-:V_7 vHϙZu)B Eދ5/&-!V$~J@)ʹa2)J='qѠqR:C,6!&!n=2/jeG(3I')8cynϱSxeN(o-gT0g:vg4C؆( XKu[U]JɈ\l6Կ_*#FЌ-7dbV?R;r+PNhm#GUz|Y`НM"4cG,skJqR&[mjiRuc SdL 9VsB*" 3 ; 4;K;&L{Uٍ jQ|Q5 _ h| v@EcN Ϡp>H9ʜcw4 |,d}BG=^H6ocX+a(wKa1@bapkK5: X{ JE[t:ysդӉ9@zVŭo 8/p*x P°t\"b6i<8HWxf`0eޅEsNK#sI+S.BB G\!Ηo3G@ֿ00ѷMMoO] {>a$z0sCe4ȹD`,%$} RF׬ʻ^9 m?zCġ~Ԗ=Ƞ{Š6SYW#죏d+6 ЂD+ڜAzΞzX3xӶQ34/5D,qHS|FPM<!fO]'}Q9;:&fj;1XTOD1c+QUd[)Pp_{q i=\/n^Lj&Coa9-D[DP=2En7%6E)Ƭ'0ӄRVd"*"ɩiП+QKҋyB ]ix@$ssƂqID_9D:r:vϏW~ >(~:w: Q]GU 1m~iË'Z2b+ՄVswQu?<yS=Ydl䕟,/ s3? 2ۦFl2Bu에ҋZG.<x~LEQ(0,NvRfuAX#`2:ӱobCoS쭯6e/b<1]BK(o=~hvEHܢL60)S҆ʏ!aQ8H_R=X#kgE$);u1]߰˝1ܗ qFfAF܈|% 8†as aw =tĺs0)'Y-Ű>3 RR~_jz Bs~ %w vMvY)~ p,@/=rd2c$ 'cِY$Qv|"q"0aj)Wƺ ]aEBZ nYݐa|a)?{GJ]]LYh.lá҅[&?#КY $Mk\ ~Lo%]sw+g !PVkjv0[jM<ZF(=-^]_~ ;2xZ`Ww Fk;YD gmzc,`iU{7(rP'Rʑ,rҝQL[J6wM5#ZሪeeXu?m|#R4΍t9]tAIJg5LT(b4t;7H!Cy z^V ӾK*J(qJl&5|IkZڸ4bGL09 ? Q5fSЦ]Kio}Ě8{4c`*qM.1IW\kNީ )VgdP(92g CzVPVCmٸo &M?25J^ lh@`D./uV} |ʾEBuji`G]-- َw]ѼSGY=5b-/qys֗V1mT IAQ/l*Ad#;e' OJ 5z;8nඌHO&ݠbW{,MWM۝[@adXH) 5:k+YߦYgR75v/\6߄IrdBDS#3o7nT͑Q25a!l/YeqYoqb<Lj7H.Z.ONgf_]z̤e%gp@:USB4Bը>j2mu=3DvEn+ܡ"jTc>~(2%] TrM:neg , y۱aۯ?2X.RzwAjZtϩ p Fh񟼷 54PID"X Iw5VjpNz^ۉ 9zbkzթ#PcEMK: Ŝ7wZ^1O==Ggz ,W _$#ZٴǕ4{Eg^"OL|oU͔<<؁ߤVc:tOO}?`ːr{נbYAsi \G7ՠ`-vz'Ȋ\p'&f`1[5XƙuӸ=x2<^ZBy&0rC2!}:YKdf .]tIU]5""%> ]nǹP,eSlUɢQg/>D Wu4-PO1"1Hrz%SnqbxBޮe_4'E1ݱK/ UӍ"6rOsrb3jt]GVn_*q u=l7n~fhR5.`!*y~-?.g'چ$ǸaPoN#5=a zh4βIr~ ۈRAcJ"$N] E7vY*mw_XY5knz7T]fnÃ<%f&byp#_ZJFhs j9.ì}ݗ_f>UGg?#̤Tj~#eM uA9 \ ">BM9!ΰeb*4me'LY[[׷\j_ A\N!7SͨdG)!&u?ڱ 8-1=g_R\s H͑2=ݜ1 jåI,h/I]vİ_&3+UK*/dvfX]W`*W Hᣱ~S1P~9"ZX{yQRc#(7 CV.ct-ik"hp|c24DSVH~V7%*иnQ%Z. ՠߘtI+!o_|'7~*>DI /~i<9\ Z^(u,w =xJw{s`jV᪢S0DȊRnw覒%mirNI?.c*A+?*@wM\MX9#PB<ց2~gL[8,|E.&gBll԰m y2m {{ܠ#͵:rXL̅:񧾊aO=,4$u_h%>@#َ ^{ O~l_ Gp-_.~fe0 arv?:&1O{GccSs:Iǫw8R:`r,M` Ôp гae]hdߕu*5Fɣ Hߍ&qZ(3]7&- ;|v7{;u=CyZJ7lj=lAA0.=' AA{B嘚S\ZC|4;@B%򹰒lVlNDs$=6o}YTG8Θ ȣjM /Bo]'?ҫVTh{d:7Iu-_ɕp[zKp(x|) " —4J&Q~K). Ua׭W0W0j_IJƿHOgC^ Ϡݖ-Pb'b_ 0%gATĽ<~EJYͱPjT7[++:`]R`BFg!TOx$9|C 7ԂpH!c6#vH%OYQ}Vb{ jrة3[jܿŠ?? ƹFp % )C[3Q۶ֽٔS\`Giѱ)'0/#@lɽYWU,b`FQDU!q=BM׀lE/R:/ \뱗²5f5Hv:xDeG[N"'>r["BX7.9m0[ߞ7<WI] #iIgZ+s85aˇ_,/ G{0WGA]X|~b]o>ΐ沃}w Ahu X%M RV. ҂3/N P{tY{5Zf_H\` ףY2#cfrf֍Q2LH Q~`VRG7ZfUޡ"Dlo>:C"kc9r^Q0HBp-HqHe !@Xa&_m[O#:­)ue#SWeqO|K"z|_DsxE$ҟaUg,ۼA,%t[2VtL(akC] c$#s&̹ޝ 8 vMP2/)y,n6f3! }A ="?-}";%jݻ׃c0r{K߫5jY^ 8Z |w -hBKkf+*FUh'M׏w q6..4ugmL.ϫĝ~ѓHq|RʗD`Z6dRuPDi6bL1tBbbo%7m]`걑["[.u􊸛2'‹ IWQ,P@b?l6t\"iA<),atDxNQ[ÑG :o3Mu,1id0Wm`Z.RQw ^?tjjf*#.ۙ _"GdPUY$Ecuɏe!Y܅ z^#:iD2|oJ/.4+95g:&A:.qJ>Ǻ/93ӣwrk+[KΦO]I3RꕾHRtk| ;̨b "wβeXt#7iEpjN~ƍփtc;ھXnڿ ȱ zB6?Uw<)'A9?*p}ۇ^Y\ej!mM?imnAuQ"e{tz:poIf} iTXPG=+ Q~t@;C͡CLhymuI9TXc iΛb_􊳙1W H'w]&-^TLƕB8AtWH(KQP  d%޺H(ﶚۘ%[៱257i;뀂( m>n:Mko!Ji#4~1P񄾳[Ɍ嫔Hc:dYO nFW )ٔ#VNoV6VMϞSC.Jltg㓲t%DnFnZi%gyaO9%xv݅(%Xݵ/iNJ ]0G@@tyjX!/ۊzCfr'rg: GMb<:*1qՑ8;bOQ o6 !zy;$ t49qHbrTHtGIe|_᭔B>WaK^YHJ^?og ʼxvm )%|{糄w'>HՓr 1x| ٍpTK B}8zpZ&l zEM&n*{rr&f^Ui-c3.'ÀAРѩ\chc@7ehqr̢@S#R[ձ̆'s'eTP!!~O{QĞ QLqvE3u*q| yp}~s>g \'Hcz|GOLJ7FYd#ŏ )Dن_dma2p)kt/bWA䤑:۫D@u PYZKtkEC+(\a=`$wj3΋u%ZgOН:g 4=>_ RϏg]pr0gǘR:8% oe#}MKAx:d\"$= < #.+n 3 #T/lWf*:G+^~݇2 ]W& ="\?k-W]n\'ƕ+0`w v`@JBlGs4 t ,`Lk"^KNT#ӴA- vz.k(b*%tIY,u8s@uw_:tf) wn ?c R{@͍*8cuhU_ݿN42\d s[-zɭ$ڗ Ȓ,v4 zA|k9N$l9n %A&K/V'6TyX+O:zm\~A4DxWεO>j۶>Kzxzf8y O Zgw>e , ūaWdef蠲mMЧv)t9SA%\W71| 4YSUuKV ,rouFkCFm^ᆾ 8𦎜cZ ~Cʤ{J U׉P1[Sf vj3 D W,h^dG9}"nH%OْpZ]J'@ Ao!f-AP@KZf0ɡ;ЈoW +~y/)h!}14"`V d&8\8ЯPa#d&N2sso[0JW_ [xNǣWӥi #Ǟ>ֽ &\ǼMwoV͚8J4O2 ^n[4t =IQ޿s*,!š&La/HˆڰtcIK[wo;[>$!OuǬ-HPlL!C%i9sgə<7kU-V/c$yr@k/2!drs J{:m䢖Rڷ@ziI%vH[䣩 ig817-Z5?EZ͎؄l pk)l/& fz_R3&Ug@.eg(m* فC,gR&˞lK py*7ETO:GR;v헹+&eE}voyQuü:pπU@'Wp17q#6an0ꑁ_΁gOԹ&w͡KSL& fE&_YJq,Oi mYX -^5һ="16:>oQ&[GQ'ʸhS/cƈrktG>Qd$^z;pURgglvHњʹʨ/ \q4kC4S_YW:J3|R%1{iUl#oR]O6kgyKF !4bU2]=JHӞ3Acw[bQja"7R}xAtTǐn*|Zl8=b uYp(-3X^3=ƒ}8r0_p. mZJ WXSH="瑎}VMZ>HJ3K_Y9{E(yYhhiZ7њ:_3)oBR`=ہB &,EPVn΍RV[)V~zlk22ZEyt]Z| *^<Ʒ:`)@YhD_)TNN0Q>s%VYxtW4#k9 IM/(-57hE>97XHJ#=[ ST'm+19FX(pG4#.5/+0Α^۰Zh˂G)p׈t;oz_WF t[_]dִqJ)ccFW]͸~E ?ھ<2~:xaׇ.`{"cxkS*Wn?s\jṖ f3Yy%n%ƒ'=u"/54媅:iXN`CR f$":_&r>0Jz`^ڷ cT_iPc.G,?9p cLhBâըzKWFG8+'Z:֎[ɺe^/3.N̙KHJ%s;<=”DFUɩҝLju=R&~J-]N/OS{RZz"iVM| pY<ݓ#wý/}痞 #XC@) HĚ.(.h5Z4xٵ1529gm=(OٗĕB@j^v@LQq;8`Ȍ >&lFפ ƺ*m s^[י ?NV[@ V̌=AHH+KƴUeh©=4> TY8$r͗HH=3Yw(w{~J )e</kVBxui$a0}^/Y~k/.XTM1΍׾~vxaFFRKǟIڑOG@F醯o/teE98bnbŰbQfӕr`a%{cY*JrՠOq/T߳ӉG074V~>;) t9\VKx]pR(_@vNPpCcqdndvpɼY7;.ǭ' >v}\g5V5$ ȰLX_JᶘITWz̎ [bk(r]h9j_"k t͊Vs) ?9YW(iӪT6QK>0p wpYG͸[q0ik3SCiYO>ڧY CyTZYS5(FB\ Y<qF>=-)PJX_m>5* ĩ VxwSHI>ʐ\r=^|5on;CQ NIw׻UzRI!Eq( S';"&n֌GiKZbHͫUd ^R 9̀}I~O5$oThWAA] [Oj*| J~NAϏu7ϮgXRh>Nh&V$L g i DWc9ف;&DbS奟 /+q?;rSQӜx5XSG FN#AOR)bvꇗ\:CK3tJE=y󉦈u$(`=;>UJ{lRNw.ԟ oEWq&ظ/')xߥhMx 0ot"! :'U) ةoaPѵh:TrɁ6mz Ӯ7pό_eӨ=(P$z`C Qxu T_(}4zH)=z0\ ;Yբ6*U%a+R@)??PA >6q2.)@9[}:waׂօٺF j!C/snՆraC2pczfFZ> xl4BPAl+M̼L|ļu/&8:JATsP jgܤ\bW=# kWp4QoIc@=̀lj91X/?$xx仿eO<6 F)Rd״ї9Gyy<\7hĶ9JdG͡ B" .+PkN? iJ8^jV%nHTns yܷBT(eNZlwkA焳F"rt Bh>P $9 W2d1ٟ BL?s[u2Sy SB'%(kմ@'6)aU8&P1]ƷFBc51V7wO!sŔ A:m0Bwd(z]iFc]v3~YlIݔLm+&%飬ԭ^{O?U=Jiτ/l wmx>&g]2;9I%f (_1~}fMx0jX,q~MVx$.*L`{?nfƀ$nڒ^w}[ڈPDl,&U>ȋr2(YG[hȜOڜ66i߹$dՉ?0&9|N? KN,Z/ (q.њ"1K2}H(oM >wϪpVOe}i0{yw=$'1hQdE-^FlXt(OÜq6Λ{㸗 cBp|s%vXmuvv]}ns u=?H@0 ! =!?7;ݣKjBDE`ysKG=bҖ~B;f18VMRm94s%y.fEĒ>=^jL'6ML&KN<2]q?GuTĹ#J7>vKA{]-[b4!-crQHվIZbYq#ꯑwJ˝Rmp[( 6!IȬ¼EL5?UzP5u/R>pMոgf&&Z4MYaoDִ2ɫE0MRr*o25(pNŲo3܉v2-1僱M'bJ6ts*6fSop^m;΂vkf>UEȉC{=;J%!GGƆ?:vj-k%3l:l kp> %^Q[XrD>a%yi#;3ϴ\wٜnE7)o{.\% &nĤB 8 z 8!yy]_\xkhK pZwp$zjN5nJ^9 RcsR;4P7ZTJ"E ?]kk+7HؔV5ࠤݣ(_?Z~O]%InTP[|JRkƜ>y_iCkVy.?:+<fIj?꫚J? s)CΌo{,OKqҹh)P>(K dKn"k m#vÃi is(nFm.8q|;k)2]ٓk؄Um?bԆOiMyg4ȸRF}fI%do{z'k߶9#XRJ (,ڜ }+tZTp'sq`S'V.'Spw9XftG[;GI }}HBLbe&lUxe)7ri@L蓟hۜ M8bcfg?6˖~Vے+NYtJ!M!bbg?c7*""jK٘%eReRێ 'ZEd8X&Isؒ^ ꅧy.)7+idZk꭮rpVPOGnJ43I4F+$S-I(q7 ;uCm>0?nVO,ϴPTň6ՀeC=y/pO_851 FEcj_Y;Cޝ3^n^PHQΒ$vbz^7l=׶i5N@<>+-*pdh*DACBEn s56$j>-ǺMW*qb @yxM//Dv5PBy.VQw.мбuV F@}o&P¯A[v\ 0i+D#E Yl Pz kͨ 0eF׭d~)0e- :{ŇZ(| L2ڝ0փH`g$uQ℃&%NgHwlF= ɛc~ s+% L/OԬNZ4D@ '|>ŐEtǪڎYQ|HsXWlZ4ho׻D;3e&ؘdp?IdL 1B▸Aban3PIE:b{L~{T ̴vgC JTv r2;/Y*4S\Ym9h@(1fd}xYqR! B=,YQ>oFgDUuA2J{#q_7Pdj̱o_ ڽjcoh*3 w+KaV ]KJplIH'}ߴ;A^mǘg4ԴE2tq-ΜabH†-<ȷ][?ʜ1O>H׎tA)kgtUѨWT"+l,5 }|+ʀJ x` 77Q!(UӣJKףpz$GCw\%yFG~PiIEr>W=40ہEJpHs(uhuO?oI[~)Rz3(Xo;PwowƦNk|m㡌nY1OqRU%Hz[M1Cv_?ک><Ʌ1} 0xE?KGu~2yfh\%8DeI/[I 9_'{<(Sv>wCjo8ny=hh*ZT0r #yPD~?2 YHDQ`sax޳hth䣴9c$Gy\-]A|/dÑ3\ (2.҂oS,fW 'dΆqW.ak\h'@ҟr3+I_Bu 'jjV7ŔƄYgߗ.Uzq`92 7 D+8ZM$SLt *=lۙJŔσ|8B[-R#KhC "2uz[9J 2QrpØϭ-J4SzGdQ .#EVeys-?Ԭm>o zVN,=rw<~Lk/{AbX ޏ•NzwF:p'ӿREΡEµɱsHbu1IFn5e%+Jp%X[m(Y#zA-U5YQ?ȋO2˧Pzpcqun.4BOMj f&L`͐P,jDIF<ȡǒF)vI?ѯl{Ҙ7"?{d;x! n9P!x'2{G{M$3 E*Dبu$,~C1\3,SKlw!WHX#|i1 f6_p1x"`:qlvUvR7%j\*)rKHԩ0qH)׈i}Pɵ}>;w}:z{/LBS%>JD3nL xzJ TbeI /E5t 7, W]"'*E<] _} Bz^=4.bڭjX%wr-D$v.1:4##A37_͍ụ̆>5*JpŮ <R7XW/;8k|qtGL)YZOQpƒvI}/jT< sf+&ͳ]hOdZ)"20Uo- u#- &aܲ,n \r0)u#isuu`@[ZzR+L misKPj(e8;8z@Kc0|gۮ&Vtágjx2O9!{4(cN YQNA9;膫U;Hgk.COveqnTUзU ={nKv3RzzΞi VUhx5g؀kρ|EG#^y|K!%zd> m. `~CR>ς 9O~q[к&nTۋgȤ؅kQuC/ X8Pz 'hv5nG̐ʮzdjvQ| Dr7IΎf!ΰmb!+Tfh<s33!tu[ p[ &GDq߸6}0gf~?z R\O{Ntb:u2QOc^E[s.I;SΜukժ[p"PiD3 t!YyXx݅Waȼ˔x/Vu=@i"0D =zhEd2+ҋΡ+7y9ޙA8<\h#b3:W+ ?:F C ]/n铿Gzc .P9H0w|`d'kQzwl{N#&Ġ͑n3UTIBMK_^x+u ,?Mz8@WԪU|L$owPf1lIOʘIY4ڊMg2U,C1XB Ô̶[\P ޸CnCk5fvd13mOiXN8Օ~nwg}vW 6|9^52n֧|`BS<-<(ӕ_B6:񂅣W1a@j&VڍFCU]VҎrrc/ ksqWgxIޏ #?sr [D8e`7WfYxfSѠV5FLz.h{VU’]W7z'Yҫj*-J^Hx3y]14̸OQ9‹rVUAtcR/L'#P&_XmhG`{G0A;N R!ǯoɐR]MCb>uN;eqDQQs<\QP) $V>Q0 (eԖs&W%&ʡHx$]]ۣ%z>-v[nd4iξE*q WSq:U2/TtKycL7%8m/4mit$`:we{IY kۓC3颅hG"L5+ .4u;d}0D /Ũv֤ir|/4ϰ.(,kx'H稴7uzD'M:;aبwr7O?c0}OVpsԈVYR@meQ]xǑZ]P~I.3B!;K,VT{)nr_i"zhJIa`} l xMLI;mjR|3MiYK~)h!"3y4D^b}?qv供/&XCNg'hY6^x2vB_X,d{$f QNlucA 3&o7Ec__=8'Nݻ?)_Qmi}dz=uVg~h DqibBV6#VVxY&qaG +#.TLf>A;F?pTZ4ZkuۄC-X"#'ݐbl ˦ʿ1/~Ln7Emt}8,%;[]Bx,fݨ)`eФD]gNm +]t Yh^DƽDI+BOQqKNL;MC5$eIY7FBK}:(U@ Ƽe8k霁!'/>LT* $qXV͇]j/ vjxƱsY5WhـQ Ct&Ibtө' K tm7g)`j 5ѣ*JvndqaowAF (j9?_uDux&'N)Ŝ#"J1T4Lwrn7*u RiFY"? ke)&Ƨ{IPX vy 9iQJd[NilaE?\Ao`اFvRFc|_yދX =qV4Ҹ-+n$)'|Ud켇'󃩠U҂jeoZɂ@/gӈюL"l>% -d!U ߷gDfX+H^q]W fF\i9aA":"g =҂E Ype#G;Tdarx=n};1пRg $ba1FbǸEt#|L3uC5כraz}8pK.CؐO3 B:e>mC^${m:tB<-mTDp7[ S`VkmE&v<xKhI)yZ3 Ɲ K gaJ<;ܱ>[Yrp.8L€ӣZ>N"vRq*ѓ - GmfS`\bI=zhBD_kHq~*^bjWz">G>Vҧm`¸I7iE tJ_*"t d*<`V! w(2?~{\#K3m=b\Q[;ʁbIZli>M*6TIEs:-@WC kʽȾ O1 !wg0q#/A}).K|X\AFl|,ԑ<Q ̐ޤ/#n7oi| i_Rf$&'zaesTf3"±_UB)u?wzİ~Oax6#HrXgБrmi:ž>`JZ;8=_Q\yV1?aQc]O]G9mѝ PjE"DoY[,;.gKmAygZo]EiF~oH5O{GNɥ[yp`+`7r#̠$~d3J]:rȀ#0 Y_H ^E2jJڀ6 4.y'PMg`#oZ$#ǼCa~v'w>gM85b 0a|09=%`ȩu{lj/^ϒH M 72 ug[E&Ƨn%K ڞ1T^: :, rpt1 Ӱ飠&JåCt N8Yr[6UQ?sY>7qᏜLa7ƙ;WdԖ|Z+xsri+ ۳|VSM3o Id4c#[=~P pL#X[])tƣƇJM_@A}[ ntxQDuJT7x -:+GRQFE(1*;Ja&0ר&e\clNEZۼhjښ;v׊y}+46[Cj. B P5/h\2jb>]n\Mrdy"j*:*Q] OP]A:lYZY\0ç>i RMsbLꐂLWNA:n ?pW]ϹIGCxo2pPGS3VX4]-<=x"dN@?G xK͜ e=LiOH/.t^-4#Pb Pm(sO_RC@C%TViwy+َ( bx#86b'X>Z΍6s=IA$,VѻjYkec/&CqFVD3nޮ\ _yb|v/ =Ces7@U//0zD| VwskwkRK$ xb^phPLnj/TcaZ#u\5efh"sKcU7Q7 9DRTǦRByPEj"RţI`5IHi!0>XҔTPyꢴ.`3pQOǽ B Njq!6% ߫l,2ᆊ>,検/d'%b?I+K.",Yg1@1I3CQYg$S[ rǏbh(M) l|}:%r&>=®l]H_+u%i7cB_"Yi` yىݥgъbO)0-{ 2f'yk .|xx)Иr"qšމX5Ei` OSuml˱K /Gqor[]/ޛR? &EKƛAR32#vd}ݨ*)A7^ 'Uр'YC5c%v A0<.~N(4C'\b}@E1Uڢ]}䑮п]ec۝YʊRkɻSB8 ?>Ò|O2s'Ϋ>3"vr6ӥA$ןZxg5y{zuYEd㜿btPKOL>-m Q?͟lp.f\~ձγ(e+u/r UbE)Ǻ}M. u܋v>v'0omg=ε R$|gJg S֓# [Nx)b/(^8RphCd[}8_S$E=/-RVlM.)+ƺw%El lk{OmI!_FCͯN=-qG[4Ql7d\.%6$eXooϝgsg͗knNm(.Z_IN ^C @Ǎ`}|-_%,Zh^6 f *GK8v%}Ud]#NW[K'bv:)Ӽ|:#Ȧ"p@0vnM=L*LT %Ե #+'kQ?C! $y~g @ͥ؎6}yk;> e.>K%+i˴S*bud^'udC*p |+([B`2VD/Ɯ5"2G"O?ŊdWV=>3 ZA7Zd;C9b(Pb1v6mδ;P۴YDF39QM&W.V`#K-?Uq5~4` 9pP/W@-F@Bvcai XWln=eb`YY [aAw>Hx=i UX^>UL6^8p@e.bEGݵ|zw!h42)rлN17}0}$g ŊrC6Дn0zڸ͘|ۂD$AhF]ɔݮ׿؅V[ $2G- :|mW?o٩s3LǨԛEƻ+iaCTOZHmb'rWs{$ J م^'Sx$~By Qxu kмk@E6QOUs z)g65u#>y{U"MZU\vf鷥\,J9]yUزsGȡE%%Ӈ85C%[a溕Xt,ӻ4&K:R7QV#}7_#zgȦA'R2\z^\vby|`19 V`Y̬gX HIاA,"?-0ēˮ_B~MmX{D ['3X&R?YuI"^MCSQw}kz*Rqžx=khuעd@Db|9.GݛCyYοb3XUfjX0|F~=CpZdow 'l&]%[@IV1^f Y$$&u GM -St y:+rCzgݓ˹AC"}]]8"JNn;d= zؼ.b()<ƣ0"^Xw/YFOq;ADԝ96Jkmd}K00~mXƂhk)vg<ʄ*ExY[ɳ[nQO@NPmj`!I%DO6 2.⟫k$xNE"v%H z3aN*<3##?1]/s琐ߕ/8b̺[rEL 12)_:'.,1Vg< ]kN3Ӗώ M@pz5d3Ӈb [秛muLjdբ+iFF _*GQ" =\ȫݤvFٵUv#}(esnp |z& q`^9Mbv2z]n96hrDE>*sk3iZmv(I7OV,\"ٺKuS ow94ϥ7k*f> E̖WW@A{#rbBCGA }4f+h<MKU)W9ildj<3 jm [Gt鿧QI""Qw2x # |+ѽk}Ku73d&RGv\xFZ/$6JUy3s'W˵yu4Q.P*,0D%7?$SV5jOƎէ*ad oerJ#.EH.OBΈQy"VE},i|+#jگiXsӀMnun{#e%c%uRv\Dû- p7ܯ W=KXMYب0矋_Pos&ߖK+P:`{ǖk,)H#)oKYb|{#b6 "QirGe0'2־xbk0-H^$nK*܍g#x~|aB !8NUprѕܰf nޗKcĦH#nm/%{SdGM¥6O."[/&0-χg;_m (+pФdVw&{ Ћ*0c "k*w`,p5i AK0ag~ FT}Av(mkncJ p3A^Q-W[`& /L5nKqPѠr- [i?4sJ0l2:Ӵ)ߵd$޽|l42@FRbq0 2΄9'R$ )fojm+o 4zFw8`;.W2MT^:@ gN+kGԨu}hLpxQt↧s8q_ښc%~=Vb>xw44eښX^T"OOӂJTV˨t!{?>d};n53;h>ve*k8'{tYk?:#x=֣;g,߉EA a1!r |5*zo8Mӯk "Ǡ&)}dK*/Hle<?: 0͚9]3KKv騌&fPu N, ģBk̜0S }Itq z0aBb脑k`t14?qETL?Eq250=57wQ_ߝ;tcȵĐ10Hϕ"yy87xUr"$0Y7oNW <]W;N0kָP2?{|t'JryF?μ@S3R@6Uɨ5~5y—zHxI8pn7so{sKKdRV#^,̌b$\TqjE*3@LcӐkKjάi[PbELzIFh=k6*.Wsp2 IbpصRN‘g8 *aVsNZL5Q^Ԭ]x&B'Jn\u@Tr_z"m$z"kwS@o>],eן϶gO#w]F 荝R!~!1mW&>a =…F'Q^if2ÈWz lm*Iu d:j+4grZf9 ̺! СGoJ;#`\mJG-j\ DK G&N] 绍^a?A޴gxI32]1`j ǐjz =˹ O߆pf7 Y9F]!"@q{}^U^GP. __֟<,RéNVc[ip!ꛑ_q(_\be=R_h8t]Z K,R&wȴ-} kG3R$ȶp)=1e6DhVq? !Ldqpƙ-$Wٮ6}" ˵GlIy=v3Gvvhzr8 ! vPOh =Hg|yBlĺN)5=X^_Z% S .`qTRuF.>>ޗ$ZYvlPg?Kq[*n5H,uY%}!PvM HzI#U,U@>Qe&4EIYLq/Gh f9>vX*t]}b%@^ rDu `ED43ƝtJ]UW/{hx`kηfYT-:P#7$5쑓z>.p!qb>%'n{2A]IP)){=,KC/'P D|jC[rDA%SfHϤ/a#Bht~]\fV.Õ_Mi8ٳEwvC΂_Rc<51K] BE|SY79+pD^*oq(o Y웖⿧g|KoRA4LG)B.ڦG\/Q!Kqڼc:|*;el򯿉'WZ˖\ x?8(f7ԭzLdV_! ѱWI5әa- }ty)#]1 i()WLfA+#1{GhHge/^H 8Q"욌2|Io$e(ySح]vQf &4*> 3>dz?"B?a Q`nэXBɳruhEĖ>Xc!Bt<4hurE(fCVY<fey< nn>N0FQ,V2n,"|yOKW˂2eBn{KlS^jċ :G!T²Grue:-3B-8rD(`ůrX^oDYVZ~RJL1:\T vpsg`WܙQmjGss;BbCoUȆɼaCGP #g;ULyuiї#Fo'&Npicu%ig^GVYbT(x{F Hk( e@Vm=D+iMu3-$|9D+=H-rA6I M;x=L%QHDON/<U}f1sjJi^bwnub(WѴ"\ }#eMCEjcy?1kKJ]Td,;M]wC1T7kn)ڭEQ(fv^M\#Dƀ"ꃏunBZR' 0(b8w[N+ .½PK[dNёd8o]'` >b,!3lwJV^ᶥۑ&;{/2P*Дu,M 8iad8c&ZڎM$D ^nk1"TAkhB|-C8W4Yv&*c }L@?.RFA;k.Oՙ . };!vVY˛aoA!Y3 @튰۔ D(}%◁N&Uår"Ё-vB/7r}wfzYx*ϲ'IM].ңg=;6R@po[_MKdWJhf19Dh{>8{#%A3JpyI$:.Ft}N {bY g +k$kZ%i=l&W,R&a;/Ļ6iKd:(CdG^!/pvK ^&%Psp߮(L:a׃夸IJ YgExzLףF(Oϋ֋&-wWB%Ϝjr>aEDzυIZAkJmk?7& 橢|F>^=d FzFsVUËer.vgj -"k$qJoSfѻJá֮h,J +,RG'hQTuX8׆bp)HUO03#vdoW";6F2W4ۼO FY.jk\5<02D>3©7" _gA8p>_ |558g -z.规=࿱T'es5b73FՔvmwMruf yE_>P6hy؜Kc֏Z HH<=⼬RH-0:ח8׌b/K Sv2bbcsQ9hͷ)pVjw"MJ\w1u-ϩ.3a1L3A@9)EGBQsɸh--\`ԍhRy.raZތjQFl r$ fk-[4^)nmPLԙ;~>="-(c(~p,N5k׼_l2y%c(U/FuMϥ%I7<6r Mڴ]{V|-L쫏{ʔ!5%lH}GUV%Sk$%6$݈:%r՛9e,o/ %Vf-.,Ӷ.K6*2jGjqfi #%!NUJqs9mM \xe¹:Hܛ* ;cA}>iCHGMV[{u^%o.Z8EB9T-?L/C4vCW ./ms0 [t YKW,v϶ I2*T݌IWLh8KetŎ|}C$6)cQ[$& I e*R@7wҧy c[ག\#w;Ύ77&8=w:_j|dޢZmjve \N54ʷ(4p]Y<{1 J],SaynD:P`â'S+zjc\>bMr;{I`2-ίٔL~O\N}Ӷ^jbV">.ڜ*ۗ 3q>gXWGUƂԄl]i][b8\|Cͱ լ}J|h"PuhmFƦta4cZhDVZfa|W`nA8&W"m]:Y<ұ1NN$ "Yyg=ZӮ80rtjwR㏫b1Gy+_Wf(D]&Z@{vmz}GuMʡJc:V"_I(iI,U1D0\W.7@K: w|q#y86L6߻P.Z#f[ IgdH2JީC0~& [a/>\॑"c꽹wTU:a{o΃WZ:i!tI..eiiy Ҡb~^-Xiw^Ek%UXێU3). m$B'ZŶXxw J!f(^ rlp+g"c*ͫ&֜X!)᛹%־'&v A2"68VUDYaӆ;i?μE oF*6?,92Ŵ.9.g'KaqDF\^GJ%޺`&Y#A㛷\4Dj`Hggo_<6 yH !X K% >[rGq R+;)AIQflB~[1ǧ`PeG6џv~;6f?ڪ|c[ۍ?]Ec] ڃ[ nv齜'q( >uY I F!XC~dZ/VeGTL6&'Guqx5"/urZreX핡[\f𳜰1A6 6[[:ջwgkԋJZtZ4op[yڨbvhfu+-ZU2|`I|MG]Ӷjy .P(!Ňye|Y (bIYlNoA*׭79lllW1+!.ɏ( Ղoi!* RXhZȃ"2pSVxUkڴn}i=\jh>Zoݒ5bQ!Y^^dWU Bk >wa1/=VA=щ(b<K5Ll+PAZ4a Jm DM0t,NZ{1C%1 WDE|lL25psթKy.bQL3Ԝrvٻ #70V*k+Z%K^+P{Suv5[kIʊcٱGY߃AUA-ą^}/ɺt8MDiFqe$s^rT`ڝ6WԔCܞ:N&VCbv;P "m(rra.نGD=PrkL3}"|7*"O1UeO|No=Ku*@fC=$Ǎ,6$cpۅ!UrkSĚt25lObFo-.xmT5QJݪ ($|5Dp2F3o?)Eo&߹F(`tX_Jsfqܯ-2א 2C@֮E57u6 "r iCspd5qWU2N uÛ"_brf{Qȗse ^y/]ĩr dƮT=7ƼFɇ:pCyL'7[`h?IzJ ^AhsB;@a:qi}mp TY>2>&mڒo){$n W'c@]O<h2_uI;9LxSjYG40Uvǎ(B+QFݭGPv*p ?@ߥKoxEQy_QEnj's,\86j(tyir3~U 3c^p&xV]}0 )˯y#uhXJLk4Т[ʼnݪO!?7AmoRfkSVEfG*l),/_aqţDzA_kz)'w"dvɳ+y+pyĞq\1l>߃O%Kӧ!8Eۛf}sSh'I{-RAE)2 (kD6Lz#/لfV՛)9 b|ƶwR^ۯhJ<  'Z_pgxdQz:p6ʰ!GnD?ywyqP/s[o_ HƎؽcj̄Gn ߽wAB ؜t\Ž51gtk١O%v?VyX$1+p(iUxݡnDØ7x<&$%k\"b|mJb=l&~Ϙ 8*!53,,y&35;CWKrkOq=wc5ERvY*#>bB92F? noB Y<3JnMڐ4K76F)o]!b4N'Wӎ+H$v9IFS?)fM yZt\hSfZ}y*oEdZǶW7ិY|RA٭m jim!_poC^[v{I>)QY eZj?]]j ; {FvK :%V6NGnbz9vxRxK+H$G1 ^ђR=P~5px"OԯcLmz__rE[QG(QQ?66L ř&} NM~ Xl q\sd!bjDrMHmxZpd|1H}nj/"sm *U,Ae+;sriM~侤+Tq {Vܜ2YT'lYN+<2o\p8Sb kcĊ&0Zck;8sOL%Zk=!8i*1ޘGI(B=ekY9OJ,߈0)!O7vO֑U ^?ak0ޞu{Ǩ|xʡc4-;`;{6s!=L]$ʥuS-f`wRC}-\Gv!Ocys *c,bȰK2:wkZ?hB`'8cZk-+DΤ7G sRE *!0 HB<*;*+1g4!G{jrڍ^k$N_kb<{<+0[藘߆/;.q縣o֌g+NPX:Kxǘꤦ P{]7?# {2A$UDY9^Z`;юg򕄪|X,ϩo?0ώI^' |K(^[ľ[Rn+/RW5>/>F؄/h q}I9 ,K s{^U]>{ٜY#w#Vō*ޓ6^01;ʸM;.Ȃ6ƆR.cjfSø8+N\G^RU(as&%Y-3sR[~mq5a0;UeDBϢo(Xr$}*/ξ iU-hǜ]*u ҄q6S˄ONg 2m {G=W"@H0lˢj&ySv|=費ᰡɿ֏ڻ($j4l5SޜF( kwLrDu Ԡir^O6Rk/O,[Ӫw{ulT["C zh-:zQ,~[9"F^Ϫ^Kkc/Q%pSnEY2FEYUW6s^nᔃQ?~~1*7zLᬿ:|as|;ayZ},qMPI6abZA[.0gߌwaI:i9Uv[ k_f%?44֒)XœzKbE A1voX=aoŋZvH6ŲD;{?k=}(|ab>rr\KX~ n5v$_ֱu`(Ketri18$ pڲ[\j?xpÞ/Zz3r c5q%9^PL|e.! Ө;3nP(m̶q#`b;6cgS6P-f*iNɭ?^""X972?.țZ]&}kF+:7ә OO)(Wx r~:{,WC!|O5jO9ӄ^DuO@r:7N .f3]֐=7_ _BQz'~j3Jx;\;z-3 my+E !-WА^<\kDnx5nIw,Wa66y*OMn^Kgȟ>W6e=/Ob1LΔl\+[IA|'9 1aqHšWi{hO1K bucGeGIBBÎG+q"=/K_U # d_C74`~lvw.@*ǙUA;"%yRLfm3kUY tO hn9-UζߥD`n{,h4,%_lHY$3 Uoin+{Jvr4® a6vb,di%3^oR&obhqv~O;3Af$aǁ% Ғ|TT%"Vawok ؁k M y 0qx0;8 D,`9]>C1j筚.Bw}:ZwJDYI.6")H~MƓCrԎI.q*z 6\/>QW[{F0۾vdxĽ?hXN6$> :]aM/ !tU36PRg=%}aP1 Q;eF6}~ǽ2o3 Բrj!>"6U)| i?_N2m0RWd fΫo}:l 卄s5pg=ۅ:: - ܑnn^"ή H*sT?SƎ~iG}IPr x O1]LDdy,b ͺ{җ@K@s6:tK!J\&LƛL6YkeMRHai|VR0;)Iq:{ntrz_E4^\osB-%? aƉЎ8v6^` A~#r66>Bѐ ~G Q~"qy.RQTy-Ct8/,5`H߀_?)Qg,<-o_VR%q pkFqX-F)Ew%+$ⱏifFRDA-3:Y GΧ>J \O Y%jtFW`'v,؜*Ef"HR^*Fm9=>H 1uZl1⭸x O b哶 2zFnr԰tp_{7_k!:BX+Ɉ$ӵ( OyXPM*`jfبB)>Om3V8=6fY(, |Z~,Ζ Mքk 94G~in[U%I+4[H#t<%’Zd*b.bk,GW:؄u<=C> kK&bO [C+|E]׏V^=ߴhʟ!][sF/yQ. n[0+ o&EK=ɗݡˀ_}X9]YW %H,~ JD& a0r6g.f=8#˥$`X= 7%pLL3Q2o4$bJcܔ?o?tjЦM_ NiuH{MEԶ'=䪎; ڀTD·K-6G˜u_O!1$PՑ!>{5dNE<0H~:-l(.?1- mquqQdEُ7Ofͳn | aoQ  w+MrIƪ[f[MzQppsJ;xV!@ adT Y-V 4Rn7_+:]]:6H 0BG+\g}uAݞn'jjrZ5e[PL7ESw]/) $~kncޅp|;+L_*},i8$bE,w,H0˒&OMBQ/Sƙ`XްdΨ5Cw ;i@vE RVi{,??؝T>HF -2͡3le)w4N VuHKnZF od)I 9ZRg<,-?/LH3wK \:i$P+c+hDKYgH}iOVO\3V.Y*!yvX:Pmruۮyvae.BBh$,FWg5F;-"xv124ʁ"%Ak/^"B7i;0øeթr<d-o:s'%+PKy. uh |($D63kl!̃lQ1RBI单BBX{ө`0- $]ct/ke BzQLF=jlJaig Au6 PtuEsfia뉞(NL0@%\?! i)%Ϡ,4vgiiYOB/$=~ 3*ћ.ץ 7l5.W|i}EeIBؚwʩCe30DO1{@jW F bFcWΨA68 sݷ)1:9b`2hU8`oBA`T8V)`7g7G nBMUWl`OIDQ;"CTDnYq@a O1< aL1pB1J@ٖZР`%긬D͍)p@ #鮶Ǡ8 ,rbKNnL.B%P3-6? %Gla UȘP>5"lut- fȭ7GgLT&6:7+wp*”8=> iZd/mȵ; < 0  zoYˤ?(ΫO~SX%HA_ώ]5~ up$iNz?i!D ͮ4ڨy`)t߃KS{i 4ڽ?{EC%rt1>jGLH!!G_OWmH^;M 3;)ᵁp=27rJLKEЙ/U~ca+Hh,rwZD HZ Px%NN :sXH }Hnb[txQRýR^"RvD5}lJ;*Uv纲^-=W5ҳ҃g~8AQ _#$ `z\daBr6TPi?Pp@:/U?QdV3(F(:fG믍+`!mҔ2vfM%ۧ0_I xSQ%NK!zf6ጤbOӪ*uf*'<aq3) Vw}8R|E2`p/ ߄Nߟn [~ ?#-H RhLB0g e_#;Ł = M'bX_nNacigAGZEځ6Bz佄È2ۡjʕ).7 GI^924#%NUTaVKJwM@rPw  #4M>Ao ~6 >f3n9t&g02>B3Q@´vƂϳg KFTirފ sOֆ,C%qrEq}9] z2씻&AS3aɫG# `c> 2c0|Y2>* ӉM=$C Fn[}h 4dh!|LJ=BLikيQpqpa;َxWمh1Q~QK~I0"ѓsֱF}Դ{2aLoQ8PU=ϧG~-zhC΢Sm.O` &) avs!Fk_ǤYvǦϔZb1 3I{h1zTx'Q ~c;Š[N $"|^e[Ez9xgv*)ڠ{P7IICY6Iix9;<Fy4F` (%ED~7}DK:ԩ@LF/Q?g0}* 5S5q {H-Dw;3x.AR|3"^m_69XVR`=e˳HdñrDvsO7kҐམqQ,/CMPl\KO#hCW(Kƭ3:sSp5|"KΚ˩$F pq-m>>I]a-FlJ6ãDԮ3 i{GqXNJ8cݮqY,~(TcghJNTb/'aF$\H[Aɰ= .&:WOI ĺodZ5"$:D CŮE1p#IbBI#H`<xx(_D1xXymbȏdhb Q!$ǣ\ }d_4>xmrH(Sz&B$>|&Z 0. ^6#^Ĥ:KtW ^= Q bmRӶp`5} y.sEi 2k8x+r`L$,[ \!}PE@FW쳤ˁlT S`ҫq.Fc$\@mK⹉(>HW_ 5 L?Zb=" I@'2޺vu# MٳLNdAmxE."3!kr>\<q. Ij^eH?Ȱe`d}mRw%2ߌ@M["?J:FmW!`N@68o06|&niAͺf \sF#㴜\Eu`-,K-RH߁.БR9&4u҂ɍ*@ιR֋ [ CX?f[Lh)0 M Q,2e<*_a\ j1_mHr6-!:<n X恀K#A hyqB4BiInLc+8CS[ xi4a^S:JM ֽtm>.*Br*<) M=]k15fpwLd]#a7`.x:DNt(-Huڢ`H cEEχȼ8< \o9+`2ʤ'}m_eQ^, q䒰@pʕ<6}ԑ( - Bb~AuM`YPWSRsJŧeKfY}࿀i)2o%@fѕAL <<e2DhK4 «v Ef1/T OmB2l~k6 a"X&$h1P&IN䬀10en4Hym0pC]u>5d ݤPo#dm1^ >EhEDAI7ĕQf_ g0z0~d٫FB}-틚-k$l'N ?sACU yR!?`(seB%%n/KIăLbq|^*ڟ@.c`DBWaM1LqsLA2[ @H ߠ#(I[C&t,h,@1賿k70XQqSH/@ST /r&21ϡ$ZM)Ăa2 @9G]["2n{j9{c>XNh"Fk0K4ʢ#u8]xvBGABr@gcw72Qv(08q5.vT E6],1lbbB6Z|k=p |?9CT+7$Ӏ'9"m*ZФdv0ysiؤYajjcM5I=2}TMQP>~SSY[k:ƭk1L{cL5 fxG4~*9@C0?EDL;(xK*:#T-~7+à&4p|7A- ж}K)LS.M~4nŇ\EkTgKO(&s/՜G{]SwS毖6.Wh Vl} Q3J@O:׼[Q,45AyrWs): j .]A s:)>G26b*W'6)XgYA@Buh ' UPIc((Ћ (Z[%h& ӻ^5o 3+7Bl/* 0) 0F`8<(St _#hdL;Tt^JuC~;b1|&i~DL[dW\>79;+U(64qI/mǞav1u?lT(m.fe)9/lI^EZ|ٯ1E_0PSHcټf& J=tN.N[]4סyyyJ}qqTg~Z]Eͼ?Oӳw^<4a*yr ̓S< 콭Ѷ~_CvwsN8٨56~7t$ؼ8wPr{Q!3 W{'Vg'99]J^iӇ~4(;0P`V’{ —zHK Vڔe̡ (zxwk;x!" HA[2Cm}c. }" 1 YN:wX"ÙȖhih Apfqlqzݻu~8,f&Nh. ǐ@ oYv.j4fƊ}HlF{+A8FPl%6<K͆PV[ٴ,ϡr;V-~ I %/0hh6qexW y?a6[rBtPV϶#@J;3 ~&V D[  b !@(#dSF00~z\0 `v1JШ6_`"rxLGcHZps]ַXLBsl7`уMAGmF$IIY^P-Ajn6詄6۩`n 7w]$čHQ3&!>bi5[,B[Pb2LEb 5ëQ$z!o,!{[Ш xbEy1/7( e1pk/pp@_zFp NqmGGS0ٲm#\ | ,];BN,K/0>{~"1N"iZz%ZuEpCh9(Ѳ.:ɿqB4{B J=~-K҄ ;2:&njȰb؍\"D ᎍ^OnG_$ˮE!&mkZ:0kipF*߃T?TEV͓r`ً1nnV'0Q5rQRv8eI e,bVoHac`C;j~o0LD:[,O}Cܡ#g:h׿TTCQ$xqU8+OR W^4Hz%_jD!AT(WSi.M1612F=@7WU-J=/А^τޘg+K~4|Ÿ7V[] ?QeYZ!(`+5n%xjH[p3ӹ3*R,#y:3iW@a@n)" ϱ>Ї3fr "G-#(׆ M+GT Q+:wp*pC\-:L" hB9v | ձ~`)BU G`8qю|?<"ޙN3(`: #s$H N>;P3rBSaZ"`<ZO`aX'J q/h|"/7& 61[A<#Ӊh?10pu  o_iiSK ƅ'?"BHdaǞ|.whFUbAUq MDrڶK /Ԛb$Ž!m|ʸXNB}@!D(>"StTɬl YA6\H94"7Ą+s??K] ! G Nb5-3s M64Pk@=OzH] '@{n qF{vhkN jS ]I3޼-PM.)֐թFJ!g|%*~ek-R}m]~Ctn9[_*wzɬpN#+F ~1>'mrCt v|NeJV_D2AK9%( +FV;39G:䵁q܁C ͖.n/E=`0th7(F/UPKt-۝F^;E0ՕWԃ3~ > 0Dqv/dEF8O &xb罗hg]K߮x!ɤ{NgЃʰ 2ȮF k]T+kVmB`ك"ŝB*JSjMdk|4|%b'cPjjy]OfcJmabBM'14@OH:~)G|KPkja*}I4A@E9KFΪOq6( 7.q@:[V(O IT%aY_F'-ˤ/ь r.ly-eqōp1n48g#t/{ЃR6]àb+s::u-[K ˜!J 1"&kaňkjT,5G5N:@=A ˃zO+f \Rq-&Sm&b b ^ƅG1vbsB_j(%v?T94Ep劂kd]%n2{ߔt؇U~ŭ_vd,e+@I[I52NkpVAXk|Cgo ҇%Mojaɀb)h1{E}^eqI/x(90-QwkLI4o $d8C싇k,[bLe2H|[ѷU5=dӕȗY%,)p&nͭN/ATv[t451I*ZxgY-z^zb~Rg@;)Jp#QzD,CJkC:eVϬ2oll]Hz>p6TDRFW SF/t$CqpIrh~/SJ?Nbp}›7_}%{+da@- M [W,…!ݱXkw h&r +h4j ql?5 ĥT?43A- QQaAG[rz=HY|ezW w0*Unzv'uS[f;''-v\ogC}ֶs١hT <Cv*{l=iB3m6 ?(kz(\@ %3XG R3)>RKd>v7 Yo'dydOD܇`cak]@ٟ XRɭBQnQ0uWe Y%T:RDfl&T5|Ɵe!Lw?a?2V@A=`7V@8šIYq僁crc@0ijFdxp)&p A8=<:tF"E 3eGE.j)(-ZT;}1Z-X~3P UʣPFx %$qT7XW^2qi}IFd W(I ӧBC=+XK&7XNR?yezx9`s0^u }{!m ǧM!@{4@}wC[~3ŞQWTnaMe7  j~juh^l|(٣k,C ozl0ӖIP]^':O_.9I'Y]v藒Av7I'+]-<LxM R1  W$zL : /?ZAZqre)K`&7 HjDc$‰˗d ,!+J#W ,D`DO-DA{¤&}OP#~>`v i瘜?^#e|_h!XlW~t?0@wY`OKF}+aƔ,uiFsR>m?ۧ$ ߢѳp 5e#\T/sȽ^dy,ں.!isaQNs`} jDZS ?A \=b=Fďp?e+vS@"B<o\ITбMUu6aQz.[c}r/_SFD$H>'&PY`IvoKIP#H(>HW {@?{D4K2W!4}ma.noO[5x-o_B7M3S$* e2 QϦ=%]O]CM2uPH<PAk˦7rK&WpJ7⸎a| M xDiëh' " #k_KZ /3,8 Umȍk*RgCM+2z!izfLdJn^CͺN6le]^)Y]@ЌF|9=R=b} wK6aGho*oȾY)1b|B;%8 &뎷V= ϸ,E]]6SV#VcAtw9:9m ;O,wh ynjAڥAO{)]Wu t>DVJmO^g>}ZWlU:FRT%=M7?X~3ҿUUoG(p,꩸L%>E萡Jy˦8%*](A[z&^$۶Făd; tjݑ6? I@W''Bd6|SgVNnZ& \σ\ ȧidfbEt&=;AAu0bXzy~Ppsd`K&G%4ɍHsSđ(F^Cި3ů wlrUBh]j{1};+^B kA٘,1s9xf"aA$9]S+i%7(JūҦww#q/[ŗIhc 2zL 'R{{휙%p/rqR>C !W'Li#|%uav5Y+<$̜+D$nOMގN7 ?=D摏Q(nT@߱.vqeCAh2y! œ6ٞ^[OTX95TImfqMSi7h}bք"s@k~߀?X z m^!5i} [zp$$s׆cpeQ7 N?< rX08t|hϦqA0Er+iK&@w°p]cGyqnk?k~2Nx#j)nنCak_9lzB]l 5O:0?#s!VVݝ8B>Ėr> mNS x?; Y{P @RϏ"N<-X;<bN8-oqkTe}!Z'û>6~F.]+ %ZM5Ҫɫo:>[VZZs@jdn}AH<' !Ka5 J ɶ =#`m iHvW%_Ӈ~ԞG4_JHXD8vLT>_Kx'@J\Jt0\@Ţ4?=m)ؗ%A5Y%1̓`{"I$Ɣ kC=)foYu)jtmv5ZIڏ(1U.V1a|r,a!yޅN,CH>G}#R8$OCs# Ѕ ڭVml|DE:#ȢyލȎ{6lHa$AEEz{!etoJRǗ9€53 uኡ=BvG_N=9*ߣ~eB!jn]]s,`uD!D{S0znw3ĉ ȗ@GױwS& ;"M'%d ") OA"Wma3Կqr{;uyJ;3L-RZ5jbP mDRB 4d&B-m {(K"6b_\Ǭc8^*ICFyX8;ASlvI 8ҧ1ajȡ aNm)eoXDN')lt4$pdcnHs0O\n$ 78j@ i/s <RWɴ{0M>KwQK>u]s1C^:y ,)@h N@b~K1 | ˠͮ :+& k +E|슰ą#C[N<+a-.q`ވ CuJ!LAL CdУyԳ4OCg~t2U]n t6)JDc"u[)A{P+Wzr\ֻ|Xxu1ۉ@_cca+ F,KvK3|R]7 uH?q0%Ĕq ثH1d4;؅`4R8t )}!{=ՈhEzzǘX=l?Ke{@:PCIW#PFSV;4XMxHfG6(r>W|.ë3Q@$QZSU?y؅n ]&QO٥J`@G{tB b vMtFjN TRlWQ֊{RgX'and]L]=Y{SuymUfWth(J5tO Vxv5ja Du[ &96-RmE AmpzҪ0C22el6!(g }7 %<)/(Ũn_"#T#? C;S۵lf$g.p@;j80xzj ȖT`\ֳtK<"¯3U|XG$kF x|º\#nʠDGf7O}<׹U}\SUY SO'~gX֑C;l*].IMiHUDҚ<.%(ݸ*oW X@q΢i8FQ}{%8>VAihe*t$c@YY\yufA6঺ Aa^cq|5{ڦ-;~CEt;9^S+|(4/*bU/U卾5ݥ9톻4JQK3sEUEêtaqQXx;11^( UY/vt͛TgT,G{C+ő}oVGjNӓcNǍ9ۮ&˕sb'kPT`OTzǍ2 c -g y,R;Aޕ >Kv)OoDwflROp6vD9MU[s㽰~~) Nz{[TЭ%$12C*Y3?H;RU <PGݻW -T\%Yv`:`o# G7@P Q\K , $X#݈Ofӱ$?Jb{=k{?GNюT[h ˪$0!nb -M!bȝ9n6ڂRW` nz%s ?/ K9螋inEXv 5 £À;s7FV f ԧܯq,gȅ]$Phn|f;ohQ+HN,GScZ>D᳷5Kw;!̫=e6vLd?KkxpF^A<S,ÒHR{r(yπ!px_i՟{ԮZh&/{˨'7a!{9YDp% aw 3;t 0҃hLBqsWD|QH#?5@MH3@ţ :R }O : mE8 u7x6YӐ-810E oxZSע`z{TC񵧺܎%ZjѮR{sv6d.m{f(Nkp(Rɛpiiyzpeq/+9,nwVN-nBs-QO&bk;J722H7A ɗHHmk(incg2A֏K D *,iǎH@o6G2?B*zD)]_xE `HÎb;'۲`9ǭDG[-dA~xNMQ03ȣ:}<>i݌pR;bI* S{0߉0YڌcgPRzѧ$C}ԧ` S8?Zk^"02EoFECN |揄} PwM7[3,ݶ?ƭn{aI]^ El.OXp{^(On}0j\:%T"`?m0\~]'('ߨ\J9FPJ$QP@ Bc< WY,.'1 #qU[ A6 M0/yjaH Ѻ?9fs%aE|@^qBO2b~+DEj}sߩ,g?." ]K# nڃY>Ba6D Wpe@FEM6+[eH RE_]k|?4*->ܝ5^Y{#=9i Eq'_4Ӵ=V5)\> EKZ;LoFPڦI;scY5P8yAqۃ~&g%T[_A$Je%#i!Fm=tg^"\5W?IGŒ S8+iw|0+BxdAT͘ 0> %d)l r<=||.eᙇn(P- aWT kK|B5En3^5fѢn)-A঳'qi>WtV_jՆ 2DM!&>@G|1@`?"PAMD{fvlW;xX%}·Ҁy|TӔgM8=#S=zoF''y2@s'7$ܻ ՐuډUn8o#nAPZ%"F7LB w 3>ھV"_hNz*|[¹Dn\=ݥHH;J5UPx\Tց\3>8P{^X+0e#e0 5q^gȼO&a*݄q$i`9{`7 6A&sNk};_-i^L|n!0U~Ku:Y9ΜvA5!~v.|C;,c~GS[\_Hma#}rژy)i| }Hj7K'R-7d隆! ~\]%,n8z[E2jU*(z Axϼm %'ۊ~~$Q__ 3d(O\_}a|ַvYkosK ǚHG|x(-ݱ 5AUwRO^bZÑΞ5udkL/K:~ mӰ0OWܴ90G@ wpìC> epU}x6oLR]:ՋMҡx|?#m"[^7c`"vɃnFѫ "i[=M7t4i!e&' "[^Lߛ}`1J"ސLH\~"S]1 fu97dn;aaW7_лN>s%w8zGF:B˳bY0`jĘN@?ɐ'W[ sY<  w+_%x\YZPw89P*PQ,Ck ^='pr!C5h #5~f_ Z+]Qʃ`'+.4g$< ^pX^WݳѬ8:tub=c{oO>4sX6FLnM=>i}G5$84G6'xfeAe*ԙ5^kQ)}^QK4ku5G,k~1=f-= M )W` 3G/W|vi|P~\NN 9tjjC 76,;鼧e%JP~G #ێj3{e NUFq%i} :m-UgUcE[5OR5~Z^P;@:|# a%*fM0s|xfֳ4j+~6z!Y[YH5auTh3Vȶ3#cB!wڄwg?y`"Su- ̯>1j wzIv5u5hRԨ)7u5m'V#McWT\{օg=C +d01TUGCTqKD$95.| Q%C8_I ^seh!&޾*vxQ .5D' ; w>TQt:f;54n#ZuϨ%~^gA͟O}M ]wYw-n]vy ~xz"±oyWbe?$@ ٔipWǧ>[&BzKbtNHGhB J`/9рآo@YM֨ey<К3a۽>#^yxdՉruK{SˋOe E[I#O;&=mvqyt겒bnX8]tYOr㟀\qGF 7MzFmKO wguH?[\ֺB?rp:lG`/}v NcoU:@zsطB7 g5ߍd5RPrF5x_"(F>wZYpU>›Z~4`t3dh +GŸ{J蝫,Z_e$I;9nOɅW}BmSsPKwua W_YgQN 4J3a)%: ` Ev YUA><:5P&k>balY'Eh4$JNܷV >_wWƼ<~,VfSmN^]3MB~h[g(H߷X%i{7_j[Ò !p RYaa聜d$'d3FC_Bq ]( Ɉ88x'()v& o:t5qC]kK]T/~˅ؤo:9cָ~RY_ . ̓A/ȯ:H}K0 .Cຸ+\#ﯤt{ 8H'wVG.\[6Ps)= YwT 3]?߰Ǣ*dKD]vi3=qMNAhZ b7Se%N$P8}ʘ̋`,lB%0B( {UݧY 'zJ~#8ZcOwpOYn u'=i~*Y0Wז#MQT?pqIQy lS"@mL=~aRܞdB!+**,ݳН(0B^|;BҌMOd6cHmkD>:Z89 OJlZK?җ x۲r8vW?{a֛a/( A6={bqVj]eF`Yei! nkpWmotT W_bД-R\JSb n`_v7/%}gtY4Cc0$gETUYr—Rm߶l" 2JMI>]}ݕ=m糟sh<5Kxɽ]S{ɿ[}磌rϬfkJ6y_cXcgh gq4@ RE#x<3-PȔTg29-R\-5 _SC\}8?Rvs׼.e% u&J}]* :L^zZWkܩyPFEp^3ts}N/E荖[ipۣH#24KnΞ_ax]XEd byWtUt/ ℷ?ĥaѯS;疭~$nWìqJ:8e@[%lgx.ūu:~֩vh1*}!Dr(۵JTX]vGzTouSwRbB y:6xz :2$2ׇ؟ѲOhV.8hrn|tNzV=6c>Z/w"=3QQ~CT/Mw6GGF  [p㟚11%zw7f/1Tjp `ls޷ ZH o.9aN5|^JY!x?]ݖ_|P sf 8tz']Bn_@⪦FxH'&y_:_Zno< {KuC=C=#_/,6hzKWamgWWrUX{hrN<-_ 1˸oC׷ |^)ͧlh80Th;U\ѣ$W,QFfLr-8 dG>/{To/љaOOo"`ReU=߰q~N%{i$,׍4Gi0t*;l 4zz@ j3.~<KuN^NJOXGbZ_zo&.X ,K4hh_={}$FY&]9eҸ\1>[!p#g#ڞpo^W~%Gyz"+7'4~Sm_Tsz{ow ߺ7hFޜ!\M |.*Ujֆ蒼.?J'hjXtsZbVOw\$!H}BBa Txu&Wso֤,Xi랪x< VV"읺.}۶K*aߺZYBCY~z<ֆٻ7`)/hESmZDiIȡ1b/ <*yp&m0 -cBO"eY6Xb2E>aZ4'f1}='Ӧw&-&#-55ps|@W\O";b[ZENxvHWƏjs]d \ztpe4 WÕMzq'vN f0>swҐ#X^^>֡' ;lB.W|"0#EYXFb-䟜d[*WɪQr"er,1jQRB!Y9\!8Yǜȗv6'^*n>nџTjrT~-+@>=R1< WSZ-5 "s`AWC`3dXxkttzve60/l$ ӈ|sXնCQOUժDܬ#b߀R?}f= DwjwjX/lVtƇ2U2=H*a >hb^!Ԃ ?HK2ΎjߟB0:0.#ygDs 1bTÑH񴬀r6:8sӼ7H˧vsiў@$;Z>MoƃVpv3ĕ;] Y`p)ejBo/=/݅ӫ9R%y x73=VioL0A$o&p"8!/BEL;ZQY C{X/̎5mdspW9PhC2]3=˼uaQe8a%Juat~w $ ߩ^% t)߉$.*˴뎎 "(x^*÷2z] ,3/.m{GaO>G]$OOBYa^C+kbUMҴ8MUI/(>bl>|?A;+k>g A͵ql]_d>NR%Cúq"tx0XeOz"3[YUj>",dYuczyp=4v|luU^#! x1py`ׅы'bkݽ<`qF+1=?xz?[8w{6գW3\Wv;(f",&SGH\PJ f\X4Aj %U 'A^22eXR5l&=Gs]VYL4=F(UibJS񆲰(d.~ݭzdN&h,צxMoV:8N?-Jݣ]ʹ#k*R-65ϸJ|V=uIN[g ۰Dͭ~F73qr,;ĭzDž=N?;P[xn#՝Wf*"ם|5Vdl0P[5_X%V~:Z0Pvu,Zj>(vZPq:V mjq+Rl_ ]`6.mkE:,(Bh41p|X*5;R{&" (J+̈ mӨ]..tfe{ߔA>E᭘a>( dp슱%^wxsg{f*-F X~.uyקo<s슗zO`.F/\HZkLzw2TXő)+вPG>躚]q;/}:, "\)S'LozF*rLO, Mv߈5sBg߬, [:C+Ioǣ1> ݬ,¼|)o$4r,AjMuM2sG#4֝9|#-V"V|J#^ݯF[+iD;/"{ͣfv6T{=F!;vWFVJܘ^h۔an\|d%(OX½ɻGy\[ǡ6o_Y Q`jN+_sx]zwȰss`YOw(5Ty֞#a BzX[IaV1MHDT2KDn lwq([M`7J^Fo5_ZA5UL^-п,HcO^O??ĩ$[+* 2¼%Ns|s>]\'Xl$CqSlW 7gOaZ>۶/K _N3iJZ?iisNEYG Ql{G9Ͱ;ZN"Z{ï399f7Zj@`MR '~}2ܽ&;0X&oB6Ν޲1H__UyFpO EpnJ"Kj"sRYe[)jgۜmYP*v[5>4UUINT3{_!7݆pYNɺc hYhZNxaVe@ls$uzpәkacg+<8͓3Vc֙1D퓫M/XY<1TgKG*vAI-Opu5C JDP,^50 cpw}Al=:>鯀)J´Ԭ=j/socޣj6LJ'pߨ~@צԴ:._/(*dZU't()H9 Fasy8-k&@cm^QO |W"IhzY[\m4w*v r"%Rxw7}RǠ"6A=c}<AʃщC k|Pfw` Z "0Bɢ+={Wʡ:Ha1 Ӵ:qld=(Z\#gw۶8V+.!`GbXlqڥWd.UyxR,ڬaowq;Vp⻳lg~1xCQG"`aPi`m#J{Ge[H /ZSJIV=#EH`x4vo mv p X9Uu!n12+E5GDWsؠ^ NHFy6|dO5c!|- | m15=0b<QCHJxM1+F+πO™2^<(᭼=oĪWsZ!:9K%ӻ_Mz?(:toA z3hr'8D8ޗjXVQȞ@$0G)y\ S"̬>9*ji]^56J%"Z|vȁ{Vqv!FVL=[;h5bY=~v<%j9~n WzhޯK$PϤz&u@ :jEÕ'V\'ߺ/FRl_[ Uys4;_ .طVk{˙|1>Ź?+Q+ zٓʸ3%⿅7u E>Įj|?,uw8c?%(䃻, 7IϺlg /.xBXs.*o6o oEop*jUFw~|s "iS(݉\ lխI-ԬX)jv ys7ֹg &5;jG]u=]HU;|0Bk{e ~tVc+$E7QcDVNE5}#!ݞ[X_UEHlX߸ܬY6ӸX7IlG!>ܻa@M᪂Cʺ18)7'OpX%YFtR T,eZɏ: WO^9z"{Ot6\kM_ݯ/*-}5f N0VnAq_Щ#VGb6y2Xín"Yj;sqL3 Ͼ/O~Pޙ< kŅ(8sRtO`se=?yjaTy ? IG;uiq6S5w{YX`d@[Um8tro-JUxFP:O,?]ZʀuQu{T_l)7y{P~ej4=}D0/bgYQ\xw"Itƴ3&+󚦫Fݯb!n&wh❭ta)׌7#}/SP,{Mv}Wkv B%-k}Ĺ/$Mzۯ xf$ULF *ix3kf?3sYj.VwgؖjAwk:iFB<Ͽ~9ͩCnz eKuwa Vd5hrg`Pg̮ҟ)HN*!'rYY{a=:I-} ^#b}z4FN1~k[8vPk(uG&$@ 2⯴<Kl 1V mׅ4_[µjG]熝QU)TS|a)klڕv`]][r=zj]A_)]J4;]#pTāG-=N!vjjǢ>4,PI[@҄%X>&W\EHo|%n<򝽋6#Cpܯ<*i8Nўd#ᢞk],8w,>*nJ`׏Vu 6FwXj?+QEuc_p{+_M͛0q¿Wj1Z %*:,vFXk'm?B; ]yr*>H7`" %<&Ϙxx 7tHͱY1iW{}w*ׄ*ſ}V ¿;]);CERjpau;梷\K#!:Tg)gX|*JqXx9x_HY:$#6 [~si C%J@m6?vq`ZM"a5S2ȔF0XkTjA 'h\s5>v7TG[,p>&?3piXUdѷ/ ǟVx1+9Ui @k0{(u %6԰P' F>>HoGg#AViHjJZhnd:chP|߷h p7roӻ>i|;Qчޅ*/"T{G=j8쯉zSyVw>xՖqyWGt6uܫW2 ,q=^NܣqͫϣPh űr 3N!ضl^1zsn:(!M#Gf xm,匽R^6a&썯\wcZcAtXZ1eߍ{xT߱ ᅶÿp_]Kx4\,HXDLlǐfQjټ5%ɭGG,=+k8 "U `OWuRg7oðM溓(ޅ%SXϣU ^uB|0{#ĄVe)TLM5/:N/\}/;q-!_1 `&V_8 yRrDe"^iA!CʜlQ@SY~nI->lAkOu%GѦ:ii"XLSG}t'X >sR (p7wS/էu&yb^"//߁5uRooS㻠08nIYCZr=`0)V`pj|Oej9ۓЦU1vnB^#ZkOOJ+A &L1|q#a}p,9֪CZAu|γ 8݌ c :.$o>Jx(#g71 UCejLI xpj#±a(FJ'=ڭH`H/ޚJڡz1]˜V]"jZcϫcS讔s\qD[jjN"o*4$ўa(xbgI-nb)z8Ws*;E)|GS"]ZD=~D%8]K˜&ROՓ0+UMpMi{u C&NN=l$ʪ.T5m*)v{>k':6H&.8nRNGC$[&IG`?4``ﰿZZgoʝ9 `GH5+"*Tw_T\p(GA6>LL] S6JRߛiQZy!{~jy>`afH5rBVi806IJ+Fci!/0G)s:C B2/2xD+~" nFl[Û6iD R[Tw錬MPLP$dX9 JV 9ѻBM;LJ7Ah,ތ"Uߓ %jXaoI5++3H6zu@d!UBE735#ΛGb9>T|I5Kt/4WD9ېY鳍h*~ʱjZK5ڻ`.!^C<4qxJmӠ56ڕi`H[StN Tշ_˘ݮ>@hzI>7 ,}4A8}[9l%KIGfwUM25+$@d^JV}iS.pOAǃgB-vtZv-mYUXl>i0 |J ӯ+&{5htֈonm՘Fz(H଱13$nCĶZވկWIt{cϽf_ %O,t kJUjB}27d'c`^#XeOC.N#$R:'&f"踖TEvVɵM(]?R= ]Zq-%V"37mGipRy#كaGζrIut/^iJDp#ɸMuVen&Hiegw  bMID[}]@zOTSO~ҊT}u"2cz?;"aa|E@z_c6[\R07x.lt jn?P >%8pYƴm .t_ڗ:o3dN=MEQx3Q>#aYwH{a%Mivm@>DA-}^x_lɆ"֮3q&{ko#G8mo^BKo2(k8_+ hhD{)#NVC,Gx禊HPCpX-zN 5kKhKjQuCwG:r+:5GSWQFOS>Acp~W="a$:rJ)$ل^uSޅ5QW}1J9'{s&_g*,+&2|[Z%TmǍ6Eg0};)ʙtǦk޺kwNb>vKӈ*:uSy~֑!ӣ.eqDm.ߵj;$d+ sq_ڔ-Њ611xH:Sl9(Re *+봣^;5}BD/7L:lqauO$ 3;Ag 7/ث]օ|wn|a [ :)`3 o|h\¬hZ|ܘriZ٬$*&ՑT<5Nmˑv0PQ|ڏ7/~(6?W+guB?R{sΛkjp4EG-GխχpU8Z ݔyYku\#GS{ҭMٳ4_YJsx|G i."zG4x+Fyia"k/=GZuz~Wb{?/Ⱥ=b$&![-aB KZ*{@Bֵwof;5.Z{VN>H #?>u5*9ZF蝜3:dUoٶt #Vw#Z]G"$μǻJ76a+ Bc*K,N=h6;%kP" ;eKi1asTdzawjݜ#69EKkf#GVY"+}:ALm,HneVb*8 |1l.~OѠ] 2ܼFbd$lc9-'}9S6.=rv79qh'QcƒtjN1tFP kæKaZQlug7y^vɅJT VkRXX-욢6hM4y[FPBT"5Ӵ MQؓgn; r~oD$-BOT !Fm Br(i];@`ocȄy|&ǿ:'mZFhʱt'HKV``& ea?72b/׽IZ]\wmL)74Z6}G'ͱ"N~Zh|Kwz￑xls=/_ ڝ֮xx'X;(EfWvrPq37ɛ * ~Ƨ$cmN=K IxƢ%=F{b1-T'|?G W*YFxO);b5|noLfؑe%!S\ծ413/Ţ^xZ〕M,h6˴NiZz 8W"Bl\$Z>ǡDGVРȆRUȖ]1[ucTB+fq~s;XIC>25PU sl 骨MnxQQ_;U&R [7xzڃcLI<$VF"47 UoroT7XNUg]S{'#T@k~'Mq 22$t(R9'Z)Է qF`F$KA/ĽQ VWÙyy4Xlr|iQvXU,I8P wEi1 %__lLMFqc~?axߏ §c o׍鵔'ᚷ`<3v31Cn!S1sF5JOE;x (yq52˾*kJ)XLTLj*٫ T{X"kݪR9%U:{ل8S|b!{nrbΟE=sR?TjOZ?gqGH B2,LSy -bcVT7I!FUu_\*v.-ogMx@pKtڎl.'M1GӤ8GhrccvCյ᫴OͻHѓ48vy>8,犄tT40xY: n)eN_"t{ ] /fƳ҆5 z݃3{g3?,cZ&vVwj(2 r4vti IB2 t@P~yo> A%x H?Kot ϴھ ͫ>mj|Bg0Hx"rՔª-o=xMjV(K* v90\Y;ʾQC ~GGEo8̍5Ym؏Ň +,7\6,mc5gq_BfZ;qTe =U3tp!x|-}mUr/{/ۘΉUlGvٽF>_Ttg}>; kE%˿lY\kuX#ywc}=Vb:H%)w$o-aj?6CV:grx#,=# k[;A 4W3߾U_ѥ %K wCc&Kx}( Rw"3\oO8fun6̈́t#VkW~i"JL(Ľ޳ʝ[l mkHo9d8$i@O+FԠu)_ *Mhg@wzD]B]MB3oά.31F?Q6\7Ϫ 8Ƹ!_,QMhFh+: ]+\n"`/h'}Nxe&lcƋȁM=͠F8JxV#1gnUSVu>ƽyWUyQ;}~%k:*{0DyȦ_wU- -jҤ!]G$b?ƈT%tFL;޽t mc{Ԉ\u%3gc!(!4-Qq1`=)!ZtDcǠf-: T*1f]B(C#nͦwz}noV8(kҐ1m0=%O`|ҎK-h]|+fKAʡ[zC9Mս'బ!25*q1h br{ ¯:5mBO}c_dod9qYߙ0dGq; 3Ktmg ­8 IqHUxl}DժY<./*PXЙE&ur)޴^Ê?1K 52#mQxӵZ4 |gN@Tް$au<|fk4:t sLeZ4#(`Vڽ y09ӤJ].!Ј_;t0x+8jwoFmcZ 6=.e5Mhճ$1L؝T*F]$$sٙ.P-4;0B㚺>}պDYV 7ynY"c0vRɈzk;s$XF4.#cp,Ǔz(tOõV ~oPVFRwppm [,gص <.Ql@V#jb_^.k;IenI (5j 퉇}X*츱;axF(žDmkvρ!@  3\ /H>#y˺ԩPo|D`uu~Grkޅw #N10l# -=~eUP;Ȍ r#<5y{9fT:)/فxlWD*boͬ0⑧!* o(j2} "(+wlw ~{`2Ǐ`!3 1cIh♧zf! ڈz[Xu*ԩ"v3V~RQj?]_͓;v+e`cε[}5O/A[UBm&u$ wlƕvӃHo p$p0&O8 t+!xwfvZ#BT6z1#9Q'Ph7x*(˰u]6ڬJ#}"\*7-" {'mYwM;Ue7! $|!ueG 6iǶG~*LӽNaXoC.swm Mq,I4&ؾ-CV{LzRH`~ʏ>ar7iQ W4e Nz?T2o=4S`۔2*T:3Ήb dyW-}|D6QNRz,nLq>"͸5"j!K3 | jZ=nGlbuX{Ýe^tlDTӥy ڝ#J^m m`PDБY&X\%i+DxWUTp[B|.>TZ8P}Lj kOtBJm1n{ǠPf)&?4;YoV/qꈫ~)Y ^H"-soPẅ́A<%=Nx # |&~y6eŦmtfK4)3f4 |JZ,,h慵 zk 멼 өeU )Y u[$N6$?{Vw8[?wzÊ!Ca/C3;eކDجܚiP!f&`fOc٧'c^8$9ԕ <7ũCc.f^y Jޔ#[onOy4yoA~`*K>n ʰ/:HBa*cs/ޘJcJ0 ;$vJ=L̺^4ճd+(Mr\&A 915&2s`u${҂Xlw \"Fq1#[ |%Dk 'myE>xרfP]7 8fW*dmgS ߨɣwb{*;)DIbTW=LVR0E^^晥ѕQVHARaoMF~!jTJ]4'cDJ4uJwtܦҠ#0]HVI3!GU/'*:鄾SItӪ5KHpf #rf?Ae:q`t_[Cl_P`,*54T ƁnSle` I jCY_I'S2˨mbIB9 `bj':j㩏1["C&lD{eƠ;'@7,OuC zzlN 8h)N/z҄3 ȪZd$]yDwP0O )MA0(Uܱ-7b; U zb WQy=7fFg:=`@RODSZk*"Z8 fg Ȅ]mޏ\^iRTxQ\\a7Ls7O?Z7a_zsZꁝb\D,'|+ brƼ=Sy,u(8KWMT )mNŤy(0[}D +_֐/j:DE[Nc^_xՈu||OwY*( ki=SETs[-B06:ѯb良&TU! 3;ԭVZa@Wmq+ʸ-ҹ-POm5H]FaBۻ2V0pHVaP]P=Ź:Н1~hZ޴5hoјXѐKrLjסHnvZ06] *\Xqy8?`*b;WBon49+WP6Md讶n!OK}>_VjGCTy`QܸEa[vZ^"y|L_]2GPXo-C^V*vQcS{IeYopC;a簉(=KjN .ORAp_EvxLkNXpס^eF_PQDbJ=0XLJ`%d-"Tw^u3TG];U9  sC:Q4Ъ"/Y6{kb-&襈 !Xk0Hj=:LXw-Ǜ@ Ux 0'0zO8yޘ!DuUv[{bhZ' \zM 0~;|Z9xX!(aǎ )j2'UihVz׀.ژ3(Z]J٩ ل ~k #SIV$6~_*kEmPELS{ ʀHyN:uJ`hk}[qS)J_ܵrgXZ9ioh.+?;GvY ~)K2\(YQ)\fu ڕhܱ- -/aT0 3lWKp{yVp+Vf:]l3-{̆]9Z峚B̡,-EP7KZr<@363Fr.zaWԇe Jқ8p3UrJZxwWm'>"莗euW4nُ/Ӕpm}".8T5e""rV.UP?k5 J2S*wXGcGyˊGTvʍ]D]\GmPnpH5Tj 3iY#ۅ|^$ٶ \-G l˰ <ӪzS)ăIMF$Y`}ߓAq*rSU@Up=8D@gjJR _x%wh(](Wsǚ+M6:')"H=T&ʱN돯 ᔨQ6eD *3+昡]BrW3A[ |䡅\t5*{sE Nj7P>ZFc?:4Tմ220)POW \з~ۑd8$TC1H`noBl؁FFyBJÎm%;wZ8 JжFZ{ %`7C!2x>{/pw\((GMf@`Uz k6':WT2JG9`qiy# M :ܙ8@J"ӍkR?qX{@W)e]&,^EpiJEa@Pe-bX9,GUE3BtoF'8ZPZw;ₒkfܿlvة1:Ć.qЬ -u&m[aɽ58vmIITyZ;E@Rd=DLfKЅp!M`]IKp'j"?Q6e&Qԣ}\.7Kbtgm&DB9"挃CakڪTf)*2r,/>e[ nWI˲񀪨\wO^R FY p4ᮈQt'M0  ~ axN}D?tWʚF=R]+RlP[/xuJKSKW S"Q-(}#B68vnjgU@)T;čRYud_R&\a+w߇S`D ,$$XFCzV*&``U3xb˓6*'ȥ3$i@Q4lۘ`/h[o-o'Ψ( ; jGܔE c,svc6BSjs=?qڟB:+8>4څ8DF[:拗Z B4r#h@XGyz}cu1Օh}P26 D%C-m묾Em5@MdwAFCwtXYZ@vo+L&A<'kQI{-qPʊNgturQů@PPyڥ/l}GP%}L!QULS\"VJTZ2H׷d[_2]s\Elէ鱕E[F %k; I!cжIܴ&x7 F/I8Hi6Gt3(5˷ѝZyhgLGy^ơSԩwZݬ5:09zJ!g>cV@u~T3ycXqNi# @kbR7MnqUVIͿECKP`DG گ?g *j&'UpD8q'G1d> 7D6k1,u*l5L\}3hd+bEC[ a@?R o$.=7!_PKmVK 30Ů{2cezmSP} "cK nk z[E۞Scz+rZaw;?I)@X;žX;L{1220 (cF [ -1A#b8 2eebtYuSYKkS^t~lԴb'KO/P#Abt&~ udwf='avkVՈX^ RURo?îŻ"Ą:a+[F;n`&=ȼqg?38/jb_\ő|bGcɢ6Okb[(\CS:/Q ba{6G= E`%N1. AXjXSEG`iF;'8t3~0£ 9ZҐ*y ထ4 k"`׶O@Ƚ;G ШіaEκzHY[ݮk겤Kp=[р!RX[G\ia*92&Uɻ/_'zj#$[L76eBj2E^)jt9fL*8'+7ڑҍ)Ip7~3=CJ\1{" ЅB-:ZH$s@rk͘ejR?2M9Wo/QNuIDct)0  5SG=j޳EmZ*NQ=r%ԴOE|eTp NVp F_jJ:gwb.aՔmhSo}{u8F#!@FlP[,E=3i n^ڑ,B'}D#X!Z?}yP ,ʤ:?񺸀kc$WtC!0kPJN1 y#ABEq 0<$D oPǜUh/Dsf"M;K"`t1!%75RؕmXE`#!eD$(΅H& QGcsD՝jFЉ؇ =h Rh"5yB)9}y f5i|Yxۤ/ Vi*u|0S2=D#(J˳[S-L*d< D@ZPE54P>ڢG(`2lZ!DϑF::{{e[>Rn ҩnij$ MQ218*dU TI ߅ўm회"/k6EnFۣ3DMZ "_!b)KGH:Ap'zt ޶QTC&Nv!M_~RLYFzD=ҀR¾ҡB\ ~Q ls6$!D\0"8p^Ȱ"EY<HS=; !nHTTX*HF"|Ȑ0vDVm/j."Dd(OX^AЌߊ"Du#]>b#V:oHpʘ.gx51.+àED5:x!P)"@ɮZ+: ~ IdDIcj[EQ! l#X5;-"`XVNr+ BlP3Gaji4O-jCy@*d_WPtѬe8M./ _vaV?6\?ؿ 2! $C$2>3̧&B6ޚf}!{#;Zkok4.h1wv:U$wZЁj0־,yVA:HI(O(hp]qO,sՓ%$[<1I(y(.b|c!wnynKe$mhRiVm!k>19b7L#w[9)SMqT]zc dfɋ2RYv[(bcZJ;2p*:v? ódžn^b6õL4_A&#F*7m-Cݰnϥ`MpvS=PgAd{6kuEX8}  rck[^ԟJ\iɅμ҂IXbqԟ%ib åv[o9xߓJQOmOe,v` B#Aj2**G!}r"/nVEE t_9xAh~+FnF}Dwht%i%,ū(0uËl2@1#Z/nїc~C܁ !*fMqj[HP4}x iyNьFׇD#7-|}Xhl0\hd7$V߸~A] K@9UlES9zV_ ?YCYϘ N~VkNWa ;'Շ 6UKA:jVMcM@h~d/B#@DJ3?!⋿;798;d`a"M Wx 9u8c!@RdDY66V$2Ux'K%0EDnNK!p#F<nTߠG)G1bv*%w8 Fƌ 'K%ctYM"4h\*I~\!qF]?@3&d cS ?D?|;Z{wJ'(ǐ+꩝xN9OszT>xxΫ39a#D>TgEtDPiR Xj#AX4;jD! r"-   WQ9}8ɽ s Z&I1O&z@`a7D g b!漱!Xy>Ifj mj;L¸ r7E9^BвKl} : ܦhd&'/ԍ^okm @TTqhQR1& WZ3`IN:/$OlƢ$" =y8_!BЃ']2w|yDQ4 D"%PP -DQ}!^%ap6wdH*f*GUy&k]@b'SL bh z+j (*qh"" $#yWcJNA(L#.`t@ҍƑ1q lى.;xG92&)E+AV=CC0"D*!w8VJC.1E-s\@ |?'RR%2jE{|}(E2t UMo@qPbߩ+> 61ۼ )!1;s@ qQI#9K)(1D#/5 ǑE Gp?%.@lP&iEq@KQd Tأ01@FѳcX\~BJ۩WQ@")BBҹODm=!@:|Z06 0ȑDl!ߜT XDmϹ(Mۘ rB:v:8onli~fƼ) !"6Hd9"H%^GcZG0T ͅY yd4Ol_b1øH"9rkзLF=cJEIZ$LC04|8mG1 'Z%Sqh@ r"j @ND^ȎCnxP#(O:%DPmlHQӭnSXfHBٽp';A֢1  z"C$#O"1˰#DRD~(O Əoxm` UQН!C?02@eWFo :rʹ {9HѨ"0s7tH ݨ'jBY?c]DW" r* e;U@ ) BcX;Bhؑ!ڠ1Z7 VѭBī싮'>a5D: 4HcTid# JKD`_ATT~ċ:N:'cD5ڸ"uiT@*D l* :P@e(D  8h-a ZNnQ/A۴@wK֕96D1 Y rO؋jjqD4fZMмj'ޘO|#=I ,WF+$` UZ;VRtN 2Mu)toc5x{#'`|@ϭ0}4_f7w2n!V6.2e#IA'- @~3.Йzd/p`<>5B֘84j6ojV`OX9g-9xUt|0_fs IEv,0=5j%E(6zE/h rHmdQT4G>zxԡ}DDWlqVDC܏o(R]3Q5- z7>L?5%ꮦ  GT1+`4DeC|ɭ t$@hu X] p:$ijRd- ;& l4wڈ +*S ɡOCfD_ s;hYm"Ͱ%.58C7.D#<Ԣ)t@*)UN"NhN$y4ܻ}&[0u@Ct3$@M=mbDTE< m I@ "*v H7GnN:g0iOȈh3Dϣt 2uSCI8p@gP_SD{QoXt#kn5xTc1G Ϡ76jΌaCŒ]Rd|f&Ĵ5f2{D \:x:'ڈL8gLEA h 3l #0/*b ¡@cQD@8.LFV&:ܓb?=(hlohW2}vt/(fWix57 Z")(Du \ P:$9 !._F g߱#k8`DTۖqb|,. "K5hщjfеblj2D;CCfr lzg :Oc8D5 &H!?0y8DIc]7KG`nձP"?#V"\` *kSXP.(#Ĉ ##DAD 2b*v@P8˒#Zq&[7UI]V<=('bdЬpJPI . " cE4o!yp!& фnǀgi%r zP"Ur'ct >b-> 9$M n%r_DVwr;$m 5tOw qwonz{ӈGK,U E d'N"6HT5k@ϐH=1c(ta.=Fw P7KS=%IӀXI# 4x%(#&B?$ TI(NF Q}MA " Q٢icp FR|nє?1XVuS@%H͢x &-c7B6RTEtas/jC1\®%uPRX( ;}q7D*&-@kp#v 6`X<R@>ȑכOHîX dF۹ G!Ҧ/hF3~DEDT)>л1&.txC*>c;DI,ȁB>٨_G*#!+`h8gIqÕ8D&Vq F$*;@bȎXO $l5@\7_G+ @2k"@e@!ZOlmDHs1Ԡm'/"ݠ:CʌDhbp#܌; 4wdN D5k$RA0s@ J$ ,[y.1S~׈*Kҁ5k_x@uK(GUQPHj12"56&HvYZ39EY#٘0/0;>]Zr_3NQ :Ќހ^RF #ѫ, *O?U;D #D2 ڢ;˛ZASV4Ee%"q㸙j-<DIQVuW&\<jC"{(Ȣdh B0֯" Ee'l}R8 +tBԎ@"1(.H>Q9(Z'`NB6ȟJDo0"B害H Gl]сŘ2K0" }Gta ͅg2)K6F'(U %hDBv/J> m5D m6>@ "E-D?qS%d@}:FWq?@v氏#\d}pXX&W]!VyU"p4Ùz-qXhUn jK{o~I- O1= @UcvW:ћ}b UA]#6U] =V a[nD#iC@Ncҹ`Cοcz;+ %>@-z auNJQD#E.J^s"/{ô7}+5 F4{ZE<+Ui&|sJOŭ+M_]?n/ғ:mVP4GUtVDX*28%y+Bff>G2ݳ^+J>T] є?Hf]"OA =kED>C8a@ g`lf#DNe'ō^H$M,jX3t Yr>D6맓Kh}Q<H䎞" 10!CƉfm@a;+̏%F6&VpX#@$E[yD 8D=1F>c.jb2 s B'd\)Hbw 6sO-1@K B1l䀱"aW%,$II/**ʐ3R5*C8D"o0`$H@ fɈ@B 5q7dy8LuhDܭ.܁7ˆX3uQ@MJX 3@=] GaDM nb*D k)r!*(b4֖ =[ w;BbLa*b#IUzQhF, Dp]3 Cjv@|*!n6lsvڼ!FƄql";_+P .b"gP,xܺJ*bGSt+*Fсl`k"3UW@~'i ?w+쉘@"v?@l6"k7#HqF *#; $q'IPdSE} r`@ؑ@1 7eNnn2S6j 6jШ4 ODۑ#@rprX8Aܚ8@EBj"ݓG CV,*>Ff?LC솭fYgPܡD@Oyhy_@+("/E|ԁ3<6hE@`X;d!%OD$vBʖ=YDEwJ%G.k@Ԉe"䁶d "(( UQ#Dو"wtbmHH,%(Ap^)PQ[5pFMLiVTJo@lʵW-O( Y~"Nl3t,_s:NyQ' F<m@ZX,g$2(<.։sFl gA*Z>x9N( c&΄ ÖƌnĈш쩝5iD`LXrAaFn"$*0!'LG]W5DD+Dݯ`p5g6ɯ&Hc cEq[^:$P;dB@ꐃDZ4uS@AFȞ]i )<6$KEGbfC,Ҙ .15$.Ja_.@%Br2(Q'-fϢwOn "5 fD2 ;{Y>(QCB'brHKX,HZ|V \ͮaKDqAQD}G`~*"v!l\ *Elۙ aP@@dFݯGx? Nۀ>aΰ4yNBv!Cb3iS)7D Fs@̠,%h r8P$ C.hG4 dPu04v{# *"h:F)Dtthf$Q V:m ф_t 2tQ#FIav@_mnPDdQra tFV|?Ey ڣzZbi^:~֘GU')h3ц " )Cyw8 *#J @їn| I&=г'ډ!#F$yپS3I4(3ȉvɈ Iz9h 8fT;jkr"!1nGQw9"N4M~ș l""hyއ1>$Mã཰$c@wüp,(zBOׄ:4{D ٍY"7TvP7Y5рup&AuN>iF*b1 ؈9H݈?ʋGx6&&76:v+@!"GǮFvDd= Wk"lDB@3dAvXB f̜#)2$XQxN dHQ./򀲢%r6O;H\uCË́@ b'X!D3Vi+]k*+ ?ʔSv(p ep#Lڑ#yL >D4hn(:UŢ%`tlPHdl,5bYQaBL #NKII D+@SށYL'cm 'HzʰTA#"!fCפr'Ӄ{,HH> xBp dH ۶0aS@ʆqqg0H'}>I 7;n# 8.H9n渑Mwr0 XbE1Db4o6R)bzס@pG1s K!lܗH@Ͱ\3C_s`5eL6'0Y:CZ`*hn'/̉<_ʺ^#}"q );D`2+bkvU[s1O媱wˎY^mR%6$ma+pq&cC0 girfd."TXL";7(0hd->@C#j{"B dHDGBˠD_T~(QGnƨʢ?((IFӓ}.mCr:(dLKn"$g B"&nr'Ȑ;koS/'N0HMAFqp2nQ c^/kyN~[rpdt.tH)(E,C( *hv́L)h1"x@$ 4 i2zrݢ@EEuH UJޅ-e$Sk`D=TiWBYcR #M@""}6C 9~=TWf9H@E;LfŵcjDZj/a>thDAJ&0b Ԧ>$I&l@ aA#Da"1a-DБ76Dp$_e됈HMJ !v0O)bXT r'C!8@F@G#Sk=Do%hLu_A0Ph&E=bhRZɠ#(! "i匂BR2De 0HaBD "+*#{c#DEQ Ernapː"j܁آ"*6p+a槳 6!;@lðEYQ0h{P;j@d9\5{R"D j0nX đQVs(HX>H:!=R [FP ^Cl9ZTD>@({(r(bܮ `#I^bDn Z"VZ؊m(  oQ"*; UUb̢+:zxгg*N'}6^># yz*QWDR)gDh"$#nUID@#'Dq !0@]FM) ."ȻQ>AM+EUB" @G"&;A!B^U5@PIDב-e] :@kP|Jz#7F[9yE2\b=7vT14\dI vHG2:az3s@Q' bQQ@ET-5zUeF& rvx1j#D1P"r uj6h*8)&P`W 5FRtE}oh(gd.$ #Z #DM$WQ@1Cjj 69Kz(  b"3XݢFM9@gԩ = 3?()D DetFPp"ZUt(xDqa!PDb7d>: \~ %Q0jbD""buLUޏ:p/l((: M4$1vP@2&0A/ Q@@5.]4FJ:,Dq>h@_P84hՀ4"盒fF2IW8"bH 7%˭nomȚҜUX&<[<➰ȁ?FQaC։"F\Ij6j/N1rD1( nt* 3 %J@b\?`c(Tf`l[_a@tlDT:U~X= 4DR6t@HCKCl: 5vV!Bʁ=%D]oFwe Y01&&@=(̜69DeRQ41a]G*C8($"8$ta-$jYSQcx( ~G5@A`w 4%_ fH"#-z(ܐ5hE4Dnrǩd|N9D]@z1 }@aQ@#ol  {JZ.$j20(5`y 4/Kx @G5Dt bC51q,eFĠ8R'igNӣxxp8)CUzPS[ $euDА ?ň@.H*jЀ) n(,Cv>r`"E$J ')&`-`< b}%a@ }GJDT "Db6C\t9yl59rD{Qj+r z=G5D 6EA tP; E ME 9>-#F!80Ȋr$nXP"T(dbHѨ 3 a sgccDNG-/uǧZ'z>""F-0 B^iP0k_}D+pghxHJ"̌ MeNDDPX 83V؁DP#`H@Zg˼h G(0KUp| +-z"uKU r@Ejzy?'עFlQv)bbxeE8O bTjm=>G)F8@|, eh]r'=XI@Q&tvt^Qd95+8έx54Z"$" Dܼ*!@' H: A'U#`%( zHLطHD-nl7r"ܺVA 6Ȉ EZ@ ībTH(G-UDI?kZ"d"!F}p5r@ Z>$a"@o>< J(d6H䰋T# 0[8@ L8F]8n BŢD?ȁq3TI1dm' v0oDe8Dm0-`R$Apz $J`)P?āGB`.8؝%TQ#@sF5g2@"z(.H#{DNV1WLq4)#}D?d@#HڮayGBuF2>F DQ |h 0(X fq$tQ"ԍ>"hHy@ fs3D֠{~_'2)]Y$&hDJHT~(EKkoT> A_cO M]@h#g`IM!{Pz/?P5Ԅk0 X o'E͑7ѝtˍTkeZ}_lBl65`'DLh^%oo.GK4'kx%}5lپ,AFrX;]~Д "^KxQz aTN-vduM y{։RIlxH\}Pߣ:O}0o'IҸ6Hcي_|fsx+)uh _%k.m<UHglsp?1GݍRd#ٲi/*p4܊bgG jP E³r+bRO8=\[,PK>52Qέ}sͦsܘbX7tt _I𚭲OQTK&N%že݋;!c`?t 3hX+VV6(޸/ț~$&Sdmr">"*?10D@0\62z4,@n@O7:1=50 }DT"e`*S"@#E!]P [#XM/q?e@̡D 43Y=)|䵘Vv'ci4LG3%&F8>40ۜqDq@¡ATG"aM?iheJ4mn:"sc@"@ 2?4JP`8(Z'͡ -dxh Jݠ1ȃ%@@r/ٱ#$F3mb5t@ JB@vJ@vcx&HDʐ%"6$)( "rGDP3DL iR9mrch-U:.|Xk6#X(ꊡO~6IqdSUUر4Kȁ02)vn8ZuT}:śL("-jU#014q"e`yV@IQF#@  F6'L6NbH2 zTA!\$("t`~ȞSxz"~oh|PHZф%ӑK@F]KTT@O ӖG9c_'pڠD 9=DpHKtf/F\"̈͢GS'\"8$N @  #`#VUd,-hDIf2 U"K2vQ*HXm@P!FZG?  "-DL1d ;3(z,H@"rhdCq~1t5jv.( 'cxߤ Y@ '7H85HND j NAT4E9@#]tM@(GF@̱1a!6y>B^`^P1#H6\2t@r'&jdUBm*։ {;3f&a@`BHJbY\ &ȁX`)@=!Q~L"##wDV;#X"\J# 8 *GT}D ,ʾ"k 2dIFDjDH @ ?Gĉn©r#(Ia. " _,@?HXW -DՇ*H bO"+(0WD "A NlnX5j"gK WrCsQ }"|E^{j=E-*(G\x$$ !oRTD@O"##K>1tG A/P4ӲO9?D#͞ +8[5DDѽ!b[D$OVw>D׵ Ta{RDQ0-('UD3$ OV‹iP/V"HDϢ| i nD_}'0#fH$QDXTÕv#l_tMCl#D@^P=WDQ#_B(NIsmQ ] ͐>@q>fIo@V#!@ |YP" Ě2k#j Uͣ!0!JW@44X;HFVr5k'h#p,% 06.qfP`ɐ*>"h>C ZZ % HuN~e1d)hf? T@n| @HQ#㎶8+ıߡ^W | X$hj8h,F+F$H *el'E ĹOIDZ!XQ$yQQkZGGø }pxr3t`L @b?lǐ#,=BDDH=Q(PH@QCA2"N^ljDUU (~@B shP{ -Ʃ:xЍ:KaQto(0bȜ `U!Zf# -IvXYGJ x3ކMfQ\PHw"ڠ"h23Ʈ a jTu#6K`^Xtn(v >R7 1e@Yя F]7vkFaC`Di,oѹd|ǀ7Ww*UyD_Brnp qoGl-^X0>b1ؠ. |:d.H],AؑgB(t=xP$H+ G+b F+b#hrӽ3sa?~ + *`v z#Fʰ Q (_Z! Oep:cFN6x*6KhΎ]7HGW2DH!ZgyŮ&!Y:ktQ;F<5z6m]jd#I!$0۠R8|#*!naztFVTj JF*֯:2 +PFfY/Y]|D :Y;|HK FySd7R%@ B P"&F}jqIuJ_AkTX,`Ҝɖa]<1 sC:`..C$_ F:YM<;CF&T4+k/EGBq;:F̕M'u@V+?iedA*fj#{qE*y]qlm_\|Fr<@B;8RZ%vÂu)?P.CJ;#}6 *v|uՒ-X[/]p]ߪU߱xZ\uҌ>*zŔ5Ioyv ZNU1׍NMnIŜKDQ}|PK4V1c}_j!g(Ȱ\ow% 2D@qX&\DzHD%茲d"~ 5ACMDG2m: R'̏- $c@ frvL MXce6Dj5h( 4DP!BPmlD J?dcH*"6b&qM&Mg@J"B@ BbVmB" nHvUQZ#@Z$DJ'7b@ fh|љFB`= @oh }b9Zv$H#LޝÇDTwG "oR'& &hBֈ؁iD\#**HucGyhq&ʪQcU/x8hʢo2s^e@P>hwLC£6ۀ1rC^TT|ƌF@JZ ّ93k#c`e B,b#HR@g' _U"$X,([4Drruԅ54#L {4TkT5%v&C8y"5 GƠ-Nr~E  Sk|\V_9 $]D@f7K=VD-"'mN =h j/a1#DPDD@Cb9d4Q"! h]0#:&&IOM}#mϰt@Ze !@呥 qJϣ@z#{#HhY@DPRZو!k@k~yB^w##1:(-cn͢{I GcL%*z_e^A IHD~S&B[M )&$Wg2Lg9X,@?D$cz ," ZUq=@)z4tF~ * XwY kƉd!HSc!'KցB$Fs`?HuF+bF/ٍuiD /hldph1@$9$_3(@P."(ҚFl&=] Jٿi#<ձB Xݼ3#րeDO+†ݥCaf@EUKFD B/ЀF1@}lLƘ?X"(TڧP#-@ΐ"E*^DfwP.ҒuP2yiӨjHàE@x?$~jZqS`"JG(E. v R'>b6.3BZX?@#H3l%BSLPSchӗyɀ0)7C#udq4_3ĉR4ȡID]?($0L Gژgd@ P*M%;waՏXu%S%F6 %h>a"9QDlQ3d*u;01x^j'TLAۘ:t5 wbc@u ĉq߰ʒzE@XQ f6⸈aFN$Ā 8|(#hTy j(pڛj@=c0f1Oeu7"(9ib1@spȘ4C4TI-f E7FpJ!LDߑ JsG#Y@ d8H"<xP8$0"hL|C#;IZа7$A!fQ`PboWD2+& *@")hZ(D bIKDQ~(nTk_&wq2#n#Db~Ƣa?U ͈^#1` J11ԩz΀h,)D$:[UN`cƲ|'#N4 FB+6DHyg'h+c\goz$^EiQxQRн"%g@ "@ݢ5h&K?$j!) w¨[V0H"'0;X0>>kB chDEUB>؁#T>GCEw7Q2T:; " TM}5t$U6E0$ * tQ (ހ{sA@Dg=D  Te"Ύ(ȑC0"?ܸB":ȏ0#Ul%(Z-Cy5jg  Pʺ1T"~@4#@Vo 'Gv!\G# !7qh.D @y"md`1hZ"4cDEѢ@'Y 0%a#YQ`d @"NjT o{EP5EIo( WCc@ggife06c04HD@GJ9j&Fg#G\$@(3k.F;8DGkd"@(H\\"$bQwHDr2L"$ZLFiKL '£@4f;FU`elBhl7*򁡢Up\$FƁ#@1D""CNnh=@ӡ[S["|67UDOYuOH :c؁@ACXR؎;6$yZ@{/$noV,lNEQѬ(@fihIP7&*(" QQQD(?м&(E@UE3B(J_@)'f(6#3L{ѳ">&"MDe,*PPLr"rlLGEDD!7FG恻TPQ!B"*l|\"4BQi DO,"ؼ~p,0k/rNIc :& "@֠`f(:h8.HF=DDDCYzl3TFErY*BѕcQEf jQ1.O2umC rF΁ i9?5BDvCRDkGƬ/"wVc3;"\)7@5lꮏN?=U"E-2DIP@:-yZ E2F0']:UBF5Ne&B+ݸ&|ƣ$Kb"vX##7G4I!FJ s*}zI}GQ->`ᒇڿLC}R9 hqG Ɣ|4;+&d6G8LFLqVPYΚ70&'d@uhAD@p[)ގH_e`my]C?8Zk()f\x6v>2Al1Gԣ[߿q2+Z$Jdz[#!t{rF7=@ώl>x29윒(@2OB sʛCo]PK-D&DOJo.d.R656*կs' Z'Wv#c*ߓtIoEҨqPcs,ibBD&#:A_ b_N0=Lb3ß i=X|L/#]O _J/x# aTo)6D@ טzkxc={"*6<#)1dug.DW|2;}k} ƼGpm1]Qˁ g : +h́D'!E)=:Une@IL2N \w3Fa ãk@H6#F:Z %(9GF :&F@_)@摱4\b dQj6#@`Q"GOU_U@?DKmi1Ƞ.$06Zs-?"`Fu_V?'Ƅn(b-(2"NCQienyj ~WP}r`w|t tr M(@H#OQzDub#aZ$ eKұH(:@֨aFh't¢8ȓfG,]!u'ěh Rʢ:T\5* J3C+:nڣDO!  8#BXoE$ByԠqȸ_1}nd&>j2Z-bUU  hfZpMqHFeX3wf#CMo Xj@nHP }P- yHbP"-"i@z'dcEDy4IaaFP@YP5QJ5@Q˫u>tcJ$[mǘA@tyLќ m <{UȌ+WI Z2$ %@JGJ9筊*= ,(cqaORT9"Eda؝&0ǣ\ i7`8(Gt Pc=˜іE"Jx#bn%%0"P2HSXyn{Ô@&x#p#≆X4N"#'ҁ]8侮TD XMO#T%(2U €40#EeL\Jǁ@"Y@}v$e/`bpqQ.|5W "Ѕ@w>d#a Pf*DEtZ|BΈ6hWzbցD\" xj&/&({Pȧ@ Dj,:IOP/ad6"?ѠDё$Q5lV@gXͲGht k~$Iu7lbU{|2.UЁ0:49%OY>~؊ v*kB6GQF㹼'b$(^+]> Wt,j  2*h(&kDWV5x-G^G*HI\-2"Fb j(lgJ0˜b(Q>Ze3j46]$_n&  uU>xuG2K?q"c x+lEmK9TE nۀzM`$yݘ#-/GS0Ǘ `Mdn % 4DAW 7Hv"&Q/hqz<[@8hBq`9P3&[ {dMDѵ #C)QV$N1Deb^}9AFWc[TmD$vW#po@B"O *ƈFBf eنd bE"QDN'?( DIY 7K 7Ȍu,1tɖGDFf?2!D z'N`2CN(胣@"L@Ka]"FzhѼ!4T zC0?}jߚb>&'O%OX&U`.Wڀ"%(aQ  '8uwC`՘N)G+vxU[@ „@{2n$bADZ+3iB!Sg0%lƶOGudQZ; &܄m &*HZ.=c0i Fk0& [P#j.ך&@l/;[\EMP>'P2TDuEP#؈-zj7bX^GX j3b 8 DQ  " %(y#d t2<M0"3FG"ʍIDZ0Z1mF:) ֗/EJC ġ3D $m4uǢ$ މ=:v >GfyHM`Fnh\,-A0i"u}Á "I`.;1HOR@ ^(T6Ob.]qc%bNcDYDbXP>4cMD[`o*oю"D]rD~G@;DQY / ܄HnNRXTG2Ĥ1BLh( '耑_liC`MD(jʪJQ؊2 F!Ebd 2`=hgLm붰"6@ #DQ T3uXN)jH "k64)CD=\fVrDTPƒZ}߆x| "`}@޻h A tp=4?MyiR 썍+H*Cئ>9J7/aRQHXhG!!\r2hlVW ĊED'lhG! ! Z.#"c18#1ΰ2*\7OP=F- bWpfVֆޠ2B ̢+/ h*7@OD"h24 z=D_eVDU1q'³HZ^QTG-Eqps\N7"lƐ.JPrK "@@~k`@x~ nHk }*'2eet8z&b{[DHuDKnhQ!@sԃ 4 Q! #h ~#-CڈۏWѼXGB!T@ ~1":;؄9ĩRrTGb8iUJ|AE7q!VE'QD; tD` $ޕ&m G :XMF1DPGй ?k@-Dt=Nb,^>DZlLX!;PFb"1[%EGqP.De~t14@DVdHm/m.Qtf$OdfVʘNGX"ubwʋju>&@!`Y%倒 .r]d马3e0/(B0h @_MD A^-+̏ "jHPAS!W1k~!*  يnM%*H6 Ɓt69KT[]sD@MD9ѯ7tD0ܜ#ᜱ VǘohA+iS**e<(U1X >Y[P/BDC :@צ4ZK(2^Rx6&ޅ]iqq u!Q}njeT$ 7SH̘{.rH:_P"0& '@|NgqC $J{34%H0D щlH86rxā(J*\@ B8@nSͻ@@K,%01$@sXbQ.F] A8ǢbH*]]]FR!K#D{ԩ%v«@, =P &&5`C"5*j2OL|]Xդ;VG%ѐ)xF#1J " gO+)74ȏ"aA\t? 1{Z-w~a!6KC H+D^ && j1P`*('9|YhUCK8RX$r:(]Bx1"8 ֖ e?8#8?RFĵSI"8P"iapX$E6un4Sa}0f Ix;DnDC  DCnTޅ"dbh10N%Sm̅ˏ8tؑVsv͈$@?cGF6a D{+Ξ\ry @բE}91$k`йHpQF%2C'FF'>͠ |fRJ*NBҁ:!V@1G"8*(DEPl0 2=u@!$D2"i5kA /فp#.sKFhmŀp:gHn"D(1S0ƶʪƠY_4c+2 2$k=}hA]w/~J F s@{&Q-m3kB۠ 2 1d3JUE.B. IQzw0D  Gɠj)hQȁ'H!~C,Jj0zR ʬE-]3 DYC>rʠzPmDDМ$@P#܍!@ "a0!!vwFBDdE^zT,6 v]v)HmYxZ@  d|S88nyqr7Dsu&!}02@#@Hи!EBhb#zl1H #]FJbv般>">(QDr1`>!$W e @kOe {Z!GkR&6""_oEY%ivč2$ F1TpO,N_RD'c*)[YsP)j W-UBJBg,B؁!ߩ1!힅@P2@ߐdsDqՂ@~;{t@D#V։D/6%X Z^*:dGU "@U77)3Mlqy z"nN o)@bgHC?dݡr"ހ2G quSzMBl4ķ! #2Y@#"@Ry@!O"܉`)$ G^:N$H#/Qjw ա@#uv_ö3u߻NpG%!b%u17t@Ѣ!D`57F%^7mDʁGrL^}6QLw+mQPDLA]1.ڬ306O;|ɦoQyZ"8XZy@]cnADOЬ?Vз#a`D̲5QD遈j'.rhaS]}W"ވEaf[Dqa6D6{P"\4aڤDM,IFDLޣ[CgTK`_Ia@ه=uF/m@eY^N"ݑpeȁ"?{@TQ F:X ]$UXF#Tgay>J3,L@ő!aP@WV6#4hp#ɐ'+AKlF[CꀳEYP嘌,MrНGF`he^`DQW -KBTBd#@A42A(b+wUf* *hkZzh"#(HM JWDjjQU|Ct'#qE/]!U"t*:3hg]>+MD$Ht7RS &H : X yTZcqyEF_gh%fk[ T"ȍgu!XG҅.zq"9obD{ЖHKD 1#VїȌgF#‰;z?33FBQO;Uq:^X0rWv#HV3*jFn٠lp،#[DF"45̏|ByuQߢLmF4[q~ "l6|H;d _J)% Y0`Y$ `2o7f.MaNCAڃ@Xw!A8"oƤ ǥmX+܃8ii@p\!scf9)/4Nfp5T(*J4}F@6QЀZ! CA%,j9]3`DѠtu. Zt-}AZa(4|gZΌ(ʜFTE+z1j"Q~Fjcqr}Tm,j4WK]O*sT83Nip#q,ɾmm6ޥu5~ZNŔw7=FYضWJxӃ, ٚt- zd;V vIRv>xGedDP=v hhB &(9@HјHbf@̔'͈#)G%4`(ۖ$t o(TFYNG,αI @؃4;!yXPO-F`DF,2(FN"2Ց&0Lݧ#'H#[3"cդݸQnO/GԌB/ qV1 P!Dia9TdVw,2{6a@?5|CScɢ7e~Gz(wʸLgYƚ-?F0Gp8"Ex"7h#*!1U؝ 8)z\:̓iZӰ=p@O >tY \ ʀ$;Q#Wc&*8X@`D򥏘 /ȌuPBbI-l>(@@Ϡ,65"xw@.# 5UL@BDrgU 0JkRTYv&μ5t[RXH/J"Dà7(`'\c+2tAޡBx@ e> ='h4}]cboh _BcSD)v'`5?y z"0q b~*8!BP]}y`e#8JVC|47ՅXz݆6%T7HjQ %x&`uBQcvhtR4@JBǠ9jd:*!B J0DfQ( (D싉ڦu1-XFhb NA¡_9iPh6D+]=k@Xj\w,lEk(:eTöFdn bqRUa6.HȥaPA"jzB|rOCVH f?og?"'* D'ؐ;+I %"DZ>o.*Hp+WW#DЅFDT?Խ$5V Sh{ "褒Кˣ_Ê[xE !\E~?d!,_4ô @R"sOR]9OD`Tz"A_b"\q0DISAsVdP;j9Ar}#ԅl0>G\tmd|9!0'!;@D6Gb¾8/kpWPIN!@20 ?1@ZYKua ﴌϣE#H>@Q!F\"&9@mЯ"i !hU@iUB@Fm??%򸈪ȱ@UV- 0ZNK?G"O< rE(Ɠm8T)C 6ͫD5l ,Y^no:_;dlihV͙F֢9 *tIX$W*  MC-b&+,R$5٪NF B#K`}1V b#>E_5kƼ£D*9M? O2|#@7;h b"j*=` YF q:F:rZ=hi"rH?@}U=et{NDVûޔ)y!CnZ;YavE*@zQ F܁!(C)rxx^M) Jy-xz7;;qиvUql"NubWUCH(@Oo,yhD큄eq@Xk}9ߍ{f0HpNaTj{F)4q/NQD'؄BB&'䀽j[#|U$@!J,v\~ >=8 R".VWU!$T(Lle4ܢ z#ʢ*Y7&HDSQ!W kn3fH$AW>|#G#Cdc@p֡(B 4t; tࡗD~f ]!DCXY]R&ȡ@lEpoi 9Wy>+D@fHVDzJȾvL"p\DX)\2Vm %mpH:|8Ķǡ"*@ȓbD@Gz9ٳi)˚B^NrA:iw#tq4YÈyw\o!r9L7<  G.Ev xP~F 2( a>2Hl1Ĭ^s؈o UV:%[ǝߓm@iGoZ8$0F?˴-#7bb]]сcoD zP xP32ha@ë3FKAJ,gPڈLѥ0Q uz9:R]-*.hC8Ch߿Œkpp!(GmPmՈHb DS@ʖ9 #BqϿ. Q~PZ"Үfjwnu`P#S`bd#FB0RXU'x6չfl|g *ʂG|Un"ai*DXMP jƅ}q"`>zFȣUVegDK d[&{aS[Ѭ81"6kbF9@SU7_Na@ P" .ܠ'(EfHPs='G`)h *9Da[ z#1`E%VlFZ Sg" oPX #R #"D86\"v_4Mw@vQmuQu`R5A9 Mݘ^]{!U |Mq7ad˔NAȢlQ}C`E} Dlh:1GDcnxo/VdjjlG6b$H%I "$l-m5nDk)024Hމ}"zPg*#C]f&Yc@JBnx\0A /& 2"0!&Ua(mDU+Z7B oQt)eD#(HVsž5<«"a0+ߛmTT"<6~f^1#_i*dm nuH9OR5/Yo\gMU$ :%JBccfaީ}<)Gla(DkőƟ@6 I 1 ^4lD=/GdNQ7Bxh1pߔt椊4"<@wP;O=c4 3I|H8\'@:V4uP2$kUi?10,HP@z[x`Ac4D)gc2C~ꚴyCϢ?J7Nmzԣ +rP{?Fʇ_.Nrı2 )hF=x63"X򘇪j5웧 @d(GH Y3uFg( &ɟ]^C\q[t~)"E'컲F91´k ."QT"ņ"2wS0ݡ8Bu`o$ ?DRP&j#YbfԆ5 r^5yxm~Yj(3)*dE j7TM06׵ $oFIvww+:i#VpZG1ȓBꀡD %@/ dGT Oͤ5V#+9@PW|. v>Q،נ) f1`$HUމP GyjQ!@HT{ "4aBv|_j@ Mzq4>Y NcF]4FwF"%9d +\O9xZ7F}`|j7EnW^7 [ʙ1`yl'D #~׭FWKQ4F}gd1|hHP8I:~qHDЛRn<6ǙooEh#FzPKX0OE9 6y1DI"dоHA)x6^d%*mXtu#5+򵨉* bXFoUUTD >r4AMjxWQ+k<@I/J&i+CCX¢aIa3 B4JTYsd\[9TMu+@M"f "s,hX)sQHݪ;(hbɨLDb3uA?Ԫ;gG;8#d1 _$ AYQ <>@3L& NpʡD4Mk4.` +R7P-*4۫84( 4-hJ Yr#΍ F@ ?%hJz^ ؀Ϝ0 -6y4U@hQ;S .eJ:y n;rD6$EF"F7w70n"){~COE <2G:q 3xvE&#<`1 KFF á>@D3 zvno zoH $2 lrl=F>@RqXw|QtLv' .zT `Q.WՀ)RRX6"J-(@Rם>BȞ1D]<ܔtHD.`p̩eRTH#D]C&̱)Mr"mu3SbzMdS ȟ"yVBV+^||s)Aa4~e<0F"]bMGDqaC .ɬ Έ <|F'/FaTEbWDԉE0 G,ׄEE TɈc~.t6V&:t(:@= :r՞9oPrM1z}cK"Yob:hj8;#i9" ݝL mɆ Oг#dnYK *T<$7K |zS46"Ua@)#k< A*+4\:cD R@gL&Chn[}[#B5Wj#cDX sh(_\ ':̮*]!@wGR,@!RE4y#Fրh0V |d~,GS!b66B4e@YP ռD_nD"JF:Sб }JW`0:!o@bd6m( tyɼ2Hkؿ@MzB*' +5<]DavhҬ6ˮH||]ܿnkyYQ6+grq%^4f%׏kW\ ,Wq"h g09녉 ݅{ "%h w2:€H!>ן7dh (/Gwqy6뼴y#EGTjzzP"MSM=DM@j#SFEFSg Zۓ@j%@d6;T۵`yr@x|tzg^f kUbD ;k2[3=|@TD:;ڹ!BTltp($IФoZ@ )t!qEx[W4FK pgxЈh] z Oc-'S:@8@zsHk$%?IWAl)A-z=LCj18{x)aWQ|%D4s  iN#ҿ>xhdaD!Ftk5w]#Ba{(!DX yX*<>ò^ 4"+:fq )NE@lT,^6FD6iGTG"p>@MV.-V_ s vpDj$Jq&މG;`3 F&<2HQ ӀX2&l+<~i4!SuV;hU1ZtM#9WGemǡ nrɿѥ74,ʗTlɹU ^4J66]no7HZ aFZE\Gnʑ0471xKcnQ>9%$rvz]ccQ >հsFQ^q-(#x|tb<=F ʶ<ߜ|gxv:@C @a6E9Fƌ- ".Dm WL1 DU~F%E| "mȉb@svBuP"'0 PB.DFй`?H앇KVAwu\݇=BqYt[?p(jU:"@jatFf:Њm9>#6"Ķ@sy'_rO ,A_,"3Lmh ,ĮK289qVtF77 Kе)ZОښ)#Pzpyjt8"$0~8`6+٧pD|`+=w2FA`2V]3A@Tq#R;bSwG?G k U1u5% liɧnhՐF:a!20^H!wV4E!<š}=_@FL#P%Ho|@pfG&[}{wTw241u& cXm& !gQ4Zs00^-{CIVѹɓ*x|x^J0nb؜!D]rj`$(JSQ_+:Y#B ñ2^ Li_s _%G^F7NJcPԑU _-5tAnIfBҭNm=R9YJF; э,¾*P(N=z'ʼnDPna$@%1HXDZ~<`Q"T@:f&e4?! D&"HQ"HHibQ4Vm\TPBXBR`IGWk9Y 2؈ dSj:U8 Z޹t/A'd!LP/y̱42mCLxqi};tnbPLfK!VB噼76 .(KNN2U Oף(7]xƥGRV"4S;XjZ6,+E4JezI!GҰeY)q -s'w][)8IFw( `t6rn/ ͡ 0Z`cm/i1ȵ{-pP6z4~&I+RLK`#%F;䥜 ui.0"&*΅*CS *"<* joEڞ-h08WV#=tk(_ԱMXKPb" pyj\o3DHP+B}%/ IB>kϩ/j!fFa^@DyP1k`<7*ގ8# ׸]5U ߰dc T~䞭m_h[שt0mE۲j51vK:j#N, E!QT sdEЍq ,V(E4l/J#tI \QdGAp8%S ǝJѿ"U`_j7<!,;ٓ!-'mI z5=HDUP# C>]ԮEH(Fm=F$pH Wѧ􀗣FDD} ZIE0TR%>@!?R3I_(a% Y{So~5hQmb,Z{q&5AŅNbXPRUPQG"^if!/C +S)H&r߁0ZХ#+1K=Q@v_N@NvDq0Dn300"mˤ~.EOVu9 #)Հj발#&\+HЃG*K~gӧmJv́#֐}ΏdH]Ł\ڳk.saﯨm"y/r^iTD^_z\$YЮ(/#t}Vo4 v*u^gYl#Y|.!a[>q)B $RUqG0gfz-Ba>B ^tE$1&5P3OM$gOʊOYGthKjr!*SǣKMfNџD/ Q$i ~O0e rQT_΅>ȋ(ID(ŮLK!xal0(^l{Il #;47W]ڮ_B| 'HE("\gք)V3ej&kD`i<  ;aT^+׼6d(-JDj:5jR3 bp֊V7&pEg>& r*XEPOp9+\1嶖E*k{wvh5ORDa͑]Xx H*-,|D6 !fBu{ 85 .:ňa] dM\VTy_x]G&\MDDE A 6;@}qF;lUNjD⑮ٓQ;{ NJt {bDgQxt45#ȉy14M9_zH2%X@!!GL"P@^mW0~׶j8+ԥ44NIpJ ~UR\pVFZXex:@/sW+8 .U< '9[mۧjh⪣[yChc04RGD ::;<",7!~doHǰj10hѤ 0z>YO ٥Z!"8YBbY+mG8?Jo]bkHf;EE $k(@4 #zar;FQ3Ֆ# #~6?V5C7@aF]c. fP-Tǐ]Y>:\DvƞZ`4.Ӫ6"\#τU(o1(lUnDG5Xxk?[jxR8yD# cf4M֕/gG=YUpTGB}YՅ5G^8=ʳ] M߈"yHeT(Rqvl+UUdj*c8` vBX~[+2mhmV6hj{T4)5_l1#kcU[={p '¹{ʄ"N7_՟Z~v|B1N#ЄSn4=h1Cf>Cc4zPDfglwu֪% (ʄ lMq 4hV؇(({3fLۤ>HnPϣP7 -hIЋ#-§ ,059i@#,((JEz55`>HYP7?8 %II}b@OG(2P%:K'JZ}Q9dQҐ{z"^V QZ/{lE3zǵu'JPs7zׯ󞾠}A]]@1K Nч gm_I) YCЩkJi:/҂y\gۋ4NQ66+qi.w #\7XM-8ӁZ2Yw|( ֠B74,켓Y>uqs|>S,*@G0!DpoLet#g!^Q-XG$,߬jYWf3{έyyT=F廙4NX{Wl{ Zj_.=Fv4olkEqٱ1#pogNąd8aۄ;+@0 TI]F Gu@ xٰbxtP  #^Dm}xtgRáذnڤF~wV@V5M1(Z[s "떒>4K^vjէ (ݪ_XgFƘw/p*FJy}~'Ȉ%QoBa]`l, j\{4캙tCގ8.~p exa'l R$۷=HeгDz9E=1d.55@U)@-Es-Cf"N9BQ0:جFX_ӷ.!V4GM~Q ՘gtQBTx-<{Pա# T ]"qp(EqhOo\hn"py} ~P:Zv=4;GT mHF#HoFg_GXy(՗ABx"4*k'c'0,ޝȿGƥgaVyOj@'pKPD/NQ%6^ (lН|-j`-(լΟ*Rᨱ0݃aC*Ym*JE"TMd)R7gʩW""z 98܉3 8HjyIT5 o pޠbrƲg|oF%Լ.jQ4 ;w!kqae/Z2% 8ik IV!S}xYo샇Ѷp)}M٩^GB>\lz((us /Wal/]G<"X4@_I= *D8WEbt~/̝xtFֵjԅ}V!°Я`0qyWap GaEݰ$ae;y;s|\D*?*˦{Lh0bk7MkKOT /͞CiRNөHl5l2v?* vф9CKXi%-Fp~T~ 7sh`ۄVˆA٬Ͽ[DpM9biw&yi4/N?]Z}#e?FBEQ1QIoUT:xRČ@NTqoW/ͷUUS2 绯(\1 ˦G1PK.uXu5HV}^PD_8;\;KnP=?d#PF۠dDd5o@Q;%:,#QDQ荵Mꂹ=F!W.f &B?: Nf05ʩG^b/phf:M=Ya:N"RfcH6UP=-oAw7#];tRRf 0>D Ez :0a.M\[ M6q8/l'KdZ6'w ш "P ..Q6F:vV\؜:Pcݍ]d%h[SlR >`㼠k2GioCI~B{}K<'W)?h☋Z""H?*aczF62ÐSa_ U?P4Yf+K%'/2S sP]ܣ<[p ܛf^l Q/Z4uVdzհ係zBFԿvfg//ІS,syDB5tg0Swj#9,в(ա_nWڤdQ0%jf](1Cb+!$ϥHc.IwBkjPt IG(kWҔ82-5N)(E\ބ*K!Yk7#0#۫W#+>0&/U  kMUC|8z2.Qq냫8{3+l`.þrEsu1x?f!wR~|hM"Y4'NoVB KieBńj.Q +vaDgPRl^u1UAx>ߑVrRc^ Mqq*-T4n%~9 CK)h$6,k0+zhx"4&#;%Q#zџ[K.Q M@z(mX*W25ׇ7#DwT7™mwo%Y,9 xÙ%n =Z (ck/eUra Yjxi4wnU} y!(k~zǍ)o__;  W+"l׶0%KC(00mn"/ab3+Mb}͑Qvۼx%\}N1lN, S?ϘRPwauV'VNz_ AJq2aS~-ԓlN'ש^"/osOj46&ѕ} ToSoTZHfcP@jcP 8*l+4;ξkQ <#k]9hmm@NCJ* ۻMGʞ:\d:6`Pa4Yx²6@J8GZ>Z^NH>z%QNmTeIVLny1#;SW\ٶVn edЭsߜո{.a|+ϛ[**vapUi5[y꼊S'( =2 {lbW#svS̏BhٿWW`ԛp! ; 88>CշȌ4i>Yt?ttn@0" EB&ˤNp8?^)7ЃgI˙]:L];F3WѣkCL8Dun%NV<V ȧ=l" "n4\ʬ^)9ikwSAIא*}X!c]hW47 P+Em^L*F|rP%VA)mxsq|#J$&˯C%Yhj<4JQUúb"De#Dp-0>f I-UTeUJoB oGLVW(s8W 8}ePkٵkiz~LM |ȆDQh<%Y' *B?uA!#޻xXaZ"!h!׺D06J,Tt\3۠'V?i?FQ)ZgVҟ!8AȢ A-KO@%v&FT]6xKP!q ^;{# FY L_ΑzViᐧgD@N-넵q(]S [k!G޲/"#`'{r3Ű-j\ZSY}ȷNm\p¨%4u7f7wHfR=7h|f)bPx,.!k{8~ПfَUQ<) t dv#sx˕2r5ڛ:y b*XBȦ*]*˝cQCtV>#`F| RUoXQ[|kC߄e^T*YW'[s|K}ئf1kmIm?xPن:Sa\?ڛgEį*gN8J.txお!Oi/.y݊$v 5a/YwuR3`^Im)N^}Xh}"欉IosjK믒D(f2}: lLp2#_J6 P~"_{/qB[yi.}t˞ޔ:Z-UP5`X:0hcc/}薳:х!\{ Kzd}h;u5U!A{87 ST1)/BxI%TYtFr~ӄ0{֣/Ԗm-lIci9pϵj|&T[BbYD TE(ߨD-$>(׆FjPl.2#ɑM4Z;ZI h;6%^5Wo}0 7C|v[6tgk+l !Wctv Z)w>gJUQ<#wts0jD[3nͳ|m88? U`kAJ `;2?XDu,7տ?+61- :%0I%}8 uBT.Dxm[BW8}tײ'쥯V\E!@X|J a#uמyO/8<,/RGkx~oߟCu0_%׼ҔjzrF H2.Σ ^N-&}rFun %YcrsCM֊M[s3;妄_\S84Gΰ){x-,"5k?} 006)jC~}t}Dj%,sѕuN~^ˀvǑ 3 [cCn%TY[ $XDҥ{}񝉭*vjeO.M1/ a]P!(0I-9ُBV%3 fF!80/c}wqDWckO15z>..Jt"In\><5nn2Or? jdQS'8sVE%y 9/oz{9T̡IS3 QX[mb0&ec2^gQ"dH޷f}H:^V𿡳V< g=`3PUxVmU-V dYc/4r{gN={:3i3㤳x-@Ok=M>*þy_[T>$Sq 8kx=4Met\O3ojkE算F:5|uX~y_Y8 J[+t 4_!V'4C (^-_|= W(4GB!]لg]-ZO]H_^!&KHfGݸ=J%)uj> j5w+Ka$jݳX  riiO.jD 4֘>Vd8-AR5IX+ Bq#zԒJЫEµjDj*$n);i+t L/ǥϯhx^7e/q ԧz-_ef혎n=?Oɂ5S[j!%: ׬b4^xwMd#]+Eq+pi6E%aKj!od{M?,ٽO>xF 6x?aBԘw!7±٪^܎HxdtN ?DId^$9NwID*%VА.:J0ok វ=V#*Kk9qV! ~buСT ]0ϺSB{<Epvux4yu"l3=I]7vuT Ur^ȮG g1vbqZ/£_+qhխN |V^59Nh.mA\DO(C^QtzVi4aqBtR\(l$kyU| u/8n7:(y=tGޙ`p:IΧ{gݚ\e=NwO&B& &\٫u,~!j@jR|<؏.ůS=ߑ[o k= e)>_fφn>sjrM__"tQ🬇+ A:4,#Pʚ{~x+:u|GltWW>P}J"mpMnx-\*rWU G^,C}zZZHsf>zTNgUin0:CSaVËbI㑺 C3N0ﳊBzY, < w'eImsaVxNźRF^6EE}sϖ_9]ԓ#P$x"4;wmݻr-ZJs hK۽P~&~ f5U޸NM#AO(CE=4PWVτD3ǃ{O(Xٱ >U?ׄ7Ex~$Bsr8LN{ʈFLAMMB9iwPzv`Qs17Mz _io([Zеә(2;:aun7g/Z+S^*N7Y]\Ok p-1yn,'\<ݖhRi76O' 方Lz٬HyPON"涳 S>ڧ.q^%~;7⳸B6ϳy"0c:UjEu[Ya,fT#,,{K\ MF.AzlkMkESoġ )5-Fz[h5.jV}5BίDZAtGqc.XW}6hfm_֌DotUB>)(G)Z>%?0٭un̞*Fd:BtI'5p"C l!`x2-8t0q(J3@0r笃C L:Il459Z͝6: t/ȿI2lm\ƺD0il%̞bΉl&}_Z՝Hݨք>jBJEnïJFُt]u­vḓ$J4/IBHO(|(.R)?!9T69C/EH ?_&Ҭhr 7NZSeQm<Tc'xY-6hH2n2wץHz| @Ul)4?gnrJ83' wEB;p LS6: 3ܬ6OM%7~adʂ^oEӱE:Zz0{fO8V;^r r_zM~X !b ݙa`'w`C֥:^[3Q2Dg<3j|o(y{5t^ Pfݞ6}k5hkeECtZcٽxcX <3f<ބjn rYgЋ{V *ʟizDS8s+njd4GyXo Yan*WaN}VԛGb 6 UOA.k3*k笸DEO=~+JAc>gM19g2WIX. RceSWޢ)m Aj; ,<Z_wHg0!`yCl=e8|4<+oU˷I}&rT ZVp\lxT]E|~OYygk[7/Ω3܍C;t4s{ʙ:Th@hBލĪ[ }}Mܷʉw_eߟf~ fi|oJA$aFfV-qp'gwh*|w*4R&3DE4.jOݸM^B@!o^[gWڴ격Z{kCk9)胗5,b+@eOnxrcUZa*T$z[%EݙV/tFBn7 M9 2!2,mVUdBufջ 츉aRꔙJ7;evײK1n]%C@dZ;/}#{M; j'DŽwY-O=A/ķ յCWaBq]oHlNq@Q*\ 叞x%585)cXi}S=jJ&o UV4!A8U=M"aIf3wPFGN~Tzch!́F%CTtf*3*~zkK1O9wXl^'DNnr+8:7v%tR{u9V Y°(n9puBǬ/{L v$ pi]а酌%@v[lb L0t 5ԥGljۯk"cs)s>Wn:HɬZO=r8<4FUr괢n>~t/)2@+!*N`hlYOfЖ}/`bXwԴ^ܳK|(spܲWx& ]jWz]6gwoDCC D*h?Y-1M"3W%aݧB=l??6;b/íTӞc-wV95f > s5HhuWgݝW3 .[究1\t ,ni(2J`n)Y(pV!h.e_BIx6 e*;*eB(N#'*,gWtΝ!I &s?zIzP ]n> ̀ߧ*՜8_Hp3T-{5S} zjJ도M#Cp/I /pDu P%QlzΰFK߾ +Ɯdg{{iqs U)H ӽP-kG1ͶYc8G~V{3X '"mZZ$ֿip|W]Pd5Jv[oʞIg2%yLdG4_TJB!aCE/aW4S@pN]G"S'{7q EiDiycx͚okMB !+n^͆:hT8JWy ņljXЍO~fMl2D_ȜƵ8-Jlr);5%/Xe?No\V~wMѮf>dr 2ۙ;t~/1>CmEe/;#hm(kY{ΛQym?$"7n"[ܫ,4"ӣOiZ{{h|['HW]ᖽ`Oo:-)6a.t %ƫ~^=3zs:ʩ@z05AЉ"+2+Ri!Cy.nA@u6q̩?pڣH8 G7GMn\Z[_t"tx:fW3o~7G%]řI{|lw'% ՘h uC?Ӡ@WѠx Bl&0"r * p}A$! ?X8*޴^IǺ{W=n\ng"=_% ;g;W>}u|Wxj(;?>Ʈ֣5/vhE+)ooc:Moԗ5]ċ (r &} <Y@[Sj.I݈EH0f_Kmhm^[H&S~rڵ@t<1^ |<.ui xy#'a\Hms7W ʐ10xV>rD&܏tgub 2^ZZu+n'ΰ?IZ ͎2 (wpqilzUVPQkzN YϤ1(Rmp .\nW8}4/&V uO`+6$VFPoěƛM6z%9;O=CV.uew0?x!0 r\h3 mF7raB)gʲ_> aa`fgŋR-RǠiY/^ѡ7oezGjr<кHO=s".SʗDNGC6ctoz9/5]4]&)]bgcj|8?!?j[cYSiJNg~xx.;r[մ<v|si4cQ)Crqsv~~^A7Oj8A20'rw'?RHƒH4et^ Ts'< ~ײ[rx >`[f@ifOKBw-0e %%j2ZM>UT7%<&?󰚜.ڱ~8KScnGOF: Շx`rѺ]eO&[A bs<-+K\8TioOJGXok1:Șn[w$&c؄CehCDJR iVCqK`l4"GnCxP!nLae..˪׬ZX\+j:lV'@Ѽ!3X_BivHlB'c1y0ndUO 'ߡ}ޙĴ˶ VM 4 ]J!/8@BhhҒ{&Ǭ"_i|V?𬤼A~pxX.`55<@DLrH,Vc?Dr|>ᒗMTg} a4X[Yѿzʨr)$W!iGa%Tۄ*f l۵^џSi_f,`ֿp8AHT}j:$z;U 6~HGNPm%sЫDȧyU2%jJC޻uK,7ѧ+<ԃ.MA; 4P)8ڰE={1fCD4԰sf/^#vD*ZXfZаƵcHyЬ( - /ѷL*m:qiE0)$:4&d *OVxH0rsmUZ'76+!yo]0ø :x,h8 م?`C ߛkLA$M?03(Y[܌\bUd*MCМ%^!i*~e$}Zo{ɂŨxClж i+u*}K?>i᭄TpQ65ꇋan󎪠pb"E1 ^) 4H. E\% gd"L<; |=,Fn~E]R*[dc'}6Y^[b)U6o|k8i F~Cx=ޑds:c~#G!.`I\D"҄3 ji`GiPXT-}`Z`iuiq@\~taxBף|ГC窑w"vf䲫AƳaOc׬hiw+bR Xڼ>_MD`56b0ڴ]/f?DҞ4hT5@ fiuطͣFc| "h P$8!A=K/&:pD|iI1 E a&3IAy g%-p61E}3 M0eZ<4GU殄ոç:מhx7Z"& X) Z#%_t$S80rZ8"05U)R&-Էd]wH钏AV^ W?pxɑ^y˕M߀Ѭ-8RdXG,$q" l" bgtRr)L$ ø"{ e"OWড5P&pb)k- P팿PyNe@? _pbpHCX4j?sSD 7FMlgٕFE~DI=|EpZ\ޡӍvbiĺ?1m5<(, x #2rG=O. N&[9{v = MR*C~6ԙJw/A3E"dFJI"=Iox \ `&bZVd,Ec?+*iH]N h}sJ9@0I4Kb[̈́\TK0vfȬj>z 62/a.lTV;D)9r4!//WH'(pUzZ=)CyKql#B)a͆Oih#X%u R e+ 8TGVǤNW#"exno&:dfh6d)>z`4ܤT[!7y?øS08P}n\wON"М 홟' g NPB ~5d- GA,PZK@lBi7t`UcAt}`U?~nQgiP{M%^d8N?4ٻ[ڙ7@r\+rwXspbgbV%򰠠KvOkW.4O+ .X16P3qtb%-u=(kXVg-}+\V˙{ڤ$~]c&γ%n.iql8u>2wv&?Fpe$EiK@uq37]e{z@%T6BӀ"~b]K"~\1} (`v6 ifgR_$hdkپҢ9@i N$x?vg7@c.\LwiM̰F.9ڋv3u pGeYn?A034UI3=!$* 7CG逷t< SNk$t;$^@O y{oWvKf-G@Йg(NnAEQ<~Q« {KaaY K72>Vk5;OB%D8 1or\&A\0՟l5\xlJJ4w^􄌈  ~4)fD-S)qqBw ۴{"/8`.H9l:K_P { gmcҋ*eTF+*Wϓ5y1Y!-ĦoZ G̈́u9W@G]-XRH qal^״t3X<MZT(㈒/(AFuݣ1"@$;Q34@ nuR\yUJ+{%t+SzD,`0O1+ bVN)vV e!AdqAwB Q5NQdD~r_ Z^2N3RPaa,}֑;fU |L"_;N#x?5R|Ɍ}G#?66Cw-q-KO. 8|6G{oT.Γ^ lV Xtntv(ɷg1:_ ĵ|= )#p\2R4Fˤ7k_-/g 9Ǻ 'MZU_jTA{2-+^)=g'2SDa/N pZr*|Ճk+~h\Bv|EL~ٌv`R:L[4 mQq 90&ė5/7Iv9Vu {H ~couM_|\?={{nB`QAg|SmHPO-ݖ= 2~; Wv .F𴹱:O$//#G+jZ%Jn)KB4.xO1+)T<".i ́1(:LwjՔf(9lm1`j0א[rc4]: LgLZ*)#YX6YU:'7Ӆ @N+V\; Y~ZOhcK\|Ba!_H5a7˧9WF=T?(1  C TDd[@fGn ܐ}5 ,``tFWHŵ-1jG?k^Klo^X73 tW:6S13p ˌJ2<[2QT+m3}G<Zq `09eb{zPUv ,3g[tJ_5+C>bCKiE\&6ʆTPy=3 %w'gUNi\R- 9nHTb*jLk]a;-`j2/u]X}4 ORlaJ?T.,'tXrO%Kp F%\~kCxwFtyH+qB$] xQ;̡6^c|1А͒r4=ET`UEWU\,r@ Vb<А&̲*ۿ|p-_+̂U(qUx8ɾ P(uMYt|Zv%,bu$A0ENH b⌒⨜H4ƈԭ̙g$8cdn*:5QvXjL -PXZO \I9?pTD&,o5#e8yTXLB" @],}+p.ul,2k&3yYp(o[!I&~Gh^ ;-+afAyR)TȶP%YmGU?`7H,Ц/N[:՘Քb߻@|%iX.\+il>=bNeyd*^L9$I5We o |V62;&fl&5_>nbR!Er'vN!WN09܃KT*U_ #@k뽅TJVܿ:VY?NwzyO2ElZ3=Մz0v$=mҾ "g!ntN"8هlu8ߠt:#c0G 3O[iE"8۪3 ͼ*hW&@5eG5=v"g2=o?/|ӥBZ-TKMy Esv\EeHlEP:dȕ$-L lg C](~J CzydQ%0߷$7 a`R@ a{iP*2Jx~OzK ڎV' eC{^97DpQ|UJ <;\V"rnSdN]GbdWfW`WMOI΃nA$:4ǐ6.9/|*( Nz=3@!hxl@, rCT j5<4/xvBr 24u.#ou{ | {I 8Xr\@4D3L7< T<섛WR˥@`d3o1'\P7LI##)S(mjo[ad !XOhb^`4x?wW+ڳ1;Qc"`:c)3uZ#*oxYYC\K).УQ IAO927&\% KlIpq1)sxZJiA& g;_͖ 'zk !B a-G͡4zhYiHirR@%&u$cc.7RM!TdT}Sdz`!7qUSf$YZ*8%j0 &_+WqЀF~ɮ[$ ΍;p.$n4L57[%ԵeRGkm(P!#eVlIM?tjBF` L1B5Nty7Ckq _}錨EނXq6<|.?O^e)S) \}li(5GC+j3D{"0#X)ޚNV ZLj=683w}O*zR1"OCПCd&p6XR7ZIʃ56)$iK .C C`"%(as s 5E 9dY{o1@#mTg]* NwfoJĭ%9~Ȱ}O Ǧۋ4 ra2j\W~ްSc?eP-}hVp)CIy"o)<Uk.IpxD~?YF{^ad@9T?)+s9c\G|_TANdg".9|ӗ!V\Mx[QNţYiӠ 3M[8|  hIɬf+{=z2ɽQqU truq҂ꔟ6BRLHp?0wE@Ʌ$Ep9fћ`B6Jqo6l(hX= T^z@#ya8ؠ`MnvG9.k"Zٗor\2XL5)@/Ɛ rWp0%v-6% M=x|({VGKƇngDFt&L&ʭ&sX(m铳y8i,+uI+Mb3u1Xo.fZɭ3!{KFVT :kDDLXae3iФ.5hs@ب|'<WbWM'TWG+዆lO1;0 Rv@U4~ 죺ڡNJۓr?;|g Dd|x!Ghq>+ `(0dn 515037'|52.1Qm0} %f "u,kZ[Ao"U|oCQ`P,V${M}^=`;zϻ$v eWBzXժ~Zc4]A=r%0ﵰM\:c^HXՉN6J17zBhL;URV )T=WL4  !=wWN ewØ1ȫQzaRwp(D(j -_}D{9C[cf{!8߸QRLc+3kvF$KB=YS|M1963谆_ ,O2!c݌ ь)p ҔȳϯB/ 5ڣɺsnI(6*(v< s=OQ(o;AWZ]A'(}l=7rTA0L,t_[Q4?hXT8Y \];:,n9r"<tf,b *kmkESG7{R 9q{]pʩOΞm4fj[5..kQX :X֏TPqSxO}>av`v{v#J;z[L6.h=T /qN Njpa,9%3zldbkتʼn,7?<L8kzK,N ]IgnBdnSz"~ wQsm(Bnc=`8w(L͗hШ[3]kGg0:reD^ہU {(JHZN/&%Xƒcd bR.%s3*q5 q'Wk#Km4e]~vHkw`x%L8,:.WT k#\aBUfhЇq` "\I6'Hf(ome?<&OTšE8Fgesc{|kߒaҊgJlpU 3dJ uhSø>w,ŕYdk-XF1 q`dyݻ8ޏ{zgOtF %=ca \i:4YGuoLW=TKpH*06Gcv>^$8 YGT-* 3 &ڧ| `8쏞]eʂm]a( n)#/5"Zd$%* ގ_()0 {A׊wˑRYs] =FD!2+KWفxVSXC2ŨiD.n):SMHx '(e{LA*BH#%2ZڝyAtx<'uM qwVoo {4k']F6>,Q\I%$dQSV}jc Y}auzIlZ{*&|#[[R n!&aJ d!icw >,7(?S:g0Q\1Qʼ-Rc 1|w>P3eBŷS0}7#O)Y&BX!8. e  =dFRi2TܹVFCt&$Msyհn)NTvTJ&3}JbI@ʣ]D 2QaU5#Q#l܊,ߔ]Gj&C&Aq([Uq5pc8xYc\Z:A``TP 0L mCZ'S\_ӚN$ﵻR4{hgnr+!kܖZk}LQ1,HV"«jA:8& KAHZ_B.>`B8+߯%!șX9י[xEE;?iǚT@/sg3/r\7z~N`kdWOhE^# D"jyVoɦ̠B2A]->|s^T&P(?(6jѿLåDGfR-&,8KN@ASV y8IԌn+ԏ A_6$>?v 4SyVz {TTdvlB}"g Z޹%Az&A"5XP{:p"޵iLwpc9sfX smEWHb-v! bK+B*EN:?.#V@(^_=ib;W>e}mpb{)}6Bu=n W4<Zk.E}{.IEgwI&09ޚ**$!gجn9C+ rn.NM3D_r=ϋ9MMkݯ]M cwf7Z"Kj48A.uaZbSh|sq=ywW[߇t1wO~گr(;&&9Au hIa- Dy{w~cLL`],fanPP1<@߸@\ b?`Of01',j0ϹξVO*cqf*@)95䶪EK0_Z>ʸ `J5Z{d~y5ZŃ|BntRf y.EWG(%6wNKw =q,\K6*+])\BZh;jL ! El :ll1j4H!-ﶯ,}dBPj(xtM;B,0Ψ9굺6hߞ,v"rC՝p<{6LLN{)<֭K8ErŔSoP 1dgfj`cgcj7Ő["pkDytUcd.f)S3KR V%qMN9;2|qu:=h؜?HJR XZ%BtmV6zRT7Td 1b;<R];愋-&FNN6?Cqb!hi*i1>;`M drPU<0 )CVc*T9#rDVim 0$؟)a3j &f#bArLJhu{Q)|'9 5v_ 0G؈|_Gl b] Iu?>(x$dnjJNZN5qkwa!7yOYk;!r41!9qsJ`g\%έ.#n: e(L_Ҫ( ]5T+Ɏ{c 9d: MT{O%rBӃ[Ի -jYxd3s=1gd1hz80%7k12 Qt 11HHC)a8#.8bPc3;MuAɌmM+0-oV .>i qwLU^3 ~c b|rc Ԥ\WQ \Hu"6mHX0zٙ9]eJ|1:pD'XLy5%1eēLRLJp}D =Q E/ER=\Z<اCcPH,ec!GW5`wVp9igsš36ȔFz2}g}ՙ4 HMOLۊmnKQ[lvAUc.ᚫy1#lbj;g#|CF&-WX29dB,g."^ MJTc>#5 <x/x{yZC@ 8ьWj^l <1Xo`B! utc w1Pw'tsQM9)K#E0@tn@͠E 8`)+ecxl ni*:lPᒹ(X~W3w[d(Eq<Ӧ.F:@MUAA딌~WۃM'K]Qr.`8Cm JxIFo51%t** ]wWulD>d"urT?h #Tb)d+e%iWy@fu[2)!XT^% |,&AdnGWi? Q{f(oiMX YtN<C?:-N2\9 r uL sd-hb81bFTa{ QIOmr \?,J;R h B|FlG12~uӽٻkP_z&%ܖdž9t9cAp7=xkUpII֞}e/ӻ z7l,{m6f:MDs?WF~9)/8h훱(_9zǵȨ"}ڽĆA4$2}zk<[S#Z]Z"1mƵ5tt'KӶpVTqP hQ7ے,!]T<9ptmz Z`ix1Éq ״P>_35;doH>ڴ]j .̗jckU5v"͗D!>whѳOi8/*זK!H9–!-%}͟(Rhd}*u7Ja1@(Oo%|w;<#~b(m#j~/e%5X;R4X{ \Az{Tۖbw~l4Ȃ!dA'2W:ߕTJ2$sA ;|HN$ C(QnWtlvxO:~M6keCX/3j$pPSqm!" 1rk[nȉ\ 1CweGB3cy5W]8fp|L-Rm5F E<IhҘIv) D6ZTWjnevGֶvf+N:[9|-߄y w?ࣄ}'}m\L|enYU '4;vÄa; w܇?ӓKwj>8 ,! &4xנ,Gqh4z)'X_^rre>T5" efΗq`v0EPϗ W"4  tBb(t vu\U'\th[##⣤y,s%df!h.UV"؇n^B@C]1prKTT.QАTvI9i)>MhkыBkʽʣG'TkTV?cG2VzTgwaHc7}#TVvZ /lP<|J`mVJ*8Uʗ!iM) ۧm#pC3/[fSxp4K|k^Ktل_ה(Er@|^Ka_XPPXn;+Fl٤Ge/y2s4JNU[оrHϏS%4{C FG~>NFo|I`z΀K(8z nߜhh %J#xi#k5:/#ԗnB_P $r=,F}{q"o!NPУ-t.- EVr0>GzA?'>:z +tpw{VV} k>8i,ա[ uFb aja0"ܰ !]y.< T4lȎ RJQkjǕDu< g"JCW؃@G5H*ӹwN+7P0%iPNWyPmR A]nAϷ&}!gGLSs}.c2w%3(іE'F|$M QaRmD= ׹e~I jb (1$JM22B ?BA͠%8za`d+V(s$ 1>&#h'RqX쑫Ϋ5< :`mS֫' SvĒ%a\ g4q Wh?NN0+I!  G]ozcym:ż ͇rO W`PKR>!SOs'{֨ь.P e;=k%bG| |R=1@*>$mr_Vt`Uy#w0tJZX6VbB#ϗb؋V3&b廴6edͭ:Ka3ʱ^33ǘ.;EszJh x1<  mܯP>@OQUCB+7QR-Mmc&]nCnd"KCzsvWD֯ Y_of2沽kIht < "1Ћ p !,$@mvH8(3esyB333]:ZDLJANRT;}n+|3އ*.Kf8fD3?z pbA(a`P3''#d!g6䪎]jb-.G& 8ቲX.$y9 -(6ؑaE!A||S(it3Qx|*X(\[AsXtc:-"0+~_֒|E][,'f6~bx b;'/!xa; ǎ!:s h0Ys`9}[&̝taLeK/6YܫT}K`t)UG2z@993[9.Ok9+d.v]f(?|n尶ڰ"%iSzgPuQ#n[a!<rOodw7UfG[_H#Կ1P\e/{g0{y pݮ8Vv cP-pG2[daQ VaqvCy–L,3V⫅ `D )MP$km 8-[!%t#'H=Z"R{NO4VvBTU=v4v] uAýAdg"L,JHbS%LBs| !GGJS :}K'NjnݴӍ N#ӛ~WUnh{8qO f/J{}]۸ Z ;ZqҵG V}DD-n*I\4%($ pEdܣ1B-֯q.Vi-dKG0W6)u۾F(rZUkψGDAȍ ?IDѝa|XjfmˍYIYkvvt#2-x>[9",b]^S<)˺ldy<Ӝ"5ʱy뤱q$#Qn>Hp.u???hV W>b^Kg TifY&G=WwjwWsŷM4)^ãL€cv:e`%hsXf("0>h%\v#ޓz^SjKQ4Ҵ~qv z>Q]biIy6wգciۅ.ٶLt0\981`k-/&%vB|U["tRq'~zS.S+C|$!XdxV9o6M&'5Q,H$2u2U i.#ȱN% .휐$is*i4eliQ\+'5pF. 7SZ6c9b:ts=&W'UrY Q ,\/JS Ise+A|83 HxDa d2 $IK&Pv0 UN  j~6A8 ;b/gr]>xԊS @MHO z=FH<&g0y2܊~m.$fh(ğ?DlAd"%Z0\GI*S F'{00GVc:){ Pz! ʱkhn2jwr-Fde -\sPu&zX^`X $(07ڐJ49|`+Ij}M\8ǒa$v>frf!Z@P\g1cʜzE78ǜk`=yFsڜK_4:fN}8x~ nw_=&֗Щʺ~Fqzz;,qu9h*׾MT5ZV]bXF8c;|;?漥[KEvq ;Zfn)5 A)4ϒ9lieT(@ k ZL/(aySQ>Ų]6pmd* 29:^2,qd S,hNvVY}8tv`4v[9mח  .*[#W¹LԸZ<(kIst/WG1] TAR5 [~v* ӣ0O"epEeł7@'jwz vU/ozZ+]t և.HEM|*8tp>f g{~A8<$FTBIPN? fb5to^r̤:ZVZk6u'Diׇu![ О]6CŨJdTB413̌*V:FTD<£+JД+/5$1 &(~~EUW–n\N.I4sf$4MqN%qT;+"K>TqÞxԳjS~,eX-JbԚ,&WC[VS=H+4Qr.c{ҤX/< λK*X{]^Z-`1_fV:g&۰7R0uprw s@%6a{AjxYat3in!KIxN#]R>#ũ땵oxV[??.vGZLMgRggDǦR)􀄫nHyS$ͮC@rؘs*Üj HJ긲x%N1*"3H+'To'Ǭ ٠o~(1zxNh1Z -qn@FHHy5}]. |)h&ڠ2)O;632R]Y"UsiƹYCLAϨ!2" >{ȄyW c iAbrjUs;_mRV` 9kȭ}4} 2W%i c,SfZ` %=*=@( VQL 0=4!r축4>$$P0XM .6ذδ#sʏ6fvt.{ob> HwXc t;kh0)17uҬ kN 1ͿW 0whKsk%kEIG4 !eQ ;#Iqe}TY<ӥ^]_Jͷ1YN{wl]TW) u` {JQ)ڣspO(C6>e_ʃ$@.j\#yPGCQ.{q`U70it{ju99}VZT]q=W湝(sVIT#lO6.5 /WiM*<___ק{/.'&i^owk ;Ws};m%9LhL.xqih5㴓Ja^Τ+Fs +KDsv{KG[l⎣ vx|ˇ >E|D ƛGrRm||GSVz1EK NN֑VW>@ G3T`̆'>]d]V64n==7+뤎=rdFr(ۅBp|ih+ xa8DŽLqV0 h-~\)ĉEKx6*"H7C2!m7"I u '0s0,VOЫpz&!HOCU4I#fr]mI^\P6 pyh@M2h& 9+jT0;/-Hߋuu[ǍvsI.L|g-/Mub WD]3=х_˭nGnAαg}|Bu'v͔UNI?y?Ckn hVj{rvdY}O35IbC[_3pSi˖czY'Ya@_*Z?Fj3< ߱Н]SmqN I?uf&iп%[ʝ1X8|1Ž`?4(J~iRMAADYqȐoV1C@ a~@@jUT RS B@&@jer; pl.,*AzUgsX*t&o+. Uucc:0,)muJBL(s3Vq0r[v%6 0=9Yl7 9:1õ4Zd dgFN8'0دx4YPdPnlF1=\* }n@| 6`sCz䜪9xR2X{/#`VdGMLT32ZD`4_v^9 k7FrS$L8x![j[LeYDH]wxnҪ'5$dA()K@w!)@LtN PUeKEy+^TlKTVC>x<)Ͽ=+8iN5U#N4w3x=N58cJ){V|x⚮0ܬ}"aأ+z\J'4Ug;`T>5rEjD^RټQG))Btv}VweCnϙp)v"mP QM莙^ ˖z2:C,ìO7 IBabM~O('$Z%f65tՁ4x=z%jEs)^ib|‡DbҬ'8wH^Q]QF|:⛘"]нAm\'gY'@ifF@غ1lurh's{>|.DȄ!n8k_0'y+~ਝIh#aT:@<@OI ׄARx#lia=8ozD*>Z%<8do+3qeȹW9ݱ%zL#s_dy!<)@Le6>cWиYd]>H9™:f|HJ ]D* n]Ƞ* Qc(EHl̙Z6#hp)69#9`BZ:Aj )2͇wꅕru]Kvzٺ х׌w;<Js'@RX#Ncj7~:7 <i+JFwB Z$MD!q9. |&c8. g`.0ց:(k@gŒTh'_Hj0̭Ec{KB2TwG= #.9ȝb8+yM|D)$.^&(\pl5d?=&f@ph<"M$n!f݃Ss)j%|Am $”SRc%rN˼_bwM%12وiZ. fNɒWB@C*{ޔ#޼׌g\,h76Z*P3zyYU~E7Q-I7>uzʹDzAt =l7}{}w /}Oe5nIoY;'Bt ")*"tVlf cD[Pn݃&n<5[v雥/`*& FӖzSL۽ 1a2cb~m=80Q{ k{SNd]:fe~k1x4cޒFz.ݾ +zHeU);6#B3}5Z5I|Hw-#E*^U])=0.w$ H1p ):WgS2R${s"!HCHfjD<;Iz]%2ZLJCyyޛ$pD ߙЃN˃JPD0#{[,ԒWf,eVu*|U?+5_>w]B@VؘL}/xV=B|ify ki* ak6)k= ąNS(۽@BLA5R.I}gFMCiƘY[#x93X{r/ 10H=hK|uj -%p);Hs1(MkW&BbOxM>UƼ A^Ƕe\% $`%5Fp"x5@rYȄɯee1[i^Ë/,s淖E+*}ϦD%Ynf*xq ~_x T; X<0Ioc|v\]u|eTV bF4Uwb~c< Yb_Parj4Xc@+czd89}}RrXF==}ߑa($9T`v :8{)?Fds M$jXwf CΠ~W 9_Ƥ;2a5JgSp٢}\LeDkI|TJ]9Ł7jSF01 \ng S6#֦7T&7F;ߙ$5UQLx& @Խϐ>[iH`ڇ*VUHEѯsr<0uߕKAzO}V FeX&ٖc&d i)nԦCДi$nSR -zyϳu^ԍGͿPdDD1`c ɢTÄ9/C]m컈]#3!n= G}jFD eRc%\-(,@J)0+?!z#]O@ukL;HÿnTԻu*ےsY`AA_K?(%ֽVL+ [QPĆz-4ChGn_:vq% EF}tgr6mlftLVrM`'Eֆ8oGڭ^XHʓ`Hc*dMhy!D/E<li^b_{嘖&Y)R, ˀ]AG?"|`36hoЈň1֎` 'J&lC7)T{w*G,.rN>C׉,]PV)/(N-\qtikY #9!oyWkQRu!u!h(1fnA~y,TfXtlu3 g|Qi}>IqrĦO\shXCPzr ~f\~e18V]1_AFJyK҅voz4. SOA'YFZˮ&K<-, lGmƱbǍ'$J 8@#0(e`{V9q'hQm2hrcJi yqۄЧc %1'3G.Ղ4~՝ڄ>/KDUԶ^^Ct[p]2@܌jA=HensNCo5W/I#{#X^9#EkϦYΣc^:C[ϏWG8pfI|j8(tZ|P}u:.6j\ -HprRq<f.%5ՒҲMꞙ@%e!^Ilyv%aųvJm~H/#$^p~LS|/eGHi^˛o-bklƫnE0Qdh`֓g?.(6?ld/6mTɇ3I0 fo9Cᰪp܃/NՅV7uBor xd6Y)K#%:BGD4z>6?%Lz9rtN0ɧ F?{z )S%;G ƳI,l?Z?MW0\Q~Y?S.:rƒr9oIca5j@mY,nɁ 17sԩFђ\( iT2 0h:+<ߢQ(ߪPw<f׹=_S'*t x,zT &(ux\̔8HBڕ^zIIb8"m]`$+IHXGTLiK!P{`γV '*RS9pJ }J_'kӁ9riq{IRAFb$(9u(%ՖQϳLN xܮ \֡!@yZK>GEs`Q Jcr0fq({=R(89z$. Dd ̝%͓/u@2?/} x}ᦺn4U;c"P=kv@bwGQ2\zU<:E`1ee+ 饷q9>X*Ӿ 2_z3ECp곱A~Ϲ9Ih;Ӓ6ߒ.uJ xyHs,AD?L3Jh m-%Ț#Y IIԵ3E/c^d @ucl[Q}H@pM!K @9MU9)?]h8iB} kJL|~Hʲ`dx1p]n:P[D\t/ .a54 E#>e嬡Yl2h25(Uh"d Y(yGiLZ8U2FqdmAվbC 5~y5& ƌAL8]T dfƊ'EA,\2xB;?^"~•|;3b'4j V`-_{&v'?i}Ζ0~*KN|DK rZiwWƁhX3=9w=6Xt'N0HuP+8_wv)p~FT:|)9q^fr @G6)y5IԳhU"}/ hdC@lF "˰*J_ M#b>G&IܟyʭD@R%mMQjR]~HwfL:N.WĄ9՚m[2EHh 0)N IJyj!+O %GVGEr7s4r+sF_p`H( `h'[O  ^+NO[xxaHt=&xb/fm,$VRLY@(iW ̖ܿ`&eFu*l7 a vuGF`sй 2傢L͘q1{$Hsr+J >Z&1ϋ[9^2M5FJ#͟%غqW 4KǜLc}Ji.2vbKEp؃?]{ԚfzI".8jőv!ҿ$&H?xGF=RtqZGq4es냲 RIIJ7 sY{ J6<: t3E£j&su |h*ArͶ ?L^D ,fѰxMnѤ0`mqiX7?L7Rv{6N9G=7Yĝ0ר|~x"A3r65|8DJPPo*sˇԧ;f5,e .DkZucl]s#*Q2󌶞Y& :sx}>?<\{4C;lȒ`@bXMJB#F}N[X:|ㅀ๩E.c٘NV@!J 6r.bx[h}?=G'4 DwSkQm.r5B3nj{;@gn?Éi6K"VMQfۻ_X"$W`:)D+ǂk!7>d@{M('_#6\am%c( , s(YewK;fFݴυe#C:I%1JoHȒM{v: /,'`Zy:pя ճHX|7R*Pao^NO)p~8cTD!_'g72\m SۻM:-LI̤}c%|-`%Krnln:_OɅQƂ'$'bTPuXlC )byD Lb N חWw3FU7 Arj0lo] yeȻ9FAWO뼸ƮUk\,sHX'<)?5bwW['>?f=:[v\N#P祱3+U$oພA !F!)Q@` &(5[;B)AECܻ<\ҤUw,B=ԒY/iu'"97y!t&e .ԩQ|VnY+^.4$l2.iեc<[j= olkzӪ«בj:7&[YuZSrf2dgP{wu`պ]ZקK&%nSu\1 @'6Šf{n;` 32!?eiZ9o š͇qWT;x!>C5'"g}ݙ-ǭ%OnT v6t u/L4r[d] B.u |EI?{& P?l:Z7\\*bYh|3g3$$PO_súUdLYt]J ),E.~tslvt6bM4Ǔh2 |aN$#BdGxJtRVTGaq4P\|#.X,kLkk+qFaEQ(PF? 'Hn Yt&Հ+v`oۢ=,C7~\L ]SeM\;S(~wKW&U @RA! C8C{cu(1} GX당Ĩ0c` 7ZFaI"w'%R BbD&!!}]zRiS?z e6b~įde-Zk+S+\w|UJ6RNۗTIe)$si|!c{˝V 8SKqw2ZؠAU5TtG+Zuɸ:|cnWuk [/r-hґ\6fTg^1&sAZ O2V2ٹTrc!(\'>R Bo7Ӻss5}<+Bk /<58?Um`Y| .܀'>Ȱ z(i@^Z @))hP Ƨ1 :X9@R& N]OKt/ᔘ N"jԃmfvny4Ά0L8}47e'`54:҉jI,4h>=,8l8 6'4m'hYskТ\%*6i@d!N)1 ^03l |hd88[FqxƶbݰQ+ό 7S!@p6Л^( '{R?D<У8Ioݷ3g޶porefZOk p=xLyal"6: i ǞB;<@PoІ 2"$@ qaYuʄkeKK.s Ur-;ؘo{pnH<0"fpܴI v÷D"#p,ҙ/HknAU~]GkHU&vCO.H}4 >'߽M4AK#0oѼgHdG? 3Nl45o^),3^ 8 !hմ;Bm_717+7G:P8;a{X~kKyBg!GX|Oh7ūf I+>X:X#MƂ)]`dHu+BP] T403h#Ic q&XI x-nK}yUoW#˅RL8ș.q^U<’@iԼΎL<(ARK~(Pc=*[`䯚{sՕ}|t/^!|!Kj!Bجt -zTl8K(,&wʐ-c 97r?7[^Yp-wu$B= ɫnC$nv:ý)[NO\P#Gnepać%\nw`ZexpTskv!|4f@o.D@țDGF Zp&09F3>]f;SS+t]A,' 7'}GtXm-UWerKKjp1)W#_4\.|ٰvH9~44A<ۘk/on!j;0K<|EWpJ~N+6H1xO#׉x=X܎R\sD6@EُϘw QɌW{ѹCJP|} !Qtf"OkJy9H*oȃkq#Hn#WSaxӿw<RK*M _N7ud߁*:%-Zo,UEd MP0\NܜtYS̹:#*qA989Ev0[cidMNjÒ`[ƺɈx4$>$>9)y<ĪD83ꒆBu.g|G'6?کGID< 9~Տ*#I5We];ڭ> eÑkS66I>M=1a:`wM'ψBmnٗmS:G [`j8.fph 'M8r̠pGLs"!<ä2ENc_m=Oa0!>|wB}M՗s+܁f-,$\Q=&}^Co) ໰#BE7^>bj Cdl0-v黗$?I)4`94rM*\ !q`jw;(hx4TA0T7 G"Iz OTs -=l׭{"t dM9;OBʢ< }l!_ $.8mDKgMR(MS=_8QrE/a w?UEga~c`w>A m&gE`[xD}#:e[Wtꥁ9;7C`xx*.ϳre6V*k=WshW|.DR=6^&)Ҥ>0Q{ya%Ba} ~hD@,"`A$ U!ʣW8GWƖ9]rm6,9vZ:W4P5AJ`KhџzspF 6^d%+ &Y6+zvAlKbs^I'qc̀Ρ*in< >` $+e f˽emLq$ZaYkm,:{>lfK0@q "=X8`t н,,|tha!`~Rҧ~ux"!=i7jBk.h)ڜ13b*)Pl_)SOxrY8Fo% 0n(RaQ)[w.G톌Տ%wԽ—E'p2bpzX}]ծ\znIIyF lB<›kdqs@TjK$6f8W_]o+hN>L6%>ca>5@,Ivd7XۗH%(1[QRDJP^RgDF#y h;duW4,hdn}]52AٽNfFxWy Ɋ[֖4@p+e/ sXarO]~O9P_S pGFp%~0&)y.{O6%T-30ES5ssaj[Jh@Z'iO{iᯏ*>o6@QY2~5j} 90 , D 7eDe:Ⴥ,sUdc )˔+9{Gon rkQTYiWfVsll7ORlJH7 0$Kp>Ǽ6Ę=w~.U(1>Ga$W|-:[#͔!~ɚV\+G;>ʏF5X2{7ΨF=S0c#TpFM$+%zC`Ayx K{Č&>"EW&2ĘIM(}0H @h+|7+gҍ3yM@XM2H=w1 ,'xYgwd d s۹Zs7A:TE9'Rl-}6pмBـti\*<""0=RO&p2"Qb^ JäK%vǚރQsA.!/E8}'|{)DFBeV]i?f&jk XgS {EdUn 9){M]eaѯcM؀54 5)B;{>s%8Kf$2r094D  S"MGkס'cVtk Ni±'<瘍D˶G䩗]f7{?Pe`]ѽ4j&\; j$>6a9>wE`.8 xQ!9LqpS(u#<#+,q,*ϊ&h2Cr/:܈nbR߼7_Tn0fe~zjIZ7 VMGpl<]sJaWrE֫i?t4Y[o k-Pd* PG(qGh`wj,CT!BFe߽KhHI?yG s.ƅ0xPK5}#uef15&mNߴU([]wMAߚx÷1b%#z½*Ӡ1*yao*ԿEN^[z"֯0Nd(D.{bB:6h8xKi>n=^t {KMfC QitGg;l8ܾw()9 JJ/Piz+ QoBňΩHpM5{݂I@kHe4݌?xzM߁,E.c_0GLs2+J w♻jX0О ?_ܹ_.v58>BM Z:9pa^.~RB1:܌u:'C-ӭm Q,:mrJTQ[u:s3PXS|~D:dP`Xk #0AeeQC`}?!H*h]U4 |̃.P6Ǒ?5LrNm~|ޓ_ֿjVF#q*TwKl.v!ӟAܹTKnDZ}5|I9ۥ^vq`?<ȝo|N`WVV }BmwĞ)!2DH1A|uGǶP"X`lD?~E"eT)oU\F;w4 L2A]IYY `P.8'2X%Iβli֌ѻnEE\)I{[0Prji# ߳0r݇dondj })&ym[L1K2Un#S8HP{ao]ϙWÚyO ׋9XY| ocqi1Q.P1zFm| *]jf=u_ %Ҵy`m!4k;iԚ.8LtoGL-P9rL=1Kɉ`LqATNjXj!4MuElX-ez Q_'*H49UHkUsfH5;>|zwW] >Bt C] /'3:=r'Ttf d*I@ a,<>47%(2& ?'˵|ŸtƳ!\~.*ӱNBijP_̈"Q BweR<(^>o"Rİ /K3G,U!yE t>sCs/ײB GQ8D еwy,0<݄ .58>i%cm,(u_+˿\kڒDjE"?c͞}(wVx!x{7Jk:#gpRAteC,OTr4qY3, Y[dNSYP s@;%^P9e ·VmGuʅ"e#RX_YHSs=ʨ ΐ{xdKN[#@-`Z+.tk=zs "Zbzj n'A2:ˇ%7ЅN{C",jB%S՘5.ㆲ I7 46̉^]ͥ}J٘^?u}p*|e}%\]^oC8x4hՠ* id*a;:{^G@]zgxF,hhIbAY<$.>"R~Nq,ҤZEnRxWT8h?d?9/g[\>6S)g#tnS px;67C8;?<_U^I$Wөi1{T ]-Q6r!xQwƗ2\Q$|Z[>L`MD 'ۨNBhoU=*Dd5嬧(vhlq%mlֳ;)xsT\SKFn#+m*a$p BS#e˪ȎO&S1ۛ%DHǰC5{ͺ[uBt%d2 U[හJd܈jW$ḻY}q5hZnj9`gFɽAr iF;yGetf~x.)]z"<ށ5m}!-\ o*Fz)^]ua5+:rj7V:rD+wL%I@6$\Je nixefL\Po`QmZL w}] ց]:Č{Bh!is} yB@ȥjpB:%.)`=|N}:8 |C;YnwʃiدTu4y O^3UAmj|_獑2 J lFD$K otf=U%Z/Դn M`San+cGC5Bx{ŭ`lFG2/!c$D[$ 賋sKkh~?;ݝXӲqLZWyTGjORzš![1ƅ!c[mêEV) a@ 1kKi+v8tJMEQ> &>pGKc+U-A*ҡ+*h KsqY&ޓ I[~B12(D2 ucd% ʗsr%b 9Q OkxB p1WzsUm8(Eqh if'Ǔ2-=Qи%a s&>?{ٲAjWzOڂ &mM\vFɓw9P=oHSj@;W]4Z2Dzѕ xZhqN΅9(Hhx(`f +z]vzF(8κM!E͢ >hmiKEV`դtXD Eg}7QD+Zz n51@!6!NS`W3n0f0`j JM>4ˑUަ_rh^=MAb-rvJKXDy$X&H ݜM7; e,,ܟI0,zi*fy7 ZbAQ(s1csCANw"x#TpUa̍ȞS/Ό79v   D:*26 iBV-"GH6Ƚݪ8NLZF"R&򆁒bnTFe=8m6YXjyRݹ/PY`.yvhgo&RoZG'퉑eif`#G߅'_ٴK,M-̈$驃6øh@ܱiZG$h8J nY%6V@{&\;Z5 ec* WtHeKr~5_؂r(vO !"\!wm? tN"ۘ;A-\f(!\j -~$u!zV5WYi:# X9K:tT`< Z5*#)8e!}/Iئw3Lu&P6hYd.?Ō V(jglHo<剘n%,.4>cӏFD-TC?# z\> ـE臃E%UxHGSmd_j H7T%~x-d\q2Ҷ:,eHO1h 93rzIQ>㜁ya?PEW{cP/5f;ZZa_ӹ{Vk6,D4pw|cOOGXI # @hI1v팣|VYA{m_⏎(͏/yr!Y]rhёwhG'ȸicPI={+ҹR5Pw͞سx/S$u J2\/R=snZu#֖ʞKGʐ()fXL~mz3 "$+H]$arpuGT9yw'u4.Lq2p:ū0JNROz$ˆ)\/sHӅ1ѢWڹvLy+ɖxm}E-f#)`VR'GۈlĸM-Iz}N{1:~Tјʪ'$@S?%%ҩ,BB>:[ k"OѼmSK{2۸Ne"C,! }2SZۑī):0K@ {SvT8<^s$}/~shnKBߏhC.:>GMXHtIz9;W4:0\ZQy5B,}muf-1Dž[>xGq)@Z_ UfMWfU~d-,p')L/qz$^K߿0nTeL;g%wM-ɔA:GUd^aXa! eyšv}p0l(Јv`|Tv+nl ?\)m;ȧӀec\rʁa=֬MjZr;,O'#ڞ2w5w[7 nuϜŠ[~*QwLUBR_Ƭ);$\%s !д9 Yj~I8dW{N6"vvK1k1eM'ߓіg_*an/{h8TybUMG EdB9t'xwE(fڌ?iFQQ*u$ˬ4>VgP3C}X )6N]BRHO0{®G ʵ% A-ĨICh10#'/ŊRDzpF8ACgxQr_DL|fBJL4;g{]3-6Z#ᣇ>#/1ghQ7؉ї}f!T3DɆ**gؤv76 ,ؙ[u[+&;Vt,Qތ>(p!k;[זx&nNlo loOoWm8؋dP.gfS> Ts$(c w#go֕T(@4x y1,}E IlO;GbAPp6ϭNPΏǣSMt2c+qn:Y8XUt@0=bm|8. -(Q">]Wm$>^'0UזC?7h8Tqu!cDS 0pg.dG*O/W'D-՛±9B g ,?2ʹYj3a|%5/s3% hRru+pjM4 Ẃmd~[8.wQ^= rbU/S+[ֽK&X>T^͖. ofSoZlYӻj) ءKAȣx$}'T́/Ec52s81t@ 'gwIDgm~y]A tٵ+px=bT2׻=fpRW%'Ma "(G]Wc仕y 6903<`h3>gݰT5GD/S" LPѠF.4/d4f񆕒>?o8'u6elu1auUޏzrG+N$u xC˜8Tr2lo/xR<.rdŦmܥZ5C٥w09 HRJ.s3W8}Z`gs; z~-pX%'om)f2v\n"r׊WBVk~ U$Ǚ-&Xwqr+횇ׇV| p@3@%>HݱZzN \^2X*ǾL/=s畀Gx5liDFq^4:lCpmΊ@iX'K$̥<#tֵljEYh \1:]!Z0zZ=,7B` ր1Y^Lz_?Q\YzзbAJ7@ۼT+eP+DN F'\lVѵ#~Ȳ.&,t`.(C?gN(8ƖHj|9Ol"as[aIÙNoS 8lnVl!$p$B Pwb 3#+oEz5H>^v<4x ʷ]`<f1= qi|y9:HvXi[,g$y7)lx"hٮC4l3ٞ2dCDOm^0"ÝJ.O]D^</kd'w&ptQ/\ Zr@mIbdO*3eH*?mKZ: 9#e!77k~1{77A?c_4m+`|.p^Yf5eu> *kʼHXaOiiEi?*OLd UtW A^J\_fIIboU.j _tN k]b{P'hz;Xin[?ǂ3]L u'4MF&Ͻ[,5,87md 7gad@sr&49I"Ͱ7~k5zXQ (P.# hgB45ߙ lDžt+=>wT _RˇZU O+(XJ LurͨV/9W>%ڤjntRN%IZpxMp3J8,'AP&g]E'f=x N+K"Ng:\#`L>!. V:i󴹆 IwPr5:~'ڧ4sFe%;4p|:Wcgr^C Jd€Uls*]$e(VvlNJݵh@D&$0YR~zjC[GsqZLo> -ꯃq L[cdJK) LJy/AFMEeM3.L ְAZ8 g'Usvm_|7S| *|]+Z W 0Π8oo7ƤRnAZ/q儤R' pykx⬽agamF/p-x> "FgD{2aQҠ P^h 9dP6X ?zƃ_r5Ɉ*%5G#לT_>Lۄƃu"BhEz7)U 5ؗbm93?PbcP b,BlE$ǭeQ%] L|4['I hwT_VNSD# r]` 7ۅOc!]oxA v gt!N!iuZr<U}H$MsCwge (Vm%ݪǘ%f9wsAA]~-(R]Ks-?+HaiitdL\S&ⁱW6ޭ5I*+&I;3͑8Ftb 2~(z/`:٧|B͆@yXӤI p7| pI:sdL^[9"`Jb69$waa|dQ~7Jss.Z,/'1 J̮XPa%ge|6 )OMGS2;qTZa:a4v,J*96LTX5( T5ߟe̕־gb; i֧,SŊ!B-+ 92R>?$ݯYe?EラJSMf eg7` ]ҏF~z({gԪ\be8wq=r\ݮvQ/dlƘ|/⿼vCs8^'axoNP@wQsc؀۱h+żջbv -e9wSh$~` w`l2=j |aEڋ]$*Ðif]gH; JUn'* _s1.e|ٛBSY\=>ISHor.wBȪM[g]Db':sS40`WG h,uP%?2wH g$&K0hh]VLpyDNNS8Lf0.PKUFߺk ]^4=E-5N聀 hDi2(̸ΈmoJ.ۍWuLnAҁ5V LKꜨ [ T2z&^(sb+g_Պe=L``c@1ʫiBlUXֱm:ŇΫ[Tl1Jm'| , vlIlCh * C2K%Qr/B'aL% "cic\}|ZQk%x({aB^&Ш[鲄h$8r!Zs!i ͖kAZ \3]ԥ|y"?08BKDl|HV:8(8.CeuApR#Oͫ!2 -M nFp 6o51.^0)i,ɫUP/$7XU$+RIL{f>0kJRuCcXua]D~0#@x<.~np۶BUo.rGXzxfP?+a1݈-alXӘX%tZp v׀]NxLcبi?DEM/r8uewK$V$oW5pIn?vݓRԌ8hV1TBpjJ)=gI-~J|x Qum iA "E2уځ춯<[$z982 YߟAfAוz?jw*4p"b|cIK3kT JhRK(F a9SquS90aBfvLpMpΈBbõ.-s}-B"⌶gQiiާ=D+ *:XTcdyԽ]gdL \ R]DWCtӌu=<w~d+&_IK;{$-/ J`u !GXO m;HNjqI"uC{]_-5*7ckҐp[:Ktdn9 ~|`Q"˷#"ufKeRgk'4%& %֣Q.#qlVž0  Qw:^#-27kP:s{T_[5oG`W329TTU|y /#A ,\P-v#.NRe`q>žFia,ڴ9ȡ"䬿?,(*}"9IK"*s*Q5ge%x04#|2".f+\ :SKBՈK0ˠOK'SJ.um^Β{RcbTnl t ȁi8D0J'DJKx)ZV)vΏӽ "(э[Hɇăx)Ghb} s'$7)P7C5EҁTEC$%LIӌ-?r:9~u}PL+Ζdqf7LR!H n|Kl77:ۨ&6̐& Cyb"EU Ǝ@hE-vwϯx*]{#u*VT|NK*ٔN>" Z,ئߓ^ċz<NcP<~[đPІ|`7;Sx뵂J؞!8 S4I+J0`2rñ́M{NI^MS SxjScE QC% ty`@t@y y[b%N+Vv]F-5:%IKoKhlԴpg, eD43.ܻEX-PAfRK=fھfGp۳_w4 Id5[8Ds-Vuno;zGӍ@GJ( S#Î@FH'(7e"BZsBpnj^طRcIK %s~ZcLA;~QiBnE>!V?+]5B4į4]2\%IzWHjxk7%E%rR_0iKH0nJmA:߉ƆTˆ'5Yl]vpϞN{Neʔ&`C}ݯ{cOq8xSl34LZsabk#KnIƻbxz/F40е{afd~٩/;\bh^ 'bB.Whsҽ#\)՗Ν (!ЎB*F6`KH .C F*s̙fmÃגaLD% ,`TJ85p v g. b. <SR,NeAugvZ?J[[hƳc~g<$ƫbB@aO< dIAGA>LSx?Ac@%h:KMic=@k2Y[n~sIbN%N4)*(;/7BA65iV%-Y `gdOZp_O@I}$nJ݁x Ǚ'Bwls(}h!sJwKZev4rvS)Գݬq=Jɰq5sAbڴ > 3>B/3;^=9ujhݳ25尡ݠZ:7FB{B# c}QqʲU&@l6znrQf$(vHPk2Ml=RsZ%5|t\DUL K8XIO7}&^T{1Ú&[l]EsRܰjX (*2Vƿ0>&{D#ARkKGPT;:S+!+Jy\:D wP:EwuRvKlxR,In \ i8c"OwJ*P r 1 0tۦJV~xv[o$+3bv *=S#GOv 0 S[썉"#WwjVHL[LvN*' kǩ먘_ȤL\<f?j:o*+S jX:ӡd:L|uf2xvXAXϛM twZvJc scX>ڥQz jx /ݼ*5~k(PzUKJ\w% ;6!MǺv9,m Kn kLXb m7K\Ǥ0R ,ej&Bw L\a+ivvB-MfĤӻϠDnM{KڇHH76 ӯuYA ` jn!xEv)$Vڰ2w*@O0"Jp9 ڟ705ӷpfQjkH/,xatGjT!HyɈŰ\ҿΟ.P~CO0O' =}䜪.f}Űu7# .f#v,cmKvȿUWɄG w @N~pg:qݚr-gayK5EByXMgw4=: o,Gu6Ah*E9xbċ?`9SЄKmx2m?USpv`bi?Z~XSН\qqH RluȑŬUds}],=/W M]t?9`Y2rwg|mvˊfyZWiT@1Plǧ 0(Qohm)@ڥ 5 OYT=W.X|; x G0쿯ۈ|P:U;/j9K~9PlF$+LƍaSULG $$ a DYtB🧁w<4Z N!|pfjy~Ktr9T6$ds3y}ɓ8g-5қ}]C.RW|}v r'|"~o?mRZ~cX/!wEb!%V.m2VU `_bV_q{_#dבؾ4`_c\ќ\,t Ğ?Ё'BH<⸶[xx/i\bj"KdVe"d6:12INc. !>1ZX%Ck^ÚMF֚#5+#}rD[[ɐ洭PIPh&d@dy# p-<xUl6.VVlZ%&_ʋ #9,1`($ hC,AJF[QcUUv#X dȴ#e 6oSv6o4(ۼWTV]ϐNvY'k 724JQyrT2؆eb - $S^ꎌ!IZ؄'zBVxGܻͷݑ$Ĉ= @S O"HU_1 TUOd3$Įv0h.WE CE~Zx#_Lo]iw5Q 9 pщZu|n,URXfQ*Al#=R Dփc2QF[ GV #fnj$"-rU`ߦN9 (RNگw-J(Kp8m7/Dhaטp+m/ON<,?~=pV;tX89_,8zJO0ث2PY9E\?l a|TM*8F_H_ɪz]uq%` cϸLD"Sc!m0$mbMg`b%QwNt,A(:5y8N/m-!.* 1$vZ,-Bb?v!4}o;>LJr< qfn;j{gO!=VD# G&;×jDAp*@o%/S|Pyla>XWEB5i$$!rbz"o{L8J qWU"24SibC5p(wmń*]FdnGź!>e]`OR&Ԛ˛57W;|!Tr7 (,&nO)1g+]8$0 +`/&q7yHhȵA7Ye`a7]MkM$cC.!N:.(![5yi:hG86+B(}(*8՗Q#Q'*.H8jh'q;n`0 y6!dâSY$N,;zbMr 0l<`xCT$ heϸOɅ7 I&0CC!4T< Tc#Aa 0-!CVH9 j?_λ~ǴI:_ 1,誖`( 2CDU]2Mz 4!XJ^.crp dR`l~n~p~nd-Uq<ƈ#UZڦmÔ -t2/jiQW_*/B[ڝt( 3H$ S*V`zEH3 7 vX|X$hC0Q0k@>7A ,SZ ~/}{ \C01$u*yT"qh2׮яzJTu&o(k][}ط,xN%}{X(ހobє{ѕ0s G-#85pÕv:bWyBDN~P9or{2]>fn)YU݌7' Tay6.mvާns) ig@g(v{V=D`7CcޯPY F7eo"^3T:8OszxߠwP9!K35JlǓ'q&VjiF:( a&\3[s.O;˭ p]bzseKÞ8Tءʏl-^_='kj>8R0.1"Pa ?ViLۭh"̞t-ϒԤ@}^^28Mz"y|w]*hc>bYVB oSU?xϱûj]  4SZsGRVz‡ҹJxlhMܪ 1Ofޢ]:w)p&% ͌fGs0>3v\FO\QI2BkۇtWdp 6$$#L7BGk:y?kMC7_cnLfN毟~W")' i9{ \.p~;8{S0#]GyG?]xeGOL+RLS1?,Psv~FgJNs!^ov_pH `}b~hxK㷵LbШZ,t?X:ZR4hB26,lJ}IXlD(DSLKO|$-ݕȹ4|6-g4D;)rR;]Q '^uq #^?z6 ~mX,zd_9Xssl\! /K"*Fh @R9#@%1(9dB18yv,풺"ͺdIJ>P^C295{i4ΖСm5r:Js. $PV-W(?k1?#|gBR܅y~&Q4񙒬~ RQFCs9.w_ܬL 8E޶5ChIf+O=q;w3>CCNW>pU h)-UŽw6>0+`?0ȝ՘}chPN` |_ܱ5Bc-i2vv88i(h5uxO[qqX<燓Ƃgy AG%X6rLaNS R+u"P*S6[^BfvQ,-kh<9rjd+^%u>2ma`-S7lE&J;qā^I%A%rɟ %og#Li$Cu€ɐ98ͭP*p1~P5 P*=H L%B{kp0`E%1ΧAE %,‡B E\AuL#{)7vm"bݸ[IpuI!=H X=0UtgvBQ`WkL;bq, MK_^͆fZw%[ahF"ʿ 7)G͞OPL4\Ggb{e}5.tJuxZbUjlb` Y>9x}n*EG:tbm %巼Y&bQI\quѕ[[0O/aqd}q:8wD,).~{;}pCtb˹M>~3Z"/zp|N9&\E( خkoBI)NC^>2Nf$ΰ٠a'TAיO Z6:C&Žc+*`0露"VBg76DAU1G& *dṕGR1$.=X͈XZnEQ/_i|T>-P^~ޒMl&,&+V 5[ pQAiG~:D0PT=2M $gbdDY~ɶl@@/6*57m>0ܛ*SHUpP7;+aǻ/iH_0PÍ*v ez֬B~4R]wҞU $qvN*4Rxw =HdEXh@FBRȖnwFJAugg>/i/,#^x?_.}͍‘j>7\h=9vKЄ݋IPO:{ 1 U/T(pgt+L9u{׌U`Û艏lu&xWa@7^-oEh=(Be̠Ptx~<"#oj(?osfbX'@Bsy=Ayp6@$)i]EhX>Cc(Y(>IӜB({qJj$(WV]\Tw5<)! 9:dCW/$K1’;j|d""Wb1%.a{}WF-SI ˼S6MNH _~q1,ƍZ<[ɂ}c+]¦IxpJ+x;Gmȣʹ5r>2N?e3z!,=d{ya,> ЁѭmH|" Dzͽ,e'PMN`2`/wiEh,7@mC_I[i`*0.]]yǢ"vYۙ7n+KOaWiN~!@qŔ ߌM>4a ]y":8cz]8X<~qLVL\/(}2 d)[$XVmվ24f,'>x=^P?!_KLc j2ڨl-Tǀ=: zh&OY@9DUB ͯuK=M<R^©h@YJKsI(6gBB nu6Ogv8 Lp#ې25gR,?ORhq%߯Kd5㳣`bLtaN0jX fIk n_yeMx*EDn&%r~[͸'zJuQm7'}(OL>ñXZ[e랐 FP'9G$:Mh(Re- j_nA<!JRƑsGpǃUzg.Agz 0K2ĥWd{t#ʯJ \J^K p?@B`m,#~6-r>.w-q!G9lBV<9DHFѸ_uBYv"7I41L7-׀2RQedq`ouoߊmb9x ֕a lFܟIBicS^b^]a N|ZuOq=*CJ;0ۼ2Y1ϼ]З=ā#~+k8Ώ*ђ v> Ș|mWH?ZE5>l7la|{֔HBWjc7!*슫0MDgvb*>x@#&.5,(%ڈ=\ro%M}mEh@#Ci0veO8}y&qüTGRR1$zı!o`, ^ NP΁rU> X,|]韻kGe8TG˄z1z֑j੄@@5. ^ (CUZ30|@~$~` 6> n_-zi~Z 'Ku4yE*!j%P")nQt0fe8O3d15&J37CKw%,%a8HTYx mH$\Q8+4t3.9Α=:HBp埶DgROsG3Ch3C|!s|tey{bfRd kNo S+沚SSO qBb).5Q^ap&!íԁ*KM?ʣC̠7n?.ke_(ȂW+l%) 7RoVӑZ1J߀,_e7Ο` TVS/mjea uq:_\E2P7B@x[zM,Jqל#]dO ރ #Y=#:kP56ª*_GR.>N 0;Ԧg 29RnSlw:$űfTQqxxEpF^W5XΞ$ZH@YM.j)??T*Ad%ϤUQJ$Q/˜RnC=耊i HBtDw?%@f:hLJ[)$+VzD,jI^B 6F)]~4وS!=3Wq@ S-e*ͳܾ o`dʽ)+$lРdvpJtSXu3kũ/æ;=Vtu;ɝ;m ax^IdRPb+I6X5u%qsʦb BE!KBkPp'u Vz/!%P~!@7MZT,Ll^$%h G_Qf(/ {GPen5E{Q)|;ՑUCN\Z|3j"̙8jrus~֓丛/*$O*VpYAc=[`ͻAvOƜX1v ; ھdÛ\l%Ep<ğ9-x:z$i8%}jO#7*j&ޭzWc6'P=`Y[_*T)&PA M&*` 8VaCB62ODq)Y2ie]#vp+&-각h;=D)F=RB@v|=zB>v泿$ 1^{6+`ZE N߾B㇇wnC-૪-Z 7c,^ t#i"TANAvqYoKPjKWhO7f&FVr y n5) Qs[CL-C;zRv 8ڣבnaHMiV_^̂aTG_b,ǟ ٛHB]/8 7&*Ko)$* |*YEWD?5{w0-bRˤ##*0KS ;l{Ԑ]XC[B|n АMz7mEu&v;j8h, GˤXO $nw+2O {1CC* @|mk/yM7զ{Լ"TG9'q%7UzpZ:Tur l8[UaDqӆE!?ߙTMj~RQ):u)!q08dCާDV^Uz6#nkBIp!7@ Q6?D2vLV؄lO9FjiAA[P݇%E)놇u„~B̳d{y2I'QʦXL9~A]"t S:Ϧ5 o)]*[AT['^*xg4vu**{/AS&}Tdmꬸ5e0Wg,PW{+ڄZ~h# }"X\C+CT!`YTenq8 Q`f6!U;RVOQJ:ŸzDze ['J]+%?&"c5]0j(H#A: < 7x*Ag[P3Zp rBϘqIF)3WǬ;4{;{$ym 0S!' ]~AjqÏ6T+ڣ3cpsfȥ*ZWX̶:t12M$#} ĊdςKo_($j4gյlk_be>>Z"{.A-EZ <Z/h7‰"0O$xImu$*/TԶH`b]l0 㟇i#4lj D1mc.;6FECѪX6?g"1ǎodN:pkEJFfv@0h5d.# ነ$E?ъS|<*π]);3t"D߻kM?Ňi %M>%MŻ 9jBx  w5xcӃ謯wKVyfy-Ž~ZjԬ%FBD E5Jr Aú2z#q)kĕ3et5v>i ѱ0\U+ 6U0XKҶDO&L罅^BE~?a#1^xGcWq*:2i͋ R-Xbq͉oj^ߤ7ӝ5=j[%5k=[*9%)XҖ&c#r;nA3xe>:H0j_0-&Ժul' * p%*`xM#\Woz?H4.6`,!I΀cԲhU.®ADFbtЧ2EB7BU:!6{y=JjoԴ embyT-X=ol3@HhC!=787'4livЀ^^Ӌɲ Q>)_.Qc9|Sv{/{K&7Z˽Gs+$J |ZEhX-[#Z9m9RQq~`U{0,~#jT,T/OV` Q&}cGƎI0}_ӴG֒K#$]CUfyPPtM)8XQ.23|+ g0[3v>nJK45h974t[ 9]r}-Bx((" ls[=MFA2T;e6xQ$9ש ]>F1U~Q=/$jVD A@}%gGwm+T0Rvɇ|[EkcJ ]@/&֬(}T׬,Տg3t}BȸB?1̉k"|߷E9;XT +mi6HDuʠY;uVD2{fb d ]<)˱j@c:V_VPɲ /~ZoMAH} n-lT5U, (1K!,Y o\55q02# {8[v9lp>6=H{2`vJ,|ڄi-/Ƅ)&pB"`* 4ע>LduKܐu"?uQ|&VB53bƢQѕe1d0JЊ;K幍jb3ʺ!rZ3ʟWhUE q9#WB}~0"uI2RȥN_eqEsbU{YhQ!1:one'/d/#< RXG{0CCoɌhR8L˷f/sҀ$̝$#8YR~ G}'-h! 749 ? K2&&N**3W9 %6V5 x?p>q@k@%50zy"c%IX ꜧ\  DْTfY7S)3Ȃtnt!;bh8s}ȼ9!2܋ O 8Оw{ xkQ8to Qg{c7 +X*A];MTdGg1I'ʻPܧϷ(rsNy|,0Ba@LaV5+q%~3C5?GbϦ1G$]i<+@˖&{RM^UO OaiB^[pxdXb پ"Э>b}Em÷0W /%]^F1R`+k.Έ"K EJW $bh鬉`@8E Agw So(<`#X<?|&pɝVl_l"\~*58ȰhߋOUk1?{ zSCy%诇j^QRszS?[:/gScH_9eObfi_zIڬ@WxZ"Yh;!d ru4j)B]c@@va˪;9i] ('FF> )'nT'?V " a=8 xm,'J0h9jCW(ޗ,6[=Ge'M8Rfn6xP)Zz?թ1ۍ\ʰw?"W[<Ȥw2iO2ن^QmXmy{†{D8+BL߱uQ%vz,WܢykiFUW0jDr8m)j#.pYr2ǘvoNcxvWsZܞ<4,hj*]|ۢ3{ V4}P#>%Q=Z{ !}I=`1T?t0zpv!#J-,bTm4QBivbcTJYg˹H%2ms+6:=?: vZO)9a zl/qb, B"٩jU#%č8EI@ gC;9[UMrN:ܹ#!V\@4__W;QZBLSQC$2OPZք]j_(A*H .\WbB rfyHm d6b#T4)U~p[ C\=d4[m^ Uruv]t}#Fzf!6xUz2Əu`ٸp!0d7}67u$VfLc%;aڞeRg|C9ZJgM*{0VORᚁ~f 71}\C ͏ &ڤأ)#0UԥnN03Z5#/إ8aWd,<[ ńwD&4+spyޘ+$y`DABk솁 9$\_;;钂Tav" ӥe |E*ytO%/L琚a}͹ˆrGRWdC,ٶ"Hq+Mm>L F3h#MGʝ(ZY1 rZ~Lnp x2Ey;LwLأODm'}ͧb-ވz)-[vX>ۋ%yM#?B&u¢:V)g ^Qj"^+Η_X<`kWη;5\B6zeSYJGuMWE T\N? !Ʉswq͠jАbHQ'nPP1}@y;9OK?o^!K .ۊD39L[9We*:A3a=Yn7.zP6F,5~P/[Ai/UOOA' 40> {Lj5$s @%monš"sS>XA;zw_˾1aUnX{ >@_5F8oN=οzS05h{i*!_κkHL,6_g.b΂Dި\m%|՛oJ5ufˑw^\ce|b1ŲYB2zJ܂Xۀ" :} ƿfuAz"4.H]6LjU+*Rd`?`Ѿg _?Nez9q{~Pk<I 5 7b3Igm*q5bLMG_Ό3ؿb?$rݕt{eldGcجjMT.R?)522%I;]WR›ГBb 9P*x f7ȦP܁.Wwe 2P~XvL\|*Ra1ڱ5G030j̒VAl1b`snvؿeBnإs#.=]tazOT 0Qۿx9U uO 2&Ky2EϪ3)J5)CI!Ul,F9&k[ F$#yQh-':yL~ǻk9犡[3K(:*,+q^GuhdwZiip/5v8(jb?)k4 /k$y32#V 9V.y^s)Qr+Bcчx[z1b]eyt n,N mzF2j„L,P&Nj3O=Is/3]m")@IZz@3sVc5hP%QKlG(U%TJI8<)@xZ0+O _rv::nxex\oA'aha3` `̀N$U^GFo|Laac+Hщz%k^iKDZrfVސLy[?a& )ȅ^9KG[dmς_v#T@Bx~J@d-3v{w?7NzZgg *"p#o T񾆲ݼ@R<៍v4D'wַƊ,7X|*tܻmC{߮&gojߏg ]D/?L}YJAoDŽ < }OXif3 [23:mS0&=Nor1# N֞1(I߷LkyZKc2X*4*RG5-mcgm ^<4TJ+%Ů< D^Q 0{@h ȕHa4~v}&VsbKZn~.J&'jj5%PKw|.3[C5_O" EÒ;=:m=خ&*x5R}_S#!oD} %@O4#'NY90b୥=N?Rv[Ym>ÜH7b >Pn]jTMwK7XStuH@xY4[]SLlG[ ]fQػYS"=5˜?ruCcMCw`-c3KQdm39Q ʒYv{1Ewb󾍩H>@'Miة#:X15d]6@QjW<\btrn+J"_NB.? ҧ`𕷐f|Fjru-k=z.# D*S;@B=JHplCQkjL,0WfU&ls6ldJQ+O`gՐW5:#.x-QY,m?fWU84bRg"8F YsX *1㌀U$fi,,Jcd kj LJ߮Pnqi7 y|ӓDž! {,w13}FqSNb 7Z0)JSn!yo`<}*zV{6uBVTDb-RwvO}6%LYSC4_xZ)9Y/J5ONo=O^(-/ClD3_*fbչҪ:[+qp~&`2`fJrpHPH' Κ^K.o_2]XHV:yJڦgks@pNv+v"s|p oyAk#k 8+ nozG{}|= rIrzZqܨ _w9jZ> gz3 l"7Qn|PEjc8K;o%@Q,`#<6jQhkļS./ ^̩CtޱM(bfwJ,ݱdwr/!*@Z635cN)nKEp7a57s)g篓K:Djw6.Bl-xp仺yWG|kT; TDRJr`hlԥ}4xzekn-2 @-{J'|)C¨:5EP؁*G`g&NC\ Wx̀f:mP I?U8Ɓް1v%HשӖ5 $?DqzYcV\_RuufkJP̮j6¯1rY|Wb#{c!u\yu&*kSߟG45:?t 1\ss^+=+q~-^["Š-Ƶt C_9zAh3 ({X#f*7DdDn5| (XHM{,*dlQַIo$dris1L4- vʸD*GuQY0)*٘&H ^59Z?B4eL6伤& k8z:oY,Q&RY7D{I\l xa}N@wʠH!-'lXښn0K,IWi0w\[dz`pj{gyBwGMRHK\v 7V)r$r`C&{ʠd;9e ^͸֫h[**p_32CL?BR+d &t3zM0 1lA9)R^+/1|? Z6|b~聦~%!S{)˸Xf2*t I9KF`,MpV{NζY5DZ ɡCeAvXmbdA޳kj̻K휷J|x?*,ʼ,=z}EXfDb7fL!GxTrdw+I^h34oL㜄™]6Ij/ȢbB7h`4Y|Vu:]&2@˒j[g\. ȿpyƌcx+?5長T{)[S@U'{Zۑ`s4j<pE,CqBXe}0;7%[i:4>TE)s`SQbq0bhNL O Y P(Juׯ KW-wMufBc~!{Pze.ނQ$auUeZRVqX-ݚ5_ YM(8Ф$"u}-1e29Tճe &·axiagyd;{뀮 h 5qԏnC_t(lq G8r@qe舟ͽ"^s"R?11)޽X J`Jl̲ <-bbV36YFdC!GZy^밐LaƦ|0а0\ ujRڹ 7]āV: 34L^N kts]4._yՁxl*e!f c&("8'5ͦwl cTA08&!/%{56lEr e T[ =%}bo+C3]nFL4αGH/n:αs=θ~ t؊3po8_ܣ׏'ua04jCG=Rg`Ϣ-jE?F݄4P^M9Eм W7Xo@`A Zq>˧܃1ko?kQ: iH HŃ<$vEK4(U@KC-y*6bZ1ZDb+ Δj8& 4.F$ pyש%`/LƊߜ5/M6f),: !H=\fE[« :ʜ<%k q잭 HR eT~Zt$'02Yl6"I#X)"d)j^QVת,Ʌ0;fC^noCd_6p+Hv:ɳޏTefMj3 +-Vum95vmbt^]՚+l|]%Wv;" U4Ѿc͍ʙdM\peRqN5`%AUd{$MR$''-̅ ˵= /vZ j2bNk` (<̓CGeq- E aLLek)O!9 p>i©G=Oa: !G}dM%Izx Yl)Ш8>%5RN6֧$oQ]GOߜ_Gȩqo_ mkSMl'uy;jTv̞QDq*7e&΋io@G_.,X÷H$SzvgM~ L .r!gwȵQI~F,z?oDoz&5'-xǍ\yHOIWtu/iԌ<'=~K [Ms|բm_$=x'D*\0܄CvunKpD_@Ox ǯRfLz"q|PX;ce-gW]|%*-1{{)$;~SK?|% }R3p^46;"O KtqpzBvgJHU=5T W+*I? "w.ܾJ \GEBiyP-+B`LuF&(k{/,͔ _1 p'zO@QZ|U+ W9F]'Lb:sv{e!Ͳ ܐaT^e#CNY^o4VjUX f_"Ym~8ǎOzU޴I09S$V]篞wyE uݒAw]{;̨M,z=P(ؾ6ٽm bJnK'˜`tݨʬ Lc3 '^,*vU=AGK9\uLXcOӋׇfcgo\{ X YA)ՓO'k?vke-u!"XORphJn$'IWM79{)=$ͬb0A귎m_,!Ʉ+9!83lIgH3 `T;fOxK-/F# 40Q"DA3%WW~{~g6-dVؔEGyz7{Ho_a]PnbvYxXRح,{XzK5Ttpi2(ֵbhagJ"~xч0Pd5cTJ۴eUxMq( 4ӑM| ĵ4ub`_%S_!rΗ<cAnݱ-54k͹O{? lxW3 @dpYН֙0C=~{>S PKb[ākj$m*@19+vCGJg꺈u)zqޢ|egIZMoX-q'D_/~h :=b`im֗A髋 :%MgJvnF/'HTRA4?W YsJ2 iyfV~6-=(n1=ZƓ&}:W"K??wT6jU{ Cc))vuklo׾Gɝl7U HV(xU@:o(k>'T2r;>EP ש f6r2H8f/d#D-l.ӧ͕c2j3Eov``i9쾕m\Uʫ)$1o( vraNXu-AZbIJ8& ?.嚗L'}(¼x -c)슎 ݁B[0zGbUzC? 6QEÊwn/+_a|"'}FgbDhdn_a0_~Q(F9wa-%dZypʔ"FLCli LC)`Ї[`"U S-h >cq2[ΪuJ\Ŀtr&pa:+ G-jڕlXn}G&6哯/칩T+NGB4I^+ɠ k*5Gp$ϯȷ{'bQU@O#4}WpK%rF. iFhnV } #x@`܆x)&kcgooe@zk|UķR(ѵq|${`_4mhDNgzk]J6`U!GNpS6Hɉ u< kW tm kLfr<'D`SW'(榭A)PP05^Of+lGYM ՗&k5&QG hk%+Np&*xY6k(*B !n: AaևiB肏)fU(5;.ffxIȃ,zԕ" Nj.zjul+HVg88Z̟G<3J{`ƢcLlBp4{9+Ƒ˂e$nd`*8sn'“gddr4;TU?#. W 2ǏS%-80ʑso:8@n4\P,]띘:M*VtoRE^r޽S`D8 Ež :OF:@qFjl?`^Y!-a ߉vRb tEV6}d$eC5.=fG3pj{P {CrR-w\1Q)cOM8)+\no!d(<0S o›de’eV/Df;V!G%m'AOO2r =$( ڴh\ŏI(K; ?cDLM>]Oc&y&jKqB R(gza.S ^W;5ƃrO6^dwY>1^WV:j7-̈́l0p MPVa&Fz|Ԗ~$wr9hB8\4@MG6شVǵF'(k`V~ߏR\W) F a3E{A] eg@Lpv&l)HX!+l5>T<5~#p=Rgf.%.ŘY)F Ur|QAFs5kc=HZ15)K=Y5譫7ԟM)o-{ ȏ GI]0JN^:1t=Tj:s$hI[1慍MDLAë5#|1[d>ե,UF B+WATP6*Fg Sa Z{SF`r9~1:+:B@ٟ aIO 1T*LkуC+MHHq'd0 Yt {E; hm`=cG6)[[m,_J| 0c j+ l8JC٪'q[pd/sNEK=Tm0Nb<*b*inW->0G#elvN=geB\3U4Utڣ)͞;zTlsJ*#ϬyI kBrhẁaJ҄]jar=18zR`䃸ysC!릓Y^BvC~M+ 7s<`RtN_!(VT_Va,g&uZM* `n߱S`.jWՊ b6}[;5/Mz4X+^rOܔ Rt _T; L^p^)8T *NVSrakO֘EĨRL<Ѓ*tLr hGuSw f%'Gs^**j(9%ꇶcXE*hq$($\L Q>63"4qsn8K- ʡE ~`Jh8CrHA?U֜yp29TR:E5&V͖՞.ZNdR/Wַ.dC2LyF11%Y00#-s>)j6ˈRtnCb4{3O\>=#'C4/J,( ek9DW3p8-Rqcf6N6t= dHD6=?gI6o_<ؗ$;j|ТCZ7An㌸e4Nr JUPdxkD2&$ry; ,T=<Ǫ"/|ZeW0X8Jf22+4c٥)CT0)D/aNɂH%6BjL%'V Gcַb@Bv; &cL[rӫ5Wogca];)UPDs';ہ6!+ )hpzںoO2ʤ5%|GByNTQ7|h ^dDNZ2wD`jIv#5/kz ГK5CxuިL3J\3QҴ40t D뙲y2K_vIGb7g GKÀT8/IRVʹ֌(% .gΜbk^vN=@W',Kji3ܫRrw/kwERZc v*bpDAZi#xs*D D*ؘEޛ^.Lb} 3OJLJȇmlsh֗FR3I.B$?L]OMWkVPyB?Lsi|,*ٮGU^v̬DrڳL4owVdUCMwS/= Km7pfAg\_~Z .`M:" qQwND5Hdb" ǥ|ZAH[64n8",,GrݰfKG("V([_w&v#=BL$o ILhZPna[Y{m*0FsQ8|Sv!nZxYvTؑsp坉%tUDt1P%DY d*Ď%?{ m HUyUкHHbL,B((2*%>Q<1.~v=)!F&Zpf/?*%ad0MƳGp!c~F^|P?+I4^H>5!_7ɇtQ5{TŮ8ry7kzl r`ybuG49ZUT9 Zu8+ևvvy PBx{r(8]Y!p,SWKLKvh֬1OM <6ҫB錺*I]0ZCۆ{BF C ?.m%ޕȽ9?/D^5BC->'XHt~;KaQD8xGo89}w>Qc47vAR{wMwN;|1u,@ٵA$fo̊|W ϷVv."qB$.4{QIm_?!@Js`0T>*7RrE jʫ izX j82NP!~bڪ?'^*n. WwcWK}͊MngMW0{ >ڙͬhazDE@R#V/Ιq2N @^i&݉d> vtzI& iͪ*ٱR?{97)U0&=/U7?QqҽLK$\ j-? }Dz/;l1Vu | ltͨj(x\3y264TA 5Y6fӶZ 4>gS_pxKGSnʼn?vN0(SXeXs7 e㋖;T,{!6p>p䉯H,,EW]bqTJpJPn}Gے %2}C, ᎜ ^0}69_p3.:0jDSgCª.i'UE w C!ӣw1/aͤq3;Z\7}PhV(p4) SR;̍Ugb 숟sJ !"Xʙ=1H+ .w9yږ죬8wb : 2Aj~(x] Ak*=UJEIƄTDPF.dR`3"rNMk 沿l=J no~שHS3y#;( &dSI$S'<^!9T4H߲TtM HQ́?[{_P6*h'=FTjO4ý8V.Ri @M #5qq,V{XL^'N3"nkbqG˺styZY ,?2KDxFApo[Ńjr|8Y0Ź  ab -ũ˔^\wr;yG8E.t('<-x=2ַ1/^!K$s9o>gDy ٌRݨt8ȽMHsz);5cZtY8 3OHxjI{7Ű$ ӶR<sĂ;h. nPF1zD2d_K͸yv {U65}&}΅4; M%hMuͨihB3u  &%E|w(gi E#ep^Ǟ"*~ʳ~Gn24S2H4IƢ53epu:S֣,N_ҞSA&2b+^RcgY]{6#FwU2{awH o iot73o f3,o1ǎ(9c+S%]ĬQ췧qu飆-)eiORjNP i,"LF0h :]YpzG o*$%Yk>&)T6< JY-_b 1>xmAd`8 dECܭ4Siyxs(06{1ot=R6w, 棥(&2jewQӄArji8↢ຕ9ޥYuYy:%ElSo$:QȖr]pܕ€`@dU[Ğ3ݟ66u׋ FI$9qSu}~Zxꖬ4{[ W> zH_gQaC)h7_xADuj!jcfvR m^+ѣ>Kaa#G=zߴBʕ ;S^+w(QNPbj&v L|[{{]JxXA l,~Wxc#)lw!ׯf8(_M@$JqK'D>9l<|:"N/1^Ϲ/tt&)p xUwO6Z]|`ˁeK,Ck?Suq5usȶՔ&[O*ARbCz?"a8gn u`N"l( V?.{ܑh&}2~!-~"R?vN^]R `)c>R!? +TXiyDãAd0F!|h}+܂6ҺX,1=哲1ł~gsǂP D3JKR稙Xe]t;IMҞȭ)/h* r\e0B?hOH ^ /MXlS_בxۍd$(70^ ϫ u!T o)KM^W@*J_Ϳ9z7T6$LTrU}:MBs8@B⟘)Rǚ1I]V}w-RO1?k"xIp"OW|[OM5wl5T"Ǜ̶p&UaXD"8R *ؼ!]2[/!PU_Wh.0]?姁.G-%)&=d0JÆ~!PjyE\-+ [ec[]!hCcw!e(u!=^JĊ./vBe)17%+, ɯ\smT<]Gm]d9]g7˺ݽ;E6r))Kpb}"qqQe'׵U.T*<FH wVdA Hh85sA ܶd>lهa?y*'Y~Y( jg]aN0ei袤"3&y> q/P--\甤xr#ls^wO8:s|\Gvr_1B҇5M_yLE=4aJ ~t˛< z}=Ejafbz F *# WH#. grcL% /"<2"b?#ZL@EƼ  Z+LScfo7\kErgBxdP ៛+~i/(؄[.LD4ZTڅ s_FPNBo@5ԩ0(jP[DܣdDY/?\fM̩K7UuDm],#DBxQQ+-zܿ8ik:!h( Hu5/*8,WWJs?҅$Ai(fBsNTk8 y)LU4C>,4W NƝMfG'OJ^[š0K9?08@NTo;7*˱c\ҬDΖ dna;<О"[ H,R$n wNY5:ًODb];f*'GsBF<ƕ,i6Kv/Ҋ'%r--W0F5M3NsRn27p|'Ɓ2lۃa0=T* ވU'/}f$ul`+n<a A ?@zBΙŀ`Oi8g%|)2CY-" ř\ߑqbͦdh [1GS=%re{>łUgvپqˊ߳~ɭz C5K4^scgIK9PnQ%A9Xѭ.Sxz!7CUa !>΀ވj}&8m%LGqa|ӹچɔjh5ȩFJѻqiE1tǾ+'G(|yTӐ)/@szYO&6DIS_7O[+WPAa8~~yN} @37; f*WSxGqƘ#6 [`q2cNU5uR-ܺ'P{6:DcKfC4n`by;'fOm7M:'X9ͷ RhbKPE(bUFN4v䢃u/};6hPYȇ 9kprV(";_Lĩ_wb8]pƢTVr~HS% rg8r)5r C~準reBfumd qXkMFTl4w?!m\x,PɪW?`6h2cA['/Di;8W9 y[zˊtyq[1z^6~>e8Y[DK {^_?¢Jww.k{LeVpɿlo goޗLKmMn4z .cTb(daQ~\ckT@KgPLn,ך]MR-Ls o@Q7"Wn !ݝ[--bIXsHHgعYlKGxüWDm[{j ەFԯKN( s,σ ]їnhZBB:C:ܗ\Ld,f8Wg70rL0_`KU-5x Ē\Bꀯ Z_o5 ?,$,Cx~׋ T \f)am>gP7H 5'Gr{⃐å 9&"B N$S^MҜ)ץ`y EDli?euOvO)NiqN`9+A ekKScLk6`V|U<`w]H*D+Nw[`4?1'G:RW.6roVXO{!z)(_ 1+\GYa Zńf ^8_ ѧ*uHY4d/m) tU}sxBTR9ezBı!Aa-$f^U [vn?- /A|Cy`t׉*0/ţr +Yb2~M2IϟsT awpuZ] ~T،#zײ\D~)؏hަGP>6"R*4kdl]|'xSZtI-0gKAxax.ђnK_8D>˽#ci'k-+j'҃odr1Y5:?"Fzezz1*k\wF. S@04P 5EkaUGA M0Us`3Tn{`0Hb_Gm2<Е,%J'8xZ F(, ^ɷX*ȥp/tTg.j D>5+hi*eDFjW &3C] ;$m ԾbxxD\dQNhC־=|Bʴ{$Lj!6v8U$ֽx3s˂uf`fүf?6H!KfY#)E/\q&wIqd_Q%`1O]B, UtBbY*d<"oI}vc:*;}ȩ'iX!U]M7 yb=v,br)HN]¯,`~ii\q>GlS[Y] 9_&oypkACJWaGى9cWZqC]syVI 1µ,DKyXUs}[WNO!,`gE75NS(:Fԩ/sEZ_5x!3ػ;WBIbKOI60C[KyPYU/6q LjZw4'bAlMd$\k0%dΪԅb,B~dlMAB>LNWZԔ'#ݙZa~B+s{v{_wj c~K+d^@ 1ttT9"* U |3mEI(A.۸}MpMWv7dyFf`0+=h)M#fٽ"Vr4J}HsHǨ:GvEpz8 wcL<=ޞd;H)v'1|&ZD4pL:uF), Y}Vwi1q|Bf9N~ӥ)9'@2cįF@6jR\>.Z9X}e:-0u1MHϨN)G1&7ۮ)#v®s6'f BW:[1iFʩ\qNȕOacW'ioGe|.Hnޭ-#qW8Bsx~&`m!dh\ݟ\7o ;ѧsIO.*b3>c53eDM,TA\Zao˹ %^]zy^gßOL=@&x^Ȏ+L1gW %ޅǦ`Kl ! K_AL+CLX7N,Zz 4s$\ ˨X8eC6- 0*s)<haju1g^9ܖ-tQkPU" EdkqO% P ~};IϱHoDǜue BuV;9>t0סM3 il! I.$۽vOoǵ*PŲ R<@%FTd{)S(t奎pe52R${#M _cT⬆r@a " tͯk0 tKػ`5c2B2B~ ?3v^t5}8w@lӈ9T>h4&:$OPK()P_?H'/ $FGu),J*y(; 65 IrF^MP<# ŦG^45r mp]6'lgG {$z;4|֠RCzµ57=)+ۈokݖW=:[йIeSHaY`83hهlb.Z-l oVU֦myZ12j rէUQI%}i/X 0#^/ܩ3DNRĹ}}j`ў*Q|h?Ԁd` !L$ ,cǪPgj+j3 EkJfle6dA9|yp1+lKBĦҩN=3W{4Db݀F|R2+aH'\hwgnj-OE SNBi8,!ujHv|;ebo !|~v"'Ιݦ_=`!<{;1v/ .wM!hl$Ab.ac %9иǒ_Em5Aϟh䟄2{b#dzurň;sj&_rU$[/HD VTë] )}oVp8yjL^vK`%1?EMgUoA؎J|.4~lddJ̿i( Pua%;hF*ӏ"bkDɚ sX ~!M5}-.ת:;h(v[Cu"=qEF\:=ps q)1aT,z"5TӆKKj sGӳ[L] _#`@a|)̎QCrR&:dҷU9mI 4Lʽ8I㞭)OD%Ž2@΁N/~$̛%ܰN gY(v^dH2ҦIۅs'؛-44rljfX*)s9Y10[F.E+:^[@ri 9v_c-aE).a}!AS7((f6%@ITc/Xr|t[ͥYݟ|?",!_Ccah3E.c\;U6J\lW -̕1q&Cʮˇ].?& (=Y{yq*?氊=Fah>۰ҳoF QF W a֞<2Dy ǽ]&VZ}":r<0ѠE/X84vldWPfzŠ$ ُFYJc9:DFbmhτu%# x^e| g';.. CZ2)eN)D Zŏd鳥!Af"S'i `&YL.:9n. m'tq4P9!N3kig|IOH\ڻs9(t; nXuYjڒԄ1vlY/6VZ #U*Xw?9e8 ׯ!OI#u]{aG擘a!Ja}L)PVgщ>M+}:]!^Jܸ%%( ) r7CZc9An.!/Ez_# $#<)A~#’~t83ݱۗfLi 2V@,f1zai yƋx{:?b9eA_\ )2FB)%ze,ZB]jI%6ّmUlEWlRܢ װl#6{^Y;XU-+E83tսjpE(rO!Q.!Z>>5FqX~4DIè`2`Y4wZ13/u#4z'8`_#]f4^@ WD]7HQ^I!7UIAD $Q"/=d:4W< *KsKȈfu4:7 c?tWocPlT^ ܖmCP{煐<lg\j B4/yiTd*ht4z*GPoic3x#K!z}"IpBxvE\{MnC=! Tшyu =^ݧV3 Io^α- ‘r62w!UgxA(^)ȷʛڜ?hO9E<Mx\;pœ$fT\G4H  1S(h7`Gy$@sq/P,z_SNjY8rDua!#<:.Qqb HJLiYڰ-1*(} ꡞ AtcRV3_VB^X=uT)m- FQ$6|Uܮ+զn!Bq]Z/^Ӣt7&8as9N2:Tyj4 N7TU^M`O .1ϣ.V7"Zƈ/ 2k6y-*|#%̼ɯ ¹ߩhbdxT CB6+Ԕw IٞantKө}Ax~WyL*Y_Xd93xϬlbOxCc|4'@W!xqnƙM"D "My[7!J1.Rg4Fuiޮ^SX B,`L{U (5^85jڵέc'/Db }%%>HwEğ vس;] Ԩ%qu #%38Px ɍ;eZhחFF8 6S7Wğ˕/{k2&`UB3&惨'94 Ԕ4XF9ʻ=]ۗ·H{7sIm*d_#2U!7Ơe @htl]kλ-MQ)3Z7řͩXiL }BugY8ByûQCiӹ=:`Ҋvi~NNdjZUe":͟?sPW]\L~ëQ9944 х' `'`ߒpqE G4o-C=]UoF-waA!2C߃QWRjo ~OGwP/MbhZ b&o=-d> rMKo %RJd/~A*@q!I =kKfO74^}(6cML.eYR@ ڈ0^'No>'^ZhOH]=+X~T~uZB^D~uѥ^yA~QD:=r2r!] e%we5Fӷg') (Hʝmp͹΍dgf2IC$Ƒ tL|O^f-GO:[ę. :֪Zɍvjp/#Ϥ.4H5ppl䦅IخO`1`ca9m+|& V Y[ p-R4 Ccx}/G,[~DA(s!p~Gֿ]mXM.޿¡)Xsa =!5['\>984U]x~Gqn-x,]VO2u [h] LZ9qit1`牝VMi0d<-zsiѬ~r#K|POU?^ى|tOpB+]A3z`Ӓ+GD~LԆ?  _!0_~\6u@G}5ie`I&3ty@Úf [*qE㖔Nfh0Xv F"b6S-T#")W3/)*CPV 7LDPWxY9zCqopXRfC%13'n,vš3&O! {GS-1$:9mȂ=9Kd`n$(~QS|9jDƙ#2CNmՁ\63Mٷ ĵڻV76tǹڹ!em&Fދ]rh\!<=Jui yp+QUΕzQb=id ! 5mjkY /$q Z&k%.zLx:ӊ[ƗYyViX(=ᴱPHź2+af]~baSv=b&JpV}r{CJ~{ {LȻdҜ!϶!*޽GٮƩI⟨Dv5_jdC[R YuQ &rd#iɈ-Ʌ@B!mLgD!-M G]4q̸5+fJȢiᜆwp=ݤk]u ˧R&d  3D-bR% jM/MzL}̟iD!%H䇷m9z/)F>zuD||]`B^m%|!*, xWU*M# yxO48}QC@3.nl0ۀ]w)fiIw "-ASP^,LP\wWtLTġy=zI8 \iB隈S]6[Í/!nEkW]UB^\MNef/xY?sK]O_"ҡd]i+/Jgc.H|on'vDEi]J93uzs[".syH#HD;ĹN!7*hctVV^T$ޓ|a1Q|szp&%=5 x&Ý[o<u>pz*@+fߐI ra% f/+Aa?#PʀPd$4hd|,cӨJ+)21dⴺY?FOoYEw;1N(>d+|gƍmy<1#o(թ^MYk)p7,yAwn {ְ$ϛЊޕvNZ=Eʴ=aˡ8/1EG1nqߕ8sR=_۱)_mZ+yu9z?9O<؟9>snqYQ*xyEsϿɾs#o.\M^HKƌ $t C+Л-p*GcL850|:HQP$աiQ\JK+j$YD[ N7J@G^,Shg`٘n ]; b`6.OL tMD˜B5Y[|J/wԵQͬ TK2$<.+S31!}1G glynңxlFGd0V8})oxO,#N*YL}4FZŃǯ%ϥr ?(td!Zlf;~|3.6= Z[ybtPdSR_G8>ܖ$Y$D'+e[/QƇ$q'X~T?z |JPzg+Ժ sݖ-"J8-ZQEލ EEjR}i+# i g(R%^ 3$ R,mL)JfIe9p!tq!^Oy1N:bntF0D{oy^scpT~5A+e7%C2}Tw@0mκFjCϰ@H$ĸ Fz( \fu P{}gCY]2A'Hi(d)~FJa{4PeL@8Ҋa>lm6PVd;az悅#iIz){[,*%#\H)s3 :ą1 KDZ bL h-Բԧe&AOn h$3(? #.LxVzq85%oߐ]T ARF?I_=g#V&8}iXj5x̓tvhr!}Hֹh+*rXN ímuGzEItQ${In6qP7\>؝T_ln S&4w]-)ŌSpbO\)X~|X1ܘ 'l6AxǐPF 9MX?8ڽU6%o\~q^vsSg<<\L <`Xg>dkZ^cX^;?{, J3YO]5DP@v ׆sm%Zz+,(^;K3,p16}#[Qix/z+=eeTTQfQrrܒL(~ #Ѭr`835SesMCl/ΑA]\fHLMU+uutܡ8(չxY)df#\ƞMvCgO`ffAXUW3pa2TgA1硪<|ZʚC랏Vα)k_0~N79zf$鑳qoIgc~e1WU=MdIDFBJ-w=@*[GqyE:aGpa2? 0Kg#XW+AjQ c6gc=R y"A]gqV4D@Ԃ^^U_>8,"豙uFRdnXWbaqGn-i)h`2{x=Yc˰70Ojk?~̸Ƽ|cbu,0#0]=KS7qa<ۓC)04 &XLCO7H΃(y/0Y%5i}(0$W?{&G,6n~NCU5IF9\cE8ݡd|_-zgNE]R$N_ PC}n8Q{ DSwz7EN$cbzUgy0 Eh8"hQ&B#Nl{mVF2R |q+ٮٽX9 gxldC笝 >@7(ʐup1aiRBӔ[p^[=Kmx!RyJRmd&*MhOud b_ $_<@2yTa1):]Г|`E|\3~P ؍rGɑ4"( Єf`P]92carEZ1Kn{٨} Q t@`1:aYLۖ۟VٚbpV߲=/dFDQ݆̾}' "JX=PZ<_T.-Tz@d//g\%^/gyZvMBLVQT2Ir#gf2ghp[Á<rG-5G8N\_H}}}wJ&8Yةz w}A҉XJL,$ ֨%Waxת%]j)؟t] hT+H!v.‘VC ~BT$%{I/7֣Zp!Jtȵ4j~6Wf{ ?CFL;*$,OU`kK} ng>n!RPוkf&c8#-P+M@m{7#ᐬ)$CxzjE2Lo1#r4G"|aF c)y$$\3SQgHvbfM"z!Ȃv"p0 gqï$czW#HEö?@b8lBZkb3])c!P9I*bz9 e_Nԏm^2>V}0*EId3P4AF,լ8 s0um2C廨vHIFOT^e"Jx) euy-m~czH"F =Jj&MN=40B}[΃e3OkOG (#-eN–!\(J[wJ3u1(X7fEy'Rv 9l(<\=z]"=n]:b&,e/gL,&e`;4բ4io'Y󶠍{XȮWQp@c:cy=3nl-{pjA`K38DQ=[B\BfFA\,QywnF8eE=;#ƇG¯b2Y2%!63 pa0kS=wJ3 K0@s*yig(VPq!S֦'w{Wpszp,dvK]-F)}1b?xx(u=w 9Uqeg DoMGe{pH~[1KxJr.v~ 'UmbptYJ&Ǣ=]Q;*ފU-*f4|3HVe䅍ˆF1:dFڍy!Sa @mmM&ًˣN鄐HGr7Y"}r٬2lU}<8Gc ڬjK=i[UQwܚڊv'Z~ ߌ-J8k,FP̴:ۃU66q ݽ`+_{_TVPB@ r&)~ɧۭ%Ƀx=TRkv9J 2r8aVVdPPXV`/fJSm>kc ?6?0 ΍0^]0vv6WmYC\4?meUo5>Vz:0`7";r Pū=n186(=WqzZ3Y!mip.A_'F-*uL-9YHdjUJ<긭֕YY^S hsDpgDXi?"o-%MP|AY6M.JеKN?@)vp!hJ?fuGUx g(f[8ZuJ.MHWDKwn.*F?zqs,\ Cʨ6B$helLCϑxVFzh?M%r/7o)w)7#߇* &TOxu?h`4%r' I%DqBnD2ׅsvrrn.ՖϰJg?"x!'(> Mssu7yؒO)r|4F6,@Oq}(L:*vrw2&TIlN=._T2OPd.emeR wr]^R(F6 XK|rpz욍);.NՋU6"!c|Aܶ1Tt!M+do vK۳ݎ!Pw_1n7aF&o;|z&iZS* f#h:AwDi|rg^7[a`*K-'F nsl\Qu~*'QL֡cV|]MZm J@yA;3hm"E1Wəք1v)3[C@uɕŲEÅ~h"yQ-{0]JN4qō{o:Da6PtZ׎=WLX#-3O;Q6ڑu&V@kzSx1+bU'2y~ >[ BN^I$Dvq =y+3%[Ѿ G ?\_ C< DnIm9u;agԒ:/7wt_F8_ݹgMAO;4!V'z.ETQ"nΣ/ńٰ=FL$- +pH~㣐2^ #EG$!z]1e{`We<섥^wvi{S >3g޽ _; Qq21Vo'o%qUg9tX3/EZʢ3O7\IVZA˷@q&f҇%P;{m̀7aj=6}Sp[ߜbQ\jaŁ"b\4X*C?<:Ig05ռuO#ů?v8I+GAodؤ" |cΜ,mvq{g AkX# TѳjzX 3hD%Y?I9a2āZt+n*YO #PKC}.&xp]5Ў[^x"9Jߢi&=-LjSZ;QlX(?иŭڃУxhVNq%^##9ukDr*hEG(܏+1V[ ەaeIs-QX볹ZJ@( #\`I ' sIaJhB@1Xie@ A4SLqi%Mќ.̑I~-_&wVSz6lY:2 E/qP]9W&Jp1^MgS&Mʈom9VMZ]0`ඩ#]aU=VX{9=՜d#Dj+D,@_P&A(ܿpt44 fya!ct<8qVY J.Fy`Gؾ!"F1F`r**j:181lYd(2,uzI:k _poW޹&f~% %wԞ ƌwq-j0zO۝Is"pNO0Ϸ!]lŲ/yL!Cθ˿hD a lmYc@AWrÃ׊``_KL-Ic V(OQQ^]I T>M;Ff aYBɓskdwyOqy._QcXO%ޓa!^/K53JAdF}8l︆T6EMUA/G=4fhF2]|X<1 ?wKհG@8N&fB?ij().c'uV'o]gxU*z!$IK"c/n32_ïhx%"G1i|[$'K]OcKLНΈQAi/M \=ޫ5>TCh.M61 r&u|yor5;ǠBjMV@Ne6z>/WNs "ڕ~W7BkhbS{50@/p=wKʜsUq'E,SVZݗx..}}ο>1%g5x$3Bw~h=^Uu|_0kk@abqØ+OA7RKv ( G_L(XS}%pH/;<<ʓʪgcM" IYW9-W_J tX g!$$ǹ`C|u*ܺ$"AiITIYҴDUT̽cYЎHڔ|}wmkIR>RyW2_DI4QJAOne n0ؓn[zk7Spł JG '8w5?3CQ7.@CaB:ݔY#i}2!Ŋcڶj7O,BB Yq:[^ N;) akIV5#P~> ‘`}/ T l)J{2`HH Y_r -Z%qtWL@",/pTQpo榈/+r\oaόfG)u_Uh9zPww_4ʥ;s4o")!WN uAv>q#.=%A%e4AGtԆ:k w*h a2'q-E.O2da7,;*m2cF-<쐬GO\7Jf 8w1f\PAv@#Z"T*=gTR}bcǭvMm[Ko[ ɡDy#m |=7SI<޴~(~R`:(i)5ܮȁ>ȩav|e\<Z@ΨkHN zp_:Qr CS6(v(ыo%4`;bq^5M0Nnd'&Xٜθt끕TղEJU4֋+8 \3"dۇL$ rپfnBcyPdӜ#C2J4THKcwŪ:+e~+J'(Ȏ# NOjbZ*[N:5\GEXzbl 1DI~pB3;ʊ\~fM prrT4ҡ L_] ֞YZ (%8tqIn (ccRA;K?ӮaiSU߻ٯFÂ>HQYD^dЄ߲i kdյ0T1%هNrHt70gZ`WVt\H5*Gfui;g8 0ӅHfq_NYCCa-̪u.نE7?Z2'$m7꘣ߌwRKsgsDC(|Y2=HcwYI5烘@Ju-LTK]bӫ07BOV)D VFM4J ׏p=`;&Rp)xws0X!V٢d.GPZG|_Iu臄{e=VAn 4Ocz>B+ \rdIUSp~u˫i@3SZDED6]҅ 6$\$L>3_>L=,;X1mcF-&  ]G*2ej~\];_%jLT~Wb%=Tl&P!GKSZDB뷪4N\\ %H0-$NL$q.(n^(!ph32gO;8 & /bϞV[Em|N%w#HˉEf:\M 80\AϲT}bJBَ @1.?QJkzqg.t`Ў J cX\.OkoЀk{&س=Y_[Deu*՘5-gH'ba{Z[cv^3wdg&aVCfГgvr8F?QۨqSQZO#Hx50;9'+KKĄ7o >rD6*vdòo縅 }B7bOI~&˓`tx(k#(/Z,c%Iĕ(JƦh\O$P闼ʙV yq#c>ig"oGktMw "H3b0?Pd 92pSu-U9~WM\]!'b`izR4*PD7>>zC N-L 7H-d"ǴjiK|e0<#_yr7U5k 0w=ܒ v.QOdeΫ\L9{td: b={4ڋe^3,WG$urQ[^Dѕ4M(zT*n9P@'w!5="V{o'|z_= l;Bh"ee9\*rsj :Pv>+d *gi0âh #TT0,HAdCMSh-w' K9 2:WTw3vh1OYb6zJuՠPlT٫ 2}a| VMI # t@^C;P)a$vǴ6РY<'l4K1o?dDԽ$<ҿpZ:BGF?) %+W[h$lLs#?rJ=$Cqŋ„@d]c[SYa:Pﲁ[LѧxPXw*C:bMCvPHY Zȅnc)I~Z>cjE=.C%P opaw$kѓ !Hi]tj0VI g'}rQ kWʲ]y CX/D8Nrq'HnHЩh8%KNH5|“p˿ΔRZ%e 1jv9DBccuEcLq6}#>Y*J&:A{Dn@ [ .*Ou>1uOx/]Cͦ1+9ǬiAX1Wou[OOI_ '$,4/M;7=MpM"Cn1I?Rr` wqӗOsfy~SH|=YA6r:z}l% iw{4m .ĦJ`R" ]`xܔW4m?tGoŒ)ݑ19b LzrD XdL71%D DBDl}*ԪCGc ȁ.}Ag%6; "DWyy @!6o$WFt0Y~Ӆq ûLDy5&zf-w1;0%պ0 $6 EIJ?l*:u'ͶS Ķ"s12P!'g-;8 K9d 7>lY$9*ڲEP|P(KlCpQ a@+U!h:&jK[)PtO"J'>+{X_,4& 3'`dk%w},Nd*baKm:6D8L =[+H|`I3 k?`]' fyˌy le[%sB5݅J[J}S'"t~p4'!kWVB2&GV(x+fR}X(J"+_4-oS(|kp<ݩdh=mAyRJK_מ$ƒn4 ([lAt5}I"F])Կ=> UJu~w!h Mso].`.B]U,eZXav>^ q8ƾL7-u&W8".q |*V>78SRWm+te_&FXV9?31ҌuyZ}fOHWZ3f銀! J2T czAK vt}p^ nGvPJ}00'n/t6\^"iH`n&+2znBp@:W˗[9Huv33$يKSSD Fh''Ba dYD]~׬azLU"!/zL7^Y{_ÓF{6UcL)}z)TCHܱmʉ7VKh!NSU兤!Fl <ֽ{1S06>LAqM|_>' w-.ׂ9p%(=CD $+ #,ujŔBY$&3y?`KX';^y>4ggAh4Fe16d[.ygCu44&LO/X9e+yOgji~Qu3pa-na7ep#Uqإ /:LEy+RKA7շC앮#ޘCKH-P"UNㅠwODKm.0FHz: erAzCKalNt5!i)`<^CЪJ)O&|.,$dl"SpLfi|Y,dH^6>0Ex1̴?C>]+#]x*lάKTûj'Vmc/IN tW j'@ZJҦl]fZ(_C뀏.LMh l;\ǔ I^U[@^, 3&O kAWO>ckʓ$j<͗mZj, y -̻)?QE޲"u'$y Yi _[%@mfG=+r20$2`덹18 GouO- D^Z/Ņkd!+>y: y٤8(rG=wWgJמ]^ g6ڝ&Bהr0\`hZ/xW4xiF+:NVf֏ 1=ȡC=[i)ޖ;00q0zn?Q 8و\'”Ofevf0%jI%]#/γ2RA1t o94L-2T;;rg9ƍ\l͆86332]bT֡B=O G[$fHPmW[ ]dj0_H N14Zu`׎hVM d+8m eSR'^}z61ͼVw0`J Woh}B:B>a,(EaD|h;JaUg?* 6^X zU{Dj;'N(>EF6c=pp#ԃY%mDGʥ7[!-OF{ F35jUѱ5/3!y] 2!\iˍ\r |a+c niV@OȽᖅ!|*+4' &rCһ6uʗy kⓆb\Q+څUr#QE[J*p74ٔQԮ9eѹy65CĩlexG"0"??T\/ Xq ^slU娙\_[4;~i 1x2 jȝ M%E=N60u@IP;\ѩw?{lWyG⎭E%>1Lb\R"O5g)jTf|j!8س؞!r%6eAk ͥI C5|qh4R[r| 7 \bRkR 3[}pmz[J;X&n {Z3dH*ux'ӈVN  ր[[}8l%(2a @yG?|1vїpTwݩv)+ЇfF UDS;dzwGh豴lr=Pgk@u騠AU*#̀/EY{MZް?h=]ȡ) Y,ڦV;̆q--UzB }奅Hi`t9}>}+`!ȱ&)P [hp*j0mi(zߛ[^Ēƴ3,'ptGW}267kN#ta!^_e\$(9_8 M| CRom~\d~hrhڵs}B_3Ǭ}{j樲H[& |)G7T29dEm5umCŭDVLBG` W` r"NRG̹Iq4a@v!jNzwG Q @CVy~BeS) $Ll=MW+_8{NmU,V=JԦzM5 =stXQE?tҔ:0TJU\r-TTrL#Pb9 mRwC %b$;ۖ* 2 難1Ƅ8غ<OwDĎ9(PRvd s]s(-cK szqMvx.nQ[S×"b4L.*$ 'I xj}BNTƴd3R](\ CgO|EmfWL81]kG!pwbБӸ;v zc-EOr H$Ի=VË:xNfη,^_=eY梽h/R@_:h~ %}53 wj$9UMl]46w4î­rjt’oѾ]r?G:d]Qv[0a H5 $ :6)9O땩AQgd}{=g'u,Xaܗ6W"DZHSCyF@ `kЯ ^KZaDFf՗2* NP\V% "m_3=4=rab٨?[^cyk܊tBš]AQoO9IDdx5BꑥҮ:G AZuM]zl5WO"#Iok''8-sWE&¡OEi'i ێ=!|X\; ߻9JU=r Z73> 5Ȍl13@4,xzQf"f݆^Q5PDa:׋a*{ڋ]4]Dxz~u˸kF, @蘯ƍt%nP +F H"@^ǖ`DKϩް}pcw&_. *keׄUx( |9h),IjuˋB>3s7]IɐɀcVM_}Z2dhPTuS[vUU*LoӗG͘3X$+5[ 3v(1b15 @noيEFIzK_0ݥ ܋i,v `2K|MD"5/#^{Mf2ECEFcsX}1(m <bmx9gm=D^{A>U %a#k Ij*,"̘qP })TWd{)Y=T]|>ԡ-unz+SQulB HDnT6 q5xk^+-]k14E%<Nu7]?_Jˮ_)X*@ NqNK7x>κOCv^ Rp M_wmn3A3F& Bpr$|[UW;zNO4V|hWe>w+(biy'8^-eE76L4nѹP_{/ 2&q2[4_RVC_SM@l ]H  niBR )YHR5FQaƳi u9̖YРsG :| yʉ!D]w[)Yuhxwgo7aE["dn<5pZŠXY h OzyL2F]0*4׈N ~=cJ<|%W%J+bg|>+;@]R6E,R~R.z^o=`!UG @?9| KQ5|^hjj'*A;r~u)塐<][f -11#(iԲeL{_g!)_(!4(~JcpV0t Wg1u<=\gBϑ[f1 Y $lʎG[l&*A$*#^^|U[ 2@nqvY_1L%Q3*9mlHێwaWqS0!յ. EېZd-nVj᧷]4]kE %ܼ!s1RSS91_v4H,Z̾k-E_eN<6a]R8G,>'/\0\!|q #XQgldƣƊ /AfAdSU `vLV-qM\?+#͠=00 !)I<,1UF9EW=iɠŒeU-?>ZZ%_&H8Rڑk?xZ _~sY-QBwmS(1 %Yb4͟`k3(Ս?SxJ@,H5_/ &D]9fky5WsE̶#*HAI11(0~ ``? UVJ0Fܯ^=.Jɼ{+a؜s<LP&*#qaW@ԃC;YRRf0}/ҽu" \lTve@3:gp3Uڌޱ>;!()rsVI+À2oO텋~\1oy_$:H:ܳ|QEx;]ځq1(~RGW'\zjSy_J~R'v|'?mP]Ap?P|1<:.WS m2dE0.W4%*,N`( Z~Ё\cä^@a[请— -]j E *ƋITf=aUœ𛄗암 ł@ISz ew}%Yec:"? }'tB8*pT<-0'a}n"!1/DBDmYނk/QVcXwrEVbJtD]nLt` Z '*qV6"dD?X7Ȳ4\qbQ,$>$1"Y) wLAEM@_"O#&AYVB+HeΧ~:Baqs̚F3v"խE[9Gɕ =SK#}wm:؅S> ioiyD̡?-T=7iKUZ/!%7]DŽ3~g}$0&UBW^i#j}W .b.9L3; jQT4XW=ws^{V$@DAdbbȒ tsFUO g]`4lBX[":>Jʷ:J4rF4O݄ϔyW%Qaat1"W jw.10itIU[i'z<0mI;(:V" iPݮv9>)CK8 :h~P3 g׵#Y$&tjuF ɣ, zھ҆=DeY#a:MbH-pK$ q-]sQ<%Zk'KjGn(1>u!_|K(|dz*-*Z!eNZ\+ԲȆW"]TW$)´ 2WEJ Y2004,fƆ$!qWӂ?y-0cœG<J.@*_Ե . { !ITIN?52 4\WwW~'0|0Dz"ʹMp&k$2p0]SN nS$C~o_'+!ž~GpW_?hq_y> mϡ(<'*Gk5&0l#$rz>acZgS1\k @RQ._Rc@7G2RBT0aB@R]sl:ڧ:6)Ï* #I&7NءWE_; _4ps}J@aIdҾ1;`MQL.'&P/\zYCmZ?f^S>l\2R)XM_{پWNJ?\zoԄ{(h1~6$JPu3y4ZXXw7tQ%ecI훚.r$o #` bK2{b3zX)"*Dޗת7lE„ǖNµ{#\By_:Hg1;&޾T!.Ͻys[HA/RiU)NN9(ܣ$hJTi~^:!;!lްs-@V>!yPgnozLzmܴ»' ѵpEt-4ȕvhz_C-ӓ0MSLSw'VqNvF;&AH <& P&n5SRdQ7^n#FtN1%SIǘsW{Rz)3L5m÷a 1w#(xrSV{Hz |Fİ {55+L_tU~fл-y_ <=0;@C{\[/hx WSߖ$Ze◅˙ `: 7UgI#Wf?"`d۫= M2? 'FbuJ:㻝lƍ/I3Z`'[΂dWݤ)?v~"bz2k7$'lN"6.4dRO*r$^xJ`y%R*tJ55qgr)[asbo[n!R#dЋT\ ycI!0VDWjN5(A6U !'Y  9ߠ7H+' zz},[HuYhEvvrD}@"BUȌd垝+~|i4A'KbhpEO}/5n_ p_Tm81( rϵMǡT}QD2H?uj?/5, cGC^M.KV[}v:m2p8^ąaw>RtR+{ZGR'@;]$I-!ZC C4 J*岄X~|cY|g*AX&9XLWod$Z^>Yup ]K ń˯3eI [_m 2?G,i"ޣ '7s A!rW+KӶ=bA4-['p䝖C-%9WS .c7][>8,qɩ)p7#)yj'1--NORx6QU,ؤ@_o 2`|LOu!me4lOrѡwZRVy#46!_Os9MpVJMsby!Mx3@SGX G/Øʵ, , ߍyi $k2 C#L(5@ZOW1)PyKhe2E'~9;u8a||N7 'ױc ȵ ׻^ 㟰h+d|ɯwSn_ܚ#C oZG5P+Q,_-WKskcҾ%+ksؿ766^V+LNJPpՅni+T*'!+oKdז2sg̙}^aIr5 M_(w7elD^pӵh5p?eJcU_#ج׫%-sJ})ZBĉFTCAEXg8m}zm0nD?]NAaclERN05a,.ЃtQj6 Vϵ-)_Dlf;Q$9]JBQb#gvBn8#T; R&ʎ&FJmPfHK}' Xf%4e'rK$2/X9M@]J\"4X4Q9m2K,.r2͈Q,W7H#lY?zؔ<Teײ 8'VDjs*B] %Я1ŝ#9ELx!z}N2Lu=VB^,T4U&orY+"+Vް\6irM~*s/3mQi${pr2sa<KϚϽ*pyvR sQqȨWpDAKm95ceT3sؗkcJR(btC !ɍ?2CzOYcJ^:ʥ+xN[6J?׊.OR}s]#Qք<)pq91۴!:TύC`#H r-s p %p &D]Xw^#/Dv%K2Z盄NOR9R4X9f-צ,}GZNn< AaEx_Vܨ)yj-t%p76 1:H n9B d !${Ut(gOh8e@E _h{)9_LÁ*5jM t2 1)_`?‚w]2xIkXg>ԈjV*DE1^Pb&#a4R[\L6r)`?G_Uw@RF)OXB` ;sGBPoŇp0jU)'"/ŀd w,!yӆl |cVR:IdS*By+R%a"vAnnS8cxC3!awTs$RC|:N?O ;SN!O\_{px'tDjɘSBFYĻνͻ*EmZMMؑȒ9l*vD~׭;(1iu0$fS=x^E;]pӷA}{1eɫ8ɘf|ot.?IsHRp`ì<1}u s- yJp悩< ƻ LŘݡZZA{w>JHKu^@*T2"fTB5L{BT Pz[oyNMP=tw+mz&ýFS"%M"2.׹N=5dZj$`/o *J]R;?yMu\g$4q_ɕ祤sC{s Gav퇟/Ip?5ޠt;ȰdXn!Ny1sƿ$NǾk@$c{:' R t]3p䞖ذXb"0߳ZstZfZ/zwHy hNVg&+ ʨCqÛʅ&N [C41sԟUycq/&q*6<%3FPgې=S31.HQRNC'm_zS}Q _{ LTvE'~ͱaߍp 4#| kc 9q_:QP1SpE\+/)BL3ԥSm:E`< `j 6,N\p_…T9ߔ{M@6ςmdM vN37~. TuVbR'| 28z#91"Xl&+h+5W*Uﱜ10$(=E2PTơdDEU+h)( C+Hw TP,{/ԻbUjZ!3Z#17{M#?| ?j69/l@vP8#vY&pscŘ ,Z~@$;u6q:li]NFd0;^ZZZ".2W 3F.*\` zfߔJzWthcKKK -Ixk u[ms.xkL>ih\~Uw+(ۦIƸXGJn[}SL."W/XVPVH s e`T $r2ЅR1~EhUQ8}>hYr^]v17(KUI5-M+f;pbY") PXT| vt4 ]!Ә=Nto\ a.c:켱n@=an,>B,y{DpD, MXH21bnSҶ4&)X'2G)@}޹lw#~u}٪*(Ã;gz,L9=`|Հ\ rpjrcE:&51=s╝&HGL,~|ц~[+'Mk wC;gOzbT)LFƻ{|^{MO.W'60="'2]CńM MBCU.\Uv;)4YfZ2!\7S3lqujRyk P'@$^! q l1 [M`JrTr\0L!I# ͸pvmtnfZieKUt]G-`\rO Cb\8M|}܃ ,~Zv9g"#LQ[Op/):FJPIN%P'I{曓aa侖gmQu4[[iOp_ChHlJ_Tw*KUH [KȒYЍ B1|oɊA3N)n+E[M%> 1by\"Tph8U/`L-D&nkTWɿt& L:rI"b y c}qW+48e腶.Z՞ ?9oy4&%&&/YN @|/u َ_ոsU, $/}p9w?:IJefVS,Xx'EܛU@tEƌ8;j(FF⛍ɚa$$f1jV5$RZ/23OpX|4>!A%g_3e=i_xKYÉܞ 0Ń"i`ݛM;ѩ|cdwya$WcWOțqynPU<=}m:;'[{z1X}ĸ*AXU'nyK{$9p2[Р'kjB;e4AS'Y08"IMj:_'ެ pwR$G)ۗs㾨{9ll%@ PM4._}V;e>x&]?A@nsSU}8ۺć,W:y;DV!9wTÖ+ u-UpsT[>*6EP(o]NR Ӑrw p׋?Z LQ-!,;3eB?>/mll_M:7HIf`FK\M3gTl/&饠2ZLS%k}9bjG~YQ:vʴt> Xe X6x2D( T:WD}{7H A\$v8k/%yJD{0Զ#fk \o&!hykH?CW/`U4bf/я) ^&t4gγ7yˬz}]^#p6Ӏ%:)ڔYtGA%V6E&YMD` Cq8!LNGm.u7?j3炪HUf0P/G]@4"QEʛQd`D"(MTFf :Cxy%,txOBǏ#m GѳQSֹxFWfJovSŏ@C͐-?i?sP= xD%`[z4", Kzfel6Řz>BXH WJTg]ٸ{+>%shW ٻ«>D8nPm&ywif)hvj~ r?Ȁ  a<\ȾKZbDy u({9{D:ư_(_!-ډr%+*y\/S\PqlT4L ğQ Ժn(<@ߒ_pפ^ա[镄":EdmCǕjqH*'+Py ͔[BGCmDHRO )Vb2K+K"v#L%D,UVz~lʖDn]sXCdutƺBM8Rpk E;]hu7\Ci04++\i[& 4o:ʌόp[RT#u7$Uߙ) ΂IVͤd3uLzfuVh}ΚsY{۫8 ls",rBdZd 2K$+ HZ$p4vV W͂F&('%L~&ˎBR8' ΠSk[A;4!@ݦazw-?b*hxZµ+_xH!H"J@%?uW$cK:cx'ۣ*رgB!DhsK/9я,+^qxlc8xã́󣧼N},D@GVH$O0?, տ()ll¤i3j7kepL+;E%|e__+q!,2[stRu7 >0 $MDq]F$.}H@Kv._8PJ/]I:+!GƝ]ԟ_ e `uDCZQ* ?#E_J=H{cS ">eŶBYF ! ó#RʎE%̓kAɷ'KtP/Ly rn;WΗ΃l|b̓NbIi _pAotƶ3ƙai{?J \KײܬoGjhՠnH ;xf}&3oڧLCuwݸLgra-ምYO 1C%C EYNê4G+_w# PX B:'_l%X *6޿F#KP)}=YBUc{A a,C5nX IշIgNuV'bٺS>sfI` 7o49z㼔g<^$1̂ZˠK*NK#(+Hoa> y?T `h'^NPn%RF]^Q/V+ޅo[ d^ׂz̅ ԕ|?p, Y`}W7uM=k_QجMƉ_0>G_r[Z`i\ &;&s<Xhq|aTSS4{FrR(V~5Oh)FOdsN Sv|9T_z(i9c^.'U!Ibh"P-&& K0,95-Icm"UC^P%uie:xE,;Co >Q[waᄐݷ\3اE~)'أ\4rnq5Pz0$w_#,Mj+Ptv1H冶.1CUg'Iqj>B~y1Ak0 %s $xxÇS~>Ƌ4fl9T+ShwF5C-q51DFEsoeH"Uˍw0E/a2Q£ ..V@P׀!Hx5BSeBFbyĸPכZG<@ecpK^Mljx/M}J(0a??rXJ|r|ڞ6j3ֺF)hnD uH`^є6BL:@靀 S.|/FC ?Mz}n1N:.btS"だIJ* Y#zj%km6(t3.!7,&)c+H|qzCa0|Ծpe~<\Z }zɚ!KA)0P_Co¶עzW!Gj`B%=#opbDA2kbBfxMA}qLN:$w[MxUFݧR"@ #V_ۢxF>%V*l LBѽ0ejF7D,B0KKGQJH' f|C"x=լGӐV7`:ISKrMS~Œ;%;.ڦ}ƔՐ&R Q{!Hs&<+4cТZyġEpe$!)}9~qX߸-"Hޒ,ǙW/)+Mc1H#:A6JudiE>Gx.`mX\L1ŬѽP*PX tEw{4wY`{R6FR6 ʳx BqlT%&ͥÌR<,W0b9N6I4Y3]CvdƱ^89p.鬔8;|L9zv/} ,R"3A' wb-ծLEU04ytJr\ie9*X:ڋԕ*F1 ,\lJ`~1c g̨=2k e[Aǻr?+qd>f`?fJש9>PQYy2̧8,6 |KO{F<2g R>/c #{s-_%ZDzaP=0Y2ao_U,R?޵3CjOrChC9wdʆj|QH6&`KiU̴gm3b@|/w [K&P| ޟ9Uk:d0vQ1;Qզ7{^cJ<.ƨvp/D4uΡAywS^kp)>pZsn4!$UY@ д&cJcŭWaUlAx'}Hn;VUIr4L**[5PAE G.Hc$_z2j|/Bʿغz)G)3,QIЁ_~ fho)> BH;gсx5,9j $N ЯjJ( ;:ǖ-:Ua,V^LLϔ,b30R 89,ru+o%19ZIj]R<6;@R4lq!Ӂ]&`nm!ֈkGLПѝDx*wq`%0 :b}- aÞAϙ%3qN>0Eݣ9 6THA(Z\4P40#\'Bu. } eqh2w{PQC_&38X{x((j2<~%ܪVS ZՓ-vh? 㩃/% ~b N \6bȯДGco){,gD:/\,SZС͇6rښ3PnL?z<,{WڶR}7AqFp~|Sy4ܪtL|峒ZŚOqr,5XbLяͅ_hL77IМ8Lb£w gvTۀ=A 38#GPLDVi~zK@7ePMxDZa lBU@&b^UO1 uch?67%YOw7:И!z)+m1z4C(lf$<˙i9Iۼ͍[5NW|jAkiL{PXqsáetЙ@s3K7t}F'G E uz8 |PL=.ELV { |:kk >I(㨝0&>)uȼMNC] tpKĩV b03)Aryb\+]LcPib^1^Um9LDyL[=fǷf.:yEJ3GY.5Lƪ{VxKAaoİXd-'A?a*Iq ؏?>FAeSТmv}1@_P:쌓 ^&綒k`K>Q.hJHsK{$'RuD%Jwattuv[a UL]fG4"W΄=ωO)Kd!7+23]O|=oD}lZOPm?>J][3M{‘s44OryFDT6cVJ7֊4f؛j8 7x(t:=:j 7Zⰺ TZz3O5٨m>ܘuk+)c­Sn]\}[y=Dǰ+'TwJ TD:~8Ilr|DPzk1~m>$o˄!< ̯)az ΓJ9@0)Q0Ϥ^-ըb*9=63I)vqa^5v}Uy>2'H&Oq$_S @rreY& ggʃy^_o#9ռvr *) %<-E AyQ.fGhmy=T Hf*Ws5˅ EL+xa$wxTVYTB<,2]*S)`ɂ@J4v-r95xfZ]dP q]^*GMҫbGy܆IKKkMxyrf˛D mpc2_?h@-wfe JRVvh$8\g_nKG/v+95jy32o,m)ٯ\!H!gL`x>v I.o~8[]w=dWH,ho (UDe%Op;pV$2Z3Q՝Xp<,OBo\ELo!&h9!K3SW&KA) / *mut*p]mZ$sUad?0vݦ1 I불#iXƟ"$HM!BH 듇۰1c`B!ͩ)}PQfA!]$聝p`^ Ц9\ex"K(C'cX3v$<.CU0Dk_fɌO[}~,Ss(]҇8cyyhk#ՔD,CZۄ𼣔NmR7*/TW.O<%Z쿾rd#$BZO.3)bݡ~pOO~j"_R~96o 6L6]{|IAN fҝ=^([GzƼB?".VpQ ue>H>Eo-씮 1#26e#;!b2Hw)wT;Q2Y<%78ESZ@ߤ:lCu.2.2>E򠈷E[}v3*|0 J6E+t  > ]"9!rQ]̙ə@S1:G YJ 1ݕV  Bb6ȢdK+:i,ur6zZtxE@Z ˆ.!GD6|fdewтKڙQ |:S\ DlMfq2ǔA;GJ;b9ԭu(Bikϋ%4NC+ $-@OuĪR>QmRw1ot`9a ;mBQKPsŎLZc7Y; q;ɰ\Y~]P2>Z"ȹ d XH(qc WtpEB!A[lO p`FqlڕjfFKϋ I6:T=0ǥ094b{͜Q5,*꫾/"Ku6[ KG6,ζǴ”A-`*3ؚ2q% ~YU@[ %7UА+]K_kpN Z/=}muCBur+3`V? /BN ^_* ݔCj~;%U6ي4 _IEgME-}')`? ~&Qava D t=FzVZi1qG yJ1FUPg!RhD!տ:)@')(=PH%Id{Y02.4dכ7)7^%;(TY~ Ӽr+QHPM+ژWe,ěv \=9ˤժkE'?o/LA\xlFJnYڒBP$T+NB,PU)MdA_klH-[v1|H]fP6>3( kt`9qtb4C6$ }ᘄg6-#6YVѵ:)4 I$ZRYx}"?~5Ir}hh>ӗ=zc\^LcλVF;@UP0 ެrjH$nJ2݂U1 ==B=/w}-)e}/%,U⏓ e!jP=;[w/x lˀ?QU=-4\fIsY,C~]oJ)9̤C8RKҕ~LYj +x=@…='եK@J= j 4INHm+wlNN ?ddDˈ>U"t>lWZ' HxbV])ykd#~䎽iؾw#\K퇆`,tДIhn;]M뵅-֔M3)R;=W!WZ tmOyqsMء[ju9:e+$b pLSJ닓* @~UΠJ]sQ =6F(; V٤gԄKx~rQBV%#xדΆ0'@>7<שӋ5щE_u~,'^*)6jjnXj s֐T Jz3XT)CD@zCb!hx%=5.&pm -xDxz6 ?4Zj9 !8"L2k *=RK>r-qN}u2ziGC:u<5&C[\ M4-r Wї0m2㚆W(q3a/&Fz?t J}WӠ ?[">ncyqH7*uˤ P6Vʈ=0̣>֣˝͑Mp%Y!"[n`ڄW[a"IB$cW*b oS +AW"m8XyCI_dO6=E˰T.wڿ-nA;n4sn Wj fmixR1,{[oT"SaE00D3l)`bF530"0Τ6v! ;%ʚDʰ_[ul04x[۬wgP_FZ{9J_^ҫz振QVYVh`.F&S{ L&Q^}&]&1 eEzreMrt|r4P-;db;?Ԅ;8Fu6[+p=NRe1ÑBMۡ6kp)% ,LOj5az\aGf.m: +Viq~JHyH`/+d?¸Z cA7XLĦ .ClҧSIοw!DU3xӫ{DϽ;*_bgsW O`QeVoW— /Q| sAxrB$u1 L)f_'& i\Xu>^n\Pk3( @L˻Bdw-fA'u d'cgX"IFM:B"vZlbO USjLC0|I_FaJ<};V)#8t'#]yp+lKeϛLmrm`DhgK_ LplkVdAf߾Y-9~g+diDBR.m01,.ZeVLJ !U YR>nUdp',O ‹vUI?9"L `EO'FnNz#w * * =uԀ@?!*=ԽQ[Ӓx*hi17 )K$pLtvAlO] LPqrM0gnĞ2 X g|!L>$kSun^:k+T.~5vLwKKaA[|?AQ[%0t~c֬a`u4z~ѴcQ~Yڝ gM]Β;R6Z:;7@I7ѦܩbUJh@n(mdh8C&ŬfM2c:M=/|ߊ{ |MZbυ&h;ll^]u.|#4VH!ɌU2} B5e#)Vb9y ۭuwhݤ1\v%jʧ$tn~sN*,SȚgY(_Pi,=v=e^dDRxsN³<!KګMHA =hs0Ŵ!yw3=>zrw2+zB1`(+n bQVyZ/ODq v/{!.Asd~4(:BF؋۳!eKmd ӋREe7n0tYH2ƭDVAU`<~*O|`e ]pfKn__-;?҆lM}"e>}C()s= %+4cw'9o#Bgp! 9kiJq#]|\/6_}eb Zmb%ɾF,ߛwS<5(J4vg^m KXk0_- v2^#A p<1} ,'t|\ް͂s'8(޵[Ԭ@hFRߤDXCQ0sd\Xޣ|W4>zN^lJwY\70"B PZYjd+C٦qBrW w;`fsLz3Ēm 9wQGh_2 q/N6bRz?g2o t/D]aMzO6__ %Î/VVgRȩ^~ ؀1uh-w0HCkxܑ@JCF8Po^&ꝓ|))EmS 2us_J <??dKw9VO£²K8oN^ʡ\z~XAYdG#h泂huTۨc5rF9&D|DbKKife7=;[C"_CxUE4AKKNh{?,jQ6̀)zfO}B߁̪1&9rYJH,2[A+X7iU'k(͏3K˭xZH`WLM}$#|hԌ.T864nZ1ЋtP<41Zc uVZ?Ĥ6Z%=n3:k\b!sWOweYUmd׃#@`qhVC{וFr1hDFŏ@I ~w'AJ-JJ] EjJ:.rpab wy כ5> /5S'D~ʒIy:AnRUHAJ qu{Ë#9 g#G8p%>l}`sm7S;kk}#pDAU#sl*b͹O Dٔd~rua[9Uhs(yrvfAE#)aioZ 7L"kfcx ;h $XUc2eWp+W]JxV ]fƗ|vDB2-3uuz2n ӠnXDh4Ts`;+kH b/Lz[ƮXLcњ rIT y21h<גk,X.\kMMTbBmoՈ L Hϐ1\0A*@A tRb6(G 0 ԅI 5Utm&is?&nF)Q0/|_ J5N澀`y=xEKzmЅ+}{;kk@~֝9ZTδ Wf*;n;|g/Xه2NO6ԡo2/QB#dg|KRP x!|i#l!}ƚypU5*Nk\#``ôv݈RYyeQ8y."')z_{5ZɾT:E8"E\}6kt!.DjFs@vk8¤Frڏ2`27dOg3\T\?{1-h ͥf_lp(>}4p fޯv! ~pP0 `[NA)/*Šw>`z#= _):l@;*c!Trx+3& W\ps - + 8# Oȃh{({sz)R >Z n}tKbb+uf؉b_y9K'dJ8`>| Hf=~:bk"N"k9r: GՐ&v-)!'N FvTF?4B!w0Ѥ2|Y&5w},ͼt7BHJx$yј^adop3/V:3S-"̸ EkwZT`+A@s1FY;DvoӄyJ$Tj')ZcP1Ecqlf>bhҏ!7 \Ib! #'=',D6|ΓzC4cʄ;XB<>cac:^b| EDMTŶOaYel7f JhF?. (!òGV;b {%kLlFXcP4\OZ^N  .W^ɐTJG o&/V0$sthD.S(O!dҾ,LpWϛgӱ*羸n##5G6yAktqDLU("_{fAY t\ ruY -'ǰ[Rl[k, t6+nu鹰7#þ-}.!O;g\F랪b*ʣ |h\yߌ(yr6='3Ҧ?hZQY H\Y'+ )NDUR)/?R$.pHN$N;-h64AqY$y>[@K]Ndiax,*vtx&/$ |*'gH :녶Īa"퍢ӪH!R,IhSQ9ac~I qފ[/C zaniTnA6QK,Y姚0S柧% "H5{bTDHB/ rO >iItQWq,6 ud h![pOl>=4/T&q/LC]u  #7Z[Vo0ȼ!1/JNߧ9<6"xt:K%dS+ɍF휠z#xD},x. )yjİD R {]4 _$`;?a u U1,Bd(_ed|vM^ħ9s (ɢ{9idCR4F)+`@+6.l$FtLy!Xg_?_O,#:CwZF?Y+Q;`\ώs>mPpՎ$SAK: 4.OrdfUuꢃ]@t3Ktv-C[.d_x ЇzwdO(Evha鞗nAbxk;\ǩTr<Ԍ/I[2w5 sq-s0mǍم[99%#^KYu,8i.cՒD9[w}7*}r}X4ڨ! ^_iOq:F;`A>4Bf h-觕GaXSp%C!~rGB^25/CWl8 J0GB{ME'D5ExQz7)4`uDB{ \ŌڵT<|ǷW*َMgLĕ+2-Onb}tYRx6qFU`i~ Rgx6Ŏ8~Lx-g^Wt0#d9Wό;K^SH-v4m4JiVd^1Ӻ&o,= q!|?""zڽ}:N#i7;#XX] j{ NqnLHk!6DZ|y.BK{^$ؚV yQ9zP[*| nc߫Ɓ 4,xW!D73<+k;Gzx bZV`#w!Wޯ ]ȘN "TYn4Y\s pBrȂ `CH%%Fe6u?_^/[KCQ[.O)?dٟ2y{OŒ.0g(+څ& 7gM,rnQr'kc0@sk uSdv)W+;RHpK|:LlŹ5km)iq';#I)";7nwׁT{)S:GRxڳC\KtFOc; gUٴym\mfm1&IH! ^v=ӂ;}lA|_,NIgi7BW[L4c4\ћ/y-}ɜzBrD!=tK7lsP';iQ+`X朒2[/@Α-_敃 ^ʱzWtXLmxjRo8Tvx#he/w Ie^%B-B?Q/N S;}:i:XgD#6u?wp8y>4U'{trd4LnrE%.{1\Q:Gc*|A-R }F0HfA6m̦thnwLMA0ye0Ǔ)#¿Gq.]vh;MH ߷g¥8EbPN@t)e8gjv%mTK0?Գ;k+eJhc=\(gGYQ!O+a7VQeQXM~5yESa,d! >t`p(E(֒rn@ &Hq>vʌ1; 7qKmveYՂP;N}X"#,f2(滸rq~ F=i#;` a[ M+8ZkΐK6oή[`W9ӿ F$b;j# q}[mYK: o)xNR@L}_:{~!,~h^"`/&8WҽϷCl[$anT BLn/o}=8lh72!'l?T1߰7S6 *}MKTGmh.-V<钷VDUEhH{CC^KH/ms\ F|\J*@x̰ Unp: fhMpe~dh<0W `. ꐺ!E[;C[)ݩ gdjF8cÓG,[1:rjPthui_e:۵,6r)]#Jz>ؓvWpZ,-+Y=ť~*_+*h͊9=HVi%˥5/=?987S2tRc%vW K<)*M> U 0_%O sMql>AmS&Y@Yz{ܶJEZbCSCO|Pi|2O!i{۬`P"G#=-sG?K"΢" LFO~z9BiӐyL3% >j i>,7#&wE/W! ?qF[[hqea5ꚡ󪠩[)[;.6rkbQǗ]*=/=YC^|w}nRv91>\wٗ(NaʱOMlpPQ4_Ȯn$PC`CDn"m p:,^K&^"C-,>7)a-SeGD(XЙy^E׏~M;/[ƕȧϓ^E^6_\4*'q R9y k ~zp'teSAqDaЮbUoFR.P/jr{QIRv,` BgD-[ w9(iѺFtу`1%Hioڢ]N!g0'qȑ2hrhqpu1C p93+4B-:6C;w'gq 8J,K#DeV 巎;<{ ׻A~6łTJI[_ 0<fXb{I-;Bj➁}#UIr|VP_V+a^}%Vz?C;bIi T1<4Qm*<2#Pl6A; [ou}@s#4Og vgE;(40$Z4wP3j%b"$M4z\.뿜&^at[ T 9FD(yK,Ǐ0Pְ[Ǫrx\a-}9} 9yU['ڐ,|T0EQFas1E .|ußdž UeMN\wST-cTYq r8R;W$G*%#YqhZ ps!Jyh4c n1.UYZi^ca4H#|^#"rCJƯMh?FC祜 pP&K3ci89X`87Qm5?QD::ى= -%)Va<! B/>kqI*rcxQ6Lc)VqGP^%yg6aVޙ)š@]X7V[r*cI=_/g1AA۸+S1Oi/Dˤ_d}Pק3[N@,-fȲ<~'R oh$];ūRͣ pu#bewo/V ʴksx9s+{;A\]{:FZAtS7IJ 8]MUh j k {G&p aV kXZ$Z%>{x)E촨1M;`:O)3j ÚUYV.C5(>C͐өP ~s3 /ɚǟd#)'-V`o#gS ߁8le\^9,sY7Ft/Z~O ^|Թ\>nza)8G NjaڈG^Wyr Z{B*7X-) "pzUIoYͨ jQBD-.BG[&>68˛0Z]_GqkNª-&L!!C*T.s A4X>=D4j'Vi|f~mSivtE%|\aHT"VX!YA*q=qm֊[,o( =dNܝsL$ۉ N*wbH]ݡBofÚ(&T7\cm|U>r[NUMj6qD콝Fnղ$*PDL e>!ppNmɒk Yl~<_՛n}KGϕ*>ýI )o,5|!%w3Hu^ +ⳬtn)0J-:}0e륅6dMy^`jl&떣Z [Z&sTSЎ(   4,I08jDYt:,LZ4Ri kv`Tf"'cx@{xEӅuUncəp*#|Kҽ= w YIf\&/AeȀߋpp^X?L}tRUbck~8\';}M>rjL0.(-c=(I4Vo=-EV |^J4$ ]K8]Ѽ| xfhַC8/فS x3/~҈H^} 8E ;ͨ6g 02Y^A^A}lN>QeN&]"L(,A%[*$UD*$AԨKWb3|=\Ž&bcYdU6u)'vo}J0miO[.>ޅ. HJ hx_h#8S-]oàt7),^8R^ _Z"Ub 0;q%D "ZZK/i{U dG%VKqגǑ 21q5[] M[٠s*#h1*1;^rglnaBXjk3$=gmWkȥPP\;Bhԁ6TB_Azmp?\X0FT,xYVmsm+5Foʕ.+TI[W&N#_`S_/B\1JD!0n' ^l H܍ wI >hx)ܯoOghӠ&'@$u"wre3y4DpV,2!PZE7k%ǿzuSdS&2#H yC !Z!? `.w!ߝ'`E6U=htiκ)jEJZ7)]$*^D/#d!H#/ R&.UR|moKU0Caev@t8:ߋAJl R$#Iٶ,EZ.Q=dXg1P .٥;0p# QEW!wn2oV! Aca;_슍I޸0;Cvo<|)F pāE0- PSkk9rCo~3D.Kʡ k/6DaSE&)Ӭ:AƂ 3G2Ă^:Hs?&L13 QHx A( ;]d\^C&d$(2'G$"7z%+,]N"c-XaA;̗S ^^ -5P`A(wLP2˂ҸZ/@a|3߭o pkU NV^Dѳ@Fg|–5! y *g>`:TYvۊW[ .]b3{MF0۠?x uWO%wqŜ2*[^6}+zhORe#v_V1%dTO[J Ўj,]ߠD,HnoT4~Y%*dGtv ~fR(snxN5Br4 x16u+{+ewyS-Q!:ҟƳL2VgvSU Gf`"ɲy"̼qL⼊|}Ŋپ+e˖Ft(cHlJa"_p$p_ou"Kk8ʄ=a#\N\<>FDzU^=[~]\SG(6|o WAVq`[ADk6DžY % /F:ji[z rڅz<8Tc2 1ݦ(r)R(Ԏs=̥$ҊM_5)Sb-2Z_(rxh ~Kkqӎ{f!$ǒ &`ȺS9IZmxpS &㍓F 2 Q U疸r@ Ι*L)nIJyzN\s ҴSze 2蔥:2xŅu%B:g05^(d&oj 3gzwC2ˀw EaيX>˓lI&e7Ϥ:2,jt,YnfR}G qL{,:İ*p]< XR!6M[fOTJ7-.94):cލN**:u1~ћRJCc4ÄcyoXO߶.. ɭa;;TƸD}7wVn*U2&p3ijiH[y x^3v]ziy6!iۈĵ? Tx7Y_l L5 %4Ufq9Cu|% Hxf2؊ԠF'KیxX|Vn41jBl|Bp8@$֠$x5+b1ڔ.5ڟ3j枚U/RcCBT+ګB {Yb&vg#Y|γɅ~N^U?d&l%ciH<$I6o܈U`%` Y vSQMYX#%%2x\iDH9Ĉj4Cϴߎũ{*oC¶):6}FehF_T,D3W׹mhْf3aH^ϙ 4|#_ K`QZ>Ml$#nI=߼l'ZRf8Wc ީAxlduWw<;j&EL$kF˛hpqپeNLx&lѾkOP2@l¾Rω;VMz~2bG?oo6p0X~m E[$話磻gz:_uTj V{Ay vC˞wm;9@$ :Tdca%3^x@ We +$up)H($mPV${ FDRMOAXGv 5d Xqq'ԧB(oNѺZaN\3Ћ hS}cY.j RP Ȋo3@e  'IW Ee?yoA?uJrs`>%\@C;v{b tD4TDTKtH!Z"jz2Oqځ^ ^Fѽ0U@/h7GrӎA*9>15JgD|?X[H( >m/bݛ2 ^R<ʞctPB^ C% σb 8$GHՓ4|J&KI2X_5Q **\i`+FLsADK (Mp݄Yv[fGGQw,~]Xcs=Kb8WxW>μYܛA0 #`'k~@5%:tj@ׂG& `v*눺f4,WI[w =roC"g;jJ^>cF~a$DT(C|V'=EǭlK|$uFimA>o$xN\#Z'yIBhYNt#A\wHҗQiRL @KL׳( Or-Gn0ĬBjs_ޜ<;K,D&g:׫<( HnTh'N'A:$[KM"lOKhjخʲΟ B!0fH8CVz^R| 2t'JH|f9U&sD>&n!Q)'0D͠ka 1=| њ3> INDԓL>Ss;OaB^jgR%oja=\_x$uIdrÝ"RthLO+Y *lc^ 9  n=)b#O<!W^+TS+`0@A?84.PZ X@ ryi!řF q/9}RҖˡTMU/-ߦgx `b<G$P&i$]{dZbgX@:8M*m^ ,I:cwGjRѢ9$th}\jJ6ʗD1ޚ[dLd,tǏTR4?\{ fV 9ӟ`1L-=Sst Dh=VsܧN e{<2V85TFy7{ ־)}zvaN~,jilwP搀-MOݳwu98RkvuD?Xl5`Za nW }A7St;Ʉ>b?bq-Qw$.c0HWg`f%lqÝABIT&@O*z䤗3^ؠ&Zq"n^%xj—uh(,M3U40 \O%-Y^ oҴSZ(2>M[l^doI~//WVe VU^| N ҨF^>ce>cujMI*;e t#5B߃p7AP7PS]U. -my+Vu8I:A9#'۞HpˀtJZOXH6]Nr0 M"")3TFݕ벵 fuPy|abqqoO}dI?jS jFO:f͊X|Up\+4 lor|XIp>UZwPȻa[;r~R>ޫBTu $NHHk(Oz $)&P$ N> lbkN-!I_~XU J{KXZx%J~R Ɗ4 o%EYhkakolwnڱbGSv+N.՞O/&W|QG!ccxgqc+;x:(#R96qMajЍr*i:yyc8s'r5ڥAHZiWrBMh8T8\1Zs? F7tbgtau1$+,xo/2.#=_P(2.;/_D6@ "ƴXi-^}K8z읭*rJm["i/_x ed qj)u8ą{jVA.cL%\0jem6hڱ3š;:LMjބr`MR^Ɠ4?.[@ۋWXK1Tk܎X"x&5NhT>k%H] sp1D6k^oGgR\44,z7}!]F}#1޽._)".pǺsج--Sx(k &%Ya5jp^bSpM';w3uS m I*GDg쥺5%0n28}s9Fpq KZ BR@ѫ9-\&I<\fdjBvwIO܄osWE^ۤQN ׃u;dy6!B wuK%w0x}5) 'g*i&Ε@ $97ka3NJhyk E#Qۦ,D7nRz QaO6bJ%M7/l P)Ifq`WӁU@wU拏 L>V\KG7JJx4DPgS F,I[bw'qqѢn;K$'㔧az;"deYcZBwl^ktXcja0oR# 4cPNw@!W~kaUiA\P2Ҥ(8L9qLl}g Fv?Ёdkܜ36J}bgѝDmHhdK2Z8SiJF\ }|s/[ 'c^mK,F?׭+쿦CiD_Qk\ԇA:ff> )!~grE"=D8,aL*<ܝFpA]na\+PٚoJ Nz-A+EMLW.]T3CַG4ң:^gN Ջ`qB-|JXUf7Ti3(.`hw}ĸA< KDP]vAAa;O»D ߌզSUYfc0{ݬwNKr!njU9(FE8kȠm%!{xsD0Q]Qy5;RƂ&KmO$¹T}]ޖl\)>z;otu zp;\ک?ZnC0&:qCZpdhD~k;ܾɶ?Z"Ͳzwz8oHLni^}}N몳Id:N:DVE R6WĶGY2*Aco(B +6 M"}:H$(ZV3ɠ7:=rD*ҭ<&iAW^ 6ojSXDtɰu O *DJ?׻ҙh+H҂ҝ`;szUndC~R)QqzB3lΕeE4F (u!Iݭ'>Sbc p釜''%OYjo1>Fs@*ϙzQ]nci2ijUlaͣs:Q(sC\3Lb/#9aN{uTr-;L}k}&dodg&vڈh//(~4wya5= d[j<$wJo~i|܌eډ[N|f$>q[MЪWP@$ᨖ(xH '+pⲊ1uYJP;M޼ds3%S^Z 6H4\sȉ9Iar'ӌ q{f@{zJ7.K]gI".$#tNd[ZBeVS._={TuĖe/֫?2(0`([ VU}L ez"9Pn#>QTDU[$-=,RɬStyN KArU#J?:+|`ӍH$WK;W&G~< ^5M骁- ٔ 3iPD]4[toעuu—t\!]e8b+K]`y.As#,XlNR TȖ)hW]3eSuP.&3{f]"@f}m0V˰ Oj`c& ^Gu#0 &kKeO& /Fw5eOJF H3LAe}GH㡎UdD~o0,E#4Q14!4*0Ls Y)i]a1|Cv쾋70RrE.z'1&9܈Ogw`F-LX3 ڳ^ndaaI_X;#bޱ=<繵,e TZ:6Q[rYGi7{\`qP O_Vw®0z{Nہ!g/\5l##m2E9Qj|3_)-k3&n0:5xPL,orfFN.+4ܨ/Sk*I]l [8SΤ7A-Ce:m>Οi\gB`>#@= ܇KfLr "/A?l~j IrO-иG^Ms#"Й cDc1^ %cU P0Â/1wL*=pGDMq{&O1[_:$ώ? aLn%L9G9ZoN* 1hi4f9?D|tˣu#/lЧΧٰ{,l"W}%9_0;šA+- הp @xI6,_94IOI,X%߮h)lLoj"m`Ebc7|5~EPf` ~cM1p*9҅.Zw/y GC#&lӈӟ(A ;\d_Wp~VOR^ke S+42%?Uq}4f* U-e0ِo;4J&g mIJwEhAK!ze0%=bffeR=hgΌv6QE豽h$Ԯ]1L#foCy.u6{Ond3xĽ?[ E MsVbkUkEuG '+^<-!*!!Q5W` VQ+ld[y}Phdk21MKYy_ըV\ 5^ .2@X 4uwV3-+F\EzOCg>Ctf{q{^`5mpwZf=<;wAf302LĒANjf W29抡GPtvF6oj8Jm&AH.47Vԫc6 - m4F+đT(o;<~fR҂fzW9nZmy;jٵG㫆SfY&H#h*&-Dqٍ M0󷦲PH;nׇn~ʙ%eJ`pZ,Vޯ!e9~{W7:ktTj"ZJ$SD.C,G6#gC>NK~DmSXGXZuu74\o.9RҘGg>}%1-w1KQ-DY+%ZfBVˑu6c y6$}vm>ݰ U* װY,E.Rgu)zR>.â(‚Û}Y@=<0  i7F[S\cY%6XCjYKl8BٽG~뎝ZxnK-u2C;)[^1NU"Gi7}S^v^n}: *g))C<*s'gP^ìr\e+[:__"xXvg(t/~Sz)zзgA"Q3#\͹Ha]#m6 +Bp 94E :"9ӻΜAzp꟩6 5FJ75Z<7!# Zd^}kK#) (0,,CWb*ynuwS sP0Z{匴YB\Fu tK B7QІP݃'OԄ*91a.9LDШ5ڼ̤m` E 'rL\x M'% owur )$ SRsY|]ֵ=E;!!5E=3QX5SX2;.FFhQu gE8mE (L^)S!s9(zIF)-hPv i( i#g#FΪ;=2].jR[SL_%tIiv,NAP%׋^OT|(XH^q X^ȎxUoMNBrJyA?K ɕhE^RF---N,Q!'Q:SO!P:ّTd ;hUJNn+Z 9]}pn)ΖBQ&6g?Bzj %/, ?^A]8;r琿R߇Ѹ$ Ƨqw`:bvHxL<2=V[Aꙩ팈& |3P.Uǒ֏HAQ5XQJw CJ;d)|*j!q r )Np ,ў+$("l8dbj PWXLfqZ?;Ҝ`ߜв]M RRCK a/Ġ0xj-xa@~bPRKSVP5qv#>9|dV@.3P ʳi뱊>x299xJ@ }Ӌ\E Wa'u7OD ' =ùÙȘS^7=и1&l$JuPr:HBZwL7%8>%3otڵ0=T_ T-@!}CW4% $ehUҴd]G5*&lʁ+7e6-Rԁlh?j\Tbc)`.%pjR}ieB}^K>)c\>+ᦝ)OZ(8%j޸u].>G%S}AidJ>,XWaY!t]eH*SO&sK`"\aZȂ]E>ȈtfR@gmkt,l8!-ӦiD1$3_ n*4)s.p@/6GSLTߢЎ$۝{ls*m"vR|i#)&Bc1_)[ eB0q9(fB*Kyר.]u K2v5(Z!e-YtQ.A ^n#Qy%<#& mD2nX͜._lk5IoS,"In(m5̥՜ NHSt8MUc02 6!~d {>Y>JF3wI5 ȃP"cDy{^98DtVҶ4g&OS^PV6fc o T9hzD2 rR%2,ѽ_̫Ue.ȏ/+Γ&Y=Aլ)1o^uo6ߑ8o89fov 14Mg \02vvJ99%-f{WaꃖVT9>z}KG *B6=MR g ?hI˂u_@`#B>*&KXRTG\4h(N1"K/uV;ٚ&+JwL &7 w*&# д!'_s-bkU8C| w;U5壡ЌwmɎðI$0}*AH1(RB㌫UQ n!QnNU }p@N+/ݗx`P_%?,USt&hY BI+.R#Uw9.k\vK?/Kݒ# PaiI !yPt+ǿWUrTS[CmsmGP*] Lj^r3#ۆdu*⹂G<(ҟ֊FqD8}VS' gcXmG¹;U2>2^ O9K z((\~}ۍ~tOGӫcſ;Fi[\$F[+":;6b S Z)GZ>ţl D8>%3y53-ܳ%I&1SI=)Lj)')lGz(w[Fdn0%3#[x* )<@p`𺚳졡c\(yɯ:,r_Z1XTS{2b]Bm/ΒHL Hrje1L$~@Ą|{#&W#@Nb:US_D9 $p{kuSUMhMznf/á}+L( pv&w!|:"<vQ0k(?sX~XU'CTh2_6[ st|"K:-Ugf(/9#"E}Hu37ɥ}4w ~bEK*Dk_<7]3d~NZ񌙥}'<ج~pkO24-8ꏮ㛦?ht;ZD=_u88 8Xao2amZ)R VJ}krϗ6EQjPBv֥!YYn ~uȡIlǠ=bTm8#ӊޠEuy !xb:͌E(mο.ff%6r_` ~C<Xt J` .xjȸfYxp8C1ecPj[&P%lN k{ٌ"NH׊ #Õ]\Ռ=R#Zս ʁ}$nܽ:2M}>_?)Ko"ӠnI0ϣbwDt.~%Kղl0%Niń#?GA<_yƤ%<4v(c]k19ֶX=$m1O*8 >;Z(hVU7:KF A"փ'NlN;гK[<{a.!}r:Q&.ZK pL[}p6ݫm4F!*;9D͎[?yCh~ԁ]LAl;sZ#Hv,@ ,>R-6=tmjwoFUb dg/X+); dp,0V_^KwJ?LTB}Rv@y>^3PATGCimP@ꦾG(N+AH6Bh A>D7j4m 0/i_X]ktΖ @f}Cdr^jytMf|%sr.5G2qN;`0'&m$.ujv e|ר kHl>x  Oږn~R^)~-Us0Uuc&ۄ Q'0̕w$F2t a Ore ,E'VK>dGp슷jlGv67"5g_FlKʱAkc9C7Pj?!@j%zxZiZÔ(dt/xyS jm_pOybQ4'p\DDt ,Ƞ\T0o`0H=! ߙF3aa< vK-RS㹎|-EEW^`. VHکn#Y]aNJD Kd  @peQDk:?U[Sz-"C9D*,D(/G_QyIۨG-ى"twTv@]Y:H.L\_$rLaQ&" o 5[p%UCH6cK~G?fjPN%=DWP,҂=BV4*\!s_xRA5o]I 3K>H?2Դ J0mX\F,Tg$"1{c1A~2!%GR~n[q;jsL/[ OڇCNM?m$FwwK ?7xmy3Y| )@[~,D)DNpZ )7[C[x: W} rKKf4H2ۄZ(YQNWd@ªbwF!BBBi X r˜juFR+] 3ð7jK^clOS@%5cJhrdڣqK㎚jp.ſgDň<>O7Zp bBIip\0H4#VMhuS;b!*_xx*0HƜIŦKǷX+`z.C2{Co X xIxU)AWb+3S/DQ4b;viyaEXa<(Γ$^#/u q $ߜ| /r`[驓O 3*u:^r3$ T\o`32ƕzzC^uʍ҇@0Ddn,z#lB˫IͽwiR{_fcAPC=[K@r<ѮFYxM@U};mP(sKC΀. TfhLJ"< f4sl*"67:&W7 mRnLrƻ`<̀u՝ ]-:-Bbo- ~y \.g= )<r}tF V K&4'I |uRw3f-x11xl~7[Ki#ϒMz ;wَ;"eh\ʾMStf @`Ie td#$qW eʈ@`((g,d)j]oMDLBX,%& Zsq Ai&:l(Ġ3_u3|_LKtaK r<_ j崾Ϻ(2lXHQG!STP_2DL+50J%iL;gzS1rG]7_5yhqC8Ma-[u1ךpNy5kdg2 |< >=-s١Ɖib?TB]bb2Bٕѥ,?}PO=nGv+1=gX|n;`laL*-z%x+A(V+QԤ8,:#ja(2 uRK+JQtqtnF>M8.Im mV KetPo^w[P| oy7YJ]G = -h:1swSlsvejfi'l7n? _2tNo y)]?`[]l.V "6[>@}@c\W\2oAE ]å;_iw3!ĨD53EIw  d3 1':k}.nF]>P-Slwk5g=#G>"Si_7Rl[0Iһ2V@nlpw%w%9@Mn?v(;[we^` /v6\QoN`H#qVcj3HQl9rQʐ|;РJx#:a <+whEFMvF5Pə: |@ڠ 8Ys @ڏa~+Ą m7da#r=xYQ3u|BOU _Gޥ*Ա)AY}ZIqmoPAީ,|@fLuW9Z_ժ x-9y]a,Ӗ CL" d*cZM B<}lؒݣ1 q'rw:aqbm5X{Bh֘#.=8&l30x▟l@I/Zl6z(eQ&u"6'yQ@>4Kj%ԗGjuw,Ҟ9Z.lȿ"~AC5Бcx #UuGu;S=DA$iMG#7X^+1ݟ] LtQ!5ڵ+yMǡ7z;R cR#AC.qOb 02z7hiW\.!3>"IA;]QƤ2^:w1A3m]xUɼ˷\gҮCɓ;Z(<#1ˑs4͔%2CZ5zF"uRO𳋼0RӰ͜1] &OH)ݍ"+ XM6{eRdpe(_\UJ]i!-qȕtlC JY sbt4gQ8#LzB E&(G*ZBFQc$tĄ yu^u:WAbKႰk]ܖJ&6WpZΑ1rI]ꎗsKn[M{Pb>qZ*aPZ?LzGsb л;9%WW%+t湍CA3O8i>}$÷ڣ*SǸtBΝ3/tV^pr.oyptF?~`@?#J.{j5t}Kw_0-K|;!w+b2`mM-˰/~X 5ca80 8/X\$A[%9~c8.y(͡eܐS[2nnQj#,2h8K20I'ڷs_(a 3Bc FF[5̒z eTeBTLtyg(,9aB*=>F]\kt`mXi _"bOh0fr+c~M;|!QS9. X, 6L0$Nˢ|?Dj_zh&1:TOw0F>x + WUZ)'ǫw/R  v/#}qBjG$.dpk4^'2i&g".u@D@}Lˮ:ʵG&x'€qss5sR l[%$'G ݍf=CLےC_"!ʆ#ND:N*%ۘ+r+ ̔(Lǭ]Zx|MqCSq`">YXc=#g`N1:j_whׄ6x!@{A!!bcA.b2|_Ϧc=p5fW#+TI\MQ2,I&DD/jc=bH!?.`Bˣq҃ob1D_]Qi1p<&w j#ڠ=I\]4ڞ* fg$gxdv!HW)A!"[`|5e9v(5gCc;5@JCn{fdo 2tD08_,%'`ljAG"zLdY;vѰ;18N0U:qB/jy !*(i!og0?\r4:Efd9.hr2wbIϸWOؓJ7VqJՃ,$X6"6Lͣ݋9P8%>7w QRˈIw&-Էo@;)|].5^m" R 㪈Mq 'և3gd\g^hHjB'k=9Ny=MFG_v'q_F G~iO{:rj ԜZ6Rj(.(@  ,IːL|TD֊Wf "( q1$vW}%o l9+B \uɘ=X:>YzlM7|[Tz]կZ.bTR!l_2[j&`!MKy#}!|ewQfŒ嘊 a\G]5Xj^ y< 1`/QU@.D$8M%[>` E@n d1{>@ I26AHf#rV<|UEHH*٠d4XRa@LXve|8VztO:/XduN[C֗/ɱ_jjwvEZh\}T [7ܯi4 ]\Hݙ8d2i(7 TMUoK ⑒KB"?2IVJ2{^&JH?ȂWi#PZ~Hwꐋkq?K3]EB qRKvB͗ *LV2^JQ~~Į|m\y$^[UgȨɉnW6U vlL}q}E$opt<|Tx.F_KnG'|2[ücD)՛6?R`i 7SJ z[Îr)ѿˌ~Hz!8yaGHdR:mqƂES[gʏ+^;. sDiAY1MOU;/F \tVM Hp& 㛂p϶?aaܙvǑpv#3$ut@75o+ *Oԙ2)ü(!$ZvtO|&"D&K׫Q__"͆Vl>}(2,˒5g1&%;Xq=Ȝk-mnǀ#'~ȩ'8p{E[ hil?Iܱ2XGhNAlܳM 6?m7D7[z4 IG0[=+l rU[V{ p¥i )6pyP`FI,8e?8V^uhбTI7Ađ<@7A0C4a;gH#,VqVk]i؛g/A+3}a`'ɔT1r|2ee F;e$EEoNJ,J"*){F;f#b<ļ8H<ٺsT4~Øq{rJII?Ynb`4$h/LY\PxN u6GXUwG-S|wZ,:##d񂮩;I=kgyXS]dz жE"E, AQiC`O7;nNW/' 4! n/a,Bmg[D.z k~ hږE3bw}c㙾O:7COmL0 cnzht%BGI Yn?!BV1Pu HJ|/.#kSb6` n?Npmsh upX( d͵eq+AW3Zf?K03Y. U\ʆCC@T=|ZlNDp# ,ъ́ b_4fCGZ~O]Ϯ Ѵ(jp0`A>Μ 0tQYhbBO0 $B!ˢ 3{X=7ԝ0k 1" ܍1W’vKC޽^!m’h_[TlRLg`-,iVܧXX$tytn3ǹ<^:չXI7YNa^\nȁI&4=A3)XZ_4a ie ۏ[&#E3MBIi\|r=O+[Pn,%+Ǯ=I˹Q%o-bUdD9Nn$<9Cfatz#!~>"m5;:rVr=GN<ڍ5о?D[.4`>9عFd}R᭜j`O1*jn4 y] x8 of)ט#̧Y^_rfټ9lPiskSQ_)Vt:q8gM<#WDQO먓:r~bSu*MA)ˆoи .* pl۫YP4œ]WNVUleޓ0_rE ZTX@5? D%UI1X$gKZ8XaE(̙Z58G?fwe75mHnPjf4o00X|idvOc.7A"XŦ^39U : i!-UrRiĉ߶\Dٵ{'G[v"1F{.k{jEΟ|Rr41n!-c6\tFqs8-o5۩ǍO.{m/^K5n)Z -IM4Q|kpj4:HsK*X:xzLډaށ=X)nͥ<"NnB2>_] #_7K` GT: rW,,-;̵gn6fQF"pM;مZ2_p݁GAJqWS9%rzd'o_GM5uۡbg*BgNRMfȲTgvZ]xum1:mb8oSfwFGg.]ϳpѧ-.M8!C*,0UbdBwqwva#Uc/hc8\Áei <8.셒;Z;i N{-@/XTw^7kcN>xCB-ysӼ^ N r1 6Ұ1} if5,9:-3SB^'nL_Nq=:0vWB dIX n:.ĕ)e2u6>9dW`= 3l DqS[PmPڛ8c9A]H#O38%F<]%8VK!˒wGTE}:]]6D>HʼnE_VR_I&Ŝ h 7 GFH;1 ^j &Gv<;TIpB0dx}VK ?B`8`>Og%18G`y2ՅKoxv \5LP( KiQy1O |,Gr jZvK'ʄq*ݠwzvK@%p?&Bc)OƦpFʎ!Hì(◌mihuߜ.W9 s }W?V5j(E294}9L:3"2l-k ᜴UL{x7uCIֱ/cғN2UI9$IN/09Ҡ{~wĜe=O7 @t!)& CU`_n-A r6W싛0QE}.;XªQu |Ԥ5l֊+ Ȅ- ,flWR<Hr=j^g 9&G٦sνMb=^VO^3#NMd}Qx^ w{$.]C__J2b!Zu5_@rHU{U"K;iS>4aV.')7:=<_e 'KˣalkNVFb^YNN$؈!y%v՟thGo?#΃1$^ؒp؂gnM֎s;[k6kσᲢ2ѿ0CBeI._NMV n<5޴4 O"&#g%x {Y[ϛC8]}IMސl;?㣹0n]i?Z#!)U:J B®,;o$Jd`Ԯ@עp|竿UL8c{qϾ¿^- II>N:d4鍂P~HIAm!6i&&s?ٮ)2#J߿$I}2>Eb{;6ݻKek^g;Ҥ(%My|L 7k_a5n|^P6pha?fN3t=#% 2fMGm]L n-'yy*޶ݷK" ( n<+6R|&0 t;Xb>(#_lR+b2vF06z$uT%.do)J]?Sf |jFkҶfOUwaV핗+hL l#xsKi{?Ydmp:,X3}d<_骾n*ѣfZvln^b}%%eudϏrPҾJ7\X`Ϟ!rk*?x/Y {I)L{)^P񈃯S=z}ᤸȚ "?P8}LP?"/3LeZ}%c ;Aqj(wDN^ ,g`xݰ]#X3ͫ$ -:") vhAqNw=YhIpD! PD~$XQײ F*:YA6>futo?A7{We- ǶJ&P)@4$6#i/ !j͙c'rC~!?(y(Nq&ȍy2komqLdn*Qh6\p0iGx@ >=ː7%Mi1^$-PԷH<[ y}?\',f-J0Cbi:DAPي ?\^EڹVxD)X}* 8@<5)ϜhƖ㔈J3 g >f`.uaH!Ñݏь'"L>~]p džS5Ř{N|°]]"S׉D(g{!py .C윟`\T O}nRJmUZ}_4N!Î2,#7T%ܵXk+kƉnASCzrqY_Z6-ڻ6xHVI6)3hWޖ_<Em#fB6%A/uC1LsX쉝yb zzا GLS$ȇThJRb2yNm! 8,H*>XPЂeC@7A]ߡNt!&f'K֥#)e|ت~آ;bmnUIR~<{UpRGw3@h bA{e 27a7պ\b1O$]ld2am05g(IICR_mKOڀ^׎v.,F@(ą=`n ϗv;>$S^a筡5YJc~$F8ORroeIv<]a8EVuh|X as]#53^آ; 0~04-4S=Q>:,/n>td'â8OT/r h(߱zc;А0՟WM|\H#nYF 85C|׎2QĚN&gaI" vի:=Y:G5ÊQMx?]'IMxYLj(eMH 5쉧Ɵ5҂ طၖ9*pOߥQʓTm̀ #omm;_3,{]ypջiw?$ h7qQZk*EӸKx^ x8m>#LGE8dGغRpl51c`>@׸Nhٴ1n#ign?ܧj2nbH\_ Us!ERF6$6#xboȧޞSWɘxi[Ou朚1Yũ?QJh%l`wiVmt~؃!o3-M"Ƶ9y#[tѢQҴ"tEh'ߜu)1sʔ Ey݈r3W hVgݵi}ċ;c@C?r&7s8{\)'eJ.-aRޤUg \.=^^'b,=o!Q9Ź0qNrԋDқDD}غ "y691=Q LȇK'\P -GcB{4^m[A 86#?ĎfDf'Il&KT [$|s{7_[+:]ްS91F5 ϩzTiP"aƷ B; d e:hoE=h%/jc2Xwa1-)+5*!"X*S5g޾J~^"`񟔼a{ůF4!lk=o{ o"O~숏ߔ X\^`UHnTCN'-WD;*2j g'G@ Hύбl9[A- 0a(JJP@!rHx"7V(dQ(]C!b"8f~YABd=Dpn^| IKxYL 0 OkpYh :Uao؝SN.q(u<$%p(+HnpY`B~<ٞD %4la7U\0?e[ݕ[#gRVg/9uӘaq5r7{#0L^ӔghF18ʂUdV车@.^Aaf^E *w$dR)}AM٢(3dpҝ p+owW{ax5 C 펗 ( q-%0~O PYlR7\. g;P Y4_ʛKC JaW@+jss3TH5Rj~)a)8 S)ᦘqѡ\WŪ&2y[) PܞuO<[k{#n㮂d;_T}g^6gaXq 'Fߖy{~kg60ܸ{5 !1(e4?>JTш6GJX4¢g [q I`7=s52|ZI3ZSxF5\,c6eҾ4!rz&E#m}aQ; ԼPccѠxk`c+Ԟ F@3TR"k*G.%1<byQ#(};ѭt ;Ѩ9喈b5K;BwǺaFX★PxCS^ 4?C 6@n> !s$0gN Z\8sqЦ#8wcxRd\gNM!ب8E)2RfcUV1rWf|93(RUC6fԓ?ڪ,Fow -dș78z=+E0չjY^$ 2Fg\Ce}CA&)r̭R8Bɗǒv+9ٜXڋGb׿Jv?·zuf -B_o!)T aQN&381uvlOZ=\&(ΆJ\WGrJ8?^ͩڡ?gT&Ds\ބj(Hgr:mlLw4.e}[ĉymqYs Stn>YVO$nNz,v#ZA̍0n)– ?%<(B7zϧKbnf v4W<q`U5qH4j{l9NpEVڬ30)IUj}ؗ?P{łcԎ.pdi39 W$GM]raεBd? \HYgꝛ%q\ ; /]D0@<>L֟'{"〔b\zm\%N&!%T rCY3J,J+8|/F) zO\I0v0e \Ӻo(Xpb .9\LNrK3wcj&%48AD_sgQ 5U&ǂvڒmPVlж cDhOICb$R}9UwRB^* K6.N>ů (6,DDtڝRXO;?x4~.1"_(4"UK!8e8)`&#WYx2>1Xa/ݿ +#j; yX6,üI}4I8J;' a2iIe=1ߑ"i$sTG{>2,|PtG~"#ECgԷ"3ՑZaix6[t( ZXyQ\e1+UZt)q͡٥ɕ tpz>*Ul_%xjlxEk!:uYhRoW9 [aoʙ z^i_>2~7!bFdBt8m#,~j'tYMfAYX5k/.@\!l1(T+(&zf7 ɭTi$BeV!B-~D5G*%t-PUԦ6(.zǑҴMW'n*%][5]v0Mt"P@֧g 2NyD߾BE9#FQ75jj0qY(Aۆ܁aG)˥y8.zr(kN)6sZPi݄G]N*lnWP%S˞6ZRAit@h7[ [v lt f?֟+7m GbQVZ$Ӭؗj Oj?>dd\E"$>OQCm|VC]Hwͼy Ẅ́ c#&恊&G3! L]1wc5PԳk~@6VOkǹ8M"DZ}u dn ƕ0pDcsG#vEՁU8t#ݮ@cSsf}i`twy3VoC|`4O@]iU zU8 ?J{S7P,\YGO9REVEIuYR<'E wX۶EOt '|.ae``WK<.uLv!ʇ Rnu_u.Qj?l:d;e6^y(}ה'S!jC6![?bFk=UKi'_޷Țzq GL|&s{v7^ۊz۽mlpvjIrb6@cjsMUB /tx~ l~WHB]DŽ^eH2Nn,DY5DbMJs^M;sO8Xv O(Z8?+L@3ga.i)ՎhŅI:`{Cm hpb"{)9[څޯf 2\Axv^~rJT4hE]Et[R|v 8dvݴUx‰k|<7ۓ(/wq\M.WHBg i}CFʭX !Ju|`01P +LǦ-XΣRrA`g>kv&$H.ة8 xVwm'b5O@ӱX[";Di8iԍ`CQ9876c{)1ܵCpqE(0^ƍDakBΐ Cg|].?mr ħz+k%OV؏F:LKGH=  UYu Ϊ$oQOs;Ƽ(+@ɽ&P ]͉94 FSI\W^B>aK#qN'Xqj6upD"KT+@<{SNݛ-fvu&wdk#p-Ƅ*v9o3׍d=\mqj(ƊvM^xoqTsT.mez@YǐI%r?wMHJ7]GKU'fc ou#A%WvG%ձ&;mj*YƄG[4n'akTy =`3Һre=.9OF%EaomdP ( {uᄆ5xHA>—ĄǂFv=a($"&b\n*D9;zP i\1ep2aݜ D,àn6@u@qR?C{'];=8\R:]Tr4n3~14+}vag}lB-tP{q0/]3ʙ-e֥opM;"v~/ifd٫wO44+V>NT#ʎHd{gQD7a !cH%ott/WMPLYG#0&?cೳ.c*Y@)/eAr~3Zb%;H!hrp}M3)մcǾE?tAmƙܝv% ,)W9 k,ul[*%S: Uts=Up1oAřj &@S i?mt>B4~ev%l؃`zkW#!GLai0ZNed Vܶ=mu9 a ikRhQD>aEM64w9ёbG\=DGIWcf̩|GLV?GTg힌Y:?W1ŋm(N i.[j=qDƗZ\r:Nb9|+ͩE.}B;(8=B.ز<842PlSm@ݰvHvG4cu"*؆/=ssVDK;t. v~CA U ۏ56eh 7T-b}G1o*iCn=4\%yu!0Ph> i-]uIX'{1dkDVBkI_2C| ZLsE?v ,n{H\ gVO*jEPsfMh'-v˼L-TDi*2_Gk پ5@T}q;AD~k[1o C*D !. 12JZ-L*2z }H<tnx̍m}1grg<<$q`H`bJ4Bt,k&n)Mo[?z}M4# 1L@Q򫖆=QwmX sI!+e*,`j{܌B7c6!,]O1$GEɨX#Yh\N 9VẑNH籞+Pd˷߱~UY$]N =yПD[i-3D$PY#E_aghuj7dY.,%DcmM#9itOq{A~Uhpi]i\X`Ÿ3+`cwA GHO$N{?Bs~)QG&sDpCU!ri]j|H£?B=CuxMyPMצ:,u# ٝdT4< ^?hi#ME>q#hcb `$Շvi naq85_z1v  3 \9VI>IIDOc AHt r6b\-=(.ϨOw/^&I˱›054#}sVjkQw[v[/iWBӪޒ)!YTOLns*"n̮LE"-c%|ŵ}i$NM0wP  BM8 ݤ)Yt,ͅ?WjKMa4a~e5j~br6`GwEҬ<:f -RmU 4Ta'H.Gb*8t'ƄԪ Fڙ- Hu,;L +qBXD> #D5HݍBN G2=?LE@NHc/Liݜy"U?V.ZGN,\E%J|LѬdF:B}bD́EA\Dmg#p:3O."nƅȮ&(zt%౼Jm&+saBT BG8e̱5]Z=wKX2 G];ژ*Sn}B') oWQq !iI_" _4a|1(:v˔h9EBH 4HAqA^>~,8N]#e¿kPp*VʃbX 5#Ьz RZ&Te8%T)@ZC`cpFb塁a| \m8TQzN+tDZWH1 cRw N>P\g%Ǹ#gs'1j5Ij ~BkfCb'&D1 !\{LKbKA M:wh]![i  *|E1ȡ*T< Ƕgltt|@$+|@jQ-̝[w߇h(,/ X^~`r{EO(Ֆ |nC4KZG "f=SY*&AgLy)ʩ;Z!^n%.h ^QwtRAP|Dg7dh1WxeP).GZ*=c[D 4$^GtQ9tt-)} ^/>{H14c) o5>L`XȊq`;CQ1]agբ,YaZ)b|!xSu5GZ yRB/V 6/>| bǰ 9Üx&KZbx&Jͽ`"YNf[=~3w̶e 1lY,.~δ(zWmlm,rZIILw'=l@?|)[#ɉ&=XH/|<"<~U9G[*-XUjK~@ϒ;#soCKP]UTx8plI9 ѲޔHbT2O IP,:䭥{#^A+5P'yHv΅JQTXїj#$X)0k7D:nAv:]e4@C15,8sAު|6<d7RR!-҈Q @ " Sb1< A!ԳDXV~,2u߽UM7S1p$VpPa٤DQqi]gifTnP> w(WV$/R3Xd?wI fm^V;-ɭȳXD&6!4E488 bZ'In1/MվS^xA/;2gn|~HH˴#@YP_n(~߸m6)&n[n}ދnBקi0/-rV^uWvLyꝲs7dO@cR p)7HGa%uՔ xIo>msF?/C'RD!|z"5@Xd?j:e=|.,UI'I8uN+g";x H^7@&B.Q=ď{UMBkjW A/ux>~ËXB3 bj-.WL%]2 j.XFeO*̒>h.Cjz{G) 4 n=Atm'tV@,/t1u Txb;9_ecWN ~%QwNQ?!J`o7B/p`*J}w= )r&G8)]M^;ڜ%]݋DO> -ٌ&L`n]dY 6clS}}GlռQ &5ǥΎ]K+g9{yT+ڒ;45Oj]*L (mˍW]t(^ +PRa˸*YK;"L9`c .CRO_MLM!ħRHPM7.Ŭdg Vb 3f{)Ԝ:ACS*V%MRD%"UŹ=58ρ#+ X47`-= ؑiw&X BwYݛQciֲ8;=Q6۹A. yBkT6lDMPV7JtCJc Rݬ"tFR*&lJ;74JدCm A1d/f9$3)#0*t{;8BQU]O\suG,5,v,Xm]񉁤'%37RjeBwaxfDcFc{9˯ޗYA3h]8 < "]TGS;#6jq2dCF譗,,6ue^;jO!4bH?b? e| 4T,I? fv1) ӶٿGԒ`:^f$CˎxA&+xF46n!uT^HaLBDr1v0BZ2T[LI2-#iSX2)[yfcOwZ[5Hw=tB%0h-vUnSst>]H$TkpkeS= nCϏ#a**Q%ph@SmA%EAj-ևBɹ{GtVW%8L}~rŲN„_.jo[q[(qϝ 2'/<䠊w8H2gζ./Oyv6r<m"SRrFK,Vw7 r6u5ԃy "$I?g4?̸%4dޥA߲f v68z5y!2{\W0 o# vZrti|CG!yS2hâRFV aɉ$6!@\t2B 1ݟ .~!CDbg9^<{ImHpGS9^$:M6Oz&=d,9şRXLIGM{L C"v>3NHP9s/Q_Od0<2(pn#6+O֝p؛DaǮf!pJ{'k|;uoCΑ`3`P?(cCgpuHcÏRJQ>{ W^*1{>iK=TI0*sE0. _IÓ6͂r( (8;!]¶S N_9Su\a @QF{ƔBQ} g?"0GQer~8_MeR6&:-9VI"`5ƃo{@`x{#ِ(&8IYg#tRDp-]ݥIFAjhO@++M_*gvzhvMi\1>>habo_?ҳ V >`g Lca)KT(Fc,%>(Tp&(uBϑ,IB+g,S-_UgoRҀ_K>'ᛔ&rmth"DIY>sHq0f4AxNm9[v>n[+`tф\ (hثx; [-/=Z&@ E K:{tGYȗ{P>|p#Zn@ 4 iމ~^;gjuvZܒD'+0h_":뇥; 1mAk/fNl :Ơ6Upu2' Qhע,T7PQz)"wA4YA i!Ͱ+Ɍp4FVfMCPfe Fi1e#@ 尶 JRnݍ>wPqMBS [D]4O%`/$%ENEl pE[MRt)C^qZz HF :]ܭݤRb._ K?-#2ʓD*$d|Pt(LJVRR IxHtRmvZ^T%:c)7%eR|R`ߕ4VǫPf H&2ʞǚ@fЉZЀY^h SHoAYCmHn*1udK`bT@ı5R%6fOLÁe%şR .D~Qhxb`ZT.4YLBT^Y !]r%#ҘQ@ m%";.Cהt.=rUƠE35§d4K4hɿlz{@H¸F7Rtb0!^#.ބC ()-,\eH8%qOk"}2S\$G1b!{6@a Hw\wa"oGҨFS*񭦙b?^!HFxt&ŀ߹%,A@/QVgAq޴ N0or|mlE^W+/0QN*6P%6IST9t_b.E Q+-Nƣ c*K2to2 K a,PxCZm{f_{f fF=$$@XD~Ezkn&W)5hMEtZݖ{z?SQf+F[8k'16)jqW.hE;8t p6\W< rxpbLPF^,PCJKKcNKg?7 ALe1Wz*b ;xȝŔm:SԽe(!JbBE:+ymqKbS he2tBD=|t~R MAKdQ]48AyQJpR;0L1'f _#K.K;_+'-4x__P*;MGTHq Ьgy3G0@C(Dzf؉+2s `o^IqnMe~c$%nZShB6B{e)9+wdb5 ȦWA4t~iRq`#[zԆ'r? diOJyH: 1_mAoS@R4N]MRS M t t𼀞Me\7qֲ|сJ6<>G_꤫B.2,NPܠ/)Б߯Zm\W40dI*_cAa`xG!:^%u.cPnbD<)KK␏FrPm,'P2HȪs?W>LF~InohL4GMj'1tW8`6Hnӷ 9I^ZG ~Qa\m'G/CJUY'%!r`8,CL]5%}(Qz,/O;k$ _ HUԬ{P)E%k)o k pq VTBd cVuŚŜ;^/Z5f@:pp Dọۯ'ag.\zQm1yM( .s]jBt؎Q4~wJ!m&E-kN*TL$Bۥ`VuhO$/PXه޷9?$? I܉񅴮/y)7VU>n23/38yRRj P}It5DJ?0l7݉u!!6Qa-I7apXЮB)$!3!j[JrFsC !NUnY' 48$wnMe>+B ^mwurJ%P쯃(*0K,Pv='K˷#<1=]dȑ^w:TBVDA2ajċMACٷtUV(Y&LAl7Qz @r!38 , |MϬkI1cNʢD'̀6xoхl#^?;4nM~ y w0gj>B5CfI͛"AVa8î$bE%|X':Ml1 ML`͢qYFL"hl驺PK.Ǿ*6Yj:?z\Ng`ꎩ+B1u>?Q #۞1(eJLWjC"O'bۻzKOȋHGH%}ۧ+d8ƎK2dg"G$$`)Ԕ ,Ƃ`0?aBgB<9Gnlœ^%L9c)&)fNaekq֦^!M᠁*kA8qsIGO*CX+ %ء.*KT.b̂5 l\VWLc%q1"7ks`7'<ͧY 2ttj٩O@q 6F7+A*VrMU*V%,`Ղb*׭&1'u"Gl~}vaj2R)2dIùBB22B?a;S;|ћZ49'4i%{V~oFB8 T~㗰2psՇjk|Uch"7)r 0;}Kk؏US)8ET(<̕9I* <7=',5;63Hɯ5L vg^BI2rx[K"X76rf#v_|k`bӹPpo48>rV.gl>?`B2FH}=߭T\ 4#YU >h#10:6O-m—Yg0LSy9L p?o Z_u?Qv r4i{H@? ):;نw Hb'ܳ`@˖ !Q 'vӥF8&,3J)"obQӵY#yGh,gHa *R{hTD~o(Fd#}tRLaK! Q8)hXFU©ffqtHK"& wvY*Gjcj74TdCda؈0Chq!bk-<(D5{1B'ޞ8f<;rP]l<֓7BQrz=}1^c<]<%AbpGk֫=QҰ ?r(bƨ)pp1eT_W9+o[f%ϒ xG3VJ ]bzGZXi9SH.(,ݾ\D8HeQ8{bϨ6=l\8 Ī̺J]$I!?i7{S ;,R^&1uK,OZd13i;{ư{-mW3 f ۾I"p *_&A{r M7) &AaVMDAl9E!MHT`SbLM}-Tpi7&*&g'%>+~l R]Q.㣧 X؍fe:Ti5j22RX M2Ŗ(B(I`sS(YG[0sq;dF78L8OoR9*H|ʍR*, K)'41ʾG׎j}b.6;9<2DdhT<5~ iCH<1{ọ̌ѫnMs}M_9B,Ȩ efZ/ZrөNGBUʱVo_I%B~ݱbppSl\ Xhk#JX4m޶s 7b7—d;\w=|Xns1!pbW'G7 U"2$ʄ = ˯ 2Rw4B,[lAAO= '!GҞ͹VLٻtz `^.{{rDnn9u87+tf"PyX'WV̢p)]FJ>yHRGiA֤i6/F꥓f&} ԀrX]-cTMyM[Te^UfݖKۍA\d(Ԣ&J"6 3{*3IgBX`ޣWN'`V l*]ձn}a-sWgKj,m(؟EeU& d pa~Edqi{`KO5t!h^e(TFWXu *Kwv cT N]|hyhq! ٥6h_㇢x@Gk)O 7rI\V~.ͷ$FjGij%jNiuv6%<KRƩ"a,BҪ١ݛ>U“^ 9O?FRP ^/w91VnCWE]13yeqii@]Z'RqQR59Ru%EjsgT:&ް{p/[[hM_oOE!W,(_oj? UG`BT$F+uu$:6g ̂]r SO]!`9L\w>"QM2;&?$P>D`htBߌL!>rǢ{^H_1%5X*OYk \ou|q_ӦZD^͓ ^:|;ә@kY:1SUT eJwTz_[B.JhL5N@C;+$r<(9x(*G,-3-`t 4r! k~L7T =`Y@g*RxY-Mb?J"q^p>//(2C=φMRnE(菻p`#85̏>W2&}1Wi(o>Q{"|1,)-)do))Jh޿hY [:'.K[!h#YCVōNͻUSM R(UdEs CՊs'{+b!%@1tcϖ g1T ׌]*ߏ_f<]"KuEE6wB +D '"5aemCA$MUXqM)Ưԟ4Fv-z7yOb?;)f%}Jg&<O _OvkL$HCv(J 8/pC;D *LL{t|(iV%%\Jl[{u-\86{MђjITiwESerefEU(΄UI*E`4 Dy%۔«U'I22B:?XWf3T3Lo+c6b}?d/p' {$ۢܮyOCܟ.P5lO^")y'PJ!BEOGס]H,|.+cTwn4zXv[Z8oì0( -\@h0{u/ٷz[<$eX׬*L&ssmdRv9ќ%ݐŴ8>IRENUJpTh"]D2l>wh>sKPсr@A'ɩh8;\1I̧s+󬗼i}g%^Nc?USM8 ;\`S+zӨ!ϸ@s lKPAË gH+4h){}ݼ#:E(Eӯ3?1f#9ZBܑN^1cX{_F\ ezŃr` y"8L{m: ffSߪޏ&#{&srG-TnbK7Y⻰IvϩϢ^l Fv]1;.YDsptYUz͡Ѫ>c@M%+ZdqЛOcx:߸"ԑβ-$O>_ہ^L${3*N9 4pA8wcw%єd k-'`b'$ATz-i"[b7.7.K:-xq+-մ"uD15 ^̤v.WZM $W1A<% iGW$O%qd瘀R=rI7'PPV8L+7gMzwT fo ,S,r0^?P$jl 'Bg+溍"文^N(X@5f8O!Ubu4yjȝ@ϭm`E6~@xuR49r;֠'؆)tWG^]=@_ jEJI3}3Q*` J~b%G0!p '5;WD!f 3[oӂ_izehltUh9ԪuA.UmB>[&;ye1T3wE&YBT-MHV<'u e'};yŤ6F6.r˰mʐ߁pmj5)"Z#rmV}E:GZd9B=y3h*ֲdJ4bZJfQb+zbJ6xCviXW]O⪞a}=W{ۗD&n>0G!*ߎ,~kE )U[El\9W8=J ScĄK%ͭ.%AHaIN_DTsF+)n; o0̰OՄD l49r! \4kN m5*3I14mYH_D':>e:^}!+BI˦Th1MWtߢKb{xwbkHWD~IMvcFmn>B.+J>7+Po5l`$#w $y'އ ,#>4Kf%xNpk4]rp4Vr]o Pw;ONd>iw(H6& ;VŃ|8+ݸT0 c{ JiN~NS~&f0$MmW*ܛStNAd Hh r<ԺD5 8rF) CP9//18X61=w)d~k D7-F"=F^G'\W+6drG`'6A |6Py4Ga>&#L鳏n||d#Z'&_|r!ȗj8ȹZ]>ǒ,%ɻ1hɃCh&> I$"UVk(4X)@baMegewғGGs>dyyMFR Py@x~~ܯcd-i'BF%,ɳYhH b1.#!mρy V5lg_|f]a%N'fЗ@nm&oDՃ ቭTu^cfdքeA=u%DYjȝw{ z$pZH)*ߟfj~*I}؏QzDw _δi[<1M=aD+#ہ21 N\,̀Fx#bXpSKf͝zTscL*kD4ռ̞X+M?.z{3vìwuKK254|wkRN3׌[ǻ^e纂}VNϗYu4^X?ψ+`_R OqX|>`K8X5ʈ2'Mf_zY!I-[faRMt~z^ 2/{ TnTY d=j2E>HK +Sm,2,#+XɋZG;[?ܮpWG]qdAbK&v 0y'3%%ׇhy9!Z :Y4t&%~nƍc3mZ8hçpȻr~e]x*sMi FwdoZA ˍI*l :cc Xu̴;)g7o#c?sڹ7(*Xm뿡8v7lZqX>bPUfzgZ;Vhj5syW27e s;11aw )h. 踜[ |uB63ȃ k8*oK,f*p^&:Mّ tpf$<-D>.v\px:#W}QUqFA4tMe*ٍ~6Hhjh^QtǗ#(Ӣ)ۦnC>I1@Yh0}KO}^/i z챯+I)5DzU 0=MX$R`E脁UM'oB$  }u)uy#d>I.M6[P@9S:WJK;V0* 09?^(2)n]`NQt䍅)lj|0^_5^-粳~Sa]}70 0)--& ivrͩFJ¸NY"FKF|mA:@K mx$r| eHYuFR}1D7^AhL^ܿZG9PhzUL0 /@z|P%#J%+!OOI9y1XIc,8puUT?k6@MԴ={jD]d1I#v|H }({,Vt 6p O>˥6TO݀!}ye*d.zGC=] H&y޹%#IӌAb0)aw8d#g.IX.7ij6hJDZdfprl9n>}j5AwSK__QɎ? ~//99^Xޮ_LXCWM{}M]ۣd,Yu'q!pB*+m<0A&M+8͸86jW2I=t^7[60ʹ?7` `oČC|Jo]'|y*\Nyn <m4)&Ҫ8zwG zH௉2֐D|5LtcxVy?njS.I%fzs_mļ\⊄Gt\~;ZUag̋ "U7 7P@&?9u{:5g?yE= ZX05#;G̥ߍ܄HÖ  A ;ܪ|Q ekݕ>Xi s_ݎ`fE .ӥj|ʘHgpڧX)ϨOMD;xIIzVX>eΊp~#vkRR b?z<B EkַPv$JP^#L3Bby0Ӻ6L ESPR>u*Kn n3u0l=Y_y)%CV3e*I;Qt#]eqſ74o%Y #Ayѝ- ߩ%T=͢cJl?Z txkpIa-/lYo@B˨F{hWu/>f| b}Y`ј@IUwQ#Izuvy 1c:eƽk+sǔ*痶1BҊ@`ԑcj]zwiÈ=^RmEpT {Z5n7P a#.x Z|u0ҳ)X[e9S!<[BCOw.Y7Ɉ,ThFb_Ry =40zFlP9عII\=;j*uTF3FE.0kr:#gKS\7v(3kzg:_\oRT+xWc鄡A=wˍuu-oc'BP3Iu\ 4t\Dt=ŭft"Y m۹8:!b!$_ f[-S!UmɚBf9~YL ]ԯSʷ4x%uM2Ί.0Qܶ,?Ga2F[m`ᑫ6?x[/)A1qfQ?}Z2`AarJpC<),h ˊ2-}Nڮ 47Cbu` =Ϙ94b2f$?-* (YzX<#'WX3mݾo4CK|-σLUq@2%φ#잩I?} j+/[A;APEdGkVxS5^UqY`W͛ TԸCvG|V&)$i,O阛qqvy9^T^}USRbpG*U@o+w⇤3 % /_ ˄ѵBuz2nbFXXBmqF-Y q%[]L$QeKrZj0jLӔ J}UO!P 6m"{?)}`X aT3$7g_tV`ԾٔFIlNє|3R7k0⑲hlQTl(@s*$c'/U3A hO?7`h'}M|)*fZ2*x $fGN (WR kGy"]Qoo)džL D}O.&u*..G' ՌZJɿ`05Ow6&P.-OT/+4c*!7 dCG= Zѵm@UWjTTPVÑMBDфpPIžtvp6ړWYzH XazX)R=5˿l̩29VBIs*苊}D FqÙ50&5%C.l]@ĩ*⤇V(eʬs-IGށw28 3x6=s@ѣBk`D)]U,OONg!I6i:a0ۅOpR_Wt\daR,Đ \ p~ p4Q<}hm^34pBka께tB&ܻqQdÅoC}HJJѥ+42C8wtZNζF@!Fp~9yQ-Z {ba t:k↌qqgEde$`hIrƭdžZ)%AQ80eNGBTJO(O#Z~uBS\?ѠsC)7>#N2 Tr!CbBZTTGЗF$+j9QYTEaX;i%B(5A6>uei:Iڥ'dIzdDzh}ufcսd +R~OhrJ|aO*4p))q h%SBfQ*!aQ$4%6ň uI%|8&U٘Bo+@y#Aۢ\Y熣 |4mIrS.6Ӏ&UQ<xg£Rdn Xt$V^ J!8{7Pt5 q[%^Y!L8؝LꏛN2DnrP80C,$Em(Zy)1\smg*,.7Og?Lqđ,WߨEzEjNqԦ0BD!}y4dbT.`<MK rqϸRΪo(m(HM|!l.ۚ󧽆Z)swl/?ňnnl ,nSE޷L<|!*05$E"C`&nn/8sFDŽGf#>uhvw G͐yl嶠`vz x緤8rc;1 Ji+vW4(s~Gނ >vLӉ  B4̖=Cҷi1DWcOԻ1w)L½\051a=U/fg 7D;:m3BsʹwifONMOu3,_aR*-{<08>2!n) W(a\aRdP>O<%lɨQl6bVά)擯鮋ܻ%~+|1'lha|k)>] Gd(+ E57̸2d5JI'k@Iɧћ^ܡ!}R}a!d@[qBKi‡PzUz!%:/ ; **4tG|듨-FXܞ;s ULnj5 *Yylx8ҁOVUPhHl+J:l2 Ql YR;VT?(x[bFzM iԙ~LYF9Vr|Sš@ nP׽jv嶿A5x>4HhjVs`q0~W/[Fғм-/|nNLE XJ|4(iՖm8@*_oe))q[ 2x| lQzxVcP]m9,|p_ZہV1  oSkqF$ p>;u+;틻8(߇N֯jcF{25x)cn_4I"tE|W 1͛iь?4Oi!E/S@}MIK! 06oj{IAܪ{[zF=VpL#G>3g4'2#[t`TMAXD#$}K6n>dd:w}tbVp`$^s,}C߿U$I"cxPaQe2h1dOĨ1";3d `|@]F$SŊ}8k>PXh΁WECO6y&E΄nT"%hZu=E_V6Ns=wf+4ST$5f_cgx~ÎM7}F;u֍!_؅@FgPvȷm/@'ݭb#yC^t#CxО4i>26%W3]OwYoYgH-q?=o8 r/DN82KR}W#ѦIé/fl$ ;j/mJ,A2m #Wsz>N J+ҳ `釜 T*K/SXBz 4DODbfzh)g HB璸?ZtE]]WgEj)- P"ŭ? &&@>) &$[}i@ ql>\k~!/4`PI۵ \616kz090BOl"$ҁ;ӭV8!0؄Hl ~x"'"zB=k|.yŴXFW9XbE>7K*,t#;s#&fK23h @I!i} IJIHFR5**3B# ;rH\͈zQ(x:8,x9[MuUb'ih +>|F[ ~ڭmՋ#m/¢$% 0A 7,$U2,/J #f%v9kɷ q>;.+$>7i~mP9i~AT[E"RYM<ɔ2H%bz - JȄW*طş&AsB XE^"ץSxp)rLJe֙(K'hҔ;YARI[܈5sF_!v~o)7Eb@yQ 0ɣ^}3iArzű7*O^qP:x-ecv>οAG a7MS1Ǜ8N,s.aI.8 @ƻ+B %kN :nB+T.d*ФRY&U e^=UXvV 㬒$&O7RO>apdmͦCN]!tPW遆K7jL..yKIMfxy)gc8a2?zZ/kKҟpX+n7P";OBf*s (?J_%4݊>:J+\(-Kf -˗Xܒ/m^-׵@aVn`F3$G\HɥM6B(cHsmP>dE;裎KuŐpV!dnR,[rIg!9A!\-UÛ#,j[t7mKj}Tn 7rn`MQ;1U+1'l2>g);ijيO/&)ȸ4) `_<;͒5kGرFDԖ0QבQ zd_ɓhYCB_ds'+2Zo+Jr=rBj{l)޵6W ?JCϸ_3G-4P mK^r{QiF|s2`qDW)%|Ijlܠkm3mLaWI}OüWYϿ]t;=#[$E)8dep:ľs?}6^!֝ei^Zeá[#mCbwEuBEgֆ\FZ@}$jjr"9ByCei۽V+[W2K@tEіg.Ab4謧<~ÜghA:N, i'YѶi|mnJ\u'0jx(xy%Zlݬ%Zțt3GT[|)EH/R`D}ӤB (2>FI FKJԯq&=ikm iE}p)#\L l/+7ٟCtO(mt- xgs%8 +4`mUrY,rŸ>(T dgm9EAI0y*~ U2rx&n9p F>gPW۞sYPJR;z"kGq~3N9lmV0uG&ٜ& 8jh$ 7+ L^ܛKT{UP%9$e(ed 3%%|F/gD^Y)\aR-K&zb_s#,< I->L'l%kg@}^RK,_#ze 6~;_.7?$~RV<R@$8s8o98-jIF,v؍@ϒU()Z⭯ı17ha@:?0S-,?}Xkpb?Z#k2t?z,"5$ҰL:MP4a@:mEwn'*I bOn8<#SqwCVsɩ{0F{D,J0eajTC_囧`-]II1JJLƊ9l<@0xQNPL+D|Lo2a|V FYR/F+/=:ч$QW=Pu\JE[l6rWg;p Kn؜'Ѵ,`0ܶA~0"nr|]M Aڶ!Ъkʤ)m /] NA_LD8+?ingmhlw{"ݩ6uj|V<;D哘J4A~ZT2+;*R` 4е` 'CIN[:DO2*D.6BKg9K`_x{)e=9֬KhAkdHG@?>̀W [4Vhz=ڏ",+jKC,kR372[8!W@@H_a9n!/vg NvgKfFn'|H+DvP7e*+r֋@%ޟmgv e`(xNf8]j##/qTMvhF鈿ЯVBNU~~bEs07]oc;"ͣB-%MI\ B=6whUudXʋi #~+R30}_B>x'0&[ fdE ԫzk,f^V =L|LL;x VÎ^.MznP"W !=jig;cW*J!gz~ HV9 5ƻiKSky)}79_X ,Zl]4ײ4^\%lZ%oƛ+qt/PXJm\Nd$pүv®H~nN"ޗg+ (7=E4.JS1wUX|o({{Ů2>Z%}otGح(?t" S.g4 EIK^n)ioY r!0.wHj/񺌱ٳ֧j(dIͪ)՗-Ĺ=%'S2I ? VUfXW'="}xx%pAkBIm3dV,\`2SA<e rQksX ,6U+Zvån xݒ3M5_r >\bXl8Vduv+52)!F ^ܢT|F6iGXf hޛJ2@@S\bMZ6ğxΝ+]&lD $&&')#YÔ 쐛VZiCA TJjVFr`=3X+]" AB仩3Tb(NB5OG GK*rhOuMPDt~o;4wAtIx 9lդL}o>x3NX+xf$"fsZ99k`DK3{Q.̘N)썃[ ;?Yrzsw ҡd쟄^&h0,fZ^$lI/K,w >mVvʲMo`ZXdVK,OR ;B|3IN/#lZhQ[dev_/yECy i/,巠P"|-fo*9@>N]9l U^W–k?E҆fuZCʚB˻^Y t(ziNJU#tc2o}$ÊI$49  Z Y3E7esDyw UF:m9ɼȀiG1WrHo`*;F5>xA_YJOhF 4 eIkr|sS5逸ZRIɷ U~q?:,dўhu֊NǗ]*3CGn$iMq.Ωy1EBR Ңps!ڼ0gCwzs?UC#6%Q ;{5 2"y f&9(v{c^;?J0<"Nr]4z¤L.H0GNtm ʔ1O(!HEH#hֺ25Hu128D6AWХȴA1qfCUuE<#X5HAm F4`5$X޲XLF)DBKosgťu}_h]RBqP*O(뼙6Jݘ50 af5գHzgfF=Mމg5'tal<VJ\[;c+!lBzB$..(jQ?_#~DB8x-sWfO}bK<}yg|R_ kBͷ򤘮݆gJ>&(ljX[+o%Ar 7̢轖 n]e/tבlƋk7%܋WȶР ֥ÅB[c hYHKU= Kퟜ9d\{xJVAZrn&:Vep04'n/8MͰoͻc^w+Z_"ۚUݏ8p31s&Şy'A10/}Xn~JSغfz@XDwZr*bThZba^6.0(ET"۶xhyy uC /j,WO ^\K=+`[𑫚W_(rlnFG7_H'\g)jHٜreZlqTe }@dG6l X^!ƨea1/ZP{ճ|Yף$\ @Eiy~Jyv?*kk&ELxK"4VMJl:T L9+'pexo_8ſf7&4B9ihױM}W//sg7";JNiOg7HNE(E&>_+beP$Pq΂jAV=?(xQ^k{՚"j\]6s$؆CN zb^ڂ, ķ-L5sO^;obXݻ}.XDD;&('5VC71UIx &ľ"P"׮GkGֆqRҖGZl2uV`p z =X;`ܨ 0݆β:sgUYKeK YM,T&HA sE=+OS;AƯkK9[Ox,6)AJ4a $P*UQ[/Ԕ.^! vJ+OZϰr lyˇmC 6خ⃪%8TI/PsVL9{;K\͠"Nf`Vh k;Y-1bkf)d5Y>=;?HLK,j} v*٧3m!V/Frr̂ HJm#LE<[?[$o0'T~:MyHڤKZ=+*+.Pj~:M Jl|l\,i?8Ow!EgR"xNj,*ϠsmYr]D5I}!(-ËLx=H:pEEaj67hE7:|^@MI̘ @ļ lG~q+zB)|yI#U|Bʡ[(JS_["S_As{u35BHdfM@NB=7>/b̐b!B&Ujq @w&|Mk/4zmVati{o/ltċ{(Q`=N P7\NP`ԘW[eAka"H!9(^˜3#I>56N?&6KpQ!p:TŁtKDMv> H\ȋ Ka| iWC_{n˽]N+oCԊJ#^V@,t=?H?WΘצy_(|05; BD ZBNIvWj?m)Zb~vSfUd^h'[T6W%+; (rZ>N9RHlT=AJ@ycRK]iֹ"BX ߓ]Y0Yu|4o:H/P^J;223g-%=׵W:EjN- `$gQ5ԇ][h${vs7s\q Q>3ԜME?ycOJCPC*t@l…o+,r1P)ufrM>t0C-:1 ͈ Qrs0k,pLnijbupѮB)L  k݇pyՌINTHcI*5#r))E-wexb@/Fׄ2O [; ȁqV} m XetsaK8aK[n\ hYPtL?wiB>gL2dvS,~KgBt AےWkT0}YZNӀjZfJ#B_'5]W]Rf~,WX <=#aF~Z6P,&WBB:6z(NnVͫ.ޫR 9`s7pr&&Ye$5W5f M0OѴz8xH_o3ƶ ,?Z6~c2'ӭTqbGIOҵh$3Y#z=P:tqI@]*Ĩz3KQ Pzh6و 6qV6;8 U;^h ǙITq٥L\W89Zo3t(q)Nu(X\yٿDaDNu6(~,Zy;؆[nSL4#t4\DK (̧iɀ:EF`y;<{@vveH/_nSDU2cWIplYyBPR:a'T^vl~T#${ČA_I)ˌ{t %JLp|B89^ieQ+, Cj2z`d =Cg  {<,HL'$ &IMh=1W/R@AbӍP~Sk \Ldqۋ)DH0b=m* >M|G?PB2H̘XS_ZܖДW3Uo~3mѓT8 D {Y%xINM]YYW@ Ч`:_nk4D4c M`K%J ݴXEAL wژ@L z-kPKN' hY|&x n>n:/ݳ5m$iC'MY~l\tO9X׀*PLJ:BLPc8FZsfV@K/(,̛\uJC&\mw74s8'(,,I^P'3476mI˴fu9g4ĐتQ,\.mc)H!QgHe&m~A ם_ Yi\M홉'J+n{jFX7ڸݏįc%y_)KMb̢58{q?)aJ6 wP?}I|QsXuD )^,I1 SJH׷t35Eք3%pt;!!EξH)#%#mZg/֩ Az Es/^ a #9%-AlE׸7u! b /a7`(i؏iK.%L%2WehKj]k8$4EAiTi#[W!"1ō`XJ$YKR=f|;ύ3E]%"89%V6+'D|njn*~I0oK^N>szkLOmZ"p-"?.vbۄjM9j"`)$b&5mU(|K#"x<`Pf~Ȁ јeo`^}AEg/G<AvTX0\-Vs*3, >$#~v,^Pna\R{{yc6j(qN9"VUe/aޕ>{ C٥\XAV{rfQ#9)Mt0TeHӮDd >>qx$RO4F ZzQu{]Fm Vhl¾[V#o=`[Ѳ(#ׅ~ td7ԓ jE$jqR9ePBGR[U`J_駂y=dmJUm,;. f&Lۛ\ bƼ+. yN+HTCxrELj8FHQ,G1Jo{ha$S1^8A+L)n> ~ke ou~>\Եp^1: MȋXmN͔#ĺy?,X-\@dE[ΤɌn/2~H8nT.If Iyk:@֬;4܃z 5ua5vTA@mē4Vbi:NӰO䝞C) ⢍-^tHkpI೼I}j="r_LOͬح Rx@$!`R7l3 xo,  sI0eΖ( nc1pD!fE:725EE hTG7Bx^ (ŷKnKLP;hSSZEVbck4|sPwZkEF;!"eN[u(:lR1l=r5Uz3U$$,]adv` `WdwdhIl5B0Z*ڈ\2 ucB_|фkK./A8wjB+a[z$?߭ m#N E.b&Q5@E츮]rIނW*Ͽx@Z:/T>h--!cJz1Z9aݾ9w=r[8+?#;ž*gYaoy_9i<+OTki )6[S?W%ΐ|Rw7)' .%}+"Y<2\v-s+ykE a$%¹|CbnNHpވi`?9?4O!#>o]mORWKl~9y? a b_I7F)\g80v^=DQ G`&]1U& ZNDʭ  q2 @@VAD9bh/͊Jzf鈴 J60i{0ݫ\Я%nשb #Jw! ϜGjPt\eR;iÙ ˞lۼM#tJ|-^w_duݶ'_i@k̯py~q=N C5E<Fق]W(_OVIxSpzO6z?,PV'~+Ќ>Em^mΩL e8HsnRg j) TUa)?r)KMcv~83 p]J# 0?^01Q"Qn%Y*>} |bC[L@rO؇͜LITDa-Pypg8R6 c`W8+Ui ppcj^b9)ͯ 3I*ֿD4ɠяD0]cSBg -â~;a34R@Ě f4&cz V$()y8$^p#ټHq!tJ> -Egy,ØO`J:lN&/e2Nnhɣ99Aj_j\lZ}j;Qr=(xa2i'1~<"6ݘFȤXcg:aF ]L8vSpbcPYR9^2t$ar;r%/P%~nG6?gB83'{ɬ'r.])TS`TEÜQTj:aՃgu0"~!L>g.6ڧDV-yoɄ,ǔpGxS@w7ߗ`od1o,Y ~/ b:^ϡ=pu_\?Ε tioŒ׾{El:S[MҰB?&ZBҬD[xZd.qKHk"De8̱'5%!~cGCa]6^959$5nxzmI4KT,%|Rʗ"wF=T54M=ĹZԁpSK/螪<*Kf +G*HX`A3!SzE_9/ {=h9JS6Qiztar"W]e'lAq[?)#?SU{/9ѭ\X.dQ:rcR 0`I5d/XDgu~=NᭊU3-Gj{PK"fw(RX<[?ьԁUVmZ6>貕VU/>mJhhGJ[Q$ߠ?rz>)6/_[u~8Z@-a!iws׷,><R d/*ߦScFAAJpn3/"SN%AABs}f_UeKRgv[9qgu,*$N x;3'}9?;toE헉V9p4 nFFz)Bw=\ #w\~ur_$g(s;#\COpq/i me_8p!lh:_c2GgO23XGK4k쬭eb's4l>:s8 dIΛf8iS礜PcyM6L =ԫߥ--AIgUK>xH ӡ 6~1 ;R׏[pfJ?G9K1=ms'ciHTuK8IR :,$y$ kn2KRe>*l%[a.1*H τ-3t+xzwS|Ow^+|\jCbQܐ<)T<]HDt vuMpx|"_ߙ c͋i.jYt/qy(!Q:sÇʠ[m$Ƣ#x&ǃp"+س㿲x]= Y)cJ {>-oT1xֻ>r3ܳYrp(')/:ZQnfsR#! Ih+tj?`tOC`4sƺO T(&FN0G,e`]U + sV`zp&A21f;cZ 矰m=!4F#ÝcB1r_W b='!~PA^f6Cvi:H0$PTC^$/]DI\Hu诒b3?q<P䘒,pGָa0C]hF byO{#|";`ioGBφkءF{ 2824.0i#61h%0،0Ԏq30\)b̵ˢ?)[LkO;=yqR=# QFihJW.M@ձu!x.1e7Z7I`u>"&sy!G+ ,4%^vw9I[Օb(l 9-;ln'M5 q]<._5<ܿO( K"XS~1W 1 Q;[9^Y4%CFIaQ4l:!Z- H]$8踋LjCo~ֳfڼE[-Nw~)9Y1WTJSE|_r <X^}iN'?ZSR %}Ϟ(:kThϾF`qI8]z\!0Y%s$nu烙~iiɂ*5` 1}*YR=xYN*,r:ŒX'ޫG&eO{ًAX Ճg~Y{IJV8 \? ˜#$3oA|c *'~2NU=rPE2ytoCmPIgʢ [u0k(*`Ӈ|lϼ<흵pq,$ࢤV~Gq՛5iO֨bkfYݣ/*c)1Dʶ Wdk VZ.5|4oJ,z~%GpV)>e74R0&$ 롼3j{#W^tfVp5;G:6qnʉ,o!a 0~:Lž&tٍ hI~+x[JB]q" ӆe@^"0t"qE?̵nOgF٫"ty 8xOlu9/(om<# tdVoyVܳMBlD)It|pzF-vsVQWOֿ]",qB$nZru+UC9vgīWJg9 O嵢3bRXJYvrp>ҧׯ> Ed }8"4 " γm=̇ !rd$QMV 4̓.14U \wBAP0ӐG_W.!)Ss4 R%h ßl~DUSib31Ubτ~iQ9\Ե2 Du]0sv]io)rWHd_Σ4/ðk՜Z"@؋0Ĥ,F"!iOe}gXћĭ,0xN_n:HNeR6ѪA{gqe Q $ZuKS8㻚h7Z敀fPRR+FGF mܴDH>=Ӏk w%Bid('N.0p~O/Y*%1R ȼ*w_?r폚-H2=n BPLQ!-\x^+ݎЬ ,RzFfnXDcNB%=vsh Ādp">lb'^5 V8#XNܼkA늦{CG^vF=a[2''&W0yA+vo= άCa;n=5L 1Er6Yjv#s$@Y({XJu*Vw#yqyN7$Q;-L-?9t^V sɚޘΣcY>މ'6lٌpua~ uLvF̺r~!mMY|/*0kTO\+Y{ۘe3RN^O<$UT4dEtBpɠVo_d&鄷Pq?wB-:d?ڌ}e| FPpB WۡR Mu/rKDJr~G?̌cYR6u%0my(gۓCb[!;ڔg:x1I?|P"]zd挺ɭ@5,0P`(</DfȏIA'1Ŝ6gnjw\LW^&hH<20r732cv~aq;Eַ7% IB9:$Ψ^}\1=u!&[ְ\*9=c<xq۰)}=8EY뺌3ލ-Og4:5䰜qѧ鶃V5:P|)#]bLA?\#TK$-x'7,6oypW*ԟe=btmƌ!L 4+'1\K>1'gA]a@R=jYh$z#- 'OI7נ?8@i IFP/tT) mԻww!4?mcm%f s UMwJ{πY</SQq5iۋZl]έi/SiNBaK=2Zw\AԪE\2JQc~q&04e^̞,6=Wt,ϫץx|x;P`b\lkyGBC:',HOEx/0KYI@^҇OuR.G 5W.'ID ] $Cw6VI|hd%arz=&iO.B U! /(;Tr{~1KBLzc`02{}t7"-U6Q 3m+h)l'9eP0),[GGi74ʋ%7ú892ː0?zS vytÚ8t"l*Rn_tSEہ>r?y0g &wj5vj.ClapʮYGRTo닎„p#gc-fxh1|55MRЉJcRh\¢$—7Q4>2&1ӱLEB=ݫj.ޑ}V(cr3}6(`kc g604T-ci/C:e9Bl9EmwD:bpH6_T`H$>oe!\S)s//% slv=qZqF[8[Hىb':k|s4.)Gg^5<;Ѡh"# mnٍUX$d X揱R>'x ))v՛'],擪<a8/$˲ņc10g^#a"07 %OE(b~:hEĥDgb|k<~\G~}D2<,Jr늙 lxV_ͩŇ5;- dv0mx!osփt8Pr" k!ɣOScЯT7 ;NF CA ꇰ,s[/Eá`!Ӈ`%uvzrxuCt]ۢH~zXS#lgt$.!% qOLT@)_Zqwq7J*v#jZo"@s^R Gb5 SD${+[ Lsb ϛ13>wj l8Ax낿/'%+ v>ƘS'2mp#Y5}\ϸVxy;zξR1&ie@Hόޥ^ /qQÈړF.Į R0jR ,Pʺr"v>d&v3n2ĩ!a=*>#3̡ ~{qUDD,N?z>CkX.qH`;G 2 E$4K%[|(ʭV.U~f8\ Wx#Ys2|O(ͭOF>Eiq eĮ(8  '_&?ZL]8ƴSX0g%!ˉO Gr|P$K=!izE:(3`Pބ1%2ɖ;Q3|1>ۍb7 G%k%O,3USk$VոF[ \(NyHQ#MeCe RW`ݵVz}"VE3RB’rEbv'; 3%VTfCy1҄!j/8CiWT_o697oOxʹZ<!lqhrƄIMBՌC<O kFJJ/3-8pT" =.T.*ʓϩ _z'8a姷1[X5+їpH_}Qz( 3hQCrM;P;Vf_O BCёxA'͵PCQ ?jN)X1+fd|ZԷR*S $X!D#)wyM%n@|iG~ I?Xxh K_dd/ ~@2NnKjXNRW8+}k2CYC^ns.~+Izzњ" A)$sźz9~!ږ*t,ĩB fZlqf?%9D~d_q,tprM)C%ܰ8'tw@~gb;IMLRA?$nwLG- aCH$δ/hIyM>jD~9`}9WaHaA4V G,Q P_phC \@PMz˛3N}UftSL։60A>E(o ^  &vtP%m0n#l &8*C0SQCO P d[лXjn%Zర&yaYcBHϣ]OR6Oͅ HAXuo<橐z!/haYx)؍#XuBA:gh?_u}YvE<- EFvs R0g"K?B~wʮO"}KX[ت˲#\Uplh<-ދ%B*+t;AZ@@qM=ntE΅`A35܀\5dAk]*̶ҵ#2 x0|*|* ك;K]m{O Ň$q[q f7&d\wH}cb^@ W UqK,\REf*PG =AN&WoyȑoS'`}|$uY6wTQ^m_3l7bv<ùEIOFwI{GݱO ϩb՟Gv%0{m@@<-ピ/[/QGyRNB uA'k.òK ό+z@X i,ÞS#&q ]ԸȄG/8a>}qzx'0DG!=HTPEu;R$C /&Vb ha˷Z{ *? jE}8P}S ի{D7^uw^- #&k:x_!ѺMSDڢ $[2 {AԫZ:[`_^\>5̧-Nu2A+J SZ&jyC)N_ѥΠ.\Rc5 YB~p aY6|oY񗾮 ,$(6ѳt}^VʸI^q=YX,h9bh.@8DpJùrҺPmPm0D,-"}7IaVF! \9ڱRqt؟ZgɈ65mvyg%m+3/3?G~oﰃgLL# GO<y>RkgG[ eZKŃ05v۲T*\zvKxO>sr½OO`4[Y݇g71.s7HWv;mg& J_b`*1B}IRp/2?k[u%[SSnoҫ{(BBw)tN[X3}6D/b 2|? x s~M ):L 6DچMܕ:m*Yz:R[" LD $|_z }Xzye7izX%Pot*mC?NDo ^nBhSΗ%1ufU"~T׌4 3l;3}W~}ey҈=)cc9}rJ$HY+e5MXëVsq`4ATs17W`؋O2TrqeA %v:OVJuah6W7zM3A =uߍV9;/YGGmMpM犕\^vK|y|0\=ǎe}Z_U(y:֫zmI$KGpQfư^}BP(.|ꦆbfێ"e̙W98RNkzjJ/)/DYP \֕W栄  e|@4+5KUJXHs__՛2d8CR!j]ÕMeG߭@+|73Ou5I y_(͌駿] UY)ra,³Bwͅx;ޭmH[dGSGicw i`#66JŒp^wn9<}_V#]:aS4$uK-5K*6fJc2 +zВ.&a{T9牽鏨B-5ЩT绢h=~BQq#7\F3Wk\dS7EP_J'+̦m!{ֲ5( $[ǤYPNrWClIomI^'d2N-ʆT9hU'w&)[Ir uO|oMPBNfN7neoJԅ3w=ͮu+oTU鄟3hE+5Ȃ':{tIE߈ @G]nXwoUt0aѧA,{PJ]'v9QeI7ai(-}׻̈+{l%#*?i,I#N&jG?G0 .QL Ʌ"EA=j^̩o"\~5йn[OOH 9vsޠHeO7{/2VpS;<]RԱ[*`춡އRv1 Mvb DrʥUUXE_&Eq.c-3&I/ ܢe( Azַ4[kQ)m ^?=(2Y1s&7 ZҮm#sY ~xrW0|4 ufρSvDzqvOXT%VhEYFZw ޢtJ$`OKOB@0LLH &^2s|t s2*Q<ǭq A %t_1RU+pDpK1i+Z3x&@o՞ܝEp#&gT+pqܚݜ94nqڒj{S=q=13qa(j}AR ;9$*JK%b(wCy4 B_awyh*o-E! aUڠ,#oXewnٟAF Q`1b9K Wd*q\q4\t?}j3 Klj6WrlxrT-Adm0Md/:x8F6r2}O`^V{ 7"CXljpV[Ek_tZM0w*OAc~UOpHuN4\ '؍Z|r?6{\c"ؓ<(ϓ)(4UI9G-AplbDVS%+Hγ$ ىl TMngR˗+"΅B?ZXuxs ߐ Jpn7=V ^͡UclmdJVYCeuк~Ŧsfz a߭K6L2i m\'bC?/UP׉CT6k 1Q|!X$ࠒe2`AL٪"3gd=l y+ZdxV#X=/PH:ؿu Rj8]# pآ!uH}%%^=5hwa+_uc13Rup#dfc "bMbmVR fyXIyG2c^-a;~ݴP ]tTPOdQ5 Fşk vEGffJ00 ygaba*~mvE//$'?Č0|CAbQPPY'ũ<)TB0@=O`(\A>w7Ȧ FrY<3 &4/ۉ}N)жk;YYy]1gv_"B&nD !8}`G#FӔƓ՜q$,8^TD~#Bƥ"vB{l؜xVqrN8ĭ%:N]L F" )n(.gAքOO/5lJgZϵC }8+_jOT.hraUUa[J7L|5+;ܧ8͋zs'w[41r)eCyvV{y#0syY  @-Ruq`|>[隞I->hlǥ?6+L-A[N)<__V7d \)!3隉ÞmU}a=NxYjݮ@@wuhF|S6'h2Vq@M9_ ; U]jݠ4&RH_"T*?# 7 gmCwW6Ŝ{qRgȔf [DJ\usq8L[ OA g9"~źɑz$m@?`#Q R7dm8! }R{uN6IcAG $ܽ\r b ^̠36VAj7(k>86SKtEp-CI+%v# |YK4/^qS }ZoɡjB>7۝:[+m6>ohTa6l$ݴ:X93)=,Xb?k@J:c';( Z^FIo#t|HȈܩQ!bd v{OU~?1e]ڈ IxzDU^ nA͡>|zJۼB -8YeCW^A<Q~bѷj(m\{F3L6?@3zU#Gr$ufȘ6 \fKWePUqKŴQLxG15BI4Q;P>0;Xh㕐xlcA0d 78 l;/"Vpdpwrj/oaEx>H̛ M`5V4^_^]AVWG> ۱y8gF_^e@m$V&!Ӣ캌Z t\0u4=5%)up E~ke`REW[emg #fh}3l;DW ʌIg7ҹRHԥh38:v,)~`6[8@U lm ]zhZPTcVjҠiȑi%>A-ݶlg Q'OȜPB2_A _IPljJ Bhj-&qEEKF< VC&Ny,95.]oAĠ~kcMx|.Jt]bXbUxewuۃ5Rn4Tu嘄tg’=qKv k9՗Ŀ+yt~(@Y.+;jSpw1VRQAL4vp1FW8!J'"t6x%x墧İӝbVdz3bRs?ucΔ ;+pp0AUMVJOݬNU8QJ18鐉OK=6SQc~qE4lP'K[t)(~Saƻ!QbV[+6AyႴOL&b]&(D- rb>Hau r.*é˒0Ra㇒ӧBׁ 1L`=E~mrJn~UqR>/J;pͧV^\QѕDl7Tdkǭl )-Ħ ֭{c|Bj+ zJa.g0*\75~rp%3{)YM!iUvs}nɅXǪ ů(8uRLH#AðyYBk[?rw6=\0]o0A4zDdahOv֑93FAE2BqYSԌq"HuN|FKTVa3+ԓv0jVFCrB;C/gE cJL+=Ċ -ˋ 9Q<2D_&?ē[qЈk`Rm*dd8f_&4 K:MmY3݉j71ƩH94b!6?}$wX i OF礈TNS'.Mj$d\ՙ _t(y0`K uq Yߣlh[LSQ'MlWTzK-g0bX؞%^.[E;- b;eTƅ)ɇ +Tc.r*,pxzUX^ShV'`Y wQ_](_88JdzZy D0E%PFX^bCP@ݼ]gL*oyih.z,pKfEe8}!iM_ @JGo?Y(%cuz s+O2}BBz^dlk7/YpY&[ z±%b$m1T0-8I=kV"`kj[ijes~I2Ԋ 5 _Uz*-m#5cM$=-P;}؛99GIaWk`8#ZVGP8j FGHƢ#Vg,f6Ob^M'Mh,ٱK<53|~1~`;QvCd->FM1/i-m.UΞk[A@޶gMZeq8lN!uav͉_KW0\s; h"D_`?_`B׉4'U@Y!b\g][ XFxP6j= Gs) S1֔SF0$OUI4Q1nKFmQ]14cTS?KGSۇ4d<o X–S>SJ^?Cd۴ UNpEկ[2 -PnlB[t]W~Ve&+h8aUX(bmO4ml'E~f ȩ u2\*Kɵ6f( 98J&NREX s`" zeYM?Kuf>O.;WEN c"S>S-T(9m~0%k|wވpL}y/{J T:p:%P[0?a2:q2?st"52'kI mXVڒi's`wӕ3bx]J٨&rP/` j%woLQbܟ([?gu* _nhUAZ+KRzf(WY&.펫0c_Ԓb-&x_k .-"!'/9 I&xVz]- ~]X(LD&?bDNۥ1^T" .[#h0~U0ۑQ9T`+ ntA5pE+V %7WbUkiB%)ZTRSLA8oz $B@'#@.h9H }v.YEq%,iۄLE>kLCQԽE1%" I+HPz $4fLꠢ}dyqybG RwM݊W݉&qt/z<5ZdJsAo~NEc*٘ ,.Sږ/7ʏI !C^8+!޺1_HHrcpuIxMI8KN`%sD`d_"k9\tam: "Bq 9U^W堷}LّDADPcnN%c.;V=6FT&5B+Ahk c̒yV{&8;YRʾpp " #˨a_8^H$(@'M(qVE%Yš+ Iy0)4E,ª#6D4jha˹7{;k 33BzW~ă7no'N"u/P#nI-e3c+qK9a06[QeMj`#Tp'$[}2;KbL @b mEw>/{@2WAErg?v׏P_%us2KPܒvu8\*ƻ 9B5Y*"܌_(P˛k$7~@Lԇ|& K1b ]שYVSZ*Y}]:=Ҩɽo {&Ba\<(ZxS\NXiľzw\D'J]ԗ۳]\{:ϕtp Jy T_؞U30f"$*ʥ̨F 36鍨!1bj8ҁؚxYr:/XAe7]${!}R4fŘdye1ƶrʆgcSAE-liӊ(IOap q e:DVy3p31ThfB̚{\U*Wry{ise,J7s'0 SML5")9=We; |0C] O ́8GgK܇?ƐR*o<}7Ǐ_ci%͔zlӓ[$jM^ oI0%Zz v.q(YLKi.,֯C"r*xsHPSbA{rNnp,QW2ޑX9dA:?Lhħ!Gcy}TƼ!0 4`?[ pJ.DA=/=iv+4Fzҽ]xБ80E*F)a $C- A,_͉a߄$:qzdDbMG iYؖYWQH %Ux.g ۗ=(+;x1 |hؿAFQ7%ȷ'ڊr~G-e>Q+ۭ%i# Jv k—4n:1E09`P?"\+Qc/ 89m:AneF;aP bֽ lo JKzS袐 O@L[^@,X4SOd%cʊy* 3x 1Cچ"IRo}ip8ܽP4Bc* >PZuB_-p.y+d\U~:EE%WzÛS7s!+8*`Ay/8 cc' 5t؝DVSGw2] .9"A'3*`Z{rؗ #}敲.HWjhÁ!Eƞ"} !>D䁣B?PN\0J.I 83/ aXqVm}\aM(5TdϒR-hSQSJ;RVa0l.|o`DUq HuV׫uFvZ^J Xwb,|jQH*%Fk2k-N-Df'L[bv~$󄓡銲cUW]šH|BJ!-hSPI9.!4m νg7dB:PŠbc3Zcڃ6WO_<A)e U6*#3+ytN-O¸Z66DC:W,~)Nr/rC74MъҢ`vQo ɧnTت|kџd1NAF2аRȰNg?FLn=S%0nE<輙_R銺" :1*aa)9 6WFI"pwiPFdC/*cl{? GɨPD1=rR~!̋P=P2mn@b+}ROmHt{= hHjuB5*7lM<2LΛ.RXOpdVJTaCsqSj>:6#<^-,Փ1ORc\Hj[ox{qryzBJo=T9dR];Nc`{a v!d'(|Ʊ"qaW6(/,SܔRYQ['aGE+#MP` ~OY)m~&{CCZJbggd=B!A?Ϧd88T՚ԔgۗE鑲+Ûa$̲bI$+ToLWA:)4r<1-o" sf!{!:kAgT7k`hF0s 瑬) ][ $%^kon#dhN(g,2Pv^I Yƹu yQ;04 d<|oe")%P$QAYj[d3vM?%(,C<%ܒ$XVF(Z fϕh6['r]Q*tA|*/x]q@m_,F2/R]ɅL*PX94LdM ԣ9+ޟzEŽIz28ଵʋ-s/xh5É,B4!k42Ž(CAIMA8ם="^(5F4q$'# OPpE;}LT-;ۢDRn =RIzFoa8_8n56@'d|"hX%h*Ž&FlI1p5MX>^*cB?8K²^m (3pmU; PIyLQOu`=Y:?W5DќM662a a0K_PvQk l^ VeŠjlrE7:}ɇ M`&Z00Ark}% >eY\٬zq-bT`?IL|F- VG^|Wm"!.~ H_Nz )B=7z)C|8Ç@.$ƣ.4ȱHrXV8<4K*gō==X< եq(.+U0m xrBkI{g:F|db=5W` @cRKyz" ޻1fɩע@co`-]A='|+)ʪt: C}y鯥f[lU-e5/X_;Clv.0??suGѠMi8+>PTQJ# Ud**:帺i("h Hk!C% cEKC >7>BkB']N⚉61E`V/>W&`0/J* ]F!o{K HR. 2Z%@~ݹ&cBlԇT4ړtlL"<qx9BGzPHZjx3䰠-43gÊK+ƪ0e? M(pLɌ@ 5imǢ'H?30Q އ3M<~ 7QOxm{{YL:xN eu `4hV۬ rg/'ၬPzޓˣVUIR.GpIBr0 KjB\\=gbpCRHT=ܚsT3rU9Ν|DWuVPm(n;/6}Ẓ|K(c߽:bsXi6p@%хǘڦr??>SUyV\574 =//ͣ̒c\b\G0M E6~k)di1>vE풯6xC2[kȪI_yN8#Ix9yɡYJPJKUIqxuHVszqPw*Ta6ia@l:%2 n!MA ^G,96Fef&-VB0<ӳ"A$'cmt" d-<*qoTu5o[ye~tZE> +(w/yu xD\$WP ;3$paPhKo(RkB+ݮm!_pirBgi^Ma>|~19 uV}zc^fG7t3۷?ˊ.Ê-C8X IZ4m&LJ,Nw\s)(Wm6/z<_6⏈j>vn_ bb,86E͞m˫}a(y ?x.t]0ƦrZ2Ymv5YՓ > MdJl>; `&$ތcO^H8t;ulswR@o/mh*Bv\eXLKt,AVȘ]HU?8WyV=eշ'إnloW~'xDR$2DѤ>F6Nz꾈n^t}IO}=+ɼ{#ƕ/svGcN+"Fa[b~ j$׊>,Eex_:p nvx<.SN辝bi]A{$Stx48<ΥTyܣ7kgcfx6ݽ` G[0ө #5n8Q8"x 0ՅԮUPDLXj37 %#5|>JZzfΑmdB@.J\-sN 3(qvSZ┯.9DV? a,m,p q=dx HK^-( TAz{k7|5bJc2hi7@kWxR/ųSV lB%nπy l*[{A?Ww? š02ӞxLB D[ } +k)*:Cwׁ~؃K(]63 L36\ØUUt@"&% F>,gS"Ov`XMTaeT]+R)|M-A8IuD>U`0cˮ~&^$ [tUJ.94GeR&?@^jN\XHh}ρD A6D0NQoW/O_u{VGv#dXX^~r&Hb>]ƜNQqli $Udt].ȩX>$*ʽ#';1 $cEGjRqaCh*Y PREaD; +GwnP/H- ^H7SC+9#ŕzȸdgk7[v|dP̙^>2nYt)dJI9h9*{~Q6-&Y)M *C3SGߣ&zM900\+E@y#$E c/8 w -pwTZ!bXP2#T-z*@`M9 oG7 J-4\>C,Vf! jFZ@̥vKv-#i^@jqJ{@ڳau`jz8^V# #hUٶ+)RPaam?:){-S2`^+-'"%侜PF>ׅ b7ͱ'_'IQQ- {zR_0*HOΣ>E';Â4{C|| А2Ͱt)(X|:F(.JՔ'RC+rmJ̡GEaԅJ+EMkkG+[xǰ{ģYDj&?-/CpF2ֿyi' iໃa\1>vTjUlpGc;0u(ܻI{2B0,2&IYWHn3PQKDo˭("cey`PVRv Rc{QESp,GoX?7h?(>n >7b-eBȭj~l!e 1٥k Ռ;lH^E3R]ZdZMYbE`! D٭jpBLQL9.j^fm CpB@1VWWJ}g_Jnjv%m *5$"Ov@JpLV!]Η eVXYzz`8_ߕ7j1A\ F ҫTܠȡ/¡|nRoqF!BRŕJ&L@>}^˾#=K#e&:x"ZW_ 6,#kt<(Rh}|@t6i$IDiW Ԕ h+]/6j^G [WR#ٌz1'*(9;J$ɖ`N?=]eMNE%Ѻqw̹ ^iԑO=xx /Wن3[L?o=:,BL\({/y3%Cb.!p\bB/Cx 4A.N!~Ư g{H;baNm1UO|}e-qzHl*z\L]hKR1NU 'H]r-g&d47~w ˄tUg#ē~iFyc]>/h/;6k%x?Aί@YQ9{fj+&dS* 0'.S8:.K]&tʨ㲅V%RT0@5_#@A҅דsjqoE,jOF3w}Y/Ԥ)N,,*oz1k'!H)8]_?@%u6.njnwq3j3Ϸ͔ `ӯ,B | I HQXo_>:*@ {tڂX8L : EL$ t`9R 'iK#ۻhme؀L){~T؜1* E-TO0ufײPOʄ@psIJV~"qa1qq:ӣS)ϩ3"uR0\fX  (t(E+3yǯQ֦VVfR3)YW\r2v:O8.{(Orm_c"$' U|!rs uX=.7ɂ: F|y,n|H8Һlj!4j|ݣζ갗q;h`{u*O?ZC5% g'9"zj&Ҵ-Xm<^(ʀ`P߼ҧpF\,g<h;'U|yӚr(^4 1v5 [^PljG`SdIHmCu;'-O@hmP5˨!Q!ݧ8ִWV QhB eps+#T//dOFM}˦d)7Z,$Τ8{Jʴ@ &O%|mԭ@;o/{NM/$lWga;lTyIW$Ak.=@gGVXxF—"3c̛vȦF􁈃ϷmIm~W8N\/̵;xH$n[៞ FLv7fj O Nw~) V:Ԋ*r)S'~TԫEU VXmY Yk;W,osom>s‘khbѠOOS![A5E[ˀ#Ʉ2"b ;Qɒ0eg b!M ;={Ӿ\5]y:` s~<;N3{!E*FG0:޶ 5-F֜&QCB{HTȓ"Dnouj)Цcgerd;5I뒋`dDndh(+84W6XDŽܵ(H/Er?,bۯJXzwqaܛ5-a@g?R K+zS|#DS{U'%Nc@ ҭKzT3}[-I ݲ3҉̑t|P}GBh rQC!x9 yfa.0n$Byc?]U У:bw+lKa`T3y>)Q`J˗flwpWsln%G;:_s1G)#[RBZ[k߾++®pc;8ȔS6!/($Km˲5 ߏ2I0ePZ| L`/DAܸI~MhUF3g%ď Z>!iW)jA:ڤ$e\)%IWbPGypZr!-^.y u Npl{Ϋ C~l[(m ?@I}ۻ_[@&̗#%@fup s_v rhem~'U3zԀiZIiӼ 3N}*/|H|2(/ n̛8tZ=h0X@o҅|ĵO0IaTl= E* E)"ǃ`Z7 X2)87;#Rh3Af k%'y4O@.0Kcc[F ~,&ȚJfS:?׍a,Z5&n(b!1xu`E<%]bU뜲+:8<'՟GFUнnhA% $vWz'~L{fN0.0ŕ&άEsӤe_3D@.QN6VC_X G$0 0RӋ%<+XJR`|8/I2˂8ev3h[} -p_<ӥ  =U5FDE -!S/ N6y,1\X~Wm2/ijN(*JΠl=(APfFM.`x\^x*?:9jĿ[#jjxIw7NÜ&q?`ܟ]>)N W{qZ ׯd$(4,u-VH"̒ϒ.V:,7ݝs9&ل qcK}TUbA(HdBT/oegQ&BncLHȁq m9Pz0H Ӂ{í.BIi=Z遹Z;҆4P7ݬr @.D^TP0͜,%l{;m ?T5D m]^E憨&nیAV=yt2w4\{cTF"V/N^fqU0k({1:dd=lR 2N&*L[eq ݸ4䰍C磉B0N@\ ٛX=PUere8F 7W§s8#i=9JOD=ީ((EUOǾTc_EpLx:2GM /w 7_aLa@ gsYZ㬪$.Yi9I¾g7VXg%X b s?o0U~r`Zu-A@/yy_s^aёx3/`aɻoM&:~"Ɇ#cʧG5"[ܱ#1iӂm); g]<4̯͐0zaXy$y=\FBqI\=U:^i[ .zsA=ō4~3I@J YՐDf ط{)wsL`qJۇ%R⭿?6|xVTtc`AhFLH^i:qqZ bIe;CtU Hif/;E@fԝxc ED2ԝ"6$o wR =ISv}BEGtzH.Ŝ0jr~Q- ˣ2S0i$jy ^FH7H8 AlvAmѹcIÓ[`Pݞ c\fk5#[@>ۂXя]|9?RN(ZzrXŊvX]3Skg C'Y[ZOWZIF|+v}A..-YOXfD?8(z&r|~@զxXpXr{Lejjs鵃L\.Fn`DK,>"t?r v`@ƈ+e2Y!0sJ1_81Iz=q~~2G~w*wN/>zyw!NƊ.)E\NQ_f*S;o@3 Vo {-, JWʣn'CYk:K ݗzP$A Gu*&z"XK ܝHRGIޑٷfu)v$aX&V͕|`3ܖ#̮-\Bp-.MLr)0=mզ5 /H\oۆmbJ@ːbIw(x޴u,Ct*%ddQ9ЗHrn*#K8TKta3MmƼ8Pד.}۴%<]t}wM &C[w u NQH}X@',Ѓd4d W5Hzȴ❊){F m^^ԁl]碍")k\QIM1\<9NnI&h" S3l[JIw՜0t -$ xv.z %ºLۭHOqN$,%#ZR"w1׿AJow`+O+!H&!'iu; Mf+}{[@,) ;ME"C?j۠ VdNpuBzusUNMA6!߾Ӯp̪c8Kl}("bmƟ\_w& }9y21*iH l L-':qXG:>>K6F -/ j`o0ϊп<4{֭-DS&Vr+}n61&;1Z3!$<_B 8&5:̌Qî^fsRKLHr4Mc jJaj U2KE4|hO0W2殅"@4ܤmoߍlX  P? SNr}d" q6ӱcr >7 =  J"&.&Ԝ$o]GNTҼAj9Y q`"1WLqqYN_AUGڵF1sjR7q?@gU5KzN*>1S] f^rL1t-bgYu!=uT9YR3Ti r7QAq5 vmbUdv읻<$I9NģiBHpX{G7-2.qB=H_w9Jg ڣsv|Zx0kD=FR&\b$<-~/ph8b&IzvbJ<3FP BxzBO` }uɇX-Y?]mHƐ(L-LUs MJPz [BFloJ+Jtж{JiM3{ILӡ V0onbSwN0I}M{JI8*vQ]}uW`PJ8KښQV_a'A8XCl9c{v:$u\<&~}ƚ!ߎeJoos* >#)0XbfIE9%EÙP;l -z|>،1RNqo%4~ț\S :}T=#@B,Gs#^Hxu7iB(>t*)ҚshE50k0|}cIN@Mabh |^8dm6KUA'_;tD˺ Ԣφ Z" Yb2|hk4^,j :m@Y4LNJA9IJ뮁nЫ1D{@r_P@r2+/gx &m?kar'ǚ8B[A9NNnq>T^ErBX 1L#<) 'S5_+՗ψ`~-ᨥOue2jUI>8mΓi'AБ-ǐ@*~ |k| p`W\YkYDm\\ÊMv$ŅDVlTTe™S1gj3E0) 1/="YT ^9]!1#ƅN:#GI#d2LX*>/٪>|P$_b+_7`;Yh=)*CxS&ns56#߼_\+ȡdTM&h17E=Ɗc흢ˍ>-t8(]dxUk΁}6\9w$F -/ _kd4#ֻçdz֤XXz&u|V^Æ,H'%>TPGsgU&{ ͊9@f:h:v$w4G%'ǘe&V<|ATƐ̮v,,2QJ,(q[|<,#kck{)n~O1Hxb*@§)@~H?޺n/hZHT"Ê LRҟʹ7M_TM^3ʩ'^޸v!ԝoKҒA1L#m5 M{i=͇V:> ԢׄxUڸ7A6qޣ,lcn!wүyZ&ѳ:20h.)5`ʋ"qq1rHX7kU[;yh8q}NmwMn ǔJ`<ЪQ:u 3Mk):<ͮ5Zt_N(ill2?gw$3]#+wbgCR%$(Ij;#%EzpĂR _$ ߹/J4x,c:@* 4hoVP@S@ I1&Ds5+4C6ߡ134p$5jsC ;G<5j2,4?"/.Y!N/~ ȣB!u(ϊ.Jݑ$ұȣ7r35TÔ[MGї;Ծ%}8Zlp;.*RZ$rzp7Y2ʞ =GW"oLAprϥPϩ|3 fvOSYRF"S Qnt˥RX O&%TZ".É9^؝N[$6?IJmGD 悉N_ 140H+kɂ jh=+:N"%EPNJ! *TfC!; ~/㟿扨T-ZW.9 |RYCyR??o/Z' .CXaѢLDg}%g=ۛӮqrwdԩ# 6.xi*c]w͙{EHidIokbI!ʿEedA[qDvh5ƭAp6[UB*㪵O}FE $ Ƕ nL88?fXɏ{BVԌw1"韏r?a{.5 'S.֝IW(wx>f> v*1D`6WDebkcT\kxɍhF*xr]4'2괹B'0u J;QAIa#\ zmi@$RWlo2Ӳh_1%4C*UA-ݨe2Tck O%OJdNYcV2q_H ޛ5D˰K:Z;w/tL!}Wշ@a0HF1gI"s(qDq.:Ho5A|D%5p1z0_?u? -lr>՘wdZKjX$%ސ$ER}ܢQCiwJGD>:RV|:[sHpqe(H KB[C 9gv#  ,-(z X`NvHY)l/)w ;͙_ԨjBғr~}f;tV|>K'[YPN,~7PdH*򾕷?o HlָzORà4amM~3]b6~ȹNqAH0FP aia$E%7i2)G{G3*YyI(*t2yzSjM]3E(DX d`) !D2ajYBבJEMAd#%W` 7B/[bW `hT*czqDqANdN~U~`h+X.wN *!p qHܟkzrQoR _kxZ#y(˼ futCd؛9>񰺎8B@yMC6Ō`dK,(pPN5Zz,\7&U\M^ =hzoŭٯWr +A@5o%NȇEZT>" s;=EUNp>5K.+\ ޓ҂M8:,E0j_壺Y=jQ5N3lzDweX6$:ۙw~H0'J-QߤTT g-.ntK;K@tV7]^(Y6_ϡ̤0g 4HTǸ g$ad,/iP;d qBN7b E8᎓9aep\we6'0/]^Qrֱj ڹɍRqFʠo,{e$]*\˧t'lp};y& 66f8eطu)lY/&5YqP}:-/rtBm VNw$.?lYs+c iHL=|GPusOIlRRj Ba+K`"mn>i\-@B1?CTd4Qܢ{*?R=o"& Oldž c3/ZkS6{TevgzD8#N]fJ-kx>h3mM+OQj borC$hARdRO.#2bXG(wG0z" \RK-r it PiTzP M7" 5y!)D;J>Y@q}V;oJH7%Qg< (G4@h3xD!ČG4꓂ly)"P mADr4Kc4SˋoG]nx56?)Hx"~̎΋1]&6#seYkgD+9 IKX|Wk:#Ԓp nOdFmy F/*ؾ U2e -$#_s4*j5jAM_zdQyK7'D򛿒boڢ}L#7 xj͡<ᕻKY 9 )PX*+ zp%EXLw3`wxw4S*r|b΀ *I/6~dwF-i|:޲Mq:@.#bj3!D/KT}jio_o{h@$nu׺ % n%:biE*l|<3&bPK7"҄4}P|J$G<`N .RTyƭ%@w `k7кL\ せ9,ZW9JNXtž@҇ge˄p*Ih-I)Hc x`뵂P`#>yuF}T ϒb\%O6!UXZO'9ᅳ҃71mu}S$K(*8=Mt5mS1"E@&KR(n=#G_ Ug#zP I~hd!;6~¯[nmih9RB2{{5e82Ep>IË(avaX4rcT 8%{xN0Co|OE$RuUTUа x}(Ehot -P6f5L_dH&c|<+=+\vxǢ|(9?C{Z4nN Gp'!7QfԄAESePIQBr_dB^f%mWzHk:ūP&5jp>L#83@ϕ_u=I/Uff;O.ӻ48= a ?@+Y&{ec:eX$":$<2߈٠@&>ë7 ;"z?%%jFW1Kv" :XG1@t=ƞ!;{CM`o9+'T p d:~ՕR ΰ쑔Y((e_Z4TVdkYzf eLNx!a{j2 5_>Ə$@Y%Z pqkȮKɆAFϡ]xƲ,9a8g*_KaISRX,Ѫ L-P`bhºVEـɠ8exVq/nS :Փjpo: CQ2eIfx;N$PV%ᨲ:.K8Kkxz,c4tU(`VweN@y+Buug)E<[~ Y5WG}!6 UT|:q̷xʍVq q$Ҁ⩞)tw@:[)ݖ;HD*Fq 6<<&ϔJ?G {^s1t0K8Sz 50MZg>"LoDiP ha,#&Q"Ĕچu;/OʖA4צItJ=U1n z+\\")ʋf^&6RYmuXy8Vis l.QDkû?Ĥ!mPA[Mm jl ydۛ̀$uvuhPgd6_,'qde;Vv%߶ns屺I=ˮ,C/B^/?/8/hd!Ƥ٠H- :>W,xջ !ܒ"AJ ezG2BZ|BR0e$YI20;^H 2.솚y"zީbQ;6Mf6K~8u{oL ŋ2:`ηBAL^  T추2/-,de#6{ [p|Z8܉B"2ϖDo._hE-SY*N&T RA8Wn[vcs.!*p$bt.vy#×g oq;l)6H$w;u~I 6A49Pq漉] UXF/9Eq0._5/AM JեebX]EjT F-edm(s; OBFi>sWx߂wFpm=yӘj-Ⱦ-?c)o ρ)eB:ZsϏ Qj8vqϿ[` P B|#}rS V2L{_2=>b4 (1QS4@'@3W_"[cJR0ULGK}A>*^UpiZ_8妿s'lǗ~ФȐ9, H&bߡdW:CK@}TXU?T13@ebX2(䜨S+GIj5-֥USd Zԏ]@PQTyeRાQQ ֹTy`ʪu7n S\acig '}d FQ.y%nޠA zWZy8Z7*8mM?I35J٣Bİr^2͊?EF1̦A,]xخtЍ/Wl\ׯ]i@ȟA786Hgc ifis"B, 1^j&u Ƙ[ws !3"` AVj,2ni+kfy;{N>a;! i-ѠSa  [)P;Y@HxddQufE+v3M qBvU*|6Cc(F׉ler[z3JK~. ~<B̿߯mGnS&p$zF&Ӗzʏ4UM״GMLj=BkI5t?D%~4BWnc;[LXWt$tW8r-욣-dH̄ѻv)TrHG9mf>6rPDhTUB8*}Uq]C6&#Ea*|=w6DgN8rw> F:FۘN)< ! `V j_Ҥ Г"-yn{lZ+_ 7W;vqpk\.h8@YD6LrA`OatDU,1 2}?P:z)Bο>(5gκyeo+B9e3R/d[˴?u 䛩r~LU6A>1l'\";NkQÊ6D~3RozJ|p)JY\My_BEoMHCٜ{B!*Roaa&`)JG08"`Y-?4Ʉ-蕝ۗM#6S/n0Gt^no2A2V<!;u( O8 Բ_ 庑̵P8ؙ~l5 'V[6̜dqE5; "A\-]G(\=XZNG}~}UgS@&h1PFɬ"Ԛo1[V=&_Yߐ,S'-Crt%BL1l7^ +>\]=GX[8ϒ y~ǶGM+bz]/iv"lҲ#:qS xZ` :_/'U( egX3H#BAj$=Wr+śbl G(-v2X.=@77o/lOn~C4y❴̼k<@Tul@!uIJoayPς*eqM|U۶բ ]qVRH-O"8KT W\;SFXT(zO; ާG9%q!OJbU&Ô_Ǩz#Z*ZxϏG"JsN LF)G" ҥG lY$KD,>rG:xѕ`܄N$d3tDUuCB;h2#D*KT.# N^ZnĞ֬Pcqg]|"qn1#,´W岤gAVR =ݍJl ~. vW3Rr]NQJcѯOi0}aF$k)jd{qJI+4E\_ۍ5rx7e]Ee^N*ۡ_ı),) Bڎ_ xySq|_><1ʹۊAx^2Lg$)ij߳p. eϠJn4A_۰p=iQLHp3,P LOo@z~@fd=Ua'8bZY7/B/ԁvPjuLH*p| mhԖQ'!,~d  \j3. BJ Ӊ6if86)z!n -׵ &`sST.=:#.I{L9$̖m}QOTC[[োj0tVSB%\װpj49%> &eyv%BYFz%uB' !<ӑfpK[;eХb>ahSk*\,]f7Ep’HWU(߳JZiIK)GH AB8+DrLnM9kO7 fk6u8CԖՔ9n-8kC_DåNw9!Y:h?`RKJ(Dj Q ( $ȫ9>D7+MEp|"1\5Z/ G ZSk: %(Y:}4l0ib4}n8ud1b#mkeW:{Dqg=1qzߗ~NԒ#2AKXv43| /=SR<~nYA!MG9C ̊eETBTrje('l$׿`3ߓB﵆IQFfQar"dÈnKx%6~,,qeѹ{H H#S I8U&L_61}2|]- <&TVFvkxr.JW[5 I Q5E4O^}r?@sƔ\: J=z,q|X ,E.xD[W0~u׋Q˩<‚P B;+QݶL#n %!x::=bƩ:p{DhZa{δj4OQA=<9P6$ sNskS!֣Ͱ½6K&}xX'h$,-SEXՊI(Ĩ EѪ!*2mA$1VR0yUM{/ƟoO"ӡ҇,^ǧ .FE'a5IQ^BCs7J7^y}Wj~(j1Z2 &dӑɴ+M3Z;B2 K^Soި"P`֦t@NfCd5)7'LFN?7lFFc9:=rֲF֯J} &UnQ,`pgO>KZ|4 MjUXr0ʭsaj~h "ªcSMB)x.8'=^G~+E~]|y'E._8X+lJtt Dr:Q+uE"3Ɠ 8RN:Axl?Pg -%V^hVITz2#^EP6zQNUKRbR'x 7gf޼N^ʒ?B96Tx zeoECBɯhN/3F`V&gK m0J Fh-8 :)νֿlGڽ~QmؿQ'T@*(I7bdL`p:ΐG݄v+A1a߅,( ,I`3$X'U`#h߯{]mm/뫱bY+_2+yzzI5WɎ3Y1*9ct6Ʉ5 }Ǘ@xLEfg4:/al o8H)C4^Ti 9W=l2p>>U:-StQhZknjagݮq™ޢUd.(Q  ѓI-J :ĸ[*?hKۉ}bBqrhD-\/Jyu, 8)46jW C90v330p>E:.0ch2iRiosu=#!zgV Yz" 9j.{aB:0xB$3λoz5DђGfv+1.NAuJc =يIz 0컕|*7 `yyS}o٪\-եՉQO-o=d,d#}n'isdV gNk*V忶塒[^@4e P"q|аc;pԌF~015@:Jvh+:b~DGrƩtzr![S!_2 a J_O%:墫xJaEW.*<3@z БδSǬf0'+$r)/B'eq:yUu%cTvw6JVUh?qHSc4l:lbp̔.]ư+÷zrI<w2FU^t 1v})R 'TO(\ۃa :rGڟ$g}[U5(N߰(8^X2u<,)WIVZYBW/SȌkmW V ȩ:H(`VP QT U{i ՌdxKm; U2p2-+3 <=ܿLm@, wІnl]ʲcRYg&j pc悧!1ϰ@;4gbݧS \w&".v7'-\F4r3%nl F[t$Iͫ1bJf⌥I 7V6J;\䣙SZû7S2W+AB)-TB`7K\]mNG•cN[z>֕ i?S%@LJu0AZv>4Ӕ |6_Lqm"sh}i5.9Vga᧐63sM,<3>jt :1σu"XaI=mY8 {@˚B,H~ "c)!Jt.}prJGE5@Z[a/A֗=f%Fnڝ0.얁!nzwƍA ݀?E|ǫ+RƐxEgz5w6)ʄW4Q' QVtLI7ޞVuVmh͘Ĝs`@yWEJOEKHc/gլ|´rnoK0-M@56(`4<*C#XtRJ`i¬"=L %sPdB'm 8jkjr^de1kol 򪏵F*R+U>4QQ5yQO0LuU_wU ,Sk:rQ^u֋A$P1H(Vi%a[!IQﱆxÛe5t>54cMMPIc_,Ma d0[èozV.F֛6%uB#)ڧDT -VWacs!k5 {b@d[0ȕfPplmtMA (_0ڌ$ÍĕF d qC.kW[Oj<%h>4.A7Xב06EdY߶sx$,Iv {ѴkJP-V:(DUhUlcU\vds# 1Ly s@,R4RT bCOw1ޤK%A,q;[64 <5 춇TIW|at`goʰ! )NTCDweYc2uxPV!BB,ӥ8X11 iV 1huNˣɬKwȟ) ncNDOFFĞDGkg)¾~)>KA#XlVJq:;rzQ+H*}2A"()M8Ѫە zur/s*QQ㽾re)S%R1)h1o7yͲ,Kd+nGzHem 2Cah !iy%0 m՞v䁤%v!64}R v#kӠ{>~ʵMe="I1.WZ*N~M)/bڛ1ڡ9e4*F ]\ P)6ή(+ي!jM{;þK ޑa64Ws'Fclwm61 C+򫮊 V$Y%% Dt+TAX$`꽞1ͺ̀5Нi9EwI@7+Y=mԪvYx#JцQm7?۹ns3NjuGW:pT}I(?YhyZ{"dza\8?Ji6VW.2i89^G?u!{' (x(B.ss23yVec%^=DB*^Oc teթp%^_H_ rЃd،8kC訴e%Uj C@x#QfVFxf҉*I8@ӋWq w؎xJf({?ʗLɵWhF 5Ѝ0 ]!44UHSfnX=Wſک>γ␥o3%c<ґ7 g! DBϸpu7ޤxԼ,{>g7ybzϽ܄ 3[OJؔ8ʃDA⍣2|"SN#[-W@wذ\PM2s*_nu,' +ZJW[\*%dx.fͽoџOK3'VyZ7dsZ!ab&0bmJp/ɲHn{(lbcxQ=Y"f+r˃(HnE?wyHDpXtioT` w^}@FNDCQw _:"=O*!r86ӂap6j0CQS{;\IDY ;s w }3W P? L]{-[Q!"Ki:k Vnd)&y-M}#0|6@t,fqa|LG&1'`s ͞YԼ5#lpDdDs ~l1XzI%n("3?Q5u٠DO͸8k*@EwTe jh #G2`Tc-M‘hZW5FU 7'v`D݅O{6:YhUJMx.ꈼFjce@N,E3sЫ=tzƪÚqΖmf#c']*Yګ95slٸ^9T cN_g3neӓweYls`?w [ SIa*uj~Wcq@;K B2u?*:ˉ !f/1ˀi/>?4o/p#E6O-`JnҼC3'u&wQ(hyǮk+NgJq W'"ъ77Kn.=OlI q?ƒ%mb{#Z]V s]*NJe/ Nvk ̝|K8GcuED6a.\Vߢ#:n,5)p;Fhb^A'\SDt>s dRQs`fT+ V`ItqĄѡ5l0l%JеV޺z ۧ'Џ{?]M q^4a#h]O0O-pw;&N.ُQfpCh@irp8wQˆwآA93ihqI bz@iD/Ý둡 e.g,*i1 lEW={?a̫m=<|H 9 BZG׼i2AD]S^0J75|շLjTxϖ'kZHpˉF4AK9ZR<_nvPVO ͅL ucEE/v8rEzqJ(ƘdJ},p!M=&~]+tub)&cSׯ|O}% Ybs8(^JjÕ井 |lH \)Vt]ઽ.+5ݓ LzA Crc̽|Y O/yR b:_)A͚!$'7Ep:ĚBܪŲ`A;P Sd C%̵Wŗ`] {z[{Mw8璋hCzn`sI>ý <( 3Axoޅak %KQEz1`,E[pQ1F}/hDGBP؟MiosnD4RCk8PA=UYg0'_bi/73NV 9.V ڼmY0u_@"wDJh p <)<||}Ee=Ï!xOcN]ⶬo1 )8AN; vberd&vؕܜzJHi,rIm/h$춓! - Y AY3H2͉wCZ^Z&w{]&4 [gX HLb[a4)Fc!F;5͎\#ݨwl g+`!tR#֚śV#o X:OWnZHjD髞v!q4{{V<_m7ZA3N|@T;ppjX #s:rN .j'N/RFAyB0TT"iL+?  DάL𴋀?ԪLǜ ;qٜu]ѭ?'tP8(1{_Nd ՝o0E EzaF N<D-x}@UXhM[P#%. X)Ƿ1=@[n54MX<(== ]mʻ 1דviY>SWvͺSGZ#5-rY6gLN;G%f0Nى;V8)\ ' cqI/-{4I ʶH%⤢ZN@UbKlAQc>Ceڱ|J)r優Xe0hW3~׏=k TRWI,pW=B! (X#Qj3Q[x!e K1Gip ! <>W5~z@TFSpӞD>_ޜqrn$TS=5}/.&h7,4kdiЌZԿ_~x0/hF#AXkR85!_QC 7,gd@B]fsFef=`vw-]e /Y#)I =bE+ 蓻2 }}[}ycֵ$f.We=8Nӕǁ= [ӊ?,dx4nօSB?Zj_[ʣˡ1pZn[@YǭҞ Hj_w2S;<#\/3Ujuku@@븘]7`.0„TLxo(K qwH~;]琄ύ.,ZU`n\u.< #%?|K62Aj͒Fj,B0\FR,GT"!vjeiKSh[r4u 지SoLa@m 2 Est(׀V ۺ0k=Y;w+yD'uU}8e !ş*BѮCiOm[sSg:|0яH^FQgpuiĖ61i;." 8,0Pk Yqq@odjO\B::KB 2M7Ym5-7w֖Lӂhʚ-9՜ŊyBѾw6V HEwy砥~=\6/~ !0W#- xN-ROΦ*q1D$u/os">0 І31PO-|i.mTfciG(P ܆i5h|Y"9JG`WH#oKȭQh`{k`bNEo- #29az[W'q7Tmn|ҁA؈"8ȗm!ͷ]%l2"s :RX@g4T0%=he#瞙YTRadޏT68J-C]tf=.2@foP-tyڟnBYua +RR }N~q{_'q=50p o ٙ]x3Y.![T#eV7Q3Eq lt]gzU) ,N79 {ECգ V6b/Av `,SLM!'mV"v!F ıcμzJyJ>R ?1bL n^يe? bOAj>:\Rc;#^6$l>p1~\|)W$!9,02#\_&#!hMѤ/~5M,H_ dz\\JéԐY|q^D {KXٳa=lj;-ɖ 1ݭ8d: G? .?${")\vjB}2I6'p1(j* P%~z] EXiyYs#sd#0|" K!ps1oRW%|[ک( Ζ4|\˹*u~>ߧ6F~(Tl8@`A`^cjМJU%m[#}L|6 U0X"anGQa،~X1yЦD5 c.5 L"#(U3Q.Jk'Ô)wg)cqCgSPڦuO! Ư+]RC ,ydf>lӤ^ib,Qtc y5uoT 17?{ePQ9VLkABWuu,ig}|x5;K{y nlu Vgmy2g7@SarV:~,ApMH!\܉YLHZ)T \d* ̬ZErmji\eI2V=`|G_`Jrt17) ʻĔnvגObS\ H: 3ar I㾗\L"թI5E@0FL%w?g3AqSO.(= hc{_ :Ω-{r_\u͆,P@QcPROOoJL+Q輽aOLM brF iY0WogC7=ŵ}'ր><6ٚG8"a+z >0<1S}44;ZD.LbkQ/涺XO|G 2kPvB4nitإYFmB(֚#3E'qXhLzS Sh^ZƟ;r<na,<+F䉕MNB7i0cfBPP{v@'PPAb3--}];QgDQ}Jdq@ cʋԑcG,@(ZcQi,L.Os؎( qu"(tܪb8S0I)P8Džx 9q^<8{\y(P$G`uq˅/.\W=2nD6k$wa¿5 GIlP]S)?Z)REP^\aA hH2|"!|1& ĜN/D}ySn||7v?2!eVl*= L b:{9  z٘\(8H41N.K p,8) {-Dz&.]S{ ^ROBC)Id;=FMDwc Gf6ҹ.z{T.a&rD,k\{Q ^7Gk}f -!"33]7֣-Fa5UxSVa3mK7c Ч1 +aΔ5YM6Ϫ߆.X[bAnzӂ'å7BCx AC)Ņ%0p %am-lϳKGk}w5SL JnY.{)5e,6řI,%g nB0 fTYfz$$S1c٦"A2[÷ЦriLE+l ܴ9Z;bӊNMH~!<"Y{h6&\ [> [[ţʈsyWKAa¿aBHRu͊bFR=ImίD&]x7I#ҎJ ՟a0Fes 9(l$K)瀇SI*J5t`! oμ[o *ħȓK6ma5r*7ܼ.mJ5t4)0 D۰(ﲻ_M^WQ3Òh7bد)+uE,Kɭ~H 5`h@k9mΨV' ev_ A;S6#{U$iw(^J7;<@"24p9,y^ӲDm絘w ,(}<,+U9Rf= Ĭ?P Rp\ma^4t{{ 83<$Ap*v%a^ª5U-T rYivDUD&xXNo j_^8;E?&eUR=g%TTyTZl]go$kB( \ԭ.=b utgΆ$I1E8p#!QE٪7J(w `}LA3>ڒpicp/`_ah+8(cGj<9W?}YT?.+ԉߝ.&8j`Zd 6QsiG\CŠ t3:đ:]Ki7v!ʸA˩mys>kq $4x3!d88(@qry`ԙͨL=Z?CԏQCCz0ܸ)yRlU]кo'r%HUg~ͺ# PE`yAG+(vM9D'mtϔ%_WShc èHZr䂶HƣZ˽b$vW"^jF VjaNjtɼuE O!kbhMdtaO+tB1%=D_4(RnMJp/$]JUXZ9N)Yw;KƑ9!zVK.<1C6\N[.M z5g`h++}翑E s2[p8g6JQ"}}Ǽ*BfwA*`ǯʹml*+!DtD苧%}Z(*̫*~.Sapة:^@>Ro0w!#o!" Vm%ň#%_}߭ї:(5 %mo ucN,/`UA~b' !DrkG&8`*΋$SV .BQζ'*>B"c|ҙX 2 *s]_z_NM%w}kd|NKJzВ4Sw.Mpe.7 GIq1:yAQC:&g"Vѱe 8}Q杖D=+kAвb2BT]6me̯Es i*u e,p7哌ɇR0IfցC.x*nvw#1 4|:CC*CJ!iSDKvR, ӣbj!>K7[ht%e9-M_alU(N"䷅4|m3iQU 1ڞDN<C=H_顩%~h!X}ʜG+:* #@ p%D(JytӇ=?TH S'")sͅYfNe&`a<񃡊jpnEhIpo؛b `׶xfإ!Omf.Ay.8b z/Y椣teªX68ܾ֮7ೖ],62zt\=FJiO:,e*{9܍ eNn9 U``R5yva͑z,C7!9gbR}c.Kts^0" R ?PBP YXL#wpq9>D[϶syo)@O"]3ذnifhߕP '+ɀuҥ[ $)k{ Dtd5.$9, L@_b]toŤm 1-:DyE5^\މ[>6ytlحmɇ%ԕP;0. f:̏ t 21`2\" GDЂg6 f0;j=`@T!R+o1ҫ?1 ʎOњF#5Zb&ٮ=GUZ$-32Ŝ椦Ǹd*CdxUehFĹMAWM+*x[SAҟ$ Esĵ2VZ ba|.3!A9G_Phb ciK&И0{~'2/abN7hNP__O$=CH Fpx2(ah?|NjCxy7֥ !*s1eI누Q\\OQI,dE7:j><Hz(h94].BA+|I͂s g*E3M[jI]j:r<#'zz5J^X1bf pQdɮDk(Ļ͡O$SH0rv39A,6'=sRtE8ō^kBi<$C7R$c,L\Mdh=#.?Lpv nCDS!S@Y!8q|&`&';+#b-ϙX˵- C5)PYW8Rޅ2f&Œڶ2>s"B~et>~bVHj)kSA[*l#a]C&٧@6[\GYVyaG ȭdm`R5#r~Oqo`Ѫ]6 I]861PvFF|t'@wrxk`KVzH@şa[yTovc)tBdMG`¾6Q00D&A#Vtmzp])e%^<"4Wc 0e*U?hI>[:f6Jɝ\K ?ܴK3뿊Q@#D`8 >:/L[S#d,psV>y & GZYi3] {B;\| 1o9w&z|4¦V20 GvG<4^*ӾJWA??a,qu\"$<'z?Ny߳] ]4e=JEDƉF8 91QGlwbȊ8G"g M Io\-X[fσUp 3LJ5T!sʸ wvmQHֹ TЊ C HR_,$(~+2PVqR1߈We-?ЏRֶGJjPb;zXEDׄ/4fy@ S669b5XdλJE8dB 9s -d%yh|JƒDtɡ8%'  t'u/G!we-jɽ$ 9`F\%4] T`BJ•h\@E xՃuR0:Yb0o \ x[Sbc1▾3}D0k%–\G1eΈv=5$-&bfsR !#CizuWBA߮B#˘ < -ZT֓_j5^6uB glx!BQ!w$K}6Jtnrr `BVۈȯF)&K:K9㬕?̛k&䀹U,̡uYqW8Gxale">CzV)/;BH hU/1i]k-'1+^C68FhM7^TOhЧRm{04WN-woFoM_ɅYCp@G+2FYLHk弳ޣ5 !nը!ZD dr÷fe0Qð#327Qje0Tܩ11NSM\7 g@ºC:^&sy}66!l4GPcd6{mϳ>}2~1"UwW_r@Z]|vQ'K`f*Z|ymv[5!XRE?.ei:8/d'8ax*<[oc~;}e\ė o DפoFP"WhEu+8N&gv|odؤ1l9e2q18%$Z}NA]Z%4r.j B[aTм2X\\jq&)0.[6p{-3m~5s 7BZ`g\F9- ۽~<8Prs>tu!N J h;/[;ۜK}0!K|GO2M.Ȣ{wk/j(#HS:eK`/O:ՓgW*?t7PZITck\0q=<{՜El qC}: Bܔ̘zD'l,w]=26t[EPݛvS,wxU(a'mmoXaa <'"HǏ} )N}D;pq\X͓ ), FsfI=I&?N , ;#ڃ7ͷ7zAhZӫ00@, 77Չ/>yX??@Vɂv{g7 Uf v?,uG+H(@̀ONCmB%AZ 35ac:)=ݪو?3 DB E~l)@Lֲ~;9Qv 4wOg]-rg,;)K|NI솤/;l:RI[ܮmEȼjxBIR9TXf'DuBvoĝ"n.FMG0_[ tjH'i\B3L|U2r)Rʙ01dP$_EFHCer[b%5DOʻͲ'ޕ a\kGU(F̾Ue##5Ww3W#(lXWuxx/I O5wb +t 6dCkUx`U,Ή9Kq7WBiױ?Н>3yݮN?h\px8PHƳYG9~ökC!PUC_7K^R𒳇j8U^L|UMy,e&)c5y`};f!*V8OMX&t7KeYOW\M]pR9˫_'*AZ9FS:}dB0 ,ӲU rUX51T k٢d?kOP¢|ř]2\cQ"SDJMVPYʼ,fr`Jy;nn6) +bh-vQ6ୈ3cҨE<Դ1Ra9V *Ln넷}lU2DQŋ xC(0 ۗJ(]]Aֈ_ShvwY-P[-/klXŽLXz0q q$lQ$jfHF- + NUg1A3JZ o[jJb v Chͽ/CĢu|R3K]S,؅nq?n)=lGRʴʌERPۅh5ۑZ'gυۿvb+~#8KLvOTN!q%%}TUދu/|*nYӈKzAA|QUW2$Qލe=*E uˈSPh@>W(nl*%%Jn7J΂%j a$xv]us$G̀@P*&xf)aj/Ό#.],-znbu)5||StEpze2?MℸQ=jΝ L5ML8f~gFF"EoHkAS~%%nɐpPiFi{ C(MSN{AF9Oἶ}!DB9N9yqO_©9'`SyT|htOov&P,"Bȭ_=$' ic{ [E uvuD%#0@رs onml 3K(jy(<[טr_q&nkw0klY OKؿ~x'?3}1 >x0.u q2 }?> dN;U3S X`I׋OʭZ-*T5 ޠ^h2I{GTeZn^!+|E%\Q%"޻֗H ?4E( [wM푎)4\+"ӊ٧Ĉ-3#`/4[(*Q4\֒x4E}ľ1/3e_D "Ũ nshV5{+|M.TJpȧpC?3fp00peggeXpu),Cgy`wl=ٌsfP+lȃx0d,nrkz9㗷cB>d)?k8_"btGFѠTAU#[;d+SM- k:XM|PO7nS)p{ 'OõdD޽$%bNGE5(-;i8eu{9 >?#\y$ߌ 'Հſz&N?1<ruSvP)xމ /v Qp Gb zuǮ{Cb!{gBj8!c+\QAmt!*Zq.\3[ˆY7Hj7 HFKWQ~kOݔ3ܼGK%}W]/'"8=+Wٟ]9|.S{KavٟFebQJk )K$%2*W|z+ohtFm\Vϛ@Jr%S1*Xai9{4v<= 65XZ6 4LO#X*b6cćG3qT5ޥhؽt?VFHx#_?9o"l eEi9*sz[{|X2a L0z՗!|=<:˽"Ϙ fQP|*'WP6*5cbt $wF;ep )uY[Rܥ&k#![~ܪыR@y0{ϒ8,3ܗZq0D$F[5l(s?RqNLz,ZAJMYLݎ#paicBC'"B'Mh9iLS+!rjeNHyAUi A=-^T2{{m;;C9cB]}tU"[j$_JB8 3,TBыec' ;؈I&w8^-^74P%ᇤ<ߨ3~}[3+dY ;/ "ĭ!u TTIC2. 2'bIZwH'*E 5o%}yhZt"wyEzΓqsOaMl1Q HJ=j/uyPBl7&I}gԔh&&QxWIR& >xL_@,Ǟl^2kfa#GF8x^n?U깅JAhC P]BӍTd]_{@NUIrm/Zt8hWnC{$v0iݳ@0kA;n.{aT'@+o& qYͣk˗.τظ{ASM!ۛvr/mXRO2avӔE3@{0 c uurxzkh8r|0 Wo4t y6%< ,<#xKIz5m3U'#d У/$w\3'=eӻۙD0Q]o,NlW9DEZJ+`jMZd2SZhMZӵ|2֋p9_O~-Lls@J6fi\QPLC,=!H~4$2(p4do}Թtgf@O-9Q ObkHO 8fqNOui$"e x<<#$_ =hcwG򢼚)%dK @- ff.LÄ`HWQr'70;w*oU0&* $%!X c3i!Y >-F}\]q <Г,~(>P(̿= E6M (8^u$/ l>0 rܳ42 v͍@ݷ6z .eSj,ퟳ) pڄ~~OF ̔TPkÍ".F+)BsR{}UzG3Е1f%օЗn+T+wtz[9pi**L?JƉ9HRS@ 1bsYAj5$ͥu?kXb\U³fޓk8m&,N8cJ E<'zc&j9>F$wi!Z&aȌDsuOsmع=/ƪӮ/a]`/-86j"7br6"M8R> ˲ eȥ U4ͭc¤Ki4lhʘ< B R+Za0i%k>Qe=>M׆.1fe&7$#Y$26S%seBx[Qgհ $>PLj[k?+ڂK${+1Ge}d!`&@\:_ǵ`H dV#EG#w8SAN>~GUyMh?dɱQV!eچXRS荡6٣u=bFU~NNOyEWs-wʄ?\p@fYlzlGN g֕4>F]D%'%s(n&<율 }B%\C;BH!DЁ)5:pPԛQI⛷^DXyozr)xgub[ܼ6O ef>`ĭ{b;ykOH|GE(%rQƟg)@B0~4@05*bLB4j'1*@ĚAr{+dMy5wQNguر5n&/ԖYke ɹPFH䁐TTT&@vPTtк}iz++i=$"rzrRDZ{,=K./Ve\ڢb߂lU&u@i4NNCEB-v:dr 64*K, ^kzBrg[j43NNL YS}DdN3[$O-Kc)Tﲐ%Y?:Qyer!  TAX0Dˎ T"eW FԳڑ8yj   a_N巁ήa4!U,Ey4=Q^$۬eqʦFhۮ(t^?#;dry ANXva }~}BOt;.Rwe3vyTv '"k VqO n h !"J@$q{K@Q y*>)?y],ߥlhaԴ0:;**ͦR ˓Džo>nHg1y+\B fxop_Xp Y22'vey׶€q7SƑʸBz ٳCƫV.2(.kjbf+<&<'"13`mcI8=%4G>qyͲu}oN,ez0lHGqt!2H4dp@A'" i:A.7dVz%e6yZ<"a̮wF*EjXKMI% hp/E-ͨ=G%4D:qȐ8oLtVe0D[#GET/I|[\b]/dٌ%_LM.^ryu.g`1S9dkH' M)enedL~=}p)0%3M)6."BD#>fg]Q)M2NJD@jglt?kxsk62Iyd crv.OCh^U_/f3Q0ᆪ/J0V:ׇ77h͑=lcР.lB]棟П췷8 NϽ"as\+ _~pj| d/K3`4SM]gF9 >PE]ZyI˺ܱ,ڪ=lx\mSugn~V8k/GŖ3NЀlJk a(e % nIG} ?!'>,Urǝ=󹣁ѸZu V~ye]l;%ck.кO>` 8 ]j iɲD ;!|2 Cu2he#Zd{$̖ToiE} ļG";-%p+r3"[z]wujӟUH猖ęl,Q2#U@eZ胛ҝܣ-h6d4e>#i7û^_U.sx]nQ/i-/9 BlZ#X7pTW.VPga 4qKY̺5y@iR`0D*/%0 HaGRa o ICK{ϼZjwX_VʈgKL&bZiaIV"<Ę `CڰX߸nKQ!0uv?Rf{ %&js-`pXz!2⯌GBH=VWHkQNhQT(ʉퟸ‚n!M?RȡfO\;!9&:/wjk= 7[Nq̣b:>+ ˱5.#@5Buڙ8QٝRL 5:]ť}MwLw:_T gG,s:`*nnYNnP\¸6PS#ST|8`EBX2 s<(ے4z@sx^]5sr'l+$Ĭ<&3gnfp0U{Gzh*n@k۾4| '<m} MXHmԔ?4+tD,fWcci1OR4} <3IAOcok!*-(b8|ltiјchކB Zd".]YSx;6L yKD?ݝ+t-_8ʉmVlb)e&U-EN oz9N^h8N.DbmJfAvT[L i[~L}]fNaG +-A:R1GI|ҽ-mU0pN ,Jb;֚.\>'@~o# 5ՍhMv"LglB5LJ]Q a]OCJ`u>; ]<1oʃ'oĒ/啰޵:$LkM/@~soz:Hi56&ռX}Qn6UEDo ]:+~nw4cb.?J ?X;LOI\HV&~N߼QoP }]i!Ud;'do+#KyԟR2qx !a&? Z/Oc[MZRc.[@'HU(TeZ3gAP 90AA9+z*rVup`oъmTϰ,1 M-[. '̖\9dbς TQЭjP!8Ӡq5ÏħER߷w}ϙ Y£*EmҖ9ݬ#,0QSG1YKH5 OQ_#$$+7iIUFį.`v6Z8{9'!dcҮ咉 9tUm^a#,Mwz0B"nZoأyKh#Uu]U-#yA!hZb4U&W`Uҍ?VيeF >>1B[>ƚ LV8J#CےvgJGRd7=.~V$fV&Y$Z8< Npbď\IDg؏qv[1hF4Fh!{"8@B(֢E/˝an9 \W5; P㤞)_Os0@Gee]Zutm 'b4lxH32zD*ܹ2 W5ڀBkhGqMNMݑ_b84+ -p3!P>4H?Op폪ˌok05c}>!5K+|h!=$YhZ\PYn;".5-1Qӆr(LqhpY Cu25uHÄOgz[?,NWD@*Vc$*ЬƿF*MBvm/`'(Hσ7'@:Wq2@(jL Pa#a| ]P27_"LL ڔÞzP<]?Y#tsUM %SjBЧB 5klS4wO!әh `ڔWxt(h@$ϛf(#W"vp;SuIkQh6QS0mnrFA~B:{RW$x+=7i!c__dUl`LLQ%^ؽRKE:Gx%))FXH_xٱ7j2,q&D-v&^"w%ߛ&rRt!Hs ,I9_`!h(=?lˁb &!_%w?<Q=T\`K8`F5 =%W`큷0372&,q"VsI'D%K[q6׫%v6XK#_Cz隰x~Ub3up$HBT ;.byz&m؂pFAϘ;4Vuc5]K}c܌Q& 9â/k:HKp"}@ő2Cޠv2NQa7?q=K b6\KsdW*r :zh? h H $Y  :3!FK\&iL b/*I!9n'h42}4Ͼ췞KV(GnVA-+,@b4OXEkfEB:[^ +L/2ˉ:#omhSƤKItC B=7k|7 WUd5R~fv[466[m?@7v{b^anOe.VJ]wƺ~P='GxL H] ]iTEwr1H'Iץި6>)EKe0sL]<)kUnzL00>B?>&1'0W,cʭ$N%ǡH~9Qu&)d \D|JIv/m}Sկ(PZ)`vD-.+_<u8)cvPQYM ֲW)bIB8Cco j@ee0zERG&7M ڬo?~̀ƳiY] wvЁG!OZ7eϒ!] Jz xHa-hɑppm|ȃ:3G<_TҶٜH%J|;9eR ͯIª*DSv4J9Z-wE`H~N*xOuGpҲKMtqpc*UL%gBG: @<2alobup(<}n:[iT[jTh 邸RCz :ri' o\E|TgEy.{YiٙѾ1;T3ފb \!7C7 6"*Ä}fDҀ.st#G΢Jg{hf. 61iqVI]U|R9>fdؿ6JDI)tӨ 9;MhD=dTSD%5s'땹Fhu#0F57 .WDiY 9kpXFv j[.?lڴtS }޲J/3e&KCn _χL#Zp rq"ZA} (#avAE| |&|(aE.Q`i=#% ry5,m?#D0/ɝE'Y ZN'=J2,^8&e8#\ڲ.8oj ~s{ضDorST&qP^Kg:sH˿'Uv%[ywEJ~pA+=dYːs*hLFqhܯeVCO7JCtt4!WD2? EC$}HpF SڡsZ ҉ `W@_ ?=!˱RuKl؍@`EO tWGIТ MtnʐˆSgLF$<6w$vz w+U<ƣtI|23ۘ132:V"CkxuR_kD$YOA0ȗci׆WϦ޳|4 HLZ$)Xڟ)ұ\Cl4{Gsy:0u PRvc3@A6?l_l)O:b]RgxdT\J(H"&蹹9O|s(/IXemeØMַ-9ү [ZwfYS<97 =?&'B *~͊񀞯%36]{/HybїF:ML=k•~ޗ-0A PKHWR^lP?w@\R0|V`K1/ߦ{wx(Q훫 ) 9ً{ip%ͱ# ;ʥir=CqpiƇDHl酝2`[Kj3 $mk)"] }guiؽjވ/(W@q""bX@`iB;ޓSݸ}TGF4%Cwƈ2qJK/>ua8OȲxt^tV&ra,D/ ni=l( DnpǔXhPū%b'btdW.g*oҝ3Y 3Id904BI,R%&,2 Ե=M̠Bx)r=H,P{i|%]˒L9Î~Ya^aA>g1ɠU"z #0f֗vo7EX@z5ӗDVau b7@pM01SHb-ǻ=l\bfW HnjP2֩\CI~Sެ"ƫ>+ӹD5]m6ૂ=zBӛ# Z̝+!C6'asEUoy*>Ot %bř"JуZAr4Iը2v aSDjG  Sվw#i`~P+X^v"uD7;Ĭ'R&%faRZcrGxY'gcي'?'jz-gbׅ 1_;BLYhpҵ<8(+a uSGAGFmнy74LQ2ONN%!z*@5=,=$)&{ZЃE.*K ڌH8@PxŃ1<؈26a3Mu}m-E+NQw4FVsj zb2p-\A@J0vJ?u&G+~!j~/3P0yLxVSW 5 nG$WuwV`RBqQ}<)A۰M6Տw(^!m$Mo39t92ɏqB6r8? U:ZԎZ^_2iYNDEbMہZn\zF.@W,ko홙iyDM,#@ 4n ܳԠKYֻ kIOPd_:ei *L4DE&sNI w:~?]'b&XBNVb ‘Rbي-& ȇ ã IuG*<`NOvF[k-TVs~s ͠(ց%aRq콍yq>,FKEb*wpI;ѝ0r1A3ڒ"B MrLtUh>Xg8S3zB@$xJUsO˸m s'$[<ﮙ=M%tcŜr憭HFjE4}h<r"&lj[:Tw_;;%/m(~iхuf 03ZpHnT< D ǔ ;.,֌{+i^Fxx.I9 `r t1iL=7*{%t'uCa1Tk3>9aHDiS . h8o z80iLCHYr) B9 A:Ml5sXJ- [LϺY`lcIs} Z0z%.pTh,ފMqP:or'%~)|ٲ:ȐslZvB(ŨБc<]zxS|Xtޱʐz\HYXF2ߝ8m&oE$E4&}uZN5H]Dr_ #F1̡8{} M!̩|wlL"9Ogr)_$M:L]DIJL :&Slo?2F\\J|QaY8 Nߎغ$z4C ulhByĵv C<|)$lva7Y<ܽ"0nGi?~9J[-*7.FhAVH7I4\x /lYck?P9$C_ }koAQZX?+|?ekrq2a rW z@虘=XuG8/|hrV^9I0o0 !6#A_A%/:{mlWPQ$s_D09i Hw,pSn>%]̍tj8K>U8nI,p~t(+05 qs:SzEq(}Pa?сNz2M6@D[PH#}$L$ ;Z,)JغWe\]:5ުls!)0Z .)n~ޡ!I!Ƥrj#]<4%@4.~|˦b0K'IJ°fBci+p1$vLhQe u&x45;(M.zaˮLf٣QVd={B[\,/yŠ)gMzhi(\3PӛF{'dFV B*א)yPvm#ckVʬfy Ep' 7՘ Gfh3BUV6kȏV ElI:d9}jqq0&%v4@aniBojd`IOy#A$4D+;NEs?MR߲ôOAWowFyIy/J aZ=t @g-_@->u;36(ŻHz Ŋފ*ʄ ? (hpE  a.KXcQ+p;Er8jfaH$Dpਐj .rZe!!(m5 p>VɃݎPMh` Cc#G` .k3^ޮW8+*`V?eN$&q} =n,N mw\&5c3^W\&ɳZ*&_IugL,ׇhF\P4ĕ%P: 0(tN=ii0LF<"]0M ;B7k^"IsAAN) bيwynNCtd+s(7RCQnYG fJG lk9=Df;a8wnǧć}+tJ!Ѫ^֫,,QI>=oyVg22WQIK-}T`jħ yQF[ZtZO΁mrP|fcx*J4HB/{Bk$$`ovQLzc'o!~ʭv6$b>+/UO/7#ov X.J;Q% ++_6N )P!;TD- v(h;dz!tJXXAG UÔ|| Nxq.]Qd.q!@ԓY*0N('m,z0A jA7V.|~h;H%AHtOؓя8d\7/ɭ6L-C96# ޒnX[@K)}V UgGE=ʦȒ%j{B8} m а5{/M1 lcroj|YZ_~!=m&æeTqW*Ea{s2M˺C XAˬ![c~vl[ ֛P.ry|JKq"u voGy5] 𧙊*Jk'c_@?!ٗa[ %lե[8_t Zwa Lҩ&#ͬYXwAT'X4u22h#ܰ^IB7(_CԥJWq94mP6= ء֡'"C֑(gO~{eҵo' { #L`4,^RAPM4i튩!Q_D-t KÁ/!I} d BPlg Cs  _i0$HO$Hd D]̻57}P)CuJs'zV ifE"=IUUf\L8}Î2yWϩBy+ 4iJ.SYZr+IHA^MM54D(e41m6*A1]nntMyMP%F (~16^4Pj`pi `̶z)LoZQ! mg!pfPE[ׯj1oBB}F$7<^a>46n&iq6e7"5#(:c(Y<|:"Ų.$tkG9(QR(_^0ITe W$p/^_|YM%/x9oɷ]xNg EzRf=#g,(`^dЉso̾.M':J˳8GIH2,ރ=n3W8D|ȑ#!m]Hp’/ u~;N[43T]CGAƿ%BW,_9Gݷ?DP&P:6+j)].f#ȚvKi4'bJ )gڑGKeY-LAZ[?Մe_RH}g\[r.] uCZ|ch&q60,$xQJ cK\\m[!}$s|Ԉ5C kf R/vS.m5\kXCbiT^b_ypPAnǁjf&1}H"LoG?d_h,T])%'gd V'TzO(G<3PdW訶5;7"D`HIbbo FlVy :g/g(!3 fW8\2:qb^#0ok#KLi T{SB*eKB򩵚VNCSǔ#ܧtZc{]q_&Q.0אs* w:k0)G8>u"bNu!F#nZDӓ9wmB˴  ;1C7b z鉍l &Q~YUQ% zRאbHi$+QtE;'eFb%wc,D ]lQ2`|) ڙqBYy^BӍSW/\3HV5DMF}Yg-פ9xw>ː!{wW@-kvל E_}b7͍Ix/Fۢ5yXz/ĺ[BFiwvx{1ž*I*'H%Z*Ze+YvN$ ]a; r^pmK|5iE܃_< K.9pY>T=_4o~ }KKj*iD6i=< E2e|JH{!ɝL24*/ hz,=16cܐ\i;n}>_ sԇٗI@i(ArH3wB3 01<m9GR!*ҀK)Me&g9ċ _}CvZT6ӽ1&k'hx\$~!̟Md!uckw\ԁ]=]JPEYDM+3J ןP%+ ,O}?%Q ^%D%X5AiZN<zn,Y ӓEerbɂ,}u}Q28xj,^IIWBK/$?҄)˵q'Á>` ӵy`]0v<_YGRl3Н6~!~9B̅;h4Y2KgEt̸r6VbQFQ8s33Mz L+xMj_J;hCs%?LWFS`Ձ8*埕jvf<M%Lƺ6銅.`hFYۇ+UI1~3Ʀa;5RoODhx6gPxNq@/k&A?qr(ɪ\ 3;5;rxkm13a ʃ3s$YxJ\/&y-W=EWrCNy+x_Zz$LN&"mp'D=C׭K+.e+Cp7D2*a& 0lK=ھ8w=@ZJDX/`,q{`;S m q+XӀ5wܸ)jFh NF0ȯ#L9`@'V\c#GW808[{$>~@)C` +#&Q:dqUY߼-z ;j!ńPZr]&h2 "ٗj!%F"iX0=-#=7#|P"Apu0:3'>$TJ+׆J}Rn v%E' C@$QIٴ D:ZdV-K̀T./ڲUq4IU!"  5h3Y"ʬN~&O'J+]s(ZDjBF;D!\׉zC~x W]! lv\zh'lFZQp7< .d:&kૻY?[Ο 7B>7 :CETEL:zJH/}CUsNWŒ`1)2dŽI@6SEIfKLaܚܾCOXwPJeژF dXhh ͒wGgi ^Q0>gg">* 7C\rܓ\>"視(Q$/T{! RP;WH0K:E If^S܎V3RޜɥDMVj9pG)=N7;2|n'ciP+ͷ0uw4Hb]}ӂ_v03f?B 2R١Pؑ#Bm};K(xJn3qIMR*M}IݔI i=AfFЕ/MF}:}Yp}oa/HCNwНE eš~fiZJxDByT)Cu+6C KV1Z+roq9FgR4~]ˆk5s*N`HBژpX *;.™P}n/|U &%5PĈuc(|-ݼcBtIþmhJJX~^cj),ךE S}sP_qr`V & Uÿuduӭl:\%=;՗ @}}KɨމEbkQEYԷOv3JY"EZ/aPbsbkgBk~JTR5Mr&Ə8+5CAD>x=\ rnb)`~)@@bd4"f|hr^z|,/j# 9aA(J[N8J>!GyE: )i>8WƆ厒"=||2Bt`*tx >B1-$BAG\bJ>~%Xŧ;>@׶ʏ`IiS]hfu^ʊ(8h 3muhz>1 48DT6=Ng Y.cc DCY s 5R *:  k %.ϳ䠳D{:$]L^楡ME1*q\$*_aAyQ.f~luBNmyx' K{:ZPKC$σV]KUjFm tIHʙmiYkݨ/_܋2?qDG2Uz4Kzg G%J,dY@\^]WE9V:^LrtE >!%!Ho~w. ba5=HRG :BᐦȢ2Hr^[sVYt Աu5{~p)zoiuGLXy{Jq0PS=и<ߺiأi[|M/ʘ8rF)b}oH6#gE+rsc'8_=J؆>bc.yJS(V>&#0RWO.i_= ҜgcƣmtW(1?N2(1X2RKz2/X$sjQG&~?OqUkLϘ0&;@brvJQ-G!7:Xڔ'6!]W# i{Pp '$1ɎDNȌpl(iBr4cU:}o퉘lRyIQR%>#eЂu7턱8&?;Fo gn7dr`_|VIMԞ$AD dFWaܑ$c(Xm>,αXn0hVfn0?=%^vMc1'їpes/Ę>M vQwX1W":la d4zX7ʡIOs`cǧm}Đ=~н=rZ4tQ^Ξ_8] . ?9Ȫ+׾lq!b[0|ϯX>S2ht雅#ʀW Cwd(c$Yxl{"qh7ug1r˂@ꀇbDU0']ϰW[a&aەYvU+KF+Gy@^K,A{G6 8vז"I}mjCpCxO\iҔ\ |I# E@v!hp̈́wja{2^97e#WV'HVV e&A wv {%[OePo$ 2nnu C7![ŭ"Gwa i b]r@@.fgV7<ы$8Ռ9ߛ&L_5aS{/7lu*$G/,}3]7ڬ=|7tz8?QkZ5 F.Bt/@6D>ԅ']6FchwNm8fka5A L>c 13R9J}0b&&vSr8-XTr\%@^04C& tqrfuSȠwS Aˠ\I;F|8[gp Di ?WЃ Xρ%¡P(~`ɳ0^ɹD[>JH̻ (V)xYb=;=TʘqsOT@Xj}u,r1DMY'ZmZ';$hnf!!&~>х/Ylvȓ~L^hӞ|Ih%#ҒaWc>`4݇LRKR=t d XQТ=eP5mqSm;#xτӽڐت !׃P 40\'?P;7lU C(o$NPM%+3)*#eDwL߅Oh4t3!40 $cE[&NU5vyS͘ (o.KS1VzOIs %8b[M ePűx`xHYĔ30l=Bq~}(7a5r89:z|&}~I wy48<0v$% ^PiDh4۪B,Ue2Ì5( -" zvXf_0:x\ f/F:VHj="O^ rjq!RN84PؔҭB w2!0b9v>Ifmjs)%kQ_D KQ, 1 ]'_`#(N[wpb 6K܊mATl0Zi gBrp2=/DD6pOLuN? Ē xTCjIjk(bC=<E#oCDm8K'^sEfW~ S(`9 nZ* q(CrZn>NJ~mv_e'ܸ!{\>M<ݲ4G~ۻcY A 73Ns3eS+^V<7\Ӷ۫y +Z-F'#19=/շfO1A$UgMPihg'Ařp|QтFuQ6 Bf~#FQ މ!fBޭWyyd*X.ȹ~|19!SĨ1#dhߝ2ݧ6nl_B"H@ %9\8Oiɹ>6RX;/gf[*ZA&}g='f;iJ콬ɬ&K̃WGasIN?'ppȉi BwtT^0q\&,X5_S G0&kFpDžGh/!_42,E<&XA4eZ ݮ9Nt6ĤEE}NČ#fuv@YuQV)"y:`\m$:LH>C2u+j@P,MU7`1f""qqy+G1"tnWW= bhGu'GA^_#l 0{㢅,l,ݳ;++:59dhUѓCQڪ~ɕ<а `\)kfB% 'QSPR~-@:E!)L5EX^voEyLv>Ū'*n`jb"bۣtaK S>B@Ļ|J6'uƚy4w9I|I})f|=BAgv\+GBGDzIXv .c227GSzM 2e\R2z8 lS qneLWdl b"q Ffԃ=h@;!gpCky9 C%X۷t6 P9lV(<;h8¿$2'񛻔o&b_q!, ӆ2|)JTFPvæ(O4d<4k;Hy#SMV[bN ԓĩ@)}ZfKK T{6fHcPنHpKj62tXCX&j`-ьh },wvIJVlmd F)eMM6 oFL_DЂ| yTA>qhz+TFKM{hm_6%4RAjXO_jrR `nI}{Pp/ N ©9N ZB#7ZU%JT\ufCjpKEra}kNc齆wVhh&T[Ƭ]d! )]>4.thmI" ݺ:š@|)+^2U*uOD5712Yk1urgėIG*]U,9N *rbHW>f/Uf|M")Mhvp=;؂Ԭyöc'̚vޖ gVC[;rè}tRjӏ uyQefgt*ϬUJEEIxxh`ɇyтp a"ɗ`ɪ&uH0ɋ&ԏE% .f`vU[_$ћ+_8%^x]i Q?$9& J*呈T>_)S\ef *uU(SA0UVV8 3l]9kN`T/fQxgs. M$v8$PF*aѥ2hD߅ڴ+ԦbFH⺭uc93Jb$q=XKwAA2ِ) ],~nsdufNgy%z%<( = "B*֮Xs*AC,rxZp3zO=.$'(eT)*45l}dbJq.-u|J6\]rz4@]g(F]^-,DFVA;=i $-Pvjn3\IjāUAfh$C| !pJ=Y&TAt{fxOu][5:<pnkgq $yDۙºwB/M GпUgJ95|kM)lnML0W? sfCʌ&q[S}Il&P qu j)rV>cW3Fbp$vУBH FDlUn>W4F x"7,S6W?+H%dĀ n4xPslIumy(^%Y5OE%=ڈtv!ZH>vW!*r2:ǁe[]\0q͏ӪNёlb/:3ts3Վ"\0V̯~I sy7MQ60H jm Rusddسo iɶQ"HPBs51D.]\* 3oUʬE n6UeN9Ab!;\iՏ>Lmcrr>7z߻9eĎ.WHhNhKfs9H=,gY+̮XZ" 6'$FD9fʼ a#L \hg &[Yme$TJ|&GB.(%  H0j*2v^8 h6L#&WBv@ek No>JMf -$X fCsvuwf/$YPyB934ia,,z*M}w|c3{57v^]Hy!QK]>z=| }d>|N,*^ds0j%T`.e"\+K?b2 ۿTbWBpUt&^*$ĬN I2;Bl7{ \48l93YJjTQ Z&4Em|>{ ae])H$ $Ì@نVpwۀJFʚpfJ" ]]׺;v;q?o.+VhdEa%F%VP=Ӷqx@{ZH5#jİ f@( dwT:xqi,;G~!JLQ =\5ތ- m:KB+Ds?zw{G|aPN]-x+B#6%QDu:̍Duw|+*Z'Ej{oǙvf&mׄr phtSv=*jCvV36{|$χ3luz b | Vd*ޚX-/,fdpú⩷gtӶ{*/C"Q); 4<-5ζd c)vfuWKrK$3AR|BpY \7P3d\肊cKq=yLd+LbWŮȀ)FNC:ԅn{ ;8%i%4Twh\N;pOزkj!FZar[b{ݚDrH(ia{ }q0Qʍbbr>cuU/.>81v<A`ʺ飲JBX` (>QSoaMh%k#n:Q*j~]mhhcRS&Oe<>icwMF{)=BNcv,xjF!N :l$,Ce" ^ $Đtk}ގ##盅 tM8u'qZS3VY<ޛ+mvy}t]k33]_51d7H'BodإJ<=e> Ar&fB G#buf(t`iM'l0f DZsف<˷Um MsTAވYR8HvȒ: HuVb1X9Z"%r#|"`Lp  *+hB$ = 5Csv@-w*G?˺!.HJ]L`G/B›63Yh =#r'B:0 D2!%G䗒2\݋JYz ! k}7T SBv^!:DU6&la! ӑ=?Wb<ٛCu9ޤKm1f *sU&A & nbY&NV_2˹Z[,3 rr ?&>vc}L^%ml(`F#0 V9x/ aw!eA>4R8y+w5BNt|סpw8\F#P]/^ϣ2w ȒO ќ~I[d `s/ҡy̚j/' *0y2)$^#q ?Ev*||85˔4)8GjI"Cxq/!Ge \r~ 8 ˯RdZ=#6b&Epl tX. _ԬO4Z!mp&^0a]Y[C7ׄw4)fd Q>[:>3TfF5=)[:W*-:Rlc;\PReA}gz9΀~>̔䮋 ѱ-N4?3t$fHj@mMk0oZ;;;6% X'+d_{,)'j1Jm4ENI{Y*v%qeOjdĥatE22|qч[Yd1~l#c{0"EXeSsy; FfGdX?/4Eeha [X|&;"S6d(j_~=%,C;lꟉV3\m3gfv7B{+Ÿ{E^Ɖ2V"Lp0i# N\~7Z{e m%pkޯg(0M"h³Ʈأ:K*Ӽ*暒QsP{F5Gdߑ&Ί-j IT)YclAP"<& =dT^Aw Vlu6S<. ZVp>\qW9) y6u+ ˦Т[>q?/bN)N嶐H hS:!LuSs׬1dU;5~=pc ޔIH>kfl~)`o/9 0=DfE$Q}Fuқ*"KixK72]98JsP;wl{4ȯ6?5E.=)(xr[!+ ] O{sQ)>5E )|j9sBzI Cpˡ܂ۑ}9x=2K$s^3!(IYSwCQIA?˳λƺ0GT #4Z~w fRi X*fN8%Z,U2jK ӥFeUCnוwhXRA"s)h 겷biBЊ؄c1&.@jZ5lR%+ ۊH1CwHEԒ~ y>Ee)@K֬Kw|R ߂8*w0 T'=%,J̾!d25}.;FD ܖƥ_%4T%4 fX މ , ]077Im&&}.j1MhEjML hVL7 q2#b09>R@ (R꒷$ulk9<-řWMTxkVgt$<^G+C/hCPue<"փ#x:wÈ׽="RƜyŊ47_E7`痝]ʾ_5* $~>?xCE:dEXG+VaDMy͗Y>Yo4CjmЃ!@E YfGk!7Nsli׾x4$ !syUr! %Қ=pM$"DRA[p02`'r |U#SE+|Ws̗|cBw^ȅ>(o~n> ͂\LvT˨*N+'6M.|M*Ł!&  8.Ud7@CP/9D.* :z:\H[{meddY\VM$ŦE[ @tv`tJж0 \;ã:4 ߠ{KiϿnq7]jHz=+, [¨ܶB` !`nqb@G8"S06Co3NhT_ʅ!Up b JdukUl"u{6ȱʼn,i} ][q%ÝMSb}үF :o(R 'UvG $W\*W2IyC ؄͜tZ֏3ۻ4q+ hx檹cKMS+L^AqM5U[tA,,nZ-DQkL2 Qa!Nj܇pDm@Jq :k%4,A>E}ȯtotaU'{-MMuӢR/?rRϸ<LŋV'mns U-O:ܾCwsJճr]8dTSmSAVURo3а;={ dR-N9 O]pB5ja>G;j]uBt{:y,{\D`[} X+a1l)\47ĕtyPe)y^ 39T@x0ʲVHFߛ _@ OCdJK'a) %֭*lpYё خ]s(>:kI\Q(UZȚDWAoK} t%`6EGr/zq.'MNnѫy Dm [oDJB %"1]보JLD ty'znw|/si -1Wl!ĻȪcS|aրG|Գ(jcrG0EpE%$eI>1((GNAHEHY3.lW[ByO);K]g ^s*'vs0i1R8rj8FV4Ht%ݳ e,\A'<+6[6P4ZV!2c@Y VnDwk]6#3}[+أr@JMuK@79m/# Mek JНikm6^jC^Yr#&rJgAYX1MBC+i-9Et_f:1\r)ˉw(b瘨ANq/!XH׆.?jJH,H> c*2gxhgN؋%k|!8Q:IHylBag҂DO{=ڑ).NXTv3Yʂ il8=8WAn3)ͳ\W[p@ei1 <.{sMS @m8AK>S'519hl^|J0Bn+N0@o]mL)~9@R܏豟GzD>+:?Li5pY:k-WfaS !NK= 1 q|#,g~7aKl&"(eM?oFz xG^Tt𧈮%ĿlT9(@(o}}Kؚ!eYze UlZb8ޭ{#R9N%"ΰ Y q6 CdCq-{_ E+5ll @3Xy½Ç5Z]Epֈ_[MpVJ2A-Lϟe%]zesͰbh_jϨRScu2b0]ƒ[ =p D-!2Q4 ^Xog\%`V}i|<ĦzbOXeaCOmKP.B)bFu)sew=wG#f.BGίa²rhٽ%s3 փ)BR-}JΆhPKCϷ|2 _"Mιʈ Kӻ`hYOXO -r*[XMuRp-;|e \[ ɚ2E%g:KQʍ}xs-bIؔ/vu+?B/Ve{s8XY0F>݄pw U@i8CQ{2 eý\&>>vCBc%)<@5'l+d@TRd,U΢hpʾND:WQJ@Y̰.UW߉-+Иm`>'gX9ޟ -.=/aCU-,bwKv/zuSl-oq]1 P\3pDp;<E삹Vso<p\lSEOy2#8=.UR-++_8ei脣L뺤njSۣDҊ?<gXr5g{Dv[Ɂ;+vxB3C^=4 9ItAlo )JCoG%v,8UsB?Zx$bfi/Er;zDcq~02sr`eQh1 EwW~h]ʹ>Bgks+*.IQT(g3WuH]LJS?T~13zOӶ&ZB4UBkMB!3Q .dU_ 34|ߩaO %G;fo/kpzvXٕ g<= רM!ʐS'e7'Y*@̨$?0,jd~AcᐧݦS Ǎ^ iR86r“WP|] #"-^>K)}){Lе1|]`!)8c&\9~ Õ9c^;FҌ5)JCuൃ@0IǶ`"iIr2&>Ru12 ؄5M1'glZ f-,P~*bIYGLX8;Kc1pU@EG8HbkZ(!2[+ێ-vp(xpOeQ̶ `]aTI͢SqH!I(Xa]ׂ=ѐb7C QSbg梨K`zz!h Ƴj3"*lKply} z`b4]Ւ z;ǯ !7o:i{S|xƀniA'Yn9"7Y '*"=Xmo =px^Olqﯫ?}5iF?Bd6X he/=ߑЍEWduПftcq)QMG0 PR<_I$偋d Aʟ_&4 Z֓~}RaH;/vW^ ? IϽ!Do:]Qf<7&D"YM[~ !}bZFoTl=Hu Y~簾δZ,1_3`U) 1gʘ(.| G^w IP3s)#/"mp璜Wo r0ʂX#Y'%ʺ r`=@SM] >y5^tzI/m!%ҨcFGȤdxZlz1d$xxvTxb\p▴m^K,/f\ 3zhhP{|JxyrP3cUK6^'OTn%v!&40h X 'v+]T=r%arFeyXQG0"CuCw`,d|r`[Tx$QlEE۷` c ;IOwH <8aYZRSZ,w Eo.Y/xճ@r{2fPi8Q9r O6ݷ=)ɨ.vLq^0@fs;ZӁ^*7mBbu%`fv'bc"DUmq#f'ɫ"*ʫH?S s{D\`Ib&$ DΜ<5<  \~wx}*0Ùb Bv7Eْ0j| o1 F8' "% E} qqtz>-WB|:{Pe{\ liM~EB eS{0uOj'4*^cD@˝AVn<ĠByjvUt#s1s78vVTl[^vuma0]up, ]O,tǬ昼$̮m(֚ͬ?>ET(f@CH*[!Lg5R]`7֮I eev๋ۣBqSYG4.G0Z6b]'Q.c>]D gx%>1A3XCG9|>>U\Ź$Y, E._Q[w&&jPqZbX9p#>$4.~lS"6nDҜ{el!E^{}ГlPSCsvf)D-p#=0JWݰQNcSBdu/BW(؇>U-5M$Waշothk6s6AAf$&Ӭ B2 VKEya6+H(-}2ܙ~#q{aWAsd1~{xec\{3q1BFazuyՉߑʲ`ie(Zy'o?18==JթW7}"Z4276HOą0q h]w/ncIp b8F>GmdDz0XEOF$J ql^ ,ܘ32圂Ώtd2`ӋA) j=3s(ću`ZpE:Q?UfMWv@wiױd :EW~8&-Pd>T. Fm/] SoD`Ķ\&oRm@w;jP gBswfcF#+!RR'>d ʥ`sZWck-\ +u`|\d2`5/{tɋ=ųY̡P$̈La`Rj^$K12uIu-j4xEQkĕW*eX޴4d4]0Ȃiljh$` ~qNڴt랗`JНHM͕ObDxP@X}nt,[<_lo_23X3)Dv[樄<AjE:~JHp7k\SoC,yRoF:[d{@s_az<׹a,k5[%?ѷտcܴ Ml޺A✂x(`٦׈-A᳉\ZU~X-$Qbdj<, ym1/Eo 0rXi-'F=>[fרR{}ouC |WBbpZ("Z ٳ˽:'Ft5>7xćVCbh<>_[A$e1_;g97A !ܮ$&Z#[-F=p[N8n+ م^ծvCgbjO Aڍ#lŰx:00'1'Z{1y s9ʬ#QDZ»P 6>!6Wx3ބ4A5WY#r0nA S4v^_wfѤ<Y1Qr]Nw3N|oaS t&F &`b+iՎ_id]5 ;_+(-Y-rʛ4~Ӥ|Å27Ak>V^=iWM,G/p} $vԠ.9n |!eʡH<$s4pǖvcn.˽uY}X3%$oQKUad&:jrLeccwN$o]W pKdP݁7*ۇ׉(kAI.mɞ|IM%g^TTobgAU~{wbo^ DI,`7 ^#~^9]%N+ѹW#:}TPBBrJG*׽)fmyE]S~扎EPjdp%ELHf躁!Ixn64]IJ3|A0AC3s"/Ο;Me[zȲϞmEQ78Ut 3/iͲk յj0] cPDž^[=Qw4k` Y2\ePKZo=B,1O2ٱ݅Cy[3s  DE#*I LWq*#~#zJ">ƅBYlo/_ OEVy 7 WF}w7V,ҾZAZ?$nh:+LnbLj`+et4ۮY༊Bt5%7j=i+.LH:Cj2r2 /j5K5ڔ=n;mk6+̍A͆TpWaVخ*In-.<TjF#HpN oU@0Jh"L 15q =޾GMaHx,~r5%ND(Q>Wa' F;٠t'z= 3!=gWJl=_+ؚBz\ &enI)%dZR', ڡdv'Sč?dWn;jݓr<.R}l0#:v^8n\!FO."Dҕ,%}_k @'؏X7Q}f?G t=EN J8uTnӄ'ɤ9I2l^Rymd<q6T,JUYl''ٓxR!k E("4A$r"Zq~I3"q豢D͋45q;@J:œBtlD> Skp~)"꘶:T6|c@x/A5LX}U6h@=p_oDx4+%ٛ|XJff﯒2E|{<ր6a+NAynT:TGi@J5Xdn[{Dƒ:=NEC_ؾZ>Z h-TĝGN b3TL-Q!`CևL%Sfi:=+QN~!uZ\@C}b@B߻C| 7 "-6gUϡk0fr}}(qӂ=\=j8 0H!&>͗>eDp'KA d7tAyn3b=z:bJ[ʖ-di\(NEBP8*iAh]*6Vr/ʋ^0dmFTSgưQ%; eٸu`~QT }FO6zjxdLǢKޅ!ҲG'l=ŠҶ~[8>ܨ&EBLoQ{="I.䛂&S /s).#LXD2GZLTspc.b}@$=6+4.kRܑNP'ny[,}&Da:ŅBriȩQԹlyz*Bd [ƘݚL-b Eq5Or#̉1Ńj>#treB_^I*2#mvcNP~a0xnl.֙zV h3Yyۧ# k Kk-54e %6cBԜk;/m\s> fi_Ccr">L%{.MG;!KJs<6۠ .5g~Y$"EGC^XGA:7|(UzAl-1urZd~qe05:=<6lDj_ fXiJXA^>W hB L"?~Zu28ZN")iP6z /P@a{ hծLaC?gxhJnzt| 2d|NDc^0YE3dחR~Kl\I~ʱ"ulqEߡ>M #H3l!3GǶ(_U_o$BB-dv|k:v}#Hʼ|t88MA1ȿREmM}@m2VTO/uw(ޘZkboˀ˭$@ | nʨS̊`/2D Itm\m,*oei [Pm7ZJO7 (xX`='u 3"3Z~+?/ "GKB=/;I>3Kժ L *!~Γ\W&-(w㏃䦸]!\丒wsֳOqo!z޴IF\FFW1|c=Ij7-0bVsfYI~USMW;  #Fy2R0GqÕ,L S)F!i9 5^oU2Rs޹ ԜS(uBFWm~{ǿ$KnBNF7t:i\5AL9"9$^1 O$B$S9 hA2W]/K)},CzY4rE`Ds(|54Y8=|%3ꃀ1?Iۺ˼|=ʗ-]F/q{gAױzeJhɓcJd8QHwU=@{:rՃ:((6ÀF5C뵢]{ߺ8rE_-Ák(V6tB˼{gO]<:xEFtdQ 'NaV0p\yzJqgTMm0cF?əlILSWA>H=?=*V ]!Z=2gh͚HRZtħNgf'hStesJClżԿmXvlHAIZl0\փvߒk0_ Fu6 3sn7B3w؟To'Vk2:̅jFg#G"UYm)-*UT`FS3a `?6L͘hr7"}ܨYNgXCr/q8N?-<֭wz}Mdb? 9m}PI|Wn6 `.\MI:@`N#f\YneV-5k;5mkA?}O`0Hk`y_7c3ڬ3Ǻy NX[b]n;w;my@RHz7)8RrF~h @y3MM/:MN1VC)/x耱BE)iY;e`ȓ&6z /HdVE(v)FLj ˋ}O ͣERc !+ n/.B*gpjYј8uDgsFE33v(K ח)uD$UA~Ǜ"Ft"jorRp>i5cN&Pd)&8],;I[ ~wz3=9ҥ2x[ʇtJj6.rkmP,W:\nd3GJ[0k!sJ %̞ަ]wJI׿G#./F|5Q%#$s{&UF`Z{ #o0žeɞFZ+) eSϼP(|47zX# h//L0Lե\h|NmM IE<(iG,U/oB񫷠Ouӷ\c*V/^w oٓ피-EH#]p/Tl7< ET."n -'YB+"SGD8 j,^iaZ-o5rD!Ի?KDBo!wBCj# 0ƽulEB8scnV- t[qe8Pۻ$W+A櫃4غ.bJ&,z5*7R/JlAkҫ0KUPnNa9_;Nπr̻ GghKcs0ȹh(DnzDd:FHwq-,dӉ^ $*]p\!s"{OTΧ|I,NZ3%zx1zؘoJr dr.A&H5 n)=my7>%?#iא漬:mL~s7'PipdlǴ>^=, AKBqr<=p}BBY)HwK҆ sYhktCѣD}(fL>S{"uPªrwǫui叉Ca9u O"PJp5gmj4 [(6)O~-a璎DQU~\kS|.2˜L-khq o#x{"VT M [݈XhL$(U # PM>V 7HK }ZvY+" zjDqZ/H[G%T+Ҟ C>>_VxH 88V^8;6 86IFz,&hJv]hcK30bBnzp2>q*Du6ìTmu3m<=Ԧ ,1t)wrutRN5c44JW4_)iC{QPgV+v8fRz Cy Pc 5n;`;BVGŃ!/ohCGо;~|~E-7N3h :|e+~gkP%DE gCtbWZ;ekzFV﯁&7q5u-ZeLjNNGO M^"Ӵ[o C݆X/pԠG%fĦ&l zje I %צm@W\)f˂#z7II\PV :dypZ[RU,jL'Uٽ>Ԥ<俷 G򨐛'^)jYF\i![oFir*쳸ʛYýKrWw\t<%[.Eʃm;;PA} RqD`맢-0;ϓ]I*hU5rIs \Ek31ϕ V!KRm8=kcԜ")`:k0ם6m,/k'td++ɰ&3N~1ģA5^*csMi}13=;wBz! =`quޖnS .h t%""0" T"bǥˆ譧5 5k êD\ĥpaU5+mAinf"8[Ea9Lj[j& }UJl""bk2?s"iBB0_$@WRQ!<&nPҨlG.hW΋y!hMQ|Wc"UL-~J6/>ji "!m/Q ƥv&$LD0ti5Mi|fQ坥wzv":QZ1L͚`+5.G W}КI(X/F̻QΩ FXZ*.U=lE#DKJ R^Jr5#gmZԻ ݄!5}3\' ?lͻ$6ʽ &_KqOG~RNI rGH}/BSvRƀ9Rjm# ҦN _헹$ s@o8yg7~'y]sȱrߛտ!2w)CU~_'K:\"!TW2.Ժzp7&`Mf{XJŇ%Ơm>O#R1E'G硨qIr\-+7ֵJ6Sw W=P̵8:R?<~?s <'3,\N%>#$Yh]њ_T(T~|vwfy58L CRoq&_e͂Xl?)49Xyo #z. Sh%$0j+S]exMϾ8A9+8S7yt.ֹvizj"Ir#A1-kb-Eqhdh~04I=-7RKUkPۥ bImFͨ dn`2ÈS$T}0UwKe] 5V`MߘU|FUAx6n[DqP^MBgnu$Gd38)Y]q#`HëàhB|.GqcE>>66 8K ?P:7+-hBQ}#qRxts0MҖ0n3 %Q͹olH& 3?&n}m+ǾF_Hէ6xFDm(Қ0"miB">WX%8 a7B3}DLJI{ tj>ov&lL4"n*m4 n#$Ŧ_RD]c2'F0ީPN6a>8= BA:g Գ0m6zP龊IsɫhAs7~켏\ ^z:bpqQ^0Õ!H u9vW}a oC)N҇ YDN*:x<:!R4h8+},qfPrI rT\u %f*PYٗCz#c{4O9C k40g_2!s((qqp14 B/Dΰ4Yd;>u6ĥ) B"^>U:z0AӿBVݖCv`ZdR=  ,\GiyQ\} tG0µJ'2l__;5ݟ %B;呿KS8Hh9 i :krU$-tVgbʹE1tjIiq9|T#Ï,L|goJž'h/5N}uMܩ*0R)Fkku] bRztɮip)54(aao?sX9ͱ yE*38AVPh6ǁ92 A,m I}'זsrދP -)J=H،#`?l §)\cjI  -7] 43,"^ 뿼֊wiSI5yr: agW?j)]z S/Ֆ;N/f~M@^E+i}Q 4 ~>DCeMYf{W3VDzyk1&" Y Wԑ_Y(m ںӰ2W`nlug^;0|#85#z@xǖ"ƖC t ʧJ)DsT$׸#ː$he<0 s9f64Q}PƖG@ H{Ql>=z:5JיQźzhOB(V=9h]鴕! [FAg˓Uڸ^j{YJ;WDbV1IlANr7[s[?Zۺ {Ò%h&},NӃ?bR4Mo;DE2ϔzoʰpXbDzM%*=ѿj1wՋ#A#`ߚ(gA:ۨnPPe2>]h5#-ARZ,֋CF2ʲRJSDR@dbϴ2Ĥ,*bJK!6tE ۣN ЇM>e=[*z<Fy):4UHKsuqf0x#DIJj-GW/(DגZOU,rypqp|yy3)'\rez69K f7*]O)oSd'4s PIQn &qTzD N"n> |":-UEk ޘ9v4#xpu}o#?܀Oh^)Bt܂2qr{[=C仐~{*Ġ>Błj;H`̑=΃[EF7 ô)L%΍BL@誛(r*.TJ7]q0N{~UTekBߪB+c%~tܞDL%bkg^;5SEk4uJ)Lr\jo kf{NBd!K]O%H> G(p+):I,\e/ゥ6u1Lmc?nXL ASiJz!f v%ȻKd}(RژBkhlKsB 8y/Jn{D>BAEDYn_NEs9p,2PeBb0U-oSD`"voV{]YEOr\S=TTJس>دx݌ t7lK{#Ě\1@28X?\p_L|Gx&2.+frm[ ISB2!vmӾTi?s_JV3^:<Yo@p'A}Q\z 3oȡ`L(J%-s _y]Ox=d+;Nh;S *_?3?s6/`~X  yKU>Tj؟* XWX WH7x4L^H8W?MOP&l9հ­r1fPZ'SHa@(co_hWBriCYƙgĻs,57\3흝ثg;xi2$;@FŮGOLj Ph5©rfb1:1) O܅{фIM*ZM+F[\h`̣q*xnlG7bnL4mpr[/yB%w\^Kjo*BPHvP2C[JF7{EIkiw100"%Ia泿psRve L//{dˆgZ\j'NJifBQ` Ws$=- XȣHphU$F~@`E:iCw&G@Fެ-=ZC1]RmJ$XBjhe57Bn _P#k:(q!SCLI(mhVvGep Hĉ,p%bo%t=Zneii?bGbޒHΊdu* igr7Zn4,ޙ}-C_u7\ WJhf "@-N̞,b97tNس@b'5XllΫW|rJRP*CW;~xn燀(!=4{t^{pwg(Ry3JO_gj&J9k; jt ,e^}dVzM/^|֯qxB)n 7cLi.2ݟ8'bLn.TM ĭ)!PesUDFAN{̆X#pL{G(ŵxCDt\y :veiqQgWy8띕R;.Wqo#@˰qR'MϦƈS|T=+T5~0jwfU2DC쯙񠢽q"^Z ˙G8EighiU]L[!V3^eT۴se' 2vGT].ξm"흤޹o75ݠ^haḒXPӾmav~8,͌Oo ϥ tPsjMĹt3J!aVW+ TLC5D,Fݙd6Ka.BS{|%?u7|u62ܤ,h9 ?8yfZ* O.t^|)A[ -_Μ0|_tSTfӦ|cf 2= N={ʟķ 1$Z;w-^aSoUCYapePX'0b7#!{tDž5*t>A[aUq +O 5o`"]5W-3ܠE#b}Ϊݏ|"VIݬ;q !Q\Bג)aXxJͬ>\+!6]tZ);\cZR ؙDIg2'2{:gϨT56[lh^pWb)i'/C$r^6g$88N~\\x:uZIBՖ= (9 {},ޚq@ڟWe [,PpET*fALv 7*d%li?E߈5pq79ʐkVLʱ}Q7dI&9G(Ż܇(DX;!DxQ" '16Srvq.3``|Wжb\.ZN宕RY9߽a^>vNؐdB ZS $ <#&K@?KzkEVwVkPhK}e{m' MۜOlnB-1zUgm<90WӎmMZ:ѵ?Q7y5Eb/ⰪF؜ȲАͰD^ewi!4> 5"}1EpO>4`w^+Mf|h ~pFJaOT3;;1QK0 }kA,JMg͙mܛ*w*OW]K4#oKМŊOy>67+K#n RbXJTm" |%V:1"  v'Uo BRyC=wRG_T-״jt0!ocy4|/Y/2 I/PT4X_*zV`0S&!H'`B`xzcO#žt z*IąazRhi0mQrMw}r dAPQ iz-aWPI֩7~ uޖ=&mcx'tÐJQ ٖ7ak0l$Xut4؃0cpHb%N۩0}֐! Jk,2%|cs /4X;l8ód-`d`x**TG2 ,͟޼BXB2sX|RwZɟ =\-|4"x7JVlwIЕd;5J|_=XC'ʐLw/Xm<#*{8`91.DPE!, ‡Mϴ`[)(w)X45NyQ[+)ۦ2F!/\U]{L yOp΁h4Y惮v: Q;kٞݙz)n~ۂdMO`%ǂ 6qK'5x!ࠊfm{pu1D5=Wҵ/x'kL9 6k5zgчfG ^p pQK9:l5>,@/q\C Իu wA ѡsц%9a *b[u VVh%!#нLKDZ%m%J~ (>vd<yyY"[RIE8y??Xk~V3X I>a27~N *I%?f4%+_K 6ucXҊUX)K}? JhЏRxBžPAVy .49JR: .\#r}I%r̋mJGeɒ6CZR:y9H9= <|z_wH%4u8rܥ@ŕBV4e#+[r&`,j,A0ZIm wv'vwIA.F& > aBJ FUbk=Hܥ YenwF-od/b qN $6;~K)60^A"vWZr*!p26΢ޗV# F7y=GA[ܟ."J|KP 4V(>M~MIvw۸5S_ugP0#2sck;L(BJ,R {RK7ﰹa-\L;c$>0 } ]Lrx]{ڔazrs!և6@H}.&K"{yHIT,`ԡ^OV}88J)'ΣED.k3X"v+ kǜ^*k]nPN尘AY3qt<]RA-lo:yVZ&7Ȋn9/oĒE^Kv%6g~e}P={،Ww: b}#!$Z1(/),Llh́V3kx$.FJ&۬קw YG(whrjø{-*ey*_Xl=uZXm;oao-?v.ek_)Fݹ L$:F00 v\݈tV.[W+*rĮIs uW)wRbap Lv4m]7K*;d!͌:Qov;+Bdd.߁bQF>qe23eWnb}] ׶c=BEX0 4p4ՉL%ZlzF,0Mh {LVN5ɿG)SC: [UR[ FD< ]%Ҧ>^m wALh\ligwX0`yzt۬[C"F2\i":ָE:i_ t]uӳo~e 6B ESw?:35XGsX -Fn((O+s!p3|7CD.0EXGmg P tR9jE Y"a~ e07?)-@}{'RF8T㟔awzjND7_q-*E(RHr)`'F9bkw(&~xzZdj3Ot OJC“]20OioRMFRlNl@W:BVdEYٻEHf5f:hQstp}_pQ|)8DU< Mi]s=vPua>o!1,W7@hCnCä'P?,ZU*Ԙ]bTZog?`qgqD+olx}0fycbRwnB|ijMs؇]1r0:5?zCYcyoq 5AyQ7CG#BgD 8p07<9٪O$yFIB 4*5>1/P5Ԙl6r+:t[aT;Nxv|k}[v y|(t<{Ct܌Ꮪ{i|bO!xOud `"'ݓCzRzmZtVCD[:|:_W{բdM380J6 e3hT5}-+8rJϰI'B~X> U+2*3t$fBdS.rlhY$悉6̝Ǚ(DB5 &@:_cҢ|-)f ǧ&M./jyVHЅy]vxTy*+W VeE`2uնO6[S/@jHFB0EzU`Yv9\x6V\*QTr\mķĐo]H%5t.٭Mi (azLtrcS48D)㔾k}G; 4X5aVvŠ?l9Vk7< ?IXpEQH0VR|]H4wQ\FZv?JUGi3[E=hoÿX\/hH\e.ФGѼX 4\WA4[n0^i^ :R<]"]N>O:a T)JiZD:,W@%wg#+Y}ݍ_OxZP?HHęrG:S(jG=hfx`up`C-vX/ӯdXK).en c *6JT^afz 'dfUv!c#X&X s/F^T/Ę4Wɕd&5O$(TC/'ʀRFRsY ".81LvAk-(.}|A@ⵕoyT)n 8s;.ޭKMo{& ~yQNl0BpF0U>dOfk'UXZeXIָBK)ƘfԛnIW+˴7`j: Bȫ;Y afm|X;XEXȊG#5fV'2p,o/[-Mf 7w}_'(:͜ft,&d7$n.DWkA%"gFh~D T3\h1m.IE.OTx#]!kAD 0G,QMi&R(Hd&qLuTn4y*Y4c~~و['Mg0~bұ5]qR&DIhDŽBX>@2=/.M9f?-.> 0?mҕ&<|Z(KG`al6?TiYOB]LPa'cmNum#•IY;0hܩ 1bц4zmisvNCҽO;)Lxۯqq"SdVDbɸŅZo Cڽ!Ь~96#ѻ[שׁMq9HV|: kL B hըu3Out?uO&#Jo++q8J=Z9,E8 a&y:s'ٰ]@0Ls>yp%>*b1}_5e! e)'Cgk!Y}PZ3)0Ze-/L%;3E(kI-@Z&j<;?wѓ?B 9*Y(^~0o{GI]S^3G1]\Yˑ͋P z"UwaW%^vJ*{VUX, ucP4n{ڱ\g "雥xG~Yc>,VM4$yMq~2 ^Ju$Z&ͦsLѥ N@²'8z]ŒRvr}3g*r[&P"Q2:TPȶ$LGS ]u,5dr}J.DM (h n?AZ,~z.n &D÷73mNd\8Ի q`PImf7JL멲K5QT#U\( [^ uoAk|,UC$׆L3sMvR}7F/_B1RwܓQMh}t4ÜH1ju`"A/q/Z;쌬fr%}Yapu!'F~H͢TbeA(HNWj!.vЊW"!(х+hx7Ħ}GvhS^*),XX@އ[}gJbI[Ek4]!z"%F0 -B-(v+GUdχ@\#՛^ WvfB^{DoRRsp 8rRl+ sDCނU={̖̠T*3:茯K n f_b mw /7 B85N2i+E]8s3fʠA,d}#?bFޔx#e[sJy0ȑ`JҏTdn]3Za# %&ܨF^rze:$ <ﹶ&YIP.~_Of.M0iޖ,bINʞU_5ۊ9!ېkґiz+b2Yw^Q:%$[ ''lg#,Of'jy%Vt>7&#]rH(N:4-Հя5M!~ ` lZڨ_V Pθ֡8^Z7WXg&^JܑN$4bayesplot/R/example-data.R0000644000176200001440000000756014057717550015165 0ustar liggesusers#' Example draws to use in demonstrations and tests #' #' These functions return various objects containing data used in the examples #' throughout the **bayesplot** package documentation. #' #' @name example-data #' @keywords internal #' #' @return See **Details**. #' #' @details #' Each of these functions returns an object containing data, parameter draws, or #' predictions corresponding to a basic linear regression model with data #' `y` (outcome vector) and `X` (predictor matrix), and parameters #' `alpha` (intercept), `beta` (coefficient vector), and `sigma` #' (error sd). #' #' \describe{ #' \item{`example_mcmc_draws()`}{ #' If `chains > 1`, a `250` (iterations) by `chains` by #' `params` array or, if `chains = 1`, a `250` by `params` #' matrix of MCMC draws from the posterior distribution of the parameters in #' the linear regression model described above. If `params = 1` then only #' the draws for `alpha` are included in the returned object. If #' `params >= 2` then draws for `sigma` are also included. And if #' `params` is between `3` and the maximum of `6` then draws #' for regression coefficients `beta[k]` (`k` in `1:(params-2)`) #' are also included. #' } #' \item{`example_y_data()`}{ #' A numeric vector with `434` observations of the outcome variable in the #' linear regression model. #' } #' \item{`example_x_data()`}{ #' A numeric vector with `434` observations of one of the predictor #' variables in the linear regression model. #' } #' \item{`example_group_data()`}{ #' A factor variable with `434` observations of a grouping variable with #' two levels. #' } #' \item{`example_yrep_draws()`}{ #' A `500` (draws) by `434` (data points) matrix of draws from the #' posterior predictive distribution. Each row represents a full dataset drawn #' from the posterior predictive distribution of the outcome `y` after #' fitting the linear regression model mentioned above. #' } #' } #' #' NULL #' @rdname example-data #' @export #' @param chains An integer between 1 and 4 indicating the desired number of #' chains. #' @param params An integer between 1 and 6 indicating the desired number of #' parameters. #' #' @examples #' draws <- example_mcmc_draws() #' dim(draws) #' dimnames(draws) #' #' draws <- example_mcmc_draws(1, 2) #' dim(draws) #' colnames(draws) #' #' draws <- example_mcmc_draws(params = 6) #' dimnames(draws)[[3]] #' example_mcmc_draws <- function(chains = 4, params = 4) { stopifnot( chains >= 1 && chains <= 4, params >= 1 && params <= 6 ) .example_mcmc_draws(chains, params) } #' @rdname example-data #' @export #' @examples #' y <- example_y_data() #' x <- example_x_data() #' group <- example_group_data() #' length(y) #' length(x) #' length(group) #' tail(data.frame(y, x, group), 5) #' #' yrep <- example_yrep_draws() #' dim(yrep) # ncol(yrep) = length(y) = length(x) = length(group) #' example_yrep_draws <- function() { .example_yrep_draws() } #' @rdname example-data #' @export example_y_data <- function() { .example_y_data() } #' @rdname example-data #' @export example_x_data <- function() { .example_x_data() } #' @rdname example-data #' @export example_group_data <- function() { .example_group_data() } # internal ---------------------------------------------------------------- .example_y_data <- function() { # ex_y is stored internally in R/sysdata.rda return(ex_y) } .example_x_data <- function() { # ex_x is stored internally in R/sysdata.rda return(ex_x) } .example_group_data <- function() { # ex_group is stored internally in R/sysdata.rda return(ex_group) } .example_yrep_draws <- function() { # ex_yrep is stored internally in R/sysdata.rda return(ex_yrep) } .example_mcmc_draws <- function(chains, params) { # ex_draws is stored internally in R/sysdata.rda x <- ex_draws[, seq_len(chains), ] if (chains > 1) x[, , seq_len(params), drop = FALSE] else x[, seq_len(params), drop = FALSE] } bayesplot/R/zzz.R0000644000176200001440000000071214057717550013450 0ustar liggesusers.onAttach <- function(...) { ver <- utils::packageVersion("bayesplot") packageStartupMessage("This is bayesplot version ", ver) packageStartupMessage("- Online documentation and vignettes at mc-stan.org/bayesplot") packageStartupMessage("- bayesplot theme set to bayesplot::theme_default()") packageStartupMessage(" * Does _not_ affect other ggplot2 plots") packageStartupMessage(" * See ?bayesplot_theme_set for details on theme setting") } bayesplot/R/ppc-loo.R0000644000176200001440000005362114057717550014173 0ustar liggesusers#' LOO predictive checks #' #' Leave-One-Out (LOO) predictive checks. See the **Plot Descriptions** section, #' below, and [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme) #' for details. #' #' @name PPC-loo #' @family PPCs #' @template args-y-yrep #' @param ... Currently unused. #' @param lw A matrix of (smoothed) log weights with the same dimensions as #' `yrep`. See [loo::psis()] and the associated `weights()` method as well as #' the **Examples** section, below. #' @param alpha,size,fatten Arguments passed to code geoms to control plot #' aesthetics. For `ppc_loo_pit_qq()` and `ppc_loo_pit_overlay()`, `size` and #' `alpha` are passed to [ggplot2::geom_point()] and #' [ggplot2::geom_density()], respectively. For `ppc_loo_intervals()`, `size` #' and `fatten` are passed to [ggplot2::geom_pointrange()]. For #' `ppc_loo_ribbon()`, `alpha` and `size` are passed to #' [ggplot2::geom_ribbon()]. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_loo_pit_overlay()`, `ppc_loo_pit_qq()`}{ #' The calibration of marginal predictions can be assessed using probability #' integral transformation (PIT) checks. LOO improves the check by avoiding the #' double use of data. See the section on marginal predictive checks in Gelman #' et al. (2013, p. 152--153) and section 5 of Gabry et al. (2019) for an #' example of using **bayesplot** for these checks. #' #' The LOO PIT values are asymptotically uniform (for continuous data) if the #' model is calibrated. The `ppc_loo_pit_overlay()` function creates a plot #' comparing the density of the LOO PITs (thick line) to the density estimates #' of many simulated data sets from the standard uniform distribution (thin #' lines). See Gabry et al. (2019) for an example of interpreting the shape of #' the miscalibration that can be observed in these plots. #' #' The `ppc_loo_pit_qq()` function provides an alternative visualization of #' the miscalibration with a quantile-quantile (Q-Q) plot comparing the LOO #' PITs to the standard uniform distribution. Comparing to the uniform is not #' good for extreme probabilities close to 0 and 1, so it can sometimes be #' useful to set the `compare` argument to `"normal"`, which will #' produce a Q-Q plot comparing standard normal quantiles calculated from the #' PIT values to the theoretical standard normal quantiles. This can help see #' the (mis)calibration better for the extreme values. However, in most cases #' we have found that the overlaid density plot (`ppc_loo_pit_overlay()`) #' function will provide a clearer picture of calibration problems than the #' Q-Q plot. #' } #' \item{`ppc_loo_intervals()`, `ppc_loo_ribbon()`}{ #' Similar to [ppc_intervals()] and [ppc_ribbon()] but the intervals are for #' the LOO predictive distribution. #' } #' } #' #' @templateVar bdaRef (p. 152--153) #' @template reference-bda #' @template reference-vis-paper #' @template reference-loo #' #' @examples #' #' \dontrun{ #' library(rstanarm) #' library(loo) #' #' head(radon) #' fit <- stan_lmer( #' log_radon ~ floor + log_uranium + floor:log_uranium #' + (1 + floor | county), #' data = radon, #' iter = 1000, #' chains = 2 # ,cores = 2 #' ) #' y <- radon$log_radon #' yrep <- posterior_predict(fit) #' #' loo1 <- loo(fit, save_psis = TRUE, cores = 2) #' psis1 <- loo1$psis_object #' lw <- weights(psis1) #' #' # marginal predictive check using LOO probability integral transform #' color_scheme_set("orange") #' ppc_loo_pit_overlay(y, yrep, lw = lw) #' #' ppc_loo_pit_qq(y, yrep, lw = lw) #' ppc_loo_pit_qq(y, yrep, lw = lw, compare = "normal") #' #' #' # loo predictive intervals vs observations #' keep_obs <- 1:50 #' ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs) #' #' color_scheme_set("gray") #' ppc_loo_intervals(y, yrep, psis_object = psis1, subset = keep_obs, #' order = "median") #' } #' NULL #' @rdname PPC-loo #' @export #' @param pit For `ppc_loo_pit_overlay()` and `ppc_loo_pit_qq()`, optionally a #' vector of precomputed PIT values that can be specified instead of `y`, #' `yrep`, and `lw` (these are all ignored if `pit` is specified). If not #' specified the PIT values are computed internally before plotting. #' @param samples For `ppc_loo_pit_overlay()`, the number of data sets (each #' the same size as `y`) to simulate from the standard uniform #' distribution. The default is 100. The density estimate of each dataset is #' plotted as a thin line in the plot, with the density estimate of the LOO #' PITs overlaid as a thicker dark line. #' @param compare For `ppc_loo_pit_qq()`, a string that can be either #' `"uniform"` or `"normal"`. If `"uniform"` (the default) the Q-Q plot #' compares computed PIT values to the standard uniform distribution. If #' `compare="normal"`, the Q-Q plot compares standard normal quantiles #' calculated from the PIT values to the theoretical standard normal #' quantiles. #' @param trim Passed to [ggplot2::stat_density()]. #' @template args-density-controls #' @param boundary_correction For `ppc_loo_pit_overlay()`, when set to `TRUE` #' (the default) the function will compute boundary corrected density values #' via convolution and a Gaussian filter, also known as the reflection method #' (Boneva et al., 1971). As a result, parameters controlling the standard #' kernel density estimation such as `adjust`, `kernel` and `n_dens` are #' ignored. NOTE: The current implementation only works well for continuous #' observations. #' @param grid_len For `ppc_loo_pit_overlay()`, when `boundary_correction` is #' set to `TRUE` this parameter specifies the number of points used to #' generate the estimations. This is set to 512 by default. #' #' @references Boneva, L. I., Kendall, D., & Stefanov, I. (1971). Spline #' transformations: Three new diagnostic aids for the statistical #' data-analyst. *J. R. Stat. Soc. B* (Methodological), 33(1), 1-71. #' https://www.jstor.org/stable/2986005. #' ppc_loo_pit_overlay <- function(y, yrep, lw, ..., pit = NULL, samples = 100, size = 0.25, alpha = 0.7, boundary_correction = TRUE, grid_len = 512, bw = "nrd0", trim = FALSE, adjust = 1, kernel = "gaussian", n_dens = 1024) { check_ignored_arguments(...) data <- ppc_loo_pit_data( y = y, yrep = yrep, lw = lw, pit = pit, samples = samples, bw = bw, boundary_correction = boundary_correction, grid_len = grid_len ) if (all(data$value[data$is_y] %in% 0:1)) { warning( "This plot is not recommended for binary data. ", "For plots that are more suitable see ", "\nhttps://avehtari.github.io/modelselection/diabetes.html#44_calibration_of_predictions", call. = FALSE ) } message(paste("NOTE: The kernel density estimate assumes continuous observations", "and is not optimal for discrete observations.")) if (boundary_correction) { p <- ggplot(data) + aes_(x = ~ x, y = ~ value) + geom_line( aes_(group = ~ rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), alpha = alpha, size = size, na.rm = TRUE) + geom_line( aes_(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), size = 1, lineend = "round", na.rm = TRUE) + scale_x_continuous( limits = c(0, 1), expand = expansion(0, 0.01), breaks = seq(0, 1, by = 0.25), labels = c("0", "0.25", "0.5", "0.75", "1") ) } else { p <- ggplot(data) + aes_(x = ~ value) + stat_density( aes_(group = ~ rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), geom = "line", position = "identity", size = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens, na.rm = TRUE) + stat_density( aes_(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), geom = "line", position = "identity", lineend = "round", size = 1, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens, na.rm = TRUE) + scale_x_continuous( limits = c(0.05, 0.95), expand = expansion(0, 0), breaks = seq(from = .1, to = .9, by = .2) ) } p + scale_color_ppc_dist(labels = c("PIT", "Unif")) + scale_y_continuous( limits = c(0, NA), expand = expansion(mult = c(0, .25)) ) + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname PPC-loo #' @export ppc_loo_pit_data <- function(y, yrep, lw, ..., pit = NULL, samples = 100, bw = "nrd0", boundary_correction = TRUE, grid_len = 512) { if (!is.null(pit)) { stopifnot(is.numeric(pit), is_vector_or_1Darray(pit)) inform("'pit' specified so ignoring 'y','yrep','lw' if specified.") } else { suggested_package("rstantools") y <- validate_y(y) yrep <- validate_yrep(yrep, y) stopifnot(identical(dim(yrep), dim(lw))) pit <- rstantools::loo_pit(object = yrep, y = y, lw = lw) } if (!boundary_correction) { unifs <- matrix(runif(length(pit) * samples), nrow = samples) data <- ppc_data(pit, unifs) } else { unifs <- matrix(runif(grid_len * samples), nrow = samples) ref_list <- .ref_kde_correction(unifs, bw = bw, grid_len = grid_len) pit_list <- .kde_correction(pit, bw = bw, grid_len = grid_len) pit <- pit_list$bc_pvals unifs <- ref_list$unifs xs <- c(pit_list$xs, ref_list$xs) data <- ppc_data(pit, unifs) %>% dplyr::arrange(.data$rep_id) %>% mutate(x = xs) } data } #' @rdname PPC-loo #' @export ppc_loo_pit_qq <- function(y, yrep, lw, pit, compare = c("uniform", "normal"), ..., size = 2, alpha = 1) { check_ignored_arguments(...) compare <- match.arg(compare) if (!missing(pit)) { stopifnot(is.numeric(pit), is_vector_or_1Darray(pit)) inform("'pit' specified so ignoring 'y','yrep','lw' if specified.") } else { suggested_package("rstantools") y <- validate_y(y) yrep <- validate_yrep(yrep, y) stopifnot(identical(dim(yrep), dim(lw))) pit <- rstantools::loo_pit(object = yrep, y = y, lw = lw) } if (compare == "uniform") { theoretical <- stats::qunif x_lab <- "Uniform" y_lab <- "LOO-PIT" } else { pit <- as.vector(stats::qnorm(pit)) theoretical <- stats::qnorm x_lab <- "Normal" y_lab <- "LOO-PIT (standard normal quantiles)" } ggplot(data.frame(p = pit)) + geom_qq( aes_(sample = ~ p), distribution = theoretical, color = get_color("m"), size = size, alpha = alpha) + geom_qq_line( aes_(sample = ~ p), linetype = 2, distribution = theoretical, color = "black", fullrange = FALSE) + bayesplot_theme_get() + labs(x = x_lab, y = y_lab) } #' @rdname PPC-loo #' @export ppc_loo_pit <- function(y, yrep, lw, pit, compare = c("uniform", "normal"), ..., size = 2, alpha = 1) { .Deprecated("ppc_loo_pit_qq or ppc_loo_pit_overlay") ppc_loo_pit_qq( y = y, yrep = yrep, lw = lw, pit = pit, compare = compare, size = size, alpha = alpha, ... ) } #' @rdname PPC-loo #' @export #' @template args-prob-prob_outer #' @param psis_object If using **loo** version `2.0.0` or greater, an #' object returned by the `psis()` function (or by the `loo()` function #' with argument `save_psis` set to `TRUE`). #' @param intervals For `ppc_loo_intervals()` and `ppc_loo_ribbon()`, #' optionally a matrix of precomputed LOO predictive intervals #' that can be specified instead of `yrep` and `lw` (these are both #' ignored if `intervals` is specified). If not specified the intervals #' are computed internally before plotting. If specified, `intervals` #' must be a matrix with number of rows equal to the number of data points and #' five columns in the following order: lower outer interval, lower inner #' interval, median (50%), upper inner interval and upper outer interval #' (column names are ignored). #' @param order For `ppc_loo_intervals()`, a string indicating how to arrange #' the plotted intervals. The default (`"index"`) is to plot them in the #' order of the observations. The alternative (`"median"`) arranges them #' by median value from smallest (left) to largest (right). #' @param subset For `ppc_loo_intervals()` and `ppc_loo_ribbon()`, an optional #' integer vector indicating which observations in `y` (and `yrep`) to #' include. Dropping observations from `y` and `yrep` manually before passing #' them to the plotting function will not work because the dimensions will not #' match up with the dimensions of `psis_object`, but if all of `y` and `yrep` #' are passed along with `subset` then **bayesplot** can do the subsetting #' internally for `y`, `yrep` *and* `psis_object`. See the **Examples** #' section for a demonstration. #' ppc_loo_intervals <- function(y, yrep, psis_object, subset = NULL, intervals = NULL, ..., prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3, order = c("index", "median")) { check_ignored_arguments(...) y <- validate_y(y) order_by_median <- match.arg(order) == "median" if (!is.null(intervals)) { stopifnot(is.matrix(intervals), ncol(intervals) %in% c(3, 5)) inform(paste( "'intervals' specified so ignoring", "'yrep', 'psis_object', 'subset', if specified." )) if (ncol(intervals) == 3) { intervals <- cbind(intervals[, 1], intervals, intervals[, 3]) } } else { suggested_package("loo", min_version = "2.0.0") yrep <- validate_yrep(yrep, y) if (!is.null(subset)) { stopifnot(length(y) >= length(subset)) y <- y[subset] yrep <- yrep[, subset, drop=FALSE] psis_object <- .psis_subset(psis_object, subset) } probs <- sort(c(prob, prob_outer)) a <- (1 - probs) / 2 stopifnot(identical(dim(psis_object), dim(yrep))) intervals <- suppressWarnings(t(loo::E_loo( x = yrep, psis_object = psis_object, type = "quantile", probs = sort(c(a, 0.5, 1 - a)) )$value)) } x <- seq_along(y) if (order_by_median) { x <- reorder(x, intervals[, 2]) } graph <- .ppc_intervals( data = .loo_intervals_data(y, x, intervals), grouped = FALSE, style = "intervals", size = size, fatten = fatten, x_lab = "Data point (index)" ) if (!order_by_median) { return(graph) } graph + xlab("Ordered by median") + xaxis_text(FALSE) + xaxis_ticks(FALSE) } #' @rdname PPC-loo #' @export ppc_loo_ribbon <- function(y, yrep, lw, psis_object, subset = NULL, intervals = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25) { check_ignored_arguments(...) y <- validate_y(y) if (!is.null(intervals)) { stopifnot(is.matrix(intervals), ncol(intervals) %in% c(3, 5)) inform(paste( "'intervals' specified so ignoring", "'yrep', 'psis_object', 'subset', if specified." )) if (ncol(intervals) == 3) { intervals <- cbind(intervals[, 1], intervals, intervals[, 3]) } } else { suggested_package("loo", min_version = "2.0.0") yrep <- validate_yrep(yrep, y) if (!is.null(subset)) { stopifnot(length(y) >= length(subset)) y <- y[subset] yrep <- yrep[, subset, drop=FALSE] psis_object <- .psis_subset(psis_object, subset) } probs <- sort(c(prob, prob_outer)) a <- (1 - probs) / 2 stopifnot(identical(dim(psis_object), dim(yrep))) intervals <- suppressWarnings(t(loo::E_loo( x = yrep, psis_object = psis_object, type = "quantile", probs = sort(c(a, 0.5, 1 - a)) )$value)) } .ppc_intervals( data = .loo_intervals_data(y, x = seq_along(y), intervals), grouped = FALSE, style = "ribbon", size = size, alpha = alpha, x_lab = "Data point (index)" ) } # internal ---------------------------------------------------------------- .loo_intervals_data <- function(y, x, intervals) { stopifnot(length(y) == nrow(intervals), length(x) == length(y)) data.frame( y_id = seq_along(y), y_obs = y, x = x, ll = intervals[, 1], l = intervals[, 2], m = intervals[, 3], h = intervals[, 4], hh = intervals[, 5]) } # subset a psis_object without breaking it .psis_subset <- function(psis_object, subset) { stopifnot(all(subset == as.integer(subset))) if (length(subset) > dim(psis_object)[2]) { abort("'subset' has too many elements.") } psis_object$log_weights <- psis_object$log_weights[, subset, drop=FALSE] psis_object$diagnostics$pareto_k <- psis_object$diagnostics$pareto_k[subset] psis_object$diagnostics$n_eff <- psis_object$diagnostics$n_eff[subset] attr(psis_object, "dims") <- c(dim(psis_object)[1], length(subset)) attr(psis_object, "norm_const_log") <- attr(psis_object, "norm_const_log")[subset] attr(psis_object, "tail_len") <- attr(psis_object, "tail_len")[subset] attr(psis_object, "r_eff") <- attr(psis_object, "r_eff")[subset] psis_object } ## Boundary correction based on code by ArViz development team # The main method is a 1-D density estimation for linear data with # convolution with a Gaussian filter. # Based on scipy.signal.gaussian formula .gaussian <- function(N, bw){ n <- seq(0, N -1) - (N - 1)/2 sigma = 2 * bw * bw w = exp(-n^2 / sigma) return(w) } .linear_convolution <- function(x, bw, grid_counts, grid_breaks, grid_len){ # 1-D Gaussian estimation via # convolution of a Gaussian filter and the binned relative freqs bin_width <- grid_breaks[2] - grid_breaks[1] f <- grid_counts / bin_width / length(x) bw <- bw / bin_width # number of data points to generate for gaussian filter gauss_n <- as.integer(bw * 2 *pi) if (gauss_n == 0){ gauss_n = 1 } # Generate Gaussian filter vector kernel <- .gaussian(gauss_n, bw) npad <- as.integer(grid_len / 5) # Reflection method (i.e. get first N and last N points to pad vector) f <- c(rev(f[1:(npad)]), f, rev(f)[(grid_len - npad):(grid_len - 1)]) # Convolution: Gaussian filter + reflection method (pading) works as an # averaging moving window based on a Gaussian density which takes care # of the density boundary values near 0 and 1. bc_pvals <- stats::filter(f, kernel, method = 'convolution', sides = 2)[(npad + 1):(npad + grid_len)] bc_pvals / (bw * (2 * pi)^0.5) } .kde_correction <- function(x, bw, grid_len){ # Generate boundary corrected values via a linear convolution using a # 1-D Gaussian window filter. This method uses the "reflection method" # to estimate these pvalues and helps speed up the code if (any(is.infinite(x))){ warning(paste("Ignored", sum(is.infinite(x)), "Non-finite PIT values are invalid for KDE boundary correction method")) x <- x[is.finite(x)] } if (grid_len < 100){ grid_len = 100 } # Get relative frequency boundaries and counts for input vector bins <- seq(from= min(x), to = max(x), length.out = grid_len + 1) hist_obj <- graphics::hist(x, breaks = bins, plot = FALSE) grid_breaks <- hist_obj$breaks grid_counts <- hist_obj$counts # Compute bandwidth based on use specification bw <- stats::density(x, bw = bw)$bw # 1-D Convolution bc_pvals <- .linear_convolution(x, bw, grid_counts, grid_breaks, grid_len) # Generate vector of x-axis values for plotting based on binned relative freqs n_breaks <- length(grid_breaks) xs <- (grid_breaks[2:n_breaks] + grid_breaks[1:(n_breaks - 1)]) / 2 first_nonNA <- utils::head(which(!is.na(bc_pvals)),1) last_nonNA <- utils::tail(which(!is.na(bc_pvals)),1) bc_pvals[1:first_nonNA] <- bc_pvals[first_nonNA] bc_pvals[last_nonNA:length(bc_pvals)] <- bc_pvals[last_nonNA] list(xs = xs, bc_pvals = bc_pvals) } # Wrapper function to generate runif reference lines based on # .kde_correction() .ref_kde_correction <- function(unifs, bw, grid_len){ # Allocate memory idx <- seq(from = 1, to = ncol(unifs)*nrow(unifs) + ncol(unifs), by = ncol(unifs)) idx <- c(idx, ncol(unifs)*nrow(unifs)) xs <- rep(0, ncol(unifs)*nrow(unifs)) bc_mat <- matrix(0, nrow(unifs), ncol(unifs)) # Generate boundary corrected reference values for (i in 1:nrow(unifs)){ bc_list <- .kde_correction(unifs[i,], bw = bw, grid_len = grid_len) bc_mat[i,] <- bc_list$bc_pvals xs[idx[i]:(idx[i+1]-1)] <- bc_list$xs } list(xs = xs, unifs = bc_mat) } bayesplot/R/helpers-mcmc.R0000644000176200001440000003027414057717550015200 0ustar liggesusers#' Prepare 3-D array for MCMC plots #' #' @noRd #' @param x,pars,regex_pars,transformations Users's arguments to one of the #' mcmc_* functions. #' @return A 3-D (Iterations x Chains x Parameters) array. #' prepare_mcmc_array <- function(x, pars = character(), regex_pars = character(), transformations = list()) { if (is_df_with_chain(x)) { x <- df_with_chain2array(x) } else if (is_chain_list(x)) { # this will apply to mcmc.list and similar objects x <- chain_list2array(x) } else if (is.data.frame(x)) { # data frame without Chain column x <- as.matrix(x) } else { # try object's as.array method x <- as.array(x) } stopifnot(is.matrix(x) || is.array(x)) if (is.array(x) && !(length(dim(x)) %in% c(2,3))) { abort("Arrays should have 2 or 3 dimensions. See help('MCMC-overview').") } if (anyNA(x)) { abort("NAs not allowed in 'x'.") } if (rlang::is_quosures(pars)) { pars <- tidyselect_parameters(complete_pars = parameter_names(x), pars_list = pars) } else { pars <- select_parameters(complete_pars = parameter_names(x), explicit = pars, patterns = regex_pars) } # possibly recycle transformations (apply same to all pars) if (is.function(transformations) || (is.character(transformations) && length(transformations) == 1)) { transformations <- rep(list(transformations), length(pars)) transformations <- set_names(transformations, pars) } if (is.matrix(x)) { x <- x[, pars, drop=FALSE] if (length(transformations)) { x <- apply_transformations(x, transformations) } x <- array(x, dim = c(nrow(x), 1, ncol(x))) } else { x <- x[, , pars, drop = FALSE] if (length(transformations)) { x <- apply_transformations(x, transformations) } } pars <- rename_transformed_pars(pars, transformations) set_mcmc_dimnames(x, pars) } #' Explicit and/or regex parameter selection #' #' @noRd #' @param explicit Character vector of selected parameter names. #' @param patterns Character vector of regular expressions. #' @param complete_pars Character vector of all possible parameter names. #' @return Character vector of combined explicit and matched (via regex) #' parameter names, unless an error is thrown. #' select_parameters <- function(explicit = character(), patterns = character(), complete_pars = character()) { stopifnot(is.character(explicit), is.character(patterns), is.character(complete_pars)) if (!length(explicit) && !length(patterns)) { return(complete_pars) } if (length(explicit)) { if (!all(explicit %in% complete_pars)) { not_found <- which(!explicit %in% complete_pars) abort(paste( "Some 'pars' don't match parameter names:", paste(explicit[not_found], collapse = ", "), call. = FALSE )) } } if (!length(patterns)) { return(unique(explicit)) } else { regex_pars <- unlist(lapply(seq_along(patterns), function(j) { grep(patterns[j], complete_pars, value = TRUE) })) if (!length(regex_pars)) { abort("No matches for 'regex_pars'.") } } unique(c(explicit, regex_pars)) } #' Melt a 3-D array or matrix of MCMC draws #' #' @noRd #' @param x An mcmc_array (from prepare_mcmc_array). #' @param varnames,value.name,... Passed to reshape2::melt (array method). #' @return A molten data frame. #' melt_mcmc <- function(x, ...) UseMethod("melt_mcmc") melt_mcmc.mcmc_array <- function(x, varnames = c("Iteration", "Chain", "Parameter"), value.name = "Value", as.is = TRUE, ...) { stopifnot(is_mcmc_array(x)) long <- reshape2::melt( data = x, varnames = varnames, value.name = value.name, as.is = FALSE, ...) long$Parameter <- factor(long$Parameter) long } # If all chains are already merged melt_mcmc.matrix <- function(x, varnames = c("Draw", "Parameter"), value.name = "Value", ...) { long <- reshape2::melt( data = x, varnames = varnames, value.name = value.name, as.is = FALSE, ...) long$Parameter <- factor(long$Parameter) long } #' Set dimnames of 3-D array #' @noRd #' @param x 3-D array #' @param parnames Character vector of parameter names #' @return x with a modified dimnames. set_mcmc_dimnames <- function(x, parnames) { stopifnot(is_3d_array(x)) dimnames(x) <- list( Iteration = seq_len(nrow(x)), Chain = seq_len(ncol(x)), Parameter = parnames ) structure(x, class = c(class(x), "mcmc_array")) } #' Convert 3-D array to matrix with chains merged #' #' @noRd #' @param x A 3-D array (iter x chain x param) #' @return A matrix with one column per parameter #' merge_chains <- function(x) { xdim <- dim(x) mat <- array(x, dim = c(prod(xdim[1:2]), xdim[3])) colnames(mat) <- parameter_names(x) mat } #' Check if an object is a data.frame with a chain index column #' #' @noRd #' @param x object to check #' @return TRUE or FALSE is_df_with_chain <- function(x) { is.data.frame(x) && any(tolower(colnames(x)) %in% "chain") } validate_df_with_chain <- function(x) { stopifnot(is_df_with_chain(x)) x <- as.data.frame(x) if (!is.null(x$chain)) { if (is.null(x$Chain)) { x$Chain <- x$chain } x$chain <- NULL } x$Chain <- as.integer(x$Chain) x } # Convert data.frame with Chain variable to a 3-D array df_with_chain2array <- function(x) { x <- validate_df_with_chain(x) chain <- x$Chain n_chain <- length(unique(chain)) a <- x[, !colnames(x) %in% "Chain", drop = FALSE] parnames <- colnames(a) a <- as.matrix(a) x <- array(NA, dim = c(ceiling(nrow(a) / n_chain), n_chain, ncol(a))) for (j in seq_len(n_chain)) { x[, j, ] <- a[chain == j,, drop=FALSE] } set_mcmc_dimnames(x, parnames) } #' Check if an object is a list (but not a data.frame) that contains #' all 2-D objects #' @noRd #' @param x object to check #' @return TRUE or FALSE is_chain_list <- function(x) { check1 <- !is.data.frame(x) && is.list(x) dims <- try(sapply(x, function(chain) length(dim(chain))), silent=TRUE) if (inherits(dims, "try-error")) { return(FALSE) } check2 <- isTRUE(all(dims == 2)) # all elements of list should be matrices/2-D arrays check1 && check2 } validate_chain_list <- function(x) { n_chain <- length(x) for (i in seq_len(n_chain)) { nms <- colnames(as.matrix(x[[i]])) if (is.null(nms) || !all(nzchar(nms))) { abort(paste( "Some parameters are missing names.", "Check the column names for the matrices in your list of chains." )) } } if (n_chain > 1) { n_iter <- sapply(x, nrow) same_iters <- length(unique(n_iter)) == 1 if (!same_iters) { abort("Each chain should have the same number of iterations.") } cnames <- sapply(x, colnames) if (is.array(cnames)) { same_params <- identical(cnames[, 1], cnames[, 2]) } else { same_params <- length(unique(cnames)) == 1 } if (!same_params) { abort(paste( "The parameters for each chain should be in the same order", "and have the same names." )) } } x } # Convert list of matrices to 3-D array chain_list2array <- function(x) { x <- validate_chain_list(x) n_chain <- length(x) if (n_chain == 1) { n_iter <- nrow(x[[1]]) param_names <- colnames(x[[1]]) } else { n_iter <- sapply(x, nrow) cnames <- sapply(x, colnames) param_names <- if (is.array(cnames)) cnames[, 1] else cnames n_iter <- n_iter[1] } param_names <- unique(param_names) n_param <- length(param_names) out <- array(NA, dim = c(n_iter, n_chain, n_param)) for (i in seq_len(n_chain)) { out[, i,] <- x[[i]] } set_mcmc_dimnames(out, param_names) } # Get parameter names from a 3-D array parameter_names <- function(x) UseMethod("parameter_names") parameter_names.array <- function(x) { stopifnot(is_3d_array(x)) dimnames(x)[[3]] %||% abort("No parameter names found.") } parameter_names.default <- function(x) { colnames(x) %||% abort("No parameter names found.") } parameter_names.matrix <- function(x) { colnames(x) %||% abort("No parameter names found.") } # Check if an object is a 3-D array is_3d_array <- function(x) { if (!is.array(x)) { return(FALSE) } if (length(dim(x)) != 3) { return(FALSE) } TRUE } # Check if an object is a 3-D array AND has correct dimension names is_mcmc_array <- function(x) { if (!is_3d_array(x)) { return(FALSE) } if (!identical(names(dimnames(x)), c("Iteration", "Chain", "Parameter"))) { return(FALSE) } TRUE } # Check if 3-D array has multiple chains has_multiple_chains <- function(x) { stopifnot(is_3d_array(x)) isTRUE(dim(x)[2] > 1) } # Check if 3-D array has multiple parameters has_multiple_params <- function(x) { stopifnot(is_3d_array(x)) isTRUE(dim(x)[3] > 1) } STOP_need_multiple_chains <- function(call. = FALSE) { abort("This function requires multiple chains.") } # Validate that transformations match parameter names validate_transformations <- function(transformations = list(), pars = character()) { if (is.null(names(transformations))) { abort("'transformations' must be a _named_ list.") } else if (any(!nzchar(names(transformations)))) { abort("Each element of 'transformations' must have a name.") } transformations <- lapply(transformations, match.fun) if (!all(names(transformations) %in% pars)) { not_found <- which(!names(transformations) %in% pars) abort(paste( "Some names(transformations) don't match parameter names:", paste(names(transformations)[not_found], collapse = ", ") )) } transformations } #' Apply transformations to matrix or 3-D array of parameter draws #' #' @noRd #' @param x A matrix or 3-D array of draws #' @param transformation User's 'transformations' argument to one of the mcmc_* #' functions. #' @return x, with tranformations having been applied to some parameters. #' apply_transformations <- function(x, transformations = list(), ...) { UseMethod("apply_transformations") } apply_transformations.matrix <- function(x, transformations = list()) { pars <- colnames(x) x_transforms <- validate_transformations(transformations, pars) for (p in names(x_transforms)) { x[, p] <- x_transforms[[p]](x[, p]) } x } apply_transformations.array <- function(x, transformations = list()) { stopifnot(length(dim(x)) == 3) pars <- dimnames(x)[[3]] x_transforms <- validate_transformations(transformations, pars) for (p in names(x_transforms)) { x[, , p] <- x_transforms[[p]](x[, , p]) } x } rename_transformed_pars <- function(pars, transformations) { stopifnot(is.character(pars), is.list(transformations)) has_names <- sapply(transformations, is.character) if (any(has_names)) { nms <- names(which(has_names)) for (nm in nms) { pars[which(pars == nm)] <- paste0( transformations[[nm]], "(", pars[which(pars == nm)], ")" ) } } if (any(!has_names)) { nms <- names(which(!has_names)) pars[pars %in% nms] <- paste0("t(", pars[pars %in% nms], ")") } pars } num_chains <- function(x, ...) UseMethod("num_chains") num_iters <- function(x, ...) UseMethod("num_iters") num_params <- function(x, ...) UseMethod("num_params") num_params.mcmc_array <- function(x, ...) dim(x)[3] num_chains.mcmc_array <- function(x, ...) dim(x)[2] num_iters.mcmc_array <- function(x, ...) dim(x)[1] num_params.data.frame <- function(x, ...) { stopifnot("Parameter" %in% colnames(x)) length(unique(x$Parameter)) } num_chains.data.frame <- function(x, ...) { stopifnot("Chain" %in% colnames(x)) length(unique(x$Chain)) } num_iters.data.frame <- function(x, ...) { cols <- colnames(x) stopifnot("Iteration" %in% cols || "Draws" %in% cols) if ("Iteration" %in% cols) { n <- length(unique(x$Iteration)) } else { n <- length(unique(x$Draw)) } n } bayesplot/R/mcmc-overview.R0000644000176200001440000000564514057717550015410 0ustar liggesusers#' Plots for Markov chain Monte Carlo simulations #' #' @name MCMC-overview #' @aliases MCMC #' @family MCMC #' #' @description #' The **bayesplot** MCMC module provides various plotting functions for #' creating graphical displays of Markov chain Monte Carlo (MCMC) simulations. #' The **MCMC plotting functions** section, below, provides links to the #' documentation for various categories of MCMC plots. Currently the MCMC #' plotting functions accept posterior draws provided in one of the following #' formats: #' * __3-D array__: An array with dimensions `Iteration, Chain, Parameter` in #' that order. #' * __list__: A list of matrices, where each matrix corresponds to a Markov #' chain. All of the matrices should have the same number of iterations (rows) #' and parameters (columns), and parameters should have the same names and be in #' the same order. #' * __matrix (2-D array)__: A matrix with one column per parameter. If using #' matrix there should only be a single Markov chain or all chains should #' already be merged (stacked). #' * __data frame__: There are two types of data frames allowed. Either a data #' frame with one column per parameter (if only a single chain or all chains #' have already been merged), or a data frame with one column per parameter plus #' an additional column `"Chain"` that contains the chain number (an integer) #' corresponding to each row in the data frame. #' #' __Note__: typically the user should *not* include warmup iterations #' in the object passed to **bayesplot** plotting functions, although for #' certain plots (e.g. trace plots) it can occasionally be useful to include the #' warmup iterations for diagnostic purposes. #' #' @section MCMC plotting functions: #' #' * [Posterior distributions][MCMC-distributions]: #' Histograms and kernel density plots of parameter draws, optionally #' showing each Markov chain separately. #' * [Uncertainty intervals][MCMC-intervals]: Uncertainty intervals computed #' from parameter draws. #' * [Trace plots][MCMC-traces]: Times series of parameter draws, optionally #' including HMC/NUTS diagnostic information. #' * [Scatterplots][MCMC-scatterplots]: Scatterplots, heatmaps, and pairs #' plots of parameter draws, optionally including HMC/NUTS diagnostic #' information. #' * [Parallel coordinates plots][MCMC-parcoord]: Parallel coordinates plot #' of MCMC draws (one dimension per parameter), optionally including #' HMC/NUTS diagnostic information. #' * [Combos][MCMC-combos]: Combination plots (e.g. trace plot + histogram). #' * [General MCMC diagnostics][MCMC-diagnostics]: MCMC diagnostic plots #' including R-hat, effective sample size, autocorrelation. #' [NUTS diagnostics][MCMC-nuts]: Special diagnostic plots for #' the No-U-Turn Sampler. #' * [Comparisons to "true" values][MCMC-recover]: Plots comparing MCMC #' estimates to "true" parameter values (e.g., values used to simulate data). #' #' @template reference-vis-paper #' NULL bayesplot/R/ppc-discrete.R0000644000176200001440000002633314057717550015204 0ustar liggesusers#' PPCs for discrete outcomes #' #' Many of the [PPC][PPC-overview] functions in **bayesplot** can #' be used with discrete data. The small subset of these functions that can #' *only* be used if `y` and `yrep` are discrete are documented #' on this page. Currently these include rootograms for count outcomes and bar #' plots for ordinal, categorical, and multinomial outcomes. See the #' **Plot Descriptions** section below. #' #' @name PPC-discrete #' @family PPCs #' #' @template args-y-yrep #' @param ... Currently unused. #' @param prob A value between `0` and `1` indicating the desired probability #' mass to include in the `yrep` intervals. Set `prob=0` to remove the #' intervals. For `ppc_rootogram()` these are intervals of the *square roots* #' of the expected counts. #' @param width For `ppc_bars()` and `ppc_bars_grouped()`, passed to #' [ggplot2::geom_bar()] to control the bar width. #' @param size,fatten For `ppc_bars()` and `ppc_bars_grouped()`, `size` and #' `fatten` are passed to [ggplot2::geom_pointrange()] to control the #' appearance of the `yrep` points and intervals. For `ppc_rootogram()` `size` #' is passed to [ggplot2::geom_line()]. #' @param freq For `ppc_bars()` and `ppc_bars_grouped()`, if `TRUE` (the #' default) the y-axis will display counts. Setting `freq=FALSE` will put #' proportions on the y-axis. #' #' #' @template return-ggplot #' #' @details For all of these plots `y` and `yrep` must be integers, although #' they need not be integers in the strict sense of \R's #' [integer][base::integer] type. For rootogram plots `y` and `yrep` must also #' be non-negative. #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_bars()`}{ #' Bar plot of `y` with `yrep` medians and uncertainty intervals #' superimposed on the bars. #' } #' \item{`ppc_bars_grouped()`}{ #' Same as `ppc_bars()` but a separate plot (facet) is generated for each #' level of a grouping variable. #' } #' \item{`ppc_rootogram()`}{ #' Rootograms allow for diagnosing problems in count data models such as #' overdispersion or excess zeros. They consist of a histogram of `y` with the #' expected counts based on `yrep` overlaid as a line along with uncertainty #' intervals. The y-axis represents the square roots of the counts to #' approximately adjust for scale differences and thus ease comparison between #' observed and expected counts. Using the `style` argument, the histogram #' style can be adjusted to focus on different aspects of the data: #' * _Standing_: basic histogram of observed counts with curve #' showing expected counts. #' * _Hanging_: observed counts counts hanging from the curve #' representing expected counts. #' * _Suspended_: histogram of the differences between expected and #' observed counts. #' #' **All of these are plotted on the square root scale**. See Kleiber and #' Zeileis (2016) for advice on interpreting rootograms and selecting among #' the different styles. #' } #' } #' #' @examples #' set.seed(9222017) #' #' # bar plots #' f <- function(N) { #' sample(1:4, size = N, replace = TRUE, prob = c(0.25, 0.4, 0.1, 0.25)) #' } #' y <- f(100) #' yrep <- t(replicate(500, f(100))) #' dim(yrep) #' group <- gl(2, 50, length = 100, labels = c("GroupA", "GroupB")) #' #' color_scheme_set("mix-pink-blue") #' ppc_bars(y, yrep) #' #' # split by group, change interval width, and display proportion #' # instead of count on y-axis #' color_scheme_set("mix-blue-pink") #' ppc_bars_grouped(y, yrep, group, prob = 0.5, freq = FALSE) #' NULL #' @rdname PPC-discrete #' @export ppc_bars <- function(y, yrep, ..., prob = 0.9, width = 0.9, size = 1, fatten = 3, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (!all_whole_number(y)) { abort("ppc_bars expects 'y' to be discrete.") } if (!all_whole_number(yrep)) { abort("ppc_bars expects 'yrep' to be discrete.") } alpha <- (1 - prob) / 2 probs <- sort(c(alpha, 0.5, 1 - alpha)) yrep_data <- ppc_bars_yrep_data( y, yrep, probs = probs, freq = freq, group = NULL ) .ppc_bars( y_data = data.frame(y = y), yrep_data, grouped = FALSE, facet_args = list(), width = width, size = size, fatten = fatten, freq = freq ) } #' @rdname PPC-discrete #' @export #' @template args-group #' @param facet_args An optional list of arguments (other than `facets`) #' passed to [ggplot2::facet_wrap()] to control faceting. ppc_bars_grouped <- function(y, yrep, group, ..., facet_args = list(), prob = 0.9, width = 0.9, size = 1, fatten = 3, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) group <- validate_group(group, y) if (!all_whole_number(y)) { abort("ppc_bars_grouped expects 'y' to be discrete.") } if (!all_whole_number(yrep)) { abort("ppc_bars_grouped expects 'yrep' to be discrete.") } alpha <- (1 - prob) / 2 probs <- sort(c(alpha, 0.5, 1 - alpha)) yrep_data <- ppc_bars_yrep_data(y, yrep, probs, freq = freq, group = group) .ppc_bars( y_data = data.frame(y, group), yrep_data, grouped = TRUE, facet_args = facet_args, width = width, size = size, fatten = fatten, freq = freq ) } #' @rdname PPC-discrete #' @export #' @param style For `ppc_rootogram`, a string specifying the rootogram #' style. The options are `"standing"`, `"hanging"`, and #' `"suspended"`. See the **Plot Descriptions** section, below, for #' details on the different styles. #' #' @references #' Kleiber, C. and Zeileis, A. (2016). #' Visualizing count data regressions using rootograms. #' *The American Statistician*. 70(3): 296--303. #' . #' #' @examples #' # rootograms for counts #' y <- rpois(100, 20) #' yrep <- matrix(rpois(10000, 20), ncol = 100) #' #' color_scheme_set("brightblue") #' ppc_rootogram(y, yrep) #' ppc_rootogram(y, yrep, prob = 0) #' #' ppc_rootogram(y, yrep, style = "hanging", prob = 0.8) #' ppc_rootogram(y, yrep, style = "suspended") #' ppc_rootogram <- function(y, yrep, style = c("standing", "hanging", "suspended"), ..., prob = 0.9, size = 1) { check_ignored_arguments(...) style <- match.arg(style) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (!all_counts(y)) { abort("ppc_rootogram expects counts as inputs to 'y'.") } if (!all_counts(yrep)) { abort("ppc_rootogram expects counts as inputs to 'yrep'.") } alpha <- (1 - prob) / 2 probs <- c(alpha, 1 - alpha) ymax <- max(y, yrep) xpos <- 0L:ymax # prepare a table for yrep tyrep <- as.list(rep(NA, nrow(yrep))) for (i in seq_along(tyrep)) { tyrep[[i]] <- table(yrep[i,]) matches <- match(xpos, rownames(tyrep[[i]])) tyrep[[i]] <- as.numeric(tyrep[[i]][matches]) } tyrep <- do.call(rbind, tyrep) tyrep[is.na(tyrep)] <- 0 tyexp <- sqrt(colMeans(tyrep)) tyquantile <- sqrt(t(apply(tyrep, 2, quantile, probs = probs))) colnames(tyquantile) <- c("tylower", "tyupper") # prepare a table for y ty <- table(y) ty <- sqrt(as.numeric(ty[match(xpos, rownames(ty))])) if (style == "suspended") { ty <- tyexp - ty } ty[is.na(ty)] <- 0 ypos <- ty / 2 if (style == "hanging") ypos <- tyexp - ypos data <- data.frame(xpos, ypos, ty, tyexp, tyquantile) graph <- ggplot(data) + aes_( ymin = ~ tylower, ymax = ~ tyupper, height = ~ ty ) + geom_tile( aes_( x = ~ xpos, y = ~ ypos, fill = "Observed" ), color = get_color("lh"), size = 0.25, width = 1 ) + bayesplot_theme_get() if (style != "standing") graph <- graph + hline_0(size = 0.4) graph <- graph + geom_smooth( aes_( x = ~ xpos, y = ~ tyexp, color = "Expected" ), fill = get_color("d"), size = size, stat = "identity" ) + scale_fill_manual("", values = get_color("l")) + scale_color_manual("", values = get_color("dh")) + labs(x = expression(italic(y)), y = expression(sqrt(Count))) if (style == "standing") graph <- graph + dont_expand_y_axis() graph + reduce_legend_spacing(0.25) } # internal ---------------------------------------------------------------- #' @importFrom dplyr "%>%" ungroup count arrange mutate ppc_bars_yrep_data <- function(y, yrep, probs, freq = TRUE, group = NULL) { # Prepare for final summary sel <- ifelse(freq, "n", "proportion") lo <- function(x) quantile(x, probs[1]) mid <- function(x) quantile(x, probs[2]) hi <- function(x) quantile(x, probs[3]) fs <- list(lo = lo, mid = mid, hi = hi) # Set a dummy group for ungrouped data if (is.null(group)) { was_null_group <- TRUE group <- 1 } else{ was_null_group <- FALSE } # FIXME: make sure that levels with zero counts are still plotted yrep_data <- ppc_group_data(y, yrep, group = group, stat = NULL) %>% dplyr::filter(.data$variable != "y") %>% ungroup() %>% count(.data$group, .data$value, .data$variable) %>% group_by(.data$variable, .data$group) %>% mutate(proportion = .data$n / sum(.data$n)) %>% ungroup() %>% group_by(.data$group, .data$value) summary_stats <- yrep_data %>% dplyr::summarise_at(sel, fs) %>% ungroup() # Drop dummy group if (was_null_group) { summary_stats$group <- NULL } summary_stats %>% rename(x = .data$value) } .ppc_bars <- function(y_data, yrep_data, facet_args = list(), grouped = FALSE, width = 0.9, size = 1, fatten = 3, freq = TRUE) { graph <- ggplot() + geom_bar( data = y_data, mapping = if (freq) aes_(x = ~ y, fill = "y") else aes_(x = ~ y, y = ~ ..prop.., fill = "y"), color = get_color("lh"), width = width ) + geom_pointrange( data = yrep_data, mapping = aes_( x = ~ x, y = ~ mid, ymin = ~ lo, ymax = ~ hi, color = "yrep" ), size = size, fatten = fatten ) + scale_fill_manual("", values = get_color("l"), labels = y_label()) + scale_color_manual("", values = get_color("dh"), labels = yrep_label()) + guides(color = guide_legend(order = 1), fill = guide_legend(order = 2)) + labs(x = NULL, y = if (freq) "Count" else "Proportion") + bayesplot_theme_get() if (grouped) { facet_args[["facets"]] <- "group" graph <- graph + do.call("facet_wrap", facet_args) } graph <- graph + scale_x_continuous(breaks = pretty) + dont_expand_y_axis() # add a little space between the max value plotted and the top of the plot if (!grouped || !(isTRUE(facet_args[["scales"]] %in% c("free", "free_y")))) { g <- ggplot_build(graph) y_axis_max <- max(g$data[[1]][["ymax"]], g$data[[2]][["ymax"]]) graph <- graph + expand_limits(y = 1.05 * y_axis_max) } graph + reduce_legend_spacing(0.25) } bayesplot/R/mcmc-traces.R0000644000176200001440000005046414057717550015022 0ustar liggesusers#' Trace plots of MCMC draws #' #' Trace plot (or traceplot) of MCMC draws. See the **Plot Descriptions** #' section, below, for details. #' #' @name MCMC-traces #' @family MCMC #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @template args-facet_args #' @param ... Currently ignored. #' @param size An optional value to override the default line size #' for `mcmc_trace()` or the default point size for `mcmc_trace_highlight()`. #' @param alpha For `mcmc_trace_highlight()`, passed to #' [ggplot2::geom_point()] to control the transparency of the points #' for the chains not highlighted. #' @param n_warmup An integer; the number of warmup iterations included in #' `x`. The default is `n_warmup = 0`, i.e. to assume no warmup #' iterations are included. If `n_warmup > 0` then the background for #' iterations `1:n_warmup` is shaded gray. #' @param iter1 An integer; the iteration number of the first included draw #' (default is `0`). This can be used to make it more obvious that the warmup #' iterations have been discarded from the traceplot. It cannot be specified #' if `n_warmup` is also set to a positive value. #' @param window An integer vector of length two specifying the limits of a #' range of iterations to display. #' @param np For models fit using [NUTS] (more generally, any #' [symplectic integrator](https://en.wikipedia.org/wiki/Symplectic_integrator)), #' an optional data frame providing NUTS diagnostic information. The data #' frame should be the object returned by [nuts_params()] or one with the same #' structure. If `np` is specified then tick marks are added to the bottom of #' the trace plot indicating within which iterations there was a divergence #' (if there were any). See the end of the **Examples** section, below. #' @param np_style A call to the `trace_style_np()` helper function to #' specify arguments controlling the appearance of tick marks representing #' divergences (if the `np` argument is specified). #' @param divergences Deprecated. Use the `np` argument instead. #' #' @template return-ggplot-or-data #' @return `mcmc_trace_data()` returns the data for the trace *and* rank plots #' in the same data frame. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_trace()`}{ #' Standard trace plots of MCMC draws. For models fit using [NUTS], #' the `np` argument can be used to also show divergences on the trace plot. #' } #' \item{`mcmc_trace_highlight()`}{ #' Traces are plotted using points rather than lines and the opacity of all #' chains but one (specified by the `highlight` argument) is reduced. #' } #' \item{`mcmc_rank_hist()`}{ #' Whereas traditional trace plots visualize how the chains mix over the #' course of sampling, rank histograms visualize how the values #' from the chains mix together in terms of ranking. An ideal plot would #' show the rankings mixing or overlapping in a uniform distribution. #' See Vehtari et al. (2019) for details. #' } #' \item{`mcmc_rank_overlay()`}{ #' Ranks from `mcmc_rank_hist()` are plotted using overlaid lines in a #' single panel. #' } #' } #' #' @template reference-improved-rhat #' @examples #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(chains = 4, params = 6) #' dim(x) #' dimnames(x) #' #' # trace plots of the betas #' color_scheme_set("viridis") #' mcmc_trace(x, regex_pars = "beta") #' \donttest{ #' color_scheme_set("viridisA") #' mcmc_trace(x, regex_pars = "beta") #' #' color_scheme_set("viridisC") #' mcmc_trace(x, regex_pars = "beta") #' } #' #' # mix color schemes #' color_scheme_set("mix-blue-red") #' mcmc_trace(x, regex_pars = "beta") #' #' # use traditional ggplot discrete color scale #' mcmc_trace(x, pars = c("alpha", "sigma")) + #' ggplot2::scale_color_discrete() #' #' # zoom in on a window of iterations, increase line size, #' # add tick marks, move legend to the top, add gray background #' color_scheme_set("viridisA") #' mcmc_trace(x[,, 1:4], window = c(100, 130), size = 1) + #' panel_bg(fill = "gray90", color = NA) + #' legend_move("top") #' #' # Rank-normalized histogram plots. Instead of showing how chains mix over #' # time, look at how the ranking of MCMC samples mixed between chains. #' color_scheme_set("viridisE") #' mcmc_rank_hist(x, "alpha") #' mcmc_rank_hist(x, pars = c("alpha", "sigma"), ref_line = TRUE) #' mcmc_rank_overlay(x, "alpha") #' #' \dontrun{ #' # parse facet label text #' color_scheme_set("purple") #' p <- mcmc_trace( #' x, #' regex_pars = "beta\\\[[1,3]\\\]", #' facet_args = list(labeller = ggplot2::label_parsed) #' ) #' p + facet_text(size = 15) #' #' # mark first 100 draws as warmup #' mcmc_trace(x, n_warmup = 100) #' #' # plot as points, highlighting chain 2 #' color_scheme_set("brightblue") #' mcmc_trace_highlight(x, pars = "sigma", highlight = 2, size = 2) #' #' # for models fit using HMC/NUTS divergences can be displayed in the trace plot #' library("rstanarm") #' fit <- stan_glm(mpg ~ ., data = mtcars, refresh = 0, #' # next line to keep example fast and also ensure we get some divergences #' prior = hs(), iter = 400, adapt_delta = 0.8) #' #' # extract draws using as.array (instead of as.matrix) to keep #' # chains separate for trace plot #' posterior <- as.array(fit) #' #' # for stanfit and stanreg objects use nuts_params() to get the divergences #' mcmc_trace(posterior, pars = "sigma", np = nuts_params(fit)) #' #' color_scheme_set("viridis") #' mcmc_trace( #' posterior, #' pars = c("wt", "sigma"), #' size = 0.5, #' facet_args = list(nrow = 2), #' np = nuts_params(fit), #' np_style = trace_style_np(div_color = "black", div_size = 0.5) #' ) #' } #' NULL #' @rdname MCMC-traces #' @export mcmc_trace <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, iter1 = 0, window = NULL, size = NULL, np = NULL, np_style = trace_style_np(), divergences = NULL) { # deprecate 'divergences' arg in favor of 'np' # (for consistency across functions) if (!is.null(np) && !is.null(divergences)) { abort(paste0( "'np' and 'divergences' can't both be specified. ", "Use only 'np' (the 'divergences' argument is deprecated)." )) } else if (!is.null(divergences)) { warn(paste0( "The 'divergences' argument is deprecated ", "and will be removed in a future release. ", "Use the 'np' argument instead." )) np <- divergences } check_ignored_arguments(...) .mcmc_trace( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, n_warmup = n_warmup, window = window, size = size, style = "line", np = np, np_style = np_style, iter1 = iter1, ... ) } #' @rdname MCMC-traces #' @export #' @param highlight For `mcmc_trace_highlight()`, an integer specifying one #' of the chains that will be more visible than the others in the plot. mcmc_trace_highlight <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_warmup = 0, window = NULL, size = NULL, alpha = 0.2, highlight = 1) { check_ignored_arguments(...) .mcmc_trace( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, n_warmup = n_warmup, window = window, size = size, alpha = alpha, highlight = highlight, style = "point", ... ) } #' @rdname MCMC-traces #' @export #' @param div_color,div_size,div_alpha Optional arguments to the #' `trace_style_np()` helper function that are eventually passed to #' [ggplot2::geom_rug()] if the `np` argument is also specified. They control #' the color, size, and transparency specifications for showing divergences in #' the plot. The default values are displayed in the **Usage** section above. #' trace_style_np <- function(div_color = "red", div_size = 0.25, div_alpha = 1) { stopifnot( is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } #' @rdname MCMC-traces #' @param n_bins For the rank plots, the number of bins to use for the histogram #' of rank-normalized MCMC samples. Defaults to `20`. #' @param ref_line For the rank plots, whether to draw a horizontal line at the #' average number of ranks per bin. Defaults to `FALSE`. #' @export mcmc_rank_overlay <- function(x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), ..., n_bins = 20, ref_line = FALSE) { check_ignored_arguments(...) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations ) n_chains <- unique(data$n_chains) n_param <- unique(data$n_parameters) # We have to bin and count the data ourselves because # ggplot2::stat_bin(geom = "step") does not draw the final bin. histobins <- data %>% dplyr::distinct(.data$value_rank) %>% mutate(cut = cut(.data$value_rank, n_bins)) %>% group_by(.data$cut) %>% mutate(bin_start = min(.data$value_rank)) %>% ungroup() %>% select(-.data$cut) d_bin_counts <- data %>% left_join(histobins, by = "value_rank") %>% count(.data$parameter, .data$chain, .data$bin_start) # Duplicate the final bin, setting the left edge to the greatest x value, so # that the entire x-axis is used, right_edge <- max(data$value_rank) d_bin_counts <- d_bin_counts %>% dplyr::filter(.data$bin_start == max(.data$bin_start)) %>% mutate(bin_start = right_edge) %>% dplyr::bind_rows(d_bin_counts) scale_color <- scale_color_manual("Chain", values = chain_colors(n_chains)) layer_ref_line <- if (ref_line) { geom_hline( yintercept = (right_edge / n_bins) / n_chains, color = get_color("dark_highlight"), size = 1, linetype = "dashed" ) } else { NULL } facet_call <- NULL if (n_param > 1) { facet_args$facets <- ~ parameter facet_args$scales <- facet_args$scales %||% "fixed" facet_call <- do.call("facet_wrap", facet_args) } ggplot(d_bin_counts) + aes_(x = ~ bin_start, y = ~ n, color = ~ chain) + geom_step() + layer_ref_line + facet_call + scale_color + ylim(c(0, NA)) + bayesplot_theme_get() + force_x_axis_in_facets() + labs(x = "Rank", y = NULL) } #' @rdname MCMC-traces #' @export mcmc_rank_hist <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), n_bins = 20, ref_line = FALSE) { check_ignored_arguments(...) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations ) n_iter <- unique(data$n_iterations) n_chains <- unique(data$n_chains) n_param <- unique(data$n_parameters) # Create a dataframe with chain x parameter x min(rank) x max(rank) to set # x axis range in each facet data_boundaries <- data %>% dplyr::distinct(.data$chain, .data$parameter) data_boundaries <- dplyr::bind_rows( mutate(data_boundaries, value_rank = min(data$value_rank)), mutate(data_boundaries, value_rank = max(data$value_rank)) ) right_edge <- max(data_boundaries$value_rank) facet_args[["scales"]] <- facet_args[["scales"]] %||% "fixed" facet_args[["facets"]] <- facet_args[["facets"]] %||% (parameter ~ chain) # If there is one parameter, put the chains in one row. # Otherwise, use a grid. if (n_param > 1) { facet_f <- facet_grid } else { facet_f <- facet_wrap facet_args[["nrow"]] <- facet_args[["nrow"]] %||% 1 labeller <- function(x) label_value(x, multi_line = FALSE) facet_args[["labeller"]] <- facet_args[["labeller"]] %||% labeller } layer_ref_line <- if (ref_line) { geom_hline( yintercept = (right_edge / n_bins) / n_chains, color = get_color("dark_highlight"), size = .5, linetype = "dashed" ) } else { NULL } facet_call <- do.call(facet_f, facet_args) ggplot(data) + aes_(x = ~ value_rank) + geom_histogram( color = get_color("mid_highlight"), fill = get_color("mid"), binwidth = right_edge / n_bins, boundary = right_edge, size = .25 ) + layer_ref_line + geom_blank(data = data_boundaries) + facet_call + force_x_axis_in_facets() + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + theme( axis.line.y = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank() ) + labs(x = "Rank") } #' @rdname MCMC-traces #' @export mcmc_trace_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., highlight = NULL, n_warmup = 0, iter1 = 0) { check_ignored_arguments(...) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (iter1 < 0) { abort("'iter1' cannot be negative.") } if (n_warmup > 0 && iter1 > 0) { abort("'n_warmup' and 'iter1' can't both be specified.") } if (!is.null(highlight)) { stopifnot(length(highlight) == 1) if (!has_multiple_chains(x)){ STOP_need_multiple_chains() } if (!highlight %in% seq_len(ncol(x))) { abort(paste0( "'highlight' is ", highlight, ", but 'x' contains ", ncol(x), " chains." )) } } data <- melt_mcmc(x) data$Chain <- factor(data$Chain) data$n_chains <- num_chains(data) data$n_iterations <- num_iters(data) data$n_parameters <- num_params(data) data <- rlang::set_names(data, tolower) first_cols <- syms(c("parameter", "value", "value_rank")) data <- data %>% group_by(.data$parameter) %>% mutate( value_rank = rank(.data$value, ties.method = "average") ) %>% ungroup() %>% select(!!! first_cols, dplyr::everything()) data$highlight <- if (!is.null(highlight)) { data$chain == highlight } else { FALSE } data$warmup <- data$iteration <= n_warmup data$iteration <- data$iteration + as.integer(iter1) tibble::as_tibble(data) } # internal ----------------------------------------------------------------- .mcmc_trace <- function(x, pars = character(), regex_pars = character(), transformations = list(), n_warmup = 0, window = NULL, size = NULL, facet_args = list(), highlight = NULL, style = c("line", "point"), alpha = 0.2, np = NULL, np_style = trace_style_np(), iter1 = 0, ...) { style <- match.arg(style) data <- mcmc_trace_data( x, pars = pars, regex_pars = regex_pars, transformations = transformations, highlight = highlight, n_warmup = n_warmup, iter1 = iter1 ) n_iter <- unique(data$n_iterations) n_chain <- unique(data$n_chains) n_param <- unique(data$n_parameters) mapping <- aes_( x = ~ iteration, y = ~ value, color = ~ chain ) if (!is.null(highlight)) { mapping <- modify_aes_( mapping, alpha = ~ highlight, color = ~ highlight ) } layer_warmup <- if (n_warmup > 0) { layer_warmup <- annotate( "rect", xmin = -Inf, xmax = n_warmup, ymin = -Inf, ymax = Inf, size = 1, color = "gray88", fill = "gray88", alpha = 0.5 ) } else { NULL } geom_args <- list() geom_args$size <- size %||% ifelse(style == "line", 1/3, 1) layer_draws <- do.call(paste0("geom_", style), geom_args) coord_window <- if (!is.null(window)) { stopifnot(length(window) == 2) coord_cartesian(xlim = window) } else { NULL } scale_alpha <- NULL scale_color <- NULL div_rug <- NULL div_guides <- NULL if (!is.null(highlight)) { ## scale_alpha_discrete() warns on default scale_alpha <- scale_alpha_ordinal(range = c(alpha, 1), guide = "none") scale_color <- scale_color_manual( "", values = get_color(c("lh", "d")), labels = c("Other chains", paste("Chain", highlight))) } else { scale_color <- scale_color_manual("Chain", values = chain_colors(n_chain)) if (!is.null(np)) { div_rug <- divergence_rug(np, np_style, n_iter, n_chain) if (!is.null(div_rug)) { div_guides <- guides( color = guide_legend(order = 1), linetype = guide_legend( order = 2, title = NULL, keywidth = rel(1/2), override.aes = list(size = rel(1/2))) ) } } } facet_call <- NULL if (n_param == 1) { facet_call <- ylab(levels(data$parameter)) } else { facet_args$facets <- ~ parameter facet_args$scales <- facet_args$scales %||% "free" facet_call <- do.call("facet_wrap", facet_args) } ggplot(data, mapping) + bayesplot_theme_get() + layer_warmup + layer_draws + coord_window + scale_alpha + scale_color + div_rug + div_guides + facet_call + scale_x_continuous(breaks = pretty) + legend_move(ifelse(n_chain > 1, "right", "none")) + xaxis_title(FALSE) + yaxis_title(on = n_param == 1) } chain_colors <- function(n) { all_clrs <- unlist(color_scheme_get()) clrs <- switch( as.character(n), "1" = get_color("m"), "2" = get_color(c("l", "d")), "3" = get_color(c("l", "m", "d")), "4" = all_clrs[-c(2, 4)], "5" = all_clrs[-3], "6" = all_clrs, rep_len(all_clrs, n) ) unname(rev(clrs)) } #' Add divergences to trace plot using geom_rug #' #' @noRd #' @param np User's `np` argument, if specified. #' @param np_style User's `np_style` argument, if specified. #' @param n_iter Number of iterations in the trace plot (to check against number #' of iterations provided in `np`). #' @param n_chain Number of chains in the trace plot (to check against number of #' chains provided in `np`). #' @return Object returned by `ggplot2::geom_rug()`. #' #' @importFrom dplyr summarise group_by select divergence_rug <- function(np, np_style, n_iter, n_chain) { if (is.data.frame(np)) { np <- validate_nuts_data_frame(np) stopifnot(num_iters(np) == n_iter, num_chains(np) == n_chain) iter <- sym("Iteration") val <- sym("Value") param <- sym("Parameter") divg <- sym("Divergent") div_info <- np %>% dplyr::filter(UQ(param) == "divergent__") %>% group_by(!! iter) %>% summarise( Divergent = ifelse(sum(!! val) > 0, !! iter, NA) ) %>% select(!! divg) } else { # not using a data frame is deprecated but maintain backwards # compatibility for now divergences <- np stopifnot( is_vector_or_1Darray(divergences), length(divergences) == n_iter, all(divergences %in% c(0, 1)) ) divergences <- ifelse(divergences == 1, seq_along(divergences), NA) div_info <- data.frame(Divergent = divergences) } if (all(is.na(div_info$Divergent))) { inform("No divergences to plot.") return(NULL) } geom_rug( aes_(x = ~ Divergent, linetype = "Divergence"), data = div_info, na.rm = TRUE, inherit.aes = FALSE, sides = "b", color = np_style$color[["div"]], size = np_style$size[["div"]], alpha = np_style$alpha[["div"]] ) } bayesplot/R/mcmc-distributions.R0000644000176200001440000003203014057717550016430 0ustar liggesusers#' Histograms and kernel density plots of MCMC draws #' #' Various types of histograms and kernel density plots of MCMC draws. See the #' **Plot Descriptions** section, below, for details. #' #' @name MCMC-distributions #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @template args-facet_args #' @param ... Currently ignored. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_hist()`}{ #' Histograms of posterior draws with all chains merged. #' } #' \item{`mcmc_dens()`}{ #' Kernel density plots of posterior draws with all chains merged. #' } #' \item{`mcmc_hist_by_chain()`}{ #' Histograms of posterior draws with chains separated via faceting. #' } #' \item{`mcmc_dens_overlay()`}{ #' Kernel density plots of posterior draws with chains separated but #' overlaid on a single plot. #' } #' \item{`mcmc_violin()`}{ #' The density estimate of each chain is plotted as a violin with #' horizontal lines at notable quantiles. #' } #' \item{`mcmc_dens_chains()`}{ #' Ridgeline kernel density plots of posterior draws with chains separated #' but overlaid on a single plot. In `mcmc_dens_overlay()` parameters #' appear in separate facets; in `mcmc_dens_chains()` they appear in the #' same panel and can overlap vertically. #' } #' } #' #' @examples #' set.seed(9262017) #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' ################## #' ### Histograms ### #' ################## #' #' # histograms of all parameters #' color_scheme_set("brightblue") #' mcmc_hist(x) #' #' # histograms of some parameters #' color_scheme_set("pink") #' mcmc_hist(x, pars = c("alpha", "beta[2]")) #' \donttest{ #' mcmc_hist(x, pars = "sigma", regex_pars = "beta") #' } #' # example of using 'transformations' argument to plot log(sigma), #' # and parsing facet labels (e.g. to get greek letters for parameters) #' mcmc_hist(x, transformations = list(sigma = "log"), #' facet_args = list(labeller = ggplot2::label_parsed)) + #' facet_text(size = 15) #' \donttest{ #' # instead of list(sigma = "log"), you could specify the transformation as #' # list(sigma = log) or list(sigma = function(x) log(x)), but then the #' # label for the transformed sigma is 't(sigma)' instead of 'log(sigma)' #' mcmc_hist(x, transformations = list(sigma = log)) #' #' # separate histograms by chain #' color_scheme_set("pink") #' mcmc_hist_by_chain(x, regex_pars = "beta") #' } #' #' ################# #' ### Densities ### #' ################# #' #' mcmc_dens(x, pars = c("sigma", "beta[2]"), #' facet_args = list(nrow = 2)) #' \donttest{ #' # separate and overlay chains #' color_scheme_set("mix-teal-pink") #' mcmc_dens_overlay(x, pars = c("sigma", "beta[2]"), #' facet_args = list(nrow = 2)) + #' facet_text(size = 14) #' x2 <- example_mcmc_draws(params = 6) #' mcmc_dens_chains(x2, pars = c("beta[1]", "beta[2]", "beta[3]")) #' } #' # separate chains as violin plots #' color_scheme_set("green") #' mcmc_violin(x) + panel_bg(color = "gray20", size = 2, fill = "gray30") #' NULL #' @rdname MCMC-distributions #' @export #' @template args-hist #' @template args-hist-freq #' mcmc_hist <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) .mcmc_hist( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, binwidth = binwidth, breaks = breaks, by_chain = FALSE, freq = freq, ... ) } #' @rdname MCMC-distributions #' @export mcmc_dens <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), trim = FALSE) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, by_chain = FALSE, trim = trim, ... ) } #' @rdname MCMC-distributions #' @export #' mcmc_hist_by_chain <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), binwidth = NULL, freq = TRUE) { check_ignored_arguments(...) .mcmc_hist( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, binwidth = binwidth, by_chain = TRUE, freq = freq, ... ) } #' @rdname MCMC-distributions #' @export mcmc_dens_overlay <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), color_chains = TRUE, trim = FALSE) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, by_chain = TRUE, color_chains = color_chains, trim = trim, ... ) } #' @rdname MCMC-distributions #' @template args-density-controls #' @param color_chains Option for whether to separately color chains. #' @export mcmc_dens_chains <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., color_chains = TRUE, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) data <- mcmc_dens_chains_data(x, pars = pars, regex_pars = regex_pars, transformations = transformations, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) n_chains <- length(unique(data$chain)) if (n_chains == 1) STOP_need_multiple_chains() # An empty data-frame to train legend colors line_training <- dplyr::slice(data, 0) if (color_chains) { scale_color <- scale_color_manual(values = chain_colors(n_chains)) } else { scale_color <- scale_color_manual( values = rep(get_color("m"), n_chains), guide = "none") } ggplot(data) + aes_(x = ~ x, y = ~ parameter, color = ~ chain, group = ~ interaction(chain, parameter)) + geom_line(data = line_training) + ggridges::geom_density_ridges( aes_(height = ~ density), stat = "identity", fill = NA, show.legend = FALSE) + labs(color = "Chain") + scale_y_discrete(limits = unique(rev(data$parameter)), expand = c(0.05, .6)) + scale_color + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_title(FALSE) + grid_lines_y(color = "gray90") + theme(axis.text.y = element_text(hjust = 1, vjust = 0)) } #' @rdname MCMC-distributions #' @export mcmc_dens_chains_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) x %>% prepare_mcmc_array(pars = pars, regex_pars = regex_pars, transformations = transformations) %>% melt_mcmc() %>% compute_column_density(c(.data$Parameter, .data$Chain), .data$Value, interval_width = 1, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) %>% mutate(Chain = factor(.data$Chain)) %>% rlang::set_names(tolower) %>% dplyr::as_tibble() } #' @rdname MCMC-distributions #' @inheritParams ppc_violin_grouped #' @export mcmc_violin <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., facet_args = list(), probs = c(0.1, 0.5, 0.9)) { check_ignored_arguments(...) .mcmc_dens( x, pars = pars, regex_pars = regex_pars, transformations = transformations, facet_args = facet_args, geom = "violin", probs = probs, ... ) } # internal ----------------------------------------------------------------- .mcmc_hist <- function(x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), binwidth = NULL, breaks = NULL, by_chain = FALSE, freq = TRUE, ...) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) if (by_chain && !has_multiple_chains(x)) { STOP_need_multiple_chains() } data <- melt_mcmc(x, value.name = "value") n_param <- num_params(data) graph <- ggplot(data, aes(x = ~ value)) + geom_histogram( set_hist_aes(freq), fill = get_color("mid"), color = get_color("mid_highlight"), size = .25, na.rm = TRUE, binwidth = binwidth, breaks = breaks ) facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" if (!by_chain) { if (n_param > 1) { facet_args[["facets"]] <- ~ Parameter graph <- graph + do.call("facet_wrap", facet_args) } } else { facet_args[["facets"]] <- if (n_param > 1) { "Chain ~ Parameter" } else { "Chain ~ ." } graph <- graph + do.call("facet_grid", facet_args) + force_axes_in_facets() } if (n_param == 1) { graph <- graph + xlab(levels(data$Parameter)) } graph + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(on = n_param == 1) } .mcmc_dens <- function(x, pars = character(), regex_pars = character(), transformations = list(), facet_args = list(), by_chain = FALSE, color_chains = FALSE, geom = c("density", "violin"), probs = c(0.1, 0.5, 0.9), trim = FALSE, ...) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) data <- melt_mcmc(x) data$Chain <- factor(data$Chain) n_param <- num_params(data) geom <- match.arg(geom) violin <- geom == "violin" geom_fun <- if (by_chain) "stat_density" else paste0("geom_", geom) if (by_chain || violin) { if (!has_multiple_chains(x)) { STOP_need_multiple_chains() } else { n_chains <- num_chains(data) } } aes_mapping <- if (violin) { list(x = ~ Chain, y = ~ Value) } else { list(x = ~ Value) } geom_args <- list(size = 0.5, na.rm = TRUE) if (violin) { geom_args[["draw_quantiles"]] <- probs } else { geom_args[["trim"]] <- trim } if (by_chain) { aes_mapping[["color"]] <- ~ Chain aes_mapping[["group"]] <- ~ Chain geom_args[["geom"]] <- "line" geom_args[["position"]] <- "identity" } else { geom_args[["fill"]] <- get_color("mid") geom_args[["color"]] <- get_color("mid_highlight") } graph <- ggplot(data, mapping = do.call("aes_", aes_mapping)) + do.call(geom_fun, geom_args) if (!violin) { graph <- graph + dont_expand_x_axis() } if (by_chain) { if (color_chains) { scale_color <- scale_color_manual(values = chain_colors(n_chains)) } else { scale_color <- scale_color_manual( values = rep(get_color("m"), n_chains), guide = "none") } graph <- graph + scale_color } if (n_param == 1) { graph <- graph + labs(x = if (violin) "Chain" else levels(data$Parameter), y = if (violin) levels(data$Parameter) else NULL) } else { facet_args[["facets"]] <- ~ Parameter facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" graph <- graph + do.call("facet_wrap", facet_args) } graph + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(on = n_param == 1 && violin) + xaxis_title(on = n_param == 1) } bayesplot/R/bayesplot-package.R0000644000176200001440000000721514057717550016213 0ustar liggesusers#' **bayesplot**: Plotting for Bayesian Models #' #' @docType package #' @name bayesplot-package #' @aliases bayesplot #' #' @import ggplot2 stats rlang #' @importFrom dplyr %>% summarise group_by select #' #' @description #' \if{html}{ #' \figure{stanlogo.png}{options: width="50px" alt="mc-stan.org"} #' } #' *Stan Development Team* #' #' The **bayesplot** package provides a variety of **ggplot2**-based #' plotting functions for use after fitting Bayesian models (typically, though #' not exclusively, via Markov chain Monte Carlo). The package is designed not #' only to provide convenient functionality for users, but also a common set of #' functions that can be easily used by developers working on a variety of #' packages for Bayesian modeling, particularly (but not necessarily) packages #' powered by RStan (the \R interface to Stan). #' Examples of packages that will soon (or already are) using **bayesplot** are #' **rstan** itself, as well as the **rstan**-dependent **rstanarm** and #' **brms** packages for applied regression modeling. #' #' @section Plotting functionality: #' \if{html}{ #' \figure{bayesplot1.png}{options: width="30\%" alt="mcmc_areas"} #' \figure{bayesplot2.png}{options: width="30\%" alt="ppc_hist"} #' \figure{bayesplot3.png}{options: width="30\%" alt="ppc_dens_overlay"} #' } #' #' The plotting functions in **bayesplot** are organized into several modules: #' * [MCMC][MCMC-overview]: Visualizations of Markov chain #' Monte Carlo (MCMC) simulations generated by *any* MCMC algorithm #' as well as diagnostics. There are also additional functions specifically #' for use with models fit using the [No-U-Turn Sampler (NUTS)][NUTS]. #' * [PPC][PPC-overview]: Graphical prior and posterior predictive #' checks (PPCs). #' #' In future releases modules will be added specifically for #' forecasting/out-of-sample prediction and other inference-related tasks. #' #' @section Resources: #' * __Online documentation and vignettes__: Visit the __bayesplot__ website at #' #' * __Bug reports and feature requests__: If you would like to request a new #' feature or if you have noticed a bug that needs to be fixed please let us #' know at the **bayesplot** issue tracker at #' #' * __General questions and help__: #' To ask a question about **bayesplot** on the Stan Forums forum please visit #' . #' #' @template seealso-theme #' @template seealso-colors #' @seealso [ggplot2::ggsave()] for saving plots. #' #' @template reference-vis-paper #' #' @examples #' # A few quick examples (all of the functions have many examples #' # on their individual help pages) #' #' # MCMC plots #' x <- example_mcmc_draws(params = 5) #' mcmc_intervals(x, prob = 0.5) #' mcmc_intervals(x, regex_pars = "beta") #' #' color_scheme_set("purple") #' mcmc_areas(x, regex_pars = "beta", prob = 0.8) #' #' color_scheme_set("mix-blue-red") #' mcmc_trace(x, pars = c("alpha", "sigma"), #' facet_args = list(nrow = 2)) #' #' color_scheme_set("brightblue") #' mcmc_scatter(x, pars = c("beta[1]", "sigma"), #' transformations = list(sigma = "log")) #' #' #' # Graphical PPCs #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_dens_overlay(y, yrep[1:50, ]) #' \donttest{ #' color_scheme_set("pink") #' ppc_stat(y, yrep, stat = "median") + grid_lines() #' ppc_hist(y, yrep[1:8, ]) #' } #' NULL # internal ---------------------------------------------------------------- # release reminders (for devtools) release_questions <- function() { # nocov start c( "Have you reduced the size of the vignettes for CRAN?" ) } # nocov end bayesplot/R/ppc-intervals.R0000644000176200001440000002617414057717550015414 0ustar liggesusers#' PPC intervals #' #' Medians and central interval estimates of `yrep` with `y` overlaid. #' See the **Plot Descriptions** section, below. #' #' @name PPC-intervals #' @family PPCs #' #' @template args-y-yrep #' @template args-prob-prob_outer #' @param x A numeric vector the same length as `y` to use as the x-axis #' variable. For example, `x` could be a predictor variable from a #' regression model, a time variable for time-series models, etc. If `x` #' is missing or `NULL`, then `1:length(y)` is used for the x-axis. #' @param ... Currently unused. #' @param alpha,size,fatten Arguments passed to geoms. For ribbon plots `alpha` #' and `size` are passed to [ggplot2::geom_ribbon()]. For interval plots #' `size` and `fatten` are passed to [ggplot2::geom_pointrange()]. #' #' @template return-ggplot-or-data #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_intervals(), ppc_ribbon()`}{ #' `100*prob`% central intervals for `yrep` at each `x` #' value. `ppc_intervals()` plots intervals as vertical bars with points #' indicating `yrep` medians and darker points indicating observed #' `y` values. `ppc_ribbon()` plots a ribbon of connected intervals #' with a line through the median of `yrep` and a darker line connecting #' observed `y` values. In both cases an optional `x` variable can #' also be specified for the x-axis variable. #' #' Depending on the number of observations and the variability in the #' predictions at different values of `x`, one or the other of these #' plots may be easier to read than the other. #' } #' \item{`ppc_intervals_grouped(), ppc_ribbon_grouped()`}{ #' Same as `ppc_intervals()` and `ppc_ribbon()`, respectively, but a #' separate plot (facet) is generated for each level of a grouping variable. #' } #' } #' #' @examples #' y <- rnorm(50) #' yrep <- matrix(rnorm(5000, 0, 2), ncol = 50) #' #' color_scheme_set("brightblue") #' ppc_ribbon(y, yrep) #' ppc_intervals(y, yrep) #' #' # change x axis to y values (instead of indices) and add x = y line #' ppc_intervals(y, yrep, x = y) + abline_01() #' #' #' color_scheme_set("teal") #' year <- 1950:1999 #' ppc_ribbon(y, yrep, x = year, alpha = 0, size = 0.75) + ggplot2::xlab("Year") #' #' color_scheme_set("pink") #' year <- rep(2000:2009, each = 5) #' group <- gl(5, 1, length = 50, labels = LETTERS[1:5]) #' ppc_ribbon_grouped(y, yrep, x = year, group) + #' ggplot2::scale_x_continuous(breaks = pretty) #' #' ppc_ribbon_grouped( #' y, yrep, x = year, group, #' facet_args = list(scales = "fixed"), #' alpha = 1, #' size = 2 #' ) + #' xaxis_text(FALSE) + #' xaxis_ticks(FALSE) + #' panel_bg(fill = "gray20") #' #' ppc_dat <- ppc_intervals_data(y, yrep, x = year, prob = 0.5) #' ppc_group_dat <- ppc_intervals_data(y, yrep, x = year, group = group, prob = 0.5) #' #' \dontrun{ #' library("rstanarm") #' fit <- stan_glmer(mpg ~ wt + (1|cyl), data = mtcars, refresh = 0) #' yrep <- posterior_predict(fit) #' #' color_scheme_set("purple") #' with(mtcars, ppc_intervals(mpg, yrep, x = wt, prob = 0.5)) + #' panel_bg(fill="gray90", color = NA) + #' grid_lines(color = "white") #' #' ppc_intervals_grouped(y = mtcars$mpg, yrep, prob = 0.8, #' x = mtcars$wt, group = mtcars$cyl) #' #' #' color_scheme_set("gray") #' ppc_intervals(mtcars$mpg, yrep, prob = 0.5) + #' ggplot2::scale_x_continuous( #' labels = rownames(mtcars), #' breaks = 1:nrow(mtcars) #' ) + #' xaxis_text(angle = -70, vjust = 1, hjust = 0) #' #' } #' #' NULL #' @rdname PPC-intervals #' @export ppc_intervals <- function(y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3) { check_ignored_arguments(...) data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = NULL, prob = prob, prob_outer = prob_outer ) .ppc_intervals( data = data, size = size, fatten = fatten, grouped = FALSE, style = "intervals", x_lab = label_x(x) ) } #' @rdname PPC-intervals #' @export #' @template args-group #' @param facet_args An optional list of arguments (other than `facets`) #' passed to [ggplot2::facet_wrap()] to control faceting. #' ppc_intervals_grouped <- function(y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, size = 1, fatten = 3) { check_ignored_arguments(...) data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = group, prob = prob, prob_outer = prob_outer ) facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" .ppc_intervals( data = data, facet_args = facet_args, size = size, fatten = fatten, grouped = TRUE, style = "intervals", x_lab = label_x(x) ) } #' @rdname PPC-intervals #' @export #' @param y_draw For ribbon plots only, a string specifying how to draw `y`. Can #' be `"line"` (the default), `"points"`, or `"both"`. ppc_ribbon <- function(y, yrep, x = NULL, ..., prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both")) { check_ignored_arguments(...) data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = NULL, prob = prob ) .ppc_intervals( data = data, alpha = alpha, size = size, grouped = FALSE, style = "ribbon", x_lab = label_x(x), y_draw = y_draw ) } #' @export #' @rdname PPC-intervals ppc_ribbon_grouped <- function(y, yrep, x = NULL, group, ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, alpha = 0.33, size = 0.25, y_draw = c("line", "points", "both")) { check_ignored_arguments(...) data <- ppc_intervals_data( y = y, yrep = yrep, x = x, group = group, prob = prob, prob_outer = prob_outer ) facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" .ppc_intervals( data = data, facet_args = facet_args, alpha = alpha, size = size, grouped = TRUE, style = "ribbon", x_lab = label_x(x), y_draw = y_draw ) } #' @rdname PPC-intervals #' @export ppc_intervals_data <- function(y, yrep, x = NULL, group = NULL, ..., prob = 0.5, prob_outer = 0.9) { check_ignored_arguments(...) .ppc_intervals_data(y = y, yrep = yrep, x = x, group = group, prob = prob, prob_outer = prob_outer) } #' @rdname PPC-intervals #' @export ppc_ribbon_data <- ppc_intervals_data # internal ---------------------------------------------------------------- label_x <- function(x) { if (missing(x)) "Index" else NULL } .ppc_intervals_data <- function(y, yrep, x = NULL, group = NULL, prob = 0.5, prob_outer = 0.9) { grouped <- !is.null(group) stopifnot(prob > 0 && prob < 1) stopifnot(prob_outer > 0 && prob_outer <= 1) probs <- sort(c(prob, prob_outer)) prob <- probs[1] prob_outer <- probs[2] y <- validate_y(y) yrep <- validate_yrep(yrep, y) x <- validate_x(x, y) long_d <- melt_and_stack(y, yrep) long_d$x <- x[long_d$y_id] long_d$y_obs <- y[long_d$y_id] molten_reps <- long_d[!as.logical(long_d[["is_y"]]), , drop = FALSE] molten_reps$is_y <- NULL if (grouped) { group <- validate_group(group, y) molten_reps$group <- group[molten_reps$y_id] group_vars <- syms(c("y_id", "y_obs", "group", "x")) } else { group_vars <- syms(c("y_id", "y_obs", "x")) } grouped_d <- dplyr::group_by(molten_reps, !!! group_vars) alpha <- (1 - probs) / 2 probs <- sort(c(alpha, 0.5, 1 - alpha)) val_col <- sym("value") dplyr::ungroup(dplyr::summarise( grouped_d, outer_width = prob_outer, inner_width = prob, ll = unname(quantile(!! val_col, probs = probs[1])), l = unname(quantile(!! val_col, probs = probs[2])), m = unname(quantile(!! val_col, probs = probs[3])), h = unname(quantile(!! val_col, probs = probs[4])), hh = unname(quantile(!! val_col, probs = probs[5])) )) } # Make intervals or ribbon plot # # @param data The object returned by .ppc_intervals_data # @return A ggplot object # .ppc_intervals <- function(data, facet_args = list(), alpha = 0.33, fatten = 3, size = 1, grouped = FALSE, style = c("intervals", "ribbon"), x_lab = NULL, y_draw = c("line", "points", "both")) { style <- match.arg(style) y_draw <- match.arg(y_draw) graph <- ggplot( data = data, mapping = aes_( x = ~ x, y = ~ m, ymin = ~ l, ymax = ~ h ) ) if (style == "ribbon") { graph <- graph + geom_ribbon( aes_(color = "yrep", fill = "yrep", ymin = ~ ll, ymax = ~ hh), alpha = alpha, size = size ) + geom_ribbon( aes_(color = "yrep", fill = "yrep"), alpha = alpha, size = size ) + geom_line( aes_(color = "yrep"), size = size/2 ) + geom_blank(aes_(fill = "y")) if (y_draw == "line" || y_draw == "both") { graph <- graph + geom_line( aes_(y = ~ y_obs, color = "y"), size = 0.5 ) } if (y_draw == "points" || y_draw == "both") { graph <- graph + geom_point( mapping = aes_(y = ~ y_obs, color = "y", fill = "y"), shape = 21, size = 1.5 ) } } else { graph <- graph + geom_pointrange( mapping = aes_(color = "yrep", fill = "yrep", ymin = ~ ll, ymax = ~ hh), shape = 21, alpha = alpha, size = size, fatten = fatten ) + geom_pointrange( mapping = aes_(color = "yrep", fill = "yrep"), shape = 21, size = size, fatten = fatten ) + geom_point( mapping = aes_(y = ~ y_obs, color = "y", fill = "y"), shape = 21, size = 1.5 ) } graph <- graph + scale_color_manual( name = "", values = set_names(get_color(c("lh", "dh")), c("yrep", "y")), labels = c(yrep = yrep_label(), y = y_label()) ) + scale_fill_manual( name = "", values = c(yrep = get_color("l"), y = if (style == "ribbon") NA else get_color("d")), labels = c(yrep = yrep_label(), y = y_label()) ) if (grouped) { facet_args[["facets"]] <- "group" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" graph <- graph + do.call("facet_wrap", facet_args) } graph + labs(y = NULL, x = x_lab %||% expression(italic(x))) + bayesplot_theme_get() } bayesplot/R/ppc-distributions.R0000644000176200001440000003566014057717550016307 0ustar liggesusers#' PPC distributions #' #' Compare the empirical distribution of the data `y` to the distributions #' of simulated/replicated data `yrep` from the posterior predictive #' distribution. See the **Plot Descriptions** section, below, #' for details. #' #' @name PPC-distributions #' @family PPCs #' #' @template args-y-yrep #' @template args-hist #' @template args-hist-freq #' @template args-dens #' @param size,alpha Passed to the appropriate geom to control the appearance of #' the `yrep` distributions. #' @param ... Currently unused. #' #' @template details-binomial #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_hist(), ppc_freqpoly(), ppc_dens(), ppc_boxplot()`}{ #' A separate histogram, shaded frequency polygon, smoothed kernel density #' estimate, or box and whiskers plot is displayed for `y` and each #' dataset (row) in `yrep`. For these plots `yrep` should therefore #' contain only a small number of rows. See the **Examples** section. #' } #' \item{`ppc_freqpoly_grouped()`}{ #' A separate frequency polygon is plotted for each level of a grouping #' variable for `y` and each dataset (row) in `yrep`. For this plot #' `yrep` should therefore contain only a small number of rows. See the #' **Examples** section. #' } #' \item{`ppc_ecdf_overlay(), ppc_dens_overlay(), #' ppc_ecdf_overlay_grouped(), ppc_dens_overlay_grouped()`}{ #' Kernel density or empirical CDF estimates of each dataset (row) in #' `yrep` are overlaid, with the distribution of `y` itself on top #' (and in a darker shade). When using `ppc_ecdf_overlay()` with discrete #' data, set the `discrete` argument to `TRUE` for better results. #' For an example of `ppc_dens_overlay()` also see Gabry et al. (2019). #' } #' \item{`ppc_violin_grouped()`}{ #' The density estimate of `yrep` within each level of a grouping #' variable is plotted as a violin with horizontal lines at notable #' quantiles. `y` is overlaid on the plot either as a violin, points, or #' both, depending on the `y_draw` argument. #' } #' } #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @examples #' color_scheme_set("brightblue") #' y <- example_y_data() #' yrep <- example_yrep_draws() #' dim(yrep) #' ppc_dens_overlay(y, yrep[1:25, ]) #' #' \donttest{ #' # ppc_ecdf_overlay with continuous data (set discrete=TRUE if discrete data) #' ppc_ecdf_overlay(y, yrep[sample(nrow(yrep), 25), ]) #' } #' #' # for ppc_hist,dens,freqpoly,boxplot definitely use a subset yrep rows so #' # only a few (instead of nrow(yrep)) histograms are plotted #' ppc_hist(y, yrep[1:8, ]) #' #' \donttest{ #' color_scheme_set("red") #' ppc_boxplot(y, yrep[1:8, ]) #' #' # wizard hat plot #' color_scheme_set("blue") #' ppc_dens(y, yrep[200:202, ]) #' } #' #' ppc_freqpoly(y, yrep[1:3,], alpha = 0.1, size = 1, binwidth = 5) #' #' # if groups are different sizes then the 'freq' argument can be useful #' group <- example_group_data() #' ppc_freqpoly_grouped(y, yrep[1:3,], group) + yaxis_text() #' \donttest{ #' ppc_freqpoly_grouped(y, yrep[1:3,], group, freq = FALSE) + yaxis_text() #' } #' #' # density and distribution overlays by group #' ppc_dens_overlay_grouped(y, yrep[1:25, ], group = group) #' #' ppc_ecdf_overlay_grouped(y, yrep[1:25, ], group = group) #' #' # don't need to only use small number of rows for ppc_violin_grouped #' # (as it pools yrep draws within groups) #' color_scheme_set("gray") #' ppc_violin_grouped(y, yrep, group, size = 1.5) #' \donttest{ #' ppc_violin_grouped(y, yrep, group, alpha = 0) #' #' # change how y is drawn #' ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "points", y_size = 1.5) #' ppc_violin_grouped(y, yrep, group, alpha = 0, y_draw = "both", #' y_size = 1.5, y_alpha = 0.5, y_jitter = 0.33) #' } NULL #' @rdname PPC-distributions #' @export ppc_data <- function(y, yrep, group = NULL) { y <- validate_y(y) yrep <- validate_yrep(yrep, y) data <- melt_and_stack(y, yrep) if (!is.null(group)) { group <- validate_group(group, y) group_indices <- tibble::tibble(group, y_id = seq_along(group)) data <- data %>% left_join(group_indices, by = "y_id") %>% select(.data$group, dplyr::everything()) } data } #' @rdname PPC-distributions #' @export ppc_hist <- function(y, yrep, ..., binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) data <- ppc_data(y, yrep) aes_list <- set_hist_aes(freq, fill = ~ is_y_label, color = ~ is_y_label) ggplot(data) + aes_list + geom_histogram(size = 0.25, binwidth = binwidth, breaks = breaks) + scale_fill_ppc_dist() + scale_color_ppc_dist() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + bayesplot_theme_get() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-distributions #' @export #' @param notch A logical scalar passed to [ggplot2::geom_boxplot()]. #' Unlike for `geom_boxplot()`, the default is `notch=TRUE`. #' ppc_boxplot <- function(y, yrep, ..., notch = TRUE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data) + aes_(x = ~ rep_label, y = ~ value, fill = ~ is_y_label, color = ~ is_y_label) + geom_boxplot( notch = notch, size = size, alpha = alpha, outlier.alpha = 2 / 3) + scale_fill_ppc_dist() + scale_color_ppc_dist() + bayesplot_theme_get() + yaxis_title(FALSE) + xaxis_ticks(FALSE) + xaxis_text(FALSE) + xaxis_title(FALSE) } #' @rdname PPC-distributions #' @export ppc_freqpoly <- function(y, yrep, ..., binwidth = NULL, freq = TRUE, size = 0.25, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep) aes_list <- set_hist_aes(freq, fill = ~ is_y_label, color = ~ is_y_label) ggplot(data) + aes_list + aes_(x = ~ value, fill = ~ is_y_label, color = ~ is_y_label) + geom_area(stat = "bin", binwidth = binwidth, size = size, alpha = alpha) + scale_fill_ppc_dist() + scale_color_ppc_dist() + facet_wrap_parsed("rep_label") + bayesplot_theme_get() + force_axes_in_facets() + dont_expand_y_axis() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-distributions #' @export #' @template args-group #' ppc_freqpoly_grouped <- function(y, yrep, group, ..., binwidth = NULL, freq = TRUE, size = 0.25, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep, group) aes_list <- set_hist_aes(freq) ggplot(data) + aes_list + geom_area(aes_(color = ~ is_y_label, fill = ~ is_y_label), stat = "bin", size = size, alpha = alpha, binwidth = binwidth, na.rm = TRUE) + facet_grid(rep_label ~ group, scales = "free") + scale_fill_ppc_dist() + scale_color_ppc_dist() + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + force_axes_in_facets() + space_legend_keys() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) + facet_bg(FALSE) + theme(strip.text.y = element_blank()) } #' @rdname PPC-distributions #' @export ppc_dens <- function(y, yrep, ..., trim = FALSE, size = 0.5, alpha = 1) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data) + aes_(x = ~ value, fill = ~ is_y_label, color = ~ is_y_label) + geom_density(size = size, alpha = alpha, trim = trim) + scale_fill_ppc_dist() + scale_color_ppc_dist() + bayesplot_theme_get() + facet_wrap_parsed("rep_label") + force_axes_in_facets() + dont_expand_y_axis() + space_legend_keys() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-distributions #' @export #' @template args-density-controls ppc_dens_overlay <- function( y, yrep, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data) + aes_(x = ~ value) + stat_density( aes_(group = ~ rep_id, color = "yrep"), data = function(x) dplyr::filter(x, !.data$is_y), geom = "line", position = "identity", size = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens ) + stat_density( aes_(color = "y"), data = function(x) dplyr::filter(x, .data$is_y), geom = "line", position = "identity", lineend = "round", size = 1, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n = n_dens ) + scale_color_ppc_dist() + bayesplot_theme_get() + xlab(y_label()) + dont_expand_axes() + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname PPC-distributions #' @export #' @template args-density-controls ppc_dens_overlay_grouped <- function( y, yrep, group, ..., size = 0.25, alpha = 0.7, trim = FALSE, bw = "nrd0", adjust = 1, kernel = "gaussian", n_dens = 1024 ) { check_ignored_arguments(...) p_overlay <- ppc_dens_overlay( y = y, yrep = yrep, ..., size = size, alpha = alpha, trim = trim, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) # Use + list(data) trick to replace the data in the plot. The layer-specific # data in the y and yrep layers should be safe because they are # specified using a function on the main plot data. data <- ppc_data(y, yrep, group = group) p_overlay <- p_overlay + list(data) p_overlay + facet_wrap("group") + force_axes_in_facets() } #' @export #' @rdname PPC-distributions #' @param discrete For `ppc_ecdf_overlay()`, should the data be treated as #' discrete? The default is `FALSE`, in which case `geom="line"` is #' passed to [ggplot2::stat_ecdf()]. If `discrete` is set to #' `TRUE` then `geom="step"` is used. #' @param pad A logical scalar passed to [ggplot2::stat_ecdf()]. ppc_ecdf_overlay <- function( y, yrep, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) { check_ignored_arguments(...) data <- ppc_data(y, yrep) ggplot(data) + aes_(x = ~ value) + hline_at( 0.5, size = 0.1, linetype = 2, color = get_color("dh") ) + hline_at( c(0, 1), size = 0.2, linetype = 2, color = get_color("dh") ) + stat_ecdf( data = function(x) dplyr::filter(x, !.data$is_y), mapping = aes_(group = ~ rep_id, color = "yrep"), geom = if (discrete) "step" else "line", size = size, alpha = alpha, pad = pad ) + stat_ecdf( data = function(x) dplyr::filter(x, .data$is_y), mapping = aes_(color = "y"), geom = if (discrete) "step" else "line", size = 1, pad = pad ) + scale_color_ppc_dist() + xlab(y_label()) + scale_y_continuous(breaks = c(0, 0.5, 1)) + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_ticks(FALSE) + bayesplot_theme_get() } #' @export #' @rdname PPC-distributions ppc_ecdf_overlay_grouped <- function( y, yrep, group, ..., discrete = FALSE, pad = TRUE, size = 0.25, alpha = 0.7 ) { check_ignored_arguments(...) p_overlay <- ppc_ecdf_overlay( y = y, yrep = yrep, ..., discrete = discrete, pad = pad, size = size, alpha = alpha ) # Use + list(data) trick to replace the data in the plot data <- ppc_data(y, yrep, group = group) p_overlay <- p_overlay + list(data) p_overlay + facet_wrap("group") + force_axes_in_facets() } #' @export #' @rdname PPC-distributions #' @param probs A numeric vector passed to [ggplot2::geom_violin()]'s #' `draw_quantiles` argument to specify at which quantiles to draw #' horizontal lines. Set to `NULL` to remove the lines. #' @param y_draw For `ppc_violin_grouped()`, a string specifying how to draw #' `y`: `"violin"` (default), `"points"` (jittered points), or `"both"`. #' @param y_jitter,y_size,y_alpha For `ppc_violin_grouped()`, if `y_draw` is #' `"points"` or `"both"` then `y_size`, `y_alpha`, and `y_jitter` are passed #' to to the `size`, `alpha`, and `width` arguments of [ggplot2::geom_jitter()] #' to control the appearance of `y` points. The default of `y_jitter=NULL` #' will let **ggplot2** determine the amount of jitter. #' ppc_violin_grouped <- function(y, yrep, group, ..., probs = c(0.1, 0.5, 0.9), size = 1, alpha = 1, y_draw = c("violin", "points", "both"), y_size = 1, y_alpha = 1, y_jitter = 0.1) { check_ignored_arguments(...) data <- ppc_data(y, yrep, group) y_draw <- match.arg(y_draw) y_violin <- y_draw %in% c("violin", "both") y_points <- y_draw %in% c("points", "both") args_violin_yrep <- list( data = function(x) dplyr::filter(x, !.data$is_y), aes_(fill = "yrep", color = "yrep"), draw_quantiles = probs, alpha = alpha, size = size ) args_violin_y <- list( data = function(x) dplyr::filter(x, .data$is_y), aes_(fill = "y", color = "y"), show.legend = FALSE, alpha = 0 ) args_jitter_y <- list( data = function(x) dplyr::filter(x, .data$is_y), aes_(fill = "y", color = "y"), shape = 21, alpha = y_alpha, size = y_size, width = y_jitter, height = 0, show.legend = FALSE ) violin_y_func <- if (y_violin) geom_violin else geom_ignore jitter_y_func <- if (y_points) geom_jitter else geom_ignore layer_violin_yrep <- do.call(geom_violin, args_violin_yrep) layer_violin_y <- do.call(violin_y_func, args_violin_y) layer_jitter_y <- do.call(jitter_y_func, args_jitter_y) ggplot(data) + aes_(x = ~ group, y = ~ value) + layer_violin_yrep + layer_violin_y + layer_jitter_y + scale_fill_ppc_dist(values = c(NA, get_color("l"))) + scale_color_ppc_dist() + labs(x = "Group", y = yrep_label()) + yaxis_title(FALSE) + xaxis_title(FALSE) + bayesplot_theme_get() } # internal ---------------------------------------------------------------- scale_color_ppc_dist <- function(name = NULL, values = NULL, labels = NULL) { scale_color_manual( name = name %||% "", values = values %||% get_color(c("dh", "lh")), labels = labels %||% c(y_label(), yrep_label()) ) } scale_fill_ppc_dist <- function(name = NULL, values = NULL, labels = NULL) { scale_fill_manual( name = name %||% "", values = values %||% get_color(c("d", "l")), labels = labels %||% c(y_label(), yrep_label()) ) } bayesplot/R/mcmc-recover.R0000644000176200001440000002474014057717550015204 0ustar liggesusers#' Compare MCMC estimates to "true" parameter values #' #' Plots comparing MCMC estimates to "true" parameter values. Before fitting a #' model to real data it is useful to simulate data according to the model using #' known (fixed) parameter values and to check that these "true" parameter #' values are (approximately) recovered by fitting the model to the simulated #' data. See the **Plot Descriptions** section, below, for details on the #' available plots. #' #' @name MCMC-recover #' @family MCMC #' #' @template args-mcmc-x #' @template args-facet_args #' @param true A numeric vector of "true" values of the parameters in `x`. #' There should be one value in `true` for each parameter included in #' `x` and the order of the parameters in `true` should be the same #' as the order of the parameters in `x`. #' @param batch Optionally, a vector-like object (numeric, character, integer, #' factor) used to split the parameters into batches. If `batch` is #' specified, it must have the same length as `true` and be in the same #' order as `true`. Parameters in the same batch will be grouped together #' in the same facet in the plot (see the **Examples** section, below). #' The default is to group all parameters together into a single batch. #' Changing the default is most useful when parameters are on very different #' scales, in which case `batch` can be used to group them into batches #' within which it makes sense to use the same y-axis. #' @param ... Currently unused. #' @param prob The probability mass to include in the inner interval. The #' default is `0.5` (50% interval). #' @param prob_outer The probability mass to include in the outer interval. The #' default is `0.9` (90% interval). #' @param point_est The point estimate to show. Either `"median"` (the #' default), `"mean"`, or `"none"`. #' @param size,alpha Passed to [ggplot2::geom_point()] to control the #' appearance of plotted points. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_recover_intervals()`}{ #' Central intervals and point estimates computed from MCMC draws, with #' "true" values plotted using a different shape. #' } #' \item{`mcmc_recover_scatter()`}{ #' Scatterplot of posterior means (or medians) against "true" values. #' } #' \item{`mcmc_recover_hist()`}{ #' Histograms of the draws for each parameter with the "true" value overlaid #' as a vertical line. #' } #' } #' #' @examples #' \dontrun{ #' library(rstanarm) #' alpha <- 1; beta <- rnorm(10, 0, 3); sigma <- 2 #' X <- matrix(rnorm(1000), 100, 10) #' y <- rnorm(100, mean = c(alpha + X %*% beta), sd = sigma) #' fit <- stan_glm(y ~ ., data = data.frame(y, X), refresh = 0) #' draws <- as.matrix(fit) #' print(colnames(draws)) #' true <- c(alpha, beta, sigma) #' #' mcmc_recover_intervals(draws, true) #' #' # put the coefficients on X into the same batch #' mcmc_recover_intervals(draws, true, batch = c(1, rep(2, 10), 1)) #' # equivalent #' mcmc_recover_intervals(draws, true, batch = grepl("X", colnames(draws))) #' # same but facets stacked vertically #' mcmc_recover_intervals(draws, true, #' batch = grepl("X", colnames(draws)), #' facet_args = list(ncol = 1), #' size = 3) #' #' # each parameter in its own facet #' mcmc_recover_intervals(draws, true, batch = 1:ncol(draws)) #' # same but in a different order #' mcmc_recover_intervals(draws, true, batch = c(1, 3, 4, 2, 5:12)) #' # present as bias by centering with true values #' mcmc_recover_intervals(sweep(draws, 2, true), rep(0, ncol(draws))) + hline_0() #' #' #' # scatterplot of posterior means vs true values #' mcmc_recover_scatter(draws, true, point_est = "mean") #' #' #' # histograms of parameter draws with true value added as vertical line #' color_scheme_set("brightblue") #' mcmc_recover_hist(draws[, 1:4], true[1:4]) #' } #' NULL #' @rdname MCMC-recover #' @export mcmc_recover_intervals <- function(x, true, batch = rep(1, length(true)), ..., facet_args = list(), prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), size = 4, alpha = 1) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true), length(batch) == length(true), prob_outer >= prob, prob > 0, prob_outer <= 1 ) all_separate <- length(unique(batch)) == length(true) point_est <- match.arg(point_est) if (point_est == "none") { point_est <- NULL } alpha1 <- (1 - prob) / 2 alpha2 <- (1 - prob_outer) / 2 probs <- sort(c(alpha1, 1 - alpha1, alpha2, 1 - alpha2)) intervals <- t(apply(x, 2, quantile, probs = probs)) colnames(intervals) <- c("ll", "l", "u", "uu") plot_data <- data.frame( Parameter = rownames(intervals), True = true, Point = apply(x, 2, point_est %||% function(x) NA), intervals ) if (!all_separate) { plot_data$Batch <- factor(batch, levels = unique(batch)) } else { plot_data$Batch <- factor(rownames(intervals), levels = rownames(intervals)[as.integer(as.factor(batch))]) } facet_args[["facets"]] <- "Batch" facet_args[["strip.position"]] <- facet_args[["strip.position"]] %||% "top" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" plot_caption <- paste0("Showing ", round(prob * 100, 1), "% and ", round(prob_outer * 100, 1), "% intervals") graph <- ggplot(plot_data, aes_(x = ~ Parameter, xend = ~ Parameter)) + geom_segment( aes_(y = ~ ll, yend = ~ uu, color = "Estimated"), lineend = "round", show.legend = FALSE ) + geom_segment( aes_(y = ~ l, yend = ~ u, color = "Estimated"), size = 2, lineend = "round", show.legend = FALSE ) + bayesplot_theme_get() if (!is.null(point_est)) { graph <- graph + geom_point( aes_(y = ~ Point, shape = "Estimated", color = "Estimated", fill = "Estimated"), size = size ) } graph <- graph + geom_point( aes_(y = ~ True, shape = "True", color = "True", fill = "True"), size = size, alpha = alpha ) + scale_color_manual( name = "", values = c(Estimated = get_color("d"), True = get_color("dh")), guide = if (is.null(point_est)) "none" else "legend" ) + scale_fill_manual( name = "", values = c(Estimated = get_color("d"), True = get_color("l")) ) + scale_shape_manual( name = "", values = c(Estimated = 21, True = 24) ) + do.call("facet_wrap", facet_args) + labs(y = "Value", x = "Parameter", subtitle = plot_caption) + theme(plot.caption = element_text(hjust = 0)) + xaxis_title(FALSE) + yaxis_title(FALSE) if (all_separate) { return( graph + theme(axis.line.x = element_blank()) + xaxis_ticks(FALSE) + xaxis_text(FALSE) ) } graph + xaxis_text(face = "bold") + facet_text(FALSE) } #' @rdname MCMC-recover #' @export mcmc_recover_scatter <- function(x, true, batch = rep(1, length(true)), ..., facet_args = list(), point_est = c("median", "mean"), size = 3, alpha = 1) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true), length(batch) == length(true) ) one_true_per_batch <- length(unique(batch)) == length(true) one_batch <- length(unique(batch)) == 1 point_est <- match.arg(point_est) plot_data <- data.frame( Parameter = colnames(x), Point = apply(x, 2, point_est), True = true ) if (!one_true_per_batch) { plot_data$Batch <- factor(batch, levels = unique(batch)) } else { plot_data$Batch <- factor(colnames(x), levels = colnames(x)[as.integer(as.factor(batch))]) } facet_args[["facets"]] <- "Batch" facet_args[["strip.position"]] <- facet_args[["strip.position"]] %||% "top" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" # To ensure that the x and y scales have the same range, find the min and max # value on each coordinate. plot them invisibly with geom_blank() later on. corners <- plot_data %>% group_by(.data$Batch) %>% summarise( min = min(pmin(.data$Point, .data$True)), max = max(pmax(.data$Point, .data$True)) ) graph <- ggplot(plot_data, aes_(x = ~ True, y = ~ Point)) + geom_abline( slope = 1, intercept = 0, linetype = 2, color = "black" ) + geom_point( shape = 21, color = get_color("mh"), fill = get_color("m"), size = size, alpha = alpha ) + geom_blank(aes(x = min, y = min), data = corners) + geom_blank(aes(x = max, y = max), data = corners) + do.call("facet_wrap", facet_args) + labs(x = "True", y = "Estimated") + bayesplot_theme_get() if (one_batch) { graph <- graph + facet_text(FALSE) } graph } #' @rdname MCMC-recover #' @export #' @template args-hist mcmc_recover_hist <- function(x, true, ..., facet_args = list(), binwidth = NULL, breaks = NULL) { check_ignored_arguments(...) x <- merge_chains(prepare_mcmc_array(x)) stopifnot( is.numeric(true), ncol(x) == length(true) ) vline_data <- data.frame(Parameter = colnames(x), True = true) hist_data <- melt_mcmc(x)[, -1] facet_args[["facets"]] <- "Parameter" facet_args[["scales"]] <- facet_args[["scales"]] %||% "free" ggplot() + geom_histogram( aes_(x = ~ Value, fill = "Estimated"), data = hist_data, color = get_color("lh"), size = .25, binwidth = binwidth, breaks = breaks ) + geom_vline( aes_(xintercept = ~ True, color = "True"), data = vline_data, size = 1.5 ) + do.call("facet_wrap", facet_args) + scale_fill_manual("", values = get_color("l")) + scale_color_manual("", values = get_color("dh")) + guides(color = guide_legend(), fill = guide_legend(order = 1)) + dont_expand_y_axis() + bayesplot_theme_get() + reduce_legend_spacing(0.25) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } bayesplot/R/ppc-scatterplots.R0000644000176200001440000001070014057717550016120 0ustar liggesusers#' PPC scatterplots #' #' Scatterplots of the observed data `y` vs. simulated/replicated data #' `yrep` from the posterior predictive distribution. See the #' **Plot Descriptions** and **Details** sections, below. #' #' @name PPC-scatterplots #' @family PPCs #' #' @template args-y-yrep #' @param ... Currently unused. #' @param size,alpha Arguments passed to [ggplot2::geom_point()] to control the #' appearance of the points. #' #' @template details-binomial #' @template return-ggplot #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_scatter()`}{ #' For each dataset (row) in `yrep` a scatterplot is generated showing `y` #' against that row of `yrep`. For this plot `yrep` should only contain a #' small number of rows. #' } #' \item{`ppc_scatter_avg()`}{ #' A scatterplot of `y` against the average values of `yrep`, i.e., #' the points `(mean(yrep[, n]), y[n])`, where each `yrep[, n]` is #' a vector of length equal to the number of posterior draws. #' } #' \item{`ppc_scatter_avg_grouped()`}{ #' The same as `ppc_scatter_avg()`, but a separate plot is generated for #' each level of a grouping variable. #' } #' } #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' p1 <- ppc_scatter_avg(y, yrep) #' p1 #' p2 <- ppc_scatter(y, yrep[20:23, ], alpha = 0.5, size = 1.5) #' p2 #' #' # give x and y axes the same limits #' lims <- ggplot2::lims(x = c(0, 160), y = c(0, 160)) #' p1 + lims #' p2 + lims #' #' group <- example_group_data() #' ppc_scatter_avg_grouped(y, yrep, group, alpha = 0.7) + lims #' NULL #' @export #' @rdname PPC-scatterplots #' ppc_scatter <- function(y, yrep, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) graph <- .ppc_scatter( data = data.frame( melt_yrep(yrep), y = rep(y, each = nrow(yrep)) ), mapping = aes_(x = ~ value, y = ~ y), y_lab = y_label(), x_lab = yrep_label(), alpha = alpha, size = size ) if (nrow(yrep) == 1) return(graph) graph + facet_wrap_parsed("rep_id") + force_axes_in_facets() + facet_text(FALSE) + facet_bg(FALSE) } #' @export #' @rdname PPC-scatterplots #' ppc_scatter_avg <- function(y, yrep, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (nrow(yrep) == 1) return(ppc_scatter(y, yrep, size = size, alpha = alpha, ...)) .ppc_scatter( data = data.frame(y, avg_y_rep = colMeans(yrep)), mapping = aes_(x = ~ avg_y_rep, y = ~ y), y_lab = y_label(), x_lab = yrep_avg_label(), alpha = alpha, size = size ) } #' @export #' @rdname PPC-scatterplots #' @template args-group #' ppc_scatter_avg_grouped <- function(y, yrep, group, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) ggplot( data = data.frame( y = y, avg_yrep = colMeans(yrep), group = validate_group(group, y) ), mapping = aes_(x = ~ avg_yrep, y = ~ y, group = ~ group) ) + geom_point( shape = 21, fill = get_color("m"), color = get_color("mh"), alpha = alpha, size = size ) + labs( y = y_label(), x = yrep_avg_label() ) + facet_wrap("group", scales = "free") + bayesplot_theme_get() } # internal ----------------------------------------------------------------- .ppc_scatter <- function(data, mapping, x_lab = "", y_lab = "", color = c("mid", "light"), size = 2.5, alpha = 1, abline = TRUE) { mid <- isTRUE(match.arg(color) == "mid") graph <- ggplot(data, mapping) if (abline) { graph <- graph + geom_abline( intercept = 0, slope = 1, linetype = 2, color = get_color("dh") ) } graph + geom_point( shape = 21, fill = get_color(ifelse(mid, "m", "l")), color = get_color(ifelse(mid, "mh", "lh")), size = size, alpha = alpha ) + labs(x = x_lab, y = y_lab) + bayesplot_theme_get() } bayesplot/R/bayesplot_grid.R0000644000176200001440000001105014057717550015617 0ustar liggesusers#' Arrange plots in a grid #' #' The `bayesplot_grid` function makes it simple to juxtapose plots using #' common \eqn{x} and/or \eqn{y} axes. #' #' @export #' @param ... One or more ggplot objects. #' @param plots A list of ggplot objects. Can be used as an alternative to #' specifying plot objects via `...`. #' @param grid_args An optional named list of arguments to pass to #' [gridExtra::arrangeGrob()] (`nrow`, `ncol`, #' `widths`, etc.). #' @param titles,subtitles Optional character vectors of plot titles and #' subtitles. If specified, `titles` and `subtitles` must must have #' length equal to the number of plots specified. #' @param xlim,ylim Optionally, numeric vectors of length 2 specifying lower and #' upper limits for the axes that will be shared across all plots. #' @param legends If any of the plots have legends should they be displayed? #' Defaults to `TRUE`. #' @param save_gg_objects If `TRUE`, the default, then the ggplot objects #' specified in `...` or via the `plots` argument are saved in a #' list in the `"bayesplots"` component of the returned object. #' Setting this to `FALSE` will make the returned object smaller but #' these individual plot objects will not be available. #' #' @return An object of class `"bayesplot_grid"` (essentially a gtable object #' from [gridExtra::arrangeGrob()]), which has a `plot` method. #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' stats <- c("sd", "median", "max", "min") #' #' color_scheme_set("pink") #' bayesplot_grid( #' plots = lapply(stats, function(s) ppc_stat(y, yrep, stat = s)), #' titles = stats, #' legends = FALSE, #' grid_args = list(ncol = 1) #' ) #' #' \dontrun{ #' library(rstanarm) #' mtcars$log_mpg <- log(mtcars$mpg) #' fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) #' fit2 <- stan_glm(log_mpg ~ wt, data = mtcars, refresh = 0) #' #' y <- mtcars$mpg #' yrep1 <- posterior_predict(fit1, draws = 50) #' yrep2 <- posterior_predict(fit2, fun = exp, draws = 50) #' #' color_scheme_set("blue") #' ppc1 <- ppc_dens_overlay(y, yrep1) #' ppc1 #' ppc1 + yaxis_text() #' #' color_scheme_set("red") #' ppc2 <- ppc_dens_overlay(y, yrep2) #' bayesplot_grid(ppc1, ppc2) #' #' # make sure the plots use the same limits for the axes #' bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2)) #' #' # remove the legends and add text #' bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2), #' legends = FALSE, subtitles = rep("Predicted MPG", 2)) #' } #' bayesplot_grid <- function(..., plots = list(), xlim = NULL, ylim = NULL, grid_args = list(), titles = character(), subtitles = character(), legends = TRUE, save_gg_objects = TRUE) { suggested_package("gridExtra") dots <- list(...) if (length(dots) && length(plots)) { abort("Arguments '...' and 'plots' can't both be specified.") } else if (length(plots)) { if (!is.list(plots) || !all_ggplot(plots)) abort("'plots' must be a list of ggplot objects.") } else if (length(dots)) { if (!all_ggplot(dots)) abort("All objects in '...' must be ggplot objects.") plots <- dots } else { abort("No plots specified.") } if (length(titles)) { stopifnot(is.character(titles), length(titles) == length(plots)) plots <- lapply(seq_along(plots), function(j) plots[[j]] + ggtitle(titles[j])) } if (length(subtitles)) { stopifnot(is.character(subtitles), length(subtitles) == length(plots)) plots <- lapply(seq_along(plots), function(j) plots[[j]] + labs(subtitle = subtitles[j])) } if (!legends) plots <- lapply(plots, function(p) p + legend_none()) if (!is.null(xlim)) plots <- lapply(plots, function(p) p + ggplot2::xlim(xlim)) if (!is.null(ylim)) plots <- lapply(plots, function(p) p + ggplot2::ylim(ylim)) grid_args$grobs <- plots g <- do.call(gridExtra::arrangeGrob, args = grid_args) if (save_gg_objects) { g$bayesplots <- plots } as_bayesplot_grid(g) } # internal ---------------------------------------------------------------- as_bayesplot_grid <- function(x) { structure(x, class = unique(c("bayesplot_grid", class(x)))) } is_bayesplot_grid <- function(x) { inherits(x, "bayesplot_grid") } all_ggplot <- function(x) { all(sapply(x, "inherits", what = "ggplot")) } #' @export print.bayesplot_grid <- function(x, ...) { gridExtra::grid.arrange(x, ...) } #' @export plot.bayesplot_grid <- print.bayesplot_grid bayesplot/R/ppc-censoring.R0000644000176200001440000001054314057717550015365 0ustar liggesusers#' PPC censoring #' #' @description Compare the empirical distribution of censored data `y` to the #' distributions of simulated/replicated data `yrep` from the posterior #' predictive distribution. See the **Plot Descriptions** section, below, for #' details. #' #' Although some of the other \pkg{bayesplot} plots can be used with censored #' data, `ppc_km_overlay()` is currently the only plotting function designed #' *specifically* for censored data. We encourage you to suggest or contribute #' additional plots at #' [github.com/stan-dev/bayesplot](https://github.com/stan-dev/bayesplot). #' #' @name PPC-censoring #' @family PPCs #' #' @template args-y-yrep #' @param size,alpha Passed to the appropriate geom to control the appearance of #' the `yrep` distributions. #' @param ... Currently unused. #' #' @template return-ggplot #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_km_overlay()`}{ #' Empirical CCDF estimates of each dataset (row) in `yrep` are overlaid, #' with the Kaplan-Meier estimate (Kaplan and Meier, 1958) for `y` itself on #' top (and in a darker shade). This is a PPC suitable for right-censored #' `y`. Note that the replicated data from `yrep` is assumed to be #' uncensored. #' } #' } #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' @template reference-km #' #' @examples #' color_scheme_set("brightblue") #' y <- example_y_data() #' # For illustrative purposes, (right-)censor values y > 110: #' status_y <- as.numeric(y <= 110) #' y <- pmin(y, 110) #' # In reality, the replicated data (yrep) would be obtained from a #' # model which takes the censoring of y properly into account. Here, #' # for illustrative purposes, we simply use example_yrep_draws(): #' yrep <- example_yrep_draws() #' dim(yrep) #' \donttest{ #' ppc_km_overlay(y, yrep[1:25, ], status_y = status_y) #' } NULL #' @export #' @rdname PPC-censoring #' @param status_y The status indicator for the observations from `y`. This must #' be a numeric vector of the same length as `y` with values in \{0, 1\} (0 = #' right censored, 1 = event). ppc_km_overlay <- function(y, yrep, ..., status_y, size = 0.25, alpha = 0.7) { check_ignored_arguments(...) if(!requireNamespace("survival", quietly = TRUE)){ abort("Package 'survival' required.") } if(!requireNamespace("ggfortify", quietly = TRUE)){ abort("Package 'ggfortify' required.") } stopifnot(is.numeric(status_y)) stopifnot(all(status_y %in% c(0, 1))) data <- ppc_data(y, yrep, group = status_y) # Modify the status indicator: # * For the observed data ("y"), convert the status indicator back to # a numeric. # * For the replicated data ("yrep"), set the status indicator # to 1 ("event"). This way, the Kaplan-Meier estimator reduces # to "1 - ECDF" with ECDF denoting the ordinary empirical cumulative # distribution function. data <- data %>% dplyr::mutate(group = ifelse(.data$is_y, as.numeric(as.character(.data$group)), 1)) sf <- survival::survfit( survival::Surv(value, group) ~ rep_label, data = data ) fsf <- fortify(sf) fsf$is_y_color <- as.factor(sub("\\[rep\\] \\(.*$", "rep", sub("^italic\\(y\\)", "y", fsf$strata))) fsf$is_y_size <- ifelse(fsf$is_y_color == "yrep", size, 1) fsf$is_y_alpha <- ifelse(fsf$is_y_color == "yrep", alpha, 1) # Ensure that the observed data gets plotted last by reordering the # levels of the factor "strata" fsf$strata <- factor(fsf$strata, levels = rev(levels(fsf$strata))) ggplot(data = fsf, mapping = aes_(x = ~ time, y = ~ surv, color = ~ is_y_color, group = ~ strata, size = ~ is_y_size, alpha = ~ is_y_alpha)) + geom_step() + hline_at( c(0, 0.5, 1), size = c(0.2, 0.1, 0.2), linetype = 2, color = get_color("dh") ) + scale_size_identity() + scale_alpha_identity() + scale_color_ppc_dist() + scale_y_continuous(breaks = c(0, 0.5, 1)) + xlab(y_label()) + yaxis_title(FALSE) + xaxis_title(FALSE) + yaxis_ticks(FALSE) + bayesplot_theme_get() } bayesplot/R/tidy-params.R0000644000176200001440000002132614057717550015051 0ustar liggesusers#' Tidy parameter selection #' #' Parameter selection in the style of **dplyr** and other tidyverse packages. #' #' @name tidy-params #' #' @details #' As of version `1.7.0`, **bayesplot** allows the `pars` argument for [MCMC #' plots][bayesplot::MCMC-overview] to use "tidy" variable selection (in the #' style of the **dplyr** package). The [`vars()`][dplyr::vars] function is #' re-exported from **dplyr** for this purpose. #' #' Features of tidy selection includes direct selection (`vars(alpha, sigma)`), #' everything-but selection (`vars(-alpha)`), ranged selection #' (``vars(`beta[1]`:`beta[3]`)``), support for selection functions #' (`vars(starts_with("beta"))`), and combinations of these features. See the #' **Examples** section, below. #' #' When using `pars` for tidy parameter selection, the `regex_pars` argument is #' ignored because **bayesplot** supports using [tidyselect helper #' functions][tidyselect::select_helpers] (`starts_with()`, `contains()`, #' `num_range()`, etc.) for the same purpose. **bayesplot** also exports some #' additional helper functions to help with parameter selection: #' #' * `param_range()`: like [`num_range()`][tidyselect::num_range] but used #' when parameter indexes are in brackets (e.g. `beta[2]`). #' #' * `param_glue()`: for more complicated parameter names with multiple #' indexes (including variable names) inside the brackets #' (e.g., `beta[(Intercept) age_group:3]`). #' #' These functions can be used inside of `vars()`, `dplyr::select()`, #' and similar functions, just like the #' [tidyselect helper functions][tidyselect::select_helpers]. #' #' @section Extra Advice: #' #' Parameter names in `vars()` are not quoted. When the names contain special #' characters like brackets, they should be wrapped in backticks, as in #' ``vars(`beta[1]`)``. #' #' To exclude a range of variables, wrap the sequence in parentheses and then #' negate it. For example, (``vars(-(`beta[1]`:`beta[3]`))``) would exclude #' `beta[1]`, `beta[2]`, and `beta[3]`. #' #' `vars()` is a helper function. It holds onto the names and expressions used #' to select columns. When selecting variables inside a **bayesplot** #' function, use `vars(...)`: `mcmc_hist(data, pars = vars(alpha))`. When #' using `select()` to prepare a dataframe for a **bayesplot** function, do #' not use `vars()`: `data %>% select(alpha) %>% mcmc_hist()`. #' #' Internally, tidy selection works by converting names and expressions #' into position numbers. As a result, integers will select parameters; #' `vars(1, 3)` selects the first and third ones. We do not endorse this #' approach because positions might change as variables are added and #' removed from models. To select a parameter that happens to be called `1`, #' use backticks to escape it ``vars(`1`)``. #' #' @seealso [glue::glue()] #' #' @examples #' x <- example_mcmc_draws(params = 6) #' dimnames(x) #' mcmc_hex(x, pars = vars(alpha, `beta[2]`)) #' mcmc_dens(x, pars = vars(sigma, contains("beta"))) #' mcmc_hist(x, pars = vars(-contains("beta"))) #' #' # using the param_range() helper #' mcmc_hist(x, pars = vars(param_range("beta", c(1, 3, 4)))) #' #' \donttest{ #' ############################# #' ## Examples using rstanarm ## #' ############################# #' if (requireNamespace("rstanarm", quietly = TRUE)) { #' # see ?rstanarm::example_model #' fit <- example("example_model", package = "rstanarm", local=TRUE)$value #' print(fit) #' posterior <- as.data.frame(fit) #' str(posterior) #' #' color_scheme_set("brightblue") #' mcmc_hist(posterior, pars = vars(size, contains("period"))) #' #' # same as previous but using dplyr::select() and piping #' library("dplyr") #' posterior %>% #' select(size, contains("period")) %>% #' mcmc_hist() #' #' mcmc_intervals(posterior, pars = vars(contains("herd"))) #' mcmc_intervals(posterior, pars = vars(contains("herd"), -contains("Sigma"))) #' #' bayesplot_theme_set(ggplot2::theme_dark()) #' color_scheme_set("viridisC") #' mcmc_areas_ridges(posterior, pars = vars(starts_with("b["))) #' #' bayesplot_theme_set() #' color_scheme_set("purple") #' not_789 <- vars(starts_with("b["), -matches("[7-9]")) #' mcmc_intervals(posterior, pars = not_789) #' #' # using the param_glue() helper #' just_149 <- vars(param_glue("b[(Intercept) herd:{level}]", level = c(1,4,9))) #' mcmc_intervals(posterior, pars = just_149) #' #' # same but using param_glue() with dplyr::select() #' # before passing to bayesplot #' posterior %>% #' select(param_glue("b[(Intercept) herd:{level}]", #' level = c(1, 4, 9))) %>% #' mcmc_intervals() #' } #'} NULL # re-export vars for tidy parameter selection #' @importFrom dplyr vars #' @export dplyr::vars #' @rdname tidy-params #' @export #' @param vars `NULL` or a character vector of parameter names to choose from. #' This is only needed for the atypical use case of calling the function as a #' standalone function outside of `vars()`, `select()`, etc. Typically this is #' left as `NULL` and will be set automatically for the user. #' @param prefix,range For `param_range()` only, `prefix` is a string naming a #' parameter and `range` is an integer vector providing the indices of a #' subset of elements to select. For example, using #' #' param_range("beta", c(1,2,8)) #' #' would select parameters named `beta[1]`, `beta[2]`, and `beta[8]`. #' `param_range()` is only designed for the case that the indices are integers #' surrounded by brackets. If there are no brackets use #' [num_range()][tidyselect::select_helpers]. #' param_range <- function(prefix, range, vars = NULL) { if (!is.null(vars) && !is.character(vars)) { abort("'vars' must be NULL or a character vector.") } nms <- paste0(prefix, "[", range, "]") param_matches <- match(nms, vars %||% tidyselect::peek_vars()) param_matches[!is.na(param_matches)] } #' @rdname tidy-params #' @export #' @param pattern,... For `param_glue()` only, `pattern` is a string containing #' expressions enclosed in braces and `...` should be named arguments #' providing one character vector per expression in braces in `pattern`. It is #' easiest to describe how to use these arguments with an example: #' #' param_glue("beta_{var}[{level}]", #' var = c("age", "income"), #' level = c(3,8)) #' #' would select parameters with names #' `"beta_age[3]"`, `"beta_income[3]"`, `"beta_age[8]"`, `"beta_income[8]"`. #' #' @examples #' \dontrun{ #' ################################### #' ## More examples of param_glue() ## #' ################################### #' library(dplyr) #' posterior <- tibble( #' b_Intercept = rnorm(1000), #' sd_condition__Intercept = rexp(1000), #' sigma = rexp(1000), #' `r_condition[A,Intercept]` = rnorm(1000), #' `r_condition[B,Intercept]` = rnorm(1000), #' `r_condition[C,Intercept]` = rnorm(1000), #' `r_condition[A,Slope]` = rnorm(1000), #' `r_condition[B,Slope]` = rnorm(1000) #' ) #' posterior #' #' # using one expression in braces #' posterior %>% #' select( #' param_glue("r_condition[{level},Intercept]", level = c("A", "B")) #' ) %>% #' mcmc_hist() #' #' # using multiple expressions in braces #' posterior %>% #' select( #' param_glue( #' "r_condition[{level},{type}]", #' level = c("A", "B"), #' type = c("Intercept", "Slope")) #' ) %>% #' mcmc_hist() #'} param_glue <- function(pattern, ..., vars = NULL) { if (!is.null(vars) && !is.character(vars)) { abort("'vars' must be NULL or a character vector.") } dots <- as.list(expand.grid(...)) nms <- as.character(glue::glue_data(dots, pattern)) param_matches <- match(nms, vars %||% tidyselect::peek_vars()) param_matches[!is.na(param_matches)] } # internal ---------------------------------------------------------------- #' Internal function for tidy parameter selection #' #' This function is called internally by `prepare_mcmc_array()` if the user's #' `pars` argument is a quosure. #' #' @noRd #' @param complete_pars A character vector of *all* parameter names. #' @param pars_list A list of columns generated by `vars()`. #' @return Character vector of selected parameter names. tidyselect_parameters <- function(complete_pars, pars_list) { # We use the list of helpers so that we don't have to keep track of any # changes to tidyselect. We use `env_bury()`` so that the definitions of # selection helpers are available. This pattern is taken from the example code # in `vars_select_helpers`. helpers <- tidyselect::vars_select_helpers pars_list <- lapply(pars_list, rlang::env_bury, !!! helpers) selected <- tidyselect::vars_select(.vars = complete_pars, !!! pars_list) if (!length(selected)) { abort("No parameters were found matching those names.") } unname(selected) } bayesplot/R/ppc-test-statistics.R0000644000176200001440000002374114057717550016551 0ustar liggesusers#' PPC test statistics #' #' The distribution of a (test) statistic `T(yrep)`, or a pair of (test) #' statistics, over the simulated datasets in `yrep`, compared to the #' observed value `T(y)` computed from the data `y`. See the #' **Plot Descriptions** and **Details** sections, below, as #' well as [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme). #' #' @name PPC-test-statistics #' @family PPCs #' #' @template args-y-yrep #' @template args-facet_args #' @param stat A single function or a string naming a function, except for #' `ppc_stat_2d()` which requires a vector of exactly two functions or #' function names. In all cases the function(s) should take a vector input and #' return a scalar statistic. If specified as a string (or strings) then #' the legend will display function names. If specified as a function (or #' functions) then generic naming is used in the legend. #' @param ... Currently unused. #' #' @template details-binomial #' @template return-ggplot #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @section Plot Descriptions: #' \describe{ #' \item{`ppc_stat()`}{ #' A histogram of the distribution of a test statistic computed by applying #' `stat` to each dataset (row) in `yrep`. The value of the statistic in the #' observed data, `stat(y)`, is overlaid as a vertical line. More details on #' `ppc_stat()` can be found in Gabry et al. (2019). #' } #' \item{`ppc_stat_grouped()`,`ppc_stat_freqpoly_grouped()`}{ #' The same as `ppc_stat()`, but a separate plot is generated for each #' level of a grouping variable. In the case of #' `ppc_stat_freqpoly_grouped()` the plots are frequency polygons rather #' than histograms. More details on `ppc_stat_grouped()` can be found in #' Gabry et al. (2019). #' } #' \item{`ppc_stat_2d()`}{ #' A scatterplot showing the joint distribution of two test statistics #' computed over the datasets (rows) in `yrep`. The value of the #' statistics in the observed data is overlaid as large point. #' } #' } #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_stat(y, yrep) #' ppc_stat(y, yrep, stat = "sd") + legend_none() #' ppc_stat_2d(y, yrep) #' ppc_stat_2d(y, yrep, stat = c("median", "mean")) + legend_move("bottom") #' #' color_scheme_set("teal") #' group <- example_group_data() #' ppc_stat_grouped(y, yrep, group) #' #' color_scheme_set("mix-red-blue") #' ppc_stat_freqpoly_grouped(y, yrep, group, facet_args = list(nrow = 2)) #' #' # use your own function to compute test statistics #' color_scheme_set("brightblue") #' q25 <- function(y) quantile(y, 0.25) #' ppc_stat(y, yrep, stat = "q25") # legend includes function name #' #' # can define the function in the 'stat' argument but then #' # the legend doesn't include a function name #' ppc_stat(y, yrep, stat = function(y) quantile(y, 0.25)) #' NULL #' @rdname PPC-test-statistics #' @export #' @template args-hist #' @template args-hist-freq #' ppc_stat <- function(y, yrep, stat = "mean", ..., binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) stat1 <- match.fun(stat) T_y <- stat1(y) T_yrep <- apply(yrep, 1, stat1) ggplot(data.frame(value = T_yrep), set_hist_aes(freq)) + geom_histogram( aes_(fill = "yrep"), color = get_color("lh"), size = .25, na.rm = TRUE, binwidth = binwidth, breaks = breaks ) + geom_vline( data = data.frame(Ty = T_y), mapping = aes_(xintercept = ~ Ty, color = "y"), size = 1.5 ) + scale_fill_manual(values = get_color("l"), labels = Tyrep_label()) + scale_color_manual(values = get_color("dh"), labels = Ty_label()) + guides( color = guide_legend(title = NULL), fill = guide_legend( order = 1, title = stat_legend_title(stat, deparse(substitute(stat))) ) ) + bayesplot_theme_get() + dont_expand_y_axis() + no_legend_spacing() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @export #' @rdname PPC-test-statistics #' @template args-group #' ppc_stat_grouped <- function(y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) group <- validate_group(group, y) plot_data <- ppc_group_data(y, yrep, group, stat = match.fun(stat)) is_y <- plot_data$variable == "y" facet_args[["facets"]] <- ~ group if (is.null(facet_args[["scales"]])) facet_args[["scales"]] <- "free" ggplot(plot_data[!is_y, , drop = FALSE], set_hist_aes(freq)) + geom_histogram( aes_(fill = "yrep"), color = get_color("lh"), size = .25, na.rm = TRUE, binwidth = binwidth, breaks = breaks ) + geom_vline( data = plot_data[is_y, , drop = FALSE], mapping = aes_(xintercept = ~ value, color = "y"), size = 1.5 ) + do.call("facet_wrap", facet_args) + scale_fill_manual(values = get_color("l"), labels = Tyrep_label()) + scale_color_manual(values = get_color("dh"), labels = Ty_label()) + guides( color = guide_legend(title = NULL), fill = guide_legend( order = 1, title = stat_legend_title(stat, deparse(substitute(stat))) ) ) + bayesplot_theme_get() + dont_expand_y_axis() + no_legend_spacing() + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) } #' @export #' @rdname PPC-test-statistics #' ppc_stat_freqpoly_grouped <- function(y, yrep, group, stat = "mean", ..., facet_args = list(), binwidth = NULL, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) group <- validate_group(group, y) plot_data <- ppc_group_data(y, yrep, group, stat = match.fun(stat)) is_y <- plot_data$variable == "y" facet_args[["facets"]] <- ~ group if (is.null(facet_args[["scales"]])) facet_args[["scales"]] <- "free" ggplot(plot_data[!is_y, , drop = FALSE], set_hist_aes(freq)) + geom_freqpoly( aes_(color = "yrep"), size = .5, na.rm = TRUE, binwidth = binwidth ) + geom_vline( data = plot_data[is_y, , drop = FALSE], mapping = aes_(xintercept = ~ value, color = "y"), show.legend = FALSE, size = 1 ) + do.call("facet_wrap", facet_args) + scale_color_manual( name = stat_legend_title(stat, deparse(substitute(stat))), values = set_names(get_color(c("m", "dh")), c("yrep", "y")), labels = c(yrep = Tyrep_label(), y = Ty_label()) ) + dont_expand_y_axis(c(0.005, 0)) + xaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) + bayesplot_theme_get() } #' @rdname PPC-test-statistics #' @export #' @param size,alpha Arguments passed to [ggplot2::geom_point()] to control the #' appearance of scatterplot points. ppc_stat_2d <- function(y, yrep, stat = c("mean", "sd"), ..., size = 2.5, alpha = 0.7) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (length(stat) != 2) { abort("For ppc_stat_2d the 'stat' argument must have length 2.") } if (is.character(stat)) { lgnd_title <- bquote(italic(T) == (list(.(stat[1]), .(stat[2])))) stat_labs <- stat } else { lgnd_title <- expression(italic(T) == (list(italic(T)[1], italic(T)[2]))) stat_labs <- expression(italic(T)[1], italic(T)[2]) } stat1 <- match.fun(stat[[1]]) stat2 <- match.fun(stat[[2]]) T_y1 <- stat1(y) T_y2 <- stat2(y) T_yrep1 <- apply(yrep, 1, stat1) T_yrep2 <- apply(yrep, 1, stat2) ggplot( data = data.frame(x = T_yrep1, y = T_yrep2), mapping = aes_(x = ~ x, y = ~ y) ) + geom_point( aes_(fill = "yrep", color = "yrep"), shape = 21, size = size, alpha = alpha ) + annotate( geom = "segment", x = c(T_y1, -Inf), xend = c(T_y1, T_y1), y = c(-Inf, T_y2), yend = c(T_y2, T_y2), linetype = 2, size = 0.4, color = get_color("dh") ) + geom_point( data = data.frame(x = T_y1, y = T_y2), mapping = aes_(x = ~ x, y = ~ y, fill = "y", color = "y"), size = size * 1.5, shape = 21, stroke = 0.75 ) + scale_fill_manual( name = lgnd_title, values = set_names(get_color(c("d", "l")), c("y", "yrep")), labels = c(y = Ty_label(), yrep = Tyrep_label()) ) + scale_color_manual( name = lgnd_title, values = set_names(get_color(c("dh", "lh")), c("y", "yrep")), labels = c(y = Ty_label(), yrep = Tyrep_label()) ) + labs(x = stat_labs[1], y = stat_labs[2]) + bayesplot_theme_get() } # internal ---------------------------------------------------------------- #' Make legend title for ppc_stat,ppc_stat_grouped,ppc_stat_freqpoly_grouped #' #' @param stat The user's `stat` argument. #' @param stat_txt `deparse(substitute())` applied to users `stat` argument. #' @return Either throws an error or returns a legend title (possibly `NULL`). #' @noRd stat_legend_title <- function(stat, stat_txt) { stopifnot(is.character(stat) || is.function(stat)) if (is.character(stat)) { lgnd_txt <- stat } else { lgnd_txt <- if (length(stat_txt) == 1 && !grepl("^function", stat_txt)) stat_txt else NA } if (is.na(lgnd_txt)) return(NULL) bquote(italic(T) == .(lgnd_txt)) } bayesplot/R/bayesplot-helpers.R0000644000176200001440000003403214057717550016257 0ustar liggesusers#' Convenience functions for adding or changing plot details #' #' Convenience functions for adding to (and changing details of) ggplot objects #' (many of the objects returned by **bayesplot** functions). See the #' **Examples** section, below. #' #' @name bayesplot-helpers #' #' @param ... For the various `vline_`, `hline_`, and `abline_` #' functions, `...` is passed to [ggplot2::geom_vline()], #' [ggplot2::geom_hline()], and [ggplot2::geom_abline()], #' respectively, to control the appearance of the line(s). #' #' For functions ending in `_bg`, `...` is passed to #' [ggplot2::element_rect()]. #' #' For functions ending in `_text` or `_title`, `...` is passed #' to [ggplot2::element_text()]. #' #' For `xaxis_ticks` and `yaxis_ticks`, `...` is passed to #' [ggplot2::element_line()]. #' #' For `overlay_function`, `...` is passed to #' [ggplot2::stat_function()]. #' #' @return #' A **ggplot2** layer or [ggplot2::theme()] object that can be #' added to existing ggplot objects, like those created by many of the #' **bayesplot** plotting functions. See the **Details** section. #' #' @details #' \subsection{Add vertical, horizontal, and diagonal lines to plots}{ #' * `vline_at()` and `hline_at()` return an object created by either #' [ggplot2::geom_vline()] or [ggplot2::geom_hline()] that can be added to a #' ggplot object to draw a vertical or horizontal line (at one or several #' values). If `fun` is missing then the lines are drawn at the values in `v`. #' If `fun` is specified then the lines are drawn at the values returned by `fun(v)`. #' #' * `vline_0()` and `hline_0()` are wrappers for `vline_at()` and `hline_at()` #' with `v = 0` and `fun` missing. #' #' * `abline_01()` is a wrapper for [ggplot2::geom_abline()] with the intercept #' set to `0` and the slope set to `1`. #' #' * `lbub()` returns a _function_ that takes a single argument `x` and returns #' the lower and upper bounds (`lb`, `ub`) of the `100*p`\% central interval #' of `x`, as well as the median (if `med=TRUE`). #' } #' #' \subsection{Control appearance of facet strips}{ #' * `facet_text()` returns ggplot2 theme objects that can be added to an #' existing plot (ggplot object) to format the text in facet strips. #' #' * `facet_bg()` can be added to a plot to change the background of the facet strips. #' } #' #' \subsection{Move legend, remove legend, or style the legend text}{ #' * `legend_move()` and `legend_none()` return a ggplot2 theme object that can #' be added to an existing plot (ggplot object) in order to change the #' position of the legend or remove it. #' #' * `legend_text()` works much like `facet_text()` but for the legend. #' } #' #' \subsection{Control appearance of \eqn{x}-axis and \eqn{y}-axis features}{ #' * `xaxis_title()` and `yaxis_title()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) in order to toggle or #' format the titles displayed on the `x` or `y` axis. (To change #' the titles themselves use [ggplot2::labs()].) #' #' * `xaxis_text()` and `yaxis_text()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) in order to toggle or #' format the text displayed on the `x` or `y` axis (e.g. tick #' labels). #' #' * `xaxis_ticks()` and `yaxis_ticks()` return a ggplot2 theme object #' that can be added to an existing plot (ggplot object) to change the #' appearance of the axis tick marks. #' } #' #' \subsection{Customize plot background}{ #' * `plot_bg()` returns a ggplot2 theme object that can be added to an #' existing plot (ggplot object) to format the background of the *entire* plot. #' #' * `panel_bg()` returns a ggplot2 theme object that can be added to an #' existing plot (ggplot object) to format the background of the just the #' plotting area. #' #' * `grid_lines()` returns a ggplot2 theme object that can be added to #' an existing plot (ggplot object) to add grid lines to the plot background. #' } #' #' \subsection{Superimpose a function on an existing plot}{ #' * `overlay_function()` is a simple wrapper for [ggplot2::stat_function()] but #' with the `inherit.aes` argument fixed to `FALSE`. Fixing `inherit.aes=FALSE` #' will avoid potential errors due to the [ggplot2::aes()]thetic mapping used by #' certain **bayesplot** plotting functions. #' } #' #' @seealso [theme_default()] for the default ggplot theme used by #' **bayesplot**. #' #' @examples #' color_scheme_set("gray") #' x <- example_mcmc_draws(chains = 1) #' dim(x) #' colnames(x) #' #' #' ################################### #' ### vertical & horizontal lines ### #' ################################### #' (p <- mcmc_intervals(x, regex_pars = "beta")) #' #' # vertical line at zero (with some optional styling) #' p + vline_0() #' p + vline_0(size = 0.25, color = "darkgray", linetype = 2) #' #' # vertical line(s) at specified values #' v <- c(-0.5, 0, 0.5) #' p + vline_at(v, linetype = 3, size = 0.25) #' #' my_lines <- vline_at(v, alpha = 0.25, size = 0.75 * c(1, 2, 1), #' color = c("maroon", "skyblue", "violet")) #' p + my_lines #' #' \donttest{ #' # add vertical line(s) at computed values #' # (three ways of getting lines at column means) #' color_scheme_set("brightblue") #' p <- mcmc_intervals(x, regex_pars = "beta") #' p + vline_at(x[, 3:4], colMeans) #' p + vline_at(x[, 3:4], "colMeans", color = "darkgray", #' lty = 2, size = 0.25) #' p + vline_at(x[, 3:4], function(a) apply(a, 2, mean), #' color = "orange", #' size = 2, alpha = 0.1) #' } #' #' # using the lbub function to get interval lower and upper bounds (lb, ub) #' color_scheme_set("pink") #' parsed <- ggplot2::label_parsed #' p2 <- mcmc_hist(x, pars = "beta[1]", binwidth = 1/20, #' facet_args = list(labeller = parsed)) #' (p2 <- p2 + facet_text(size = 16)) #' #' b1 <- x[, "beta[1]"] #' p2 + vline_at(b1, fun = lbub(0.8), color = "gray20", #' size = 2 * c(1,.5,1), alpha = 0.75) #' p2 + vline_at(b1, lbub(0.8, med = FALSE), color = "gray20", #' size = 2, alpha = 0.75) #' #' #' ########################## #' ### format axis titles ### #' ########################## #' color_scheme_set("green") #' y <- example_y_data() #' yrep <- example_yrep_draws() #' (p3 <- ppc_stat(y, yrep, stat = "median", binwidth = 1/4)) #' #' # turn off the legend, turn on x-axis title #' p3 + #' legend_none() + #' xaxis_title(size = 13, family = "sans") + #' ggplot2::xlab(expression(italic(T(y)) == median(italic(y)))) #' #' #' ################################ #' ### format axis & facet text ### #' ################################ #' color_scheme_set("gray") #' p4 <- mcmc_trace(example_mcmc_draws(), pars = c("alpha", "sigma")) #' #' myfacets <- #' facet_bg(fill = "gray30", color = NA) + #' facet_text(face = "bold", color = "skyblue", size = 14) #' p4 + myfacets #' #' \donttest{ #' ########################## #' ### control tick marks ### #' ########################## #' p4 + #' myfacets + #' yaxis_text(FALSE) + #' yaxis_ticks(FALSE) + #' xaxis_ticks(size = 1, color = "skyblue") #' } #' #' ############################## #' ### change plot background ### #' ############################## #' color_scheme_set("blue") #' #' # add grid lines #' ppc_stat(y, yrep) + grid_lines() #' #' # panel_bg vs plot_bg #' ppc_scatter_avg(y, yrep) + panel_bg(fill = "gray90") #' ppc_scatter_avg(y, yrep) + plot_bg(fill = "gray90") #' #' color_scheme_set("yellow") #' p5 <- ppc_scatter_avg(y, yrep, alpha = 1) #' p5 + panel_bg(fill = "gray20") + grid_lines(color = "white") #' \donttest{ #' color_scheme_set("purple") #' ppc_dens_overlay(y, yrep[1:30, ]) + #' legend_text(size = 14) + #' legend_move(c(0.75, 0.5)) + #' plot_bg(fill = "gray90") + #' panel_bg(color = "black", fill = "gray99", size = 3) #' } #' #' #' ############################################### #' ### superimpose a function on existing plot ### #' ############################################### #' # compare posterior of beta[1] to Gaussian with same posterior mean #' # and sd as beta[1] #' x <- example_mcmc_draws(chains = 4) #' dim(x) #' purple_gaussian <- #' overlay_function( #' fun = dnorm, #' args = list(mean(x[,, "beta[1]"]), sd(x[,, "beta[1]"])), #' color = "purple", #' size = 2 #' ) #' #' color_scheme_set("gray") #' mcmc_hist(x, pars = "beta[1]") + purple_gaussian #' \donttest{mcmc_dens(x, pars = "beta[1]") + purple_gaussian} #' NULL # lines ------------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param v Either a numeric vector specifying the value(s) at which to #' draw the vertical or horizontal line(s), or an object of any type to use as #' the first argument to `fun`. #' @param fun A function, or the name of a function, that returns a numeric #' vector. #' @param na.rm A logical scalar passed to the appropriate geom (e.g. #' [ggplot2::geom_vline()]). The default is `TRUE`. #' vline_at <- function(v, fun, ..., na.rm = TRUE) { geom_vline(xintercept = calc_v(v, fun), na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export hline_at <- function(v, fun, ..., na.rm = TRUE) { geom_hline(yintercept = calc_v(v, fun), na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export vline_0 <- function(..., na.rm = TRUE) { geom_vline(xintercept = 0, na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export #' hline_0 <- function(..., na.rm = TRUE) { geom_hline(yintercept = 0, na.rm = na.rm, ...) } #' @rdname bayesplot-helpers #' @export #' abline_01 <- function(..., na.rm = TRUE) { geom_abline(intercept = 0, slope = 1, na.rm = na.rm, ...) } # intervals --------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param p The probability mass (in `[0,1]`) to include in the interval. #' @param med Should the median also be included in addition to the lower #' and upper bounds of the interval? #' lbub <- function(p, med = TRUE) { function(x) calc_intervals(x, p, med = med) } # internal calc_v <- function(v, fun, fun_args, ...) { if (missing(v)) abort("'v' can't be missing.") if (missing(fun)) return(v) f <- match.fun(fun) if (missing(fun_args)) return(f(v)) do.call(f, c(list(v), fun_args)) } calc_intervals <- function(x, p, med = TRUE, ...) { a <- (1 - p) / 2 pr <- c(a, if (med) 0.5, 1 - a) quantile(x, pr, ...) } # legend stuff ------------------------------------------------------------ #' @rdname bayesplot-helpers #' @export #' @param position The position of the legend. Either a numeric vector (of #' length 2) giving the relative coordinates (between 0 and 1) for the legend, #' or a string among `"right"`, `"left"`, `"top"`, #' `"bottom"`. Using `position = "none"` is also allowed and is #' equivalent to using `legend_none()`. #' legend_move <- function(position = "right") { theme(legend.position = position) } #' @rdname bayesplot-helpers #' @export legend_none <- function() { theme(legend.position = "none") } #' @rdname bayesplot-helpers #' @export legend_text <- function(...) { theme(legend.text = element_text(...)) } # axis stuff -------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export xaxis_title <- function(on = TRUE, ...) { if (!on) return(xlab(NULL)) theme(axis.title.x = element_text(...)) } #' @rdname bayesplot-helpers #' @export xaxis_text <- function(on = TRUE, ...) { theme(axis.text.x = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export xaxis_ticks <- function(on = TRUE, ...) { theme(axis.ticks.x = if (on) element_line(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export yaxis_title <- function(on = TRUE, ...) { if (!on) return(ylab(NULL)) theme(axis.title.y = element_text(...)) } #' @rdname bayesplot-helpers #' @export yaxis_text <- function(on = TRUE, ...) { theme(axis.text.y = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export yaxis_ticks <- function(on = TRUE, ...) { theme(axis.ticks.y = if (on) element_line(...) else element_blank()) } # facet stuff ------------------------------------------------------------- #' @rdname bayesplot-helpers #' @export #' @param on For functions modifying ggplot [theme][ggplot2::theme] elements, #' set `on=FALSE` to set the element to [ggplot2::element_blank()]. For #' example, facet text can be removed by adding `facet_text(on=FALSE)`, or #' simply `facet_text(FALSE)` to a ggplot object. If `on=TRUE` (the default), #' then `...` can be used to customize the appearance of the theme element. #' facet_text <- function(on = TRUE, ...) { theme(strip.text = if (on) element_text(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export facet_bg <- function(on = TRUE, ...) { theme(strip.background = if (on) element_rect(...) else element_blank()) } # plot background --------------------------------------------------------- #' @rdname bayesplot-helpers #' @export panel_bg <- function(on = TRUE, ...) { theme(panel.background = if (on) element_rect(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export plot_bg <- function(on = TRUE, ...) { theme(plot.background = if (on) element_rect(...) else element_blank()) } #' @rdname bayesplot-helpers #' @export #' @param color,size Passed to [ggplot2::element_line()]. #' grid_lines <- function(color = "gray50", size = 0.2) { theme( panel.grid.major = element_line(color = color, size = size), panel.grid.minor = element_line(color = color, size = size * 0.5) ) } grid_lines_y <- function(color = "gray50", size = 0.2) { theme( panel.grid.major.y = element_line(color = color, size = size), panel.grid.minor.y = element_line(color = color, size = size * 0.5) ) } # overlay functions on an existing plot ----------------------------------- #' @rdname bayesplot-helpers #' @export overlay_function <- function(...) { stat_function(..., inherit.aes = FALSE) } bayesplot/R/helpers-shared.R0000644000176200001440000000243114057717550015521 0ustar liggesusers#' Check for suggested package with `requireNamespace` and throw error if necessary #' #' @noRd #' @param pkg Package name as a string. #' @param min_version Optionally, a minimum version number as a string. #' @return `TRUE`, invisibly, if no error is thrown. #' suggested_package <- function(pkg, min_version = NULL) { stopifnot(length(pkg) == 1, is.character(pkg)) if (!requireNamespace(pkg, quietly = TRUE)) { abort(paste("Please install the", pkg, "package to use this function.")) } if (!is.null(min_version)) { stopifnot(is.character(min_version)) if (utils::packageVersion(pkg) < package_version(min_version)) { abort(paste( "Version >= ", min_version, "of the", pkg, "package is required to use this function." )) } } invisible(TRUE) } # Return x if not NULL, otherwise y `%||%` <- function(x, y) if (!is.null(x)) x else y # Check for ignored arguments check_ignored_arguments <- function(..., ok_args = character()) { dots <- list(...) if (length(dots)) { unrecognized <- if (!length(ok_args)) names(dots) else setdiff(names(dots), ok_args) if (length(unrecognized)) { warn(paste( "The following arguments were unrecognized and ignored:", paste(unrecognized, collapse = ", ") )) } } } bayesplot/R/bayesplot-colors.R0000644000176200001440000003211714057717550016120 0ustar liggesusers#' Set, get, or view **bayesplot** color schemes #' #' Set, get, or view color schemes. Choose from a preset scheme or create a #' custom scheme. See the **Available color schemes** section below for a list #' of available scheme names. The **Custom color schemes** section describes how #' to specify a custom scheme. #' #' @name bayesplot-colors #' @param scheme For `color_scheme_set()`, either a string naming one of the #' available color schemes or a character vector of _exactly six_ colors #' specifying a custom scheme. #' #' For `color_scheme_get()`, `scheme` can be missing (to get the #' current color scheme) or a string naming one of the preset schemes. #' #' For `color_scheme_view()`, `scheme` can be missing (to use the #' current color scheme) or a character vector containing a subset of the #' available scheme names. #' #' See the **Available color schemes** section below for a list of available #' scheme names. The **Custom color schemes** section describes how to specify #' a custom scheme. #' #' @return `color_scheme_set()` has the side effect of setting the color scheme #' used for plotting. It also returns ([invisibly][base::invisible]) a list of #' the hexadecimal color values used in `scheme`. #' #' `color_scheme_get()` returns a list of the hexadecimal color #' values (without changing the current scheme). If the `scheme` argument #' is not specified the returned values correspond to the current color #' scheme. If the optional argument `i` is specified then the returned #' list only contains `length(i)` elements. #' #' `color_scheme_view()` returns a ggplot object if only a single scheme is #' specified and a gtable object if multiple schemes names are specified. #' #' @section Available color schemes: Currently, the available preset color #' schemes are: #' * `"blue"`, `"brightblue"` #' * `"gray"`, `"darkgray"` #' * `"green"` #' * `"pink"` #' * `"purple"` #' * `"red"` #' * `"teal"` #' * `"yellow"` #' * [`"viridis"`](https://CRAN.R-project.org/package=viridis), `"viridisA"`, #' `"viridisB"`, `"viridisC"`, `"viridisD"`, `"viridisE"` #' * `"mix-x-y"`, replacing `x` and `y` with any two of #' the scheme names listed above (e.g. "mix-teal-pink", "mix-blue-red", #' etc.). The order of `x` and `y` matters, i.e., the color schemes #' `"mix-blue-red"` and `"mix-red-blue"` are not identical. There is no #' guarantee that every possible mixed scheme will look good with every #' possible plot. #' * `"brewer-x"`, replacing `x` with the name of a palette available from #' [RColorBrewer::brewer.pal()] (e.g., `brewer-PuBuGn`). #' #' If you have a suggestion for a new color scheme please let us know via the #' **bayesplot** [issue tracker](https://github.com/stan-dev/bayesplot/issues). #' #' @section Custom color schemes: A **bayesplot** color scheme consists of six #' colors. To specify a custom color scheme simply pass a character vector #' containing either the names of six [colors][grDevices::colors] or six #' hexadecimal color values (or a mix of names and hex values). The colors #' should be in order from lightest to darkest. See the end of the #' **Examples** section for a demonstration. #' #' @template seealso-theme #' #' @examples #' color_scheme_set("blue") #' color_scheme_view() #' #' color_scheme_get() #' color_scheme_get(i = c(3, 5)) # 3rd and 5th colors only #' #' color_scheme_get("brightblue") #' color_scheme_view("brightblue") #' #' # compare multiple schemes #' color_scheme_view(c("pink", "gray", "teal")) #' color_scheme_view(c("viridis", "viridisA", "viridisB", "viridisC")) #' #' color_scheme_set("pink") #' x <- example_mcmc_draws() #' mcmc_intervals(x) #' #' color_scheme_set("teal") #' color_scheme_view() #' mcmc_intervals(x) #' #' color_scheme_set("red") #' mcmc_areas(x, regex_pars = "beta") #' #' color_scheme_set("purple") #' color_scheme_view() #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_stat(y, yrep, stat = "mean") + legend_none() #' #' ############################ #' ### Mixing color schemes ### #' ############################ #' color_scheme_set("mix-teal-pink") #' ppc_stat(y, yrep, stat = "sd") + legend_none() #' mcmc_areas(x, regex_pars = "beta") #' #' ########################## #' ### ColorBrewer scheme ### #' ########################## #' color_scheme_set("brewer-Spectral") #' color_scheme_view() #' mcmc_trace(x, pars = "sigma") #' #' ########################### #' ### Custom color scheme ### #' ########################### #' orange_scheme <- c("#ffebcc", "#ffcc80", #' "#ffad33", "#e68a00", #' "#995c00", "#663d00") #' color_scheme_set(orange_scheme) #' color_scheme_view() #' mcmc_areas(x, regex_pars = "alpha") #' mcmc_dens_overlay(x) #' ppc_stat(y, yrep, stat = "var") + legend_none() #' NULL #' @rdname bayesplot-colors #' @export color_scheme_set <- function(scheme = "blue") { if (!is.character(scheme)) { abort("'scheme' should be a character vector of length 1 or 6.") } if (length(scheme) == 1) { x <- scheme_from_string(scheme) } else if (length(scheme) == 6) { x <- prepare_custom_colors(scheme) } else { abort("'scheme' should be a character vector of length 1 or 6.") } .bayesplot_aesthetics[["scheme"]] <- x invisible(x) } #' @rdname bayesplot-colors #' @export #' @param i For `color_scheme_get()`, an optional subset of the integers from `1` #' (lightest) to `6` (darkest) indicating which of the colors in the #' scheme to return. If `i` is not specified then all six colors in the #' scheme are included. #' color_scheme_get <- function(scheme = NULL, i = NULL) { if (!is.null(scheme)) { scheme <- scheme_from_string(scheme) } else { x <- .bayesplot_aesthetics$scheme scheme <- as.list(x)[scheme_level_names()] attr(scheme, "mixed") <- attr(x, "mixed") attr(scheme, "scheme_name") <- attr(x, "scheme_name") } class(scheme) <- c("bayesplot_scheme", "list") if (is.null(i)) { return(scheme) } else if (is.character(i)) { return(get_color(i)) } stopifnot( all(i %in% seq_along(scheme)), length(unique(i)) == length(i) ) scheme[i] } #' @rdname bayesplot-colors #' @export color_scheme_view <- function(scheme = NULL) { if (is.null(scheme) || length(scheme) == 1){ return(plot_scheme(scheme)) } bayesplot_grid( plots = lapply(scheme, plot_scheme), grid_args = list(ncol = length(scheme)) ) } #' @export print.bayesplot_scheme <- function(x, ...) { tab <- data.frame(unlist(x, use.names = FALSE), stringsAsFactors = FALSE) colnames(tab) <- attr(x, "scheme_name") %||% "hex_color" print(tab, ...) } #' @export plot.bayesplot_scheme <- function(x, ...) { scheme <- attr(x, "scheme_name") %||% abort("Scheme name not found.") plot_scheme(scheme) } # internal ----------------------------------------------------------------- # plot color scheme # @param scheme A string (length 1) naming a scheme plot_scheme <- function(scheme = NULL) { if (is.null(scheme)) { x <- color_scheme_get() } else { x <- color_scheme_get(scheme) } color_data <- data.frame( name = factor(attr(x, "scheme_name")), group = factor(names(x), levels = rev(names(x))), value = rep(1, length(x)) ) ggplot(color_data, aes_(x = ~ name, y = ~ value, fill = ~ group)) + geom_bar( width = .5, stat = "identity", color = "white", size = 0.1 ) + scale_fill_manual("", values = unlist(x)) + theme_void() + legend_none() + xaxis_text( face = "bold", margin = margin(t = -3, b = 10, unit = "pt"), angle = 0, vjust = 1, debug = FALSE ) } # Color scheme level names scheme_level_names <- function() { c("light", "light_highlight", "mid", "mid_highlight", "dark", "dark_highlight") } #' Return a color scheme based on `scheme` argument specified as a string #' #' @noRd #' @param scheme A string (length 1) naming a scheme scheme_from_string <- function(scheme) { if (identical(substr(scheme, 1, 4), "mix-")) { # user specified a mixed scheme (e.g., "mix-blue-red") to_mix <- unlist(strsplit(scheme, split = "-"))[2:3] x <- set_names(mixed_scheme(to_mix[1], to_mix[2]), scheme_level_names()) return(structure(x, mixed = TRUE, scheme_name = scheme)) } else if (identical(substr(scheme, 1, 7), "brewer-")) { # user specified a ColorBrewer scheme (e.g., "brewer-Blues") if (!requireNamespace("RColorBrewer", quietly = TRUE)) { abort("Please install the 'RColorBrewer' package to use a ColorBrewer scheme.") } clrs <- RColorBrewer::brewer.pal(n = 6, name = gsub("brewer-", "", scheme)) x <- set_names(as.list(clrs), scheme_level_names()) return(structure(x, mixed = FALSE, scheme_name = scheme)) } else { # check for scheme in master_color_list scheme <- match.arg(scheme, choices = names(master_color_list)) x <- set_names(master_color_list[[scheme]], scheme_level_names()) return(structure(x, mixed = FALSE, scheme_name = scheme)) } } # create mixed scheme from two existing schemes mixed_scheme <- function(scheme1, scheme2) { scheme1 <- color_scheme_get(scheme1) scheme2 <- color_scheme_get(scheme2) scheme <- unname(list( scheme1$light, scheme2$light_highlight, scheme2$mid, scheme1$mid_highlight, scheme1$dark, scheme2$dark_highlight )) attr(scheme, "mixed") <- TRUE scheme } #' Check if object returned by `color_scheme_get()` is a mixed scheme #' @noRd #' @param x object returned by `color_scheme_get()` #' @return T/F is_mixed_scheme <- function(x) { stopifnot(is.list(x)) isTRUE(attr(x, "mixed")) } #' Access a subset of the current scheme colors #' @noRd #' @param level A character vector of level names in `scheme_level_names()`. #' The abbreviations "l", "lh", "m", "mh", "d", and "dh" can also be used #' instead of the full names. #' @return A character vector of color values. #' get_color <- function(levels) { levels <- full_level_name(levels) stopifnot(all(levels %in% scheme_level_names())) color_vals <- color_scheme_get()[levels] unlist(color_vals, use.names = FALSE) } full_level_name <- function(x) { map <- c( l = "light", lh = "light_highlight", m = "mid", mh = "mid_highlight", d = "dark", dh = "dark_highlight", light = "light", light_highlight = "light_highlight", mid = "mid", mid_highlight = "mid_highlight", dark = "dark", dark_highlight = "dark_highlight" ) unname(map[x]) } # Custom color scheme if 6 colors specified prepare_custom_colors <- function(scheme) { if (length(scheme) != 6) { abort("Custom color schemes must contain exactly 6 colors.") } not_found <- character(0) for (j in seq_along(scheme)) { clr <- scheme[j] if (!is_hex_color(clr) && !clr %in% grDevices::colors()) { not_found <- c(not_found, clr) } } if (length(not_found)) { abort(paste( "Each color must specified as either a hexadecimal color value ", "(e.g. '#C79999') or the name of a color (e.g. 'blue'). ", "The following provided colors were not found:", paste(unlist(not_found), collapse = ", ") )) } x <- set_names(as.list(scheme), scheme_level_names()) attr(x, "scheme_name") <- "custom" x } is_hex_color <- function(x) { if (!identical(substr(x, 1, 1), "#")) { return(FALSE) } isTRUE(nchar(x) == 7) } # master color list ------------------------------------------------------- master_color_list <- list( blue = list("#d1e1ec", "#b3cde0", "#6497b1", "#005b96", "#03396c", "#011f4b"), brightblue = list("#cce5ff", "#99cbff", "#4ca5ff", "#198bff", "#0065cc", "#004c99"), darkgray = list("#bfbfbf", "#999999", "#737373", "#505050", "#383838", "#0d0d0d"), gray = list("#DFDFDF", "#bfbfbf", "#999999", "#737373", "#505050", "#383838"), green = list("#d9f2e6", "#9fdfbf", "#66cc99", "#40bf80", "#2d8659", "#194d33"), orange = list("#fecba2", "#feb174", "#fe8a2f", "#e47115", "#b15810", "#7f3f0c"), pink = list("#dcbccc", "#c799b0", "#b97c9b", "#a25079", "#8f275b", "#7c003e"), purple = list("#e5cce5", "#bf7fbf", "#a64ca6", "#800080", "#660066", "#400040"), red = list("#DCBCBC", "#C79999", "#B97C7C", "#A25050", "#8F2727", "#7C0000"), teal = list("#bcdcdc", "#99c7c7", "#7cb9b9", "#50a2a2", "#278f8f", "#007C7C"), yellow = list("#fbf3da", "#f8e8b5", "#f5dc90", "#dbc376", "#aa975c", "#7a6c42"), viridis = list("#FDE725FF", "#7AD151FF", "#22A884FF", "#2A788EFF", "#414487FF", "#440154FF"), viridisA = list("#FCFDBFFF", "#FE9F6DFF", "#DE4968FF", "#8C2981FF", "#3B0F70FF", "#000004FF"), viridisB = list("#FCFFA4FF", "#FCA50AFF", "#DD513AFF", "#932667FF", "#420A68FF", "#000004FF"), viridisC = list("#F0F921FF", "#FCA636FF", "#E16462FF", "#B12A90FF", "#6A00A8FF", "#0D0887FF"), # popular form of viridis is viridis option D viridisD = list("#FDE725FF", "#7AD151FF", "#22A884FF", "#2A788EFF", "#414487FF", "#440154FF"), viridisE = list("#FFEA46FF", "#CBBA69FF", "#958F78FF", "#666970FF", "#31446BFF", "#00204DFF") ) # instantiate aesthetics -------------------------------------------------- .bayesplot_aesthetics <- new.env(parent = emptyenv()) .bayesplot_aesthetics$scheme <- list() color_scheme_set() bayesplot/R/mcmc-parcoord.R0000644000176200001440000001634314057717550015350 0ustar liggesusers#' Parallel coordinates plot of MCMC draws #' #' Parallel coordinates plot of MCMC draws (one dimension per parameter). #' See the **Plot Descriptions** section below for details, #' and see [Gabry et al. (2019)](https://github.com/jgabry/bayes-vis-paper#readme) #' for more background and a real example. #' #' @name MCMC-parcoord #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently ignored. #' @param size,alpha Arguments passed on to [ggplot2::geom_line()]. #' @param np For models fit using [NUTS] (more generally, #' any [symplectic integrator](https://en.wikipedia.org/wiki/Symplectic_integrator)), #' an optional data frame providing NUTS diagnostic information. The data #' frame should be the object returned by [nuts_params()] or one with the same #' structure. #' @param np_style A call to the `parcoord_style_np()` helper function to #' specify arguments controlling the appearance of superimposed lines #' representing NUTS diagnostics (in this case divergences) if the `np` #' argument is specified. #' #' @template return-ggplot-or-data #' #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_parcoord()`}{ #' [Parallel coordinates plot](https://en.wikipedia.org/wiki/Parallel_coordinates) #' of MCMC draws. There is one dimension per parameter along the horizontal #' axis and each set of connected line segments represents a single MCMC draw #' (i.e., a vector of length equal to the number of parameters). #' #' The parallel coordinates plot is most useful if the optional HMC/NUTS #' diagnostic information is provided via the `np` argument. In that #' case divergences are highlighted in the plot. The appearance of the #' divergences can be customized using the `np_style` argument and the #' `parcoord_style_np` helper function. This version of the plot is the #' same as the parallel coordinates plot described in Gabry et al. (2019). #' #' When the plotted model parameters are on very different scales the #' `transformations` argument can be useful. For example, to standardize #' all variables before plotting you could use function `(x - mean(x))/sd(x)` #' when specifying the `transformations` argument to #' `mcmc_parcoord`. See the **Examples** section for how to do this. #' } #' } #' #' @template reference-vis-paper #' @references Hartikainen, A. (2017, Aug 23). Concentration of divergences #' (Msg 21). Message posted to The Stan Forums: #' . #' #' @examples #' color_scheme_set("pink") #' x <- example_mcmc_draws(params = 5) #' mcmc_parcoord(x) #' mcmc_parcoord(x, regex_pars = "beta") #' #' \dontrun{ #' # Example using a Stan demo model #' library(rstan) #' fit <- stan_demo("eight_schools") #' draws <- as.array(fit, pars = c("mu", "tau", "theta", "lp__")) #' np <- nuts_params(fit) #' str(np) #' levels(np$Parameter) #' #' color_scheme_set("brightblue") #' mcmc_parcoord(draws, alpha = 0.05) #' mcmc_parcoord(draws, np = np) #' #' # customize appearance of divergences #' color_scheme_set("darkgray") #' div_style <- parcoord_style_np(div_color = "green", div_size = 0.05, div_alpha = 0.4) #' mcmc_parcoord(draws, size = 0.25, alpha = 0.1, #' np = np, np_style = div_style) #' #' # to use a transformation (e.g., standardizing all the variables can be helpful) #' # specify the 'transformations' argument (though partial argument name #' # matching means we can just use 'trans' or 'transform') #' mcmc_parcoord( #' draws, #' transform = function(x) {(x - mean(x)) / sd(x)}, #' size = 0.25, #' alpha = 0.1, #' np = np, #' np_style = div_style #' ) #' #' # mcmc_parcoord_data returns just the data in a conventient form for plotting #' d <- mcmc_parcoord_data(x, np = np) #' head(d) #' tail(d) #'} #' NULL #' @rdname MCMC-parcoord #' @export mcmc_parcoord <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., size = 0.2, alpha = 0.3, np = NULL, np_style = parcoord_style_np()) { check_ignored_arguments(...) stopifnot(inherits(np_style, "nuts_style")) data <- mcmc_parcoord_data( x = x, pars = pars, regex_pars = regex_pars, transformations = transformations, np = np ) divg <- sym("Divergent") draws <- dplyr::filter(data, UQ(divg) == 0) div_draws <- dplyr::filter(data, UQ(divg) == 1) has_divs <- isTRUE(nrow(div_draws) > 0) graph <- ggplot(draws, aes_( x = ~ Parameter, y = ~ Value, group = ~ factor(Draw) )) + geom_line( size = size, alpha = alpha, color = get_color("dh") ) + bayesplot_theme_get() if (has_divs) { graph <- graph + geom_line( data = div_draws, size = np_style$size[["div"]], alpha = np_style$alpha[["div"]], color = np_style$color[["div"]] ) } graph + scale_x_discrete(expand = c(0,0), labels = levels(draws$Parameter)) + labs(x = NULL, y = NULL) } #' @rdname MCMC-parcoord #' @export #' @importFrom dplyr n left_join mutate group_by ungroup select arrange rename mcmc_parcoord_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), np = NULL ) { x <- prepare_mcmc_array(x, pars, regex_pars, transformations) long_d <- melt_mcmc(x) if (num_params(long_d) < 2) { abort("'mcmc_parcoord' requires at least two parameters in 'x'.") } param <- sym("Parameter") value <- sym("Value") if (is.null(np)) { # still include 'Divergent' so returned object always has same columns long_d$Divergent <- 0 } else { # join with divergence info (both long_d and np have columns # 'Parameter' and 'Value' so need to be a little careful) divs <- np %>% validate_nuts_data_frame() %>% dplyr::filter(UQ(param) == "divergent__") %>% select(- !!param) %>% rename("Divergent" = !!value) long_d <- left_join(long_d, divs, by = c("Iteration", "Chain")) } keep_cols <- syms(c("Draw", "Parameter", "Value", "Divergent")) long_d %>% group_by(!! param) %>% mutate(Draw = 1:n()) %>% ungroup() %>% select(!!! keep_cols) } #' @rdname MCMC-parcoord #' @export #' @param div_color,div_size,div_alpha Optional arguments to the #' `parcoord_style_np()` helper function that are eventually passed to #' [ggplot2::geom_line()] if the `np` argument is also specified. They control #' the color, size, and transparency specifications for showing divergences in #' the plot. The default values are displayed in the **Usage** section above. parcoord_style_np <- function(div_color = "red", div_size = 0.2, div_alpha = 0.2) { stopifnot( is.character(div_color), is.numeric(div_size), is.numeric(div_alpha) && div_alpha >= 0 && div_alpha <= 1 ) style <- list( color = c(div = div_color), size = c(div = div_size), alpha = c(div = div_alpha) ) structure(style, class = c(class(style), "nuts_style")) } bayesplot/R/ppc-errors.R0000644000176200001440000003063714057717550014720 0ustar liggesusers#' PPC errors #' #' Various plots of predictive errors `y - yrep`. See the #' **Details** and **Plot Descriptions** sections, below. #' #' @name PPC-errors #' @family PPCs #' #' @template args-y-yrep #' @param ... Currently unused. #' @param size,alpha For scatterplots, arguments passed to #' [ggplot2::geom_point()] to control the appearance of the points. For the #' binned error plot, arguments controlling the size of the outline and #' opacity of the shaded region indicating the 2-SE bounds. #' #' @details #' All of these functions (aside from the `*_scatter_avg` functions) #' compute and plot predictive errors for each row of the matrix `yrep`, so #' it is usually a good idea for `yrep` to contain only a small number of #' draws (rows). See **Examples**, below. #' #' For binomial and Bernoulli data the `ppc_error_binned()` function can be used #' to generate binned error plots. Bernoulli data can be input as a vector of 0s #' and 1s, whereas for binomial data `y` and `yrep` should contain "success" #' proportions (not counts). See the **Examples** section, below. #' #' @section Plot descriptions: #' \describe{ #' \item{`ppc_error_hist()`}{ #' A separate histogram is plotted for the predictive errors computed from #' `y` and each dataset (row) in `yrep`. For this plot `yrep` #' should have only a small number of rows. #' } #' \item{`ppc_error_hist_grouped()`}{ #' Like `ppc_error_hist()`, except errors are computed within levels of a #' grouping variable. The number of histograms is therefore equal to the #' product of the number of rows in `yrep` and the number of groups #' (unique values of `group`). #' } #' \item{`ppc_error_scatter()`}{ #' A separate scatterplot is displayed for `y` vs. the predictive errors #' computed from `y` and each dataset (row) in `yrep`. For this #' plot `yrep` should have only a small number of rows. #' } #' \item{`ppc_error_scatter_avg()`}{ #' A single scatterplot of `y` vs. the average of the errors computed #' from `y` and each dataset (row) in `yrep`. For each individual #' data point `y[n]` the average error is the average of the #' errors for `y[n]` computed over the the draws from the posterior #' predictive distribution. #' } #' \item{`ppc_error_scatter_avg_vs_x()`}{ #' Same as `ppc_error_scatter_avg()`, except the average is plotted on the #' \eqn{y}-axis and a a predictor variable `x` is plotted on the #' \eqn{x}-axis. #' } #' \item{`ppc_error_binned()`}{ #' Intended for use with binomial data. A separate binned error plot (similar #' to `arm::binnedplot()`) is generated for each dataset (row) in `yrep`. For #' this plot `y` and `yrep` should contain proportions rather than counts, #' and `yrep` should have only a small number of rows. #' } #' } #' #' @template return-ggplot #' #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' ppc_error_hist(y, yrep[1:3, ]) #' #' # errors within groups #' group <- example_group_data() #' (p1 <- ppc_error_hist_grouped(y, yrep[1:3, ], group)) #' p1 + yaxis_text() # defaults to showing counts on y-axis #' \donttest{ #' table(group) # more obs in GroupB, can set freq=FALSE to show density on y-axis #' (p2 <- ppc_error_hist_grouped(y, yrep[1:3, ], group, freq = FALSE)) #' p2 + yaxis_text() #' } #' #' # scatterplots #' ppc_error_scatter(y, yrep[10:14, ]) #' ppc_error_scatter_avg(y, yrep) #' #' x <- example_x_data() #' ppc_error_scatter_avg_vs_x(y, yrep, x) #' #' # ppc_error_binned with binomial model from rstanarm #' \dontrun{ #' library(rstanarm) #' example("example_model", package = "rstanarm") #' formula(example_model) #' #' # get observed proportion of "successes" #' y <- example_model$y # matrix of "success" and "failure" counts #' trials <- rowSums(y) #' y_prop <- y[, 1] / trials # proportions #' #' # get predicted success proportions #' yrep <- posterior_predict(example_model) #' yrep_prop <- sweep(yrep, 2, trials, "/") #' #' ppc_error_binned(y_prop, yrep_prop[1:6, ]) #' } #' NULL #' @rdname PPC-errors #' @export #' @template args-hist #' @template args-hist-freq #' ppc_error_hist <- function(y, yrep, ..., binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (nrow(yrep) == 1) { errors <- data.frame(value = y - as.vector(yrep)) graph <- ggplot(errors, set_hist_aes(freq)) } else { errors <- compute_errors(y, yrep) graph <- ggplot(melt_yrep(errors), set_hist_aes(freq)) + labs(y = NULL, x = expression(italic(y) - italic(y)[rep])) + facet_wrap(facets = ~ rep_id) } graph + geom_histogram( fill = get_color("l"), color = get_color("lh"), size = 0.25, binwidth = binwidth, breaks = breaks ) + bayesplot_theme_get() + xlab(expression(italic(y) - italic(y)[rep])) + dont_expand_y_axis() + force_axes_in_facets() + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-errors #' @export #' @template args-group #' ppc_error_hist_grouped <- function(y, yrep, group, ..., binwidth = NULL, breaks = NULL, freq = TRUE) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) group <- validate_group(group, y) errors <- grouped_error_data(y, yrep, group) ggplot(errors, set_hist_aes(freq)) + geom_histogram( fill = get_color("l"), color = get_color("lh"), size = 0.25, binwidth = binwidth, breaks = breaks ) + facet_grid(rep_id ~ group, scales = "free") + bayesplot_theme_get() + xlab(expression(italic(y) - italic(y)[rep])) + dont_expand_y_axis(c(0.005, 0)) + force_axes_in_facets() + yaxis_text(FALSE) + yaxis_ticks(FALSE) + yaxis_title(FALSE) + facet_bg(FALSE) + theme(strip.text.y = element_blank()) } #' @rdname PPC-errors #' @export ppc_error_scatter <- function(y, yrep, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (nrow(yrep) == 1) { return( .ppc_scatter( data = data.frame(y = y, x = y - as.vector(yrep)), mapping = aes_(x = ~ x, y = ~ y), x_lab = expression(italic(y) - italic(y)[rep]), y_lab = expression(italic(y)), size = size, alpha = alpha, abline = FALSE ) ) } errors <- compute_errors(y, yrep) .ppc_scatter( data = dplyr::left_join( melt_yrep(errors), data.frame(y = y, y_id = seq_along(y)), by = "y_id" ), mapping = aes_(x = ~ value, y = ~ y), y_lab = expression(italic(y)), x_lab = expression(italic(y) - italic(y)[rep]), size = size, alpha = alpha, abline = FALSE ) + facet_wrap( facets = ~ rep_id # labeller = label_bquote(italic(y) - italic(y)[rep](.(rep_id))) ) + force_axes_in_facets() + facet_text(FALSE) + facet_bg(FALSE) } #' @rdname PPC-errors #' @export ppc_error_scatter_avg <- function(y, yrep, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) if (nrow(yrep) == 1) return( ppc_error_scatter(y, yrep, size = size, alpha = alpha, ...) ) .ppc_scatter( data = data.frame(y, avg_error = y - colMeans(yrep)), mapping = aes_(x = ~ avg_error, y = ~ y), y_lab = y_label(), x_lab = "Average predictive error", alpha = alpha, size = size, abline = FALSE ) } #' @rdname PPC-errors #' @export #' @param x A numeric vector the same length as `y` to use as the x-axis #' variable. #' ppc_error_scatter_avg_vs_x <- function(y, yrep, x, ..., size = 2.5, alpha = 0.8) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) x <- validate_x(x, y) .ppc_scatter( data = data.frame(x, avg_error = y - colMeans(yrep)), mapping = aes_(x = ~ x, y = ~ avg_error), x_lab = expression(italic(x)), y_lab = "Average predictive error", alpha = alpha, size = size, abline = FALSE ) } #' @rdname PPC-errors #' @export #' @param bins For `ppc_error_binned()`, the number of bins to use (approximately). ppc_error_binned <- function(y, yrep, ..., bins = NULL, size = 1, alpha = 0.25) { check_ignored_arguments(...) y <- validate_y(y) yrep <- validate_yrep(yrep, y) binned <- binned_error_data(y, yrep, bins = bins) mixed_scheme <- is_mixed_scheme(color_scheme_get()) point_fill <- get_color(ifelse(mixed_scheme, "m", "d")) point_color <- get_color(ifelse(mixed_scheme, "mh", "dh")) graph <- ggplot(binned, aes_(x = ~ ey_bar)) + geom_hline( yintercept = 0, linetype = 2, color = "black" ) + geom_ribbon( aes_(ymax = ~ se2, ymin = ~ -se2), fill = get_color("l"), color = NA, alpha = alpha ) + geom_path( mapping = aes_(y = ~ se2), color = get_color("l"), size = size ) + geom_path( mapping = aes_(y = ~ -se2), color = get_color("l"), size = size ) + geom_point( mapping = aes_(y = ~ err_bar), shape = 21, fill = point_fill, color = point_color ) + labs( x = "Predicted proportion", y = "Average Errors \n (with 2SE bounds)" ) + bayesplot_theme_get() if (nrow(yrep) > 1) { graph <- graph + facet_wrap( facets = ~rep_id # labeller = label_bquote(italic(y)[rep](.(rep_id))) ) } graph + force_axes_in_facets() + facet_text(FALSE) + facet_bg(FALSE) } # internal ---------------------------------------------------------------- compute_errors <- function(y, yrep) { errs <- sweep(yrep, MARGIN = 2L, STATS = as.array(y), FUN = "-") as.matrix(-1 * errs) } grouped_error_data <- function(y, yrep, group) { grps <- unique(group) errs <- list() for (j in seq_along(grps)) { g_j <- grps[j] err_j <- compute_errors(y[group == g_j], yrep[, group == g_j, drop=FALSE]) errs[[j]] <- melt_yrep(err_j) errs[[j]]$group <- g_j } dat <- dplyr::bind_rows(errs) dat$y_id <- NULL return(dat) } binned_error_data <- function(y, yrep, bins = NULL) { if (is.null(bins)) { bins <- n_bins(length(y)) } errors <- compute_errors(y, yrep) binned_errs <- list() for (s in 1:nrow(errors)) { binned_errs[[s]] <- bin_errors(ey = yrep[s,], r = errors[s,], bins = bins, rep_id = s) } dat <- dplyr::bind_rows(binned_errs) return(dat) } # calculate number of bins binned_error_data() # @parmam N Number of data points, length(y) n_bins <- function(N) { if (N <= 10) { return(floor(N / 2)) } else if (N > 10 && N < 100) { return(10) } else { # N >= 100 return(floor(sqrt(N))) } } bin_errors <- function(ey, r, bins, rep_id = NULL) { N <- length(ey) break_ids <- floor(N * (1:(bins - 1)) / bins) if (any(break_ids == 0)) { bins <- 1 } if (bins == 1) { breaks <- c(-Inf, sum(range(ey)) / 2, Inf) } else { ey_sort <- sort(ey) breaks <- -Inf for (i in 1:(bins - 1)) { break_i <- break_ids[i] ey_range <- ey_sort[c(break_i, break_i + 1)] if (diff(ey_range) == 0) { if (ey_range[1] == min(ey)) { ey_range[1] <- -Inf } else { ey_range[1] <- max(ey[ey < ey_range[1]]) } } breaks <- c(breaks, sum(ey_range) / 2) } breaks <- unique(c(breaks, Inf)) } ey_binned <- as.numeric(cut(ey, breaks)) bins <- length(breaks) - 1 out <- matrix(NA, nrow = bins, ncol = 4) colnames(out) <- c("ey_bar", "err_bar", "se2", "bin") for (i in 1:bins) { mark <- which(ey_binned == i) ey_bar <- mean(ey[mark]) r_bar <- mean(r[mark]) s <- if (length(r[mark]) > 1) sd(r[mark]) else 0 out[i, ] <- c(ey_bar, r_bar, 2 * s / sqrt(length(mark)), i) } out <- as.data.frame(out) if (!is.null(rep_id)) { out$rep_id <- as.integer(rep_id) } return(out) } bayesplot/R/bayesplot-ggplot-themes.R0000644000176200001440000001402014057717550017367 0ustar liggesusers#' Default **bayesplot** plotting theme #' #' The [theme_default()] function returns the default ggplot #' [theme][ggplot2::theme] used by the **bayesplot** plotting functions. See #' [bayesplot_theme_set()] for details on setting and updating the plotting #' theme. #' #' @export #' @param base_size,base_family Base font size and family (passed to #' [ggplot2::theme_bw()]). It is possible to set `"bayesplot.base_size"` and #' `"bayesplot.base_family"` via [options()] to change the defaults, which are #' `12` and `"serif"`, respectively. #' @return A ggplot [theme][ggplot2::theme] object. #' #' @seealso [bayesplot_theme_set()] to change the ggplot theme. #' @template seealso-colors #' @template seealso-helpers #' #' @examples #' class(theme_default()) #' #' bayesplot_theme_set() # defaults to setting theme_default() #' x <- example_mcmc_draws() #' mcmc_hist(x) #' #' # change the default font size and family for bayesplots #' bayesplot_theme_set(theme_default(base_size = 8, base_family = "sans")) #' mcmc_hist(x) #' mcmc_areas(x, regex_pars = "beta") #' #' # change back #' bayesplot_theme_set() #' mcmc_areas(x, regex_pars = "beta") #' theme_default <- function(base_size = getOption("bayesplot.base_size", 12), base_family = getOption("bayesplot.base_family", "serif")) { theme_bw( base_family = base_family, base_size = base_size ) + theme( plot.background = element_blank(), panel.grid = element_blank(), panel.background = element_blank(), panel.border = element_blank(), axis.line = element_line(size = 0.4), axis.ticks = element_line(size = 0.3), strip.background = element_blank(), strip.text = element_text(size = rel(0.9)), strip.placement = "outside", # strip.background = element_rect(fill = "gray95", color = NA), panel.spacing = unit(1.5, "lines"), legend.position = "right", legend.background = element_blank(), legend.text = element_text(size = 13), legend.text.align = 0, legend.key = element_blank() ) } #' Get, set, and modify the active **bayesplot** theme #' #' @description These functions are the **bayesplot** equivalent to #' **ggplot2**'s [ggplot2::theme_set()] and friends. They set, get, and update #' the active theme but only apply them to `bayesplots`. The current/active #' theme is automatically applied to every `bayesplot` you draw. #' #' Use `bayesplot_theme_get()` to get the current **bayesplot** theme and #' `bayesplot_theme_set()` to set a new theme. `bayesplot_theme_update()` and #' `bayesplot_theme_replace()` are shorthands for changing individual elements. #' #' @details `bayesplot_theme_set()` and friends only apply to `bayesplots`. #' However, [ggplot2::theme_set()] can also be used to change the #' **bayesplot** theme. Currently, setting a theme with `ggplot2::theme_set()` #' (other than the **ggplot2** default [ggplot2::theme_grey()]) will override #' the **bayesplot** theme. #' #' @export #' @param new The new theme (list of theme elements) to use. This is analogous #' to the `new` argument to [ggplot2::theme_set()]. #' @param ... A named list of theme settings. #' #' @return `bayesplot_theme_get()` returns the current theme. The other three #' functions (set, update, replace) invisibly return the *previous* theme #' so it can be saved and easily restored later. This is the same behavior as #' the **ggplot2** versions of these functions. #' #' @seealso [theme_default()] for the default **bayesplot** theme. #' @template seealso-helpers #' @template seealso-colors #' #' @examples #' library(ggplot2) #' #' # plot using the current value of bayesplot_theme_get() #' # (the default is bayesplot::theme_default()) #' x <- example_mcmc_draws() #' mcmc_hist(x) #' #' # change the bayesplot theme to theme_minimal and save the old theme #' old <- bayesplot_theme_set(theme_minimal()) #' mcmc_hist(x) #' #' # change back to the previous theme #' bayesplot_theme_set(old) #' mcmc_hist(x) #' #' # change the default font size and family for bayesplots #' bayesplot_theme_update(text = element_text(size = 16, family = "sans")) #' mcmc_hist(x) #' #' # change back to the default #' bayesplot_theme_set() # same as bayesplot_theme_set(theme_default()) #' mcmc_hist(x) #' #' # updating theme elements #' color_scheme_set("brightblue") #' bayesplot_theme_set(theme_dark()) #' mcmc_hist(x) #' #' bayesplot_theme_update(panel.background = element_rect(fill = "black")) #' mcmc_hist(x) #' #' # to get the same plot without updating the theme we could also have #' # used the bayeplot convenience function panel_bg() #' bayesplot_theme_set(theme_dark()) #' mcmc_hist(x) + panel_bg(fill = "black") #' bayesplot_theme_get <- function() { if (!identical(.bayesplot_theme_env$gg_current, ggplot2::theme_get())) { .bayesplot_theme_env$current <- ggplot2::theme_get() .bayesplot_theme_env$gg_current <- ggplot2::theme_get() thm <- .bayesplot_theme_env$gg_current } else { thm <- .bayesplot_theme_env$current } thm } #' @rdname bayesplot_theme_get #' @export bayesplot_theme_set <- function(new = theme_default()) { missing <- setdiff(names(ggplot2::theme_gray()), names(new)) if (length(missing)) { warn(paste( "New theme missing the following elements:", paste(missing, collapse = ", ") )) } old <- .bayesplot_theme_env$current .bayesplot_theme_env$current <- new .bayesplot_theme_env$gg_current <- ggplot2::theme_get() invisible(old) } #' @rdname bayesplot_theme_get #' @export bayesplot_theme_update <- function(...) { bayesplot_theme_set(bayesplot_theme_get() + ggplot2::theme(...)) } #' @rdname bayesplot_theme_get #' @export #' @importFrom ggplot2 %+replace% bayesplot_theme_replace <- function(...) { bayesplot_theme_set(bayesplot_theme_get() %+replace% ggplot2::theme(...)) } # internal ---------------------------------------------------------------- .bayesplot_theme_env <- new.env(parent = emptyenv()) .bayesplot_theme_env$current <- theme_default() .bayesplot_theme_env$gg_current <- ggplot2::theme_grey() bayesplot/R/available-module-functions.R0000644000176200001440000000453214057717550020030 0ustar liggesusers#' Get or view the names of available plotting functions #' #' @export #' @param pattern,fixed,invert Passed to [base::grep()]. #' @return A possibly empty character vector of function names with several #' additional attributes (for use by a custom print method). If `pattern` #' is missing then the returned object contains the names of all available #' plotting functions in the [MCMC] or [PPC] module, depending on #' which function is called. If `pattern` is specified then a subset of #' function names is returned. #' #' @examples #' available_mcmc() #' available_mcmc("nuts") #' available_mcmc("rhat|neff") #' available_ppc("grouped") #' available_ppc("grouped", invert = TRUE) #' available_ppc <- function(pattern = NULL, fixed = FALSE, invert = FALSE) { .list_module_functions("ppc", .pattern = pattern, fixed = fixed, invert = invert) } #' @rdname available_ppc #' @export available_mcmc <- function(pattern = NULL, fixed = FALSE, invert = FALSE) { .list_module_functions("mcmc", .pattern = pattern, fixed = fixed, invert = invert) } #' @export print.bayesplot_function_list <- function(x, ...) { atts <- attributes(x) cat("bayesplot", toupper(atts[["module"]]), "module:\n") if (!is.null(atts[["pattern"]])) { msg <- paste0("(", ifelse(atts[["inverted"]], "excluding", "matching"), " pattern '", atts[["pattern"]], "')") cat(msg, "\n") } cat(paste0(" ", x), sep = "\n") invisible(x) } # internal ---------------------------------------------------------------- .list_module_functions <- function(.module = c("ppc", "mcmc"), .pattern, fixed = FALSE, invert = FALSE) { .module <- match.arg(.module) all_funs <- grep( pattern = paste0("^", .module, "_"), x = getNamespaceExports("bayesplot"), value = TRUE ) return_funs <- sort(all_funs) if (!is.null(.pattern)) { return_funs <- grep( pattern = .pattern, x = return_funs, value = TRUE, fixed = fixed, invert = invert ) } structure( return_funs, class = c("bayesplot_function_list", "character"), module = .module, pattern = .pattern, inverted = invert ) } bayesplot/R/mcmc-diagnostics.R0000644000176200001440000004251314057717550016044 0ustar liggesusers#' General MCMC diagnostics #' #' Plots of Rhat statistics, ratios of effective sample size to total sample #' size, and autocorrelation of MCMC draws. See the **Plot Descriptions** #' section, below, for details. For models fit using the No-U-Turn-Sampler, see #' also [MCMC-nuts] for additional MCMC diagnostic plots. #' #' @name MCMC-diagnostics #' @family MCMC #' #' @template args-hist #' @param size An optional value to override [ggplot2::geom_point()]'s #' default size (for `mcmc_rhat()`, `mcmc_neff()`) or #' [ggplot2::geom_line()]'s default size (for `mcmc_acf()`). #' @param ... Currently ignored. #' #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_rhat()`, `mcmc_rhat_hist()`}{ #' Rhat values as either points or a histogram. Values are colored using #' different shades (lighter is better). The chosen thresholds are somewhat #' arbitrary, but can be useful guidelines in practice. #' * _light_: below 1.05 (good) #' * _mid_: between 1.05 and 1.1 (ok) #' * _dark_: above 1.1 (too high) #' } #' #' \item{`mcmc_neff()`, `mcmc_neff_hist()`}{ #' Ratios of effective sample size to total sample size as either points or a #' histogram. Values are colored using different shades (lighter is better). #' The chosen thresholds are somewhat arbitrary, but can be useful guidelines #' in practice. #' * _light_: between 0.5 and 1 (high) #' * _mid_: between 0.1 and 0.5 (good) #' * _dark_: below 0.1 (low) #' } #' #' \item{`mcmc_acf()`, `mcmc_acf_bar()`}{ #' Grid of autocorrelation plots by chain and parameter. The `lags` argument #' gives the maximum number of lags at which to calculate the autocorrelation #' function. `mcmc_acf()` is a line plot whereas `mcmc_acf_bar()` is a #' barplot. #' } #'} #' #' @template reference-stan-manual #' @references #' Gelman, A. and Rubin, D. B. (1992). Inference from iterative #' simulation using multiple sequences. *Statistical Science*. 7(4), #' 457--472. #' #' @seealso #' * The [Visual MCMC Diagnostics](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) #' vignette. #' * [MCMC-nuts] for additional MCMC diagnostic plots for models fit #' using the No-U-Turn-Sampler. #' #' @examples #' # autocorrelation #' x <- example_mcmc_draws() #' dim(x) #' dimnames(x) #' #' color_scheme_set("green") #' mcmc_acf(x, pars = c("alpha", "beta[1]")) #' \donttest{ #' color_scheme_set("pink") #' (p <- mcmc_acf_bar(x, pars = c("alpha", "beta[1]"))) #' #' # add horiztonal dashed line at 0.5 #' p + hline_at(0.5, linetype = 2, size = 0.15, color = "gray") #' } #' #' # fake rhat values to use for demonstration #' rhat <- c(runif(100, 1, 1.15)) #' mcmc_rhat_hist(rhat) #' mcmc_rhat(rhat) #' #' # lollipops #' color_scheme_set("purple") #' mcmc_rhat(rhat[1:10], size = 5) #' #' color_scheme_set("blue") #' mcmc_rhat(runif(1000, 1, 1.07)) #' mcmc_rhat(runif(1000, 1, 1.3)) + legend_move("top") # add legend above plot #' #' # fake neff ratio values to use for demonstration #' ratio <- c(runif(100, 0, 1)) #' mcmc_neff_hist(ratio) #' mcmc_neff(ratio) #' #' \dontrun{ #' # Example using rstanarm model (requires rstanarm package) #' library(rstanarm) #' #' # intentionally use small 'iter' so there are some #' # problems with rhat and neff for demonstration #' fit <- stan_glm(mpg ~ ., data = mtcars, iter = 50, refresh = 0) #' rhats <- rhat(fit) #' ratios <- neff_ratio(fit) #' mcmc_rhat(rhats) #' mcmc_neff(ratios, size = 3) #' #' # there's a small enough number of parameters in the #' # model that we can display their names on the y-axis #' mcmc_neff(ratios) + yaxis_text(hjust = 1) #' #' # can also look at autocorrelation #' draws <- as.array(fit) #' mcmc_acf(draws, pars = c("wt", "cyl"), lags = 10) #' #' # increase number of iterations and plots look much better #' fit2 <- update(fit, iter = 500) #' mcmc_rhat(rhat(fit2)) #' mcmc_neff(neff_ratio(fit2)) #' mcmc_acf(as.array(fit2), pars = c("wt", "cyl"), lags = 10) #' } #' NULL # Rhat -------------------------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @param rhat A vector of R-hat estimates. #' mcmc_rhat <- function(rhat, ..., size = NULL) { check_ignored_arguments(...) data <- mcmc_rhat_data(rhat) graph <- ggplot( data = data, mapping = aes_( x = ~ value, y = ~ parameter, color = ~ rating, fill = ~ rating)) + geom_segment( mapping = aes_( yend = ~ parameter, xend = ifelse(min(data$value) < 1, 1, -Inf)), na.rm = TRUE) + bayesplot_theme_get() if (min(data$value) < 1) { graph <- graph + vline_at(1, color = "gray", size = 1) } brks <- set_rhat_breaks(data$value) graph + diagnostic_points(size) + vline_at( brks[-1], color = "gray", linetype = 2, size = 0.25) + labs(y = NULL, x = expression(hat(R))) + scale_fill_diagnostic("rhat") + scale_color_diagnostic("rhat") + scale_x_continuous(breaks = brks, expand = c(0, .01)) + scale_y_discrete(expand = c(.025,0)) + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_rhat_hist <- function(rhat, ..., binwidth = NULL, breaks = NULL) { check_ignored_arguments(...) data <- mcmc_rhat_data(rhat) ggplot( data = data, mapping = aes_( x = ~ value, color = ~ rating, fill = ~ rating)) + geom_histogram( size = .25, na.rm = TRUE, binwidth = binwidth, breaks = breaks ) + scale_color_diagnostic("rhat") + scale_fill_diagnostic("rhat") + labs(x = expression(hat(R)), y = NULL) + dont_expand_y_axis(c(0.005, 0)) + bayesplot_theme_get() + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_rhat_data <- function(rhat, ...) { check_ignored_arguments(...) rhat <- drop_NAs_and_warn(new_rhat(rhat)) diagnostic_data_frame(rhat) } # effective sample size --------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @param ratio A vector of *ratios* of effective sample size estimates to #' total sample size. See [neff_ratio()]. #' mcmc_neff <- function(ratio, ..., size = NULL) { check_ignored_arguments(...) data <- mcmc_neff_data(ratio) max_ratio <- max(ratio, na.rm = TRUE) if (max_ratio < 1.25) { additional_breaks <- numeric(0) } else if (max_ratio < 1.5) { additional_breaks <- 1.25 additional_labels <- "1.25" } else { additional_breaks <- seq(1.5, max_ratio, by = 0.5) } breaks <- c(0, 0.1, 0.25, 0.5, 0.75, 1, additional_breaks) ggplot( data, mapping = aes_( x = ~ value, y = ~ parameter, color = ~ rating, fill = ~ rating)) + geom_segment( aes_(yend = ~ parameter, xend = -Inf), na.rm = TRUE) + diagnostic_points(size) + vline_at( c(0.1, 0.5, 1), color = "gray", linetype = 2, size = 0.25) + labs(y = NULL, x = expression(N[eff]/N)) + scale_fill_diagnostic("neff") + scale_color_diagnostic("neff") + scale_x_continuous( breaks = breaks, # as.character truncates trailing zeroes, while ggplot default does not labels = as.character(breaks), limits = c(0, max(1, max_ratio) + 0.05), expand = c(0, 0)) + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) } #' @rdname MCMC-diagnostics #' @export mcmc_neff_hist <- function(ratio, ..., binwidth = NULL, breaks = NULL) { check_ignored_arguments(...) data <- mcmc_neff_data(ratio) ggplot( data, mapping = aes_( x = ~ value, color = ~ rating, fill = ~ rating)) + geom_histogram( size = .25, na.rm = TRUE, binwidth = binwidth, breaks = breaks) + scale_color_diagnostic("neff") + scale_fill_diagnostic("neff") + labs(x = expression(N[eff]/N), y = NULL) + dont_expand_y_axis(c(0.005, 0)) + yaxis_title(FALSE) + yaxis_text(FALSE) + yaxis_ticks(FALSE) + bayesplot_theme_get() } #' @rdname MCMC-diagnostics #' @export mcmc_neff_data <- function(ratio, ...) { check_ignored_arguments(...) ratio <- drop_NAs_and_warn(new_neff_ratio(ratio)) diagnostic_data_frame(ratio) } # autocorrelation --------------------------------------------------------- #' @rdname MCMC-diagnostics #' @export #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-facet_args #' @param lags The number of lags to show in the autocorrelation plot. mcmc_acf <- function(x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20, size = NULL) { check_ignored_arguments(...) .mcmc_acf( x, pars = pars, regex_pars = regex_pars, facet_args = facet_args, lags = lags, size = size, style = "line" ) } #' @rdname MCMC-diagnostics #' @export mcmc_acf_bar <- function(x, pars = character(), regex_pars = character(), ..., facet_args = list(), lags = 20) { check_ignored_arguments(...) .mcmc_acf( x, pars = pars, regex_pars = regex_pars, facet_args = facet_args, lags = lags, style = "bar" ) } # internal ---------------------------------------------------------------- #' Convert numeric vector of diagnostic values to a factor #' #' @param x A numeric vector. #' @param breaks A numeric vector of length two. The resulting factor variable #' will have three levels ('low', 'ok', and 'high') corresponding to ( #' `x <= breaks[1]`, `breaks[1] < x <= breaks[2]`, `x > breaks[2]`). #' @return A factor the same length as `x` with three levels. #' @noRd diagnostic_factor <- function(x, breaks, ...) { UseMethod("diagnostic_factor") } diagnostic_factor.rhat <- function(x, breaks = c(1.05, 1.1)) { cut(x, breaks = c(-Inf, breaks, Inf), labels = c("low", "ok", "high"), ordered_result = FALSE) } diagnostic_factor.neff_ratio <- function(x, breaks = c(0.1, 0.5)) { cut(x, breaks = c(-Inf, breaks, Inf), labels = c("low", "ok", "high"), ordered_result = FALSE) } diagnostic_data_frame <- function(x) { x <- auto_name(sort(x)) stopifnot(!anyDuplicated(names(x))) diagnostic <- class(x)[1] d <- tibble::tibble( diagnostic = diagnostic, parameter = factor(seq_along(x), labels = names(x)), value = as.numeric(x), rating = diagnostic_factor(x)) labels <- diagnostic_color_labels[[diagnostic]] d$description <- as.character(labels[d$rating]) d } auto_name <- function(xs) { if (is.null(names(xs))) { names(xs) <- zero_pad_int(seq_along(xs)) } xs } # c(1, 2, 10, 20, 100) => c("001", "002", "010", "020", "100") zero_pad_int <- function(xs) { formatter <- paste0("%0", max(nchar(xs)), "d") sprintf(formatter, xs) } diagnostic_points <- function(size = NULL) { args <- list(shape = 21, na.rm = TRUE) do.call("geom_point", c(args, size = size)) } # Functions wrapping around scale_color_manual() and scale_fill_manual(), used to # color the intervals by rhat value scale_color_diagnostic <- function(diagnostic = c("rhat", "neff")) { d <- match.arg(diagnostic) diagnostic_color_scale(d, aesthetic = "color") } scale_fill_diagnostic <- function(diagnostic = c("rhat", "neff")) { d <- match.arg(diagnostic) diagnostic_color_scale(d, aesthetic = "fill") } diagnostic_color_scale <- function(diagnostic = c("rhat", "neff_ratio"), aesthetic = c("color", "fill")) { diagnostic <- match.arg(diagnostic) aesthetic <- match.arg(aesthetic) dc <- diagnostic_colors(diagnostic, aesthetic) do.call( match.fun(paste0("scale_", aesthetic, "_manual")), list( name = NULL, drop = FALSE, values = dc$values, labels = dc$color_labels ) ) } diagnostic_colors <- function(diagnostic = c("rhat", "neff_ratio"), aesthetic = c("color", "fill")) { diagnostic <- match.arg(diagnostic) aesthetic <- match.arg(aesthetic) color_levels <- c("light", "mid", "dark") if (diagnostic == "neff_ratio") { color_levels <- rev(color_levels) } if (aesthetic == "color") { color_levels <- paste0(color_levels, "_highlight") } color_labels <- diagnostic_color_labels[[diagnostic]] list(diagnostic = diagnostic, aesthetic = aesthetic, color_levels = color_levels, color_labels = color_labels, values = set_names(get_color(color_levels), c("low", "ok", "high"))) } diagnostic_color_labels <- list( rhat = c( low = expression(hat(R) <= 1.05), ok = expression(hat(R) <= 1.10), high = expression(hat(R) > 1.10) ), neff_ratio = c( low = expression(N[eff] / N <= 0.1), ok = expression(N[eff] / N <= 0.5), high = expression(N[eff] / N > 0.5) ) ) # set x-axis breaks based on rhat values set_rhat_breaks <- function(rhat) { br <- c(1, 1.05) if (any(rhat > 1.05)) { br <- c(br, 1.1) } for (k in c(1.5, 2)) { if (any(rhat > k)) { br <- c(br, k) } } if (max(rhat) >= max(br) + .1) { br <- c(br, round(max(rhat), 2)) } br } # drop NAs from a vector and issue warning drop_NAs_and_warn <- function(x) { is_NA <- is.na(x) if (anyNA(x)) { warn(paste0( "Dropped ", sum(is_NA), " NAs from '", deparse(substitute(x)), "'." )) } x[!is_NA] } # Autocorrelation plot (either bar or line) # @param size passed to geom_line() if style="line" .mcmc_acf <- function(x, pars = character(), regex_pars = character(), facet_args = list(), lags = 25, style = c("bar", "line"), size = NULL) { style <- match.arg(style) x <- prepare_mcmc_array(x, pars, regex_pars) plot_data <- acf_data(x = x, lags = lags) if (num_chains(x) > 1) { facet_args$facets <- "Chain ~ Parameter" facet_fun <- "facet_grid" } else { # 1 chain facet_args$facets <- "Parameter" facet_fun <- "facet_wrap" } graph <- ggplot(plot_data, aes_(x = ~ Lag, y = ~ AC)) + bayesplot_theme_get() if (style == "bar") { graph <- graph + geom_bar( position = "identity", stat = "identity", size = 0.2, fill = get_color("l"), color = get_color("lh"), width = 1 ) + hline_0(size = 0.25, color = get_color("dh")) } else { graph <- graph + hline_0(size = 0.25, color = get_color("m")) + geom_segment( aes_(xend = ~ Lag), yend = 0, color = get_color("l"), size = 0.2 ) + do.call( "geom_line", args = c(list(color = get_color("d")), size = size) ) } graph + do.call(facet_fun, facet_args) + scale_y_continuous( limits = c(min(0, plot_data$AC), 1.05), breaks = c(0, 0.5, 1) ) + scale_x_continuous( limits = c(-0.5, lags + 0.5), breaks = function(x) as.integer(pretty(x, n = 3)), expand = c(0, 0) ) + labs(x = "Lag", y = "Autocorrelation") + force_axes_in_facets() } # Prepare data for autocorr plot # @param x object returned by prepare_mcmc_array # @param lags user's 'lags' argument acf_data <- function(x, lags) { stopifnot(is_mcmc_array(x)) n_iter <- num_iters(x) n_chain <- num_chains(x) n_param <- num_params(x) n_lags <- lags + 1 if (n_lags >= n_iter) { abort(paste0("Too few iterations for lags=", lags, ".")) } data <- melt_mcmc(x) ac_list <- tapply( data[["Value"]], # INDEX = list(data[["Chain"]], data[["Parameter"]]), INDEX = with(data, list(Chain, Parameter)), FUN = function(x, lag.max) { stats::acf(x, lag.max = lag.max, plot = FALSE)$acf[, , 1] }, lag.max = lags, simplify = FALSE ) data.frame( Chain = rep(rep(1:n_chain, each = n_lags), times = n_param), Parameter = factor(rep(1:n_param, each = n_chain * n_lags), labels = levels(data[["Parameter"]])), Lag = rep(seq(0, lags), times = n_chain * n_param), AC = do.call("c", ac_list) ) } ## interal [classes / objects] ------------------------------------------------ new_rhat <- function(x) { # Convert a 1-d arrays to a vectors if (is.array(x) && length(dim(x)) == 1) { x <- as.vector(x) } validate_rhat(as_rhat(x)) } validate_rhat <- function(x) { stopifnot(is.numeric(x), !is.list(x), !is.array(x)) if (any(x < 0, na.rm = TRUE)) { abort("All 'rhat' values must be positive.") } x } as_rhat <- function(x) { structure(x, class = c("rhat", "numeric"), names = names(x)) } #' Indexing method -- needed so that sort, etc. don't strip names. #' @export #' @keywords internal #' @noRd `[.rhat` <- function (x, i, j, drop = TRUE, ...) { as_rhat(NextMethod()) } new_neff_ratio <- function(x) { # Convert a 1-d arrays to a vectors if (is.array(x) && length(dim(x)) == 1) { x <- as.vector(x) } as_neff_ratio(validate_neff_ratio(x)) } validate_neff_ratio <- function(x) { stopifnot(is.numeric(x), !is.list(x), !is.array(x)) if (any(x < 0, na.rm = TRUE)) { abort("All neff ratios must be positive.") } x } as_neff_ratio <- function(x) { structure(x, class = c("neff_ratio", "numeric"), names = names(x)) } #' Indexing method -- needed so that sort, etc. don't strip names. #' @export #' @keywords internal #' @noRd `[.neff_ratio` <- function (x, i, j, drop = TRUE, ...) { as_neff_ratio(NextMethod()) } bayesplot/R/bayesplot-extractors.R0000644000176200001440000002126114057717550017013 0ustar liggesusers#' Extract quantities needed for plotting from model objects #' #' Generics and methods for extracting quantities needed for plotting from #' various types of model objects. Currently methods are provided for stanfit #' (**rstan**), CmdStanMCMC (**cmdstanr**), and stanreg (**rstanarm**) objects, #' but adding new methods should be relatively straightforward. #' #' @name bayesplot-extractors #' @param object The object to use. #' @param ... Arguments passed to individual methods. #' @param pars An optional character vector of parameter names. For #' `nuts_params()` these will be NUTS sampler parameter names rather than #' model parameters. If `pars` is omitted all parameters are included. #' #' @return #' \describe{ #' \item{`log_posterior()`}{ #' `log_posterior()` methods return a molten data frame (see [reshape2::melt()]). #' The data frame should have columns `"Iteration"` (integer), `"Chain"` #' (integer), and `"Value"` (numeric). See **Examples**, below. #' } #' \item{`nuts_params()`}{ #' `nuts_params()` methods return a molten data frame (see [reshape2::melt()]). #' The data frame should have columns `"Parameter"` (factor), `"Iteration"` #' (integer), `"Chain"` (integer), and `"Value"` (numeric). See **Examples**, below. #' } #' \item{`rhat()`, `neff_ratio()`}{ #' Methods return (named) vectors. #' } #' } #' #' @seealso [MCMC-nuts], [MCMC-diagnostics] #' #' @examples #' \dontrun{ #' library(rstanarm) #' fit <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) #' #' np <- nuts_params(fit) #' head(np) #' tail(np) #' #' lp <- log_posterior(fit) #' head(lp) #' tail(lp) #' } #' NULL # log_posterior ----------------------------------------------------------- #' @rdname bayesplot-extractors #' @export log_posterior <- function(object, ...) { UseMethod("log_posterior") } # nuts_params ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export nuts_params <- function(object, ...) { UseMethod("nuts_params") } # rhat ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export rhat <- function(object, ...) { UseMethod("rhat") } # neff_ratio ------------------------------------------------------------- #' @rdname bayesplot-extractors #' @export neff_ratio <- function(object, ...) { UseMethod("neff_ratio") } #' @rdname bayesplot-extractors #' @export #' @method log_posterior stanfit #' @param inc_warmup A logical scalar (defaulting to `FALSE`) indicating #' whether to include warmup draws, if applicable. #' log_posterior.stanfit <- function(object, inc_warmup = FALSE, ...) { lp <- rstan::get_logposterior(object, inc_warmup = inc_warmup, ...) lp <- lapply(lp, as.array) lp <- set_names(reshape2::melt(lp), c("Iteration", "Value", "Chain")) validate_df_classes(lp[, c("Chain", "Iteration", "Value")], c("integer", "integer", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method log_posterior stanreg #' log_posterior.stanreg <- function(object, inc_warmup = FALSE, ...) { log_posterior.stanfit(object$stanfit, inc_warmup = inc_warmup, ...) } #' @rdname bayesplot-extractors #' @export #' @method log_posterior CmdStanMCMC log_posterior.CmdStanMCMC <- function(object, inc_warmup = FALSE, ...) { lp <- object$draws("lp__", inc_warmup = inc_warmup) lp <- reshape2::melt(lp) lp$variable <- NULL lp <- dplyr::rename_with(lp, capitalize_first) validate_df_classes(lp[, c("Chain", "Iteration", "Value")], c("integer", "integer", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params stanfit nuts_params.stanfit <- function(object, pars = NULL, inc_warmup = FALSE, ...) { suggested_package("rstan") np <- rstan::get_sampler_params(object, inc_warmup = inc_warmup) nuts_params.list(np, pars = pars, ...) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params stanreg #' nuts_params.stanreg <- function(object, pars = NULL, inc_warmup = FALSE, ...) { nuts_params.stanfit(object$stanfit, pars = pars, inc_warmup = inc_warmup, ...) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params list nuts_params.list <- function(object, pars = NULL, ...) { if (!all(sapply(object, is.matrix))) { abort("All list elements should be matrices.") } dd <- lapply(object, dim) if (length(unique(dd)) != 1) { abort("All matrices in the list must have the same dimensions.") } nms <- lapply(object, colnames) if (length(unique(nms)) != 1) { abort("All matrices in the list must have the same column names.") } if (length(pars)) { object <- lapply(object, function(x) x[, pars, drop = FALSE]) } out <- reshape2::melt(object) out <- set_names(out, c("Iteration", "Parameter", "Value", "Chain")) validate_df_classes(out[, c("Chain", "Iteration", "Parameter", "Value")], c("integer", "integer", "factor", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method nuts_params CmdStanMCMC nuts_params.CmdStanMCMC <- function(object, pars = NULL, ...) { arr <- object$sampler_diagnostics() if (!is.null(pars)) { arr <- arr[,, pars] } out <- reshape2::melt(arr) colnames(out)[colnames(out) == "variable"] <- "parameter" out <- dplyr::rename_with(out, capitalize_first) validate_df_classes(out[, c("Chain", "Iteration", "Parameter", "Value")], c("integer", "integer", "factor", "numeric")) } #' @rdname bayesplot-extractors #' @export #' @method rhat stanfit #' rhat.stanfit <- function(object, pars = NULL, ...) { suggested_package("rstan") s <- if (!is.null(pars)) { rstan::summary(object, pars = pars, ...) } else { rstan::summary(object, ...) } validate_rhat(s$summary[, "Rhat"]) } #' @rdname bayesplot-extractors #' @export #' @method rhat stanreg #' @template args-regex_pars #' rhat.stanreg <- function(object, pars = NULL, regex_pars = NULL, ...) { suggested_package("rstanarm") r <- summary(object, pars = pars, regex_pars = regex_pars, ...)[, "Rhat"] r <- validate_rhat(r) if (!is.null(pars) || !is.null(regex_pars)) { return(r) } r[!names(r) %in% c("mean_PPD", "log-posterior")] } #' @rdname bayesplot-extractors #' @export #' @method rhat CmdStanMCMC rhat.CmdStanMCMC <- function(object, pars = NULL, ...) { .rhat <- utils::getFromNamespace("rhat", "posterior") s <- object$summary(pars, rhat = .rhat)[, c("variable", "rhat")] r <- setNames(s$rhat, s$variable) r <- validate_rhat(r) r[!names(r) %in% "lp__"] } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio stanfit #' neff_ratio.stanfit <- function(object, pars = NULL, ...) { suggested_package("rstan") s <- if (!is.null(pars)) { rstan::summary(object, pars = pars, ...) } else { rstan::summary(object, ...) } tss <- nrow(as.matrix(object, pars = "lp__")) ratio <- s$summary[, "n_eff"] / tss validate_neff_ratio(ratio) } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio stanreg #' neff_ratio.stanreg <- function(object, pars = NULL, regex_pars = NULL, ...) { suggested_package("rstanarm") s <- summary(object, pars = pars, regex_pars = regex_pars, ...) ess <- s[, "n_eff"] tss <- attr(s, "posterior_sample_size") ratio <- ess / tss ratio <- validate_neff_ratio(ratio) if (!is.null(pars) || !is.null(regex_pars)) { return(ratio) } ratio[!names(ratio) %in% c("mean_PPD", "log-posterior")] } #' @rdname bayesplot-extractors #' @export #' @method neff_ratio CmdStanMCMC neff_ratio.CmdStanMCMC <- function(object, pars = NULL, ...) { s <- object$summary(pars, "n_eff" = "ess_basic")[, c("variable", "n_eff")] ess <- setNames(s$n_eff, s$variable) tss <- prod(dim(object$draws())[1:2]) ratio <- ess / tss ratio <- validate_neff_ratio(ratio) ratio[!names(ratio) %in% "lp__"] } # internals --------------------------------------------------------------- # Check that variables in a data.frame have certain classes # @param x data.frame # @param classes character vector of classes (in the order of the column in x) # @return x, unless an error is thrown # validate_df_classes <- function(x, classes = character()) { stopifnot( is.data.frame(x), is.character(classes), ncol(x) >= 1, ncol(x) == length(classes) ) for (j in 1:ncol(x)) { if (!inherits(x[, j], classes[j])) { abort(paste0(colnames(x)[j], " does not have class ", classes[j])) } } x } # capitalize first letter in a string only capitalize_first <- function(name) { name <- tolower(name) # in case whole string is capitalized substr(name, 1, 1) <- toupper(substr(name, 1, 1)) name } bayesplot/R/ppc-overview.R0000644000176200001440000001335414057717550015247 0ustar liggesusers#' Graphical posterior predictive checking #' #' @name PPC-overview #' @aliases PPC #' @family PPCs #' #' @description #' The **bayesplot** PPC module provides various plotting functions for creating #' graphical displays comparing observed data to simulated data from the #' posterior (or prior) predictive distribution. See below for a brief #' discussion of the ideas behind posterior predictive checking, a description #' of the structure of this package, and tips on providing an interface to #' **bayesplot** from another package. #' #' @details #' The idea behind posterior predictive checking is simple: if a model is a good #' fit then we should be able to use it to generate data that looks a lot like #' the data we observed. #' #' \subsection{Posterior predictive distribution}{ #' To generate the data used for posterior predictive checks we simulate from #' the *posterior predictive distribution*. The posterior predictive #' distribution is the distribution of the outcome variable implied by a model #' after using the observed data \eqn{y} (a vector of outcome values), and #' typically predictors \eqn{X}, to update our beliefs about the unknown #' parameters \eqn{\theta} in the model. For each draw of the parameters #' \eqn{\theta} from the posterior distribution #' \eqn{p(\theta \,|\, y, X)}{p(\theta | y, X)} #' we generate an entire vector of outcomes. The result is #' an \eqn{S \times N}{S x N} matrix of simulations, where \eqn{S} is the the #' size of the posterior sample (number of draws from the posterior #' distribution) and \eqn{N} is the number of data points in \eqn{y}. That is, #' each row of the matrix is an individual "replicated" dataset of \eqn{N} #' observations. #' } #' \subsection{Notation}{ #' When simulating from the posterior predictive distribution we can use either #' the same values of the predictors \eqn{X} that we used when fitting the model #' or new observations of those predictors. When we use the same values of #' \eqn{X} we denote the resulting simulations by \eqn{y^{rep}}{yrep} as they #' can be thought of as *replications* of the outcome \eqn{y} rather than #' predictions for future observations. This corresponds to the notation from #' Gelman et. al. (2013) and is the notation used throughout the documentation #' for this package. #' } #' \subsection{Graphical posterior predictive checking}{ #' Using the datasets \eqn{y^{rep}}{yrep} drawn from the posterior predictive #' distribution, the functions in the **bayesplot** package produce various #' graphical displays comparing the observed data \eqn{y} to the replications. #' For a more thorough discussion of posterior predictive checking see #' Chapter 6 of Gelman et. al. (2013). #' } #' \subsection{Prior predictive checking}{ #' To use **bayesplot** for *prior* predictive checks you can simply use draws #' from the prior predictive distribution instead of the posterior predictive #' distribution. See Gabry et al. (2019) for more on prior predictive checking #' and when it is reasonable to compare the prior predictive distribution to the #' observed data. If you want to avoid using the observed data for prior #' predictive checks, then the `y` argument to the PPC plotting functions can be #' used to provide plausible or implausible `y` values that you want to compare #' to the prior predictive realizations. #' } #' #' @section PPC plotting functions: The plotting functions for prior and #' posterior predictive checking are organized into several categories, each #' with its own documentation: #' * [Distributions][PPC-distributions]: Histograms, kernel density #' estimates, boxplots, and other plots comparing the empirical distribution #' of data `y` to the distributions of individual simulated datasets (rows) #' in `yrep`. #' * [Statistics][PPC-test-statistics]: The distribution of a statistic, #' or a pair of statistics, over the simulated datasets (rows) in `yrep` #' compared to value of the statistic(s) computed from `y`. #' * [Intervals][PPC-intervals]: Interval estimates of `yrep` with `y` #' overlaid. The x-axis variable can be optionally specified by the user #' (e.g. to plot against a predictor variable or over time). #' * [Predictive errors][PPC-errors]: Plots of predictive errors #' (`y - yrep`) computed from `y` and each of the simulated datasets (rows) #' in `yrep`. For binomial models binned error plots are also available. #' * [Scatterplots][PPC-scatterplots]: Scatterplots (and similar #' visualizations) of the data `y` vs. individual simulated datasets #' (rows) in `yrep`, or vs. the average value of the distributions of each #' data point (columns) in `yrep`. #' * [Plots for discrete outcomes][PPC-discrete]: PPC functions that can #' only be used if `y` and `yrep` are discrete. For example, rootograms for #' count outcomes and bar plots for ordinal, categorical, and #' multinomial outcomes. #' * [LOO predictive checks][PPC-loo]: PPC functions for predictive checks #' based on (approximate) leave-one-out (LOO) cross-validation. #' * [Censored data][PPC-censoring]: PPC functions comparing the empirical #' distribution of censored data `y` to the distributions of individual #' simulated datasets (rows) in `yrep`. #' #' @section Providing an interface for predictive checking from another package: #' #' In addition to the various plotting functions, the **bayesplot** package #' provides the S3 generic [pp_check()]. Authors of \R packages for #' Bayesian inference are encouraged to define `pp_check()` methods for the #' fitted model objects created by their packages. See the package vignettes for #' more details and a simple example, and see the **rstanarm** and **brms** #' packages for full examples of `pp_check()` methods. #' #' @template reference-vis-paper #' @templateVar bdaRef (Ch. 6) #' @template reference-bda #' NULL bayesplot/R/mcmc-diagnostics-nuts.R0000644000176200001440000004242514057717550017035 0ustar liggesusers#' Diagnostic plots for the No-U-Turn-Sampler (NUTS) #' #' Diagnostic plots for the No-U-Turn-Sampler (NUTS), the default MCMC algorithm #' used by [Stan](https://mc-stan.org). See the **Plot Descriptions** section, #' below. #' #' @name MCMC-nuts #' @aliases NUTS #' @family MCMC #' #' @param x A molten data frame of NUTS sampler parameters, either created by #' [nuts_params()] or in the same form as the object returned by #' [nuts_params()]. #' @param lp A molten data frame of draws of the log-posterior or, more #' commonly, of a quantity equal to the log-posterior up to a constant. #' `lp` should either be created via [log_posterior()] or be an #' object with the same form as the object returned by #' [log_posterior()]. #' @param chain A positive integer for selecting a particular chain. The default #' (`NULL`) is to merge the chains before plotting. If `chain = k` #' then the plot for chain `k` is overlaid (in a darker shade but with #' transparency) on top of the plot for all chains. The `chain` argument #' is not used by `mcmc_nuts_energy()`. #' @param ... Currently ignored. #' #' @return A gtable object (the result of calling #' [gridExtra::arrangeGrob()]) created from several ggplot objects, #' except for `mcmc_nuts_energy()`, which returns a ggplot object. #' #' @section Quick Definitions: #' For more details see Stan Development Team (2016) and Betancourt (2017). #' * `accept_stat__`: the average acceptance probabilities of all #' possible samples in the proposed tree. #' * `divergent__`: the number of leapfrog transitions with diverging #' error. Because NUTS terminates at the first divergence this will be either #' 0 or 1 for each iteration. #' * `stepsize__`: the step size used by NUTS in its Hamiltonian #' simulation. #' * `treedepth__`: the depth of tree used by NUTS, which is the log #' (base 2) of the number of leapfrog steps taken during the Hamiltonian #' simulation. #' * `energy__`: the value of the Hamiltonian (up to an additive #' constant) at each iteration. #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_nuts_acceptance()`}{ #' Three plots: #' * Histogram of `accept_stat__` with vertical lines indicating the #' mean (solid line) and median (dashed line). #' * Histogram of `lp__` with vertical #' lines indicating the mean (solid line) and median (dashed line). #' * Scatterplot of `accept_stat__` vs `lp__`. #' } #' #' \item{`mcmc_nuts_divergence()`}{ #' Two plots: #' * Violin plots of `lp__|divergent__=1` and `lp__|divergent__=0`. #' * Violin plots of `accept_stat__|divergent__=1` and #' `accept_stat__|divergent__=0`. #' } #' #' \item{`mcmc_nuts_stepsize()`}{ #' Two plots: #' * Violin plots of `lp__` by chain ordered by `stepsize__` value. #' * Violin plots of `accept_stat__` by chain ordered by `stepsize__` value. #' } #' #' \item{`mcmc_nuts_treedepth()`}{ #' Three plots: #' * Violin plots of `lp__` by value of `treedepth__`. #' * Violin plots of `accept_stat__` by value of `treedepth__`. #' * Histogram of `treedepth__`. #' } #' #' \item{`mcmc_nuts_energy()`}{ #' Overlaid histograms showing `energy__` vs the change in #' `energy__`. See Betancourt (2016) for details. #' } #' } #' #' @template reference-betancourt #' @template reference-nuts #' @template reference-stan-manual #' #' @seealso #' * The [Visual MCMC Diagnostics](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) #' vignette. #' * Several other plotting functions are not NUTS-specific but take optional #' extra arguments if the model was fit using NUTS: #' * [mcmc_trace()]: show divergences as tick marks below the #' trace plot. #' * [mcmc_parcoord()]: change the color/size/transparency of lines #' corresponding to divergences. #' * [mcmc_scatter()]: change the color/size/shape of points #' corresponding to divergences. #' * [mcmc_pairs()]: change the color/size/shape of points #' corresponding divergences and/or max treedepth saturation. #' #' @examples #' \dontrun{ #' library(ggplot2) #' library(rstanarm) #' fit <- stan_glm(mpg ~ wt + am, data = mtcars, iter = 1000, refresh = 0) #' np <- nuts_params(fit) #' lp <- log_posterior(fit) #' #' color_scheme_set("brightblue") #' mcmc_nuts_acceptance(np, lp) #' mcmc_nuts_acceptance(np, lp, chain = 2) #' #' mcmc_nuts_divergence(np, lp) #' mcmc_nuts_stepsize(np, lp) #' mcmc_nuts_treedepth(np, lp) #' #' color_scheme_set("red") #' mcmc_nuts_energy(np) #' mcmc_nuts_energy(np, merge_chains = TRUE, binwidth = .15) #' mcmc_nuts_energy(np) + #' facet_wrap(~ Chain, nrow = 1) + #' coord_fixed(ratio = 150) + #' ggtitle("NUTS Energy Diagnostic") #' } #' NULL #' @rdname MCMC-nuts #' @export #' @param binwidth An optional value passed to [ggplot2::geom_histogram()] to #' override the default binwidth. #' mcmc_nuts_acceptance <- function(x, lp, chain = NULL, ..., binwidth = NULL) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) n_chain <- length(unique(lp$Chain)) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") data <- suppressWarnings( dplyr::bind_rows(accept_stat, data.frame(lp, Parameter = "lp__")) ) grp_par <- group_by(data, .data$Parameter) stats_par <- summarise(grp_par, Mean = mean(.data$Value), Median = median(.data$Value)) hists <- ggplot(data, aes_(x = ~ Value, y = ~ ..density..)) + geom_histogram( fill = get_color("l"), color = get_color("lh"), size = .25, na.rm = TRUE, binwidth = binwidth ) + bayesplot_theme_get() if (!overlay_chain) { hists <- hists + geom_vline( aes_(xintercept = ~ Mean), data = stats_par, color = get_color("dh") ) + geom_vline( aes_(xintercept = ~ Median), data = stats_par, color = get_color("d"), linetype = 2 ) } hists <- hists + dont_expand_y_axis(c(0.005, 0)) + facet_wrap(~ Parameter, scales = "free") + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) + xaxis_title(FALSE) scatter <- ggplot(NULL) + geom_point( aes_(x = ~ accept_stat$Value, y = ~ lp$Value), alpha = 0.75, shape = 21, fill = get_color(ifelse(overlay_chain, "l", "m")), color = get_color(ifelse(overlay_chain, "lh", "mh")) ) + labs(x = "accept_stat__", y = "lp__") + bayesplot_theme_get() if (overlay_chain) { hists <- hists + geom_histogram( data = dplyr::filter(data, .data$Chain == chain), fill = get_color("d"), color = NA, alpha = 0.5, na.rm = TRUE, binwidth = binwidth ) scatter <- scatter + geom_point( aes_(x = ~ accept_stat$Value[accept_stat$Chain == chain], y = ~ lp$Value[lp$Chain == chain]), color = get_color("d"), alpha = 0.5 ) } nuts_plot <- gridExtra::arrangeGrob( hists, gridExtra::arrangeGrob(empty_grob()), gridExtra::arrangeGrob( empty_grob(), scatter, empty_grob(), ncol = 3, widths = c(1, 3, 1) ), nrow = 3, heights = c(1, 0.1, 1) ) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_divergence <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") divergent <- dplyr::filter(x, .data$Parameter == "divergent__") divergent$Value <- factor(divergent$Value, levels = c(0, 1), labels = c("No divergence", "Divergence")) violin_lp_data <- data.frame(divergent, lp = lp$Value) violin_lp <- ggplot(violin_lp_data, aes_(x = ~ Value, y = ~ lp)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("lp__") + xaxis_title(FALSE) + bayesplot_theme_get() violin_accept_stat_data <- data.frame(divergent, as = accept_stat$Value) violin_accept_stat <- ggplot(violin_accept_stat_data, aes_(x = ~ Value, y = ~ as)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("accept_stat__") + scale_y_continuous(limits = c(NA, 1.05)) + xaxis_title(FALSE) + bayesplot_theme_get() div_count <- table(divergent$Value)[[2]] div_text <- ngettext(div_count, "divergence", "divergences") div_count_label <- paste(div_count, div_text) if (!is.null(chain)) { violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) div_count_by_chain <- table(divergent$Value, divergent$Chain)["Divergence", chain] div_count_label <- paste0(div_count_label, " (", div_count_by_chain, " from chain ", chain, ")") } violin_lp <- violin_lp + labs(subtitle = div_count_label) nuts_plot <- gridExtra::arrangeGrob(violin_lp, violin_accept_stat, nrow = 2) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_stepsize <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) stepsize <- dplyr::filter(x, .data$Parameter == "stepsize__") accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") stepsize_by_chain <- stepsize %>% group_by(.data$Chain) %>% summarise(ss = dplyr::first(.data$Value)) stepsize_labels_text <- stepsize_by_chain %>% arrange(.data$ss) %>% mutate(value = format(round(.data$ss, 3), digits = 3), label = paste0(.data$value, "\n(chain ", .data$Chain, ")")) %>% pull() stepsize_labels <- scale_x_discrete(labels = stepsize_labels_text) violin_lp_data <- dplyr::left_join(lp, stepsize_by_chain, by = "Chain") violin_lp <- ggplot(violin_lp_data, aes_(x = ~as.factor(ss), y = ~Value)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("lp__") + stepsize_labels + xaxis_title(FALSE) + bayesplot_theme_get() violin_accept_stat_data <- dplyr::left_join(accept_stat, stepsize_by_chain, by = "Chain") violin_accept_stat <- ggplot(violin_accept_stat_data, aes_(x = ~as.factor(ss), y = ~Value)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + ylab("accept_stat__") + scale_y_continuous(limits = c(NA, 1.05)) + stepsize_labels + xaxis_title(FALSE) + bayesplot_theme_get() if (!is.null(chain)) { violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) } nuts_plot <- gridExtra::arrangeGrob(violin_lp, violin_accept_stat, nrow = 2) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export mcmc_nuts_treedepth <- function(x, lp, chain = NULL, ...) { suggested_package("gridExtra") check_ignored_arguments(...) x <- validate_nuts_data_frame(x, lp) chain <- validate_enough_chains(chain, num_chains(x)) overlay_chain <- !is.null(chain) treedepth <- dplyr::filter(x, .data$Parameter == "treedepth__") accept_stat <- dplyr::filter(x, .data$Parameter == "accept_stat__") hist_td <- ggplot(treedepth, aes_(x = ~ Value, y = ~ ..density..)) + geom_histogram( fill = get_color("l"), color = get_color("lh"), size = .2, na.rm = TRUE, binwidth = 1 ) + xlab("treedepth__") + bayesplot_theme_get() + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) violin_lp_data <- data.frame(treedepth, lp = lp$Value) violin_lp <- ggplot(violin_lp_data, aes_(x = ~ factor(Value), y = ~ lp)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + labs(x = "treedepth__", y = "lp__") + bayesplot_theme_get() violin_accept_stat_data <- data.frame(treedepth, as = accept_stat$Value) violin_accept_stat <- ggplot(violin_accept_stat_data, aes_(x = ~ factor(Value), y = ~ as)) + geom_violin(fill = get_color("l"), color = get_color("lh")) + labs(x = "treedepth__", y = "accept_stat__") + scale_y_continuous(breaks = c(0, 0.5, 1)) + bayesplot_theme_get() if (overlay_chain) { hist_td <- hist_td + geom_histogram( data = dplyr::filter(treedepth, .data$Chain == chain), fill = get_color("d"), color = NA, alpha = 0.5, na.rm = TRUE, binwidth = 1 ) + dont_expand_y_axis() violin_lp <- violin_lp + chain_violin(violin_lp_data, chain) violin_accept_stat <- violin_accept_stat + chain_violin(violin_accept_stat_data, chain) } nuts_plot <- gridExtra::arrangeGrob( gridExtra::arrangeGrob( violin_lp, violin_accept_stat, nrow = 1 ), gridExtra::arrangeGrob( empty_grob() ), gridExtra::arrangeGrob( empty_grob(), hist_td, empty_grob(), ncol = 3, widths = c(1, 3, 1) ), nrow = 3, heights = c(1, 0.1, 1) ) as_bayesplot_grid(nuts_plot) } #' @rdname MCMC-nuts #' @export #' @param alpha For `mcmc_nuts_energy()` only, the transparency (alpha) level #' in `[0,1]` used for the overlaid histogram. #' @param merge_chains For `mcmc_nuts_energy()` only, should all chains be #' merged or displayed separately? The default is `FALSE`, i.e., to show #' the chains separately. #' mcmc_nuts_energy <- function(x, ..., binwidth = NULL, alpha = 0.5, merge_chains = FALSE) { check_ignored_arguments(...) x <- validate_nuts_data_frame(x) energy <- dplyr::filter(x, .data$Parameter == "energy__") # lag() (stats::lag()) here doesn't work, but dplyr::lag() does data <- energy %>% group_by(.data$Chain) %>% mutate( Ediff = .data$Value - dplyr::lag(.data$Value), E_centered = .data$Value - mean(.data$Value), Ediff_centered = .data$Ediff - mean(.data$Ediff, na.rm = TRUE)) fills <- set_names(get_color(c("l", "m")), c("E_fill", "Ediff_fill")) clrs <- set_names(get_color(c("lh", "mh")), c("E_fill", "Ediff_fill")) aes_labs <- c(expression(pi[E]), expression(pi[paste(Delta, E)])) graph <- ggplot(data, aes_(y = ~ ..density..)) + geom_histogram( aes_( x = ~ Ediff_centered, fill = ~ "Ediff_fill", color = ~ "Ediff_fill" ), size = 0.25, na.rm = TRUE, binwidth = binwidth ) + geom_histogram( aes_( x = ~ E_centered, fill = ~ "E_fill", color = ~ "E_fill" ), size = 0.25, na.rm = TRUE, alpha = alpha, binwidth = binwidth ) + scale_fill_manual("", values = fills, labels = aes_labs) + scale_color_manual("", values = clrs, labels = aes_labs) + dont_expand_y_axis(c(0.005, 0)) + scale_x_continuous(expand = c(0.2, 0)) + labs(y = NULL, x = expression(E - bar(E))) + bayesplot_theme_get() + space_legend_keys() + theme(legend.text = element_text(size = rel(1.1))) + yaxis_text(FALSE) + yaxis_title(FALSE) + yaxis_ticks(FALSE) if (merge_chains) { return(graph) } graph + facet_wrap(~ Chain) + force_axes_in_facets() } # internal ---------------------------------------------------------------- validate_enough_chains <- function(chain = NULL, n_chain) { if (!is.null(chain)) { stopifnot(chain >= 1) if (!isTRUE(n_chain >= chain)) { abort(paste("'chain' is", chain, "but only", n_chain, "chains found.")) } } chain } #' @param x data frame with nuts params #' @param lp data frame with `lp__` #' @noRd validate_nuts_data_frame <- function(x, lp) { if (!is.data.frame(x)) { abort("NUTS parameters should be in a data frame.") } valid_cols <- sort(c("Iteration", "Parameter", "Value", "Chain")) if (!identical(sort(colnames(x)), valid_cols)) { abort(paste( "NUTS parameter data frame must have columns:", paste(valid_cols, collapse = ", ") )) } if (missing(lp)) { lp <- NULL } if (!is.null(lp)) { if (!is.data.frame(lp)) { abort("lp should be in a data frame.") } valid_lp_cols <- sort(c("Iteration", "Value", "Chain")) if (!identical(sort(colnames(lp)), valid_lp_cols)) { abort(paste( "lp data frame must have columns:", paste(valid_lp_cols, collapse = ", ") )) } n_chain <- num_chains(x) n_lp_chain <- num_chains(lp) if (n_chain != n_lp_chain) { abort(paste( "Number of chains for NUTS parameters is", n_chain, "but number of chains for lp is", n_lp_chain )) } } x } chain_violin <- function(df, chain, fill = "d", color = NA, alpha = 0.5) { geom_violin( data = dplyr::filter(df, .data$Chain == chain), fill = get_color(fill), color = color, alpha = alpha ) } empty_grob <- function() { structure(list(), class = c("grob", "gDesc")) } bayesplot/R/pp_check.R0000644000176200001440000000564514057717550014401 0ustar liggesusers#' Posterior (or prior) predictive checks (S3 generic and default method) #' #' S3 generic with simple default method. The intent is to provide a generic so #' authors of other \R packages who wish to provide interfaces to the functions #' in **bayesplot** will be encouraged to include `pp_check()` methods in their #' package, preserving the same naming conventions for posterior (and prior) #' predictive checking across many \R packages for Bayesian inference. This is #' for the convenience of both users and developers. See the **Details** and #' **Examples** sections, below, and the package vignettes for examples of #' defining `pp_check()` methods. #' #' @export #' @param object Typically a fitted model object. The default method, however, #' takes `object` to be a `y` (outcome) vector. #' @param ... For the generic, arguments passed to individual methods. For the #' default method, these are additional arguments to pass to `fun`. #' @return The exact form of the value returned by `pp_check()` may vary by #' the class of `object`, but for consistency we encourage authors of #' methods to return the ggplot object created by one of **bayesplot**'s #' plotting functions. The default method returns the object returned by `fun`. #' #' @details A package that creates fitted model objects of class `"foo"` #' can include a method `pp_check.foo()` that prepares the appropriate #' inputs (`y`, `yrep`, etc.) for the **bayesplot** functions. The #' `pp_check.foo()` method may, for example, let the user choose between #' various plots, calling the functions from **bayesplot** internally as #' needed. See **Examples**, below, and the package vignettes. #' #' @examples #' # default method #' y <- example_y_data() #' yrep <- example_yrep_draws() #' pp_check(y, yrep[1:50,], ppc_dens_overlay) #' #' g <- example_group_data() #' pp_check(y, yrep, fun = "stat_grouped", group = g, stat = "median") #' #' # defining a method #' x <- list(y = rnorm(50), yrep = matrix(rnorm(5000), nrow = 100, ncol = 50)) #' class(x) <- "foo" #' pp_check.foo <- function(object, ..., type = c("multiple", "overlaid")) { #' y <- object[["y"]] #' yrep <- object[["yrep"]] #' switch(match.arg(type), #' multiple = ppc_hist(y, yrep[1:min(8, nrow(yrep)),, drop = FALSE]), #' overlaid = ppc_dens_overlay(y, yrep)) #' } #' pp_check(x) #' pp_check(x, type = "overlaid") #' pp_check <- function(object, ...) { UseMethod("pp_check") } #' @rdname pp_check #' @export #' @param yrep For the default method, a `yrep` matrix passed to `fun`. #' @param fun For the default method, the plotting function to call. Can be any #' of the [PPC] functions. The `"ppc_"` prefix can optionally be dropped if #' `fun` is specified as a string. #' pp_check.default <- function(object, yrep, fun, ...) { if (is.character(fun) && substr(fun, 1, 4) != "ppc_") { fun <- paste0("ppc_", fun) } .ppcfun <- match.fun(fun) .ppcfun(y = object, yrep = yrep, ...) } bayesplot/R/helpers-testthat.R0000644000176200001440000000123514057717550016114 0ustar liggesusersexpect_gg <- function(x) { testthat::expect_s3_class(x, "ggplot") invisible(ggplot_build(x)) } expect_gtable <- function(x) testthat::expect_s3_class(x, "gtable") expect_mcmc_array <- function(x) testthat::expect_true(is_mcmc_array(x)) expect_bayesplot_grid <- function(x) testthat::expect_true(is_bayesplot_grid(x)) #' Insert fake divergences for testing purposes #' #' @noRd #' @param np Data frame returned by `nuts_params()` #' @return `np` with every other iter marked as a divergence ensure_divergences <- function(np) { divs <- rep_len(c(0,1), length.out = sum(np$Parameter=="divergent__")) np$Value[np$Parameter=="divergent__"] <- divs return(np) } bayesplot/R/helpers-gg.R0000644000176200001440000000563614057717550014662 0ustar liggesusers# ggplot2 convenience functions for internal use -------------------------- #' Do nothing plotting geom #' #' Adding `geom_ignore()` to a ggplot will not affect its appearance. This #' function is useful for when plot elements should appear conditionally. #' #' @param ... arguments to a ggplot2 function to be ignored #' @noRd #' @examples #' # Draw a vertical line at zero (or do nothing) #' xs <- -2:2 #' maybe_vertical_line <- if (0 > min(xs) && 0 < max(xs)) { #' vline_0(color = "gray90", size = 0.5) #' } else { #' geom_ignore() #' } geom_ignore <- function(...) { geom_blank( mapping = NULL, data = NULL, show.legend = FALSE, inherit.aes = FALSE) } #' Wrappers for ggridges #' #' The "area ridges" are for use in `mcmc_areas()`. The scale of 1 and the #' identity statistic prevent the ridges from overlapping. #' `geom_density_ridges2()` draws closed polygons. #' #' @importFrom ggridges geom_density_ridges geom_density_ridges2 #' @noRd geom_area_ridges <- function(...) { ggridges::geom_density_ridges(..., stat = "identity", scale = .95) } geom_area_ridges2 <- function(...) { ggridges::geom_density_ridges2(..., stat = "identity", scale = .95) } #' Add new aesthetic mappings to a list of aesthetic mappings #' #' @param mapping a list of `uneval` aesthetic mappings (created by `aes_()`) #' @param ... additional mappings to add, e.g., `color = ~ parameter` #' @return the updated list #' @noRd modify_aes_ <- function(mapping, ...) { utils::modifyList(mapping, aes_(...)) } facet_wrap_parsed <- function(...) { facet_wrap(..., labeller = label_parsed) } dont_expand_y_axis <- function(expand = c(0,0)) { scale_y_continuous(expand = expand) } dont_expand_x_axis <- function(expand = c(0,0)) { scale_x_continuous(expand = expand) } dont_expand_axes <- function() { coord_cartesian(expand = FALSE) } force_axes_in_facets <- function() { thm <- bayesplot_theme_get() annotate( "segment", x = c(-Inf, -Inf), xend = c(Inf,-Inf), y = c(-Inf,-Inf), yend = c(-Inf, Inf), color = thm$axis.line$colour %||% thm$line$colour %||% "black", size = thm$axis.line$size %||% thm$line$size %||% 0.5 ) } force_x_axis_in_facets <- function() { thm <- bayesplot_theme_get() annotate( "segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf, color = thm$axis.line$colour %||% thm$line$colour %||% "black", size = thm$axis.line$size %||% thm$line$size %||% 0.5 ) } no_legend_spacing <- function() { theme(legend.spacing.y = unit(0, "cm")) } reduce_legend_spacing <- function(cm) { theme(legend.spacing.y = unit(-cm, "cm")) } space_legend_keys <- function(relative_size = 2, color = "white") { theme(legend.key = element_rect(size = rel(relative_size), color = color)) } # set aesthetic mapping for histograms depending on freq argument set_hist_aes <- function(freq = TRUE, ...) { if (freq) { aes_(x = ~ value, ...) } else { aes_(x = ~ value, y = ~ stat(density), ...) } } bayesplot/R/mcmc-intervals.R0000644000176200001440000006477614057717550015563 0ustar liggesusers#' Plot interval estimates from MCMC draws #' #' Plot central (quantile-based) posterior interval estimates from MCMC draws. #' See the **Plot Descriptions** section, below, for details. #' #' @name MCMC-intervals #' @family MCMC #' #' @template args-mcmc-x #' @template args-pars #' @template args-regex_pars #' @template args-transformations #' @param ... Currently unused. #' @param prob The probability mass to include in the inner interval (for #' `mcmc_intervals()`) or in the shaded region (for `mcmc_areas()`). The #' default is `0.5` (50% interval) and `1` for `mcmc_areas_ridges()`. #' @param prob_outer The probability mass to include in the outer interval. The #' default is `0.9` for `mcmc_intervals()` (90% interval) and #' `1` for `mcmc_areas()` and for `mcmc_areas_ridges()`. #' @param area_method How to constrain the areas in `mcmc_areas()`. The #' default is `"equal area"`, setting the density curves to have the same #' area. With `"equal height"`, the curves are scaled so that the highest #' points across the curves are the same height. The method `"scaled #' height"` tries a compromise between to the two: the heights from #' `"equal height"` are scaled using `height*sqrt(height)` #' @param point_est The point estimate to show. Either `"median"` (the #' default), `"mean"`, or `"none"`. #' @param inner_size,outer_size For `mcmc_intervals()`, the size of #' the inner and interval segments, respectively. #' @param point_size For `mcmc_intervals()`, the size of point estimate. #' @param rhat An optional numeric vector of R-hat estimates, with one element #' per parameter included in `x`. If `rhat` is provided, the intervals/areas #' and point estimates in the resulting plot are colored based on R-hat value. #' See [rhat()] for methods for extracting R-hat estimates. #' @template args-density-controls #' #' @template return-ggplot-or-data #' #' @section Plot Descriptions: #' \describe{ #' \item{`mcmc_intervals()`}{ #' Plots of uncertainty intervals computed from posterior draws with all #' chains merged. #' } #' \item{`mcmc_areas()`}{ #' Density plots computed from posterior draws with all chains merged, #' with uncertainty intervals shown as shaded areas under the curves. #' } #' \item{`mcmc_areas_ridges()`}{ #' Density plot, as in `mcmc_areas()`, but drawn with overlapping #' ridgelines. This plot provides a compact display of (hierarchically) #' related distributions. #' } #' } #' #' @examples #' set.seed(9262017) #' #' # load ggplot2 to use its functions to modify our plots #' library(ggplot2) #' #' # some parameter draws to use for demonstration #' x <- example_mcmc_draws(params = 6) #' dim(x) #' dimnames(x) #' #' color_scheme_set("brightblue") #' mcmc_intervals(x) #' mcmc_intervals(x, pars = c("beta[1]", "beta[2]")) #' mcmc_areas(x, regex_pars = "beta\\[[1-3]\\]", prob = 0.8) + #' labs( #' title = "Posterior distributions", #' subtitle = "with medians and 80% intervals" #' ) #' #' color_scheme_set("red") #' p <- mcmc_areas( #' x, #' pars = c("alpha", "beta[4]"), #' prob = 2/3, #' prob_outer = 0.9, #' point_est = "mean" #' ) #' plot(p) #' #' # control spacing at top and bottom of plot #' # see ?ggplot2::expansion #' p + scale_y_discrete( #' limits = c("beta[4]", "alpha"), #' expand = expansion(add = c(1, 2)) #' ) #' p + scale_y_discrete( #' limits = c("beta[4]", "alpha"), #' expand = expansion(add = c(.1, .3)) #' ) #' #' # relabel parameters #' p + scale_y_discrete( #' labels = c("alpha" = "param label 1", #' "beta[4]" = "param label 2") #') #' #' # relabel parameters and define the order #' p + scale_y_discrete( #' labels = c("alpha" = "param label 1", #' "beta[4]" = "param label 2"), #' limits = c("beta[4]", "alpha") #' ) #' #' # color by rhat value #' color_scheme_set("blue") #' fake_rhat_values <- c(1, 1.07, 1.3, 1.01, 1.15, 1.005) #' mcmc_intervals(x, rhat = fake_rhat_values) #' #' # get the dataframe that is used in the plotting functions #' mcmc_intervals_data(x) #' mcmc_intervals_data(x, rhat = fake_rhat_values) #' mcmc_areas_data(x, pars = "alpha") #' #' color_scheme_set("gray") #' p <- mcmc_areas(x, pars = c("alpha", "beta[4]"), rhat = c(1, 1.1)) #' p + legend_move("bottom") #' p + legend_move("none") # or p + legend_none() #' #' # Different area calculations #' b3 <- c("beta[1]", "beta[2]", "beta[3]") #' #' mcmc_areas(x, pars = b3, area_method = "equal area") + #' labs( #' title = "Curves have same area", #' subtitle = "A wide, uncertain interval is spread thin when areas are equal" #' ) #' #' mcmc_areas(x, pars = b3, area_method = "equal height") + #' labs( #' title = "Curves have same maximum height", #' subtitle = "Local curvature is clearer but more uncertain curves use more area" #' ) #' #' mcmc_areas(x, pars = b3, area_method = "scaled height") + #' labs( #' title = "Same maximum heights but heights scaled by square-root", #' subtitle = "Compromise: Local curvature is accentuated and less area is used" #' ) #' #' \donttest{ #' # apply transformations #' mcmc_intervals( #' x, #' pars = c("beta[2]", "sigma"), #' transformations = list("sigma" = "log", "beta[2]" = function(x) x + 3) #' ) #' #' # apply same transformation to all selected parameters #' mcmc_intervals(x, regex_pars = "beta", transformations = "exp") #' } #' #' \dontrun{ #' # example using fitted model from rstanarm package #' library(rstanarm) #' fit <- stan_glm( #' mpg ~ 0 + wt + factor(cyl), #' data = mtcars, #' iter = 500, #' refresh = 0 #' ) #' x <- as.matrix(fit) #' #' color_scheme_set("teal") #' mcmc_intervals(x, point_est = "mean", prob = 0.8, prob_outer = 0.95) #' mcmc_areas(x, regex_pars = "cyl", bw = "SJ", #' rhat = rhat(fit, regex_pars = "cyl")) #' } #' #' \dontrun{ #' # Example of hierarchically related parameters #' # plotted with ridgelines #' m <- shinystan::eight_schools@posterior_sample #' mcmc_areas_ridges(m, pars = "mu", regex_pars = "theta") + #' ggtitle("Treatment effect on eight schools (Rubin, 1981)") #' } #' NULL #' @rdname MCMC-intervals #' @export mcmc_intervals <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), outer_size = 0.5, inner_size = 2, point_size = 4, rhat = numeric()) { check_ignored_arguments(...) data <- mcmc_intervals_data(x, pars, regex_pars, transformations, prob = prob, prob_outer = prob_outer, point_est = point_est, rhat = rhat) color_by_rhat <- rlang::has_name(data, "rhat_rating") no_point_est <- all(data$point_est == "none") x_lim <- range(c(data$ll, data$hh)) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range # faint vertical line at zero if zero is within x_lim layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", size = 0.5) } else { geom_ignore() } args_outer <- list( mapping = aes_(x = ~ ll, xend = ~ hh, y = ~ parameter, yend = ~ parameter), color = get_color("mid"), size = outer_size ) args_inner <- list( mapping = aes_(x = ~ l, xend = ~ h, y = ~ parameter, yend = ~ parameter), size = inner_size, show.legend = FALSE ) args_point <- list( mapping = aes_(x = ~ m, y = ~ parameter), data = data, size = point_size, shape = 21 ) if (color_by_rhat) { args_inner$mapping <- args_inner$mapping %>% modify_aes_(color = ~ rhat_rating) args_point$mapping <- args_point$mapping %>% modify_aes_(color = ~ rhat_rating, fill = ~ rhat_rating) } else { args_inner$color <- get_color("dark") args_point$color <- get_color("dark_highlight") args_point$fill <- get_color("light") } point_func <- if (no_point_est) geom_ignore else geom_point layer_outer <- do.call(geom_segment, args_outer) layer_inner <- do.call(geom_segment, args_inner) layer_point <- do.call(point_func, args_point) # Do something or add an invisible layer if (color_by_rhat) { scale_color <- scale_color_diagnostic("rhat") scale_fill <- scale_fill_diagnostic("rhat") } else { scale_color <- geom_ignore() scale_fill <- geom_ignore() } ggplot(data) + layer_vertical_line + layer_outer + layer_inner + layer_point + scale_color + scale_fill + scale_y_discrete(limits = unique(rev(data$parameter))) + xlim(x_lim) + bayesplot_theme_get() + legend_move(ifelse(color_by_rhat, "top", "none")) + yaxis_text(face = "bold") + yaxis_title(FALSE) + yaxis_ticks(size = 1) + xaxis_title(FALSE) } #' @rdname MCMC-intervals #' @export mcmc_areas <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., area_method = c("equal area", "equal height", "scaled height"), prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) area_method <- match.arg(area_method) data <- mcmc_areas_data( x, pars, regex_pars, transformations, prob = prob, prob_outer = prob_outer, point_est = point_est, rhat = rhat, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens ) datas <- split(data, data$interval) # Use a dummy empty dataframe if no point estimate no_point_est <- !rlang::has_name(datas, "point") datas$point <- if (no_point_est) { dplyr::filter(datas$inner, FALSE) } else { datas$point } color_by_rhat <- rlang::has_name(data, "rhat_rating") # faint vertical line at zero if zero is within x_lim x_lim <- range(datas$outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", size = 0.5) } else { geom_ignore() } # Need to include rhat rating as a grouping variable if coloring by rhat so # that datas$bottom has an rhat_rating column that can map to color aesthetic groups <- if (color_by_rhat) { rlang::syms(c("parameter", "rhat_rating")) } else { rlang::syms(c("parameter")) } if (area_method == "equal height") { dens_col = ~ scaled_density } else if (area_method == "scaled height") { dens_col = ~ scaled_density * sqrt(scaled_density) } else { dens_col = ~ plotting_density } datas$bottom <- datas$outer %>% group_by(!!! groups) %>% summarise( ll = min(.data$x), hh = max(.data$x), .groups = "drop_last" ) %>% ungroup() args_bottom <- list( mapping = aes_(x = ~ ll, xend = ~ hh, yend = ~ parameter), data = datas$bottom ) args_inner <- list( mapping = aes_(height = dens_col, scale = ~ .9), data = datas$inner ) args_point <- list( mapping = aes_(height = dens_col, scale = ~ .9), data = datas$point, color = NA ) args_outer <- list( mapping = aes_(height = dens_col, scale = ~ .9), fill = NA ) if (color_by_rhat) { args_bottom$mapping <- args_bottom$mapping %>% modify_aes_(color = ~ rhat_rating) args_inner$mapping <- args_inner$mapping %>% modify_aes_(color = ~ rhat_rating, fill = ~ rhat_rating) args_outer$mapping <- args_outer$mapping %>% modify_aes_(color = ~ rhat_rating) # rhat fill color scale uses light/mid/dark colors. The point estimate needs # to be drawn with highlighted color scale, so we manually set the color for # the rhat fills. dc <- diagnostic_colors("rhat", "color")[["values"]] args_point$fill <- dc[datas$point$rhat_rating] } else { args_bottom$color <- get_color("dark") args_inner$color <- get_color("dark") args_inner$fill <- get_color("light") args_point$fill <- get_color("mid_highlight") args_outer$color <- get_color("dark") } # An invisible layer that is 2.5% taller than the plotted one args_outer2 <- args_outer args_outer2$mapping <- args_outer2$mapping %>% modify_aes_(scale = .925) args_outer2$color <- NA layer_bottom <- do.call(geom_segment, args_bottom) layer_inner <- do.call(ggridges::geom_ridgeline, args_inner) layer_outer <- do.call(ggridges::geom_ridgeline, args_outer) layer_outer2 <- do.call(ggridges::geom_ridgeline, args_outer2) point_geom <- if (no_point_est) { geom_ignore } else { ggridges::geom_ridgeline } layer_point <- do.call(point_geom, args_point) # Do something or add an invisible layer if (color_by_rhat) { scale_color <- scale_color_diagnostic("rhat") scale_fill <- scale_fill_diagnostic("rhat") } else { scale_color <- geom_ignore() scale_fill <- geom_ignore() } ggplot(datas$outer) + aes_(x = ~ x, y = ~ parameter) + layer_vertical_line + layer_inner + layer_point + layer_outer + layer_outer2 + layer_bottom + scale_color + scale_fill + scale_y_discrete( limits = unique(rev(data$parameter)), expand = expansion( add = c(0, .5 + 1/(2 * nlevels(data$parameter))), mult = c(.1, .1) ) ) + xlim(x_lim) + bayesplot_theme_get() + legend_move(ifelse(color_by_rhat, "top", "none")) + yaxis_text(face = "bold") + yaxis_title(FALSE) + yaxis_ticks(size = 1) + xaxis_title(FALSE) } #' @rdname MCMC-intervals #' @export mcmc_areas_ridges <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) data <- mcmc_areas_ridges_data(x, pars = pars, regex_pars = regex_pars, transformations = transformations, prob = prob, prob_outer = prob_outer, bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) datas <- data %>% split(data$interval) # faint vertical line at zero if zero is within x_lim x_lim <- range(datas$outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range layer_vertical_line <- if (0 > x_lim[1] && 0 < x_lim[2]) { vline_0(color = "gray90", size = 0.5) } else { geom_ignore() } args_outer <- list( mapping = aes_(height = ~ density), color = get_color("dark"), fill = NA, stat = "identity" ) layer_outer <- do.call(ggridges::geom_density_ridges, args_outer) # Force ggridges to compute the scaling now test_plot <- ggplot(datas$outer) + aes_(x = ~ x, y = ~ parameter) + layer_outer soft_build <- ggplot_build(test_plot) scaler1 <- unique(soft_build$data[[1]][["scale"]]) scaler2 <- unique(soft_build$data[[1]][["iscale"]]) scale <- scaler1 * scaler2 # Draw each ridgeline from top the bottom layer_list_inner <- list() par_draw_order <- levels(unique(data$parameter)) bg <- bayesplot_theme_get()[["panel.background"]][["fill"]] %||% "white" for (par_num in seq_along(unique(data$parameter))) { # Basically, draw the current ridgeline normally, but draw all the ones # under it (which would overlap it vertically) with a blank fill this_par <- par_draw_order[par_num] next_pars <- par_draw_order[par_num < seq_along(par_draw_order)] this_par_data <- datas$inner %>% dplyr::filter(.data$parameter == this_par) %>% mutate(color = get_color("dark"), fill = get_color("light")) next_par_data <- datas$outer %>% dplyr::filter(.data$parameter %in% next_pars) %>% mutate(color = get_color("dark"), fill = bg) args_inner <- list( mapping = aes_(height = ~ density, color = ~ color, fill = ~ fill), data = dplyr::bind_rows(this_par_data, next_par_data), scale = scale, stat = "identity") layer_list_inner[[par_num]] <- do.call(ggridges::geom_ridgeline, args_inner) } ggplot(datas$outer) + aes_(x = ~ x, y = ~ parameter) + layer_outer + scale_y_discrete(limits = unique(rev(data$parameter)), expand = c(0.05, .6)) + layer_list_inner + layer_vertical_line + scale_fill_identity() + scale_color_identity() + xlim(x_lim) + yaxis_title(FALSE) + xaxis_title(FALSE) + bayesplot_theme_get() + grid_lines_y(color = "gray90") + theme(axis.text.y = element_text(hjust = 1, vjust = 0)) } #' @rdname MCMC-intervals #' @export mcmc_intervals_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 0.9, point_est = c("median", "mean", "none"), rhat = numeric()) { check_ignored_arguments(...) probs <- check_interval_widths(prob, prob_outer) prob <- probs[1] prob_outer <- probs[2] x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- merge_chains(x) data_long <- melt_mcmc(x) %>% dplyr::as_tibble() %>% rlang::set_names(tolower) probs <- c(0.5 - prob_outer / 2, 0.5 - prob / 2, 0.5 + prob / 2, 0.5 + prob_outer / 2) point_est <- match.arg(point_est) m_func <- if (point_est == "mean") mean else median data <- data_long %>% group_by(.data$parameter) %>% summarise( outer_width = prob_outer, inner_width = prob, point_est = point_est, ll = unname(quantile(.data$value, probs[1])), l = unname(quantile(.data$value, probs[2])), m = m_func(.data$value), h = unname(quantile(.data$value, probs[3])), hh = unname(quantile(.data$value, probs[4])) ) if (point_est == "none") { data$m <- NULL } color_by_rhat <- isTRUE(length(rhat) > 0) if (color_by_rhat) { rhat <- drop_NAs_and_warn(new_rhat(rhat)) if (length(rhat) != nrow(data)) { abort(paste( "'rhat' has length", length(rhat), "but 'x' has", nrow(data), "parameters." )) } rhat <- set_names(rhat, data$parameter) rhat_tbl <- rhat %>% mcmc_rhat_data() %>% select(one_of("parameter"), rhat_value = .data$value, rhat_rating = .data$rating, rhat_description = .data$description) %>% mutate(parameter = factor(.data$parameter, levels(data$parameter))) data <- dplyr::inner_join(data, rhat_tbl, by = "parameter") } data } # Don't import `filter`: otherwise, you get a warning when using # `devtools::load_all(".")` because stats also has a `filter` function #' @importFrom dplyr inner_join one_of top_n #' @rdname MCMC-intervals #' @export mcmc_areas_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob = 0.5, prob_outer = 1, point_est = c("median", "mean", "none"), rhat = numeric(), bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { probs <- check_interval_widths(prob, prob_outer) # First compute normal intervals so we know the width of the data, point # estimates, and have prepared rhat values. # Compute intervals with a median (for now) if no point estimate. It will be # cleaner to ignore results later than to have two branching code paths. point_est <- match.arg(point_est) temp_point_est <- if (point_est == "none") "median" else point_est intervals <- mcmc_intervals_data(x, pars, regex_pars, transformations, prob = probs[1], prob_outer = probs[2], point_est = temp_point_est, rhat = rhat) x <- prepare_mcmc_array(x, pars, regex_pars, transformations) x <- merge_chains(x) data_long <- melt_mcmc(x) %>% dplyr::as_tibble() %>% rlang::set_names(tolower) # Compute the density intervals data_inner <- data_long %>% compute_column_density( group_vars = .data$parameter, value_var = .data$value, interval_width = probs[1], bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) %>% mutate(interval = "inner") data_outer <- data_long %>% compute_column_density( group_vars = .data$parameter, value_var = .data$value, interval_width = probs[2], bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) %>% mutate(interval = "outer") # Point estimates will be intervals that take up .8% of the x-axis x_lim <- range(data_outer$x) x_range <- diff(x_lim) x_lim[1] <- x_lim[1] - 0.05 * x_range x_lim[2] <- x_lim[2] + 0.05 * x_range half_point_width <- .004 * diff(x_lim) # Find the density values closest to the point estimate point_ests <- intervals %>% select(one_of("parameter", "m")) point_centers <- data_inner %>% inner_join(point_ests, by = "parameter") %>% group_by(.data$parameter) %>% mutate(diff = abs(.data$m - .data$x)) %>% dplyr::top_n(1, -.data$diff) %>% select(one_of("parameter", "x", "m")) %>% rename(center = .data$x) %>% ungroup() # Keep density values that are within +/- .4% of x-axis of the point estimate points <- point_centers %>% left_join(data_inner, by = "parameter") %>% group_by(.data$parameter) %>% dplyr::filter(abs(.data$center - .data$x) <= half_point_width) %>% mutate( interval_width = 0, interval = "point") %>% select(-.data$center, .data$m) %>% ungroup() # Ignore points calculcation if no point estimate was requested if (point_est == "none") { points <- dplyr::filter(points, FALSE) } data <- dplyr::bind_rows(data_inner, data_outer, points) %>% select(one_of("parameter", "interval", "interval_width", "x", "density", "scaled_density")) %>% # Density scaled so the highest in entire dataframe has height 1 mutate(plotting_density = .data$density / max(.data$density)) if (rlang::has_name(intervals, "rhat_value")) { rhat_info <- intervals %>% select(one_of("parameter", "rhat_value", "rhat_rating", "rhat_description")) data <- inner_join(data, rhat_info, by = "parameter") } data } #' @rdname MCMC-intervals #' @export mcmc_areas_ridges_data <- function(x, pars = character(), regex_pars = character(), transformations = list(), ..., prob_outer = 1, prob = 1, bw = NULL, adjust = NULL, kernel = NULL, n_dens = NULL) { check_ignored_arguments(...) mcmc_areas_data(x, pars = pars, regex_pars = regex_pars, transformations = transformations, prob = prob, prob_outer = prob_outer, point_est = "none", bw = bw, adjust = adjust, kernel = kernel, n_dens = n_dens) } # internal ---------------------------------------------------------------- #' Compute density for a dataframe column. #' #' @param df a dataframe of posterior samples #' @param group_vars columns to group by. e.g., `c(Parameter, Chain)` #' @param value_var column containing posterior samples #' @param ... arguments passed onto density calculation #' @noRd compute_column_density <- function(df, group_vars, value_var, ...) { value_var <- enquo(value_var) group_vars <- enquos(group_vars) # Convert the vector of bare column names to a list of symbols group_cols <- df %>% dplyr::select(!!! group_vars) %>% names() %>% syms() # Tuck away the subgroups to compute densities on into nested dataframes sub_df <- dplyr::select(df, !!! group_cols, !! value_var) group_df <- df %>% dplyr::select(!!! group_cols, !! value_var) %>% group_by(!!! group_cols) by_group <- group_df %>% split(dplyr::group_indices(group_df)) %>% lapply(pull, !! value_var) nested <- df %>% dplyr::distinct(!!! group_cols) %>% mutate(data = by_group) nested$density <- lapply(nested$data, compute_interval_density, ...) nested$data <- NULL # Manually unnest the data reconstructed <- as.list(seq_len(nrow(nested))) for (df_i in seq_along(nested$density)) { row <- nested[df_i, ] parent <- row %>% select(-.data$density) groups <- rep(list(parent), nrow(row$density[[1]])) %>% dplyr::bind_rows() reconstructed[[df_i]] <- dplyr::bind_cols(groups, row$density[[1]]) } dplyr::bind_rows(reconstructed) } # Given a vector of values, compute a density dataframe. compute_interval_density <- function(x, interval_width = 1, n_dens = 1024, bw = NULL, adjust = NULL, kernel = NULL) { n_dens <- n_dens %||% 1024 tail_width <- (1 - interval_width) / 2 qs <- quantile(x, probs = c(tail_width, 1 - tail_width)) args <- c( # can't be null list(x = x, from = min(qs), to = max(qs), n = n_dens), # might be null bw = bw, adjust = adjust, kernel = kernel) dens <- do.call(stats::density, args) data.frame( interval_width = interval_width, x = dens$x, density = dens$y, scaled_density = dens$y / max(dens$y, na.rm = TRUE) ) } check_interval_widths <- function(prob, prob_outer) { if (prob < 0 || prob > 1 || prob_outer < 0 || prob_outer > 1) abort("`prob` and `prob_outer` must be in [0,1].") if (prob_outer < prob) { x <- sprintf( "`prob_outer` (%s) is less than `prob` (%s)\n... %s", prob_outer, prob, "Swapping the values of `prob_outer` and `prob`" ) warn(x) } sort(c(prob, prob_outer)) } bayesplot/R/helpers-ppc.R0000644000176200001440000001667714057717550015056 0ustar liggesusers# Check if an object is a vector (but not list) or a 1-D array is_vector_or_1Darray <- function(x) { if (is.vector(x) && !is.list(x)) { return(TRUE) } isTRUE(is.array(x) && length(dim(x)) == 1) } #' Validate y #' #' Checks that `y` is numeric, doesn't have any NAs, and is either a vector, 1-D #' array, or univariate time series object of class `ts`. #' #' @param y The `y` object from the user. #' @return Either throws an error or returns a numeric vector. #' @noRd validate_y <- function(y) { stopifnot(is.numeric(y)) if (!(inherits(y, "ts") && is.null(dim(y)))) { if (!is_vector_or_1Darray(y)) { abort("'y' must be a vector or 1D array.") } y <- as.vector(y) } if (anyNA(y)) { abort("NAs not allowed in 'y'.") } unname(y) } #' Validate yrep #' #' Checks that `yrep` is a numeric matrix, doesn't have any NAs, and has the #' correct number of columns (equal to the length of `y`). #' #' @param yrep,y The user's `yrep` object and the `y` object returned by `validate_y()`. #' @return Either throws an error or returns a numeric matrix. #' @noRd validate_yrep <- function(yrep, y) { stopifnot(is.matrix(yrep), is.numeric(yrep)) if (is.integer(yrep)) { if (nrow(yrep) == 1) { yrep[1, ] <- as.numeric(yrep[1,, drop = FALSE]) } else { yrep <- apply(yrep, 2, as.numeric) } } if (anyNA(yrep)) { abort("NAs not allowed in 'yrep'.") } if (ncol(yrep) != length(y)) { abort("ncol(yrep) must be equal to length(y).") } unclass(unname(yrep)) } #' Validate group #' #' Checks that grouping variable has same length as `y` and is either a vector or #' factor variable. #' #' @param group,y The user's `group` object and the `y` object returned by #' `validate_y()`. #' @return Either throws an error or returns `group` (coerced to a factor). #' @noRd validate_group <- function(group, y) { stopifnot(is.vector(group) || is.factor(group)) if (!is.factor(group)) { group <- as.factor(group) } if (anyNA(group)) { abort("NAs not allowed in 'group'.") } if (length(group) != length(y)) { abort("length(group) must be equal to length(y).") } unname(group) } #' Validate x #' #' Checks that x is a numeric vector, doesn't have any NAs, and has the #' same length as y. #' #' @param x,y The user's `x` vector and the `y` object returned by `validate_y()`. #' @param unique_x `TRUE` or `FALSE` indicating whether to require all unique #' values in `x`. #' @return Either throws an error or returns a numeric vector. #' @noRd validate_x <- function(x = NULL, y, unique_x = FALSE) { if (is.null(x)) { if (inherits(y, "ts") && is.null(dim(y))) { x <- stats::time(y) } else { x <- seq_along(y) } } stopifnot(is.numeric(x)) if (!is_vector_or_1Darray(x)) { abort("'x' must be a vector or 1D array.") } x <- as.vector(x) if (length(x) != length(y)) { abort("length(x) must be equal to length(y).") } if (anyNA(x)) { abort("NAs not allowed in 'x'.") } if (unique_x) { stopifnot(identical(length(x), length(unique(x)))) } unname(x) } #' Convert yrep matrix into a molten data frame #' #' @param yrep A matrix, already validated using `validate_yrep()`. #' @return A data frame with 4 columns: #' 1. `y_id`: integer indicating the observation number (`yrep` column). #' 1. `rep_id`: integer indicating the simulation number (`yrep` row). #' 1. `rep_label`: factor with S levels, where S is `nrow(yrep)`, i.e. the #' number of simulations included in `yrep`. #' 1. `value`: the simulation values. #' @noRd melt_yrep <- function(yrep) { out <- yrep %>% reshape2::melt(varnames = c("rep_id", "y_id")) %>% tibble::as_tibble() id <- create_yrep_ids(out$rep_id) out$rep_label <- factor(id, levels = unique(id)) out[c("y_id", "rep_id", "rep_label", "value")] } #' Stack y below melted yrep data #' #' @param y Validated y input. #' @param yrep Validated yrep input. #' @return A data frame with the all the columns as the one returned by #' `melt_yrep()`, plus additional columns: #' 1. `is_y`: logical indicating whether the values are observations (`TRUE`) #' or simulations (`FALSE`). #' 1. `is_y_label`: factor with levels `italic(y)` for observations and #' `italic(y)[rep]` for simulations. #' @noRd melt_and_stack <- function(y, yrep) { y_text <- as.character(y_label()) yrep_text <- as.character(yrep_label()) molten_yrep <- melt_yrep(yrep) # Add a level in the labels for the observed y values levels(molten_yrep$rep_label) <- c(levels(molten_yrep$rep_label), y_text) ydat <- tibble::tibble( rep_label = factor(y_text, levels = levels(molten_yrep$rep_label)), rep_id = NA_integer_, y_id = seq_along(y), value = y) data <- dplyr::bind_rows(molten_yrep, ydat) %>% mutate( rep_label = relevel(.data$rep_label, y_text), is_y = is.na(.data$rep_id), is_y_label = ifelse(.data$is_y, y_text, yrep_text) %>% factor(levels = c(y_text, yrep_text))) data[c("y_id", "rep_id", "rep_label", "is_y", "is_y_label", "value")] } #' Prepare data for use in PPCs by group #' #' @param y,yrep,group Validated `y`, `yrep`, and `group` objects. #' @param stat Either `NULL` or a string naming a function. #' @return If `stat` is `NULL`, a molten data frame grouped by group and #' variable. If `stat` specifies a function then a summary table created #' by `dplyr::summarise()`. #' @noRd #' #' @examples #' y <- example_y_data() #' yrep <- example_yrep_draws() #' group <- example_group_data() #' ppc_group_data(y, yrep, group) #' ppc_group_data(y, yrep, group, median) ppc_group_data <- function(y, yrep, group, stat = NULL) { d <- data.frame( group = factor(group), y = y, yrep = t(yrep) ) colnames(d) <- gsub(".", "_", colnames(d), fixed = TRUE) molten_d <- reshape2::melt(d, id.vars = "group") molten_d <- dplyr::group_by(molten_d, .data$group, .data$variable) # Default to identity function. dplyr_fun <- dplyr::summarise if (is.null(stat)) { stat <- function(x) x dplyr_fun <- dplyr::mutate } stat <- match.fun(stat) dplyr_fun(molten_d, value = stat(.data$value)) # todo: does this result need to be ungrouped. If mutating path, it has two # grouping vars. It summarising path, it has one grouping var. } # Check if x consists of whole numbers (very close to integers) # Implementation here follows example ?integer is_whole_number <- function(x, tol = .Machine$double.eps) { if (!is.numeric(x)) { FALSE } else { abs(x - round(x)) < tol } } # Check if all values in x are whole numbers or counts (non-negative whole # numbers) all_whole_number <- function(x, ...) { all(is_whole_number(x, ...)) } all_counts <- function(x, ...) { all_whole_number(x, ...) && min(x) >= 0 } # labels ---------------------------------------------------------------- create_yrep_ids <- function(ids) paste('italic(y)[rep] (', ids, ")") yrep_label <- function() expression(italic(y)[rep]) yrep_avg_label <- function() expression(paste("Average ", italic(y)[rep])) y_label <- function() expression(italic(y)) Ty_label <- function() expression(italic(T(italic(y)))) Tyrep_label <- function() expression(italic(T)(italic(y)[rep])) # Ty_label_2d <- function() { # expression(bgroup( # "(", list(italic(T)[1](italic(y)), # italic(T)[2](italic(y))), ")" # )) # } # Tyrep_label_2d <- function(k) { # stopifnot(k == 1 || k == 2) # if (k == 1) expression(paste(italic(T)[1](italic(y)[rep]))) # else expression(paste(italic(T)[2](italic(y)[rep]))) # } bayesplot/NEWS.md0000644000176200001440000003373214061476147013374 0ustar liggesusers # bayesplot 1.8.1 * Fix R cmd check error on linux for CRAN # bayesplot 1.8.0 ### Bug fixes * `mcmc_areas()` tries to use less vertical blank space. (#218, #230) * Fix bug in `color_scheme_view()` minimal theme (#213). * Fix error in `mcmc_acf()` for certain input types. (#244, #245, @hhau) ### New features * New plotting functions `ppc_dens_overlay_grouped()` and `ppc_ecdf_overlay_grouped()` for plotting density and cumulative distributions of the posterior predictive distribution (versus observed data) by group. (#212) * New plotting function `ppc_km_overlay()` for outcome variables that are right-censored. Empirical CCDF estimates of `yrep` are compared with the Kaplan-Meier estimate of `y`. (#233, #234, @fweber144) * `ppc_loo_pit_overlay()` now uses a boundary correction for an improved kernel density estimation. The new argument `boundary_correction` defaults to TRUE but can be set to FALSE to recover the old version of the plot. (#171, #235, @ecoronado92) * CmdStanMCMC objects (from CmdStanR) can now be used with extractor functions `nuts_params()`, `log_posterior()`, `rhat()`, and `neff_ratio()`. (#227) * On the y axis, `ppc_loo_pit_qq(..., compare = "normal")` now plots standard normal quantiles calculated from the PIT values (instead of the standardized PIT values). (#240, #243, @fweber144) * `mcmc_rank_overlay()` gains argument `facet_args`. (#221, @hhau) * For `mcmc_intervals()` the size` of the points and interval lines can be set with `mcmc_intervals(..., outer_size, inner_size, point_size)`. (#215, #228, #229) # bayesplot 1.7.2 Compatibility with dplyr 1.0.0 (#219) # bayesplot 1.7.1 Release requested by CRAN to fix errors at https://cran.r-project.org/web/checks/check_results_bayesplot.html due to matrices also inheriting from "array" in R 4.0. # bayesplot 1.7.0 (GitHub issue/PR numbers in parentheses) * The `pars` argument of all MCMC plotting functions now supports tidy variable selection. See `help("tidy-params", package="bayesplot")` for details and examples. (#161, #183, #188) * Two new plots have been added for inspecting the distribution of ranks. Rank histograms were introduced by the Stan team's [new paper on MCMC diagnostics](https://arxiv.org/abs/1903.08008). (#178, #179) `mcmc_rank_hist()`: A traditional traceplot (`mcmc_trace()`) visualizes how sampled values the MCMC chains mix over the course of sampling. A rank histogram (`mcmc_rank_hist()`) visualizes how the *ranks* of values from the chains mix together. An ideal plot would show the ranks mixing or overlapping in a uniform distribution. `mcmc_rank_overlay()`: Instead of drawing each chain's histogram in a separate panel, this plot draws the top edge of the chains' histograms in a single panel. * Added `mcmc_trace_data()`, which returns the data used for plotting the trace plots and rank histograms. (Advances #97) * [ColorBrewer](https://colorbrewer2.org/) palettes are now available as color schemes via [`color_scheme_set()`](https://mc-stan.org/bayesplot/reference/bayesplot-colors.html). For example, `color_scheme_set("brewer-Spectral")` will use the Spectral palette. (#177, #190) * MCMC plots now also accept objects with an `as.array` method as input (e.g., stanfit objects). (#175, #184) * [`mcmc_trace()`](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) gains an argument `iter1` which can be used to label the traceplot starting from the first iteration after warmup. (#14, #155, @mcol) * [`mcmc_areas()`](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) gains an argument `area_method` which controls how to draw the density curves. The default `"equal area"` constrains the heights so that the curves have the same area. As a result, a narrow interval will appear as a spike of density, while a wide, uncertain interval is spread thin over the _x_ axis. Alternatively `"equal height"` will set the maximum height on each curve to the same value. This works well when the intervals are about the same width. Otherwise, that wide, uncertain interval will dominate the visual space compared to a narrow, less uncertain interval. A compromise between the two is `"scaled height"` which scales the curves from `"equal height"` using `height * sqrt(height)`. (#163, #169) * `mcmc_areas()` correctly plots density curves where the point estimate does not include the highest point of the density curve. (#168, #169, @jtimonen) * `mcmc_areas_ridges()` draws the vertical line at *x* = 0 over the curves so that it is always visible. * `mcmc_intervals()` and `mcmc_areas()` raise a warning if `prob_outer` is ever less than `prob`. It sorts these two values into the correct order. (#138) * MCMC parameter names are now *always* converted to factors prior to plotting. We use factors so that the order of parameters in a plot matches the order of the parameters in the original MCMC data. This change fixes a case where factor-conversion failed. (#162, #165, @wwiecek) * The examples in [`?ppc_loo_pit_overlay()`](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now work as expected. (#166, #167) * Added `"viridisD"` as an alternative name for `"viridis"` to the supported colors. * Added `"viridisE"` (the [cividis](https://github.com/marcosci/cividis) version of viridis) to the supported colors. * `ppc_bars()` and `ppc_bars_grouped()` now allow negative integers as input. (#172, @jeffpollock9) # bayesplot 1.6.0 (GitHub issue/PR numbers in parentheses) * Loading **bayesplot** no longer overrides the ggplot theme! Rather, it sets a theme specific for **bayesplot**. Some packages using **bayesplot** may still override the default **ggplot** theme (e.g., **rstanarm** does but only until next release), but simply loading **bayesplot** itself will not. There are new functions for controlling the ggplot theme for **bayesplot** that work like their **ggplot2** counterparts but only affect plots made using **bayesplot**. Thanks to Malcolm Barrett. (#117, #149). - `bayesplot_theme_set()` - `bayesplot_theme_get()` - `bayesplot_theme_update()` - `bayesplot_theme_replace()` * The [Visual MCMC Diagnostics vignette](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) has been reorganized and has a lot of useful new content thanks to Martin Modrák. (#144, #153) * The [LOO predictive checks](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now require **loo** version `>= 2.0.0`. (#139) * Histogram plots gain a `breaks` argument that can be used as an alternative to `binwidth`. (#148) * [`mcmc_pairs()`](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) now has an argument `grid_args` to provide a way of passing optional arguments to `gridExtra::arrangeGrob()`. This can be used to add a title to the plot, for example. (#143) * [`ppc_ecdf_overlay()`](https://mc-stan.org/bayesplot/reference/PPC-distributions.html) gains an argument `discrete`, which is `FALSE` by default, but can be used to make the Geom more appropriate for discrete data. (#145) * [PPC intervals plots](https://mc-stan.org/bayesplot/reference/PPC-intervals.html) and [LOO predictive checks](https://mc-stan.org/bayesplot/reference/PPC-loo.html) now draw both an outer and an inner probability interval, which can be controlled through the new argument `prob_outer` and the already existing `prob`. This is consistent with what is produced by `mcmc_intervals()`. (#152, #154, @mcol) # bayesplot 1.5.0 (GitHub issue/PR numbers in parentheses) * New package documentation website: * Two new plots that visualize posterior density using [ridgelines][ggridges]. These work well when parameters have similar values and similar densities, as in hierarchical models. (#104) - `mcmc_dens_chains()` draws the kernel density of each sampling chain. - `mcmc_areas_ridges()` draws the kernel density combined across chains. - Both functions have a `_data()` function to return the data plotted by each function. * `mcmc_intervals()` and `mcmc_areas()` have been rewritten. (#103) - They now use a discrete *y*-axis. Previously, they used a continuous scale with numeric breaks relabelled with parameter names; this design caused some unexpected behavior when customizing these plots. - `mcmc_areas()` now uses geoms from the ggridges package to draw density curves. * Added `mcmc_intervals_data()` and `mcmc_areas_data()` that return data plotted by `mcmc_intervals()` and `mcmc_areas()`. (Advances #97) * New `ppc_data()` function returns the data plotted by many of the PPC plotting functions. (Advances #97) * Added `ppc_loo_pit_overlay()` function for a better LOO PIT predictive check. (#123) * Started using **vdiffr** to add visual unit tests to the existing PPC unit tests. (#137) # bayesplot 1.4.0 (GitHub issue/PR numbers in parentheses) * New plotting function `mcmc_parcoord()` for parallel coordinates plots of MCMC draws (optionally including HMC/NUTS diagnostic information). (#108) * `mcmc_scatter` gains an `np` argument for specifying NUTS parameters, which allows highlighting divergences in the plot. (#112) * New functions with names ending with suffix `_data` don't make the plots, they just return the data prepared for plotting (more of these to come in future releases): - `ppc_intervals_data()` (#101) - `ppc_ribbon_data()` (#101) - `mcmc_parcoord_data()` (#108) - `mcmc_rhat_data()` (#110) - `mcmc_neff_data()` (#110) * `ppc_stat_grouped()`, `ppc_stat_freqpoly_grouped()` gain a `facet_args` argument for controlling **ggplot2** faceting (many of the `mcmc_` functions already have this). * The `divergences` argument to `mcmc_trace()` has been deprecated in favor of `np` (NUTS parameters) to match the other functions that have an `np` argument. * Fixed an issue where duplicated rhat values would break `mcmc_rhat()` (#105). # bayesplot 1.3.0 (GitHub issue/PR numbers in parentheses) * `bayesplot::theme_default()` is now set as the default ggplot2 plotting theme when **bayesplot** is loaded, which makes changing the default theme using `ggplot2::theme_set()` possible. Thanks to @gavinsimpson. (#87) * `mcmc_hist()` and `mcmc_hist_by_chain()` now take a `freq` argument that defaults to `TRUE` (behavior is like `freq` argument to R's `hist` function). * Using a `ts` object for `y` in PPC plots no longer results in an error. Thanks to @helske. (#94) * `mcmc_intervals()` doesn't use round lineends anymore as they slightly exaggerate the width of the intervals. Thanks to @tjmahr. (#96) # bayesplot 1.2.0 A lot of new stuff in this release. (GitHub issue/PR numbers in parentheses) ## Fixes * Avoid error in some cases when `divergences` is specified in call to `mcmc_trace()` but there are not actually any divergent transitions. * The `merge_chains` argument to `mcmc_nuts_energy()` now defaults to `FALSE`. ## New features in existing functions * For `mcmc_*()` functions, transformations are recycled if `transformations` argument is specified as a single function rather than a named list. Thanks to @tklebel. (#64) * For `ppc_violin_grouped()` there is now the option of showing `y` as a violin, points, or both. Thanks to @silberzwiebel. (#74) * `color_scheme_get()` now has an optional argument `i` for selecting only a subset of the colors. * New color schemes: darkgray, orange, viridis, viridisA, viridisB, viridisC. The viridis schemes are better than the other schemes for trace plots (the colors are very distinct from each other). ## New functions * `mcmc_pairs()`, which is essentially a ggplot2+grid implementation of rstan's `pairs.stanfit()` method. (#67) * `mcmc_hex()`, which is similar to `mcmc_scatter()` but using `geom_hex()` instead of `geom_point()`. This can be used to avoid overplotting. (#67) * `overlay_function()` convenience function. Example usage: add a Gaussian (or any distribution) density curve to a plot made with `mcmc_hist()`. * `mcmc_recover_scatter()` and `mcmc_recover_hist()`, which are similar to `mcmc_recover_intervals()` and compare estimates to "true" values used to simulate data. (#81, #83) * New PPC category **Discrete** with functions: - `ppc_rootogram()` for use with models for count data. Thanks to @paul-buerkner. (#28) - `ppc_bars()`, `ppc_bars_grouped()` for use with models for ordinal, categorical and multinomial data. Thanks to @silberzwiebel. (#73) * New PPC category **LOO** (thanks to suggestions from @avehtari) with functions: - `ppc_loo_pit()` for assessing the calibration of marginal predictions. (#72) - `ppc_loo_intervals()`, `ppc_loo_ribbon()` for plotting intervals of the LOO predictive distribution. (#72) # bayesplot 1.1.0 (GitHub issue/PR numbers in parentheses) ## Fixes * Images in vignettes should now render properly using `png` device. Thanks to TJ Mahr. (#51) * `xaxis_title(FALSE)` and `yaxis_title(FALSE)` now set axis titles to `NULL` rather than changing theme elements to `element_blank()`. This makes it easier to add axis titles to plots that don’t have them by default. Thanks to Bill Harris. (#53) ## New features in existing functions * Add argument `divergences` to `mcmc_trace()` function. For models fit using HMC/NUTS this can be used to display divergences as a rug at the bottom of the trace plot. (#42) * The `stat` argument for all `ppc_stat_*()` functions now accepts a function instead of only the name of a function. (#31) ## New functions * `ppc_error_hist_grouped()` for plotting predictive errors by level of a grouping variable. (#40) * `mcmc_recover_intervals)(` for comparing MCMC estimates to "true" parameter values used to simulate the data. (#56) * `bayesplot_grid()` for juxtaposing plots and enforcing shared axis limits. (#59) # bayesplot 1.0.0 Initial CRAN release [ggridges]: https://CRAN.R-project.org/package=ggridges "ggridges package" bayesplot/MD50000644000176200001440000001564614061724612012603 0ustar liggesusersfbaaf96527b8a9f959d7b2c16a3a33a0 *DESCRIPTION 0506b0d846f0a0184d6247a0b7021e42 *NAMESPACE 74807db223ee1a14358bed4a4d638fb7 *NEWS.md 55d757535b93f3c4428aedbd4989f582 *R/available-module-functions.R a6ffa92ca73d511a37f21ad7cd7d08cb *R/bayesplot-colors.R 6e087c38b6633b69333a9eb469bb322d *R/bayesplot-extractors.R 331b9e81b97ba0c6920d82c3fcfeb74a *R/bayesplot-ggplot-themes.R edb5a6024e6e2733c986463f594cf58d *R/bayesplot-helpers.R 26e80011c0614475c5230005a5eb282c *R/bayesplot-package.R 6ee02f0ca7bf3457031298b3d8d93331 *R/bayesplot_grid.R fb70705bdb5dfabeaf8f481ed3a58ded *R/example-data.R 4ae9dd25ddfa3c367aa2c0a2bda2d175 *R/helpers-gg.R e3130b17ba359e82b360bfecabd3029d *R/helpers-mcmc.R bb6ecb73cd32573660a1c9c3a76c4687 *R/helpers-ppc.R afc13b92bba0e577204ef79a18c0fce0 *R/helpers-shared.R 499bc1e007b15686d0aaf92f63300dff *R/helpers-testthat.R b2bc8848b8b0ddf52889f0d7aae43c6e *R/mcmc-combo.R d1507eb0fd350940289ca5dc7f0904ef *R/mcmc-diagnostics-nuts.R 30be730d9a564db54f2c31893c138ecc *R/mcmc-diagnostics.R 787f0eb9ffaed918faac5dd7230d5bb6 *R/mcmc-distributions.R 79cff5dedb900e80dff78ee9309bd7ff *R/mcmc-intervals.R a38ac04d17dcd52bf47af21c25e5fc22 *R/mcmc-overview.R 162819c77a049322ed6e5a0c74dd22b8 *R/mcmc-parcoord.R 63159021eb6a46616f9f4b87dd5ebfb5 *R/mcmc-recover.R 241938da003d63104b959cd2a7c0ed7d *R/mcmc-scatterplots.R 3972ecbcf0b328c71cdf2a6fd9268f22 *R/mcmc-traces.R b876b4737232996e5e8243e9dc5756a2 *R/pp_check.R db7948627c6b9805c0d7954ab4dd6c2c *R/ppc-censoring.R 5d2031bab9fa7af7d5cc1674611b226e *R/ppc-discrete.R d2c95512adaae5eea41537772cdc41d4 *R/ppc-distributions.R 13d328712d7964d8d4284efdafc55842 *R/ppc-errors.R 2ad7f7f2cffb64c010c2c345db7b62ef *R/ppc-intervals.R 012cbdd8fd0178c5df4945e6fc3e379b *R/ppc-loo.R d3ceb05b14d31de48a077984d6024ee8 *R/ppc-overview.R 0599d6daf2ca175816d27c253dc24e18 *R/ppc-scatterplots.R f6937c8482d862073991d34e3e920550 *R/ppc-test-statistics.R 1e42e427a0340d97e773483cbd6d0b35 *R/sysdata.rda 460a30f9f712101cfe93721845b650d7 *R/tidy-params.R bc4dd182fb94a5a0dde5c770cbff169a *R/zzz.R 2ac717625a22d4070c71743d1ee4c294 *build/vignette.rds 9e6d152f3d8a2abccbae64c3895def95 *inst/CITATION 7afb60f72eb833f6038bc10350616db0 *inst/doc/graphical-ppcs.R df950c456c457be19258b064464b6aa5 *inst/doc/graphical-ppcs.Rmd 2a5bedc96b39e0d9fb6d151b91086506 *inst/doc/graphical-ppcs.html cd1fa648c4d03e78ebbbac0a9bb312e0 *inst/doc/plotting-mcmc-draws.R 4e78b6380d31ad90798dea1142bfb26d *inst/doc/plotting-mcmc-draws.Rmd e4be0495ad5cb5571dbbe2baed0b217c *inst/doc/plotting-mcmc-draws.html c65c63d74baf58cf883efa34501a2995 *inst/doc/visual-mcmc-diagnostics.R f2f8deb696e122a8acc3738f193d2bf7 *inst/doc/visual-mcmc-diagnostics.Rmd 663fb9009dfbd107b8181a1114c5e819 *inst/doc/visual-mcmc-diagnostics.html 5f44e880684e053d12254f3a1183f595 *man/MCMC-combos.Rd 2e90980622e08a300acd6b387f550bad *man/MCMC-diagnostics.Rd b567bc8564a81f1ae3dbf4feed4ad2b0 *man/MCMC-distributions.Rd 1c7499f6558ba8fe3e8c472ae3d3142e *man/MCMC-intervals.Rd f2130e89e9c59ed670b60aa628d8c657 *man/MCMC-nuts.Rd 5b2c89e483713969d20f0b1dc6b77c65 *man/MCMC-overview.Rd e030b77b7f0d6c7e11c3ad67b460e6aa *man/MCMC-parcoord.Rd 091caffef510952f2f14b81b3ba08c32 *man/MCMC-recover.Rd 24a6534eefad6bd86a51de7a5ddaa053 *man/MCMC-scatterplots.Rd 9a0e2e84ec5a89d2ef1d1fe1b1a70e96 *man/MCMC-traces.Rd 41989538b06078ce02a6a9c58ab5ddbc *man/PPC-censoring.Rd 7b3935ef11043db1d5ec8ace65d6efef *man/PPC-discrete.Rd 4d3499b4ee333c93515530501e50178c *man/PPC-distributions.Rd a59bfcae75493e92900d229c8835c150 *man/PPC-errors.Rd d68f144bf926529ec5d72ece0a282ffc *man/PPC-intervals.Rd bb9ea14843e026680573e2765ce1d3b6 *man/PPC-loo.Rd 36152d26347192045dc8f8db7f02c53c *man/PPC-overview.Rd 1d6598230fd63616ad1481671c250c1f *man/PPC-scatterplots.Rd c7e647837b02bcf5ac231790676d8d08 *man/PPC-test-statistics.Rd 8c854d931b096503e3af1baefe2a5e75 *man/available_ppc.Rd 1b7cadc1126fd56c34270f16c8e7070c *man/bayesplot-colors.Rd 3cc4d84eff97612e071ac39d2982691a *man/bayesplot-extractors.Rd a7a1a6dd978dda7c9444af470bebd7cd *man/bayesplot-helpers.Rd 6c7fcef2b0faf3b7326ea46b056c31be *man/bayesplot-package.Rd b16d02354d4225e880b0cc38ff88a447 *man/bayesplot_grid.Rd c73a36bceddb26f3249b45b772bfdc3a *man/bayesplot_theme_get.Rd 4b1caa90a5df53fcf0087d7e581ac868 *man/example-data.Rd 2086b1be7cc00327ba8349fc6feb32e0 *man/figures/bayesplot1.png ede90ece919edcd2d3551ea0f525dcb2 *man/figures/bayesplot2.png 965e05f4a784f6e9574bb8674a69ab41 *man/figures/bayesplot3.png 5fad10a5cc62c59ea429a5ce90191e2e *man/figures/stanlogo.png 661aecf57d83d86a2031bd0978c9ce42 *man/pp_check.Rd 2913309c8af7f6f32aff9bc335865118 *man/reexports.Rd eb656910393b8e04b4e12ff7665daf86 *man/theme_default.Rd e50398be2d8e23ce2533bb4b31c168c9 *man/tidy-params.Rd 3b2232242539063d370a8482b4cee74b *tests/testthat.R 2efe9d564d3fec42e93ab7315234c711 *tests/testthat/data-for-binomial.rda f46f0d9abe37a13a71b16fd54ec7a0a1 *tests/testthat/data-for-mcmc-tests.R a8cbd0bad3deb013b2046f42caa858aa *tests/testthat/data-for-ppc-tests.R 574f84dbb56d0a2d100e4c0e4d8189d4 *tests/testthat/test-aesthetics.R 88c0e4e223e2fd3a05de58420c123a58 *tests/testthat/test-available_ppc.R 86c977993df2a464cacd748af62d52f0 *tests/testthat/test-bayesplot_grid.R e5c4eb57c5b3e8b09c60bf84e9162697 *tests/testthat/test-convenience-functions.R 841de6c0a8463eabcefd3c1507517a39 *tests/testthat/test-example-draws.R fc1afb3236921b5c93dc638956e4cc4d *tests/testthat/test-extractors.R ac86332d9c5611849822fb84338e977a *tests/testthat/test-helpers-mcmc.R 20c2bfdae465d71cdccabbf9513d5e7b *tests/testthat/test-helpers-ppc.R bd0f37291bd7486c440262910f7cbd53 *tests/testthat/test-helpers-shared.R 5ba09953d1289bc623ad86ea74a75493 *tests/testthat/test-mcmc-combo.R d595d43f2e7ab4af6067a5a760ab2d1a *tests/testthat/test-mcmc-diagnostics.R b1a9fed5a9c28f9c20cb31ac661a0596 *tests/testthat/test-mcmc-distributions.R a3652502ac59ba01d3d18fe81a3a4df4 *tests/testthat/test-mcmc-intervals.R 223054cea51144d35400284a21f44775 *tests/testthat/test-mcmc-nuts.R 6761d819cfa86f8dcd3a665af8f17eea *tests/testthat/test-mcmc-recover.R 57f1faf008d3330137f41353ce7f861c *tests/testthat/test-mcmc-scatter-and-parcoord.R 0f0d7703fb686a50d7869af550178314 *tests/testthat/test-mcmc-traces.R 748a1d774ee0bf231bc37b074e0fd8d6 *tests/testthat/test-pp_check.R 9213e751b38a5305aef97b948097e464 *tests/testthat/test-ppc-discrete.R 683cab7e82b46ac2d91192e8c1cc1315 *tests/testthat/test-ppc-distributions.R 6ca6b6ab26d966e1be43775c165155d5 *tests/testthat/test-ppc-errors.R 2dee6b54a7cf86a7bb2f934f59f824d5 *tests/testthat/test-ppc-input-validation.R 7455493b81f9d6dc7b608cd5f1a0d8ea *tests/testthat/test-ppc-intervals.R 615d7c0eb9c8c004d4c559a3557db453 *tests/testthat/test-ppc-loo.R 1d3091631de6161adde2ca3f7dfac569 *tests/testthat/test-ppc-scatterplots.R 14b1750af0bf936e1c40e1dc49d3fdbf *tests/testthat/test-ppc-test-statistics.R 19681167bfe81308e45a534ed9beaf79 *vignettes/children/SETTINGS-knitr.txt df950c456c457be19258b064464b6aa5 *vignettes/graphical-ppcs.Rmd 4e78b6380d31ad90798dea1142bfb26d *vignettes/plotting-mcmc-draws.Rmd f2f8deb696e122a8acc3738f193d2bf7 *vignettes/visual-mcmc-diagnostics.Rmd bayesplot/inst/0000755000176200001440000000000014061476543013243 5ustar liggesusersbayesplot/inst/doc/0000755000176200001440000000000014061476543014010 5ustar liggesusersbayesplot/inst/doc/plotting-mcmc-draws.Rmd0000644000176200001440000003020014057717550020343 0ustar liggesusers--- title: "Plotting MCMC draws using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Plotting MCMC draws} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") ``` ## Introduction This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html), and graphical posterior predictive model checking is covered in the vignette [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html). ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example model The **bayesplot** package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model. In this vignette we'll use draws obtained using the `stan_glm` function in the **rstanarm** package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the **bayesplot** package. See, for example, **brms**, which, like **rstanarm**, calls the **rstan** package internally to use [Stan](https://mc-stan.org/)'s MCMC sampler. ```{r mtcars} head(mtcars) # see help("mtcars") ``` ```{r, eval=FALSE} # linear regression model using stan_glm # using '~ .' to include all variables fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) print(fit) ``` ```{r stan_glm, include=FALSE} fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ``` ```{r print-fit, echo=FALSE} print(fit) ``` To use the posterior draws with the functions in the **bayesplot** package we'll extract them from the fitted model object: ```{r get-draws} posterior <- as.array(fit) dim(posterior) dimnames(posterior) ``` We've used `as.array` above (as opposed to `as.matrix`) because it keeps the Markov chains separate (`stan_glm` runs four chains by default). Most of the plots don't actually need the chains to be separate, but for a few of the plots we make in this vignette we'll want to show the chains individually.
## Posterior uncertainty intervals For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called "credible intervals") in various ways. **bayesplot** currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases). **Documentation:** * `help("MCMC-intervals")` * [mc-stan.org/bayesplot/reference/MCMC-intervals](https://mc-stan.org/bayesplot/reference/MCMC-intervals.html) ------ #### mcmc_intervals, mcmc_areas Central posterior uncertainty intervals can be plotted using the `mcmc_intervals` function. ```{r mcmc_intervals} color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ``` The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the `prob` and `prob_outer` arguments, respectively. The points in the above plot are posterior medians. The `point_est` argument can be used to select posterior means instead or to omit the point estimates. To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the `mcmc_areas` function. ```{r mcmc_areas} mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ```
## Univariate marginal posterior distributions **bayesplot** provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate. **Documentation:** * `help("MCMC-distributions")` * [mc-stan.org/bayesplot/reference/MCMC-distributions](https://mc-stan.org/bayesplot/reference/MCMC-distributions.html) ------ #### mcmc_hist The `mcmc_hist` function plots marginal posterior distributions (combining all chains): ```{r mcmc_hist, message=FALSE} color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ``` If we want to plot `log(sigma)` rather than `sigma` we can either transform the draws in advance or use the `transformations` argument. ```{r mcmc_hist-transform, message=FALSE} color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ``` Most of the other functions for plotting MCMC draws also have a `transformations` argument. #### mcmc_hist_by_chain To view separate histograms of each of the four Markov chains we can use `mcmc_hist_by_chain`, which plots each chain in a separate facet in the plot. ```{r mcmc_hist_by_chain, message=FALSE} color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens The `mcmc_dens` function is similar to `mcmc_hist` but plots kernel density estimates instead of histograms. ```{r mcmc_dens, message=FALSE} color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ``` #### mcmc_dens_overlay Like `mcmc_hist_by_chain`, the `mcmc_dens_overlay` function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid. ```{r mcmc_dens_overlay, message=FALSE} mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ``` #### mcmc_violin The `mcmc_violin` function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles. ```{r mcmc_violin} color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ```
## Bivariate plots Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. **Documentation:** * `help("MCMC-scatterplots")` * [mc-stan.org/bayesplot/reference/MCMC-scatterplots](https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html) ------ #### mcmc_scatter The `mcmc_scatter` function creates a simple scatterplot of two parameters. ```{r mcmc_scatter} color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ``` #### mcmc_hex The `mcmc_hex` function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting. ```{r mcmc_hex} # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ``` #### mcmc_pairs In addition to `mcmc_scatter` and `mcmc_hex`, __bayesplot__ now provides an `mcmc_pairs` function for creating pairs plots with more than two parameters. ```{r mcmc_pairs, message=FALSE} color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ``` The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting `diag_fun="dens"`. Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting `off_diag_fun="hex"`. By default, `mcmc_pairs` shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the `condition` argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette.
## Trace plots Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that **bayesplot** can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette provides an example of also adding information about divergences to trace plots. **Documentation:** * `help("MCMC-traces")` * [mc-stan.org/bayesplot/reference/MCMC-traces](https://mc-stan.org/bayesplot/reference/MCMC-traces.html) ------- #### mcmc_trace The `mcmc_trace` function creates standard trace plots: ```{r mcmc_trace} color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ``` If it's hard to see the difference between the chains we can change to a mixed color scheme, for example: ```{r change-scheme} color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ``` The code above also illustrates the use of the `facet_args` argument, which is a list of parameters passed to `facet_wrap` in __ggplot2__. Specifying `ncol=1` means the trace plots will be stacked in a single column rather than placed side by side, and `strip.position="left"` moves the facet labels to the y-axis (instead of above each facet). The [`"viridis"` color scheme](https://CRAN.R-project.org/package=viridis) is also useful for trace plots because it is comprised of very distinct colors: ```{r viridis-scheme, eval=FALSE} color_scheme_set("viridis") mcmc_trace(posterior, pars = "(Intercept)") ``` #### mcmc_trace_highlight The `mcmc_trace_highlight` function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the `highlight` argument). ```{r mcmc_trace_highlight} mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) ```
## References Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper))
Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. (2017). *Stan Modeling Language Users Guide and Reference Manual*. https://mc-stan.org/users/documentation/ bayesplot/inst/doc/graphical-ppcs.Rmd0000644000176200001440000003634314057717550017363 0ustar liggesusers--- title: "Graphical posterior predictive checks using the bayesplot package" author: "Jonah Gabry" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Graphical posterior predictive checks} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("ggplot2") library("rstanarm") set.seed(840) ``` ## Introduction This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and MCMC diagnostics are covered in the [_Visual MCMC diagnostics_](https://mc-stan.org/bayesplot/articles/visual-mcmc-diagnostics.html) vignette. ### Graphical posterior predictive checks (PPCs) The **bayesplot** package provides various plotting functions for _graphical posterior predictive checking_, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution ([Gabry et al, 2019](#gabry2019)). The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the _posterior predictive distribution_. This is the distribution of the outcome variable implied by a model after using the observed data $y$ (a vector of $N$ outcome values) to update our beliefs about unknown model parameters $\theta$. The posterior predictive distribution for observation $\widetilde{y}$ can be written as $$p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.$$ Typically we will also condition on $X$ (a matrix of predictor variables). For each draw (simulation) $s = 1, \ldots, S$ of the parameters from the posterior distribution, $\theta^{(s)} \sim p(\theta \,|\, y)$, we draw an entire vector of $N$ outcomes $\widetilde{y}^{(s)}$ from the posterior predictive distribution by simulating from the data model conditional on parameters $\theta^{(s)}$. The result is an $S \times N$ matrix of draws $\widetilde{y}$. When simulating from the posterior predictive distribution we can use either the same values of the predictors $X$ that we used when fitting the model or new observations of those predictors. When we use the same values of $X$ we denote the resulting simulations by $y^{rep}$, as they can be thought of as replications of the outcome $y$ rather than predictions for future observations ($\widetilde{y}$ using predictors $\widetilde{X}$). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation. Using the replicated datasets drawn from the posterior predictive distribution, the functions in the **bayesplot** package create various graphical displays comparing the observed data $y$ to the replications. The names of the **bayesplot** plotting functions for posterior predictive checking all have the prefix `ppc_`. ### Setup In addition to **bayesplot** we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstanarm__, for fitting the example models used throughout the vignette ```{r, eval=FALSE} library("bayesplot") library("ggplot2") library("rstanarm") ``` ### Example models To demonstrate some of the various PPCs that can be created with the **bayesplot** package we'll use an example of comparing Poisson and Negative binomial regression models from one of the **rstanarm** [package vignettes](https://mc-stan.org/rstanarm/articles/count.html) (Gabry and Goodrich, 2017). > We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. [...] The regression predictors for the model are the pre-treatment number of roaches `roach1`, the treatment indicator `treatment`, and a variable `senior` indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure [...]. First we fit a Poisson regression model with outcome variable `y` representing the roach count in each apartment at the end of the experiment. ```{r roaches-data} head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ``` ```{r roaches-model-pois, message=FALSE} # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ``` ```{r print-pois} print(fit_poisson) ``` We'll also fit the negative binomial model that we'll compare to the Poisson: ```{r roaches-model-nb, message=FALSE} fit_nb <- update(fit_poisson, family = "neg_binomial_2") ``` ```{r print-nb} print(fit_nb) ``` ### Defining `y` and `yrep` In order to use the PPC functions from the **bayesplot** package we need a vector `y` of outcome values, ```{r y} y <- roaches$y ``` and a matrix `yrep` of draws from the posterior predictive distribution, ```{r yrep} yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ``` Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in `y`. Since we fit the models using __rstanarm__ we used its special `posterior_predict` function, but if we were using a model fit with the __rstan__ package we could create `yrep` in the `generated quantities` block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with **bayesplot** regardless of whether or not the model was fit using an interface to Stan. **bayesplot** just requires a `yrep` matrix that has `number_of_draws` rows and `number_of_observations` columns.
## Histograms and density estimates #### ppc_dens_overlay The first PPC we'll look at is a comparison of the distribution of `y` and the distributions of some of the simulated datasets (rows) in the `yrep` matrix. ```{r ppc_dens_overlay} color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ``` In the plot above, the dark line is the distribution of the observed outcomes `y` and each of the 50 lighter lines is the kernel density estimate of one of the replications of `y` from the posterior predictive distribution (i.e., one of the rows in `yrep`). This plot makes it easy to see that this model fails to account for the large proportion of zeros in `y`. That is, the model predicts fewer zeros than were actually observed. To see the discrepancy at the lower values of more clearly we can use the `xlim` function from **ggplot2** to restrict the range of the x-axis: ```{r ppc_dens_overlay-2, message=FALSE, warning=FALSE} ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ``` See Figure 6 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_dens_overlay`. #### ppc_hist We could see the same thing from a different perspective by looking at separate histograms of `y` and some of the `yrep` datasets using the `ppc_hist` function: ```{r ppc_hist, message=FALSE} ppc_hist(y, yrep_poisson[1:5, ]) ``` The same plot for the negative binomial model looks much different: ```{r ppc_hist-nb, message=FALSE} ppc_hist(y, yrep_nb[1:5, ]) ``` The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in: ```{r ppc_hist-nb-2, message=FALSE} ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ```
## Distributions of test statistics Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in `yrep` and compare to the proportion of observed zeros in `y`. #### ppc_stat First we define a function that takes a vector as input and returns the proportion of zeros: ```{r prop_zero} prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ``` The `stat` argument to `ppc_stat` accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify `stat = "prop_zero"` since we've already defined the `prop_zero` function, but we also could have used `stat = function(x) mean(x == 0)`. ```{r ppc_stat, message=FALSE} ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ``` The dark line is at the value $T(y)$, i.e. the value of the test statistic computed from the observed $y$, in this case `prop_zero(y)`. The lighter area on the left is actually a histogram of the proportion of zeros in in the `yrep` simulations, but it can be hard to see because almost none of the simulated datasets in `yrep` have any zeros. Here's the same plot for the negative binomial model: ```{r ppc_stat-nb, message=FALSE} ppc_stat(y, yrep_nb, stat = "prop_zero") ``` Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson. However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial: ```{r ppc_stat-max, message=FALSE} ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ``` See Figure 7 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat`.
## Other PPCs and PPCs by group There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see `help("PPC-overview")` from R or the [online documentation](https://mc-stan.org/bayesplot/reference/index.html#section-ppc) on the Stan website. The `available_ppc` function can also be used to list the names of all PPC plotting functions: ```{r available_ppc} available_ppc() ``` Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in `_grouped` and will accept an additional argument `group`. The full list of currently available `_grouped` functions is: ```{r available_ppc-grouped} available_ppc(pattern = "_grouped") ``` #### ppc_stat_grouped For example, `ppc_stat_grouped` is the same as `ppc_stat` except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level: ```{r ppc_stat_grouped, message=FALSE} ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ``` See Figure 8 in [Gabry et al. (2019)](#gabry2019) for another example of using `ppc_stat_grouped`.
## Providing an interface to bayesplot PPCs from another package The **bayesplot** package provides the S3 generic function `pp_check`. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis. To provide an interface to **bayesplot** from your package, you can very easily define a `pp_check` method (or multiple `pp_check` methods) for the fitted model objects created by your package. All a `pp_check` method needs to do is provide the `y` vector and `yrep` matrix arguments to the various plotting functions included in **bayesplot**. ### Defining a `pp_check` method Here is an example for how to define a simple `pp_check` method in a package that creates fitted model objects of class `"foo"`. We will define a method `pp_check.foo` that extracts the data `y` and the draws from the posterior predictive distribution `yrep` from an object of class `"foo"` and then calls one of the plotting functions from **bayesplot**. Suppose that objects of class `"foo"` are lists with named components, two of which are `y` and `yrep`. Here's a simple method `pp_check.foo` that offers the user the option of two different plots: ```{r pp_check.foo} # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ``` To try out `pp_check.foo` we can just make a list with `y` and `yrep` components and give it class `foo`: ```{r foo-object} x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ``` ```{r pp_check-1, message=FALSE} color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ``` ```{r pp_check-2} color_scheme_set("darkgray") pp_check(x, type = "overlaid") ``` ### Examples of `pp_check` methods in other packages Several packages currently use this approach to provide an interface to **bayesplot**'s graphical posterior predictive checks. See, for example, the `pp_check` methods in the [**rstanarm**](https://CRAN.R-project.org/package=rstanarm) and [**brms**](https://CRAN.R-project.org/package=brms) packages.
## References Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ bayesplot/inst/doc/graphical-ppcs.R0000644000176200001440000001132214061476312017021 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("ggplot2") library("rstanarm") set.seed(840) ## ---- eval=FALSE-------------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstanarm") ## ----roaches-data------------------------------------------------------------- head(roaches) # see help("rstanarm-datasets") roaches$roach100 <- roaches$roach1 / 100 # pre-treatment number of roaches (in 100s) ## ----roaches-model-pois, message=FALSE---------------------------------------- # using rstanarm's default priors. For details see the section on default # weakly informative priors at https://mc-stan.org/rstanarm/articles/priors.html fit_poisson <- stan_glm( y ~ roach100 + treatment + senior, offset = log(exposure2), family = poisson(link = "log"), data = roaches, seed = 1111, refresh = 0 # suppresses all output as of v2.18.1 of rstan ) ## ----print-pois--------------------------------------------------------------- print(fit_poisson) ## ----roaches-model-nb, message=FALSE------------------------------------------ fit_nb <- update(fit_poisson, family = "neg_binomial_2") ## ----print-nb----------------------------------------------------------------- print(fit_nb) ## ----y------------------------------------------------------------------------ y <- roaches$y ## ----yrep--------------------------------------------------------------------- yrep_poisson <- posterior_predict(fit_poisson, draws = 500) yrep_nb <- posterior_predict(fit_nb, draws = 500) dim(yrep_poisson) dim(yrep_nb) ## ----ppc_dens_overlay--------------------------------------------------------- color_scheme_set("brightblue") ppc_dens_overlay(y, yrep_poisson[1:50, ]) ## ----ppc_dens_overlay-2, message=FALSE, warning=FALSE------------------------- ppc_dens_overlay(y, yrep_poisson[1:50, ]) + xlim(0, 150) ## ----ppc_hist, message=FALSE-------------------------------------------------- ppc_hist(y, yrep_poisson[1:5, ]) ## ----ppc_hist-nb, message=FALSE----------------------------------------------- ppc_hist(y, yrep_nb[1:5, ]) ## ----ppc_hist-nb-2, message=FALSE--------------------------------------------- ppc_hist(y, yrep_nb[1:5, ], binwidth = 20) + coord_cartesian(xlim = c(-1, 300)) ## ----prop_zero---------------------------------------------------------------- prop_zero <- function(x) mean(x == 0) prop_zero(y) # check proportion of zeros in y ## ----ppc_stat, message=FALSE-------------------------------------------------- ppc_stat(y, yrep_poisson, stat = "prop_zero", binwidth = 0.005) ## ----ppc_stat-nb, message=FALSE----------------------------------------------- ppc_stat(y, yrep_nb, stat = "prop_zero") ## ----ppc_stat-max, message=FALSE---------------------------------------------- ppc_stat(y, yrep_poisson, stat = "max") ppc_stat(y, yrep_nb, stat = "max") ppc_stat(y, yrep_nb, stat = "max", binwidth = 100) + coord_cartesian(xlim = c(-1, 5000)) ## ----available_ppc------------------------------------------------------------ available_ppc() ## ----available_ppc-grouped---------------------------------------------------- available_ppc(pattern = "_grouped") ## ----ppc_stat_grouped, message=FALSE------------------------------------------ ppc_stat_grouped(y, yrep_nb, group = roaches$treatment, stat = "prop_zero") ## ----pp_check.foo------------------------------------------------------------- # @param object An object of class "foo". # @param type The type of plot. # @param ... Optional arguments passed on to the bayesplot plotting function. pp_check.foo <- function(object, type = c("multiple", "overlaid"), ...) { type <- match.arg(type) y <- object[["y"]] yrep <- object[["yrep"]] stopifnot(nrow(yrep) >= 50) samp <- sample(nrow(yrep), size = ifelse(type == "overlaid", 50, 5)) yrep <- yrep[samp, ] if (type == "overlaid") { ppc_dens_overlay(y, yrep, ...) } else { ppc_hist(y, yrep, ...) } } ## ----foo-object--------------------------------------------------------------- x <- list(y = rnorm(200), yrep = matrix(rnorm(1e5), nrow = 500, ncol = 200)) class(x) <- "foo" ## ----pp_check-1, message=FALSE------------------------------------------------ color_scheme_set("purple") pp_check(x, type = "multiple", binwidth = 0.3) ## ----pp_check-2--------------------------------------------------------------- color_scheme_set("darkgray") pp_check(x, type = "overlaid") bayesplot/inst/doc/plotting-mcmc-draws.html0000644000176200001440000375551614061476335020616 0ustar liggesusers Plotting MCMC draws using the bayesplot package

Plotting MCMC draws using the bayesplot package

Jonah Gabry

2021-06-13

Introduction

This vignette focuses on plotting parameter estimates from MCMC draws. MCMC diagnostic plots are covered in the separate vignette Visual MCMC diagnostics, and graphical posterior predictive model checking is covered in the vignette Graphical posterior predictive checks.

Setup

In addition to bayesplot we’ll load the following packages:

  • ggplot2, in case we want to customize the ggplot objects created by bayesplot
  • rstanarm, for fitting the example models used throughout the vignette

Example model

The bayesplot package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) draws from the posterior distribution of the parameters of a Bayesian model.

In this vignette we’ll use draws obtained using the stan_glm function in the rstanarm package (Gabry and Goodrich, 2017), but MCMC draws from using any package can be used with the functions in the bayesplot package. See, for example, brms, which, like rstanarm, calls the rstan package internally to use Stan’s MCMC sampler.

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
stan_glm
 family:       gaussian [identity]
 formula:      mpg ~ .
 observations: 32
 predictors:   11
------
            Median MAD_SD
(Intercept) 12.0   19.3  
cyl         -0.1    1.1  
disp         0.0    0.0  
hp           0.0    0.0  
drat         0.8    1.6  
wt          -3.7    1.9  
qsec         0.8    0.8  
vs           0.3    2.1  
am           2.6    2.1  
gear         0.6    1.5  
carb        -0.2    0.9  

Auxiliary parameter(s):
      Median MAD_SD
sigma 2.7    0.4   

------
* For help interpreting the printed output see ?print.stanreg
* For info on the priors used see ?prior_summary.stanreg

To use the posterior draws with the functions in the bayesplot package we’ll extract them from the fitted model object:

[1] 1000    4   12
$iterations
NULL

$chains
[1] "chain:1" "chain:2" "chain:3" "chain:4"

$parameters
 [1] "(Intercept)" "cyl"         "disp"        "hp"          "drat"       
 [6] "wt"          "qsec"        "vs"          "am"          "gear"       
[11] "carb"        "sigma"      

We’ve used as.array above (as opposed to as.matrix) because it keeps the Markov chains separate (stan_glm runs four chains by default). Most of the plots don’t actually need the chains to be separate, but for a few of the plots we make in this vignette we’ll want to show the chains individually.


Posterior uncertainty intervals

For models fit using MCMC we can compute posterior uncertainty intervals (sometimes called “credible intervals”) in various ways. bayesplot currently provides plots of central intervals based on quantiles, although additional options may be provided in future releases (e.g., HDIs, which can be useful in particular cases).

Documentation:


mcmc_intervals, mcmc_areas

Central posterior uncertainty intervals can be plotted using the mcmc_intervals function.

The default is to show 50% intervals (the thick segments) and 90% intervals (the thinner outer lines). These defaults can be changed using the prob and prob_outer arguments, respectively. The points in the above plot are posterior medians. The point_est argument can be used to select posterior means instead or to omit the point estimates.

To show the uncertainty intervals as shaded areas under the estimated posterior density curves we can use the mcmc_areas function.


Univariate marginal posterior distributions

bayesplot provides functions for looking at histograms or kernel density estimates of marginal posterior distributions, either with all Markov chains combined or with the chains separate.

Documentation:


mcmc_hist

The mcmc_hist function plots marginal posterior distributions (combining all chains):

If we want to plot log(sigma) rather than sigma we can either transform the draws in advance or use the transformations argument.

Most of the other functions for plotting MCMC draws also have a transformations argument.

mcmc_hist_by_chain

To view separate histograms of each of the four Markov chains we can use mcmc_hist_by_chain, which plots each chain in a separate facet in the plot.

mcmc_dens

The mcmc_dens function is similar to mcmc_hist but plots kernel density estimates instead of histograms.

mcmc_dens_overlay

Like mcmc_hist_by_chain, the mcmc_dens_overlay function separates the Markov chains. But instead of plotting each chain individually, the density estimates are overlaid.

mcmc_violin

The mcmc_violin function plots the density estimates of each chain as violins and draws horizontal line segments at user-specified quantiles.


Bivariate plots

Various functions are available for plotting bivariate marginal posterior distributions. Some of these functions also take optional arguments for adding MCMC diagnostic information to the plots. That additional functionality is discussed in the separate Visual MCMC diagnostics vignette.

Documentation:


mcmc_scatter

The mcmc_scatter function creates a simple scatterplot of two parameters.

mcmc_hex

The mcmc_hex function creates a similar plot but using hexagonal binning, which can be useful to avoid overplotting.

mcmc_pairs

In addition to mcmc_scatter and mcmc_hex, bayesplot now provides an mcmc_pairs function for creating pairs plots with more than two parameters.

The univariate marginal posteriors are shown along the diagonal as histograms, but this can be changed to densities by setting diag_fun="dens". Bivariate plots are displayed above and below the diagonal as scatterplots, but it is also possible to use hex plots by setting off_diag_fun="hex". By default, mcmc_pairs shows some of the Markov chains (half, if an even number of chains) above the diagonal and the others below. There are many more options for controlling how the draws should be split between the plots above and below the diagonal (see the documentation for the condition argument), but they are more useful when MCMC diagnostic information is included. This is discussed in the Visual MCMC diagnostics vignette.


Trace plots

Trace plots are time series plots of Markov chains. In this vignette we show the standard trace plots that bayesplot can make. For models fit using any Stan interface (or Hamiltonian Monte Carlo in general), the Visual MCMC diagnostics vignette provides an example of also adding information about divergences to trace plots.

Documentation:


mcmc_trace

The mcmc_trace function creates standard trace plots:

If it’s hard to see the difference between the chains we can change to a mixed color scheme, for example:

The code above also illustrates the use of the facet_args argument, which is a list of parameters passed to facet_wrap in ggplot2. Specifying ncol=1 means the trace plots will be stacked in a single column rather than placed side by side, and strip.position="left" moves the facet labels to the y-axis (instead of above each facet).

The "viridis" color scheme is also useful for trace plots because it is comprised of very distinct colors:

mcmc_trace_highlight

The mcmc_trace_highlight function uses points instead of lines and reduces the opacity of all but a single chain (which is specified using the highlight argument).


References

Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm

Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

Stan Development Team. (2017). Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

bayesplot/inst/doc/plotting-mcmc-draws.R0000644000176200001440000001000014061476334020013 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("ggplot2") library("rstanarm") ## ---- eval=FALSE-------------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstanarm") ## ----mtcars------------------------------------------------------------------- head(mtcars) # see help("mtcars") ## ---- eval=FALSE-------------------------------------------------------------- # # linear regression model using stan_glm # # using '~ .' to include all variables # fit <- stan_glm(mpg ~ ., data = mtcars, seed = 1111) # print(fit) ## ----stan_glm, include=FALSE-------------------------------------------------- fit <- stan_glm(mpg ~ ., data = mtcars, QR = TRUE, seed = 1111) ## ----print-fit, echo=FALSE---------------------------------------------------- print(fit) ## ----get-draws---------------------------------------------------------------- posterior <- as.array(fit) dim(posterior) dimnames(posterior) ## ----mcmc_intervals----------------------------------------------------------- color_scheme_set("red") mcmc_intervals(posterior, pars = c("cyl", "drat", "am", "sigma")) ## ----mcmc_areas--------------------------------------------------------------- mcmc_areas( posterior, pars = c("cyl", "drat", "am", "sigma"), prob = 0.8, # 80% intervals prob_outer = 0.99, # 99% point_est = "mean" ) ## ----mcmc_hist, message=FALSE------------------------------------------------- color_scheme_set("green") mcmc_hist(posterior, pars = c("wt", "sigma")) ## ----mcmc_hist-transform, message=FALSE--------------------------------------- color_scheme_set("blue") mcmc_hist(posterior, pars = c("wt", "sigma"), transformations = list("sigma" = "log")) ## ----mcmc_hist_by_chain, message=FALSE---------------------------------------- color_scheme_set("brightblue") mcmc_hist_by_chain(posterior, pars = c("wt", "sigma")) ## ----mcmc_dens, message=FALSE------------------------------------------------- color_scheme_set("purple") mcmc_dens(posterior, pars = c("wt", "sigma")) ## ----mcmc_dens_overlay, message=FALSE----------------------------------------- mcmc_dens_overlay(posterior, pars = c("wt", "sigma")) ## ----mcmc_violin-------------------------------------------------------------- color_scheme_set("teal") mcmc_violin(posterior, pars = c("wt", "sigma"), probs = c(0.1, 0.5, 0.9)) ## ----mcmc_scatter------------------------------------------------------------- color_scheme_set("gray") mcmc_scatter(posterior, pars = c("(Intercept)", "wt"), size = 1.5, alpha = 0.5) ## ----mcmc_hex----------------------------------------------------------------- # requires hexbin package if (requireNamespace("hexbin", quietly = TRUE)) { mcmc_hex(posterior, pars = c("(Intercept)", "wt")) } ## ----mcmc_pairs, message=FALSE------------------------------------------------ color_scheme_set("pink") mcmc_pairs(posterior, pars = c("(Intercept)", "wt", "sigma"), off_diag_args = list(size = 1.5)) ## ----mcmc_trace--------------------------------------------------------------- color_scheme_set("blue") mcmc_trace(posterior, pars = c("wt", "sigma")) ## ----change-scheme------------------------------------------------------------ color_scheme_set("mix-blue-red") mcmc_trace(posterior, pars = c("wt", "sigma"), facet_args = list(ncol = 1, strip.position = "left")) ## ----viridis-scheme, eval=FALSE----------------------------------------------- # color_scheme_set("viridis") # mcmc_trace(posterior, pars = "(Intercept)") ## ----mcmc_trace_highlight----------------------------------------------------- mcmc_trace_highlight(posterior, pars = "sigma", highlight = 3) bayesplot/inst/doc/visual-mcmc-diagnostics.html0000644000176200001440000614703014061476543021436 0ustar liggesusers Visual MCMC diagnostics using the bayesplot package

Visual MCMC diagnostics using the bayesplot package

Jonah Gabry and Martin Modrák

2021-06-13

Introduction

This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the n_eff and Rhat statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette Plotting MCMC draws, and graphical posterior predictive model checking is covered in the Graphical posterior predictive checks vignette.

Note that most of these plots can also be browsed interactively using the shinystan package.

Setup

In addition to bayesplot we’ll load the following packages:

  • ggplot2, in case we want to customize the ggplot objects created by bayesplot
  • rstan, for fitting the example models used throughout the vignette

Example model

Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we’ll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the RStan Getting Started wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates y and standard errors sigma from analyses of test prep programs in J=8 schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates.

The model is: \[ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} \] with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code:

// Saved in 'schools_mod_cp.stan'
data {
  int<lower=0> J;
  vector[J] y;
  vector<lower=0>[J] sigma;
}
parameters {
  real mu;
  real<lower=0> tau;
  vector[J] theta;
}
model {
  mu ~ normal(0, 10);
  tau ~ cauchy(0, 10);
  theta ~ normal(mu, tau);
  y ~ normal(theta, sigma);
}

This parameterization of the model is referred to as the centered parameterization (CP). We’ll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector \(\theta\) with a vector \(\eta\) of a priori i.i.d. standard normal parameters and then constructs \(\theta\) deterministically from \(\eta\) by scaling by \(\tau\) and shifting by \(\mu\): \[ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} \] The Stan code for this model is:

// Saved in 'schools_mod_ncp.stan'
data {
  int<lower=0> J;
  vector[J] y;
  vector<lower=0>[J] sigma;
}
parameters {
  real mu;
  real<lower=0> tau;
  vector[J] eta;
}
transformed parameters {
  vector[J] theta;
  theta = mu + tau * eta;
}
model {
  mu ~ normal(0, 10);
  tau ~ cauchy(0, 10);
  eta ~ normal(0, 1); // implies theta ~ normal(mu, tau)
  y ~ normal(theta, sigma);
}

The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the bayesplot diagnostic plots, we’ll see that, for this data, the NCP is required in order to properly explore the posterior distribution.

To fit both models we first translate the Stan code to C++ and compile it using the stan_model function.

We then fit the model by calling Stan’s MCMC algorithm using the sampling function (the increased adapt_delta param is to make the sampler a bit more “careful” and avoid false positive divergences),

Warning: There were 65 divergent transitions after warmup. See
http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
to find out why this is a problem and how to eliminate them.
Warning: Examine the pairs() plot to diagnose sampling problems
Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#bulk-ess
Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#tail-ess

and extract a iterations x chains x parameters array of posterior draws with as.array,

You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see Divergent transitions after warmup. We’ll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.


Diagnostics for the No-U-Turn Sampler

The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by Stan and the various R packages that depend on Stan for fitting Bayesian models. The bayesplot package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts.

Documentation:


The special bayesplot functions for NUTS diagnostics are

bayesplot MCMC module:
(matching pattern '_nuts_') 
  mcmc_nuts_acceptance
  mcmc_nuts_divergence
  mcmc_nuts_energy
  mcmc_nuts_stepsize
  mcmc_nuts_treedepth

Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The bayesplot package provides generic functions log_posterior and nuts_params for extracting this information from fitted model objects. Currently methods are provided for models fit using the rstan, rstanarm and brms packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the log_posterior and nuts_params methods for stanfit objects:

  Chain Iteration      Value
1     1         1  -6.250130
2     1         2  -4.077140
3     1         3  -4.231940
4     1         4  -8.385816
5     1         5  -8.171069
6     1         6 -11.516314
  Chain Iteration     Parameter     Value
1     1         1 accept_stat__ 0.4404223
2     1         2 accept_stat__ 0.3095582
3     1         3 accept_stat__ 0.3334635
4     1         4 accept_stat__ 0.4319445
5     1         5 accept_stat__ 0.8099652
6     1         6 accept_stat__ 0.8981267

In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the Plotting MCMC draws vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We’ll see examples of this in the next section on divergent transitions.

Divergent transitions

When running the Stan models above, there were warnings about divergent transitions. Here we’ll look at diagnosing the source of divergences through visualizations.

mcmc_parcoord

The mcmc_parcoord plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences.

This function works in general without including information about the divergences, but if the optional np argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red).

Here, you may notice that divergences in the centered parameterization happen exclusively when tau, the hierarchical standard deviation, goes near zero and the values of the thetas are essentially fixed. This makes tau immediately suspect. See Gabry et al. (2019) for another example of the parallel coordinates plot.

mcmc_pairs

The mcmc_pairs function can also be used to look at multiple parameters at once, but unlike mcmc_parcoord (which works well even when including several dozen parameters) mcmc_pairs is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes).

Let’s look at how tau interacts with other variables, using only one of the thetas to keep the plot readable:

Note that each bivariate plot is present twice – by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the condition argument for other options). Here, the interaction of tau and theta[1] seems most interesting, as it concentrates the divergences into a tight region.

Further examples of pairs plots and instructions for using the various optional arguments to mcmc_pairs are provided via help("mcmc_pairs").

mcmc_scatter

Using the mcmc_scatter function (with optional argument np) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a “local” parameter (theta[j]) against a “global” scale parameter on which it depends (tau).

We will also use the transformations argument to look at the log of tau, as this is what Stan is doing under the hood for parameters like tau that have a lower bound of zero. That is, even though the draws for tau returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming tau is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative.

First the plot for the centered parameterization:

The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal’s funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space.

The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of tau. When tau is large it allows for large variation in theta (and requires large steps) while small tau requires small steps in theta.

The non-centered parameterization avoids this by sampling the eta parameter which, unlike theta, is a priori independent of tau. Then theta is computed deterministically from the parameters eta, mu and tau afterwards. Here’s the same plot as above, but with eta[1] from non-centered parameterization instead of theta[1] from the centered parameterization:

We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. Gabry et al. (2019) has further discussion of this example.

Ultimately we only care about eta insofar as it enables the Markov chains to better explore the posterior, so let’s directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of theta[1] = mu + eta[1] * tau instead of eta[1]. Below is a side by side comparison with the scatterplot of theta[1] vs log(tau) from the centered parameterization that we made above. We will also force the plots to have the same \(y\)-axis limits, which will make the most important difference much more apparent:

Once we transform the eta values into theta values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution.

mcmc_trace

Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The np argument to the mcmc_trace function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks.

Here is the trace plot for the tau parameter from the centered parameterization:

The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the window argument:

What we see here is that chains can get stuck as tau approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at \(\tau \simeq 0\) – healthy chains jump up and down frequently.

mcmc_nuts_divergence

To understand how the divergences interact with the model globally, we can use the mcmc_nuts_divergence function:

In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn’t being explored and the plot confirms that lp|Divergence indeed has lighter tails than lp|No divergence.

The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown.

Specifying the optional chain argument will overlay the plot just for a particular Markov chain on the plot for all chains combined:

For the non-centered parameterization we may get a few warnings about divergences but if we do we’ll have far fewer of them to worry about.

If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (adapt_delta, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution.

Warning: There were 9 divergent transitions after warmup. See
http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
to find out why this is a problem and how to eliminate them.
Warning: There were 5 transitions after warmup that exceeded the maximum treedepth. Increase max_treedepth above 10. See
http://mc-stan.org/misc/warnings.html#maximum-treedepth-exceeded
Warning: There were 2 chains where the estimated Bayesian Fraction of Missing Information was low. See
http://mc-stan.org/misc/warnings.html#bfmi-low
Warning: Examine the pairs() plot to diagnose sampling problems
Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#bulk-ess
Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#tail-ess

For the first model and this particular data, increasing adapt_delta will not solve the problem and a reparameterization is required.

Energy and Bayesian fraction of missing information

The mcmc_nuts_energy function creates plots similar to those presented in Betancourt (2017). While mcmcm_nuts_divergence can identify light tails and incomplete exploration of the target distribution, the mcmc_nuts_energy function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution.

mcmc_nuts_energy

The plot created by mcmc_nuts_energy shows overlaid histograms of the (centered) marginal energy distribution \(\pi_E\) and the first-differenced distribution \(\pi_{\Delta E}\),

The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right):

The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior:

See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.


General MCMC diagnostics

A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The bayesplot package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for Stan models (or models fit using the same algorithms as Stan).

Documentation:


Rhat: potential scale reduction statistic

One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-\(\hat{R}\). The split-\(\hat{R}\) statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and \(\hat{R}\) will be one. If the chains have not converged to a common distribution, the \(\hat{R}\) statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018).

The bayesplot package provides the functions mcmc_rhat and mcmc_rhat_hist for visualizing \(\hat{R}\) estimates.

First we’ll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high \(\hat{R}\) values.

Warning: There were 48 transitions after warmup that exceeded the maximum treedepth. Increase max_treedepth above 10. See
http://mc-stan.org/misc/warnings.html#maximum-treedepth-exceeded
Warning: Examine the pairs() plot to diagnose sampling problems
Warning: The largest R-hat is 1.68, indicating chains have not mixed.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#r-hat
Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#bulk-ess
Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
http://mc-stan.org/misc/warnings.html#tail-ess

bayesplot provides a generic rhat extractor function, currently with methods defined for models fit using the rstan, rstanarm and brms packages. But regardless of how you fit your model, all bayesplot needs is a vector of \(\hat{R}\) values.

      mu      tau theta[1] theta[2] theta[3] theta[4] theta[5] theta[6] 
1.233756 1.596082 1.300365 1.407283 1.318411 1.169312 1.182541 1.449439 
theta[7] theta[8]     lp__ 
1.138104 1.545858 1.781079 

mcmc_rhat, mcmc_rhat_hist

We can visualize the \(\hat{R}\) values with the mcmc_rhat function:

In the plot, the points representing the \(\hat{R}\) values are colored based on whether they are less than \(1.05\), between \(1.05\) and \(1.1\), or greater than \(1.1\). There is no theoretical reason to trichotomize \(\hat{R}\) values using these cutoffs, so keep in mind that this is just a heuristic.

The \(y\)-axis text is off by default for this plot because it’s only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning \(\hat{R}\) values using the yaxis_text convenience function (which passes arguments like hjust to ggplot2::element_text):

If we look at the same model fit using longer Markov chains we should see all \(\hat{R} < 1.1\), and all points in the plot the same (light) color:

We can see the same information shown by mcmc_rhat but in histogram form using the mcmc_rhat_hist function. See the Examples section in help("mcmc_rhat_hist") for examples.

Effective sample size

The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The \(n_{eff}\) metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are not independent if there is autocorrelation, the effective sample size, \(n_{eff}\), is usually smaller than the total sample size, \(N\) (although it may be larger in some cases1). The larger the ratio of \(n_{eff}\) to \(N\) the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) .

The bayesplot package provides a generic neff_ratio extractor function, currently with methods defined for models fit using the rstan, rstanarm and brms packages. But regardless of how you fit your model, all bayesplot needs is a vector of \(n_{eff}/N\) values. The mcmc_neff and mcmc_neff_hist can then be used to plot the ratios.

mcmc_neff, mcmc_neff_hist

        mu        tau   theta[1]   theta[2]   theta[3]   theta[4]   theta[5] 
0.15021335 0.07713152 0.18891272 0.26013744 0.26751770 0.26380640 0.21677477 
  theta[6]   theta[7]   theta[8]       lp__ 
0.23548641 0.17055964 0.29953307 0.04922169 

In the plot, the points representing the values of \(n_{eff}/N\) are colored based on whether they are less than \(0.1\), between \(0.1\) and \(0.5\), or greater than \(0.5\). These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any \(n_{eff}/N\) less than \(0.1\).

One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of \(n_{eff}\) to \(N\) is that the No-U-Turn sampler used by rstan generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs).

Even for models fit using rstan the parameterization can make a big difference. Here are the \(n_{eff}/N\) plots for fit_cp and fit_ncp side by side.

Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization.

Autocorrelation

As mentioned above, \(n_{eff}/N\) decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the mcmc_acf (line plot) or mcmc_acf_bar (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean.

mcmc_acf, mcmc_acf_bar

Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, \(\theta_1\) is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is \(\eta_1\) (and \(\theta_1\) is later constructed from \(\eta_1\), \(\mu\), and \(\tau\)):


References

Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434

Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695

Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906

Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/

Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. Statistical Science. 7(4): 457–472.

Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. Journal of Machine Learning Research. 15:1593–1623.

Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. Journal of Educational and Behavioral Statistics. 6:377–401.

Stan Development Team. Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/


  1. \(n_{eff} > N\) indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google “antithetic sampling” or visit the relevant forum thread for some further explanation.

bayesplot/inst/doc/visual-mcmc-diagnostics.Rmd0000644000176200001440000007731114061476147021212 0ustar liggesusers--- title: "Visual MCMC diagnostics using the bayesplot package" author: "Jonah Gabry and Martin Modrák" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") vignette: > %\VignetteIndexEntry{Visual MCMC diagnostics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, child="children/SETTINGS-knitr.txt"} ``` ```{r pkgs, include=FALSE} library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development ``` ## Introduction This vignette focuses on MCMC diagnostic plots, in particular on diagnosing divergent transitions and on the `n_eff` and `Rhat` statistics that help you determine that the chains have mixed well. Plots of parameter estimates from MCMC draws are covered in the separate vignette [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html), and graphical posterior predictive model checking is covered in the [_Graphical posterior predictive checks_](https://mc-stan.org/bayesplot/articles/graphical-ppcs.html) vignette. Note that most of these plots can also be browsed interactively using the [shinystan](https://mc-stan.org/shinystan/) package. ### Setup In addition to __bayesplot__ we'll load the following packages: * __ggplot2__, in case we want to customize the ggplot objects created by __bayesplot__ * __rstan__, for fitting the example models used throughout the vignette ```{r setup, eval=FALSE} library("bayesplot") library("ggplot2") library("rstan") ``` ### Example model Before we delve into the actual plotting we need to fit a model to have something to work with. In this vignette we'll use the eight schools example, which is discussed in many places, including Rubin (1981), Gelman et al. (2013), and the [RStan Getting Started](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started#how-to-use-rstan) wiki. This is a simple hierarchical meta-analysis model with data consisting of point estimates `y` and standard errors `sigma` from analyses of test prep programs in `J=8` schools. Ideally we would have the full data from each of the previous studies, but in this case we only have the these estimates. ```{r schools_dat} schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ``` The model is: $$ \begin{align*} y_j &\sim {\rm Normal}(\theta_j, \sigma_j), \quad j = 1,\dots,J \\ \theta_j &\sim {\rm Normal}(\mu, \tau), \quad j = 1, \dots, J \\ \mu &\sim {\rm Normal}(0, 10) \\ \tau &\sim {\rm half-Cauchy}(0, 10), \end{align*} $$ with the normal distribution parameterized by the mean and standard deviation, not the variance or precision. In Stan code: ```{stan stancode1, output.var = "schools_mod_cp"} // Saved in 'schools_mod_cp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] theta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); theta ~ normal(mu, tau); y ~ normal(theta, sigma); } ``` This parameterization of the model is referred to as the centered parameterization (CP). We'll also fit the same statistical model but using the so-called non-centered parameterization (NCP), which replaces the vector $\theta$ with a vector $\eta$ of a priori _i.i.d._ standard normal parameters and then constructs $\theta$ deterministically from $\eta$ by scaling by $\tau$ and shifting by $\mu$: $$ \begin{align*} \theta_j &= \mu + \tau \,\eta_j, \quad j = 1,\dots,J \\ \eta_j &\sim N(0,1), \quad j = 1,\dots,J. \end{align*} $$ The Stan code for this model is: ```{stan, stancode2, output.var = "schools_mod_ncp"} // Saved in 'schools_mod_ncp.stan' data { int J; vector[J] y; vector[J] sigma; } parameters { real mu; real tau; vector[J] eta; } transformed parameters { vector[J] theta; theta = mu + tau * eta; } model { mu ~ normal(0, 10); tau ~ cauchy(0, 10); eta ~ normal(0, 1); // implies theta ~ normal(mu, tau) y ~ normal(theta, sigma); } ``` The centered and non-centered are two parameterizations of the same statistical model, but they have very different practical implications for MCMC. Using the __bayesplot__ diagnostic plots, we'll see that, for this data, the NCP is required in order to properly explore the posterior distribution. To fit both models we first translate the Stan code to C++ and compile it using the `stan_model` function. ```{r compile-models, eval=FALSE} schools_mod_cp <- stan_model("schools_mod_cp.stan") schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ``` We then fit the model by calling Stan's MCMC algorithm using the `sampling` function (the increased `adapt_delta` param is to make the sampler a bit more "careful" and avoid false positive divergences), ```{r fit-models-hidden, results='hide', message=FALSE} fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214053, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ``` and extract a `iterations x chains x parameters` array of posterior draws with `as.array`, ```{r extract-draws} # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ``` You may have noticed the warnings about divergent transitions for the centered parameterization fit. Those are serious business and in most cases indicate that something is wrong with the model and the results should not be trusted. For an explanation of these warnings see [Divergent transitions after warmup](https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup). We'll have a look at diagnosing the source of the divergences first and then dive into some diagnostics that should be checked even if there are no warnings from the sampler.
## Diagnostics for the No-U-Turn Sampler The No-U-Turn Sampler (NUTS, Hoffman and Gelman, 2014) is the variant of Hamiltonian Monte Carlo (HMC) used by [Stan](https://mc-stan.org/) and the various R packages that depend on Stan for fitting Bayesian models. The **bayesplot** package has special functions for visualizing some of the unique diagnostics permitted by HMC, and NUTS in particular. See Betancourt (2017), Betancourt and Girolami (2013), and Stan Development Team (2017) for more details on the concepts. **Documentation:** * `help("MCMC-nuts")` * [mc-stan.org/bayesplot/reference/MCMC-nuts](https://mc-stan.org/bayesplot/reference/MCMC-nuts.html) ------ The special **bayesplot** functions for NUTS diagnostics are ```{r available_mcmc-nuts} available_mcmc(pattern = "_nuts_") ``` Those functions require more information than simply the posterior draws, in particular the log of the posterior density for each draw and some NUTS-specific diagnostic values may be needed. The **bayesplot** package provides generic functions `log_posterior` and `nuts_params` for extracting this information from fitted model objects. Currently methods are provided for models fit using the **rstan**, **rstanarm** and **brms** packages, although it is not difficult to define additional methods for the objects returned by other R packages. For the Stan models we fit above we can use the `log_posterior` and `nuts_params` methods for stanfit objects: ```{r extract-nuts-info} lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` In addition to the NUTS-specific plotting functions, some of the general MCMC plotting functions demonstrated in the [_Plotting MCMC draws_](https://mc-stan.org/bayesplot/articles/plotting-mcmc-draws.html) vignette also take optional arguments that can be used to display important HMC/NUTS diagnostic information. We'll see examples of this in the next section on divergent transitions. ### Divergent transitions When running the Stan models above, there were warnings about divergent transitions. Here we'll look at diagnosing the source of divergences through visualizations. #### mcmc_parcoord The `mcmc_parcoord` plot shows one line per iteration, connecting the parameter values at this iteration. This lets you see global patterns in the divergences. This function works in general without including information about the divergences, but if the optional `np` argument is used to pass NUTS parameter information, then divergences will be colored in the plot (by default in red). ```{r mcmc_parcoord-1} color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ``` Here, you may notice that divergences in the centered parameterization happen exclusively when `tau`, the hierarchical standard deviation, goes near zero and the values of the `theta`s are essentially fixed. This makes `tau` immediately suspect. See [Gabry et al. (2019)](#gabry2019) for another example of the parallel coordinates plot. #### mcmc_pairs The `mcmc_pairs` function can also be used to look at multiple parameters at once, but unlike `mcmc_parcoord` (which works well even when including several dozen parameters) `mcmc_pairs` is more useful for up to ~8 parameters. It shows univariate histograms and bivariate scatter plots for selected parameters and is especially useful in identifying collinearity between variables (which manifests as narrow bivariate plots) as well as the presence of multiplicative non-identifiabilities (banana-like shapes). Let's look at how `tau` interacts with other variables, using only one of the `theta`s to keep the plot readable: ```{r mcmc_pairs} mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ``` Note that each bivariate plot is present twice -- by default each of those contain half of the chains, so you also get to see if the chains produced similar results (see the documentation for the `condition` argument for other options). Here, the interaction of `tau` and `theta[1]` seems most interesting, as it concentrates the divergences into a tight region. Further examples of pairs plots and instructions for using the various optional arguments to `mcmc_pairs` are provided via `help("mcmc_pairs")`. #### mcmc_scatter Using the `mcmc_scatter` function (with optional argument `np`) we can look at a single bivariate plot to investigate it more closely. For hierarchical models, a good place to start is to plot a "local" parameter (`theta[j]`) against a "global" scale parameter on which it depends (`tau`). We will also use the `transformations` argument to look at the log of `tau`, as this is what Stan is doing under the hood for parameters like `tau` that have a lower bound of zero. That is, even though the draws for `tau` returned from Stan are all positive, the parameter space that the Markov chains actual explore is unconstrained. Transforming `tau` is not strictly necessary for the plot (often the plot is still useful without it) but plotting in the unconstrained is often even more informative. First the plot for the centered parameterization: ```{r mcmc_scatter-1} # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ``` The shape of this bivariate distribution resembles a funnel (or tornado). This one in particular is essentially the same as an example referred to as Neal's funnel (details in the Stan manual) and it is a clear indication that the Markov chains are struggling to explore the tip of the funnel, which is narrower than the rest of the space. The main problem is that large steps are required to explore the less narrow regions efficiently, but those steps become too large for navigating the narrow region. The required step size is connected to the value of `tau`. When `tau` is large it allows for large variation in `theta` (and requires large steps) while small `tau` requires small steps in `theta`. The non-centered parameterization avoids this by sampling the `eta` parameter which, unlike `theta`, is _a priori independent_ of `tau`. Then `theta` is computed deterministically from the parameters `eta`, `mu` and `tau` afterwards. Here's the same plot as above, but with `eta[1]` from non-centered parameterization instead of `theta[1]` from the centered parameterization: ```{r mcmc_scatter-2} scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ``` We can see that the funnel/tornado shape is replaced by a somewhat Gaussian blob/cloud and the divergences go away. [Gabry et al. (2019)](#gabry2019) has further discussion of this example. Ultimately we only care about `eta` insofar as it enables the Markov chains to better explore the posterior, so let's directly examine how much more exploration was possible after the reparameterization. For the non-centered parameterization we can make the same scatterplot but use the values of `theta[1] = mu + eta[1] * tau` instead of `eta[1]`. Below is a side by side comparison with the scatterplot of `theta[1]` vs `log(tau)` from the centered parameterization that we made above. We will also force the plots to have the same $y$-axis limits, which will make the most important difference much more apparent: ```{r mcmc_scatter-3} # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ``` Once we transform the `eta` values into `theta` values we actually see an even more pronounced funnel/tornado shape than we have with the centered parameterization. But this is precisely what we want! The non-centered parameterization allowed us to obtain draws from the funnel distribution without having to directly navigate the curvature of the funnel. With the centered parameterization the chains never could make it into the neck of funnel and we see a clustering of divergences and no draws in the tail of the distribution. #### mcmc_trace Another useful diagnostic plot is the trace plot, which is a time series plot of the Markov chains. That is, a trace plot shows the evolution of parameter vector over the iterations of one or many Markov chains. The `np` argument to the `mcmc_trace` function can be used to add a rug plot of the divergences to a trace plot of parameter draws. Typically we can see that at least one of the chains is getting stuck wherever there is a cluster of many red marks. Here is the trace plot for the `tau` parameter from the centered parameterization: ```{r mcmc_trace} color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ``` The first thing to note is that all chains seem to be exploring the same region of parameter values, which is a good sign. But the plot is too crowded to help us diagnose divergences. We may however zoom in to investigate, using the `window` argument: ```{r echo=FALSE} #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ``` ```{r mcmc_trace_zoom} mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ``` What we see here is that chains can get stuck as `tau` approaches zero and spend substantial time in the same region of the parameter space. This is just another indication that there is problematic geometry at $\tau \simeq 0$ -- healthy chains jump up and down frequently. #### mcmc_nuts_divergence To understand how the divergences interact with the model globally, we can use the `mcmc_nuts_divergence` function: ```{r mcmc_nuts_divergence} color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ``` In the top panel we see the distribution of the log-posterior when there was no divergence vs the distribution when there was a divergence. Divergences often indicate that some part of the posterior isn't being explored and the plot confirms that `lp|Divergence` indeed has lighter tails than `lp|No divergence`. The bottom panel shows the same thing but instead of the log-posterior the NUTS acceptance statistic is shown. Specifying the optional `chain` argument will overlay the plot just for a particular Markov chain on the plot for all chains combined: ```{r mcmc_nuts_divergence-chain} mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ``` For the non-centered parameterization we may get a few warnings about divergences but if we do we'll have far fewer of them to worry about. ```{r mcmc_nuts_divergence-2} mcmc_nuts_divergence(np_ncp, lp_ncp) ``` If there are only a few divergences we can often get rid of them by increasing the target acceptance rate (`adapt_delta`, the upper limit is 1), which has the effect of lowering the step size used by the sampler and allowing the Markov chains to explore more complicated curvature in the target distribution. ```{r fit-adapt-delta, results='hide', message=FALSE} fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ``` ```{r echo=FALSE, warning=FALSE} # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ``` For the first model and this particular data, increasing `adapt_delta` will not solve the problem and a reparameterization is required. ```{r mcmc_nuts_divergence-3} mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ``` ### Energy and Bayesian fraction of missing information The `mcmc_nuts_energy` function creates plots similar to those presented in Betancourt (2017). While `mcmcm_nuts_divergence` can identify light tails and incomplete exploration of the target distribution, the `mcmc_nuts_energy` function can identify overly heavy tails that are also challenging for sampling. Informally, the energy diagnostic for HMC (and the related energy-based Bayesian fraction of missing information) quantifies the heaviness of the tails of the posterior distribution. #### mcmc_nuts_energy The plot created by `mcmc_nuts_energy` shows overlaid histograms of the (centered) marginal energy distribution $\pi_E$ and the first-differenced distribution $\pi_{\Delta E}$, ```{r mcmc_nuts_energy-1, message=FALSE} color_scheme_set("red") mcmc_nuts_energy(np_cp) ``` The two histograms ideally look the same (Betancourt, 2017), which is only the case for the non-centered parameterization (right): ```{r mcmc_nuts_energy-3, message=FALSE, fig.width=8} compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ``` The difference between the parameterizations is even more apparent if we force the step size to a smaller value and help the chains explore more of the posterior: ```{r mcmc_nuts_energy-4, message=FALSE, fig.width=8} np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ``` See Betancourt (2017) for more on this particular example as well as the general theory behind the energy plots.
## General MCMC diagnostics A Markov chain generates draws from the target distribution only after it has converged to an equilibrium. Unfortunately, this is only guaranteed in the limit in theory. In practice, diagnostics must be applied to monitor whether the Markov chain(s) have converged. The __bayesplot__ package provides various plotting functions for visualizing Markov chain Monte Carlo (MCMC) diagnostics after fitting a Bayesian model. MCMC draws from any package can be used, although there are a few diagnostic plots that we will see later in this vignette that are specifically intended to be used for [Stan](https://mc-stan.org/) models (or models fit using the same algorithms as Stan). **Documentation:** * `help("MCMC-diagnostics")` * [mc-stan.org/bayesplot/reference/MCMC-diagnostics](https://mc-stan.org/bayesplot/reference/MCMC-diagnostics.html) ------ ### Rhat: potential scale reduction statistic One way to monitor whether a chain has converged to the equilibrium distribution is to compare its behavior to other randomly initialized chains. This is the motivation for the potential scale reduction statistic, split-$\hat{R}$. The split-$\hat{R}$ statistic measures the ratio of the average variance of draws within each chain to the variance of the pooled draws across chains; if all chains are at equilibrium, these will be the same and $\hat{R}$ will be one. If the chains have not converged to a common distribution, the $\hat{R}$ statistic will be greater than one (see Gelman et al. 2013, Stan Development Team 2018). The **bayesplot** package provides the functions `mcmc_rhat` and `mcmc_rhat_hist` for visualizing $\hat{R}$ estimates. First we'll quickly fit one of the models above again, this time intentionally using too few MCMC iterations and allowing more dispersed initial values. This should lead to some high $\hat{R}$ values. ```{r fit_cp_bad_rhat, results='hide'} fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ``` **bayesplot** provides a generic `rhat` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $\hat{R}$ values. ```{r print-rhats} rhats <- rhat(fit_cp_bad_rhat) print(rhats) ``` #### mcmc_rhat, mcmc_rhat_hist We can visualize the $\hat{R}$ values with the `mcmc_rhat` function: ```{r echo=FALSE} #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ``` ```{r mcmc_rhat-1} color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ``` In the plot, the points representing the $\hat{R}$ values are colored based on whether they are less than $1.05$, between $1.05$ and $1.1$, or greater than $1.1$. There is no theoretical reason to trichotomize $\hat{R}$ values using these cutoffs, so keep in mind that this is just a heuristic. The $y$-axis text is off by default for this plot because it's only possible to see the labels clearly for models with very few parameters. We can see the names of the parameters with the concerning $\hat{R}$ values using the `yaxis_text` convenience function (which passes arguments like `hjust` to `ggplot2::element_text`): ```{r mcmc_rhat-2} mcmc_rhat(rhats) + yaxis_text(hjust = 1) ``` If we look at the same model fit using longer Markov chains we should see all $\hat{R} < 1.1$, and all points in the plot the same (light) color: ```{r mcmc_rhat-3} mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ``` We can see the same information shown by `mcmc_rhat` but in histogram form using the `mcmc_rhat_hist` function. See the **Examples** section in `help("mcmc_rhat_hist")` for examples. ### Effective sample size The effective sample size is an estimate of the number of independent draws from the posterior distribution of the estimand of interest. The $n_{eff}$ metric used in Stan is based on the ability of the draws to estimate the true mean value of the parameter, which is related to (but not necessarily equivalent to) estimating other functions of the draws. Because the draws within a Markov chain are _not_ independent if there is autocorrelation, the effective sample size, $n_{eff}$, is usually smaller than the total sample size, $N$ (although it may be larger in some cases[^1]). The larger the ratio of $n_{eff}$ to $N$ the better (see Gelman et al. 2013, Stan Development Team 2018 for more details) . [^1]: $n_{eff} > N$ indicates that the mean estimate of the parameter computed from Stan draws approaches the true mean faster than the mean estimate computed from independent samples from the true posterior (the estimate from Stan has smaller variance). This is possible when the draws are anticorrelated - draws above the mean tend to be well matched with draws below the mean. Other functions computed from draws (quantiles, posterior intervals, tail probabilities) may not necessarily approach the true posterior faster. Google "antithetic sampling" or visit [the relevant forum thread](https://discourse.mc-stan.org/t/n-eff-bda3-vs-stan/2608/19) for some further explanation. The **bayesplot** package provides a generic `neff_ratio` extractor function, currently with methods defined for models fit using the **rstan**, **rstanarm** and **brms** packages. But regardless of how you fit your model, all **bayesplot** needs is a vector of $n_{eff}/N$ values. The `mcmc_neff` and `mcmc_neff_hist` can then be used to plot the ratios. #### mcmc_neff, mcmc_neff_hist ```{r print-neff-ratios} ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ``` In the plot, the points representing the values of $n_{eff}/N$ are colored based on whether they are less than $0.1$, between $0.1$ and $0.5$, or greater than $0.5$. These particular values are arbitrary in that they have no particular theoretical meaning, but a useful heuristic is to worry about any $n_{eff}/N$ less than $0.1$. One important thing to keep in mind is that these ratios will depend not only on the model being fit but also on the particular MCMC algorithm used. One reason why we have such high ratios of $n_{eff}$ to $N$ is that the No-U-Turn sampler used by **rstan** generally produces draws from the posterior distribution with much lower autocorrelations compared to draws obtained using other MCMC algorithms (e.g., Gibbs). Even for models fit using **rstan** the parameterization can make a big difference. Here are the $n_{eff}/N$ plots for `fit_cp` and `fit_ncp` side by side. ```{r mcmc_neff-compare} neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ``` Because of the difference in parameterization, the effective sample sizes are much better for the second model, the non-centered parameterization. ### Autocorrelation As mentioned above, $n_{eff}/N$ decreases as autocorrelation becomes more extreme. We can visualize the autocorrelation using the `mcmc_acf` (line plot) or `mcmc_acf_bar` (bar plot) functions. For the selected parameters, these functions show the autocorrelation for each Markov chain separately up to a user-specified number of lags. Positive autocorrelation is bad (it means the chain tends to stay in the same area between iterations) and you want it to drop quickly to zero with increasing lag. Negative autocorrelation is possible and it is useful as it indicates fast convergence of sample mean towards true mean. #### `mcmc_acf`, `mcmc_acf_bar` Here we can again see a difference when comparing the two parameterizations of the same model. For model 1, $\theta_1$ is the primitive parameter for school 1, whereas for the non-centered parameterization in model 2 the primitive parameter is $\eta_1$ (and $\theta_1$ is later constructed from $\eta_1$, $\mu$, and $\tau$): ```{r mcmc_acf, out.width = "70%"} compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) ```
## References Betancourt, M. (2017). A conceptual introduction to Hamiltonian Monte Carlo. https://arxiv.org/abs/1701.02434 Betancourt, M. (2016). Diagnosing suboptimal cotangent disintegrations in Hamiltonian Monte Carlo. https://arxiv.org/abs/1604.00695 Betancourt, M. and Girolami, M. (2013). Hamiltonian Monte Carlo for hierarchical models. https://arxiv.org/abs/1312.0906 Gabry, J., and Goodrich, B. (2018). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.17.4. https://mc-stan.org/rstanarm/ Gabry, J., Simpson, D., Vehtari, A., Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. _J. R. Stat. Soc. A_, 182: 389-402. \doi:10.1111/rssa.12378. ([journal version](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssa.12378), [arXiv preprint](https://arxiv.org/abs/1709.01449), [code on GitHub](https://github.com/jgabry/bayes-vis-paper)) Gelman, A. and Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. *Statistical Science*. 7(4): 457--472. Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). *Bayesian Data Analysis*. Chapman & Hall/CRC Press, London, third edition. Hoffman, M. D. and Gelman, A. (2014). The No-U-Turn Sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. *Journal of Machine Learning Research*. 15:1593--1623. Rubin, D. B. (1981). Estimation in Parallel Randomized Experiments. *Journal of Educational and Behavioral Statistics*. 6:377--401. Stan Development Team. _Stan Modeling Language Users Guide and Reference Manual_. https://mc-stan.org/users/documentation/ Stan Development Team. (2018). RStan: the R interface to Stan. R package version 2.17.3. https://mc-stan.org/rstan/ bayesplot/inst/doc/visual-mcmc-diagnostics.R0000644000176200001440000002206014061476542020657 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE------------------------------------------- stopifnot(require("knitr")) library("bayesplot") knitr::opts_chunk$set( dev = "png", dpi = 150, fig.asp = 0.618, fig.width = 5, out.width = "60%", fig.align = "center", comment = NA, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE ) ## ----pkgs, include=FALSE------------------------------------------------------ library("bayesplot") library("ggplot2") library("rstan") library("dplyr") #Used only for consistency checks rstan_options(auto_write = TRUE) #Helpful throughout development ## ----setup, eval=FALSE-------------------------------------------------------- # library("bayesplot") # library("ggplot2") # library("rstan") ## ----schools_dat-------------------------------------------------------------- schools_dat <- list( J = 8, y = c(28, 8, -3, 7, -1, 1, 18, 12), sigma = c(15, 10, 16, 11, 9, 11, 10, 18) ) ## ----compile-models, eval=FALSE----------------------------------------------- # schools_mod_cp <- stan_model("schools_mod_cp.stan") # schools_mod_ncp <- stan_model("schools_mod_ncp.stan") ## ----fit-models-hidden, results='hide', message=FALSE------------------------- fit_cp <- sampling(schools_mod_cp, data = schools_dat, seed = 803214053, control = list(adapt_delta = 0.9)) fit_ncp <- sampling(schools_mod_ncp, data = schools_dat, seed = 457721433, control = list(adapt_delta = 0.9)) ## ----extract-draws------------------------------------------------------------ # Extract posterior draws for later use posterior_cp <- as.array(fit_cp) posterior_ncp <- as.array(fit_ncp) ## ----available_mcmc-nuts------------------------------------------------------ available_mcmc(pattern = "_nuts_") ## ----extract-nuts-info-------------------------------------------------------- lp_cp <- log_posterior(fit_cp) head(lp_cp) np_cp <- nuts_params(fit_cp) head(np_cp) # for the second model lp_ncp <- log_posterior(fit_ncp) np_ncp <- nuts_params(fit_ncp) ## ----echo=FALSE, warning=FALSE------------------------------------------------ # On rare occasions, the fits may not be illustrative. Currently the seed is # fixed, but if something in Stan changes and the fixed seeds produce unexpected # results (which should be rare), we want to know. n_divergent_cp <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp <- np_ncp %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp < 10 || n_divergent_cp > 2000) { stop("Unexpected number of divergences in the CP model. Change seed?") } if(n_divergent_ncp > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ## ----mcmc_parcoord-1---------------------------------------------------------- color_scheme_set("darkgray") mcmc_parcoord(posterior_cp, np = np_cp) ## ----mcmc_pairs--------------------------------------------------------------- mcmc_pairs(posterior_cp, np = np_cp, pars = c("mu","tau","theta[1]"), off_diag_args = list(size = 0.75)) ## ----mcmc_scatter-1----------------------------------------------------------- # assign to an object so we can reuse later scatter_theta_cp <- mcmc_scatter( posterior_cp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), # can abbrev. 'transformations' np = np_cp, size = 1 ) scatter_theta_cp ## ----mcmc_scatter-2----------------------------------------------------------- scatter_eta_ncp <- mcmc_scatter( posterior_ncp, pars = c("eta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) scatter_eta_ncp ## ----mcmc_scatter-3----------------------------------------------------------- # A function we'll use several times to plot comparisons of the centered # parameterization (cp) and the non-centered parameterization (ncp). See # help("bayesplot_grid") for details on the bayesplot_grid function used here. compare_cp_ncp <- function(cp_plot, ncp_plot, ncol = 2, ...) { bayesplot_grid( cp_plot, ncp_plot, grid_args = list(ncol = ncol), subtitles = c("Centered parameterization", "Non-centered parameterization"), ... ) } scatter_theta_ncp <- mcmc_scatter( posterior_ncp, pars = c("theta[1]", "tau"), transform = list(tau = "log"), np = np_ncp, size = 1 ) compare_cp_ncp(scatter_theta_cp, scatter_theta_ncp, ylim = c(-8, 4)) ## ----mcmc_trace--------------------------------------------------------------- color_scheme_set("mix-brightblue-gray") mcmc_trace(posterior_cp, pars = "tau", np = np_cp) + xlab("Post-warmup iteration") ## ----echo=FALSE--------------------------------------------------------------- #A check that the chosen window still relevant n_divergent_in_window <- np_cp %>% filter(Parameter == "divergent__" & Value == 1 & Iteration >= 300 & Iteration <= 500) %>% nrow() if(n_divergent_in_window < 6) { divergences <- np_cp %>% filter(Parameter == "divergent__" & Value == 1) %>% select(Iteration) %>% get("Iteration", .) %>% sort() %>% paste(collapse = ",") stop(paste("Too few divergences in the selected window for traceplot zoom. Change the window or the random seed.\nDivergences happened at: ", divergences)) } ## ----mcmc_trace_zoom---------------------------------------------------------- mcmc_trace(posterior_cp, pars = "tau", np = np_cp, window = c(300,500)) + xlab("Post-warmup iteration") ## ----mcmc_nuts_divergence----------------------------------------------------- color_scheme_set("red") mcmc_nuts_divergence(np_cp, lp_cp) ## ----mcmc_nuts_divergence-chain----------------------------------------------- mcmc_nuts_divergence(np_cp, lp_cp, chain = 4) ## ----mcmc_nuts_divergence-2--------------------------------------------------- mcmc_nuts_divergence(np_ncp, lp_ncp) ## ----fit-adapt-delta, results='hide', message=FALSE--------------------------- fit_cp_2 <- sampling(schools_mod_cp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 978245244) fit_ncp_2 <- sampling(schools_mod_ncp, data = schools_dat, control = list(adapt_delta = 0.999), seed = 843256842) ## ----echo=FALSE, warning=FALSE------------------------------------------------ # On rare occasions, the fits may not be illustrative. Currently the seed is fixed, but if something in Stan changes and the fixed seeds produce unexpected results (which should be rare), we want to know. n_divergent_cp_2 <- fit_cp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() n_divergent_ncp_2 <- fit_ncp_2 %>% nuts_params() %>% filter(Parameter == "divergent__" & Value == 1) %>% nrow() if(n_divergent_cp_2 <= 0) { stop("No divergences in CP with increased adapt.delta. Change seed?") } if(n_divergent_ncp_2 > 0) { stop("Divergences in the NCP model. Fix a bug / change seed?") } ## ----mcmc_nuts_divergence-3--------------------------------------------------- mcmc_nuts_divergence(nuts_params(fit_cp_2), log_posterior(fit_cp_2)) mcmc_nuts_divergence(nuts_params(fit_ncp_2), log_posterior(fit_ncp_2)) ## ----mcmc_nuts_energy-1, message=FALSE---------------------------------------- color_scheme_set("red") mcmc_nuts_energy(np_cp) ## ----mcmc_nuts_energy-3, message=FALSE, fig.width=8--------------------------- compare_cp_ncp( mcmc_nuts_energy(np_cp, binwidth = 1/2), mcmc_nuts_energy(np_ncp, binwidth = 1/2) ) ## ----mcmc_nuts_energy-4, message=FALSE, fig.width=8-------------------------- np_cp_2 <- nuts_params(fit_cp_2) np_ncp_2 <- nuts_params(fit_ncp_2) compare_cp_ncp( mcmc_nuts_energy(np_cp_2), mcmc_nuts_energy(np_ncp_2) ) ## ----fit_cp_bad_rhat, results='hide'------------------------------------------ fit_cp_bad_rhat <- sampling(schools_mod_cp, data = schools_dat, iter = 50, init_r = 10, seed = 671254821) ## ----print-rhats-------------------------------------------------------------- rhats <- rhat(fit_cp_bad_rhat) print(rhats) ## ----echo=FALSE--------------------------------------------------------------- #Check that the fit we got is a sensible example if(all(rhats < 1.3)) { stop("All rhats for the short chain run are low. Change seed?") } ## ----mcmc_rhat-1-------------------------------------------------------------- color_scheme_set("brightblue") # see help("color_scheme_set") mcmc_rhat(rhats) ## ----mcmc_rhat-2-------------------------------------------------------------- mcmc_rhat(rhats) + yaxis_text(hjust = 1) ## ----mcmc_rhat-3-------------------------------------------------------------- mcmc_rhat(rhat = rhat(fit_cp)) + yaxis_text(hjust = 0) ## ----print-neff-ratios-------------------------------------------------------- ratios_cp <- neff_ratio(fit_cp) print(ratios_cp) mcmc_neff(ratios_cp, size = 2) ## ----mcmc_neff-compare-------------------------------------------------------- neff_cp <- neff_ratio(fit_cp, pars = c("theta", "mu", "tau")) neff_ncp <- neff_ratio(fit_ncp, pars = c("theta", "mu", "tau")) compare_cp_ncp(mcmc_neff(neff_cp), mcmc_neff(neff_ncp), ncol = 1) ## ----mcmc_acf, out.width = "70%"---------------------------------------------- compare_cp_ncp( mcmc_acf(posterior_cp, pars = "theta[1]", lags = 10), mcmc_acf(posterior_ncp, pars = "eta[1]", lags = 10) ) bayesplot/inst/doc/graphical-ppcs.html0000644000176200001440000116217314061476313017601 0ustar liggesusers Graphical posterior predictive checks using the bayesplot package

Graphical posterior predictive checks using the bayesplot package

Jonah Gabry

2021-06-13

Introduction

This vignette focuses on graphical posterior predictive checks (PPC). Plots of parameter estimates from MCMC draws are covered in the separate vignette Plotting MCMC draws, and MCMC diagnostics are covered in the Visual MCMC diagnostics vignette.

Graphical posterior predictive checks (PPCs)

The bayesplot package provides various plotting functions for graphical posterior predictive checking, that is, creating graphical displays comparing observed data to simulated data from the posterior predictive distribution (Gabry et al, 2019).

The idea behind posterior predictive checking is simple: if a model is a good fit then we should be able to use it to generate data that looks a lot like the data we observed. To generate the data used for posterior predictive checks (PPCs) we simulate from the posterior predictive distribution. This is the distribution of the outcome variable implied by a model after using the observed data \(y\) (a vector of \(N\) outcome values) to update our beliefs about unknown model parameters \(\theta\). The posterior predictive distribution for observation \(\widetilde{y}\) can be written as \[p(\widetilde{y} \,|\, y) = \int p(\widetilde{y} \,|\, \theta) \, p(\theta \,|\, y) \, d\theta.\] Typically we will also condition on \(X\) (a matrix of predictor variables).

For each draw (simulation) \(s = 1, \ldots, S\) of the parameters from the posterior distribution, \(\theta^{(s)} \sim p(\theta \,|\, y)\), we draw an entire vector of \(N\) outcomes \(\widetilde{y}^{(s)}\) from the posterior predictive distribution by simulating from the data model conditional on parameters \(\theta^{(s)}\). The result is an \(S \times N\) matrix of draws \(\widetilde{y}\).

When simulating from the posterior predictive distribution we can use either the same values of the predictors \(X\) that we used when fitting the model or new observations of those predictors. When we use the same values of \(X\) we denote the resulting simulations by \(y^{rep}\), as they can be thought of as replications of the outcome \(y\) rather than predictions for future observations (\(\widetilde{y}\) using predictors \(\widetilde{X}\)). This corresponds to the notation from Gelman et al. (2013) and is the notation used throughout the package documentation.

Using the replicated datasets drawn from the posterior predictive distribution, the functions in the bayesplot package create various graphical displays comparing the observed data \(y\) to the replications. The names of the bayesplot plotting functions for posterior predictive checking all have the prefix ppc_.

Setup

In addition to bayesplot we’ll load the following packages:

  • ggplot2, in case we want to customize the ggplot objects created by bayesplot
  • rstanarm, for fitting the example models used throughout the vignette

Example models

To demonstrate some of the various PPCs that can be created with the bayesplot package we’ll use an example of comparing Poisson and Negative binomial regression models from one of the rstanarm package vignettes (Gabry and Goodrich, 2017).

We want to make inferences about the efficacy of a certain pest management system at reducing the number of roaches in urban apartments. […] The regression predictors for the model are the pre-treatment number of roaches roach1, the treatment indicator treatment, and a variable senior indicating whether the apartment is in a building restricted to elderly residents. Because the number of days for which the roach traps were used is not the same for all apartments in the sample, we include it as an exposure […].

First we fit a Poisson regression model with outcome variable y representing the roach count in each apartment at the end of the experiment.

    y roach1 treatment senior exposure2
1 153 308.00         1      0  0.800000
2 127 331.25         1      0  0.600000
3   7   1.67         1      0  1.000000
4   7   3.00         1      0  1.000000
5   0   2.00         1      0  1.142857
6   0   0.00         1      0  1.000000
stan_glm
 family:       poisson [log]
 formula:      y ~ roach100 + treatment + senior
 observations: 262
 predictors:   4
------
            Median MAD_SD
(Intercept)  3.1    0.0  
roach100     0.7    0.0  
treatment   -0.5    0.0  
senior      -0.4    0.0  

------
* For help interpreting the printed output see ?print.stanreg
* For info on the priors used see ?prior_summary.stanreg

We’ll also fit the negative binomial model that we’ll compare to the Poisson:

stan_glm
 family:       neg_binomial_2 [log]
 formula:      y ~ roach100 + treatment + senior
 observations: 262
 predictors:   4
------
            Median MAD_SD
(Intercept)  2.8    0.2  
roach100     1.3    0.3  
treatment   -0.8    0.2  
senior      -0.3    0.3  

Auxiliary parameter(s):
                      Median MAD_SD
reciprocal_dispersion 0.3    0.0   

------
* For help interpreting the printed output see ?print.stanreg
* For info on the priors used see ?prior_summary.stanreg

Defining y and yrep

In order to use the PPC functions from the bayesplot package we need a vector y of outcome values,

and a matrix yrep of draws from the posterior predictive distribution,

[1] 500 262
[1] 500 262

Each row of the matrix is a draw from the posterior predictive distribution, i.e. a vector with one element for each of the data points in y.

Since we fit the models using rstanarm we used its special posterior_predict function, but if we were using a model fit with the rstan package we could create yrep in the generated quantities block of the Stan program or by doing simulations in R after fitting the model. Draws from the posterior predictive distribution can be used with bayesplot regardless of whether or not the model was fit using an interface to Stan. bayesplot just requires a yrep matrix that has number_of_draws rows and number_of_observations columns.


Histograms and density estimates

ppc_dens_overlay

The first PPC we’ll look at is a comparison of the distribution of y and the distributions of some of the simulated datasets (rows) in the yrep matrix.

In the plot above, the dark line is the distribution of the observed outcomes y and each of the 50 lighter lines is the kernel density estimate of one of the replications of y from the posterior predictive distribution (i.e., one of the rows in yrep). This plot makes it easy to see that this model fails to account for the large proportion of zeros in y. That is, the model predicts fewer zeros than were actually observed.

To see the discrepancy at the lower values of more clearly we can use the xlim function from ggplot2 to restrict the range of the x-axis:

See Figure 6 in Gabry et al. (2019) for another example of using ppc_dens_overlay.

ppc_hist

We could see the same thing from a different perspective by looking at separate histograms of y and some of the yrep datasets using the ppc_hist function:

The same plot for the negative binomial model looks much different:

The negative binomial model does better handling the number of zeros in the data, but it occasionally predicts values that are way too large, which is why the x-axes extend to such high values in the plot and make it difficult to read. To see the predictions for the smaller values more clearly we can zoom in:


Distributions of test statistics

Another way to see that the Poisson model predicts too few zeros is to look at the distribution of the proportion of zeros over the replicated datasets from the posterior predictive distribution in yrep and compare to the proportion of observed zeros in y.

ppc_stat

First we define a function that takes a vector as input and returns the proportion of zeros:

[1] 0.3587786

The stat argument to ppc_stat accepts a function or the name of a function for computing a test statistic from a vector of data. In our case we can specify stat = "prop_zero" since we’ve already defined the prop_zero function, but we also could have used stat = function(x) mean(x == 0).

The dark line is at the value \(T(y)\), i.e. the value of the test statistic computed from the observed \(y\), in this case prop_zero(y). The lighter area on the left is actually a histogram of the proportion of zeros in in the yrep simulations, but it can be hard to see because almost none of the simulated datasets in yrep have any zeros.

Here’s the same plot for the negative binomial model:

Again we see that the negative binomial model does a much better job predicting the proportion of observed zeros than the Poisson.

However, if we look instead at the distribution of the maximum value in the replications, we can see that the Poisson model makes more realistic predictions than the negative binomial:

See Figure 7 in Gabry et al. (2019) for another example of using ppc_stat.


Other PPCs and PPCs by group

There are many additional PPCs available, including plots of predictive intervals, distributions of predictive errors, and more. For links to the documentation for all of the various PPC plots see help("PPC-overview") from R or the online documentation on the Stan website.

The available_ppc function can also be used to list the names of all PPC plotting functions:

bayesplot PPC module:
  ppc_bars
  ppc_bars_grouped
  ppc_boxplot
  ppc_data
  ppc_dens
  ppc_dens_overlay
  ppc_dens_overlay_grouped
  ppc_ecdf_overlay
  ppc_ecdf_overlay_grouped
  ppc_error_binned
  ppc_error_hist
  ppc_error_hist_grouped
  ppc_error_scatter
  ppc_error_scatter_avg
  ppc_error_scatter_avg_vs_x
  ppc_freqpoly
  ppc_freqpoly_grouped
  ppc_hist
  ppc_intervals
  ppc_intervals_data
  ppc_intervals_grouped
  ppc_km_overlay
  ppc_loo_intervals
  ppc_loo_pit
  ppc_loo_pit_data
  ppc_loo_pit_overlay
  ppc_loo_pit_qq
  ppc_loo_ribbon
  ppc_ribbon
  ppc_ribbon_data
  ppc_ribbon_grouped
  ppc_rootogram
  ppc_scatter
  ppc_scatter_avg
  ppc_scatter_avg_grouped
  ppc_stat
  ppc_stat_2d
  ppc_stat_freqpoly_grouped
  ppc_stat_grouped
  ppc_violin_grouped

Many of the available PPCs can also be carried out within levels of a grouping variable. Any function for PPCs by group will have a name ending in _grouped and will accept an additional argument group. The full list of currently available _grouped functions is:

bayesplot PPC module:
(matching pattern '_grouped') 
  ppc_bars_grouped
  ppc_dens_overlay_grouped
  ppc_ecdf_overlay_grouped
  ppc_error_hist_grouped
  ppc_freqpoly_grouped
  ppc_intervals_grouped
  ppc_ribbon_grouped
  ppc_scatter_avg_grouped
  ppc_stat_freqpoly_grouped
  ppc_stat_grouped
  ppc_violin_grouped

ppc_stat_grouped

For example, ppc_stat_grouped is the same as ppc_stat except that the test statistic is computed within levels of the grouping variable and a separate plot is made for each level:

See Figure 8 in Gabry et al. (2019) for another example of using ppc_stat_grouped.


Providing an interface to bayesplot PPCs from another package

The bayesplot package provides the S3 generic function pp_check. Authors of R packages for Bayesian inference are encouraged to define methods for the fitted model objects created by their packages. This will hopefully be convenient for both users and developers and contribute to the use of the same naming conventions across many of the R packages for Bayesian data analysis.

To provide an interface to bayesplot from your package, you can very easily define a pp_check method (or multiple pp_check methods) for the fitted model objects created by your package. All a pp_check method needs to do is provide the y vector and yrep matrix arguments to the various plotting functions included in bayesplot.

Defining a pp_check method

Here is an example for how to define a simple pp_check method in a package that creates fitted model objects of class "foo". We will define a method pp_check.foo that extracts the data y and the draws from the posterior predictive distribution yrep from an object of class "foo" and then calls one of the plotting functions from bayesplot.

Suppose that objects of class "foo" are lists with named components, two of which are y and yrep. Here’s a simple method pp_check.foo that offers the user the option of two different plots:

To try out pp_check.foo we can just make a list with y and yrep components and give it class foo:

Examples of pp_check methods in other packages

Several packages currently use this approach to provide an interface to bayesplot’s graphical posterior predictive checks. See, for example, the pp_check methods in the rstanarm and brms packages.


References

Buerkner, P. (2017). brms: Bayesian Regression Models using Stan. R package version 1.7.0. https://CRAN.R-project.org/package=brms

Gabry, J., and Goodrich, B. (2017). rstanarm: Bayesian Applied Regression Modeling via Stan. R package version 2.15.3. https://mc-stan.org/rstanarm/, https://CRAN.R-project.org/package=rstanarm

Gabry, J. , Simpson, D. , Vehtari, A. , Betancourt, M. and Gelman, A. (2019), Visualization in Bayesian workflow. J. R. Stat. Soc. A, 182: 389-402. :10.1111/rssa.12378. (journal version, arXiv preprint, code on GitHub)

Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., and Rubin, D. B. (2013). Bayesian Data Analysis. Chapman & Hall/CRC Press, London, third edition.

Stan Development Team. Stan Modeling Language Users Guide and Reference Manual. https://mc-stan.org/users/documentation/

bayesplot/inst/CITATION0000644000176200001440000000201014057717550014372 0ustar liggesusersyear <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) bibentry(bibtype = "Misc", title = "bayesplot: Plotting for Bayesian Models", author = c(person("Jonah", "Gabry"), person("Tristan", "Mahr") ), year = year, note = note, url = c("https://mc-stan.org/bayesplot/"), header = "To cite the bayesplot R package:" ) bibentry(bibtype = "Article", title = "Visualization in Bayesian workflow", author = c(person("Jonah", "Gabry"), person("Daniel", "Simpson"), person("Aki", "Vehtari"), person("Michael", "Betancourt"), person("Andrew", "Gelman")), year = "2019", journal = "J. R. Stat. Soc. A", volume = 182, issue = 2, pages = "389-402", doi = "10.1111/rssa.12378", header = "To cite the bayesplot paper 'Visualization in Bayesian workflow':" )