tweenr/0000755000176200001440000000000014026405722011560 5ustar liggesuserstweenr/NAMESPACE0000644000176200001440000000216314026315020012770 0ustar liggesusers# Generated by roxygen2: do not edit by hand export("%>%") export(.complete_states) export(.get_first_frame) export(.get_last_frame) export(.has_frames) export(.max_id) export(.with_later_frames) export(.with_prior_frames) export(close_state) export(display_ease) export(keep_state) export(open_state) export(tween) export(tween_along) export(tween_appear) export(tween_at) export(tween_color) export(tween_color_t) export(tween_colour) export(tween_colour_t) export(tween_components) export(tween_constant) export(tween_constant_t) export(tween_date) export(tween_date_t) export(tween_datetime) export(tween_datetime_t) export(tween_elements) export(tween_events) export(tween_fill) export(tween_numeric) export(tween_numeric_t) export(tween_state) export(tween_states) export(tween_t) importFrom(Rcpp,sourceCpp) importFrom(farver,convert_colour) importFrom(grDevices,col2rgb) importFrom(grDevices,rgb) importFrom(graphics,plot) importFrom(magrittr,"%>%") importFrom(rlang,"%||%") importFrom(rlang,enquo) importFrom(rlang,eval_tidy) importFrom(rlang,quo_is_missing) importFrom(rlang,quo_is_null) importFrom(utils,head) useDynLib(tweenr) tweenr/LICENSE0000644000176200001440000000006113252477477012602 0ustar liggesusersYEAR: 2018 COPYRIGHT HOLDER: Thomas Lin Pedersen tweenr/README.md0000644000176200001440000001074214026311417013040 0ustar liggesusers # tweenr [![R-CMD-check](https://github.com/thomasp85/tweenr/workflows/R-CMD-check/badge.svg)](https://github.com/thomasp85/tweenr/actions) [![CRAN\_Release\_Badge](http://www.r-pkg.org/badges/version-ago/tweenr)](https://CRAN.R-project.org/package=tweenr) [![CRAN\_Download\_Badge](http://cranlogs.r-pkg.org/badges/tweenr)](https://CRAN.R-project.org/package=tweenr) [![Coverage Status](https://img.shields.io/codecov/c/github/thomasp85/tweenr/master.svg)](https://codecov.io/github/thomasp85/tweenr?branch=master) [![Codecov test coverage](https://codecov.io/gh/thomasp85/tweenr/branch/master/graph/badge.svg)](https://codecov.io/gh/thomasp85/tweenr?branch=master) ## What is this? `tweenr` is a package for interpolating data, mainly for animations. It provides a range of functions that take data of different forms and calculate intermediary values. It supports all atomic vector types along with `factor`, `Date`, `POSIXct`, characters representing colours, and `list`. `tweenr` is used extensibly by [`gganimate`](https://github.com/thomasp85/gganimate) to create smooth animations, but can also be used by itself to prepare data for animation in another framework. ## How do I get it? `tweenr` is available on CRAN and can be installed with `install.packages('tweenr')`. In order to get the development version you can install it from github with `devtools` ``` r #install.packages('devtools') devtools::install_github('thomasp85/tweenr') ``` ## An example Following is an example of using the pipeable `tween_state()` function with our belowed iris data: ``` r library(tweenr) library(ggplot2) # Prepare the data with some extra columns iris$col <- c('firebrick', 'forestgreen', 'steelblue')[as.integer(iris$Species)] iris$size <- 4 iris$alpha <- 1 iris <- split(iris, iris$Species) # Here comes tweenr iris_tween <- iris$setosa %>% tween_state(iris$versicolor, ease = 'cubic-in-out', nframes = 30) %>% keep_state(10) %>% tween_state(iris$virginica, ease = 'elastic-out', nframes = 30) %>% keep_state(10) %>% tween_state(iris$setosa, ease = 'quadratic-in', nframes = 30) %>% keep_state(10) # Animate it to show the effect p_base <- ggplot() + geom_point(aes(x = Petal.Length, y = Petal.Width, alpha = alpha, colour = col, size = size)) + scale_colour_identity() + scale_alpha_identity() + scale_size_identity() + coord_cartesian(xlim = range(iris_tween$Petal.Length), ylim = range(iris_tween$Petal.Width)) iris_tween <- split(iris_tween, iris_tween$.frame) for (d in iris_tween) { p <- p_base %+% d plot(p) } ``` ![](man/figures/README-unnamed-chunk-3.gif) ## Other functions Besides the `tween_state()`/`keep_state()` combo showcased above, there are a slew of other functions meant for data in different formats **`tween_components`** takes a single data.frame, a vector of ids identifying recurrent elements, and a vector of timepoints for each row and interpolate each element between its specified time points. **`tween_events`** takes a single data.frame where each row encodes a single unique event, along with a start, and end time and expands the data across a given number of frames. **`tween_along`** takes a single data.frame along with an id and timepoint vector and calculate evenly spaced intermediary values with the possibility of keeping old values at each frame. **`tween_at`** takes two data.frames or vectors along with a numeric vector giving the interpolation point between the two data.frames to calculate. **`tween_fill`** fills missing values in a vector or data.frame by interpolating between previous and next non-missing elements ## Easing In order to get smooth transitions you’d often want a non-linear interpolation. This can be achieved by using an easing function to translate the equidistant interpolation points into new ones. `tweenr` has support for a wide range of different easing functions, all of which can be previewed using `display_ease()` as here where the popular *cubic-in-out* is shown: ``` r tweenr::display_ease('cubic-in-out') ``` ![](man/figures/README-unnamed-chunk-4-1.png) ## Spatial interpolations The purpose of `tweenr` is to interpolate values independently. If paths and polygons needs to be transitioned the [`transformr`](https://github.com/thomasp85/transformr) package should be used as it expands tweenr into the spatial realm tweenr/man/0000755000176200001440000000000013357451062012337 5ustar liggesuserstweenr/man/tween.Rd0000644000176200001440000001120414026314613013740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween.R, R/tween_colour.R, R/tween_constant.R, % R/tween_date.R, R/tween_datetime.R, R/tween_numeric.R \name{tween} \alias{tween} \alias{tween_t} \alias{tween_colour} \alias{tween_color} \alias{tween_colour_t} \alias{tween_color_t} \alias{tween_constant} \alias{tween_constant_t} \alias{tween_date} \alias{tween_date_t} \alias{tween_datetime} \alias{tween_datetime_t} \alias{tween_numeric} \alias{tween_numeric_t} \title{Create simple tweens} \usage{ tween(data, n, ease = "linear") tween_t(data, n, ease = "linear") tween_colour(data, n, ease = "linear") tween_color(data, n, ease = "linear") tween_colour_t(data, n, ease = "linear") tween_color_t(data, n, ease = "linear") tween_constant(data, n, ease = "linear") tween_constant_t(data, n, ease = "linear") tween_date(data, n, ease = "linear") tween_date_t(data, n, ease = "linear") tween_datetime(data, n, ease = "linear") tween_datetime_t(data, n, ease = "linear") tween_numeric(data, n, ease = "linear") tween_numeric_t(data, n, ease = "linear") } \arguments{ \item{data}{A list of vectors or a single vector. In the standard functions each element in the list must be of equal length; for the *_t functions lengths can differ. If a single vector is used it will be eqivalent to using \code{as.list(data)} for the standard functions and \code{list(data)} for the *_t functions.} \item{n}{The number of elements per transition or tween. See details} \item{ease}{The easing function to use for each transition or tween. See details. Defaults to \code{'linear'}} } \value{ A list with an element for each tween. That means that the length of the return is equal to the length of the elements in \code{data} for the standard functions and equal to the length of \code{data} for the *_t functions. } \description{ This set of functions can be used to interpolate between single data types, i.e. data not part of data.frames but stored in vectors. All functions come in two flavours: the standard and a *_t version. The standard reads the data as a list of states, each tween matched element-wise from state to state. The *_t version uses the transposed representation where each element is a vector of states. The standard approach can be used when each tween has the same number of states and you want to control the number of point in each state transition. The latter is useful when each tween consists of different numbers of states and/or you want to specify the total number of points for each tween. } \details{ \code{tween} and \code{tween_t} are wrappers around the other functions that tries to guess the type of input data and choose the appropriate tween function. Unless you have data that could be understood as a colour but is in fact a character vector it should be safe to use these wrappers. It is probably safer and more verbose to use the explicit functions within package code as they circumvent the type inference and checks whether the input data matches the tween function. \code{tween_numeric} will provide a linear interpolation between the points based on the sequence returned by the easing function. \code{tween_date} and \code{tween_datetime} converts to numeric, produces the tweening, and converts back again. \code{tween_colour} converts colours into Lab and does the interpolation there, converting back to sRGB after the tweening is done. \code{tween_constant} is a catchall that converts the input into character and interpolates by switching between states halfway through the transition. The meaning of the \code{n} and \code{ease} arguments differs somewhat between the standard and *_t versions of the functions. In the standard function \code{n} and \code{ease} refers to the length and easing function of each transition, being recycled if necessary to \code{length(data) - 1}. In the *_t functions \code{n} and \code{ease} refers to the total length of each tween and the easing function to be applied to all transition for each tween. The will both be recycled to \code{length(data)}. } \section{Difference Between \code{tween_numeric} and \code{approx()}}{ \code{tween_numeric} (and \code{tween_numeric_t}) is superficially equivalent to \code{\link[stats:approxfun]{stats::approx()}}, but there are differences. \code{\link[stats:approxfun]{stats::approx()}} will create evenly spaced points, at the expense of not including the actual points in the input, while the reverse is true for \code{tween_numeric}. Apart from that \code{tween_numeric} of course supports easing functions and is vectorized. } \examples{ tween_numeric(list(1:3, 10:8, c(20, 60, 30)), 10) tween_colour_t(list(colours()[1:4], colours()[1:2], colours()[25:100]), 100) } tweenr/man/tween_states.Rd0000644000176200001440000000347614026314613015337 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_states.R \name{tween_states} \alias{tween_states} \title{Tween a list of data.frames representing states} \usage{ tween_states(data, tweenlength, statelength, ease, nframes) } \arguments{ \item{data}{A list of data.frames. Each data.frame must contain the same number of rows, but only the first data.frame needs to contain all columns. Subsequent data.frames need only contain the columns that shows change.} \item{tweenlength}{The lengths of the transitions between each state.} \item{statelength}{The length of the pause at each state.} \item{ease}{The easing functions to use for the transitions. See details.} \item{nframes}{The number of frames to generate. The actual number of frames might end up being higher depending on the regularity of \code{tweenlength} and \code{statelength}.} } \value{ A data.frame with the same columns as the first data.frame in \code{data}, but replicated \code{nframes} times. An additional column called \code{.frame} will be added giving the frame number. } \description{ This function is intended to create smooth transitions between states of data. States are defined as full data.frames or data.frames containing only the columns with change. Each state can have a defined period of pause, the transition length between each states can be defined as well as the easing function. } \examples{ data1 <- data.frame( x = 1:20, y = 0, colour = 'forestgreen', stringsAsFactors = FALSE ) data2 <- data1 data2$x <- 20:1 data2$y <- 1 data <- tween_states(list(data1, data2), 3, 1, 'cubic-in-out', 100) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()} } \concept{data.frame tween} tweenr/man/dot-max_id.Rd0000644000176200001440000000073413303774630014657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.max_id} \alias{.max_id} \title{Get the highest id occuring in a dataset} \usage{ .max_id(data) } \arguments{ \item{data}{A data.frame as returned by \code{tween_state}} } \value{ An integer giving the currently highest id } \description{ This is helper for \code{tween_state} related functions to get the currently highest \code{.id} in a frame collection } \keyword{internal} tweenr/man/tween_appear.Rd0000644000176200001440000000327614026314613015302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_appear.R \name{tween_appear} \alias{tween_appear} \title{Tween a data.frame of appearances} \usage{ tween_appear(data, time, timerange, nframes) } \arguments{ \item{data}{A data.frame to tween} \item{time}{The name of the column that holds the time dimension. This does not need to hold time data in the strictest sence - any numerical type will do} \item{timerange}{The range of time to create the tween for. If missing it will defaults to the range of the time column} \item{nframes}{The number of frames to create for the tween. If missing it will create a frame for each full unit in \code{timerange} (e.g. \code{timerange = c(1, 10)} will give \code{nframes = 10})} } \value{ A data.frame as \code{data} but repeated \code{nframes} times and with the additional columns \code{.age} and \code{.frame} } \description{ This function is intended for use when you have a data.frame of events at different time points. This could be the appearance of an observation for example. This function replicates your data \code{nframes} times and calculates the duration of each frame. At each frame each row is assigned an age based on the progression of frames and the entry point of in time for that row. A negative age means that the row has not appeared yet. } \examples{ data <- data.frame( x = rnorm(100), y = rnorm(100), time = sample(50, 100, replace = TRUE) ) data <- tween_appear(data, 'time', nframes = 200) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/tween_components.Rd0000644000176200001440000000676714026314613016227 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_components.R \name{tween_components} \alias{tween_components} \title{Interpolate individual component} \usage{ tween_components( .data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{time}{An unquoted expression giving the timepoint for the different stages of the components. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length, exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This function is much like \code{\link[=tween_elements]{tween_elements()}} but with a slightly different syntax and support for many of the newer features such as enter/exits and tween phase identification. Furthermore it uses tidy evaluation for time and id, making it easier to change these on the fly. The biggest change in terms of functionality compared to \code{tween_elements()} is that the easing function is now given per column and not per row. If different easing functions are needed for each transition then \code{tween_elements()} is needed. } \examples{ from_zero <- function(x) {x$x <- 0; x} data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 10, 4, 8, 10), id = c(1, 1, 1, 2, 2, 2) ) data <- tween_components(data, 'cubic-in-out', nframes = 100, time = time, id = id, enter = from_zero, enter_length = 4) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/dot-get_last_frame.Rd0000644000176200001440000000144713346027207016372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.get_last_frame} \alias{.get_last_frame} \alias{.get_first_frame} \alias{.with_prior_frames} \alias{.with_later_frames} \alias{.has_frames} \title{Helpers for working with tweened data} \usage{ .get_last_frame(data) .get_first_frame(data) .with_prior_frames(prior, new_tween, nframes) .with_later_frames(later, new_tween, nframes) .has_frames(data) } \arguments{ \item{data, prior, later}{A data.frame. If a \code{.frame} column exists it will be interpreted as a data.frame containing multiple states} \item{new_tween}{The result of a tweening} } \value{ A data.frame } \description{ These are internal helpers for extracting and inserting data into a data.frame of tweened states. } \keyword{internal} tweenr/man/tween_events.Rd0000644000176200001440000000666314026314613015341 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_events.R \name{tween_events} \alias{tween_events} \title{Transition in and out of events} \usage{ tween_events( .data, ease, nframes, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0 ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{start, end}{The start (and potential end) of the event encoded in the row, as unquoted expressions. Will be evaluated in the context of \code{.data} so can refer to columns in it. If \code{end = NULL} the event will be without extend and only visible in a single frame, unless \code{enter} and/or \code{exit} is given.} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{enter}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} \item{exit_length}{The lenght of the opening and closing transitions if \code{enter} and/or \code{exit} is given. Measured in the same units as \code{time}} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This tweening function is a more powerful version of \code{\link[=tween_appear]{tween_appear()}}, with support for newer features such as enter/exits and tween phase identification. The tweener treats each row in the data as unique events in time, and creates frames with the correct events present at any given time. } \examples{ d <- data.frame( x = runif(20), y = runif(20), time = runif(20), duration = runif(20, max = 0.1) ) from_left <- function(x) { x$x <- -0.5 x } to_right <- function(x) { x$x <- 1.5 x } tween_events(d, 'cubic-in-out', 50, start = time, end = time + duration, enter = from_left, exit = to_right, enter_length = 0.1, exit_length = 0.05) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/tweenr-package.Rd0000644000176200001440000000337414026314613015524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tweenr_package.R \docType{package} \name{tweenr-package} \alias{tweenr} \alias{tweenr-package} \title{tweenr: Interpolate Data for Smooth Animations} \description{ \if{html}{\figure{logo.png}{options: align='right' alt='logo' width='120'}} In order to create smooth animation between states of data, tweening is necessary. This package provides a range of functions for creating tweened data that can be used as basis for animation. Furthermore it adds a number of vectorized interpolaters for common R data types such as numeric, date and colour. } \details{ tweenr is a small collection of functions to help you in creating intermediary representations of your data, i.e. interpolating states of data. As such it's a great match for packages such as animate and gganimate, since it can work directly with data.frames of data, but it also provide fast and efficient interpolaters for numeric, date, datetime and colour that are vectorized and thus more efficient to use than the build in interpolation functions (mainly \code{\link[stats:approxfun]{stats::approx()}} and \code{\link[grDevices:colorRamp]{grDevices::colorRamp()}}). The main functions for data.frames are \code{\link[=tween_states]{tween_states()}}, \code{\link[=tween_elements]{tween_elements()}} and \code{\link[=tween_appear]{tween_appear()}}, while the standard interpolaters can be found at \code{\link[=tween]{tween()}} } \seealso{ Useful links: \itemize{ \item \url{https://github.com/thomasp85/tweenr} \item Report bugs at \url{https://github.com/thomasp85/tweenr/issues} } } \author{ \strong{Maintainer}: Thomas Lin Pedersen \email{thomasp85@gmail.com} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID}) } tweenr/man/dot-complete_states.Rd0000644000176200001440000000154513277076525016622 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{.complete_states} \alias{.complete_states} \title{Fill in missing rows using enter and exit functions} \usage{ .complete_states(from, to, id, enter, exit, max_id) } \arguments{ \item{from, to}{Data.frames to tween between} \item{id}{The name of the column that holds the matching id} \item{enter, exit}{functions to fill out missing rows in \code{from} and \code{to} respectively} } \value{ A list with the elements \code{from} and \code{to} holding the filled out versions of \code{from} and \code{to} } \description{ This function figures out which rows are missing in either state and applies the provided \code{enter} and \code{exit} functions to fill in the blanks and provide a 1-to-1 relation between the rows in \code{from} and \code{to}. } \keyword{internal} tweenr/man/tween_fill.Rd0000644000176200001440000000152713352357066014767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_fill.R \name{tween_fill} \alias{tween_fill} \title{Fill out missing values by interpolation} \usage{ tween_fill(data, ease) } \arguments{ \item{data}{A data.frame or vector.} \item{ease}{A character vector giving valid easing functions. Recycled to match the ncol of \code{data}} } \value{ If \code{data} is a data.frame then a data.frame with the same columns. If \code{data} is a vector then a vector. } \description{ This tween fills out \code{NA} elements (or \code{NULL} elements if \code{data} is a list) by interpolating between the prior and next non-missing values. } \examples{ # Single vector tween_fill(c(1, NA, NA, NA, NA, NA, 2, 6, NA, NA, NA, -2), 'cubic-in-out') # Data frame tween_fill(mtcars[c(1, NA, NA, NA, NA, 4, NA, NA, NA, 10), ], 'cubic-in') } tweenr/man/tween_along.Rd0000644000176200001440000000363214026314613015126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_along.R \name{tween_along} \alias{tween_along} \title{Interpolate data along a given dimension} \usage{ tween_along( .data, ease, nframes, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE ) } \arguments{ \item{.data}{A data.frame with components at different stages} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{along}{The "time" point for each row} \item{id}{An unquoted expression giving the component id for each row. Will be evaluated in the context of \code{.data} so can refer to a column from that} \item{range}{The range of time points to include in the tween. If \code{NULL} it will use the range of \code{time}} \item{history}{Should earlier datapoints be kept in subsequent frames} \item{keep_last}{Should the last point of each id be kept beyond its time} } \value{ A data.frame with the same columns as \code{.data} along with \code{.id} giving the component id, \code{.phase} giving the state of each component in each frame, and \code{.frame} giving the frame membership of each row. } \description{ This tween takes groups of rows along with the time for each row and calculates the exact value at each at each frame. Further it allows for keeping the subsequent raw data from previous frame as well as letting the final row linger beyond its time. It especially useful for data that should be visualised as lines that are drawn along the x-axis, but can of course also be used for other dimensions as well (even dimensions not corresponding to any axis). } \seealso{ Other data.frame tween: \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_elements}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/figures/0000755000176200001440000000000014026311417013774 5ustar liggesuserstweenr/man/figures/logo.png0000644000176200001440000006324713214437207015462 0ustar liggesusersPNG  IHDRyXiCCPsRGB IEC61966-2.1(uKBA?jabP$]@B >jAנ үCu :AQt\ԥ5O%rwgYJAoAXҢ!\|m EWG#0 ^nZTZW"pa d8%(&kLtkǮd[US=v~ozJ'r}{{|ڽ3.ii~"/!xcڷ'7H[FûqصM{Y_-OKv}vX궫E"}_-]\xL. !wh0#R<kK|p)Ϯ ƶ0 'ӏV'ڟ{GN%;z8hT EUyi+/I?~8ш@OHM:ygsϽQm=/Ci9WySZ_~[޴_x>s>?^}-o Á}ɑm?2 g}>? N;_}S{N/,n|}pxUH𗟼әǎto'r8q*ص|瞓)˿;%{=b,ɑCJdJ3b8"$S*RӅ ۻz~ߕ?o}]687=ǧFHrh{ 3糜|+WU;ڟd|,мӅ'Ϥ9u6CDL}≵xXNJ~3SsJvM>k"ֽ,O_%}~$ $'-+uNIslť|^we1b1dRm}vR~¥C|':s,fx0#SGdU"%.^.{#!OO7 3粜B O1q`Fg2xx}+$xL%wG杖+\Uؿ' ox0Lvl?}a?L||txM n{>YX쌙^Ub8ض5J8̏\#+زDK2{FWPdr ϫ^>( \mؑ>ge\-~b* pPl}d[IxCS있"_8y&3iVx>W&PIƼ$MƼCl!W֔d ڳv{0wރ,/Vħ/u4 e[CxɕgoiB?%{=b<~Lxנ&f,Ap3JwKj* T(iskvb6ٜ25E 23Qxص#JK:ekC-c-T-mOg.ӀHw%+{wrH\(ߚӟTsh TĢk KyNNsZ9"aCJUNYJ\T֟,{}ny  5_+c͘pzx|?}z;|󎭣/>XOO\"8/Iz׋>anJ0!kfq/,֌ jTku[(])om^~EFC{&طm̥S7?w\wO٣u.:5ul]K256mcݼ;PWT{s >JPdC.i6!fs0l4ݦ01͵'li8O o=P6AnÃA2+ 箶ܜtc{x۷aӴ9~2}Lc)QRޏ~m0MΕ.>yqRV%Voezw0 #xy[#!LsJ-aB|MaaYF. wrɼ_p0lsWn~ail wkµn?gWҍ~h? ;]w݉* WƷg'9T;ps©[~~Y cr[8շn'RO\"1t _i| qm=\ͽAw})*UW7n FH}/Upѡ,iS3%4~Rx"%4]}n6 T3Y /f =~~GXǗw UQo-*%_`xȅH5+ߟi驷T#=D &~1`Utwxכs yp8{P7v'귦Y\{}G3;a lc,L.nHF"vY\19]py<"' I"K+5fJ󆂞]Ǣ\[֞7 V95/B!R7:Y$ko`Le2$oF0Bl:~2ٜ۷H7ɿo{ˡ=z._m|^0-T|A aO1=S&_hDWwPUmcamk/֎]f~йÒo9%CW3|h4,sZK*XR5g7G^1/I\S/ihù n0V8zǁ㧖)nĖ0AEkSE %m~EEvnӓS+}dYdaLlGw#aD`YպAotaO}* ^6KDz&#CA~=Iptßغ.p_#_x6<J r>ŧX}dqӓn{"'W_XnaXfasExumYoh у X<&+9&O()0Fdr Q/Ar,I%|7 @flǥe \Q5Q"l+y]/k욈ӥ[^/pcxPP72]ٿ>|^>;] G <0sܜY+Oe$Ï/mG^tWш73 E/Xc Iw *|_: (oWm1\+pb#ɒP;(ū9(2 dzlu4"EgˤuWt " pBseY mJyݾsL`#|y>G8q:/d˷y =A&J1;Mo<4KA;n륧C,/VOzHļCؓ| xDMѕqp֍SI?F#Le,I}$c^B!rY'opfqSPA#KH|_&I"Zh͹#a>O]αmԭ_ɑ/jLٙ`fl#eru%hD.|;3U#50ɸU5WjòBACy"x$,n)oUh[膵 n`O rd7sXxS il2K5laf%UpZe8+^:׿=:#m_ͿT7;*Jђ=QkMc9r U[ut'Ik}AN78qfÑD sfD GmfPo+:$қ1D)T6Ͱ6Ňh+9vٷ3ًWޞzx-rf 7 ɩ"SER C!n۟BmnΕYNپ5JO*t%}gyΓpl|A޶O2/L>#,ݵk9c#Ό+cb<ƅ92M2/zA՚wٻ30W& ,,Uٳ#A2&8A*'8`(ȒbaYH, ,(״1Mr'3?J>Jԥ,Xbt0ľI:'ltN:[ǫJ 7땱,bIgd(ޝqNoO:СY)ߓ Ug.,I)iۻ+e9\j˚oY[4m.^ęeq//D*黥f*zÃkk(kGn;O侞̉1$Ih%\)dswއa؈ L U&_/yevfv.ȉ%|ĝ.,rjbI.Ķ/VCD 𪑎KaG}z%7uG7lL$Ię4/Q( Bp]fVvv7-K5edGo IoWTGRC+7't lt|QY1[ "WhniS(kL͕E-a +TFnV<"} (wg5;OYTh-4b O +Llv|܅'Ϧx:GyZ%oҘH%v|a sRu*"3<$8JHHp^U"RYɺJnwӒ$e(JFf0ΫZH}ģ6. T+4MӎUQ/TG2# { Bed uϖ0L0}g-517 <͹KYLv G80Paf,-Tlf7nXN95!`U3sKwW[I<,ژXhf$ h/AOWK9; %I6֜J-IYֱ,M ֡f3Z7$Qֿ>Up\lz<"Pk+:btNP'Sh+6(5Uj ShNr ""Aw >Lʍ[Ȓ{WrTvX]]f.x)ҶK:?v$fVHWG6ha(kG|Acnޝ \^N Ur2Yh᭒ҥ;Vtne(BS%1/JJ:\b`vbaڤuVru2aSlN>~HP!RUb!w\(H@rFOO$ֺ\lA*%" Н/hJ:[Gq._˓+h؝d$Rݕ *iox(`@kEUrOADe] z8/EMWʓ$q#R(WprU0[nzaʖ0IO-#I"TƷgeю/IgW|ҵgWǁ rq[IԹ4l㈒%4+Vj%MrύOt"iSm>V KH&(y(5lZNn8, Fq6e=њ~|k7=WkfҵkGAp)]5T5OR3M,ZY$_Az,k-7m8fTF& wAUbTr `;n߫HkifEr]57QfRhWDp%f{ݙ`o*LdId%B(Slt<ŕ&{u߃m;-T:\9ex Jq߾I&1:jyU @oM51=;4ɸ_fiΣOMcLA gBa^U"T0MwFjlz>L$ UJUUTխu=RE'w3%~upd:[Y!vD\h2os.dMڰ |kSh_9`處x K.'2uĎmQuo?8Qb$ W;M}\1旪ݤn*Yj)Cl1M#!acke:fi94t7MY$Aа#햢MvgI:JQpCF2|Qñ4E}^t p;Sb6'ΤI%|li;ۥP7Q`TA=fg.kڨu19A$I+T5G:Bcz<"i *:ѐBC{5ZTj5ELv\Zm;覻|Ƈ|LL<&y")Uu!rUG7\dUmExMnΗGʲ؜'.\+/j=Խu[2OXFfJn3eYdxBQ'R,oTkƆNĖ5%w5!ȡ BӲXuMr3 EA5jSf&nB%BK.ϫ0q-Z׭P8lQvJlS 6^Ubq,CݛpcК%FB ҂4j= X[d;O\!s{lmzF7Wr[cb|keƅ+y{XWz5j5xnܸYnɫ>k&Bn*P(k@ K"k7_&U\l҄YexE)5!AbEǴlͅWEA\ 5JlY3"j5C ㆓j \qi.9[fqơ)[vpZiϪ7r7zot\1;17 \֋ky*j\0uLI\HV RpcU, 5"!<;^'U+#5\ vjq7 UZ a텈aK|"R/-AD LB^VihQGYn$ Զ 9eQI:}$Jj%bmPH$^2ن˟ 6n[BIc?At72־b[KWB$A?5 [ZiR?FkǾ XF>6Z7Ԥ0=4<=qe.!CaReWp*8L2PvCRrDv/!5.IW&m(dY\띙/3:"Q[={p1%L$p913cxöOs{{\8s~ 7M{r63W7ZN%3ڤb pdwjg~_w3()>AcBR5A"k9zFuQZ`{bin8F@uR%}wk7Ib]6/A lY嵎xNfKܗ}s|Y,J$ȂGeNR / ^/K~sBYסa$m]wc+6rF[k0@UyÜ^ zv_6"ʭe*XZ&F *c;}%ZDuH4sehTk&qǵLr_nRY<[n@mpMTŲ~MKebIgh š^ $9!_33WX#mfaQM4A`4qlSUR{9²?HW(X]ڃ+yOQ#f&`qN\RB#kڎ1s,rb<AP+;ܿL6 ,Mi3seFCDJk Zi5BΚ;Z}ز2;nIը^hfuW%א* VEze*e-͒M@zqp'C225:`p] nu }AFÌoZJ|MatWLV ]vYFyF"l@X\5)HD5:iñ֬Sޡ̢v4c,M^nFaixmnWgxuvJx G5r$^(2֎WEhlyF~X}eZ3x e,֒1P^,T>q`jc[l XDѱ~T].(ҦmIh&={A8fY:% eH Xa- Ջe;cJaв m Ģ~F$p$_dp)Cw/I &l)W*BbZONHX7JW.A0MY {bs.\N]Ez* .ynqJ_Ǝ&x"͇_d-\Mҗ%]skwEIx$aLfW{Yc)*ekDDҡ UdqqSl զܚE_[Jd/智YbnʁI._oXff˚lft՚G йi\A_w:.HDִd.#I._A= !4+Qxcd\,B8L4:`] Brg[E(tSJ-Dm1%ݥl?/FvKh]#\2  45@mBRHaX8^"D0ņ |!/K>6R$XZ(3>b6i)!kf. K5wr@];8SrnnWKɫ)˛[:ۺqsn43_a8=]~h0Y!G|4T%h։GzŘs},j%\A"%RDDKlx ؠ[ȒGvRV} WEj5c;x\#,JYR,%*K1"# 芟'"6e4A &*TɩL ܚTM鷦iTe׎ш4k׋9&śm:vGϭ]p%GbpPWǴ|AҜ~^W.9Ʊ)t*~qˡUd ^Uj^ꑰmEܟDEh-{dmZ.qGD-$Y[-nҤ#Ю 0$P] (suM~M!ڌx*BHX!|x%ikL[XrK^U4fdh#V nv u3f* 4jM +Ime;\Q`?Ԫ3ဂWTuDQīlqIF8~|KݕE֜!6jfk%E]$" mOze:;)@ւ/M]$sx43_Ft|-vU+ssΜ3KbɶHX@J 8@HH{{KoBPHM[O Ò&%iH!ƛlYk׌F3>;H $Ax$|~}A|G/ Mx p(;4/BШYD9H0=J2 (y^x >rpCSIʄ' C5ӷͬf:y$f&+ 2fp5Ĩdr:&-,~CXqdX$O!rS 8 kP)eaiւyD=c,DH4s%9BVE]W+ZF[EI6_,O)y)XI,^\(hd%p2hBөYĒCTi[J]F<_\NbT #+89S$tryDRErnSH 9#~ÊY3+$-d1+puM5+7WHxI’Mwta+0A`3+Q.X a(Q,ː͕%R1g˄B\F6On J.C.Ohn|iK$|r*>T6%i!J.%"CiSKz-TP1&\䱓kMԖ:: CcrK:Lv+8ATF0Te| IDATRI؟]ZIM#7D(2"S.iT@|,(BCdVȠ٬ CA sNB:5TBYi*SE&XrV3 QOt{ '_vp4CKs qe]$ylYW\ -8^] GsAOΞHt9h,щ TJX i*]? $B$RTT^`Y 9#Qo(LR54%-fgKH&$Ld|4fil߫ݪmVi[9|/q6֝GVH˨X,?Z@*]RZhۛ@Ciai# V:Z RɷF6WDKPSRT\[N r8\%׏0R"Chi!nor@ql&F4AcU0 EDHAAD`v1űDDx 'TD2]@*M%:-YI>T63ae4V\N Z- 6xfr%r,cP @M`F NÑkd~Rknji6:x D8ԺpBlc-Wb+)[J c{Igғ`gs%:$.ha9Qx"%Z[l4*mzur$08ŠZI Z9LzEY^A`AdEOf@RU*hl j K+ fT`M&?7,2դ|ӥ14.v`ۈL kG(ylZj,I*|_Ni+*A`̪$jAiN:MU/Iƶ3d De_ Mz#uP/¢7VFͥ٠D4C(P)Y0 EMijF'""j ryc(2Y*e, J6 8E]fQ"Un>xa²T*Cfqeh /*M]Kcitw%ppyYSy3^:%BCVIrQf1rr9lh+z24֨GguvPycY̹cddOഩ`cEY}i-4P*d𭥰$N r,F I:Jb`jio2U26%Elf%޷,(yhSbs|v/=j",&Sά _|jX0ؿLiW4H_KcQKg J`Z^K39SDM] R _C}V$S방*n^I`r6ϊt]F485(I*/ͥGsv5+ I Zt(Ir%(J: qIu2 N LMyIp`x?l=FLF15(@f {:EQ5!KY"."bxE|y4?ډf^;|}&ڱ^<* YIa'8r\RPk`qGrAVETrr9׏P(q\xc'u఩_Edl,B5 Y{W7`6SUA| ?`o͉tѪC̣Q`G*]ӫhphf@X䭅2(xu%Ka]%]!e(֭~6?o_cY"EA.R)ְHDָģb28^ˡIl!BYuH1huWqIa; &7dD8^/W'Vuغy DJ >mzg'$j(ᖛZp3K:9#-bѓҦ' +ǗZ(#."qbbnj\\ŕg(P!J()R[Tۚ K\1Vku2.J 38u6:C-1>Pz˯{$n Ͽx6 oJ)Aaŗ Ǻ$=͢ğ~f-M{;_lRAQc:=02{%&څmU{>Q~DMĉ18.Fҥ<J%l3EēyDb9i)DbH '*Zg0E zGGWq\}&7qb4 5[+H+լ@_6mgzMׅ7b+_2x2o"V08@_(n@._F.[DqēM twL;2t*}Duv! UE)6HVLդêBCz-r2q_F:SB$j JBLd5E!#FKdul!#gυ1B!h>G !&8*)O(b904~X- \qSaUǁ^; 8q*Ewu-d) nBYvs+Y6y%e {^J48y&@οV)h,]Ztiן‚;!^eLL[MEZ\:aǮ[6ŢZ㉼ǸP+einU/Ð}ťC6WɠP65c5ɱT4균ɥgw6Vᬪq9zWA) 7\C_xSU,=Sac[cgC[O8Gnn|;:;_M_>0Kct44}0۔*>hUW:dyiA+Tj[t'נӀ(6\uh5jVҘH\I0ވ#/AwF˾ph'gF\uZe.bniP+^<(dk_'3q-Jx})@HHHMZ0hnԢA(tZ5 sa/`6làó܆fFuvoH}~'Ҹ ~:Rp2ϖj^'wCb񏏟tuߏB`p==FqqTpjn>~ˣ?=!LKCg?znlic>`2 ^sњ1C m*L /ai9^34|d?"<$" DF[4NLjԩaˑHUpH U9Z .:[ G85UvⷸI UA׼5篸 YƒlP]van!^`3qSN!Ӟ^9^;t"kI9ʙ-]IL.:\fKZ?ʞ?pѥޞaU;y|cRщV=‘)WӸ|q/g{M,K#QQQ! e#Y"Y>!cM.-ZuIqdޡJ2*DGwʼnk[6-4/@n d4=}%֓^(pi!+˩[;LuF|ٮ6sw:_*Píؽӆl'<nzd2%%wExP+_ْg c(Ӓ1ڥELa5+kȊtc'Wgm ZqL,,bߌ;xe/^{&^V׼F޹x~~Xx Aitir="<2> 7^߈r TxuR ϡ|A.I%%Sē@p;^Uhգ7ЖgoWW!ӵ jono-_t646hC&c{0dKM@&?r*{+[2բ׽m:2̓+ x0?hLFVp* 8Zy;(\'lTK}PESdp{[UKY_Qe_ Z4jE$ͦTo|k;̛6o6_jj<{uH;7ÿ<>s՜&FDojAߞCi"4c6*`2a3+r҇P,o}ʅh,_n 5ikqt7,E`(m@o7q'ң ,V4t=FǗ[ꑧ=~[Aq]_`oQ|{|4Bj& ]7(H(D"\Zl*oSEkT"@7T,lf%yU$bG<#XDP*C^BTdp﵁?E7&,&9vj84MAQhk]ՏOFV'w~+OvsQ,w>8EC$ zsB}0 cٛŬ'EwRAoXm'*fVE(:CQ LG2B9.X*XXJ@q)q\'Nhx~]tܻ{jyk뷦p*ɔ{KXV󋘚.ڿ]TF7Vk2X-*RaVUS'؁g.Q|xn=EKX"=}&$(K6,364j!MrXLBKҴ~6Q, g g LjPcz)+pb4ScALr |cTpbn!~ˣ?=Nwv-_q۶~;zW3,<{M[8F*UĊ?Uz1AQ$I-"/IA RPcxP2b= ˞ NΏC׻왹Xtlw߱7w!p&w[b&Tŏî=wvC˕0>ߛ}ԛ)!|*FyC]:]x*ů7&ii"ա3Epb4Ew;ؿ]2c'7hۦF "ҩv3!%M槒ԬNTa߄C'Po # UDhmY܉ӡ{xIDAT_& .Z_߳vA/Hy AXXJHA IP4*htsЂ*bd4-~p5u. xמ~3\yxσ,_W<{غG+idR% eqlh43DPaGbp$ئRE:hKyۡ|^tbc'G<[ꑧ[仇_ ?zm_`_.]0C$dOG~z"wAŇ`zI0Ӱ9d` YFNM)l3:wс߹A*EN"cgßzO~⽳wQAHht dS,x9D"9reM02lW* 7} .5&L؉EϽȋ߸ MmaD\,8r6B0ÂORf8r<7uc}wAqoz}M5B}D7v+<z/W7>"ݾwMZ5 HcnK:@XnmÇoZ/E.,&Rc?}<\;ߚ Dj1+e.' 9 Nㅗ%Pp5N G e?^"/&~,_t5gضWT'1>A_B)P(艵##Ok'[d_G6+$΃Ԧ5lRфem,lAݝi&3i)>A['!j-P(G 3k~s ,[%,-:t} }-+*&¿ gPG݅ج8"eŲ]A b ;l õWϙ2_E,(ۈ#Zsێ<5)"E6N#ӽEkۃO0}*rUt.iei #]r >cU{t7+ԙg߃xuWB_-%=^ t0uvW9 %/VBW'_tMۓP\>@y0`D i|[` hh)Tj0B#ЪhU# ~yhu fp#1I/I"0! 'Sdd:J5ǖ"sdy#R7wAgdJ7kʕn^:}nWFVst$gj-tԝr_װ_7Z ~V54V }o[G=Nd>-UlaY5V}xg[?k&>srq߀].r_r_qsGjy4k iQܟBZ-<(d=dKO a/zv7]ǰod}sn?TF'|3Nn#I?"mzv~K=گsl<b|_|4>?pߋQrib 2* (Ѧh{28oIyes8';Z9h6g>xRx'b8ՃWOϫ[xn%|^z}%x c8eXIfMM*i_@IDATxSwiKҖ*E@ERz)tA" ʽ@+"XBUitEzQT&-_nr.fsryBf7!f̜({@@B$.D   F  @H@CMb  |@@B*@RnC@ 3  RАr  (@@ @@@  T4$  @g@@ !&1@@P>  ! )7! @@hHI @@  @H@CMb  |@@B*@RnC@ 3  RАr  (@@ @@@  T4$  @g@@ !&1@@P>  ! )7! @@hHI *uViذy|WfW^dwCy;qD~eK 2X+;ɓ'eҥ&v%m۶yw\.\vfVZ%O}˟)ŋAz_oxt/"޺ޜ:uJΞ=+ Njd9rDҥK'Kv_v@%@`Ir}Yf-[6MצM={7?dϞ=EywH"&+XhkAѣݒ|րړaÆyѣY-T^]#111& .܋ϛY[X ( 7p-ZԔ1aۛtu?S/giӦƍ A`+K̙2k,d̙ҪU+@JI].]d=h?Kv9Ϫx>h/^'NH1=W{{p~7͔)lڴ</^,k֬ ͷY<ܹSjժ%gΜܹsnjr>k0yEˮ-Zo2j?/һ͓w_h)˗y.N  LZ@Y 0z}&9r0-TRP ?Ss Kz?r$O5h?9F[ 5PN̵͢SѥKs: dO'V^L|r3^dϓpJ*ǞE\}{Vx݅ 540LԼysٳحj;P)ͽ^~a76-O>i[~hډ-_F-/]^z%jy ַSY>%+W._ǎehVw>z~}g{=)]9>䟒%::Zʔ)=Dn  cz Yn)^5PLjh {I&6ݳgOmov}?١C6} ڧ5Ez&Yr.dz<׫WOt^D*U Go RxH % E `˟j_D%c_=Kƌ=/y4ל:+4(FDz%%KzNϳwgk@ - Ex(Q 4QޙHXVXQz) t浞wMK[ Z|[=u]S'Q7R[k2w@XLl>}zM:SB̈yD4`:s"͇'8jw}*]3Lb/3A_, mv<rweܗ:wCSk;X2*Wr{.wrPh^bw,dmQ&=еkWA \ͬR=U}%{&}7w_*nfw4=}x_mܸu=x׻z:tw;5ݷ umz}j_=ݓ믿n Ѣ, mvr-/A{_kp @~m<'l7YT5r_}USbntwoVj2IyQ|h-Mo@:R[/שS\&Lm۶"̘1CjԨaӹ<݁-[؋)SHND'lE'׉u ^kRent#/M|ޮs:=N>ӁR#F9sKR;v<:IbC0o@ "̵( @ DQs'$-Qe`3w?#}OԾtcxA5@ۍ^o:_}OФ]EG :)1  V.@@ :)1  Vа8  <P9%F@*@V~G@'@:  @X@O  @W@hXI@p# a +?#  u^Sb@@ a'q@@yΫsJ U4$ 8OyuN@@ @@ :)1  Vа8  <P9%F@*@V~G@'@:  @X@O  @W@hXI@p# a +?#  u^Sb@@ a'q@@yΫsJ U#Gȱc I   2=x 4HJ,)2e H|$W\+3g'^  !r Bb*ۿԩSGm۶RT)ɛ7y{3gkRtT  ]ڧOټy,ZHt4kLj׮-C ItV" Gv7m$;wN2Tƌ3J׮]eQ%U@@$l֪UKV\d<,Y"E@@",Ѿ}{ СCҡCS KΌ߷oܹsezO̎  !]PUٵkK-[&W^QF2x`iР5X  ^[/ʁD[=uQLL-ZLهg@@k :%A@Gv}@)siɐ!dɒC~6liӦ%{ƍ套^5k&/;  @\"gϞsɅ CzzUU/_6zgй>{^kiugkЩ5˖-d͚K'o˯ ,?._|oS<{dرRP.9EmPU hN@H^Z_l7F; ҿ,XUUA i%O?TfΜiԁC7sqU` [! dS>}ޮ];3GU; ڱ3 @ #34i:m۶lR_~1 i'gyweĉVz22gΜvrf(.i4 EgϖƍQ fYhh'c?(8-f  `'O:?gb7Δ)UH>Hs4'&@Dv-ͮϘ1CU #B#J@PH͚5%W\?K\\g*t,)@jj!S v)niѢ >'/.\E#ZK& O`… /ȑ#Gg/R2fxBʇ@ ,]T{99zilժKDž r JH {kw.z塇" ?)TԦG@+uV4hl߾;vӇ7SM6`" Жnݺ]w%M65h.]>Q=&6( ^SNRJf$Ν;' oM@mZqd@ 4.K&M$˗Ç˖-[d3gdT@F`R$@[NcZ9̙#UV Ή9  pC{rK߾}eժU2@@@HǏ[nE/;vN:ITTT V.@"*˖-+Z%k4⪔!DJÆ k׮b ϔ/ D:.`Q0J@-^Ad@ Ν3szN>]{=i޼y a @$ h筷*OXɔZ  @0.\`zN6M&L -Zi9 @ hh `/YZ5s'#m$W :D y=_u3}'y,%0W#aU:}-5oƴI"@hM1 X]`RJU,_F'@ 㪜#+pye2k,Yf!`cPWYG^r%s̲i&W `).[:  @  .nM6m*| g @"իw^)QdQE G@(#F;#:gzyrluVyG{[S}GB I2e:0  @ 9sFZn-_lܸ3rEP >u2O>D4l֬/(wYߤIyD/ɰ DΝ;߂ ȲeDY@> @Gik.ݻSovڙw} r ܹsv{wߕL2u;!ulرCڷo/ٲe(ԩl۶m<6mȞ={  H^dΜ9ңG{#`111doy^%E/-Zw@l*pE_mذAjԨaӒmP GSo/zJ./_Fɼy7ސ'R 68v옴jJr-+VYڼDdljӧɓݻv*~Nɡ<Ռ `OlڭJ; _ _/C[\iY.ۘ1c Ȝ-]t`#`.\X7o~]؆ `ҥ|gRn],"@J"*-ӧݐd:׻wUV%ߑ#Gĉ )>FK+Z);@/^\7nl"t~Q&z@hAɗ_~)WbŊĜ,'h߾}lٲ)K=\>Lb^@t<òw^s*O-Z$щvĈvSL!C$+@#giذ9pdT@ ޱi&ܹsjf̘5ca%q@zkM>x`!o;$`VZrdhɒ%RHdc@h٠A>|34 XRv۷o/:tH:t S iuo>sT'S v!"WX@ @u-[W^ҥKz55بQ#Y`sFV T`ȑ# >C*ObXWvR)Sƌpx8pz]4bbb݉E@ ^~eW9@2 @=z2e2, 8}+WN&L@i!7]v.F@ЫS+V4s}># ,Pg7E\?0ݟ~i6 `OP{F,);ig>},G2 @ "N<)7֭[ˠA"LF4m\9+ (gJӦMDQUOaH4 6B\|Yڴi#5jԐ^{ͳg@ I$i؀ 27ѣG';@#`y@C@ !um"xW4K˗/̙3[+s,-@j!s 5L"o^ZrmL+e!;w<3-111$BK Zz `-͛7Rtike mo" @x<(͛7KÛRG[ ں< ӧO=#O>QhR%THYʅIʕ+fڵkˀtVNN urSv@\t7|ӏH^AH XW_}U֯_/+V0Ac!(8U4 ni̘1vZɚ5k @@^dmۤk׮2g)Z2H@uy@ Ǐ-ZѣFO3"@˗͈֭[KNW @@ɩ@ <3g#Gڽ(,,@P WYCB)0aYxt.'-&@ @":矗UVIΜ9كU @P|k@ ۲sN裏B*I!@{X~v_zDGGGl9)X_ .dgΜ:9DB,p)iӦh h2eB:!l[NZh!ڑ^/RJ,) 49T"˗/_R!֭4kL:`]+Q\rYFH|dԨQ2f3r&MB-!# ^g=ztx3B lO>1s1E0a*TH40͐ӷo_3sҤIRn]*pMdȐ!W؏Grkݰa}^'N} >=ڷo/˂8UܹsfcǚnJNu `=*U3fȅ fE[C=uyI 'N@ OW.ڵ Q$'`K d_>ԪUKʗ//Փ~Xr!qqq7ʕ+S`/@ fϞ- .-[DX(D%Jw}'/t1^˧'L, <(={sAN+?E .UқoY>cy7e޽_'O)V+WHWJ䩧jժA H-POu%}TZճs,Yxرcrdw={j; "#GJTThw%@@ZxqiܸL>z]mŊVulHbo%X[@ |:Kx@ҥ2\ bP lٲ){E-5kvv!B&pys}ܸqfn%LB @:4A)3ϘHzw@@uϣGJ%o޼V& @,Y"f͒[ܜH [vQdɒ)S&)P+W.˙3g‹s"@v*'Nܹs[*odHJv-:uQm۶RJO#uZ3gրŋKҥ*;@ hw.Y@.5ji\hDGG'D.w;Zzl޼E! 0]E:wd1cFsIjNN8|<2uTɚ5SM9@ Bl=ܼ^h"E\o!W^Rzuۖ#slw }AC̜wS.k}I\\^gA"M`ڴi}vO#h"`rʲe˿K.=N4jH,X K tڹ'xB+3 C@ @ʔ)#:ŋy%EQ(Gݻ^Z.'CeTQ} .u ɓ#"\h C][?u̙3{F<#~ڵ30S{.G-l ĉRpk֭[`kdXO@=x +l ΧٲeDsa_(X *3gΘKz,Y\XE  . ߑ#Gd׮]r=˳_~Er)y䉷7 ]ms6@ nݺ~꽆ǎ欒< ˗/K_*s"$Pw!`Ajn#Y@HH6]f<3-eˮ  ޽[F%7n Dl$l}LN2~7y'mT\X_gϞKJ(a̒C@ dnM>kNk~FV $0e9~ xB }N @L+Wɓ'-\DC@|Pbccar(%}@}ϯAcޓK"E|7@ zͯZoߞ#@?,dٲeʕ+oq6V /s~#GdO@z οۦ# |…~f! d )@^~e9Y@$믢}֮]+UJZJ*s .-veʔ $LW``2sL3\rxb ٬.XG`޼yyf㏭)r@ iF!>t|A\˂ L@Zn]ٻwoI @d h޽{˻դȪZJ~$K= :LTR%ɐK3f(7+Wu@ wl͚5QF);@HҥK/Ħ_9{2dzY^* $/}w.ϟ?@D\ru{#GH,Y@HC@ ;Vr)]v 9# `DPܽ{u1k,;@]%6"/p6l[  dDЖ-[9:u${>SN7|SZnvV"xǤw @D!iϏ>H.>z!)[Ԯ}>,Y"~9RyQd@ eӧO7}? @ $j9ovٱc<32c 9q)~֬Y;0'k`ʂ p}'OJ~>ʎp@˽paGss\3FjԨE\ $.]Hܹ79  `o$[@KG3= @ 6/_.?wd+ PPT@ (N2uflقrNND@#`xYEׯ> `)Z@-Ud"E`ѢE7?)E @"ٳ4h N 9sn>ٳzC"V PDOςS駟ƍG8A Ulw W_}%}vV>}:inݗ @ZM:+F.D]˧~*y"Eī,ҥK.M!:::v i)ʕ+- lIJdĈҹsgs_t'>T6|{Lyl+OH-I&-GB!`>l>쳲l2 40Wi I ̞=[V\)M@ @=ũRlܸQ*VhZD'O3 RMc=&z&k֬!M@; /~ѿҼys3(K,yDG1.ըQ#$ `w[| @?O9rg5 @ L8t9sfE @DDQ@Oriɐ!*zUyzrzpef捌3:Hm&WŋK.]&MCcڵO?]s<+@Ccǎ2x` @p"6۷l2J]v+W$о^:)0l0ɜ9͙\ b.'$:thUG"j*3rsr@Ioվ:رcN7ʊa8ybA\v7m$;wN2T BIGϟ??pD+p%SG3 @  @kժ%+WLK,"E$;  OJ(aܾlGH^v۷o/:tH:t`xtҙ퓸8;wez@ 53f̐y?p, ʕ+˖-[DGꝎmfFdR^=HݻoFr̙@ IZ2eʘ/^zj)Zh(  [ڴic2~9"$e)>X@` hϲe˚`s!:@>}쮳n _4l,}v۷G#G#4L֥$g `wӧOl+eAHдq `CN:΢3l Ζ3#^~e3ɂ i@ .7|S6l`nk,E@>2ؿtQfΜiN8@ y&o }Y[nb! ^#@ΝB O(EAP.9@G >sd)4 Np6E/wy :KHpk#@Qz!ϗB 9P"#h @=*-[qI*UB* $ M({HK.?ѻ=YF E.5E>@ Uzٽdɒ2tT@R/@r!Cd۶mJTTsK@ :8Z࣏>I&ڵk%K, U@R.-7- 9! @`qX\`ҦM1cۑųK@G 0QMapÇYf2zh_3 M)@ ڨ*$/pi޼tU^,  ^#Pŋr}Ij, i-@ $W^;J޼y͝B( $ 8&Ojs޼y.V? 5Rॗ^+W関mY28IIMY@>@&N(V9sF` ) yWL:U^|EY`Aǔ"v { *0{l0`,[LJ*PSԞFpW^pB)_-(< `GP;yFzN:W_}% }ľuGpŋm۶իWw\)0 )FJMR"\`ƌȦMhx F~SBl/fݻ,YI@[.+:<-g˖-eʔ)ҠA{#[o̙3K͚5PgK. Wl$zj|wmU@ .iW4,Q 8P9"wy7zdL`ݺurM4Y. l7iҴiSyu6l ҷo_ɑ#׫m!`Kʃ>(4n&&  .ݿ 3**J*W\GyD)"5=~a5ka@ |LL ÇvI6md˖- 7l 0m4޽̛7E@@l/ҴvJ^z?/3?0Vj̒;@T .~a?|G[ 2{nMF ;^|TX9%k rϥdH!q9q*T(֮]+2h!+u1cH5Ry&G3Ϙ:ÅfA| BTT|RR%<#.]d{ڵKVX!yX @Z 6Mxfӧ'kgϖ%f޽8iMLu\_̙3Һuk6}>%  s"6yA˖-lذ̘1#z!)ZhЛG\ժUwyGҥ]W @"6չAYr%Hnɚ5hr'}vi޼^!8Jb8zO>dRX ,Y;jԨx7[9/ @ly2h )YdʔI ( 3-ҿ>f, ` S̜9UB.@ خToYN[pmVJ*eZ>cD9ŋta&q,W((s̑+WJ2eA@+`T/iEjrĈҬY32e 2$]Xi,pYy7O}E.  о}{ To١CS \t߾}'s5} kH[>n8SoW˂ @b @+W,[l^zѴW^\5 Hz {_^6l ~"@ bl/^VOtLL; @h~'iժԯ__;35ZhR&@ 2`2GgB+0i$0`ұc&Nj uj[u2Ν;'{6+-_\*T`}@P n|(qH WVM$ֈ5  [@Gwޑu'OYl%  p ?'BGnݺɟ)Vߵ? H-7 DN,_R%[ >#) :Z@CgMJJ@ c%::VO{V!Fl)@ -L#:}IϞ=2gsgԝ@_P ?^^|EZ4mT{O*@'@j:#$0c )W/i&߿O>sq |j8>}9=PuF@H4k9V@裏J 0ۙPޱ XJRAfH3g^+J9dǎcq=@ HA4[f2e޽{~QFIܹÝ5G@ }@q \rEo!C䦛noFbccWr PT54Wʧ~jU*\L8QH+&A@T9k,3o޼{Æ #Д@ @#:)L$ \xQ&M$$&&Fx iҤI$!DhV,Ŋs[o%~2e]v 8NqUN"py7MgƍJ*%@$)I6 +WJ6mrrdÆ  gxT@/@ hM9#)|L0A;&O>L}i;=#uV)RHrC ^4@˹`t~ҨQ#4h4k֌{;@@ :@T`nEӦM3swvEƍ':<  N ujS4شi7̔)kN/^,ʕK491 v SmWK =WX!_|̙3GVt~k<)@)@N}Ҷ3gLt(QB>svmq@ >G59WOCټy̛7Oϟ/ڷN:ҢE :t+V̡*@ 2=x;Vt`|)yΜ9dɒfΧ={pسg,YD.]j:)Z駥A%K@@ 7-O:Qw۶mTRfD;輊3g4BuGҥ` hKEoj*Yh\tI6lhÇ7?nBy@H F2щ1´TM2Y&ѝXh ^ﱮ˗3wRvm[idԺ?"@ l7:bRZe̘Qv*o&h~xrj 6~v֮]k~Mn6;gߗ ڥH@[ .Ui^oѾ{zBŋc_d˖-&ȑ##ӫT"wu7"#@@l"`}ACCg|$]t}$..NΝk٤ȦW]vݻm۶bŊfΝ<X  5lV\ٴn\I.zmvzntwqA(ӠRTdΝ+W.)SytMҩS'P-[tx ]5pKh#cbbhѢ-,Р_aL 4>lRKp Rxq3N𮃁4ibikNĂ el{Z6@T bP۸qc>}zjZ{z'5YA]tZ+ :Yz   Q@aѣ/o޼֑%'   KtW:u>m۶틩-gرcfș3g>:UN  `}1X\hQב͚5ڵks/x|   `lw ~ӦM:R;EGxwUϟ.G@Pʕ+Zd,  <۷ B6:t0}l2P@f \|Yv)*T7;˗Or̐Sz?@@CL  ^P//@@B!@ e@@ z)x   P(  WK @@PB4@@^ ^  B4ʤ   R@@ PIre wfj|U)xN#@&i+hz bw):@n&Nl5K |L2z-צM\?+suRIA}.5i$;xu,:)_.wO\ղeKW \6lHa=)}kŮ˗*W슍u[i:$zw੗\{7*Vz%K>SM7rN]f8:@ gF銊rˮk׺ze̟??޹yzYf8 K,ɞ,MɞԂ;qYP5_r[nIw[\Y4tzr]pTbk׭[MԩSٳ4aI͛]ҥs}ޓm۶͸ϛ7ϻ.[Ф[wل \8_՛_mRw˨w/m _|UHWNx:'N$Anav)u \O~M<G>;wnuo,X /qzW{rQY~w/-oTV͛p9ew/pz4k{ˋgtg a'G6ݭ;s"u~M2Ex)Z7څR`A:^.M;5݋+y*7ʊ+dna۔L`4ߵkI2^Jȑ#To= [CS^ c @{xZJ'5jԈ7 ܹSoP3C-~l]tf+R'wz̜9SZha1B!Kp?eCK;yGD'8geǎr}@6}r Hƕu}X_I ש;wnþy@0u2,ӣGsaO泯EǏ=$w/BܗuEӧOo~8H94iݺ:e]k֬1sΙ7}Ϗ6Lw{w\Z= SW'?_tZ 0x`^uqa~ysR) u>ך5k^?!H@`CI-ڏm޽&Ǟ={L뎾tbj)[wy}߮U u gV^mM sđoSj DZi$>&^J:^$4hsd˖MTaO@ )tD{~JqOޠeO?%ffyDҦ5bI@ez={I=7gϩgP`]V\i~0CJh_)9 Rj?,i,0n8;pt}W.eAט1cDqޔ~i޳ rw0w_W_}ճ ϩ݊r-4kr~R'}v1$qGrj܃\)\x'?9s27G#8| 39orwpGX'zSҥKgq%&wԡN:fO⾲ct֮]"LS'.oSs=чK ()\:w)^iӦ\fBm=}ճgON< z$_>G ^.w&w=qv"ոqc%3Dbg|w kGЀƳ=nql9I]Iojߺ B8 @.KoS$Fi!_,!:wjZ=}+;B`vKc²ΕNI̐W 2=Xh{E./` {3AMAp@@! E4(@@_P@@ (Aa$   +~  A #'A@W_)C@hP9   J  @P@I@@ W@@"@FN  R  Р0r@@@b?@@  +@! E4(@@_P@@ (Aa$   +~  A #'A@W_)C@hP9   J  @P@I@n*QQQ2m4`/@ @#R)  `eP+yC@"P4+"!}֬Y#իW]vIӦM%w+g϶O!) B; L'OMY`AyW%sҺukٻwo0\ e@-Sd*rgϞ2eѣ̜9St… JB@ @#)CAތ+V̴>}ڻ @$ FRmR@=SLrʕxxDh$@[ ܠ, S@RӔ@E*l  N uJMSN@@"Q>\ @@p-d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V Rm@@d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V Rm@@d XIJA^@@:)"  `%P+yA@ @J  @T@p*"" V?nx|IENDB`tweenr/man/figures/README-unnamed-chunk-3.gif0000644000176200001440000165102614026311417020326 0ustar liggesusersGIF89a1$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlش$Hl$HlU$UHUlUUUUU$U$$UH$Ul$U$U$U$U$UHU$HUHHUlHUHUHUHUHUlU$lUHlUllUlUlUlUlUU$UHUlUUUؐUUU$UHUlUUUشUUU$UHUlUUUUUU$UHUlUUUUU$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlشت$تHتlتتتتت$Hl$Hl$$$H$l$$$$$H$HHHlHHHHHl$lHlllllll$Hlؐ$Hlش$Hl$Hl! NETSCAPE2.0! , H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`7,ٳfӢ]-۷n+.ݻvݫ/߿~,0Æ#^1ǎ#C~˞-{/glΛ~ӠSFZi׬˶v۰s,oܻ[pÏGx̗KW~ytЧg_ W˲٦Oo{mߓY}X=~E߀   `^a6X!z"Hb%آ,Ƹ.8K`<j;wDdCg-)HrFQVI~V&pe 啻Megivddf!暓 益Ixީ]v瞀)J^["[2JڢF(o!jY'饛j:PV騍3g汤'}fb}j묷뮺cKB~y䦤x,f,Wf}"km6tMFv~-iӒ$E+[lЛg+ޫoo}DJ+IjAB*y Q* 1J9<Ĵi1ǿYșV[HH,0,im") <,DmL!= iz VSMWwX^).+ "-whu-$l@[]،9v?nyY mImYv ڄ;Kyf_]'|,%ܺq3 _/>w7ɪX0Ҙ쿪zv?˅*߿93`2l*Գ VO(hl]pb m\]υub! 6PV[[ &Qo^{$D ZL88*|t R)WE)ăJ,hDFQQ*810Z!,z'"IŪq/Ub H?y9ߨH6ϑܫcI ;(.\Ge0j1+gJZ.gP2ܥ/J\i,FdiFhR3Rx&|Bq!N r\9ο$|"yƳbd4I&Y47B+8QVKjE4{*I5=J;N+Cз(4y/]L[:SJm?I#Rr̩O ncIYPa%SJU1SZլvՖWղzլ`5&JS+-::j@ 05It%rYW.qtf(g4MMkXyzgdd}śehԐ=]RUHP6;jQZyf_#ۻֶHgVGlYߘTvJ%J{5r]tYwR6.x*+ܒInВw|/{9֭iXk|J, |+귘ȱ&a+ySkw]r0G:knD<6SWk&.Lo kۂ_l5irـQ4퉅!Mo6YOnul%cXTͅg{X%%b#^`]6loFy9r-zj=`}h@#$phB7xv:Xưguƨ0;09İ>3Cˌf˩pnX݆Ytky"ܫePZ3ٵnLQ2|׶l+:]uVev9Wlj}[2sM^ߗ-d.=wI)IC҇ā߅OҎX;vJ'wV < y:ƐWi8353t*/&-ZݟqzGj{\S.e#-م;R9sc=kcd{NSʼn'^;= wܥ o3qo\}~wSjmkO?s~9%n)w{|]gޯx,߽|>dhm۰oau4`bh*%aHcx0jxklnhXmhtxzg9{(ȇ8H(Ȉ8HXȉ艋(BXBtUnfcdxGфԀ$8R؁"x`V_̘('(Q1z+x~j5a'jM@Nu<ȅ(Ǝ5FntAu8&slXbɊi#d(ۦa F'߈mHR)Iwp:8ktg y&(lhhDT+)FHd5I_y8 86I"iظٸK~ɍq5V5%l"َ!N]& )ɍ-ɀ/DiF[ȟ/Gl$X8Dz7ڧy:z*8WyMIE=02Y6.Dp˩IcωǦD䦁s9uzbjfI:KYrRz|ZG=9Q\ 0 jdk8z<-*B:IJ~fɠtښ| *zǴ=rr#i.8ȢKUy©3ԆSΚZ9'Bz[5"Qj$Z=ڤ# D' ;ʥj՜{6 kZFDۢjq:i𕴂ڴA˴㊮š"bo$h뙲zS{Ư*xB๬7 9;t;F= 1?ۯA} ű!ᱷZ+7*v%`:-++g[{H:Wli!aR;EÄ>zk( ℔;;{M\QʲH˷;b6ڹ {; wD{k;$ A~!ۍI8 n٥{Ks39,֛y[r!9q6 w h#51) ۮ0) I-F;8[ ic4<|@N?)34ĝğĚLfVWڽ[k 0ۮkK~/1%-:n;0KڜٻHy[ ju EJ)뚔[y4V=BYM|W1m3 =;=Tܬ AeM6u}2Gvp'v x+v%:t֔eٙqيԜ7NmU,Ժԡ=uQݻT=%bj+t}}b<|7*tKٟٜ]]BȬ ׶ѽ6SzuidЫ.{⶗jйܚU}ڥ ]ګPJaw;$$SYۺJ!.5c}m_ .<eܟUTBLFNT ݲZbA a ` ]N}G2I nR@3} Ke8S⤭-^]1P,m=AX^e$m[33$.e-DNjd! ,L.\txd}ͭ l;C+2rή}O&2¡ !o֯nѾAI .sۜ=`.d..q~CԎnN /?ڴ>`3dn Uޞ~ 8n)~$n^ÞrŞ P 0OI^}W Z WOM;Mhq>:_~QCKl D410j ԊxK!,/.!3plpn:?F#_$T^/oW.a#/.q`>nP >wn:- R`sP_ݸom \^`rN{!xo\h aR sErO߲ 0>5=˞-{ ,80A6PB'Zň;bQ$G5 rG-Y2̕3mTQ_}Ֆ$iTRs U TO^:֬Xv*+Wdņײcݢ]ֱM҅;޶yzVo_5L0[ċu<1`ŕ'_fqb̛#CYrf2]j$EMqMcmݽowp}8pUt~tʣ/=dOݯ7]!Q|j)||o_~?o@D@dpA #pkMZK`V2(&DM.7OŗNZ]Fe(Gdt$Gxp ܂[BdBΤĒJ--L1$sL3toۄ D :r *Գ{ʺ>QN;-R'? RPDН NKQK4JSN7SQuTSKETUSRUEgnW[suW_kV`{V'zUXe]6Yfu6bmZhkv[oo%7`7r5]vU]peh 2\͔U=M~W~&x` ^zPxjb/Hb!=fHc;8dF~KVdSfXQ_o9wf}yfHFZh>Zn:jv" mik_,=?a;mC{mon)\EHNoBGNqȽpGI'NC|0MZɇ2g}I~%~_?˅ NH^G m31gB#o38% n0+`G# ]3a 5HBPa e8Є4t%dD .է pE E)ʈI|!D(VIL]")8%a 6@aO|g;҈q_nBd$|Hz>a7ARH̀G׼őTmdضINZ$h yJFIwSec9K\q$I>a$-53<#2?If.3uD 2DSQ99mNݤ!NB!g.mP$ 3 R“wCD8la@" 6 O05(CcP.D1ыvTCtMcIRuQ)[zP5U)sXXye;j3ԡ6?Pl! CzmJH2Μ3WZ#n:4+p y GOJ:{vUjWկ 3'!isX:Vdu.>%6.,pٙylPlj_/NAklak0(ᓎK\M-:/7BE,rܙsRPvZn>ŮEQfQw) Rf.z^񦉽my^J ):wvHߐL߱,?NS̍>fyg _8nEF((TV +r!<#+$eoj c!)] sn{1RA$3y1Cg.eq9Rwf?8)1={Fe#tvvd>QnJneWa=4upLf8 1&ɭO84djM|K(_Rԭ5CjP[7֬u?f{qCRnGgˇ>6 Liی`~v|h Ynpۋ,&{i3whK}6]I.ժoXn!D?R?(/(3{K C5C6|ík?)?0> ;Ϫj,@2BTiD[¡zH$!t*4 N̿Z$DDԻ;EӽĽVDFW</t9?4 ]|LtFP1j|>Rl'ld.[>:C C8,C Kp4qtCt,G6oƃF{sFL̹;̎lɣˠutt<:L rLʬGMͬ] <<L.^|9A$3,ĸ)@ILIlfh\LiLNlN|N[NhL^znDżνMݙNN<,LIl_+ $f:N9ND;M>$ }"alGRG MdaGr?- uPx$M P 5!dńM*QrgOeCĹΗ$Nu*KDNh[OO4&'edO}7X8#B=Z*[%u?CUa%t?Nm,dA.]Ld?PM+i='2%_VS%nN7uU}WU*W9WIWq:}TӌPEBԬEWzuTxPGW?%TNT:\T2V[Xj\URMST3opuq9\WEN@33=8Y>3VCք]eYql׌خ'63؋ɘUXD $בҒm9mm}XD xWWCZWH׭ CImO٠UMX֌QطX|SYZZ"i\?UU]Z\U+eYN[D**Z\ˣm˅>kZE[_({]][uZ]ܠլZRdАB[몡yUz-ױM[edzހ^YCt]}_ܕ_@݈ҸEeMŽ]ݾ%V}Y&N W_p_0^zکMi|u:U,յV9aY8N+] `%W0/W{ ޑ ' Ie6%f]1A`.`*X*(6Z\NakՏ&]! 5f"("`O&`+`~{hC65f(^Mï%ߎdHM^cK__=%`EN7n ,5R% #TZV%M6wQ a>b6%x~]Q;&}ܭ&(5&bm6=^8lm*VcIaߍ &`D6b^Sҁmf~68ͭ=p&^u*f6fcSeM$b>LhHab_71OPzN`3h.FZvi΋fCܝ0d8f&hc2ciRcJcg=LDWgD& ax:INdL6ۭ^~P f+nTW __E@[U]O&Nx}TӗUژNW*/8_3&M`.jMjYmYjM { %g+)PixgnlnPb*ղɡiݍ_H{@跞m&Nn..hBhRA2 &j6g^o pRV7feSp߉Pk(jM0'/7s/Gs.3W4/s7r1'67s6<=s7sі&fSz^㨶fmiHJoe$W@e.i8JU?/Zw8>af|&I_iu06nakR(iEfc":a:aɊh $hv o52WbFUvIc߰cV~h^[ *@*f/"^fpU DuW}#YV۬et x \ W~N jdj.Mnyj'*ŗH~Jh&hKXlj[e[x/Xd{8* SSo3x *,vvkDt_vD T>mfTb·dF [` @eW^`w7^/vh_ ^WTf&{~wcCnlFi^v/"Ph6^MgcSЊi |xx <~xm{W O.* wzNb^%mooC*$~5W0[6Ng&x7}"E!؀A" "$ROrGÇ=_~iϖI$ULr˖0gʬfLrgOA EФBm:)ML.t*֚Zzk֯Mj6S&];r+ܸrҭkw'^{yVBĈ-Uȋ%`p*+UbNlԨWn 5lײcv6ٺs7ƒn8w3_vίB{"D& 7ES" _p; ZfD-N뛬^ XN~,es'[! P(!^eavVRVs%xI|n+ MY|Tb2ڎiKg-(x`.d_LdI%R"Y^٤V]bbrIfcz&gfeZhx 'yƹ}:ĝxrTt2y 1C(M4){ڕPB)trPGPMdiNH:kV!޺++&ȶJ;qZi7"ģ~7cb;aLE QSmrvK/ڻ/ p ײ0Xt"TW 3tf,Fj4PADymqJhL@@'(}%)[ ߼s&389s3 M4ҲrQ %cLGcDXY1vu-<}wx7{-[ܯE- T-[ڣ1 --L1P+SpNeD =4~4NhLcxIwMt뎠׾`[β$/_٢ŧxaD. i߄+byb )=7}'p, oG&"i Hؗ(u"t_hv T ^bw/h!VIS %eOdAgʛЌî>$҄x )<(A14rS2(fc\\*0N?Ge%[k%GBőv[8G=K{# H=񱐃SyH*.|"!HIDNAݫLBHlNs0S# էc A%)[0MF$ eI$8D'hFJ~)̨ sA /9Sj *y5G5W\<ZApG_c&syyng='MeeN&kgYx35P&2[$93jYؒxJ-?@ 3]>$!0wacjUn8ݢ)D=T_+EQC~NMo-3m׶WNJzt[EP|-c8#&0Z;0.I17激`mUB˻ކ[daDž٥~`J4Qu0va (8b*0$HEilB fxo-u3PM r-Ϝkgn+:w6&KLa;8K+h!0!,g:11`nvs}Fl=A Jւ027٠=k㾚#aal1Vn'|oPTM%TVJ! ϠAq9"Xyusn0;o 1YMGwx-q P}N# 򯙿E5-ALO8|#~|cW>WKDr_+%h?/ƣRE+VE\`j<`ݜKΉ ")tٳN9!U/T^$rufʄ& -,LfK \qx̵T"Oz vWfz"0K'ON)xN()(ٕ*.΋ C0I!B+-,Hd'wь.~Hy(('Vy:¬ge/ չTӊC~jdq`JQ"JnfNj$B_ꨮ&)  aGBP9XML)i~酼h*ōjU$`VŲ>HZa?,*uѹރ Skuk+rimf)"7hZȐY) :o(2kJj) 6,a2K{+P@G6h E01Wjlվ++ɞ컾V E_'$͸Z%teqخ J-/"%[N^6B2t &rkmlmʢZ{N\lP.&[R%8J+T@`aa)6m&%Cg$|r]L܉`Oj>Ii)*LjjO*jMn.$j톪\non\U@ֈ )mVH:"l<-j>U Ɣ&GomVE-Z=m]qq2Zޚ#D,. v&SoD?>nz*0"p,J4I)l M(X/aQF+ .v_pl C Ml&]Le)Y loz*_kގKȨEH/0YeV)K E4h|\V1˱]k1\1SK1  r 1!!h!"F# ##r$2%O%;$cr%k%k''&C2''(r*2++r(?+2, r"s?0\&lA#E\L-112723#4H4S2_33Ws2g36Cs7O377389s87[399s93;6s;o;3@@s>>t@#@?shslA;|0  _4VFFp. Gs IcHCU&/)\f1%MߴR`f4t?I`aS+=l+ VUTTGUUVoK43gO'XgY 5LZ[b#3q{ڭ]_嵂mu !aCa/6c/LtcGd$d_6f[Hrfwvaf{hvhvё6k=$XlKb+lP0nj6p hsvpĶq'rr7rsG70tWu_7vgvo7www7xxw/yv;y{-Dzv{7k[p#|wv+Hmwd jh06cvSoE;\pgvSg6o)odW8cM~keoRS$ۈO-d;8/vl0+v;Hx+b8ao;[x-j{H{O9?D#G#9RoEymx/)8Vy%B1[Vv:/?:GO:W_:go:w::9)ظgxEE+wM:'AXy#Eh/?le#ۺ/;'o(=@oHMI&lE3;{xv\´ooC40 ;{g-;d{SCes?&z|p'@qv7&KÓB$N|;\\9$KA23ů`;[Vk v-,(ɓ(7B,/!Sʜ$͛8sϏ~ O-?L:%I9ڑgL o%կKu`P`$xt`Q 4]Tʽ7aȶe5KA0i0$V!̠N w/{jh1 $B!IůsDϬb5ҢT;wF//s=GX`M@ vaK.SAB5]@O1Ş}4PpD1@}CZ)Y6P9q9GwXe9MXPt0v( Y]"% {YU!dOgAGp tKj K6ҙ-  1AlBc`F X &ZA^tϡmf]rieMW(B"BQA=gDeU1a'Pi1Qi5 ګ!e#6eT tJD )AЕ$}q!Fm W`qQdpws6"ԊVZѦ͆,Y.mhQVwAVGu*iW]Y֬AȫQ`6TSgZQR&>>-A Ԋ:dr )"TA\*@<4評(A#wFDr4;]#uoPaf~=$Bݛ@>Vgi/4ir1.+AGlL*( Tx_K.HBz:/C+VV)vF˙g+J>Dxz,ˌnDR~}/&zC\AGLŰ6}(4r:$[ +6 sIpٞ0dti @0JX*I3r_/WXBLP-)DgfJ:s#{y>tQvCRŁ0JJ@! ,0Pp`H!{hW_ZTȱǏ 9R(S\9R##-<+s'ϟ@=δ(ཚ]ʴ?>Jђy7Wd(Ђ0mr$dMIV!KpbQ^!$w]̱SBM1f3i ;Zq^9  t'(PQ0rd`?ovTt2F qVq!,4)Z짶?6SRFE/#iTKQ+41 I[T7U"L sґ8NM]Xbuy*Yr¨ȉQ#MIHr $ g&b5SD%AƊˑA3i(pH2#%u&>$Apb#Tzd E \f Y1 աAH͎pOA/lY]RFg<d 2W$ b4#4/&AJW\}!lj]ap JTiTX# ^P⻮0GG10M La'͒ [TyHAՖj23؏E:ꒈ`IbœiN !B;60AqD FmF:^s67'6j\'d +&IyMJVaLt $# Mxf?k-,u:2X,3ȜkT\^!;@f j3R;`,aHb,HhZ#gXھe+w@X1\d:ߓAs ,6[i [P! !BZ"4/ґ="Ruc4DWIN[9=5}LvJtVći!+}UZtߪ}PA,!oؑEWp TpRN\ -Y7FI2^Rt1KjEA9pz@Fis>XDaV/Fqv&B2hՅ%@?B/x`W&`53tOU G%vC!s>L`7F'p!@?9 $(o'u(PP P%xCXG 6 X'h7Q,d#D'E`Wv֕MF!5b*Q|"'`+eW|V)~xAOA^E R|!.B`"TDaOH'63RϸPA8! ,0Pp`HUWA[B@ Ǐ CwB((˗ !ƁARg{0 $PHbNFTJ@QDժז4hFUt4[(K`@D %/H <@tMHH`W)tyjAߚB0k@}֯9;QCEtkhsVYhgzPh]u9$[bsYMݑm_Ds Tܸ߭}Ơ j^w;'_ٸ׈]&PBkgiHMF~l: jjO蘭A|vXjG UՄQv' =`m=gY_R\3xgĹ%;OV>Aa"XҰ%r#_655t Xy;tzT#LSM' {Od~D/nxxnQUY%_A:,cbA跚AFpoy/(=cvLgn%St 0C r({tuLhEYZq"\(p'0.hG1E<r Tf *lH ]X;\a a%V*P U@BhhA|2E$G z aW>,g5KpC,pf9AH{G8b jlbKe6 uyRp1᠑n"бo,< f:24&EWNŐct,,AyPf饂HD"W7,cGweRY#AŢ'PJNRH| pOeƟ1>jzV'fXhp 8uA+TMj2(2c-4$:kũp<>GL, o\rv3Ju AޗDeuSn"4N7irC5ED<7B0~Ƅ )+TN| $,aIW"wNL}e ''b(>M&>I’Re5i g>$6 \ l4ʇf Bv_ 5ACLh%uڵqZ!Ik"NT#@Y;u3TG^r8!Uh) g*KĀZ8(3ҭ$*Cؽ?LHX0ύmkJj-H 3ӍaF>x:Cu\1Md~F?hHX-Ds Ws]k`{b x5fe! ={;@ - 6}̕܍wd{Q#~M.z6Hn9>=dR *z 2y oOݻ܂ SZꭧ&Q^Y֥8GzGڅ6ힱK?%Jn)V 06x#5hi]0cGdmxcXTwx)LO[ u3~_x`O?&\x5fQY+B+ 딒X9BT_TM︮r b'*McU9JP+ {A 3@ QUe+"?&GAT,E=q #O JP(DOs  V 7tpdEPSV(3T:O!V_ b:!"E705K!mM$M! G8T p> M%`kRc4B,5^ A"f 3D@ Q.<v;AM:R2"zrS)4YBQzQ \wo,2`woylRAP!,4fRtQc;l4(gQ0]"&Z?%U=qu &,Q$,%|6i+Jl!mW9F!1#Wu?fE(Aue̓V#W#6 $p( E~Cg{YIM8'F($QR?7Uv*J6^*o,)+G(f_Ә$a(8SW`{DP 1u$ 8@w%Ď\82b`gbyQ8"G!}r;NT'"!…d!&ZY?p (A3adN& b0`qA/[TgYNYTHҞbyd6eWE@Ɨ_hˋ4e==4 Oa7?ܢnEƄ6ӯ=PcSEBj)^;jfʍrb;^tXD;y&g KPKtᎀq|-@A) oaK)THG2 K Ljg7-0@;c _!ݕBgieu/"Yq̥c kʽ n|&( 7+BmSUZd LѡP[YvcsZx~Uݭ}d%SF}je `ua |W1~fDJѡ u6qԀx=kFe[6PNd(V|{ mĄD@XnO{>NHSn- i&>1IB$gqMXb3Ex C`4 Dh4H V@z^A䈒; „Wd`@x>&dN "!It!<ׅeIWX`ol\= cXC$, ?%m/w*C&^B _j*[ MhZr.0㗈C UCj躩$AxU3_!BґHJ=ꓙ[t43ĸ1@F.)h$0 xNJ73LAY#@0ࢽK0D6T,,s' ' #~'R~;91z t4)~i@^ /Bhs>BV) bH|[7@H;5x2 ID= 'iRDpPH*\ [Q,l̂#٤ܓ_76ͨJ+DG&κd!UQ@j)l f[!CllȬv HY(Q܈CR%LT*w-U! $-GP{$_2lDB>i%"z2*&݊#a 29-l๎efi}em2oj!P=lQo%h|qW)5`W :h pU28~ =8-CBNMB@#6xe^tǀxfmV%18Sڂ =Ȑ%3-W1ŶdzSgD_I&MFT6$!.*"CK/KC5ݥVruu"S}D7SAi4=,AA3B[vmA>IesnE_g}[Xq/!%Z7LL6:ɐ hER B_.1En l{Tx} B~ &zaZأ ze`/^3k&ߐVS.֋xj *AmD&Q*:H6RQQ[pQtc26 Tzۚ c?Hv,&p3=/ӹ^Ϟ:U4iۥ7asPޣTXcҊ5p@KV.7^Mn8%hA{p~3m~ fsd8Q:t&|<ajȸ.lY+F3K]Yoٷ "*EYx#Oa SEJaM6QH *&#IF}Dro6BA,xF$Wz4xB B- 3j'!@ 7A&mj.RU?;9Xd(qyR0R,Cz3gU`CH> qͱ_VBu""bDoTXnrdWJT?d8D~NbUYU"[C p gQ98' ҅QqUDQ'K@dUXV]#vN}4Fd`:=s֗x"-@lB$?7,P38F2!.Q-0,i3 \Oagr3ohk!,T AIv 8p 5DdCKS, \#*0@ K` sM$Q#! /.23 X|r>\32 e-eA5 g%NW&?%E53R)3aY5tU~R tk%]ZH9 A>VX>")!+#6XJRxN3NU۱#2r 1" ,Af! ,0Pp`H*L /ŋ3j(#5I[n`@,MʜI`ȁ+kiҖ?@Wkؐѣą+Pp-w0Р O*JK)Z Ҁ N9-yZLnuܿ"V D^cs +H`aJt1PsFUXa;D巓=`xEqSnTzf$]b@l-@v'tAH&B?LW%ww)EI IQHPKTVUVYe}-$^ ,_>9eR9 b;[L,p{D񘢉$QX{-mExy'/<4am?x:$meT,E~yp*+7u'~~UA(EUq(ީҏu{B;eXLQ()VŻ UYQ@fǭ.AJٙ-lSA(J1$8U'\PE)@yE^ )O*jxkTE= [5܄eb2'A2R)dK0Њ'fM;o)CF1pUibre#$@qYnQfknYQ~a ZmuaI]oy٠sV`r_ :sS^WfZzulu7Uȁn6Qf:*UTVua pQWU[yQŴ,[ f̯8+\x',;6Y0t pscNqRXFyAaLnP1u) ]!vV|kb8RfPM2NH*#v j+!@|0w$5@&((z{^4A?(i,DT |*vʢ3UQPOXAwWW282@eP4ej&Ɖ%@t# (0czM^BƒԦ6ټE'8)M-ޑ$W;|",qaK*2BB3*=iY{\,-ZȆ>:J@ > #jug!ţRJrR!RAܒ$f; b8,$BDiDI9@^D1/qny"{2܃))Lu,BSr-!s"&ԂUgT,sKDHDQRkJ =e^ڀXR [D.J1cl) ) +@I/ N?A*~aAO$J,bHa:{U$5o5VJq/ mhEUf a5?]qPa+dB{ܖ]*ŰnIiAl5XM c)R-<`X:-@y"R'7Yr{T1 aIvl;6_ 5EPÔCaжakB+5G-o*@4llS jO!LRX+N$X@ZF$I KFMΪйx8 =\Q<@rxϱzBdC) y )$#8'}ңyo[񸶍8q$>/#8n9fL ^?gb,d#!;dB,kV#BrcHnfvjW>`DXo GX %,FJm`c-PI`ɨ4LH Td^Ƃ"L+"EsEBTZe ǞKWКEIΪW HrRwW]эq-n,GK@E|O/,5L8>Є#} LW0Ȁx.Zc-d/TBY([@5^&.Ys{XEˣ*Ehd78oSs&*tKR/-_ `c|I{K1R$?M`c0Z1S #В[J=#}Tc[ =mS4T/Ld7oB).2LUiA+2!a";Ng5 0bSlReo4$ }+ [7F2r/6MjkirMu\3XB2FAku]e_ kQR,Zd7!]m_QZe,V8bFYivZ'V-D.#B?,x.lJ2#'S6֒\HWQ&H&mM!1LY1^ $8v%6vV$<64LQIP~[H 2!F`4FuҊ6:; 겍X4=Q=*a [<`8W1sCg9("z6zsMC G+2LGvIe.˜%pmGW'DTpY~CF1dd]^ 0մ(\RH1Y#bٗ"AsB~ ?sL2 ci?i0)NQw#eyA>9X,;sQu&-2CRVbO)0!wbbA*dII!S(Ar%F)!wQ-b\>2/1UXFt'\shdQE%v uuʹ(C!e q*a*&5U"! ,@P``HuO࿁RHŋpÌ CK%%(ik`ɔoISkܩP?{Ϙ2saNHy8e %TJJug_n1HL4,XR&AU w@2XbJ]-oj/&~0hr0E{?`P Zl-* ˤ= )E|b׶rהI" W3SqeV`4YЅ!hv:Z`KCYQMeIf@D8Q|gJ&^/SH]xT24QKVXxYӀ` *ggT?`B`C+t5+"R|rTxߵJĆq1`MQArTahӑ - cWG}- V-wh}'eUycOJ svcA?sϝq}%M1A/c=Tev.@}Xfע@qjBG%c-1eAf%Af(\EPCY"U'`hˑK?zF~Dma-yRTi\Y_MEw﹋-TPST+p1-XE)c]UJl;M8Py=gل\02^0drX]7GU"(IW8> Hli@֨6\dƵ-rAj2Dp f$ol?qV]'`1F4m!VLPNY0_z%L~4Or9}Jfx_Zs5jmŚL1B6EG44/qXuCW!])~؇bOϋg",q.39hY5[ 3HK3/tB.t]q/c()r*$jh3 wF:F:KDȅe5tq O]yrQDHL&a T@'ihbfne6T*HDb dbO|;%A#X!CNg, ZZDh,ZMcAj-QJ?pK%W+>+EA ń/Da 8%LU VJπΙSR&L=2(*X!ȅ(T Vd]?^AܪHX 1C gi]'O!P^zOq9C*~qcЊqc\fSIjvR|1Me6.}G!AbCx,J;G> 2R"TR[ ^џ*dSӛ: |+]Y% /GB %`TrPFmD !yԓ =ƕ.eks-URvWm\(055G7@'xUJŴIl[cH)}e\[V\l7㫜Ktvq×9SScb,ѤB@ϱd3)GnGn:}"[p!}K*FWqoq-k_V^v<C:$Q(C-6jp|٦VH )ZC:-GN0\-9\j޸\F1xD 6in ^MI#"(ZJs_ Q =άS7 }xgo m]>1,SPMNقc`LdHWW.w(#Ai ' }DY!5-K1Ce/`>VP9lan]GP(8&oA= *bҐ@ֽ'%3OBTR?Yt%9-D;-O*Sx!@13ZLQ'B(u}*Prb0T7Z $?7NAJQOt!Q:!v_{w%#JfKuQo_FbBE WVtVFX24UqWl:Q ;#fPu`;hWfo$XFdEk)$\0/8~NH)!U/s)D.ܥ.pZRPD `QcB &<2cQbFFx6&*'gb8WF2L!/+aq!p.L5ijTcP5Qq(G~[{wh[f)x W O6~3.#OY7sJH'-UAN\y=Z$')rDRW+'kbD7Ucv%y]blSjBEdP},¨ȇ1dyi% x)y$Y-! ,@Pa`H=Fu{2wOǏ Ch"DD\2aDٺHaF `ϟMHUNdHʴ™m=J& 4h#OBwtJa%Ҁ@KH,eٻgJE%k6)T;]\=a[oLaHzHY)(?F k.1p`kٟ#JeJ`Ҁ+6U?_ρ֗Ձ+Ⱥ`ʱr'L'g2]/th`x9@Q;SOUX]0_)T,! A97TAY4Ӏ`s='eؓQRUVZUW'"&ouZPu/-X]e lQD~CKE8)TxK)#tEK~EQ"szlaq &]µ8@ϒM8Ek7Y!ژ|0R@bgmZVlsI:&kG\S(ݚL婃fgI%;*eWzy9P8+7ik]+RSqs $}xNAREAL) O*hCʐ*^C`B2ta 9"t]Mh1|~ SX8hpE)pSloDh+%Ld(Ô$3^'5T G[tW[;h) @Әjf>f4]2HP*|+Bg`S3.ˆViNaB^QAڃrd%a}j?caܱ ܂VO+"0H(NU5@M@OAҳ&`QCgxg )GpBFEhŸuEnpKtjʈuM mE*2 GUAPRrѷD꼫f[{♍ nW*g6OHM̪a&`L+#䒷δ< S:NfdM3Dt@ز ԹGU3b[fB&jEtdxWTixTFw_$($[Xb R؂b),j)) IXR'$L+cص\ӅQyU5H+/C`P_+ A@0J`-P3qUI׷Lnvw 0Pd)]2 |ӀORqXنwp8Q:"Eec]fš}g Zv3 "q`q(5}9ѢAXJfm6A^lVOfH5Sj*mg\ 5jꎃȦ.h\J*2Ი- b<%!3]}˟y4*us% uF-yzf Ixr4]}@!xj"=^ٝW#/^A u9!3Q?,7l/̧>-Y-)*"Y_#{e0T] V+ i Mn*^Y݇L&A4*soV/~k/*&0.4ؘ^qXrРlIP%桿kY9B{)^q N^ിi,-n* M롾-} plq4KB)c?9kV@K+Zцt +7D@Nȟ8EBLÎtL k4Kc3pUj&f#t$%Qkux&.84 RY"+I!ć`bY'ı8ySiǁ:Z>KX~/TB1U]@ +Hw-f3&|Fyб%ւJ*5_.Hhvԍ$0aOx S"J#']5#AbO*w?0V#rմh{BRBU@EjyBHsx-crWirSF{qI!qNG|wj!^(]H,"7)4aJ-I~\c-\ґ?JSۘUMi["->w"%RzUufJb[v!b!!-7Q2cL5Xib%TIYi[#FtbҔBF8]e~ ! ,@Pp`H5-زw^E_lA"D{g0“(SXV{^0H4 6Ӽc̚_ `+)ʖM K)@EQ/AkޯËw̆ϼ]-tuYBz4s&\QѠ/-՞veu+ ]4@EM׀QLyG Ld-=};^TQAfY$\Uumu HALa ,Ao#H!q-p1OrRCQ@'Gf$Z3QG#OvUc9fCReJ~ ^Di$ T}tqqOD~TSfi5JiF*fwt8]6ٜ')`R (upc+ `MOZڢrA@isOFFc %V;jSN_QGӱYEaTAe?IQ&ReBҘ/@JHn&tsUTEa+rHrEה/VwBj] ,A̤de 3EyxV+Y$%UJWJgم]T?]Em 0FH G&UR̳F Ĭ\rf)]ֽCMVD[go*gI;qՎwo5XY[_A$]w`6XxXc<30wf[Rb/5䱒[}9>sN(i^+yVձBGƩ]Ktހ^TZ;glx.ӟipOKaTz}uHAꢜ , 7򞛘7  Sf58aݤW2D{j "H! J9k@@ҥaBDtX!!|Tc/ǐv@=ͪABI{E%|J3ЅUA<@ u RxˠcZ"2Zp "e19Tx~*T { ^񏷜&7@)"Aw,bEEp_+2q ' dpl@wͦcE'7](V)S-@@ROx *pJ M<:(p V0W86 }u7vy$()Cz1Xb$3 PTf.s!$U+ *)˔8 D61AԊR'xRYK+W.ϊQ_0$o4DȤ=PMu㩬#?9?Ɋ*@Ι:@ MBPGŮ7$?N9)v.3b(( : U+irbݒu`$|!Q7G(BO(Lh>'Eq"b{= <^ g)մc? җij5iE)f\@ҧuU+HKj%ۭm)u1Y 5>јaVWk\ j%)*XJǾqЊl`SRAJ>[pbfSB:zD%  Lj҃j(|1+@t&N0 !u;c(QO`856ZA&P )a6\2kRɭhu's0yKM(֠#XY3vs3T6@eo[u"Œ;RQ2k_[ރ"M\ṉ-9p1̶|Nz \K^bdE{:撿uZV-eDSI5ǽgfZOf6V-|VInE હnā>4fnlr Yy JU/$4 SСN p4?ZdSj1wRc8bhmՀ 3A`b:Lh# ך>g~N0ﰅ?\yl3%>ZRFn9DW I{b A_WB; 0whvw ш+?2)+.vsHDJdfvMK+'0~L_zuu6kog\ rS|n.%ZMokEP:ݱnCc'f1eg OdffF=E}CmTUXKBlq&fm2hWP ǒR65rsbҢ{p]UC$CremSsyH"%h"MYK uHEAwe9 :tKr2i~B|#vBgm'W;swFvX* d-4/AV 7x|77\?11^ UVZOV)My 4Spb$#7}6(f1sEKm(aBe(=vuwc@>Q^J`ƈ](u7l~ڸ- d T!{˨f,7a-XSQxh$s6YڸPx&9.efw42E7 1ĈY8ؘ O,Im9XHs:3/Y%x˞J>Ѐ p)jR %MNjjRm0.Z8y&Ѻp쯮ne@a&M3QL/',l'd p^Ø+J}ЩR mhe:QelJш..tgƎRf5 CAʀT^~H GU>@XUTMgE[=Ud\r*|nv]l,Dq@ig޿D=5y[XxMqRJde.z 'Vژ,P8u#iUGE/jC: 07VпgbX=?R/]˹@3OVL6E}.8"APFy@^jI?*T7/@dV@^6;N`S@ʎn1.k]PWEBQ-J +E>R@VH;0d7>D S[#eo X旈!ݡj Y*I(c4RLPƋP1F X?^kHɴ?Q[#Q JU-iV2&[Myu /T!^91E9oI L{XH N7S3S¬DMs\gvw)AJ#MkY[-w[EAQQ(Rt62٫џO/{GgfޘP"T0ot9aHUHOZ-;+HAR[+PrT(?йBunOcK08V4f~BpLovE¿G EL)`Z*, !~Їqu||3R}[WX<}SNגŲv/"gQh b mБG5.|[Unk1ʷ@v+ ;1PUNNFfB20ObY!C :b~QNkoeĊt1QW BT/6I.֋چl1C9Y3] } Ä~_c`Y>A0֣#e:ȕ8|C,̱Ri޿;™ԌbA;¤.vB|E $'U'8kY, tE*BsqQ)}©j92z\ }lGQ!$莃qvCVsɉ+9c y]QR?;f<2"𽙽/d:fF 1!$D@YrKH$f33.dWMwD&~Ƹ3fiǮiBW0uq"\ZAR [@)z$ՅhK4OA3N`{Z'hE`.!DFR#fT$ NS55Ec q-j$ʑ< F]P ]gT(#ا0$lWIԲDxA4#v!lJRE\ R1b"x,3k2' pj;E0f !FPoh#A%bQv_!aqTb}UH+4qatmTBc(I2'T!ARB (Q(QXs&6T.&G*{L'! ,`@``Ho!,k#JHa_3jܘG *DZɓ(S\ =H(&˛8srǟ SΣ bSCgMՁ66ըB0hjWaϪuXe˗p]̺6gTZ"ժӺNeg & P&Ͷiw SX@AJY&[(^b*#Lp[ޕxOɭXN3PjMNBh˞/{orsyliC|muoro0#ݚxAu5gsZ+ rQ!v1SuFbJ^ED Ww!f L!"Bp1M_nx%u58f1Q=DinX1ģWfDW™r@ev- ;SDߊt*hv\k2@ &=vQ[cK+\paLT\rh~qb.tWIUw+6$\t#v/ޜygxERJOdMդS½B# Wl_裞jYSRtVi7&FA'P&@zK'˫Ҙ@2ATj&npD 4RKqj^&QJ+渒'D Z`օ`*oPr\KlQ|-fpe]؉,>&JLJ -ڒ w8Ǚ ؐyi+Onq-\_|swp#+*fJub7urk 7#5DrD.bDC1jl*%w`&{-:s.P1QAsSS,kfuS8ڐ6 ENYIf+1Bt>Ba֢1 CIO7FaLwV!]W2yM` @C3E t0)l,%{pUF#.=I/*GK?$X TEUh xraFW$ DQwl8:&xs1@HsK <ݢőA(.S ,C t-n5KNW%[(pBAK*YqqUIH?[A89H=e4(!BBӕΔ\(0)mJA-qЁ.K^l"N9HHI\*ŔJ .L`9\Sܬ67kh z#5Pqc5W&!XڀʑzBqk*Ɂ@/t+d0N1` f rjmm(tu] L0MgKg99>;]_)&Øn _Nj寄N~S,ڻxE6 ʂu }O2VfLd) !t` 0A/ƇNqS['6kr7Pwn`k"tu fJ\L`FB6i;Pa jZF%˔PP%0!Kxr5 -`>z`ٷNɒ=,'WKڵ2}m*+&~BX( jׁ:zpA ږFo|n 9Q0{5*2+&&ghJA:9_I(۽k#l2F[SZ!DuFvց+ƏF%+Ǥƍ$w^țp=x;se`qP#uHHIwV펋H9_Thw"Kqޙ'\S6 r+؀2Qp} ?o~[Se.H.u3:)ƅg~Zbu<Mu/!$i$1OYÖ4n7Vn{\ΐCtf+}^ t1X{iTVls( vEY e78#Mo[8~m{6 wkPz@~Qp9?9h\cכq;b呉cI u#b}Aws }!Mg+05Cj7#}0%M{k`.I,#}Cч;Ro-F,ɎW3gfJ1CWsfx/.SPXBeJscxQpAqPPLDӺޯNSkmy ,!=9{*Q,s1%,@")yd )qA ~eoJw )\w)@b =](GqɹTLg=e0!8 \0uQkn1l+3ztQ iqa=L)$Tcl!$B7hKV@`6R ))&yW&"nJ1zOPp+&zlZ"fUL/P!ze!|zOc (\&J1Y)™b[rzuh@sJک=Lv9Tx;fƻɦ-ܰtRQFT-7޲݆?$G +ҩ=8 ya>Y^hL-N,}r#U&)V' dPr:v7R'TkL^\{6"\oҹq]-br(.l|V;5ɜb[{ 4 Pcr!Q2:ANJ(Ƀ|$V78gʮf̦ip+e3^.uVBFݿw~ə./{BՉZ]l Ѐ@V9B=/t)uWN ;;{unZ|.ebVDU'pi81wE%@Ufa(2j*"ǦQ :*t 3,`ek>& m̟ UBJ_t0j݂(M*`U9Q&OGbb)Q9&ߣ*etF5ߍXx?.-P滵y(#m1a ultfP]Ɩ%7gB.2#t9#uJPֱQϳ&ۃu/|#ut* hQ's l27kfR?ծnʻiZ%uؚCShUlnZ'˽4uĖ[)u0-El˻*݊D<G+ojWHBu]_brB>)t̺.0-exo!H;2.ye&P<""zm Nr%rtЋKnoqZ6; "%'Viv\TW^.TMUQvQ+׷T4rAx>t@p'~eoEK)|i1ťMj_WDy]᳑.td#zv(La 9ODC z#p^ɮ =kDrՋ^-K0'YB5Ogvۋr%f-=8(g#wKSR}uw{!GoS؁x[wop$xzws,+.}G(:j8ht=! ,p@`PH [PBϗ{-$o#GCIaA v$)p%]Y D "--ρݘPP9T0oze?Guu:F)^][Хۍ ;ѤLlC>4`B{(O[\LIGB6iӫwg*eJg.js)T׀*q *lS+ oߎ'F?wLJx1ɡZ֔&PX7)>){&)RZ=/%|7n5GEr ךJSapxqHډ"pTBuъGi]xM1-tDI~g/pemD \p1N@Ou )dkPՑ\^+\axwgalᚙSx1N"%P_`}ON!n vQa<5svO  i/wsfnŧlWp )j()Paw&\til]T*hz-At拭Zh+5=fj-R k(pe+0`rqܴi?Rva+pz{*M0nflcNZY&-݃?mʕ-CpA]`6R^BgLuK@Ezt ~_aso͹I Ss>xif}mfʉ@ǝ@$e֬+]om6܁-h.oFN`m ֒{qQOЯ]݁:xx~bGrۮlgkRp}Y[Jtǃr챠twYF($=˹ao #Rn\ъ5%3Ӕ~*vSӸhױ΍c"2/{iR B lEiE0 zߦdyiA4x ed#W{l cy o&f+}<CU%&#ш  P 6i,r*ʍ~ѣ8q'Yn8IZMW4OS9ߦ@RN Ġ0~LE,& @*+3D(3aJܲύљ)9P~\,-vlI;<؀Dm}gS bM"'@w@bȋ-hܹ]R6|u/NL㡀+,{I\J|> ZDK)UZxO"_$GWqM.O #FPKn3R,DYMn4`VשTc+Nܽi$DйňipysJ爥k^DAك@BajЦfC Ùi'0Ui,I8%d\ xqEGa`8FN{!L 8dh-r RʖR0E4݂ bD+K"VڕNtv@#/1 TҜ'ZKGb:3CE [A&f݆ <|4!q~aw2DpL_;X;n! r"0ETk6Q{/923 ڹa)-ս,wڱP#shK{t.f G1M^MeY׊WLGmh'!VMLe[Tv젘Ny2J 62Wƕ26!v,#,[q~Npazu OnU ~<[vjq9+O?IIg䇒Ϧ.[b.ZN˥a`I3Vi99tjN:sqskX}eBM 4L5vDd' ɬ[m:jVdnm2wJ $rK4-|DBp576N3?T ։O!y4u?E2xWzj! ,0o_H*+- >Doŋ3jh#_=HI 6Ô.ʓ8syΟ@MKqaD7*s`SOJUH lxj̔Q0,Y ZGUY w i@xo ,[FwVm8jlW vŅ” S(Pq3xйX<sN>+4?"[=@6 o *\J- Ԗų-d(/$#4K߁l|ؕCh*iS@\L'-Yhi%o<Ɠ?fp-݅I1P\lAvzcB d= C ~ ߈PhyVvq6}\LQFH=XnHm/ǟrВ8D(xz(X`#VF)c}6z?yd+i{ d-eh')peؑHNj==hm=tW dptj? jK䍩d& o&Zꋥ(@S0mqZwfJkfAmDj.mRTᦔj \zӊܢ.A;igw]ro`@jO@z*ebLD͞!ţ1-=֖ nk @$|nysqæs傺H< :Ţ#M~j.n1&dh=yi iCqBgכ*UbIm3])G$K֧.2ɡro^֠71{-JV1^EF|JRJrRMRI%Ht[7.,Zf]DE.R  Ϊb1݆Uy 7V8~-ҞcXb(BYK B-82b~2{k'B&.tG 妾 _Tܔ*\1@UdXhMz_#y26PI "LfDlV-L:ךB6B!(&4s,y)*.lR4םH(V{#1OZU*%v(Mԩąe"Vbϻu\(w޵uS!AB>b.(p$*a5\W"0n6dY\!cC-Še$h7gɒ6ݴ )ɂm0PhCDmAR-7.b ck׉bs]K+3(t݂ ʲm[>rP-nZ$@bDB`p:0'Ĭ G'jŒ$ڱ dYM)44)$%F<~ja]P |RCRv^T@Ila߫[qYN + ɼ.pCcMS!ɼ-~A0*5WSJe}bN.7q~1MLcUHI2֠= p\Y-4.&LaXa1-2uPH& ϻ8ԁq> (-ݖd{Ҳc82M(C io<^Q 5[FW =I"؋+KEyNTpLJeX3Uf+t|Qo H*$"ć@ D aYJBiDN-FRJH~W5A!6ā/Γ_TEҋrSҳ)uhh|N"ߠ7ǟ()w ja3c.LZdxG>-15%`s~n/MR/62Ql(w&wu~׀&Gg%xo^^7T adU# 8wkbG:$'tK"s $mgPW{b!"Dx%sbB0у3քq|a (qx9x,Tfb8eMrv?8vG8&f8Q2#RGLx':AVsvJH'sLJ!hzs4ņh*! ,oH*\? >l80"A_NkF C9==LI˗#-(0L42sJT*ѧPaRɈmHqMS+#G)"e m(E;P;~WϤ6L0Ea.=#kヶn-嶤>, _`bxp[ ̚ƞ$my?n1žW0a¥7jʻykڶ S~;ŕ1Cۼvɜ6~ze[c8wi+2[ȐMp-W]iV]pvf WɍE@ך=gօ[-RTaaRTm$µr!BUY 7bymDw[PFnw`dmmR_-}JbXq #YQ;!WSdEm]Ea%.9Oe唑w6BI)q[L:^=>Y'hQMuϟNd@gtPFcyYPszZk8z՜oBeh٦*$JZH'\(6KNG-H8QڤY{#, MUpvE% p%&N6mjkKSkCN=$'`o{=)K|q6/YIɁU,o[Nlؿ-FZ'umX`p }i?=YMKd?C"^-y[(VΞE×@d -4&7F)j"'d"&kt m-P}иI2|e"{}oW9^/p/}! PwŷI}{eBV{ ՐS%[QHޮ'/ic`4Nw:a]s"C$D{ iLK=37Fy\`Ԛ0g -BI"htpg9_`׳ FDZ26:QCfV2t(3$([UEfM~,(p C*b,QʐLDAQW6ID[4%{IIs}qƫFdv ҄}1{&o}Q$"%* qCT[Nhqi4Juu57_g*"hcEwJVh g{5kYp~ґnG2h22WOz>֚RխEl-:Pi:U,~ tŁӍ%F:A#Zr/Tr5QJ rMycڭ)+\ѓl|(@E>l9efrlElvr0CN RZLijY›M>kӼ; |O>[`4K?LMrҰ5,Q3]MXS{{=dY,+[J!,4}h+& jqnD|2iWa S5!'i 7m68m<)w)1&xi" \Z[ ~2W)C4?2Lv>%?ނjtװic+s eztv7E \ ^[mCV5aa#dgX=[{`/4jL); [ՀWRVNg!b,Ԗ *Kaf7, qCߥL3ܼͫri|CX#~`]Ko즆n R7z -cP, l<\PV ~HM7z)H' _7( 6y\J$X -woT [(h~ *=6Pwu^- R$؊>\2xNH4Hb-/*q+de 'uBTSwC$KEI2\筲1G\\7"i:PApX'ύ*ϫSiV2Wn <f9&9a'|UUd$%m$7Ab4u.p97ZS} deHR\8'aHd`$4*RPa1db~uRlKxR2=E\[A 6yg>(!A,eD]b(%V?RTyp4!ȡA BZsm5?f(HI$Ei"*C&3dsu8tH UU1mFq.xx >R|XrH|шgyf׉o_ aN78%6.g h'X*@v a8Gd D7"3FQ " M!Ho2hx[DYbqFVI)!KPR9"1yK! ,pH*\ȰÆ @VdZWÏ CI`Ćh %KʜIfB_p ERVjذ%=\ʴØSJ0e՗PjuɁnECѳ>+ʶ-ȬmJ]R O[]lЗ]aUVܸ2߯< <-gt_+!۝%NHD2Y ߋZխZmSEq֒=EQJBl6EfW|cxe - 5\a FWز[v5~HA>ߝDC{z[%ЗEfwd XhIgiy$I 'g |h0[G)E9zLUk&QvJL1anҙeaN!*@q8OPTv#Z'+qkTu tF[w%Uz@ 5`ppCRdOZ˒R;!kY K8qB=`]:-Ď'11buC_ R-2ujA'+ln)EItD~mO^b"|/yGb 4cR~:]ӆCMBY&+KT$ ,bz/kݭΝwK&¶ևR>=Y43f5Pn),ϻQdڕb+Rʫ'qfCPk_(~|\\KʝfMȗ&E}^=l\]0nuقǐpzpjQbi4z`e )Z$(;>Z4ԋ;q(`f4zb~{x'Kb'WU(3QܥLҶI{B! \W>:i(Y5}M|/Haԏ^<6@evfbAf npB\7z m;`4ٹ( KC5H0P9Nm/Q RiA# l:WlUL㘨Fh[[Ƞ0f9٫RNѤ/19•zT*&BiGz`[#XLѓ|H\, E7YΚ%&#~R| JyY@݊GqOi ZJdBfEheAq4 uQ(EgjR=jAu 4M/f@j̍8U?HoKc!EԂ$pҊmjhٻ:݋7v8~IO>I;`4elsw&Y\RcI84)VV=v׎S5(ţ=ڜށ e"5b*eͅQX%!۽ kզ|K+FJTa $b U 50Y4=: D EleaB$D!'DD- s*bfzIòah6R=0qDN9gؚ%jр k L:r$Yab 2ZնJ-lRS4Sҏ%Oo43f eA ȁ^ jlvK]w!m7n };2F׬eqڷbPf 4>ibz4zmˎM M)K[IGTK9ZhA :L@QMЬDم7+M\j*U; X@.#EL[LK5)6zv`4[:araϼ! ,) Tag6D}0H)My=ҋ -ulM#C-J>nǛ,o^Kq;٩ 5.ɗ6l6{?s2|ɢan6K\[91B8,/-EPD_y4#d>&p;r#"WMC%BBEwwHd\ER!fEtGcwq&vDwwuҴ^R^ eK!1nt|Ft[7+3O”j|9IRbKSG{maS'[29G|ImUuqY`w'fQj{sS3`vF>Otq2q?o%,J@9]x(=&h Z[8Rh({i7p|HY9|8H2f@ 4Wvx@'p05dOG,Lni@g @GYT)7?- E8č_,x]j_#8m< $ c#[!sCjM5&Aai~.QsԊ2Ɛܶf>"cf'7kddHi((Mr~xՇwzэ!Y~ &qb|P8H!qVP ;46DRb>qK9D 1A80  ي{Y9WGG_Wy'fl0s&_Nng%E9nqyzOQBժZ:le Z6Q`[E[I et ٿh5×oڹwҪVfGVZo fvU ?o䴨u`kI˴uX<%{`o,FNMm-c3-wM<2Ǘ#Uٻ7\;_cƋnoW6cF@Gyn|"W_UtuY|P>xTS-ԕuP=٢^ &-8[ob/d@y7P hހ(=@ %5Xͩg dtcQ=⏎@yցY$Z>?BJzdcY t(V&d m,68mTDHim#@xnPePj/V)oyuvP堘*n@~ʦqgj=֢gxw]Ua2EF%{v (b 勗ϲ tp`?v)p>N !O~Ae]HڌԊ5, 4,)D [5Diř)ZhTg9QȠkrAi閐үb J33^|ȁmB bc!h Y[M͆|#Kazl"hzcb⚞Ul][D!Qe(P۠V3YA[+V&WXAq)Cۆ#LU9^Si]sR^"Mpz3 ́L+x'ݼ:Ω"Cm8ňƀ)FL!qFQo`J%0,_Hq+ EK/tA_x֬.ωnu*0MZxb-{ V 8LQF 8x)o ]F/JPPZQbfհKa$ ?8gbrvdYCA~#x-dьVLjP7ԙʌ@ A^2#R9ՍQ/Hܙ4 +e;8 gط60M'`MyPk aFKQ( fo Ë*ʴܮ ʕH IPg~@ %4 p4[iŰaUIE\MHRZZ!,tTSE MnBMY\݆ߙNJH iU`R`>0[ӿ!X9MQrVe})DD~ ޷DJI#+pQg=UZfT"mӠԅO,&Pꭣ&bBm"oxZ0"ڂ[Hp1Tnwl|C`4۷޳RZ`=o;n"_^נӻ+ƀm)l /+\䥌Nah ȹL.2{4+"l`4߀Iεz7ZWJSr  *U4r6*94Yǚ HOz6lI ,{e#;f BT[)A7^.SglR{:Pw H=䡰{/h=c5!A,IS ~9+@,%zѱ@٣t*KqVc-1SI3WC;E>1K^Tq3&n1(&йQaɆSύfɔG\[cDז-v _= {k4p/.M3ĐҎ c00D>o9'rAOch-R*-(%70*7e4@}Ng~# c q=M@GG,傭W(<]wYlxs2N#voAi ϡV56f,"G@TU\-S 2CA#q! ! $ss72Qc;8mHNm + ?a(?hgywnqV"qT L 0K}T[@ Wd5p[~NC, )#^rtgwuCN`Gd3Ah' 'm ҃[0)7X' "_RN=s`jQ(ZDm 56g,9gBh/)sMh1^^)8 rhuf$ Pj ueC13CtQ*H4yS>"vQXM59u hSej i?3EYV4y&i|F `Y|Hf]hXW" ;r"gݧlS|6=<^BCG1֣$|%]p=g|w# T%)-"J \}q5L9"Ay'Qцig13_W[dWiH3X韭g=u{UɁFyɖB 1婞tȑJsf[voɡ+Lj%jҹKAg"0GwZ:%76~ir 8?*<1m|;*zc QV0(J#V 2yɅ[.{c:@3! ,pH*\ȰC/ޓȱǏ ClEF˖-D\ɲH[}mѠZtɳO A RP xӧPuY 0K3ׯٚilYm6˶-œmʵ9VînelME5K0Wubp@dž#=Zd M%~`ւ24jUΜ(8tm\`tD-}{8ioHul׸u A l| ]J=11hժƩVYӌM`^+3[QZl0֕-bDzc(-S]^e@[h cmm$~aN[m$R= trTmE#z(P-hK}B/ &#M9VZF%9'P[A @HZENAyR-R gdA%cMc'O#Ed`sU桏zK+naiXʨӡ6^6htdR'V=Ɗ@E,VsW+=Luɚ͡cGWG}$<9y c{NeŪ/>MwٚH:1o{cG Q/Cf*RT6r"|\52h~![ Tbq ^F@CT/]&dg ij{[W1)hMVWiW ior3Q`}$k26#jåSe L\d#1WJ⺶jNЪNfEMXI>{9sjwEjd„**լyy9[[2>c" b)+/|;7u?pCTRj 4*+Ȕ .5._޹ܢK+m ,"E4H-n[2 6L%$t@էROZ!?&NqP10~{ ؂'?weV=*rGmWlⲡ78u8S2>YvSVcd8C??r4CL JrZ0Seo e*aa-tCw(pDBﺯEaP0?~]zYL-ԁoTwb'52*r **Gg+ UW/Hy@|h KMA6`gGR'썷G+hȓ Q6Q3 _-~QYM % bաu뵤5  _Q9h=Vwxf q4*:[cSspBAd c6@u_J6cP-rf\jwxNW|!V[07#BK?mw!ygC2Rc!vK.:!9uG* R 2 x*b_:.m4a}6`/4~W1eR!^Y!A1@X]]Ej:g( u[!my;5ei 8RBB=Fa!y'LO'!Fo59B QErkV&93fbQnRrZ]2ƅR!p(8/HP'$ϲ(ㆰAZc42$ֶZ\&J1GfQSF"'(cu$;r**RAPbrgdPWw˔o,k*u^[S'i17bBM @W9EM7G#>8'MdPQ@'med@>`A`fGR^U[ a-2@2 XbRd`A?d 10G"&SXaP hcRbڵM3r Y'!#&8Q"&#TC$>"vVmk89K8wIxEp(C` b`ݱY}Ayۤeew& 4xQIxn'(H pKVE!#xx&S_ q7^7.lNͲ"u[ d. 3XTo8>"9QWow89 l9WBmCqi `4IuYjɨ95RaJ4lr;9/%_(XB,"DPdPRZ.b]6%X(fE1eb|>',c!b)(=t?%diiљ5oV@b h?!ffۇxQ4~OU9&*{l0͇Ww&͒-ŋbN|Țc w0"Ni:GZCDQs:)|,:E#0 ij.%0eSu:Jqf/TW66m0d@!Ãfo`*Y#'v|Ũ/"z0oŔW$gEIgePt\dRoH)~#JwQz^v:z1'3hyC6iZAux{BkG[VWfT ʊp"=B! ,H*\ȰÇ/ŋ3j`_@ رɓ(Q `)cʜI͛8sN#s Jt`+2ZhaSȢP9F WzTׯlȢlY^]v/VX^=VŶxAC_D]0[[Y5Mհc XDǘJX.ֻC۴ԯeQͺQeյm4]֪ۡ w8Ee{gr_)9PY7Z H[cFd: W/]x/{@J-04cqmDݗy1πUOO TZ_i Hht-㱸xRu)ނ'Rx14i}6V=,sb6z E0d[OifsUF"V_@\mcTĜHٓ}yl]tE`DyM&I; 4dsdִ~a*@,F'+ha e/I`Vl7hd}j9@+eS )JpRZPb[Ap t# 9FƬ[$˛cfA1|%ЙI|]fo-FeDDG 4 D&ŧǂXe?K|-kct'A.Y#cD e6?,RJYerZ3COvs-c_~&!@HF,toxO$丳t5cR&q'tҝD[XvH\uekIsi6!d+W#ƵŰj1X7j~zL# "t9j,)i!I@b4>ino]'PT V`WDÖN>WtӬ}CbgK+.{@)^邤D_G`jF' c^2vlVh ?&“Z++ZErH6A  )60e_;YxS)Ԣ*_V4#O?0v WCSsm-aKHVj'Vxʓ2#pDh(6bM7R `%vRC` nPR? 9$J`Kb7.q i8%zK%'ǁ`]dZW7U!( Y2A5pɲ!I'K)كu$@6kq:,$% 4UHE|QHԕRml K c8!@z/| ĸ2zW0Q ,gDyKv[AqA^%!$EcRbj(jQUASnюY*T Zr>$gZE-DJִ@H` + B/z4'\I).||L^ 6sQ\V>{Hv 몽$M'^+ D_ZؙbzVtn$%IIZA+* RA%ꇣh霝OHw W"]ftjCZhgZNnDY8'@F0Bż(lu0.G KFU12*EHdR_(8օ1e`LKw(񲹻5ZT^D#3QAZT *Jr|kiER1).Ae=S/%YpοV4GIʿRm؜kp9eOJ[]Bi$N2 &UO޺=6܆/fB{,^WCfiRZd // Ɖ:fAv3|'[^FuT9.I+?f\CUjK! gټcmTW YC&r:;t,қg >Җ$v '91}CĒ tPs&mAdUŵ-w MsE!^}<Қb$^NJOqX$tcԑhE='uZBsh^U^hpxT k\9g@ϺdGAh큤E!qR  MԘZ4h˃ y)~oA<0 Kmt"BἫ}&c˜]V76U|AL[tx0wfqpeQj6e*&gXi@eV=cdVd${z^Ql=7)7@b aA`#cNW|O'm 8SBf̒=69RƑ}hԇ&>SzH%~$F${r p'!pc"tw"p1BJv"`9.|HP p2={U+GjSbS%' $s+$U^qa3z 1aUua!!k"$$jmV5wq3{xLO6cP!GKVqqMBgxE Qwq96U?'rQo|.r,7f()X5l;x81, !! {rSdPZr?v!\QTIّH1qDXad@C!ّIU$\vёّ:){dx\#f Qe)Xc/nԌ ${Y*v7b/oJ rk@FLN!U=A'*mX(2q')$"ZieX0x8tacxV$HF"1[ciwoHW'OH f.f4x$]eQQpU@ a&2>`fb<( 2A U,}FQ)'I"R1:*uYegWy9P/I*D//44q+|avXnpf%xst& qF~S{naEeg2PO qTуwi! %;:DBw#5U,yA#%H=/1JOK+Rd-$JHb+t7R t;0 @2d#.4mܤPIԘ &2r$}>dPy2a&pAwCF?H bO:S$0%wuePZ` No%} ?Cp>҅>6*$#^fKu7%Ux*GzHQBOy$wl1>B ),uU]Z1SuWٖpJjt"Z%Ѭ OmE#Q*sbí?B2SQlZتh<#;W2_!<L69$E166i$R>3 h3A?*4t1La3X\W&ZD#U77ECvJO9`Au٢stA}U'Z S2Aj[ Ir9;Loz{d:'N d*'4x dA$]dY;·W( w{wpe2kce[ggQ5Q,6VBP,7vk[oКA,jv-dn%7i$;穭EN x L*cV.ٷ 4Ʀ=j](hs9 ۆWV.Փw\bL(Y3_[^X;:Or!ڪڪzxuE'2= "Ud8{kE;8,Kjrh.̰ɲ-L}*|a%}Tv)r }XR<QG9˶!AldW3Ne@qL8DECLL·! ,H*\ȰÇx  f,1Ǐ CIɓ(S8qbE-8q͛8sϟ@ Jt OG$MZS3c9ӫXj݊*Wh6xڷD+p- [" n*:,c4h,y ߱.|3c)Z2hȢAt-J-!}+R;"o<,dAcԂle0{jc2+tAd[tN1bМt%-ȄCuz `Sنu#TDP@l#3uPAT")dH;M a񺗙VLk!eq, KNF#`Qd˯6GVy8xMn 5"=KbP krsr \UFDz1$"-6l?SthD<0P8iFM9ͣjѵL~|NORrn2C%JY_ 9Q--L=OivZbr RXs7x%i d@[>'V-'Fj2}^BDHShs23q*h {+ 3/u!Bv[E+H-4 )MS_e2g0{v(7_8~Sv:RA h@NtU6,?H!TF{H64ҔfؙU.p#ɰJIk9F T2'm h& +'@+l_h5x9hJRZ{DhuDR v83-ԇG#-L$rq;Tv޵0aL9*"6d?GCI*Z1jisupAm+4%nKdsT!e+<遞mDdHmPiuIsLZl̏R:8MqU,˾ \<&E#aHJax~gLM9T$ia×V);ߐ~d3 :L 6cT \;4áz.'[FKm 'Z$} I, XiӪCXFĪn>Nns@L֓WI r:.$\ 4 L+˜su&S qN{h BT[4F셟,8im ~9c1f>㩏uh_Tbjfߘ'W kGD1!6C=vbCff"+X"[z5&kVTsUZ95DxdԂ0/$loSL]AP [0[i2#,2&>+vcC,/}':n5uk46Um!Zr(wVT!`a_ ?~.?{ ؑc6:MA%38 9)w_6"2~q)s)P%g]P\%T#BrNC 7x7u>12z!kG>]ej_H 6;3EH,Hyش(DFBcP>z](!NTZP&afS YWW]%As4rbٕPBcSquXUTwA*VrOHQ<eA"ϥQ$FoSxti bbSkMMA[]Ȃj[:Fg5V8%a@5*%drbV_fEY)<ȃlUSawIM<7dVw)d"^vA.CKTw2&X(2cRU5bE!G4*u^ u@ F2ct;ݕcT&_C٢T)E%6q1C&8פM_zCePu qW7c?Zt}HDra=:$ QnYuz#hIfw(:(1$8LVr&ia2kpJ7S^BQ02l0 #p2[P!]>h0`BX5Szt*G 'u:Xȱ5r0g>Z2ysbcY,!rD5ڤD/rǜ62^qMVʕ5^A4%"ƞjYPn"0 ,EB)G!/B5L^'\!פD,6eU!g8h7뷝` "Q<5SL*.S(.l"1K lٚ /쪞mF>TrD x&Dʒ >وx5votG)Lr@dA [@bzqb+ )Ʌ_ A(AdsG C,R`ǩztXcVK_1 naY#BSDZ!Lw {"bx=8 Rxb:ۧZD?KC( QViB< N.UEDGg';&l#3#rfUke$b'"FIvt#"'zw#0g V1F,Y5xD{wJ{3cSPvX[NcB*+` CÏXLZ8,jXV,g(PGZA "b dFa ARcɓfGj!k Wddk"%X+* 3KIZj=̂@ ˉ@`06#.D/Zr[%B:V&"X")T^0: FAHl kC-lZb c8 &bSkaÌ<"1kzk!6>U5@k@f 6*Fz2vG-'ϟdX:uŅxбN9D|+.BFa F\hGDE8I5%(І>5bHם&<.RVSCl-+ Zvga kasxa,@)F fcXZXʾE@݋A2RMk"2,OD C="iU:A\ǘT>li>yc] wmFeU/E Q:mZ{V`LݻjR2c4EPHnt)jηe,c.P G6؞W.|w*'iVxhЛJQuoXha Ƥ0t4INpei 79-V@6Ba+BɅWZy0tvּv' R#OIWUXs1綅 YG(Yn}2k /)%u_Ժ6|͘UF!ddZ# Hv b`TE!%+c C+q*Gu`$`n[ߴ0 Hs $2P [fBFm |d!Q r.]22T6t0>bG4h`~T@lxOٗ}n_PCu e"%{Ca6dR@i~2v3$7 RhRI6auٷNq&aaseB;{.!i@*He qA.jQa-N6>!p'Ȃ1oֆOtZ@ %Ф9H/d Fcs%?_Vko7i^Ӗ3qo$cu%2W9nc1A!bdASjĐŸI29" EFٖqqYrXQGi)w]OR,[po"T60Bw$\bq2(s&7;7{"ԡ{GlQQEKhib"[OD_w(Xp!c]yU^a! {( ,&s:J#- zt"]FaJA1FtRc*xȕu[5u+>cbe.bŤ>Bm;etcI!"堧58xrs51^%jttkՍ|HvI|eyH$uUa&ak-&BtW SRxeb k~?7 FvJ#6a96%sZ[CATsfpHPE(!2p)2 3uQ8We.94CozeNJ+"myvpi)%1##:TE[@&:\d @@"wudHB~&/G4pHm'S4ACZ@*bS vF7?jeEzu$IQ %6괱I8 ǐ*n~@#t}" ~ y!wZ]&aQl _Q5mѢ@EhcGct5$db3M.RKa!u"~5[|n^G[8A)Ai8?D04gGHGbCJ 0 6OofBмza^yvMtV3ׁ*J{C^HgGe[0s[Q*.(Xm2Թw3<"f /kiUv, GV-կFRm xt5S3;Hp^TaA=Ce]G!>7lu/ =i~)' A3= :h=cmw#3T^ g=Gu>^| -~SɆ\IrR+/nS4g#r:t[ k, [Q ث&%U@eQ7#wtr+U@YWd jxySQ"(p ETbD!: 䁓 6%]Rr?RsBI77;/ĻϴÒQ`Bd$/wԁMƽa9MDTqRE 媲 dv:[owV-ɂH84j^4Z!Z$i+c0"c XZy6:+BA4Y.k(/$k["?Tѭq䟮2q`?bZEsZ)VbȘ]I#BI 1؁esKaZ)6mʦkꫜf d[ ׷|B6I\5nVW_F k6D't0LQ@l7<>gU4Eu I}j'8b_i?@=1KDqz˜%>E>Bzi!$ x=#F(V[ iz 'R%H95EI}*"S%Je%'r?8r`#S(7.;DR"R{QH /*tyn Eɟ(qE>"%苶yܫUSeM8;1PNI1~i>G{GC)&?̙S" X]*˹w:Vm(718gBQ9c_\Z(AoA!N)! ,H*\ȰÇ#1JȱǏ CIɓ(Cr@SʜI&_6sܹ%ϟ@ JȘ/Y)FJJU2yWY!rJlҘԬ۷jʝ{Lx/ K/QZ3~n+Y2dE-_k&Ֆ &΢ͨIZ'|y4a4Ժe_.vdD"By5~| o8B[Cd5h)BwȡOf^gf ݺwl{vwV {sA&q\2@!dr!j0R,SyM_a5(#ld-KGNأ]ܳ{xE9uD^3ʨ]-b$ePV=Z)E+ _uNk)TVK= ZeIguuiZW&o(=iRZgwuwuHY1jղhf!F-JW]5E^S H"xlբs-%/#eP"KӁ^a)/xW-YQjIYX+ͅ|A:ITptOpt߮fEf  G iW/bv"39f1&׬$ugc Lr[ bX|Bztu;5|}eƮAb|k䡘[C`db72+jhl1M RϽ}uŊ̉1B- ) =Ffsܽ=M@7ʡ9wQ2:in{F|iFP*=*!h_".s dOYd,`bo=y/(>>6K=Gj=:K)VsFմxk e@ mbdW匡"0Q( BMZ n$_3b|/S㡈zE/6R`͆ Ԥ:h!DMİ2) M,6 U) |%kBc0n/Lr1Y`qr<}/"-$i]+~qp.$$痮/&K$CG"fiK!d6!BՎ8/$t%:O8KQ`ك qrB+^K2lVKZHuB ҝgQ5a.A c{yD_A t2=f`ְ6GW,̊ cE-bS ɭ4mkQ-0a lSF'60|z%iA [V1E Dѐ |d7cb:JhLB9Y Q]Ը,%)S#mT~ďbD"4mcsfB!+(ƊI9E.YA/ ?8(W6l 4%~U!T!Zp,m(6w(HFBWi]=mP5gX4oקؔ6j@$CBmKzǜXD-zt V֎zZiv6fE,A;!ѴP]mSD4vGSGA/ Ⱥ@Z[p;{r, 2AK CGO8ȏmP 9Ȕf Hx קz&Lh3rvInӕt]JĂvˋt5K%EqWIH 1x!!"B$jOYnfZ )^[7;LcX+-`gkdQ [#KlTh\c=NB+xmi)uØ1O+vynX$|qf{KvW ZEbJd,h U*؏B^a=nF.rYo Lb=\a3's 0’\yybmszc ͕ED Olkߴ'yC?6;[I٣ 2K`%4hG~ yknPBGfu #/-S(04FcZPJ^$f$bEb})a2/wq9:0F.b05$ZcEI7|8#8`JqBc"BnpM!|ctur8dT0Fp[5mhQJc@QҖd!G Dv[WCES6nuOn]$+U6c0SLJ1AC@&QcR3gd''Kt(Z gt, a"Hct RD_rppX0iRqPKMVQ @ Oe*1AaFgQ^ngqVv%$Ww-~IKbE'8ViƂ,y+<2ZeI%D/KTGq"&`QpBGd#!9QNS b6S3סn.#FFum88Wgw 0U #2BeG!ged~DXuy"}u2uG.*/g0!~"2AjA;)W1ij5{-wya}QGo{Wa0" d%'Ńh=XoFwz$֗/51qQoYUdu8XevُoH6bY:iv x]GFRӏ6&[U_aי&q'{rHh&$sWiFxwaVUǗ)d=IjfHƂ7c"wk8&;Yuil;bPH|[M#'Dhg+QX&'(bUB;a1YY#H.S߇6ߤ$h3#hfBI%Xh PB'"ZhVbFd2~1(]pש ;af`fu)yE(aD3tKIXys #ѓhg}"HyJH@L-IPq 6ҤX́h @Bq@aJ*tR52ڞE[i`R7o.jP^aaEɄ?.3i,±rgBBTc".#$jmgvu`!#'`&I|a3Ḃ1dty$"c#v?הND3*J6Ki:뤝`xydFhyK}Ng2Z\V; dP<4W@gsT=Q!БS()Fb{Sl5'J$]s))QG 4$k 'H2!Oe%Qd| U91_U!nj:U)qAGٽ3VucA 4Ԧ8Vxc,s)ӳ"dN=(+{,DT#+Jޱl@MiUC?ytg*11Edl8%_3j~vmn"_0 nJ2-GCAZ2 GLQJ[?Bݣz%c0):aAog隮+V=y-F8| Tc5U<t|B9+˸yc|zbA #W=h(qEZ*f yW|3I#:li, S.b+YZ9`ƥL\k0NLFYSXCe20s,B2vi+o5)(}y˹R_^U f˔OPgcJ{1 "$JVéoh !v5%R1i]'3.7"ɧhuji(pĮ% p<숧m|xd|^Zշs!W+H/WOz$:2c,[[4fN8j6[ [ ":Q>I^-1uТL^}q:Iu a A iSa֞D?dbYJI84JJ]ZPD1<%B`֘1 )˂JU19Az)sJ |TxI1U8Q$5XiVQ;+34*3j24 p)$3~I*ޚ)z~;,K\}$X@g.y}3LuiPf&>" v`&M;Y0Rx-M[E oCfMa/E˙9B[\4x7oS%8fKT#1$LFVB#haP$O;u*>/,wv,2(!N3}Ȥd>+g_hCDKf%aS+uzFibfk& "|)`Թd51j1[," ҀW 4X?F@k0#qӻ,c+-GН.4H1mZaY[ n~[^Ysߚ, K YĘ3'fECB^ͨ*GБ#riSJL3BK-ȗb˞-dٳΫko{b4.slw|bϛF@TgEpcn' HȊupeqAluڀ9g| 4lqYYhR{wra@\g YԞvOc/Ԃ?du!L"w5dmM2{|GLcBW-y6q%>ٝ|g t]cVސZlQלM6|❢(dS&i'&ׁ'ppi)n:ch'QmOy]7[mZn iϨcA_DWb>@ J]=@Ox`/֢ {yU6hs0flvfj7bk(0&e[UtYwV[вޙlɖg5i̓leڐw[@˨|iy81W3ѥEYԜh'2ңɕ1qdsLӜɿdR-G[ J VSaum?hmdclrڄVTG4Jla=\_u|nYD@e'J>Qpg_qYgP3qg Y8i ;ӿ0,v %pTpc Abff #ΰDbhD!e!ҰE1,:ƖةO E #1 jC4(E@" Eih3 0\.}"F/YMc|#!yڡд `a@(@hU SZR"01\n=ӜpCJTZJ!+v!n3rꬊ-ha\% (/;*ijȰg+((p#[^rLYjl|.3\ 5!J_Z F Tggt0 c@7p7O'bZt0"l %[#V cpDjmPz g)|3tCrZV t k&pa [SQ# Lf%5it r f8b%&HaC3}8ׄ(9p$g`A 4Z%7@J=a_&@ #͖?cAֲA R~2R sjH > (w3B±a1"Mc>gwYXYr.5!&*0GÓfAq׊._w\38K\Ғ wď|U 1Yg3ֲ/50GqIHE`E4H,T%/WuEXFL&c,G!C[Dl6ub%vwd7Y;1y@s&pA=}8?3(7i,A a]֑XrffjX 9n7+u>bA&)R 藿#)tZɗZE/gdUUFu* '&??xA@bR1&vE>frfyiyۨlA/2g{-Y!>/?3BvIwhY/v_zfE?~. BNy#&oT&[r9%wD.<I~Xd5HP5J7( v҆L10Y, $P)?jEzQ5B tJeJPi 'S'"9t8wux6Ä6 tqҢ@u ap|sQK 8:q@@g`u#G+WIRavD4%d >wl'i%bq2!TboaF:&i)|3#6' ?Dqzi4]N" $3Ǒ?U#XxW(]b9sU)oKg!?Z`R i qUYLc>:1"'Z!7'SX1" 5&x9AKLq6ca7)ձ/2j2 iuy/SNw±6 =#U b `@ͪRh* g!oE49AƏe>?]7F\Bq' tAcYdZ\-d"7O^*Iq7͇4PV =x('G/9!L$y C1;J7H)_W,z t60B.s:#fi J1 =V8qAg}83@Z'dak; /!uuOio҆r bІm4Bi`2Ym)ky9="(X&S5:Ćk%勌\!ρ xlm%!R3Y(A" "Bkn'z-7ozӆ8H- ȎVEѓo!P{.bQyqqEU4<#4r"'Qúc@ l{RAQ:)#}uFsq(!eB8%Sz.}SI*q?>`)n+n xɃ ѿQ/BB"Q2aCǷuTy5 93@K(k;a睵Hc3ÍrxH/xKQsBE{lT* r=lEZ,V*ɦFYu-'\+@zP&06\f)4y"O 62pLt{Cq% f9"&(ۢ `@aaQKMAŖѾtu0G#%3o#JlTy+ܬ")8eLFqMOĝ÷nư};A8g nJ6 ESb(u] nd-]NϢhylt7T/RN:Q v1$Hzi[EBm)E*eC}QD; !YٳyeY拨ͬGz>8E)$|Yd Ys7ߑxfY0&;c6jPBb1VY =Tj)z"nȣ}oE,Qotca^Է\lgg|lTrs?!aB,1."ΰ.aLJ]M=2_5;d<[DԹVc|{.TԙS4K3 T5ޅ(:y;AJɛPNY +Hz7i)wwDnh=4KE3D :VWmc2d~Ӭ )4P(kqPl UOH#gl1&.++ PQ*݇Ƚ ay\ZDeŒ2н+x={(Rڗۊ茖:L9ǩ;23aOƁ_3'|\́H<,7Kr*{;er=`kҎS+%Kr˷\w!oQhK@zq{_L)l~?ɲ|V|¿d&]ɸ!qor)e?! ,H*\ȰÇ#UٳACIɓ(\ɲ˗%o)/xqO0 JѣHF9޽*J*ʵkzFaeQ@^Ӫ=/{Q{ѐ%CYT=ڿaE,!2&/)vKL !bcWCĨ1$"ѰceF{Chnf @)xh4@5̩3Ӊj:lNmcn0] dZ_b4<"/j-ܒآtdx>u gxr2fafbe=Ѧ쭧SVm85Edb_ؐym {>7pݤJvOmB?LTUSME48FeBaZQ˄X=o ym&OU~a_-#d&F1"x^A<]*iV8%mmu!֩L"@;trʙa_$Lwm!th@<TlklE1A!DE CjUO9%()MFH #C`:yT(_~iF g|Os>[`K TupoᄊCR㱨XNA M66$`g?C=˃xI AjAG|A Z\ p۪Ԕ2zyd2lʪFQYA@؄pԢɏ0M"Eh%nj-JBLZZ^gJ-*-6ZҮl 29g5+j,m1!(>H˙$ *pfxrg4}b ݱza ?cD&vv9kOn,_,4nK϶n pt(h{4\@36b/eW kc98fOz9Tqp`e /(^Tʩ3X1lqP&|D7(RT4 ȥT%h/2䘵 ) 8H 0k! Т,V k vJ<0G6c\M.0rfkÞV"gqzB*|)1R?Ј׬BV7e!>]qͥ9/F.#2]!5na8d'q~X|.5>sa[7?MF:ftQ}wy5'78q=>[3%?TD Bv1JM'Wbwb>58u< vU"A^Ď'4]WsLL!K Nm+|އ{uWaw>Zq]ci1݂D,W̱<@w|qfM4<ȀY -W4FI]GXef'(GW\O&<HOb&EI81&=u-LJ)2kD8oD Fc4B%H G>ez4o)HHEH*$w0Xq6(Z &`0U}:[3x!z2Cm TlBr >&Xk17Q d852U#IO<4E$KBT%D~Fւ*-z_ [䬑00BK;P$Et!@jQao^2u َԑzPG1I cIK6Ql*DczZ B.ʏzZ*zJ+C#7Pf ൟ66郌q7T9!"iyE~Ux+)2vȪ#: KWJ6YB oFL6$Bb*:Mj|$Z!>nkUtP}(a3Dw&F8tBzxer'kVO0h:^Q(&W5ǑTnI)IU3 ġV d+_wi_xG#Y`FabIBwBw/d x Zћf.<=VMw;2RV%[{2>97#=@{B";S;hJOJmwA tP@jSq|[>,7jSz-IDzMdWSo]2} :,71G呄U푾q6"RNC"b$xX$GA##0 Zf7eaS2U>>Fu^S5TcIP[DI<"Vq,Suj0U􍝝 T2juV- ۉUSn5?f-1,* cQ}HC`fsUj xE!, )RD0ˣU{⹝;å#l2'8fF}&?i}fc㢙7FǵB 3V8YIsm9]WG"Z9+kkך\RIx#u4Y!4ƁYb #'6xt):pul)gȩoo2[P <G19aQS dYb+ 9Ho @4IGI90bQPAZ`l58M3KZ@'x(Lq 5nU?Q@8'G>XӸ$h>2&\UE)%h-BInHCH1,?(lC*!!b~̾q!m.R`O}0,&G kg5j^qya fva3AgrQ f8c F/ )OXP +@^TO/LPŇ'`PGҒ Yh`5 fyeTwAhGJ^}uV-O eXƹ\Kt%A_E-rV\zwTEc٘$hw Xqb+vA("5-ay^Iԗ,$c lY&f 1=zQ 1s o&1TMc:Y'բk&:X^"'; X\Cw6E=\lIXi sl$_fI~ l+0bD(bme9睁/>jf-"V-F?]_T $,'(fxdօ5@&)/mLHybo=,+UNE ]c]%TC K R"}$ 1i!me $I& ),ю&Fو/?:!at)C3 eę-j 6TVAɔg Qnm4军%jHC4-W KQ!Ks,3@|G]+uﲐK`԰xnt?H"B[S׵ )6]p*g-:jzAzNgNLbb~,# (k1rBb]^X/qaZWUx)&榛L $_c& b[+-l)ЃVTH9 ZĆet'K}=lub.eh_p" ѝJ=C1ؤ&cd KxNWYB=F:R?z :D=0ZHL QUJcxh_D_b01Ha6RG]*%v}Nk8C;snH}Ld) Оj4Ĉw6W ;@𠨠Ώ-J}*v]pCjpW%qBXn2E&ï:XrӾX ÃV):,kQ:0\dy-x2 Qė:ZѬs'* wmD$Jwlt  :h@z+[ey e&lgCS4ׄ#5*@z|:adsN,e" y럃kL-6BI"_,Bt%si^B%4wYLn]RKK$V Y H4H7=7FE%q-55,Q#+q?q^Ci\E\PKcc(9%$ P4!g1s QfeRlfjd[P x2]%a}sRc:A.3+gPrEXX(dhzXD';(r]XK<]!j.s>Or8:A(5 cmD<.LwX!%rE 4 S@ =cy @NmT%'$OcqP !7Vw8rF 6^8@^@Ֆ*P & aX Xaw1"5 "#oBVJk8jQޣ&kPI'ԆV%>Kr133q2RY00F3m)?_Ae*'i5KBu'Yr!ATVW_Qeeң|df0gw Bx@I{Dx>q6Rot(a]lU rY1% xzrz _9y\u\Ŕ\J&K bt]ځZ _!!;0d+@}|w379tO^:5FdҨ6XTId h$\?4Pj]35i19EEe5E<s;Z577feU!'P F}d[0E'&Vw 4Jݷq百D[r)H42u9d>V|r%Wc, 64[!6/tFZp€7hA!B&'R<'C˜eh2Y` 5g:LtJ<kZVDk7b D(v"2"Co :&Fff7đSbkPLi&=j:45cjc0 d"^O@ȲY!(!b )SQ#6Pm4BM@le&X6HDkT@3`[pqNiQ JA4P5Xs,bm0ĥ7Lr3LRuJ9q(%3%oXP@A sbOL)Deq>vJcyeo 1JcdB6;o(=EXpt57y5a<7* s-1 ܧ.G8l2EDbtZCrw0Q^8F2wb@*WcC \VS! UdKTR}cFF?Yv0<5&Q9yE`=!=5$PiF-Q3 "3Wr29s.by` D7x! Z\ug#Yz%v#i*ƃaQEqٔZs#" |[c0T^Kqt}7g}AyIzheHf91[#{U1-"& bHK)YVbp+Zt%+8\ˡ; y$Uf8zy'E6b d) '}kՖ&$DJx ۢ_$uKCXL9"A1E+TOu5l$!r&|(fG^T)A3g7G'14s@9?*xQsk xtpI;{f{I&Zn5g DL-)4&j(Y %R$AgzZ ,5Bg 7N$Xd쳺jY-+g +Z5NRw^$,$GZseҕ,±'Pk̒ZD&S'nXYKQ< ׆d5uk}0٦?$X!^/!gO BGBma0HE4Hk@"wRoፈz)HC a7u6<+&)nAD<Grn27cLY%Tz |Jl4c"+Op5'rQqՒ(j/lZy Y ^+cp&^CK8:gUɅ44a=j˽ZWaeR|3'(V&v6m]i [@a%x` [@pD*)~8zOe e N:5ɥV%$Q2~=5*Eo'Bs[$C-JN|jbsBܡ==-\Zb&i~+Z24zʼnXq[э<[gE |4JfGðaDn#׹MڽgTzLA3ztkwIV1dԻ*\zJx ;Kuf=0jްnV +y Av%0KVbJt +gVzkgp nFY5SݴR75ߪ(|'Gi]5F X e2EELc fR+RJ3W.tNb(g"t i*k8cd%E؎+}"}m9䑷5qH$zNޞ4& )p޾pL_Sk zYISs$Y؜! ,H*\ȰÇwk/oݻџ-|5_ē(S\ɲeC Nj2eɳϟaI֚,"SIVJի sJKfٳW V! %X8˷0C !\$ǐ{N%hvC\6nh2[Y{e'n,,)k m іZYVBT=r{zy`ذ@ v6isifWSEE5XPC iFC9aU$}tqyZ`L&Hy +n(cUg/ {ʏ0(B*A2yE66U=kAW\"x@\9G.ԥ@BiP-ahJZn^"s0[ȵYgRJA|@x%XV7PQ,Vq4oJab~đr_J]?bDpp!Zju+bO `xgT'l>*)}ǧF+cwvQ VZJ/%tG/y] MV3-Yh@aRGLڋ1+ xoivYlaix* u(` e@,-&؇Me^di񥗒G8(`s^^-1F-+dl1+;+dc9- +Du$Y!VFډ^χ!X"٥f!(S%BI&7x!H$? :գ\f@ˇ.fuPOjpz닺c="o tc{}!lDLffbFG/eAqdOyկq7R7 ]ؠ;|=G?S阩p?@+OxtK +pgh ޥz\Nɺ2'f53 QbZy^D`CgY[Kp#)1@WBIլEOH)4m& M`,fPG0 {Lr]-UfX5C]5"aרEBf`~TU4P+ `;&tuj?}Y&[E# 0Z2'" " DsFJNf _aZC=˛U$$s4IK/A% 5Xi;/HMXV4ªtFNWDud("5ОUgZ[~Z1-Ha 2Ɛ1!]Z(YQ!"6eBӎ):\fű)'wqQXѦ&]Γ%byK(+nLHzbE茎.1SCm6&*iHar @zQƸ`O(XlH-XN]xZh*~k_@ b&t臽lZh*Q$\Le,VaRԇ$Y=$`d=hy0ǒ1 PB; ܴ7u%f]ם`c;La1`8F lt\/rͷJ٢&@S= zn)Vi8ۡccHЏUI1rnWĂz/l$cGb#! -k7y"4Q&KU 8RR2Njn|`a1ȱ@`<r22y0QkP%Ab{dn 7vЧ2o Rvn:>}U͘yg ^Y|yɈ B%/Ye"t0v[,MMYt)8;H+j O$XA-ji^: =fzЂ-Q""aH Wkr yI% XDh# EloJ mI)ިzWcz!-U1ZD3qoz+ժ3p!|D+d` -mq?Դ'tE+">4l\k뙇3Z6ƚZV8/OI iRWq:2 #$C0 >wgt_-W⚏ t3 &$Ռʺ +)&VUMϦ[kdJE`fƌYfY[w#U$Bֻ͒cXfʫqR,j!:.P5(H-Ms4㼺cj-DN֋=[ 5X&#~EI;X?DoAtł>",.DSrmS46z;Wu`8kF(3/3\YYq#H!R3L,6LZ&2Y?s*`QcdZ3gMF-{{DEHGd1}V#)D+Ȕ( &afSt q0uc@"@48l@]b IE D+ll+aDP?7.8gf !k$f@0 y e7hd79JXlRNr{fVcnҤbo%[2a}3'c4%8ѳ aYHZ0PQI!po@"Vg [`aXD(g/P!ԗ-tM"]!~pau^ssUDh$M8$+)bUkv&w B^5bUgwaUFVG|%47/5nqbw ,=fqtI%*~D fb};ub)B2ݷrg{7t%<\`h]zYS9~)8 'Ae[4${s>Vy傁e C58(vdAeA*x$V?Dٕ!VD<>YCn )7bA;vȒ,_p Qc W*!6zAmTk 4X-sys"f=hYbԦl/b1v{nrJXTcgRSC(%hW3;[/}5+h )}f<t$VbXDw4 O$"^B!_] Pg^vKFur6WvQQ[IȤ#d(nsi*9be@~R8zhM"b@ j Rj@ Q2CVZFN[Z kS)Q/*"XN?oP xYl X#Alfb91c3΂Jc !e>:a),%A>"Z,,Za""u2OwKU M( I!0_$q]JT鞸3Xb yr?38nD> P72A 3x"F%i$d'EHAm ErtAWqCZud(XIW}- FEs=TnӅ GS52a\(Z !U()e:Q{;_.+HryB>4w*S Gျw_x9C|e>=V!z]Ėk*m( 1ny䓸'y%dP.IxǕ! bk*,2>. C- G(j͋`鱗<fj+yE0IzM;|cٰV{ !gq*:ZtP!iv-]RsAڛB,yYuRg'WuR,xZvlA#4Q}st!aثQ@S(jqp9͜9T 9#]"( c} 0Y?7L&_*oev|7(ZP@|PnI"Iys3B"% d:X'nTúmh&9A @ Tm?R+19sm),(Ԑ`  A 9}iSHsTZkwJ!?BpS6Xcތ@bN QZ1Ϧi$CLb.Д($0$B.[gwE;Cݞ"Љ&zyiDFF 73_eyY,ގfr*ۦݜ7ϡ=h USr [K;C@fQ60#H]5U|}͆k'9qZD]c)XY!f=Z bZ,.vA\ sf?Vͺ]Bm{ V+.E"ib1kj$0<]vK>1Y Q;%.$r7ޱwEG%'vpKQPD LeDk9F2>%}D?'枨NG|籀  F^m_L7()y5Q~C$1g=jjZtS}lC;y1C LLy=Ό­"Q߱MdP8;8n#0O/tR\sx3Y,J)G ºqPwo@5QkGU/2)\ɐau%n/! ,H*\ȰÇg ز_G}H0㭈(S\ɲ˅ X՘1Zȴǘ/ J'{ P-Z$pA se$EYhOWV>z Ff=dFPYqzhvigA#S5P}5G$~y6CbPEZfʦ_wbhVڣלP@s@ZiiahPfW]Ic_MHA(TОIt\\U'K~'zХm2nB9խ΄v˅eVf*溩pu%  )nf?БEYصjH"sGQ@bhiH\ճfA˘^-ldEbhᝂᤅP@AwKF=FRe*Tl3Hw$vJcYtf-}6kiX#E-i)I'}X&)I^fQPR%g eDsŽ6xeB/ r,QM?jSlRMu+bHEgq"A|ei`Ƃ׫f==ܡ%'g1wi C|R{"1)x+B V0z9mN? XWmՋ?)A8y="D8LF/ 4gѪ ,.SHi$ՒO,ӕSؐR,Zu}k`s{ drC!udG5#w@#s;dPe*jƓqDӂGJ#(ϭ@j`$RzH@*֫;)Zi5& 7 8PX-m'Nfӧ6D]rr*"*ȔFA#PsZÙ0&[u`ry!qjTϧRr Mﱨ% ;0 WuAqܶY<"<0M ^}zԂګ'+5NT>wqmdkX8)b\]娵 PU%(D2zjT͕g2EG!j nͳ8퓛br/PE{KyOikNƨU(oZnœkے3R;SVL'J:B!,M-Z5Yn4d@R&ŚJTBr$Nͺ7@"[N9mZT\6š[w2Ҿ,s*880MK)ߝ0E0ARrG1tB2 ;n^jL2fq0#Ogɺ T)I[1^UO'R\hFm=7 7@"(FA Is n賫pʑ=K<*U8mJ}2B"a5*Tͅ\斍ѽ@GBK)A#<5!j ~rjPYY2?J3qU<MCDKmGU}VbNQg¤bCM$0QY#9}?B*?r8F$J[d??ET#Hp{G,fx+a_`('qZP@NMw6a&:v{9,aCrH^gl_eo% @j{fcJb\E]g 1fL&[WT38f $=Y`Rf,97w#Z(Z-YGtvg) 48#Vr 8w:8A܈@Uq9&OC‹wnqO9;n$QOo&{%H+^B)qkZUEgAYb(҂98"P S dS.$qdJ4`kHc $ D{iޡ[ x!9 dNX2z  MB_$ иE 12?^* BEP1j*&Łpj`>bC"!>ģf+$9o˻HF3Z`mJ 8$ba@.rgZ:;F=HB3deAEe aq:66Km"J}Ĝwl *[e˿c0G]SbWF*SEb$d&tkeJ7 >*8S)2K&\;k0`7\6869^;$­*U$w#QSw+u*vg 6;02$A^_z?8:j[tUj_O1 A}SDQ8m7; &7þ{m妏y**>&ZT7:+ VC L(ZcAsraO~l :h \̌Cuy26Bc 2$)~[H%h*b65GI'Bk9P#wKr6T'[~!{ˏ\9tѿb PR dpm|2 d0RQ(F$P1F 4; l V,qj{wEa({ÆcCMl&sa ndͶQ66!r"5* }f-zI:#[Rɦrt_T/ 1| _-*$Y+V_]l٤"s:\aUWZb*=h1/hy 1}?!%aO2*2eѐLF cpC=w' `@岸Ae{{zMک3~g5Kʒp**~(s ܠv7vBֹ1 7,-%#Wn~gLQ񢴵z0l)b"г Tat.ok7nk`V JѶQ"A(rDN-[9b&Egl^@ TbLHKzȨ,FAFL:BJb',tZ$,zn"x셷#gPfȮE=xtnZDL! ,H*\ȰÇh{l #},/ɓ(S\2E"=bE-cj%,ٲϟ@&Ipŗ%C6^^9DQJʵנD Lz0Da]֫Hl@- a߿jY0S+^̘EdEаjށr$QPZ@cVKʕC{| `ȓW˲sq+Nah"@&'xGK[ҼBۗNA-wz%p"QK=SA)!W="bEAR H@G}R @#AAD_VspX@']\AFɐyАxPZWdXJ^X!Phיk $bSR)E˓vYh'U D=h@tݠ1` fiCzwBց:ZktEXY`H jh-6jtHUުa8~j^-Y,eP詳HuUq G@I:F9P.f"kAɹv6y֛\h*3=Ut—GU1pOZPMbxP"E [߼#i8W2iaDfeB÷g΀C@~[i9Z0G}jZITeYӚ]da7Z٩QX;ýY&oKN5-K&UY=ݥ&?zt^܆>Y4ΐt{|8k6B`A6q.B:kh]-9-f!mmX믛٪1}dy%+J=?eOYHpe&- ҋ1@Q2G/1$}&x -2)XVNS@-bq! DJO4'yQb(n`K,^*BC s+HD.oQ8`E#-$*%ȌD: |<;J*ZtZ%#R C1 KX$ga}_[L,a(t\L.Sh0 2 ՘E GDHY l0e+;6(A2i@@$%#V3bÁUekQ(ʴI8*:6>pBHR qℏY40ZYHZ(a)oJe$d`Jq;35݈W橛 & 1кj99 iR:*k ĢBØʟ-LR  s@FF){eIQiZ 3TZQm)M֑X:XX P UzﬥvnlbKr"TLlկG;R#Ư6t+F 6J@79xYVE*!y§ œ{0_`S|BJ%SQ!6ihGBjޣ@uЂ_̽Q58x|T S)_b$KlA @PMX rFH*hqd{N a-@TZ*@E%##yЌ"ܹ-F8ea𻗹Y-^!ti3JIТFcyKOW<_|Ih 7i](鮴; ]Kc U3jAe'~V,rEȏ [$`-4ch9/d/h_ݳA lf]9|! eGiۉ{&U*meb-غl talK"N]kXKzK.NTbv buknoAI]+@vR(ԈȈ7.΅ח3vFA3zT.3QE%7D˜XG58BMjiqwЋc }ɀ;4Ao"`q q8n UN%[U3(i.#TVq:sGOqiZhc3,CC<H`EA.!Ck|Ml,eZAH784]OEd&acAg)>3+u=gS;5P0P[+@QvPTn?@5*!+ucg>tUB)E(UZ#^w?́7BF1ᇡHV,Dnl!/,&=%3)ѣQZV=ac|4@)w`2!yN5P5,4zWs!ArTOZQ}g*stls~el(|RHQyAEw"6@} rF؁y6FxG7~ yxABءN)ƎQ {!JՌ@ 09 @JS= V=Q _"m %W%RxSS*~)p#b2kay%Hl>":hei e<:A6W;pV5-#%e#Hn~Z;P;^ a=SR 75%DbGp woՊ7bbH G!AgK$q`ƓKF);M XY,蛪4h\c;ᔐDOmu">3ZzWgêaʁ36BOZ K3C[6khf% 9 ǧyz!/`7(8&>6`צS`'8N2d0{M$ AYؖSguM&R$*ҘFO#DQ {U!6s3#6qIWJcrQkLoi=e-8]6r10 c LT3 @[Zbl>n7:;j'EѡjD ȲPch˔C?@c; v-{Q~e+Z:zaAF- aC]Qd&1Ka"V!2Ky:7 hb "" XU8x''5yZ6/=rb5h~jiZfKLO(XީX6e-*a(&Ƅi38`%P O(k%4d+n6h܁}qI~&chHOGh+y+n!nC2.a7uC\wLZ.鶖kfPv3 *A}6hrke7:x&fV7RUw:k62,3[#Q %z< 圊s23{)rEVJ$x sP&=!#y8с8ڼC LfQ.l3: X΁/ 鵭[Xݣ rulӌLx`!\U`>8-}ٱ>ٹݑa{4´c}+sx6^\:-Rn%l5J?U4Nt^}+3M{n*,Eٔ_nlEt@ o e0ʀ6tL EU`T q eKrPRKUI80@h$#M dqg E*ֿԄ7C1@ Z.Dk25Yk{2kQK4N򲨅8s a B dP]T.! 6H#M@-5CQt* DX_䊸 H,SY@)65!C*CU,AELc9ψjef|%VEnmr⋓e+׹NF xe--n=+=5ڠ"7_Il("&H/%)"p`cH*z?q$Xdz 7I kxICZ|4X^@&=*Fa0Y cR9w(5/ b= t=)WMYB@8B"ܰ$ʣkqĪplަҕɐ6@ˏ|Ф)%Џ1 j6CBy2@n礖zLbhET`х Lkwф\w*5 dYNK2jYbz"x6 %LN=Jwb[oϿIZqBh.SsE ,ƺl q -dgdzL)iiAYn6.[]iEڱ$7—)c:FQ]EW9 R/a:2YG1H6Zm_#gd&."763Q(~_\H b3(b=kAq AuQS  Xcqycdڣ&A6b^aerq< {ܡkSTD?A ,>F,N=-"DZeZ99qh3[PGT_T3L/(x=$-V|(ys(рY$+t1}va[ed8t+nv[5/ e(։!q s\e 51 &j`GQ؉Mt$$PN!#1ex4t-rL\YcE99-\F/V_ʼnFH@br6 UJj]!Ech_v_M8S vrbҊgiۡY\_%Xkt8Tr(`y^+RqeV<~gms%SG6oꪊiZc8P T`.u UgKqⶦj 7 P<&CZv@+?CE3z^m&/vB*_ʻ Y)jk?t4*Qu_ڊ n= 7m(Zfw^3M ՙa ] Uݝi=Be^,?UU-m] [ՊRsjcfDQd2Մ&qvnܷbk!J/ߞ׺_}Ϊ-֙?ĮeUG0ApgFAlܘe+lӋ3uA {pɝL1FB+qVh,S^ c\޴Ɋ`V&sb|Đ=1^$ӯ,ԕ#2fh-`EY!")_WV-/DĊ NDLBXVMLҽe-Sn{L+՘(`V!T--l5b8Lr1̥:WC,Cf3Gc`pTN@>TLldG-hb yBeNp![K:rAp B kāb#".,"IdVwTR:t8Ш0Q{ȁ-g 50]ӵͰP\+ȷEEdö_ 1R̪ƘhK?`46䢳VP1k& é08#X@;zX8Qٱc <1or c پ#SsmhI[823Md 9wW ,`IjY*xj̜,;M#)+%2%Jn iɢξ~y?JW-gHa-=b3rԼ(~23J1{[p1Ԯ#3c,n `jLQӣAɲd5kȩewrVKș sD; "^gHER>-_^L @{6+,NCQ]Z0,tFtk/BSnjL0/ll`J=lدjQ!3ɗkRbezjș|QhUlHMt3W.,c,mmtRU.g {o!҈pqɮUP m0I#̊)hbv ul`S&xobiXę6>U˷h"(N3N[#&wVˇ`,zj@e3&S,Qt#.KY]e\ 弯A2^*s晌 ,5|(>,E}Ua̘T2'ohw$si'%$"R6Vaa8a}HN|A T#_5pUA vRXKG[R/yzeAZoSrcQy'O.* 0;GcH_x (6(,_|6<3)>(qiEW .H'T@ie[z#vt>GDB;Lve_@x{sgYy"/KPWl8`41A9iҘ=Α4fK6wLML1<06aAK]$Meq=P '&[@~hl!F]9`(7_~8n(tv6'?Cd:۱R\]iac k 0aGFm'qU$AM2ٲ[k])3[;cj/$C9s L7 v =n= kH(;M|i ]s 舕;ClTe! (Ұ@96ۦS n{$lK܆48OlŅbeQ%rr K|rWtnltk' 'Wz+pO qثIbų;F[G:ŧn9aqA:%+NS|Sǰ{!\9<l:QƐ#͗,mۘˣ۴vDZ:Z}6"c d^7μ'4 1rmqkKdCaVjվW޲yL8һs8}8r1 M -޽mG-!NlWjQ[i/o(̹ɵ&L,)1˭=EV,K>B F ͼCҬۑRiڼ]k^TέSnM.bvn'U@,|-7J枫>!.ӝ~*us;">=3NnӧnЋ uDn~NjI("IT >q~=11((l=X]P>.^9.ע[#+q qu.ៜ>3n=ӝC?hcb?mh ..Po}.|tB0?jIA?? _^_Zx'嶏赏c_Jm<\VO4oeֆ0KZIoQؠLfasȥ]" .lo~_r@ 0!A >QD-^ĘQƋg G$G(r=&AT2LBeOH NETR6ԡFOJQjS] ! ,0`H*\ȰÇ}wP"[|[$vHɓ(S\#E# Ƅɲ͛8stq`O6DDZɴӧPYJժ 7pDž)%JM]]˶ӥ&$JӖLjڴiۿW@ըZF" %7ƬLZ0c%FiIS&1RX=lILi휒 ֔Y"k}yZ^f]צ=|a=Ҳ5ill3t,M5gF-+c;RmK^ŧAwy#cSYbÕD]Zgd:)ͨ({D^:gPVy9NYz9%B~RnfUZQ (lKjGv z@:cV9? W@Mllݱz6P*ɘY^XzcW )ԦҗaG}QչT|!'!ܢKH8f 3EP?Q{AdY@(w=ixV,%R(42 $ƄYFiQy[ c0a:%E7N[#˚i%N+ɯ} .z߹MWgwf[n>1\No􍝰f4}zɱyzTϼƖUᖝbvjzibɭ[L#kg&hcʣ/a=2n4MPgG=kfsrU|)W(YP?A@J|Zv`{̻ šN`nv^xт4;~H? BWzr)8a(f݃p; ,' 2NNPT`ו3 89)vxv\piu+J?η!I A#0C2e1j2#4>՛oEi)ڑX416`GBi&_BsM(O^%٤2aC1@OGi`WQIt4bb,X!M+eg3 Rs H$E+<3Ņ bl^IRR%4Ϙٳƴ7I<9(1u/ԒP$%pyZAlUc FN.K"T4!2IGR%L#H3fܤfN Z.I O,IE,tƈi;^& Y< <'DґlZqWؓGv /`Qb(F\Ɉ{<E ƒm:0XRŠ7sepfAbsP"ZֵYRxh]hg@ 7ES4sLX.C ILH@]MqK@ Hj(4?uB$8E>y4Zr=4@ d@ 56)Fh^b.KA.!Y"W"Rl0SYaJ@7.QZof*>(UwU`$-2d"#JoqvTD8 h*os0$ 'T-!S,y7'c,GyeNWᄖe-LV Vh疒s{fkrlv-vnYVn֕vERy_WfX$|<C!]nYeYN7%`P)4bJJIDsAgM܈c7-ȦsvaXP "UnDP:i,;ZO[$Pc [( $g8#11O:áv~%Z=EpWZi2Z@KpfFGnqlXIYZps^Hk-ڞ!&0>i)'1I ej7A 1[S2auXacVPaLF|v|U:昅3j 5>%T :n/pdxB"7 > Wr3Zt5@ HNCLT))zʪ 6Jje,F7p!1ڑ2yEQιsDv dns~inٟɨd)]KIRW8gHSڸ* bǢ@&pV2fD4+vQ ~y@4 6l1%sLs~z~Vr!ۓ1yGD͹S:6F(&yΥ(J:ţ* F_^ySIf5%3; yW" 32Mq9-i̐ oǹzn~ ч  *2ɋĻ u &7WR|$q1\\QI1p/c')u)eL0;f]kv(7f3)B;4Cvuw6E BKF-.m"2YHy0D1U"DATqSǪ/ږX"M+sztΈ{þe0BlvWx=PoZ]N42dX.9~Q Bd-3\z*I89CXZF7+)*$;rY}Jw){f{&i< +-&afg]8vhְۇ؆eTR\xX!8kqYziE!|fR  !%<[ݾ_~dǨZM[Mr` !kuDk5|~.vDS{W٩%ma-Iܻ$B r=RIA+eͨ'$x-iL[6KkB*2b_G5 AdlD^U~":E&:nPۢ}밮VŒ__[N:L/8.gW 욮gg,%1 6fNMnc.%1NF'2m`~G;&.r/AxfKxK~§`N1>h#7l([/dۢjL׿Lt1#'BoĨ0L" 2H5K33B4%73 ԋ`99h! n=֋vF[ qMMT%! TJdh̟Zd4CZ6m$3 锳W^,J$O vz 8n t7^W A҆jv4-ۆ22աrwèQ 4jQs+TUUjK%4I {5 s2:CVת:6RO{GnMQ*q.Efy.<ߍTzL2Dc]yu[F]Ma7/pw˘R7(;|V%7M2fh̚/{Řz\LߢOZpԤq5 <)~eNiuQHiGKÔ`p=d3H3OeS=HW)Z]aĿv|Zkg|mճzo}^žWo IN[[CE/(qw=D"ɒǨv`?nu'a+f%li 3J d ^hU/d-k۶`6B IT= ~igAJx6`p(Ci&t &n>Y@!6Pq^kx<2q؛h&6qS,̕=kS w+&`"txi)k*OS[^GBzHCoIQ,X4鐐$D7[AZ $6I5v1$JZ0]dLW-uD7Qe0[' Ә3vxLfa3&;&S}\f6մbjӛFd2Vo4bD"hӝycc8QӞiKHyO~&/OfAM𚡤B%ʐJ*b@! ,P H*\ȰÇĉLtxq`Ǝo8@S\ɲ˗0c6u%M5sɳϟ@ PC=xoiȥC 6u`GAjʵ^Ҽٳh ^@ J ދŌi˓lہN8X,|+^̐.ɧ>u\ՂJ Ϡ!>8GA^6܂o++,ź&Hج /&Ǐ#T>sۊGՐU=eui6U1޴J&M4/4KkNϿČTM&dM&hBmtԑh$A"X1߆ճ&dɁhRb; T=`~P-eNhpS8&ڌ8 ; D-u㈬,MMHRY(b%2y_a"baj|vo9ovi => ;5=`M$J?ftV^I.ل)xD3&Јh%YlY"\F"JPK}~) +ei^XgUv"hQ>JU3ʈB A̶4V %y` b-%f"JH& zb!-)uf*,D=n i6@hlӢa 7@j]*T&+⛚LJ TS.k(|uU/l 6pR#-;wS~y8jc?Q_z9jErZP="zmD5ޅIQU;CFB4X[jlg9eґnBR;ך(wl)WO=%&貚֦6XMPFxJ9;ZvB Pa({hIüWMJ- ɒhy&7X);I Z]F1WjX&R\cm?:%fۄ ?l]On^T; :D$ ni[ %5-ܧgI R wC"a#EiZU{`7[o}gu4d%6 A_oaD`2H ".c[-hL "6IR&B?a"L@;zZRbv0R/S$ $!YI"&Q&yO+X>%!F*aTbE(HḀCbE Q0fX"BIFVA+i ."%ʗ%kdA mτ|NTzm!p`ŎqbU ' 6ȇ|S |MD͠/D_*Jo$7)!4480 '\N[!&cjQs^Vb\_;ڢn&̧"B:zӅ\Kj XŘЅ(JQ<ֲ&cn &&}R^j% IPlYޕ~E7'HUi '3x3"=:q¹aQ"Pj- =(Qdb,{q]xbUU}v0QRT6HkG+ڱ5@RlvU"0EGؚݳ G<)Æ~( ."ɹFlڈ65"4&PhM*x߉$=tkJ!kcvE J:Rt5Vɱ]:QOQQ,XDBW4 "\~ԄpAّ`W0bO5|4|O'dG̰~GBJPEY%!ItMiR $!N )+'@?DZh[sg h&A|VHG_j_L)ˢmKٔ/6ISVdwSUQhO _bcǼ&#`P azh%Ws )Tg6V(u!#VT$ri&`co|<$*w3vJٖsAU6D**2sury&;CPWgbzIIv2)x&j9#cJ]c(StA^suáwnb#@@OH[GH`B ,u#w`?ugu?i~&Td4v2%pP(Mw'v(3Y3k`χ*U]{f`5e0(3sc(-,P X"eu&遷 Y2`7^bKʧ +6naB<9eE@e``CWy%`;"rђI$gh%gKxz&U(tz2$XVhyghK& V $ vP/cՏ#j;Y+E9ɔB^d5S=A1P'cfZ.7jOx쥒CBj3 a7hoM79|&Vy\"O#D E @uCie~,S+gORBrC}ə)'JM٣&$ Uʴ0b-cNJ^\9PTAU J~&i6[ E2pRk~B)`X|G|)}g*[IA O@J*9ũMAXU($"h?XdVF"5'@"Gu8SYŌّj9*d #dbm2/r(SB_\EZr72k::DɟyL9i>JS5kn+ei#P"C!o!h1mMy|1}bU{yEAR`*; i;ÙcFik,4V8+"(5*8+[.ҩ"r05S f+x0 9 I9~"*('ϣ]?v!E&;% gJSP9zqw* -Zh B@OfM,,J&{|m``K [lӪcfIj t"!ʛ+6 "dUB; \'CC/JD2vë=ѡ}'m;"zEIxi"ѐx,FMɣ1,{v%$Qf`TMV";\P11"]y%b qӠ*I&)* d<~-vo2cZyp{.|.X /-aT35s1i*$)κ5 \f \\lA:k(T3 f(C]#g\((b(ϛ1)LP:ITǦ]͂|'`r"")LaF%Fz)ؼG|IDŁ8!3Zl(EipVR(1a44GĽ)ץ=b9{ęl'QCoW{~;94%B ,efrـ Z"pcࣈ"b I,3쵂K[ِ[ 5/{9=ZVs)dxCMC$I"+Z!1?*yw x=":.Lc9)!4uÁu0gk<16m EYksWFsZlRZp"{l턚}x T!JbP 5yjn}Ś LrI 79s򪐜ձj'@<">zNu]DQIBlܺu%TƜ˲,ݝF=6A%&׆Z99]LH `|s%Aɒm" Dg.%"k9B,1H /%Xm)dA}nKaD_vfjt-n]0u=ÛM(˘ C [mC[G-C۪5ݑamQzBz+x30)\3+ԛ{'ötsB;lԖBXqrِ^p# ¬T-#sPa^}|oXD-{~{mT ܄fz8A?{Lk@ZbqzT=tܒ~<4+SD4".i"|hP1fKSZ0Et#1\ rzff^{Y$UsK a32 P3==N H 39*ז MM:}Qt?w`?(e"M nM9T:jHŽd iذ~D2xq1":''2lF3xUv5Ã5ߚE3"Hqz4ag=5Zk*12<.Lw|fq>N!9blN`sHS07ƿ26윹Rk ~ja*[`G-+]2Xd"؁uq-/jʖ)b&IE4e/{h뤭Iڲ2=/RQ'M$U {1.Փd+G?VAI&٤#ۆ !dnG,K뢜O\sj>Uգ\Rǥ97UϫscD<ȣhk}g=CɫLFI_FF*a<\uO*l]O:*i+$(%YPӠ~1(xhLa|LTJԗ fTFzh&vhsO.X-dG7l:K,)m΃$=݋ t8 @*kC'g>oPQZIkŵ^{LmT9gHR)&-O+D6,}=(ձcJXls5i2WMpGQFK,,r/ݢhzF̟~nCIIQ .eL$L(t6mց< 2+ ?'-d=%R֐dc&Q=CI2RH:$?!?H~%Z7rlb@rH$B$&`vDr eK42I|~rRQ [lMWi+6<1LKT4h{Ȁ"!qܰk BVYPD'Q dyx&i%|eb#GF=ơoNZPBG2XjUTHc t8&9ڙ^ID1R:"'q ' +tg#H&aa]Bl!7a҉8QjmhzY2nW(Q P,{㦆*:2+V 'Xk ALeCzr=X V; &B Ԅ63P4PL "e0;:[Mpf, eh(/ q%E1$eBKE5!Km\YTُ+|`+O25LB&(e%wFx;WyR6nvϳF%#hK,c2,?ypڿ,} QCoT>hҊxQpIXP5,lt2R$GcPxh۬-׈,#b9Ʉ!iUI>;zH DYF2DlKmGomFi<# K.Oyٍ O)5iVkt,'΍ ]qI"Z3pw |>7 T4+i3 r|V Vz$d[s)3Tq*-f߫WЂ{iŘ7ڢw2 F+xiIrEb{IAC*-YL\Zז,)}T:cO{ru"8b&ɭɂhFAp xI a1;v/Cf!lZhTc!{ιпF nj3hzm#N&!*ܴGU$pJ(ؙb"QE;C&<rDQ@ 4Iާqy*D E+39.IGS4ÿ|~DBzKN vHa=<k;(lCC=W:A{g)5>,Db ;_ $aB/ DK7,Yk#yΫcCR? DB {* 8 W) 8d8) b"y=K #=I { ;F&ۛ`R%r34h*IhtRѱ&yRDG>$@^-[(XF>1U$qUGrVhڡ @Z1LL4 RBG}ԉXtr ɒ= rЈ+,8! E$ԿP*@L CRh|#pFHI'I 됺RtɗSII0*53 ܩ5i,m2&3:j0?ADFJ'Dt( @'Q-tH"z;hC$w-X̧1;t 4$¿Cȍ18ڬX019C6:DЫf ?\_ M<?!- N  ࢡH(KKT>˵!v,b %՛rAR#p ϱC~ (T2)3GU$0$CLK=& aux!m =5;`N,ZC= @bNLONA,O9Oг/ \DZ@*뷶4s5M $-z4LGAҖ,S"10(lk,M0Xz=[r B8tM@bʜʟMIB˖Km{zQP{I#ϰbݧA&MI|ǕUҠìR00R H1#O5#[6YI0^&J-Z_ ڭ0Z=EtT(^v`(P& ,d J;}FI,'K3LKfa8a Ц^MH^nפְ8a !; 5"bLVV7pQ)bS*+z( )X\6b vPOS -|7ҏZ-!4!9(@bddy=1HcK5RPL ;X J, c,lƂT$=E½"G& h$jIh湞67`q\l01ɬHcEWFdZ6fVi+흈vapfYR}ÌqĬX\yՌiiL"+g]a5I&I.֒)~/]}7~^W(~]cLGK%4G4r);3 c.2#Y5dHz6JCjիZl{$jD Vp"j(h3d إ%^!a{j{ZxaӰZΥ>XUZe/ɰЊ דuSX*-Uz jtaְ)O}%V$ 7ԱZ5QG=]~@$3eP49vl _:um;-֭ȓLp\m\KfLcgTff=.P{X=:Ө^Lc0oݣ/J! ho4"֛5iƖu4دu& ɂNy쑃zVYgo x[}DeyX(dM& F 4 ӎ`3&fXr5FPcC Ԇ(|I6V]{ W=mE-JF zL$(BX@΄IwٌY`wQ-lY]]l?lB@d&ksrEv`#գg&s秠n6DԒR8΋0bg6 Aa% fe=& iL` &ҩ ;p+& :j/hBݙ0jN~z݂ FDe͵eCe&:zj.jX/Z e{j2O\֞Hf2UT=\O=M6Ζ r&yeаJeֽf"EjC_v=άSFQr"ڞ7/Aئɀ?Mdڔęm+BTj=!6@ٶ`2 Rڳڌ/[N IJѣR{m9q!iM#į=k5.BjP $ 8BZe8وGbH QTOtr&_!+oX>Jv| G?;QH+&T,g;HQ2Ϡ exғ)I[ tv`/!J`n /5/%_W~Z$&(,*IdU{M&!*OTu6aAFE\m "1Dh={#/hjb}'Kl0-FPH[(Fƕ@F; CYX8RhF`yctQk0C@6JrІ=VZ"(,R;G;^0VfdL-RH;UEOx62=Aڡ Br21ɸɆRцDNW YuH× )b[hs=aq1d8֙6zBJ4\N^rS DI{F6p& hP2&A (" "YNGE#ީ%JZ[N]SC#*EA36Twбj$(!$c{h3%e+ַN) u.m01G4 MJŭ-^Ӗ. `Euz+l͡~ԓ7|+RR$rWYC7A"vf N!`dUS_3vpOGjr#"W$wbx9'UB~8sXUH3"H^Iaǽ۴~_glRvMA%jE;((\vgJ%p R O!Td{+uúPY X}56;6*$feFQ)ZI9ml  Ao)%w60QC^KlmFX4~3]Leb?qhJbo&_pS.@*^zfLÁe 8bL, A|CWtN"YxvֲQp/[i ӆ6gs3TDg7Am@;ZNVsX)A^jnb-'y] A7~7bQh#Lw.De7jR]KhӺiYZ(:eJ87O),f$ \"dhuR}&BJ0!+E=Nh`h=c%q]*c2kD f#_[r8$ǚ(XLޜo})43ܿdG/_YI쏗!Ѿ0SK=/9R8ͦF.)9!nfxP ԏ4{0IVs`31Ϲ!a =hbt¸׻I~jӗunTF`!deb7kxE:jgR%5z?@NveE!zv}QH6#A=/E12+WS ~ B%۲kjǀmuyPVa(sQ `*6;#J+yvUfade"#5rx~G,76PC>h [UiGTvVTGWi !U_r=V.Zs-9JU!`|kjxG.61*ZadGF"FXK5+!rln7HfˇfvV\C {kԴ A |g\dg(NG9 򏑥`xsyr7Rж'.S((JtK'Uą'+@9,)*f[HPrEn\g$d3o@i? CP NwY5(Qr4Vyp,/"Кfj[T<+QpHHU8* 'Dj2ik{7!88sOӸKaZ;BKUh.reZbTRz`d*k24(pD1 9-fcQYID)ÖbMÕ- t32`5YVΔr6Yj b6=UVRۥNJTeU"ڇx?bz:Єtr Pa~qv+:?(wj] !8ŦC7d. Au!LR@B p@08iۘET6!DDjw%gq1~T=rUwY1!*ՐMB;F i@RWX']hI/ki)Qd ׋*p(ʆ;vGr-&wBJP?:TRNx QPvݳ~Z^ct!cxG#ja/;5hJP5:1 ݄uyr2GR8y..X9 .@J:vu āJݺ~9Vjq]\vr@1sXxs ˒ jb:V; (=Եop{2,ŢUdy覅ͣ-ԧx؋i꺔z[ м+#Y[ /qk1Peg'qS!8ۼSq KvҾ?V1{8&xݸ_l  貑n qcwՕB%c#䘩XQEIWJsJ#rԺB\8~2qB \- v qkڰ]1hzĿxo*17ə  .ek*U5e0A9qpl1Q:ǗH\8=G=+]3PQYPE,r׵tSJ7*LJAZ?m[ Ɓbw-[qڵz9=%uU1.㘃8}qAgFk:1 \+ $$v47[xi1ɌB-P*'Hfc3.MjY{AURbWz5T"Udjů kV,%E=˅WlF,MlBL 5:t4,\/3QQPGPY7@7 UR! BL|8S@ %fwR@)`٠9gC1cۀM?;J}Fxq OZ \5PKKdg1bHS)EfVlu|jKA@ XRDQ7u$((}&*`q[L#zX|snQb0azafW~K˜|:ьm1id(M=">"XH\. ! H 3HhP; ?qm 'Sɕ;qK4tcoA5U8EN'3gXkf-Q`"H3i"DmgwRZkA3=⒬,OsR$7/h(6i΍bu's긣(~FQS5 r$1H "E)9-_\=x 3 rf;qbӴ\G@"n!R|/h*Nhgo(% xLj#ZGAIqзxʇ (z>/GT}QzIM# 0 X /{uB[a=Me1#;_W1LHfӴΗ[رF53δQfĎo!ADJOMwSTU^Ś5kGDiVQ4QcZVa3TOtK7cZi5Œ5 ^H%Kf3mdj ,D_E|W4_/knΜZjS05ir$J}^qNAEJd'if ӎtZ}4:@KhT{;Z~^2q4L72&L,h!.Fz- G4V.h¸9kAjnDFjG1{Z顳G<ï)n'$"MsˣQF!2!(v$"a3z|> (B>|ZXl$P,TGd0OkZk!QĒBFoLnCT46VM'% 'KَB4%բ;g(ՇJD%FEK2ϓZrYHtx$aBSt}/_@Kl`ɢS51&9Xө׎$5'1uGQ&V9iӑ􀈳vw,QꕣYJg:eI3Icb V* J֡Bi^Ux8As+*$JV*Q*R[FF \ň|&,=47Lm00+e)5p~CwZhW*B_щzɫ]iI7/q%ΑYi|%l2$3e8Je3Qˬ$fڍ7u4c| gT~:$JNUv LJf7Q O kÊ2ޠ)enAڔ'-v9*rgf'!eZkf3gQG_[1Q45WS~%ωT~Erjae/di(z,ʎjQJ%k x69TyovҮd%"㵢PmIYӳ+ /f;g =.1XӀ|롅 1̞li33 D-‘1*6Јcc!1;{?Z%ȉZZ;'41U, u-KB6PûH"B mPQA[R ᣰxp) BhqJM(.2lVRBOّ&; ˌK%q(m5B<3(z`( w;<@)pA)+)9L[ ̀!=Y ;x Z: Cc,B 1)(C?*a3N6q"g>¸8Q$BN)2$4Txʸv,n /Xih eD#?⮥zjAm@H$2)MxF[(x<(@F` fѪMLx qj{Qi 9A_{ -#0&_T̔h F7$FZd˫?Ʉ|{ˡ̆Mp %y+!v0Y L< ІHԓ$v ų=ӜI1<9~; C |yԢ'g D 1ʀ5{O+Xe#Hq㢛E z*Q9Nð#D{黥-ϥœHH+9؊@wQŸ2˂2>NYif!&#:0 _J3+=Y2A QQ ´ ۾քI ،I>̔<[Ш#HaB" R$Ӭɹ`Qu KHA ;ɦP=yÒ/dI$e)ru\ 2s2%v((KJDG839 IHգ[t|:ӱC!XbAj)*1ȑ!K!C 27Lzp3A YdM@ LQ.,̑A@'ʆ Af¬$S! !ft4 ]Rh@uфbY؂v]꫇XTA7/Y{3{§:/!*2  3"qX7fQ?fbTavI(1 C 2,TYvl~m\VЫX"o1AϾpM-yeyX5\W2t TLaB~X>c^{#H8&V8LNu,&?ɼH#JǺ q/+-1j! Z[#ۺdirh i:R03zd`hԼOݐk΋jf m Mdɘ3 TTS_(fQ|㒅=m+^nH! cy,B_Q OgBzj [<3#TDF,N:\]$ɤ #5 R {NQ0i^Ge6FuA 5 r5$]‘YF?8 ܝZt9Sf c۬ʈF2ߢY!| *(K[4zզ'hؓ(NGXSkA#3byjk~I"6Fde?i[0 `}$3jh [ }FPKRs{i)2WFAmQ7mbB$Pd r壸QiE]hZqfƊک^QKOSR&Q̠3B%LiN`5+# q88,h{1N@ i %Cfx夙6XKr%LH_3olA -KPR'4V\HK>( TֹHs$A,g4_ 42EX# 0l8]T:L H/xhF[<w]٫Wφaj&dM& XAbxfh}I=9!YfP,(s.F3Jc1`40x:F*ɑI@tv6yܢ%Vމ)|1X_q$Qj)7t|-VFJ>&+)aP~gʦU6a%MԅqFӡje YUc\6)I=n)*kinUY]J&yiR Se*>H'E* @Z3;e,^w@!k-&a}k.]O\nId=eg <0bXx+GWkEu0KJd!|OUYEy/މ2y1LJ;W=NY7]̅-MWTcewH^'ի]WkQ=B&dtdGE{v}Oge3( `bzn6{;sI$Bhm>N&#re@JTAXI93@ )Z$`\5uW#|~( 6z`q(y #ٳh苤= 9$݁M PʂkEÈ }а3˘=q={6oIt껬 L혎~|Pqe Mx֗r{mʒ3C>;yOnY727/{Hx6[&׀YZuuY~.u)WW{gXgzwG-!~c=n,N@[Mـ2&[}!{%#mDdφ(~#dALVT::d%'Vvǝ8f Vfh&d ~P(D"FgUoJm7YҢ! d^8#`|ܧ:8d\dzt"%O IJ@șIbI$pqȘBu%9YF+Qk%:))?΍tf(N6ԃz?>Î(ZN=Gl,S!ʴ@2ǘ-Z9g4:UQOϩ(ƺ-A眑x|orL50A> `tEIdYŘj@3Ӗc"մ*k&j!vM4XMŎY󝭈ܐvRi&:2|f,ֵ^+=]( 6=Hn 8[ߠB%$Iؙ-lAi)dg*AKIn0o'tA4?hS۳:g̸tDm~IŃYnK6|,sݽ.ƪ?\=2AtHԤ qf<Ѹ%. ⤉194e`+Vt%۩PƲA1=kG-!%1,W􃆦X@-Ӡ!f}6̥SF$ viio,ғ[c/25Y$vԫr&j2!s2& gUAHOHQL?{%;R [ǣSrQZؠ&8Y@j&┽-- D 5ʂOrKJ1LWˆYC"(<ȋ#f'f~6]CC,x$:v~ȍjFM|=T98G 2ׄ'02LH"l՜ᵖѧ)`]')汴1H$Ih}0+/ ɶ$)pI;[=/Mʁԑ?A%[R2-(B9*[yxKWÕ3 Q/u'LLk85{8횼X#BKD_D  +B-kNHzE-ȥT)V\U:BcXrU*AVqkF Bc g>#.eIfCXv~Jcq̫<ۓB&iMG+FAvLF7kR((rģgm[ \ʵh!H ZbtdkAG> |luܙ0z/šw%f7|5*d4@4X{Pk:cܺIRC$?j8/π5KdL qRIwr)ocǿlQp|n$M,oɌL*hݓͺ2{dM烯NH}-Bj ]]yɫeV;XAVd̢(R&E_aRrZxgG߳[Gcm!TN6]@4c$A @b6xaqnVVRm{${˼(/}eRЭ:ɞD64Nwg$ M 3q %Qo[j1L E}q@\\l12NmMO7\M|ԣC!FnS$;hG+%Gl%=r'z6؊L!}6J&R[OlL<9- u(_>[Kѳ.flVރ^GtVw~/)!F$ iaqJ5+aҤ Em an6;ǂx(sy $^U-+j8 h[(s]zsm% HS8<~UhLl CT1MB\# 7XUW@^1j/;FqTV-rv efR`lI4 l1i0sOwdfkjV R 18F!%W$,s\XJ4'>B,4;0+Oix3D.rq?,$Y0Q uFKy 5.dK`Y{!)K4kTtGD4a3" 0B "~x! k( d 3SH%XF_C$uA!#lH$ ;I0{ 78^VA =--XDS*w &(a{f>Y8`#Xއ@K9$+&1^7A{\u6uChgIǒ5 ~(L  ?& X3g# "XÈ'7+)1PXRe $|URV`s!a6vf/@bARV1R}rԣV60ha$nR Ӑw6Ǘt`?L=&YD]0UD?kC6s)H@H8,hCj)X.Y`(=svً5YwUH׳יp*BT[Gh9nk%&+`. j hf̕HuaTq'$i'92C1`^!Bnw)S-M1H=78Q3=8Ae{B/əj@(rvgG9eH+b :\E@c1Ie'p&)ZA]UN;~ G?W i33!7lg&CQڲ0kց9=)5 -IrH{%iJ(6.X g<)-B4?3%Fl?# ^ªp+@{:\zQm]fA3>O,*RX*f.~A[@ ȣDZԥY8r.uj .:k4J9C.0fd0qxsL%ϔi0Az)9H00 υoPF&Ed)7@U3WR;+CmJ* /Y6#)|3h9}<]4)\F 38G=6JoCDd6~ tq ـObCZ–$tmBYzCIҲvSAYyPAfbF sd4 ɂ"pKj;Ii1OcID{+? ~lHf/FhG3cb:"\xZx}ܔ];R֔S*INjN3V'=."F.2{1(!&R@$E jJы86L;ljk[8MJLdIFbbxF[ ')ɊzVJr~qb)V@\6)5[ k'S) #/0pzVS@x,--.nz7MmV.qq" ȬG"Ha4%uB@@8Cg$uU3\ @?3Rd?dr¼y*z|"\\9MI 3JD5_ ofU5юABGXj!ğa:,.Q+aXz½!44bW'٣R2zi6x+E;0?@ Jt6Md:{*v % Ì=1Tq!>M[.{oB˃rȎoLՅ'gT->^Bad @_4e;)[h2&?{hka& ̤_Ŋ,DRJ-Q4K%\cq5_TPEho={p˞T[~M7җէ(hRvDX[]-޺Mh.V)TmE;S|=|Tag?x;j⵫ᭊ==$)h4I%1HiuQT^^-;mQϙ@3E_*q ik͟oR͵G/9JVN"ԁqTRq ޺J魮4DD-2ln%C4 H;JɷVHa,: Fۊ"!%$lPMʴJdDJ#aɠZHbziYʺ];$o3礳qj$F H` *ljgJTJ34FR!7aCZTQؒT̋"O L*J֮%$ u2!IYz6ynP6d'DJ%]guҟ,:agp;T3ؔV_m:wEgmtImKmZS­ܓmW/H|8RRzB>Ȫ] ]^E"W!gH4!.i5I2ZM\$I.PXN(M嗟ۣڄȚ E ab-J&s%֬öL\+?PsEJF?,̱Cc<1'o²׶T|mt*GM cQʍi|dHvMIWqYL슄7{w϶A^Ɠ ذ(&4g<x^HcGaEWfvjX5A\uo_S3R7ڳtER5y:OBi!XZ#d6LG+ъHlJF!LYk8 N) Url* Xq8D/\P> ࡐ8a2&^;p{lCC"(ucDėe"0$xц}|ue_SZ`JVdd(G*ͼ!鐼Fqxl&DAhϹ҅. tyA2vY@40HGGeA.dZ1Q'rZXr8v7Wb(7RUh)J&tB"cDL9'd ze.]8,Kŵ̥@,>W^ qs-8[YCU:v)ً?'PRԯԕgQhH? :mw& zNe8r&+P,h@ kLLK'$[]|xY[~C*y GD)%L \R#{oq\sl*%5(μʀU0Pok!vK>˄о#txb QChe5ikm,3X̙.Lq|5ͨ+\\x҉Ī"WX6wmmxR,yoҫw޶2jEqWǿ`T?Eҹd=q1# Mሏp/P4-  IC4)`0lP?HAH kY áu "U: X\+Z" =c: %"v" 3{ I úr=|z{xૌz 27;A+gj7Ɇ9hhj7jǡ^0 Q%XbCٗ);p""Aؖ@.J2{\* *!Q [) Y-ts! # Iq@H3#/ܨ*hq߸x˄rPpx$wDzNJqw<7<*)lqFl4 5yq$< xф<~G MH0h~9>M{G+H{H% h oA l,IYi꣉qBF3g31L($M`2H%znka:z`E*Ihbʘˏ$Tﹷ|p:5B4ߊ-x A?В11 { (D Z(MT \~EX~!i}a>̒AN¿M[!20j91ǂ yCd!@ua~R2H*lOc Y!K!/$ 1= Aޓ3j%{;QP-q %j'?I;] >zW$k 2΁U -9N 㸈Y_ zkQhرUP% J:gia m .Uܭͤ kP ÏiH8Eq~3mٵ{&NYAˤa0z(z+vx'Q06 #0SO2cӮrLPg/l,̭lUȕ._ . x-z䷸3`[L1 cEicZA#a^"`-D@cY{ eл_|\ i S#l@cNTIYU)ybV{<6M˹zرe:wK!Jc fQ$4r (Ȉ #(QR(ofϒ@ ݧR&& q Qg1hJ뢉1 ֖<  6JUҼɿwf^ Cz!>JqRIMc aL0Z`)9wWZJ}NcJMczBQm7qلM(<gK5)xjV;o4Lo QV/I@K "ZXm nyidY*NІ`Ek0~z|/)'Lp 34r 8@gb >l2C[ V >v`Rx"hV1A aPa/Np n -_I 9 \yvj!-V nsa=רLtXip'JrM .wnr(9oz@7"sĚuEk%MЛĸY](]|uЊIgC v=/ I3u^Ou=)/gUiHUJ;lt#5*`8V8nHw{C\P{PA[ %a]jx0xE&wYck8:7_^< 1p`{]KH`љ @mGjU]Q]'/6&B[X(74hެ?X̠3[n Q x9pJEϊh&ιzUѷ{gX/L\3oWiq罏j: :DurZ 帋gVC}'8S2^"9c y|{ `AgzΝ?p_'ziC|/nC} ܕE*g'/f_,h „ 2l!Ĉ'Rh"F nЎ8v ֽ{o,%˒2h&Μ:wYI4iDT&{?@j*֬Z''=zf")[=Q;nT9*OQ!ּz8VL-Mp훰Ȓ'kuq Ǯ@}tBmQnz.;@&y7 nz҂G?PSzSF]v sX'X:|&?`Ius麪WM@bXX6yV\p v?FviX%FVřI8ICX T}P{"F=5lZ.!V,m4^-$*XÎ8h#R[Fuy=DgOB<$s("Tħ' UU QFEB+٤=%ǚxO39lgɚ]4 *?=b=F#YcU=~)JKK)դFdric ִ嚛F3JwaY{oBOQM+ /7alMvNag0zmAl2.[1WO;aSw켓hRNKa(f1R.B=!mW*hԝ\f-ȚdMn旳EylZns;צ5-]=>&MGP it9-ݣS+Ze36h;o3ǧ.F @[hRGܗk^l"P&@<4ob뻮`^=|Sg:el4Ԟz&e hqˎ8>N=(=(' v, a$Z+|O+R"tvl"4 Qr-h:aP؝vЃ&9OYf oWuQZ! AyFFmk (\G;>AO -(QAٽRBνa7!G` [Wp 0,7dBcOB7)ŭYk/I܂?& ĒH&!ES-ԣ,BR ȷZ)2(8zYb# 6 }qd$ DH<a6Ҙ0Xь{cZ(aB"AhJNmpw*5LhV+L_j0s_ow5)A%bS7!=o3a~M[R,WYFũE>L&FҨkSc/HEL0MȪJv+1۴iR"@6Ҋh u(-mq'dp1ʰͮȩF0GBKH ݙ[ Gu!luZ̒[lf?X DՂ&6ѽp3бl t9Vh 㙦wUΌa:5w駏pv +ĩmB`3+95-n7lG$1njT4IVjbѪOeel[Xp|1dq'qN#+eHQ+ FȳW2@ZR 0dQ԰펧2+ItĞlTRRs^9}Dc ةfEQsRK#" 786FIԖEKْ;qQQ,iSXyTmhtRbu7oQ/Ѷ.b5v7Q?2јL='@!H/rU&H gh T55}R911c*Qxy?l"`Yr!&&16&ֲDU]$Hحl޷p '6uvlIǠmݜ*nH^s;1bh[F!r5[PP_RZ inw4C$ UJ!%ʗMҒʞm$JE0IN/W[7ng/\Қ re?4c_lo4A[XofF$>Ze6Hd"5V[oɋ5ӰY*g iw,mߤq~2cNQS^ҺQ+apb$ Ld&tyjlVW7f`C 1HU`V}JjGT! )2^edj )xvV~A;5T"KfW#!96 u`6dBIBmȖ"W$Ezts2]?V1Va0: [C@ %}EB(0W9jdexD5/42qV r~;FFч98Vv.Q , l8Vp2k*lR7Յ`ab'o"]cH~rSRc&-S4Zd14N|3 ކU4w.7^f<2$<P c;)C g\ AR[BgrWp؏=5aFHXV7CBSDƖ~ennhlw'R͇~V0H^.JWElx8bUDRԊ(P}YM y 'C~Wb6!-)#wOy42%o%S41ea J8MH35Ba-J&M&_4GG4NfT*7zrG>P T ZSUG1q45sfAIJ:E/vAsO:LT Pw XOM0 ]=\&$ 7`x X;N)D޲>(Yj5iOf@pOB7n* w0 Sw U#>})q4;JuU _ee6I GqAYdZA!9pY =\x2)xiArATHU9-OeJ=F𜨩r}N"C v}Sr(r e-ŗkwj71e'GcNX$84T.&HXe[$-Il%W(u?@!` c/;RQw/x(n(Q hFutZ"VZLWx9UQ[dڐ\-8TQ*ő|?>YkrJ4 ?e1Q Ơ2Ԉ\G>X* pu9MBxC퐅הR'$9!- 1:y:SZvWE64,i j3v4U?a:, rC$S |-i%mM 5፩W3g&W": BtUWDWs@ v7]E|W;Jq{/i6NAJi-ϩ)))qs6-J*Utj|ZdZѣPBC 1uV]TIpC:/H*KW暝W3OpQ1w11P!#[xNJaD;x4gw?5A~@vٰB\`!cGH*{ATI#jW{-"R X$2ךAei%st\S8N7#~HSKyWtD*E>eQ Y!G›l;EA\PsIkh^23,WC<$Mppc8z?a yx)KK#~1No 5GǶA`lB\K;k{̱ZJDPBs$"DePU/ꃚ MzB-\3|{8 ܫ>;7F11muQtn+JF1;tq4~4,@ @ X %#/F:,ZGHf|դA/3OA:7} FIJ4z0|C$:4΂xIkB6B/uz0g `T&lB[m@؀U}Gv[\U~U&JpOC_ C|2?ki}n&xwW/g&hja$$:kʥcyb hR+L7)#h/UX%Qѱ& (XeNPbre7i#}5B*zx|K;.yK] eV5mu< YGB]SCh}uŽiLS  flCZz潵1C9Y@0JeqLڐZVk'yheZ 8i1GE~0ءϽ)K!,5ƭ !Җ' JBKzIZP( ଵ AcHKph{G0;hҁ0C-- ~<}&MACU~l}[7$ɭ  nԮ5D;N0] aKR-5NPv#LP{TzQt+:\kN'|NFG?]xGJ$@E\Y+n7jn^kQ~`KWL5?;Omsxs$;)= `\r/NSI Q"~MU&QGU?/Ȑ"] mFҤ%ċ/!lПDTR1! @ihϖA*g6fV{}їшXjU%{P%[܈P!ne;M$uasBƞmٺ f*FZbv[pr|CGKW` Z;1=]|"Dh8 Q!ڎhxQCW^ҹ gW/g&kZWrekoS_}co6H+>+ *{2*2-@{/r(ZHی86 & 3KԪ01ƗZ᭬$Hi77Jʸ*2r%%D1QA̖QF`"(s#7,ӆ꾆J?b~'4.jL$T6ClwXX"F,mXg%N3RJ$3\Ut2(.OUO@C-U$TaUU"Srbi}aN*i 4Pa@佃S˰${=4\=D2Oy+;@yq/򥞼.zb,M>∯x8H&4a'"f;v.Y1u)/cڋe_3xأ++6DJG9h&Uv4e/i@&>ǖ61- 3SKekΆnň^l1ԄJ&B 4DT%J ۢJΘ;쉴4GٞV˕91g<ǚKҶEW˺ VT"<սvrOMM0͞[s9XqŖf_o]X~M۸@{(ޥқtZzGeO/=~UZ7MڑhlDDGD\6DHr\vA d1J(`5hP~Bhwk.E+_F6;kb~sK$y\'0fiٔDèfVZ&ZiEN2N#Ak9HGюNl6Z85"edW RS2sOp g 5$Ÿ(PLqcGmfE;ZюƎR )vlɿE }GhDBs)æAJhb Iޚ羋%3cC.-ლ`"bR8g@AeLĈm,9(%v`& H39~#a{R=F h&+5MȢ}%bц2 URlIN"]O2mT-vd:qX"NlZߡͯ22 SEIuBISR)E5,9IZXjA)h.Z)arQWX=e"TQ*kQHO/31 jԲeeyF ' 9QЌC,dhvY^6@stڬMFe5k{Pֺv/,\ˎ$mÖ=1l`cesû\jU>yr񢗼ͥ^;+ uěޯ0jdՐ V SҙAvhĂp@)g3#Ͷq-tnIq-OH瑩:W "beBcˊ=C= )ܼ2BLSNZqR+"R*KsKIOd8(S:J&EfpԚ\0#, .y) Gۧ5dz~RuR9;YHifdk+&>r2EҬ YmHѽJІ&n&z AFdmƍf/5%굑0eU?+gHsWv-Aג]TDz{Uw/Z ӵg "Oɲrxߝ]+VZ .Cf_*|l h,ay|[7W,d=4!1G9nGjj:AX|5p&T<NEQ_G= Fu#[+C&b=HWS]۰lT4wSoXjνu,m N7#a Q؄&.!jQH-Вȣ*s*1é礼:j42Ⓜ)b%VzH( m P1vY!!|+,Q" J» S,M ]A ё6Dɉ̓ p{؄5Ԅd$(:?zH2<iA+."2b.A$ #mL ʈ)M: '*[muؼ ЊL҆V -<+ ,Vizh(I̷`Ũì1pqiL+kYu2Ka!JuC;zG7*Q5y K#AnD_;LjR,r I؂$/ԑBSl  (<QlIΤD--«PgjD2YmLh_"@k<͎'HX3 F`TC#"+L 5CÜ d -Q+vp!pтMظ (EԁϋHI2&vɄl( -OPN@*ЫIMRMJC$Xczzv(ꞺD,?"PC:JdBx UX(?Xy *='y:{{\ SU bNaLLâLOɥh11܂Q(0C E* H#w}-s5ZZ=ՠzEuq S GƗLp ;[{U)1A6(Qzh Cї208Yf=`"QH*%LDzx,s 5Ȧ)N|ٰV*ʝe eZ%c7`J\:}m[+#[l9D!54f|=j&3E`mq7¾ak Z5TDk}5R_@:y8T&JͤNlOH:&i̫.؄:%"5혰)D]Bً ^\+FmYݼTR ׶nŠ",jqKco߶ PAʉ4IU]-ZhQ?U*5V MmWMݽ9F Y~Rm'\F(U_ b\qk6!q E(ȫ$gɧV-r\H+Ih" *)d'E嗅Qf8es1X` %<r!]Pq;W( Ba@n8ٖ=ɬ{fjA۾qXqNiGW_ sL*ÚӨTgS=6۵%a%KFZ toPy#Uh R5*f{&\oQN&lgoa*2-'6ZXƺg/x! ,X0H*\ȰÇm 'W' qE?$CS\ɲ˗0̒kϟ@ ƣ#4ZŤE;T F(ʵWK2{&ٯhӪ]o|zSSI;e˷_e `< F_It^VjԲY!1M{b5M9%jZC2zsEM_$d<^У3l6ٵ#~LѺ=^苋7lj& >׎7-u7H&X R pބ g!ONփT؞AT-"%h]\ዎEa|XA6;aemxht)]{pY"vDHlGO557P%T}NGZ\^TYCC&Wnj:$Mm'k5\Y\`h_JDќpvg:jDabFq*fc9bB7 e׍gqqByYFv)xn'BXТd:&v۬p%nj-KPsAzrmkuyDF\ݥY8Mgq|2knpBjyrR7: $& |ۥyȭ(ݬB Lo%C +;F3;T,8 MڴkbO[-TM2Q+ ɢxr@-F-I ? eRR'ښ.{xV/|a*`HRV8 4)^a[ҹ S((cOŝ/] 욈2{=hbgSqcJ,H/(Ⱦ&wlP=̞&߯o|$k\e.;N [+ >㍢Rql53f?{@vl€ _ȵxfXj"y[ZC5"X{8gRY6/YpA"qp`4ڐ? F ɈDq` OS(x{(B>5 $d#ؾ/EHVoK@PC"?H1;Fs_+I`Y5/^#ICq Ǘ&@l() =E$yb&2y@zhE;gm"ZЄD u(hfN:9##E%^"C^RC!؎bcVN[fNE;5S4LIˑ| $O96TEqGyRbQ@6 ࠕ/!Ykl+ na!Mt ^)ъMladE=vZ޵3]s u,@hmpJl)XaVްC@i)8SsSH"1vƬ=q<٭'n&XڤfaƢ.h;knXF"aNE8Yżc-Ry.49ZQO+qHkf"_,*-be̛fFm7O. l 3LU?p @y!:bq" %ZaCբv<mGGAٱPt_) KnIPz%K/.J;pVHWս{![$`G2Ԗ meY*+(@.#|{Xd}Cfߐmwk2zz;jXd'ajiz.dgLpdHfb811sLJ[%bxWZPey^]#%'i@\մ5+t 옱 =4[a)&-%t8ze^biGe*|on쓲lXWY~ʧDS 007o.iƊ+-?ӄ?7vlUcЄz!um( g;J0WJyquĪVnX\]:L׵f;-I$@tCRo\EKؿ(ӌjp^ Rc&FVXH|##Yv\+u_Yt7dKg==-xCNԆ(qIb0!9)Pn&pƦ lg5HG dScS+5c6>a ]p|s#&c%n8(eU~gy0?Ɓq\AE_5\O5{DϓPG-w>p2D o=aq@~IƒA2:~$6R̸H7T0CFl(sƏ [&[1'8aH)6HH4$YC,tK%v)K9Aw(C:)CՑ}jhukH6E4tJhC#>[@fWaT+[di|Z@)xI%w/a2XCr]4:=3~CPpTPxicɦ:mE{b 0ǃ * ޹Jg圂џwj&GNNx6D4@ :Q9`Z&xOw>LÂbU@93/sf3 #8LdcV[j OSHD-D8v|5(QDhN)tb;x1z Q2< WZ*c`IVGqMhb2y%=HQI7h8?EZԌ);g"+fr{cpN b4Y%/B!3C; PcbzH(&.ёqqK!K!kbWN67x3Jc(;d G)4?qsᡣF_x˄SAmށn 4B}ppi'nE0sde(n'G@z ˔w02l%M# \ɔNe>RԫTl[)D 5mbxL3AS+RGjVkbxco DJwN5A7N젔DuW0+;@aHd LNGStSBlxpI<pG`e=FFYJhx;۷?յ5xqS `{7\;S= W3sk-%8 RQ@ۛYX) 6z[O #9lk0U8R7;, B;;o1{^ "eF[|rů#"t=<x ٔUfy(adL@*wDVcgn.(uبW#y<&"lLud,:Xk,jsb<0,Xhpajt) Zǚ ğ`fkjK3u%!ʋXL) &a%*|h/ors6>NEԍ-h<r2;LdSozdĻE%#6&2XVS{_đb\-ȴגY'(6XRM<]ºxϟ_ J۔N66p:*QFeP66QJ|1]L%!l5 xu$ B-kGL]!7'fDe-d[sH)X̆Q4('*so 3a3}3,tD--!ec2U)w_iY$ԈBa'1 ?@ o6V/FզGb&|l~0R7԰I'[[P@AIt3dQU 7(wv9LhspIT=,$LzDXB9` [H7;\GwX wT6V=D[R%X>p:i6qV bbٽQBZ98}jLPSّFqQؗ(t󾰚h܎Wi&Cޛ*7×(nF .[CO Sa`InlGG,vBl 03d~wxGdjzЌ]rSxUXwޕxJh̤[6  W@UZ@ N&; XzAHVTQP r)0Kms)9; bͼXyxT9ĨiIsd?d,$bzUIwxnoU/3A`Z aӃ?{mڔIBM[*(J+{*nB ŐA~DRe+Qk Î\~ʜ/?|yE=oETҔt*0*{#C jʟ-{iє)ٸ GiVo[{Vb*-ԏNc7gb0gUVbUNYྥo!>3S֭]'5zQ[PB+*XM-NkVwZ8I9J͍7cqeyrݽ+0U2&,\]vnuq {@Ic럮 ">MO!Q ?̢$;O))+ɖHv[4RIH⺫:b,ۉ%L-QnHi%*+*Hn<s:͟v˯=&M Z,2AĐ [PC#Ҥ:*,*դBl/O3/j;zI8# v%\;-kTg J%V5@ċN!7Ǘ +9҂ " Yuۄ=<9AH1+0EV՚MA 8`4n[UF"6S+şVLخ$ ʏB.`:Oe][g kc@r ]@ofџQ}!-L %Zҏ0jӕcc1mW8{칋[oIX,[r,_9Q3H7+yb-؁[B-F*A[!-HғCm;|{$)E1/r0]ƨ㋠A*G>"DRFivZ*jqXr1R#[<7![aRC21VX"{a;$dJ^Mt)!Mc&DGG*81F~g>kK v$&ť= IڑQFڨx'EfHcȨ %ՁO&&3M0IBPE(i,p>: dX{#2]>c&e[dƺ;҄S$H^F)QHV0'td\Ҏ&S7 [\Վ$eaֱ%+6p4^OT$iy +!oDLS+`((I?C(Ĩ+p ӨL`:bjq4?R1(,m)b{2FD]$r!R W &FW(N5q*MEX-Mg$ bs :9>[G$D4WX8P8U+n5s'EhW4Ⳙy%7v>up0e4؅(2-]H]B2-դdUFDD 6)Qǔ5aaja{դCה[Mɨ12)HȀK> 3\]1fIԑkQX,+D`H z2B{VNE TKeȔX^Yhqu!EqrdRLJhNh t``D{ 3XU"R++B_8ٳ;@qZ d)4QѴ^N䅬xRPi:+{jCjMlŠeBאM X\Ȱ&t<\Q%Vѭ2/Z 娇ւC[ E;8U)\Ơ=m_qlQGNjA~C)i'P)6h,Қ3FjXj/0AqK (WOJa+!aHq(:> ʜ&QXKdZkwLae ۻmJpÎM~#DU)&Lz)4V'Е DV&2JCm\TO'&T4 ^+M %Ƨ`tϪ[C$PT.rt=YU6c8l'#_UvYN˵鮼r^Vz/}' ܒ$U6WIV?S~}ԋy-51['?<1=VtF>vJҏI@WЧ ) t O`kh|׾zԻ|r5/~=t> 55Pd#~ {dsPkR;WUO$<*j43a$\ 麿 [Q=q<2s㮘a ?v9 %}ڽ L=08雼#{€U d˿ AyHɋs"A0Zj`xA' vHgc3()>(Ҝy+\'4TCmӚKѰAv8!\  ![<:L1{!nq4: (*R?J<j0CyQCATLEAX  #E~s@$s,6qx\l=l ɣ {[8d*>҄M5o9S3:%PZ, "5C 2 684:uS,<Ȭy;VUa$o᙭;'3 !*a RH@*jh8dPőDpz+o8т>1Hӹ~ƛI+C CEjId.);򉳆'_2u2lư=t8( 'A8 R"BR˧4@,rZ1x4 Ƽ䥉36㸱^7b|Il"k4迏<b/ڜ#v#E8DƄL=qGi/% s={$dŦU"/KCQNѫ|*$K@cx-;@ |_ኢF7Ld Y /7`Ou8+DO$;Po)2hlFKL.2.@!ˌ E 蓙 Ocp1`N[LOUc?l+bˡ 3R RtB%m@s P71Rc,E1*133M!Q54|J7eA,RΈP*ST ! ,`PH*\Ȱ_l5"A'(Ж= qFS\ɲ˗0f$8qwSΘ@ J%ƑTzIG=zoՂ6-ʵׯqIٟaElϴ`ʝ+4դw ݘt?wKnےVmkK|/fA;4fS 9BT[]MvLO,dTI Uؖ9eر%x`Łkwu{VO?eMY{s ]/ߥ•ǟqgd7B݁DՄwWUg^Gfw\ ؂)H(/hbN_U-#ZhGs pG9?X ;h(/ģ@2&_E}y_AX{⊲ "sߜSfuS<yb)PRE;шf./g )&cIGfD(ٮXk5FN/Kn;"\r:{юCvAwE(t]$_$M/:v)1ӌɵnsâ^r5K# n}/yjd%᱒gڂeVoYg@,ZJ2I-J4wu J&2/IDxL=%T u&br/NxCiĢoTڗyY3*5:Qi$:kʑE#@|IJ:FtsRZB$g+kK g#!"eFx b\[/*vfՎ%Pj+h@+30 C ^ )\6]!N뻣0N5͉{C[-xdxm_%O.)+? ץ樗;+ 'L) k=B5"z{ N4?iY2k~mb`-mF*ЮDk ЦN D% SJѮUPkulqd15tF.0zu\AG"ta#xtYrFE +gqC^t`IWD w#@]2A{9SK%*@dA F7wc\72_aU'mi "c7T3!L)`b 7reb@Xb)/DuVV`0NqNP}ai04TN$f@KɆm9 5}Bvgj]qnaQ3{+% %~W2sH|#*q8!dDGVW)3th78C$.2ɴTC'JgxW 12QsfQ%>1t;h' :XA_aet5|g(tУSB&}&%dIk7uLm BQ> 7RrP,c(\%3 9kOc  V3.2YTXR@_S1/i6T-cvG\Aeȍ,Ԑ3PgGBȑ;Rf؃*CRFLY2 IFHh)XXV=1jI05 EPed t18BdI ?6/`(ՖV|X(C%u(h' ч^!&'g$pF_tS 0 eduS1sK؁D8^|a7j8FJ85<ԉS7h*@c )Vҡ 5PaMG g՘$a8ԋ ;/'6Wi:X;aX$]L+x3?wzsYX8uKƫ89>5}rc)PO'%X3dAzo`;[1( V1Ɩ-Usz+C8&'CC4b::z_j@u7^ޘ~cZ+*(4dn$Vj8MKϩ 򊩝5Ž>5Q(Hs{f(wpW0 ӫ+e'eIKt@ hI(OVcѨ5a$q[=N螬M1TbdJ GF.[ai@]c%/#?ԳCar@>mg[bZmqm\c_ )D_@+xW,I7j>c]ITcRzxKK/4|+KIu4-sz -d'4LeҤ&CH1FX+ 77契 a*쐁ޑdhNe:gc8CFʀ8Erw}b%EYU/;cvz⒪99Zik+Uh#t)ƃu? "{9Jx2xj:Qr z$-F$HHvN'nk:ge[G(Qa`c@F"|w r/q#'e1V,)\e6) nK(X2Z!16dOw tl1 ǚPE Q$Ə( -5._I -6\AZ^'+Jl n$#\?Gu~ӆgK6p!K:bh;I/vQ2 &{ٹ@BT_d_0ϭ %qHH] ysHUA7U Q(wn2H?be](f?@cfqqƜg>Y0hH+ϴl!G0l+%#6 OB&3L0u'"IvF@kP͓[OIqZ9p}Tzz֜2@ u 375l91`1FuWE.Tq-D̬hI*H ѪXњ$XZ5^`9$ 4]P5W_-z&\m>/6|g`%G!*ةj0)i1k!\$XyͿ3ǁ3>ܥxSQ?{-V|H*L21$H%Ez$9&t!(Cz̴RKFr]ʚ5ڤ%Z^PSU2eֿvT= `ES}I&ne1ފXݸj=;J__E|(kC*SavZh.-"w ݇%zSI5I-=gHo}X5Ț֫[ξjt ޲g\Zwu@V?FšCjg/Co :O?6ˮj*IMFi!l*IQ䝂r[9hb':"S%5l9 ȷ5B2Cƣ-"l-ů/W?@Ё'޴G54^TP8C#N`~V D G.f0F\ X uMX- R"vD! ИNB$0mxR=u1laWB.ֱ"Ze1vU8x WY(?1[F!,~rDJccP# 2PBLB|&9 i!XJ`4•> J(BRtULʚC(7qH6ml7NlK叴%fYP1tJTO]B l}Qb9C׍) bYYѓCB~YɊ洞n3)5Dvq,πNG; % tcD5Ez.(1 %AtT Y8-r3' svSDZ('a椊?rTeo-SMB+G*db 0.,"@ Uip 8-,s\ܗ[E6_cFbanV"xoZa"̬35-2'38e-aR¶Fd,DHN@螢r5zYtsXfs 4saҊx NVоe.?[iXe1o+*|=Xy ږ(E)P*p\"="8IEOmysiIMƾx(n(͹Î ŽɈ)F RoEk)J+ҰD@d?RU4e]V)_!&t9iEQI<1%eI8-7|I|U8oJJ =(Y9A#_U$bMX daӈl&|C>-;ׁlgrC No d 2YBApn(N3QD+!GTDZ*!1j+X>_nR̓"i@걎sɋ_@],2^hN gT% zfdhHc5 Pj\;|GI231xAR,@m e84Ao7 )Du6N' PLLuJu;8NA=B)44o"~蝲"dDh>6i^wx&,Y*Ɋ>-R˫YXP!G dQeoY6JxvZlcSM;aCحfG.Ђpf,O4E\ t v4q^ֱ=H:<:R]ș/bRuFR&Z}@L@bU(%$#V"wp +NE6 Qc/hIK:Չ+SnW| Ĥ9mYq:HѶy3rpb![~ߕ58Z~1qIRlP -q}8gHgeav!Xo>1|..0a,F FV5_J|@K?"t%LNg1!@$DTnb"DVHV)nX>Gsk(q:BEVD LH u+v}Oz@:6CQ9Q\N)ROԔl"j=eZzm9Cb&.W*x0!RD 7HqKh@}a&TB:!<hԨ, @!} 1NNv~@&1qQN5(rTޑOt&*71.wh$/DI'9ZLh'*r5Po/س`LOos1y6_fHMl#ArI.!*SaIa"uq@0?]}X 744F tJo6!ߒ34 Ĉq<Q hcyTVtܴ`49 %- 4o$c^[POguL.*הbAgtyҕG> M(]mm2 g=gP["\c4b2:[(DXY D319c@.ՂDbFV5m~flOd yyN ,foH1BfX #U p:6c@br.iQTHY?H r1yVi0`Ŧ@y'c<2ExY~ŗh{c7M6qc쳞 9g ©(}'UҔ}<2nU_ QI:uLZbDE=ļVC68ZGcӂ! `f^bcI1w1eq~mysBH:@9gjw29l6DEZC__%O@/g:!9 F;ID& K *Wle0@szB9؂;(Z|=&_vu:#A+ xRG¥`I ʠC1Lb62' Kת(F13:")AR@ hvz:1VX9M٥MsbU 0.2!puRSc (WcJ8RJ|{0$II-L"I:A"C4xYFn4[vqx8D69+w2chR34h40{:ӯhQ"W8w"!UB"=2TQ) 9a㡀e8}WRj#MD`ʻ vweI#DhuzKHqF63:Jpʝ%eBM#\E'큜taJns~a$04 *Z+F"E/pUu/[!M133w2V (rCZ%"RQvȢr.trb5(W>rz&rœgR|:xi/(e5[,&-!A,a7b77}Y H)&X*{<:𑀓iZ..9+} BKMǤ~al;1~XE8By(> HoW+'1QG@j(,!޳YdJX"r'-bzQZ%sLVax\|!g):E,MU'1*u$r&q-c+RIo1(eD%qȭžB H_M. ,`sR@=r=!c=YҬXK ӴIDG08o-D >_V&a'KHlq;! Ϗ~U+Sr7)Uvt~pG"MU·]&ٸ]^ =>A$iaS  aMV9K3Z`x%V A9զ+,CG SĂMۭ}a_RDCL,G8c`Q*H-Kt"* _]& D1;fSM5):T$k.}\Y\Y078HE@@@6]W $tKMW.gGDTzn(0#Ҋ4.HC]! :uxU+=ԊbYEZ-aipiݒUI"HqRj# ųRGZh WT=#Z nM]~J |V'cޔ&a y)[J՛!9@ʾAnJ7.R/~'呔`zLpdYQs=W_wLI;=dtS$F<1fG] K-(tj;gmnZ4TQBo~>s3yjn9&({RugQZRGG0I&L"/dn^UKM~𜋹X$*хX;Eܡ5d#7Om-|W/!3>51}^+w's/Һ}/&=uO\UCX96_G]sBviZ*25-o{1ɖY2?_SF_gh# QBYO-?(loqC6t!-ѨŘ/HUrA!FZ˞>PD-^ĘQF=f5ަ-5mQbH(ۢISGg=}TЊ!sXOCKؚա/=Nd50,iheOa[UEVڟ :%QJZgƭi0NXpQ t,jٺ4sJ=;XfcR\:IVkYͷ:$Ő?,KAn3U͝eGOk*5A6x̟?J҉߮wx=SKlu0֯k>lV6cV')XRӮ&Vt"0CHQʪv:Lz0*{h 3 C,51Z+FiЪQưB ZFEQnJ2G)uCLCϡs,$*#XBlJ90.Z$%z<XPG"s9 )@dT*M(bQ"̳u c74/}FDO& M )!%I$Q"_Q4a#Q)EoRWi7Z ] v)%Om%W#͡tA=Fy{tCZ(-M8-ˤQ" !R 8be$S?b; {XbEpLإ=K㡸XWy3Vکͪ{~SwIEsd+ }czi_%4ʌU`mvlِ"؂0612;nXgk$'[3v %z"Ծeh`V/d|-:*v]x6>yԃ! ,`PH*\Ȱa[ -({ RѡǏ CII :ɲ˗0]0 ě4fX3ϟ@ Jї=&ӧPMJj) WYLժٳhӪ]+4,ك3bdKnGwޫ˷J[b l Ε &HLEC^ڵʠQ2Zh5炦C~^=VZ\qgZ2eɤEvg+ʸ-YoL2nOXsĞY]\&+!7`g8;' \Q+%݂șA͵`&b$8ʀEx"!N\qE= J)B"w/W\9Y 8 XHBۉN1Lŗz/IZr`& i2ܕ3*ƤK&IC?n݅O]Gn7J=ySO;9=3~Gq"F<ϒh&UN'`"v jBA鏩&pI6FG7ٷ^^h@$j2G(=jˈ:7$eOg- dzl$٪Z{~DLYf5!KeZ܉*Y2mJ;9ʓd )F}@Z gN'nGZވMGoC\ 7*At^AEѐ2\1dZs[Ŷ,$El@yEc}ص>شOk&CP$:Q^,%Dt-z6HE$%q̐[*PװIb!-@aw8H g~e~ˎ @\c=שGCKRr4 x%vR vPj~ЮH7DcIi~A ÐfxHӣ.өmi`ܤ4J`(HA\*n(v[7tsܱR,EDw}I\j8}@͑K}X؟ _Ԉ$gc&5P-zi*-VjVX Vgb[n-gi^[.;g4["Hc d) ȧ+`q&Ud"slqu.4,Z Jjr>㴉@ȁ]֥kC#pRfámimc씥IеCB!m4NeLdϮuwKt*Өa"=:hZ{0IQ I1plm2ߛ2O-M6NBKs4%,"H Wlivʃ\yߓGW3i˵D]BoI$N }UV^1O8)PAL4+¸߉&tJJ7w̷w F]HpO6jU#X !LcuRw.D8 y^a1SaVRi%)g@ pq=)lw%>6Y,09 s7gR7\Th3 V(aa#sK0 #.!QH+~$vWwP$-rJE,w.V=mI_GeMo?Y IΉFXWHg?wa^᜷D`o\~ٜXNv2Wфkq_QDcw 9a))M圿! 6d5Pz1*as PcB LPEfJ.r0'uMj.QabcTHJT=A[+lzUkpxXt4O~Exp RC,ip)ZTws0Aqۆh:Ee4,!:1cg` 9 f\5kX;)+&eF|)ks&QAL+Ө;#aX! [UuW;^3B4My]h8cqY;* [P#V+{!yF6@ qAwSy ;Qdu)b@0/i3 22;4p9%soh37-a& [z`_H&W|"[t[wk*px1 ixgj-,0{cjlڔӖ&*FF- ևh}&v:eci%_JkU07fRF2Ty[Q=Zl5cPf1$蓦wxI5[%"du#v&&=eUty0j 8;#URhech5'n?VDFa.=y]3\NQllۭG!KWBtAaVc)( @eZt.%OiOjjJ;)UAUBQ%UAY%fcB5ű 4+h{Uձ3Nu+GY^qc~k9qd"YIqFHBc1R-o: s:Rs'7'Ɯt6b^f\+Jbv)bڹ\(Q u+Fi@-Jg9.kǶ 6M zJSk+7)Yfk&/XvtJ0A`@Ѹi9uY2#&7+O=\qٻQD%)YI4(㑜L-mkr$+R1 l"+nQR~;:g{57ZAODVF&C1 Du3>dA(fF WRSlc_& +JA/W k*#@l\6Mr18I/\ "x;Grrb((ֵ)si(o'lEY2ϫDavnt"e& @5s+/a1z;!,7 3Xu#cHkNrA8Ոw~ԦopM=2 jR.W KX.k b,Q6Tmk6ho4wI;YQ%0(Y 3Ȉ"{!d ,Y M7A59z>J+9:w#j,wEa9,tPb]h[iDraN`RsY"'*.lZ&Ү PKsdz Ax15bB"PЗCF=lu?rL1,XKl4!7i\$&IB.+TWvc8m.$-HŸm1 '#,-)z n fx?Uhke5c[f4 $eɈϲsL rLmCR__;U v(ԴZu 1ؕguq\f 2>NJ3eQw܎GTcA;..!0ly~9yAځn7BޢdFgx*Q9FqT '%Q-tJ`;tZڣB)܆m#+Uq Ң`T/cb_nbG㤭M4Ua?!vh;*ei-tw*2`Vk:jP,lu^rD3K_|yk^1~"'I0C^ׂ>'#<%J12aj]O'rN8jW8^j4qyKA(!Vq[oe'k&ǣ8#{^S%FS5]*c0~EϱP 7S0}m|v9qR6`,%X3!"KAp#vFl[clfA{ ECqJMsK|r;F#S0ʅ渊<K%5"Byiq-wy"'k}0~> X}j/&'I{<ͦÃLХB` uПݲDGW_=~RHF*(*AQ2|Y&k~)M9 ƌɓc/-ZTϥML8О+ Rƍw", W[ J Yž`›77wDŽ)2˞`>EzxԧbCVhR̝={e-|A*2-jgy6+vn=Km_/iwL]{Ɂ7uZ= -|^zY-\Zmcʵ 3k;.3A0cПsB I, ċ=.#ڰ'&0Es#WFbK'ҒH7J!mdI'KɟvZie2R|#hU4B3ǨA-״1 12$D!䳲IɨNs ̡L0<Ȥ:Ԣ_AOK.{NO%J/%'UF%7$RF5aRw̺a16a2NԓWiKB :`-+ G,gZL-nճi}QDwKڴ1TX%pnx,# )/Acѫ̕?Nl_ 8-j${A.u@d^N[ȢDito#VaUV2bhWkg32LM2ujӅe~];N# :nV^ڦL˻0a Ţ{NI4ijm~*|Ȑ`i +O=VI_4IyB($`ZXy++b>)WAT隞rf eԃ $*R.JtoUGl"ȩԘHo##wZW+&zGXt$GL`O=;eN=r!,\)J$gbu40A!gڝB '009*uFhڠqX1Eg)P&@I.{*@C Dtsc$)LjOkj t":eX1@]V/L`z.!4F޸$΁sT4Aa>h.1FxAlZC=XA()e)\Yj9}<()Rjeʔ[`VAƯg=i³Й~@iq4Ks@.RFGG睔K̃Nm*HXfԩ~:H,1q`BK 6w! &R H (@.Y(tU4XXFI.t ID!$Q ^!+HQ+p$,U=Q0MJٱLI^"R2:zC M gw^R"jDc#XȣDZS՞*4Q̤tюd|_]=ܰ&9 687mi6udIh!D&c&$$PI8"bf$=-O $ I>D2}36vh5%@+5hvcJ-o4;`*VCM!K'FMI 3?9`G!}eKSTP> .J$Ŗ^Z# DVӊ)_e@m;ڧѰlFeqGwSMZX:6臨eU%h_{Ļ9QB/J.UݵA e?ɶul"&ZleU>eLCG8JjGȉ#)uLқ֊60z"ܭ|j ܌?!eJyW#'a!$7 m2s b7Q¦/f(^Cσ~[*姹ctw8İ8IuNI߳OjAĹ/Nǁ^ g`JY8vtRLꃶD1js%9L KoG.G!E+ĉ8a%rÞ(b9â/0}Պg“TtLfLRb.LlAGe,m{EvP˩꯬Z7M+ ĠuE}_j4YԖmô[5[O|GvK̎Lk1>LъVR+a]} KZpHזxQ~J&Fl{.|SmʅoV/GHNʾI63oK.X#0(~wE(4[Z-zTNC.j9k;-X1­N7pI]H*AH<"w^XGf_[ Qxҏp("r)+}Õ9cUf }'V6~Du5+Ig U% 3(Wh^Q.dWc$NK!bX{ &+ br+b?d+ ďRzb:=39.h2B6%7]3)vY*Gjv?69I=F(ys5h!@JGr.N ַ<"wfB;ǠH-LOveBn/2>1Ofs7TRJ3kR,lUF.vxd( Q*es+8KثgBH*qY@r7#!ZBD JW6[RFRT}@O:x|y$ly^ :cf ~C'&J:jzRHq9 QLidt²##uA#QAtd_gQ 'W@s4|X ؃R ?A;|SsFʇ.B !wz]y\|u8Q-fP?Hˀgl A/X:$lj8gQׁZAI{.~E֤*6)C[!DɉTuA# &f2ĂUP%c]Iwzsp!umŽ7 \@BubwR:fbp_+%D3)`&]fi" n[# r8,|D NPHyXQDiQ&Ӻ?<ma cKӄÇᵸV@n]I6SsԈ"B:Οb -͢'x_` `Rƒȋ2-S ;⛁Z0↯S*2>K'2P=BjtgoDx "tXJ'jl,tIԒ,Ċ49:q< ެn؄a4,Y%[ H<Vҁ&!A T}1J$pK&-V] d d}[zD 0wy}EzvL-!XAG_]3b1ܞnxots3簥(BJкjwA17G[= B`75BĶZ %Z4,dG3gA;g"4\8 J&:7'Xk={~8ᶕ%@3fGVt/ۡ#AP }՞ĽP[5labƱa*r-+CuKdASfԓ\HUz2>NWe@2[C:@jc ^2$s^IzA=95`].-\M; INpR`t2mb^W&:lnGT"saS=QLz[610m]B~ D31yOi;ߓVI!t*>a/ .ջ1ܻr\vۏ`n~!UMkMi&9S9ß[wof aϗ=h@-޺˞V 5e`Kh"zj:xq!-]SL5]kGjSCVf^EQ 5b]іX%޸ W.&znT&Ql:6ڄ(Q"VF'#^ѻVQ?i QdBeV.%l/hZ1?!1 m9nmJXɲW.z2Ċ+dթĬ(R[e{Txy |ccwz[<=!ZZ0@lG)-Z*.$ > b&~sC>byȗ 9 „pe9LOFo Пzz)V-=,, ~R2=K>Z$2qĒ$S^󷖾N84s{iA8W N8l644%'$_q&MOЙi$ R术ʯ8-4R)Q,T7U]г3Vc5DYeU6]m}̘b+;Y5Yc*AFaTSeCtڟ^+&JMV2H!`X^ uVҕ 6a%cuUnml+{%MR,j=ZNz5Xv]2T &;mL_5VM8Wv)F$?p[&[Z쯟&QɶQdMHiz~R8PFv4FXY3P' v :YhR+ۇW6Ƹ_:>yeݖo9N@x￷6[vp]1^|]Eqth/r=L'7pkgЁJkE kClM%G*:ו\ǛUx#&iH*_ 򰱭І/r-Os^$$%%D&6jN "TRP[aOJfN\TF0 Bz{`¨֚ .IZC9nYT' GV! Ӫ&q e&T gl ZY{KJj*Bƀt2q҄0l!cg0?bpGL.NE8114D̊?vļlm x##Ő:gk62*O=(ג!3ֳ%շS^W=H^vHحª\ȔvLe;{Z$+i&W bED-p%ՎϻZy>Z"qCU`üC걪Qш!M)fp?i##Bg"(bb;wu5knHZ$蓝de[ DEK`+Iʺ^H1B#jN)OtTez1Mֲr<3a1q^}hK@[`NkKq(W 1WSCD|QIPN@zcQW4ZMx#AqDmƟzP}zxf1=pJE du% %a*R=d fɽ$%gs8;}:CYRAw):A[eZz7ȟO$]ܤΡ-A3$wy Nose*Mժ3cَ'J[0 ?s5f8e bÌι_Z[QzFبAQ>.:ȚɯBN|\z0Iiա\F=vDp(u!cKAUksw rI`YJ Z Hn&Q:5k`eҝ4qh5i)3^YE/&?_U'X4[Jӹ%xǁ W=X֪fsϿٮy|=UWFA)i&E;Ȱ 2ݥRZ-}S=qIvI'(UHRGq);4uhfuCXh[6$l(EZDVm?~a{G@3*rI_ۿVvֻ4{d'UTO4MRR(L,D$SSzC'6&h;cDT@e'R"r\;!;;vsɄj"U|#lS5M='nb=Gæ-Y4t5#a >ESK#\gt4y?%|`}RuN!Co1HPOADK0VdB`!_daA~Qc~SDmM1:WRM B=c1^h:B=#E&R7~{`gض~p@r4V]}nBDv7PTQ姘WT:ɗUG\C? w.{yQ_CxUU?q*ɒGc1wYCW AxI 3gbS5y80Tckܓ"6m#A iD-"aR%-pE5LR1-# ?hcY^ .dqAF!H*s*;T2+ QvlK@uC!d7AhPғcT)붎m;Zwr:QT 'TI3nr@L=*FC.D?99XRqPvQ%2\rsXH.2\S;|ujuLbȉ{N$xa|+p."Ҷ7qE1ŽOFgR)tBW[:g"lW9Jnq&g5"ռ"GJqN:(d`@{?95S`7zC+qS2Ja#fedNn2 A9aGtYHj/Dj) QXJ!pwRaqVCBD51xDQ[GBp[F{#+,0I +آKU(Zc1@XQ#'NCQ,lmz{s1+2 ljJ'}E{wcʢ,0=gH',3?ZĒnr-jZC&z&zq-ʂ֢,:2ɖ(TXU,,": 9A'l{K9 '`2q;i-$L,flqy!`EuG) C+[NV؀97g'tn2X Z[L,t 0H&[Ug372E&r r*SQSebQ 73QS)XC)s7'5 7جI+Q&ף>sZtH–{t*iE 'ZJa8V W6@TךDHkU Ӵ6R1ye.$z;wC6W 21iS5YM?q|a]0SsI9ӯ6}2 S7rQU@(C3T)%*mVA:f` Kcc=4r*՛!.YI&/cQ&IOe$Zzc Z8wc183B#:<'⠕l8%C1 qcH( NF:9f iRKuYdUjLZF/̼ܲ71a!>4PӘdؑᖦ8}(!Z}_Z un5{W`VԖ:ISWcMM EFIwJ!{XBY@ٲj '{C0AJH<2̞Ÿ4 WekhzLQ:+h%h%sVlLI4*4Qj1-FT0Jsp%2穭VV hB Ѣ:KZĉ'l&΂QF̪ eڞvJ4SX:\? >xkQ G!=ī;0"MJ؋Xj%ޫ{z%9YA=ҿ:z" |#JԯL_\vlÝ3\O\0zl1UCnJi%!e\}J]Ԛ¿-.\[py M@l9+ CaO-\d4 A]8&: #)bpkpIhͅ7a͇4x8D%;K DĉeKj SRFDqkJ$b%&XEcO8XLw 6#RiX#CJP*b#廼($ˆ:y[ 3Qds@vdz*S]^%EaQtxh1d L\ r&Al7vK4BQ^JZ8F,^ 1Q۹R!)hk%*amN-QCɛz2.p xjBӡEvX2. AWdPM CB^ԥSVBQQx,-/0V #Sh7yIHqHm.Q+i;· ԩKbK 鵑X͌'4Kj?rР܈rӬ|ϣj9)ŘbĈ;^mjt r3zGEQ9@mSɠ6G֔BxZ,s򗢒BU.SS%뇅MoX%*͡VoS5IrFeM hF.cqQH9"B3 ^_I~q W,v%7BInʙNb73 >R9gʀ_lʓ>(쑕 )R 0+JIz/ e)1t?yJ%k7 s Z;ZA IKTj N1 e5<*O' D80RȽL\Qas"Y;H1V+d4s-<62^ά큖M*@q :֌"Z̽Ӕd4e1#*D2KOaTsnk;U)Gg1Ds ,PF ( ?"|kوJ뛍F֌>6eR H31ǸѾ y;tE=6<*)5Wf!X̅Qi>Mg>TslRw>՗*E߈.gw/1cbPi yrfMQQMýzC]m/fw]d\EZ(pwp E F8|cl]cFxM ! ,`@H*\ȰaA_׽[ B$/A1޺'PS\ɲ˗0c4Yq!MXɳϟ@e+H#E'rҡx3իXZgU`Ê!F;.-Hu/G=vuݻxW{pC*j JXH7(T3̹sTiwhΡ3S\PpJ§s9(VV6ĻVk59M3AU.m:zIZVξ⣶H]Ku÷^>zc'&tr%dͱ]&BU8%V/dԻ X .\ 1z/$""0!XgQIk$F!~Q$KcT_ T%EN"A$ARZTMDHĞ ݪ-ZK[Hr!3!3V0U?Q0r~ɹd&>TlCC]fqg6W9ULcN(2q# #Q |`,9i?E+FJHFh+DV_3@Z 9Hrd{8;/GG-q7_pO=!}AC=4gkI͞hUFP46@y?Iy8#3P141ߌv(DWR%FNږ`=}?6u@9EhzhE4%p4_v糖bWאFEz*=@}*\rK;Tj""TQİN0\rЌT{Q1}:>ch[dE8 ?(Uw^ȑA3("[#UL}cًpc7X$~$Y%IʇAIRXD4,! HWsR*2 !ڗg@>zxk4S1rH7T$cdI(W: '&a*zU($"4%"= "rR&G@6T3r߈8"+pTY:t}vMN䵛mD\"^I$DQPs1,H \Zc9Ϙ 7=He8AulL b9۔:LG6ڂ2eLH* p΢4͠ ,AxUϜM; J,M ӺnʸN#v0e*R1F;(LiQ)6ôЎgZ),Ac& Uա4`CV`漦ҿ 7 v").:vA~EhbeUbW&;bM.KHߺ˚u.>Zf QsLi F1T7<չ٢͌X4j3ePST)۞X{[u {Pϲm*jdT974IVt!ۂ9Wrqe-z]Ϧ]*A;w-⣉(}tTt(m6*=ik`o/Wݷ;}o@ʍOT+]DN}~=M"'CÚ_gl} ,\'N7RF#Zt.)jiv1w zV/hW=nD2d`OVbTmEwo9UHFebF`63G>5cuxn5sf?x vnqR NU";A=\tcDcEd 0_p'6KС 'BAig|2ZKJQV/saR4j> FʗXt@lh3U!kuCLD=ös!Jl{wj!hLFd+JD8E/Ff, $KW{z~+mXZd~vhURyψ| D+a/uCC#K$)!UF.HqqUfScam: ^gIq.l\ 0*BBM /~ WreF~whEs+FfCKC &~&GcPL"h"~2=XQt [ 'BW=hRt\2ĊF-h"OʈTTt5 Po:>#$Ay,;f27ijɑH~v3R87@ӂ5wq1[ PÀ{1Od;ҋQW"<^-XtE Qw(C C ~C;2b$0}[R2gsH@DIE&ȲrY*:\c҉hd#c ya0Hx!cC-/!%!4$[-fB:+Qwf -:T0yYdYoI!* T*9>csߥ ;8?Gd(8$Ղ,YN4]V e&!㰒)AhN2 e&T#B0M&>/?UʒdL^lJj2 &5%%I$ HA9Wb Hq.s.bvgrz"$T qwQ?{mfb< 8pӂ#V)JGaOw)pt_U41+15$U{*V2Z"7i"h ;hЁ:z9{#5," ariRA@i.EZ0 |R>^/v$ћi @R Rm.z&7(JB:$Wmm g& 1œS w{"2i 0\cTiUΒR[.VRDOZïVZqQ@ublcAP(d6eB WG4CeX]S.~/D Zu~I M(2g$չuPMK+IkqDKiadaMuU4۱ S(B5쥞![pz.Iz6sNyχ:ti"mU?Y>e;rAF$!OɊ8!#"ևO >KxK=}CEb,;ɔgs Ain"&p&$Zз=ؙz!Hy2uhrD&bfbTR~D8Ut!@̓,#EC+w"Z`В D1y8Gҡ J5$ or$d #;\X"S+Å`(MkdvtRE8q!,aitUtmn Ywrb w,kcv !ɖUbױۖ:2eeGU.?S Y$ch5Fz OD5{xP“ :붬R6DC B#k&`38I_$R^ #$32#0  ]L"#8jm5@V7'L%qI=OЃ2 c0 ^Sa %c< {$9<\¤,qsl:;rr=1} l+GpO5qq<<)MQD'2Ggո€RDt(#Pp|mXKT%H7?@T{?BD_mD9;gˇ& Ε,DR̭?<f +{ۺGd"\Q4iuSzٿ?3etυ#6'J}L,0E/iU[[]ӱcT 9÷vKA2 G6hx vbT -\ңL)mYl(d2g|H#hy\ % c*."]%):+zBfHA h@W0eZch:ƪ<ܪcETwRPvgrzӏ(b̡gG](LǴ,OXJ54x.MNs< iH*aWg-,.n#`D,|ֳԻX73"gaT>~s*F$ 6Pto{OtHQ=ߐ1Y2ZHK)ft 9/6wn|3 ։tyź^N/Ohq yZ0 55% UeT M%]џ!1qm%:1فӂ3+xs09"̝JRCQ xK7rd-"}۾?Mл(Qe^:F!~O՜e^2#za72;E{UbUF-o: 4eBƟ8!eڭ%rCsfy Ŝ @+Xϙ{72bc$ 2 xB A(TSWFcez#I H ٱa'!@@B(`6@zGM!Ct# 9 f!pgsdmdȦ\/ڈa*OیR>u@QH05II_D01(V GJĐ5I{((2&VTP|EzT)[mz 2QkEZu)JEjlHYd{DvjWc&G٫GqDc54_$x1^-㎶E*ҢMXz"SFmZoK g7/]WE`f<߸u'2('Ș͟j0}N,qVD$Wfʦ3ܳϾHO$,P҄cE3PD3f$12(~ 7h $4p7 N?eVq!q?ږT=#aDBS{îQjqN-*9{,y T'#d`CeeJ0rR0FnW5hN 1q:eT 걇zZIfM,0./a[lg㦳k~sRZesy ,`M "'_:.\~%|N) LA%(F@ [ظ-@9`+H9#VEɄQRB\6I[APD3ʐ y s*v< .[/^PF]sR@EIXboZ ÅAs a-Q=QS^!`m6EP(m4H)~$9ȃ$ PqT1ȩcĤy0wI@1/AG9DIDi.T[; \JZ$ROҗE^48뗿d1y B$cIK(b&0"l22㈄ e8`$d?Ӟ'(R f'$82D{ h-Rv '2bM#DxbHDits(Io:Fp4Nr_im<)ئ03`'L$;Qk>NS u`9 Vsnd)g#BTMlyol$tq=LJ82K:IvAlWфR8CcQFBuVV`ЎXM“|E.EUҹuֵN]xUg = c]e7i0:by\oFd:]\Wz+mZ귶Z1.<ݢ2ڡϊ2(&ΉdWwzDGfӉ5oiz De SEFZc&t []g}Ņ 8S&$b+l^ f1 v)ͥGZ`[n 5x>KN"Hв"BL*7b2!I1!(q{t8n}.,g*&gCt2)?csM,iKQ^Q8( uB YNLLeWXkTk dg6lP"eȽ5H<אu[u%=wpmJXU5DFnvU,]Nn&M˺%GMZCofzFa b-:Xj%! ,`@H*\ȰaA[  GО_n (= Ó(S\ɲK&S|Y͛8sIPcHt,`PCMtFPJsˢjʵЉbYQٚ^ʝkp(՘VW[O ڤmǐ#ݙ˘O ?&{(Y} Z4$cՙc^I_;{(Z{weEM3G%Pq[؍7nqǪ-__.18p{!ϯ5T|MR[nE?A4AZV+9sZ?k^E&ͷIp I&@$9G R@Q"S4͑XP$f|-e^ٵ C*t%AdI7u GJAҎ"P&HD eEşs,Hfd^%@CuB0*К(8PdyhnVGF4]AŊmQRɧdZ覙y&Z%*@nP=r sX hf- f)%x/*@T*YS ƺi6h;gMe[|ldAѲ? J$IqH&[0OVٳI jZ-j$q(eҎZh/B8bW+/ɒYZQ"(YjA*D_ZRRXO ~<&?rI:S&0E="4TYwT<ݱŭ`kh_I U~itgF}K&e:_3JKP&imheosA'1sB UBQǻy\ 9:eqY%[gQE-uu宴';:X,&)(Ma3\PrƁ9=, 2ЋI%+!;C +h+%#HA/6$Q}5s.qLg|Bi I :I{aq`dBlpԋ}bA'9gA v7wl(e&v@@-&GkH[8p< ֘7 nk^hn,`G̬c{+Bu RC(:ȜYX.~Hxk( e|FX"3iatRNj$A>lU2> ;@AbML! lb `E)NXD(gO* ٗԂX$τ0% $m)e)d`G QRPiA[G<1$h䣍~e\Hڣ08x=\0!@SyPVW+-*Ih *IE7LG5cgS]CQ =mz%"(rQ6D`Rju& iWD΁EZ'jJڸ`{Mb6XR^G,x{ _0Mhg!+Q2!eauA4UN r*teIϽhR() E-aiP㸮PWmjo/dsKQm#\,5\  ecӭBcHlsC:Ad%V!B"G2ѝ MFr ^x k6YT&,ßI8I!cH0Z`5I㩄(gG_}[Zn6$N%Tӡj;)H = -ǘ[퀘H>sp %ZSLzy9 tTq糅Eh3#N8(HCԘăRp%o[Yt]-hNBN= knҰt^JGVǁx' UҽNC.1Or ؈(> m^ya)-H5{CV=ZE Xey]r%j]Q䔶DBGo3Fb 4ۑJ*qBᛴ=ű0?t_ٺPX_,"kwfDBN;VܣxD/bV 4;L7IF[2a50=Av` a&~zߗrw A,u/bb ۅ&f,A, (XgHBq2GLGDsEBGCp*$ B"dK9l a@_8Q&caj FoHc1uWEcA{)\rdJBl\!z &C#3z9'XJ 1bGb!*\m6-S3MpIesE>¶#D a13#cpl#g&S#|(z6P' cnӑ?f$S?a8BI$S2 &,]rSCMrp5NlX7[3mqBTM.j&=ԣ$@ g(L5Sb" ۡ^DZqB}o-q0a874! WR R$$FXQ}-q[PtmD %EP a{Bc^Qw1Ρe!t[hRQN*M'aeqDȏACY\ ugPOZ$c#ZAw+1q<у$E3r]k/aRP|:4_B+@fzya?wZbN!'a A\f5FǒHqg"h.Ny5Zi%tه qTPx+h 8+Hb fX唵Eg 7dy'wZ8)_`d+-fk8E"@rd+bsY;  QErvWg1>PGUbv"W {R7MtI0W"KB=% u]#O`:`1*kn[!E @"!"P pIW:9313RxƷvɄN$L(Q^_v9XB):*d]wCiQ.gj3f*Z@Q.@\Y A"0c$&XQ1+JQr 94ݘl8~B.J7bos;YKA8v!QRX9RO*rR02v 6^Id`3^ q[YE4`˱ئ|K/)!4-O[! JWL:8 c "[n/PM Z w6 wځ!q4{5 jX9ZKvtAI G ?rJjt%9cBT=eWiZ`Á1AAA~FSHKe׽ QQ"`68+^g^#b"+! xlN!|un s?w{cEd@¸#ARbr0i/)Z T£b>y[y#5%JqG}jR\\J3!Nڀj:)!jrAf瓮۽9wfV$E3FD/^L%+aP%z {œfO-E,+zJ+aĚ`o\]eE $z<*:<'6;WyaqB\O]igR6vlrk<8 5 ZkYKBW;OxC!'Y"$Ow}+vLGs25>5X@ TV;qȔ͕Iy+iyCv`75@B3Vr "26 7;r9eC-G qxGQ"r D@)vuq:56PrB |ʗ^&΁R̒8!JKedYBe`RVaⰾ~LU #qn w_){"tJFT p_QyQNUw{X$?Zѿ `#@e?lzRѲ%QuXlX15W1W{x–UACM(]yܵ53"q&P)INuX u+D#[pu]28^~1K2U2a/z"Rr?nbWE]'1kfgN5%d 4#fWx6iwpt'm˛)&& XC!]AKݰ:R´>,A$5.vJAZ- F0vL& -(~]M5r0R,ŒVh@ӀCEJlUZ"+/#y.͈lW m&Gn(FXVF$|f-rA.JoLcͬ@8`i.+6r7V{[@2bj2(*R14}\b)gB͇¥pa^zHVQ"".'+0LFa&Y+l !Q]Y @ 'WlzFIL[~ѯJ*Po,Gvk$6`A岑 *' -[Ktw{E)qSt{Pid^XB$ -D12Hcr3!9ԫ?!B&®zKO=ow’7'1 ͒{ ? +Ha@\E5~_{B(N3fȆ. j2`+"~RȂ $RJʄ0E\ęSNШA'UjЧSSP&QK~VӛbGV^RY C8YuޭZ4^I{j`ƍqB-.æز;VpgS+'|Z&_Ur68w3Fs7BMeвN)z?<4%0vz ˜( n?Co<@":@: P?0CޓL#!@ WQzY1$;1kѡLDG!㎔S *2"RD(;t".LzR2׬22"hz8'.\4E#.-O!/\,I3d+Q2ɤZb)H,3+Q+HLbgJ$ 4 ?eJ2FDY,Ҝ~! _]ZԌ YkqhMi:k%)W\sYeluۥ_^}e8{\r}͠H {g"DU!Z)) x_aCt&#١! ,`@H*\ȰaA_ (Dᭁ7B(pcF9\ɲ˗0c\2J U&I̟@ J I5G"pJG~iѫXjj'LqnKYlzT -jڳx](B--KLkZ+c݌Qý =(Uυú|!郀A^rqA%Ng"h3f e Ys#؄6+z!^j=_9;9Y`]:o|dhoSxFkgs`= ;IKu= gOf}rD^ghh2&Z})l"+0&*(V FW(΂=QIh8dR@-2hx)^8"AQXBdI&lIPԹqc>יDMo!T[ԩeeS("2f ZfY&Jܷ{yV\i-X+f䂣*hp $ x*J`rO]`YuU*PQF;a6Pf ::K嵵FnZ ? 絚tP=Di[e$+‘ggkL ׎j͛գ]8,Rz@-v^rqA;8rhd('4% ۱g5_{KWPa=hh™JZb9ڠ-t&Z<Xμ UM =1.d`m6ؚks8-`9S]݇v0bH}`&b]…@}ߕ+2J=0?(Duvj_ӬnJoyp.}Y:+U'nE1?իiՁrV6:G`7^9+2)-p\$J7 4b#cvj0\p4! iH @ oM^D~Ia.q4ԣ"2US@[yUcWx68ma@'?/'M%/t`$-r)Z"epf0rVit?se ,B@Qz~"Q+ 55BCΒaa@e!['_e@"TPCsoQ0Kcwb-UIVaSцH;qTF$8x5"K*N2&%7lv$(xHhb5&Arr7P2J&&c%hT4,E(hS,650DT3Hfb6 , ft*(VH8"(&8XgBtv3xmWG/`^n ! >$D!K 8[<*9,X7ah*3mWEstB%ra~elgb3I9@Q,?+5I6fGLBUBNRuE´Xws.]Faǡ %(rַPP(y-2[!Vw}sIG0a"T .4,!:HT$F%[ 5aUFV3&ta {Hr5`89[rٚ+< E `=hdɜo)yp9P%?LqAA?4-{Gȹ}|ACNkh=Q8+2$Sh Յy1#52[5&3ArDK$V%UK} ߶(YCZ9O#2DGT,$Q,qfh% kRKJ$ шf%Q ,p[^)n/%ie?viOuqEj8.,'# 0fI1 @ 8c:[%>naoZ :1;W!kjy(+x`-qEUr'gdD-71vgGh.H !bWڥѪ%P%cGwJ EYZsv/0 AqH&~+لfB3NsIj)LקU21\1zyOSM-DQ01%uMkdvA cv5Kq4E1^mCHʳ9k|7|?YN|xC3 )b#ŗ4HTs8DGP8@G؁2e ̂o&uO'tp#'e2 @9 'w!P pB6 %:wWIG_m{X~ZZ*r::s9_`rz# Tm{Q PaZ61 HHeL8iߩ $)VKۉDS)pQ  [ײ "+rW~h*哠 PAPJՒbbqڎ0B"! ,w6RS\))Ɂ:JrsmH촳NQt,S2\ "򩫤]4[ wS39$[E%΄'jP~WE* y.C$x %se Yd(GFYji+9JEk~KŒ *)@*M5e:f'H.!&6ײ.ZӰVh8m!Qn&m>b 3^k,sE{˚<$@ml4zpd*W:նH%s'Qt4l UaBFpq>-GS #8.8&Uuf)6U,{"4S-uuq(:|seKw't@K vl9JIg7ɆfjQ׷}^us6%}d,v+(fyA@ Bj &VZwr:62 r<,V\yS ňل ܟ7,Z&4,A%{vgy 5:uG5˜öCA''apLFʫbHvƊpm4K%B,XAq'*[2L J &v"-T1̵qs%67)d4!J5D&9(Vyc sSBqg+J?FZBՒ3()P}R~*+%%j˂R2XmW"IvgkLf.[A1sܼhk0A4QF2_0!"i~jWtb{'e55Yy?]{  мX9oqQXL43)jS5u\#kF;)%bfBnF!塂vީpf24B{>xfsEͮaE],C-qEC:xQ~7)cKa7Vk^S:tN ݧ V@09SEIqaA[$ RٱY'c 0ߠF- FEsk{b+[';;W)y-!}Zr }V9T5 ƩE dOل屓mb ?r*ѷ*9]'P=U2ΘCo0uHX6F] D%9 3N pbVAj$ "B! xq߼, Ԟ^>h`fW?+nBZ Cʏoqci_nAG6G$TW$-EbǚB8ٱ.ʮ%k{ڧ`g;SrB#f- ,PB >L% i(4իXoF2)ʞ_rg(M$)EM&mJddB2uUև &lI@@RhQZ%7$ۄl +ޭ|)&-@eBTM4Ş/FT@fH `,z|x\2&'p4Wڵ ]a+Wf'$DaiKcު)篨 Bc+ fqD^z|RO|oǮ$ j^g)jy2 {NBIzp,,+i D=)ƢJZgbFڪڀ/@l ʨ"N#阪N(EHdvJF1]0,͂ dS g2-!H"߻M!S3hŷSִwݛTzSiLtT CsWL,Gݥ;Nˮ$U04c%Ҝ=J'~1]);jaF4siE/+GIjiQ6G0BpqBv]jO;7Te6$ϭMJx@ExmKdVq'qtUM$13Z[+㏧䍆!V4^̽lڱ dK(!SvD w*Yk"aۆaDY UN0-5-o%^ !B(LmX VvԂrҌ 枊I % `k+Y]TV٘'>B(# !9i+Ƒcƹ^[,N4[v FB_@{1)L!OnYg&!Ϗ.ެTgHRS{|n(+FM!PdHNBjXf5 T@ u`mϾ^mRS;DxRж+e] ۣd|Ž|ҦGvܾL-JCǾJ9MkGO!Z+.ϦV n !>UMyN/NM`'q&Aސ! ,`@H*\ȰaA[ h"!fEIɓ(S")ŃSI͛8sK;Cs`O=u*]ʴɘ1IFuJի.?t)(G\KT>Y۶@ &zhLE%߿ g6T${QqЊBl::5,d̠-51et%NKtGC9-6 i{Q=48Oʻ_En[!ҥ zA #pƓ5_GZ}cqwh/i/D1Ap_ֳ4 ;v9vv &$bO=T('܁ n ReK=Be&hE]2 iV&rχVBT&ZI&8j1=-WP$j9`MIjiFB"ge hԇ~elf)(أC"*IAbʊ?-W٢dTLQ5J៑ %%+%E`BKCiA-[c?n%8 ^-u[SQ`f"J$ɻ?I- : ^$A!5}P]~fZ0iK&*Yek`g*m[?X1TněƢ\h-N5)QQvldmvlbÙX}8)LK-@!%<tJ̈́ݎ3|j&UkL"9 TkNeώ.jES)[~kԊ߶ߎQD#VN-w*EO+'ej9ɭ7^ωo;IRX!-"F8l=3{D>iQyb`$Rk 5sJǃkW5W5Mφ)9 YJYLP!MbeQˀc"$fVr0a$2k Ijy`IxbL x+XL=-({sK 2 `%|M^B)J8b5n0[ʣD5(5Pkxfųv :u& ' U"!$q;{EAސ|t٢Z`WHR?Xѥ bK`FḴ)`^5qhYj h`s,,{ JeD C:"^ʑP2eq cհ}I І)&Us96K|"I'*_KC ) ,}xRXNd,)$ EFu̘t; n 0юGlЎvĿ{ %Ú&$!`۩JIɨcJ*TzPdbQcvYQG EmjA VLdv;dRWR$1:ǡzhԔ"fvX7iB먇'z#e6$cU&EXO6TE)D#օ$Le*vԬV#8RB>ȯH^Bv#ZɀbbpKC["Mk'Aa1RIadk= )ACASru(-Tfm#^ *Es@ TiwoZ 9dAi v(;JM[U~nU]Hb _0l)J2*Eu UE6B0v(TRȕRƻL[`8O&Hʵh4ݴl4` EK(ơb ^M>bd/_/_H{Tibxd.BuotY zIA0YmO$"XIdDْX]-MЖ!4ǐpYB{ibvm &͊xJIj!B%+385㡺݂Qh.}+ S;/W,^ ^no %1I1!ȷ49NyeQsǁm4&/Ÿɭ0!NҞ5sZME^ i{-+o%K4WLXՁ-6g~6 xN ]~%k9w.@ތxnhdM4QQ-X1McE;H11@x6!b E;(6AgY=)t?𴛀O)Z3Xp|&U)Ku}[ܽ%cqHFWB.ѐi2 ^bTBSs~DjXm#4@4D=1CP!ZLQ q& IuP0H%aUS5hv(C v`T5 ]3w/iW]Dbe`ULb#wE\ja(<`-KV%%E r@aj n%G"0HGuv}Cfcw%840Q\HB7]pA83&@$c8:1 juJ0PN%D^v5Y c5p[P<8K!EP'1G7MSۓ%=wG6%&UdjFoDC (qsft 82 $UKe4Pf%[niPV9ѱO(g.pb06XMQn7S$i%@v&IX,qs drtlׅxTu1kp]pkZLvLт?Kb9:n" !R+R3e@L32D!mE"AyP3N:*KGuc3f-7OZ@'MD M[9ɱ!W7nҴ~]6Ix1rcZ# Is<3!5<Ux}|:@:73 1e7A&^Bl~|Y )XO;zxXa k#e lcPEDImR- n _Ѕ55"$B)@yQv?/u"Mea%{Fe0JS3ɴCс:%':d'iV|UCӘX<3z'E\㥓d6pC{d"| 'zzd8E{)!~<R:b79* ~:59k[D]/g*iB9:UM44L+(l)bG2M8!j cFT@#S4H';mvAVYXC!눼9>^gr2*)hEKC 5U ZPF AC@)m,~:M+d.1DY:$hb-k4'D{R h\0E's.H hZOaoIQfR8 (3BLZ.qj~2aإWĴ,v9[E`3Ҕ*I)/>"ץJ5">"UR Ҕ~+哘wg76fT%S9]H&]GXKE8D'[px6x,ݏ %$+(S8 ;f[ Y^uW!|(a54Ȼ蜆kߌ &*bSb<]EaPU:quM!f 4BEQqt]HZ7d:0< (shFRFg+8C(p"DjD gE`9%Q8ul1D%!O"E]́XMBb!pdmk `b::!ޡ!@RJCHm 뼆D&lP$imv!7&tEΓKɧݼb+h 0D ?b RJ ;:Zn JOūrm&̩`"#+I\SN5) Yt"ı,i4F(i Bd|Zս>,=U`#/Kљu vqX53\2.#A{h׈ց1'/"DΞ"6NUcr6c} #V y293 y0}b9SU<=$|EWW^N:~P8F R@ %Z~pc$c>w5G&,u QE2!5nzk4~.]EbC=R*Seӻ?XAcW!2t[+<$uzN>P =@&%w* Om 8Ԣ#]A.>]1-O(VdT ] $* !)]Ҩh)v4 خ4¼7Dc0wg)bv-g!X0.Hv|)oy.Faq_9h"ZٱPfYo!EB'7%1fh"AsCӇJCf^G/D$e#a- 4JBM< Q 4PF=~?Y}QCN>ԒiÕ"ՊdȝG5,q!)lʔQS={5 JQ)kџMG5({E VmIqkFv@5iGv-&VjTj-{ :B-5w^,߭B65eѸ= nM!iZ޽C%Uܣn],\SngިS0;͍ؕ[~Z2 `_LM2A3rnϹz(1;( ϗe&r9_aCp9C'Jl {k Rr.(Lln7 *V:ȵQN"QdC м'׻)"MO+d+ NzJ(Kbt|5V8#mQ6#d,OZ;ZT|9L!Bч4{RmP.uRؤӅ"êN_7"i+=5#ě1r)WiGRasJ31B"uvsa rVԹwsfl*{}糧Z%yzkX}}V1cgϣ<")ִ y0@lEif{_{^R꺶离nE/ -nykBUp2H*Rsp? M/ S!j)b;_n '3bE+Eh&2ɹA/U<#KIQqz_H*fJ+5V"i8A @QG_EJW*w(S;Ҥ0$kaoa#Ef^ ?J{h1Hd"C&pCS XLL\}Fv 5L1 %B 4[{ȴ5nmR GCFFXǝQtLd%SIM 4!l[xGWRD>yGSvH"A\b\YVO+[4\9g̓vK:flִZQb F1Ril[Dsu#)"($q )_,qiCJ1e%nX8ijDxBt41/ .5I e@BvAFNmGJMdrIfF1Ga?MڼR2"v"5H#E*hd!YȧH>a1,?ʾoۋJUK8 $%@Ip'+R#R&<Un",H*[ 8Î-XHHrNXbG--Rb3oy؋q\p Nuԅ"AQ T$Smk9#Hj1e \(Q\U< Fi8}ks]r?^At?rz EBrkheKbW4rDW0Ew7֭أV!U'/n;C֒2.xMJ#ŎZF޸ѹqQ+N"_BdٱJ'Gu`;i*'ԒR#jd6%&9bRrsu8тU v ]8 ! ,`JH*\ȰCŋ3jȱǏ CIɓ(S\IGaIfÉqI͟@t)3dQHk yK5ϖO>T`D]M-{Q6{\PåBbݫU.__V =)$pT={Y&Κ<%4+um.y5Σ UXVo#E>dĈiZU%@=3e=u&nK 9犚s\Y;D?p@L8? /0i %XReɄ&\BdA7P=XiAUuMK=qmQ]GiX_P "3H(BȞ@5$J;2(O>@aaͶٌ$hU@|$P@k6E{FI &:fP=f*@dg@!)D3Vș\3JeQQQ TΩė= WjQYkV. e]&l1ul]mERO+o""+GѦ? YZDq+ZN= tkAseAJl׃3rV^Rqul$)lSdV,&*K~m )é* ܽ1tMxuRlWS|V3Jhе5eFd MA͆NM:(@x&mrK2[? ɓjrb]M]a$(t߄ZL)4lcJ:WY̏iN:BI_W95A2"'jzdGI+Ѥt\1!l 4[D*$" bU!OzqZ' N%VG$?1 (5m^Ʒl}IaAnP O[a=̑΃ O$" ":H!Oq q_Jz7Hqr!A4:`F16plI^"7!l˚w0G/*}u o8xrE*S?Ayz,# %e9cU&Fю[asEClˆcc}d0)%B -Rr߈alLVU"Lb3";DUVKaVܔ(Ҕ)sӼ!/2 F' ;VQ| +X+rMa-X$35'qVn(TTۄg> R 6%?, VpD1r} +(D6V Es0RtmI{Na,:pڑ2؍KdyH0tBYuބQnj<My^&Ok/Yc|@THssۇm=g;K‚H_ydS#欛u[hZ[(3 ;H|fO$tqxm@k 6M $gQ~Y}#/G5%Drb tA8CYH62f-bT`c{2 f@ICuZSAv@9ncDBY n`,}7~#joc>Gg|:qpQQ}wP2xJLSXmߕgpe"eW _NR@2n"pMzDS`euE&DbLc@PQ7'7=O2@ktU&Jwr;Sa%3x"8H\fiY2B[5%#^%XA'""PzAZ'q+ (2K9e[R!%<82EE*S1/Ƃ1–%dY <"EFC) (쓊B(|iIf:+ \XqR'C {YE)Gf21 b}@rp#a$i>TruxX& %.c(C?u8#aA+2!!!"YevUDy wf'v؈wQ#&vw /8*r2!Gq9>+QiIi#56T>s(c߱]h4KCºpxsU46a_ړp5!>\]'X!]+C|%#(ψY5*V$Q#?%P2U^I&q6;rG$* {ErkC8+ؤx##5dp$:(9:ASH',٠_rQXIf^: 3Ƙ\*do>a!gry׶Q;jt*MP?]UZ P?DG2<ZG0Hop_dY?R3rWpMlQ桫#2Sv"#uX QR2#3Bbك2y5W [6C_1\zsk+R'|gQ% s )F+EYwGׇ$SUkJ*Gŋ ^Iۑ '}(;1UɏV$V\8v,7PD¡f|qO(5xS l!г]9oX-9{ 񲿂WFy7zi g6+Ė,4q #" < aɻ>׼lJV:#[$"P&'ؠN7AZi|ԡt@ԻÛ6Gp-ic+U#r&qPh6iAd~tfL۶)PM|W6ҙEvX 3qЅErEh]щuW;5t^Mb<:E !r{})釕⡝ q ݿl2HvH'J]atУN23RRض e 1D9@NU&RLcdQO:FA!S sQ q*~R}1 t_ji4Ho)"1S+C5s3SgAFVSBk`*hU˜lܡ3.-jS˨";z vjf}%xvAC̙UljyyiQT8_p[T\b5#!LwG<=M2A[(~aavp|7oM=3G#WuM &Wɵ9:19`If'P`"GE {$ %FKjhR?:#lIU^*R-*٪/d5E#-ljMZ4iAImz˪޲ ${+jEW&V[}Wki +Ǿ/)vKiX$WVU,R{訶[Idʤv^ʔ%RO56GizvԟGn2r"QǎiGx&-y/@.1~я@\'DqHRBl -Cn C;lηB+7j{Myܰy,O+Z\bۭFG)?6mC; XEӮ:AHт(ٌC*ig<$7oӍ; D6Ǒ"w=0C|I27)꠯78PFsZc誔إ!]D-X*( Pi6mX!*:4IE'XaJ+Fɓ6d ym7@P:Ӛ&$!vdE-ұOgItlq']J9bvZ^ha;Q}7 f$`iײ{lcn(LtDvlbc|$2vHw$մ(e K N(CORQf7yT&9j턣}jh'Rz"PugIN X4d$Cibdd!BMD !E %nrcUٺiWyMPdlIUab@! ,`PH*\ȰaA[ uV_,'_0*'1=cʜI͛8'(G?3dQ=ɴӧP bHzX+ Q'H"NJ]-cٕ%(ƮJݻ> /Ml.goM(VKLMS6e +{J~`ĝF=nki˰cnq@Q[(`I 'I=g+__qM0㨒әo^}z"y3_)6f76)b w f|;(h3 nIdF T& uxgxSr;ZL7P&tF OFY?Ѹ|,}dHV7PpuVAwT\H~G4T$RSOjZcRI=坱գI@u pTmTZurH A4@O;u)u 4hqM@5 nY[=$Jq=5(;5 q*?(Ph[E$IZ5(xG(UtP.bJ- D$^ Ah^fnd$)UG\"m&J=9Gρ3z:fȒ]zfY!A"[\+ESP^$A3(A)oD(-{'g֗=r.Ђ <[ Kz($!mUSepS7D]5HMt]tjF'!5"յo}7>2lV,d[ta;6uwg ZT/:8g^JR9] L$4oKte0#cf+?\&)| wSm]ݦ΋^)V|Ij׮7\[k\w,Ed# "狍2^C+IaUX|юXq'bQ.;#6m G+5Vq=?3ȦZ }! E("܈48*ā _Ճt1H"+I"~#9t,K0:S,BKn ޔĝfIb"G7tK6eU[0*@=>cS g YD7eeW=|HvQQx T%$JŵK2.!F&__qxN1:OY ]c#1,"r˱(}%ECy 4^@vUA:녅qB~/e ERKV`Tf$ص5vM$3b5 G[@ax&C*K1}qmwL!+V{rP!:;FI( 4R{VK|,V7!1$Q9Е~Q%e*AH#gW'8ySkHq$%&_BWP($B1X}M?+ŒTIcGkqy!R}lWfbcg!'^c 7t Yp&8Ĕdz QK)h%vrIjm?A B"6BaB gAEzOzf2ktAPAb2QDM1y'&^Fo8@\. iI)Dky5&qfW[i yA!^ 9B6Q(Wt1"Q ÞH"<Ճ6SW|r##_31E24A>" &zBBq"$H _2Fhgh.(a wH:ƒnXG8N1; zB:vԕG(K,|W$)>`wUXX1" G!~HTҖRYw7]e oS 7)A ri${2CFX!:;c#}zH(3#ƟN[Zv RXTaN)^ZTCTBsŽtkU5&vX8 \WYJ>T.; mσD%t:"y©ANlbNVn8HcP"JFSyHp&lXRrס*Y&&A4H *Q4AnsdbBzy!>_Q`V{9" @S'Fh&'@Tfut@AER~f4 7C#ر7p;br~+$Ây-x'cfg&4sע#)3$X]py!2Wy%`?wq9g\S2u;Cu!t1 qHMɴxB*15m'a`47R.rNMR{NSuKn9~3 %^1{Y:_0_!._A s)) gF\εұtnUEltJ)24:.3w(0Z:1%h:XQe'kpi2t `I^) F |3tBZg$::0&1hX`Q 1!RK u[k9~1oZ  7QK b+lh[YXڪiw'7@&"5QD-^ĘQDEԤiH\J-]\)^=-k0J0ܹaP-SRMZ(Rԇj䔥JGrVl؄(mR UToVX/\.<9V^ {Bܢ` o_ƍt84d۷_RC9@GAvZz[U˶Xmf9,SA:(Xph޻?x-È'Ts3'{aIw?( G$_]eܮ6$v832Hgȏ@ :T B[lCa! ͟Jqp\/( L[HhĔ"q-NH0H+zJd04Ґʯ2-VJ57Ԩ SS#ꡤȳ=2ˆH#M2!lѴFIP!"tIE|(8K,9ۂҾd!h"V 25'(CYo}{nɫMjz&vu*]ʴS,'JXQXC j׌$N&MuVӸZl-81ȧxːL"4J֫iGe{/¤|3k\3&{ hm@-Twa,5Dj.۸s7r@3jW4a kzY{q`Mjv5Npl- w:;/(J셬wKTO}D̅X_uVHF7&_.TlFYhLQ1}A&ێ @w='PXAw)S!OC@Y6}E4ߔRGMJ%A> %r 4 s> &qk(PzT-ӊo_0 K3u=wJew-FJ+|6V-㰓 CD@XC= =c)#q @=㴥ɞw% Տ. x֘򕚠iB?Xefia$%K,..@#AhϟShp]'jӂRL%ƴ[b%A?^Բe/~ IK*񴉑XNqzՌA8[NdR*K#`19@QE4Nj1qS Z=6bmSxdl YsRj]Æ6_"_qF7J],2Ws|cAkOGۚ`D8g@s j4lM}Ok&֑P_4I^Bd1H0dͶC;f{5/]5զ^edRi࠺ 4k#nZ+liǽH1 Q!] q p3zKQB)f{d}0XёCZF3Z*TւekӖ>ɊVV4b+  )gv`DtUя>8N- kY06R% nB LEYzLE0%y9dAca8yok#`2#4/X3?H@01oF)q6A['- M2mHI&LL -Z𸥅9s91J7O3*89rP=D_[19^R{%e&l CbiGx_q/(ZƄ!srLNGE`1e"?QA))//KJ,N ҕ$hZӌR(f6mL< ff6 tIO5'^NGR,iquc$TGn|Ύ(L4@V pRDN2Ft%R}ag> :Adj':"ufGkՑ;RzBZHhJbZ s$=Zַ3F~GMai+H[b 6+Ҽ MkEc% VI@͟Qu [[ю#ZդϼJVX-HAM(pEJUXkE9/'Foj,i(eXRd8-=ܚ-'k!Ŝ}eڃcR"}}|R^P܍) YU캻hK"[~3&v 15ȆI,k-$Ɩ DDU)ͨ&-VH~ c=:[)zT%7|`\7LS1ɑ`3 g$ٔ= u9& .<øj%Cn HqNT ߟqa[ XGF4휉mI%X-|/w{wxaŜUzAb&}LRSƻH ̽}1Q~ wZM"0mJ\-?RbrB{` Fc姛 #L\s^DjkqR/Os/۟YLhtb:Uj-3=UJv*~?=QU򨉶b+ &LdZA~|"w4{}C$BvC404=Y`]=[zkGyQ)p$)#ev Q zy{bPTN~'nL0~#& P0;w{QF9KqX/aG?ua3X2ls"!^2x3D>2+-y08U`6S(;*Zc'$#O׊҅\؊@ODO>vG%r I26ՈBtTc0 Ƈ Ǥ?Ͷ.5U(8tteJpDe! Z4 #pWa7'^$DAlKbUV sz7S1n&`:0~1*bZ% sy91Nsy5# xMr7%_qVh-s#yxg,AG7j2s$$'!jvSs7v]u.Y:%0p*di7(QUzN0uL :@yAU] QeTʁq` tC…3# wUzp @ x1st7uqo7uh MgFX5,"ECas a4.Ubv+{`mo\r YwV2Q/f6A X2Uriqљ!uTrӡ8'TS!>X 6 1kᡤP?e 0&pH!8r\9VF0C!-| H@~#1G (etOlY.ZEyt:i(O.PfѦm1lO# Ң-Ԭ,Jz#YQKm&[R'(\;rm/0o*Q%YЂ"- w2Eg"AF_ cB48Es1NTpj56'Q?ۅ5$E$D[uT19i a^X$-ّzrXǩC" £ ":8[!ƸLq6x(iGGKsb[_Y#;gJ%憋CIxy\"8)%wZ ȇԐb!U 4;Y92}op-yZ?)WJ[h!("WJQ<s</O#&bnOd%D%bn{9Z_O;uD4K+ė=$h8%P Wq'IӬZ"j qko GssV<{5d4hkE)=BEu'}GPmfLЯR<bj0 Rx/B =eh㐧d71ئm-B2 {A;WQ:k҉/N12J'\tp!dlz']${Qa%ցqD;uRDS\eZ`D'cb'M {V sFLZml8:E U46*SP@X8A}Hا L {oKUa53큾#F{J‚JL^-yRNBxSlU%L*PX5seAK%)PRoe 8 @[m&:)4_QSM6K=!du=h$aѧaa{#b",YpÜaj^Ýv. EVq&jl $փ5N]ݕh@LΚB?c적?&d}ƳPjnKt01B =cQD-^,C+jѠ?h i&"7SL 2h4,RA mYQ8I$ʅ&qĚU֘:5S,VMTIS+\ݾ« iúm٣0ڒr F,nؠ(%'ƜcL3_sנz2򺲖ziƝ`riuGg ~͸fOc) snĜy1m|d3H6 'D.hġHF7Q1oDDF$,"Mh8EsD9Ċ$tR`$ Ѐb̑&$6`S5 #eIP9 KDEpyktx~9|㼙ЏMZfbKFИH(8Pc+x!;#{ oRS]-Aꍫ :XrX:XdYP–6KdW;"v+LߴR}s[E * %IG1:ݍh ڄ+FyNDŽ7"{F R9(2 ԘzGT1'w8FPBP'5g3ä@rsMѮ3֐ćp:[2d,ɪR=E(hXAc4/4 UyS-"̝6Q v25iԘhdUVe)m^K}8N(S"D9""(8 N e(I<)yDl3A&d[9ALGvhyPu3;\ i[2h̚LVX,/4xú >3ήIDR-j! vnC3աr8g}Mej-ha9E&)gqbw}ƒ ➔݃o_ۥ NhFCR&ϐ·LK(pvBRmt~-HbPla΍YѢl]7$M\9̡jI k{Ήd|- iR Z_9w;*m$;f4#fd@Rha=~tB^=im-zZm v9v`&93b680~winrߊw}:!(H#5VT9#x#7sJa&'| Ca,W\-4@AsQ-pE1xlc,Kjd_%3!\peFOg`w*R7T{4d6AT=v{HWD"A5dkb PHЅ_*|D`#vdRP<B*P*&0CU _5'jpaHNb,8,ӂ)+RNPa.5WZZ 7eס7bMǔ4q1wxNŀ9ȗ@mԣh\S?l"Ȋqp?EFQ:|1BQhCYQ% 3VX$mZ_%swAp[B\S73!RcxNW6R'#<]SY>(S!f7bRvTq86Y'X%\Zb 7-3e&?R}$'Dxr(2 6N?Rc^Aw8='A~#f\rw5(⸐IjD%Ay߱r*yXU3Ix5wr%$iG?=a_OB9~"gw?uXZs)4& bx:Cy ē !""yU8)|눆]\3}yf/ng >!ePKxh./d $1q c b[$Hzb&Z|f ! 5UUtqbiS[> @hVd,wK #Ԓ5)˜ZӤۦmS5!] ְ4T]B#{ h1QA㥙19A[299a426R"\a.HfDlaC~yVcVR9g4h絘"grJ\TVv^+ v:ȓo7;c H3rBTA 5 d5+DyF*7BG'wrKyW7$H-) /hֳU6# ؕ8y{AmT[߂ sacXWg04#k^rTZ0j%Z Wz-냧jz7j&op{!G$/fs\C5!AZ i aq(ui_]1ϥ~BUaFˣu=v'[y%znD]5n;hH*ɥ ΁W6ᱬ^ ^NM!鳆^f^!>Lfe+ysvpFJ<I#ĺBBQPz+?p u%yx *kxF39dT%c|@X?[Ov!cBb=)qµy xUDZpz)DsZUL䠈eWv5,#Lwx/doa8lk&i(Xd\DduYA)(m!t,:zJA2%rܕM:@))|sWmU$kh\ 2eZ2/{I6Ziar&ȾjN baC @ *CDּ')1䇜m*-f ??#HUwX3A9u.4&dhȗ=~QtjaD hyƔ\yRDh \؎h/lcP.̣ '>8W9z(&*Aܓ9'cd+9'oKah^X`\3M"BgCnXc#7Gi?9XcaWYQ8c%Wb6 I (ǔ *  A~Q'aǿ# *n]DžvK^&7*wm,AB(AE®h/ӄSЁ51~0k V%HɈyLȺZ%uðP?<0*729*CYw;6zڲ>7 rQ'*¿eFiZ47*PjkBImS, tJah2gFGA#yO<*Aw1 d@ p+WG0,q4uʖ,2-[YG ٖJ2pPhM*keR [ƪrr&ʛr 'm2-!odJYjTpuM-1W,4֙jqʉO2Ȋ1$boޞ_HmQ#| k[1[̑_""/j0}fyLwyџ" bdyFѮb6OjI/T@-|G.MZ/g;O&4iO _ >QD-^(WF=~b (RJ-)ZӡH칄x F"u 鏝$d҄LM>eJh>WoQ ԴuXdFlγiP!LRDPAX0ū#k7A#ʎ2, ̔i[$F姫#xbUSͅ<- \Rz]f͝?hƞ7) ];Ժ莩f{Q]X;o]ׯ܈TiavqQ6H:b|4 m&<$0Dʊ6 +, "jZ^+2fMD3iz,/z:Kɶ!ȧ{Dhp<*說(s?Jj GZ! [JsK$33/KRȲ$wF" L,&DT$62H Ԣj"4Պ~CU4*݊3X+[| l~}asK~şۏvA-"0# F'[oXQ! ,`PHu #J4 [c7J(qPQCH; (Q4ג(MĵIC{ !NJѣH(S4m)&ID&dZNV5 SY]˶-є(u{0e_R#ku N-".0H  ԢiV%JL2R!EЬOF_M,^=)KP,l=kjERhF "֔E`&-Нț`iBV`i3bszxUW+3*O(|]BSIj-H=(rV@6WDw$V^Avra7Pw fhY1T␒EDZsw~XA%ٓ@AiPe[P|U4f{XcZdcOw=9c% [\_*Q[2W}v 7h"d*5O%*YJ#1$=. س\d)Ij=c@ɭ#y{MdN6R6YO-ԃ#WK?͒dպPzP#NdY_UOJ/jC؟"TlnWFӀtJYOT %@qԝeQM@]TavFɺr0A9/Aq'jO2Zܾ@,h-(Rٴ]]&i4E]4tS})dEFG*,8uDF(i(D=sQ :$T&I,]oqPxYQ>qBqy k?ЂqayW?PRMW޿'AR= MiS\~5eQ#=1Rnr9alD&1E`t&)T`;)I8NHU 'ib˲' gX D!̓bH8a>LZINhZF$~)/}I^6}vskK-3Z`8>L3oEސǹ0>s)%\VO8b0M$xD\A(.lBY#P2,YE)p>qWH!ZB8HX%V ^r%DR>xLH~ C(*V{HJ1ˆƱQU:q aMrEg-;k /yVB6?v(IVm>\Jx5:v?r77X&KMܓ|jC(Ëa4lz$9IGh#Rd,fҘCƝ =ĕIju'|Q>&c|a TV!~t7ICdQ+i1YfED'!K=f[a[R~%Uj5ڡDJ07JCJӉQj2;΁@^0bCeJ4g  Q@A<>I6to7o_6H# yB4s S@ >DU$yd?7[s{naQP 6Ӟ0 df0(Ԏ3EqL}C1lW%d`2IT"DM:ip[p^fBUi""^O64Db5mHxH" Zq# Dl,p9L1#,>7 h^AI8zdg9(vXq%#0 c jc3^A1%Y5}(ċ]*o3FΡ\$Z53`0)1JvY[b6["`zҸ1L %ܩ:tU2ejGBT FʊU2HċL{ a )_!^2m"6 Hoj)~Kr{9dR0z@Jț9n0E";dN#g w67#\GϡFg%B 1Z&W܋O\h~iN2[ū%B,K {S>j|##bL/X&/KBWTR4>,)=;1J-(԰fxQ w&H`CX!!Ue)x9-tK(8Q@a ;!0#^ "רM")L}~ Qp197&$z\g7.+7B% ?zBrBD1%@g%%*aFa 5ҒWh-%"d%|T@,Z78"="C(}y'4`<:DDZ>eCXJ1 X@\k  1|i axT%[]_t3´Y@f'Cl'qNӁG qH% nd$^1eWt'`*qSyEs=I"&Yw&`Q!j\=9fQKwM9 b ׮9^DZ:#HXk}uI4` S' 'S'1 5fE晪n]JLsb\ŠaEvăȪ'sN"IKxiڎls#Z'C`HxojG;,FձiRNU@-e<uQw>SG !$|꡼vŨۅf%i!q4S FRgXB.f>c7_)_{^e7jOQ[\yU 06VQ"4I( #&7Pw*AH5#2MsD-L#*/!rk܍˔ +/;sh%ĎN42&T'B~}2QqwKǛȖ{?'D"b&x1@-#~Ds4NG,AwdU"1n5e~=-?9XڳOQ_"$7d_~1`xRgڿUM;B^OvYy8D 31@@ DPB Ѡ-^ĘQFjŮU=(rDRJ-]N4miWK=޲/EWf&L5iaWRQUVUe-TsTZ͞E`Yբ%xr Q[嵦@MYfu`Dj=͒-g8f=C"bK0z/{?EE6z}%1V厶'Yw&^ԣ[-PӦӽ_sڳIkx]|iײ72+oJHϠ{ =$Ӥʪ/„ $NaQXaG 0Ăi:mRP3BBo<ͫMjL?zZFʟb.LZl49 J{VtGDð$*zc"r $";Ѿ3OrBA$f4D"HT HL4=K j< @bցԁp+HW[J-˫C 6 *ԁ$"H (N皭 H,vHiܙF3Rezɐ{l-}ŗ>4Ex{{Hq*aSj { 7M{f=[ٵkd'-9gL:67dNx t`wrY18"аŠva{5Q:oI*֕%ȟMɚ0mƊ;1-hR;oRW6pŹ{65!yE\M#1zsSZ057f;vw|n|=j5x㏏3gN//N ! ,`@H*\Ȱ#JHŋ3jqǏ CI$[&S\ɲ˗0cʜḮn(14ѣ )KRN, )vhy%mF=3B:niNzR`9}@Ot] FN(#mqZj#8}푈^/8)A!$__itW=Wۈ*GH'@G~CVVdZ+ ܔ?iMk}2 &xRD0!Xa0Bj6xU3ĴI aE-TAbGT$Hi )(J="t;&)3U)7`DHP0S[jEP%[hkWر T[4Ὁ;;w&&M I zgO>|IPqSخȎO=V,(+[f7bŝu'Qm%Sãyl)~< g 9 aS (xUOT' ZMFVoLBs $ )ZdxN;2)A0ۜXY(}DbrIOV߷Bz,nAI4(? XUi2Q\HʖxRl:Bl(漷84)*$ah::pZ9 \a6]H49k PV@=Ww`ǯ_$֚>Ԕjă8ԩ'D<q$?ڱ܃HbZ|T'VkCV؏1 홎?I1gJ-<5'WpDv1qMsTBqyrx7,bVMu-!Ea5ds{}spA\3Q6Qa{b7}-2{F2d) VDEvdWd#W1NbL!{(y]q^ NPlDv:j >`BR{[q)|() eFKz T %T%AZ&PEqJmQG;QIu⫽I/])ҋĴS! ,`@H*\ȰÇ Hŋ3jȱǏ C\`ɑ(S\ɲ˗0cʜIMnܙ2L[< Jѣ'"]ʴӧOyUJP%(ׯ;4@!f%Y[UaZ KUz يUz$@S5 &4wVɌER]TTe@}F8uwQt,P4B N0@yNz÷YBHG !r⚷#d=Ih9A$"tYMhP8Pb.y%Bct=V%Gag)RXYvZ(kdJi"ij% rRgE&$EH"cq*:=TZ]wgVۧ8vRޙleL @ %iB%fED^Dև=|=%umJбڶM>uD:cZ@ 꾾vWʑK8 Q H֪EPjlݙذ IۣmwuR ;(fZZD>l&kTX1 u2%=XU}Y@[wGQ" tWW2&}b;_&jc-K3*G) $1ޛW(j"x_w& |du93%LСmNQɵB H ;}&o!(&ۊƂV,z iP E d{?;ܣ>8ۋOP#=&-mH RIpw0xPD9*.hEhG *K4C0'6l!q4#@Y!L) EA8:WRuD,b#QFq&*Gbϥ*i^KSqc6D/Hx7p( r`֮V&NR.dJIχwl&;wS"\FJ1ģy,:6I=X,~l'O #g&đ,5Tv}o}LJnQpd!G`)DWGg𹰂Kc(UvLr4J}s~r|}z&70 [-k^S ^M= 'O4%K<T RZiScׯbă?ARے=Xn*$Ivb  s|"2x"=HW'*QYGl!VA6񿍴v ڠD c99JD \/U!up9)% _<koaXmU5"EPJlOGiB׿9ʊkբǢ0 o!;W{?RC/\v`z(1WV 96Hߍ7P Y qL~R`[gaCyWF$a'j#i7QC+ S%AXa˫2&EM&R ddG+fXӦ[ ɣG2 }pg !ȥ3\Z0bBևؖAЙ3[8mUwr+!vnlP?"{&ǯʹ789(J~a.GE}+YSU!T{朮t7Eµvˤ%L r,WS!) Tn^ D0gI7"(JyCq;!E9L'HZXYh.Zў')Q4SLmpY6B~EsEt. :3oR1QF{Ԯ6 3u)!d 9ekY C?ĢcKn艄n)i1K(NmB7IL+7epj^ b/9jiɐ@ ;[ԩ=Rџk` Ԥ9l[z fM@-ǝF>VWZcQv $ JWI*Pe@Y 4=k݆u]mf=@dH(9א&)*$ KՐrOkg?h9EbCͷEEG@_"P=IeoZR9SUJ>Eb6٥e w9(fm(})P>aV@P=? XFi 4bY EAWHV8&3ʫ"zCpDa"9=팡 ~cqO+hQ&Db=4if;T6o"] )اtGBt=Ѳ(h $˩qcY o@6.I"fK*P;gֲK"I![jL0Bazlf/Ox%p Gh 9ޣ[lYT MtLPl]G'T(Im)rKP+Y&l}/?d,PE[Qǚy#/-@uP\R:Įow e'%L㏷z2[|&1TkK=yΨ?FwGW%kᄡBZ2 esᄒz l !#IMPq$4EI1"](D#j~S.qIU LN}I+(Z6u<`ĖBOr"Rj1 ṘaiXZG+FAƾx;+1&h+,cXE=Vc& G21t|EK$@4#OHd{zUx 倰8GI.ml[} ڐHVbt2RyDie2:,-Di=BL'1P2GO8*@a0 $qeǔC j? =jUA@YQBh:x(P̥@ER(q@'Ǥh!2%*H깇z &J*f&Ld:i5KWި P bLq_jI=Q*iŎR-l )(#|,)sFL E%&m(XmmGsEd'h vP\*!$ S=3Y0]kӁJ =539H 媣PR{ʴGuDp"w8Q1IX{06`7e ]7" $wbZRSXI*rF]LbK$NKMRrJMH bǾ*:8lM`SZ'tuՕא bVtg1wdvd>bQq<52Tk< &3z+=i4%M̶>(BWFN:d;Bw P][! Pk:%SY1{e!o+m EM"wgUv'C2(2 !&/ P*6" NQWL10pzZ5dJTSb"$N[`T DбV4kSuCHo, .LXV)*gr$)NWv%*tpSC=gˣ"$16(7B 63E`x`x6AP,nBQh6;e^Rxh4Saa0єQblAT8;G&Q&wj!!%H"$U_u9&r=|xVXh7wZ[ h*1D5V_sKs:u>)nMGLp,t(q'(p,~P0W5>reVfr{A570r!>bqSC}i>e-y YKQ*~*e46im٫J!^EQ1"uUǏsW$}*2^@%BH)8X$s6Pe#SO qyyA WCq*23yA:]ك>_h*_*q*JU)#7SS4hʤJoO'QW1\UHg 1$:&rc*򙌾V0t=,~siju֞A/CeuUkV!:24BrҲDua9+3aQkb$a;U')!ic5XJwVڶ`f2P`{3S*u%4R(HI 쐉6|Nl50j!|PdNQ~jO  v9$,Ø (ф::OZ8a5 SI8@5jDU2`{qdU>[|.AyWdtYs=j( F<-D ^+&N!޽5"uL/dnG˦V'4y=,~NNK1a>C b `9*H: P!<X_X;mjKgM rN1.(-32.arXXJ~SLP!aO W ><~!n"HQp*&_d+f&9ox E $_yp/_R >zA/ᵓAW o dlT/@! rPd̊=i^Qs|Z,3sq|q{H.p!in8KOernGr1GsiWOMI1@  ޲Y9H! ,`HH*\ȰÇڊHŋ3jXǏ C9ʼn& <˗0cʜI͛8sG?{ JTaK-MXSԧX2-x {] `=F%U=&Bx`qčZgO ;7V]f2[ zX؄0&Q}.24]εP@[Е`恙3g գ]mWR&ML M\qm(ȖiwZeyYТ84{wwzLZf|7a.%=&d Y/ik~(P;U ܚN7x-4*&?1ߣ7RVU(R][WmZcH9!)4JiϯI^O=hŽvGٲhε( l6T-z\vjґU{IYҮ@zrnΥ9R45{l hZOcrE/pv^=ԕGUNJRlugfxBԝ1B0A co m;RjŌzOj%v YA6c7n2Il@jmA|uBԖYAg?=V\}w]=U:ٶL PӰ6I]nnP, m~3Vm$c7~ tպwn) 9^=-)DUO}PZ|v _₺I58n~jfoxGUm5N3$wLeG-"UDA+6-lbzsJGA^h[A@-Y]q|] BڋDZZ#.+mSD+AA,gpKW`̉YY?@hC K~h5 ~6!9tG2e =B SMDf0oSr! FBRq =I @ܒH-P(p{" =B+"Yɩ""u7Lw8VyD;KmዠlŒl:)#T4=q8 r)y(KBm&O#}uF'ZcrQfE(&QȈ;-[E ^ebD@|(FxlA :pz4Av db9[Mx;x VHQX aRq-s[>*;%UyĒ[أ`PZ#:)e.sr`fG-:7R+}/BBm%sJf s2ĹG"MWEh5mfJkv |\d a^I"ɠVy[fs!򛓻hy݆2A0 s.^sV&ܼ%P[td /d3O%hluff?-*]-*S&釘JW^b!(}<6Afg-(^FxE$;~2-hI"LUP{VSo_KJh GH05LUGiW/Dm4#m=. dAj]J>PKQ32}WJ݁| Ï;v-pt& /A8&7x[W Rw=]X#Vf >ZxfY|tngT*Ҏ2# R^/{#[9bv(^$Ip`) W^-b33FA Rh>.(? R.Zj hmTbchp76&a 34CPQMxao!QUV$PҁdFSEDZN[{.fc`ZmXBT=c1I=aZVCbG=ΑS "bc`3yIcP%nN;hbw8Q`ȇ5u4OqsyuQTb<1ba}bh焳v6"Łwx_=fx3 x8")XAR+MH24seZ5%A3z|P&G<,F'M[qEv5OU-lh)"/ylFAg;V=١lP[>{FUx-(_acPvB3U'"G" PeK!M̴f"B)qy, SH6-sZјp@ d~EAAO'a0 ߗkN1sUI ,f'x)~N^APzTD 4 V@B%#B(bzdzx0օqVYH8`9q@)[%bMD!1P|dO@Oi6!,N qgy{3-AzvXCzB#Ł F\_1 ^ǑpGzygQN Q1W\vS"o=PgGKx^A+7C8/Lq1SɛZ >u4x)ű WrAa82$69Ir[ؗY>0H%H[Pۨt(1VВtd6QF\GhZW5!Bcdщa7)*H>=jK5W6EJT =0:j4S!>%]R+Ï Yt4ޖ``kq@Dˑ`#1xC@B7bWq'" 0XhWBgCV&"0['u[\=8Vۓe8!P"vȆ4}JE$F=Bvw H LIV2Oe#tbyAN j/ !+4Q-GR) "iuh=A)6Y{|Q!z{%d[t;URҵB;ϊfEDl󻇊jZB Fo>N\p͠A׀ߩɶ~Le¾}8YcѭB .<Xhmᓺ 8Xo7._ee'~۶Wr Atw=}U0ƃE.{-Z T38ᦂd+#*Ւ>{5 چq$\-?˱k 11L%\<} Qo(]]:%ecidtwKnӃÄx2j RPy4<y avqDVo77/Yn% "Bs~{koTr Ϛ'o q$к$N}+ !ߛ (:{+!0aD8J$ϾIA!QWO=  DPB >QD-^ĘQF=~_!MDR+]@o(H=Q! ,`PHWA[AŃc5;{|Pȁ ȪH{8jwjȳϟ@ JЅ6iIV(-KUK`&6k8PjѳhӪH_ͅd!5!Cf;ط)*0@-_ Е]JL2Ok:(*k ja `si_%ifw:xT2őrth+(Ě '5}~MQTR.Q;?pQQ bξ={fI]?? &MX_A-T&hEXـ()W+4gm SUh"eeFjNv1EvF=dS!ja:TS(dO-ukRe$- mAfճAP&L\dlq Dae݅&!9 A!S|Y p9s][J5T;devAzwA)\87VIcR6]~4j1 DnB=f(:x  GAl5;xA( WO-lU,]lC(e#:8f?zN-Zsb>سdbw]rI.kݖ?ڮ5At4Jr6?F*c}Y"IpE1B},Fѯ<$ij 4iNuc:T&\;^.vҗykaVWtO[n:V;hZd_5=\L7svo&]LȐ9]7ԏۥY;h&M,zQ%yo=PȎ:Zg9@XG I$ : w{ԻıioGvrG5cSj tB"S|NI)J&uKElk*&Og`7{|NU-I =}/z&-6hXrlsE+Tuvtu" &mINT)|o!jz$^ɓʂmE&Ȁ0>H }kePur\v^ ?ď[p)$[Zӭ5Dz}Ck)ݯ!)YR4!E{&-:_]^Oҭ  ǬH$Ek譑iolwr ~5q'/!gV=y2^Q-̞*{\T-lT!,.m boA2x{!W \hڀhŲ">}i1Af [û  ֢&܃rqˏca&|3u汁L!ټ:{˯-LvRRqیd革Z[PE;ZgeiE+Rd8Ɋ"C Hz*+!@?9]= .f6"ˮ,O ߝ"Gu)`B.R3<у\ a(eqnC4h6DIdari[r"SFRh:Vv!ʔ! α%Qv/ᔁNs]AoAy @;Bk:4&d>"T t)jaф6(PP46,FH!nX]˅?u fs(H/`(a#Eh0=7Er1:[G8 C c e"W[P<רc' X1 Ђ 7?7 1y,bC 4Y0dq*J: !;W}aX "3_9 pAh-8jY;Y2\ w ULco 3WHF.&95hgDA U[5cr&T;hB"wquN5hAy#d51a= RKYfHҤsvyiG {I, ]І+,I W&"hPر!JԊ˃9qi36P9 >S4 O[e1KcZGp1zӁ!PWJ$RR"AG1@hI3L'Y'VQi%Yfyax -JB ǡ/0Q a|)\2 \G =!W5eu %ZsV#*Z>0K72h6v"N 8' `7$IA~Ѵ>epLJ LQ[ӡ*P(zYdqCm`r;.%EóŠ8%`C;dWe#8#O`uAC& !/G3IM6+*}"D!J%A;y:9KnH;>8H>28;⦳88Jmpc4u=Zwafc!+Ipob5z'$X\o@b HCF !cQ{dz:C+q…T13_wF\8LDo w3ARtR`X[}ob#c8g Q R':#jLÌ[tPe]gi;4nA DCͳZpQG0Ƥ ,Kh ʑ5;S8lJLd!c9Osv2%lkZ4 iParjt:7j1rwUx2uI27X6X/Ixj0Yp# 18[9 U;(J }oK}Z}3,/4~bRa$Eg'X{8)K֊flF A(f\.(\q!,l? 1ԗIHe%N71R9KU;!: )BwD4xYh|) -&H_\PV{#|UW hZK1\ "%w۶!z#A͗Qka)/'z5 Ǫ bp@R!]\c k'p#pgd[ۡ…#E -&h87[,{E 3I:(o4z7c%MYm -%Lu$R18a 纗]dFqq,kqi&<xL&c.O1PS" 3Ή-A۝l.6 ^!e~u.xm@AAĭ1̈́l.F^0&wb?&i,3*'AG=0 84wMan|(]M]I kj4raK6YSǞI2ӎTۈ(~#(c#5㎆Ѷ2^~87Px:᜛Qm1k^#= 8psMC'A6#+u?xWmG+_5VN[?Qes#n1$oСi@<S <9x]^=1kK;2-֩pW͗\n:쒊Jhfplh+ bFaH7z',9͛8sɳ'" @)( -(DXj1=^E<gnxb˷'P- V%FMX(ZJ.#l"xqgӋղװqFF9KƘ>[?.1{,)xZ恅5 4"`Y6(2ؐi&a-VVgk+WBgp- %x7u~mI!HĎ@(SiQoafՉ VwTP\֎B@Ҩ}CB5Eg%A0U5 XKI#+:Gބ;|=Êsfp9+^9K`HvHPD/٣al2^_ Hr|4Qia p]xC5JkStXYE$\0+ml@ٳ&C3E4S};Wi:N-#Dʒk C=Ko miP%\k{A+P}c*A`2oB^tmS5GB^D gՕ ٭^Е!Y9EҐqw cHKaX k)bn⦨ac({cbE46.9? `Jl_XŐDN,YmiXyB;MC9lnTPL?%BKl +y"gLG &F %8n46P5݃28(FG5K(_EiY_RCI"`ltp// FB]4af7HSTvȕB'K莞:kF'(쁖5ÙAC\L1!YvMy;Ҫ~S;٥5"a7) \Li!uUF2 0 d Նzdo,$"16"%0iI$HQ$z )t ]'p[hd+TkZHz*$OH =py-#k#"q6 ?VQ+6$"*1CX2YH1qR˙EeM H1\ɗILܳ?^&CXEX\KCɺxχ ҆NBND$C8 -Vȉ"A#"ֺb'4~52ر4=cqamb7@~i\&d֊WM;".ycBҀ]].G'JqIGa&rh+LZ)2u"$)lÚz3(J F0$zzZ %(g8zrD [$rCzM$„ز0'OZ #ٙ6'MZ83|>%ڕ3b]IWf[NV,Hd ;c* =7/tHo iY~T$Q!iA420@ sor]8B 25#HJ=cTMb.H-cx&̌(E~:8'k<;3C5q2僪bL9 .ܒpspAΗnL:pHA!Ze\ysO$ `::FhOEqRh8y[LW?Vs+ xs18bDM2*JIBwӌީlw~PG,rQEܷ%,ע6*FG?VmCJ ѕODZќFUS5CnYK!'V*EH&'d= &5 &櫐㨉̲yx{-U'-Hc d$J6FXa1(Pi0-䖺[V/&^$uaϑL&b۴8KKOAEw)t"t.!G ]9Hfzh# FesQq"hY*{+|2FQ{d$AC~! `C*E/HXQ_nSHwy)pOQYv$.,#a 1lqBuZus"7eCp>$K5Wsrh1.$D%q8d$+6ev6&C>DZgDR(uWVA#sySp'f!XlQAaP dp("9U6Wv[oxGPFB[U6EOƁ K*'OXdbьXW+ v e㔍 !2X=7)D9of2/" Xۅ"DuAIxGGS0MD %ggqh328s؋(i,tsgJNL8I2 0 )|13A?1}(R1QP1*YPEGl+$7d0*^G8{fF6/rh3!!•yWr'UaA#IE`$1@SX+qՔbcL5d!r}8h:Az`8væ$ D>s "b% 7I'tI\6A ="ZRf&*rm{`q16'씏K'H QT6O%\R\(EU!B?fXBEx8է|2ŷ!-xW^4.Rp IA$BwSJ?N|cm+b#imTdmrXL2~-t`alTE'i ҫ%gs(WE|, W`+@ )&=RE& v㟜#8g4EB4bТ A/ } wlqIKw]g6tݺQCd4 {1k+ šAw!uFO51Y֗X@C  A4XJ{2NQ5c41VQF X2bFᬿz*@:R_ uR &/>)xp&%1q"+₡vk枌BC_D &:|k|5*tEU([ b4脛';VI xsli;DR;Hk+9v*ċqbk[+ʼл1 liѻ0$+mǽcWٷf_릶򻽈cNgZ$g(9OӦּ8왇 z Ry ;60ke6,l4B13lh;;w2|X\w7Ac4]$D0SUDV;_O+teP+)3{91Ctfvk<Jı4|e=QNjl f8 EGLǜ껹s 7zA;S3q!իyGݻ{?ٺ@Q^y+T&tV)tC&p 'as28ŗih6H,XP4RGJFA! 'P)8b%nt}{ R*T<^eoQe6 ߍW4%DQ"eB]Yh+~W EUD֛|Jle&& f|()jV'mrP 1dցuiZ@ bqD(i*maOU9 X UD x֭)K8:cKtt$u[MdOHFfk꠷E5J!t? IDJ8Q=IKZ.%REHhO?iDw}/4QZXꜸ!9>̦)z[fwҩPZbr\)=у]Za-͐Q?6?zqkUh2h%GzA:qot@m됁܁kdܡ %Duhu+#I5SH{f4Aߨ0"9RʛA|ٷPe)Pa_=pC_n#֍6MWo$1[$JMPG}_ٺA;%yz&YK%@s M_;p婩L Cio ѧ% FwbN$` ft [e`T]DGZA:%[DhsR&$ ~ gq$%KAqk?I"jmeQ&[:'42-,Tz:s5+Cf0su=Hc C԰!JfqS(iYo UK1\(f4iJ%,B f2W9ːڔ[4ZDvɒvn;/2!K9͗D1ʛTl;"+g|&SawLwBʳ6r Y@j_C6_i܅fş}J3=RngDqb< B#lquf&A2bZt,:#Qw }i a" ~RBAמyby(PhjYM!t[ bv$誩:T2A5V2siLXAnz^0˫Ce u)[z4IG[ǀ+%J"J;.edI@АMgAFq64mmk[7*`vlG:piadW5⪸t2+/eB|N]PJT:>ْt\@)%MLb A̧^AVG$[;:܅@'. edႸ{XD?0fM#=Cm .&⏠ z_jCl v]HC=HEoLM?P;3ew^.yR2!\\a* ZiZ$$  KHIRפh^E,hA9/Y>계WEύz :}Tj,I]¶0}u:ty䡻7mO qj5 H%;yc`yl2dV9 xY(aVEL#H=ffgA3zn14haayp f~H@Yy\ZLV%xgZI n LJ}#icuK!Y蓁+H2E< r=nva,9Vx|1tx(eqk78:2ss@4^*Q(z&/{w" BHց@b[T>"gB@`x-z 5+%Q cMu $jAQv.-ABwssX9Ugwt17|CH*n|QW'>koeжhBgIŢyݑ6'Av$|6c2{n,!p ^ыɐwXguo rY1 Yg_mw?fW9Eb.ɒDиuy꧓[gW9) ~'d3ՈRI)ANw!Z+␗faD;iY5rdyfu^tMw1y J= /_fщWA /UGLg3_D s-q΁}EH-+y Ԕɓa{fBrq8!mH&Iᗼc9U×1s*v(ԉE+vRS-蝞b 1 4pA,eaI)6#o">giw{Jw}j1 4CGkDRȡVD!7rhO Q$Y* 1=z8tbE󩣽э>Z: &p! ,`PH[~ (П‹ї7ËHZjG!t1͛8sܩdD;%hkZRK&F M$jʵA_jK`*NM" Cx{ӧBZLPÈx7qEtlFMl<^Q`5F\oDqCdy/l.Fgb"~@eRz6wx.ޔbj1ʜeVJ=$b&Be!^)Ȗ}ALOK,tx0hI8Fw>YUQ.UTR&U?tw%sIɚA<4HqJwgl W gK[{@d4" Bҡ!i+aAGY\X TAHhQdN__ N5Yht{|8 vBcp]ۡ ӝL [ xjw# a reDOYJ9N^eB2h7d'{@\Ɗ`>:pG Ű=5ug +bF5jp\\x YYǀ(WR6/fOX7VуYd(S@HAtd:F t# J9tz I$pQ#%E8IUt(-F 鞭 lC$iėjG;dk΢ӛaIhiAnԣRysW(0V 2g>7ROT|d8#YI:)&Ӹ6@v[ fByID5×D 5Rۢxw8@9Vg\ #FQɱ-eBh k&6H2͑bL͗tkT{BXB_UlG"WKm~rGqTjx[WVn=;umMsktV u%T%v/$(k4A qN+iAcj΃n{kh~02<#+@]O847)5,_DdLp^^ La.[m8SB^76ґ:YVC%0ٯ@0\c>DM+oeJUEZQ`rf +uʔGdZVfI=jAֲ7k&;e*@%MxeBl%dHafYj3񔘉oYer^ xvd'Qg#UŘn,ț10/د3"v@ְpF[!F:1f3r8W~ . wWě흀RTryl~;!X 'HD662&24102 CS|OFPtM\WJM قG|R! YJAl#l0M|*@q AR1^Zr/X< Y`E~` Ǚ%[)H /w,E^|voe,3pm\޴;Gt1M ؗ nNZݰ͠8P/=lXUV SXS"aE1l4iʌ(Zb@j,ɎAŨ VH%>,>A -[br/+of)M=us#[lO80dF | u]NsW"נ,bvfVM4!&W%qBIE`rs43J\Vnf!I!0u9b0_$"$3_w-GCXqAyToQPl'}΄s}x9 @RYB2qq34BkRWC9!JXh7J1]GR|wLN*K6Wm&;4L3`$ 7?&*zs1!* -qr1$b8q}Q)"VRs41{$zRZ7+`me:FDl4T-!&0c 'W[vh"[C y@gVScVT1MA/;Psڸ8"[1A`-Wtlq!( tWQjkXFFrh0(b0C0kthl_>T2a'B4).Uvvbrbc!!^U=vvx8$E7tL҄]1MEY逻8x3qaU2,5wq5J rx!a2Yr1:B@Fwᔊ8W poeN 5%/Yf?ZP @d 0EeR]q)ifdmRapHh6&V$"1#ni0or3';Ɖsm{61!UK:[4R@9G!h#i @X%*ِvA5!O0A"'x8)c6QOS~KᥟG#,MLr\Js<  rxQ@DJBy1b5nS=)E0 ߕi3e} њc;$w@q6*C&._yh RØ5Bs/![t5@_3 isUw,99 a* ]f/ T,Z)ABϡcv3Hb"]-;X8WYX>r 6DȝIG~9":Sj#Ť,vbVv9!}_b' f: 65":N_uJ7GAxDIBb$P2d#(" /6%A׃ T{ٺN|N"u"iQ3;mDSx\v2)꺖; u#Kj\4{[㱫0cjp뻿^B(r"/auVU&FA4fz$:8(; Fh&) WvYR5<8!L;I7^J8L r@$KJͲb9.ֶQlN26ܸ'$%x(ih|H&ojqxppd߿Ӷ-`UxGI⁵K,yd[i^vsg+\-cV(, q{^XT=+OB |sn.6VBZ:9{ȗ_/%ǛI7֭Վ7[}o͵AMR-6P&ֵVMUx[rգB=[ @M7M?8Mf5Mk\&4B߃X/<l*&SC=v EN(_C$\FDPu#3Fa3ui/=aT5 ;hs:ѹ\+6ktHhSR# t=H*T_X HT8x%/!ms Wg]m݃djٺhdy%Z%+ONJ[+e ^kREtUhRcAk[#59eY.Dm={ҖV谸S&!y|PA&)gMdT,"[e=k.,.{cPWvO kDͪ{\bZB3jB_x@AO QkA\гB=q{)Y2Kм1&bQRE0ZyiP8DmIGA'v-jKROs0fs pAcyt E?F.Y&hAHjd=`"!+PBxXPH!W}ukӊ=@;j((P6lo&8h:㨈4C"RBSȷDt*!mpE6@3 #&LC;TA Kw :HxA~4>aID6J~u-6O,H-T->t@JV'X HHhJ!̣n*B9ElBPS7h'"A!{hֲ< $ yJ;<c B)!B#^& <6da,R=&bl (E>Z(Rx'Se{N.f 3d ץ.(ȹĚL"i5"B rd -xH+mIP<ɠNjA$DWWdF,n$]!]B ii[M.r&!s!!OA1 1BJUU2@3V^X+ƀZ^@@v ]k&$4rd(BCIK(ҊZ9p򼻢OXW 5{dO 7f#˄ JHX٦4)'iHzL|R'[HoDir1MA{PYfZPqꡓOJ˘j[ Eu`W@2(njK0TE.\j`Tk/Bi9i՜lɼhCf-^%cT[,vԸfiMGLíPHq b@e2sRiTd:Rd3PT ,ZuY3q]BpJDZu~ WJJV-^/5 `$em|$B)UHg5Cu;:l%agR+Of"Bbgc#-3gpi=Ӛ񮴦yρIJC~#љ=l&C,e$H;H-4tʞLƬ04st+RLF QW D&=NuOKZp7Ω=D(gZaևI&`ҥ&w|ڔ9/z-u/y2J¸ɩzУf1&?ʙ2!q j=̄E);R:7ӈNUI.3ƋxL09H+qFlOɭ (^//m$IlB8Ÿ(Gz  d򻙙~! Ҽqd0&Kh^RO"$oK!nXvD: 2nyA",-ш li"[j[0(jo Xeh-etW:-$adOZs2,bdPѣ"zB#10QdL>qT7AHauc '*'$t|U%hMX"r3~88p񆛡kah}5DB#ns#efuH".GT_'dAi\}(Cf"X!8@ 8@ByRBFlaJ)wahU'@!ғOw.͆uN3/1uӡ" UR>6XkAJ3)%Q|o A$ZCX]5Q3)HaFONq4rc`X9 =hX@1Eq5#'Ҍ:e3 &!XA$2/RHQ,{hJ{&!^] iB8 b"6H􈃻b 4$`M&]OQOՖFudBC:JBqAYtWG%}XA;R|f!6t8A_IC֌na1HDA>aJe((yDWN[4$Ij ;1C:iTs$GٓDi؊ 8ؙHU&IPTZB`yd2/Ts)P60`1\Hv ys}=!2heȁLIindFS9=#6qj:(驜!8pEdp5qG9/ȖqA\"x %Χ^sJ#u0ALNuYdFU5$b(6/2G}|B4*bN_ie@!HA Wxu1 !q;dRY_9vQWp2[Hɘ*KBkbA&DE{&e;z!yq"" tz@Q"EU"?b LLdnyϗ"2hst7p5J+D7GT7AZ3%" @PL4Z7]:)b:QeӐz%nX#w'Ui,8jctJH#o7%H*{0TH5 O:5ښdzVA'36Pi^(r(.Q5vq)Z 5xShA'oA|hpVga9gr3nƚuYHhȈ&KsT$zd\_G?f(8!!kj_[#xf_?[;ҪxX塩fӐ9p)3;)d(~A{ۿk-/ֿ+%kg g,u# v(#K{O\J;JћHB>*2B'z1b ™qe0u̥9p7(xqOH E)5+"N9ZПQ,t[<s66+H!#,ytOe7}˷pLP>{;tƥŔ1|ڷ%-FTq?DNsIq$0Ȅ1yÐE׾l<7LaT,"\ʁY86}h|dʒü("Dwiuܯ%<9 E'Kalj|]B;u;D6*q*ˡ!Ls|)VQXI5SL,)!UQo*B&<˗ѣ )S<4q!t_(gҌKoFke8o936'Bm!+IG}x*5DPR=T IX]Z}Գ^ l撒#! ,! ,! ,! ,! ,! ,! ,! ,! ,! ,! ,`PH5)H/`+v'Q{2goHjٲ^;", #ş@ JƢH $8jFAr:xsmoͷJ2kfW'`l[^&wIdA@ضd l1 @fu ݲ.w1KZ31iC#.R}-bk\1AҜSN?Qb2KA%9%H4ADD*8]VBHLx'W:L1 QI(Q~)$1,VkA$iMY$S_٫[h#E$"+ϻ.v \Eq+;wҔlŒ "AVt_[`Qӽ#% sw"6!nHp86fZޖb՝…Gʜ AYWa3=e.*sFmDQ&|(Qۡ4?gFF)qc 9Glb*J7{<2vM5Mx6tK!fSlP2* % 滣fd]U͚m2X$){눡dI<Q 2̤)DA3oMߊK=3'a2b8?q-3K06DB*tdBʥF1TC&`B*dhhcLi@@ (ndD=u% 멺oJ N)I!@8s i,fNɔU%*) Тk[20 ѓ^SK܂!rJ+]kI)! Fq >7Jq6  UV#Weh ){jaĔаo&wNԑ1ef; N($=m NF9'&`.{EEykXh+ٓvAz˞T9.KQ @jWB<̴Bͤ+ɡ]1ϋFw)R^G5q̄\a E& | &֥ߡp"`]"IiSwI)9ojXa~5*5B4.kui%1*uHİm;e1!Mr{װe:(9z jpٵ[)\( ER!SyP:XEp jYa68D|e)ʌN] 1ofAI2KKFӐN2xt E£*Mr*ȞjckꠜUzC9qeROaP*;rRJ3 JPڈjUen ,iL?k?OAԺ'-Cf&;{R_XQ0qԽoɜpJt\V& 'цs1gW:a.=Ԋؖ55>Rz hH=*mQ^n۸L5;pfJeh\#-!1N>A)S2U s[GSoh٢OA1Co.ߢ_Y5#I4e>c8k#ͧP ;0Y4#g( nqB,@aUc}}"`V'',"&3+cnivmt>#.ac0g~[ 78[0 Da)\I!x*.REyS$r r `Ɓ D蘶&i!CDY+9WkTY K9[S_E1gl#&Ԓ/a1 IS=Dѣ^=%xWj@ENA4u~ǑVJÛ=!x!{yQICb|a%UA\uJSA?U^~ aG36C:Yר/hl]DA>Eg@aT Qw0Ib`t G"g3i)C7S|3bDc<- # ]Wppl$F1'I¡K7 b8{XMt3 U(?b( [!Ǖ≇OE¤aT5kd S#dȅµ)13u!`.jrrixDžTM>/V ]" X1јԙ@uALg\UmQzz N)3ݖ2,!E+V9*hG-U,c!U 7`s5A}2<9[32Ds!oUP82.@*cP%Z )A;j-oɢ( @ M1SdPT'STEѢ#>#PB @ $ ~.(+!5032q?ec5PN@@ iW$"_f: O&3S'pJ "P <ރ /$H94l3N|}$gqMbQ<Q)6鶉@$: x=stARD& ɪBѶV"ِ00P3tTS4T&krfh1.D˲(}AA$oţ R"r7Aq+"jA.TMq nyԮ qe#x?=׫M75/;%5'EJ+ wCeˌ$,(aQqW`U6 awN42Bx1$ѭuǝAR,JցW*,J)WP&7z[O7+8W~FF3Dž}aaHA#g꺽֙jj zeM)-6UIRdP%a?q kS33sv) fF}ps9v(kAke-5# 駳x~-e@*<7fq!d<VtB+-1zUUYQ15nқ5*-Ud 2ań ic051ש 8$RqTA tUyr4,"{ +B R7Ta+WRb/G|$-5S#7%!1Q[e!8+"SDw(fSwZUsCJ{d:P`ats6qg'IaX)FfẠv$ uQkU(}h|-"+S!_m]Tۃ)f@Q_VU.p{T")Tb䶬 AWGkQQ%IbD/_V76JrG5=nNf9ꅢDsYbdzbNq;B'AԲ2Tܙ`}W%r9=vUg6ldA2##):«<9LV #ASc#L[WҚK2"Wadpy$ @4H~{sS+ FAt$I-3JM) 61WB*X+d4laC+ki/4|c u,֚"LgaLT7)pëy <꧃t`̡Py^lT a Tڄr!Ԏ^E򶔨GJrۘ]o9~72֤T%J6 sHBL2njMQn-q /^l D}GI\qS\OFvBu)X6YSkNs~ڜs <%SzM UWF?;IyEQ1#z𫡜:[j'(iOGN1?^rta亳Q+x/KUAI>atWl)1EthfGTnn_ 4`89>rRlrOrbTw2 $P\Q/빨9ˑC%ǽ XE8Ly,51/"!/,E{*EhbD% @ B >QD-^x ?4!p A[KFdHF}lQL5mPDQCګaʘ1SDTR9 QR(.W"|)Fe͞E (㶲cڼV^dB$Ibr+rsxdʕ NXaliӦMH8b5,MXٚKr )WKUZpYI%(Jgy?0&ǒ_@%_$u7a^[kghMǏTlp)^ϫ 6be29Q8E&DMŠ- QBGHvj*D_hg#o 9P)G!sD,+4!.{XѵCI+KzjLp+NjۈZ3 JԄ&8T92J̯BPCE4QEe-l! ,`PH@)HQ?{h/nig$i?[^l2@ޫȳϟ@j4QќիEKaر]z$?lwԤKPP 2iG;7N]Zg2&jU=V5wѡHQL;m%hWRG 4`[y@M=D3 2PE f̩Eӧ R潵KWz墿F%W`TYAӧ5X_};L[ߡMmah?Nk;=x}E ճ'@B RE(ቔT=-,wfm!AiXw}"+%e"D"AQ& ib{ q(e\uT}Y^ݝ6^rc@HOwqux_r1bd]Sa;)nY]TCzFړTe1)#)HIv)}R$UʧeKI$v("A؉ZOfb6S} kh d[I E3u+l2 b}$Rl1T([h)HJZlE:N.koA.VZ(clBJeD>1F@ެrOK';dHf_me"8A%[l4F);Pѵeu}K3$ T.wtEXAZ[A8G|=sn;WB}Z"ۗa<ݼr]q & cQmS+*d^ 4ɬ?[9TlRT꜊@ T!=!ð?ؚQw;b(` sm O|̅$9Y(r4u:C=߃=8,T*wp0G6-;{i޴<`g%i:XCkК, MA#TET4D6|c'pRZVG<}'^纛\ EE r!+T 7G[zn@"!PO]z)_\tCuHk Q7!+-\,D:$r׺DZюHb(D,& T`^a+!CA.({xXTejͧH:6r(`E0 Mj $Y_RI`DUb 'վ%6ֱ'NwTi-)ƠM8(D 6GqGE>3jZG\1%#D@ `"qHzlІv;H$a316z4q@Cё B +֭.1$FQGvf=hP4O,B% ڱSx?$!ӠA%LR="| 9ojaNZ@L=)ScmqͷT-JQ1'H6HhPy5؄B $#&sĠ,OzEbbzQOm5n'eN^+71YoFQ2s!Sr '(4A "f*Lp Z'm5GwRhU<$Jn R.Md%x!3|+BC%BU({d-bb l l} _PS [r .ySgчґA& ;oH #|%1p"xZ^Cd\mmszO mfo,'GNsCW,aNOq FxB#މC^ĝ,=o-{)"FSb4D9_e"Zl{ĺë(ka?JǾ'ҊW67ɊT_GI3Nultlc#eV\8qc g(u1#!0ww{@ޅfhxdAf[H"#Շ=1=B4$2er4eQ;3~)x@ a0bam/f1b"(D~@I{Eh Dt'W\ j\!BXevGRda3c2jNq]XUkڡC6w#ŕRfK\x?^R4lfQRdKI*Ib1ee4Qpa"kfpHf~12&-G\!Hu@MBNBMJJmqT4 s|m67nJ 0PAQ{P#vSIq<0hBD0Pf6XǑWQL $ABtJY aIhd;(OX2R{v(vp?U0xi#4"]C9uQ=6ehCĥFHTb{w%a-fQ1*@"|?!XQx)d31[0s_#C5ST#d.!AY1]EDhe S~ *0fgu)8 $7ՂNVLDPC\QBw?LKd"gťu^/"-%Pa7EY5 6Gcu]R)RR4tqCnF +%!ew#Y@"+rD ulqijD(Ѡ )4k5@&tvhQTrAqGޖE)BXj`tV$MhԇaM5zF9ڡGpQAZtm(ݨszg1|#RXi\́FfHWl19s7wF#P7W'o`D̓ʅ5<a5r"v<*1QVw4G33:c6fbYmsx2f_$!c_jR*H'4Q\2JY>^= A"wƖĊSgiױdbQ(&—QjiIUИc Q~ eB_Q_$5[0Wh%UC'i&sC#b#yTUFYZK:2R[G]^s;IDfh#aY&)w(i~UKG7eY~WvŅH;SR() ڰD!Xc)|ReԹr45t$vrr*pǔ[ZXzgSiy'vQKȇ̓x/,n!+S2AQ_;IDk|[: e.7!FEƃy8?`2) W#4(yEhkV vQaj fS 3-=(8P{}G ׇ6n($[WU5냙UUZ+o!5#ݑ`cWQZ: ]G"bAvu"uH-ǧG p3Rjgv!F v%L/&>;݉?aa%&Xr+C104< f1aq^B׀ce&f XKDu2,'о#VEዒFL\&b.UC0t ϨҾЈ}kOMS`W վyd@M{cW JUh0F{ko c}ZRYܟ$Kk'? xdp@7PB >QĈc25lUF=z<0$MDQ+5WJ5myk̙غT(Z0i=C>ԡFh)PѤQ+T‚@| 䘆H5UwcӒ&,/fڼ#I( 7޴ji )v={M>oqWxV/ ذ%VϞЦ I.Cj3#LhQqF6p(PӌM:PT(3{fn,"B#'{@FyIjiz32 c/461tM㜜 8I  -d֬$Ԍ>@Q\rHzH Ӣo(9j<1`HOMȸ 1D39<̅|żt)0FS{Ԍv(ц.T0KVXN+=#82i@7RH!';iM6!dRثǧ2iUKMb#uт )%[rNBʄӛȤTGq 8%e)>J9g:Ȟz*p L|R *I;-mHFGl*'NK*+)He 2ц "D4k&Br [TQa˗e8/[cvҩv}ū4 G1ZȒZl:u$ cO.C%SMp>!d0撠nL@G.p4U+ rYva+m)?V-H1`(bCo[i0[J}գh&XI(ɰ3)7X0Dأ협$Ɏf]8gR{*GL\v~jSB)y!I 0JC J݄`ICf'4C,J&}BsFR疬K=tG+.xSXr+ 6O_9Q+b 'i"]M&ǫuՒP0OI#TZ7 -d $C#i5iQ{ZQ)D )߶ YV`򈦴m:1zu_SyUjhDAXc}keȭ٤DNZDME>nQ ;ہ 9)qj9ogܑV%nz E;dkxVl=}k*۶tpjV@\paY&| lIJƩQ.+9K$fu>ELow*S:WL1;}wEr/V h da|B=l#z]#I85Vt"m,zgyJCg$όE O_h8g6se΁ԃ$,bq5 Йu!6q*Y) Uo$ 4KqmHzfNyw$EB\IL D5[Zq@*≗DҒx޸R—mHmyq|ȎUdx?osRg@Q5/̨1rq2!Nlz'pefv]+XWT.`3陫W'O״ *%ј1pr`G!yEI](nGML:; z{ (Z"z"8FqX2w% i"wډ\ (T6# Ps3Y S A^BwSceq#,3i.wv'@#tq݅mM4ƥP\1 ^Bsrٔ&yAHa֜ 9 33;li*ܑ& oSek&=)A^@ <}e`DM8H61ssl5#utfF1386e & FkMvׁya1$v'+"YAB_W ;߅B} +REB#'zq13V`1uGh"q1U`1V=KNn^#ZA&>bY)rn4;z+d3Or1)!8xZbc;(@yK" qQ1K'i<+𒯱HctI(|''"F ERU=dV 'SH͒*Gy,4p(!_9,9]V*/-i:5HdYxOfVC5FB8 `[mc*$'& 6HL9 n7NTGzheyjIkU+JbaPMxoDWͦ''($fR$m#SXpC`Jbe¥ 6;QH6@N^436)x%WS]AZ.$C9|tuX/.W(o]c-+5| ;١ bn hDb3UE=hGY`!%~i#o(6#ZB6}'Y;Hm'V[VB69-.i2@k$t:F1R$r2hS$cRXה10!= =iqGGhvY,#G'=C^ < ĢD/*+j:#OtMjMv0-T06ܷe\Eg))ፆCY`40FY8[Z@UrGFw|e-``8dqB-{[x6!!h6`Z *wWo3@xQ{B _iڪ,]<65)T,e6iAB%(3ڲS@ ȋ`!dq2>?#+?9Ez#-42񁜻0oRTM"\k!3^?ag[t2q'S|~c.%lH!QWA.\{.vYFajsFvќbXsGIhc2;*Ɓ!EN= =^b5s,b:!v@b&h8>afɩW!ki[g`MaD| a'92KcD6AiD+͙mfW!hb9f/"!5!pH ¾V}7ϵНKiqW`4rMEj[֛=њ/ 4dF մD(2,EqCc$ sFbg脮F1.$l9 ]`Q o_Ct'+5$0ZŒ\n#%3S5GQ܁B"I9LE$fTai)83 ]8+x -F&4בX RnOwV=D"xNMzXg #8-b<)uC($$p (V)dOs 9Y. #Ě| !PW@Ӊض\FW%4XLRj)xZ/q$8t*icE쮽 szh$#avv7o>@bA 7a'1e45 SuBR^"!W8 HCT2pM~4rrv$$~0cf-=BEMÝH{iUK6g} Jd\( p7zi\X6eB1ul 5f@6UF6M 'HtW,9oChsHU4+vՎ3cb~D/7}z:r6^U:Rx*- ~Afl;^AԀo򢡀-sW"Bng3 p6<,)fEOb-5Xh͑mw^5G"E Ve]vig[4]*L9[-- Z( "i]qfηXl<ɢiK};M C35j$bcƟw(ZezuD\TJa!TFD RXի p92ԋd<h"})-jEgdIL "0AMuB ֋[.Ԥ{F_2<L[%ڊSN=}Ϟ=,^ GGPz<ٍ4U&v@篩zWSGUp?6E7i܃r7JVMEbƍGTʎ=[nTZZh瘛 n8[jwEQ 3jrof\xv(<OәK3nxޝw[6ݽU*LZ0BrecnP|" gS/>D1G@\, B$-#V'XsϨIG B{iZ+SFn6RP-#;rɝ&(l̖@p'MYK1n1 lCd94(IT.@'sN^$2/OD5V`,ʫoOF 3&N9GK/ lRI2*EGpUV쥐4!-W++J[\j.KPB"UdyK۞ݵčjZM>] gew12dRt]{XTtDΠq{I̼2߃ƈ4&M%(/Iݘ[h4VH-?Wf9QRb$z[~P`I/``G7Ush9RiFS|v^K0!-IcnH,فP酛e5Hgl#NQ͛] 'bb(_D61bRٻ9>7Q{VRxX[&jYk'ꞬDq/$Uy352 yY ^¬6*ҟݍgTls wNnBm'2}<9yѫOMl!b: 6]g#.iO{sa1703Lþ 29Rzҥ/D^ k') ? PT"T+:| $)(K :Ŧ0'hVhD*U9BqPR!E=T8r{Z&NjM,=ˏR7OId|lY=j!9iRcg*Z(Q%L^*rwLIag)9Rʲ-2=DC0=gZb1qsId?J ;ێi5x7/"s\M5.#"r0k s9@M,`xWg)_~PLġ CIPF1DRRLrԤJPda I $/ )GC׭v|ɇdj5E[TT'ҚH.-bk.T$p2e R!$GCSwȯӖIX[yHhZ+th#Q$V^X=L:!%aWG=audMU96 ! ,PPH*\ȰÄ 5Dk?{h Eoݣo`Dm ͛8sɳ–&]ɴӧPڋƎ2ʬz5ƬJeiP&֨hӪ]={ڌ (]l˗FmQE'uTug4|A}3kPvHj1nҠ핆nkc˞}h+׿MGjԨMixik&$5!GړZMe-0S܅]=xx&t]Ag ^}NJi^xi2|,.K=$*@XH9aAiQlb-fYHWKx D@X@l xw%MjRyIg(X X.Άf2#YS$枴Uޕ B8Adq2%l(wF^ag&f^iب;Drw΄P5gqJP|֧EU*d9F-v)0[=%]leF;+w$BtE+CFEP# "Ax䪒":ox@j?vFR9*#'`!1M)[$;$[lpɫBB΄Y0NC&clb]to=r7Xp $2<`_gԱ#-{XH'Uv`*eeaUkMZ6=/16)P|u !}T#Tyl4 Ke=^$&:wk+TW-q)qݼ#ي ' )1PvlhXOrE|y"uzs9nxc9KgG K+r#YqCuyʇ@Xx&`Pw0P6DaC [4(AZD &DbWHF0wD/NZqyGk΂MG$w<Tpٟ2"| n9 KH R>)vq\aAh*?ՐU^[BƂBUJc-ρ]Ҩ6f!w%-R+"1Q̐bǐ"ۢWn$~|-ZB ׅp.==A͞ՃhG-MM IV#3(xmM6fT@旊'C;iQLe)ۄ̄2ԑ-zVjKws"XHYA>b) R&D=R,g .E9P’qD Jۧ ԁh!cTGv@%#V1Q Y|Dޓ6X`N"fRdUa$0|b"ǠK@쒐L+ PA9Ѐ7QHb3 II6H'O,RD EBtaZِxϧxkU B}r%a$-n(B(QDJĭ !Sv7:Aܱu_ԟ4uP`de@2$eVM1B.7e?A`/Qj(R$İ║Bz2\Z"RIWDۥT1 jRÚ"ڲQw+*$7찈sؿ*g1 SxZG q!2YOTyp"螷CqU;Dh| V]mQ#`%A\)0JnW/ [?W;!j@*)NhlUZXNwVEI9UdyPAlssC9bm%),yVµĀ(Px/IjNv8jqAQ!rW7ㅂ[Ui2h03%L'4.H3Ŕė0eZ_ iIk ' ʂ)eL-! #w'̊רr8&fYX'RRVK:〦CjG1(Bqa5 f֚ɷ HAOMEX (.hL2QhS ^ PV{B3)W`7dEDZM o~_ĦlȄkDyeBR1$%ڳj(@!ѝҲ͂uEګTD#FZ-1h 4m##EJPXXhL5(5=SΥς7f>xϲ + ,ڇEd)qFj&:uTEOy)dj?|_&^#YRb!_a%'N[ asbAD A[$@b)Dʤ4!h!$sr$Y'7dշ Ń_U}U?{2%A ">dv-v' ᄏCG/Nd/} hnp#؊JD`WP䁛Jwp[@6lydd3pxD:7t18vJs& hOgLꦋwK 4e͑MoNc@ >M֎KŴP 8'q6sOQ0ZCWH8?!I.^"Q6RA K<5QhutrTH2yrk'hiSa@ڈ~ri9]?t%d_@G}cXi9e'UICx;DDgvfY>= K aVV@R 3@xrb6k*ģIwDu j(ob6cȥd@[j3̈́{Qbvha\!BW*J`VVF"!2evOms$!vs-9o$ӜzQDc"8(i -oZ2}Fd$9AKIs:59|+N*5ROTJ|(gu&P pp*q *Sd cnTu`I qs1NA`";F:D4MaΊQIGD w@s'B< 54Xswpw8ЪWW Y0GfH6]ؤ5%ēJnCxEIAU'VzzavI0)/ 2IOqt7|1ѯo%I90V@2%ZBx'xCvjR!hF;4`-& yIjCQ1шȉve"-LsB>6Tf{&s >AnE8r& U3قd&IoG׃Co&( H(щ)*&/SV`C;z\>B>]!gkaqp?IF%py"z!7mC41X"GCA(Aϗ|淙q5Kp^pZ[&-Wot)4 ) 6>,izptqI!Kj'L!)BU;/ pV*s" oP4QJڱq;ѮOSR Q837'Zi{RZgCc1 Ъ6zn RJKY 5,2QS|K`j!流ezEl{?%M?\] $G,6XRd;dUZ6k!*ZZa[+>bjVXx6O){HrPC]Z0P@Fbao?ZbR"mqdhey# \l= b'7ljnɶw3cK2hE!b r4a%ElAVw]!:!@B<ԴI@,>Vl`HF&n')M:bvּ! lhIjCG@LS7_qj"Xēs"L0&3")T2$mFfc|*5-_lTKk-N'0#lQQ`~%bCo 8sYSѯ}%_ ޅv![I%B-dn1}D lW&C9"jf(uO kѫC# qnkDPJ2wxXG/QC0B-!jO_ֈ2*CBԲzht;d`!fg~Շ|(.ř' [$,_[M=`5$:`C7q՛օns F#yK}Z0ymw3zs `;TAO0}/r)[[@*N'\rͺv=*.0]ĺOޣC*,&J kI(  )jd޿^Pă @ #i"A-]S&[|_[leD{5YeV8%TLOlf+'s&NN*Qd閌ZkRЪ1* ȩ ::VbƍeL/ {qU=Ȯ`Z({`َQ=?=ڥgãz^q>X2p>lt.o>cYSK(n' iGO:{٪Oo|:?ɿ jͼ *е&&٤- ڤȪsjiDJ;H:Bj>TE +tJ2҂~"3 Is,Ax%"$JR1L`^d!=,q&NLN8|O: '4! Ha3/tƂ Rn:5r1OT_"PO)0PYǪeC1V^gձ<_rB_pX&V:T-kˣ(M*S6/5>P1,J)Y@o"Zzh0pw|A_R(keD<]ki䢵dnһ$3nu9ZJQěo{O;glݚv~Y-HQ/~i6B/nX/UV#YMz$Ǽ1l13=t` tVqDiH͡rg]۴%ǃ402ni^ ?_N50ⴸY3>x遗]+evúvܤoB6h՞?RtDjşo>m }%VX#qbOg5 , 2|d`zFGiE&Dg` l 8 TY*ԡЊh*L/ OXC1 cX$!=Aյ\ӟZ..D2*>`讣Pdk  GG2ֱ%?`g0CQ >G(L>&2e<j؊QbEPъVY\c{ GIMü8.VPE0aꊏJJ^փ.Z8"|Kf"D+7/=eiԮv$c}/d {N(/zIMPi6kVIv1+IXĘ 7iǦgtI 6 5?L>uB8,KXa/t0(*:`J7{^D<`J"$& Il ESK J DÒ)t&yҌbM0fj?A(i1A`+zbc{ű ,,+!5|Q9% B t~=T?F!MXr|blL0w$,yzx'B]Og♉o k"\LX5($ ]șCj`ϒytn+`j07b9ݤ 5-o|[R0Y,_,g͏_É0&q IW`(l!71K*xXu^8bZvQ]'fοP=*0X̒êbe vc% _TGj\/|=! ,PPH*\ȰaA_UP"A)' z IУ{$?ڣhѡ˗0cʜIM- zt3ǁ9o Jј B\ H"!1ׯ`Ê ԦUhӪ]iמj[V);e߿0{ ,{qǐztX?{dAoݹҢ̺5° n6aͲfRc7jz N~+nOIg/9u隓/W޻wlҤEӦM k0(cHaWTvgխPgUyeRuMԕUV@j8b_߆"Ċ&d" PGb"Ƀ$"H(h؝VQQ= I# E=|IDi!v}騥k ; )@ dl-b En[S=z )N)PZOYP#({E;%'磻CCY#Yե-A9x59P$5bOz5S vRHͅd?B^Qf;Ez]Ze,RU)g9#B z-AD@ntP%xO/QԮ=r^sdվ!bs{j'kBD/ P=$|Ǚ&԰!IeXbL2xaŮ7U\\y4 -9zr'1LFŧӎqԣ@H[?;)&p()pAu p _pCAdU=H98BV`s_JgO?SELqCoZӪ&j ;[NaSyaeghQR>\@;$0C=ꩌbdK=]{Ji/&_J5 2T]O8(1M1(Rhr1\+`鬤t/aД!,i#α\Dx5~i &8ѤrhT) iL5E[:H5:ಂ5@^.%MȖ"R&@'x!")s䩔 5wiee| R D<9*SNupo/YZ"bMA) }`%R{( (m˔V/$c,QMG'QR:Z+& MWXXyޕU"{vCĹ3IOk*e"J䋅U,rC`@&CAd!SCc(Fu[%[D΅3|3XiEΫ Xp;| b3jIA{5 )yyI1sMQո,"jv-EHy Y]OlLFLtyөw=2VR7jem.Fj-BNGx.qF|.)9Y0STF &JP#]xy&[+n12jəנz~)TرYPJ+LD$W_$7Bzxe'wE6\f8QTvwXu@7RyP|1E/bdaO"uacpg&$ A2Ciriau,uk/<5l8AZUm9vqCC&+(=6Dbbs*惗}WtU& cj2"t(HN*DQ!pP [0 IN>C89l0;p" !c0&W;dnvY4taH+~*2ІUvs!Y Gp+ͱgCt=`53VpJRcl4@crk~77N#,7V :/G 2;?ԎIHXC -6UeR}NJw ^Ps w zf p{Asxbkac" 10VH\/,%l_ҁ0MDiuAQZ \ogzB^|c&^)%ct5K{^Q*%gxR6#?Xҷ'קQ%Q2y>(CS";5I A# cg'Vfbf5"^Exw3`?V|#Y (KE0'2Fj>uA&>:I7D:1rth0A#fEYKx1gDbD_#~Eq"zSD1/^7aTOFM />ĞwPG#R"qxda~Օ fv^gi F#P\IS}'Q'%^X4~lF,pՇ3ґJId;"6gyczxI'#9Hj6mIkPZ1j gKuwVe3g9c~Uq#OI 5n=m=/(4b+W1W+#HA:L0 դ [iMtwzk4E(/RAVAd52@pNzwMQMx ;QCeÊ4RZ P[1 Э\M1j lZ8֣J dAB@a:uĩ'cp!'U:rJHҚ*=~\cL9 'ꃫBY4r\I֢K&C!"R}rU፿q7BF=L/),5X̡ HX1^oQ6C L;"Y7)X4]f]bCJ2'GEvB 7'yWC8S<ҲPRRhSqWe_:otIe1YjH2\h{=`l<1~4B* &悦:C?svu@' ,wA^hvo-{L':Tg<%0wV f9bG1s%&eÕ0d2#[20ē#p6txyc|3S˥9E¾,<%iwfcXq{|eQ\! ͏`܁fE"b* 1\u-Llv<F""t8TIۿ"+0[({&j3t&RejIr\$pFjr9E9`* S;)Gn9vTU:PT'Gz k JvA)dF7|CJ4#r3h's/'>A0 ,F,ԱAs4#`V4~R@2A v%AcF. 8R#/#~+!L aW˜.t[أM?A4˕Ԥ41BӍU,KK!rv" _c5CdY8502!6]#%LçsP QBŁ* ^2QZn# p%s*!t!vU#Qa c9%^gP U#4P7 $|ǵq&P] x2{ ) R*\ /h !tu>-F֓AMF,0b=c+tlRv|"{\ aki*̳VivƠIWIv:6v{ު9j'51͐=qy !NZoSDX[( 5 izgA&œMhz.WN *CJS[b?1Jm&lKfek5r> #jaň[;1G"y]ZAVb"'IT^Rx = F<57.fV‹IM /4iK;,*hB~$eŌ%MDRJ-7gϟL11n@Ҵ)&R*jQFT|2cE<{$*z)ʤƒj8٨P%4-+uޭ{3*C 0LTmeo1C[jk|=Zab;RXiƦKe ٢̧32ܪa'ޤ:C>]aRM_E󗽍MVuf'5T__&L%N ~}g 2));_|K ![ !R&1LhŒ$kB?䈿8pQmC1GlĺDE?Ա$& &%H1A-RZ,.LbHĕ*E)WJ%ۮ KAM22#<:""P'YB+]I=R04ԕ@|ʪ/ .X"7Z]3ⓣVNl娤\ Q%$hEe6$GDHFg5CǨγ)Iןc2lcTkS:)a{3̸#M#g.p,?eKXՒyn5TqM6.E5)&Mǽ332)\SQ})M n,pq:۱̈QVj^7POdQk%?p?'PF >Ͻtڽǽ/0-8ELp3)Jx_%-EL^2i:Ohb~5ī$i,W+Ii6xDc TXЈW)m>! FAqyަhQ vQWوaWKG<.{ BoԘÜ-&"lċ-` B& &Zc7vkqJ0#o{G.̀1#%+Y(%2ca6s@(Yl=w/gztf8vYsRuB@qs!ʪChyW;br`ӟ+DUkHzOj;`Pi 7Gu?Ke m't"2%HUڵtI#h2$ތ:RgV)B%GzTxR?1!aTA"j%2tHT..QNXQD+`EJc7"Ϋ^Őhd`; r+.~MGcLP0͓[WGFR0nTJB&nے:W)"%G'9-qT!ؤuNH }mpI#e`\67aUV`˹m-fRVkNד*<;(!Ed[W]R, IànoJvLtQ!co~z"0łc? J;6A5(Pp̒XJDJ["%kɛDkbbڗ7J)]]űsc<9yۃb9'F*zF ! ,PPH*\ȰaA[~HP"A;QaG(~(E(S\ɲ˖PdSɚ/sɳg[ qЋA ( !IիXʵ׬Px2]Vօ7mKW%o8-8X _8\#KLr[d2=[Gk1MrҲ;g3 i랭xa "D{ATkK%ݗtOc}zwG<(Aя({ M[Fղ/g ŴXZ`u{v5W;chb!lI+V@"&B?~js&eB-bc&:X_Aؗ=I4PrE$D8-vlaad%^fyyQJ3"d_*mGP=ܧAucgBV8QG@ϥI׃pfVDsI&C8&I(ܦԛCNؔ?ZxAZl_g18y!jJc8*䏤~ $wUZ(I(Way6Q=(ADcjjɭ`RJPcSU+[x4+TIJ,( \Ro5T'в)IjHxig,Rt+4|_-}؜ƑAڡnXFka}?:F-I#yo:e])֠, ҁF&^bBC.,w=#fWYϚ1-Rmgi$ ; 7> D{ImW@7ChMLBms}p\!glMxKc-+A m4W E;_oRPX$e<:{MՙihN]suIen·K`@`hfcQcYDu'elg)ԍPg)-i:jJSDlLZR;f_ET8]Gq)Ypey C\$=(Nd7kLwObb^I#XF*ˊIX1nF H3%&q SAF& %jHc)@bU+N LL)OLe+KDhHR8CE%\#BY(baapXdn7#5H5iTɬ FcZ Q4 o|A ;Iedhdu0Hk/P6OCkJnz@jA1AmHSC-IrI0BȘE YZhL xh1<2!9!)x:MJ9).e).&u1Auꀭ+hT ybQ?HQkMsT+ֺ=h;>V.z͔6Vb@LOY|ۃL顽eh4SJ ޵g-=Z\fA4"e4{s(ah V} 3P8M9ujA 2ȴ[&7I 2f>j_)+걧x ܛ p!SiJn ް^¶P%NTZ =|Q!(FkTMp _g _!MZ7<5!si V>6lC4sZs$rVbGsy@ LU} Ghe}(WBdEbHN^ASSFiCp:FAq>v#u|\]B!mC-x\F l8BQI<^7ByH:3^1dW)ݳJI@O"qS,vUHsȀl AG#S#FoRV.?dKGm!hvGU;C{l$rU-{ hoq0?dF\p"SG1{T*lPB\!;3:D@FBrMW+Ked6S'A>X5p;I)u%4rb;A~H=/R5r" (RІ,VM#*U/vuC1:zw %ƒ""&:ZTH/a0dDx hC&A +t bYRec˥Q!b%$xS(M=9 ve V U~!E'i5k%\y"jRTu&1#fs],NEdl4oH:VQc">1Wd e{9W7SI9f%+U>!IXЃ-F_9li!9.R1l-7Q™V'.Ήfɹcb^dG&O qGDx1 j%? 7jUh\W„hG7pSQsb݇!Ú&'>שann`fM^V11Wv#M6 7B_LJ'ܦ#pu dxbg kn$i1a\Ɔ <8b rU% p(4D*b{ʝr݆vlF3N{>TڪZd+`dk4?X u/4 j5KR-GKrb"Y1Q R#v%4aKM/"-TsAf,;%tA9Gۥ;N][d6bq󑘻+AOe{Wř1TW5b pL)!:! d@ qJjAXTy.i9a6ASx,[4Q,KgR|\a0k1UAs4&y \@WjPTIJZ R1ygטJ@âHJ.mz•+{fGSīa*bH%oT6p +F,-u"i#qTXOvr+c cRd)+Z(hjߺ'Gp_( $bf=\^82s5S*B NTD:$J2!)rMvP vviw!vEuaxKLxpU C QGcǹi8uKUzG9 "RQr5d|mSY e"O!Vh)W:z9]aaW!Rȹ1(—E9ś~.ғ|3ftIY<$Oh[#\=SJ2[JF~@!g l6+f:!1֕w'7Iɲ[96Bf?e+Xc: RAI11[h(kEKzG͙ ^5k6+qL=S16Eo^p 3F!kRaJĠgWڃ,#q f/B bˏI]3DyahؔfiP.XeI?HܻRcGkSr1*U$mF7molkxܖKZD7L7o4!ʼJd{]-`d 9ou'2l#B% L+tUPhfbI":m8k@K1"3kd8=q$"͜4B&Kdsd^⥦Tj Tv !sa "G=)z-{͛C*V! `x= ;EGqy-84Jۭ`QVkYT{]R9&wrQ i>zX~5 xI֒=щW+P !d{,E3vR<" U\[Z^ a>k" cϱ,WQvX6aԠ@Blb&jch#zh.2B';&=In9 s ᄈa=H*] ʹ-9.ʵ )r˜`@#h\¾Ԧ{(;(0񨃆VHf_\a܇F9~u,7CU X49z݈fX($İ&=q.4bdh63a:}g»FDpDgcܧ8i ؎UDckr~Lm&&o0R5]'?Jh_G#ȭgoQHI365#NK!fc2tdxze`QRt i@ALNe᧤o`ŏ#QF@ IS& dzpD lFM8&Bl/AHm8Qz*bSN=2VK*;:ֽ@}B-VjUS-GUkU8 %hՆbjB()Y!8 h+'P{f8->?.[T@-㤜ӟQ6M:z,54=g cאTڣ;HWѣl<7),UZ&R4Z:dMY#E=*G(z;Rl"syM mvY'XP` ׄzlyQZy'-F;v0?M?Cq:kFIɲx*(nm'k42ꩅV) ĖԣFfTrG$F$s1E+ubҟ:hzŮ4{p ٤r35΄LxSРh.*r"421㣴PBq9P:m-S %UXj'R -SJX9qρuLV":^wP4CٜڴTiH<"(!GCb2'SqynybJqe5iM-.ZbU1>@uv[sb#M%X'bƍa1 :\ɼZ?}8e9}* -?^c΂LdvXaSz(3M8M{2Se̢͠FxTVdlj.k>9ܑ~rh;7;M ų*RoQH{p:VBJˁ(@zw3Ꮯ]O1Pw#[RFMKTd3Qd:خcPA:'i}`E;VL}9eؓ*.#2Q("mp?Ͻ b*A0@] (ØP!iG2)(Fj (ȰYZld03(`w4\s?F4_Ax?ls )d;HaFғq ^65QI*-'e9}f V<-En DQIJo b^Z'cVSy *搊t$Eri]= ?"ኈ8 tLi> [~b9&{!䐄Fs;IXhX!\j*\Q+\̨ ~Eb)M̊QL^I%[#pPc)Ng TbVD@@VKVRA NQVbTQC*ړT,MSF'Ze F0 +q7'P;MB3S਒*TcH1M/ycdEˮK.RZ;5ֵ44Fťxrc$b zܺV7%Av6'µEZrĮsqىDSi@`mFq%QoSęaZWvYrl79a&Cֶ]=wFkI 9KY}nZVb T1! ,PPH*\ȰÇ h/ŋ3jȑᯎ?*ɓ(S"hpH].Ý,kɳϟ@ %A_$ʴS$J4jC z \Kٳs\ sfŶ+)KL7DW.ܶjq&DڷX{{bИ~ٳyᖙ=l-BƖS_Q[6ʪsYs͝ \o^l瑟K n*o}>zN_j׎@R|7=DepoٻQu#i4h"@=K$ )9si$h &QF9g(Zh@/n1g4fD&Z;8J=f`]=y[$"Al t &"hI;SlvUZR&;&"g `&P(%B;y襚IHlQi&^/nɚf=Kڅ]ri@vکD-Vj@[ڬa^IPȞgϒTj=.`UgU+ f"J$;J@ ik=KMG"RR JG$OZ+{oXOZ48imZ%A:nb zZhzP%pLnlj@C-do䩋-:3-nl[VٙMEZיk{tAлԚ[(IO'$-A`Gx:&9ݚLD[ۃQN?Î-HlB:\i=G@+?2 +M^ hPK^gIڣwp=J+'ߚdw:JmĊ2(Eَ );d'Tx7"6wy6p9f=U$nDCHb,"ɒgSm!_$QD!znAT 2&#|ӌ6}BgbNC0XVPNH,ceA. _D\P;A`ŃKt6}Ӡw J\!|)Y'"34E+qЂzTRYm>^)RrPu2 >$,`&aC؃n*;սv$Hx ʺARtB3d"7R=ᡉBS9d >0cVDˤ-.~Q*+z_ي3?cI:tE=ȸ-}9g lS$LuG-Qef?j'r79}$(SD6 X4چdS2簳y8 S$ouc@&FQU03"h*zJ,\qF`X1 ݢH !̂mp^SdҌtt2R/jL1 p d]X6$MMXT+&vB)d~3'GtK:}g&Z/:k~.e%Š M̟/<Fh̃>y78jv1SV,`cAi-$ʟ(NYڱp\!$U$w"Ra&!Z1EL5ђ-$)ixfxMbGJV{nYiT|ڀg_2Ù}4WqjQ:,FLQXf ",6Jaz(菞>X=t`AhsBK R6rU}m$l4ijxPfDk8r$|{P0ˍǒ:vcZP JPk D́ԂwqGjɘ*U+ )b؂s4P@C*l|C[% %f\E|أ[Y)9זꈜ(5S"u ׸m.aS Ds)Ǭ4"̑cֻ2@դ]%>S!@Xƺ̎0#6>gk,BL ~U0GhzgojܮW,"u 5yW)j1e9B PkJEps y=oTP%كWHKt%-d͓gގY:NTrϳ6\55qJb8v(6ݕÚo3ZC*M;0½]:*HG*{)2e @mcAW2,o m#E-І׮-?F%K~֊A+wvV5SPlqɸӽs3uBڦItrAxwd[nt|uZ4K,SW,aE(IX=l.FSiZq2O`ȆH+&H6vCsi~*nGFrZ0h&4- R{A.+j0@6!ZsF4EN>׀W>U.w)q`QR9%DC.Z\އQl(wqau'"T!'C'?lAzm#d/":5<ԅBMbb?<4gb{~[dfh.cDe k7d'l"6Rn‰.:$ VqR'!rn B,.oR8frXQiTԢL0ߵ#s:Ni3!T?D%Ŕw>1Zur]*8 q+gS;Uue_Z Vx'a3{x|s;h@E2 3lCtsDQQ&WgeT &GE,*{OzIf1"Pfhf2U U0 @!we qw+Q u7![r&8X2rkq=EXX&)W1/wI*1f8`P9fg_L" 3d&_ Sn8?gF[Z~ bpwI_ v] rdT2Prd*!01↜#C?5oz/'5Bg @("5N]_aeY0|HI=9&jY!.;bca h`~36a& 9~9M\!鲡0I4kKĂ5cS#[  V32_I٤} &MYjtF)܉SCXW"};A1*]Uxlu#S#c91VqآHV?1'=2&oy$rJJRgG(21MI]#bxnr#%&T"XAԱ!GY`#1TT5T`,W[Boh3l3?v7h5iOc= d!J8S!`sHw쐈" $G5 Bc! sf6Rwgs@O )}'C`[!pT)"#_N KY8OA`8)cG٫z>8A7 7Q k;9!#G&tޘ:*Ěwm1`*y1Sj5ARV}hC QC {|[|8̇)whR.4vf"9#:uI8c66`usdhUl{sIGN. \"]G#B.*(a'(+dkAɪvfH3%^x6h<Y3>YD`:g3}Ƽy,v\|@A]+(t0b[ #@ETsx'sV P<. #k t\%X+Vb6v&bV!jH)"ݜF-؜!:Pg6dN<HWeW3LuCemr '+Ѝjɛ"?w)Jr1ar=;*F2X,3@e'Ј޸Z#1k3Qꍪ̩7`YFW1grO>0Pu¾)>#K-fE+6-I*:l$ț":# "/7vɦa"Ԭ>;$12Qk_I s]Y>\P30uxGK7gI (Hˮ1&@Y<.-zm8(R%A.c2+Rva5*r#d;-Kg"ɱ1Z#dJe?(W+o|q @DPB hD{(2lIL5IvGmq& GiT1RH#Y̨iSǍE j笖J,HȪ+%J I" I".ֻ1˄L!VIJG+IJW+H_4!ZJNŴ$3YLsE!RKE$-M|,(6jUK۸ʶ'\ɂDT?4T‴h"ֳvZibׯ5٧WM\i[nwXIRNz,UM3<{,+HzpJm%ݒd0Zk+ίT>m6Go14G阿LVg]`xs782It,NxˍV v_S2Qs zTQ(}{XWlE:q\6?ف)" $ b T_3*2$ [#W0#ɣAuFX)]Xɍ6:scQl'8albCJR[X-S,s`g/Sy2Ԉi![D-$HQ£F R4q"g J$rlگ. 8&R\0$A<Ӭ-[zI_O's<.y $ RMW-k(0G.sZ!mXҗjrs!DȎL^ț<[8Dgc Rn47ɲf?5?[GZ"@E TƫSPD:8LnF+\#CR٨p#gUe{h@ӡ<'ʲÕ1KGB39+-b;Z[4jڂٶ` MKIBԃL;; t3ZN5EՖDA 7dH#G sߚ?uY`BL(c_-.Ur!TRXGj7e,N$Y5bdִW L acf3Á4ЋAE6wVRXvƭU+R &1˞PU 2?M{cmTD#U3$.>e,S1|=RN)S ! ,J`H&Ç 5Ж_,A{gWDM2˗0cʜ)$M=hoF?;YgφDIӧPTyū-bHq I&ڻgV{[pʝ+gϻv7*4ߤm L.N!Ig֔C#^M1V̹THmI v}} .P6g+ Jn{hv#>t=VGJnjlu}-M[$ $iiRVcdGJ&ڪg55ޏ{ UQ 7A[SE(& W\-6iemUFW!]S=1 I"P+ { y,J&Gۆ8:!Ulń[A'p (&֎"H@r![9fev&H$'P{-6)OX_G[odR+C&z%X HA(&Ut6G7@|drQ[wm(hf# Y`u3hdNy㕨i\vIɋJsR^D&"GW,!dE*Uy uH=)aH)J͵*d+؍c~KU4NA =(\A3& <8>\Jx2ǓUeat KXIS chQ=*@TaaڍsTxz{9$yRn5FVշڻE3dR2ըz4ʊnNVr2܂NXA /}))#gR_⾴I#$co]xK;ӗ7h2a T٫ƑCdI*ZTH'vd@7ew֏xؚi)ʄm!td%12 Ҋ iǓ i~ܡD8硁I`·TCA4S3Q6/@Y ,%L_${i!6 m, exe()MffÖZ"j]l֞bz'Mq9o,4$󃋑缑֑1B.煞hc7P Rd4щGB/A͉y \tqGg4M$GGA9Z SbeGՎx~l߃9:ϕHYWRRԜnQ 4^)F< $a5Ɔ+Ap\Sgp)Aсj[ٕt݃'GVYёb>g;bF;]CǞ9L<șٓS8$QȲFLFbsKuٗY*F-Rs[iJE!e*k|ϰ cJdJ /D60ӻ/thc35W\ZX)3szr2:6=<.Fb\;$fxFBG߱e5^M~%cɦ})TdTPZMBHD?4qR1&*rA&&aUB#$"`OB#f{8mF8їL`s}YTRZ+F"ZO!P!6<{u%ȢnSj „Z[b0eXeuqo@]X)@W= C}3 2k 6r_Sv&%I5 u JDt'K, c #bBxRz6sA=.!+ @S Hc#VL Q X#}:"VXeׅFq.{l)UYReZT|ЏQȕ&]G IpA&]5]X Ks|8IRrW‘8m I9Tk"{{Z0BQ basOe~+h dNbI %L{GH%G}QaLV%BD"M&_X]Nr,^.U`ԓdOgqH,c<;1Xd*FK %&fS/9"Ǖ(2fCҧ' I>[T]3mTUEhOb\@3-w~ "rgJS.Ar'?1txu)NS^|Ggq0AxU9_=䓽ad(}4p_1[-b)"0S? w11ThuhWڢ {SxB92G6Cips19c=TK##EMeN>:H2P6{Ǒ"6MxtZE?#ӏ dy5CŌaՃJ+qY{ `Ew:@:r3}R\271r2MV&ᄶ5vkK~mB^)[%O,I""x\)sʷODF;K#t*u&փ$QZY $\{`B]Z9(f+M-*rKx~,xgW b'W!hѳ=6a^N^ L`Yv}v8Q`C!bwV ~?"ck6ZSER HsB25g{s"RB9G+1RɈp[Z5Ջ⍖~^YV専peY+Ien;-/MT#@pi^/Hn%T?xcBB(cCOhy&|] '4?w!!@I/*H +~$ܙkU&efbBp#3,l)B"MSk776h(XD&A"f$ =ژ2$ 9ٓx';xB2Bݣ z9rZ[*1@@~$ƒ.DDM톎ԲpKʕUX4i -Ag=(ܨ$0@'km>4Ia˭jCḽ)ul6q5ct$rZ%k/@*% ia:[vtU77 =vB`BE >7.ZRUs#!V_ Xǒc%-6a: 1ja5MU( ]ٹv 5&ԥSOTzbwM:$N=CsgPYh #rPX-kk3dL*JoDRdJONƖhKlMt#yr:+\\w9ujX0j+ocf:4tYOts')azWƖzs` K,S=a2|^M WLw }'v1oBW@lk?Qci(2iգE+{T,CJ[EҢdc3IJGF/ c$,)2!%,Xt` Ec-FlYц:ԡ 0Nk 9E(M pNSPxĭ}fA!#XƓwC[hBC؛4!*X.^-vDdBnFm΅a"s8$1=c;WI2L+LN h7lwk'-v_EtV@tAKU4‹^",@c6j:r` 9C⇘2f6Mn tݔ(ӜDg:չg<9Oz3&\! ,@`H*\ȰÂh Q`ǂIɓ(S.x*cʜIMj(0{s hy\ʴӧaBJӢChTV`Âei/{sB/~KnӜIeϖY'"(؞`Tjci#|@_}̹#eX_~a^YMJ۳ ;\SgGDǎ9Vvv1}=MJIl- <4i@ޅZ~I[vkUZb&z}&[I+ ك$2u ~,Z [{lߍR+@~Wm%T;UH@IBʁ%&,Y#5=!ec%wbQa%a-7haBrGg\m!HIU0ZM))TZx@{JitXb9D9)cFrC?.Z[?Y!i1mgD ~)}e$ZcT9jRKAG7,gJuzTgjVE:Fuӎnh8CZZ=!;]U6ª&^/j"ϤZLilc=tĞi$QuWiYr'/i#/7)зnQAci%2dd0F*/y0n,g β%(eU?V.u+Qc5F4O;[\J&5\sm&LkcJ8X>(Z99$Vjv.g~4ʯW~`[9UZuΛH0/nl-rZ #;1tҺ9l=A:BJ.nLXaRf*(>)t!_%"N++TIAx"%Φ`ۑHi> XĬ2-FAxg0p!EvR >OF!nMi ObD > "m\QMa^sԔ+|Z z i@k ڌE zybRF6V\LIK2#+#{Sӕ(1M B͆:#/2RL(ؖ[ 3ҋ g@E!H(bBt0Hޱ3ڤ" tjv!"l1hqS)Zppފ6ȇ*fpPrKIcOQz"wǭ(^i@Yer*=E x?v&'"Jx&#\ J&3o(h[Q=(5rPD+D2kkE)N`5-Dzhm5x4vO:#Ve%xQ(>v^o7jrp!P=4o$hVo2(Y_A[U"V0x~q"* .Vg#;b,vt'2J!]T&@GSCHw`t`-&PJ…_h8i( M9Lr'ZD~7 g(`4/dZP8Y(1nE8r'å5X$!j_5 !Pw0G$AtUe IsCHeXaEaEWubq/yc ~N,Z@r CGX Ow=St%2 !WR]HPY8i1QH$?LȒW/ =6X_ =]=#`&M>$'&?2E1fF SW@UBiÒuDR&1w{9I+0gACFx7;ɡ~6aTYV!,T]5&XMh„24nb3#d BewYm)`5BsRi5rXCՁAm!,l Q gBp-2 }Voŏ=~@*8$c5{V#/d<U2=AqJw rb3Ѵ\YUAE܁"BF!AB}qvIɍIRj!ѕ{k5N;b'ZF%7 W$G L]bflb+k *$y%HTugxtZgw[Re|tcrYDЂ89Z&|rl3a9V)WGI:k)#FHHArFG4Rlg3ThBmwgq:EmTqKfY(x[Swja P ѱ}giL&)s4I*{o9X)בye9UfIRG`9ŎQ EvR>RDƣFoi2' 2&i:j3UWVki!Lb7!J;"X!!&AT,H!F'R)nW(!×})tx{D=|^uEyQPXCE̦I+f*&\BuԁsL!QAvQD V%V^bn1)a#!6Ia(ɬQ" A!iMA!jG#nLjdÕT]m6GBDK#]CZ Omk:+1\cXKKLQl}YIz X9Ҡt:<3+%1ڊ]) OOM;ibEY-ʛ$RB=bDa$^+KK;K!ȢkaS")on5E):.ex6H[nu$GhMG4^ L[2kLu @&@ZBi \i#¢a*EnʓS%csŨmhhE\#6Wy*=U°{6&;c zc4VIKp(q%Ų=E',+&KuAgAKS,KZQ!"n3a5Rd8ql.+L 5iY $e)@5`V[u }lBJJA,Xı' z'L+NJ~"8 's2jQ">3!Dd9şKL^i3q-U#e *d0$%|!LM$ADy(߼.ɅXف?$$:DtoCM*9 0/1RcI&m8&mПX2l0C).auB$X+Q0s?u9B}Ji^'X[T,c90{7E<.%pADӒ~}H!PqE!% xtImZ[)&=p5i%@RC')Qɮ؛} ^շw38/sR)Hg V2/õLy3>T ۜoz\Z$C3h܌ Y<'5гK_Ci[h~۲"yg$i) FNKC(HT"l!{o2\6Y,AZ!S>gÍDt},2 S`9s3Z!@WRO>2N#⮹jN]}FEA`y{>U)'bs`NXCvLO 3HU x,b [*M-)W/N띗8Ѳ)5iT.2F\K-'5_)^3Z "f\K>>/ bo\є;.ӨW:A#b~gbH.[iFp-Sq]aiFK8_B2ݞs1v1= NebcaʟGXL^) 7E4>3+ekZи֑%Ė>[FTw`6 eV-' Vۃ y/_/& j>#^6U#UmN "պbrQD[#LStb涀J'33p5fI<9h>Ů6qB١A`#v8UH@39?=O')&/QӒ)_'0Eүh%:*3+fn>5u0U7ιfv$F8ZȳQ4aQ67$3xo_FAF"nAfQ@ uPBlxˠāH@AŃ!&<(J-]\Hr`-6I`S΁6hG2Y&ƖGd"RP*TVMڤEXg= Qnl)b֋oD8݇#|l6} [L. d^ܰc, mPrf *j֭]^/gldnܥ!਒@V6ٹPvW(_J?z5ž#-%P~.f$cBHك!llM7"m(: 9"ep#!ު%1<M1um_M8J9DZȦP&I+~QD('![4WZSMR!8l {ڱP17,M91SF.M%Mj3HQ,qGմV1u!V8馃6a%Dl̵X[S|0F95ڳ:k { Kg Xoӱ_\\SuuiR!J"P+#nWT+l}#v8^VVE6WA'&ř_?Њ12[RKq@|g~ĠY)ޖ| oSϋ>y!ϝn:4%W!褓o}B%~&*~_ِ='$$N @Hvh@G KRR.G.+pR# 'jY++MJ[UzsAZV`I㌸?jj($y2޿%6c2t+Јotg02P5eab:,}r:<A=I?/5JyHHqzAhMJ;"rv#5JڲK8s#m$tٛY A ?bJV RCO܄A4]<HFHmgLiO1NQKlXr; wVgKr@HQQ9KV95 '6)CՃxNK3QGBD0kt $6QlF=H&(= `5 s)Hm$Ԧ? "RLֈi q7٩e*K̛HVrW CRLӈ Sg;z4/H{ !Q۷̩sTRstJ^P4hjl5kZa d ^M{e64\?д4o9e3̚yqM\/q\H1 vɜ 2 uM ?{ЛSTO%)VT&)KFzeNEhSΤ+һ]l*nÍ>HAyH%PFzjd>m Iw rX}F~ R?>"7# _m@sZNї41|T[O CE\w 1"Lwyv1'}ٳj+e OdAdRHo+'2W{%%OQMhyywqSg)DOR-p*#yrJJdmR~lqEu:LX-3RQrFd2}kCK{!}cPh5R <]6v=XO߂%rzv*P5~ *s/5Z84+R4 7dbA6*"AU32V.E:5*`FhbP7M$T6h$(n_bp'12DF#2*@_#Ty7ƇVR4LYIR2˧MrRD%B5;8 PRuwՖDQa(a[4@u8o2PR#M%KZ[n^R=n]e?Z#Ki(x~\`t>!F$DJ5#rF[C!E&$*Uc1(ֳ֕8 A o&Q'_X!U,8Y5wC*(+"6,jH/2Y`6{XE b;W A39Sa5bSݢiyaNO-WUV %% }$qZP 8'6)$zhS!֎XRfc9@~{qWTrU0R2ĹUL\( 5 tujnHoaLs_F#GV 1O(`L"4_`@TSTFxtJphU]6uO]1huZZ19Eq?(iR+hGza[b+')0b%1AQ Նw\15~kB;I@tJ#0r nneF92)GZoKk6(@>#_~q 9{JcE!zDBr@"dhSaywqFJ*Q>A*{/)YKo#X#lj!}Z*U*xMiR%Tm" zIq*2{wpbLR5x[+Iυ%c Sٯ& J*PȸQd:o+EYAt!bP=ؑ(%rΫ{V"也Y]z7J*AD3R_[5 J$`VFqp%`[E,ri)ҕ%^aiA2QԒ>g=lG¨LoTI2Wk|ضKEZ9ϴlTU X[Mb\+qAt8DF+0$<) KH}5PThCc:7UQv#A|3cMBr<d2x%ޛ)}6(װZdlhi3Sd@,4b9@“&0.GIhw!2m4 r¶ Ĥ#@TXaQtN$yHk.+$ Y07ˊ<GC d̬%J"_b"/Qe"\z 9gEZҠ PcƢDWW bdS6@ӒrTyP ~]|!"g2D_rVf9B)[A%Т`9n-$=:w "}nkMZ*=7@sQߚ6]Li>9vjR0W)0L+P` G/5B{z?w`+=Y8n1/A /*eJ:]ڴ%}v?GS,_w/\{ şL C0iƻNAh8P0Cc#hz&Tc˹B"Ŗ^4Fmlg E*1$-f|'9J I4` *,2 <.'M:LK7/2/hjğ%"v\F=dQL> i$HF7UХ 6/shNL3A  14NIȻ P$2OVQPbOTTJ;,׀MŒ8aV,Ss :T:H&Hתz||GgSiWjeT?ev.;Vʽ\#}&.aLm.،LAbI_hNc=ԑC:#+kLSigz8h/RQ0"fuǮ˞J$2bG6筏9˗AP*tTu d&*PʫՆ|`|SV58pu*+;19NFrbby/&bUw+e+nn(46CJ5xts,^}-GhL80ͽ|X$]qE|"P+:S.'Q12ՂhQ="$JJ'=MxJN'Z =IqWxuzb`TAIlLp\4 1Mt3{|[t9l1w8= ڄ`Ι.)v1DfŷMp pUâ+1RJn4AH礖8 c 3$,2ud"bI)`ZHOHEV2`#ZRۊ?yl>'UyvHWr;-uY2P',=LbӘ1I>yO ! ,1pH*\Ȱ}UD{ HE'Xѡɓ(S\ɲJ{0„ǁ]ɳO (Ќd4E$-RY0$ԟXj2̘`jD`N\Ӫ]콋Hs:Ǒp(Al ,İ13"Ѯň Kؐ!,R"қqt"b̺V6"rٍsCvͻwV[h@)ȯI9sNC0[I·H$IݠT >b[只E{k2_sҥʕԀ2!j%^;iwاfaC(֎mv +G}m(| ];Փ?z\T!8uvl"wd v?r( hc:Viu/eYq(Jrb}[? ksZ)Yvm)AjҊ@  @PHsƨP#HA eEguh1ղ}@l"Z)iHnAXc֙IEJl )9§I(H`EkYrfPPZڳmA/P,AUVA6Sy4$y*,*w]۵s9wGsӊǺO|_+pP4tC1BAd˅/GґJ.`܍2PvTk $YP=岉܍%Q-*ٱ-I6R/\8a&yv `/-ާ(+7Vr\K ֞_q<.-Ҷ@(' Nx %ҽBίzŽFҾ)%wE;+yrfɀ:Qi~V3ߓO5!fGvwb(›HQddۏ-XъhJ tC@S6aT311^A0NRyΡw8-]B(/u>ҊApdPS%K ZL¨_NR蝈M)r6F Tk"]ؑ. EI @Qk]Q[9BV=9; 궦B c&>!XGI7s 2'4O&98l|>FS :#U4U+I(F//c %+6'L3i#Raivd4D!wɭGl\I)<U-h&,iOhD#2& )OV'qﵒzf(1ՙS pf bQ wݑ%ॳ@PB$sΒCHM!CQgn~RFIhABE'"3\#A0ʳ!)u*~(Kո-nUD9]dVÐQPTz !C$C_;é?R*AZpnºJPCۂH(-Ȫeׂ*uc$3e$]Lpzj55S2GX)aXߥ 23N pȰ͘SY&4O8TRÖۄn#'3I"Bri=v%&:o7wOp6ۋ%,̩/tv6]8ZMp  ߐ4=o\51T:}ڒZ-&$X}Fiͯohw+*v=FZ9c)T[2I5KJ^&Գ%0:eTG]i(t|fF2n0r1ca0UyEʹloENqƛ-^ڎؤk %SirOzf3 5=Xq^ɛqSllvP 2\9Gϯf'xTIieᙲs_0N%v1^hb_-uhZ?w maLPیjaCʌJ9 h"q{g $Ӹ1*3i1B 6KWE5$"3Q~4Hb=j*qG* pqI ;(:hwɡ^0C΢M ʳX KWWf)I]FCIr^Ǻ89=JfKJ=qhEb0xs g6+W&uη gxskBvX|'hVYRl!:wO#J4 &;ԗk3!u<+헡U'KNK6lW*՝dُ~]EH뉷cÙC9HEl%IvJF]YꝔьj2~&,*$ts"IJ&EC<"' uda4Zxtybrr+qvXaS1~jQ)cQpO1]6U^3W2 ,Xd}_6b2>-j}s2NXF݇*)v%ePty)q+w#W?F^H>FoC=bRFN5Z4w,?C&_2 X:U2zw%Eat0R;~0Xd6'Y'~'a/5uD?} vs(!H9nLU,2W4@Md21 w҃rd?"CY'#CHn815S2J!5RNk,!Tٵ'Gnseq[y$+2R.Oy.zh%3/X`u>ILJW62}BNNaa77(2kݔ~$k3Έ+4k9Ilw>PFc^vi$BV(0Fn]'Ed* KVFvKR".AaxYw^#]`\ \#Wa>HRg0&N8"g^XU&W]2)a"3'MA'02QQ"|p3bo )1pCYDF$S{ƥdGM!cg;Z)Ig8~ksY}8.Y .#.g叛lcsNxRF}6R?ZVAX˖gd~YI?3Y1S,eSá)5^Q8W~B2 ;QS :!(L=^S?VmT839We58IwHIfV AN^FVΡ(M.y4JSwIsub!G9rev^ߙ(`M*w2u)2vZ78yEY0,}[BRA2N*R*.EoRZ;i%?^ /3t8ȣG{e),Bd]2/I#!LUŨA=pb[aW3@ 7}5=)%?ڐ'WzҪX!9`H䋇 ,ƟX{BǠwU:rQ6R9a-Zczc;_F",Z7Q/H>a\a ;H{$r0pj4r%x@yg(x2)$.$mw%hA}"9H b}MufjBB> Q1[e:",T/|A1 fF[cIy'DGXL-*X>9-㖺6QRЗx]{BrL'vCRͲq6J~wz#!3~ a0<(6#W-6p$|[+uEgYHlEV#gѷ*1 ;qՕD;t<4.QF/{~ 5vA&s5eEX3&M2H%V6'Jw8DaS>d5aeѕd1(&^fS9R+7uKJbXSŁ^8q11lƀ4'wdZqOn2ks/'i HqLG6.˲ xLQB"Bbx 5բ **x2SraAǦjFY3tzMx7/:`b v jUgIDruQAT,1d2LMj(8aA3^spIk3!t=/4w^XH_l!ezB4R HT{Á5&ku;trsx6ADbɺ^lBFO|1PG3$U%@<5V֛# yeHR{:r8~kyQñ{ZcIl1\d!M9pSsZE xIQ:O6.( m5؊9C,U3Aչ@62JOSٝV:3AcƋ(XT~ dq՟fI:(X21А[&c;,\iֿR el&|^K=U T_r(Yc]"h87WsJ?RM+] XcQ #OJ'FawC|szաbͪy2RSUyХGHF.Ý}FBmj+ Y 3j\j86d4۾ zNw7?yP O15I\(^BgF4ch8, c&p'CU "b9ւڞ㕄X  ϕjF~Scۡk%ekSӇLak9Vp~ Jo 3BvZbcaѵđEOGEY" Zcd|L{~Aw݈ '=5Feȓ BdLJl5*V`Q2])t7GG72>Zv>d[&gXbs2.e2$j!IELBL*8Y~2<1qaZ$hn祙>(cgc-tZ˭ۊ/fLP[}&1J^R,H]R1q44聮#D·p҂aϹpvOm{(i)vwрۣⶓg"YԴc냠Gt(!s⯒+_TxeN(4jlcH(MMƧ/^k:3:ZŠ }$V7˜ A=14=ܸ6rΖ7®;a YC{g5+Y!@CqEhOo,f]I+ FP~GJoVwd@EXW*ӛH5}SVtƥIN\L{) X9VJYekxԀƧ EE9X߁Gyv~u3=?+Ꙁ3b3\DV[\Q}jS*B~aը檫5QD-^Xި-hp-ʞ-{V<⿄4SN=}F,IБ#JL20*ÅO^Ś/6}$ʓ'b%K\:C[rś7cC5m9!H{5EWbƍMɚ6e!xnݹNuZuƨcemDqnn}lb+raݜ+.kVˮvWzv rKuGvLs )Md;sI9{@jMFO(ٶh'>I= o;@ !'Dl?"ܺj Va{d\ &0pjeZ@§Z1Ijʰ ӱI'1b8-H &{h'2!V`+2\JK3dȫʊK BD4< !cN?rM$OE7/لғ sQKR<jԲ!9/%zbDTl2K;;N1zPc+ϤvXOYcm,ARX1hRhM ٚ6J7埸[XF ,}* ! ,0pH*\ȰaA[Ċ3jȱǏ/FIɓ(S$Q D-Z1ʛ8sɳϟ E$8t`QH*H1gӥPr5%,)ג ٝOڳeڶ bذiđ^kў@ȡc|*ifΚ}{$/HVV؊]]UNdM[K!Պ^{.xq\]M['koAWݰѿD׀6)'& J@+ye6tˉD[=a5\U@1O-&HB[ckbtnB r@'wvcWRCi#&Zǥ[ -إ];ߚikSVgs"`e`$)MZSgiգ -5&I{Zg)*:);.-:[x'q@z2XkC`C I DT1_c H?d)d &Η=V mE@[Xb9ߝD>NDƛvdcng[ rD"D[?IL׭)Wk0*ckB~C& [Λ n&Ǣ=D2G+hebv!,(*N䗤4smb8B[&=7PZ$>8}p QUYJXL(P-+$bVvEg/3`cK'@xL&>;8nwaZ+$˛fdd2 jh餇~dwAU+eEwQV/1g9^tw=Kl+j=ڣi=MK UH~ )&=۝'Hdך+2RZZX/\nYb܈l}p3EF.͆xr¾D+(Ą >5ǘڔ5LJ ES \EL0*H=Zzt.l-"d67ri 5 U/BoBI<&,i^JtL` ZH\)q,j~d3M:Ic brJKp#֮,AcP)X1ԃPL" b)OMe{&3Q-%5=u__i[F1 +uK$iA S#P*m{B$bt<>qx(~`nWg1 Z@) =A(Rd-ׁ@ǎ#UXIgI*ʢA^i!aҜMD2")!&Zj?)g%HWDwb{ 8쁽yI/wWZ\B1g͛kE-0e]dIZՠMa=RbڡkA0.h=re7BH+Sӡ$ZņE.k9S tTܔn ?ooW4&:"+jWVh^z祭vY<0VWmxͺQЖ Y~wL:ޘa:!9m5~V:Y( L ^j1/* 1'{Z)HǛ˴ (<mJ3 V M5L!&Z S`LKrʫI7T"cctK՝qXř/N$.pTNph[ld)i ċy$l@݄&3B4g8'uz^5KdiVěfzS9AAQX]$%O5 O/uJ p$W$:^&Yِ;:̽"x3dz"jT"PFxJ(7SHD5<v~l҈ĨKn̮CLq/’j{ Vjym➐{j>2*JLADo08a Z"0 瘈Ƅ7F>w.P3i[m~;y9Ƕp=d+7TxHQVF7IVІbQ5#kaD8AOwR!t,[68rXC x|? 5F3Tߗ;BD8eC:fv }dpGX%tT!" EQgJT\ *\p3:v8( ?!"/j4T:QdjCKu'lhv'gKQlqS1)fFgH$|zhIE6tP!Dp$7Rԅ&8$5C$wLRx=i$*ztf1džv3]/o] `[`HPDŒQdg:MA>Vn8h&@=RP(U1[_^%=^'ж'Eeҋ݃lCq)tI 8{~u6$f;!"aQH3r#5WRuk$EKyqOS$YO1^"5A * 9o,_c`CDC>]4TiSő~_GYG)ӸPӅ}7r|iH.6Gl=C A$qlU+r"PLM2LdYSS2#k[ޚk3x%8A52+tL.GGKRt~oPjT1aIk>8S}YKR4wp5i$Y9*e2j*y4SʑM4.14i@x@ Kسx73ctǺ 0n+R*{DXnI6#w9Q#ak\%w1%X9$iTU^{=[U?yuqQ-Ȋ*[1|[m@ 8θ`9` Ț\+4Ԗ1q'}gbRjxd(y'*P}kNy)F&\9j n7=S401q>MԌ1@VWD5a ͦgQofPDlk8фum,?&InN8ZdfazR2dmR$aA.€|&!l:x,Eؓ *vLLJ1nW-I>fƆ4VCna?ynF3f+W^k!ު!%{JLQ%X~oS('җ՟m17#!kb{JrQ7x]_ɚ NBHSoO%lAb5J޾R~U}U?4P&<zVX`+ JJ&̄iJV\S~$1n*EXH[Fm"EmŸ-{ ! ,0pH*\ȰÂJHŋ3jȱǏ CIɓ(S\ɲ˗0cʜIE[6sɳO JQ <迦P ԫ=b^D `)׳2S6)ڭV;j-8W X^HoA| 68jy۪EhxaMrޱa1Z/ϛv6 +V Ŧc+c"m;oh Խ8U' yo]ގ=nQ7ڊ̦-7N8ǫ|.=Ro=_^3րUAGQ~lQalQka=ab a{:XgJ]gE0Wazc@慝vFAUn"nr^; rP&Guv^1b_;mю="Z &є17E̵E$Y[yR&7rCI֣-zng"c~G]+VMv(q ynHbşyFިjW b_E^z))6*H)4-3!aSu;bSؓ)no&ZhYwJ $x#n1 &N& ^A߻=^qX')ڇglJ5wxq5f+x 3_1'1W˶z6֛Z^*4$m%ʲm5 g\*k DgP\{d)z5hA¸z)ȱ\Ś.%V`:׍r=sCʖ-.iݾ' -L`nN/xwпWP#ۘtm:آًsIJ Iʰ\2vO݃yntnB^H̲_CZB,??1 BDc$U)CǑ`|7Պ`Ƞ%B f R8d:AЀ6 "%տ: dFcQF` x@V{ J-b$Zz n)&<%(Bbj U,?‹yXgFapDϾ@CQvQ;@3HD6^MR2 LKuA:aN tT wa-;ȅ$<$h`|΁\\RXtwTgR[iD^Z"">rYfR"0_ Bެ%2Uy?VÆ Kry Z'A%TۖV=U3s%@J(RWHAMz#% `Ҋ؃puH<ƹL#[hAHIr} dڵuSғZa4L>PhAmr;"*˭¼L8U ,tv *k,i2$(uR@=.2fLªX(=F{b&<%,/W5|mْ2-d9WRb{aksܢ z2*)EMQJ*2\4$b1I cY$5$!XhԖ)ܞǪzsz[ΚBIPlc\WKDc =-XU8*jüBd/ U΃659M_#4D*`ʚdBxwU63b'E1Nn޴IK>-g0`<6 vd@Gb,$e]$*j,i"[1>0X)mD{^ 7КoNDX "KD5U t)e]ը-PZ$ƃCD[_\k5HdOsyDƽMR ĆG:NE.r:ݕ{^_T-WDNZ~@FE=V*9/o)d:VRE|MCl(G 4@>悥OtrF'nDjak<7^JXse?j[b.7Gܶ8FtQKqAuRTڣ Gs8j;E'bpD/q'g:03Z J-h-:Q 70[„}1&lHcUGT&bN'V#HJryGHwcJjq}d .HiCcw_pgCUGg#n:u5qb`Tye0v1Z%.tx$|A7b$4CoV=zcb8f3tU3J(o%hg:r.1!y;djgj~"&\v,(*FRvXv+:;{{k2H 4d]&_ZM\S_E+@5!!vJ6FdOqQ3Gyj$2fDnU; .G_#qcL 3&0\R>0k!91FXE)9cwda0YT=TTx؉8Y eB}qy2?E#T SR-|苅Be7EWYkFUPcf,GՃ!V9B2' Ba33 dEwun(l3"[yMQ_gg^62POGĂʣKZ|9!/␈h4rL}a:n9PKIcwA] l2*ā|?GJBaCH"' nQD*Vy9 A\' *9+L70Uh'OXDojf`GARhFy' a3ƞzJThxkB9=~"#n0OF!G98)oJ'ɠ-*S`?<8/a;-GtCMTWPz{+ڸLX,*erg!PSK9ǁkTGEL>(u[cqrDQ"2;6B=Ld5U#jMS[SJ 苖 s4>ztCG,I2z'$zX vzgQxuM6RcؑVs#'R;AIGa'iN$ZHX|kÏ e0p\/v4d6[7kE7$.syjc-nl.l ٍ(6:uT%GEUB7V[-sGqR4Mݗw *Hh3I_D3 C(+DG$; #G'C5;ȖTVhȱTUyGscp>kQd!:ȡ{pOA+YFA\3{08Ap*H{_7rob2CHgH:)CD+yJa<}:aJJ PUcf'DjGBA}Cֶ󶦛0 cc["ygQsQ~ L㈑&?xAlA= jXO=3fp]kCHýŒ1K 8XPz8#?0Cd>Pxu) (0ʻ14AI1:eEMyŎܕE;]k!^$^Ys^0_HXaѸ):%:V`"nXRzֱC׃V/iĨ;qaZKs[^iJb{w`M1Ք џtLW68Ǽ"%{&#6  jShX2Tb'е,!awƬ%6yP~Kn*gA[誉x6茮ء4 6C%FUf{3Ͼ69xb"n5n4S ] ]81̫Bo"Qq/+IcmY9*1 dN?39Z+W1GUF +a)2A05 (Sa?FS*=U](U%Y~!.a$jrXGMpLۘ qq*j\4e-)՛'W=ucmߩ$Jrۊ{-]9d]·.unM'j^F>ȡ6!i 6)M̰"&/ߨc6!: t/&LM;ai#B?G܉F *IPRI/! ,!H*\Ȱ_#JHŋ3Jw@=ɓ(S|XVE"WʜIfA6sӡK"cJ@8*]t!D`ڃφWjz?`rKvөly*{![Z.WâHx ^꒮@mJ;5_LJt;Vz1ٲa-bhB̺gR͙aָ1ҽbԢ 9qZ"vl*tt|զ-'O ,KKa%sc/ .tFܛQPᙫm*Jy2 d[,tGTyp½#xɮ\]Q3hiTxȏna_Դcө :aI#Kk:Wca&ࢱ4VdV)ȩ#r+$J˅.je j!ڍt/ 3Y*]2$EK;mץE˨H$H@RՕ+̦KihPS6.n 65ыW.w:,-$(Y eKE'C19kHO%JRə)}x)-qDk4 iu/KphD^q$]"xڡ&ΏK, T+ft^/C֐A/Wi=T5ta&%SBLs]MHa";&;=AV0a4C_'0u4"0vLVDA*0ū:Q OUj*Ԛ$>5E`N%+2 Vj]R,2J+ Ƨgsf]y2JOSKgYBOT9;3.ҊBѱEGȣI*_cB(D+5%daHk:y[.ٽeX $e"!}̹CqEdq|LAyR3.JU$/GR2 X#kMkPX<A4t 2&ek8!܌L 7N* MuJf$&ZS&(bj$LY܆ On@3FA|-!d32FTMX6Llőa %%Yw!bx})&4g wyp{K}ֺM9N$7YJ#U%g ZL.a)K1ݮ"%%v|:'1Fp|xX?WMNqˡGd@^cqvhC3Rh_'`&IY[ F$4TDBF&yY1ybOT 7m+tUIlqx[aB5AP;1UZ*Sf}dB5mN(K=F:iZ52","F3؆QMB6 Ggq2^֣AOHZpY0y}{s柬P7ᵡ ?E5cF{!Ur~%j!bE.e$AlN%|x BWx\*m/9ֵ39vZ}7'xs,)~3v&ѧW2j5lD苕yCxHYQn,=kby yYvHI)o"qSVɴ5@l2YWeLke䟲'tW'jeI,9`} -;rp0H&S2$^z!iV,8åkN*ʉyM>*V#Ѻ!v/nɘȨW+S^'=Qx:&'eut&Aw2Ë(bW3K989ї낒ӄ =62f<y;i;Fv`dmoԉd=VT95]G:ED,SweGYό#VˆV ̜/ϖ 5҈* nѣtKVF 4aV+*!ڸaҋn)69ˑLԤ{ *qWIUʻBaG¸ڭvg%5&}Dcc1 (D8 3/=}SS䢆1^8s^oԤ4_\%ُ9 }ֽZ1K"Xf1:Ia>H4C>H &2lr0b=;T.~ZnP?F}! , H*\ȰÂJHŋ3Ǐ CIɓ(S\ɲ˗0cʜI͛8sɳϟ$9JТH*]@LJJU"ԁVj=^?Y#ڲڶ ";iY_}n]&苭[o tcz#}Ly!GĘ۾=跲XmNk[Q>ܶ̆5`|qi%}be4{cO뫝{ .-[&mٴkhù&-tBʾVyvmy)[HRl!-0? 6u]!pl h9 i'[rn4&y(Xr^ɘՐkk)l9ʔ[ #ܵ_XUeƗY7@vQbc{nA=y]s~LnRt!i@ޑxyI xOd߉A7P`;V& &Tbm2$Jh󨩿}l@5eI@3vlreWq;reegYEj;"ɚRF $J紵."EN+ $H= ^+I) Pkw֦LV;X jIםbI.:I)dkP,ҮzSn4 hdX`ΖeƾI' 9pu)r[)fUmbɒjyɒLwH@ Hx򢋶ٙ;1d/Gʐ)VVKn&#Z2}D (c^  _jMy.{|̰K#pa)Y敩cR@b DՊc/$STvLJ+Ȩv, O-Ҋ;z]~ǷfB7ő4ת$9{ Xf.=IZ:Wk x]D}I`H%=&}İ(lHԄC%2dn-`Ea\xSҍ;iEqbjxZ2j}) YVh[@Ѳ7 =BB'"Bfu> s3I"p4Yd?\pIIc<*~Q;"`qRlkljNc40:a NtK۸#lM`*d36G //)*A1,#Yw=صD1 INlvSc *l 8 'HA׼ʂ C'4'`R"D\v&6Ew$њN[k1:XhZT ތwोAhzD$R'׹ \(|d`n JB5.N*C8BO^&Iڟ ¶h${2澊@y)ց8q$1Wȅ~>Q tO)VEkZV&+L͎-L. * ^OO= z ]{\H Iw =Ld(ڢ'<Zg݂;)P&O٦ZpAhleزj zkƛ n8!]"Q@[0:B fyfVJ@E-u78*&8!g #l\joNPToOmv=sa _;|" 됫Bn%nJnv';x;X|q{ "VɻɓjAv&Y혚U؂*M%ā->sH`™QV6 気rٶܣrUּbt%Kζ2bq'r=rٯ֍6S5u?,221yt%T A'ewsn+DRr; StX0Ue;}q7ؗIN4 :Owr>A0V PxǞ Q,.i:j-UU9:K ;S\1ˀQbV'xWy\24nտ&u00^:*ry69b8lX%pN!GqOx!#)hr(mZf~w?G0g^Yu^a-P ,e8q5iqGQ&`ff AIŁ4Z$LZ2bB7~_sZ"Z5Yhp( ( WDyU]ֳSID-w|!#A37؈DO'!DmmNXgQ8;cJ[xw2bb5cL#diQ@2H1T.B2rBԱ-"-a*Ӹ&|1*}yaZkVv_DC56' c,rȏ?a=8p miB!=rxmrҘ 1^Fy1:.G %Ld g7(#'I4bI4s,cW|zXS5YE%S2sPkAI#q 4Xqc'ILO)AGyaLb7a_ (s[@F~6H~-Dv56(e%| #F #¢1՜ձ`?}/ . /hlcᙍRw9]7n G},gHtTg퐩C\%=J5:zQ"$Wm=nHC4Z~*Q%$6j88zT$Lr Mzc^4z z FXN`-u&@ehX+U>^|kɃf7V6pٺ!hX6:EgX-Hէ<~H&vc4Q@,lHc0R4ɪ"8족Dz&([|7Q MV!Vzb:J%ŕ\\h%w7bJu1:a d`aCS7x)7=qEB*"UHr)LÀZh2шjQyB<5ƶ8%^qX^>A 9{eRP1RlAH9vVi_=#Je[Kx;D"=X:<0$2 :^XHzJ &U=Ҩ*@FQgBenjV*$'f7|iq T̿|4x-QX)H(h,U)ڬ8D&h\l28zPY.` (̵6!х̒w+XzT%f)r*3˞\S%Lh*|<G# H͕K/J^FL($5GY1OfvUmPL%%H3Kƅ|j鑝X8Y5$X[ȢaQ- \V`(M>f(1> ADdr2z3J,൤`abE8!,,ߚH63|GY<6c!$١&41\%SRJJ dӌƍU> M:9:&3:\3k *oByw\E0xԄ~ܩ˸Ĉ3WC L:2䭔z̙$덞{KpkV̷5kMuD :^x @q|U;-[z:@n&.[H!*;s_+T-rnKm2iK)[ݲwKzY(]D@n%8Qo~m_yzho 7p/}gߊƥ$(iY!^q񠄮ސ(QaGGEt=d4SW_)fO8?1idE5iWuՕ=p$;:>fۚwؘ#%)`EIN5]Vd%dO :YY HPzM[HEx`Hf4ԣeK*X d%rrpyX*Ff&4-r:JJfQ]F\&" @; d7]-)n+АB '<RlbT#vtU|7߬RlK*VDU{6Y l!k!b2юyxjv"?GC/S!hrd[>I~ /sj/xִJ )핌L] 91w^p9s;ܩm%srT\O"H?Y@~ $dTk։U*;=O`yr#~-v۳2=oQ-K1YS'#%\ZmA.$^FM4鵦[LېIQLd /;h\*rZH2uء%\ !#ղ)/BO)0c!uS&= PA7;M"W1t! a.+W`4uiW(1q頃h1Bd6%.CC$}Ӓf^I/tUZZӣ ]1u]94Mk4BV&T+85,?gup-- $fZSK?.H|8i:Ւ^`{@dDljׇ{7`-AWQ=O^{J(1AF:7҆ }\6tqx>e F0.2V0 r zPsQܗHM?[%8apJl`d&8]W4BuYHKD~O9IlRO]"ۖ80r2A3O*5"bk4|"d;;t7GT&^)ev=CV0kR5)e21B-bwOVqi( 9eSYLG>}3 4He'gFzSx#ce Z?&$ClB4F.P7x_9QwRaFіJcXAK3xuy?>XC@DΦJɒ~) d ,PUf86;R"4R"UZڣ+efoodd)՗4WGk5ZO~=V7lTTu>aƳ%طLC7PPjCl#R C[M0S[&04uEc z,-C"'|xI(`DHyGKK9Y(DTRb0|a)qQ=od+T]Tx4VN6S1.3Va6{1\&˅tgG`-sEjY5$%WbV8 4DŽV2QKw7JW葶Uo014>Cr457gf&9D|Dm0 @tҕF38%Mp'@;$h \qkkIsR5D2w `qzTWId1AS(tsPh1*ad*1S} wEM ys;BszUd)qR~aRK'|gC?SS:Bn%SA>ۨOI@P&ہ,_ 9=+EV;vQk⇠qc2IZ'RQO 6`mT᛻)fe1XG-b dŸa }TD<ȣ[Q "hY*awf-mKrjSh?EGpKmGU!_cC |, d_1)[w̥I:-qBb)7u;Z sjI ɩ,!Y'sFglw G!+,Yaybk8KjS'ՑZ<'iМ4uoܑYc w|McSJu, ck&3<-MXwI`Є!&$Egk5el+*S]igk6ZG*vYQ:+Dm#AE6JL"T1T2W1Rae#&WzNae;bhݼ\b>S ӗPʑ& bJ3 1 {SV#SHjYmA3qͯ҅|z:-65=Z줝r!xaLQ3*†/{(lƃ ]TN#2nMUlQ4><<<Ѫg j;z\I}}E $ m:]N&_9<IJ$%YT%uXciR8,>9K=Db}K]ah~x qp1~ n H!JVE8CjCh!oṍ" aGuڡiV#U{!E.9Ry儎CT0P~阞难}U&>^^ #5! ,H*\ȰC"%ŋ3j8R Iɓ GU-{*#͛8s*gϙ: Z%/´R&ѧP՟<R*WFykiR0T{_ʕx.ֹxftߥ4  ֥Uj)\aiUJiۦ7՞àr c{޺ɰ:ܖmH^Q"eӔIŹ|hye N}!-SkΣ=3<@N*elM7h\wVee\,Jyʔ] `a&PDcHӭ+{(Id'}'JjZ)mIyӌDa? @Eybq heeD>uMaḰ (ؑk?Id\ei8PykV-% ┥\}e-jԅEMRZۓenw[ppfRa!yiOhyaISdPXxƥSfo>& )lxj߶yY-syZZY߉J;Kkk/ mHgzO+l&t&V >ilQ OzWՐs ʨUZhsϋԩ,ܮc/`;!V[t vL(谙F+EU_Y–B eĴ(-* VJJzүI}ۏau@? >Kh7\]YA@+,KMJ,hj:br2ٰ֜j "_l~Uj`"Y 8j @)@9; yݩ9έED Oׂop{VcOImS0xWVEV{>"J1NYcX«m(h-tRQv6) BH֨gM 9 wPf2 .QiRr 5|Of%fn"r2uvH&-Yу }#KA 2\ w8*`TDsGzs.ئ4MEN^dL+MP*P{L -_⎄L]WqKZ&hԑ,եTp!&i&JMNx_*ȰIl]& # МA`s"S\h$>v q g=qՠ ?@PbB%_bմℙ 7*M.\q^Ts㔰?;늸IǙ'!5c"V r-kc&*eP&o>J8uA9Y](tGWdcׁEn`‰(eA=yĭ2?n1RNwz]ɩ&5& vlRI>&A )0# q_))7cvt 5 Yԯ@/iKƌN- li-YDSW>Ba2#EB1Uw;&jhU"^5^/h#P;-%}oLZHMRLZ’<)UY҄RP 6=Aj>iɮpZ 0]ZZuvzmb}u6̒[ER\jukWh8Ђv,<*1IY$̌LLX-BٞWjtw=cXj@DhK;#H"d"dYbiiset\j-Z%G( `o(3VE/e/]M iPT Q* HmE\'ue.M-R;Rf8r)j+\ \I)F^cuCv+_Ne)Ɲ2kfοcT17VrROM/EðPb[3e.\0q=)AZBoP.$F>N)C|O[kZ~)OљgLʹyRpFAMa*}?>En䩑p2Sοk?_5TWث zcxUSDNѱuXQtnxCS-ŷ`F&tBEcƑV$+$!UrH5Y%ZkUd`g21QT&R/w$G#Te7(TxA=&-zAjvÁ8"nd#_h~҂o aFEqo56A=0uQ`;7(H7x0e;U>syW}v^T(Bv?v/~b"%ca&6q ĈQsu;DSAFAzt.I3Cu=q&pr#AHA bU`R`;+ WgE`+1[[QWSJ'E%/k<lACҀz$>C&%:Ru}aAv/F 㲁Zh4XڔqvWovn*œrP6{[T 58$UIE&@1oB#VA-gd3H w 18A2 yt8-Q9p'\dlfDc5FJ>G(4>*BSlL:A!.'g9bn4KDEjX+fSS.r6`O72irx3H dE*s"t{fO8?zՆ!jY^/?. r!82h dAf8@03@1BSFwc7SYRhd I-[^v%&TFhO"A%p}pTA#A$W+-[o$>x2Wx_eXCM&:=MItbe7~cCx&t(VQiAg<@{ u|v\3RD1e 9~A(d~/ g(] %3Cf 92jW|D.ƶO |x4 5 0Z)ß"akkO{$/STt1R]vnFAaPO&/)b0 *ӲdK)[Oo?7Khhmk`5pXZqH aSw໶(X+d*q 퀍y*ɵ ҋhwDbXYDL}zQX*!sŪT%2spc%g/ rj~fVPqAnsK\Bi+95!G-V8+)ܖw+8[]FS7D O38+3_LpJ'U=\&MeJ)hVpUnq7rdy2l%Pm $MqRܥbeUaPmz^IQ#c0[wؓ߈%tp`ٵQtȅXeexOZ=ZAIZm@HR_+]V䛕q49yzwu-V(}b6*YT}Aي)CډPxY[E J&;}p}JR4&c]H昮7k~(J܉nZEfky!n")NxYF[T(aʖ.j:;ElKDZdeVuBJ+v07H" ioko / \A '4kJ )&$[LjXY#m]{RgOS _T|&sZbM…QKVAXж}&x^Gfyx#Ie=e@[HџV6G 6Y*Ft!O&ᶔB'e2p@-tds#96#=-J,qˑi=&~)oK*ߟ77ZH'r(RJ~ob"ԮUs9(Pݲwѷؼ͓S&Qa`&ȣ#YM.7-_c=mKk ~6Q3E= &B/Z RJ"4 RM@8ѡV#%W 4mAakn" ./z6 m Z6A NdossLT"Q'cE PNHb Mz? l*p(~ rBpL?V׾ 4h%㵢9x(d-|;$$TťKIX)̨,^F.zR# #XB'VVC2#-4K@-EM[a$5u4ɖb'd8̟GUJV('Zaą}" h7v{GcJAi=!-: P+5G#)K;ʨ%1pFN22Tt`͚鎤$khsI(ҭ'oU2%8fb 2^%%%(z]c# bih|K1>UՠB z7j0]a;gJh$y]}#]!gzXHyrTPcG!MIQ30ׁ>D,}Z9!%R԰.YX&L'D=4ΆS(q WR]l=Tr^bYb3QRFvܖ\̑GA۳gYBS`GjDbb6Yƺf39;&x9!̢FηIȐMoe=FmXhLŕq*d: ^fFMj܃^-t4ɪj_}BM=m=JGn^Ɋ?ƑW$#S3~8v)KKB(RʾR*U|GI} B#Nv.FYw9?L*_SM 'F_+vvV_q_V[[QFqTN1Xwoc<EՂb2{+&0CgGTLfDPBCVD'F8QKuy&+]3-W =A\@YdB)f{3'J0\TeeX|W}6Uf-` @B:EV^qa_PhmF6T-t(%Q ` U< J(5T@qS J]g+@!f+BCBcZ2UNLzzԗF(Db.mygb;LшQ 7P9KWcSJgfaA5Jp ŌXC7VKAd1hĉCEn siEBL S%]{d9A t&[F;S7ldT!37Yk u!!>7֌Fuf9gUgw1QCSQ%.x.Ba1tmQ;N2*S+(I !YA2Xg+X5sI#!Tmkga p7~]$q 3Mh|Cs0NQ4j2)snC@864vhHS2]ND4SP~h؜( z8by%{e.Ap~px#hENI7WHw5"iڲ0qIxPR>fB^0lE N|s`79X)wY PzZSs4'0-6lGIP\qQed>"*\i>g.s*7}A .jxr&]+ghRXi3pY2[v&AUbI"!Yƈ4=g9 Wx@`HG|#c1pĉU78=mvʑ~dOWJJ1hlneP U"jWn wn(EaL ktG3yr6BkUo[DSh#O9Ap0Ewc")RJAA!fԅ744*GƠKJԘK4fhsDlx QlV >JB3}BV|h}q%Bb(&{5!9m-*eY#,R'pz4'=eH`` DYDY:%"C`\Vf]Sg&JB/I\ʩ#ET87!`g[ VauK }Uۇa8@Y󺥳LSХb&5ш@K"[Oū QۂKA@iDYzIQ z'&]Oa^28%#wx˶s7Ex `f(P#t%+O33@Qk-(13`Ԫ<#1,u{^1c az|{j[C$(ܙ &.zN_JZFDL2ơ6pւ^»! h[( E&yt*4PI(5lh!;s|4&Žf;5I_[䁕Codo5[`q"B1#¼jQu"w70;%bz.+|'qRgʮtSE~2xWA_ۧC Igi gQaiͿ -1@Dj3]:=4 ̀%!dxZrWԸG|qbJe`Xp .f ˽Xp^5njnѷ3ӿ˻)Q/@E6J8'Q|+.K|blЦt˵q0fqJU1Qt#W N+jY7 {qsq"\VL2#3T@e=✣9MDI2ܝƕϟmJ]a_&yXz=W, g cظ\F!Pk`2M m ax$a+Ym-Bw!Ô\މctt2qD~֛ t$++=Mj /㫈Q;l@<u[-D^F~-(>9! ,H*\ȰÁJHŋȱǏ CaD(S\ɲ˗K ͛ɳ!͑3 ѣH*e=[~(uիEU+U`{lT ˖eWp߶ ө٧e˗eܿou ܷGyn%HҰ㌀#~uD_i B Wjਤk%ƍ{(M?+q쥓3^>8_Ԛ}Rݚ~Q;\ay eʖ)\ xJŃ?_5&S8NL]@$} 1{{i(-%`f ?SJT$`}$&t!y+nV{Q1F\ُ=:DY{Mh\b\W䁓Y TJ%Xl<&S` id`lGvd+"yJYpT6(T+ipdуiVZ@F`yUsE@yY*~jQt͕Tw((` [&fUK%sv&Yj )}5yTtFٍ%lZ)y$%^5᫗VPn6ڼ#eh**}M0=Z lxy ? dKѻ[omhwX{+tyzcejSlPћVR}J04r)_C9+P]BlMbݖ-D@g=ii?…/?*&bGܶfF%&q6mZ'vN6Aq:[5`=#Kq7܎ @)lsleb@ ;kATצ#tź\cw>n6ܕs tnӛGvG оNNEzHjCيVowڞ6 [L8_ OCB hס@ž 턏ܾIr($HHq8d  wÍ%dTlxR7qApu<+ǥHj]h McxnGz2@@ۻpYV%9r/{Cr:[lBuڧ9B|2&)urFŵ X B=R:1I䗍Nٰ/|xbvȘ K2@8 :7ˊ!M<*e1$0*pNVE Gh(tx|QT*VvY }'evBXg^kF73Hk~)B[.#dhd)|CHuڴNd'hx)ԃGUJ ZsS[ewOSkFcV:23Guc H7+'p1@ 37j²eQK3Zud&D=y T*SLW$N,X:m(vAV|R'D2 6\ Bwnj$f0\v?97M:"уVj3S A#Z%~17APPp6d'PQ>j@-u̳ev0#2 t&#]"VaW]uLg 0R3MB'98Y?g$B9Cc([z7ySGʈG"2g m"6VsU+aquG4hdI+>BC80q8Tg>VQ:y P#Yu%I(IS /D} }&!e5Gt}IIWdsȵ4Bx+g)3FqBDz kofZW$G5V^/Ւ q#$N47t_扤 %6 cnIlqVVD7V%YZ$XidKdUjHttŅvԔtS [ s=ȍ Ib 81N1B9[iu"5 'WiQCIDENj-F7fSVg'#6([!2"6afGV~ wM$Qt_g [Bك0R?0T ы8k`b"NfNeZfv~?FW9#[3W:*j:9β:y€n9`?}Ux>)uNĂ^YUn#fU JسO/ux(DWև;>Hyʎ@Ȍ PZ*:%I6=VusRI/3 u%QR'+{)R b?,P xL\0 gEjAhhzxL|m##In8ըe<ñ*M.Yǃ!IICXq^:,YK!պYǒYK0UÈZS(3e d@ ◽Ǽ \jsZdS+`P1 vE|+I;8e6}l~:#\td5h Wdv5 {:^$3chq8(>GpL1~T ]Y#v!Qϧ64f`kJ `{9ӑ1z^ -"!6b};FZLAn-Yz)W5'\lqO)uZ^۩řnl$TLAEM2EcDVZ݂87]V ,X!HMK^9f{ -UR=mXэid&FGP"/ZJ1HK]UK阕?@Ҏ@BZHjVW Dt͕SԁI@q&J;:݈FUZ \IhnLCzmZK窓`)+C]JdJU~EiJzx֏(/ES鞨T6jӱZC[@n}ɻNH$'lB::UUb[8P!diŭ20,"orV(ft>%'EA+{FBcq횅+Jm#*QOZ]ؤCVV禌CdA RA)4"5(}gG8z1{!J)@nc1r 8RW6(N1p[gMX%&K_tJq[:Y{ؔd;hNLb|Ҋs\$'̂ MD;fhq!!SY{f,H.DQ qh P\"5s~nZN$lsI:&#*+@K.s]7AdE0m6h j:o T-抔ڷuKahG[(=2qjhiXVz=pKJQtJQ9KtɤTb',5y;G\c 6 롙~v6Io&$oPzX-#0Kqrl f>%'Ԥ<~MD拠ֻ 7m:{US/[e&$WHbk˂d)uih6I^hjvH 1o9&Qm$C2^ISD(4Tߜ9t0iY٢~i1ƄLA!>Y?]WD#|IB~PI%̓Ȋ(}{_|Σ sT~RNMnt v" Ĭ7_9ֳE+BS#ƌ]Bk 20=/E~6!؞F ׼W\i,  ucqZ֥`SYf1ͺeL5S'RB'ڜz J23” $,d5)o/w5d\}DFRV6x!H?jMyTP+=si:O6F(o)n1IL*f},%?J@5 :iT*7oE#I#gw[thwhGGd'[F-b#nDF 1M1Q,fuC7g1 T Xbf"!rt#fe=/3VZw6ZGB}\B3(VeSC=3!a>J7@pVQfg2/'$ d;1]@傡q#"g'RvO=yȤibRH>IgS=Kjpw>؂?!/sQD'OS~ul8nOr,h%}vBt![;;2w\H0m6,=(s_qDN!Ywsw]e 5B'Jrt% 4 e)Hh, @pb qN%Qk/ %DMvDl~-^ o-.1k`Z%K 37 pTTHyηqԇH -|Ԓ GZR[#\|10"P R~υ@"H1%sr $+(cSd;hgTIQ95-)1E\d)geS` |-Uc<ǙkZv=aV/PV*ZYM:@"Kh=dCbDD\X0fap.C)rtjJw0q5PkԛP#"G{4;Zf:J仦q'Sf[nH3s}&$v(G49s݁ae"u"4[{Zb vYLvGb)$I3U\XKT:F'Xsj0Iyz7wsC}KD?$9rKq A\ fq"%!#wz(\3 FPؖMBT/dWբΓy,$!/B= }~Q"vI5cնc,cMƜɇ4:%R E'ft&{ .6|qX}S_Ae;%>~8U3=l[Ӳq ]k@K#h+ay5 \bH-L-:º\XU4Jt-3͸d$H'[lʮ:qV"XW*S"%kfP%a/KbGl2X<Fi;54q !z$N"mfDy31mrKRJ9Q0r}@}r?k$QtY/{C]Q_sy:՗Μ8A'! ,H*Lx*q@[.e CIɓ( ƌ)cʜIfÆoȱ%GNYѣH%ӧIJzGVvl ATÊiYcӪ5Nm%ϗ<]˷o¥[췰Zpynˮx K>8? ~YvgVEb6Zk; ɡry{=52ʶ'\wDͳW2WN]!nܿmsU 2z&֋wV7).SLOe{^!djOKpBłS,XSˁőR@! ߇"bXJU`=. ~g9UXpXaQzqG-F=M SJjE]A{ek_^q1`6l>@EIXjZ%^|b&9 0'Cn?Qu)fBAڗfsrҙK..E2EPFM*_iTUF"Yx$.A(QiY)}KfSqjmgsRA* R+^K|2e+`@ddvb(ZVƲX]k=Tp[*(Su#%[1`K#UTn%l:$Pej~m-;WC^Ia+;ҜRJC1g8fIљF]t MzV rb;e3nդ|3=/U%q˅+BXΉ՜.ĪBb=T=$/R=ٽuxsksߍ5+QgNj$n".v8g\huQAK':$2l p ֠'B^-rAZER,rO7.PX/jؚ2{+\T(rMIwyi*+8 j ][l x[ HQ5f.)C(d?u P&炸pNAoLC $@!T'$iajJumAkMhUD},AJPs::a` h# [r <S*P!O' dt\$ПxcRO*:3GPD )e# DI)"J#"%GWTUM[r-A=*rk%z,MI(qPb<7(*)ŵNxebRKubrHkw#\X.媶`W?FsB|r)TG€SO/8 ZrViU;Z1c-TPE nOSoT1/Nz%aN+\A a=yè".#c30 ˍnŖ[QNzD`B7MݜSN{ Il|;km=SgpZ)<5.DVgpsH:JD6?üaXAFh1P"EղPP^mπĜmh: S\ӻW\KisaڠRhw2:!0s8]|&A[ܢ{)ͥ %(Mx R4wf~)I}3{j ӷbPE|#;%!qT5PKJ%s4!T:%/Ey'դ"˲ 4wSIzF3sfrhC G>k •!2U:bOhMF%DdŇz;tMa>/)U8 5;?@>}>Os_n%`M#N}̐*A~pi^'c'.+VVtX̙u#ٓ [+SԠmW6"{tfh;C{KT7`*0grOvyc,MT QQ3_E+S^ {~C;#k]*X7jY7̷-NKc<bvQaL aKsޓd2u!e/C-,Ra'ThGeY mAP'\PURc9D(V)<B2O2dpp\4 @.GzLFցc7"13&@U_$!hc"X sORSr<,TO~JaLtw> eo(5[l3I%~QgF Cl#u;E8 etmebaQ)gΔKNz,PV&7|]]K`Ij0)\s.PX5u(ߡ}M9l'PldQa-#Y'M,4qERa@?$>}7!kYTt6Gf$dR\u!e,tV)D{Q|S]DE)B #G}y>&g !9P pGgtZ [ iGk< f'2vINd[I&SQ@ 7RU?J%(gr]!lDTQQ@9i'%M0ye&aeHդUy^e'="S0BU*7 }Y2b&I{j90mvZd:|ʗ$s\~Wr8e|FnK %UbG7ZGfePeX0eg=b 34 -U+50 %Ac0c(QN5 .摬JcyA#5-bU֤dtu04DP$J17Rqq=pX ObNM2jVe$G6B \Gtbsu a="q{JEb1e |+VxqLɑ!v2uLl!L:xZ(Q 4RЈ Yg,KTIGGU6y H2.+8ǞNGAӯ- ySD2bd}Q4eQ#P ^M 38$5jf:*v;*A@.?tδph7 RO=k(uj|Q)nTxDt "ȓ(S\ɲK# |I͛8sJ49!O?<ѣHrTӤJITdIW2fԮ`[Zeϖ=Uêeڷ;E{lݡ݋= v˷&@ ,e˕@0Ç wu`V|Sp1'Jb?Vg!aub-)J#Tp+ͧߌ1Ԗgq2ʼnKccgEz4VgS_ōиU~_E6y":TiV|'IiYcx)TPp"aO !^IeEOTBtӦ9J@\jğKe'P]"gc溡?3З<eCe I_ BWhAVKkrd`TfHʚ\QeJWa6+aʐUzK7խ_:6f]t$zbɱf&ybwk~$ܨ$qX^;)G_m3 s;bb%rΣ@$msRol_څu2SE)~zl6@wd1hv]|RDYN[ɾ++d`xzj^&eTw[cb2JV+y 2~>dVolr/vtޘds bvZh"AHQZ%AuK h+ZY]󒕵6Ϭz~h(.1'S{Y+s,|HӢmZ@ds[DAe*.pn^ gM|[5%]r.4" a B( /r?# )2$ VP2 ]jཨP J{7ňeDxx|iIyЊVI(2+0-dOBQû1NT٪:R.x7_,ўvg*IW1\!ca'hYҋ"b]fz=}%N<RB3lTJ%…-`9JVc܂ZtD8M3,HQt`Hw 15ei=  ~VƒVNĄT2Ciz)_(_d(78N)/Teގ'ҢĸP)%.dO;-8+2QcDy|25 /:B8 2Q8%*i,NT_ -QA9*>CxiNrH$o(C5Q^(hdRMK pc>Cp ]i-kY(!}B̃B5͗. .km)a "1- OoIػt~ْ!D+oFP2A)bpz.k4@L &)O1o*-k+SsIR%-vɔF-X-eT+%9:$i&w\ԃJщ}nv+~ǰģ|8"[ ReRTXXceWDˤ .uū^g;I.2mV(<+G8 dI1sd0"[ p# jhӳ$q[u );%8.pXG)#]\AfJ 2b5|gGsc ʣx޹ $x\η>msM E\*sXGaOW KZN(nji ^MlB'>ZYJUN H_w0 ne,%K](q!lP*a]TUVUT,jՠz*V4עh*PМ&u?e+]LO۴%B QB2X.Upޖ8! |izFBpA`n*[} [ܱu"*KDLDQϺI^gd5Usn?{ngB7,b%yoC"Đ~nF+ SEk_ H֊Z5X :=6M !?_##w̭})L>w"y~zmxKNa(Zwd%=AiroG6k%WuDQv_^(qC!nQ$$k^uYvRi(2K'}F07>W8х\SW[E6R xoLk~C ?G!+' $ QfaX#\@ B` 9 0ЅQQ56 :9!9&L8Wǀބcv$z8GCaKFAe;b?`v1vUHErzfaZv=:R 5/0%ds/1V@*]#B(iUER"H؋J`~zRh1W#IUxhv$xnfRw}UW]Vd' V{D]#CD|UXʖ| ~BXPSb4!SAT˨#u56vWv;DQ\.UXEMbmV$Ed\Ist\UV,YYBK4Dhf=NNOg%#Gw$@Y}O^#%e{\wU0fe`]"$j0X)s#0F vגA23e8_k5h0YCq&^_oQ B)[q~9f)fa$iFdRf5cSC 5Z %tբuW9b4>i&#i>XnNro5T 0 j(Khy"$Jv%j@yY FEjgE)JD(RheՀu9 v(]ؕ|a;v[TSSt BYUlHVIb%,,?%+_d1kWWۥ u ):#‹! ,H*\p=x(D 3jȱǏ CIr㯁姉3+=iちM^vؿ~.>1@)fpBłTtJXs&Y`LLAT0Qn(ʵaIf=xHL0X)F{WOdfHb`H2 oBU,\+0e;.U!eH]}Y)"5.\LJ]ޡykB Y(#  SrY>[ꙦfBL Jp*(wBI9@n%q_zhץ"`pV)܃g+e)نZ5\@. +*炄*PrrRg&%ZmaZhєWRz~of*P)F wcFr9Zs/sfE[✮4%ZT^^Ep(+XItb]d7ۓ]cJ+Q+F6*pI~|SjT1e:] $OEǁT%7ˆn!Z`SJU@Ӗ2^ImUdj!'d(`ŷ \tgtkac,uPh2z_TͧL}x7 3&;*p *=%c b 0]tA>g= (gs`PuTI_4xh90VuAe$%L5zqHuAX4*lNDmo-q5 +@dZV6qTFwZPUY]Hi Eos''FΑ%TACs,t1-1ن\%cb*B jTY!?5wa\ZǃHv=Ƙ$b<5E>r C'X()4Ąć`2 XU/Fthq3aep$U0.$]h5" EStb2PT5&-KL|t_[IR[Ot @cU0 犺(.0t>`\oصa$^Ux*fr_Leh?`  v=/\ |(s .>2P9F=WEX#p.Q%љB/5Y+9/ [0"wGyTx`Q%,5(5xrz=9`,_مn5i)qfVK)cGkF= Iw,B0VL/'59,A[qMSxcCS"=;rE3oq5+ k ~tlj)2V;2DzXHpqfa$9,P6 L7DZQ*Y1QWz7&Ue)g %T.PEy8%&A]4r-c5flSj5H:ҫqX2(X.dPu"cCը/[ hQSD;%ŔDZ ,(HvPrNG"Xt& =QRf᲋` e֝^emJT'cCiۖlf'V&LUMq;@;1qwHyasQfіT$EWT:Ibt]Ka.ZH'R0jM %S;0Snӷp h[8Qk>0sȷ|'Z\[# 0+! ,pH*\РP_*ذǏ Coɓ(SQ K^K8s$X=w JLexTiѧPC4ի1ΌUbR5],ԩh5˶-S\3uF{mv*ƴAK#K*۴cJq3' 3FˠNШjƼ9԰M96ȖN7+ЗM^pծ M݆5x MWrwCZk޺g*]:p1w)yQI\LA R1pAUGi%AQDR=TW-G^GVi=Mh G]2Tidے}ǚFЊ4Z`V H]XgA#cyf!Se顑=HFWEuYCa[1i"`@T|Db;|U>vsvi\@@L)]j _gY^;v ;\68& Ӳ$ޚe}١/0dv* DE| =Jښ׳t&їHE62Q@ >(QlT5\u5_; ^ "y =i-2Y~˥eh+bʌT@StaОT!.C/I~SG]Dӟ݃)RnOǟR qMbkB6ZV?DVvI 6Tdd{-muQ\g~svKN\k؜;$=}J+Nv٣tO4RKi;~wzk;WWX9@L1ri-٭dmq=t^Z^o|fTii.Ȭ]KUB">0RMLa [-Q?B'>(׉L"uzijI48&@2+B^\OV?>jMZD[ul DG¹tJgC;r9ꌘJ?kMȷ-$p".(TZ,>4p=K):jTyqW8Y2"7XjT7WKsUvdqgWe{^ qpE.(qI"bhcǐ()J1s)N09 hE7T,d+䦭v"cVuK T[˄IOd/#H4 [X 9Ɋv0rO9Q_VAJh SZ9WnL;9q V}X* D[HjX h=:yyiRO"YntoW\:%!u y3;;rv^=e8Pԑ${P"ykEֈZΩiH3p²1ojL1oJ[*cͷin:͘=Ha0 ٞ +ZrC}"]qU B)^!ЁpWB@9_G{Ud45*H)YN 2zX]Yb110UzN,bD^A˳%6ĕ@a\7NNZNb?K!r~a'xJe^T8GffG(Fyr˔[CF3NbXT],幬U]ȓ[b%(fU!@Y_ : kEB1Bep{ע,ԖN8˛XZjwdf&V u) "A|zZ)L@g+ s22|r+:v/@ 56EUsN{Q>6o[IGLaw2V t*ݗ1OB VYLs=#C[p*ogD Sdx2,;lrG P.XhUT3׋GQTYS LboAc ؠo62d5SXFj3WJO&vP]V*9.-#xX&"㏡i*P!\2w:[pV KF;&*KMeRfDo(8z” tmuBJG"c W F- &d'!d~ŋc~Z81:efb*#17E$TfLS1ݢ@T@ydo;"6jY!^xTTZ4 CyP} V5a[WC +Q4e[㥮O ܅rN.!.D 1Y]TX a54;UiI %(ó{<! ,pH*Lxk`C*hk`ʼnǏ Cgp?'E\ɲJ_`\h/{5os#E] _*MJӧajfUV*ׅF &׳h6 LpJŴx ׬( &ږfq3Xղ"yp of&F,7\v1.Vcא!Iãs9p1cÆ8[nCμŤMKNxN\dR*p[P'\KPъ6XN<ѦJݲL `[bkQFy!_]~TE{ 2)Yh(6/_U!owF!Hm VD.4?]OP  P_m2EgUywhx L< kƗ=)tDx8 AUTSML@VBDv(ULe(Ѹ)iAx;\]ePkAvHȕf\g- 4irtK䨅 H@f${FvKOy '^+R_Q^*OMiZ9PuT<) !Gfd%gJuJC܃&X `qyj5fUR՟OM]H)QN@=3=䛘aEW ^dI8QkvEAMXTMbPk1p1 'MjP.bކnQ8ukl@N:<`t7W3-@.ni#uV4(s+{ISUy9Z6tIWړT)LKs+dOƐ=hha%W!# &.,Kd^cۡwSVTWf۠HsB{5$/1Ir#ܭLaNy<@-XxE)mH(Ȱq=Z>ϔp6[ 2K*'MTR#%}hP֭ W@&N0{o%L]=jeZSP@amX+9pE+ -BE-{8W]S|NtrBeUż%;)?#}1& ]($/h,J=DsNs+:gH_[ JYSdP<ؑIAV~?ُ ]peڈD$Z{(ž!dnu]QfgaVb _ނ3v HM^%l P_^(q*$oNYz<^FosP%ZwFht6JQS֔ ,՗ Li)v9v!<̡zaR{EwQmu+skdVDoG2#q)<PD(cRL^POJcPto#f?q2!8`VP>hYhhT6czcH@aGHHRXIf920P(5j[|#xS[q;R7jaCW:;X,JVKoQdFoWVDGOHLs{ry^ Ff16f-XAfP+%Kvb`Y!&z(o6= 2NAY@w4R/㈷Q7Hj0a7O,}k VfqT 5B&tA((9{^QUbuR(_Sfw\w%`\9u#blxUOYezjzMR "/3x WWh3XFl:5j uw(ye h&"h.%jF~YrZA VR]p [NliX@U`U">Bc$gX=$cV=TZ30P Zܨ^d# u߲%e#,2~ Y3,56XPĕGd$v X~ @\&2ВFK {kU)#$X\ p|%AeF($g9U J11Rx@PdFhx@{0Py2$/"u*8:VqEc ;eG}n!8!Q;wV Py/x*v$f9Xd0@j}1&Kru1q"pXlSh*9%1Xfa5H6 ([7_sR?}t#y_2EՅ %j]ڃT)H218h[q06Hc`.*u[0h' 0|6S9=:%](&/ n6T@ I/EC %JOi2e0PRK9xb@y6j:m*ay3a)5Ux g:~FOWbkO9QFDѬ@->JByY*#dUZIpZ{;VsK%Q <x!`OFW1O! ,H*\P6Hŋ-ȱǏx(2"ȓ(SNܨ˗EœI󥽚8s, I@  'ѣH*h=e๴JX=Fׯ0ڲ'lA`mZ\P{Jӝ\J}-[ݲ$qq#DhV߱e_:@Et,3T-`\^rf|%,+C[iX+ܨǏJ&8Wc{.kG9o;OX*K/\|<Ŵ:.QؽquwF ؖqp(AalCŕ߆f__ÅA$[w@{#J(|cUP)P(HqWlqX8/pLT-`rɹ"1F7-P0LTLP@EyySyhMf$8 %f6$'^Kkxܖ_@=^wcgF)T#vXE5gS-jgK 2T?]@YEL@IĚpkcGjf4W@Ť )XSUBfW[_&o"|@f))Z螢IAv&Uif7TJ1es%BзUxW%fb?h'OP[< F{rm t ŌUb_eP1L0E+5B[f' 9PA}={r=b+X܌7F $)Se|r!c vg=ɪjR=IaOE߶/sX=IcnkŦ]` @^*\PhPn5|ޡ jO*S^z:b'=d3VvNEˉ@ )j–]vTfNRbc旀ohT\Qm!V^NvHp U GRpa \d ~+gJљm ')4Mdʥ>my! F1jLئW9X5 <9 fS'jUfg90> [M$#s 06l%t;Qnn2l8 :a/u&;n`B^VWbg[l{:5`y%?lh&bO^h%IJ8 i3u h IWԏU)C1r>X=L1&:eb){+}g' 5Rf u-5y@ҫ0~Ѕd35&رӾS0Ε2CQqM )iQfDFBM_TkZfl@NNDeBs 6'RI\zǗc%4rf/$5[LNNF1&rhA;^gʴժ*P)U8cVgXXZc\5#0nPOZ]ts) ;~ݩavo&'gv2 {-^xՏ uiU5 KeI`i׸kU>.:a6RPV(MܸHR6D~N (zs;93ti2&-\ˉC戫QbZX ^"c"N._Dž3SB~KA%.)LZgSnXjsvے6);zr fP![$F7Nn-4gxPWp,bIIO%^]w 2] %bzńSq!u VQ)­'MI:tKSy2J*8>X M\tKVTLOʭJ\0σl8[].Nxܫ4g65g˺n1RgyTFD==r XΧK}'K=UK'=0aQaVu{b-8~Q]v#=2?pC #.PpdWQGAS}UjTo`VLFuʇ@?Xx/] eEf[^^SP :~(g4w[^pVoPBT`Fo&?Io*!&qa P:ObS 6|Tb-VPцIG`={XI f1n#~떆xK p#Y/k*%UKP PQ61,dwv d2SĀD/RI#U\BJm6̘rVC eYv&bA4BwAStWԗp٥S2KR:7iS@W5FbC1*EkfkARb8gle]~it?75r#dFHXAe MɥeML8OH7*5zL`J0oe_h~Rr vVJ8%GƷj:K XK{}g9uTK'9F3l֘aRƒH8FBk87<4peLFU(BK`N+Tj:Q&j!=^zԌQ#, \9kkZ`$,-nHȗKd!rѩ\uHPqf` ~#}Ir=$Xq9ĞQ%'S^lrJ**C2Iq]4e(3!)Ӕ9HIuڒc6)@t$řf鶤19^U $˹o1MW(7Zl&Ӏx)Q*].ءYU&,1DP,rDuQ"RWLH)P9dZ, nC&'TtNFVCl3&^afr\W"\8U}"ђR:n*QR 2)*Jl)!vDpl" +ejy hhbu^ f* !10,E&5sICwBpdХs{: DKtфuav -,jK.1k;D![&K&{)K**5(-a2W8&,!! ,pH*Lh+ᯁ|h‹3jȱ#D CE Kt@ȗ0GIMx͟@;48@ѢAҴXReKOWtOVj-cJ{<~JvdϰX˪ W&.ǴF˷ _r۲'΃;*&8=ǐ?λׁ ki8lJKLz@{Cwֽ[Xzሆ3s. @TtUwҀ!L- g x̀<ņMt^Dc|{ w׭;,|g $@Ɣπ8`闕 `VPi>XlCA?EU|voWPx_rtlBL0P)3]p9_n"&vb\PAL2 %PŸ^ktDM0]x؛Vf lDo.aʊ f(Wv ^_~Tyi ޳|U|*a548"+{*$\ X~d ę)Usڇ Iy"`e-\% Pk`knf&Y=n.n 9,Q|g@T@Y:0@ FVeMgUJ*Y=E ڌ-`+e$euԟ{s/=Tyu@;3gڳEq;尳U0ƒfYj'~xZd\َhRAvL_ld+0.gke6`_yhjGOƏj 'RE+t#bj[!a ?ٺBE\7ʒ8--OJdz%7צlR7_kʉ@dLOs3f~u>LD`Rw1iĆǹ{xсL[6yFa (Hy8"`@qfYB4F_ !֮Pw(%iF*)i ]#uȓ#H^K1AVᠧj!YI+J6 Sp0Q 16~Z+'*J2FQN}:J3PaS_j1>bu;ɯ1 GO)hpԤ9W'j:ub2)gkܪ7` 3oWsknQWPaS.D)! XRF$l>V!J 5%'fWdBXNJ:@&󚱢r]HQK!DzVI뿺e-?'gSK*^k܈ B[N dx4LwpahDwb ֋GsֲxH2dW+dD* 1@ZՍ %LZ&w׉ _k silф65NU8'./Z8re&5)rlsZqb +Iw$֭#usO ;K?ky-^օ!j+!{Xт؛F a+lQW CW{ƪUm[?Q:A(QDo\a޼׃fH$hszENK1-|Hw]Vۄw\0~nu0dF#cO:DnTQRFHU-K )lX,K+2c)z{(f e-?{(??fk]^<넃惠VlpjZEq7nGs&8F'_ODP9 =a \ ugmoRq8nN1qH1DcE&!q`t)@fPx8p&L4 -@ 17Ё7Q K$LRv8ȉmE6lK`ѐR XƉxO 33a`GL4qjU''iH`^n09-19fsuN-4d<&k&E%*=4E('ef=L@'}%I`@B)Vl$[Dv)1V;.]xrb#θNm#i%Un92ggK"Vo%,|[qؒc!icc h'bB5K` K s8`%>Ά9[XKy_'vcA7Z"y!6"ucYUPQ QIB2{ԄG{I`CGb4d7~s)d}~s GI. J2w" 1%F+E`zYfYߎ=Vfo?Ec&5i8rwlMh5 U =Rp}{r5RpQc3.9#^j1k)>f9 ; )d]%@dcBa`8t 4Vp'Ur {}}E&x;TLApaeיL[fwDpRYkEZsf XZh(1EoįѽL+~4)颹UGZVC.'Yѕ`%}FW`k=TEYpUe&vR}*ֳ.-+=-+ZG$c7 }Jb4m=ݮt[mn~MՄӚ+"k9[V~ \LE+jQnOtK#NA)U}c=N5 ^{ia-^[ qE?L40/Rp- >pJKP@S$1{iH[pFa@A(p H-l Y xeA @ )}v<5XN0sP9ڟ#2C*=A4o9t3ZQ)i{@T&pw3`5 n&X&i8)q"]VRmyޒx 1?4-7FqK@zY"" dK8d/8W>d6k#Pi'4\'4f(?-K'ltpdTQ*{P`ԥ.P A|+_V]:3~|). $!5W z"exE%$wQ!z)AwV3L֫,·YKP$b1@hKh5V` ft-~ƔܜK8]@WFŔ!=y)&p|Tz8%cBDdzB4K<ꗢMR/^%3rG^ٞtQa5>Tzݬ2_LD)|>]EM)[db*O niM2a ِqU䨨bvl"G&[PۢZݧ)h@yB.-X&yԁh ,^""ą1Bis(ϣ6ګFـ4+ ^ Nknx|={ʵK.LPt0f"F (nVr{ZE>-ACD'c9m !1(*JGzP,J[wfs;S* Lld3<LڑآI׆7RYk4>XMcaF!q0n=9IsZܣL VnfpϋtZ%m)eǡrP? (I}Axe@T= ֘<dD,4ee"+E{ '\{`LVQU~tRU}hg )LEေ31f>c^Ase`=+ &txC~nԸg]gۄ@ l:acg/ّ=g@hu/=QUsR|kj5pA$;4C//Unۍ0p1SR t8ay8."ͫH'?" RpJ1Xj 3Pg.4 ]x+& >pw^e&"y!FaiR#' > `BEЌ$ (*d+V2XeV ,x؂CCr)BNɖXķ3r haHhݱЎL8}@]uJ/ ħ(|@;=F+A-X) rCBSN.¦ ST-W#TgYNֲcBL1_5D*b%CWN{dlA**bztYN)x * X2\sA{`UiY*3vS%lX{!˪t))v:7aAqґM%t7>nr12cWq\\& t2i/5M?a"82RMYK:W+5:;UH U0Z"[PamsEDg}kIzA:Ա^x$VYsךU7e+:BEJQ*dJuķaq ?U[\ 3OJq1K>cC9RT*K< P(*F%e̍c `u-nC.D sM)8Q@9d>,K^I|-y)REGw&P'y/ZLt=V _!Lg9U b- ucU}juU}6U Dg^EDL@RDrhv-4$lGdVkT@Je TVBMDXS.EyDf6\y+G\=2q\PtopK=kPZ;vL`~e pr C2ĵS2qѴUGn1: q؆\%7wB'gP&RGbJX@z@KS7#R\ry*g_ַ?؆ e` ~TAt҇##&"_00(ZUXw4($-x5TU dhϱp_PJ ,#k(t+fnqG'UP:-Krhh$1QXr evdtdxcP{6p 8W1X~H 7z.BowhoQz2X.LLl!r%&lZaG8\"C#1*$j2ҁV$C\@02 2^,( q?Q H'S72'ReɆb" GS`s ؋ҋU8M7NLЇ iLM<*2-Qhw ݥ7E+!n4e?}p{)"}H4IPhKt$ THVPy7QSUB$cy 􆖩"*oӧH^՟ J'K:@˲p?VذV 6oÚjm<7fP8l! ,8+ƶ!kиc{7=0ZW~꓾޻50@{%|:Qh>ٴQ ⵻X-cӦv޽1K'%aΕv|{ ğ}@y})P}G~i'+x+sLE@"ވrs\0A ,AE)64@o $DPg4PKUEOniAw4eB2@)(Rc1dko,`IM6pY9bTzhKs5Ph8nf^UDB覞R[9BL0墊.q _Ejkt5ݨu])C!{|J'$DX"$'A fLڭ )c="E])DA=U~#?Uɗj }"ꗉk][ E]h/9l19'M- l[4'^4QE'7̑Ck(юI+TQ2\/E=G ]1R1=ُW52\( DrXrzOc&cεvOD4A1 ط7/jU$2Na@i)=U9m*-7SئLEPCtѰhEybGsKPD]wMo6=sf=_|_g}eB] Vu5W~E!$ JJFuT'(K}lew)vg5g`s1-J-nSN<˜. s¡ V\'@~#-^J̆Th| fisQ<(QN"ER De h^ZxB胻T&Uz D.%[tBz-P E@ hR_xLSLQ&P p-Ȧť1s&ɴq8x)F]'t ^ȘɸFL@ 'W .K_{xU"V.z^t+RSzϣ8T/oH)+T"KWhvrU/1 ,S`qjwROPaH֑0{iHz=)@Os; ڞBf"\>ł@JQlK{T6-G)TEq{L6x" k-fÉAX-$;"DϦh8)՗sT^^AʱPR^XD4%GՌ:K\-g&4;ʩ9 ciMa;t¶0@B1 2-g0rJ OzKm)KCUDM}=z O%@vF!.\Xf ycg:9T$pjGt
,nG+Ӿm+@F{C&?$q`B9EnxK@1x- j";/|)@Wb ;^BvKd"hK][ 2ZQa+ =q0| SČi$&WgRH(MWC_ ~̈. tVTGlv8TRG<8bkQ@6 R~V%vsdhT4?"ii;^ ^fHY[5-Hq9=zEIp68u+b؇[U;f63 2ĦP󤅻rU]<۽Vhlș6)A)=+T>[pᳰr_%{[roLjU^ &!Ctq߾:}!i\K;j q^\Di!TatױURb AoݕHGlZBDF#!MrNSShJfI-T@:!2 xwxu4U[II7@xZeJBI; a TGo I6QK TOq )S,1X yuC$ wVvUBMّs" %őЂap@-\D$ s%hW(].8,s!gKn1 1z7yɘ.2E#$Q ^c\}&Kd c[_  @#r/ud1dQSFp`M"`$'T \Ax;D @VIUUY dV04a2^PVrҡZi^8l T2`MWR_[i34gS#;+-t8qm[Kb,V! ;u(r Ʌ Q-<1gxf@6䢸%SVDOTdv) xSr U_Ca! a"gS"5[& ]g'EW5@ WS thJj1 T) "Q7D@Vz SxZbtJ-j(S2*'պ^p.x219-DC 42(E,E)|V;҈Z-zՈr U1y tReT@d MagJ d’ dgb\%} \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{magrittr}{\code{\link[magrittr:pipe]{\%>\%}}} }} tweenr/man/tween_state.Rd0000644000176200001440000001244614026314613015151 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_state.R \name{tween_state} \alias{tween_state} \alias{keep_state} \alias{open_state} \alias{close_state} \title{Compose tweening between states} \usage{ tween_state(.data, to, ease, nframes, id = NULL, enter = NULL, exit = NULL) keep_state(.data, nframes) open_state(.data, ease, nframes, enter) close_state(.data, ease, nframes, exit) } \arguments{ \item{.data}{A data.frame to start from. If \code{.data} is the result of a prior tween, only the last frame will be used for the tween. The new tween will then be added to the prior tween} \item{to}{A data.frame to end at. It must contain the same columns as .data (exluding \code{.frame})} \item{ease}{The easing function to use. Either a single string or one for each column in the data set.} \item{nframes}{The number of frames to calculate for the tween} \item{id}{The column to match observations on. If \code{NULL} observations will be matched by position. See the \emph{Match, Enter, and Exit} section for more information.} \item{enter, exit}{functions that calculate a start state for new observations that appear in \code{to} or an end state for observations that are not present in \code{to}. If \code{NULL} the new/old observations will not be part of the tween. The function gets a data.frame with either the start state of the exiting observations, or the end state of the entering observations and must return a modified version of that data.frame. See the \emph{Match, Enter, and Exit} section for more information.} } \value{ A data.frame containing all the intermediary states in the tween, each state will be enumerated by the \code{.frame} column } \description{ The \code{tween_state()} is a counterpart to \code{tween_states()} that is aimed at letting you gradually build up a scene by composing state changes one by one. This setup lets you take more control over each state change and allows you to work with datasets with uneven number of rows, flexibly specifying what should happen with entering and exiting data. \code{keep_state()} is a simpel helper for letting you pause at a state. \code{open_state()} is a shortcut from tweening from an empty dataset with a given \code{enter()} function while \code{close_state()} is the same but will instead tween into an empty dataset with a given \code{exit()} function. } \section{Match, Enter, and Exit}{ When there are discrepancies between the two states to tweeen between you need a way to resolve the discrepancy before calculating the intermediary states. With discrepancies we mean that some data points are present in the start state and not in the end state, and/or some are present in the end state but not in the start state. A simple example is that the start state contains 100 rows and the end state contains 70. There are 30 missing rows that we need to do something about before we can calculate the tween. \strong{Making pairs} The first question to answer is "How do we know which observations are disappearing (\emph{exiting}) and/or appearing (\emph{entering})?". This is done with the \code{id} argument which should give a column name to match rows between the two states on. If \code{id = NULL} the rows will be matched by position (in the above example the last 30 rows in the start state will be entering). The \code{id} column must only contain unique values in order to work. \strong{Making up states} Once the rows in each state has been paired you'll end up with three sets of data. One containing rows that is present in both the start and end state, one containing rows only present in the start state, and one only containing rows present in the end state. The first group is easy - here you just tween between each rows - but for the other two we'll need some state to start or end the tween with. This is really the purpose of the \code{enter} and \code{exit} functions. They take a data frame containing the subset of data that has not been matched and must return a new data frame giving the state that these rows must be tweened from/into. A simple example could be an \code{enter} function that sets the variable giving the opacity in the plot to 0 - this will make the new points fade into view during the transition. \strong{Ignoring discrepancies} The default values for \code{enter} and \code{exit} is \code{NULL}. This value indicate that non-matching rows should simply be ignored for the transition and simply appear in the last frame of the tween. This is the default. } \examples{ data1 <- data.frame( x = 1:20, y = 0, colour = 'forestgreen', stringsAsFactors = FALSE ) data2 <- data1 data2$x <- 20:1 data2$y <- 1 data <- data1 \%>\% tween_state(data2, 'linear', 50) \%>\% keep_state(20) \%>\% tween_state(data1, 'bounce-out', 50) # Using enter and exit (made up numbers) df1 <- data.frame( country = c('Denmark', 'Sweden', 'Norway'), population = c(5e6, 10e6, 3.5e6) ) df2 <- data.frame( country = c('Denmark', 'Sweden', 'Norway', 'Finland'), population = c(6e6, 10.5e6, 4e6, 3e6) ) df3 <- data.frame( country = c('Denmark', 'Norway'), population = c(10e6, 6e6) ) to_zero <- function(x) { x$population <- 0 x } pop_devel <- df1 \%>\% tween_state(df2, 'cubic-in-out', 50, id = country, enter = to_zero) \%>\% tween_state(df3, 'cubic-in-out', 50, id = country, enter = to_zero, exit = to_zero) } tweenr/man/tween_elements.Rd0000644000176200001440000000366414026314613015647 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_elements.R \name{tween_elements} \alias{tween_elements} \title{Create frames based on individual element states} \usage{ tween_elements(data, time, group, ease, timerange, nframes) } \arguments{ \item{data}{A data.frame consisting at least of a column giving the observation id, a column giving timepoints for each state and a column giving the easing to apply when transitioning away from the state.} \item{time}{The name of the column holding timepoints} \item{group}{The name of the column holding the observation id} \item{ease}{The name of the column holding the easing function name} \item{timerange}{The range of time to span. If missing it will default to \code{range(data[[time]])}} \item{nframes}{The number of frames to generate. If missing it will default to \code{ceiling(diff(timerange) + 1)} (At least one frame for each individual timepoint)} } \value{ A data.frame with the same columns as \code{data} except for the group and ease columns, but replicated \code{nframes} times. Two additional columns called \code{.frame} and \code{.group} will be added giving the frame number and observation id for each row. } \description{ This function creates tweens for each observation individually, in cases where the data doesn't pass through collective states but consists of fully independent transitions. Each observation is identified by an id and each state must have a time associated with it. } \examples{ data <- data.frame( x = c(1, 2, 2, 1, 2, 2), y = c(1, 2, 2, 2, 1, 1), time = c(1, 4, 10, 4, 8, 10), group = c(1, 1, 1, 2, 2, 2), ease = rep('cubic-in-out', 6) ) data <- tween_elements(data, 'time', 'group', 'ease', nframes = 100) } \seealso{ Other data.frame tween: \code{\link{tween_along}()}, \code{\link{tween_appear}()}, \code{\link{tween_components}()}, \code{\link{tween_events}()}, \code{\link{tween_states}()} } \concept{data.frame tween} tweenr/man/display_ease.Rd0000644000176200001440000000341214026314613015262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/display_ease.R \name{display_ease} \alias{display_ease} \title{Display an easing function} \usage{ display_ease(ease) } \arguments{ \item{ease}{The name of the easing function to display (see details)} } \value{ This function is called for its side effects } \description{ This simple helper lets you explore how the different easing functions govern the interpolation of data. } \details{ How transitions proceed between states are defined by an easing function. The easing function converts the parameterized progression from one state to the next to a new number between 0 and 1. \code{linear} easing is equivalent to an identity function that returns the input unchanged. In addition there are a range of additional easers available, each with three modifiers. \strong{Easing modifiers:} \describe{ \item{-in}{The easing function is applied as-is} \item{-out}{The easing function is applied in reverse} \item{-in-out}{The first half of the transition it is applied as-is, while in the last half it is reversed} } \strong{Easing functions} \describe{ \item{quadratic}{Models a power-of-2 function} \item{cubic}{Models a power-of-3 function} \item{quartic}{Models a power-of-4 function} \item{quintic}{Models a power-of-5 function} \item{sine}{Models a sine function} \item{circular}{Models a pi/2 circle arc} \item{exponential}{Models an exponential function} \item{elastic}{Models an elastic release of energy} \item{back}{Models a pullback and relase} \item{bounce}{Models the bouncing of a ball} } In addition to this function a good animated explanation can be found \href{https://easings.net}{here}. } \examples{ # The default - identity display_ease('linear') # A more fancy easer display_ease('elastic-in') } tweenr/man/tween_at.Rd0000644000176200001440000000200113352357066014431 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tween_at.R \name{tween_at} \alias{tween_at} \title{Get a specific position between two states} \usage{ tween_at(from, to, at, ease) } \arguments{ \item{from, to}{A data.frame or vector of the same type. If either is of length/nrow 1 it will get repeated to match the length of the other} \item{at}{A numeric between 0 and 1 recycled to match the nrow/length of \code{from}} \item{ease}{A character vector giving valid easing functions. Recycled to match the ncol of \code{from}} } \value{ If \code{from}/\code{to} is a data.frame then a data.frame with the same columns. If \code{from}/\code{to} is a vector then a vector. } \description{ This tween allows you to query a specific postion between two states rather than generate evenly spaced states. It can work with either data.frames or single vectors and each row/element can have its own position and easing. } \examples{ tween_at(mtcars[1:6, ], mtcars[6:1, ], runif(6), 'cubic-in-out') } tweenr/DESCRIPTION0000644000176200001440000000230014026405722013261 0ustar liggesusersPackage: tweenr Type: Package Title: Interpolate Data for Smooth Animations Version: 1.0.2 Authors@R: c(person(given = "Thomas Lin", family = "Pedersen", role = c("aut", "cre"), email = "thomasp85@gmail.com", comment = c(ORCID = "0000-0002-5147-4711"))) Maintainer: Thomas Lin Pedersen Description: In order to create smooth animation between states of data, tweening is necessary. This package provides a range of functions for creating tweened data that can be used as basis for animation. Furthermore it adds a number of vectorized interpolaters for common R data types such as numeric, date and colour. URL: https://github.com/thomasp85/tweenr BugReports: https://github.com/thomasp85/tweenr/issues License: MIT + file LICENSE Encoding: UTF-8 LazyData: TRUE Depends: R (>= 3.2.0) Imports: Rcpp (>= 0.12.3), grDevices, farver, magrittr, rlang LinkingTo: Rcpp RoxygenNote: 7.1.1.9001 Suggests: testthat, covr NeedsCompilation: yes Packaged: 2021-03-23 13:21:28 UTC; thomas Author: Thomas Lin Pedersen [aut, cre] () Repository: CRAN Date/Publication: 2021-03-23 15:40:02 UTC tweenr/tests/0000755000176200001440000000000013357450720012726 5ustar liggesuserstweenr/tests/testthat/0000755000176200001440000000000014026405722014562 5ustar liggesuserstweenr/tests/testthat/test-components.R0000644000176200001440000000336113352644546020064 0ustar liggesuserscontext("components") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_components works", { tween <- tween_components(df, 'linear', nframes = 10, time = c(1, 7, 13, 20)) expect_equal(nrow(tween), 10) expect_equal(tween$x[6], 19/3) expect_equal(tween$col[2], '#52170AFF') expect_equal(max(tween$.frame), 10) expect_true(all(tween$.phase[c(1,4,7,10)] == 'raw')) expect_true(all(tween$.phase[-c(1,4,7,10)] == 'transition')) tween <- tween_components(df, 'linear', nframes = 10, time = c(1, 7, 13, 20), rep(c(1,2), 2)) expect_equal(nrow(tween), 14) expect_equal(tween$x[12], 25/3) expect_equal(tween$col[2], '#152910FF') expect_equal(max(tween$.frame), 10) expect_true(all(tween$.phase[c(1,5,10,14)] == 'raw')) expect_true(all(tween$.phase[-c(1,5,10,14)] == 'transition')) }) test_that("enter/exit works", { tween <- tween_components(df, 'linear', nframes = 20, time = c(1, 7, 13, 20), enter = function(df) { df$x <- 0 df$col <- 'red' df }, enter_length = 3) expect_equal(nrow(tween), 20) expect_equal(tween$x[3], 2/3, tolerance = 1e-7) expect_equal(tween$col[2], '#A41A0AFF') expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[1:3] == 'enter')) }) test_that("weird input gets caught", { tween <- tween_components(df, 'linear', nframes = 0, time = c(1, 7, 13, 20)) expect_equal(nrow(tween), 0) tween <- tween_components(df[integer(), ], 'linear', nframes = 10, time = numeric()) expect_equal(nrow(tween), 0) expect_error(tween_components(df, 'linear', nframes = 10, time = 1)) expect_error(tween_components(df, 'linear', nframes = 0, time = c(1, 7, 13, 20), id = 1)) }) tweenr/tests/testthat/test-fill.R0000644000176200001440000000107713352665036016624 0ustar liggesuserscontext("fill") df <- data.frame( x = c(1, NA, NA, NA, 6, 4, NA, NA, NA, NA, 20), type = c('a', NA, NA, NA, 'b', 'c', NA, NA, NA, NA, 'd'), col = c('red', NA, NA, NA, 'blue', 'green', NA, NA, NA, NA, 'black'), stringsAsFactors = FALSE ) test_that("tween_fill works", { tween <- tween_fill(df, 'linear') expect_equal(dim(df), dim(tween)) expect_equal(tween$x[3], 3.5) expect_equal(tween$col[10], '#110010FF') expect_equal(tween_fill(df$col, 'linear'), tween$col) tween <- tween_fill(df[-c(1, 11), 1], 'linear') expect_equal(tween, df$x[-c(1, 11)]) }) tweenr/tests/testthat/test-at.R0000644000176200001440000000224013352633133016264 0ustar liggesuserscontext("at") df1 <- data.frame(x = 1:2, y = 4:5, col = 'black', type = letters[1:2], stringsAsFactors = FALSE) df2 <- data.frame(x = 11:12, y = 14:15, col = 'white', type = letters[1], stringsAsFactors = FALSE) test_that("tween_at works", { tween <- tween_at(df1, df2, 0.5, 'linear') expect_equal(nrow(tween), 2) expect_named(tween, names(df1)) expect_equal(tween$x, c(6, 7)) expect_equal(tween$col[1], '#767676FF') }) test_that("tween_at handles weird input", { tween <- tween_at(df1, df2[1,], 0.5, 'linear') expect_equal(nrow(tween), 2) tween <- tween_at(df1[1,], df2, 0.5, 'linear') expect_equal(nrow(tween), 2) tween <- tween_at(df1, df2[integer(),], 0.5, 'linear') expect_equal(nrow(tween), 0) tween <- tween_at(df1[integer(),], df2, 0.5, 'linear') expect_equal(nrow(tween), 0) expect_error(tween_at(df1[c(1,2,1), ], df2, 0.5, 'linear')) expect_error(tween_at(df1, df2, numeric(), 'linear')) expect_error(tween_at(df1, df2, 0.5, character())) }) test_that('tween_at works with vectors', { tween <- tween_at(df1$x, df2$x, 0.5, 'linear') expect_is(tween, 'numeric') expect_equal(tween, c(6,7)) expect_error(tween_at(df1$x, df2$col)) }) tweenr/tests/testthat/test-along.R0000644000176200001440000000167113352515746017000 0ustar liggesuserscontext("along") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_along works", { tween <- tween_along(df, ease = 'linear', nframes = 10, along = x) expect_equal(nrow(tween), 30) expect_equal(tween$col[22], '#77B784FF') expect_equal(tween$y[8], 3.25) tween <- tween_along(df, ease = 'linear', nframes = 10, along = x, history = FALSE) expect_equal(nrow(tween), 9) expect_equal(tween$col[8], '#77B784FF') expect_equal(tween$y[2], 3.75) }) test_that("tween_along throws errors", { expect_error(tween_along(df, ease = 'linear', nframes = 10, along = 1)) expect_error(tween_along(df, ease = 'linear', nframes = 10, along = x, id = 1)) expect_error(tween_along(df, ease = 'linear', nframes = 10, along = x, range = c(0, 0))) expect_error(tween_along(df[1,], ease = 'linear', nframes = 10, along = x)) }) tweenr/tests/testthat/test-events.R0000644000176200001440000000213513352651364017175 0ustar liggesuserscontext("events") df <- data.frame( x = c(1, 5, 7, 10), y = c(4, 3, 7, -1), col = c('black', 'red', 'green', 'blue'), type = letters[1:4], stringsAsFactors = FALSE ) test_that("tween_events works", { tween <- tween_events(df, 'linear', 20, x, x + 2) expect_equal(nrow(tween), 17) expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[c(4, 8, 13, 17)] == 'raw')) expect_true(all(tween$.phase[-c(4, 8, 13, 17)] == 'static')) tween <- tween_events(df, 'linear', 20, x, enter = function(df) { df$x <- 0 df$col <- 'red' df }, enter_length = 3) expect_equal(nrow(tween), 23) expect_equal(max(tween$.frame), 20) expect_true(all(tween$.phase[c(6, 13, 17, 23)] == 'raw')) expect_true(all(tween$.phase[-c(6, 13, 17, 23)] == 'enter')) expect_equal(tween$x[2], 0.2) expect_equal(tween$col[3], '#931B0BFF') }) test_that("weird input gets handled", { expect_error(tween_events(df, 'linear', 20)) tween <- tween_events(df, 'linear', 0, x) expect_equal(nrow(tween), 0) tween <- tween_events(df[integer(), ], 'linear', 10, x) expect_equal(nrow(tween), 0) }) tweenr/tests/testthat/test-state.R0000644000176200001440000000224714026056746017017 0ustar liggesuserscontext("state") df1 <- data.frame(x = 1:2, y = 4:5, col = 'black', type = letters[1:2], stringsAsFactors = FALSE) df2 <- data.frame(x = 11:12, y = 14:15, col = 'white', type = letters[1], stringsAsFactors = FALSE) test_that("tween_state works", { tween <- tween_state(df1, df2, ease = 'linear', nframes = 5) expect_equal(max(tween$.frame), 5) expect_true(all(tween$.phase[c(1:2, 9:10)] == 'raw')) expect_true(all(tween$.phase[c(3:8)] == 'transition')) expect_true(all(tween$.id == rep(1:2, 5))) expect_equal(tween$col[5], '#767676FF') expect_equal(tween$x[7], 8.5) expect_equal(tween$type[4:5], c('b', 'a')) }) test_that("keep_state works", { expect_warning( keep <- keep_state(df1, 5), NA ) expect_equal(max(keep$.frame), 5) expect_true(all(keep$.phase[c(9:10)] == 'raw')) expect_true(all(keep$.phase[c(1:8)] == 'static')) }) test_that("enter/exit works", { tween <- tween_state(df1, df2[1,, drop = FALSE], 'linear', 5, exit = function(df) { df$x <- 0 df$col <- 'red' df }) expect_equal(nrow(tween), 9) expect_true(all(tween$.phase[c(4,6,8)] == 'exit')) expect_equal(tween$col[8], '#BA1808FF') expect_equal(tween$x[8], 0.5) }) tweenr/tests/testthat.R0000644000176200001440000000007013352427011014676 0ustar liggesuserslibrary(testthat) library(tweenr) test_check("tweenr") tweenr/src/0000755000176200001440000000000014026365530012351 5ustar liggesuserstweenr/src/easing.h0000644000176200001440000000436713352364025014001 0ustar liggesusers// // easing.h // // Copyright (c) 2011, Auerhaus Development, LLC // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // #ifndef AH_EASING_H #define AH_EASING_H #if defined(__LP64__) && !defined(AH_EASING_USE_DBL_PRECIS) #define AH_EASING_USE_DBL_PRECIS #endif #ifdef AH_EASING_USE_DBL_PRECIS #define AHFloat double #else #define AHFloat float #endif #if defined __cplusplus extern "C" { #endif typedef AHFloat (*AHEasingFunction)(AHFloat); // Linear interpolation (no easing) AHFloat LinearInterpolation(AHFloat p); // Quadratic easing; p^2 AHFloat QuadraticEaseIn(AHFloat p); AHFloat QuadraticEaseOut(AHFloat p); AHFloat QuadraticEaseInOut(AHFloat p); // Cubic easing; p^3 AHFloat CubicEaseIn(AHFloat p); AHFloat CubicEaseOut(AHFloat p); AHFloat CubicEaseInOut(AHFloat p); // Quartic easing; p^4 AHFloat QuarticEaseIn(AHFloat p); AHFloat QuarticEaseOut(AHFloat p); AHFloat QuarticEaseInOut(AHFloat p); // Quintic easing; p^5 AHFloat QuinticEaseIn(AHFloat p); AHFloat QuinticEaseOut(AHFloat p); AHFloat QuinticEaseInOut(AHFloat p); // Sine wave easing; sin(p * PI/2) AHFloat SineEaseIn(AHFloat p); AHFloat SineEaseOut(AHFloat p); AHFloat SineEaseInOut(AHFloat p); // Circular easing; sqrt(1 - p^2) AHFloat CircularEaseIn(AHFloat p); AHFloat CircularEaseOut(AHFloat p); AHFloat CircularEaseInOut(AHFloat p); // Exponential easing, base 2 AHFloat ExponentialEaseIn(AHFloat p); AHFloat ExponentialEaseOut(AHFloat p); AHFloat ExponentialEaseInOut(AHFloat p); // Exponentially-damped sine wave easing AHFloat ElasticEaseIn(AHFloat p); AHFloat ElasticEaseOut(AHFloat p); AHFloat ElasticEaseInOut(AHFloat p); // Overshooting cubic easing; AHFloat BackEaseIn(AHFloat p); AHFloat BackEaseOut(AHFloat p); AHFloat BackEaseInOut(AHFloat p); // Exponentially-decaying bounce easing AHFloat BounceEaseIn(AHFloat p); AHFloat BounceEaseOut(AHFloat p); AHFloat BounceEaseInOut(AHFloat p); #ifdef __cplusplus } #endif #endif tweenr/src/easing.c0000644000176200001440000001421214026057511013760 0ustar liggesusers// // easing.c // // Copyright (c) 2011, Auerhaus Development, LLC // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // #define _USE_MATH_DEFINES #include #include "easing.h" // Modeled after the line y = x AHFloat LinearInterpolation(AHFloat p) { return p; } // Modeled after the parabola y = x^2 AHFloat QuadraticEaseIn(AHFloat p) { return p * p; } // Modeled after the parabola y = -x^2 + 2x AHFloat QuadraticEaseOut(AHFloat p) { return -(p * (p - 2)); } // Modeled after the piecewise quadratic // y = (1/2)((2x)^2) ; [0, 0.5) // y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] AHFloat QuadraticEaseInOut(AHFloat p) { if(p < 0.5) { return 2 * p * p; } else { return (-2 * p * p) + (4 * p) - 1; } } // Modeled after the cubic y = x^3 AHFloat CubicEaseIn(AHFloat p) { return p * p * p; } // Modeled after the cubic y = (x - 1)^3 + 1 AHFloat CubicEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f + 1; } // Modeled after the piecewise cubic // y = (1/2)((2x)^3) ; [0, 0.5) // y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] AHFloat CubicEaseInOut(AHFloat p) { if(p < 0.5) { return 4 * p * p * p; } else { AHFloat f = ((2 * p) - 2); return 0.5 * f * f * f + 1; } } // Modeled after the quartic x^4 AHFloat QuarticEaseIn(AHFloat p) { return p * p * p * p; } // Modeled after the quartic y = 1 - (x - 1)^4 AHFloat QuarticEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f * (1 - p) + 1; } // Modeled after the piecewise quartic // y = (1/2)((2x)^4) ; [0, 0.5) // y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] AHFloat QuarticEaseInOut(AHFloat p) { if(p < 0.5) { return 8 * p * p * p * p; } else { AHFloat f = (p - 1); return -8 * f * f * f * f + 1; } } // Modeled after the quintic y = x^5 AHFloat QuinticEaseIn(AHFloat p) { return p * p * p * p * p; } // Modeled after the quintic y = (x - 1)^5 + 1 AHFloat QuinticEaseOut(AHFloat p) { AHFloat f = (p - 1); return f * f * f * f * f + 1; } // Modeled after the piecewise quintic // y = (1/2)((2x)^5) ; [0, 0.5) // y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] AHFloat QuinticEaseInOut(AHFloat p) { if(p < 0.5) { return 16 * p * p * p * p * p; } else { AHFloat f = ((2 * p) - 2); return 0.5 * f * f * f * f * f + 1; } } // Modeled after quarter-cycle of sine wave AHFloat SineEaseIn(AHFloat p) { return sin((p - 1) * M_PI_2) + 1; } // Modeled after quarter-cycle of sine wave (different phase) AHFloat SineEaseOut(AHFloat p) { return sin(p * M_PI_2); } // Modeled after half sine wave AHFloat SineEaseInOut(AHFloat p) { return 0.5 * (1 - cos(p * M_PI)); } // Modeled after shifted quadrant IV of unit circle AHFloat CircularEaseIn(AHFloat p) { return 1 - sqrt(1 - (p * p)); } // Modeled after shifted quadrant II of unit circle AHFloat CircularEaseOut(AHFloat p) { return sqrt((2 - p) * p); } // Modeled after the piecewise circular function // y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) // y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] AHFloat CircularEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * (1 - sqrt(1 - 4 * (p * p))); } else { return 0.5 * (sqrt(-((2 * p) - 3) * ((2 * p) - 1)) + 1); } } // Modeled after the exponential function y = 2^(10(x - 1)) AHFloat ExponentialEaseIn(AHFloat p) { return (p == 0.0) ? p : pow(2, 10 * (p - 1)); } // Modeled after the exponential function y = -2^(-10x) + 1 AHFloat ExponentialEaseOut(AHFloat p) { return (p == 1.0) ? p : 1 - pow(2, -10 * p); } // Modeled after the piecewise exponential // y = (1/2)2^(10(2x - 1)) ; [0,0.5) // y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] AHFloat ExponentialEaseInOut(AHFloat p) { if(p == 0.0 || p == 1.0) return p; if(p < 0.5) { return 0.5 * pow(2, (20 * p) - 10); } else { return -0.5 * pow(2, (-20 * p) + 10) + 1; } } // Modeled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) AHFloat ElasticEaseIn(AHFloat p) { return sin(13 * M_PI_2 * p) * pow(2, 10 * (p - 1)); } // Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 AHFloat ElasticEaseOut(AHFloat p) { return sin(-13 * M_PI_2 * (p + 1)) * pow(2, -10 * p) + 1; } // Modeled after the piecewise exponentially-damped sine wave: // y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) // y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] AHFloat ElasticEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * sin(13 * M_PI_2 * (2 * p)) * pow(2, 10 * ((2 * p) - 1)); } else { return 0.5 * (sin(-13 * M_PI_2 * ((2 * p - 1) + 1)) * pow(2, -10 * (2 * p - 1)) + 2); } } // Modeled after the overshooting cubic y = x^3-x*sin(x*pi) AHFloat BackEaseIn(AHFloat p) { return p * p * p - p * sin(p * M_PI); } // Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi)) AHFloat BackEaseOut(AHFloat p) { AHFloat f = (1 - p); return 1 - (f * f * f - f * sin(f * M_PI)); } // Modeled after the piecewise overshooting cubic function: // y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5) // y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1] AHFloat BackEaseInOut(AHFloat p) { if(p < 0.5) { AHFloat f = 2 * p; return 0.5 * (f * f * f - f * sin(f * M_PI)); } else { AHFloat f = (1 - (2*p - 1)); return 0.5 * (1 - (f * f * f - f * sin(f * M_PI))) + 0.5; } } AHFloat BounceEaseIn(AHFloat p) { return 1 - BounceEaseOut(1 - p); } AHFloat BounceEaseOut(AHFloat p) { if(p < 4/11.0) { return (121 * p * p)/16.0; } else if(p < 8/11.0) { return (363/40.0 * p * p) - (99/10.0 * p) + 17/5.0; } else if(p < 9/10.0) { return (4356/361.0 * p * p) - (35442/1805.0 * p) + 16061/1805.0; } else { return (54/5.0 * p * p) - (513/25.0 * p) + 268/25.0; } } AHFloat BounceEaseInOut(AHFloat p) { if(p < 0.5) { return 0.5 * BounceEaseIn(p*2); } else { return 0.5 * BounceEaseOut(p * 2 - 1) + 0.5; } } tweenr/src/interpolators.cpp0000644000176200001440000012145214026056746015775 0ustar liggesusers#include #include "easing.h" using namespace Rcpp; enum easeEnum { linear, quadratic_in, quadratic_out, quadratic_in_out, cubic_in, cubic_out, cubic_in_out, quartic_in, quartic_out, quartic_in_out, quintic_in, quintic_out, quintic_in_out, sine_in, sine_out, sine_in_out, circular_in, circular_out, circular_in_out, exponential_in, exponential_out, exponential_in_out, elastic_in, elastic_out, elastic_in_out, back_in, back_out, back_in_out, bounce_in, bounce_out, bounce_in_out, UNKNOWN }; easeEnum hashEase(std::string ease) { if (ease == "linear") return linear; if (ease == "quadratic-in") return quadratic_in; if (ease == "quadratic-out") return quadratic_out; if (ease == "quadratic-in-out") return quadratic_in_out; if (ease == "cubic-in") return cubic_in; if (ease == "cubic-out") return cubic_out; if (ease == "cubic-in-out") return cubic_in_out; if (ease == "quartic-in") return quartic_in; if (ease == "quartic-out") return quartic_out; if (ease == "quartic-in-out") return quartic_in_out; if (ease == "quintic-in") return quintic_in; if (ease == "quintic-out") return quintic_out; if (ease == "quintic-in-out") return quintic_in_out; if (ease == "sine-in") return sine_in; if (ease == "sine-out") return sine_out; if (ease == "sine-in-out") return sine_in_out; if (ease == "circular-in") return circular_in; if (ease == "circular-out") return circular_out; if (ease == "circular-in-out") return circular_in_out; if (ease == "exponential-in") return exponential_in; if (ease == "exponential-out") return exponential_out; if (ease == "exponential-in-out") return exponential_in_out; if (ease == "elastic-in") return elastic_in; if (ease == "elastic-out") return elastic_out; if (ease == "elastic-in-out") return elastic_in_out; if (ease == "back-in") return back_in; if (ease == "back-out") return back_out; if (ease == "back-in-out") return back_in_out; if (ease == "bounce-in") return bounce_in; if (ease == "bounce-out") return bounce_out; if (ease == "bounce-in-out") return bounce_in_out; return UNKNOWN; } std::vector easeSeq(std::string easer, int length) { std::vector res(length); double p; // Just linear for now for(int i = 0; i < length; ++i) { p = double(i) / length; switch (hashEase(easer)) { case linear: res[i] = LinearInterpolation(p); break; case quadratic_in: res[i] = QuadraticEaseIn(p); break; case quadratic_out: res[i] = QuadraticEaseOut(p); break; case quadratic_in_out: res[i] = QuadraticEaseInOut(p); break; case cubic_in: res[i] = CubicEaseIn(p); break; case cubic_out: res[i] = CubicEaseOut(p); break; case cubic_in_out: res[i] = CubicEaseInOut(p); break; case quartic_in: res[i] = QuarticEaseIn(p); break; case quartic_out: res[i] = QuarticEaseOut(p); break; case quartic_in_out: res[i] = QuarticEaseInOut(p); break; case quintic_in: res[i] = QuinticEaseIn(p); break; case quintic_out: res[i] = QuinticEaseOut(p); break; case quintic_in_out: res[i] = QuinticEaseInOut(p); break; case sine_in: res[i] = SineEaseIn(p); break; case sine_out: res[i] = SineEaseOut(p); break; case sine_in_out: res[i] = SineEaseInOut(p); break; case circular_in: res[i] = CircularEaseIn(p); break; case circular_out: res[i] = CircularEaseOut(p); break; case circular_in_out: res[i] = CircularEaseInOut(p); break; case exponential_in: res[i] = ExponentialEaseIn(p); break; case exponential_out: res[i] = ExponentialEaseOut(p); break; case exponential_in_out: res[i] = ExponentialEaseInOut(p); break; case elastic_in: res[i] = ElasticEaseIn(p); break; case elastic_out: res[i] = ElasticEaseOut(p); break; case elastic_in_out: res[i] = ElasticEaseInOut(p); break; case back_in: res[i] = BackEaseIn(p); break; case back_out: res[i] = BackEaseOut(p); break; case back_in_out: res[i] = BackEaseInOut(p); break; case bounce_in: res[i] = BounceEaseIn(p); break; case bounce_out: res[i] = BounceEaseOut(p); break; case bounce_in_out: res[i] = BounceEaseInOut(p); break; case UNKNOWN: stop("Unknown easing function"); } } return res; } double easePos(double p, std::string easer) { double p_new = 0; switch (hashEase(easer)) { case linear: p_new = LinearInterpolation(p); break; case quadratic_in: p_new = QuadraticEaseIn(p); break; case quadratic_out: p_new = QuadraticEaseOut(p); break; case quadratic_in_out: p_new = QuadraticEaseInOut(p); break; case cubic_in: p_new = CubicEaseIn(p); break; case cubic_out: p_new = CubicEaseOut(p); break; case cubic_in_out: p_new = CubicEaseInOut(p); break; case quartic_in: p_new = QuarticEaseIn(p); break; case quartic_out: p_new = QuarticEaseOut(p); break; case quartic_in_out: p_new = QuarticEaseInOut(p); break; case quintic_in: p_new = QuinticEaseIn(p); break; case quintic_out: p_new = QuinticEaseOut(p); break; case quintic_in_out: p_new = QuinticEaseInOut(p); break; case sine_in: p_new = SineEaseIn(p); break; case sine_out: p_new = SineEaseOut(p); break; case sine_in_out: p_new = SineEaseInOut(p); break; case circular_in: p_new = CircularEaseIn(p); break; case circular_out: p_new = CircularEaseOut(p); break; case circular_in_out: p_new = CircularEaseInOut(p); break; case exponential_in: p_new = ExponentialEaseIn(p); break; case exponential_out: p_new = ExponentialEaseOut(p); break; case exponential_in_out: p_new = ExponentialEaseInOut(p); break; case elastic_in: p_new = ElasticEaseIn(p); break; case elastic_out: p_new = ElasticEaseOut(p); break; case elastic_in_out: p_new = ElasticEaseInOut(p); break; case back_in: p_new = BackEaseIn(p); break; case back_out: p_new = BackEaseOut(p); break; case back_in_out: p_new = BackEaseInOut(p); break; case bounce_in: p_new = BounceEaseIn(p); break; case bounce_out: p_new = BounceEaseOut(p); break; case bounce_in_out: p_new = BounceEaseInOut(p); break; case UNKNOWN: stop("Unknown easing function"); } return p_new; } //[[Rcpp::export]] NumericVector numeric_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).size(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; NumericVector res(nelements * nframes); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { NumericVector state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); NumericVector state_from = data(state_index(state)); NumericVector state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; res[res_index] = state_from[element] + ease_points[currentframe] * (state_to[element] - state_from[element]); } } } frame += nframes_per_state(state); } return res; } //[[Rcpp::export]] NumericMatrix colour_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).nrow(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; NumericMatrix res(nelements * nframes, 4); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { NumericMatrix state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res(res_index, 0) = state_from(element, 0); res(res_index, 1) = state_from(element, 1); res(res_index, 2) = state_from(element, 2); res(res_index, 3) = state_from(element, 3); ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); NumericMatrix state_from = data(state_index(state)); NumericMatrix state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; res(res_index, 0) = state_from(element, 0) + ease_points[currentframe] * (state_to(element, 0) - state_from(element, 0)); res(res_index, 1) = state_from(element, 1) + ease_points[currentframe] * (state_to(element, 1) - state_from(element, 1)); res(res_index, 2) = state_from(element, 2) + ease_points[currentframe] * (state_to(element, 2) - state_from(element, 2)); res(res_index, 3) = state_from(element, 3) + ease_points[currentframe] * (state_to(element, 3) - state_from(element, 3)); } } } frame += nframes_per_state(state); } return res; } //[[Rcpp::export]] CharacterVector constant_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).size(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; CharacterVector res(nelements * nframes); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { CharacterVector state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); CharacterVector state_from = data(state_index(state)); CharacterVector state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; if (ease_points[currentframe] < 0.5) { res[res_index] = state_from[element]; } else { res[res_index] = state_to[element]; } } } } frame += nframes_per_state(state); } return res; } //[[Rcpp::export]] List list_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).size(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; List res(nelements * nframes); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { List state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); List state_from = data(state_index(state)); List state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; if (ease_points[currentframe] < 0.5) { res[res_index] = state_from[element]; } else { res[res_index] = state_to[element]; } } } } frame += nframes_per_state(state); } return res; } NumericVector align_num_elem(NumericVector from, NumericVector to) { NumericVector res; if (from.size() < to.size()) { if (from.size() == 0) { res = NumericVector(to.size(), mean(to)); } else { res = NumericVector(to.size()); for (int i = 0; i < res.size(); ++i) { res[i] = from[i % from.size()]; } } } else { res = from; } return res; } //[[Rcpp::export]] List numlist_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).size(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; List res(nelements * nframes); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { List state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res[res_index] = state_from[element]; ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); List state_from = data(state_index(state)); List state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { NumericVector state_from_vec = state_from[element]; NumericVector state_to_vec = state_to[element]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; NumericVector state_vec = state_from_vec + ease_points[currentframe] * (state_to_vec - state_from_vec); res[res_index] = state_vec; } } } frame += nframes_per_state(state); } return res; } //[[Rcpp::export]] CharacterVector phase_state_interpolator(List data, DataFrame states) { IntegerVector state_index = states("state"); NumericVector nframes_per_state = states("nframes"); std::vector easer = states("ease"); int nelements = as(data(0)).size(); int nstates = states.nrows(); int nframes = sum(nframes_per_state); int frame = 0; int state, element, currentframe, res_index; CharacterVector res(nelements * nframes); for (state = 0; state < nstates; ++state) { if (easer[state] == "constant") { CharacterVector state_from = data(state_index(state)); for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { std::string type = currentframe == nframes_per_state(state) - 1 ? "raw" : "static"; res_index = (frame + currentframe) * nelements; for (element = 0; element < nelements; ++element) { res[res_index] = type; ++res_index; } } } else { std::vector ease_points = easeSeq(easer[state], nframes_per_state(state)); CharacterVector state_from = data(state_index(state)); CharacterVector state_to = data(state_index(state) + 1); for (element = 0; element < nelements; ++element) { std::string type = state_from[element] == "enter" ? "enter" : state_to[element] == "exit" ? "exit" : "transition"; for (currentframe = 0; currentframe < nframes_per_state(state); ++currentframe) { res_index = (frame + currentframe) * nelements + element; res[res_index] = type; } } } frame += nframes_per_state(state); } return res; } //[[Rcpp::export]] DataFrame numeric_element_interpolator(NumericVector data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.size(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::vector ease_points = easeSeq(as(ease[i-1]), nframes); for (size_t j = 0; j < ease_points.size(); ++j) { tweendata.push_back(data[i - 1] + ease_points[j] * (data[i] - data[i - 1])); tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] DataFrame colour_element_interpolator(NumericMatrix data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata1; std::deque tweendata2; std::deque tweendata3; std::deque tweendata4; std::deque tweengroup; std::deque tweenframe; int i, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.nrow(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::vector ease_points = easeSeq(as(ease[i-1]), nframes); for (size_t j = 0; j < ease_points.size(); ++j) { tweendata1.push_back(data(i - 1, 0) + ease_points[j] * (data(i, 0) - data(i - 1, 0))); tweendata2.push_back(data(i - 1, 1) + ease_points[j] * (data(i, 1) - data(i - 1, 1))); tweendata3.push_back(data(i - 1, 2) + ease_points[j] * (data(i, 2) - data(i - 1, 2))); tweendata4.push_back(data(i - 1, 3) + ease_points[j] * (data(i, 3) - data(i - 1, 3))); tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata1.push_back(data(i - 1, 0)); tweendata2.push_back(data(i - 1, 1)); tweendata3.push_back(data(i - 1, 2)); tweendata4.push_back(data(i - 1, 3)); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata1.push_back(data(i - 1, 0)); tweendata2.push_back(data(i - 1, 1)); tweendata3.push_back(data(i - 1, 2)); tweendata4.push_back(data(i - 1, 3)); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); return DataFrame::create( Named("data1") = wrap(tweendata1), Named("data2") = wrap(tweendata2), Named("data3") = wrap(tweendata3), Named("data4") = wrap(tweendata4), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] DataFrame constant_element_interpolator(CharacterVector data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.size(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::vector ease_points = easeSeq(as(ease[i-1]), nframes); for (size_t j = 0; j < ease_points.size(); ++j) { if (ease_points[j] < 0.5) { tweendata.push_back(as(data[i - 1])); } else { tweendata.push_back(as(data[i])); } tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(as(data[i - 1])); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata.push_back(as(data[i - 1])); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] List list_element_interpolator(List data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.size(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::vector ease_points = easeSeq(as(ease[i-1]), nframes); for (size_t j = 0; j < ease_points.size(); ++j) { if (ease_points[j] < 0.5) { tweendata.push_back(data[i - 1]); } else { tweendata.push_back(data[i]); } tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); List tweendata_list = wrap(tweendata); IntegerVector frame_vec = wrap(tweenframe); CharacterVector group_vec = wrap(tweengroup); List res = List::create( Named("data") = tweendata_list, Named("group") = group_vec, Named("frame") = frame_vec ); res.attr("class") = "data.frame"; res.attr("row.names") = seq_along(frame_vec); return res; } //[[Rcpp::export]] List numlist_element_interpolator(List data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.size(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::vector ease_points = easeSeq(as(ease[i-1]), nframes); NumericVector state_from_vec = data[i - 1]; NumericVector state_to_vec = data[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); for (size_t j = 0; j < ease_points.size(); ++j) { NumericVector state_vec = state_from_vec + ease_points[j] * (state_to_vec - state_from_vec); tweendata.push_back(state_vec); tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata.push_back(data[i - 1]); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); List tweendata_list = wrap(tweendata); IntegerVector frame_vec = wrap(tweenframe); CharacterVector group_vec = wrap(tweengroup); List res = List::create( Named("data") = tweendata_list, Named("group") = group_vec, Named("frame") = frame_vec ); res.attr("class") = "data.frame"; res.attr("row.names") = seq_along(frame_vec); return res; } //[[Rcpp::export]] DataFrame phase_element_interpolator(CharacterVector data, CharacterVector group, IntegerVector frame, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i, j, nframes; std::string groupString; std::string currentGroup = as(group[0]); for (i = 1; i < data.size(); ++i) { groupString = as(group[i]); if (currentGroup.compare(groupString) == 0) { nframes = frame[i] - frame[i-1]; std::string type = data[i - 1] == "enter" ? "enter" : data[i] == "exit" ? "exit" : data[i - 1] == "static" ? "static" : "transition"; for (j = 0; j < nframes; ++j) { if (j == 0 && (type == "transition" || type == "exit")) { tweendata.push_back("raw"); } else { tweendata.push_back(type); } tweengroup.push_back(groupString); tweenframe.push_back(j + frame[i-1]); } } else { tweendata.push_back(as(data[i - 1])); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); currentGroup = groupString; } } tweendata.push_back(as(data[i - 1])); tweengroup.push_back(currentGroup); tweenframe.push_back(frame[i-1]); return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] DataFrame numeric_along_interpolator(NumericVector data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; std::string easer = as(ease); int i,j,jj; bool before,after,same,last; double pos,interp; for (i = 1; i <= nframes; ++i) { for (j = 0; j < data.size(); ++j) { last = j == data.size() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { pos = (i - time[j]) / (time[jj] - time[j]); pos = easePos(pos, easer); interp = data[j] + (data[jj] - data[j]) * pos; tweendata.push_back(interp); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] DataFrame colour_along_interpolator(NumericMatrix data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease) { std::deque tweendata1; std::deque tweendata2; std::deque tweendata3; std::deque tweendata4; std::deque tweengroup; std::deque tweenframe; std::string easer = as(ease); int i,j,jj; bool before,after,same,last; double pos; for (i = 1; i <= nframes; ++i) { for (j = 0; j < data.nrow(); ++j) { last = j == data.nrow() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata1.push_back(data(j, 0)); tweendata2.push_back(data(j, 1)); tweendata3.push_back(data(j, 2)); tweendata4.push_back(data(j, 3)); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { pos = (i - time[j]) / (time[j + 1] - time[j]); pos = easePos(pos, easer); tweendata1.push_back(data(j, 0) + (data(j + 1, 0) - data(j, 0)) * pos); tweendata2.push_back(data(j, 1) + (data(j + 1, 1) - data(j, 1)) * pos); tweendata3.push_back(data(j, 2) + (data(j + 1, 2) - data(j, 2)) * pos); tweendata4.push_back(data(j, 3) + (data(j + 1, 3) - data(j, 3)) * pos); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } return DataFrame::create( Named("data1") = wrap(tweendata1), Named("data2") = wrap(tweendata2), Named("data3") = wrap(tweendata3), Named("data4") = wrap(tweendata4), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] DataFrame constant_along_interpolator(CharacterVector data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; std::string easer = as(ease); int i,j,jj; bool before,after,same,last; double pos; for (i = 1; i <= nframes; ++i) { for (j = 0; j < data.size(); ++j) { last = j == data.size() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(as(data[j])); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { pos = (i - time[j]) / (time[j + 1] - time[j]); pos = easePos(pos, easer); if (pos < 0.5) { tweendata.push_back(as(data[j])); } else { tweendata.push_back(as(data[j + 1])); } tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] List list_along_interpolator(List data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; std::string easer = as(ease); int i,j,jj; bool before,after,same,last; double pos; for (i = 1; i <= nframes; ++i) { for (j = 0; j < data.size(); ++j) { last = j == data.size() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { pos = (i - time[j]) / (time[j + 1] - time[j]); pos = easePos(pos, easer); if (pos < 0.5) { tweendata.push_back(data[j]); } else { tweendata.push_back(data[j + 1]); } tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } List tweendata_list = wrap(tweendata); IntegerVector frame_vec = wrap(tweenframe); CharacterVector group_vec = wrap(tweengroup); List res = List::create( Named("data") = tweendata_list, Named("group") = group_vec, Named("frame") = frame_vec ); res.attr("class") = "data.frame"; res.attr("row.names") = seq_along(frame_vec); return res; } //[[Rcpp::export]] List numlist_along_interpolator(List data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; std::string easer = as(ease); int i,j,jj; bool before,after,same,last; double pos; for (i = 1; i <= nframes; ++i) { for (j = 0; j < data.size(); ++j) { last = j == data.size() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back(data[j]); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { NumericVector state_from_vec = data[j]; NumericVector state_to_vec = data[j + 1]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); pos = (i - time[j]) / (time[j + 1] - time[j]); pos = easePos(pos, easer); NumericVector state_vec = state_from_vec + pos * (state_to_vec - state_from_vec); tweendata.push_back(state_vec); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } List tweendata_list = wrap(tweendata); IntegerVector frame_vec = wrap(tweenframe); CharacterVector group_vec = wrap(tweengroup); List res = List::create( Named("data") = tweendata_list, Named("group") = group_vec, Named("frame") = frame_vec ); res.attr("class") = "data.frame"; res.attr("row.names") = seq_along(frame_vec); return res; } //[[Rcpp::export]] DataFrame phase_along_interpolator(CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes) { std::deque tweendata; std::deque tweengroup; std::deque tweenframe; int i,j,jj; bool before,after,same,last; for (i = 1; i <= nframes; ++i) { for (j = 0; j < group.size(); ++j) { last = j == group.size() - 1; jj = last ? j : j + 1; before = time[j] <= i; after = time[jj] > i; same = group[j] == group[jj]; if ((history && same && before) || ((!same || last) && keep_last && before)) { tweendata.push_back("raw"); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } if (same && before == after) { tweendata.push_back("transition"); tweengroup.push_back(as(group[j])); tweenframe.push_back(i); } } } return DataFrame::create( Named("data") = wrap(tweendata), Named("group") = wrap(tweengroup), Named("frame") = wrap(tweenframe), Named("stringsAsFactors") = false ); } //[[Rcpp::export]] NumericVector numeric_at_interpolator(NumericVector from, NumericVector to, NumericVector at, CharacterVector ease) { int n = from.size(), i; double pos; std::string easer = as(ease); NumericVector res(n); for (i = 0; i < n; ++i) { pos = easePos(at[i], easer); res[i] = from[i] + (to[i] - from[i]) * pos; } return res; } //[[Rcpp::export]] NumericMatrix colour_at_interpolator(NumericMatrix from, NumericMatrix to, NumericVector at, CharacterVector ease) { int n = from.nrow(), i; double pos; std::string easer = as(ease); NumericMatrix res(n, from.ncol()); for (i = 0; i < n; ++i) { pos = easePos(at[i], easer); res(i, _) = from(i, _) + (to(i, _) - from(i, _)) * pos; } return res; } //[[Rcpp::export]] CharacterVector constant_at_interpolator(CharacterVector from, CharacterVector to, NumericVector at, CharacterVector ease) { int n = from.size(), i; double pos; std::string easer = as(ease); CharacterVector res(n); for (i = 0; i < n; ++i) { pos = easePos(at[i], easer); res[i] = pos < 0.5 ? from[i] : to[i]; } return res; } //[[Rcpp::export]] List list_at_interpolator(List from, List to, NumericVector at, CharacterVector ease) { int n = from.size(), i; double pos; std::string easer = as(ease); List res(n); for (i = 0; i < n; ++i) { pos = easePos(at[i], easer); res[i] = pos < 0.5 ? from[i] : to[i]; } return res; } //[[Rcpp::export]] List numlist_at_interpolator(List from, List to, NumericVector at, CharacterVector ease) { int n = from.size(), i; double pos; std::string easer = as(ease); List res(n); for (i = 0; i < n; ++i) { NumericVector state_from_vec = from[i]; NumericVector state_to_vec = to[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); pos = easePos(at[i], easer); NumericVector state_vec = state_from_vec + pos * (state_to_vec - state_from_vec); res[i] = state_vec; } return res; } //[[Rcpp::export]] NumericVector numeric_fill_interpolator(NumericVector data, CharacterVector ease) { NumericVector res(data.size(), NA_REAL); int i,last = -1; std::string easer = as(ease); std::vector easepos; for (i = 0; i < data.size(); ++i) { if (NumericVector::is_na(data[i])) continue; if (last != -1) { easepos = easeSeq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = data[last] + easepos[j] * (data[i] - data[last]); } } res[i] = data[i]; last = i; } return res; } //[[Rcpp::export]] NumericMatrix colour_fill_interpolator(NumericMatrix data, CharacterVector ease) { NumericMatrix res(data.nrow(), data.ncol()); std::fill(res.begin(), res.end(), NA_REAL); int i,last = -1; std::string easer = as(ease); std::vector easepos; for (i = 0; i < data.nrow(); ++i) { if (NumericVector::is_na(data(i, 0))) continue; if (last != -1) { easepos = easeSeq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res(last + j, _) = data(last, _) + easepos[j] * (data(i, _) - data(last, _)); } } res(i, _) = data(i, _); last = i; } return res; } //[[Rcpp::export]] CharacterVector constant_fill_interpolator(CharacterVector data, CharacterVector ease) { CharacterVector res(data.size(), NA_STRING); int i,last = -1; std::string easer = as(ease); std::vector easepos; for (i = 0; i < data.size(); ++i) { if (CharacterVector::is_na(data[i])) continue; if (last != -1) { easepos = easeSeq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = easepos[j] < 0.5 ? data[last] : data[i]; } } res[i] = data[i]; last = i; } return res; } //[[Rcpp::export]] List list_fill_interpolator(List data, CharacterVector ease) { List res(data.size()); int i,last = -1; std::string easer = as(ease); std::vector easepos; for (i = 0; i < data.size(); ++i) { if (data[i]==R_NilValue) continue; if (last != -1) { easepos = easeSeq(easer, i - last); for (size_t j = 1; j < easepos.size(); ++j) { res[last + j] = easepos[j] < 0.5 ? data[last] : data[i]; } } res[i] = data[i]; last = i; } return res; } //[[Rcpp::export]] List numlist_fill_interpolator(List data, CharacterVector ease) { List res(data.size()); int i,last = -1; std::string easer = as(ease); std::vector easepos; for (i = 0; i < data.size(); ++i) { if (data[i]==R_NilValue) continue; if (last != -1) { easepos = easeSeq(easer, i - last); NumericVector state_from_vec = data[last]; NumericVector state_to_vec = data[i]; state_from_vec = align_num_elem(state_from_vec, state_to_vec); state_to_vec = align_num_elem(state_to_vec, state_from_vec); res[last] = data[last]; for (size_t j = 1; j < easepos.size(); ++j) { NumericVector state_vec = state_from_vec + easepos[j] * (state_to_vec - state_from_vec); res[last + j] = state_vec; } } res[i] = data[i]; last = i; } return res; } tweenr/src/RcppExports.cpp0000644000176200001440000005550013352246025015351 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; // numeric_state_interpolator NumericVector numeric_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_numeric_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(numeric_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // colour_state_interpolator NumericMatrix colour_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_colour_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(colour_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // constant_state_interpolator CharacterVector constant_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_constant_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(constant_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // list_state_interpolator List list_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_list_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(list_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // numlist_state_interpolator List numlist_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_numlist_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(numlist_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // phase_state_interpolator CharacterVector phase_state_interpolator(List data, DataFrame states); RcppExport SEXP _tweenr_phase_state_interpolator(SEXP dataSEXP, SEXP statesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< DataFrame >::type states(statesSEXP); rcpp_result_gen = Rcpp::wrap(phase_state_interpolator(data, states)); return rcpp_result_gen; END_RCPP } // numeric_element_interpolator DataFrame numeric_element_interpolator(NumericVector data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_numeric_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numeric_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // colour_element_interpolator DataFrame colour_element_interpolator(NumericMatrix data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_colour_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(colour_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // constant_element_interpolator DataFrame constant_element_interpolator(CharacterVector data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_constant_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(constant_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // list_element_interpolator List list_element_interpolator(List data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_list_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(list_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // numlist_element_interpolator List numlist_element_interpolator(List data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_numlist_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numlist_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // phase_element_interpolator DataFrame phase_element_interpolator(CharacterVector data, CharacterVector group, IntegerVector frame, CharacterVector ease); RcppExport SEXP _tweenr_phase_element_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP frameSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< IntegerVector >::type frame(frameSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(phase_element_interpolator(data, group, frame, ease)); return rcpp_result_gen; END_RCPP } // numeric_along_interpolator DataFrame numeric_along_interpolator(NumericVector data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease); RcppExport SEXP _tweenr_numeric_along_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numeric_along_interpolator(data, group, time, history, keep_last, nframes, ease)); return rcpp_result_gen; END_RCPP } // colour_along_interpolator DataFrame colour_along_interpolator(NumericMatrix data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease); RcppExport SEXP _tweenr_colour_along_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(colour_along_interpolator(data, group, time, history, keep_last, nframes, ease)); return rcpp_result_gen; END_RCPP } // constant_along_interpolator DataFrame constant_along_interpolator(CharacterVector data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease); RcppExport SEXP _tweenr_constant_along_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(constant_along_interpolator(data, group, time, history, keep_last, nframes, ease)); return rcpp_result_gen; END_RCPP } // list_along_interpolator List list_along_interpolator(List data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease); RcppExport SEXP _tweenr_list_along_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(list_along_interpolator(data, group, time, history, keep_last, nframes, ease)); return rcpp_result_gen; END_RCPP } // numlist_along_interpolator List numlist_along_interpolator(List data, CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes, CharacterVector ease); RcppExport SEXP _tweenr_numlist_along_interpolator(SEXP dataSEXP, SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numlist_along_interpolator(data, group, time, history, keep_last, nframes, ease)); return rcpp_result_gen; END_RCPP } // phase_along_interpolator DataFrame phase_along_interpolator(CharacterVector group, NumericVector time, bool history, bool keep_last, int nframes); RcppExport SEXP _tweenr_phase_along_interpolator(SEXP groupSEXP, SEXP timeSEXP, SEXP historySEXP, SEXP keep_lastSEXP, SEXP nframesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type group(groupSEXP); Rcpp::traits::input_parameter< NumericVector >::type time(timeSEXP); Rcpp::traits::input_parameter< bool >::type history(historySEXP); Rcpp::traits::input_parameter< bool >::type keep_last(keep_lastSEXP); Rcpp::traits::input_parameter< int >::type nframes(nframesSEXP); rcpp_result_gen = Rcpp::wrap(phase_along_interpolator(group, time, history, keep_last, nframes)); return rcpp_result_gen; END_RCPP } // numeric_at_interpolator NumericVector numeric_at_interpolator(NumericVector from, NumericVector to, NumericVector at, CharacterVector ease); RcppExport SEXP _tweenr_numeric_at_interpolator(SEXP fromSEXP, SEXP toSEXP, SEXP atSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type from(fromSEXP); Rcpp::traits::input_parameter< NumericVector >::type to(toSEXP); Rcpp::traits::input_parameter< NumericVector >::type at(atSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numeric_at_interpolator(from, to, at, ease)); return rcpp_result_gen; END_RCPP } // colour_at_interpolator NumericMatrix colour_at_interpolator(NumericMatrix from, NumericMatrix to, NumericVector at, CharacterVector ease); RcppExport SEXP _tweenr_colour_at_interpolator(SEXP fromSEXP, SEXP toSEXP, SEXP atSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type from(fromSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type to(toSEXP); Rcpp::traits::input_parameter< NumericVector >::type at(atSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(colour_at_interpolator(from, to, at, ease)); return rcpp_result_gen; END_RCPP } // constant_at_interpolator CharacterVector constant_at_interpolator(CharacterVector from, CharacterVector to, NumericVector at, CharacterVector ease); RcppExport SEXP _tweenr_constant_at_interpolator(SEXP fromSEXP, SEXP toSEXP, SEXP atSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type from(fromSEXP); Rcpp::traits::input_parameter< CharacterVector >::type to(toSEXP); Rcpp::traits::input_parameter< NumericVector >::type at(atSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(constant_at_interpolator(from, to, at, ease)); return rcpp_result_gen; END_RCPP } // list_at_interpolator List list_at_interpolator(List from, List to, NumericVector at, CharacterVector ease); RcppExport SEXP _tweenr_list_at_interpolator(SEXP fromSEXP, SEXP toSEXP, SEXP atSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type from(fromSEXP); Rcpp::traits::input_parameter< List >::type to(toSEXP); Rcpp::traits::input_parameter< NumericVector >::type at(atSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(list_at_interpolator(from, to, at, ease)); return rcpp_result_gen; END_RCPP } // numlist_at_interpolator List numlist_at_interpolator(List from, List to, NumericVector at, CharacterVector ease); RcppExport SEXP _tweenr_numlist_at_interpolator(SEXP fromSEXP, SEXP toSEXP, SEXP atSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type from(fromSEXP); Rcpp::traits::input_parameter< List >::type to(toSEXP); Rcpp::traits::input_parameter< NumericVector >::type at(atSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numlist_at_interpolator(from, to, at, ease)); return rcpp_result_gen; END_RCPP } // numeric_fill_interpolator NumericVector numeric_fill_interpolator(NumericVector data, CharacterVector ease); RcppExport SEXP _tweenr_numeric_fill_interpolator(SEXP dataSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numeric_fill_interpolator(data, ease)); return rcpp_result_gen; END_RCPP } // colour_fill_interpolator NumericMatrix colour_fill_interpolator(NumericMatrix data, CharacterVector ease); RcppExport SEXP _tweenr_colour_fill_interpolator(SEXP dataSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(colour_fill_interpolator(data, ease)); return rcpp_result_gen; END_RCPP } // constant_fill_interpolator CharacterVector constant_fill_interpolator(CharacterVector data, CharacterVector ease); RcppExport SEXP _tweenr_constant_fill_interpolator(SEXP dataSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< CharacterVector >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(constant_fill_interpolator(data, ease)); return rcpp_result_gen; END_RCPP } // list_fill_interpolator List list_fill_interpolator(List data, CharacterVector ease); RcppExport SEXP _tweenr_list_fill_interpolator(SEXP dataSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(list_fill_interpolator(data, ease)); return rcpp_result_gen; END_RCPP } // numlist_fill_interpolator List numlist_fill_interpolator(List data, CharacterVector ease); RcppExport SEXP _tweenr_numlist_fill_interpolator(SEXP dataSEXP, SEXP easeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< List >::type data(dataSEXP); Rcpp::traits::input_parameter< CharacterVector >::type ease(easeSEXP); rcpp_result_gen = Rcpp::wrap(numlist_fill_interpolator(data, ease)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_tweenr_numeric_state_interpolator", (DL_FUNC) &_tweenr_numeric_state_interpolator, 2}, {"_tweenr_colour_state_interpolator", (DL_FUNC) &_tweenr_colour_state_interpolator, 2}, {"_tweenr_constant_state_interpolator", (DL_FUNC) &_tweenr_constant_state_interpolator, 2}, {"_tweenr_list_state_interpolator", (DL_FUNC) &_tweenr_list_state_interpolator, 2}, {"_tweenr_numlist_state_interpolator", (DL_FUNC) &_tweenr_numlist_state_interpolator, 2}, {"_tweenr_phase_state_interpolator", (DL_FUNC) &_tweenr_phase_state_interpolator, 2}, {"_tweenr_numeric_element_interpolator", (DL_FUNC) &_tweenr_numeric_element_interpolator, 4}, {"_tweenr_colour_element_interpolator", (DL_FUNC) &_tweenr_colour_element_interpolator, 4}, {"_tweenr_constant_element_interpolator", (DL_FUNC) &_tweenr_constant_element_interpolator, 4}, {"_tweenr_list_element_interpolator", (DL_FUNC) &_tweenr_list_element_interpolator, 4}, {"_tweenr_numlist_element_interpolator", (DL_FUNC) &_tweenr_numlist_element_interpolator, 4}, {"_tweenr_phase_element_interpolator", (DL_FUNC) &_tweenr_phase_element_interpolator, 4}, {"_tweenr_numeric_along_interpolator", (DL_FUNC) &_tweenr_numeric_along_interpolator, 7}, {"_tweenr_colour_along_interpolator", (DL_FUNC) &_tweenr_colour_along_interpolator, 7}, {"_tweenr_constant_along_interpolator", (DL_FUNC) &_tweenr_constant_along_interpolator, 7}, {"_tweenr_list_along_interpolator", (DL_FUNC) &_tweenr_list_along_interpolator, 7}, {"_tweenr_numlist_along_interpolator", (DL_FUNC) &_tweenr_numlist_along_interpolator, 7}, {"_tweenr_phase_along_interpolator", (DL_FUNC) &_tweenr_phase_along_interpolator, 5}, {"_tweenr_numeric_at_interpolator", (DL_FUNC) &_tweenr_numeric_at_interpolator, 4}, {"_tweenr_colour_at_interpolator", (DL_FUNC) &_tweenr_colour_at_interpolator, 4}, {"_tweenr_constant_at_interpolator", (DL_FUNC) &_tweenr_constant_at_interpolator, 4}, {"_tweenr_list_at_interpolator", (DL_FUNC) &_tweenr_list_at_interpolator, 4}, {"_tweenr_numlist_at_interpolator", (DL_FUNC) &_tweenr_numlist_at_interpolator, 4}, {"_tweenr_numeric_fill_interpolator", (DL_FUNC) &_tweenr_numeric_fill_interpolator, 2}, {"_tweenr_colour_fill_interpolator", (DL_FUNC) &_tweenr_colour_fill_interpolator, 2}, {"_tweenr_constant_fill_interpolator", (DL_FUNC) &_tweenr_constant_fill_interpolator, 2}, {"_tweenr_list_fill_interpolator", (DL_FUNC) &_tweenr_list_fill_interpolator, 2}, {"_tweenr_numlist_fill_interpolator", (DL_FUNC) &_tweenr_numlist_fill_interpolator, 2}, {NULL, NULL, 0} }; RcppExport void R_init_tweenr(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } tweenr/R/0000755000176200001440000000000014026314611011755 5ustar liggesuserstweenr/R/tween.R0000644000176200001440000001126313352362660013235 0ustar liggesusers#' Create simple tweens #' #' This set of functions can be used to interpolate between single data types, #' i.e. data not part of data.frames but stored in vectors. All functions come #' in two flavours: the standard and a *_t version. The standard reads the data #' as a list of states, each tween matched element-wise from state to state. The #' *_t version uses the transposed representation where each element is a vector #' of states. The standard approach can be used when each tween has the same #' number of states and you want to control the number of point in each state #' transition. The latter is useful when each tween consists of different #' numbers of states and/or you want to specify the total number of points for #' each tween. #' #' @section Difference Between `tween_numeric` and `approx()`: #' `tween_numeric` (and `tween_numeric_t`) is superficially equivalent to #' [stats::approx()], but there are differences. #' [stats::approx()] will create evenly spaced points, at the expense #' of not including the actual points in the input, while the reverse is true #' for `tween_numeric`. Apart from that `tween_numeric` of course supports easing #' functions and is vectorized. #' #' @details #' `tween` and `tween_t` are wrappers around the other functions that tries to guess #' the type of input data and choose the appropriate tween function. Unless you #' have data that could be understood as a colour but is in fact a character #' vector it should be safe to use these wrappers. It is probably safer and more #' verbose to use the explicit functions within package code as they circumvent #' the type inference and checks whether the input data matches the tween #' function. #' #' `tween_numeric` will provide a linear interpolation between the points based on #' the sequence returned by the easing function. `tween_date` and `tween_datetime` #' converts to numeric, produces the tweening, and converts back again. #' `tween_colour` converts colours into Lab and does the interpolation there, #' converting back to sRGB after the tweening is done. `tween_constant` is a #' catchall that converts the input into character and interpolates by switching #' between states halfway through the transition. #' #' The meaning of the `n` and `ease` arguments differs somewhat #' between the standard and *_t versions of the functions. In the standard #' function `n` and `ease` refers to the length and easing function of #' each transition, being recycled if necessary to `length(data) - 1`. In #' the *_t functions `n` and `ease` refers to the total length of each #' tween and the easing function to be applied to all transition for each tween. #' The will both be recycled to `length(data)`. #' #' @param data A list of vectors or a single vector. In the standard functions #' each element in the list must be of equal length; for the *_t functions #' lengths can differ. If a single vector is used it will be eqivalent to using #' `as.list(data)` for the standard functions and `list(data)` for the #' *_t functions. #' #' @param n The number of elements per transition or tween. See details #' #' @param ease The easing function to use for each transition or tween. See #' details. Defaults to `'linear'` #' #' @return A list with an element for each tween. That means that the length of #' the return is equal to the length of the elements in `data` for the #' standard functions and equal to the length of `data` for the *_t #' functions. #' #' @examples #' tween_numeric(list(1:3, 10:8, c(20, 60, 30)), 10) #' #' tween_colour_t(list(colours()[1:4], colours()[1:2], colours()[25:100]), 100) #' #' @export #' tween <- function(data, n, ease = 'linear') { type <- guessType(data) switch( type, numeric = tween_numeric(data, n, ease), date = tween_date(data, n, ease), datetime = tween_datetime(data, n, ease), colour = tween_colour(data, n, ease), tween_constant_t(data, n, ease) ) } #' @rdname tween #' @export tween_t <- function(data, n, ease = 'linear') { type <- guessType(data) switch( type, numeric = tween_numeric_t(data, n, ease), date = tween_date_t(data, n, ease), datetime = tween_datetime_t(data, n, ease), colour = tween_colour_t(data, n, ease), tween_constant_t(data, n, ease) ) } #' @importFrom utils head guessType <- function(data) { data <- unlist(data) if (is.character(data)) { convert <- try(suppressWarnings(col2rgb(head(data, 100))), silent = TRUE) if (!inherits(convert, 'try-error')) { if (!anyNA(convert)) { return('colour') } } } if (inherits(data, 'Date')) { return('date') } if (inherits(data, 'POSIXt')) { return('datetime') } if (is.numeric(data)) { return('numeric') } 'unknown' } tweenr/R/tween_states.R0000644000176200001440000001072613352363114014616 0ustar liggesusers#' Tween a list of data.frames representing states #' #' This function is intended to create smooth transitions between states of #' data. States are defined as full data.frames or data.frames containing only #' the columns with change. Each state can have a defined period of pause, the #' transition length between each states can be defined as well as the easing #' function. #' #' @param data A list of data.frames. Each data.frame must contain the same #' number of rows, but only the first data.frame needs to contain all columns. #' Subsequent data.frames need only contain the columns that shows change. #' #' @param tweenlength The lengths of the transitions between each state. #' #' @param statelength The length of the pause at each state. #' #' @param ease The easing functions to use for the transitions. See details. #' #' @param nframes The number of frames to generate. The actual number of frames #' might end up being higher depending on the regularity of `tweenlength` #' and `statelength`. #' #' @return A data.frame with the same columns as the first data.frame in #' `data`, but replicated `nframes` times. An additional column called #' `.frame` will be added giving the frame number. #' #' @family data.frame tween #' #' @examples #' data1 <- data.frame( #' x = 1:20, #' y = 0, #' colour = 'forestgreen', #' stringsAsFactors = FALSE #' ) #' data2 <- data1 #' data2$x <- 20:1 #' data2$y <- 1 #' #' data <- tween_states(list(data1, data2), 3, 1, 'cubic-in-out', 100) #' #' @export #' tween_states <- function(data, tweenlength, statelength, ease, nframes) { if (!(is.list(data) && all(sapply(data, is.data.frame)))) { stop('data must be a list of data.frames') } if (length(data) == 1) { stop('data must contain multiple states') } if (length(unique(sapply(data, nrow))) != 1) { stop('All elements in data must have the same number of rows') } data <- lapply(data, function(d) { d$.phase <- 'raw' d }) origNames <- names(data[[1]]) if (!is.list(ease)) ease <- as.list(ease) allNames <- unlist(lapply(data, names)) if (!all(allNames %in% origNames)) { stop('All columns must be specified in the original data.frame') } nstates <- length(data) tweenlength <- rep(tweenlength, nstates)[seq_len(nstates - 1)] statelength <- rep(statelength, nstates)[seq_len(nstates)] ease <- rep(ease, nstates)[seq_len(nstates - 1)] pauseIndex <- which(rep(c(TRUE, FALSE), length.out = 2*nstates - 1)) tweenIndex <- which(rep(c(FALSE, TRUE), length.out = 2*nstates - 1)) statesOrder <- order(c(pauseIndex, tweenIndex)) states <- data.frame( length = c(statelength, tweenlength)[statesOrder], nframes = NA_integer_, state = NA_integer_, stringsAsFactors = FALSE ) states$state <- rep(seq_len(nstates) - 1, each = 2, length.out = nrow(states)) states$ease <- lapply(c(rep(list('constant'), nstates), ease)[statesOrder], function(e) { structure(rep(e, length.out = length(origNames)), names = origNames) }) fullLength <- sum(states$length) framelength <- fullLength/nframes states$nframes <- round(states$length / framelength) nframes <- sum(states$nframes) framelength <- fullLength/nframes data <- Reduce(function(l, r) { extraCols <- !names(l[[length(l)]]) %in% names(r); append(l, list(cbind(r, l[[length(l)]][, extraCols]))) }, data[-1], data[1]) colClasses <- col_classes(data[[1]]) tweendata <- lapply(names(data[[1]]), function(name) { d <- lapply(data, `[[`, i = name) d_states <- states d_states$ease <- vapply(d_states$ease, `[`, character(1), i = name) switch( colClasses[name], numeric = interpolate_numeric_state(d, d_states), logical = interpolate_logical_state(d, d_states), factor = interpolate_factor_state(d, d_states), character = interpolate_character_state(d, d_states), colour = interpolate_colour_state(d, d_states), date = interpolate_date_state(d, d_states), datetime = interpolate_datetime_state(d, d_states), constant = interpolate_constant_state(d, d_states), numlist = interpolate_numlist_state(d, d_states), list = interpolate_list_state(d, d_states), phase = get_phase_state(d, d_states) ) }) tweendata <- structure(tweendata, names = names(data[[1]]), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.id <- rep(seq_len(nrow(data[[1]])), each = nframes) tweendata$.frame <- rep(seq_len(nframes), each = nrow(data[[1]])) attr(tweendata, 'framelength') <- framelength tweendata } tweenr/R/tween_colour.R0000644000176200001440000000202713352362721014614 0ustar liggesusers#' @rdname tween #' #' @export tween_colour <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (anyNA(suppressWarnings(col2rgb(unlist(prepData$data))))) { stop('all elements in data must be convertible to colour') } tweendata <- do.call(interpolate_colour_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_color <- tween_colour #' @rdname tween #' #' @export tween_colour_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (anyNA(suppressWarnings(col2rgb(unlist(prepData$data))))) { stop('all elements in data must be convertible to colour') } tweendata <- do.call(interpolate_colour_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } #' @rdname tween #' #' @export tween_color_t <- tween_colour_t tweenr/R/tween_appear.R0000644000176200001440000000366714026066454014577 0ustar liggesusers#' Tween a data.frame of appearances #' #' This function is intended for use when you have a data.frame of events at #' different time points. This could be the appearance of an observation for #' example. This function replicates your data `nframes` times and #' calculates the duration of each frame. At each frame each row is #' assigned an age based on the progression of frames and the entry point of in #' time for that row. A negative age means that the row has not appeared yet. #' #' @param data A data.frame to tween #' #' @param time The name of the column that holds the time dimension. This does #' not need to hold time data in the strictest sence - any numerical type will #' do #' #' @param timerange The range of time to create the tween for. If missing it #' will defaults to the range of the time column #' #' @param nframes The number of frames to create for the tween. If missing it #' will create a frame for each full unit in `timerange` (e.g. #' `timerange = c(1, 10)` will give `nframes = 10`) #' #' @return A data.frame as `data` but repeated `nframes` times and #' with the additional columns `.age` and `.frame` #' #' @family data.frame tween #' #' @examples #' data <- data.frame( #' x = rnorm(100), #' y = rnorm(100), #' time = sample(50, 100, replace = TRUE) #' ) #' #' data <- tween_appear(data, 'time', nframes = 200) #' #' @export #' tween_appear <- function(data, time, timerange, nframes) { if (missing(timerange) || is.null(timerange)) { timerange <- range(data[[time]]) } if (missing(nframes) || is.null(nframes)) { nframes <- ceiling(diff(timerange) + 1) } framelength <- diff(timerange) / nframes frametimes <- seq(timerange[1], timerange[2], length.out = nframes) tweendata <- lapply(seq_along(frametimes), function(i) { data$.age <- frametimes[i] - data[[time]] data$.frame <- i data }) tweendata <- do.call(rbind, tweendata) attr(tweendata, 'framelength') <- framelength tweendata } tweenr/R/tween_along.R0000644000176200001440000000773213352515532014421 0ustar liggesusers#' Interpolate data along a given dimension #' #' This tween takes groups of rows along with the time for each row and #' calculates the exact value at each at each frame. Further it allows for #' keeping the subsequent raw data from previous frame as well as letting the #' final row linger beyond its time. It especially useful for data that should #' be visualised as lines that are drawn along the x-axis, but can of course #' also be used for other dimensions as well (even dimensions not corresponding #' to any axis). #' #' @inheritParams tween_components #' @param along The "time" point for each row #' @param history Should earlier datapoints be kept in subsequent frames #' @param keep_last Should the last point of each id be kept beyond its time #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @importFrom rlang enquo quo_is_null eval_tidy #' @export tween_along <- function(.data, ease, nframes, along, id = NULL, range = NULL, history = TRUE, keep_last = FALSE) { along <- enquo(along) along <- as.numeric(eval_tidy(along, .data)) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) .data <- .complete_along(.data, along, id) if (length(ease) == 1) ease <- rep(ease, ncol(.data) - 3) if (length(ease) == ncol(.data) - 3) { ease <- c(ease, 'linear', 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } stopifnot(length(nframes) == 1 && is.numeric(nframes) && nframes %% 1 == 0) timerange <- if (is.null(range)) range(.data$.time) else range timerange <- as.numeric(timerange) if (diff(timerange) == 0) stop('range must have a length', call. = FALSE) framelength <- diff(timerange) / (nframes - 1) frame <- 1 + (nframes - 1) * (.data$.time - timerange[1]) / diff(timerange) colClasses <- col_classes(.data) tweendata <- lapply(seq_along(.data), function(i) { d <- .data[[i]] e <- ease[i] switch( colClasses[i], numeric = interpolate_numeric_along(d, .data$.id, frame, nframes, e, history, keep_last), logical = interpolate_logical_along(d, .data$.id, frame, nframes, e, history, keep_last), factor = interpolate_factor_along(d, .data$.id, frame, nframes, e, history, keep_last), character = interpolate_character_along(d, .data$.id, frame, nframes, e, history, keep_last), colour = interpolate_colour_along(d, .data$.id, frame, nframes, e, history, keep_last), date = interpolate_date_along(d, .data$.id, frame, nframes, e, history, keep_last), datetime = interpolate_datetime_along(d, .data$.id, frame, nframes, e, history, keep_last), constant = interpolate_constant_along(d, .data$.id, frame, nframes, e, history, keep_last), numlist = interpolate_numlist_along(d, .data$.id, frame, nframes, e, history, keep_last), list = interpolate_list_along(d, .data$.id, frame, nframes, e, history, keep_last), phase = get_phase_along(.data$.id, frame, nframes, history, keep_last) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- lapply(tweendata, `[[`, i = 'data') tweendata <- structure(tweendata, names = names(.data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- tweenInfo$frame tweendata$.id <- tweenInfo$group attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.id), , drop = FALSE] } .complete_along <- function(data, along, id) { if (length(along) != nrow(data) || length(id) != nrow(data)) { stop('along and id must be the same length as the number of rows in data', call. = FALSE) } data <- data[order(id), , drop = FALSE] along <- along[order(id)] id <- sort(id) data$.id <- id data$.phase <- 'raw' data$.time <- along data } tweenr/R/tween_state.R0000644000176200001440000003525214026134424014433 0ustar liggesusers#' Compose tweening between states #' #' The `tween_state()` is a counterpart to `tween_states()` that is aimed at #' letting you gradually build up a scene by composing state changes one by one. #' This setup lets you take more control over each state change and allows you #' to work with datasets with uneven number of rows, flexibly specifying what #' should happen with entering and exiting data. `keep_state()` is a simpel #' helper for letting you pause at a state. `open_state()` is a shortcut from #' tweening from an empty dataset with a given `enter()` function while #' `close_state()` is the same but will instead tween into an empty dataset with #' a given `exit()` function. #' #' @param .data A data.frame to start from. If `.data` is the result of a prior #' tween, only the last frame will be used for the tween. The new tween will #' then be added to the prior tween #' #' @param to A data.frame to end at. It must contain the same columns as .data #' (exluding `.frame`) #' #' @param ease The easing function to use. Either a single string or one for #' each column in the data set. #' #' @param nframes The number of frames to calculate for the tween #' #' @param id The column to match observations on. If `NULL` observations will be #' matched by position. See the *Match, Enter, and Exit* section for more #' information. #' #' @param enter,exit functions that calculate a start state for new observations #' that appear in `to` or an end state for observations that are not present in #' `to`. If `NULL` the new/old observations will not be part of the tween. The #' function gets a data.frame with either the start state of the exiting #' observations, or the end state of the entering observations and must return #' a modified version of that data.frame. See the *Match, Enter, and Exit* #' section for more information. #' #' @return A data.frame containing all the intermediary states in the tween, #' each state will be enumerated by the `.frame` column #' #' @section Match, Enter, and Exit: #' When there are discrepancies between the two states to tweeen between you #' need a way to resolve the discrepancy before calculating the intermediary #' states. With discrepancies we mean that some data points are present in the #' start state and not in the end state, and/or some are present in the end #' state but not in the start state. A simple example is that the start state #' contains 100 rows and the end state contains 70. There are 30 missing rows #' that we need to do something about before we can calculate the tween. #' #' **Making pairs** #' The first question to answer is "How do we know which observations are #' disappearing (*exiting*) and/or appearing (*entering*)?". This is done with #' the `id` argument which should give a column name to match rows between the #' two states on. If `id = NULL` the rows will be matched by position (in the #' above example the last 30 rows in the start state will be entering). The `id` #' column must only contain unique values in order to work. #' #' **Making up states** #' Once the rows in each state has been paired you'll end up with three sets of #' data. One containing rows that is present in both the start and end state, #' one containing rows only present in the start state, and one only containing #' rows present in the end state. The first group is easy - here you just tween #' between each rows - but for the other two we'll need some state to start or #' end the tween with. This is really the purpose of the `enter` and `exit` #' functions. They take a data frame containing the subset of data that has not #' been matched and must return a new data frame giving the state that these #' rows must be tweened from/into. A simple example could be an `enter` function #' that sets the variable giving the opacity in the plot to 0 - this will make #' the new points fade into view during the transition. #' #' **Ignoring discrepancies** #' The default values for `enter` and `exit` is `NULL`. This value indicate that #' non-matching rows should simply be ignored for the transition and simply #' appear in the last frame of the tween. This is the default. #' #' @importFrom rlang enquo #' @export #' #' @examples #' data1 <- data.frame( #' x = 1:20, #' y = 0, #' colour = 'forestgreen', #' stringsAsFactors = FALSE #' ) #' data2 <- data1 #' data2$x <- 20:1 #' data2$y <- 1 #' #' data <- data1 %>% #' tween_state(data2, 'linear', 50) %>% #' keep_state(20) %>% #' tween_state(data1, 'bounce-out', 50) #' #' # Using enter and exit (made up numbers) #' df1 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway'), #' population = c(5e6, 10e6, 3.5e6) #' ) #' df2 <- data.frame( #' country = c('Denmark', 'Sweden', 'Norway', 'Finland'), #' population = c(6e6, 10.5e6, 4e6, 3e6) #' ) #' df3 <- data.frame( #' country = c('Denmark', 'Norway'), #' population = c(10e6, 6e6) #' ) #' to_zero <- function(x) { #' x$population <- 0 #' x #' } #' pop_devel <- df1 %>% #' tween_state(df2, 'cubic-in-out', 50, id = country, enter = to_zero) %>% #' tween_state(df3, 'cubic-in-out', 50, id = country, enter = to_zero, #' exit = to_zero) #' tween_state <- function(.data, to, ease, nframes, id = NULL, enter = NULL, exit = NULL) { from <- .get_last_frame(.data) from$.phase <- rep('raw', length.out = nrow(from)) to$.phase <- rep('raw', length.out = nrow(to)) to$.id <- rep(NA_integer_, length.out = nrow(to)) id <- enquo(id) if (.has_frames(.data)) nframes <- nframes + 1 if (!setequal(names(from), names(to))) { stop('from and to must have identical columns', call. = FALSE) } if (nrow(from) == 0 && nrow(to) == 0) { return(.with_prior_frames(.data, from, nframes)) } to <- to[, match(names(from), names(to)), drop = FALSE] if (length(ease) == 1) ease <- rep(ease, ncol(from) - 2) if (length(ease) == ncol(from) - 2) { ease <- c(ease, 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } stopifnot(length(nframes) == 1 && is.numeric(nframes) && nframes %% 1 == 0) classes <- if (nrow(from) == 0) col_classes(to) else col_classes(from) if (nrow(from) > 0 && nrow(to) > 0) { to_classes <- col_classes(to) mismatch <- to_classes != classes for (i in which(mismatch)) { all_na_to <- all(is.na(to[[i]])) all_na_from <- all(is.na(from[[i]])) if (all_na_from) { storage.mode(from[[i]]) <- storage.mode(to[[i]]) } else if (all_na_to) { storage.mode(to[[i]]) <- storage.mode(from[[i]]) } else { stop('The ', names(to)[i], 'column differs in type between the two inputs', call. = FALSE) } } } full_set <- .complete_states(from, to, id, enter, exit, .max_id(.data)) to$.id <- full_set$orig_to tweendata <- lapply(seq_along(classes), function(i) { d <- list(full_set$from[[i]], full_set$to[[i]]) state <- simple_state(nframes, ease[i]) switch( classes[i], numeric = interpolate_numeric_state(d, state), logical = interpolate_logical_state(d, state), factor = interpolate_factor_state(d, state), character = interpolate_character_state(d, state), colour = interpolate_colour_state(d, state), date = interpolate_date_state(d, state), datetime = interpolate_datetime_state(d, state), constant = interpolate_constant_state(d, state), numlist = interpolate_numlist_state(d, state), list = interpolate_list_state(d, state), phase = get_phase_state(d, state) ) }) tweendata <- structure(tweendata, names = names(full_set$from), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- rep(seq_len(nframes - 1), each = nrow(full_set$from)) tweendata <- rbind( if (nframes > 1) cbind(from, .frame = rep(1, nrow(from))) else NULL, tweendata[tweendata$.frame != 1, , drop = FALSE], cbind(to, .frame = rep(nframes, nrow(to))) ) .with_prior_frames(.data, tweendata, nframes) } #' @rdname tween_state #' @export keep_state <- function(.data, nframes) { state <- .get_last_frame(.data) state$.phase <- rep('raw', length.out = nrow(state)) if (.has_frames(.data)) nframes <- nframes + 1 if (nrow(state) == 0) { return(.with_prior_frames(.data, state, nframes)) } states <- state[rep(seq_len(nrow(state)), nframes), , drop = FALSE] states$.phase[seq_len(nrow(state) * (nframes - 1))] <- 'static' states$.frame <- rep(seq_len(nframes), each = nrow(state)) .with_prior_frames(.data, states, nframes) } #' @rdname tween_state #' @export open_state <- function(.data, ease, nframes, enter) { to <- .get_first_frame(.data) if (.has_frames(.data)) nframes <- nframes + 1 tweendata <- tween_state(to[0, , drop = FALSE], to, ease, nframes, enter = enter) .with_later_frames(.data, tweendata, nframes) } #' @rdname tween_state #' @export close_state <- function(.data, ease, nframes, exit) { from <- .get_last_frame(.data) if (.has_frames(.data)) nframes <- nframes + 1 tweendata <- tween_state(from, from[0, , drop = FALSE], ease, nframes, exit = exit) .with_prior_frames(.data, tweendata, nframes) } #' Helpers for working with tweened data #' #' These are internal helpers for extracting and inserting data into a #' data.frame of tweened states. #' #' @param data,prior,later A data.frame. If a `.frame` column exists it will be interpreted #' as a data.frame containing multiple states #' #' @param new_tween The result of a tweening #' #' @return A data.frame #' @keywords internal #' @export #' .get_last_frame <- function(data) { nframes <- attr(data, 'nframes') data <- if (!is.null(nframes)) { data[data$.frame == nframes, names(data) != '.frame', drop = FALSE] } else if ('.frame' %in% names(data)) { data[data$.frame == max(data$.frame), names(data) != '.frame', drop = FALSE] } else { data } if (is.null(data$.id)) { data$.id <- seq_len(nrow(data)) } data } #' @rdname dot-get_last_frame #' @export .get_first_frame <- function(data) { data <- if ('.frame' %in% names(data)) { data[data$.frame == 1, names(data) != '.frame', drop = FALSE] } else { data } if (is.null(data$.id)) { data$.id <- seq_len(nrow(data)) } data } #' @rdname dot-get_last_frame #' @export .with_prior_frames <- function(prior, new_tween, nframes) { nframes_before <- attr(prior, 'nframes') if (is.null(nframes_before) && nrow(prior) > 0 && '.frame' %in% names(prior)) nframes_before <- max(prior$.frame) frames <- if (!is.null(nframes_before)) { prior <- prior[prior$.frame != nframes_before, , drop = FALSE] new_tween$.frame <- new_tween$.frame + nframes_before - 1 rbind(prior, new_tween) } else { nframes_before <- 1 new_tween } attr(frames, 'nframes') <- nframes + nframes_before - 1 attr(frames, 'max_id') <- find_max_id(prior, new_tween) frames } #' @rdname dot-get_last_frame #' @export .with_later_frames <- function(later, new_tween, nframes) { nframes_before <- attr(later, 'nframes') nframes_before <- if (is.null(nframes_before) && nrow(later) > 0 && '.frame' %in% names(later)) max(later$.frame) else 1 frames <- if ('.frame' %in% names(later)) { later <- later[later$.frame != 1, , drop = FALSE] later$.frame <- later$.frame + max(new_tween$.frame) rbind(new_tween, later) } else { new_tween } attr(frames, 'nframes') <- nframes + nframes_before - 1 attr(frames, 'max_id') <- find_max_id(later, new_tween) frames } find_max_id <- function(data, new) { max_new <- if (nrow(new) == 0) 0 else max(new$.id) max(max_new, .max_id(data)) } #' Get the highest id occuring in a dataset #' #' This is helper for `tween_state` related functions to get the currently #' highest `.id` in a frame collection #' #' @param data A data.frame as returned by `tween_state` #' #' @return An integer giving the currently highest id #' #' @keywords internal #' @export .max_id <- function(data) { max_id <- attr(data, 'max_id') if (is.null(max_id) && nrow(data) > 0 && !is.null(data$.id)) max_id <- max(data$.id) else max_id <- nrow(data) max_id } #' Fill in missing rows using enter and exit functions #' #' This function figures out which rows are missing in either state and applies #' the provided `enter` and `exit` functions to fill in the blanks and provide #' a 1-to-1 relation between the rows in `from` and `to`. #' #' @param from,to Data.frames to tween between #' #' @param id The name of the column that holds the matching id #' #' @param enter,exit functions to fill out missing rows in `from` and `to` #' respectively #' #' @return A list with the elements `from` and `to` holding the filled out #' versions of `from` and `to` #' #' @keywords internal #' @importFrom rlang eval_tidy %||% #' @export .complete_states <- function(from, to, id, enter, exit, max_id) { from_id <- eval_tidy(id, from) %||% seq_len(nrow(from)) to_id <- eval_tidy(id, to) %||% seq_len(nrow(to)) if (length(from_id) != nrow(from) || length(to_id) != nrow(to)) { stop('id must match the length of the data', call. = FALSE) } n_to <- nrow(to) if (anyDuplicated(from_id) || anyDuplicated(to_id) || !setequal(from_id, to_id)) { from_id <- paste(from_id, count_occourance(from_id), sep = '_') to_id <- paste(to_id, count_occourance(to_id), sep = '_') entering <- !to_id %in% from_id exiting <- !from_id %in% to_id exits <- from[entering, , drop = FALSE] if (is.null(enter) || sum(entering) == 0) { to <- to[!entering, , drop = FALSE] to_id <- to_id[!entering] enters <- to[0, , drop = FALSE] enter_id <- to_id[0] } else { stopifnot(is.function(enter)) enters <- enter(to[entering, , drop = FALSE]) enters$.phase <- 'enter' enter_id <- to_id[entering] } if (is.null(exit) || sum(exiting) == 0) { from <- from[!exiting, , drop = FALSE] from_id <- from_id[!exiting] exits <- from[0, , drop = FALSE] exit_id <- from_id[0] } else { stopifnot(is.function(exit)) exits <- exit(from[exiting, , drop = FALSE]) exits$.phase <- 'exit' exit_id <- from_id[exiting] } from <- rbind(from, enters) from_id <- c(from_id, enter_id) to <- rbind(to, exits) to_id <- c(to_id, exit_id) } from$.id[is.na(from$.id)] <- seq_len(sum(is.na(from$.id))) + max_id orig_to_id <- from$.id[match(to_id, from_id)][seq_len(n_to)] to <- to[match(from_id, to_id), , drop = FALSE] to$.id <- from$.id list(from = from, to = to, orig_to = orig_to_id) } #' @rdname dot-get_last_frame #' @export .has_frames <- function(data) { !is.null(attr(data, 'nframes')) || !is.null(data$.frame) } simple_state <- function(n, ease) { data.frame(state = c(0, 1), nframes = c(n - 1, 0), ease = c(ease, 'constant'), stringsAsFactors = FALSE) } count_occourance <- function(x) { if (length(x) == 0) return(integer(0)) unsplit(lapply(split(x, x), seq_along), x) } tweenr/R/tween_fill.R0000644000176200001440000000361413352363754014251 0ustar liggesusers#' Fill out missing values by interpolation #' #' This tween fills out `NA` elements (or `NULL` elements if `data` is a list) #' by interpolating between the prior and next non-missing values. #' #' @param data A data.frame or vector. #' @param ease A character vector giving valid easing functions. Recycled to #' match the ncol of `data` #' #' @return If `data` is a data.frame then a data.frame with the same #' columns. If `data` is a vector then a vector. #' #' @export #' #' @examples #' # Single vector #' tween_fill(c(1, NA, NA, NA, NA, NA, 2, 6, NA, NA, NA, -2), 'cubic-in-out') #' #' # Data frame #' tween_fill(mtcars[c(1, NA, NA, NA, NA, 4, NA, NA, NA, 10), ], 'cubic-in') #' tween_fill <- function(data, ease) { single_vec <- !is.data.frame(data) if (single_vec) { if (length(data) == 0) return(data[integer()]) data_df <- data.frame(data = rep(NA, length(data))) data_df$data <- data data <- data_df } else { if (nrow(data) == 0) return(data[integer(), ]) } ease <- rep(ease, length.out = ncol(data)) classes <- col_classes(data) tweendata <- lapply(seq_along(classes), function(i) { switch( classes[i], numeric = interpolate_numeric_fill(data[[i]], ease[i]), logical = interpolate_logical_fill(data[[i]], ease[i]), factor = interpolate_factor_fill(data[[i]], ease[i]), character = interpolate_character_fill(data[[i]], ease[i]), colour = interpolate_colour_fill(data[[i]], ease[i]), date = interpolate_date_fill(data[[i]], ease[i]), datetime = interpolate_datetime_fill(data[[i]], ease[i]), constant = interpolate_constant_fill(data[[i]], ease[i]), numlist = interpolate_numlist_fill(data[[i]], ease[i]), list = interpolate_list_fill(data[[i]], ease[i]) ) }) if (single_vec) return(tweendata[[1]]) structure(tweendata, names = names(data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') } tweenr/R/tween_at.R0000644000176200001440000000614714026134517013723 0ustar liggesusers#' Get a specific position between two states #' #' This tween allows you to query a specific postion between two states rather #' than generate evenly spaced states. It can work with either data.frames or #' single vectors and each row/element can have its own position and easing. #' #' @param from,to A data.frame or vector of the same type. If either is of #' length/nrow 1 it will get repeated to match the length of the other #' @param at A numeric between 0 and 1 recycled to match the nrow/length of #' `from` #' @param ease A character vector giving valid easing functions. Recycled to #' match the ncol of `from` #' #' @return If `from`/`to` is a data.frame then a data.frame with the same #' columns. If `from`/`to` is a vector then a vector. #' #' @export #' #' @examples #' tween_at(mtcars[1:6, ], mtcars[6:1, ], runif(6), 'cubic-in-out') #' tween_at <- function(from, to, at, ease) { single_vec <- !is.data.frame(from) if (single_vec) { if (length(from) == 0 || length(to) == 0) return(to[integer()]) from_df <- data.frame(data = rep(NA, length(from))) to_df <- data.frame(data = rep(NA, length(to))) from_df$data <- from to_df$data <- to from <- from_df to <- to_df } else { if (nrow(from) == 0 || nrow(to) == 0) return(to[integer(), ]) } if (length(at) == 0) stop('at must have length > 0', call. = FALSE) if (nrow(from) == 1) from <- from[rep(1, nrow(to)), , drop = FALSE] if (nrow(to) == 1) to <- to[rep(1, nrow(from)), , drop = FALSE] if (nrow(from) != nrow(to)) { stop('from and to must be same length', call. = FALSE) } stopifnot(names(from) == names(to)) at <- rep(at, length.out = nrow(from)) ease <- rep(ease, length.out = ncol(from)) classes <- col_classes(from) to_classes <- col_classes(to) mismatch <- to_classes != classes for (i in which(mismatch)) { all_na_to <- all(is.na(to[[i]])) all_na_from <- all(is.na(from[[i]])) if (all_na_from) { storage.mode(from[[i]]) <- storage.mode(to[[i]]) } else if (all_na_to) { storage.mode(to[[i]]) <- storage.mode(from[[i]]) } else { stop('The ', names(to)[i], 'column differs in type between the two inputs', call. = FALSE) } } tweendata <- lapply(seq_along(classes), function(i) { switch( classes[i], numeric = interpolate_numeric_at(from[[i]], to[[i]], at, ease[i]), logical = interpolate_logical_at(from[[i]], to[[i]], at, ease[i]), factor = interpolate_factor_at(from[[i]], to[[i]], at, ease[i]), character = interpolate_character_at(from[[i]], to[[i]], at, ease[i]), colour = interpolate_colour_at(from[[i]], to[[i]], at, ease[i]), date = interpolate_date_at(from[[i]], to[[i]], at, ease[i]), datetime = interpolate_datetime_at(from[[i]], to[[i]], at, ease[i]), constant = interpolate_constant_at(from[[i]], to[[i]], at, ease[i]), numlist = interpolate_numlist_at(from[[i]], to[[i]], at, ease[i]), list = interpolate_list_at(from[[i]], to[[i]], at, ease[i]) ) }) if (single_vec) return(tweendata[[1]]) structure(tweendata, names = names(from), row.names = seq_along(tweendata[[1]]), class = 'data.frame') } tweenr/R/interpolate_state.R0000644000176200001440000000444114026063172015634 0ustar liggesusersinterpolate_numeric_state <- function(data, states) { numeric_state_interpolator(data, states) } interpolate_logical_state <- function(data, states) { as.logical(round(numeric_state_interpolator(lapply(data, as.numeric), states))) } #' @importFrom grDevices col2rgb rgb #' @importFrom farver convert_colour interpolate_colour_state <- function(data, states) { data <- lapply(data, function(d){ col <- t(col2rgb(d, alpha = TRUE)) col_conv <- convert_colour(col[,1:3, drop = FALSE], from = 'rgb', to = 'lab') cbind(col_conv, col[,4]) }) int_col <- colour_state_interpolator(data, states) alpha <- int_col[,4] alpha[alpha > 255] <- 255 alpha[alpha < 0] <- 0 int_col <- convert_colour(int_col[, 1:3, drop = FALSE], from = 'lab', to = 'rgb') int_col[int_col > 255] <- 255 int_col[int_col < 0] <- 0 rgb(int_col[, 1], int_col[, 2], int_col[, 3], alpha, maxColorValue = 255) } interpolate_constant_state <- function(data, states) { constant_state_interpolator(data, states) } interpolate_character_state <- function(data, states) { interpolate_constant_state(data, states) } interpolate_date_state <- function(data, states) { data <- lapply(data, as.numeric) as.Date(interpolate_numeric_state(data, states), origin = BASEDATE) } interpolate_datetime_state <- function(data, states) { if (inherits(data[[1]], 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data[[1]] <- as.POSIXct(data[[1]]) } tz <- attr(data[[1]], 'tzone') data <- lapply(data, as.numeric) as.POSIXct(interpolate_numeric_state(data, states), origin = BASEDATETIME, tz = tz) } interpolate_factor_state <- function(data, states) { all_levels <- Reduce(union, lapply(data, levels)) ord <- is.ordered(data[[1]]) data <- lapply(data, as.character) data <- interpolate_character_state(data, states) if (ord) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_state <- function(data, states) { new_data <- list_state_interpolator(data, states) attributes(new_data) <- attributes(data) new_data } interpolate_numlist_state <- function(data, states) { new_data <- numlist_state_interpolator(lapply(data, lapply, as.numeric), states) attributes(new_data) <- attributes(data) new_data } get_phase_state <- function(data, states) { phase_state_interpolator(data, states) } tweenr/R/tween_constant.R0000644000176200001440000000135113352362764015150 0ustar liggesusers#' @rdname tween #' #' @export tween_constant <- function(data, n, ease = 'linear') { data <- as.list(data) data <- lapply(data, as.character) prepData <- prepareTween(data, n, ease) tweendata <- do.call(interpolate_character_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_constant_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } data <- lapply(data, as.character) prepData <- prepareTweenTranspose(data, n, ease) tweendata <- do.call(interpolate_character_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/aaa.R0000644000176200001440000000606214026135441012630 0ustar liggesusersBASEDATE <- Sys.Date() - as.numeric(Sys.Date()) BASEDATETIME <- Sys.time() - as.numeric(Sys.time()) validEase <- c( "linear", "quadratic-in", "quadratic-out", "quadratic-in-out", "cubic-in", "cubic-out", "cubic-in-out", "quartic-in", "quartic-out", "quartic-in-out", "quintic-in", "quintic-out", "quintic-in-out", "sine-in", "sine-out", "sine-in-out", "circular-in", "circular-out", "circular-in-out", "exponential-in", "exponential-out", "exponential-in-out", "elastic-in", "elastic-out", "elastic-in-out", "back-in", "back-out", "back-in-out", "bounce-in", "bounce-out", "bounce-in-out" ) #' @importFrom magrittr %>% #' @export magrittr::`%>%` col_classes <- function(data) { classes <- vapply(data, function(d) { if (is.numeric(d)) { 'numeric' } else if (is.logical(d)) { 'logical' } else if (is.factor(d)) { 'factor' } else if (is.character(d)) { colour <- try(suppressWarnings(col2rgb(d)), silent = TRUE) if (all(is.na(d)) || inherits(colour, 'try-error') || anyNA(colour) || all(grepl('^(\\d|\\.)+$', d))) { 'character' } else { 'colour' } } else if (inherits(d, 'Date')) { 'date' } else if (inherits(d, 'POSIXt')) { 'datetime' } else if (is.list(d)) { if (all(vapply(d, is.numeric, logical(1)))) 'numlist' else 'list' } else { 'constant' } }, character(1)) names(classes) <- names(data) classes[names(classes) == '.phase'] <- 'phase' classes } prepareTween <- function(data, n, ease) { if (!is.list(data)) { data <- as.list(data) } if (length(unique(lengths(data))) != 1) { stop('All elements in data must have the same length') } if (!all(ease %in% validEase)) { stop('ease must be the name of a valid easing function') } n <- c(rep(n, length.out = length(data) - 1) - 1, 1) ease <- c(rep(ease, length.out = length(data) - 1), 'constant') states <- data.frame( state = seq_along(data) - 1, nframes = n, ease = ease, stringsAsFactors = FALSE ) list( data = data, states = states ) } prepareTweenTranspose <- function(data, n, ease) { if (!is.list(data)) { data <- list(data) } if (!all(ease %in% validEase)) { stop('ease must be the name of a valid easing function') } n <- rep(n, length.out = length(data)) n <- Map(function(n, l) { s <- floor(n / l) s <- rep(s, l) overhead <- n - sum(s) if (overhead) { s <- s + rep(floor(overhead / l), l) addInd <- seq_len(n - sum(s)) s[addInd] <- s[addInd] + 1 } c(s, 1) }, n = n - 1, l = lengths(data) - 1) n <- unlist(n) ease <- rep(ease, length.out = length(data)) ease <- rep(ease, lengths(data) - 1) easeSplit <- split(ease, rep(seq_along(data), lengths(data) - 1)) ease <- unlist(lapply(easeSplit, append, values = 'constant')) data <- as.list(unlist(data)) states <- data.frame( state = seq_along(data) - 1, nframes = n, ease = ease, stringsAsFactors = FALSE ) list( data = data, states = states ) } tweenr/R/tween_numeric.R0000644000176200001440000000154713352363073014762 0ustar liggesusers#' @rdname tween #' #' @export tween_numeric <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, is.numeric))) { stop('data must consist of numeric elements') } tweendata <- do.call(interpolate_numeric_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_numeric_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, is.numeric))) { stop('data must consist of numeric elements') } tweendata <- do.call(interpolate_numeric_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/RcppExports.R0000644000176200001440000001102514026314611014370 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 numeric_state_interpolator <- function(data, states) { .Call('_tweenr_numeric_state_interpolator', PACKAGE = 'tweenr', data, states) } colour_state_interpolator <- function(data, states) { .Call('_tweenr_colour_state_interpolator', PACKAGE = 'tweenr', data, states) } constant_state_interpolator <- function(data, states) { .Call('_tweenr_constant_state_interpolator', PACKAGE = 'tweenr', data, states) } list_state_interpolator <- function(data, states) { .Call('_tweenr_list_state_interpolator', PACKAGE = 'tweenr', data, states) } numlist_state_interpolator <- function(data, states) { .Call('_tweenr_numlist_state_interpolator', PACKAGE = 'tweenr', data, states) } phase_state_interpolator <- function(data, states) { .Call('_tweenr_phase_state_interpolator', PACKAGE = 'tweenr', data, states) } numeric_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_numeric_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } colour_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_colour_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } constant_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_constant_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } list_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_list_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } numlist_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_numlist_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } phase_element_interpolator <- function(data, group, frame, ease) { .Call('_tweenr_phase_element_interpolator', PACKAGE = 'tweenr', data, group, frame, ease) } numeric_along_interpolator <- function(data, group, time, history, keep_last, nframes, ease) { .Call('_tweenr_numeric_along_interpolator', PACKAGE = 'tweenr', data, group, time, history, keep_last, nframes, ease) } colour_along_interpolator <- function(data, group, time, history, keep_last, nframes, ease) { .Call('_tweenr_colour_along_interpolator', PACKAGE = 'tweenr', data, group, time, history, keep_last, nframes, ease) } constant_along_interpolator <- function(data, group, time, history, keep_last, nframes, ease) { .Call('_tweenr_constant_along_interpolator', PACKAGE = 'tweenr', data, group, time, history, keep_last, nframes, ease) } list_along_interpolator <- function(data, group, time, history, keep_last, nframes, ease) { .Call('_tweenr_list_along_interpolator', PACKAGE = 'tweenr', data, group, time, history, keep_last, nframes, ease) } numlist_along_interpolator <- function(data, group, time, history, keep_last, nframes, ease) { .Call('_tweenr_numlist_along_interpolator', PACKAGE = 'tweenr', data, group, time, history, keep_last, nframes, ease) } phase_along_interpolator <- function(group, time, history, keep_last, nframes) { .Call('_tweenr_phase_along_interpolator', PACKAGE = 'tweenr', group, time, history, keep_last, nframes) } numeric_at_interpolator <- function(from, to, at, ease) { .Call('_tweenr_numeric_at_interpolator', PACKAGE = 'tweenr', from, to, at, ease) } colour_at_interpolator <- function(from, to, at, ease) { .Call('_tweenr_colour_at_interpolator', PACKAGE = 'tweenr', from, to, at, ease) } constant_at_interpolator <- function(from, to, at, ease) { .Call('_tweenr_constant_at_interpolator', PACKAGE = 'tweenr', from, to, at, ease) } list_at_interpolator <- function(from, to, at, ease) { .Call('_tweenr_list_at_interpolator', PACKAGE = 'tweenr', from, to, at, ease) } numlist_at_interpolator <- function(from, to, at, ease) { .Call('_tweenr_numlist_at_interpolator', PACKAGE = 'tweenr', from, to, at, ease) } numeric_fill_interpolator <- function(data, ease) { .Call('_tweenr_numeric_fill_interpolator', PACKAGE = 'tweenr', data, ease) } colour_fill_interpolator <- function(data, ease) { .Call('_tweenr_colour_fill_interpolator', PACKAGE = 'tweenr', data, ease) } constant_fill_interpolator <- function(data, ease) { .Call('_tweenr_constant_fill_interpolator', PACKAGE = 'tweenr', data, ease) } list_fill_interpolator <- function(data, ease) { .Call('_tweenr_list_fill_interpolator', PACKAGE = 'tweenr', data, ease) } numlist_fill_interpolator <- function(data, ease) { .Call('_tweenr_numlist_fill_interpolator', PACKAGE = 'tweenr', data, ease) } tweenr/R/tweenr_package.R0000644000176200001440000000141413252500161015054 0ustar liggesusers#' @details #' tweenr is a small collection of functions to help you in creating #' intermediary representations of your data, i.e. interpolating states of data. #' As such it's a great match for packages such as animate and gganimate, since #' it can work directly with data.frames of data, but it also provide fast and #' efficient interpolaters for numeric, date, datetime and colour that are #' vectorized and thus more efficient to use than the build in interpolation #' functions (mainly [stats::approx()] and #' [grDevices::colorRamp()]). #' #' The main functions for data.frames are [tween_states()], #' [tween_elements()] and [tween_appear()], while the #' standard interpolaters can be found at [tween()] #' #' @useDynLib tweenr #' @importFrom Rcpp sourceCpp '_PACKAGE' tweenr/R/interpolate_element.R0000644000176200001440000000542414026062676016157 0ustar liggesusersinterpolate_numeric_element <- function(data, group, frame, ease) { numeric_element_interpolator(data, group, frame, ease) } interpolate_logical_element <- function(data, group, frame, ease) { res <- numeric_element_interpolator(as.numeric(data), group, frame, ease) res[['data']] <- as.logical(round(res[['data']])) res } #' @importFrom grDevices col2rgb rgb #' @importFrom farver convert_colour interpolate_colour_element <- function(data, group, frame, ease) { col <- t(col2rgb(data, alpha = TRUE)) data <- convert_colour(col[,1:3, drop = FALSE], from = 'rgb', to = 'lab') int_col <- colour_element_interpolator(cbind(data, col[,4]), group, frame, ease) int_col_convert <- convert_colour(as.matrix(int_col[, c('data1', 'data2', 'data3')]), from = 'lab', to = 'rgb') int_col_convert[int_col_convert > 255] <- 255 int_col_convert[int_col_convert < 0] <- 0 int_col$data4[int_col$data4 < 0] <- 0 data.frame( data = rgb(int_col_convert[, 1], int_col_convert[, 2], int_col_convert[, 3], int_col$data4, maxColorValue = 255), group = int_col$group, frame = int_col$frame, stringsAsFactors = FALSE ) } interpolate_constant_element <- function(data, group, frame, ease) { constant_element_interpolator(data, group, frame, ease) } interpolate_character_element <- function(data, group, frame, ease) { interpolate_constant_element(data, group, frame, ease) } interpolate_date_element <- function(data, group, frame, ease) { data <- as.numeric(data) res <- interpolate_numeric_element(data, group, frame, ease) res[['data']] <- as.Date(res[['data']], origin = BASEDATE) res } interpolate_datetime_element <- function(data, group, frame, ease) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } tz <- attr(data, 'tzone') data <- as.numeric(data) res <- interpolate_numeric_element(data, group, frame, ease) res[['data']] <- as.POSIXct(res[['data']], origin = BASEDATETIME, tz = tz) res } interpolate_factor_element <- function(data, group, frame, ease) { all_levels <- levels(data) ord <- is.ordered(data) data <- as.character(data) res <- interpolate_character_element(data, group, frame, ease) res[['data']] <- if (ord) ordered(res[['data']], all_levels) else factor(res[['data']], all_levels) res } interpolate_list_element <- function(data, group, frame, ease) { new_data <- list_element_interpolator(data, group, frame, ease) attributes(new_data$data) <- attributes(data) new_data } interpolate_numlist_element <- function(data, group, frame, ease) { new_data <- numlist_element_interpolator(data, group, frame, ease) attributes(new_data$data) <- attributes(data) new_data } get_phase_element <- function(data, group, frame, ease) { phase_element_interpolator(data, group, frame, ease) } tweenr/R/interpolate_fill.R0000644000176200001440000000403414026062755015446 0ustar liggesusersinterpolate_numeric_fill <- function(data, ease) { numeric_fill_interpolator(data, ease) } interpolate_logical_fill <- function(data, ease) { as.logical(round(numeric_fill_interpolator(as.numeric(data), ease))) } #' @importFrom grDevices col2rgb rgb #' @importFrom farver convert_colour interpolate_colour_fill <- function(data, ease) { NA_col <- is.na(data) data <- t(col2rgb(data, alpha = TRUE)) data[, 1:3] <- convert_colour(data[, 1:3, drop = FALSE], from = 'rgb', to = 'lab') data[NA_col,] <- NA data <- colour_fill_interpolator(data, ease) NA_col <- is.na(data[, 1]) data[NA_col, 1:3] <- convert_colour(data[NA_col, 1:3, drop = FALSE], from = 'lab', to = 'rgb') data[data > 255] <- 255 data[data < 0] <- 0 all_data <- rep(NA, nrow(data)) all_data[!NA_col] <- rgb(data[!NA_col, , drop = FALSE], alpha = data[!NA_col, 4], maxColorValue = 255L) all_data } interpolate_constant_fill <- function(data, ease) { constant_fill_interpolator(data, ease) } interpolate_character_fill <- function(data, ease) { interpolate_constant_fill(data, ease) } interpolate_date_fill <- function(data, ease) { data <- lapply(data, as.numeric) as.Date(interpolate_numeric_fill(data, ease), origin = BASEDATE) } interpolate_datetime_fill <- function(data, ease) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } as.POSIXct(interpolate_numeric_fill(as.numeric(data), ease), origin = BASEDATETIME, tz = attr(data, 'tzone')) } interpolate_factor_fill <- function(data, ease) { all_levels <- levels(data) ord <- is.ordered(data) data <- interpolate_character_fill(as.character(data), ease) if (ord) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_fill <- function(data, ease) { new_data <- list_fill_interpolator(data, ease) attributes(new_data) <- attributes(data) new_data } interpolate_numlist_fill <- function(data, ease) { new_data <- numlist_fill_interpolator(lapply(data, as.numeric), ease) attributes(new_data) <- attributes(data) new_data } tweenr/R/interpolate_at.R0000644000176200001440000000403514026062325015116 0ustar liggesusersinterpolate_numeric_at <- function(from, to, at, ease) { numeric_at_interpolator(from, to, at, ease) } interpolate_logical_at <- function(from, to, at, ease) { as.logical(round(numeric_at_interpolator(from, to, at, ease))) } interpolate_colour_at <- function(from, to, at, ease) { from <- t(col2rgb(from, alpha = TRUE)) from[, 1:3] <- convert_colour(from[, 1:3, drop = FALSE], from = 'rgb', to = 'lab') to <- t(col2rgb(to, alpha = TRUE)) to[, 1:3] <- convert_colour(to[, 1:3, drop = FALSE], from = 'rgb', to = 'lab') data <- colour_at_interpolator(from, to, at, ease) data[, 1:3] <- convert_colour(data[, 1:3, drop = FALSE], from = 'lab', to = 'rgb') data[data > 255] <- 255 data[data < 0] <- 0 rgb(data, alpha = data[, 4], maxColorValue = 255L) } interpolate_character_at <- function(from, to, at, ease) { constant_at_interpolator(from, to, at, ease) } interpolate_constant_at <- function(from, to, at, ease) { constant_at_interpolator(from, to, at, ease) } interpolate_date_at <- function(from, to, at, ease) { data <- numeric_at_interpolator(as.numeric(from), as.numeric(to), at, ease) as.Date(data, origin = BASEDATE) } interpolate_datetime_at <- function(from, to, at, ease) { if (inherits(from, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") from <- as.POSIXct(from) } tz <- attr(from, 'tzone') data <- numeric_at_interpolator(as.numeric(from), as.numeric(to), at, ease) as.POSIXct(data, origin = BASEDATETIME, tz = tz) } interpolate_factor_at <- function(from, to, at, ease) { all_levels <- unique(c(levels(from), levels(to))) data <- constant_at_interpolator(as.character(from), as.character(to), at, ease) if (is.ordered(from)) ordered(data, all_levels) else factor(data, all_levels) } interpolate_list_at <- function(from, to, at, ease) { data <- list_at_interpolator(from, to, at, ease) attributes(data) <- attributes(from) data } interpolate_numlist_at <- function(from, to, at, ease) { data <- numlist_at_interpolator(from, to, at, ease) attributes(data) <- attributes(from) data } tweenr/R/tween_components.R0000644000176200001440000001331513404726121015474 0ustar liggesusers#' Interpolate individual component #' #' This function is much like [tween_elements()] but with a slightly different #' syntax and support for many of the newer features such as enter/exits and #' tween phase identification. Furthermore it uses tidy evaluation for time and #' id, making it easier to change these on the fly. The biggest change in terms #' of functionality compared to `tween_elements()` is that the easing function #' is now given per column and not per row. If different easing functions are #' needed for each transition then `tween_elements()` is needed. #' #' @inheritParams tween_state #' #' @param .data A data.frame with components at different stages #' #' @param time An unquoted expression giving the timepoint for the different #' stages of the components. Will be evaluated in the context of `.data` so can #' refer to a column from that #' #' @param id An unquoted expression giving the component id for each row. Will #' be evaluated in the context of `.data` so can refer to a column from that #' #' @param range The range of time points to include in the tween. If `NULL` it #' will use the range of `time` #' #' @param enter_length,exit_length The lenght of the opening and closing #' transitions if `enter` and/or `exit` is given. Measured in the same units as #' `time` #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @examples #' #' from_zero <- function(x) {x$x <- 0; x} #' #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 10, 4, 8, 10), #' id = c(1, 1, 1, 2, 2, 2) #' ) #' #' data <- tween_components(data, 'cubic-in-out', nframes = 100, time = time, #' id = id, enter = from_zero, enter_length = 4) #' #' @export #' @importFrom rlang enquo eval_tidy #' tween_components <- function(.data, ease, nframes, time, id = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { time <- enquo(time) time <- eval_tidy(time, .data) id <- enquo(id) id <- if (quo_is_null(id)) rep(1, nrow(.data)) else eval_tidy(id, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data <- .complete_components(.data, time, id, enter, exit, enter_length, exit_length) .tween_individuals(.data, ease, nframes, range) } .tween_individuals <- function(.data, ease, nframes, range) { if (nframes == 0) return(.data[integer(), , drop = FALSE]) if (nrow(.data) == 0) return(.data) if (length(ease) == 1) ease <- rep(ease, ncol(.data) - 3) if (length(ease) == ncol(.data) - 3) { ease <- c(ease, 'linear', 'linear', 'linear') # To account for .phase and .id columns } else { stop('Ease must be either a single string or one for each column', call. = FALSE) } stopifnot(length(nframes) == 1 && is.numeric(nframes) && nframes %% 1 == 0) timerange <- if (is.null(range)) range(.data$.time) else range if (diff(timerange) == 0) stop('range must have a length', call. = FALSE) framelength <- diff(timerange) / (nframes - 1) .data <- .data[order(.data$.id, .data$.time), , drop = FALSE] frame <- round((.data$.time - min(timerange[1])) / framelength) + 1 .data$.time <- NULL colClasses <- col_classes(.data) tweendata <- lapply(seq_along(.data), function(i) { d <- .data[[i]] e <- rep(ease[i], length(d)) switch( colClasses[i], numeric = interpolate_numeric_element(d, .data$.id, frame, e), logical = interpolate_logical_element(d, .data$.id, frame, e), factor = interpolate_factor_element(d, .data$.id, frame, e), character = interpolate_character_element(d, .data$.id, frame, e), colour = interpolate_colour_element(d, .data$.id, frame, e), date = interpolate_date_element(d, .data$.id, frame, e), datetime = interpolate_datetime_element(d, .data$.id, frame, e), constant = interpolate_constant_element(d, .data$.id, frame, e), numlist = interpolate_numlist_element(d, .data$.id, frame, e), list = interpolate_list_element(d, .data$.id, frame, e), phase = get_phase_element(d, .data$.id, frame, e) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- lapply(tweendata, `[[`, i = 'data') tweendata <- structure(tweendata, names = names(.data), row.names = seq_along(tweendata[[1]]), class = 'data.frame') tweendata$.frame <- tweenInfo$frame tweendata$.id <- tweenInfo$group tweendata <- tweendata[tweendata$.frame >= 1 & tweendata$.frame <= nframes, , drop = FALSE] attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.id), , drop = FALSE] } .complete_components <- function(data, time, id, enter, exit, enter_length, exit_length) { if (length(id) != nrow(data) || length(time) != nrow(data)) { stop('id and time must have the same length as the number of rows in data', call. = FALSE) } data$.id <- id data$.phase <- rep('raw', nrow(data)) data$.time <- time if (any(!is.null(enter), !is.null(exit))) { time_ord <- order(time) if (!is.null(enter)) { enter_data <- enter(data[time_ord[!duplicated(id[time_ord])], , drop = FALSE]) enter_data$.phase <- 'enter' enter_data$.time <- enter_data$.time - enter_length } else { enter_data <- data[0, , drop = FALSE] } if (!is.null(exit)) { exit_data <- exit(data[time_ord[!duplicated(id[time_ord], fromLast = TRUE)], , drop = FALSE]) exit_data$.phase <- 'exit' exit_data$.time <- exit_data$.time + exit_length } else { exit_data <- data[0, , drop = FALSE] } data <- rbind(enter_data, data, exit_data) } data } tweenr/R/tween_datetime.R0000644000176200001440000000160713352363010015100 0ustar liggesusers#' @rdname tween #' #' @export tween_datetime <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'POSIXt'))) { stop('data must consist of POSIXt elements') } tweendata <- do.call(interpolate_datetime_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_datetime_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'POSIXt'))) { stop('data must consist of POSIXt elements') } tweendata <- do.call(interpolate_datetime_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/interpolate_along.R0000644000176200001440000000650314026062100015603 0ustar liggesusersinterpolate_numeric_along <- function(data, group, frame, nframes, ease, history, keep_last) { numeric_along_interpolator(data, group, frame, history, keep_last, nframes, ease) } interpolate_logical_along <- function(data, group, frame, nframes, ease, history, keep_last) { res <- numeric_along_interpolator(data, group, frame, history, keep_last, nframes, ease) res[['data']] <- as.logical(round(res[['data']])) res } #' @importFrom grDevices col2rgb rgb #' @importFrom farver convert_colour interpolate_colour_along <- function(data, group, frame, nframes, ease, history, keep_last) { col <- t(col2rgb(data, alpha = TRUE)) data <- convert_colour(col[,1:3, drop = FALSE], from = 'rgb', to = 'lab') int_col <- colour_along_interpolator(cbind(data, col[,4]), group, frame, history, keep_last, nframes, ease) int_col_convert <- convert_colour(as.matrix(int_col[, c('data1', 'data2', 'data3')]), from = 'lab', to = 'rgb') int_col_convert[int_col_convert > 255] <- 255 int_col_convert[int_col_convert < 0] <- 0 int_col$data4[int_col$data4 < 0] <- 0 data.frame( data = rgb(int_col_convert[, 1], int_col_convert[, 2], int_col_convert[, 3], int_col$data4, maxColorValue = 255), group = int_col$group, frame = int_col$frame, stringsAsFactors = FALSE ) } interpolate_constant_along <- function(data, group, frame, nframes, ease, history, keep_last) { constant_along_interpolator(data, group, frame, history, keep_last, nframes, ease) } interpolate_character_along <- function(data, group, frame, nframes, ease, history, keep_last) { constant_along_interpolator(data, group, frame, history, keep_last, nframes, ease) } interpolate_date_along <- function(data, group, frame, nframes, ease, history, keep_last) { data <- as.numeric(data) res <- interpolate_numeric_along(data, group, frame, nframes, ease, history, keep_last) res[['data']] <- as.Date(res[['data']], origin = BASEDATE) res } interpolate_datetime_along <- function(data, group, frame, nframes, ease, history, keep_last) { if (inherits(data, 'POSIXlt')) { warning("POSIXlt converted to POSIXct") data <- as.POSIXct(data) } tz <- attr(data, 'tzone') data <- as.numeric(data) res <- interpolate_numeric_along(data, group, frame, nframes, ease, history, keep_last) res[['data']] <- as.POSIXct(res[['data']], origin = BASEDATETIME, tz = tz) res } interpolate_factor_along <- function(data, group, frame, nframes, ease, history, keep_last) { all_levels <- levels(data) ord <- is.ordered(data) data <- as.character(data) res <- interpolate_character_along(data, group, frame, nframes, ease, history, keep_last) res[['data']] <- if (ord) ordered(res[['data']], all_levels) else factor(res[['data']], all_levels) res } interpolate_list_along <- function(data, group, frame, nframes, ease, history, keep_last) { new_data <- list_along_interpolator(data, group, frame, history, keep_last, nframes, ease) attributes(new_data$data) <- attributes(data) new_data } interpolate_numlist_along <- function(data, group, frame, nframes, ease, history, keep_last) { new_data <- numlist_along_interpolator(data, group, frame, history, keep_last, nframes, ease) attributes(new_data$data) <- attributes(data) new_data } get_phase_along <- function(group, frame, nframes, history, keep_last) { phase_along_interpolator(group, frame, history, keep_last, nframes) } tweenr/R/tween_events.R0000644000176200001440000000615013352646216014622 0ustar liggesusers#' Transition in and out of events #' #' This tweening function is a more powerful version of [tween_appear()], with #' support for newer features such as enter/exits and tween phase #' identification. The tweener treats each row in the data as unique events in #' time, and creates frames with the correct events present at any given time. #' #' @param start,end The start (and potential end) of the event encoded in the #' row, as unquoted expressions. Will be evaluated in the context of `.data` so #' can refer to columns in it. If `end = NULL` the event will be without extend #' and only visible in a single frame, unless `enter` and/or `exit` is given. #' #' @inheritParams tween_components #' #' @return A data.frame with the same columns as `.data` along with `.id` giving #' the component id, `.phase` giving the state of each component in each frame, #' and `.frame` giving the frame membership of each row. #' #' @family data.frame tween #' #' @importFrom rlang enquo quo_is_missing eval_tidy #' @export #' #' @examples #' d <- data.frame( #' x = runif(20), #' y = runif(20), #' time = runif(20), #' duration = runif(20, max = 0.1) #' ) #' from_left <- function(x) { #' x$x <- -0.5 #' x #' } #' to_right <- function(x) { #' x$x <- 1.5 #' x #' } #' #' tween_events(d, 'cubic-in-out', 50, start = time, end = time + duration, #' enter = from_left, exit = to_right, enter_length = 0.1, #' exit_length = 0.05) #' tween_events <- function(.data, ease, nframes, start, end = NULL, range = NULL, enter = NULL, exit = NULL, enter_length = 0, exit_length = 0) { start <- enquo(start) if (quo_is_missing(start)) stop('start must be provided', call. = FALSE) start <- eval_tidy(start, .data) end <- enquo(end) end <- eval_tidy(end, .data) enter_length <- enquo(enter_length) enter_length <- eval_tidy(enter_length, .data) exit_length <- enquo(exit_length) exit_length <- eval_tidy(exit_length, .data) if (is.null(enter_length)) enter_length <- 0 if (is.null(exit_length)) exit_length <- 0 .data <- .complete_events(.data, start, end, enter, exit, enter_length, exit_length) .tween_individuals(.data, ease, nframes, range) } .complete_events <- function(data, start, end, enter, exit, enter_length, exit_length) { data$.id <- seq_len(nrow(data)) data$.phase <- rep("raw", nrow(data)) start <- rep(start, length.out = nrow(data)) if (is.null(end)) { event_end <- data[0, , drop = FALSE] end <- start[0] } else { event_end <- data end <- rep(end, length.out = nrow(data)) data$.phase <- 'static' } if (is.null(enter)) { enter_data <- data[0, , drop = FALSE] enter_time <- start[0] } else { enter_data <- enter(data) enter_data$.phase <- 'enter' enter_time <- start - enter_length } if (is.null(exit)) { exit_data <- data[0, , drop = FALSE] exit_time <- start[0] } else { exit_data <- exit(data) exit_data$.phase <- 'exit' exit_time <- (if (length(end) == 0) start else end) + exit_length } data <- rbind(enter_data, data, event_end, exit_data) time <- c(enter_time, start, end, exit_time) data$.time <- time data } tweenr/R/tween_elements.R0000644000176200001440000000664614026133234015132 0ustar liggesusers#' Create frames based on individual element states #' #' This function creates tweens for each observation individually, in cases #' where the data doesn't pass through collective states but consists of fully #' independent transitions. Each observation is identified by an id and each #' state must have a time associated with it. #' #' @param data A data.frame consisting at least of a column giving the #' observation id, a column giving timepoints for each state and a column giving #' the easing to apply when transitioning away from the state. #' #' @param time The name of the column holding timepoints #' #' @param group The name of the column holding the observation id #' #' @param ease The name of the column holding the easing function name #' #' @param timerange The range of time to span. If missing it will default to #' \code{range(data[[time]])} #' #' @param nframes The number of frames to generate. If missing it will default #' to `ceiling(diff(timerange) + 1)` (At least one frame for each #' individual timepoint) #' #' @return A data.frame with the same columns as `data` except for the #' group and ease columns, but replicated `nframes` times. Two additional #' columns called `.frame` and `.group` will be added giving the frame #' number and observation id for each row. #' #' @family data.frame tween #' #' @examples #' data <- data.frame( #' x = c(1, 2, 2, 1, 2, 2), #' y = c(1, 2, 2, 2, 1, 1), #' time = c(1, 4, 10, 4, 8, 10), #' group = c(1, 1, 1, 2, 2, 2), #' ease = rep('cubic-in-out', 6) #' ) #' #' data <- tween_elements(data, 'time', 'group', 'ease', nframes = 100) #' #' @export #' tween_elements <- function(data, time, group, ease, timerange, nframes) { if (!all(data[[ease]] %in% validEase)) { stop("All names given in the easing column must be valid easers") } if (missing(timerange) || is.null(timerange)) { timerange <- range(data[[time]]) } if (missing(nframes) || is.null(nframes)) { nframes <- ceiling(diff(timerange) + 1) } framelength <- diff(timerange) / nframes specialCols <- c(group, ease) data <- data[order(data[[group]], data[[time]]), ] group <- as.character(data[[group]]) frame <- round((data[[time]] - timerange[1]) / framelength) ease <- as.character(data[[ease]]) data <- data[, !names(data) %in% specialCols, drop = FALSE] colClasses <- col_classes(data) tweendata <- lapply(seq_along(data), function(i) { d <- data[[i]] switch( colClasses[i], numeric = interpolate_numeric_element(d, group, frame, ease), logical = interpolate_logical_element(d, group, frame, ease), factor = interpolate_factor_element(d, group, frame, ease), character = interpolate_character_element(d, group, frame, ease), colour = interpolate_colour_element(d, group, frame, ease), date = interpolate_date_element(d, group, frame, ease), datetime = interpolate_datetime_element(d, group, frame, ease), constant = interpolate_constant_element(d, group, frame, ease), numlist = interpolate_numlist_element(d, group, frame, ease), list = interpolate_list_element(d, group, frame, ease) ) }) tweenInfo <- tweendata[[1]][, c('group', 'frame')] tweendata <- as.data.frame(lapply(tweendata, `[[`, i = 'data')) names(tweendata) <- names(data) tweendata$.frame <- tweenInfo$frame tweendata$.group <- tweenInfo$group attr(tweendata, 'framelength') <- framelength tweendata[order(tweendata$.frame, tweendata$.group), ] } tweenr/R/tween_date.R0000644000176200001440000000155713352362777014250 0ustar liggesusers#' @rdname tween #' #' @export tween_date <- function(data, n, ease = 'linear') { data <- as.list(data) prepData <- prepareTween(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'Date'))) { stop('data must consist of Date elements') } tweendata <- do.call(interpolate_date_state, prepData) unname(split(tweendata, rep(seq_along(data[[1]]), length.out = length(tweendata)))) } #' @rdname tween #' #' @export tween_date_t <- function(data, n, ease = 'linear') { if (!is.list(data)) { data <- list(data) } prepData <- prepareTweenTranspose(data, n, ease) if (!all(sapply(prepData$data, inherits, what = 'Date'))) { stop('data must consist of Date elements') } tweendata <- do.call(interpolate_date_state, prepData) unname(split(tweendata, rep(seq_along(data), rep(n, length.out = length(data))))) } tweenr/R/display_ease.R0000644000176200001440000000373114026314604014550 0ustar liggesusers#' Display an easing function #' #' This simple helper lets you explore how the different easing functions govern #' the interpolation of data. #' #' @details #' How transitions proceed between states are defined by an easing function. The #' easing function converts the parameterized progression from one state to the #' next to a new number between 0 and 1. `linear` easing is equivalent to #' an identity function that returns the input unchanged. In addition there are #' a range of additional easers available, each with three modifiers. #' #' \strong{Easing modifiers:} #' \describe{ #' \item{-in}{The easing function is applied as-is} #' \item{-out}{The easing function is applied in reverse} #' \item{-in-out}{The first half of the transition it is applied as-is, while #' in the last half it is reversed} #' } #' #' \strong{Easing functions} #' \describe{ #' \item{quadratic}{Models a power-of-2 function} #' \item{cubic}{Models a power-of-3 function} #' \item{quartic}{Models a power-of-4 function} #' \item{quintic}{Models a power-of-5 function} #' \item{sine}{Models a sine function} #' \item{circular}{Models a pi/2 circle arc} #' \item{exponential}{Models an exponential function} #' \item{elastic}{Models an elastic release of energy} #' \item{back}{Models a pullback and relase} #' \item{bounce}{Models the bouncing of a ball} #' } #' #' In addition to this function a good animated explanation can be found #' [here](https://easings.net). #' #' @param ease The name of the easing function to display (see details) #' #' @return This function is called for its side effects #' #' @examples #' # The default - identity #' display_ease('linear') #' #' # A more fancy easer #' display_ease('elastic-in') #' #' @importFrom graphics plot #' @export #' display_ease <- function(ease) { easepoints <- tween_numeric(c(0, 1), 100, ease)[[1]] progress <- seq(0, 1, length.out = 100) plot(progress, easepoints, type = 'l', main = ease, xlab = 'In', ylab = 'Out', bty = 'n') } tweenr/NEWS.md0000644000176200001440000000014614026314450012654 0ustar liggesusers# tweenr 1.0.2 * Added a `NEWS.md` file to track changes to the package. * Fixed numerous small bugs tweenr/MD50000644000176200001440000000611414026405722012072 0ustar liggesusers2c40d90260525b990e0ecf1caec8a09f *DESCRIPTION 928d886d4e8454f3db823a37d4de465f *LICENSE 1ce9ebcadbe312056258a8f41326b685 *NAMESPACE 65c3ce87cfcfb3bbf37c12996770050f *NEWS.md 313d3adca091ef0a5997a0bf74c05e61 *R/RcppExports.R 6d2501678cd3506c942e927fae66921d *R/aaa.R 032419b5cfcaa8dd4107e3e7c3cf2bec *R/display_ease.R d26681c3773b411c7ffe2db19caef8c7 *R/interpolate_along.R 5ac9f7371fc6c582a102a1a4fd05cd0b *R/interpolate_at.R a7c121edf525ac84cb2f028fe26c1289 *R/interpolate_element.R 3c0bec403ef5deb268c58df0b4623e5c *R/interpolate_fill.R 802a21df1a867c4bd95394889d198893 *R/interpolate_state.R 689f558411e69e41e4e75f5369aeaf60 *R/tween.R ac339e3835e902f17f662884605697e6 *R/tween_along.R f39b8007cfd54cde80f229a266fa8103 *R/tween_appear.R b6d92dda24c3386739e90df8435af7ed *R/tween_at.R a0fb7bf5931f79cdc9b3fe258a1b7af5 *R/tween_colour.R 9721b0743f541b5c29e1e03e150fd861 *R/tween_components.R e2bf81312be495522d36feace8ca4291 *R/tween_constant.R 81d553e0dabc78640045286414615d9c *R/tween_date.R c043ef5f53d196435d92b7502733ed98 *R/tween_datetime.R c3d9bd610ec0ebf6843938b52ba9a238 *R/tween_elements.R ead890774e462247a42cff161142c73d *R/tween_events.R 8d2d40175112d9250bbf643846105c5f *R/tween_fill.R 3fbebb9b93bfc70f98c8d4da699a7517 *R/tween_numeric.R 0ac68bf9e06f2222afa1d5267bcb0295 *R/tween_state.R 812405ce92dfc8a9e81a5a823894cc10 *R/tween_states.R 96d0cc4763f6e260723404181527692d *R/tweenr_package.R cd21f63677894ef74c3b5b566d171885 *README.md 006d520fdb51f615fa84db95ca6b4076 *man/display_ease.Rd 34366927919391bd1a708125f2175dd4 *man/dot-complete_states.Rd 4c6856bef70b38658bdb9adf438ddbf8 *man/dot-get_last_frame.Rd 822defaec9293e5bce6728c6bfcecddc *man/dot-max_id.Rd 5a90bd5b61b274bb352149a7dd6d431f *man/figures/README-unnamed-chunk-3.gif 152c1de11d09be541d1bb504fe20719e *man/figures/README-unnamed-chunk-4-1.png a43cef038c756170afdfda6598b4886c *man/figures/logo.png c3a1403cda76e69677010cd563c99af2 *man/reexports.Rd 1f081c01cd58e66dd3e34d1523e3e551 *man/tween.Rd e4373e9693e32eea83e0efa810df6402 *man/tween_along.Rd 8c2f535034f643c88cbd62434d41c266 *man/tween_appear.Rd 5ae8335a6fb227f5334ca7e2d863aa99 *man/tween_at.Rd abe61a84ef7b1a7f0247177d35370d2b *man/tween_components.Rd 9b53857281041b4f8fc2f3b21a7f983c *man/tween_elements.Rd e3fd4ecad44c33d22a7c0c6d36be0469 *man/tween_events.Rd 27b0ed281713d21cae636526fe08fb06 *man/tween_fill.Rd f6079fb5b8f81356eaf9095f67c86361 *man/tween_state.Rd 4368bbcc5cd1df401e37373da32bdcaa *man/tween_states.Rd 7ad682185df8a16d0007b36e491a930f *man/tweenr-package.Rd ec84e616c2be105b238e96a615188688 *src/RcppExports.cpp 402909f0606ef2ea238175b22c3b4813 *src/easing.c 20db4b5dfde1a8274bafe699cb5b5cc4 *src/easing.h a7f788391129df8b8a004836a8d559aa *src/interpolators.cpp aa895b44ba533f702387d9ec557e501a *tests/testthat.R 642f1ef1e7a912267fc9891a21216cc4 *tests/testthat/test-along.R ee87f10b41a70e3ca3ef3e90f5e1a505 *tests/testthat/test-at.R 925c0539a4fdf0c24b2344cd0cadb0ab *tests/testthat/test-components.R 7d3b896a697948cda844ebdc6f0188ef *tests/testthat/test-events.R 6159b10fcca398bb4731d00bfa6b6342 *tests/testthat/test-fill.R 8974d4e9b2ef18152c9a94510196925c *tests/testthat/test-state.R