From aae3791ba486412288ef81417158f854d44d72c4 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 15:21:03 +0100 Subject: [PATCH 01/50] renamed create_prob_dist to create_prob_distribution --- NAMESPACE | 2 +- R/create_prob_dist.R | 18 ++--- R/epiparameter.R | 4 +- ...ob_dist.Rd => create_prob_distribution.Rd} | 14 ++-- .../test-create_epiparameter_prob_dist.R | 66 +++++++++---------- 5 files changed, 52 insertions(+), 52 deletions(-) rename man/{create_prob_dist.Rd => create_prob_distribution.Rd} (94%) diff --git a/NAMESPACE b/NAMESPACE index c31d339a5..8a7e92267 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -38,7 +38,7 @@ export(convert_summary_stats_to_params) export(create_citation) export(create_metadata) export(create_method_assess) -export(create_prob_dist) +export(create_prob_distribution) export(create_region) export(create_summary_stats) export(create_uncertainty) diff --git a/R/create_prob_dist.R b/R/create_prob_dist.R index 282c71e0c..5bbfa0fe3 100644 --- a/R/create_prob_dist.R +++ b/R/create_prob_dist.R @@ -36,7 +36,7 @@ #' #' @examples #' # example with continuous distribution without truncation -#' create_prob_dist( +#' create_prob_distribution( #' prob_dist = "gamma", #' prob_dist_params = c(shape = 1, scale = 1), #' discretise = FALSE, @@ -44,7 +44,7 @@ #' ) #' #' # example with continuous distribution with truncation -#' create_prob_dist( +#' create_prob_distribution( #' prob_dist = "gamma", #' prob_dist_params = c(shape = 1, scale = 1), #' discretise = FALSE, @@ -52,7 +52,7 @@ #' ) #' #' # example with discrete distribution -#' create_prob_dist( +#' create_prob_distribution( #' prob_dist = "gamma", #' prob_dist_params = c(shape = 1, scale = 1), #' discretise = TRUE, @@ -60,18 +60,18 @@ #' ) #' #' # example passing extra arguments to distcrete -#' create_prob_dist( +#' create_prob_distribution( #' prob_dist = "gamma", #' prob_dist_params = c(shape = 1, scale = 1), #' discretise = TRUE, #' truncation = NA, #' w = 0.5 #' ) -create_prob_dist <- function(prob_dist, - prob_dist_params, - discretise = FALSE, - truncation = NA, - ...) { +create_prob_distribution <- function(prob_dist, + prob_dist_params, + discretise = FALSE, + truncation = NA, + ...) { checkmate::assert_character( prob_dist, min.chars = 1, diff --git a/R/epiparameter.R b/R/epiparameter.R index e89d7f927..a3691f790 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -78,7 +78,7 @@ new_epiparameter <- function(disease = character(), message("Unparameterised object") } else { # create a S3 object holding the probability distribution - prob_dist <- create_prob_dist( + prob_dist <- create_prob_distribution( prob_dist = prob_dist, prob_dist_params = prob_dist_params, discretise = discretise, @@ -711,7 +711,7 @@ discretise.epiparameter <- function(x, ...) { ) # create a new discretised probability distribution - x$prob_dist <- create_prob_dist( + x$prob_dist <- create_prob_distribution( prob_dist = prob_dist, prob_dist_params = prob_dist_params, discretise = TRUE, diff --git a/man/create_prob_dist.Rd b/man/create_prob_distribution.Rd similarity index 94% rename from man/create_prob_dist.Rd rename to man/create_prob_distribution.Rd index a180d724a..42e12b5fb 100644 --- a/man/create_prob_dist.Rd +++ b/man/create_prob_distribution.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/create_prob_dist.R -\name{create_prob_dist} -\alias{create_prob_dist} +\name{create_prob_distribution} +\alias{create_prob_distribution} \title{Create a distribution object} \usage{ -create_prob_dist( +create_prob_distribution( prob_dist, prob_dist_params, discretise = FALSE, @@ -65,7 +65,7 @@ see \code{\link[distcrete:distcrete]{distcrete::distcrete()}}. } \examples{ # example with continuous distribution without truncation -create_prob_dist( +create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -73,7 +73,7 @@ create_prob_dist( ) # example with continuous distribution with truncation -create_prob_dist( +create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -81,7 +81,7 @@ create_prob_dist( ) # example with discrete distribution -create_prob_dist( +create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, @@ -89,7 +89,7 @@ create_prob_dist( ) # example passing extra arguments to distcrete -create_prob_dist( +create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, diff --git a/tests/testthat/test-create_epiparameter_prob_dist.R b/tests/testthat/test-create_epiparameter_prob_dist.R index d737755c7..5c9dea1eb 100644 --- a/tests/testthat/test-create_epiparameter_prob_dist.R +++ b/tests/testthat/test-create_epiparameter_prob_dist.R @@ -1,5 +1,5 @@ -test_that("create_prob_dist works for continuous gamma", { - res <- create_prob_dist( +test_that("create_prob_distribution works for continuous gamma", { + res <- create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -14,8 +14,8 @@ test_that("create_prob_dist works for continuous gamma", { ) }) -test_that("create_prob_dist works for continuous lognormal", { - res <- create_prob_dist( +test_that("create_prob_distribution works for continuous lognormal", { + res <- create_prob_distribution( prob_dist = "lnorm", prob_dist_params = c(meanlog = 1, sdlog = 1), discretise = FALSE, @@ -30,8 +30,8 @@ test_that("create_prob_dist works for continuous lognormal", { ) }) -test_that("create_prob_dist works for continuous Weibull", { - res <- create_prob_dist( +test_that("create_prob_distribution works for continuous Weibull", { + res <- create_prob_distribution( prob_dist = "weibull", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -46,8 +46,8 @@ test_that("create_prob_dist works for continuous Weibull", { ) }) -test_that("create_prob_dist works for negative binomial", { - res <- create_prob_dist( +test_that("create_prob_distribution works for negative binomial", { + res <- create_prob_distribution( prob_dist = "nbinom", prob_dist_params = c(mean = 1, dispersion = 1), discretise = FALSE, @@ -62,8 +62,8 @@ test_that("create_prob_dist works for negative binomial", { ) }) -test_that("create_prob_dist works for geometric", { - res <- create_prob_dist( +test_that("create_prob_distribution works for geometric", { + res <- create_prob_distribution( prob_dist = "geom", prob_dist_params = c(mean = 1), discretise = FALSE, @@ -78,8 +78,8 @@ test_that("create_prob_dist works for geometric", { ) }) -test_that("create_prob_dist works for poisson", { - res <- create_prob_dist( +test_that("create_prob_distribution works for poisson", { + res <- create_prob_distribution( prob_dist = "pois", prob_dist_params = c(mean = 1), discretise = FALSE, @@ -94,8 +94,8 @@ test_that("create_prob_dist works for poisson", { ) }) -test_that("create_prob_dist works for exponential", { - res <- create_prob_dist( +test_that("create_prob_distribution works for exponential", { + res <- create_prob_distribution( prob_dist = "exp", prob_dist_params = c(rate = 2), discretise = FALSE, @@ -110,8 +110,8 @@ test_that("create_prob_dist works for exponential", { ) }) -test_that("create_prob_dist works for discrete gamma", { - res <- create_prob_dist( +test_that("create_prob_distribution works for discrete gamma", { + res <- create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, @@ -126,8 +126,8 @@ test_that("create_prob_dist works for discrete gamma", { ) }) -test_that("create_prob_dist works for discrete lognormal", { - res <- create_prob_dist( +test_that("create_prob_distribution works for discrete lognormal", { + res <- create_prob_distribution( prob_dist = "lnorm", prob_dist_params = c(meanlog = 1, sdlog = 1), discretise = TRUE, @@ -142,8 +142,8 @@ test_that("create_prob_dist works for discrete lognormal", { ) }) -test_that("create_prob_dist works for discrete Weibull", { - res <- create_prob_dist( +test_that("create_prob_distribution works for discrete Weibull", { + res <- create_prob_distribution( prob_dist = "weibull", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, @@ -158,8 +158,8 @@ test_that("create_prob_dist works for discrete Weibull", { ) }) -test_that("create_prob_dist works for discrete normal", { - res <- create_prob_dist( +test_that("create_prob_distribution works for discrete normal", { + res <- create_prob_distribution( prob_dist = "norm", prob_dist_params = c(mean = 1, sd = 1), discretise = TRUE, @@ -174,8 +174,8 @@ test_that("create_prob_dist works for discrete normal", { ) }) -test_that("create_prob_dist works for truncated continuous", { - res <- create_prob_dist( +test_that("create_prob_distribution works for truncated continuous", { + res <- create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -186,15 +186,15 @@ test_that("create_prob_dist works for truncated continuous", { expect_identical(family(res), "truncated") }) -test_that("create_prob_dist works passing args via ...", { - dist1 <- create_prob_dist( +test_that("create_prob_distribution works passing args via ...", { + dist1 <- create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA, w = 1 ) - dist2 <- create_prob_dist( + dist2 <- create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, @@ -206,9 +206,9 @@ test_that("create_prob_dist works passing args via ...", { expect_identical(dist2$w, 0.5) }) -test_that("create_prob_dist fails for unrecognised discretised", { +test_that("create_prob_distribution fails for unrecognised discretised", { expect_error( - create_prob_dist( + create_prob_distribution( prob_dist = "distribution", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, @@ -218,9 +218,9 @@ test_that("create_prob_dist fails for unrecognised discretised", { ) }) -test_that("create_prob_dist fails for unrecognised non-discretised", { +test_that("create_prob_distribution fails for unrecognised non-discretised", { expect_error( - create_prob_dist( + create_prob_distribution( prob_dist = "distribution", prob_dist_params = c(shape = 1, scale = 1), discretise = FALSE, @@ -230,9 +230,9 @@ test_that("create_prob_dist fails for unrecognised non-discretised", { ) }) -test_that("create_prob_dist errors for discrete truncation", { +test_that("create_prob_distribution errors for discrete truncation", { expect_error( - create_prob_dist( + create_prob_distribution( prob_dist = "gamma", prob_dist_params = c(shape = 1, scale = 1), discretise = TRUE, From db40db49df628214278948ade3919bffa01473f9 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 15:22:18 +0100 Subject: [PATCH 02/50] rename create_prob_dist R and test file to create_prob_distribution --- R/{create_prob_dist.R => create_prob_distribution.R} | 0 ...e_epiparameter_prob_dist.R => test-create_prob_distribution.R} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename R/{create_prob_dist.R => create_prob_distribution.R} (100%) rename tests/testthat/{test-create_epiparameter_prob_dist.R => test-create_prob_distribution.R} (100%) diff --git a/R/create_prob_dist.R b/R/create_prob_distribution.R similarity index 100% rename from R/create_prob_dist.R rename to R/create_prob_distribution.R diff --git a/tests/testthat/test-create_epiparameter_prob_dist.R b/tests/testthat/test-create_prob_distribution.R similarity index 100% rename from tests/testthat/test-create_epiparameter_prob_dist.R rename to tests/testthat/test-create_prob_distribution.R From 7d0fcb020a7ff1e0d567939ed3d0989ea4bb6b9f Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 15:36:49 +0100 Subject: [PATCH 03/50] return character from create_prob_distribution if parameters not given --- R/create_prob_distribution.R | 12 +++++++++++- man/create_prob_distribution.Rd | 5 +++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index 5bbfa0fe3..c3daf44da 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -23,6 +23,11 @@ #' see [distcrete::distcrete()]. #' #' @inheritParams new_epiparameter +#' @param discretise A boolean `logical` whether the distribution is +#' discretised. +#' Default is FALSE which assumes a continuous probability distribution +#' @param truncation A `numeric` specifying the truncation point if the inferred +#' distribution was truncated, `NA` if not or unknown. #' @param ... [dots] Extra arguments to be passed to #' \pkg{distributional} or \pkg{distcrete} functions that construct the S3 #' distribution objects. To see which arguments can be adjusted for discretised @@ -31,7 +36,8 @@ #' constructor function, e.g. for the Gamma distribution see #' [distributional::dist_gamma()]. #' -#' @return An S3 class containing the probability distribution. +#' @return An S3 class containing the probability distribution or a `character` +#' string if the parameters of the probability distribution are unknown. #' @export #' #' @examples @@ -78,6 +84,10 @@ create_prob_distribution <- function(prob_dist, min.len = 1, max.len = 2 ) + + # when only the type of probability distribution is known return string + if (missing(prob_dist_params)) return(prob_dist) + checkmate::assert_numeric(prob_dist_params, names = "unique") checkmate::assert_logical(discretise, len = 1) checkmate::assert_number(truncation, na.ok = TRUE) diff --git a/man/create_prob_distribution.Rd b/man/create_prob_distribution.Rd index 42e12b5fb..a7a8203e4 100644 --- a/man/create_prob_distribution.Rd +++ b/man/create_prob_distribution.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/create_prob_dist.R +% Please edit documentation in R/create_prob_distribution.R \name{create_prob_distribution} \alias{create_prob_distribution} \title{Create a distribution object} @@ -37,7 +37,8 @@ constructor function, e.g. for the Gamma distribution see \code{\link[distributional:dist_gamma]{distributional::dist_gamma()}}.} } \value{ -An S3 class containing the probability distribution. +An S3 class containing the probability distribution or a \code{character} +string if the parameters of the probability distribution are unknown. } \description{ Creates an S3 class holding the distribution and parameters From 08a39debd3141e66507887982fbc32df49ef15d4 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 16:29:14 +0100 Subject: [PATCH 04/50] rename create_prob_distribution args to prob_distribution and prob_distribution_params --- R/create_prob_distribution.R | 76 +++++++++---------- R/epiparameter.R | 8 +- man/create_prob_distribution.Rd | 26 +++---- .../testthat/test-create_prob_distribution.R | 68 ++++++++--------- 4 files changed, 89 insertions(+), 89 deletions(-) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index c3daf44da..854db9812 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -22,7 +22,7 @@ #' for the discretisation is 1. `w` can be `[0,1]`. For more information please #' see [distcrete::distcrete()]. #' -#' @inheritParams new_epiparameter +#' @inheritParams epiparameter #' @param discretise A boolean `logical` whether the distribution is #' discretised. #' Default is FALSE which assumes a continuous probability distribution @@ -43,72 +43,72 @@ #' @examples #' # example with continuous distribution without truncation #' create_prob_distribution( -#' prob_dist = "gamma", -#' prob_dist_params = c(shape = 1, scale = 1), +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), #' discretise = FALSE, #' truncation = NA #' ) #' #' # example with continuous distribution with truncation #' create_prob_distribution( -#' prob_dist = "gamma", -#' prob_dist_params = c(shape = 1, scale = 1), +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), #' discretise = FALSE, #' truncation = 10 #' ) #' #' # example with discrete distribution #' create_prob_distribution( -#' prob_dist = "gamma", -#' prob_dist_params = c(shape = 1, scale = 1), +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), #' discretise = TRUE, #' truncation = NA #' ) #' #' # example passing extra arguments to distcrete #' create_prob_distribution( -#' prob_dist = "gamma", -#' prob_dist_params = c(shape = 1, scale = 1), +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), #' discretise = TRUE, #' truncation = NA, #' w = 0.5 #' ) -create_prob_distribution <- function(prob_dist, - prob_dist_params, +create_prob_distribution <- function(prob_distribution, + prob_distribution_params, discretise = FALSE, truncation = NA, ...) { checkmate::assert_character( - prob_dist, + prob_distribution, min.chars = 1, min.len = 1, max.len = 2 ) # when only the type of probability distribution is known return string - if (missing(prob_dist_params)) return(prob_dist) + if (missing(prob_distribution_params)) return(prob_distribution) - checkmate::assert_numeric(prob_dist_params, names = "unique") + checkmate::assert_numeric(prob_distribution_params, names = "unique") checkmate::assert_logical(discretise, len = 1) checkmate::assert_number(truncation, na.ok = TRUE) dots <- list(...) if (discretise) { - prob_dist <- match.arg( - prob_dist, + prob_distribution <- match.arg( + prob_distribution, choices = c("gamma", "lnorm", "weibull", "norm") ) # create default list of args to construct distcrete_args <- c( - name = prob_dist, + name = prob_distribution, interval = 1, - as.list(prob_dist_params), + as.list(prob_distribution_params), w = 1 ) # modify args if provided in dots distcrete_args <- utils::modifyList(distcrete_args, dots) # create discretised probability distribution object - prob_dist <- do.call( + prob_distribution <- do.call( distcrete::distcrete, distcrete_args ) @@ -116,39 +116,39 @@ create_prob_distribution <- function(prob_dist, # currently dots not used to construct chkDots(...) # create non-discretised probability distribution object - prob_dist <- switch(prob_dist, + prob_distribution <- switch(prob_distribution, gamma = distributional::dist_gamma( - shape = prob_dist_params[["shape"]], - rate = 1 / prob_dist_params[["scale"]] + shape = prob_distribution_params[["shape"]], + rate = 1 / prob_distribution_params[["scale"]] ), lnorm = distributional::dist_lognormal( - mu = prob_dist_params[["meanlog"]], - sigma = prob_dist_params[["sdlog"]] + mu = prob_distribution_params[["meanlog"]], + sigma = prob_distribution_params[["sdlog"]] ), weibull = distributional::dist_weibull( - shape = prob_dist_params[["shape"]], - scale = prob_dist_params[["scale"]] + shape = prob_distribution_params[["shape"]], + scale = prob_distribution_params[["scale"]] ), nbinom = distributional::dist_negative_binomial( - size = prob_dist_params[["dispersion"]], + size = prob_distribution_params[["dispersion"]], prob = convert_summary_stats_to_params( "nbinom", - mean = prob_dist_params[["mean"]], - dispersion = prob_dist_params[["dispersion"]] + mean = prob_distribution_params[["mean"]], + dispersion = prob_distribution_params[["dispersion"]] )$prob ), geom = distributional::dist_geometric( - prob = unname(prob_dist_params) + prob = unname(prob_distribution_params) ), pois = distributional::dist_poisson( - lambda = unname(prob_dist_params) + lambda = unname(prob_distribution_params) ), norm = distributional::dist_normal( - mu = prob_dist_params[["mean"]], - sigma = prob_dist_params[["sd"]] + mu = prob_distribution_params[["mean"]], + sigma = prob_distribution_params[["sd"]] ), exp = distributional::dist_exponential( - rate = prob_dist_params[["rate"]] + rate = prob_distribution_params[["rate"]] ), stop("Did not recognise distribution name", call. = FALSE) ) @@ -162,13 +162,13 @@ create_prob_distribution <- function(prob_dist, call. = FALSE ) } else { - prob_dist <- distributional::dist_truncated( - prob_dist, + prob_distribution <- distributional::dist_truncated( + prob_distribution, upper = truncation ) } } - # return prob_dist object - prob_dist + # return prob_distribution object + prob_distribution } diff --git a/R/epiparameter.R b/R/epiparameter.R index a3691f790..6d2d04c86 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -79,8 +79,8 @@ new_epiparameter <- function(disease = character(), } else { # create a S3 object holding the probability distribution prob_dist <- create_prob_distribution( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params, + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params, discretise = discretise, truncation = truncation, ... @@ -712,8 +712,8 @@ discretise.epiparameter <- function(x, ...) { # create a new discretised probability distribution x$prob_dist <- create_prob_distribution( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params, + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params, discretise = TRUE, truncation = NA ) diff --git a/man/create_prob_distribution.Rd b/man/create_prob_distribution.Rd index a7a8203e4..164333b28 100644 --- a/man/create_prob_distribution.Rd +++ b/man/create_prob_distribution.Rd @@ -5,20 +5,20 @@ \title{Create a distribution object} \usage{ create_prob_distribution( - prob_dist, - prob_dist_params, + prob_distribution, + prob_distribution_params, discretise = FALSE, truncation = NA, ... ) } \arguments{ -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability +\item{prob_distribution}{A \code{character} string specifying the probability +distribution. This should match the \R naming convention of probability distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and geometric is \code{geom}).} -\item{prob_dist_params}{A named vector of probability distribution +\item{prob_distribution_params}{A named vector of probability distribution parameters.} \item{discretise}{A boolean \code{logical} whether the distribution is @@ -67,32 +67,32 @@ see \code{\link[distcrete:distcrete]{distcrete::distcrete()}}. \examples{ # example with continuous distribution without truncation create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = NA ) # example with continuous distribution with truncation create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = 10 ) # example with discrete distribution create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA ) # example passing extra arguments to distcrete create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA, w = 0.5 diff --git a/tests/testthat/test-create_prob_distribution.R b/tests/testthat/test-create_prob_distribution.R index 5c9dea1eb..8197d1348 100644 --- a/tests/testthat/test-create_prob_distribution.R +++ b/tests/testthat/test-create_prob_distribution.R @@ -1,7 +1,7 @@ test_that("create_prob_distribution works for continuous gamma", { res <- create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = NA ) @@ -16,8 +16,8 @@ test_that("create_prob_distribution works for continuous gamma", { test_that("create_prob_distribution works for continuous lognormal", { res <- create_prob_distribution( - prob_dist = "lnorm", - prob_dist_params = c(meanlog = 1, sdlog = 1), + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1), discretise = FALSE, truncation = NA ) @@ -32,8 +32,8 @@ test_that("create_prob_distribution works for continuous lognormal", { test_that("create_prob_distribution works for continuous Weibull", { res <- create_prob_distribution( - prob_dist = "weibull", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "weibull", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = NA ) @@ -48,8 +48,8 @@ test_that("create_prob_distribution works for continuous Weibull", { test_that("create_prob_distribution works for negative binomial", { res <- create_prob_distribution( - prob_dist = "nbinom", - prob_dist_params = c(mean = 1, dispersion = 1), + prob_distribution = "nbinom", + prob_distribution_params = c(mean = 1, dispersion = 1), discretise = FALSE, truncation = NA ) @@ -64,8 +64,8 @@ test_that("create_prob_distribution works for negative binomial", { test_that("create_prob_distribution works for geometric", { res <- create_prob_distribution( - prob_dist = "geom", - prob_dist_params = c(mean = 1), + prob_distribution = "geom", + prob_distribution_params = c(mean = 1), discretise = FALSE, truncation = NA ) @@ -80,8 +80,8 @@ test_that("create_prob_distribution works for geometric", { test_that("create_prob_distribution works for poisson", { res <- create_prob_distribution( - prob_dist = "pois", - prob_dist_params = c(mean = 1), + prob_distribution = "pois", + prob_distribution_params = c(mean = 1), discretise = FALSE, truncation = NA ) @@ -96,8 +96,8 @@ test_that("create_prob_distribution works for poisson", { test_that("create_prob_distribution works for exponential", { res <- create_prob_distribution( - prob_dist = "exp", - prob_dist_params = c(rate = 2), + prob_distribution = "exp", + prob_distribution_params = c(rate = 2), discretise = FALSE, truncation = NA ) @@ -112,8 +112,8 @@ test_that("create_prob_distribution works for exponential", { test_that("create_prob_distribution works for discrete gamma", { res <- create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA ) @@ -128,8 +128,8 @@ test_that("create_prob_distribution works for discrete gamma", { test_that("create_prob_distribution works for discrete lognormal", { res <- create_prob_distribution( - prob_dist = "lnorm", - prob_dist_params = c(meanlog = 1, sdlog = 1), + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1), discretise = TRUE, truncation = NA ) @@ -144,8 +144,8 @@ test_that("create_prob_distribution works for discrete lognormal", { test_that("create_prob_distribution works for discrete Weibull", { res <- create_prob_distribution( - prob_dist = "weibull", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "weibull", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA ) @@ -160,8 +160,8 @@ test_that("create_prob_distribution works for discrete Weibull", { test_that("create_prob_distribution works for discrete normal", { res <- create_prob_distribution( - prob_dist = "norm", - prob_dist_params = c(mean = 1, sd = 1), + prob_distribution = "norm", + prob_distribution_params = c(mean = 1, sd = 1), discretise = TRUE, truncation = NA ) @@ -176,8 +176,8 @@ test_that("create_prob_distribution works for discrete normal", { test_that("create_prob_distribution works for truncated continuous", { res <- create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = 10 ) @@ -188,15 +188,15 @@ test_that("create_prob_distribution works for truncated continuous", { test_that("create_prob_distribution works passing args via ...", { dist1 <- create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA, w = 1 ) dist2 <- create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA, w = 0.5 @@ -209,8 +209,8 @@ test_that("create_prob_distribution works passing args via ...", { test_that("create_prob_distribution fails for unrecognised discretised", { expect_error( create_prob_distribution( - prob_dist = "distribution", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "distribution", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = NA ), @@ -221,8 +221,8 @@ test_that("create_prob_distribution fails for unrecognised discretised", { test_that("create_prob_distribution fails for unrecognised non-discretised", { expect_error( create_prob_distribution( - prob_dist = "distribution", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "distribution", + prob_distribution_params = c(shape = 1, scale = 1), discretise = FALSE, truncation = NA ), @@ -233,8 +233,8 @@ test_that("create_prob_distribution fails for unrecognised non-discretised", { test_that("create_prob_distribution errors for discrete truncation", { expect_error( create_prob_distribution( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE, truncation = 10 ), From e6ac77c500d4b195d49c8aa6ff49025a2cf539be Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 16:39:41 +0100 Subject: [PATCH 05/50] clean prob_distribution in create_prob_distribution to prevent string matching issues --- R/create_prob_distribution.R | 3 +++ 1 file changed, 3 insertions(+) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index 854db9812..b957d4b9b 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -92,6 +92,9 @@ create_prob_distribution <- function(prob_distribution, checkmate::assert_logical(discretise, len = 1) checkmate::assert_number(truncation, na.ok = TRUE) + # set prob_distribution to lowercase for downstream case sensitive matching + prob_distribution <- .clean_string(prob_distribution) + dots <- list(...) if (discretise) { prob_distribution <- match.arg( From 5909fa920d65ae27ea2859aeba711c2fd7617c09 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 17:05:51 +0100 Subject: [PATCH 06/50] rename is_epiparameter_params args prob_distribution and prob_distribution_params --- R/epiparameter-utils.R | 27 ++++++++++++++------------- man/is_epiparameter_params.Rd | 12 ++++++------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/R/epiparameter-utils.R b/R/epiparameter-utils.R index eb95b5a5a..7b7ac09d2 100644 --- a/R/epiparameter-utils.R +++ b/R/epiparameter-utils.R @@ -484,32 +484,33 @@ create_method_assess <- function(censored = NA, #' This check for valid parameters is independent of whether the distribution #' is truncated or discretised. #' -#' @inheritParams new_epiparameter +#' @inheritParams epiparameter #' #' @return A boolean `logical`. #' @export #' #' @examples #' is_epiparameter_params( -#' prob_dist = "gamma", -#' prob_dist_params = c(shape = 2, scale = 1) +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 2, scale = 1) #' ) -is_epiparameter_params <- function(prob_dist, prob_dist_params) { - if (is.na(prob_dist) || anyNA(prob_dist_params)) { +is_epiparameter_params <- function(prob_distribution, + prob_distribution_params) { + if (is.na(prob_distribution) || anyNA(prob_distribution_params)) { return(FALSE) } # check input checkmate::assert_numeric( - prob_dist_params, + prob_distribution_params, min.len = 1, names = "unique" ) # remove truncation parameters if truncated - if ("upper" %in% names(prob_dist_params)) { - prob_dist_params <- prob_dist_params[ - names(prob_dist_params) != c("lower", "upper") + if ("upper" %in% names(prob_distribution_params)) { + prob_distribution_params <- prob_distribution_params[ + names(prob_distribution_params) != c("lower", "upper") ] } @@ -524,13 +525,13 @@ is_epiparameter_params <- function(prob_dist, prob_dist_params) { norm = list(c("mean", "sd"), c("mu", "sigma")), exp = list("rate", "lambda", "mean") ) - possible_params <- possible_params[[prob_dist]] + possible_params <- possible_params[[prob_distribution]] # check whether any combinations are valid matches <- vapply( possible_params, function(x, y) all(names(y) %in% x) && identical(length(y), length(x)), - y = prob_dist_params, + y = prob_distribution_params, FUN.VALUE = logical(1) ) @@ -560,8 +561,8 @@ is_epiparameter_params <- function(prob_dist, prob_dist_params) { #' @keywords internal .clean_params <- function(prob_dist, prob_dist_params) { valid_params <- is_epiparameter_params( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params ) if (!valid_params) { stop( diff --git a/man/is_epiparameter_params.Rd b/man/is_epiparameter_params.Rd index 34efa40af..817607b10 100644 --- a/man/is_epiparameter_params.Rd +++ b/man/is_epiparameter_params.Rd @@ -5,15 +5,15 @@ \title{Check whether the vector of parameters for the probability distribution are in the set of possible parameters used in the epiparameter package} \usage{ -is_epiparameter_params(prob_dist, prob_dist_params) +is_epiparameter_params(prob_distribution, prob_distribution_params) } \arguments{ -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability +\item{prob_distribution}{A \code{character} string specifying the probability +distribution. This should match the \R naming convention of probability distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and geometric is \code{geom}).} -\item{prob_dist_params}{A named vector of probability distribution +\item{prob_distribution_params}{A named vector of probability distribution parameters.} } \value{ @@ -29,7 +29,7 @@ is truncated or discretised. } \examples{ is_epiparameter_params( - prob_dist = "gamma", - prob_dist_params = c(shape = 2, scale = 1) + prob_distribution = "gamma", + prob_distribution_params = c(shape = 2, scale = 1) ) } From d4f856fc044802320176720eba8247aa47b8cf15 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 17:15:05 +0100 Subject: [PATCH 07/50] rename .clean_params args to prob_distribution and prob_distribution_params and update usage --- R/accessors.R | 4 +- R/epiparameter-utils.R | 22 +++--- R/epiparameter.R | 8 +- man/dot-clean_params.Rd | 7 +- tests/testthat/test-epiparameter-utils.R | 96 ++++++++++++------------ 5 files changed, 66 insertions(+), 71 deletions(-) diff --git a/R/accessors.R b/R/accessors.R index eb8054fcb..70a719d6b 100644 --- a/R/accessors.R +++ b/R/accessors.R @@ -53,8 +53,8 @@ get_parameters.epiparameter <- function(x, ...) { # convert to meanlog and sdlog names params <- .clean_params( - prob_dist = family(x), - prob_dist_params = params + prob_distribution = family(x), + prob_distribution_params = params ) } else { return(NA) diff --git a/R/epiparameter-utils.R b/R/epiparameter-utils.R index 7b7ac09d2..84c5bcc25 100644 --- a/R/epiparameter-utils.R +++ b/R/epiparameter-utils.R @@ -559,30 +559,30 @@ is_epiparameter_params <- function(prob_distribution, #' #' @return Named `numeric` vector of parameters. #' @keywords internal -.clean_params <- function(prob_dist, prob_dist_params) { +.clean_params <- function(prob_distribution, prob_distribution_params) { valid_params <- is_epiparameter_params( - prob_distribution = prob_dist, - prob_distribution_params = prob_dist_params + prob_distribution = prob_distribution, + prob_distribution_params = prob_distribution_params ) if (!valid_params) { stop( - "Invalid parameterisation for ", prob_dist, " distribution", + "Invalid parameterisation for ", prob_distribution, " distribution", call. = FALSE ) } - is_trunc <- "upper" %in% names(prob_dist_params) + is_trunc <- "upper" %in% names(prob_distribution_params) # remove truncation parameters if truncated if (is_trunc) { - trunc_params <- prob_dist_params[ - names(prob_dist_params) == c("lower", "upper") + trunc_params <- prob_distribution_params[ + names(prob_distribution_params) == c("lower", "upper") ] - prob_dist_params <- prob_dist_params[ - names(prob_dist_params) != c("lower", "upper") + prob_distribution_params <- prob_distribution_params[ + names(prob_distribution_params) != c("lower", "upper") ] } # weibull only has one parameterisation so does not need cleaning clean_func <- switch( - prob_dist, + prob_distribution, gamma = .clean_params_gamma, lnorm = .clean_params_lnorm, weibull = function(x) x, @@ -593,7 +593,7 @@ is_epiparameter_params <- function(prob_distribution, exp = .clean_params_exp, stop("Probability distribution not recognised", call. = FALSE) ) - clean_params <- do.call(clean_func, list(prob_dist_params)) + clean_params <- do.call(clean_func, list(prob_distribution_params)) # reappend truncation parameter if truncated if (is_trunc) { clean_params <- append(clean_params, trunc_params) diff --git a/R/epiparameter.R b/R/epiparameter.R index 6d2d04c86..6a2f69e4a 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -61,8 +61,8 @@ new_epiparameter <- function(disease = character(), if (is_epiparameter_params(prob_dist, prob_dist_params)) { # standardise common distribution parameters prob_dist_params <- .clean_params( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params ) } else if (auto_calc_params) { # calculate parameters if not provided @@ -706,8 +706,8 @@ discretise.epiparameter <- function(x, ...) { # standardise distribution parameter names prob_dist_params <- .clean_params( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params ) # create a new discretised probability distribution diff --git a/man/dot-clean_params.Rd b/man/dot-clean_params.Rd index c024d6245..c2af46247 100644 --- a/man/dot-clean_params.Rd +++ b/man/dot-clean_params.Rd @@ -11,7 +11,7 @@ \alias{.clean_params_exp} \title{Standardise distribution parameters} \usage{ -.clean_params(prob_dist, prob_dist_params) +.clean_params(prob_distribution, prob_distribution_params) .clean_params_gamma(prob_dist_params) @@ -28,11 +28,6 @@ .clean_params_exp(prob_dist_params) } \arguments{ -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability -distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and -geometric is \code{geom}).} - \item{prob_dist_params}{A named vector of probability distribution parameters.} } diff --git a/tests/testthat/test-epiparameter-utils.R b/tests/testthat/test-epiparameter-utils.R index c16973f73..1413ec2c7 100644 --- a/tests/testthat/test-epiparameter-utils.R +++ b/tests/testthat/test-epiparameter-utils.R @@ -91,14 +91,14 @@ test_that("create_citation works with PMID", { test_that(".clean_params works as expected for gamma", { params <- .clean_params( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1) + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) ) expect_identical(params, c(shape = 1, scale = 1)) params <- .clean_params( - prob_dist = "gamma", - prob_dist_params = c(shape = 1, rate = 0.5) + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, rate = 0.5) ) expect_identical(params, c(shape = 1, scale = 2)) }) @@ -106,8 +106,8 @@ test_that(".clean_params works as expected for gamma", { test_that(".clean_params fails when gamma parameters are incorrect", { expect_error( .clean_params( - prob_dist = "gamma", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "gamma", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ), regexp = "Invalid parameterisation for gamma distribution" ) @@ -115,14 +115,14 @@ test_that(".clean_params fails when gamma parameters are incorrect", { test_that(".clean_params works as expected for lnorm", { params <- .clean_params( - prob_dist = "lnorm", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ) expect_identical(params, c(meanlog = 1, sdlog = 1)) params <- .clean_params( - prob_dist = "lnorm", - prob_dist_params = c(mu = 2, sigma = 2) + prob_distribution = "lnorm", + prob_distribution_params = c(mu = 2, sigma = 2) ) expect_identical(params, c(meanlog = 2, sdlog = 2)) }) @@ -130,8 +130,8 @@ test_that(".clean_params works as expected for lnorm", { test_that(".clean_params fails when lnorm parameters are incorrect", { expect_error( .clean_params( - prob_dist = "lnorm", - prob_dist_params = c(shape = 1, scale = 1) + prob_distribution = "lnorm", + prob_distribution_params = c(shape = 1, scale = 1) ), regexp = "Invalid parameterisation for lnorm distribution" ) @@ -139,8 +139,8 @@ test_that(".clean_params fails when lnorm parameters are incorrect", { test_that(".clean_params works as expected for weibull", { params <- .clean_params( - prob_dist = "weibull", - prob_dist_params = c(shape = 1, scale = 1) + prob_distribution = "weibull", + prob_distribution_params = c(shape = 1, scale = 1) ) expect_identical(params, c(shape = 1, scale = 1)) }) @@ -148,8 +148,8 @@ test_that(".clean_params works as expected for weibull", { test_that(".clean_params fails when weibull parameters are incorrect", { expect_error( .clean_params( - prob_dist = "weibull", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "weibull", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ), regexp = "Invalid parameterisation for weibull distribution" ) @@ -157,14 +157,14 @@ test_that(".clean_params fails when weibull parameters are incorrect", { test_that(".clean_params works as expected for nbinom", { params <- .clean_params( - prob_dist = "nbinom", - prob_dist_params = c(n = 2, p = 0.5) + prob_distribution = "nbinom", + prob_distribution_params = c(n = 2, p = 0.5) ) expect_identical(params, c(mean = 2, dispersion = 2)) params <- .clean_params( - prob_dist = "nbinom", - prob_dist_params = c(mean = 1, dispersion = 1) + prob_distribution = "nbinom", + prob_distribution_params = c(mean = 1, dispersion = 1) ) expect_identical(params, c(mean = 1, dispersion = 1)) }) @@ -172,8 +172,8 @@ test_that(".clean_params works as expected for nbinom", { test_that(".clean_params fails when nbinom parameters are incorrect", { expect_error( .clean_params( - prob_dist = "nbinom", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "nbinom", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ), regexp = "Invalid parameterisation for nbinom distribution" ) @@ -181,20 +181,20 @@ test_that(".clean_params fails when nbinom parameters are incorrect", { test_that(".clean_params works as expected for geom", { params <- .clean_params( - prob_dist = "geom", - prob_dist_params = c(prob = 0.5) + prob_distribution = "geom", + prob_distribution_params = c(prob = 0.5) ) expect_identical(params, c(prob = 0.5)) params <- .clean_params( - prob_dist = "geom", - prob_dist_params = c(p = 0.5) + prob_distribution = "geom", + prob_distribution_params = c(p = 0.5) ) expect_identical(params, c(prob = 0.5)) params <- .clean_params( - prob_dist = "geom", - prob_dist_params = c(mean = 2) + prob_distribution = "geom", + prob_distribution_params = c(mean = 2) ) expect_identical(params, c(prob = 0.5)) }) @@ -202,8 +202,8 @@ test_that(".clean_params works as expected for geom", { test_that(".clean_params fails when geom parameters are incorrect", { expect_error( .clean_params( - prob_dist = "geom", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "geom", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ), regexp = "Invalid parameterisation for geom distribution" ) @@ -211,20 +211,20 @@ test_that(".clean_params fails when geom parameters are incorrect", { test_that(".clean_params works as expected for pois", { params <- .clean_params( - prob_dist = "pois", - prob_dist_params = c(mean = 0.5) + prob_distribution = "pois", + prob_distribution_params = c(mean = 0.5) ) expect_identical(params, c(mean = 0.5)) params <- .clean_params( - prob_dist = "pois", - prob_dist_params = c(l = 0.5) + prob_distribution = "pois", + prob_distribution_params = c(l = 0.5) ) expect_identical(params, c(mean = 0.5)) params <- .clean_params( - prob_dist = "pois", - prob_dist_params = c(lambda = 0.5) + prob_distribution = "pois", + prob_distribution_params = c(lambda = 0.5) ) expect_identical(params, c(mean = 0.5)) }) @@ -232,8 +232,8 @@ test_that(".clean_params works as expected for pois", { test_that(".clean_params fails when pois parameters are incorrect", { expect_error( .clean_params( - prob_dist = "pois", - prob_dist_params = c(means = 1) + prob_distribution = "pois", + prob_distribution_params = c(means = 1) ), regexp = "Invalid parameterisation for pois distribution" ) @@ -241,20 +241,20 @@ test_that(".clean_params fails when pois parameters are incorrect", { test_that(".clean_params works as expected for exp", { params <- .clean_params( - prob_dist = "exp", - prob_dist_params = c(rate = 2) + prob_distribution = "exp", + prob_distribution_params = c(rate = 2) ) expect_identical(params, c(rate = 2)) params <- .clean_params( - prob_dist = "exp", - prob_dist_params = c(lambda = 2) + prob_distribution = "exp", + prob_distribution_params = c(lambda = 2) ) expect_identical(params, c(rate = 2)) params <- .clean_params( - prob_dist = "exp", - prob_dist_params = c(mean = 0.5) + prob_distribution = "exp", + prob_distribution_params = c(mean = 0.5) ) expect_identical(params, c(rate = 2)) }) @@ -262,8 +262,8 @@ test_that(".clean_params works as expected for exp", { test_that(".clean_params fails when exp parameters are incorrect", { expect_error( .clean_params( - prob_dist = "exp", - prob_dist_params = c(means = 1) + prob_distribution = "exp", + prob_distribution_params = c(means = 1) ), regexp = "Invalid parameterisation for exp distribution" ) @@ -272,8 +272,8 @@ test_that(".clean_params fails when exp parameters are incorrect", { test_that(".clean_params fails as expected", { expect_error( .clean_params( - prob_dist = "distribution", - prob_dist_params = c(meanlog = 1, sdlog = 1) + prob_distribution = "distribution", + prob_distribution_params = c(meanlog = 1, sdlog = 1) ), regexp = "Invalid parameterisation for distribution distribution" ) From 8b5f31c538abc7071198f94c00cfda09ff9601db Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 17:24:48 +0100 Subject: [PATCH 08/50] add parameter standardisation to create_prob_distribution --- R/create_prob_distribution.R | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index b957d4b9b..9af006dbf 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -95,6 +95,19 @@ create_prob_distribution <- function(prob_distribution, # set prob_distribution to lowercase for downstream case sensitive matching prob_distribution <- .clean_string(prob_distribution) + if (is_epiparameter_params(prob_distribution, prob_distribution_params)) { + # standardise common distribution parameters + prob_distribution_params <- .clean_params( + prob_distribution = prob_distribution, + prob_distribution_params = prob_distribution_params + ) + } else { + stop( + "Incorrect parameters provided for probability distribution.", + call. = FALSE + ) + } + dots <- list(...) if (discretise) { prob_distribution <- match.arg( From 3eef80f5637e9f5fbf669203426fde003f752360 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Thu, 19 Sep 2024 17:25:04 +0100 Subject: [PATCH 09/50] update create_prob_distribution test error messages --- tests/testthat/test-create_prob_distribution.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-create_prob_distribution.R b/tests/testthat/test-create_prob_distribution.R index 8197d1348..f7e4eb980 100644 --- a/tests/testthat/test-create_prob_distribution.R +++ b/tests/testthat/test-create_prob_distribution.R @@ -214,7 +214,7 @@ test_that("create_prob_distribution fails for unrecognised discretised", { discretise = TRUE, truncation = NA ), - regexp = "(arg)*(should be one of)*(gamma)*(lnorm)*(weibull)" + regexp = "Incorrect parameters provided for probability distribution." ) }) @@ -226,7 +226,7 @@ test_that("create_prob_distribution fails for unrecognised non-discretised", { discretise = FALSE, truncation = NA ), - regexp = "Did not recognise distribution name" + regexp = "Incorrect parameters provided for probability distribution." ) }) From 0fa7bfaf9d59493e0eda1534b102d1ea706bf0a0 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Fri, 20 Sep 2024 10:13:18 +0100 Subject: [PATCH 10/50] rename .calc_dist_params args to prob_distribution and prob_distribution_params --- R/calc_dist_params.R | 33 +++++++++++++++----------- tests/testthat/test-calc_dist_params.R | 28 +++++++++++----------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/R/calc_dist_params.R b/R/calc_dist_params.R index ad88f15e5..517cb0e00 100644 --- a/R/calc_dist_params.R +++ b/R/calc_dist_params.R @@ -29,14 +29,14 @@ #' #' @return A named `numeric` vector with parameters. #' @keywords internal -.calc_dist_params <- function(prob_dist, # nolint cyclocomp - prob_dist_params, +.calc_dist_params <- function(prob_distribution, # nolint cyclocomp + prob_distribution_params, summary_stats, sample_size) { - if (is.na(prob_dist)) { + if (is.na(prob_distribution)) { message( "No adequate summary statistics available to calculate the parameters ", - "of the ", prob_dist, " distribution" + "of the ", prob_distribution, " distribution" ) return(NA) } @@ -61,7 +61,9 @@ ) # extract dispersion - disp <- unname(prob_dist_params[names(prob_dist_params) == "dispersion"]) + disp <- unname( + prob_distribution_params[names(prob_distribution_params) == "dispersion"] + ) median_disp <- c(median = summary_stats$median, dispersion = disp) # extract mean and sd @@ -93,8 +95,11 @@ ) summary_stats_ <- summary_stats_[idx] # create flat list structure to be passed to ... in conversion - args <- unlist(list(prob_dist, as.list(summary_stats_)), recursive = FALSE) - prob_dist_params <- unlist(do.call( + args <- unlist( + list(prob_distribution, as.list(summary_stats_)), + recursive = FALSE + ) + prob_distribution_params <- unlist(do.call( convert_summary_stats_to_params, args = args )) @@ -102,31 +107,31 @@ med <- summary_stats$median meanlog <- log(med / sqrt(1 + disp^2)) sdlog <- sqrt(log(1 + disp^2)) - prob_dist_params <- c(meanlog = meanlog, sdlog = sdlog) + prob_distribution_params <- c(meanlog = meanlog, sdlog = sdlog) } else if (!anyNA(percentiles)) { # calculate the parameters from the percentiles # percentiles required to be [0, 1] so divide by 100 - prob_dist_params <- extract_param( + prob_distribution_params <- extract_param( type = "percentile", values = percentiles, - distribution = prob_dist, + distribution = prob_distribution, percentiles = as.numeric(names(percentiles)) / 100 ) } else if (is_median_range) { - prob_dist_params <- extract_param( + prob_distribution_params <- extract_param( type = "range", values = median_range, - distribution = prob_dist, + distribution = prob_distribution, samples = sample_size ) } else { message( "No adequate summary statistics available to calculate the parameters ", - "of the ", prob_dist, " distribution" + "of the ", prob_distribution, " distribution" ) return(NA) } # return params - prob_dist_params + prob_distribution_params } diff --git a/tests/testthat/test-calc_dist_params.R b/tests/testthat/test-calc_dist_params.R index 72e0c6588..2a720ed58 100644 --- a/tests/testthat/test-calc_dist_params.R +++ b/tests/testthat/test-calc_dist_params.R @@ -1,7 +1,7 @@ test_that(".calc_dist_params works as expected converting from mean and sd", { params <- .calc_dist_params( - prob_dist = "gamma", - prob_dist_params = NA, + prob_distribution = "gamma", + prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, sd = 2), sample_size = NA ) @@ -12,8 +12,8 @@ test_that(".calc_dist_params works as expected converting from mean and sd", { test_that(".calc_dist_params works as expected converting for different dist", { params <- .calc_dist_params( - prob_dist = "lnorm", - prob_dist_params = NA, + prob_distribution = "lnorm", + prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, sd = 2), sample_size = NA ) @@ -25,8 +25,8 @@ test_that(".calc_dist_params works as expected converting for different dist", { test_that(".calc_dist_params works as expected extracting from percentiles", { # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( - prob_dist = "gamma", - prob_dist_params = NA, + prob_distribution = "gamma", + prob_distribution_params = NA, summary_stats = create_summary_stats( quantiles = c("25" = 10, "75" = 20) ), @@ -38,8 +38,8 @@ test_that(".calc_dist_params works as expected extracting from percentiles", { # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( - prob_dist = "lnorm", - prob_dist_params = NA, + prob_distribution = "lnorm", + prob_distribution_params = NA, summary_stats = create_summary_stats( quantiles = c("25" = 10, "75" = 20) ), @@ -53,8 +53,8 @@ test_that(".calc_dist_params works as expected extracting from percentiles", { test_that(".calc_dist_params works as expected extracting from median & range", { # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( - prob_dist = "gamma", - prob_dist_params = NA, + prob_distribution = "gamma", + prob_distribution_params = NA, summary_stats = create_summary_stats( median = 10, lower_range = 5, @@ -70,8 +70,8 @@ test_that(".calc_dist_params works as expected extracting from median & range", test_that(".calc_dist_params fails as expected extracting without sample size", { expect_message( params <- .calc_dist_params( - prob_dist = "gamma", - prob_dist_params = NA, + prob_distribution = "gamma", + prob_distribution_params = NA, summary_stats = create_summary_stats( median = 10, lower_range = 5, @@ -88,8 +88,8 @@ test_that(".calc_dist_params fails as expected extracting without sample size", test_that(".calc_dist_params messages as expected without summary stats", { expect_message( params <- .calc_dist_params( - prob_dist = "gamma", - prob_dist_params = NA, + prob_distribution = "gamma", + prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, median = 5), sample_size = NA ), From 1e21f02bfc339ef660715afcc56e1ad89f0751d4 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 10:33:59 +0100 Subject: [PATCH 11/50] remove prob_distribution_params argument from .calc_dist_params and call convert_summary_stats_to_params internally --- R/calc_dist_params.R | 31 ++++++++++++++++++------------- man/dot-calc_dist_params.Rd | 9 +++------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/R/calc_dist_params.R b/R/calc_dist_params.R index 517cb0e00..9d43b85cd 100644 --- a/R/calc_dist_params.R +++ b/R/calc_dist_params.R @@ -30,7 +30,6 @@ #' @return A named `numeric` vector with parameters. #' @keywords internal .calc_dist_params <- function(prob_distribution, # nolint cyclocomp - prob_distribution_params, summary_stats, sample_size) { if (is.na(prob_distribution)) { @@ -60,21 +59,21 @@ unlist(summary_stats$range) ) - # extract dispersion - disp <- unname( - prob_distribution_params[names(prob_distribution_params) == "dispersion"] - ) - median_disp <- c(median = summary_stats$median, dispersion = disp) - # extract mean and sd mean_sd <- c(summary_stats$mean, summary_stats$sd) is_mean_sd <- checkmate::test_numeric( mean_sd, any.missing = FALSE, len = 2, finite = TRUE ) - is_median_disp <- checkmate::test_numeric( - median_disp, len = 2, finite = TRUE + + is_median_disp <- checkmate::test_number( + summary_stats$median, + finite = TRUE + ) && checkmate::test_number( + summary_stats$dispersion, + finite = TRUE ) + is_median_range <- checkmate::test_numeric( median_range, len = 3, finite = TRUE ) && checkmate::test_count(sample_size, positive = TRUE) @@ -104,10 +103,16 @@ args = args )) } else if (is_median_disp) { - med <- summary_stats$median - meanlog <- log(med / sqrt(1 + disp^2)) - sdlog <- sqrt(log(1 + disp^2)) - prob_distribution_params <- c(meanlog = meanlog, sdlog = sdlog) + args <- list( + x = prob_distribution, + median = summary_stats$median, + dispersion = summary_stats$dispersion + ) + prob_distribution_params <- do.call( + convert_summary_stats_to_params, + args = args + ) + prob_distribution_params <- unlist(prob_distribution_params) } else if (!anyNA(percentiles)) { # calculate the parameters from the percentiles # percentiles required to be [0, 1] so divide by 100 diff --git a/man/dot-calc_dist_params.Rd b/man/dot-calc_dist_params.Rd index bd7cf8783..a185160c1 100644 --- a/man/dot-calc_dist_params.Rd +++ b/man/dot-calc_dist_params.Rd @@ -5,17 +5,14 @@ \title{Calculate the parameters of a probability distribution from a list of summary statistics} \usage{ -.calc_dist_params(prob_dist, prob_dist_params, summary_stats, sample_size) +.calc_dist_params(prob_distribution, summary_stats, sample_size) } \arguments{ -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability +\item{prob_distribution}{A \code{character} string specifying the probability +distribution. This should match the \R naming convention of probability distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and geometric is \code{geom}).} -\item{prob_dist_params}{A named vector of probability distribution -parameters.} - \item{summary_stats}{A list of summary statistics, use \code{\link[=create_summary_stats]{create_summary_stats()}} to create list. This list can include summary statistics about the inferred distribution such as it's mean and From c57d284ac01c246035cd081105712082cbf3c3f7 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:20:56 +0100 Subject: [PATCH 12/50] remove truncation argument from new_epiparameter --- R/epiparameter.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 6a2f69e4a..6b3288616 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -31,7 +31,6 @@ new_epiparameter <- function(disease = character(), metadata = list(), method_assess = list(), discretise = logical(), - truncation = numeric(), notes = character(), ...) { # check ci has been given for each param and param and uncertainty names match @@ -82,7 +81,6 @@ new_epiparameter <- function(disease = character(), prob_distribution = prob_dist, prob_distribution_params = prob_dist_params, discretise = discretise, - truncation = truncation, ... ) } From b0d2313c26023bd5e6156f46262ed1bb78383ee2 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:21:42 +0100 Subject: [PATCH 13/50] remove discretise argument from new_epiparameter --- R/epiparameter.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 6b3288616..e3bde6f57 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -30,7 +30,6 @@ new_epiparameter <- function(disease = character(), citation = character(), metadata = list(), method_assess = list(), - discretise = logical(), notes = character(), ...) { # check ci has been given for each param and param and uncertainty names match @@ -80,7 +79,6 @@ new_epiparameter <- function(disease = character(), prob_dist <- create_prob_distribution( prob_distribution = prob_dist, prob_distribution_params = prob_dist_params, - discretise = discretise, ... ) } From c550bb74ce7da36dca07bc6c716c50f1ac7f6371 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:23:08 +0100 Subject: [PATCH 14/50] remove copying mean from summary_stats to prob_dist_params in new_epiparameter --- R/epiparameter.R | 7 ------- 1 file changed, 7 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index e3bde6f57..0f0868385 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -49,13 +49,6 @@ new_epiparameter <- function(disease = character(), no = prob_dist ) - # TODO: formalise if statement below or remove - # include mean in prob_dist_params - if (!is.null(summary_stats$mean) && !is.na(summary_stats$mean) && - prob_dist %in% c("nbinom", "geom", "pois", "norm")) { - prob_dist_params["mean"] <- summary_stats$mean - } - if (is_epiparameter_params(prob_dist, prob_dist_params)) { # standardise common distribution parameters prob_dist_params <- .clean_params( From 260d67bdd35f88f298de56280a83c7355b1684b1 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:24:53 +0100 Subject: [PATCH 15/50] remove .clean_string call in new_epiparameter as its now called in create_prob_distribution --- R/epiparameter.R | 7 ------- 1 file changed, 7 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 0f0868385..fe196689e 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -42,13 +42,6 @@ new_epiparameter <- function(disease = character(), identical(names(prob_dist_params), names(uncertainty)) ) - # set string to lowercase for downstream case sensitive matching of prob_dist - prob_dist <- ifelse( - test = is.character(prob_dist), - yes = .clean_string(prob_dist), - no = prob_dist - ) - if (is_epiparameter_params(prob_dist, prob_dist_params)) { # standardise common distribution parameters prob_dist_params <- .clean_params( From e0297f6fe35f65c4b64d0af46d4f5570a5f7e46e Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:26:02 +0100 Subject: [PATCH 16/50] remove stopifnot that checks uncertainty and parameters match as this can be done in epiparameter() before calling new_epiparameter --- R/epiparameter.R | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index fe196689e..c02f93cc7 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -32,16 +32,6 @@ new_epiparameter <- function(disease = character(), method_assess = list(), notes = character(), ...) { - # check ci has been given for each param and param and uncertainty names match - stopifnot( - "uncertainty must be provided for each parameter" = - anyNA(uncertainty) || - length(prob_dist_params) == length(uncertainty), - "parameters and uncertainty must be named and match" = - anyNA(uncertainty) || - identical(names(prob_dist_params), names(uncertainty)) - ) - if (is_epiparameter_params(prob_dist, prob_dist_params)) { # standardise common distribution parameters prob_dist_params <- .clean_params( From 4944f5eab6554ed2f07cb6f8aa3be8ec5cb05c80 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:27:49 +0100 Subject: [PATCH 17/50] replace prob_dist and prob_dist_params arguments in new_epiparameter with prob_distribution --- R/epiparameter.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index c02f93cc7..a549cf098 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -22,8 +22,7 @@ new_epiparameter <- function(disease = character(), pathogen = character(), epi_dist = character(), - prob_dist = list(), - prob_dist_params = numeric(), + prob_distribution = list(), uncertainty = list(), summary_stats = list(), auto_calc_params = logical(), From 7fd1988dcfd36e237a5ea29d98163564d8c4683a Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:37:52 +0100 Subject: [PATCH 18/50] simplified new_epiparameter with prob_distribution from create_prob_distribution --- R/epiparameter.R | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index a549cf098..1a615c603 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -31,31 +31,28 @@ new_epiparameter <- function(disease = character(), method_assess = list(), notes = character(), ...) { - if (is_epiparameter_params(prob_dist, prob_dist_params)) { - # standardise common distribution parameters - prob_dist_params <- .clean_params( - prob_distribution = prob_dist, - prob_distribution_params = prob_dist_params - ) - } else if (auto_calc_params) { + if (auto_calc_params && is.character(prob_distribution)) { # calculate parameters if not provided - prob_dist_params <- .calc_dist_params( - prob_dist = prob_dist, - prob_dist_params = prob_dist_params, + prob_distribution_params <- .calc_dist_params( + prob_distribution = prob_distribution, summary_stats = summary_stats, sample_size = metadata$sample_size ) - } - - if (anyNA(prob_dist_params)) { - message("Unparameterised object") - } else { - # create a S3 object holding the probability distribution - prob_dist <- create_prob_distribution( - prob_distribution = prob_dist, - prob_distribution_params = prob_dist_params, - ... - ) + if (!anyNA(prob_distribution_params)) { + prob_distribution <- create_prob_distribution( + prob_distribution = prob_distribution, + prob_distribution_params = prob_distribution_params, + ... + ) + message( + "Parameterising the probability distribution with the summary ", + "statistics.\n Probability distribution is assumed not to be ", + "discretised or truncated." + ) + } + if (!inherits(prob_distribution, c("distribution", "distcrete"))) { + message("Unparameterised object") + } } if (epi_dist == "offspring_distribution") { @@ -75,7 +72,7 @@ new_epiparameter <- function(disease = character(), disease = disease, pathogen = pathogen, epi_dist = epi_dist, - prob_dist = prob_dist, + prob_distribution = prob_distribution, uncertainty = uncertainty, summary_stats = summary_stats, citation = citation, From c7611d8eaf748ccd096ba7186f91cf882521357e Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:44:48 +0100 Subject: [PATCH 19/50] remove prob_distribution_params arg from epiparameter() and use create_prob_distribution as default for prob_distribution arg --- R/epiparameter.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 1a615c603..4c2696cc3 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -224,8 +224,9 @@ new_epiparameter <- function(disease = character(), epiparameter <- function(disease, pathogen = NA_character_, epi_dist, - prob_distribution = NA_character_, - prob_distribution_params = NA_real_, + prob_distribution = create_prob_distribution( + prob_distribution = NA_character_ + ), uncertainty = create_uncertainty(), summary_stats = create_summary_stats(), auto_calc_params = TRUE, From 0b96ae83a8cc6c3baf83ae1670012b556c4bb3e3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 14:48:20 +0100 Subject: [PATCH 20/50] replace assert_character with stopifnot to check for char or distribution object in epiparameter() --- R/epiparameter.R | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 4c2696cc3..caed91de2 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -241,11 +241,10 @@ epiparameter <- function(disease, checkmate::assert_string(disease) checkmate::assert_character(pathogen) checkmate::assert_string(epi_dist) - checkmate::assert_character( - prob_distribution, - min.chars = 1, - min.len = 1, - max.len = 2 + stopifnot( + "Probability distribution must be a distribution object or a character" = + !inherits(prob_distribution, c("distribution", "distcrete")) || + !is.character(prob_distribution) ) checkmate::assert_list(uncertainty, names = "unique") checkmate::assert_list( From cd6bb0e9b2341eacdb7dbf17e5c0b7310da0e0cb Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 15:17:59 +0100 Subject: [PATCH 21/50] move uncertainty checking after new_epiparameter call in epiparameter() and make checks stricter --- R/epiparameter.R | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index caed91de2..feb85f893 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -260,17 +260,6 @@ epiparameter <- function(disease, checkmate::assert_logical(discretise, len = 1) checkmate::assert_character(notes, null.ok = TRUE) - # check whether ci has been provided for each parameter - # check whether probability params are named or na - stopifnot( - "uncertainty must be provided for each parameter" = - anyNA(uncertainty, recursive = TRUE) || - length(prob_distribution_params) == length(uncertainty), - "probability distribution params must be a named vector or NA" = - anyNA(prob_distribution_params, recursive = TRUE) || - !is.null(names(prob_distribution_params)) - ) - # call epiparameter constructor epiparameter <- new_epiparameter( disease = disease, @@ -290,6 +279,24 @@ epiparameter <- function(disease, ... ) + # uncertainty is checked after new_epiparameter to use methods + param_names <- names(get_parameters(epiparameter)) + if (missing(uncertainty)) { + # create uncertainty for each parameter if not provided + uncertainty <- lapply( + param_names, + function(x) create_uncertainty() + ) + names(uncertainty) <- param_names + } else { + stopifnot( + "uncertainty must be provided for each parameter" = + length(param_names) == length(uncertainty), + "parameters and uncertainty must be named and match" = + identical(param_names, names(uncertainty)) + ) + } + # call epiparameter validator assert_epiparameter(epiparameter) From beafd36f1530e627569ff47d915e1fe05426b83a Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 15:19:03 +0100 Subject: [PATCH 22/50] remove prob_dist_params and rename prob_distribution argument from new_epiparameter call in epiparameter() --- R/epiparameter.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index feb85f893..ecd818a7a 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -265,8 +265,7 @@ epiparameter <- function(disease, disease = disease, pathogen = pathogen, epi_dist = epi_dist, - prob_dist = prob_distribution, - prob_dist_params = prob_distribution_params, + prob_distribution = prob_distribution, uncertainty = uncertainty, summary_stats = summary_stats, auto_calc_params = auto_calc_params, From fa854b378b4761a2867cd856249c2852afcb89f3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 15:22:10 +0100 Subject: [PATCH 23/50] update assert_epiparameter and test_epiparameter to use prob_distribution instead of prob_dist --- R/epiparameter.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index ecd818a7a..52ee46639 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -317,7 +317,7 @@ assert_epiparameter <- function(x) { } list_names <- c( - "disease", "pathogen", "epi_dist", "prob_dist", "uncertainty", + "disease", "pathogen", "epi_dist", "prob_distribution", "uncertainty", "summary_stats", "citation", "metadata", "method_assess", "notes" ) missing_list_names <- list_names[!list_names %in% attributes(x)$names] @@ -335,8 +335,8 @@ assert_epiparameter <- function(x) { checkmate::test_string(x$epi_dist), "epiparameter must contain a or or NA" = checkmate::test_multi_class( - x$prob_dist, classes = c("distribution", "distcrete") - ) || checkmate::test_string(x$prob_dist, na.ok = TRUE), + x$prob_distribution, classes = c("distribution", "distcrete") + ) || checkmate::test_string(x$prob_distribution, na.ok = TRUE), "epidisit must contain uncertainty, summary stats and metadata" = all( is.list(x$uncertainty), is.list(x$summary_stats), is.list(x$metadata) @@ -361,7 +361,7 @@ test_epiparameter <- function(x) { # nolint cyclocomp_linter if (!is_epiparameter(x)) return(FALSE) list_names <- c( - "disease", "pathogen", "epi_dist", "prob_dist", "uncertainty", + "disease", "pathogen", "epi_dist", "prob_distribution", "uncertainty", "summary_stats", "citation", "metadata", "method_assess", "notes" ) missing_list_names <- list_names[!list_names %in% attributes(x)$names] @@ -370,8 +370,8 @@ test_epiparameter <- function(x) { # nolint cyclocomp_linter valid_elements <- checkmate::test_string(x$disease) && checkmate::test_string(x$epi_dist) && (checkmate::test_multi_class( - x$prob_dist, classes = c("distribution", "distcrete") - ) || checkmate::test_string(x$prob_dist, na.ok = TRUE)) && + x$prob_distribution, classes = c("distribution", "distcrete") + ) || checkmate::test_string(x$prob_distribution, na.ok = TRUE)) && all( is.list(x$uncertainty), is.list(x$summary_stats), is.list(x$metadata) ) && From 9e3b9118ccafc9b88588958da115a615db2c9db3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 15:34:54 +0100 Subject: [PATCH 24/50] move prob_distribution and prob_distribution_params args documentation to create_prob_distribution --- R/create_prob_distribution.R | 7 ++++++- R/epiparameter.R | 7 +------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index 9af006dbf..be41b6bf5 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -22,7 +22,12 @@ #' for the discretisation is 1. `w` can be `[0,1]`. For more information please #' see [distcrete::distcrete()]. #' -#' @inheritParams epiparameter +#' @param prob_distribution A `character` string specifying the probability +#' distribution. This should match the \R naming convention of probability +#' distributions (e.g. lognormal is `lnorm`, negative binomial is `nbinom`, and +#' geometric is `geom`). +#' @param prob_distribution_params A named vector of probability distribution +#' parameters. #' @param discretise A boolean `logical` whether the distribution is #' discretised. #' Default is FALSE which assumes a continuous probability distribution diff --git a/R/epiparameter.R b/R/epiparameter.R index 52ee46639..e2a03d7e4 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -120,12 +120,7 @@ new_epiparameter <- function(disease = character(), #' disease, or `NA` if not known. #' @param epi_dist A `character` string with the name of the #' epidemiological distribution type. -#' @param prob_distribution A `character` string specifying the probability -#' distribution. This should match the \R naming convention of probability -#' distributions (e.g. lognormal is `lnorm`, negative binomial is `nbinom`, and -#' geometric is `geom`). -#' @param prob_distribution_params A named vector of probability distribution -#' parameters. + #' @param uncertainty A list of named vectors with the uncertainty around #' the probability distribution parameters. If uncertainty around the parameter #' estimates is unknown use [create_uncertainty()] (which is the From 765a5f949a2a40b3a7f55e0a548f7c3070fb1f4e Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 15:35:17 +0100 Subject: [PATCH 25/50] inherit arg documentation from create_prob_distribution in is_epiparameter_params --- R/epiparameter-utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/epiparameter-utils.R b/R/epiparameter-utils.R index 84c5bcc25..f53ccd5af 100644 --- a/R/epiparameter-utils.R +++ b/R/epiparameter-utils.R @@ -553,7 +553,7 @@ is_epiparameter_params <- function(prob_distribution, #' This means that the distribution specific parameter cleaning functions do #' not need to check and error for incorrect parameterisation. #' -#' @inheritParams new_epiparameter +#' @inheritParams create_prob_distribution #' #' @name .clean_params #' From a78fccaf3171098c953f58395a162998f83134e4 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 17:18:50 +0100 Subject: [PATCH 26/50] remove discretise argument from epiparameter() --- R/epiparameter.R | 6 ------ 1 file changed, 6 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index e2a03d7e4..8b61f351a 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -152,9 +152,6 @@ new_epiparameter <- function(disease = character(), #' @param method_assess A list of methodological aspects used when fitting #' the distribution, use [create_method_assess()] to create method #' assessment. -#' @param discretise A boolean `logical` whether the distribution is -#' discretised. -#' Default is FALSE which assumes a continuous probability distribution #' @param truncation A `numeric` specifying the truncation point if the inferred #' distribution was truncated, `NA` if not or unknown. #' @param notes A `character` string with any additional information about the @@ -228,7 +225,6 @@ epiparameter <- function(disease, citation = create_citation(), metadata = create_metadata(), method_assess = create_method_assess(), - discretise = FALSE, truncation = NA_real_, notes = NULL, ...) { @@ -252,7 +248,6 @@ epiparameter <- function(disease, checkmate::assert_list(metadata) checkmate::assert_list(method_assess) checkmate::assert_number(truncation, na.ok = TRUE) - checkmate::assert_logical(discretise, len = 1) checkmate::assert_character(notes, null.ok = TRUE) # call epiparameter constructor @@ -267,7 +262,6 @@ epiparameter <- function(disease, citation = citation, metadata = metadata, method_assess = method_assess, - discretise = discretise, truncation = truncation, notes = notes, ... From 7346fbc6fe9c3d2f2a66ffd8ee2184b59e2cf579 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 17:20:50 +0100 Subject: [PATCH 27/50] remove truncation argument from epiparameter() --- R/epiparameter.R | 5 ----- 1 file changed, 5 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 8b61f351a..f4d2d2f4b 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -152,8 +152,6 @@ new_epiparameter <- function(disease = character(), #' @param method_assess A list of methodological aspects used when fitting #' the distribution, use [create_method_assess()] to create method #' assessment. -#' @param truncation A `numeric` specifying the truncation point if the inferred -#' distribution was truncated, `NA` if not or unknown. #' @param notes A `character` string with any additional information about the #' data, inference method or disease. #' @param ... [dots] Extra arguments to be passed to internal functions. @@ -225,7 +223,6 @@ epiparameter <- function(disease, citation = create_citation(), metadata = create_metadata(), method_assess = create_method_assess(), - truncation = NA_real_, notes = NULL, ...) { # check input @@ -247,7 +244,6 @@ epiparameter <- function(disease, checkmate::assert_class(citation, classes = "bibentry") checkmate::assert_list(metadata) checkmate::assert_list(method_assess) - checkmate::assert_number(truncation, na.ok = TRUE) checkmate::assert_character(notes, null.ok = TRUE) # call epiparameter constructor @@ -262,7 +258,6 @@ epiparameter <- function(disease, citation = citation, metadata = metadata, method_assess = method_assess, - truncation = truncation, notes = notes, ... ) From 169ea95e44506803bbf2e7478c57a587bb804b58 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 17:22:29 +0100 Subject: [PATCH 28/50] move auto_calc_params to last named argument in epiparameter() and new_epiparameter() --- R/epiparameter.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index f4d2d2f4b..d5857c2c6 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -25,11 +25,11 @@ new_epiparameter <- function(disease = character(), prob_distribution = list(), uncertainty = list(), summary_stats = list(), - auto_calc_params = logical(), citation = character(), metadata = list(), method_assess = list(), notes = character(), + auto_calc_params = logical(), ...) { if (auto_calc_params && is.character(prob_distribution)) { # calculate parameters if not provided @@ -219,11 +219,11 @@ epiparameter <- function(disease, ), uncertainty = create_uncertainty(), summary_stats = create_summary_stats(), - auto_calc_params = TRUE, citation = create_citation(), metadata = create_metadata(), method_assess = create_method_assess(), notes = NULL, + auto_calc_params = TRUE, ...) { # check input checkmate::assert_string(disease) From 34e0cd45a7d4cc1a44dea6a3341ef8cb88f5d7ee Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Mon, 23 Sep 2024 17:23:24 +0100 Subject: [PATCH 29/50] add documentation for prob_distribution arg in epiparameter() --- R/epiparameter.R | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index d5857c2c6..33c57920c 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -120,7 +120,11 @@ new_epiparameter <- function(disease = character(), #' disease, or `NA` if not known. #' @param epi_dist A `character` string with the name of the #' epidemiological distribution type. - +#' @param prob_distribution An S3 class containing the probability +#' distribution or a character string if the parameters of the probability +#' distribution are unknown but the name of the distribution is known, or `NA` +#' if the distribution name and parameters are unknown. Use +#' [create_prob_distribution()] to create `prob_distribution`. #' @param uncertainty A list of named vectors with the uncertainty around #' the probability distribution parameters. If uncertainty around the parameter #' estimates is unknown use [create_uncertainty()] (which is the From fe2b7f4f3ff4295d75f85488f2aa972193edc948 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 13:28:09 +0100 Subject: [PATCH 30/50] update $prob_dist to $prob_distribution in functions that use --- R/accessors.R | 8 ++--- R/checkers.R | 2 +- R/coercion.R | 17 ++++++---- R/convert_params.R | 2 +- R/create_prob_distribution.R | 4 +-- R/epiparameter.R | 64 ++++++++++++++++++------------------ R/epiparameter_db.R | 13 +++++--- R/parameter_tbl.R | 4 +-- 8 files changed, 60 insertions(+), 54 deletions(-) diff --git a/R/accessors.R b/R/accessors.R index 70a719d6b..b90e38105 100644 --- a/R/accessors.R +++ b/R/accessors.R @@ -36,10 +36,10 @@ get_parameters <- function(x, ...) { get_parameters.epiparameter <- function(x, ...) { chkDots(...) # extract parameters depending on prob distribution class - if (inherits(x$prob_dist, "distcrete")) { - params <- unlist(x$prob_dist$parameters) - } else if (inherits(x$prob_dist, "distribution")) { - params <- unlist(distributional::parameters(x$prob_dist)) + if (inherits(x$prob_distribution, "distcrete")) { + params <- unlist(x$prob_distribution$parameters) + } else if (inherits(x$prob_distribution, "distribution")) { + params <- unlist(distributional::parameters(x$prob_distribution)) # if dist is truncated clean names if (is_truncated(x)) { diff --git a/R/checkers.R b/R/checkers.R index c527078e7..35139714b 100644 --- a/R/checkers.R +++ b/R/checkers.R @@ -43,7 +43,7 @@ is_parameterized <- is_parameterised is_parameterised.epiparameter <- function(x, ...) { chkDots(...) # probability distribution object - return(is.object(x$prob_dist)) + return(is.object(x$prob_distribution)) } #' @export diff --git a/R/coercion.R b/R/coercion.R index 75821967e..ca32120f2 100644 --- a/R/coercion.R +++ b/R/coercion.R @@ -62,7 +62,7 @@ as.data.frame.epiparameter <- function(x, ...) { disease = x$disease, pathogen = x$pathogen, epi_distribution = x$epi_dist, - prob_distribution = I(list(prob_dist = x$prob_dist)), + prob_distribution = I(list(prob_dist = x$prob_distribution)), uncertainty = I(list(uncertainty = x$uncertainty)), summary_stats = I(list(summary_stats = x$summary_stats)), citation = I(x$citation), @@ -220,15 +220,17 @@ is_epiparameter_df <- function(x) { disease = x$disease, pathogen = x$pathogen, epi_dist = x$epi_distribution, - prob_distribution = family(x$prob_distribution[[1]]), - prob_distribution_params = prob_distribution_params, + prob_distribution = create_prob_distribution( + prob_distribution = family(x$prob_distribution[[1]]), + prob_distribution_params = prob_distribution_params, + discretise = inherits(x$prob_distribution[[1]], "distcrete"), + truncation = truncation + ), uncertainty = uncertainty, summary_stats = x$summary_stats$summary_stats, citation = x$citation, metadata = x$metadata, method_assess = x$method_assess, - discretise = inherits(x$prob_distribution[[1]], "distcrete"), - truncation = truncation, notes = x$notes ) } @@ -422,8 +424,9 @@ is_epiparameter_df <- function(x) { disease = disease, pathogen = pathogen, epi_dist = epi_dist, - prob_distribution = prob_dist, - prob_distribution_params = prob_dist_params, + prob_distribution = create_prob_distribution( + prob_distribution = prob_dist, + prob_distribution_params = prob_dist_params), uncertainty = uncertainty, summary_stats = summary_stats, citation = citation, diff --git a/R/convert_params.R b/R/convert_params.R index a5fe41b20..f4a2beea0 100644 --- a/R/convert_params.R +++ b/R/convert_params.R @@ -230,7 +230,7 @@ convert_params_to_summary_stats.epiparameter <- function(x, ...) { if (!is_parameterised(x)) { if (length(dots) > 0) { # unparameterised with parameters supplied through `...` - return(convert_params_to_summary_stats(x$prob_dist, ...)) + return(convert_params_to_summary_stats(x$prob_distribution, ...)) } # unparameterised with no parameters supplied through `...` stop( diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index be41b6bf5..43564006f 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -29,8 +29,8 @@ #' @param prob_distribution_params A named vector of probability distribution #' parameters. #' @param discretise A boolean `logical` whether the distribution is -#' discretised. -#' Default is FALSE which assumes a continuous probability distribution +#' discretised. Default is `FALSE` which assumes a continuous probability +#' distribution. #' @param truncation A `numeric` specifying the truncation point if the inferred #' distribution was truncated, `NA` if not or unknown. #' @param ... [dots] Extra arguments to be passed to diff --git a/R/epiparameter.R b/R/epiparameter.R index 33c57920c..f83a38ecc 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -416,9 +416,9 @@ format.epiparameter <- function(x, ...) { ) ) - if (is.object(x$prob_dist) || is.character(x$prob_dist)) { + if (is.object(x$prob_distribution) || is.character(x$prob_distribution)) { dist_string <- ifelse( - test = inherits(x$prob_dist, "distcrete"), + test = inherits(x$prob_distribution, "distcrete"), yes = tr_("Distribution: discrete %s"), no = tr_("Distribution: %s") ) @@ -427,7 +427,7 @@ format.epiparameter <- function(x, ...) { writeLines(tr_("Parameters: ")) } - if (is.object(x$prob_dist)) { + if (is.object(x$prob_distribution)) { params <- get_parameters(x) # decide on parameter format from magnitude of number @@ -526,11 +526,11 @@ density.epiparameter <- function(x, at, ...) { if (isFALSE(is_parameterised(x))) { stop(" is unparameterised", call. = FALSE) } - unlist <- length(x$prob_dist) == 1 - if (inherits(x$prob_dist, "distcrete")) { - out <- x$prob_dist$d(at) + unlist <- length(x$prob_distribution) == 1 + if (inherits(x$prob_distribution, "distcrete")) { + out <- x$prob_distribution$d(at) } else { - out <- stats::density(x$prob_dist, at = at) + out <- stats::density(x$prob_distribution, at = at) } out <- if (unlist) unlist(out, recursive = FALSE) else out out @@ -547,12 +547,12 @@ cdf.epiparameter <- function(x, q, ..., log = FALSE) { if (isFALSE(is_parameterised(x))) { stop(" is unparameterised", call. = FALSE) } - unlist <- length(x$prob_dist) == 1 - if (inherits(x$prob_dist, "distcrete")) { + unlist <- length(x$prob_distribution) == 1 + if (inherits(x$prob_distribution, "distcrete")) { out <- x$prob_dist$p(q) if (log) out <- log(out) } else { - out <- distributional::cdf(x$prob_dist, q = q, ..., log = log) + out <- distributional::cdf(x$prob_distribution, q = q, ..., log = log) } out <- if (unlist) unlist(out, recursive = FALSE) else out out @@ -565,11 +565,11 @@ quantile.epiparameter <- function(x, p, ...) { if (isFALSE(is_parameterised(x))) { stop(" is unparameterised", call. = FALSE) } - unlist <- length(x$prob_dist) == 1 - if (inherits(x$prob_dist, "distcrete")) { - out <- x$prob_dist$q(p) + unlist <- length(x$prob_distribution) == 1 + if (inherits(x$prob_distribution, "distcrete")) { + out <- x$prob_distribution$q(p) } else { - out <- stats::quantile(x$prob_dist, p = p) + out <- stats::quantile(x$prob_distribution, p = p) } out <- if (unlist) unlist(out, recursive = FALSE) else out out @@ -588,13 +588,13 @@ generate.epiparameter <- function(x, times, ...) { } # check times is a single number for consistent behaviour checkmate::assert_number(times) - if (inherits(x$prob_dist, "distcrete")) { - unlist <- length(x$prob_dist) == 1 - out <- x$prob_dist$r(n = times) + if (inherits(x$prob_distribution, "distcrete")) { + unlist <- length(x$prob_distribution) == 1 + out <- x$prob_distribution$r(n = times) out <- if (unlist) unlist(out, recursive = FALSE) else out } else { - recursive <- length(x$prob_dist) == 1 - out <- distributional::generate(x$prob_dist, times = times) + recursive <- length(x$prob_distribution) == 1 + out <- distributional::generate(x$prob_distribution, times = times) out <- unlist(out, recursive = recursive) } out @@ -632,7 +632,7 @@ discretize <- discretise #' @export discretise.epiparameter <- function(x, ...) { # check if distribution is already discretised if so return early - if (inherits(x$prob_dist, "distcrete")) { + if (inherits(x$prob_distribution, "distcrete")) { message("Distribution in `epiparameter` is already discretised") return(x) } else { @@ -657,7 +657,7 @@ discretise.epiparameter <- function(x, ...) { # trunc dist family is truncated so get prob dist by unclassing dist and # extracting name - list_dist <- unclass(x$prob_dist) + list_dist <- unclass(x$prob_distribution) prob_dist <- gsub( pattern = "dist_", replacement = "", @@ -726,21 +726,21 @@ discretise.default <- function(x, ...) { #' ) #' family(ep) family.epiparameter <- function(object, ...) { - if (inherits(object$prob_dist, "distcrete")) { - prob_dist <- object$prob_dist$name - } else if (inherits(object$prob_dist, "distribution")) { + if (inherits(object$prob_distribution, "distcrete")) { + prob_dist <- object$prob_distribution$name + } else if (inherits(object$prob_distribution, "distribution")) { if (is_truncated(object)) { prob_dist <- gsub( pattern = "dist_", replacement = "", - x = class(unclass(unclass(object$prob_dist)[[1]])[[1]])[1], + x = class(unclass(unclass(object$prob_distribution)[[1]])[[1]])[1], fixed = TRUE ) } else { - prob_dist <- stats::family(object$prob_dist) + prob_dist <- stats::family(object$prob_distribution) } - } else if (is.character(object$prob_dist)) { - prob_dist <- object$prob_dist + } else if (is.character(object$prob_distribution)) { + prob_dist <- object$prob_distribution } else { return(NA) } @@ -796,18 +796,18 @@ is_truncated <- function(x) { ) # distcrete distributions cannot be truncated - if (inherits(x$prob_dist, "distcrete")) { + if (inherits(x$prob_distribution, "distcrete")) { return(FALSE) } # unparameterised objects cannot be truncated # dont use is_parameterised due to infinite recursion - if (is.na(x$prob_dist) || is.character(x$prob_dist)) { + if (is.na(x$prob_distribution) || is.character(x$prob_distribution)) { return(FALSE) } # use stats::family instead of epiparameter::family to check truncated - if (identical(stats::family(x$prob_dist), "truncated")) { + if (identical(stats::family(x$prob_distribution), "truncated")) { return(TRUE) } else { return(FALSE) @@ -850,7 +850,7 @@ is_continuous <- function(x) { is_epiparameter(x) ) family(x) %in% c("gamma", "lnorm", "weibull", "normal") && - !inherits(x$prob_dist, "distcrete") + !inherits(x$prob_distribution, "distcrete") } #' Mean method for `` class diff --git a/R/epiparameter_db.R b/R/epiparameter_db.R index c75b312a1..ed2e1146c 100644 --- a/R/epiparameter_db.R +++ b/R/epiparameter_db.R @@ -604,16 +604,18 @@ epidist_db <- function(disease = "all", disease = x$disease, pathogen = x$pathogen, epi_dist = x$epi_distribution, - prob_distribution = x$probability_distribution$prob_distribution, - prob_distribution_params = params, + prob_distribution = create_prob_distribution( + prob_distribution = x$probability_distribution$prob_distribution, + prob_distribution_params = params, + discretise = discretised, + truncation = truncation + ), uncertainty = uncertainty, summary_stats = ss, auto_calc_params = TRUE, citation = cit, metadata = meta, method_assess = method, - discretise = discretised, - truncation = truncation, notes = x$notes ) } @@ -717,7 +719,8 @@ epidist_db <- function(disease = "all", stopifnot(is_epiparameter(lst)) if (nse_subject == "prob_dist") { # special case to subset by dist as name is extracted first - if (is.object(lst$prob_dist) || is.character(lst$prob_dist)) { + if (is.object(lst$prob_distribution) || + is.character(lst$prob_distribution)) { prob_dist <- family(lst) # nolint prob_dist used in eval eval(expr = condition) } else { diff --git a/R/parameter_tbl.R b/R/parameter_tbl.R index 01e04c696..62012cc0c 100644 --- a/R/parameter_tbl.R +++ b/R/parameter_tbl.R @@ -58,10 +58,10 @@ parameter_tbl <- function(multi_epiparameter, ) prob_dist <- vapply( multi_epiparameter, function(x) { - switch(class(x$prob_dist)[1], + switch(class(x$prob_distribution)[1], distcrete = family(x), distribution = family(x), - character = x$prob_dist, + character = x$prob_distribution, logical = NA_character_ ) }, From fce47d8c945199d94ba82f93e6949eea268c43f3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 13:28:46 +0100 Subject: [PATCH 31/50] update $prob_dist to $prob_distribution in tests that use --- tests/testthat/test-coercion.R | 10 +++++----- tests/testthat/test-epiparameter.R | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/testthat/test-coercion.R b/tests/testthat/test-coercion.R index d2405cd7f..8f8014f6d 100644 --- a/tests/testthat/test-coercion.R +++ b/tests/testthat/test-coercion.R @@ -27,7 +27,7 @@ test_that("as_epiparameter works for ebola infectious period (issue #327 & #306) expect_s3_class(ebola_infectiousness_epiparameter, class = "epiparameter") # Lau 2017 has information to parameterise an exponential distribution expect_s3_class( - ebola_infectiousness_epiparameter$prob_dist, + ebola_infectiousness_epiparameter$prob_distribution, class = "distribution" ) # populate mean summary statistics @@ -52,7 +52,7 @@ test_that("as_epiparameter works for lassa incubation period (issue #306)", { expect_s3_class(lassa_incub_epiparameter, class = "epiparameter") # Akhmetzhanov 2019 has information to parameterise a gamma distribution expect_s3_class( - lassa_incub_epiparameter$prob_dist, + lassa_incub_epiparameter$prob_distribution, class = "distribution" ) # populate mean and sd summary statistics without uncertainty @@ -77,7 +77,7 @@ test_that("as_epiparameter works for ebola serial interval (issue #303)", { expect_s3_class(ebola_serial_epiparameter, class = "epiparameter") # Chan 2020 has information to parameterise a gamma distribution expect_s3_class( - ebola_serial_epiparameter$prob_dist, + ebola_serial_epiparameter$prob_distribution, class = "distribution" ) # populate mean and sd summary statistics without uncertainty @@ -103,7 +103,7 @@ test_that("as_epiparameter works for ebola SI assumed prob_dist (issue #310)", { expect_s3_class(ebola_serial_epiparameter, class = "epiparameter") # Faye 2015 parameterise an assumed gamma distribution expect_s3_class( - ebola_serial_epiparameter$prob_dist, + ebola_serial_epiparameter$prob_distribution, class = "distribution" ) # populate mean and sd summary statistics without uncertainty @@ -128,7 +128,7 @@ test_that("as_epiparameter works for lassa incubation overwritten prob_dist", { expect_s3_class(lassa_incub_epiparameter, class = "epiparameter") # Akhmetzhanov 2019 has information to parameterise a gamma distribution expect_s3_class( - lassa_incub_epiparameter$prob_dist, + lassa_incub_epiparameter$prob_distribution, class = "distribution" ) expect_identical(family(lassa_incub_epiparameter), "lnorm") diff --git a/tests/testthat/test-epiparameter.R b/tests/testthat/test-epiparameter.R index ac5d91aff..06cbc8d73 100644 --- a/tests/testthat/test-epiparameter.R +++ b/tests/testthat/test-epiparameter.R @@ -815,9 +815,9 @@ test_that("discretise works as expected on continuous gamma", { )) ep <- discretise(ep) - expect_s3_class(ep$prob_dist, "distcrete") - expect_identical(ep$prob_dist$parameters, list(shape = 1, scale = 1)) - expect_identical(ep$prob_dist$name, "gamma") + expect_s3_class(ep$prob_distribution, "distcrete") + expect_identical(ep$prob_distribution$parameters, list(shape = 1, scale = 1)) + expect_identical(ep$prob_distribution$name, "gamma") }) test_that("discretise works as expected on continuous lognormal", { @@ -830,9 +830,9 @@ test_that("discretise works as expected on continuous lognormal", { )) ep <- discretise(ep) - expect_s3_class(ep$prob_dist, "distcrete") - expect_identical(ep$prob_dist$parameters, list(meanlog = 1, sdlog = 1)) - expect_identical(ep$prob_dist$name, "lnorm") + expect_s3_class(ep$prob_distribution, "distcrete") + expect_identical(ep$prob_distribution$parameters, list(meanlog = 1, sdlog = 1)) + expect_identical(ep$prob_distribution$name, "lnorm") }) test_that("discretise works as expected on discretised dist", { @@ -849,9 +849,9 @@ test_that("discretise works as expected on discretised dist", { regexp = "Distribution in `epiparameter` is already discretised" ) - expect_s3_class(ep$prob_dist, "distcrete") - expect_identical(ep$prob_dist$parameters, list(shape = 1, scale = 1)) - expect_identical(ep$prob_dist$name, "gamma") + expect_s3_class(ep$prob_distribution, "distcrete") + expect_identical(ep$prob_distribution$parameters, list(shape = 1, scale = 1)) + expect_identical(ep$prob_distribution$name, "gamma") }) test_that("discretise works as expected on truncated dist", { @@ -874,9 +874,9 @@ test_that("discretise works as expected on truncated dist", { ep <- suppressWarnings(discretise(ep)) - expect_s3_class(ep$prob_dist, "distcrete") - expect_identical(ep$prob_dist$parameters, list(shape = 1, scale = 1)) - expect_identical(ep$prob_dist$name, "gamma") + expect_s3_class(ep$prob_distribution, "distcrete") + expect_identical(ep$prob_distribution$parameters, list(shape = 1, scale = 1)) + expect_identical(ep$prob_distribution$name, "gamma") }) test_that("discretise fails as expected on non-epiparameter object", { From df6183725b11edafb9c8d6102a00264f230530b2 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 17:01:08 +0100 Subject: [PATCH 32/50] reorganise logic in create_prob_distribution to handle NA parameters --- R/create_prob_distribution.R | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/R/create_prob_distribution.R b/R/create_prob_distribution.R index 43564006f..563e80652 100644 --- a/R/create_prob_distribution.R +++ b/R/create_prob_distribution.R @@ -91,27 +91,31 @@ create_prob_distribution <- function(prob_distribution, ) # when only the type of probability distribution is known return string - if (missing(prob_distribution_params)) return(prob_distribution) + if (missing(prob_distribution_params) || anyNA(prob_distribution_params)) { + return(prob_distribution) + } - checkmate::assert_numeric(prob_distribution_params, names = "unique") + # NA parameters will be caught by if above so only need to check numeric + stopifnot( + "`prob_distribution_params` must be a named vector of numerics or NA" = + checkmate::test_numeric(prob_distribution_params, names = "unique") + ) checkmate::assert_logical(discretise, len = 1) checkmate::assert_number(truncation, na.ok = TRUE) # set prob_distribution to lowercase for downstream case sensitive matching prob_distribution <- .clean_string(prob_distribution) - if (is_epiparameter_params(prob_distribution, prob_distribution_params)) { - # standardise common distribution parameters - prob_distribution_params <- .clean_params( - prob_distribution = prob_distribution, - prob_distribution_params = prob_distribution_params - ) - } else { - stop( - "Incorrect parameters provided for probability distribution.", - call. = FALSE - ) - } + stopifnot( + "Incorrect parameters provided for probability distribution." = + is_epiparameter_params(prob_distribution, prob_distribution_params) + ) + + # standardise common distribution parameters + prob_distribution_params <- .clean_params( + prob_distribution = prob_distribution, + prob_distribution_params = prob_distribution_params + ) dots <- list(...) if (discretise) { From e2d0190c4259faa09d6edaa74ddbc7c0e70e2ee6 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 17:01:29 +0100 Subject: [PATCH 33/50] add %||% --- R/utils.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/R/utils.R b/R/utils.R index d3dc5f656..616260503 100644 --- a/R/utils.R +++ b/R/utils.R @@ -68,3 +68,5 @@ calc_disc_dist_quantile <- function(prob, days, quantile) { cit <- paste0(cit, " (", x$year, ")") cit } + +`%||%` <- function(x, y) if (is.null(x)) y else x From 65ab59107f3af3161576f8b13287aa361c824278 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 17:02:20 +0100 Subject: [PATCH 34/50] improve handling of uncertainty in epiparameter() --- R/epiparameter.R | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index f83a38ecc..dfccbeaab 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -268,19 +268,22 @@ epiparameter <- function(disease, # uncertainty is checked after new_epiparameter to use methods param_names <- names(get_parameters(epiparameter)) - if (missing(uncertainty)) { - # create uncertainty for each parameter if not provided - uncertainty <- lapply( + param_names <- param_names %||% NA_character_ + if (missing(uncertainty) || + !identical(prob_distribution, epiparameter$prob_distribution)) { + # create uncertainty for each parameter if not provided or auto calculated + epiparameter$uncertainty <- lapply( param_names, function(x) create_uncertainty() ) - names(uncertainty) <- param_names + names(epiparameter$uncertainty) <- param_names } else { stopifnot( "uncertainty must be provided for each parameter" = - length(param_names) == length(uncertainty), + length(param_names) == length(epiparameter$uncertainty), "parameters and uncertainty must be named and match" = - identical(param_names, names(uncertainty)) + identical(param_names, names(epiparameter$uncertainty)) || + is.na(param_names) ) } From f8abaca8366f0b7c96c0e0bd90dcde59ed8ebfa3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 17:04:11 +0100 Subject: [PATCH 35/50] temp fix for handling precision parameter in .format_params --- R/epiparameter_db.R | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/R/epiparameter_db.R b/R/epiparameter_db.R index ed2e1146c..86a4555b9 100644 --- a/R/epiparameter_db.R +++ b/R/epiparameter_db.R @@ -559,6 +559,17 @@ epidist_db <- function(disease = "all", params <- params_uncertainty$params uncertainty <- params_uncertainty$uncertainty + # TODO: remove this and move precision from parameter to summary statistic + if ("precision" %in% names(params)) { + if (length(params) == 1) { + params <- NA_real_ + uncertainty <- list(uncertainty = create_uncertainty()) + } else { + params <- params[-which(names(params) == "precision")] + uncertainty <- uncertainty[-which(names(uncertainty) == "precision")] + } + } + # format summary statistics ss <- lapply(x$summary_statistics, unlist) names(ss$quantile_values) <- ss$quantile_names @@ -635,7 +646,7 @@ epidist_db <- function(disease = "all", return( list( params = NA_real_, - uncertainty = create_uncertainty() + uncertainty = list(uncertainty = create_uncertainty()) ) ) } From 52f92b5161a2e17840d1faa330047d4add1860ab Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Tue, 24 Sep 2024 17:04:33 +0100 Subject: [PATCH 36/50] update sysdata --- R/sysdata.rda | Bin 72686 -> 71503 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index 8699d812529714710897778e71cd01c471a0dfd4..52738a7a786a2baaf55e4e79b1e1ceb00a9cad49 100644 GIT binary patch literal 71503 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
bl)I*?itP5k2IIAt*sp%mfR4@_4LM*{gv(b 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 literal 72686 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%0ABvZufWb-e+m(K1 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 From 2fef178fea441495bff81b8828d447f56e04ed89 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:50:29 +0100 Subject: [PATCH 37/50] update .epireview_to_epiparameter to use user specified distribution in conversion and list uncertainty --- R/coercion.R | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/R/coercion.R b/R/coercion.R index ca32120f2..098f61a8a 100644 --- a/R/coercion.R +++ b/R/coercion.R @@ -270,7 +270,7 @@ is_epiparameter_df <- function(x) { sd_ <- NULL if (rlang::is_na(prob_dist)) { prob_dist_params <- NA_real_ - uncertainty <- create_uncertainty() + uncertainty <- list(uncertainty = create_uncertainty()) } else { prob_dist <- switch( prob_dist, @@ -311,6 +311,14 @@ is_epiparameter_df <- function(x) { ) prob_dist_params_names <- .clean_string(prob_dist_params_names) names(prob_dist_params) <- prob_dist_params_names + + # overwrite prob_dist with user specified if given to make use of conversion + if (!is.null(prob_dist_in)) { + prob_dist <- prob_dist_in + # remove user specified to not trigger overwriting prob_dist below + prob_dist_in <- NULL + } + if (all(c("mean", "sd") %in% names(prob_dist_params))) { sd_ <- prob_dist_params[["sd"]] prob_dist_params <- do.call( @@ -426,7 +434,8 @@ is_epiparameter_df <- function(x) { epi_dist = epi_dist, prob_distribution = create_prob_distribution( prob_distribution = prob_dist, - prob_distribution_params = prob_dist_params), + prob_distribution_params = prob_dist_params + ), uncertainty = uncertainty, summary_stats = summary_stats, citation = citation, From 2a159d9951a7039902025629b4156048e6c9f607 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:53:36 +0100 Subject: [PATCH 38/50] add .clean_uncertainty to handle multitude of cases where uncertainty is created for --- R/epiparameter-utils.R | 49 ++++++++++++++++++++++++++++++++++++ man/dot-clean_uncertainty.Rd | 27 ++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 man/dot-clean_uncertainty.Rd diff --git a/R/epiparameter-utils.R b/R/epiparameter-utils.R index f53ccd5af..e8d306266 100644 --- a/R/epiparameter-utils.R +++ b/R/epiparameter-utils.R @@ -737,3 +737,52 @@ is_epiparameter_params <- function(prob_distribution, checkmate::assert_character(x) gsub(pattern = "_|-", replacement = " ", x = trimws(tolower(x))) } + +#' Standardise distribution parameter uncertainty +#' +#' @param x An `` object. +#' @inheritParams epiparameter +#' @param uncertainty_missing A boolean `logical` as to whether `uncertainty` +#' is missing (see [missing()]) from the parent function. +#' +#' @return An uncertainty list for an `` object. +#' @keywords internal +.clean_uncertainty <- function(x, prob_distribution, uncertainty_missing) { + param_names <- names(get_parameters(x)) + param_names <- param_names %||% NA_character_ + if (uncertainty_missing || + !identical(prob_distribution, x$prob_distribution)) { + # create uncertainty for each parameter if not provided or auto calculated + x$uncertainty <- lapply( + param_names, + function(xx) list(uncertainty = create_uncertainty()) + ) + if (!anyNA(param_names)) names(x$uncertainty) <- param_names + } else { + ci_limits_ <- lapply(x$uncertainty, `[[`, 1) + # if uncertainty is unspecified then it only needs renaming + if (anyNA(ci_limits_, recursive = TRUE)) { + if (!anyNA(param_names)) names(x$uncertainty) <- param_names + } else { + # standardise parameter uncertainty in to match parameters + dist <- family(x) + params_ <- vector(mode = "list", length = length(x$uncertainty)) + names(params_) <- param_names + for (i in seq_along(ci_limits_)) { + params <- vapply(ci_limits_, `[[`, FUN.VALUE = numeric(1), i) + temp <- as.list(.clean_params( + prob_distribution = dist, + prob_distribution_params = params + )) + params_ <- Map(c, params_, temp) + } + ci_limits_ <- lapply(params_, function(x) sort(unname(x))) + for (i in seq_along(x$uncertainty)) { + x$uncertainty[[i]]$ci_limits <- ci_limits_[[i]] + } + names(x$uncertainty) <- param_names + } + } + # return uncertainty + x$uncertainty +} diff --git a/man/dot-clean_uncertainty.Rd b/man/dot-clean_uncertainty.Rd new file mode 100644 index 000000000..d3a540656 --- /dev/null +++ b/man/dot-clean_uncertainty.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/epiparameter-utils.R +\name{.clean_uncertainty} +\alias{.clean_uncertainty} +\title{Standardise distribution parameter uncertainty} +\usage{ +.clean_uncertainty(x, prob_distribution, uncertainty_missing) +} +\arguments{ +\item{x}{An \verb{} object.} + +\item{prob_distribution}{An S3 class containing the probability +distribution or a character string if the parameters of the probability +distribution are unknown but the name of the distribution is known, or \code{NA} +if the distribution name and parameters are unknown. Use +\code{\link[=create_prob_distribution]{create_prob_distribution()}} to create \code{prob_distribution}.} + +\item{uncertainty_missing}{A boolean \code{logical} as to whether \code{uncertainty} +is missing (see \code{\link[=missing]{missing()}}) from the parent function.} +} +\value{ +An uncertainty list for an \verb{} object. +} +\description{ +Standardise distribution parameter uncertainty +} +\keyword{internal} From f2e146e187a78d41f9bd8ff32847f4f9b50de8ac Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:54:22 +0100 Subject: [PATCH 39/50] fix $prob_distribution in methods --- R/epiparameter.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index dfccbeaab..0c84cdcb8 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -552,7 +552,7 @@ cdf.epiparameter <- function(x, q, ..., log = FALSE) { } unlist <- length(x$prob_distribution) == 1 if (inherits(x$prob_distribution, "distcrete")) { - out <- x$prob_dist$p(q) + out <- x$prob_distribution$p(q) if (log) out <- log(out) } else { out <- distributional::cdf(x$prob_distribution, q = q, ..., log = log) @@ -676,7 +676,7 @@ discretise.epiparameter <- function(x, ...) { ) # create a new discretised probability distribution - x$prob_dist <- create_prob_distribution( + x$prob_distribution <- create_prob_distribution( prob_distribution = prob_dist, prob_distribution_params = prob_dist_params, discretise = TRUE, From 9b1251641f7dc78b4cbde52c81a524183f03af84 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:55:24 +0100 Subject: [PATCH 40/50] simplify epiparameter() by calling .clean_uncertainty --- R/epiparameter.R | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 0c84cdcb8..7fca67868 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -267,25 +267,21 @@ epiparameter <- function(disease, ) # uncertainty is checked after new_epiparameter to use methods - param_names <- names(get_parameters(epiparameter)) - param_names <- param_names %||% NA_character_ - if (missing(uncertainty) || - !identical(prob_distribution, epiparameter$prob_distribution)) { - # create uncertainty for each parameter if not provided or auto calculated - epiparameter$uncertainty <- lapply( - param_names, - function(x) create_uncertainty() - ) - names(epiparameter$uncertainty) <- param_names - } else { - stopifnot( - "uncertainty must be provided for each parameter" = - length(param_names) == length(epiparameter$uncertainty), - "parameters and uncertainty must be named and match" = - identical(param_names, names(epiparameter$uncertainty)) || - is.na(param_names) - ) - } + epiparameter$uncertainty <- .clean_uncertainty( + epiparameter, + prob_distribution = prob_distribution, + uncertainty_missing = missing(uncertainty) + ) + + param_names <- names(get_parameters(epiparameter)) %||% NA_character_ + + stopifnot( + "uncertainty must be provided for each parameter" = + length(param_names) == length(epiparameter$uncertainty), + "parameters and uncertainty must be named and match" = + identical(param_names, names(epiparameter$uncertainty)) || + is.na(param_names) + ) # call epiparameter validator assert_epiparameter(epiparameter) From 2d634d226529cd5d5d9fa678bcd2cd03a03a37d3 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:55:32 +0100 Subject: [PATCH 41/50] update sysdata --- R/sysdata.rda | Bin 71503 -> 71259 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index 52738a7a786a2baaf55e4e79b1e1ceb00a9cad49..203610a8f9e413d50b6fe71efb31b08f80f41c1c 100644 GIT binary patch literal 71259 zcmag^WpEr#6MzYhSQaxgSizEaZa4PF zJ~2_9QQZ;UQ<+s+m6>8XR(x!t+BB-#NovNG(8k6e|F7)u_^<*1aLrRe0L2UXfL(RakBSlys=-9q<<3>B8)+ z4_sH=Ot)*h0KvGXU2wA?YtS!lljc4$r6T|U040JT6oh~(0s#1)djh9oD3?ohiqE&X zYXKr*y2KrgK!}Be9T7BVNsKJkRqFbpAOt9jP%?n2!ta7AC~CSiNJ`_3;&@qZjhf01 z?)9a*4(!5nSXYn>m&a!KS+atI4^kdB*6D0HWLT0~@f3^xnguIdG4}NFh-dXghes{U zR{7}|w~aM702T0pa#1LAcVRlcet%BvEI4@<4}0o9i~Oxc`PpKitBZ4f@c&J1X~pU82WNDcX*O_KX_{2 z^F-UxCw67H{AoT#rY~C^Kl0fueV(T_w3pzYR+}%N$?!5rb6e1CPKD6{C!g8LGAm$| zE1a*W1OZvPom?Pn$<=R%J=|!MX_F02zyGG63-0>q>3#~f!{_&;;Zi?EX;+ca1$HoD zsMDagwYPcHx5_$tLMD}l+|Q|be2akQ@z`A)sc2ioT4t(qxNz=DP4;lt<87ReuClY~ zaCF`hw6ESnUR#>0O5_n&wMSKek&*V_5aiJLDdb7A#=Ys92PH0|F4)*Hd91+sX$631 z06Uy~DP+O(675ARDFF7D1R&$H8vxxa55Z2r37DP5gvf*VG&!?=C=mb+4dmD8=;F`Y zgPeWH_^fFN$mpLB2LT`m2+#%xt)xP}90w^N+(zrWC zMYXH1B}sFfZ!)_%GA9D6cZy4>w7zPjWyd0aWGJY)rGi=iVA|xQD=Mn^v@DqjrhE{*b>5fg;yOc-);KWCcMgI5D zJ^*~SzR26a922jtVz;bqOi-5?}VGaj29hqD$1i986H>xKRCAQ00mIkXb?@HBqgibA zgftW)8ar}l#zl5IzkIqZ&9&*t!WDRA?HVHqVAQG5uEL2MUY#9VpxOZ&2Yxph3?i2ZUx082J_7Fd;vCy+rKvp$-KvFlX1TA${}8V|CDv}dbrXaU&kYa^ zdrL^p!Io=b;C`U5DEiqTU@Xsc+onb5#Pf&RdN<}S9|7piak7Ym>%vsXJ^rt$-@x2{ zgt(naqxqCv&f^SdRMorL;lVV7u{@09s@1E)y`b?;pKv2T*aeuX-DZ~3uFE0{bHcpV zxj`=XIW$H!+75SMo`PuGewg+a&vvc;{;r8sX1!`TJtj|w38uAbt@eLn9(WDr72NLn zo5z>y45>wdkzou!PW=T45Ml{h2pi_Vy1ILMJ@$7hH}sO?yCiob&C$wINyp+aYGr^u zkqv7gTHlpZE%fsFQcZ=qY>84lQDQF{iDr~aU6}fsOI7I3x*7~xIW%hwIt$^&CJvQy zx0EGT)N~om=dUVk_PV;;+#1^!L7*vQ+%S2=A0LvoG26DVNboydk|_7SgxSogER5b# zcsJ`^05#1-hiY4QUBpW|e=@fkJ7dCmQ{@yWe8h01Dt}9UKSD0CVy*#4Ne)c?BjjeF z$&7l}a^s%0N4hM*_q@Ca??c_>qLy~um+Wb>Q~sq|r6fH$U{_$()D-P~nxG50FYOL)h4{N| zjukC9@r3Hxqdd&BUKchio>E#jHf>YOM0WMldx$dvJBe00#iJs-9_3=dB{jUZj8jpO z;@{4D?o>0|e%<3?@KLE0sG>A%1itHbRkk*|g4^9b{$Ky@>Al`5l~7fcJ}@)yBcGJC z8jl_XUkKl2+R$R@1^&j_j8N%R^fj&#c3j-r4k>_p+eXB?2~u*R+R%cW#`bobc%t1k zk(Wc$GSQbL4mc=vjOv3`Q#zjnM~eu6m&{tE>9IO1RP zPBQ~He=m|SKeij6(GVh&e7!%j(JS@QSCrsE@rBwvV;If(;5|d}F4V|P+UTtLJF`re zp(pKsXU!7pdZih&K;0!>qBfU9LY>N`jNG<0LdJzi51U;eZ&DG*7g?1ttZ4a#ld2eC z6WticcwK1U=@LR>A3B`GUm!Bu1k5rnB7wRqC1Mk$oz8 zg?1B%+a?FcrBb~8*Xixn6iMs3d1KvgzOh0T!;C<~GUN7}>F0zhVg<1V1@%%u>rWLx<=53)HQqYoV>pHJc?Hc8c!*PDyob?k1cmjc>xIZB` zqkIX0ggwi0NK-3QBN)pZ_LBWTpDLXMzK7;hZlHZL(8krYcJF8F9t!VXjHz{zwz-8$ zArUXzmM_c+cdB(YiJ-&gRvZ5AY-}H~5I%Lyz?>_>%Tl((7LqTYxunl)W|r?5@HcUc z>|WNZhlk{!KvjQvfh^vZhd;z?#k;#xKD0%FlAD{^*~8k#0Zne_=Hq-$c_Q8>E5_%f zl8wcOg)>T))@GqcIi2eBcO#+~!;Q%r;U}w!i%PmDTMBE z>kWoKnqI=&Yx7HuBk+v%AD;b|YA;qhitlk7>KrwiJs#G_KbZZOnKk4&U%q-{LUy#6U} z+LkA4`Y_e<7Mn|E7W7jyq_V1d&gwQpkI1d#O)w>dfE$F$Zx!SFT4`P&J6O~NFQycx zJsU>98upz{*Q$eiYmF)2kjq73so5E2xvfJN&NpTd-;H;{H&@T^-&;_e37g4K)N(w& zk`zk~niCqs9lqd?vWOb(s`4>#(+hIKc!_1>`dJ2Q?SNzJ##jb)<0q_$tj^_(8L3 z<bDbz0EC<_@2kP?;7`Tct0oC($@4u!!FG!~YiPt}BhXu6nUj0$=ch#x#Lv zCxCZ8%Qu5K1Rm1>PkdUhVepl8S58+=57^lpfD+d5TT7yKKZOU>z_?*sV6SZtl)|aM z8N*P$y8G9sF_yj_02T11ZFVBfjdw4@r8E{{t-5^DJ&`|lBao)a{*L>PfRk)h3n$HF z!ZA=2Fc{SC26 zU?4sn7>K#iyy8+#%fGo|Lvq-J$Wmz5C@_BI@FVvaAa97WHXv2Ak#l%9jV4=*N(Syi&Xj!NnT-^>f zFKfKC&T}f$>A}@fZfz*Z<^P&vL7k$0x}(W8RdTF0A4YDb!R4iLjKVU2V^6W@BZv4>7Ub{Vjz({4ZE0f*ZMVw?@7CN0ErDDj_uDkJ^$&ki}K?c z3MwD$d=HdAh}G>^VguNNEgBBIw=$45M9u}gdpg_{KkZZSN;HP?ls!%h{cnZaraKkx z)%S+nt1QzO`A_%`B;ONScS_)37rM@%!fX$c$<{57y0J|C$)1=m%bX+TyBDI4Im=bo z#L!N&DjN%}jAIFB#ICA_nOk~)+4Mkarjvnu%$>H^klqYRwbg&4MsjhxwdbiLP*!v8 zI?@Lt(O<}gxw(?~5}jzBFRJQhpoOVZJg>3ePgOXxDOex{N?0vxfD+>L5&`5Zd;ruj?gx+r5-eW{nkj1A?(@G82cts zBthQPVW-ZJlsB8!f^;7;!B`u1EY`)4c3XK+4otJe+7U?uF0^KG{cSI2C*rrO)r#?=Y>U?wt zU%;6s>*h-XHU-lTVC(TS*1=W^ad59)5nrN26ao_yhFP%tKb`(Na`ggG{s`lYNp$|S zvypiYFFgDqpEAF-GGfspx!bXu_-$60K#(!fJ3hIfBdX>D*u8y=xh;T5h>)2SHF99* z^3hM||0|gHZ(r(q36P+|h4yV<{+~ibM0wf&lTokN97E95OCSvBz4HU~baeaCU1Qh) zeEZnC2rOK?y!Y|XB~5+1dG>vKnM$~@?3_7r+2e^GQ$%V*Mj#a%r6O%@EyJ4Q=Ya6-|NGs~=QA%3 zInpN&T=}x5E&u;QxN=ah5i1@NEEL55DMTtOD+hgSFkS2q^#3A5j2$=#5K!t}WyC>* z2?2Yw5mmE@_pF_|`?O9s^AN_L?$xcHdV2PN&L2AVrw{hq+Wfi=SyCtVub=)WFdH%? zkMFy*=~ZjK2JXEXUcI+~16shs@gItN!tqy%8Azf~YXCEJ)J$wMGF|v+`vS7&RUH|s zltc}5fKsBFx-u0yAdHGCm`SAhd$bkBstl%ZELmyJbwQ9{5de?=3$)rpBK}|YS$Krx zDMxzon}1k0338Q82I|{f3YOL4@+V}e6N%Yq39DaQo%q+?}Mbk`;AiY zD3ren8q|tlbzq}JVl{oJk71#mi-h1|2FvR2Yzq0UYYuDH+xs;^`XAgjaVz9D z!9yr-{Lv=rOufK^(Zd05tC!!?%~&S04%Q!yDxD^SpZ~Qs9Tgf?$~KGd+5B$D^Y@?a z(Of}yyiR8#KtLIQPo-EQv-B9LdyUew7r?Q-{pK0|=6N>-2(o52c12KC(JN@fu599@ z=8)uv-bj~88X?Mg75`4t7%t4JMB&m7Un(Sd7i+9+fXK;0Jw$Tdl3MIHpQUX19DAf# zFjx8Yah41fqLRrd5T}Ptn<=9Har~F91QEWi{Xt8A673>lxWBjNM!d@eYP2`!imJF6 zP|B%e#kZ>nCq|{y-EOa3&2UD^U{~OZf~1^=Y7UF)<(7PzxkV>$2@MOfpc=_A_7RT- zH+CqT8+QR4%Z^9S2VqnM5?ZIy7$6cf{2AsEfdW`Xl|kT8myz4(BvRFeo{#P+`V5=0 zq ze5atup8atNwJ4Q@Eefq{5Ilez?15)HrFxTg?-Q}=UQW-7)2#V&ILJz}PQG{b^Nb>* zc>8p0KEt}`*}8~LRHw0ig2`s7LQbdtLHYzl1u&BU0B}$YB{cle95Yc+B^G`u8Ykv5 zrz-r6Gi=s;Y%NCNU-{wCk?HWWCEn}zXur{$**(e7-<+ow3crj+%&WFG#?)0lC<9ej ziz}=HyiUn$x-s_LYzD{1T9~0$Y|^MoCv#r-2B26r-F!B#p|Q0btWvwmF^+t9xP+RT zq#ZMxvs|9KKk|+n!pjV_a|bZf4BBG28dxevZvwRwJiBlhZ~x7=61#qkv*I zAw%ReAwwbsfo8|v-rhb|Ah?n6ScTw`@V@qi!Xoi%lSxQMqL8o;kuYjC1VI2eEC7%I zG$we^{$r2ExQFKc@%u)t79o`ZD-{MvIJ$w_2}p-^w@w+qlhT zKa<;Tt-)d{Q?MrX_FW1Ik9UyDv|Oj-ow&X$uI4S8595Kn2QxhVjXK{|XJa!G?Eeb` zu-?l&bV|t^i-!W0rc9mZK(qXJRi$7Y+W3cl%$YG-5j7PI7xz|D@r$q5ZuUOf2nZ_@8VzgSivV?uAkB~SzBKTN)&j#jKJZJcu^xob*(7%+c>kTdU> zudY}A`X$V2Yh%5wLZgx6=3=HP5j#19=)jTdPm97orpx6o6E+kk`X-+k7MM8U)Y|9g z7btdqj^`crQ4KZ8@QDgKhnSRPZKwRgd#VWU7mH%ooh+sqH$v^wAUcKw3( z)ZSKeD3k*Lep=i_tw;3Wzk;h&foTh^tjH*@PBx5J2TtjEs~*y2;bRUCNHT=G>T9gW zG-wHtsKO{TXsBFZ*wlIBi@iq)1TyE2%U?e`3g{0R<V+)bU4_v9XOrQL16 zzA+~hN|q!HzkWQ7Sb*OH)8sw)sqr?akUv49+($-TDRoQY3+{m;2qFg{>02^>L6bCP zgQTF^9K&PpL&Ddt4_Ep+uutaS9k(EAi60z@su6U{vd3kEpQywXvdY0tXvKC`FiU1k z7TVctld+&c!;Cc?UP1v4C;>!8*~dWuL>hkLb&tr_6e$1`!B-mhJ_O(PHZ?fDW^5ZC z)6vl}VkIml#eY>f*xg;K&`wcFbXHbYMcSvL@~uxly_IwDzLz6ZUOaKSy+&2R`2T@? z)zw4HgE_Ky_4p39+uqISM)^bq1M`uT{VD0J-B;}b7w1NpMVR`VB^DOq_^-)m7B-iJ>8b!R9Bb_F5I?r5qSxFXIGXduFoe+b^{*5 zB5d~<7cC5~idk-d_fX8m7TMd2re`+cq*&hg3g5kMuC@GKBRKrIe9e^!)cTtE&p1EQ zA}Fe~v{KbJeYK>d$n3DBq{PzEW1?zac5xLLIk2!(yK2Wx@Zug&kp7u1A%O3Czm{%z zGWgFI?p}Fy8c{jxt(!xve)VRrbS6fR?5ZC3pS8*xblzq`5)G# zq@*O>LPCNc$1lvI?!0pKe*(GNzKi-k9tBh!*QN-CS)%VUB_BO7wcFtHZWCx|S$o#T zsCl}>BO@=c5+kXGA`l7Y?nqjy_?*{YjxxD<u>*Wry^Q4ep1NJI$8Fb+F!A`goRQg12mR4)st*%Vye3!C1iTJfRh>bgCgo((!OJB z*~;3nVL6pfzdrM5A~Qe2w3;<6vNHlkM5`cjMdH-2Vy%b7>P*P>-^GA!+uoMKpE;pG ze?>gY2C*8h)SPUp47}p~syzBc5~nK6=Lv<>|WZGp7d2IUU65F4_e% z5SZv^gn6Sf38qkZ2e7R6WG5oQXrT=Mnr_a%ENIz&V#)B?XaPhF;xR6=2un}%94n*a z`z<9cn77nZo-uM6<(C>ErxB1ggBnbU?<|H%QJwy5;+Rzx;WnU)LDBsg+_+Ac&zp$e z1)xDhx_3iXFcpp8e8Y*G;<8jNd(i3d?}QyMbh?YSwV55AkTyJfJcBiO$eJ~|bn`-n zg*h9?z<@aWkK^Oxlbi*M-$g|Y+O0hvEj%?&EB{#942riNIR1nE;(r$oj+vhwu_ypx zxC~`~JmVV7C%$JH_Wb`?PmVRfOU6mbs`R9&w>FkJw1J_i*Rq$)b!1_Y6E+4;P9DP) zr#FvkA{y(#w#ui-$;iV8QG9NA28(<9PRWY4GjldPfwo1G?xXgMrk3my)MG;NSUBH( zXy8Dynur1u)W$^lsJf8QVkeFdoA)37k=+*^M;+%cpO;e)25+1*;9Q|p+|$kBOs^x~DJfa%7#=D&h zva7e5(aA~qfD>XL$&(ahrGa9mWAU~-shf+z`rZa9!>4+cH0?qKdn&npA&jSrcP$li zoBn`Ep0khh_pga}pyiu--lfDRR@DulRVI{9yKIH!!fHpIiuI}`hOjWD3~|Ni9PyQ& zdLgUvQYuh9s(wlYnhL)gr$7xWXf{f!m%lg$#}wn&*m+Ele2mLql#`1_PZ^!wOVOw= z)Ej1y5NaWmcnKtMXaTEn|H4+Yh#w7pL!#T;TQEx9CrLR<2G6bRj2c%cxaFt}G<)H<@om{p|kaz+NMr+7!yhe`ZWc77YQ zxDg~6wAuxo*GSf!qy@l$AxuE6N=7}tt@r6(WpByD!g(plZ%g*%fPNaAsYQ5ZvoG9| zaIJ5XRl`)H#b_yfiRpkjS|w^-Vqz*?g=>_xJs1ix^giC~xU*mk%D+^@qk0et2`@^J zbyPMgF*__V&7wW)1*Wxb`X;pEjZSAuGFs&?0@s^r&7%e0M&OeO~bopO=| zD*OcrnV;eG!FGCF|Ky&civZH0QQ|U_oY!-p?Y*$!S->}#ZRc^7(MtF+kw0my*SQRT zd3VHJZt!E@T{hT?7#-GsP;JUGOxk0CVlHVnJKC*(Btv;XJ_yyITN|~thpckrFyt1E zGPTU+xnv{6HZfw+;Kr)n1(lk~RusFe;;K-X3@-J2*q^z~Ifa0c7SVg7<&%VI!4y^5 zdRIfdp)ov;b)<=L?qD{ga5ht2BEMe=qrnQ-9B(*jjjim5#(qbgo=!i43xRR7dT%q`4f z$#@PwywKQIwPj%EPhuq2g< zK1oN=tGqB}i3tb#e*02bf{Qpb-Yc278SJTRO@iOFCJPPn0};uFXNk5~r}!od%@$LnDdau2<`0*+z#Az|Na?vakZ=HVx#pRDji5N=6 z-CayJ2&t~lm{(h^&-}{15D#G;Gp|k^T~)nml|44en-nKg%xM%v!N|p|n3wra8egwtogFYSh)>f85w!X4BqG_h9-zZ(< ztUXD?hTn$7C*r)3k5N%wfSN`)JOq)Huvg`HIbzd44Cq=hgG%A|6H)BH^60LrQ)W)c ziaB(m%Cf!UUIJE6>h4FmNF65a22-Sl#KkQbFp`o~lz1yh#p2M&L|RDw^BHe(^l6xv zr|Fj%NMh)`ZRqLgX|UAf&X^Mt5|Af~$tem7$U%l?{~Ua2;r|2W{{0uScb*dknvq1S zpI-$e!D{_@J>_XkSRDkes3*M-5p{HID+Z^qv5bsVU*EdOpBDt@KNOthJ7R~dq@s{` z#QP{7xFqdscFnTuC-xpcP#Z4B`E1uz6sD%8x)fHoHi-#1EiNz5&kz3Nkjp4O?xQY_ z^1`zNI5|9&vrvHy^WT9Y6Rnpk2oECEQOR&1G=z@U$-@@QFS&b=5sQim^|wbXT4xM| zH%6X;#3ODnS7`h652Mu~WJ)ZaSpa;njKXQfO>WN6&gPb4ZeQMS@YW;RvZlA~4C+^# zrXLDFIQ4l`V-RGe#(?VO*l%}JYfGQ!=ue)eKArA~kBJ65J-Y=eWpL^wh~p|TF}8q` z{9DDOcLZgxXN4P+m{;9K?k7u>pL$)Qi$_xFa8s{sWpJ6&D6co98_mjgPrL0U*qNnU@k zLgclfJbzsCEdTm3nc2HStjS zA7RV%h=e!^_W#>(Jk!A+eV>UmZ4kdaE9_tq1uf`wS8{&Bh3}vKupwcgwinOqOBX*z zXk&V&s#i@_NMu$kP8idVWS2pGJ``Wn_a_0V3XeURuB_6ow|Q1cNAgpbOA+jT*@$@G zTU26{;~Rca&`V*wBm~T>S~ohZ^;z3{>Pbo^Tr}RluT0)=S#G~|^1Nwe310YaJ#-6P zJuB9=L1P&91iZaG9DTMxk24nA)QXXwp6mhq_dwjhi)iI5`}<3*YwM-o1t0cn--e{W zhSl4@HCy}-D(vo@By;5xwloC)vg3s;jeZWusBho2s!d{Id5L2ZqBCy@`1wWu;F3GE z;K=KSGahB*M0EzRn|((EAib4zYy#_06?NiA2(tKjs~r7v8ir*5gC&py(SI1k;@AS* zJ+5X+s80B)_&?}}hx6+0|)!tdbCnM6YRV6|0z8ukP%`Ocv% z0~;(dEJaN?6CFS0uf1<%DlLz6)&i5ARl{N?18f+DRo~41xh<|ji)k8{y?nc2g=CnL zgXZv*-~kEMb^yhBFJb91(}h%PGf@^E(k3>!T^KR!O*-d`s_^nYLVw0}BtS3*;f!>{un?<_m#CdT>lrZUe2 z1MyfP0>xQZ^OQuYzr?6!Pd7`Ln|Wv_M3OO0iD*U9QYLS;-g8@^f@3BG9IdusK3ra` zo%+JGziu5K9-jU}ajuKkUOPPlSE)5NS1^??eQ^m6@bK{p%&k`(6C81^OFaEtdHy43 zw;;2OaAt z-;Yiq*@YYr3#WyjKk92auIKgzg?YaopNa$#%}q|UTUGfmVHb#3wc1$`te$#&BmGp> z{@Gmx&}Afh|E6uX$!02MsX~3KLLt}toe%pnY=(zFWD1U5_{k6Qsu|`Oj*(NoE=$s2 zek3EKq@;ygRJyF2n_CI?ilqAjcjshI>5i++48z#R6=}$N!9+p*7ePmdMh}hoUVkrR z?w}w1477+o-Uad8ALeqQVJ@gHxVpO9pJ}(wtQUP2jM*%yt78Q?8nQh3y%`qWcG_WX z_l2S@tQTRVzj*-wObIi0g|#(e6IbZy*qYcBDbJwEur9uR%boZj))5*bd=;X8dAL};v@kOj;4U9$X{+~%wSCz0)d!Pk}sISxrPQ?Isfsu+#QoG z<0Ik0Vu35Z!yJ>27#|<+Ol0w+FTM*mz#9BVuWCbdHU^#Kdva{D({qfM%xHCLVp3{y zVyYzzFLmp4s8j9L%HA%El)jQk;ojVbkR9xCT>wtfQl2Y)pfHy0S#i z@-sq_dzhC^WObAa%GK@`5){-t4#){KJWOb_KE=TO%=a9d14sV{$jGi)!k?3oDtjF|IyZhS(&Xgi8X9Rz z&dTI$-@f5U+!p~@M^vO-BIUo zb-A2DB2=T8_+IkWHnwhJYNc+{??vqw=3fYSCx+A-E|ERwqWx-Q@ zB3njzWv_w)cW#Vkap4gIa&nw+jMtZ^rzZz{nBVN0b!n)pQYJd>%owTc?DYQcXg#jJ z&s=Gr(qMiGUz(Mhn3y-^#Qy`H{QBK_AY9F-xD9T)9V+xl+4YR_`nfpylub;QMx}JT{>U7OuBaJ(VBG{etL9tx@c$}*5bOJ<#zyeS@%IkgloT> z{N(yU7^0CiBAjt@a&1ea)m$OB>Wu5c@|UBuC|cYHzT>BdmvBPh%gxOV686ALhjoCw z&<9P!l(6S;MS5I?BI z*>IGSA!WDOV94pyqrF2Y@{yV9henzd*l=QnDE6QVZC($VK4Dz%sz0%FNb@u zw3L>X8tK`)n>D%fdI@tw^l*3!kf)-eqDCerg+QF7l>Mb?k@kn@1OnMR&dDbm&4C*8 z3ns>ia*I_Pyi13E%n5wPrbB^>SRWm=3q}h`2|9XU%g>)n0i@E&x|x}%m(HRyFgZC} z^2B^pdm-=~&TYO4An)87_0Lp_R-N(AE(Kx5L9Lulb?SGzvK>K^xTm-_w?~6c6Kp?K zWXvDr=WLiJ>;!C=1^avXolxr=KV1zD6@5K@eW#H{2_gzsd3vF`L4>@J?@fmtk&*$( z!$5n7RGGE5$F0v2v?s%c$L@|9*@xONx7N-lL#*>~2+V&#YqRmkER991I@9KF=7CoF zdR3wGMjaZGy_p5Ksi(VILC}DH2@U>0AxF*lJnORO5%kRC+~q2p+b&(mgLnc?tGTw# z?zb-8jj~bceof+yfiGfKb-+xKvsAkdvo<9>+X;h9-R+K#%I%;IHcFXbmx~n)74sGF z0r>LrNY83Ip}DH66q^hJzyJv~M7*ZBU3Ky*oR!_ZTGL)UsY?wC-S6ID`h3g&&K53I z&az#rX3ZXuTw%UTaekGHKMjv`@*u1e2}d~qU$Y-tLOLA-7xNbdMKhMOq@mYzOY z{I3KJGU-IL!PB$5dj3x8AY(jC@NM~$(Nfq>WYZ8d+UM%*SDE$t$me%a`oL#rCn~dv z+PB`|F~qTGv})0Bql}Is z`z=G0VQXMvXq=gw+X1!$d-qtLyuA}|g}86DsWak4W;%eZqGZjZ4%lMG$V}#z2pq!Q zcHkSmM1g|5Amwq zQMXhw&okXRcDPbPsd3CL{~M~ZG&MJUE6P+RcQK&&0jKMttBv`B+>2;nV&Yz@pQZPu zdbs_G-F7MeupqhblY!`wwst3HJh|}C!xW0PdwY_cG8PQF;A$u(dq^DuIwCc)n9@0# z)1Mt;=L{vUA-lGSY<_n%^1h8YbngJ%)cq$vN+)v=r8!+7arW6-uK#BoZ~Zf6uKgmu z_0GZljS$I=u5d_atVCn!)+A0cGIE?;;+?iMw=^%0#3ZT5lv#Z!t%2xWM zAh6EQwzDgnshhez#{J7TxJgeE0Vghtp_sdJ{By|y8P(77;nVYTt>U3r9FBx<8eexA zLNBPw!KWIZ$;+{7Zf5O9iuTeChJF$8kU)DxkIo18O|^TN@-Cmd!!7Sjj=iD$qk`Wu zRBw!8I2Nl)iUPMW)FwK#X^QB|S((t})(;@VomXKFbGuFZfOK$+!y94)6V>nU&sCgL z?KO)3i)=2xj^CBl81y*4J~Y4JcMwO{?hK5LZK85-zNWLAjYR^|m`2~4cvEj_hmj@Gz0A|Ln=P&>K6(nlqWv4t9@%rX#F2R0U6dYG2C+Uiwo-N z;9u0de)`ql3$DPv?;TGphMfzanat@9`xOK4bL6*s&nuY+DAEnT@i@C$sjg_2V<;5@ zi`u>B{Gz`J^x~0xP*^xio`i%AaZSiq)vTA7_hh7YBG&WWD8V_?Br#8LhRjAke@lCdoi~Z=uz#_p0c?it>pROk^M_&6J5EnKs(Ov9i}zs@5b5DgZTSVPG0o6R zHqIk;Ru8E8NprUKFj8KgqT^MwV=uK)7#UG>`P}oh=a00KtDrD^rjueTi>iW6xXnMP zWYms2=bxcg9N!pgE0wAj6ar8Wo_hZDJm#ivc#rYkMVqI{aF2_UWq1!ki}==jJ$q9{ z*F>sM!&d*UZ{OVInYNel(NQ7YJy8-{;Mn76dq{bM^it=!`3_mWWI12!{;VhOpFZ}L zOy78vr`D*E)ff;a%m#i7Xwj|QodSv}@HJTYf9h(*|Leko@SNVo10`@{zU)QxG(exw zBmo7oe8?8bajn5F*uSNrX2TCoaOrg@l+JiutEXp$e*&@Uw>J9#V&Vvq^9Yfv{YNC| z&Az62Z?9%5Nm02~8199ku9wikrOh=+zhfD>1sl8_?3a@~+q5#Dv@;L^uASXW9ui$~ zgL8$;3xOx6s9V2Np4Q`#W3-{I-!jbY1^V)fZwlP33|(wT+(MiRB4xFf(fw%UvSTMUn5U7Qj6&nIx_J=2@mJ#RML$}j>ih_=9H zgfd0nzF6DbU01tU`yzD&%%mGQgBai?VJUJQxSH6Db@bs_VpAQ`bdwYhaC>3apWJ&Xrha3#o6XG9;(3&C)sG`Y~< z0jpQvi`11Rw;I0oo0oV6+P(y;-qao}Gmq)gX7G%6-mE;_BG{1qh@pK%p)H8boyglalea7o|0r(U>9!%BrN>Ha5sNF8%ZbJHFA)gh|dpLlI)=VT_NVg^39c zPRh4WDD{9|e?BWd<{myZda6;bL6L$a#Hr<^sQ?;Q&F3!P1{8bQ}7N7A-wA4Rqsj z8wey}PsD)IruT(O9Zo(Dq}#aBm>LjOU7PRomsjB_7HCoWCO&`5o80Bvl6&6Ii@kl!L+S0CtsW9Jq^!Pu9eMV5 zoCWc@vWeQ4F!`HB>2!4TfSbvu?9ndH1bcRtj_+C}zIAYLS06NA1MP+O5-eGWM&90U zF75{WFZWxhnAGUJb#MEBP5x6A*C{u;*EsL%pt>UoU1xMOiGU>uW00Igpuv37M9p4AsAJX7 z&u~}p%>Fz0r&PdG_DIs{Wc8u@`r}7TOSf+eovNm%<6PL-os z%Id(@;UI#hLx&#<8Z>%kx3FA!&d!IAMQvIQ%mG4b!-05u5GM<<>g9Izfk9KD!W({v z3?4vc={Hyhj?{C~6mO=@_|)z|r}b>l7uc2rU%KwA8lk&YFzd(wVMSJ`5c%TsiA1iA z>69d`av!T6HTccP{Kw#ku|&Q#p;#J&oGpSuNQs$gor6-QnALL|*THwg4-PK`v$m38 z-ApnG2@^7C48MVw>r5i1do@I*n1EG|qvH$-^dqgP!*@EVV!3K5as{$#7; zdlddENasUCJCt?CnbF49UZ$R9RfXU5rKA z0Y^36{@5^&@5B$)cxsaQcBMRULdKs>F2hCWi0FpEI72u-Ns@uR3$?W)^VjqnROfYHuE!R)=o;C&3ymH$k4N;Yt^OSy`2O4O!U>@bztL?cGq?M{53GKbc6im|11 z;iXuMHaD7py>q6$JD&ROlmoN;IEX!moDW$HD-t4e5w-x`F0AZXdO4QL8 zK@Q7p#-AYxA11_=J3r@`}IB(=JFf&}UqayYB9-MG7|li=Q33o=TM%jE(wbZ@)gkaRbqwCpL{KLKxbkI3s?QEIiW=F{ zh+>e`Ez}@c1J6AHxGt?gfDW0Y3K7<+gGg)FtI*@ZMYQ3Yy`d4t?oBpiHkPY_uhdPb+hlEu)}CkHO+G zjS?;lTg^bXA<9bWkQxV33r66z=h!5=kRR^`64d-ZTFvxv#V#+pTw>ZGO%B z8f&rR*?3d-eHZ@TKL@(+KGqyhSwA7n2%yp9R#uT357g9!HZhHP-K>4jFIG?GRzuhC zkg9K*CxK`OWe4f&p-4P+hA0t$e-aL!x&5N4}pzFAM=mnvZ22o(bE98lCl6Wn}XQ95#c9}Zo$m7Yd3I$ z>Y<={XG|>ur9cfP^rP7`c2wWhyf}5G!hty-W%X!F7MG^yDF%}uiPR>D|JjUc0d4mrO@zbV zw($+B8}m%jv+Rv1BEEOT@q&%{H1wRFSQ%0CvZLGHdE#q+13InH+0;CYg88A(IkY$< z^JxzdW8AA$xefWvi^82Q%UdE=vV~FedLwg3lSWL(v*uMuaXGLb zS<`5}DjVlc+zxYOaAys|t%Q$u80_fa0!kgr3H3W)bdRz$TWwl~WFKGGqu^W1Un4#T zJ7T}UM~--K+US7j-t6ZIhmG4!8EA&V^^#}7559LAMGWzUI%5{SEP7$vF|q<1n;IY# zG-UbHlUo3?!o%$`vI6VNx{lh0g2J6JOLOZVp$x_W-Sd%XGNSFIf*M5)0q{CkW)&&G zy`<)0oD2lv5Vv|S>(0=}X=hR-X%1+bgQm{4w&^&!b*oY$y6qNC9q`^G8es;-Z)z1Y z;BCP26C@O5`j)Lod7DhAwsSryv6bCN_xw!$*PGUxI)27JMm@9)+#T~kgzv=e?*FrD z5CqTTJH||eA|uV)DVj+kCw69QyZT3e4*qspPWSL4p6K>_k)cc>_qTSHZ zy1PREN||_c-dmDq5bJS3bP1vM+LrFjXW^~%WQXFRvVQZYD7P}P!-U5w=WH>Q4x8`k zCUFkDbO%70@0|MCa~dp9{@LMiRPOaqrPe*_^7xK*#T}8+*zJA;{z^XZ%-I&8sBo-* zf73#bvB48m_X zFAHY+`JaZIgN6;C)IpFNe}1}5+8|jVLJ7%Q#G3#p?$3cCFMh^W_06>nWh`zos=yxU z*!?#!P}n!?($g>xl^f)l#995w5J5IyqW+@i2O!Sc>WgXIjA;-ng8|T}yO!hTC8t{;nwSU&C9}~^zLp5D_IgU53yVRQCHT?JVy*eLaV_QS+ z0nIc52vb`Axn-3+X@!M7NatUDZdFu6`xS(Jfyn|20WO79J%}mCqiV=|{x>SRuf|k5 zMndziXn~)!gP(N9s@|#HIBTuP1gF)5w@oT~1X&o+i2AHpJ~r9_6FNW|{%A;4Bj& z8korz9|YJ)Oz-LBV=o7lIeeS*-nRZf9K}^#tzI_$uGxyK{=e~kr`!6!Z^w@n_8)Kf z+ikM1vbBB3y7xQnvZ}AS{SVLk56I!`c)U-O^tttU^H=AeVEbcY@@6z3mR2MrL}<<_ z!p0HIS+xwT@yIu9=Q;HbNJO#E4u5hKLDg5_f6M6q2YvVBYOj@Q_m=rK{s#=thqZpc zS)WV!KKpI9Rrp(1-+pKLcl7)3LJ|Zmq_^d;CS?n0B$Czr|K@59Yr`de5;>S@5*;UaI=X?7F@g)9Mq&FtD_ut(BiL%$lMbz{n&8 z3<$PMGDfix%LAL{NVwA&MdgI*?css1Z+_5nUkw19VtFyBG3!B@__Minz)E9}^`7%pKMn zbG>qUO0CnY5jc6Z#QYR#k@P;XdT@VO_ImiwY0RM2x+8JuY&>C)0RW^}{!VM}@O0ka z)e){oDd5GncFxjq(bzfvlIB3>JtHu(8088hyT6J}G9EhU4#Foqh88DzOj8hg~EL6lUp6 z*5aG7$+RrteyLd4J+FV-rj8mb+69~?YfCTg`xL?XSwryk1~Ns-$r*p`(D$Pqqwm-FSB0336@bNx{0gI7)VUsReOTx23G@J+!Z;bg%8w$1TN7i zy~G|g)B$|*A0V(FlOP~pnQYY_JYMBP^gKduN5(sA9^|M}mMgB-YbwBw(x{946@fnd z#&Qr})$Co=HTQya)55AxfqnDZ_|ACVSDBaqL__XLp@w2I&@Rdv>HNO%Qmn+f#7iDo zbbv5Xo419uffI}ady>fW^nB(rMbXV2OM^qfnDSVaEu%1VO!&^6TKV%uo_ z-9Z3B&D1%d0l$(mM^Y^sg|NpcK{w~kB-5eO@IZJG9JE8tAMiD(FL^^3o|*1#?q{Ob zJ0w}&00p=Cez>=BKpS#xXeb{Hj zPtwa`8v+CX8&Gi15rs+SOn0f}3M3_Ey>K9SRKK3Q#(NK~w$Z6j&>6F)-u|gMh4A+J zCT_;@S`25w+u9`I2igYY&bN*A+Z!&`9-i(Vi&|6~X$M6(8!?WpkW32 z=V$j3+LDBC?{e4Hw{0FTcknrs7YD0qP2QXiH%h@wsjZnqrp~pZ#qU$fHXk6Rj?2Yx zGQr!6M)!{RcLN^P3Z)?Yj%x=f>7UjrFE^8ypfPQx*jUO5$jT3+l^RUAJ#Wx3;%fGY zd4rR%T*~muHasw;8;{GxeUrY@m2`KJgiY;0$Xpa@k`C zT|-h~j+#pvq}~_N_V4WQ#`>K*hc(PW;LsxibzRnQV6W@UsMdZgLPA&In;w@nR`7eZ z*vXZQYy=31Y!otr{{g{Cp9JR$I3y))*9zjq$rcOyx=g%9%*X_Ut#Nx`hfM0tZ!T7= zlVY=fzxnZ)XZSwY%xoyYIJ*Rd+9%)Ez8kZ8F`dQ@=>d4@QlKDt<9kU=Nz^p>U=LmQ z^MAeFlhpTXa5Dj|hlNR;#D^sg4aY6czJHDATj;@OzL-1>23MG-Kbj@?hvUK3%Um3klBsWkh@Qk+Wts)Ja;YeJ z;u%@ft=!3qlu4OoY1-AcW!wI-<2t!>_1z&1?~FgF&;v6HuqX1PgvyA#t9DT>uhvr_ zval#LICo!-OH~e1!S;*3+@i=slz3dwNc82uK2reTvcoraK!K+H?ryYK9dG>SZZqiq zj9SjRhf>j9CtV}^J~UUIf9bbu>p4{aM9KxtjiE5waOSSX1-3mZ?HEF*bTR0VWD2%u z_0dlq(9@<9u}6M2MVQ8K4&9Up(XhkDB-O)(iQt5U{yUahRn1(TgKNS4#yQSo7{@u) zZK}4_TWYPfR@$p=Rko_zRc)*Im8RdQ&i}jL)4%mJ^q)0+^X2qky6buy{k85MrULep zZbgZr5aQ~oSVI0RvROcyvxZ|z4l8bzCem0#-X$oXYN$f@25zj{C~3KydFu>oIC!0| zNuCA!xP)4->Xfiw#`tns<4pk$ZDWkt>x^r-lJ_7vgxPV^I=NDjMi0v`9qK+j_hn*{fe>_u>6$D+$4G?9%}L5B_#gHE z#xh6x#UJ0rk>t#HE3%(~jM^!_NJNU(cjc-!w}#kDYS=XmaJIgle8#hj3Ft}AC#;mh zx2a#*wc?+q@(kf0Uyt4>eUR5WQoZ-wrN>sC9ZN=P3lnwSFJVU%E+zqUDl5^FKDVl* zn)EH(#0pUJctcmClkj@owMwohT*lAuMP}sugv1oV1MX1PsYWApbmgIJWocMhT2@Rj z1RMcF1Vs9gP@=75lkWD;g{rsmal^UXx$itLLwzIUzQy$4IKE`%@-xkP>(l-XeK1+Q zz@SqG#{&$ylLtkQ5Y3Uf{F($Rog8RWuh>|-0k4tK?4Ia8#(c(j7Ao1~z6Bf67zluN zVConoF+z^VFf+Cbgku@JGmM=WrA-q)biS>BS%_(}Ii5qmCoVQ>8PZ7UwXJ1sTYqDH zbJ5h8&%y`q$0g(`0*58c=cUWlz8~iO`W(szdwy=ZCf&U6IZjW5 zBt1_4QR8%O-(_e_%vH9k+f{99<^%(lyHCT3wRrM3oUE)XrbnfcYH z-+q@oA5rqR>igw|o)3|LA)GEaW6o?h zXeusz$Kaq$6&3oC&8lwi%eYZd$8tT!p!A7Sci@InZ;XGJ_yt zAdq<#=cP5M!F|yAgK*-^X5kyvKnQ!2Ua>8}_vAX9OJ|mzXvbfbQNTu=%Ez5E4hoZi zU%P(Ew89#{5Mx0EyGx2?8|8C)=&t|M*o^tQ`t`Q%w&(vRVID)Z9iR05l=e#dIKn^~ z>SoO#5kMrs&>ov9jAx+A%#h*}V8hvCdgnAKq2EFTgsz39tX;Tm;kooqXOW6{rAeGa ze%bIOC2fM$gkofk>(y#a79xDpK_M$%7E)F>NyJ#W<;I{VtIZB@3a+f{9==_^ln>$B8(rl%1yC(0S46Ah7#vU19x*KuK} zKz9jR*A#MNBHUrw!ChrV*gEH&^B3qCXYAw^Y$qZ!f^$X;y~P2DzxL3H1M>}U3>Snl zkqne(fGx(bA9`al7Au#fCY2Q*Ibe|wk3G*`a)}iD6k{@H=$P4|_5182MxvGz%dL4c zc1YyZIb^g?88>$4ro&*w5scH|gCKh0|FoKvS+hu9>a70qo5))!jwcX$$74-kpi`Bh zm5;D+eJc#<;%E)49%ftVJt1{+uX11i=Z7{)yJOF5c6z7kS>o*hXq4DdCne#*Z!|b zoQKt@c^;(=xO;dA4*TVobg-db-sM2p?(!X+EF!@3KWm$yR#f{-fsB!vo0>thDlJ|X zu{mK)K76r^X5hyzkl+&wsMkc>dqBs8a%XA2WkO7uFX+e<^Qf45UU0U|d4o+P z#$p$}Aa53Sef(K;82VV6#biGs1OWnnO;tpqBA=A|FVTO#ZMyv5;gJ4@E__3}?)IJj z5=ccme+Tf?vE6@S(n*7Q`uQ`|<2hKW`meQ(Lo<=3jdw8f!}{m=`wy)B$iIiGPogpL zAKyc9%2i_FKdIt9_Hc|Csl)Sq`R^MF9o*Md^G5^xm>kdW5?j8Eh(I9!sPJ>|9G+_` z&o_Hm%e{5Sy3+dAo!5t;XQ?x;JWzMB$oTL^{-3-=b(rH&{M_vVfk$j=hNs=|CjqVdB^;g*YjuN zrYwrX5rNXU^8_&rOg%nh#j>_c)h&xob0oE(cp!E+%)>EY zt7VFzWU^ISt0KwD<&ip&532mF%PY*E!~2SIV|JSR4fmT(fmjP7z+u5GTF%>x#@B^~ zeb*T=i#T#^qY&j4U+sddMOzV8eub#N@(K4=RSF0+1RuBsU$+Hcx&>dk1zwuJJ%J=2 z;&tEvkJ$YP59xkixo>ms{~r}h)oX%o>fd?sbFvTAr$`TO&>y?~@9qB&&Hfhcu{tUv zqNAdRMFpt+_RdI22km{tkO7k*7EB>!lb}N~N84L2kGJ|$ox?ob&5$Gl8@jYC|2Nuv z+Rn%TS?1_TEXD)~1?jBdX3MqZJe6ljB$j#ReG6yve)HPSd1di_g;%4pulz+-QH}~6 z@=b4FzO{N|R%;WVz*Or}s}`bS;bGk!Q1jBRx7jrm-?z$tlB2=$nblTv{fGI zJCaa+6lDQ{LWAo%m^Y1(< z!GJ_XL;xTbm=O>J2o}=zrtzn-9p%{%yS~9zGA;=K0n@-`)+7-H9HI8gU*lp~eadQc zna&p5ebf8awvhnA#O>A4cD0Fdad1o7+*KJR9F}GfwJkAe&*F30yk>b<21Wz{2St!{ zRE|oKrI7w6%t##72-{7!^hO{H5~;`n4NO1+@m?H$r87M|mOrth>Fx4OH>PYN1WaIB zZn8Ngliqc5`Sj>Q09_1pFbDu$#>ZcMXA$*&Prv+M+4rBl_xWT9L8mjJAPzQ20RE@E z_m`UH$HK3f|HsSulWm!QgXn!#QpIQZo}c06nmB>Z|z3`RCf0KbAOhqs=f7h#jR_73sqHrGODV-R;sGLrBzjXimIyil~q;j zzyy5jY(fA>=KQcpEV9cl%Em2gTiMz>KE6DEXYgxyx-LeJw?|v=lh_h)N8m7aYMN-p^gW8!D?`TXvFFKzn$i1T9f`#sm3sPR94!=F(n{Sj|H z<3?VBtKQXZ60;y#FeYIy@moO!!XV{>C*fH@RQ>P6{x{-VXo6n^0A_Nz?A2F3t3&DN z@_Ve=0w6>S`|!J^BtQov5PC6kQtUJ5IL#iAl2_;a8I%G5UxoU=PsXd+3*dO(|M4wI zKz9szmO=Xx;DA1d)c*v?2oLXk55}1UfH}{99)rS@^(U#z<0F}!si{wGc=VxthyFr4 z`Tp`+f0bW73XxUaI+VJ)w+@n8uIV8``<+J&@)1j(rAvp4AN}N%Q>l^abvm_cKNj(l zLu(9@D>_|FvQ_f^GRfKH{hmJNuhX#A=hxs|hGh;-xs+-;eQfGit;?aW{p8q2`L-II zcdpdFZc%hJr^9{C>elva9C|;D{!#-6L5{}bc|KfzS10Yp<9RQ>>@G7Ei{t$;_EuCl@h6 z64L@?pT&b}^sMzTLnDgOo z``cgZ-EyED&Q2Sm-+JP2nl2aM3W5? zPC$~AkR1e^B{(#p6^KGP=tFhc6tfJekgdV89?mLMXt25d&wCtOj`)KVQzJHdVSx-71heYV9g?d9&nnncXsenq0ar zj>Y*Qz1q1NZ62FUpKU&M3%>Wd$SII_x=^Pp#E~KDXa# zG^#OFfe@&uapJ1St5xFV*LAr%FMh3t3n`}YrzNr2>^>ioxv&U`tYkz0fH49fK*mH9 zyRKnhlooAjQDX3=ACF^>mLHA7!!o2hYiick#^MM3FT={HIC1_RL}&iw>5p62@N0ge z7WP6GYyvXhpXPtx|K@Xj`~CGt;(r&^o%leK;K)Yy0MU{XWrhZ*y_yYdi^ z9)n7kN}fLEsYeE5>_ZlQG$Zn>+$EiEKgW_$n=w>|Eb35-t{=%P>hv|7l@#{p`P|z2 zy*7n&j5ITt&Zy$&pF%l*KWbPoZ^0(7&sSCL(5k(Aa| zRhv;ts;rxZr~Cf2oCj~aWx?O=_xg=*Q$w!Q*ZX{$hiDPuJOj>+75=~X#+Sedh_0Xl z7gG=*Mcl~S|F2i4`SP$~2?^@*s6KHYJsA_LaScq$)DYLbOg%!c)TyU1?k{AwppKk$ ze@QCH>X5)!oyw@|9039YPv+ECDxe?=uk)GFXq8j|3CO|h#6$r2rM3VY;lw169+8Ec ze%!i3ng7aSKME-%B#D>trNu0zfJ@&?ph%WVTks{+&+g1ew1|(ti0Xd4epUv*r=aOp zRaR-VT^ogU!keorS)#|+IQ6Q|A)%^}hboj!CSNF+q02gt*|c-?8OoH=t>T7e{ z?s{|_!}K}){(@`$T6A08ix!6WZ4y4ZoexDhD|Jd2S5@><&{myqKp+hVyZicqGRIZKqCbd5fl~RnlT3=?BPFk(4E4-e?iD=uSN-L^#Nn`BNX+8>Q zKq4Z+kq`t#8;nFi5f7*L?NzmliT}JDVySO&f=W7_j>>TyZMyNMQIfhuA*+fUK>`Cz z-|*A&^~)DDZ`1aBTCG#E<_p=l>Rfco65i2%r9@wRdX%qtaDA^)s~|wMx~*4ZvE=OQ z7p@|m<0PK@>;E%tKo9eNhvw@*dAHMlvsonYQBT6kK*Rx<_i+7w<-vR@Z~+p_@qaJ( z>yn4~UzzaYQQF#nj%3$w!kIz>evi@mHMiscTjP9s-JrK0!8hy1t_ib|8r)}Q-Hy#hUS0C5*)1{5I z%X6vLDwiis%2Bx7?b63{wc74f*lssS>+ZVf+P7~l4b7cZoeja(jluq{!Pf3K8-2o` zXVd4`_bAMMXJ@uMJeSY2D!NeGC)lj`QRc5Ie5H5cpt{UbIO7;_d!F zjgQ0T+3DM#=T3uq970P*F~u{1_v2VJ$2Y3+nXzS)m94Cgl zA~A>q7=cJA5n`weL1c)jJ01`CIOsed0-clq4znbHL$_D2LtW3H?s%@}uYX;CUmm;d z{eRoe?mhliQQhVFlFFXb)Aj$?WsKZK#RnG?xiS6`{Pb==%2+r#TGEScws|bByo;wt zp=nsn#CcG0&^wbJS~>RLEtxDAi!vNs|8yeLOXN#VkCVyeQA@8!t#P^Z);G70q7FD` zcVo*(;mqcGlEHZLq1MDefDZ;BKo!|3M;{E9pTl3C;YB^3&p%6}YFM-NQypHyo!S^f1NWg^S*2SjR3sYC;v4k`@hHZ|4-|F zo%F{iBcKqu7!m=$M%%YgA4-3>^}et7CuPz>vu4ObZ|&P=&;60YeEztJSED!oz1q(| zyPwa|`?;LWGfuXHu7^>hImZ<7Z-8#pBOOMaCmLhOwt5kx;&E%zuBYFs<0#=@#n2|c_y4>d?S8#x5zw^AjHlEg75Z&L zT`Tx{tx}3WufKnaHV^RXEYBjpO<$o;qQCn_QG-nyZor5D2%8KDfFl_9i^4~hD|nhT za(sv3vhvj>cNz@~s!s1U^Wvw<*G`5%mZwCUldyJnISK<1O=_yDt5tzwy6WwE#~wSz zmP!Ll$wx8`z z+V^o~W)PeDaSO?7?`D1f^?m=pszLzQM*<)LzeKQ8K!})_Zu(VGMU9-bb3Cf7-A=;y zo%=Z$tos&y{Jmd)#q6!hu3hivcyKK4ktpRr{}u!`S)A(nje=V^7bhnJO_zy z$|FVc%X^aHq1yL5`g-M>FXQ-}mYkMYHr!w4?g0uCA_M^dU{1eY8EysY^!1uRzN)&$ z#1O4X$Q7}5^*=i`cj-$|tPT(Ts7pR3BNvLuDlz|#J@A)<0~o-@00S5p%Bds>g2)hn ztcwUme-`iDtHsU#Rj<#F&xSFcpR$S;p=rll>{e<~tMLB)q^sQecYX>e*vx7Z65r)S zL^cajmKwbubIoS9^()s$_jWqu>bxEep3O)Yi=rMzxbeV%1gVID5Q#Dor|ws!-%9nQ zfKqKb)N8fv$oA{MG)g#>${XBgP>I&dnqwQCNy^Bg0Z`6R>ui*(7fLodGf@rJR3o$6 zq)M)s9c`IJu4m>>yS4J}C%LlOqFY(C%BSphYD$tw!t z%P4W2J4Ka<>FBF8X;-W9>wJ_^v6$*7Amv<&DkndRSaq|0Z#I%k&7xgu000Px046KD zHL5muG`fvykTF^`Jc-k(6?H-`wKb`DjIFllRIG5`qkCIehmc*V%_>qExeE!7A=Ghm zZ$dKhd*q#f0ySl7k-8Rn>b&x+WZFRI)I%`a^GbVNilnS1jXOBJTB%eJUec*VjD|lY z+EGE!&DJIPlO|cE5a*aeqdImZO07S|KOWw5;*~)F0H3PQ=hXPtdFuPhFCqk3uBMW) zMF^*2P8^+&R;#4Dy!nfU|{y)tp zd(ZA?rub=)@$l4llhl38eY=f@sbkbvVH5DmKUFA^)jE)xbV5R2>QchH`mfPf>AhNY z))u_vbu0V2j^`(`v;OS+kjMT!PwD#eIX@2XX>CsH>D6xTy1M>sJI&tqLF;7$yC+Ev zBFxl$ym^dht2~m0s9JH^Jvk8&42%I01*S)1v&_{cU6S6%=%S4o2?W%)Y0)(`HC&br z;A(W5jZULcU#MQVrCI8rRB_mCyISQJyu$VpmBUnpVS30%R^io4zOSvWxv1>>R)(Wj ztkESPb~Sy3$+@awrb--K^$ALQ2<#d$LMYctr8RnuR;shCs@YbMdSw}a0$Z!nj<5IU zN~;J00n)m^`&BE|X{J#G0TB-tr_b_HKtx1a44%C+I(?3*Hdl78`ehrnP92>WX;iLv zu1Yl(+BC%4?5i4e)zNnJ-LBT3vF=;1*6R@c**Er&cK>_c-)l| z`<V0>g)Aa-$VPY5)=KCnM$~oGt-K%8@zEh{QsQYHRI7l`oktAf z7Lg}6oX;quBWL+_H7dnPbWza%bLgz?S0TC5O$c(xp&1PRfhxRaYIABPertgY~sYC#Th)RX5S9PV{WV01pc27yZ?M^zb$o~k-ty*e9Q|I{_Z zI($FhQmI_+ph`VH|AJz%OtD~%}`1UmZy7j)=|M?8wIjD3UL#crP5Dq3H01mQT zoRxAidsXXuU6_qtp>Jh}3O&Nunu@2qs0J4Z3KbL@2g9e&|*(gW;p z_V*#3;a{N_h?#$v*i66xz>Gix0|OX{W@cnCB+b%e!Tbz%{4BgC@Gyju^;CYYC-N=$ zQ{#TGzxVUq=e*u@=c{WpnoTB&V6M>VUc=koabh{=9SrUbXjN`iWCQE`0iPfj=T$CB z<|}eYN1G9hODINjDauiKxxB7ot6Up~AuLqGqZ7&TVp6zTPUO1;j}<-B-kSyc9rfRo z$hko@g{W1ya*m^Q3O)9EE=q6roEjI{!2m&_fFK1TS`Q)BX?#Z&H`p|<R|rFBkcQkX@~ajF~5SC z|HB}LEx&pjN9=hyIhkK#iYTI(^%PNP#HEg(dWoIs;fCWCx883RUc2i;;k?FUvEH>` z@|(X`tx0xy1T)=a@>{hZUmq9vRBOb?@i?Ae$IGD5)>dt6e*eG4;@~%VbKX>1_Y{Ao z)2-I`YwMTVuw)2;_ISA){qliffFK0@maQ~GtnqPcBRt9|rFc8)J^zuj(fI#c|F0kW zS^A$J&POa9}Ijs+S6HsY{j1{X_N6pX^U1_3)m68?_r6 z`cR8@?|7G(2dgrF-`4Ya{l4{9z_>UUbw?5)++aaxaW=jMpSqP;u7^5Ui6h8HIl4-y zqKYX%qKYjPX*k@R;)v|uy=X-KXV8}aMIXxCrUw~uMyzRR>~#8NS?_8sxD^?*(;=AB zX}6kx%~p4P?*CGzEuJY1_gma%@kqF+rTujp-nRF<)$7%%sHnqy@R)7}`_t+Bo3X!b z*#`9Sx2d~XXK6EPJnU%dYPU+Ib(5}?b+;X~vD^Qf?$VXt#`O-~U2u*N)$qSRhq?#sS+RqH zbop_=1&f>9c!_=n3MIc_lmaL#^;)=9R8d7$a8*@RQ%ItUD5T1YD597J6j4Pz>N149 zq2un>y=yg}uCwd?U_TBuCa+(w_4qA52|RYggN@?;9u6zaZq7Lt2n~W7ap^yLorcM0 z4q2HoJARm&)X-wY~McM=5x-on(Ez7Gp?RIUIDo z`Ha{?^Lmuz+E&10l+)FZ!l)pYSRys{x#Q6xmb4c>7lmFo(~G(s$bwd$wym*#Y-P= z7qP}t&1PBhP3Mcp;{7=4t%z|PB*c48ud99Y;3*Nl;{PeGXwZ2Q)5><74_}-ADAVlr zZIkzO@_*N-k^d}V|Gv$ahw0tXXS-Y`94+4Oc|M@qf7|LoeIfu5F$N0(gBU1?FUEUc zq2uj*=ce<1J|Bm_lkGHr^IW`eh-qxU)LWET`BAOfzhM?O3+dYz!y(4|fT&LKc)Fq1 z(X~PmeL@jH0Wra)0xfu_5jWKGjQeCF1O(ZL06{^vTESX` ze@XtK64`HFyC!{}-)gli8toE|&fjpC7XU%4Lx9yr8=c1Ig)*w=X2+lDL^2>ucjc{e)WUzdHp-!02~KIAiT-=P=1q7m=$Zd2{xZc#11;@9e{JiG9Rdj)g@v zyu?^vhJg={+0;QnL~_#0L5t96IahvGeRa=|q0lCjY_?bKUWHo|!DY~K`5t}e7>AdY z6#rCFMWecxym8+C7+;U(qb4k1mtocUcXE0B{%^mV_Ga_hY_40u;B0OEJQ<&gicCca z94C2LA&NTORy!V?hCir^fJ8<4m=O>J7&FV9K`NF;JYUlx)Jm*8y?(!g%a1{D0d_jwcr{gTX$R*~z%T%G(5&B83XI{@bI&0TT*MuRQrDjT z{OcRm5emERhM84+IQs6*ZCcLOOSFsLN8=iv+zb=U6>6{IwCX{15b&tzAy_P$5d%_# zE|*OZoeegPF|IHVuhoZ87TFr8b5eMz|vAITmd?piQpt!qyJiq`7J(wsA0AuaJMG;Z__=yq; z=cytQ8dyR}+4db*1NZi4+suv&h6zwa&5mwZSCOnZUOnVF9201AIEf66O&C$-+@Vo1K%sO( zi#Vv8`N&Yf#OGfvxQB$jr9hB@6-u$Z9xXhOu3A%eg# zQ(wz=)r+d`TUr;hfr>I>VE88!SZ%tc!rCy*Swk(aTIA$sL$FET^vWo9P(&1q09Ady z)MV*27H*stEK41S6UhIpi@cz?z}*3Mys~}H|5sZ! zb$e`*$HP0gDQM~Kx1qO2TlZdDUAZjLJ&IFUjW9X}OdTu`D7n-QL@hh z*H_YdKz5Mcxg-7nN5@&}!F_deV^7AkaYUU4-;5CKvB}BL$OVHwMS~61ylr9bS5(D7 z#^UY%GW!Y#wOJBO>>*SM?P3%nstZe_UgST4H*cmL?^x;x$V5!{ggikV#E`(uBW6kQ zz93GFU@ELwD6wN1(t0$rcHP$=tYYyy?79^V2lfmeW?Hu;HY%$Gr6^K~N+hK)z%bZ7 z!G;OfH+b50Nj-TH@YSJhsbd(A8$z#17oa24V09SbVE6PkLlX3i=upyW167wd}{0lqDxCrCKl@T;< znqj?;nIF5LFalqKr{d z3PKu!kX1kwC5a70vXrztX$M|kK`yZB*Gnxj5fpq%GLoM;H46c+4opn_2ds*+@| z*pYYwUe%Ejo>@*vK(|aZh^Qf`DA*;U4O%8qWuqXlp^Z~8sx2F0!mx89Rd5#8iEbj= zRaMJUiIP;7%)(}4Rt^qC0~L!UgA)p310bTPDz=EDTCHfpf~bh5TLD#6iV;N^u|$xH z1|^K6P!uwTV&e>9Wh};|EOCo5AfYP-D#jp-7@|c)VTl5OuvK5m+?GHQ0s}k=La>r( z-Io<9B7u!Xi4rO#yOaYRLKX&@v1upeBnhTKhTE48C~vehm`V<|G8KlkZ6!pC#HgTJ zj?I{pR^>F65OO9?&RzufAfF8mH{BHfe7D{gqw>g;A88eN5qoNY1DFi_rqU|$@$nvI zdImcl#5`u3*%1_o#RX2TT4k`V3V;I(H&p-!rh1hU!flt=N-EI0rq(4=)kD0X@dAhU z0UQi4Ga{`o*KM%M035wAM1drd5=11RqPr1b3$7qN43Z*9#1V6?P)628ydtrBPQ6930GS~0}!a2TSShjAdw^x zqd}s`$jfYk41^Sd!az`13bGMo#Um6di%BA^3bPowfeqM-bqfj#4s9p`<~vG&17^Lf z2AVW;M3QdRuIC?{LPUGsCo=n99GNPu0>I)0Lh4wL8T-LP^M%$0E2QW>cx+0>rT?Lvxv$4l0~XRM*<)eIiniTaQfZ}a%x#$kHHf?CK6rPi*#d%xpA z0>aXz7{gYo<~7e7F)@lqvszP0E2Jz-EUaNsOD!0l5@7}-4RNr|sX;_mHJ5S&7!M)O z%soOAIs825R&Z+8B-w7dRXohLn-t!{n^G%sU`aW~PLAkCQk8Y=TUw!v7+kl=fF5YZ z8M79p(udt-Xb?~$DD(F_vvFZ8v%iLBVC@WD2(?>6=Rv%>S19s~Y$OFN2^bzy%qU=h z;Z?nZK%)a4ZPW=--jo{7Oreu--J>nsmspLO>u&{HnkO1^DbVh@Ok@U|v<*%mpquk* zUJVV_+Ej}gP7OP5ShBTcjAer}ai8^cFO2Yu7dD6ImpvXdg9jg!PG%aajRH62Ez6c> zMY3)Ww-?BQd0@!M(-Mj2I+H5pwbI+xo$jY-*FAMb`P~`pNTLor!*1HXR{*h3OcMi# z7;qk$7&Acm^3-(B1%onzhtP~EG&dTW;+GkoeJuS^rSizZmuwc1z=F@PI zmbVdd!7vVW3?1=;#>1p)WE+hQ&5r@S9BsvYCmX`=n>H|TYUgFhb+)8~>qLl2J=-J^ z5=Y69A}EUhB!!@mOBM)7RfJm$WR+4ySXD(>g;+@?sFGTQO0txyu`Ps&BqQs=MMVwR zBB$>_6l5T5eWoPV2~pekx>i?tv50zjDsqnK= z833dS%VI$-b1Y)QEdZiGUB5^bV5*kM6#-MxAfZSqfWB)KPx3)TAA%?!1Ox#0ATtUW zK>$7^!eR3MjeYE&H!YuA^XQ_0qq`6hALK<55|C3=R8~Clz(Qt(jM)*2k`D^R7F3Z| zB$BBTsz_T1Dy3KzqN31HY77hkMTd~ z^|K@(DZ{dCsH{gix#5P-UgL3Y7%{i9{AwMTJN{J(CQutZfzwvZNBwt&A;fjiSQa zM66P=jkHxIVOFuWTNN1;s;wA{ElN_VHA^aK02UpFKnz$-l@=@sEtOWx$}plWu~3y% zqDw47lF6FIl0g{6lC_A*1ZE&Wqa=hSWKjymRzd#k0Qe#ZC6N?cBB~NUACClsIB{f< zi};jb8d#9U1Fleqtya}7w6@aKv+P8YdFdp(;%&<5?wY>Gs!Xtjz#H8292bXK5jik&DXXZCPs7l!C&-M6wo1YE>2sA}|=mh{XY9QV%$x2&gl@eP7sYoEH zQd??Bszfb7TUBU># zC6?5ZODR=sAX1<$gb=k#hzVB3L@8`qmPC?UZIuCSidkyH3v8(p1+YP6K>!%QgcVpZ zBuGJ3WP>3Y2oV_&RzO5a1ywAvtOCka0b(q+NmeSP3uRCi$zsHXRFWdaT2-=wMXIu_ zi7LxWVha^&$`;BgC9+#0BvQx}q9wMir6NgfvQc6rDpIOIwk?t*O14s42`bf#NhMh% zlEsTHqzbmwp(5L9NGhpf0@);zmJ(YnrA4wLQbkHA1&aw{rIiSlm2HwFEvl6&3rQuE zg|P~N90Dz zO{jj%cTz|qR+LE^MHE^^NJT&dgcv~uq!daK6=4-(!U9yX7FiM)q)QbdTL9D5yF2WV zZpQrL!2)74gA%QY4s?jA#703^JU|;0awg@}cOqOb zfgkuF0#*p6V2UU^utY|Y5+qfA;s`0y+}o-Nxl;;+f~z8ghZP3Ou_4zQ+|)qpgbQq< zpd85z^1K*t@7cezv$M0i$H~YLpNV1)?Gw91Bt;fd3Z#IjhFFz?A*NCSgU!v&xsKI? zud{`@mX=C0V8w}LTPb8!6pJJ}@gYzJiXs3i#RZKjx~Yj}>B1PXJ5*X7Hcj$|ket;M z$7CDqBeJAU%Mryy?4;wVJ1Hk6h~%K`vK)Zxr})bw7D*OM2?)(Psw9usR0$!aBoXxL z3|NR^NFIMbpE}BgQYT}*Tr(w%(+fx)mM5g{;Azu|`I1VR**E6=Fv5+{-rk{(8?ZMe zz>ns@KiZ0dA+*6o7z9+2R8F4N6h#t50AxwBz=$9EEP~jANoX|T$%b*%y@Fh56hDE}OaAX!mp7RG@M#w$W9YKdiN zBXp;34bVAaZpU^jiU4xO<%donV-Nt@5r1foV33hNpC@ORqx!b0UFA}W06tVzOlc55 zN+^K#do&eI?fPj5QdX3t{1H`&yAX3s#g`}xtRjj8fC#_q zMMe9V3HVV?FAmGg6@vvGb(Gv|Kn=JRi>e|yq9)CkY`e9&xwB?Wim8MI(E&w%)+(hU zgZmHyfdLpq@b&ure!ZZoZbd~TR8Fvv^QaYqf`Y|RMPkKKPco@eNo^v)S#64}uv*B7D{Vkh+fhj*hbUkX zTWHE%A(3DOXc1N3i@d>lOjmXzbPbU;#0-2Gv2WwYix%cx%&NT61YJuML!$#+0jwm4 zpI)rMmATan{`Taoin3L)F=A<8>0&1nZ3GRQHf-d@i*uhQ=I38WK7kWtP*}1Mois`4 z^m;uTH6dkzBeH-Suoj8|0a02-7DQE1pfHLNP*kKr0T>WeR~!@tXT3t{B@rTl08sB@ zLaIPeRRfJ6``-$jJU17_-+{d@AiI&=iIQxz6ip!!5hB23Q2dC4&CNkj+S_n|RDjl? z(HNCYGfZm%Oz=A4E`sQaa$CE1M*fQ7UK--5!krbviL%Kn{fr>)sdm7C$cpu12>P)= z8pQ=7kst2Sg+G5}o9IWU)7{xLC5nj0A>Bv4O$wDwDKQgDlet4RB=P6T=Il)rzu86aWNLBi1a1%K>1}D*+_3Bwdg?!bEJEpeBY3e_x*c?d|RCeXN@~w=;sK zuqXGTs8T4Q_i$Q8ATb#cBp?T2v4IgJCts{};zvHHucZ2lVWbvG5H5uvNxeXJO^_XM zc@rfB56{Pk2L?QQ`8)i5{{N4`;P7-KvXUJNOj!@|st95f1y%ka>`@NF&3y2U8 z=D-&eKkQ<(2&Ziiio!j=Z_AjFwmoSU%wk}apc$A2aQ473LfMcYp@IW(OV^gie*OFR z^WV#U{rm9%2gPA*k=qpz$Lz6%C6*Opsq|tEi3Ma)@u*N3kyPN{co|9sRb)q79k}hV zHsE(cE42YQe4Z{YE-cx&bLY>Whl5Xp!O{@xkx~VUiT}#L#Y7&fBnjU3A=6-C6B!D@ z11u=2Dyd3BEfAy)xH_2j(n0~6BbA0&8{3#}V%*%^*_&r3jT$*LqNd0p0sw@H@x&H^ zVHU)XFPF1T5T!z5b{&z0ip;W#q6)Iups|7~qQL$n!*5q1xY8ZVotK8OV>H+k}+zXb~@=ff(EEAsEPdxuH4+i3^nW5uU`&#ZV2$i zqQySxl42;JF(N3E7|*0hQhWbr^d9{`d++ZX#Z#*&L`abl;o%aHBoZtng2gQbSXcqs zWng)P1Ez*|HtuI>@t;+Cygj}SJ$xLHIxG{SpixmjDxn^VEkX*O{88)m_bP(!WNN{! z0+L1&Nhw&B2#X+K!cDe4fQ_&dL{mJ!wK?%(#ksFvHeH#sD4Ssf7c>HpM34{OfRsW* z&9H?TAawTXD%=SO7=c+m*vd`g13(~Pip+rIiYTHY1VjYHV2A@W2jGA| zsQ@b#WB@u55#9n0xX6!e4%tX5MXXa)ZGoCOm^q?fhW_TvdpR;>$*U-j%$7t)X@v7S zT`q-|s7L}*3P^%E5I__s3BYQY6p@h!qqNAtWo@?Rak}%)%%=0;hwee!f)QdV{!n}$ zsB51){$6{P>tLegfE)Y(YzU+^swjwtny9LXgC~U$Qo@-yYr_u*4*yqwdhCch14I1k z)a`XEQX+oUC<5)^?WtJMX<8)#W|{-gV7-8Yo@asg|9yfRklc?vazmecdxpbAcj2aK z=Gv*@6cm4l`@h{4eVk$IbXt*`NSeCRAGKD0;q4Ssz=P(WR~G=)N&Mc2D=76M-uW*s zlff%6e0cm?5&S?Zfci&+zqtHu|PJi{BFlAbl09NBm0`)oePN zVK&}Tfywc0FgZqhyebc6;cdUhHEgn`FTTUS^l{eL+Ixp@V6oURot^NJx9F|S)5N6E zO?i#pP9)^WdNyI}CSh+jQ8~7Fjh!Hf5RkzT0{35kFHatadbhMR{|k1qe3r1-9oPlj zg7yzqYMJ|LvY6;&7PkNdHJAVdDQ4b-t=VS6mMvJ`4}XJ~(Ank(tHY4w|YspZ612yS{~Ks@Jjsl^a}KY!Cx(m(M2ck*%nC(bKc+ijrpMYJIWfCCVcBEs5{ zj71P)4@8~-F#!ZU&6Cd%;&eRx|`llY@= z@PCl#eiMm?0>dAaOqxHJ83Op$xX>6JcKoB!awV7m$sVDsT7&2bz>g6p5{PNEp#LuC zgk1r;X*EMvvtN66vD>&z!JLL85E;XKSSR*{+rrX9oj41mZS8QK!vw1$(2h|l@_S}F zg!A8<)idUHSlY`Wwwgf=2gDd)%p4pSkV$GsQtl|1L@$#9e%pm$dZF6RILjshykAH8 zmN|^{85*0*Jq;OQwbJ^sIUmuso+mSj&h9eBYLZqpypRa)G7zc|J%>>PuvnGINZ_}F z2gWRAm2ohUfvamQ9L)H}hP2i+{mxqy;3<;nIMs_Jo0*x1U}s)rtmm7XhpZ-=*3vy$ ziXfbv-GgAn42Io@2;zMWoe4(%=t&cl?2)~zgL5WSVOq?$t7T?1j1ro~%#rRUI%3uU zR}4hp#yLeSH?HpxOU^+tVZqG-cFcpj$rZ#~{;=GUCY(s9cHsx`(sP2V^k zNql50F#_q^REq|w9A&tLjKarPE|7GCf0M#Sn&cmYEwtEg5`4$b5n#eY*pqk4Hl(f9 z61o+vaE8(|T_bI^ERdyy5O5fr1iVW!sQ|E9@`af0q2ENfT`F2gmgZsD0C78js78VS zMg(IFB?xR7jkSaqK!AY>q3_MvZG)GSUBjWnc)3m$`Ps=`YMY{m5wwy~xzAM8P|3$a z#pa1a5qJhOBz<#uOy*+85z0_2yQu#HRC5mHGuOt3q_Ec#q)LSZ&StTNE1?i0u4!E| z;kg#D!V8>O?$-t{uOMwkg3~rg56sHhkT1lSDdQYPKmBoEbj&7ocEzE1lWl|x!i#V` z(l0Bo=IJ`irUzisW|$xl=tm(zHWqH$nKNBqC^cKjivASK(~LcMbmsYpQu6%hn$xIn zJrQ?Q*JzfJIXd8J7NOKJYEw1bAW}l=mBoPoOaKCD5@820Re)j31VZ2vE-*HPpf}OG zN^05(p9pjs*MT;LueIL#XsN<&T49 zrD)1>4}{}_tvZcu$&{rHV!aWr8qJLMy8L?j&RxkfwZlltPrK!Fq~cEJR+}Bvs#kr6 z^ma6Al&6Kt>uqgxx{a(b!lQ7@DN1VE(Uy!FGL2kpBUVQnp~N*eo7)wVwR0;XwlLAb zO5X07GOFC>Y;SLIwM&dqBn-}E4pCr*y>-0E(Fb5_LShm9uIG;qNtqeVFl4Q@d_BapF?sX+zCAaVtQO-azWF-C>u zSb-vpj2|f4afxJCbSni0?fXPQb;fFu!#KY-ro!R0$S`IMK7%<%&4QFUb73N*l@>W# zjf*oyk^4|s(G24<<82YRic$_DPdo*0yz;PV+7f3^zw_VJxSWy_Q=YIya85z+KyQ1Eg_=(J3{!x%tC- z2pMlfxlM}gYRWZkDWi#&^=@~UF2=_bhOO;RGLD#bES!!$hZ}LDdBaXC%<(p))aqz2 zZ^0ym1SwJ+GcFWtB3%YVY7oFeO+&Mu^onBya&a5SHKVKGb8I<`_mDR8rerQvvt%`K zQN47B6rCm)o9c?j!+6CS7&JS9{}-D3=`2klH!jpX zJv1H1X}xf{$}xjc&QaD{51pBjFma4=gO6ru*b;OpmjrRN#}Q_b-s;NN6KR#=ts^k% z2zLR7|0f}sx9-0<8tjqLb2RP3gIYaVfY9e0%(>n09Kopp#&S+eXg?m_r!R&aWzGiE zk@pFQT+53=ouLp?vXO+jORL&;IN@QylOf3>Aci=}9R@=lOT`%;BfBL6y4B5uE^-b$ z&T;v=FR<(kbhy@K5H80jB!NRPU56n-buv_rK}3@y8jLstMGn=G_5sj@L6MPt7IoSf zRt@0l<1UesW1z-om0YEjl@z)&@jU$8yZVjIvC8Z}GdyneIx1RDV)xyT8eyo%NRtDO zYB|8>%;w1 z3lFR9Iy&gC27{P81Q2tb*bZG`4aKnVvj#YL!o11&h>~{70 zj<(jW2QsqT%*^avXL9sAj|#!t-W&$M5JF+rx(-mvPIQhPGhu>E%5bs0jm@Q#!Z$lu zXsGX$s?~$mVU){PahFf$`p~0!Cs9Rv@~VGSyaCaDP|ILz^Q8KVe;kPa}g z#zJw1DXW3KtGMvA)weCXRg*cC533YL4qh+CBO(^M=?e% zp+PtT@N`Zpqz*+`J5qNsIY!-#vgGMq%^ogx#dJBE&PAmF%t|&8+&0dw3rD52XEqq~ zYSXouL2-)|g68vau%wpbc=T#UNeOmJaU z$imHD*@T^wjd-%cZ8scFBRM&(V;OHauuT|7!#so+XgQh|0^x=dsFD>}$(%OLw;^Sh z31p~gFFDMl9v5Cw-c`<&Tys?g!g(i)VYCTr6p++nC?T9St;Mw{-DL{Lsogi(6I3_r z+-`3>jPTr^1$8o$O{V8Vh}CJiruB8S>V}Fs6AuRltYvu9rK^#!<~#zX%N;XhbRy1l z;%+N@jOcW?*kNcp(lX6_sg2Sgi2R|{KHL52<@#S%@> z%bAWCgLI8_>1jl``4Z`vY|RXe%}mV6Bw&*u*E2Ih>YDg-N-DugF>qIW3^9R=CLtOQ zIA&`iGQvwFS}+=kiBM!wOlOuv6ft(iwu3uWlp@AJ?hdYuwF`_uT&xgc*J7w~EiM#{ z!v(~%&>$$(gI!6_Vlvkyb2~%9mPF-s5Cz*%A!dl!K?bHHWUH-Fm7S$Q-kfArmCPMd zHtIgnkw8U{BwS!Dafq--g`5dPnT0h60}7p!ki$nYu;rG~p<%|=+<`dWXi72&CC$5y z(cqj1>Nz*Y!=T-~fPRqy24_HYjpU{|*oc#maG{oNCqr{D2Uk0tCrf*oUFR&O@0j4& zjh#s=l;b)T%H(cn@vx*wY}QH}*0AyI>r!D6Q{Sew`| zRbi`ZR#QB!jC8t8I=k1xj;3Q*XBnT5i@gfKks$o;OaqNo_6%g)x@A$`{J++boZ#ooJgDGKXr7A476ciP;6-!3aqJqYN zu~tQg)5+PgcdTh$c1P+(8B)kwWws*FwJk%UF@b+1!YBQeAI#q+CzAOni45Nvt89WHfhpkOd{wwKPbaO!nt4vg79K+AC^z|0s))MUe>m+jgK356X&+MB3PW!cN82I)3?EY0_Ogj z{-*DnSiK5*v!zOBfR^}Zqx4Kgr9|4C66v%<(ILjf^em~JurZAs`^N6|(1RxQqaLrQ z;pZPN#`80)e-=2%I#lSr*)>6FB>HX+%bO-`<-wYZU}_lxP{1o@L`oO~u3&wYXsLPV zT7x5bdOAO$@B#)|y`r9Y?_ck0z%c$vw>B9bzZplVj}{@2aBkwgM_buf6KQWJ6Am5m z&~Y9!-#@fp+Pmvj;J+$<(Bx!;01**TEssPjfe_L>LAX1QWjPwRo`;Pj_MUY}`VXvb zcpDz4>j^b}Gq`=}^uzQ=b@^|g?>>X_9~tbroi97^oR3TOPM4@3q-=cm+&-h7%%M92 zK3nY%ocG-Cp5%So(BR&3yw9S2yW)JazWbNB=4$jjZ)LUd4u8r2qkDxj09X{%oQQ=v_488dUVoG zaxk69q+xtcut&cZ;BceuTQ0|?ATim1V09W*@=GLk=w60wS#HD^hM6*9ow zi`ARB=myAShR7bQcOZ43p41HSPP{|P_1Z-?gL;Ibn`1~t+&`K8+CAO+UI7px$hkO+ zF@T6Dk|Kg-Ay!p=eWN=vgzKgXs0aRs5fS@R_8e3>e zqy{iWk_2Ls1&V?2MTC)LMD@@Dt%Om)nh}gpRt$)u#R$Mq7)3;pQ3V1q5s|jY#VJ&{ zVT8hxtVh_W{QcNvz9i|byc>`{Y|A*L3?warB8nohAc_!FqEaL{Btv@4!!Ut~NtYwU zH7Dy;B>fwP6UeB_q@OKOL85+{`o@VM!$U?yo@pBbC@M3ib-jO#S|j>b zT3o@T2h9jApnz(2k3+m5ckDde0Sja(kqWA+s;a7rMT)-`43&gcig>Z8s=a@Po+eKb zo+2L>Mtn4Qs;a80s;a81s*0+jimI#U8mPTGNI*Rp z!gvTzW8ZxLq})OV0XKGiaD8=me%0OdyFlZ8brE8$dsmm-j?kzZ7wn&j-FnaVdaN=Lb2;^wj zP9SnG&ePJkE;E6d$~Jh2g%LvxTw;B;Mp?|~#zhc5WF(Jd42WzFbGR2UWtI0n#>s8g z`6D0f>!zApKj&-0^8*}xST}+;6{N=*EVpX}pxJj*B_YNiL~Wdg#Q@eg^J*E29I?Xk z!=co17aCDurk>?`7T0c;UGCc=8c-wdeQh

QNz=k7w^00*{d%tq!j(6fieU#io5c{MSm{tQ!t^!8x6ci!;Lc2fo*oFbw7mxy-;SNpkxfXp2;8=!)EWDs>GdFj%O zI@P}Q^6@=WzJ~F@>ewTBXKVI99>e~x znc=-r?Q*qbD#n5PUd3A=!Vy3T1-8{DxQHJU82dp_&6mw7`V^FvKCe8PCg=HjI$!tXsj1X80F#x^n%5|CRN!39JNXU8u3-b0U zW|o?whdcS*cn$z$Bl@O1qX|^O5fo!tvPl}p??p4fb3xvVy#qv7<3M!k5ktiVBuB#%PcVU6k_Yd{Pv;x##~uN^Lf#a8 zi}}f$3_O!0kjm^QfN)FFdFb&aC&g8%0qr)EUdMXdOZ#5=`VgR5c4Y$C- zn9f7iiJ>KX~R0D+WiT;&~V{!Nbm#=!+hZ%Uz=$ zl%m($z~kP)WyUmgpETk!ZxFo8mqCorlj7fU;SzzP)-H41sGEd_j-_a>rRu{NuIji( z$J`Or(*vEvhZe%-4VXodyp^z>oKs+u!r*lU>5>pF&c3~VgXsM)#BCv@B=EfSH4_Vt z8Czlu847_|r69zl_CgPFhpG|;wl9We zt-f7h!}64FIm`P+s&r4S%a1IMXw%1*ww+;Lq3cufzc1eb zC@-WB)`q9azM81J{*Q!9Jk+ntJ{FCn`G%<37k01Ll;C&Q@^_y;M@F1nzZ&B=m7Tnz zlZf~;e3`Tf2ncoG3*jUx9;fPlF%I9>L;JM7$cqQ45$?aUMIbEwptwktAB!I7JHWMx z5_EgiB9U)$hP?O(w*H`IlB8w0M%!^dihk<*(DuY7yFI)R;xZ8S#?3$t1g-&?WEw0> zBZ|>440aFQ36~N&6T+>#ctOA4+I0@#P)or$A>>!c)YIvZgx9Fq?GmPgs`l_ z+bU)alUs3PKvznteRD})V+(P3z102BbKLlqyLG%C-*3JILXZVQVbmAL(btlD-5s(Pje8bOIYmF6M|3AUjCGay@!D6*Y-tb8foKTEA9^K91Jf`ldJ%>`gX|m^9SslGJa~(7W6w~ZDxgw7 zE_*CftdL7owUG)h#5x6@El2)P?Ir1g4ybz$zo|Uo*eoOLshiZao$s3Pg&r?~9urAZ z0(Y{dm6pqX0K@qBwi4iapl2311p(=u;DwYz>(AWfKhW*kAzx|o87hlPdt+84NP!pF zhpzoWpm0UL56AYe^1g?+j~};_>U^GlPj5fB;Wm-qe22{)>QMMcFF>(S?#svzf4lOJ zAWI5kdcN$?S>%@kiA=S@3sUmKrY2khm#4x{)c^VEb+-ggu);a>nS9K~$+AgLW}Ox2 zq|H24!X5(GPB5i5{$Y?TxZ1~y1`dx=>mbF7K?saX4Hr}dsH1csTOvy2!B7+>Kvv^j z8j%*H4>K1!n5-6H*YNN?Y!c$7;~H5`vG%{)XU$z(*N`Xdqj$uBY_`Bi&Q;43(=jQdAY%+dep56C5}M`7Ap*KRpp6J)gRO9! z!J?Aw)$Cs+v&%w^0D#~o1PP3#Dg}QJx9^L&Epx6R&; z@_5R65t;Fs@H9R>X|grdh6XQ~J;JDcct+y`0-Pa*8jH~|s#HXtNkB;;@R|kiL4pwg z>okt?2q-p7cV(N=)v6 zV`aN^5)>^Lm$3_QjIX+yOe|k%1=ppZeM15=Is75N(CT^qi2x0{bXv8bW6QWEs^t?g z!Fu8xeY#h*+W84<4i)9YQcO7#R!TR8*osdOUPFuDH7&Dh>PyO zYs}5|lx0tUOI^po?zS+`QD1v;#S+zP>HSq!+L6sMpVU09jRzr|0w+7p@Zs=pRecwR z$atFLdAUD9NBqhM`pvp2Fp4QN33h^|ddL+oYRRwl*Ib3<*hI%>m@L^*Roty5@8f{`#yWYVDdM>0q55{hnGj> zetyW~qlX_)oHsfK=+LDo*(_EgQc@iZhl=73KKz0>@uMk+#=d5`T5B_Hx1W!LS097X z5dlFEsQ@UDM4C7a!pey`j%h$ziEYVeoOOh>!w#=b@Wo=cOpMEkP>dFNJwum-iMzpi zf>R8^dKoylzK=g8dZyPD7O+#L%+Tg3NDv6Q@;Xu$2Erk*sw&8hRT#jeNRfc58>hi@ zobf^`GIfPY+BHjU1Z4>%fnZ$+r1#n$qoJZXCoDN0JuYau`&n}H=I819nfiJ9dNw-L z-VxP8Nf^d3WF#HS1`sBV!p*ObpYZTW*V+J2%X6tlltCgwJ8a?1G-gU$MK_-HRT-Dvf}s@ zB#~C<6+}VPARa^3ofEQTy(fsK zvJE0^QfO-OYcSG3v9c~P*pOVpB`NF-1R6OqSis$ELMCovo6_Y!n?W)&KW-u%ypJm? znek&g7X`5r_z?sS>;nL+GJ>Wlj6@txn{8UO<(BN(viKAvW zcUSsQQ>H-ao6J}cAVX_T;xMoqZ3zIRk}-f$=3;mj9%#!W%FJ2u5Xz$lbPoF$Be>qg z{x16zIH-(;;dKCLLS;l{{&f)vrwW)mK*8KD|GYF5(V>8)g`)$`cO4THQ^(c%zTfy> zUk^`@VgXKPro@2{?m)AjbTqoG(xdh1c-8|j(U2re3|2jZJ;}3Bad=?iA>_!v#9z zX`o!Cf>(bxMJRq>w_2r(L8M6rgFqs&=Yo0R(efI*y^hCYYvN<;FONf`r=R+fy8N1iC-V|`F^ig6Jv~dB21%d zX)sfQvLIATQ2kv95AL7V>U^7#dbwV5tfEjF^V6Oe%q(O(pbp`Xth)GE*@>J@V7+z6 zK->mH+n65Ly5*5V1R1P0B}i63=axlmAOsz74KPgX&n(xk$Jw(NpXcs)*|Tox(65yQ z+7L=AEq@@P1`r_q2&BPOB8`4kknXmabQVqBSecrcNu&MYT343smA`M37QKExzeh*c z6dEY93L4@|K%GmaXyT#ifexg4o(HRn$H31_CN7RX z#!ojcT)p1!ccb0ucY2?So%(gVXjzu!>>-3rsda2Y2h60S;rXo1uLl8#a+u5vwh9>b zkja$BU?Rnv9rhg$3tMjK4VksuCj`Y|jd&)ovf6_kX0jRtW}RHbFPgcOu=dDpg@X8O zDj}38#I$Ktb`s_oOf4$KRkq`ah^Bay_$N-*#xYsa-!URLO*5A0PL7KO#>9r+6wDA< z>eH6X6j0gL7o^c5<97k0vRcZW9vPZt5qHAlBXZ;|;cf!Nw@yRDxZ>)QEz6ZmE?I(G zVwI*XV_8a+D;$!Mm6)k-!VyQ)^Ss-Xb4KaqaII4 ze&gBn@AU8A_WSpz2XN<$5dEyA(WHz<4w7IA{8)fl|Ctt-BGoJX0JaOC=5DEU!@e7*Y5oWFRNjz|m0F7UYP;plGok;{=WB~pc1gNAguxhjz; z_$Bl1@&%!*h&wEi{r-wOUh8-w3}_|PGUf9?z#Lb5Hx`!!{6bdK0#byMtOq+H2rfzQ zFfjPEM$v8zhh*Zr9*yu`#VFecRIF^VSwfM}vPQ5qGaj3GH~4q{S7Wi}<^1omNC+fg ziJf1VDZa!fUI;`#v5_G zwDY`^tlVAHdhst)9rmSAuq_I5h9GE2M2y9S4s2B@E${*>au&pAVHUQQ4TMY5g%mOq z8nmJ$NqTF8dekz=fJ498`W$HW&9jPw8pac8)z;S9nsevA`}(+bI-UMM^8Fm?=Bk^D z+642@D4@De{B-P7UgkAjAWlkijUCx8ZwWzk3R`Fr% zDJ4`Yt+u)Rzb$v1nA`y%Y!)7DxZW_s}oNz($5C}A9-Jcpg3)9-UpP_K`d>#K;=;KL_v7~ z=%Q~TjX-?6(=sj~%t8my&WLg=<{)$moMQ4*qeGOlmv@&{!W%j`%3{Y=ZiNCT=cc98DT0 zhoSL=62jBELxB?T1$cNu-YbZ?@1i=$a7A9iH&it_R7(<)z5-^IhUwaXHV;lo$KU>& zrzD-ubGT$hV<2Uqs|bsB>IZfKtHwl*>=WO@^5m`m* z2qx#;|C4$GqtMfbFD^d}5dE*^ zZ6W;eZ4Xsc+5tKO329F`5CV^y*myTiAg7gZRaw#Fr6J(`kIekr_{*QYQj?eW53Bab z{o*wt>VnAl4=j3?G0~y>x%&Dm)$z8mi(u^#!C&kC@xRkh;^j(5w8oNzWg{XY463Ne z#sW-9CNb|Io^9H_Uyskvx7*$GJHF?+!-(pgtP=z}(chJnc;pll?(jDv0_OKT9W4QU zcxyd1oskHH{L8!_p%CKdY(Llmj~^ei#l`jM=Ar~a5{U~Wlq2aX*(5JR_OzONow6t2_6)r! zN18W;l9eGn*(FlMpJH)+(Uh<|8J!3sJURh~7kf%`g}nT>Sakc9I+q&l8v#;bzlJ&| zmo1ZH1>XFDx+h{k5ef_3A6p53@1lKscDXLdtbd#MoH|J@_Gj;r>licHWhyjCFd!FD zr(&Jwz#UCH*Kc-vJ&awCA0|wuh=T;sMG)r?wp9<(R1kWr*bxQW1KZm5g^w$V8(H~} zQXwbs{lO>KdA#w&c_Ywtd1=vAiM4htc_ej_|8xtG&g=oAO8svqdn#>+kts&2{>v8>$Zp^kKwuME^Q9BkHgf9fL+7&(vrGX~cNVyBAC_*_ijmSlJ#JCF~aLl|q z15jPF%%2vE;5M<~Zhy4=y7L@-y`X{SEwrGF%z{iH%*=pEQU=|-Q$IWvsHv%2rk8f! z+uHQKh>yw$`^xOmP~-ARli^3nQ}!tN4+z=)T`q9zmU?sY#|VJ=(A@cQ4v0i}(RBHO zAiWbTCnL%N{VV_#=?0YZi;?EaCrh%fLn&&uiPf-E?TBuk)uPtx%B62ar3VnUS~);H zH9SXDAYKEutU@BRn!g-aE`xASvlq=& z5PmR-FS`+85kg7%o6^Z4_H78BBXIG^?odWYf5@Vkt<6!!eM%<>Pif_GJgs3yNR$kW z84-g90gxtLv0S+TuuD_g1@JD)-Pm1q*Il`De}47oqWZTAU{eZ&pogg-M1ZG^0pb&Y z6ck%j5h$QxY@Xiu^n^JMg-k|MrD|q;M0z6CO!>k9-Yr!`OF06jBkv+itaga2k1VY?$0E(;;Thp&A2Q^XBSSNKq`z_qFheJR7ama zdpVtV&UF9~7$5*18^YlUNL>Td{m3Wz55O#e-S~OSJLrkY69FBXhf~JZY8xnnA~G`| zMA>;xfJ)U#Un&@N-NI$N4Oni&jx}Drc%J3gHxc6SJ%h9{6VjLu5qbaas-f}DL!1wY z#wfre6G;4_1Tm)ooIQlM&**do|9A9mM8$>=VIc@7GrAJpdIG3om$cgO)UU{({e?^UXiI)oHa ziaUyTl0phx_rEz1A9(g;YZLGk`6{j?kv`1`&u5TIb;tcWDATJ#Dchm>B6FW({^)0V z=R@g<%lsrvYVO1C{9mE#|8~`XQZM39^T0pXk^!Kd_#f5#?mC<>Gl|rU^JjmAVL8aC1RDzIv?Km9rNS~j3;pFD^EpTOnj#N=e0l$r$8 zFjCB%56XXJ`#}0j@7-SG7cMnzuL--JkcWyuikkz#0yRj8hkBreVvolF1PMFfP?xTb z`5n?N8CejJk=##@^Rn!AI^fxWU!$qyl=xMrS1&FvugA&9m-W5f$3UN2FCuViHo9~H zys&2D8)z=*AHf$`-HN3)ed# z0Wx3&T)u<*uqXpEp`etBBvnYu)Bgi^P91z+ZvT59KMyK*)dU=xvj9?oye+EdG88W6 zpuE7e2m(b2qCz1Bk_g2@ z3W0FS+4e62-N%a=hQjB8b5hRvOQb3{th~MbsBM=EE+ai(^V2C7U83oKEylnX#mioKING*zMznc=jfXhfTP*LCXA42Q7Cz^1YqwMAmE(!+ zRBAFccU{Z4ostG5-a2|G2LXb#7(&L&G?bO*aOuMopj=wTjoAtc-a&U~gNf49MK zH>bu-dCk=O+&9DwoL;syGG*TzzjE(UZ~B`bu==uoD!9)W?{%Y$z9gI9Gj9Fl>Ty34 zy6zDKDRv<@lbJ0OBcd8shX$mxBA}OIWOG9ro<`m1`>2vlt%1_55AAeLC^YUShf-RF zumh9GxvvG=NbFh&u@h!d(R(@O8X?$3vS8{R?v)NQt3>N@o_M-5{%+1wguuNwHA? zdPNU)GU@0^Kd)G-C8^NnFJF`2bR?-%0D_Uwh`6|WoT`rZsB8{{S8Ui!nfryxYZn-C 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

bl)I*?itP5k2IIAt*sp%mfR4@_4LM*{gv(b zgv*((_Q@K#XLRbp{e3j_^cI||6Ua&#tcA6n_tY~`^tSCx94_2mR3#&$j=QaUTq%Jp zEoC6VH!|o?a}`W#!=?H#b*QvY~HQJYP?`O%H45Z|$&c8>gx{q0ihugKzOo-p2&+F92T0@#7gE6UU;rg)~INJw0C*8d>XSS2WqtnA9URW=E z0(Jm`SE%Z^Bu9chg!Y@iRqN~D@k`VQYHK(!a4k?!=Xy30rh5m)h9y@mf6>)V!Cii9 zQY!{zr*DO(rM6;`9}ynl9}yA$f526f9j)ipN&Yr$ukJ7%o#{InV|e?z90L0siHwx# z2z1R%U>ktEV=XUI4`^rGAZjU*r$ak~9>{ZGhDJ9mN z-Fi~>2IAsk8EbYam5>(95EfHCxB~i4#KwQ6#DDL=l*AP8lxpQ7QZU^293%NXCcqE- zsn4LTs^HC@aduI7c$?t?2!C20*hxq{*P~4P^lz-wWktADejXm(U8|p4+rUpvjnjX6 zc5dKy9f4PuT;5r;lX+(ed|XzKx3a{n-q0#jM~M=)SZ4#!Ozqv6&@P%)=T!Ui|#34<0+8!>61{?1cC#byH` z0M7ye7&NBlY#3?T_&K|quC9A~sykcS*z}({(O)%bhIK~2WV^@K`1f2k>B5Z$!da{~ zT45c(0=qBNuXu#L;uU7}hax*%-Y~m2;`wRNqSkrnbtEz5YQD6n^EapmfJsP5r~{!0 z!V%=<*+PL_kcbgT0{6v(^q6vQfR%O`3Q1{GOH*?IuLFYzj2a<8R+$Dg2^ui#WT_R< z74sSM^Ye4YU^IF-R2K_xIQI_s$YW#e?d_uH#qOeU@6XEORN+CqOD5tB!_)xwFG56nCi@PD0FQu< zgouPhgb45m#6U7q0Pqqy$$`LRIE&Y>yvfHg%cf@VAN3Awo8M(_&Y3s7vQw@{?Zcw* z=yvLPku^C)myk`fBT0yS!73DHOFB-_a4lV}8sKF*Z42SKtby-rmU}9QzyMQ3R1f)A z4Qud@DJx#p^`XEZg37{X)o*XrjSBJeYC%8A+wjRv`%2g!CsS|%=Sn1YiMG{o#P0S7 ztR0;P&7J041_F8!i3vUJ<|QNrV{-1azqK{v9?Kv5d#xGZoDc-y96ly`^h0NJH?6xz zVV}dZFdcGWAqJto0Uytaz?DmKOkUueACIkSgl?& z%CjIsqAB=+fA=9mO2R_&^md>qDLq8QM9L9}eG!JZ_sR+wQp6Dh4j8C0SX8yKCNBl& zwu3PA^vJtUezNdb$w+rUE)P%6LdleTL^Crt7djm{o1AEMy2EY{yokYFidJ)9aF8B4 zgda?58PQpvaM*0RdI4xr3Q3!`X0dKEv{JG5yQv&t6Va0i#ZQ@d*l zIIh1eP^qW@MaQu9|=k1#I-LLjsN zaBdEjM|Uq^yX;Cx*^{r;K~70q8L)=)teVBZO%o<2w67RH)i zExZ1%zg+)|vgLm9(YeBVFhw_X0=vH11p)fBZbzCl0*#N3G!pOr&#|}EKQO(;>2RV| z`qr*1_SQ?-H8$DgkhdPTFcG6Jsvsl@G%rHc?$(YYdV88N=l%li z8@h{UaLwxA>UdNtCqoH{p8K7_M?E+8M^o86ax&h+1#gi}o2)pd6UtdZ7#^G7bs@7^ zp7ez%@*K{tJ3T9pjXZ+>lAE6<-;zH%zr=yY?%iIYS(%}HzO4MH`3Cw-Zj&b<`VQNHuy zva|Ko@x^n8eZlZ_bQ)foL$(`3(O5QG(0g6jkJG^B02~m@PnYp2|38Mw{zYtC@NLN(BfoWbvNU9x@R4& zb|*%lubL(Yf^8JM);u_U zv;L*Y&eP;eoO8V^X1x=jbNPozB$vickcFm%T~wAP*7}VBfX)@GW&zp{bx~3sRk5}< z+w>{h`|$AHn&aiMFML=mdoC0$$6IL5zW=?!PBoAUPp8k8VLnrqhw!hx6WiklOcia*I9)bLN_73PvkzQ{m= z_S&!D$pKkec1F9157|?Ok{^#}CV5fStc^vzV_cPyzXEckT9T3I*{opLLVSWdoU^A6 z4-f6JlU3z}e;sxIh+^B@q`Q7ku~+5dmV0mRvMVm)mVGzNc6KOjR4i9dT(a?X*Zwtb zKH8m7V?fOgjlSj~1yj?ud@dS?p%F%&7e-#VaPOV}*vNIM<;;%LDm0(&4?j{fF!6UU z0d=k2@8ME6bc9})2=s=B^eI|WQsOPfwUSw-jsi<}0%&Q=^BJP@p;nmP3#3jgp{#n~ z(jm><+{Il~^DjN5HX;B`y)K+C?d`0pA<}J8b;HtX*p6kR=0W!n-)o%o#DTGQMi^RL z@~UD^n)$vfIP-yOa4#ZA2%7I6K|qKwu$+@t&9N!fFmb`sDAo9u{Bw$|-Nqg|^KZmt z?4~D3vyE&%&8JUu6vx@UoqDGxccGI3?G*v@I-8b*dkIL@?*Dty+ zukN$GnL2t&nv7jn0;)f9<{Pt=HGEkpbBAmNlw}nXdz|GpL)&%eCV`XQ@WR_CHLu?l zj9U+QN3=7ozJ8PzmWpp9I&AwG=}GRYs)7(9LIm4Lt6%5!%bjujK3#U zCy~7!w+YcWI@>EPxVo1I2^N)_2!l^sJ3NTWE#5{@`+#7+F4KjhAIVq;GS? zLl?}yq{Veab?G&9&Azqf@^lxdv^JD+6wN+`+w|(?V(;?wlPv^W|E0U|)z;LZ;n9jD z@%WOng|pu5s=T$ly*m~ocwzJH@vHD7+v;;|Vy)Z4vgu}R$QrlleTa)a8#n#VJNQI+)$- z?J0Zoth>EEIBH$NtQt2Oul4(>w%os;>SCkY{!RAb&G~UCYGJF<kOsb z(mug3%w@@tg7PG-c5cu4&{gWT`Q-TMN4hs}-)y-)wHr^upaJZhqrK?e>D5Y7X&vMB zNRNn_Tp8kDUWY*+JkTSvjIs);R)u3JGsM|Z{KKTOfppf`3z)0u@{`!Z(lfMx$RxST zh-FxBJuJDz+H^+Z1I$6v`;bI&R39)+DNn?d;QA3vP1EzkSxDrMsw340{8Pp$A@VxgHF3qwzau8+Ugw?<2aQ1@ytfPDx(cYP1vCS~qyu{&XW$X?$ z*uI3IbP{u$_iTKipJ(W<-7p=40~vNp<|$&nKtddk=;mqHtK{B7a#vE$6MyFgB}GD% zbIKXBCv8SifkQ3(9HK2-)imKcg4A?>RZ>!y@m6f1pJh<^RsUEm3nvRR{L?D5<&}Ox zP!;4&*E0g=#0$Su6B3EA`zH^|_D$0g_T#8a6D|$MR^Ecbd8huibGO7|da1AR`KR(@ z`P5^=JLYYK)@5t?Rje|uaSRKhLK?MC_M4pYGusX_-c((^mt zsl2WjF%?>!c*X|dnZh4BiTyRoX3Lr!_~J-|Gn8c%HEao4OKdGkJV`TT5J>)mNF95* z*pW1)y$6wkoc_s$awUn*(_|o;JbvrMG!*@1V_2Z@%ZPEpks)0P1#(0bn0usAZ zazg$x%+yUG^xM6^BO+UgUlK)v#+x9Ogc^0JgLd&Lr%72H8zgm-T2#?7IRcFe6M}_I zrX$Q&W2I0%#{&+OoGS@AN%+jafSHKBVOJnUR11CUk@R+o8jDPkNc!!;1Z0K{td*1m zD}^#ktNfUm^BI(;Fa$4hlG^*5ZflZQj)ts^#0u?Z6iokkJrK#OBldZ$ai1VqLZ_jL zY^2nt8|za){~-~d8A%D-H`2wF7l;$akR&!q>TeJR?p3=Uw2kXW)XXC-i!9j;+b0bR zq9x|XA`gSmnV1+hQ;_I4oEM6yiOU{6;?kkU|NPL}n>sGM!Y&AIDv!{y04j zv=#D%rplbU9t4z}Me<5<0b(&I`IXdF!`onG0vIF^5i-5AA{TCn=e+7d{0K=o<@;{Q zCeSdSA2225CS~(E1pSI@J>h;)^{3wF9iY!iTRoya z-FKgdr3`+;QqDPCBl&>CnO5(7RN0fQ4J*CaeU(BGy8t;E^w<3{o=!Ao)iQS zTK1+KbaD*_dUICB`k41#OjDizFPc$0C7N$zZlGo#WAM? z&ot|6${oG1TQukFbT_F{JNcwrLT)$plYBGhl{L-Y235KVV?*5V(39bg0a zIgGSFdr}|5TJUeTehJOA5Evu~DksP*NLtEU-D+g`<{aI3XNFJogBgI1`%)YQ2b%hm zH4+ca1E^Bmf6>3%??30>H~y+(!aAPD!MwFFz^5F)sz5CI}3CO9OW zMJh+OOFh4_sGXRIqmvEaZD2X#sgY1U-PaZ=SSRE4s9O@qC^vLbFhx*Gf+&2Q@uXe? zD06)7-ge(>*+d?F=UyFk%KVwG(bhFX-(_h9?cZwdsh zedt`5-&pWl$cwsjM2L+F1SpieB2$WbgG&YPD28_dz2r28YU##&GNWB=jUR%Bp8aE3 z0stg91-kSLSbhD_90Oaz1H_oeaMCOTA9t2WZx-*O1n8CGAWDZ>lnsz)=0Mzs*YWH3 z!5IUT(uF3L7GI?5bN2Hd%siVs;-=A7hTf0NC=)OKT2_RyZpyeh+?$<3Em&!@7}G;X z!bq11hxjdrZ&1}Kl{A~ZmZ6@&?BQ)e0tb(y$W;6x2Y8VHQ~NpaFgWm`bGSNDMil#H z0023=M?QYuK>)RvNhFM~+-e^(DKoO3q-*rP-)D#9@p+PYjYfZU<*JOPj?((QnEHr2 zy>uykj4RUZgXG)VV+ygKjrlpzA)~o$qj=mL*c}PeCbl7C5^k(G*6+@gJ(%t5)m*$` zkZcCX>2{D*J-Z#`c1~!n5yK$~fk2cCWi#s>Ll3pQ-?yg-dP5%;?4~Sdj%z2F@9IV0 zRth~jKLGhd(rhV2n)z1WM|x*SYwLD+%gR{LG<_bx^eUeB@gYm>ZLhrFyvBPFndZZo zp{(6=r!2NHWeW~bjcX75xAC)3+P%@z{4qqR`3<$~fsXppWd=)1A4P z_OZLsPpWUu;2d|A0YIGB{k(<(jz8naKQr@$_K2v=`oq8dg$DRjFN>#|6-~u9&l9Kd zn%f!uZU*wRkQHNi+^J)GW@SY^i5DzYFE>-Z8HH~KJDxRk*m*gs&Lvg(qSBj5~us3s?E0YviM0KCsb~*en&688XI;Qo~5+(3Ip)N`HGKPb~oj92M1>@+E3>gjVR<-`Wo;8Ps?(z?Isp9&GQ!lnyx?!j~e!c8+%0yl7 zUjDr8#yfSbNU>IPMc_`GYSy=V0_KefefGoNbW3MW{%@I$HiIj^TB)A{ehcE6K%*zr zv3Fu+1;BoYvV^`O^+L9&8${@U!!&kafdV<*_S<~U?!bZ9Uas8o%8AZ?kGsj&U4aDJ ztGwr(J>d%wa~ni+9Bs1**;TwA=xXtVByrqLbGn$%A;z)nBtC6UCW6P_rDe}EwEr&e zP7bdjv*E;!B39if_{PVd|(aEX38M1e@W>}*Ioq#R#{g*G7am-x}?nW`km)==RN zGAIp#Y2oc_Zl*KPrqJa@i9=_YojGN^WsSHjY25avGJ(=#?n#`3tBM0qnW$zW z!=F+#>KW26z|Sm9R2+WH*q0&~-}&Z%U(-EgPw7{*{9eeYvXsiHrlrm1atW)@eb zb3g}frhrkXYJ6$arCQ1HZlR9#(#HR`IiLoa($hG?~0ZVbCH)r-h_Ru)^DieF+JC|5;vFHMzIU+MJ*jFoC}q$PTzo z>P*Z~caR{0a9!p7Ma-LnIM<)svHihZ-4|TXsxg=bu2NzRLtN*Ml@?r9K(G4D{_bNt z1tVY*XW+XRrwIvLSrp>MD|84l1}(!plR1n|EzKryKd8pD2W%G2JRtThn9I7l)eQWO za@E)IUip9JUsPar`2{iUuI6*KoT!8To{Bw1lBXx3lzxI5d=0ICMjXnBzgM?K?pod` z7aF5sdO@z?*9q-OqlEqu12PkM=&!i0k7Z~vlnnH>sStse{p?AS7IBao1l{j63tjfN zq#0n7;hCVg80dMV+O@Nq-Z`{6Dh0A20a- zRCIOtpZtES>V2=t9$(7;{pWS^YO3(syf**qw>ec`p8Ma|d*AH74~K_^e&5;t>$h&z zU!dB*UH*UVySsL(s{GILKKuRu>G${dnAiiD;*P$Gi$(&+Xf_SH{}E^#2F;UEkJscVJOhY&(5_0p~Dng;#3*AKriW{SV}MJNxRr zpRDH&eBRvtkNSVu#^-llvDabuM+}=7s?MLs&mOS^8XD`pW_f9lEm*X6Zu`T!8EJ*q z-f;zMJ=E4&M<=imkdn`y`eQl^l8cgQVV+v}5)$J0y~%TvCnHih7}Q~QO#(b+=8&^y zd-1g)e)$iK-9qfoxQYK1_YoKU7^07P?Sc&kgoIeg3`rzs;&tUvP8fsCMNr`&D$t0X zasm%{NCDQeh+&A2-=q;M6K*2lh^0il;i#>#Kt2RiaU=mTQkaWMDDI+$>NJ;v$dZ1l zD0IsP`S%SQFU@r@@G>aDV~4EFbt_iWt#W0_Pxy`g?!#?$79IG=5gm z{mZ6Otm&3p0Na1K1Z8fGEzt|3=u{pqyOR$RBINF_J$wRBwGv4+>+qSJcmr zDb4kJPMbvvq7lgDKp3^4t8;Y@d3i%1e$i;qubBmqa{CWzq4UL$Vv$JE<)=2vKM3m$ zT1%FH$sTl+BimGw)pNq_!nU`RHK04JdN&C)@sAj5u*MwV=Waj*L{6zPM&ihY;qcj0 zO`2%#nBsK`sZ@ac?j`|+)Lw9C{m-?@ZqNah)9WjeymM@BNQK9on zHUG*)pQ2+wh;B{Xa#S?6G19^vQhN*SS?j|&<9@$^jSMd_w!w8!-8-At!79yc79wo( z>#m@|Msrkc_jKY;O+wGh@k+*n-udNJ(gDMqfZ!6fy4T=(iD34vc>TE@narTPIwOJO zc01XQ($b}r8pI^h|%xp=LD^i0i zEOLexpB=p>p%6L53&4M^L_{O=kW4?_Lo%K!YZE-w7jO-N5{|PnBOWxpuLS{27+?P2rxEkuK&>&e< z8VFb*5Fo|=^o#sC{U)#l^N4xb7Jey>03rQ&5qeP4KY7zF5~)9h_#b8ooaw(WxW+5NMM$m8$U05}ISg6`;!4aK1uW&A|a@PGJ|Orge`|TDki?%(oJ6uzk&nEiS(i(zJ2Mg z0jkpFegZrx5Q(S&5CxiLL(cdO1%3Z&$ps7-<)HusN|Wgr@o&nZ^x|O+=mZEM4chb> z0vhg*Lsyf^n($!Dq;YhxpY=6AMb*Ip=F@DWF`Wb7n?jR4iSGmGNKErZ?yH?yP#ap{ z0MDG$0vkes5-n1mT|{`N;)cBnT@ThDNFf4T{V$}HbWImJ%9jvQ&x5ewZ}-;3isKpZ zKX~q=T%o0E4w^U>N!Txqqm^ekZVa8o=71fy-+E2ca~Lg+lu@c_+LNb5w+69%?D~xl zpHbIf*vgFbyNKo}Z`1X;dD5(nkzy=okX>OloW%SVG;{OOa$HQHy*Q&Xx!~m*A9ib$p0Pu$BPleytE{ znvP8Ap<58Kd+mWnhqEb0;AH~_D8IlxoxI1QgHp;T&S@z_riV7DzTZw+pvA2#yZ9l% zb2Ub!{wjvZwDLuPzw;A^aRpFi-xu9N2()Sl>QIaAcnXV{Flr9p6TlCg>-rx>`Yu&h zVB5{x%g~}6=Z4kucKoM@IT=tufzD$_Y~*7kU+xYOvNj0U2iF%n^W9zAZo*kYC4Uhfu9zHHZ!^PNp?z2LqH^7u%2d8rU3N0yECWK+apX={9_3IvAw=3~E#vRryWTb2OO8+aSmk z@7>gzxG&JtkL^QdJ||6L);VRZ?Z!ysw`~$-q2I=b^-fTO3(;VeV2)5DDZR=nq-m8g zw~=Byz_CLixKz8ljPk3@teMvCBu0f2CRtQ=npT2+D z;o};G929~4&S(*5#vxXRCvfkKLXPJrVO#Gy6p%hB%*BY|MGw?6gy0Ugc4Rv2j*|_# zEt9qYg-;%9Da>){W{*XFXzr%57+9mvUN?Q6q~>fL`lu6QXMnaO+Yzzq@WMiP+qPO& z&0QV?R|EY8TWYPfR@$p=Rko_zRc)%a)mv($VT*O<@Zhl9pRw?fsTLLJ@}D}Y~a_wJd(n>_pfj%ks#ZMaFaGokxLltMLBA$~2n z<(owfVz6FMPGe)k<&!{@J&Z?X2*F|%DWJdbquw*hn_4)oHY4avY$%uZpgDxmW!)Cq zOyv;-b4CpX-Qgyp5j2QyROO2n?79?kIR*aqxK`KB{b#)Ix8))8j&p$i~bJFsG-srL>WlbJzf;_njv z6m&xJVizx;!Wknh{iR8;LgBkWlNh_o8{XZ0iQD{mo@ZRfpO48(p!J zon2~um+>{Fb#?C!AJT$OexvpA*B_SdN8x4jiE4k!?9KWD1b{=tKfgkP2GzOFS2pI= zTW$i0q#dqpexLbZtIv(s>3QAFcZd$xHvaYhF%^F}{-Ljtj734M``nKpql5?d&~?@^ zF>be4HVxBraysVacz6O2fGBt(C)~=0732Z=?%eY2RkkbT>mOn7`S)J?>37xNRex)J zcaO2Jcp-k|K;MtxF{nh3-y#wd2V`c*E@pS~1OiYH@x#g(%fy#PFnd%p#enIu;ngdc zU$dXeGk`YAxW;=FANtCe0Hb6(h3=tyyA(T_2M2e?aLi*i4E~luNU5Uir%UqNLd=_X zAEdtid%|fEa~HWAP5iuY7S@d1;Wgw>?s6=@4<7c6hGyU0D03H z#71S2-1xU1V8@olsr8RB%?Z6aaI0VzL9#6%Z_M|zE;zGY-Xo4@(E{<5OaM{o3*Of- zSNK%?{?MlNC8lqK_||4E;I8I8rZ0ncv~=c21yVtfWEu>_>}4V%0NBwnBe8}eBsL5o z7QvNJ5-s@-QTxB8=d(Q2_Omz|5ZRU_CQfFd%Y2{&0$lBfKx@ZAphRaT+7c5RV_XQC zg~tRv%?IIn67uBx{8(^w&#>^a*!3+x=4qoiW$s)N>e9nsd~2 z&N?bifqhONB+~tnEp2I6zLx@bi9)?TGb3+CkC_s>v+Ix1LcIAAx>SH{N zOTD!wY#Qw!0zy{GTpvIWm^Nlqa31QCXrU2HUJ6MTWYPfR@$p={a&&9f64Rq9-pCzR`cTw^3Zq=YNsmX z8Q?wk5FNr-H|U(0gxR9(CLL^9mx>>J+DzUsG%o=n!PGniG0E&nWf2Vse?g6y7|ssh zThvn;e5%maK4FOpH!9(kguihbdg%_{uDHea;1j18_b43Zs zH-M0th{h0WuPn2Joc7TC0~!1=&M+PY4fKJ(1PiWpWHMM?m%TH#o0r=$od=Ry5L}cr z9_-@g9P;VL#^`e> zGZvdd4VY1L0JU||2HBqKe6fsX!IoVi$R;0Kv$)yRHf1x$cx7$7nbIMLX+x-Af4UuI zU^SY3G`~aeFJT_6Cs_xTAzsNq_*22+ULr8=Dw(4O;L45t0lC(YC28q5COG8Gqonk_ z;cb-irq!m_b2kUN z&Q|w0J|q9ka2B0seU2tCjO%LntvjyUK+jrdUBjUPLzUn4GEcNz+X~_qwn*X7;=f`8 z80T$W^{GA&-+iM2=Rn{=mqVBjJJzDE-!lGpdRz|sh(H2yBhCBp`H9c0{~gb%^(pp; z*O>g~`RK+8yAg5Hu=Ii$hA9s(knvns4AVxvX_Y8ZtHW^R-QCw?yxqm&-MirKi>%$d zyT4d`0H~rxTP#%zC6cPuSr$%rJc-#re~bJc<2v(W^}oBvla}oD{%?14+3Xb|OGruI z8Ld9W%JACn$*<#hFD9P`t1R4SlfE9k!6@K6q ze%uv#)%k1*ApR$6pag#F^WZ*z&-v~1zrFeQnP!^U6L)L#e=91W{8@B>`D`HlhxY&6 z{l8cDTlYljsE(?RsvT4oqxL&t_DoI-Y+6@l#)vfw?Z59$nRo(yRPR^RkYa5XZhdFtl(=tD0Y{0 z9Q3=lbJ3>X{QgPA07OM)AVdPw0w6$v0^48I__umd#$A->_Sh=MNyQ{YT`VOk#DXBB zoJZKE4mv594NX-wH{HSC@px-mkRZXx?iG-h)roR)aZBOcl^InW)@G2kE!gDK<1_i( zhJ9BSMg#!>-f0I_Nam>;Sr7R(#DURJjnv(LBET$SryvM7n1BV+y}4gh&Gj<5KBkkk zx5~GC4A6)XF@kR0(q&dA3E_9{p~w&*04H+?a{vec0X;G~QYvsm*|X4Aa4CKnrOSvA zAQ(9ufdE0k#6SQuG_ z>def~%$b>=y_uPxy8#gwAy!0000cGrun35kE?l~~YSmR$Tmq|7@BN6D1wP8n zE~S)z2RQsrtiFXAdTM;iRsK1a9%_uVOAyJuz!7HBasZNG37LicyC?v>kq7YWKmh-< z@&6Lb5kF_~KVr)f6P^-BU5G6UL}g>1$5kRk{uY=)RQxKm3MfEqi~y}*Gzu|z&Y@r; zA|%!v00;mI=#=Ml8Puvy1^@yT8XXpkMWI@-EinO6&q@Fw0R4IV#H5IT0DeXUQidWT zB5;Y&s_qsYM{YtV6?bnq_o$ESv+qiDS`8O2onF>+oBC+#Rju)P(AZTS*{|x22Q!_c zOY+}3KcAQIhSvR-ySwOC?GEHLX}xFCGYM+zm_}ovnbIe~ylGIqf3X?9H$ym@^))t~ zE>2CuG?wMu)F?A2QNNaq&%d4eC0c4<)1S|#S$JqOXlTPWitcwaJe75z5fO7V8TBpz zhyo#}r>*ySwDq;MwTw2_2TfmnPgi^J@%OfSC74J7;X^0BdO7=TXV{m*05C8m)#SNp zsCV9PEthw&^yJt5fBAH#JHzPf-B|UX9Cn=-Pq9Z@4X)Fz)!TV?I}ewqTU`61tknO$ zYTx#~q{ekInf{kg@_#4zKQs6LFY-UL`#+Q2JKxmt`r+%Ui6Sa2iUA-9NP<4R0sL6} z3={U(@XVrM8HHd{g(kR#n=7AY~)j zvWg+~A?JI`DvzV-Q4i_&EvcLQ+bGYZZCC9czSFMTNhV5HZMxkl0}&>Nv9>$g-&qJm zf)I_09!L=YK`FN-2)7{!y`c!jAqcHP5&a<#^=RBx&CX5N_Fq3v%VX-p>++thb`RC9 z)_a_&zv%qGJ}38rd|$xpoqcW){Qq0)r?elsll48aKOzL6{X!K)7ey!_L^PVd$4yI$ z?w+o>OMa_e(@l23^*Z0%_D`o(>P7wFwa9Go*G9AgA}Qbj5f`JkuJo(^-!({K0>XJX zCh_S)Z2jaYH0Nx>wH3SlMx`tr2nvLz%y)E+iCS57hO(q|nunkbZB{ z`d>=2b{IljjB+r!vwcQ}+Py7XXp)8Ch=>Z0KT$-0KmZvShyX&Wg0E1kWk3KBY}n)o z02djvf17jXUaE!-TWAzTUqhmnlC2mG0*zJkAr2T6Yct(%J`-H3+D$H&(WBD!YL{3S zzq$WZyY-2De$AyBuBTZqZ_m~WwHxzX9Vc5$)az(hGt<=hQxe|lIO#ahoz>r@gmm;; zgt}C8dX*|RW;}>u&y<96s=w5;(d9aMWf`*-2x8Afgj95TNoQ44SJP2X*Fp2^YO1vL zE1aR>-3EO}Crt$~1Vl->0t6H=1Vmi}bW+8Ojx{wrTAdRXO0Qnkg!_hfK~A|W9BI;u zpVQ)&E?|YOqN6^ly!xMii^cqNd7N+K@8t3L-)|dzvg~QLdi{69Uop1*nD!=F88}cBR+&8nFvO02uG0!Mhyr>DiH1aqgRE~^>iId ztrb;nkEe31xm^19N}9}-TbE*^Vu*Ns5)t<3kzh^JFqpym9Y`8vbaXlG5@<53x)k~a zca;4OigZ7z`duE6Njjf~p%-U@$f2{wlE07&zaT&a`k#~eU$tN@(L_`EUt5CAR`Pz; zn@8DEZ%pfYIf(4aoi7(o)WJtZx+F2vG^nerRW3vcd||*TRSpOOPAy7h7}n_7)u`O6 zSyTT%!p7wrnb*`sK5sylU&f0?{ixUc@qdYEy~U^?NHGzApPl%Z*sE+nG(a_e)wLGM z`(N|_(QSv?z(e}5=9tI!eYW1q6&DV64Zg*RRvE6O9+od);o!UBk&2l!b8aA!n1$osdM&RIf?U~!RTYb*yPItS_?7-KX`&?PK_6hXoeL5uv z-@f$yuY>?GfrN^LfFy|^fXJ!C!9w$Yim#pS=|~4_^yK`j<$e)y1seTSjo*jKzvpt= z!tJmhjr4we&_D)jQK!`Ed!5CrKnBxwHHid3h@U_K)%TpW`SJPi&u_^b#fKdeoLf$D zcsx4W!Y;ITiZr)4G>=Lc+m003hV01D!i4uRbnTM^K3@hX-Jg{2C){^&)rhr*V9FAs;rqK+h8 zJl)dm)L7YJ5eCC@laI{qY{weand&8Q+T7dz*=RYD4xpRpZo zuPI{13_uR|E4`Y|WHNM@UV9b{OaQC9`P2yn1dEAclJxklB`L&u@#$261PPgl0svz1 znB0=806ERW7M4xiq$3-QjM&-&&3xoWR$*|6iN&7YAUhs)u}OBO6xkHJPPeF)=c{NI9A=vg?P?RUG~ z`u@6KcQ>0_-PO=_knA*vIQ&l-`JzICtm-<|BD2-PtV+L+6X~YpeajYCXn8d%Znxge zhOJ6#L$K4N;w;so<^uI3i$@~x4kH*hutxKOp^xLqL|0#iS zob;)J@tRcWkClOSl@&rnll~nEi zWl%tX18G&Y+WI+Mt!A@Ttmjq!joY18=?y?407efo4m{^L(;VYWcV}+mGW3~TvQ@`v zaoS}d*^0z7PGt%Vx#bw=(NUnNs7nRo`9k#6A~rT-_e!cLvAdkEcbiq7sN8NeA8#)q zqGHeY&Q^Z@Uv`r;xpn)WORMx#tXZ_G$JHrG-QfR!-`mDnRr1R6|CJ<1fbngqQKb21 z|KzyT{hiF7p0Q?+&*!juKI756{a^S$d+SwEU&B%J8~XI!0I<_5RE5uN|u!xN{uRx@0!$W z_8SC$+V1ilz>_f%Iux>8lPKzOFrt$amlUcBIMMF*MJF{gy1OL;t5=k{iKH>XS1Oj) zR3SnH2Vb#fQDeRfS7%Xi0wN_02nFrm(v{thpJhFre!&&}R>qM#=Z23Onor?pvCw5vlN(c*t@e~0qj|GRa* z9+z9Iu-5f;zvAK8?tZ8KQ@Qasul|She_Hn6LoNTI=X_tF2%@X!!2xMWC+7LMa5TEj zuPqXX6=!Z)rbkavO{q$)Kpj_Zukfm^?Zc{^yQZZKKo(mougOL|eFv3=beES_y1l4v zrb|&0W@@lVi!aUvZ{qopsYK`UbC-Iq*MO!8_KGbb~Ji~Hgs%6 zU~CdxT>OYdE|2X>&_Dno%m5;fFm^R!ha$t&`7{-J1&adXOSFa1s)o_1M_Z{-m0h~H z{CbI8-B6lLrdzC+4DC`NSg~WAQ4V>eDl^AXXT={Ly*I@#Ix2c}{A#@QJ*7UrhL))` z4^B?iDmq>r>U#X8Qo16oD5&eyCT910SdPMoMuiHhqkSrwddj~)!mr<@^7?eWuRpz= zZ^E?_9}Q1wJs;<%yxnZIiyq@T$g)JJ|5BnyQ0hYJQ40%&s7ni(5Ck-yZC006sP*br zuQ3856ODRFZq)X*U6tH*p5^}ZAKZ9{&i^-&@X!9sYBwKFv|r6lKhEFuNA{f+{#GB3 z9V0TQU%6q;Wa^o&jOg#HSiSowAIgUq{#3F%AGc>(qQyYj`nw<6s;b^*;B88p7aHU! zMKd!0rcsW!QLRmPV^>_6Hedm%*Y(uW?RPz`qKk+E0tzFrl)Vb%Ac%nwRwt~KBoPr8 zR^!!C;=8S`x~cX*)*<6t5RS&Pu!{4cY0%{9szN&bj>2Q)9cojp)$28ton=iT^NRo6+X^r)50^$GCTdOk_nWwt1W)a><%#k;h3)2P>2+xF4+RZ8c2#G_SN zq)bh^+_Af^u8*}_+3e~29`(BocCiotw$IX^e+Pfw;BLOfjOXss z{{L+ErG;LXSLxMiJN@<2t@qL*AO%8n{~bodSD@0Y)9F4)WDONr^yYFsx4k;w@&Xb2 zw+Y+q{TB|yR^l~h%|xM~zk6OXkpFO!Q4u%X!LyIsod@7=1@FOy(Jp04bukqzJV>-+Vq z8%MoXbv{a_A!AhN;5(XR$1W`z7szOkjSuVLDs(oBa6c)mr4;Ias5JsXC52 z6eB^Qs7o52ZCzTG()}cKeRW9FcC_ef>6StqsZfl~Ra#Yer>xMZn?0R_#)V&|k4ITm zqgS_8r9&59(k2?H)7GL#tm;d3kmThDNR}Orf5RJ7n5oRJ`rGr!>is)fjZH?4XL74n zi-wP5sMcv!aI`kRfCva<00<2tu!Ep=WuQ=whGgi1t7CJ}sXo3r4Rk$3ID0hcZe{C3 zOe2@Ur~0Z_IkFWBB>{KW@KGdH>1k!H+BJ&RReW2Tf2)?V01s}L+?H;;n7JrN~^xZZ!z;;Xb6Y zg=b$(NCZR%KF#Ch@_9=aIW`UHWTUDbIUmL$D}@QyuE8VtyWT(KxsZ`C7yL{8{Z#-M zmpCSlcomI@BfQ z2#D838=J2PRD7=9ACik7m<6TyC~_cC?*H;okHHFJ@o@k7MqIu({mAijc^(`;&4bK7 zAr7PWJ7&&~pNfhouzks3<=RIR+wS}l$%_}8;*2RcxnIYT`EmcBckipf;xP^03}1;4 zFc}mhH^@b)Ile-8ITP#hfBS}EZ&En~mdotJh^vxMMP|nPsZJ z((b>{T9VB2=x4g6%>F+nKp08H3W0$*K za`-Ot!Qb+C+XmJhI?Tiqtl_4&i66qu%Fp2n3UjhuP>OoWjT%+{D*RYnEn>)Le-@1} z8r^4;sa?=mHaXpV85J1%$A?d$hC}{8t7dW(ZyC{arAs&mYGF4LPb-*b{N9jWAz2kJ9OauXMlHAkKgj~1V z^uRzoQ76;izhAr`a;slkHZIbQRqUeS!?pI3s|B#T^%#or@z`faTKbA8qLy_OQE0U! z<92h4N!h>uh(!K}&X*rOtK)W4Z%KJZh-)vFtLC*JP1J0yZwU{Tq2c$N3T7KUwGCeMtSc!Tb6B8JU^pnVFwjW@ddknUyfgD58pg$}xz)A?t~* zeAerKeQ)pk!G2tucDG}(|9lre1{*1{`|^B`%fZNcj@n0~j{~wrla+1o=yqF0oVn@m zCzIiNSU+vAS+N!10w4j1fryC41YisdMB`(kTBdr*ewd>`z$~1dNN`Iftx&dZkxGFU<9Re&vil?cdqo`hMCqYNt;3>=1B13DSKJ=IZ2yN?+%KnYUw}pq|AN7#^?17> z)`M(>BK(9R@PsqFqVd|jYj3*G*8|wsFXQwv8wAg~3o0KYZm32F1%gY%yS@Q9Oa=1+ zf50n#w;q45u|=~1+{Shk>u&R#?8<|?dGApGKoFt?3`7iI36Sy5H~9%g`VC{+jd?DJbGp zseNtCMJ7upluiA3%OQIG@-rE2_Wdf-=J{!JVJDeOaLgS={G?Li{2S!v@|nahXT3u) zl{$?7R8nTV+|=*)`Q$HWsY5ZCI+ouO6d7Zv-;qXFfs)ImT#i>KlFa2+c=FyvG;`n~ zu*w}rJU9eJk1|XE1U8kbw)<7_WOm=`{5tD`+~>1~g&c0EMf+}qf8H(HeY`E|DEJ?i zuUn(?@RqueyBGnb-*u~hHI7gxZ}ES7-S+oV(j&;dr~}F5_4z)3*Uf0)dxIii0f@lF z1C&P{WQ@F1z3FP)`qhIxbrxn(oc+69wCFNg1Z3H7OfyM1>z%sG*+rHKMIjVXMWQ)2 z8bi6rWpdPtGGfJu$SG!5@In~%(Ubgr-?fJ(s^1PrwNKpe@BN$(4~w17&*&+e+v|A$ z4El;{xyYJ;8N@$8Qlb(PE1H&B%uaJT%)Ik6Yp&d!_Hi^LU9Q0MbIQ*=l_Cy5GuYm- z=z6&VA}6x~1OWwA{uNbK!?u^)iQjHmkB4nWOjyD$#H;e{Qf9MRj_aqf*8fSAr0;i{ zE+(b`yZ5ZOEmdYBgLCI`RsaYQibCvGJ06^dKca|L?EQxyqKRYALw85%=;oIF5&q6=mq7T!_nwMsUB{t%pSFPV~^A&mBiPbRor( z57M>g|I3Q56&LLl#YH;VD!#QQN$IhL*t%=?Otyj@jbs#zjP;-u?1tJjv zp+WMyO$Aj_uiW~+f1O1%oW7Qy*ZM5gbTw##{(JgO5}G4-|KHnDs8NSM+v-hc1NuVG zBgX&FztpUhl!}wlsE(oeeC=8qc=Z*j^8Efjs-DluWse77CCPAj%%P5>GpS8wZ#@gE zD*5Tb5FkYS-2J9e6b3sL4`&rldYwk4Rj}OzL4K9GRI1hW^f-adRk9t7Kq{KfKgUX! zSAX#oY}lc*AXR#PeR*2mztgL()@v3z{SMt#_5WSo|7W}G*!0*|=rVaN0)r)~^uEM7 z!gbcmLBzsFAZe9crkNUVRc@Ux{`%U~;5`TZH|=o!7nAgUG(eF*bx{dIRQl8+1s~_c z02EX8;;14ekVF;N@6E|TKZQT9>-H~A(Oi;}eAo=bL;w^Nd@cMSujGOCzr};leq+0z({a1o8cP>oPv!=&i=}z^t>it+|)5?it z@61EaKV{%&Y(-kO>KK!0Y^@?@>@cZJ@;(I&nAb!*VV#j@zDUDE5{xu3$RS!fIAZbj zF~K~LW4c2v^O-$=IE;86N6ue<+(Y3Pw5Z5PMkHvE%`m-0foedyVdp}X#!t8qY4*R=@aolwt`wr;ePM!OtEHF1UC=jG~#ou97EpxO!2U zI)iuapy-I6U3d9+IK#;0tzv`B!*VrZ_P#WLj4%w$GG^y{m=7V(81CnPWH*c+PA6U) ztCl!Xr#fgkVQH>*tPcaObnp$S&AN>b`g%IgqNRl8BmSeEZJEd#!j|+S>A-xx>*R z4uJl7gWw!H9s>t)5ga2J!Hh;R4l%|?TA$-G%DY=Utve*1X%X_O(6-dEj7P#~RqG=1 zD!QoavgL@rmo81H>NlQq#|Kf=2U-sfjP*R{ik}m**vFy!EC$~9jm#WpZEXeHwJYiH zz=wI~J$l_Hf$S`XSz!<%8+rFPMo+488R%hyT^uzU#nNlNgr6pR zGj&z458xhpf+N3Y(2hteq)nwCs&OzB#UxO{Dvx55-HlUFRZvvPNi!vC){JN@8yitZ zf{2jCu;kE2#X|)5^~0zopdO5AMi?rJB%qq2Ai^gSgsOlj9Kv+QagBrBLUYm3RiY|3 ztZ64|8mnTkAaQP~A>2NX0v7Lp5(?r4Pn+1``Np2CNhizKUR`7lA?c>A9mi6Y z;=>Aj`9n-m0mCziuOfpqfF|!b8G_fo+vsN|A zPo+?r*aYr6+&m!e?43skH(ibVQeVKBm{Rxl;j~nL!3CGkjh44CKQKT8yh1@K&)J-qgTGi zcwG_E1eFABB5gIZjj^$|4XoJO+U`Y9dWye3d}TlZ$);PMF%0X)*Gd#3QV39jH7~gp zb)u~XimOniQC9}n2{@;QS0h5e!YU`D?h1XyNJ&B%GUcY1Y@`y2LQ*JDQWZ)xzl?!2 z0aRK^6<}4F#nJ>jtVs3dm?$~6#SqMQRR9LfTbo2W5myJPHB8vBK)p30t`_iDX)%rx z>%zS8ESkM}afPuF18hKL?;uK0mxX^7x+bfxw8MDrZMT@bt^GM{r(ppxG*vp`F)4!lHG$;sbt0{p0Kf=5d&U!w5;9KY+oPGwi`bE* z5y|j9nP{j`RYPDv<3(Fbt4d9(R@{c!j8j63ymV%Vmg_HH6mbcl!V*ew&nEmk&5h|8^n;IWjK_UuC0a7Z7_3a3+KsWpeD}52QPjjYt&19f zqm!7`Z&u;E^(Scx9b%!D_9t;>>J?mKTGknR?MP)8y$pGlN#KCf4hvQ_Rb8 zvYZ%Ga!I#)c#?C8Ox@6oQ7Mvhr3Nfna$4j7^pf{xz_TorKFe7dg$jZqtK8i08w!bK zoxQPqUoL>03 zk+kx@hGnmn!$RiJ{Nl%@eIUOU*p-E@oQ|a^;H_Hk*WuX<-&B6o7NET=EN* zH9AcU2GcU-PQYMB-An@>=+x|;L28Z}l5Zf`9L0o?`{F_pdz6q#5WjNK8v5N{cF3tT4fBRI*B<#VnOkMHyfsQfMYvCX@t* zL>*Em`w>=HMkx@nU$T`kNQ1Vj2>pZs0zp(&U$y?N0Rc}dB@i6d0xff_V#TQftQAt( zX)K6>Es+pF^$1xMP#4t+>o8IN+xnou0H5y4eZ-)B`2GGAQ~z43s;a80s;a80s;a80 zs*oRz|9t_bdKsXA8FJIzOxeG$U%bzsYd`p|{=`K^5#NXkkDmciN_C8fqZLHNu}l=nGgVa(WmVHosA*ItLl~r@ zsEUZ9N~Vc|2#R+Tw4L7R-QByOL$`VYs66VbilX|DQ=F){6>vaRxCLGq3cN5CczAd| zp9cpA2i$P|-e3`R#YeRfGeA@|!CFKVHZh2{ODzJ~AV_AUws|EgSx^x|ArS?n5JlGz zb&y1nDFrCBktTtqHo>DoKw>ckI$BK$OO2CFu}M_uNZ2)*HnQ6kn`}m!G|jduhe@kV zv$Ihx8mh#_J4P|8Ek<-9$w%1P0RW{tLP-iCOhr6)0+33A5NLt{W(gS-rBW&8K-6uC zD4`&WSt0@> z)zwg{17^8RQAmYjNuobdBccU@Io$QE16)S<392|Ff(fb)7-4{DiJ~FN7w@2Q%*q6c zLMTY1B7-2Z2@)hAQiTvwK{QNKOH{Q*3v9JZC8=sEDv-3c7EuyWOcO}ZBvg?VKrl-X zRFG8DRWVT!5KvPF0A2*^N)$bzyWB1kH!7}bDTN}wu5mdPr`RDo=& z0@*BBkgAeISgT4?A|O)}5Q|eZ6o?X0Wea5#lG!bUNTrY|L`!X3N|7YC(MwXIB&kFo zC=x0t#seY?2?&x4A}JE8$t2W>1XT=xrB;-Js+J%vl1V9HC9>LBTOuWq6>PFl3u$32 zRI;Q*t7;^LwNj-)X(Y0cw1rs~qT4D-D#BHPRzj*sRU*>aC9x&8$SGi2La2(i%B50T zwk4vhmZdCP*E_E0T3w?G&3VgrBDRIL^RS0Pz4DR zr6@>8bL&%5mpga5)cxlkg~{-#UfazWkO=W zKbY5kcv3@t95RFnVwP30Ghz<(q3H!Ao=TAoW5G^ZZD)Vlqp~gzDh|od05!v0O?i|M zM^sQiD+E%JMHC%yKoXG>BvpUM1whjTO*FcpAgairAiWK} zb(IRS6T{r&l(Cv&X#={3^jA|Xk2q-2QL^}7I{Xw3>2@w!o6z3qp_*ofX}`ZrYJHqk zKT-$t;Gl?WU@D9P0LTC)xT2_<=|w>lTi_~yAN#C=)PhNAArQ49Ng&076A3JVBGe*U zl1RdY60r~fp#>EyBo$UcRb*8r7Dz;^1cb$a8d)SEiv@~|gb1vPFA)HdDFoFOEY(3C zNamM^5#(dSPVaFVnFX$NQY{`D6u4ek5VD)`uIdisuI|? z5><;;OBSXIMr4YpW~!oEih?TDOJxAI7RswEk{$LiNnl`o-A&-Aeo+)awxZEv83$xu z%1IKsuOQ!To;_k(EMA-*qBeutFatIxk6Zfi|<&|uHuHGM&-Tr>6o?Y~S zik@6R97zy<@&E|;d%fC-rujQVk#h z*Qro40jHN{p%7RUgWMYMv_ErhCtrj#VbEt5(NOiE}dr6>b3 zRRvKqRZ&r~f~^*5(j^9+Hp0?r#5&SemLRKb0Y=+JC@-4vSkVv#A$0-=yC|rL_X64q zaWF65*M0sg^y9)Qy%Yt`u@yg=KH>!AAbId0`R?y%=l#1u&}ht5s~ECi!HWheLlp;4 zPm|+%y4z%oSwBtQ|z5MEweDhNg@AZCC78K5l`0s^A6iY$n#qd;L4BA}^ApsJUY zC@2F;Py|4BtN?+7IYdpWzW->REi)!$GBIRn?zc58fQbi6hf!x8r zhkq6goH#_2^6ZH9DGsQxEfFfD9}nU5NXkW_DGApQlNezF(6uF{l1h~XDP$;AKu)=c zlu$wlL=+?lkcz=#s=@>w_{wnWZmTqxBaZ_Og69k@#f3~NGe=EEl=P(|%PMo&^2^)X zgI26Mc`@VFlOiDK1N3Mp1t16?a{`fyNfD4%MN_AzcD6AF5K+~oH4*=E$Yb!>!O7~V zv>l_6oJ}hGhnW!m2X^;&dwX{ecV^6D=YT1Uic$;zECCRr5DhSFSL**hy{&(n)LyA- zpZ352#TWM&r2+_RiusWfehP%%P4X!uYX&p|u`3#rlo|&@9<)EIJ{E!X^7ld?MehEG z+VXoiF!6BW6c086NCUW$RiyptNXQH%f~~fv`&LOBMFprH-?zg?i7Z$rd#-nj8AQ!Y z-nx0pw)@dow%)2ZF&yzzJY8O19eVNO*OM=QW^TsUb2OD%&t&o^d&Hk|EiEvT91A0s%JaZDPWlE>|1UzADGf+gQ{5>*k_127;ieb_3Oj07G4~iHf-U~ z5RtHrSF$2vvn*no6RGiI}0NVD)76eOw;-C3HtbQ}aX# z#>9Vj4jeoj9QicxaBXdHZE$bz?jgMqA9(=fgf$Z}6;f;NBS?P>^Z(oavOh!qTgLTO z>gwvQ%StLlijOnQ9clnn0*n>nh0Gf7(MzMUet83A>0+1RR2*a0sJ{f;`(?)+=L=o-ax?ymWpOo6jiHjt8GbZs*aj#L8n}|a_!B{ z&Ax0(sk9JKF+eE=83F$!M5G1n_+s>hC-pQT%_;#R2l*fm%!t4JBBhW}kq58W>(o))^q)XU^M9eT<$5|gF(`(UC|negDyhW8(7`(-gkH>y zUIsvbU~b)}?g|(-Y{jzNd>I6HLuvnBwK}=^``s69UQiSCX+=kxG5{H(@hA{mn6GRC zeLudrU66J}*|LreUTPwvm%w(#SECeq%_VR^y-?29Z|f1(iLLR{X!H1@%$j=AjX?FjL<#s2WLl07mSuLX9 zb=>rerA_wjjc_&=v1-)uU5}ZjGDZl;4%b7hB>_SI3C?|cly{u_r7PI3*8?>^8IYRZ*D|H z%!2N+QV|OP69TbGwuWXXf?;{&@|ICbeqJQ^k-f?9&RSaZ^+on7mM${C1ZFoBpig@S(Iye}g#{V*0t+1}qx zqXiXFSVt(8Je`z|qMY{T`(}KP9g%UHT%3l3=?pMn92^(slq)Fevx+F_h5mF2{5)VQ zf$LG)&SweMYy*5RNAoOm8R}T)bhdiU8DY8B`f@p+tZqINp~&fXnPRm>n0akr5!%3o zFoEhih#i8Z7b!u(ZWR8#vn;ETgp3VanPBK=$}}~muh+bDTY5 zeK(GuK~$)GVv^Oaaq!E@1{m9OQHU5DZJZ;6=4;g^dVN$#oX3Jk2CgmanNfvnGT^PL z2%;{B|^2kSC6V+-)5%6EH3?H}Q{Glt{p7KKm z1$8@{mJlhoaUjc^5+x}xaOW;i=LQHN0)qRl*Sg5?uSE^YCi>5Nm9&$5k0+q6cYu6o z^t+Aa_ZOG9i+jxMYZH$ld+V19tb2K!)){2%8HFMhA}v!gM?B?e52T+`|kiI1I9srmf8xXu+c>)y%>*WOF*) zgHwUQva(jLm1I`TG;vb6JO)gvx4K(6Flb1uF(n8YoWMCHLKgMh^7eHK+qRj_vO2g2}!6^cR2O*iIh$+%?6) zL1Bm-fn1@XOv?ijW?G7*2@+tr`KH5&mI?0)p&_?+!4O$-G)Ui+Tbn~t!LYzw$QXRa za!qv=5ao?Z3Qkm1DFQlc}6rhW<>lSYj@DFO9R+ z)aGU}m@H;ww;Y7!Cd%v=h~_X&I2nnM#Ef;ORfMH+WiXeKgF?103`x-4gT#ZiYxVYRKa8Wpt=i+-JLy*%t214m58k&v_ZZ?-X2?-fNPPz3SzFZ@M z#ex> zeY%67;u{30X<>8ohU6Jp(-^~6%JH>j8n=|u$jgGayepT1vysPF2B#@Sb;H1?rDr>v zt<2zP;&M|)+;)ozNOBvCD_soCIDz0}t+czU42rOskf0d2f`)wq6%EPsZ!;y|VTN-89uEPv%Z%;WVQkili znWi~QG=~RfR+<(F8#XA2M^J}w7;n$e$Xm8soDDUg=&_P^-yx)*47g@A44(3oi&4Pkp?OzfQ${0UO?(&SIY@5kaTb*xUiW)Js?&90nU?9MjdWp_tr}>q zRbUMgJ5CQYI|xJ=Fk3a0_l6Zia5}Kdpu%IYUnAMBQmU#+U5N9J_T8A`7c7m3IDVvP zbRgczY)*prJP#^i%C8GX_kEUJ%sSd}clxgCNa2uYmDqL$J1?-2RNy$`OvO(AWS-8| zr1KCJOc}C9SsX?%R*r{Ga;%$bB-$7ZlpZ-5C{8j|V{s>7(x|osXpN;8KqDhji<=zU zIdkrEQe4`04&PH8#$}5J%?Q|-)MBk$LU$@OSgFl%7PfS&wOwlGb+HCH3kSIBB?OAZ z4ve62(fj2F@{$sAk`HahOmT=L=NK?hu;OGqC>=03Lk+i>)irYMjB=|jA1G?eE>(RW zlJJ+npBkL)a4Q&OT!aih(CMdTf~RgZji+3qcbSe{?hrxFcffMW=x#esvIpp)5*te* ztYj_b-NiPq0l>d+D`XiN72A;VRAq7y{71nYgl=PC!9~IW#vn5`ls7EN7O8F=acngh z@D6Sy49v`oj*?PZ4a^Ttqf-WDgS4Nvq&M_bbEWd4bUHK4sRXkfT# z2NRg>7c>K4$2qjQZi5G7o}MF=u?9i3Vhe2|co$jTy-xGUuz36?1>M$WQxlhwhO0Dq zBz1Q=o7y@%1!qybj}G{SsqN8n`pyjVmoFHv|?zHtYDk-0KAM*BE!rKZ$y}6Q6TwpQBs9c zaS#-6i_%h5Ad&)014^KGh*_6AN(Tm$xF~~1fz8Gb4w2){*bl4d>~QGj>~Mh&IziYV zesbt)DJq(16et`_uV@*f>6dtR8!LigRjYev6AfMGk*2NLZrr6p!V@2F$?b1%98TfJ z7(zQV8@_$V2Is6ncJViXOa_f^gO-*X0PC4ehW_wnArLqP<~0>|g5sO-%PxM!;L+vk zY_7LUSv%7Z9;fyv}VIOI6x84~ES;kYHLF6$v&Q z4HFHv1e6dCB`*=&+OI1vW?ihNIIya&Wm&7@7)8#s8#o+R3x;N45F1&CcsCp_QcI&# zEC?*nb2KZ3g6t(RLKM`)IB__v%2J{!DjCbpgCPfj(~x&nb0rrP+@QE8lzF<1ut`ji z%y2L`gJ5r*Z)a7bkjJh$gA9PH<^Tt!E%@@wWnk>QPh}t zxV2*|%N=c8&5nb_DOHidRU5=I+$_t37&Hy%12PSrDa)|SBU}-?!Xo?Tc*eHe0-*Ug z-ff&Wo6f`=2388!LotR91xYAU$YspN`@yz@SvpzCM;`?pGYyfMgCj#DB83JD7!5Kq zGc2X8cQcY|5|b7MXSl-`7^-3snB#^}BwA|kEGtbJ$I>w_rJ*MRwH_Emu?!??D4OtFR4FLnO&|rdw zq>fc=8Wr4a9mo@n=Ltpv3OTcBwmpfwey1sG>UIsghzIC0WyRw>E|!wK6`bhrFlw>I z$m(xp;_T^kr0Z~WE5hfL-|x7#M%{@koaH)|&gO4u=Wy(<3^K{HbA#7-Rr0r|SAEFv zJIJmI%<3T9v_*t$^HH^GJ4-lsXr!T#?7^s(qlR6Hi0iz}CzoRB4ux-E*|SA_Ib2(d zBDO4OF}#ylQe5RORGMT7)&~a$7;;MzK%-$%_#6SwJq^|)i3s83WNhs9`z9b^Y*j?E z+ikK{mbn&AK^`ZboaT{r|H<&J#-SLh{Xe>}TEUcoMlukUpp*dmv4H)wAD$5U*q}3O5olVLp=_3-e*UBKuacyBC^%vOa6xz?q91bw zH)k(*qMhorto1$BUZ~F10;#^m&kWN3!^^d9)%fMSQk}BPy#8BxOky*iX$QBdaInEo z&m6(9+G<}k^3~(ve}Ca#(adowOeo2RS3l5b7i!1%1ke$f7Gr4k%*a*kxaIPb zVaQa@y8|@=mVh|G)B=EBolq@U;m^RwXnvgY9?7%|$vg=_;&CJ7xv5;U%Aa+k5%#uJ z@8h)eZR0!*j3MP&r)&6zGwGL^QHbp&;1B`k5$-$vi{{+FD}BY}d(S7+Z>YWg-gF7u zWEgL7G4{QO53_trm=s!&OZ)Mo)dEar&^gmkbdf@#dXV87~>N;Hy1LHpo+4@xv;+l_oDd_^7 zf#(N|%ytey`-7b62B&=HJLinu4l>i2p<$%xHJ*9QVmzboPe|;aes+#x;}PeNP-#y< z^Sd4ca}O)mbF_9nCik}JZ*;tmf%V@#+||(dPaC=9Wj=E*myxs1?>9I-C%o{v+c{rd z+WIZcoX##UvgBy>-utcOd0Zb2#mLp|y4t&(uOR6UJE8ZlfcBp)`J?8&*GuO)pMdq8 zTn=}t`X| zpXfwCu6#QYDnJnTkHe!vf+t!cCQ5aPAcCEWg#1Pin8U~e=i}H3d!>DT!1r@~e}?DH zkkRQtV1W3TJiJUET%UyFl41BbGwoo*-Gv}Y2op2`4E0C<2r7E&fe`x_+t(WiSr2Jpqdjq<)}$PKSTY`U(oaLB6oTrgi23e*K{zl z&85dCsUi)SrrIjEVLhelLJ;MBa+wi0p&ffx8gL7iY54DU~(QxRKD9 zt0ztSXPG^;WXRu6-L_|!5VMmFG(B^<14U`{?9dTW8 z9dJ!hc+u%UVGp+_@)7PyBkrs*O3o-;Dq0!?5|1M=zun5{Osug`s}rL@P?S;@HrY)O zgc3~D%|cLgFWA5>0Z|D+pN&;`^fYzQF%vWuB(X&_421zBQ43Kt12GWXmp05WrNay+ z6qRB>0;BESjJN}DA>JYOr!(IOa8qQ6qKKklB7rI~%y3~lp@X{?j$@n<%@kRaI40Rqbt6RaNa;sw%3gs;j@+$118StK;oeRaI40RMk}#RYg@*RaF&56;)ML zRaIXK)m2qhRZ&&uZBv<65w-PfEt*>hzv5}0dDkzx z(|xG}7US1La3fN+q;V+8wzf2KP-}Nop;S1-)f*{+uOKx}IW&yKj#S@jFyeI_3%tNm z)fEN^iRDN2k`Md8i|iZI{#^ryyZV2DPdE83-p?$D^8aJ(eUDSFlFBEt_$R=(D``gp z;@Nhm=ly;h7#Lt-A%6>g7JnT1AcFVaGOI0+v`pDexAQdJ%sRZw_9I;tpX@Q~F} zOGq9PJ_`p5X=So4C9~hgBGGTZP-5eP(jy|D4kCOw`LMB21Cp8iiu2oD6teG&Ydlc` zK3Bw+ta_E1^8$qg=cqV;UT1F;X`2VM%0FpD4TA$!-H-MHFS!N^KO{^bjzpYDgJkzY z@1^JDHf9Ya3bx?%wfUrzYlHMSw9lhIwBLHR+nh)+&S^|my!`xeJ2S7y9%F|Z8ZGas z1eFRIMfxOnYk57*33fyKq)=QL_T7`^Xun%-w#in@cSNqKQ~TM zNc;)?IPSCL{9lVw^%F_Ett$Z}2tz}W0mT#yF;fgvnhq!! zVurY*iy(>~I4L4NOi4V#4sf_{pEJHy?U>vP@dtOs=iztC>#pKAM_nBpWo8q=I3?%% zX!mqU?=x9IsXDmi88fH*A*SV%>LA?d>$ z2Kd!ITsF#{<``Ugl<$8c61@*!Cfw=is({hX5_n$Eu zeE84HK2t{Gd*-OxF8yDyDa7ty((n&KO}jDX@~$%Z*_+BKI8Tq4;ru#oC_*S5N1A!j znTQ4tclG}eW7vL@ANQ$z(G?F+N6!CdNkCQm;b5>^Psp#|he%yxq+m_AfaTpNwzPbPziC6<5z-^)^%Mv2Nl?D5e8et1+ zJmi~p0q-CV^aJMzMEHJl;)h3OdA@g%-JM;+Qc8RpU^N0wg;YtHHcf4XjR9RXRPNeJ z`)n=F@B2x+KF_h&r?27nV2Df)1F_cWW%!J~d$sgmh{Jot*uyM26{=-0Xu}GldkvX! zaaPS6o(3B);IOLN4{CcSA za*ooz+PA;E>Uqh%5c(+?_`hWzqM|-6h<_bEn0N=e^FFUX)V{cTx#9SybLBlcKI#iV zMlk!4Do`GC0YlM@F>=26-?-)4ep|(aw+<}T3GGx0N86tHigr>7YL>DgMfJ{7&o^-Y z%pJw|K~sc2M<=v;2Ptr$M%gNK`JMr<)%UC5mKNDm#x%=J-EO~lZ~d1J^6XDQ=1FGr z1odASuCg87=iqxM=DsJ}eYe|q0(VHiVe=F4j~s4TsphDRY079Sfgt+X{B7=nKO$6p zY#rZPfl+S)2m`fio$9-1U3J`E1J6C;?+5`Eg4!-1Q=tQNUAz<}4-CA3`92@3JYrZ= z6WaK*XtT>M2MU=hfeTW_4*-oW4`g|$?(sm5@^#)Bh&0g4+U8tU8rV~JE_xD9eEGAD!TO}%Z!Ye5R4KkTeO;Tv0eebEX z%*9QiF_v<$ZfsF7rijfU)8Pz(OFo5G@eg?N2FMl(3^_dJltpSApQO^mU8iTZQJ{D{^!lPA1VfWW!oa8{+wq7!`2gu#tQ{8%bU0zZD6XkLk|SfL0Nk?llg zLmS;`bmh#|3pZbK*h?&JNK630t|H?DWIMnS`NcN9HtNhRQzAuN<^8iPT zVIS}4)5h^8!FWw;bVP;}aH~B3K7qX1LenGKJ#q#`wgV*LgRC~&LB0fVZ@sGf>uv49 z&Ey$^Fb?`%=9DfN%)RJ8y+Z;uOddbDMI+Lj8M^tiI`0Nv7hcOOaF8M*`LTc$q!Cm?=m69N zcWe^=vX&*ArxY8C^{6!xCM6+op6>p0uYm&-a8RI2$X6OF-w{{wyj)cLo^Pk_dF$=( z4AZ*4r)Eifr{w6w8LJWlwRiv+aax3B1XekwmcexJATI~M>RuMt4~Jo>6= z)y1GJ3^5Nrdb8D!P(w4s=-=jHj&5yUXF1LHj}Q@&2~Yx32$LM55TZc?ye}F6ln9!l zp5*WdlK1cTEEu9nt%D-MQX=JEhxRU75-Deb(*+X@!D$&dmOeMI>5l>Gd7M&If}Fj6 zW}sFy4XlpZLdzrxB#5^_Id;!QplT)b%8hJVjkXA^RYA~Q5ixm)QSw(Cf-WBKTbr9- zHa=cln{IV9i0x34Mlp;T2?uh)gbB9k;k{aDa9Unj!vdorP0J=B!?v6pCBlbn_g)GJ z#gZ6HXGT}The8A>C<1f60-v}wx!}LFYPFXiyB%4JfLpEO@skPD3pFdxF zaWcd?@bsrt@JyGi@)XuVq)n8X8oav9G>6fuEHT@lE@2c(ow0y}Hz`7;#_Zk^N?5$B zBB>vk;xkRN=zC9T=urqfe;GJ<WXCW(Al2sdE`UO2-HZ}OO z2M&%4XO6AzdO1FWj$y*?_VmyYx-K9MWF{m)U!ge=jzFn_cmo2-Yv2unq?wlqS6Q$< zGO*~RNiQGM{@^__iTwC&lnqw~`W))D|>f|#qQp0G&9v(jwOT+8nqDPJM1fVYih@%K}$CdJ6{24hLIY)*h z$~PvH1vslEGL2!+0sjHV>w4Cr^5banv`7$X86+YQD*@xJd*C1}U}*q$?e;(miWX8b zX{MRH(@iyc_dVA@*9Jq^7=I7<-&yVYos<~$6CR;~fRxbT&{B|7-6Rh~$k(r4y;`*5 z?s|E0fO*hOphThy*YH?Ws#EbrCJLbxYwvsB_r0P{{}|C4L4hC$3S1-*RLMd)O%X(p zo6FFZ=bm=1H#W~B{urRqMUfEM5n%`h*%4N-O9&K-C8Q$MMo)|RmuS#+Yf;tkX7v8^ zP#=bOd%fHMoEu?4%C(4kWFrUJH@92Kx&F=bK=t3NXl0(fHJPfRQgygpc+&*t} zi^s*qkNoCWR~l!OB`3MY8fmA|mk?6?D=-wquuJ#b^_(3C-ge3Fqn-HdT;}3I>T{17 zy6w5PLMlGWOf%%`_C0moA8&k5PqEK4=ywaOop8+0Y~<(QdHfHkgSXu0pSJ#&J6>#h z2LpOu_Z*)#KhT4dOgEz^b?$up_9AZ|-eX52$I&WMI&3{(SJm}yc$eDCKn~6uM5I8Z zRIW(9Em2_00jqDDdaS#xvQU;k4Uj6+d?f=UpSNMIxpg-|zJFhP6RaeNP*=R0ou zfhWJmCxOk9gO{lX9%GZhifQb6+&sSfuHDyAcAnd}9{A-+%XjCl8QVcOTtF)^`YQFbG9hX;nnrmD8wxg3f)@Nw`iuG=#;K7V&P3|p%l z@!b*UbY!ksgzfB{;RQEa9y!ev9j>@MC8r^mzT;8M4+BLHoS!RV>sl1yu$8_ioD%z zo>Dn6rWC4Bt1vh-BC4pFMG^Srvh%PDGe;12nIrw)#GkeK+kp^YF)pJVzT6lCg`Ta$ zI|6r)3Z!$P&F#LelL)F9f7^M63YW3D?>7?q3p4udzEG>n;2{=(%8X zqEaOk+GDSpo6I?IH2i(dSb91!^knGEm!s`7Co21rfLDG0PsE_Es)y)@<|6MXg4%*7 zjWwv<$Q}it9yAaSjL>bg?0pQoWJy#nS%bcLE5fQ**RLUwWQ?sSgcJ!3dWQmGYQ>j^ z{5@V7VJ7MpNwhVwCvg_GmJNhU(uEW;lM=L|BuRQ{gL>35NPt7g^)dZ-5WW2zGL&l= z&A{x`=#G54Zo9MD!PD5|{ok+3o|>txTR@(v=ad&Y_|)ywMzV54mq{rv2cYBlA8Y4^ z)*(#TJ3__iGA9aEF6KewlQ~JNes?6VWl1WbRc*D?>U-^=gq8fG6+>41IYgZMN9z(S z@7_?rhh))r4|X21Q=%tdHQDuW;ltR)hkWm_B1j}8AVLxg41SpwOrHSrhaY|N&I#E% zs0ta2+7C$7h|+7iLF6OekqJBl%Mse5H39UmOvt!HDF`1oG9k>a;s*&+cwPE&P~|M) z-QnE0Lsu3em~mATm>@5jL;ao9!U&h8neI0%qLx!-z^)aD1EMh&!35yQLY1T~04yE_ zc-DJ8oiKrWXC)copj2q`m4OZRcp`A_TW=Rz!-LcG{a;B0$UdjxA0_*58>&P2(-NOK ziz#fMbgu{12*!JldVvi<~iUlBzd7 zWCBCfNx%QUnbi_>S>-8AQwIBs<*%+^PwW`^M?MWXbYkmc>toT@>t)O)rA?#%4ze!- zFI*8c{{Q~`4(RL_kVA+#w|j}0Tbp!Kd`k<82f`LyRKq1(-wcZ>3Qkf%n5xyO{w|+# zk~?kr9=E-3(x+*GfBnzs?rm`@Sxkjs-qA`WU^Z5YMox*(WjUjJr$zl3Jif? zCjh*OJHbMPN+-1ww}mYix$27 zc>34l-pSVD%bU!CAM*dfr4QE@(D!Plq!X?PmX!36Kq&exhn2u@1vst>t2nyUq&$DI z{Ljq4n7R9%YjNyTlx`#q=L8wi}6%&a-fYUdTx|Ive z^fLIas9)dkr#uk5kE-wQiA1N8Mczc zO+~d$umk!(*!|zp_ZqSA3(nG=3-enGETITOAtaE1Sx$$c?Y7yqpL>%A4#%g9r>B3@ z%59JXd`-8`MdD7ilZP!f#j=Q-nyQY_x&%}~1Qu}S@ucn9A=om@0wE%n=@N@UZcF)n zKE0X*;?9(gmINay84?mC>bBa(s52oCAPz_#M$f=cc%g zQ1#>>B20(qKy2^qQTUsHRPKT&T`;IC0xA!H0uUlE(Kda_kgzg2ltgvr1|B~))OP}V zo;4_Tdr)=Mn*mS(gq+4txp-izsNmQ>^b4VL2>7BTEns~rCH+j(>EEr2J0frEXUvk> zE4)KHGcbHiX)egC1fr}V$M1X4j*h<8*5>vO-W(kme}5UZ5MY^zq8!2YzzO|OQ3tNQ zg%Dl9J*&;YB5@eRysw&bsDl3IXa)DjF8X5*B<3ib7GrI=vg>*-IFr&(@6>ddtiTzh zt=aI}s#{buA>Be>QM@$E-HBMTRXp9zw~< z5ROcvY7stZM*(14@+}U4&=;>f^WQ2LU%g7}3Z2$4Zw!o;uvJ#xTDm@omnuJr_Dcl^pJiPi;?_s)**%HFTsUNkr{ z3=WXN3mvZ4KY}88BoV!_a<;%bTkiY-|5R8Q6FM;^r|HyyFQA5t*ZgD&;Ax2ASx!J8zaX*2B zdEMQ2dY~}u@i!fH*6pXBdFbrDW@|ipwD1khg2pm}G6XqIf-7Nn{W%EwuTkp{y_Q)L zi!5}f;GqsN@PzJn65mIkoL}}orE(@57#_k^5VH~37oV-@+zrCzyAfr4`ALjhaptz7 zK|O)3s&#hSLXd<2V8rA>03d+`k~71Yog!QHMm-|ZjwhjSLzC#yq754GL7&C)fD`ou z-uTc2;YV1J=?=$nT7mCD{FL!d06eNM z3WBj0C;;AzK(kgMX-?Gz^V0EjnFOG;t)(ub^aIc+ec{rFRpt`W8$YE1vp*K-x;7a& zRVqg2{e39{QXSCq1Ygf4e3a|-x^xdG%an}6MXKoyR0%-r8?MoeUtbZcZBLXY6A-q6 zoB@L`yeXsE8h;MF}w0z7HrY(W7^VA72Iyp0A6=*IuLnj0Isk ze;%z=fzm(~7^A$Wg(M)Q$AjRYfO|($mZR}V9wHFNDn8&5E5FtWPT2lE6lujmDZxYe zLUs?M{UFTs9dEM}()I2U&ql5TAn)iG?fp6{) z^pE48?Y%+!T(y&8p#4jFaut?5pZ1VXrU0XXhA0@uF~7VP#T`=&w~y~~^(kiqfbRJR zz8A|&z8|20LhpG?Nc{+(30R4aheA^9feJf+xGPZ#8W!`I=P}Gc;@$%a7WyQmG&D3c zG&FDS08fzu0&|~oN3f);6RLaf!GQbtAnlF|9xfb~7mzro%OU;`zU07|lPeU2gw8Oa zMTkixkqD5INH9w9>G}NC>~VU2&(7uK@-in3mV#$sGVtl& zuh)t9_UYQwr<1R%mzS$+Y3iA|ifRZ|OGOryIjvb-zf?`@mJIDxa-XD4H0+D2EGHi4tA4 zhQ`6}Yz_Ime+cz<6?E1^4z#s{di97is#MVNcBBj$Y7fUCa|yzPL4g<_#{FaV?kH9p zt^flAykwL5XVZ{|ODq6kK%T!fbGf@=qeC`q*|TRGnpM}D3vfY-7)TT!c`v(NKS%e4 z3;+mHEP_5zfHfOYYbi>8y2`453|X>NPFTu=0e3kHYi%ge+pfNI*57^hL0dTTSG`lf z9<`5W;l3GBL)wVSKbclak4y}I5g0F>tlLFu*_r_WoaI?pX3aZ*1?3^M2fSsLuHDI# zo0~Rn9`~1@Kf$|mR;@}^RU$1bQ!G@+6cbLJI&|sNhfkZ2PMtsQpGqn9{%BAN&+h*m z5jT_-_=qRMM1CC@RKpTKzQRNG^2Agug1*8mMf9sc0fHmKWbT>y*@O+^07tKL@P?PrP-iX1ph)4RZiv=um zBN7u?5O08B{W{AjYSmSxl~EpY_yU<9C@>wSuRl(9gIi$66{azut6{>O;CBP)nLrQK zsEMB8E`UfjZA6tpaFRA6tVb}S7J-crs37eYq5Gb|$do7;1=vTCy=EnCUa%kZC!Y4Hztf2k8Tu1S=Ft(1#a~5KWRC zARc`o2;ldNbFBwMa1$K|Wl|%jtZ(nLH8k0FHDNSmg^pfGnoQQR z8aTpCmI&AjWlZ(R3W#5lyl~DCkv)u!M7E)BTtU!fC{QGT)Euo{2BKrl-!4-~xPyjODldl@4o2YDIBISI#}EjE6(p2N;V_xi=`W|} zNuJWTvP}@jKAgN?CZuu=>fI%n3$_|bOsP^@U?BHIW0#BL)I>tv=7NZXB#5d>BLrY8 z09X`3b5*>%pdl4fq;eiP?vj`@2&$6ASp*$yzn49}kURZe#JR3QHY2Rz<7iDdNS5)9 zO$igmmOVWIV^*n=BSeYDTG~_!sbpw!J`B5J!A|_sw~@b>lD1?ZyQ#a|9b5T0lsPg7 zfLvnMCny{O?>k(87Ndzl2lIDdT5YRI3 zy7E#jyd?<-eIyWhJzGHOIowR+n=6hyrPbe6UG(LkCjgsDu1kf-$Dr+txT1p=5(=pj zmPCq$L#wgyj>b1ZFl7T+waPA@acR%i8)0rC7bwIgtUGvJubBB505fIEt;){U8UShr z5XIOG!O?EBv2m*@?^#eag}Sz{_vZG5H>fPc=NG&iX6gqJyIrS4YuXC~du-;RLWO|H zq9xmh7dgo)iD=;L@F=p21&UH%wT!ljB;oBO-!yIM5s`Ah5hP93AyI-#m8(J{Rf?ww zl1yWyDjFhcS4t)tJ-4bUWybV7BHhv(VVGB85pm|I`ls`cVtd2$aQ#qNA5|d?W9TTM zXwwuZu71Gs+HfaY-uiZRb&scgJ8u%3V9H`PGo*_K`YCW91o&|(A}Xv|5-m6npAyU> zbG42jq*K`DMr#R18FjF$D=fxpk%1m*G_fR>#idqaV&GSy>STADFw9f1^&<_(3n8={ zy(h4f=9z^M*j?MV&=+>>ZZ%pPX+^J1eNCX;EC{r)4O=~tq-Z`rZgdkeZLrkVGRuUn z6yDQhZ$yR??%^%e%E?<|G)k(3UI-|W#-c+b*%v9Lkd}c#g@t1?E%ey<6gP$UsH^Xc=Y2aLH_iDLy=2sy zeF1uvH|;k^k_bav#&f5xm)BuU)PQs1n-uLS5DVvIJbk=A`$L=1@Av!k z>lNDCDVeZsgLDSSUC8$B_|MP|i+k61yWQUI=XV}F!tIC;8cH5p2U5gNr-mPOVjf>j z*8D9xYvbIUs-BNX21HQJ5f7FfAmJ0xMJqs_SQOjiq8Et7SpbGh=RN}72rH=s4pk)H zRJJO?a(ssQ=6(dwv(o=ldO1>A!aZYzWlES~gBB7VP7LQm&k{-HduGe4>8@-k?@!yQWoLW@;v6ks3({aHj8WVXH9RE)r4darA z6AaAITvU}(rHM}+DW};Mf{?ZemJ92PoDd9Rh(rfyQ3!~pAw(`_CDtsnIV8>nq##PW zDy4I**boPmzi#v5Q{Po?kIv;?xO2yyU3~cG55v%yS5M&k==1`2A>Mft=e*Z*kyDlQ zV0d)%oGPH*U{JXgc!Hp1ELY@4MYUXtdHMH_4r(}qMK+Eb2bc&hgKba%Xz>sd{8Ueh zBLTVy;e>)gi}!ofEQxuHp_3Cq4=R3y*~iDuKMdy_*pI=GVm_z?&=p@OI>A&+Ab2Dk z@*mdJob?4%l&?*OBp9f|tbtx6jN=MZ8n_3G0}F!&RXXBiRp=rljMw3aOA#{AYY`K= zCtT*5>|s1g2zYS`VfXj{cjkQFey<;ZF9#y+hTTf7Mcan4W`Qp5sOgys871muv6Imu z0f1~Iw<7%6qO1q}TW}S8?XM@tpFVv1S-ouDuGWo!Zb8?r zq*N+V6>AYzF=$~-EKWFJ=c#8r;{4H#upBUzb*s-kX@K$0ZJ3_!;0 zad9AM!NVs}j^XQqL_AV@GVWp}F%b~bRvNN~6>1`u$x6yoEU=g$$tm2JdIzyIuSX^v zOk+t}u#8;L!po|dDx$TTvVLu0q|%_on=oNvSzu)nm)^vTDR#q$x{euYs-$}vm@kcq zD@hU?B!-5Q>c=EW!+&hY~8> zK)k#;Ic4p|#R?HH!)TvA$)L=cZaz#$;YdV1!2`iUhpa=G?oVfyz;#o9&go`+DIiiC{cc>rywlj3Vvgl;A!F*l z857e)^@qx_EgGsxCoKkoMR3evq8Jgh9U$AwsQ7%=Do*g_T%d0G9kV*B&jq|dUPGgeozVz&E<&Z)2hV; zy03Ev@10R~d{UUL7vB{YuxhSBZ_8%|fEZIf65aPqH@71eMzbiv4y%=ij*gkGy`=C& zcVMTYF4($t;&%*Inkw#Rg57K^`4txhnlRr}VRqVN)?cGeHEL$qKp3?eBCQ2iM>3Nb zJL-`D1AsEjWC)ZXH5J{z($&-HZ**bk!vVbiexL{--v<>=z7!LK7H5YNpdunD!?1H9 zD7sJpXdy&Z;ze4bt%$3NV3M>QhkOgD>j?_vW>BC}#9(0RFkQtp2^OgAkPQJS(_Jg2 z2NWKkg(4I7k6z;&W5 z%FYFa7YblcYeW`eN=z0REQT*~2v-J_Fxoh-GC^i!IGk86IVR# z*-WKp7?Nvfx-92$VAyeP&2ldFWX2k>NQ|hG!KuIosatC2 z)~SO=7V=@yqg7Rv$ZN8N4afWDdviAnDqO*+=zNC;%}5t0YSm|dXihIXWPVDwG;9w% z%L2(Hl_|Z=8Y)VGk|yBFs|%C>fIlYp8K@~jKQQkBaNl6N5&)lF4$yp&9RVb4EPg!< zKR(2URT4~=486G|T93~ca1WcAt)+?z=zrpZeFEdt z4nfNB2(aD1l0eI)7?K+!#>oaFN2-wxO%ya!2R;m{WT$#mQStQ{SF8Z?6g-Dj7 ztVLYXK+G((w6wTrcr2cV&V)8JJ$C08OwwseV=q4UqixYrZammEO5nm{IaOi3#V{(I zZi2u`r4$=k>;*k(ZG;BVyhpRLv>(Z92w z$RGimW@DsWSTydm=dJwKwp$IwC2kf8RJb7&SIBTAhJoU;16x=}SPgK!uran59z!~y zJ1yc88wzxYHy)LEh27>nki9w(J9>Oat_jx!q1Y32${R`DOyNW4DgX`nimLf0K<5Lm zluRz5P67xTQ@}5QIc_&M%+*5%fqMLA(UmXcGj`pEoP}@Q7Q)90UT%Dk zJlhUD(M+;$8Z6z($uf+`2~jEtT1nv}-pD2bGVyglIg?o*Au^#x?Xhf4y{_e;>|mHt zxx>-AhhM^QY8P?VS|yIv+!~|GkUS`WoocQu7g^fL+~s0VAqSnoF%7qA!9$H)W4Ma6 zU=%SJ2+L@t*b7RaK_(o>0Y0N%^SKr^9>mLr+oTcOPs) zpg%*q-e9ov!k-bT>p)8nH)!@1Rwu`W3qqq-AzarrqlL^EEPbxb2Qde5km4#fjkY5i z1^K636U+|-vGw863lP;vj2~f1w40IkQ@}kkq&=K>)WY+k(BM$rCq#?b=@y}Yg7k|) zdv=L`YV+CFpDSZrN61E7BaMS6%3@AlFb%7o#7tGOikp*NvL=Z%k%XH@8duFL4Hm4Y zwYnw^G~UXUyQ5PmX(hxO&U-RuqQ)ggt+=w)g=&(;q_GjcDJ>e+g2Y51;u;8HutT+j zGTuN7pB~kyVMxV^+dU5eRXUIlH9;Mh!*q0V9Id2#&~=^^K0;cuES0HEqpAb4nnxU0 z69ibK1Rz94MkGPK1gHy*q2mCwSVe3zx`n(vt;lp^2~Ot!z0sMi2Uzvm9QWs>u^uZT zbE%5#RQX)#4!V&eyYG0wOg;oCgx9{}&&{fo?e z21zjLi$R_aQ!zh!a=qliEF|b*!oW8o9NaQ;I6P6oV}>%&(WZ%7j%FoR3niA>a~j~T zMp|9_HQ2-0YMUE(uPo$-H#(7rpt08i&s&5rXqF{Iia;4ih6+jpEgIq@apoeI4*mN^ zxNH=>Am>BREELJNfWQYzA%-R{4?8|}a4WPGBfygHB*>m64=PGb4<|&CBcN|?bDW7% z)RCjm=x&lklPZCtJtf}&^otQ!rXmsuDPe_JBI7D8GZ62{$DzdB$c7`M$nmvElYTyf`_2Kh}Itk(1(ltiLyf-d!jq2T)Mfs0Y-d z3BgE}7ww5$N`wUU6^I5QDlC$$KOUr*Q7KTjMfi>F>lblfy!yYvo_CYlpH1XX$5|i~ zCKX>h6%jNSu2HRf+fldE@o2izuLp-J$DRS4x1j%Ete>?Y0wOK?me7~#sEjeYs+;YXud$7js)r8_@Ogw~DZ3q-9g&X|-*o>to%Cb}- zNTeYN2rs4%vV!oWBi24H&SYL?#3=_E{|Twn$uVt^Al8>BlO6~>CQAsg2o>3AjmQb z;RDzZ)AQuX0iqK1!qvT|u^_84sn-EGYAK zVqTY6l_>*IAY4V<5N=WeW1yKT8V_^l=0#l|>@bRb#p&HRF$=z!KpqT6hi+e<5}i%2=@Zjq7sZp4G_C48`iPYvsCNe|@Cb`pSulx@=eNJRA?whux1 zfNpyB`5wQo>*4jWV)Z>g52eHz#7_Duz)*ji;Hkx_JR#5N`6<@sN05E(0|iyE`b`50 z3XnrG0I&KPD_73vmO3qlsuTdYBSY)_vWn36|J6kHCP{FQEv*PwF1L{}jIS0`@Y zycf{ISbjOS_iw-|yMvDaksER7+)8YO0n8#oi)uE2FtaOBC1jA0jwz)819dVYtZ+FK ziDTl`THxtiBFeI=;DAx92&M3%mIJU$DkVszj1tux1>tQ9RWTxDBm)1uUtL)J>Yfj_ z`mszVGcpU2D(wfvCQO!Ap@=U;@;zv&nYt97CIX-0LVo#sP^z z+EwsB3+MD+-sr$^Z|JhoJmb;#K7j9z-vMHCaO8}-;am(??iv?1XLf*?Em zdj+{GMCMDZ#vgx-6fV4I4IuEIO94SG?WuIz`eMMeZNqOFzU4f{G8=PlX^OXthM3PS z)O92*tcxEyCG@?5Z=V16Va zg%jqHNK}H96Q3W;FpKF|p;X7H+Oq+-VQ`S=4cAG3igAS?P(Ge<1KlF8tWg`_NCs~^ zfYA9V*L?1|c2&TqROp2bVG2W&uUe(0Hrc8wPUM<7nlRiITBhcUEzyUI4Q8u(n>1!< z%97cdOf14VIQlWu9_-F%yj;iy3wuJI$_F{=9)DFTJE7q3pm_A<&7m462oUQI+fuyt z(tvyN4uZYJ)}%Is^^61;3BHI0o>;JLDs?Lb@@iNM-VrJ#C}=^|S+kv20Spvl`!33ggb{=Vloq8_s)(y3wk-=_suD`D zl3EHxq_7JhK2+_(BzT+C9=eg2xFIGJhQ)FZBy=0xeK^rLUdBZY*Nz#L?H%y*G#Zl; zznS#K;NbHUwH$NK)71_BR)+5M+CtP@5n*IXB0&N%iQdF#-ZSWgg&1N=IIXt92Pia-Ji zg2jtcMO6x`7DTF+7AzuCgj9+X+@ekUj#(oTDqoI(4T!3nWL1PfLJS35J&~|CRKR!( z1*qn+38MNVJJxDe}2&@Z0TM zd#A5o z-1u*ipSEW`WL4`J5WIUg+xM_3A2s8NN*$mKG)aY;%{ zlHhbxAuNQqg-Q#8Ue>kOZG&&tV>2c}BDsaf5vXF%M5}QFBOe7J0yPvGdP}0T*xsL@ z;ORB0k=Qsvb22wK9Li8zlXMVnNIs~;Vp5eV5nw~y6M`@$AA*-0PTC%0ff&9)^j`0e z(2B3jHfAj6bGmR09e)Iq!0pph7*egY@+o1HIbh6{Mhe2rOKk`-%p{riI_Wvlz%dyY znA{%@M`VQ*88A^e5G4XbkR>9NaxR~M3*Z>Uj&H5vnRwoa`LW#?6mDEuSa>kY&mCU` zu)9U+vHJ8ITm9`YRYm zNg`uP%9)8X6vB9SZRn50Gq@)szi6(9PJ`m zD-XDbRuiWQad}-r$Wn?3sL4ZuV>(=+8?Yqch2*d{dpupq>b-^%NdnlP-i6@QTxm^b zV5SRz!tfzk6+`r-p6G;A!S1y5mhV5$uZPRMt6z`uJs(HjdOnX4exmjwj^}zXnW-K7 z-^qn2s~M~ms#O(L6qRHZl_zd(w%ZD{&avf>JddT~H-_VTgpa(?sW@fDbMnZRB+|gb z$&{Y&weG!b@<1jG*u?`7LC0mj5HTt?hgYZ)q5(aDZaof(5=T+Ijxn(uu%uAIWH(6} zdKe-H$H;caf0?kidBqLEqvgB5uDQZYF|!eXF%%71_-WrS+SD+1`yV*fAD}8vefcSd zm(ibyNj;KDV^L{gm|h(rLJrt83&+?*3)i{={4f`J=CVL1gy8OIr-d{$vXa**W5-D< zJfPDvQ+W+hTOjjpDj>2jb7nQU)I1*WJ5EkyUp`rt#!*!64Ek zlLc7?`w;_t8D$wz$SjOP5wyuNPIeHxqFkzz&?DhMivcWr)K$Skq}ZVqLq9R;b0!bPBI}FO#WJ3cF}nvSqT$fKPr!;Zs zHXXp_AHW>#&LeR31gNizCZGK`^lonleTJeGePSQRA?75^HByj7gwn*Z0W$AV-m@NJ zL6eUTJ{e9JF1QlCFYbsWQA5H|pioH;iGohRlc#G5Fq5>B?O2;jCiIh*hc%1ojUXFH z*rLWx{s%G49Pqk&43aD^JqhAHp15S(IP-yUPd9<^dvx>8v&J*q36S`~Il`bK-&BAB z1gp5}*W~2n+T7&Yf0L3P));|+R2c#!7@x+w_x>+s*LKj}YIt!s6^Nf3z5l0$)* z_{4$6aBa+q7{qrRI~?gEI9!ZEeY_l^1B4zV9fzR!=L|^s1dL9RJGqt7R1n^%%^7W% z4H27el+>iFs^-g5bJX=T7)fPCLa8Avkc&b{0|8hWudg{u#Y|W`%||@Et3#}H8I4>{ z9EE^cOB<#PNfeS*(_9wmrJE$lHEgUY zH)a_vj?vxTM|T$^d>hX!SV4DJ$@+bIX$&DAleyv}_W@ou$F!Do(VTL}{X78Z41B zQ5-UmFl84BG7#~aBn(DVLSdcD1PP*wsdIw~G+~68BM~b5n@d-SAV7jEYL{I?3M492 zQi#hqN<3C2tt6R58dah)2oxKqc=SzK_u{iz(ilW>qm>E-9D$8pxF%6$uH7wBe)?+k z_P5U%RfO>*Ol}c(toOgZWw*M^*R96#lTP|Xq(e7(8l!eR{kGa{yXWa&bqd(59G@0; zQ#5Wbl`tg2-#49No|diXdK}*POYE1tUWcLRdV2hsI*z;CbzXais{|V`_tAB#77LUh zR1!$301ps=21VE)VHHU*+X)$0%$7_nnQZkoVl+mwzJV1>qVrx*UYvC-_<~w|bXceu zeo`k-V&f-iEL0J&De#o;wqO_O2TJ+`JpfnKN|2(fpX6jP4hkLTM}+qEh;SmT5n{jz zA|fD%>9WM(CLoAbC0Q7%htMxj14#fYHe{e=u#mlq!CfCmi|k79XBN6uQ8{pj!V}gk z2x?U<0f$QwXilpTc~%^ro~b$@_v$`ly&2V3|6yKOp8&bJPEa@xuE9Zfx3m3@__mVF zT-`|`Zz(*F0!K}ERjv|1Clq=r4#!_fm7Qz$jCnC0_2w5iyTlg+1ABl>mV$iJ8)>Tm zj_edH2vH+KBAi*|Y7{7HP9b>){=NmMrRaTj0V;w3Itb%{m^RKVLCX^YW2<(tbBk^P zFGX6BZGsS3#9)`pBV?ec$e;*F1H%g-X1pY=Y9m_;sFalviA0!KL{uy=SR$%P8^s|b zg(tJOPhSx^=9jk|s;*w)#+(k6Z<0>3r+F@6BatC)e^akqp)TJ{Ny`q!#*LZ=pc{y= zf$R2=H`T(sf+?s%BkM8rdnQ9w=TDPplmU6_XmwwlD|5xzVLHhUWI zUjT4($ExRHq>_IJRBSSjPd+qwI{i;GbaJruyU`??Kskm~%MpU1MO3L)6;!IGSTSZ8 zM6wM?Bnb!=RNBMY+0}L9;S0HpCFRKsM$q&q0ce|r{%0|IbOvw^y1PS@gCn-vwr~U? z1Hp|IHwQ@pBD$vfE@9qcws&e;8&19g9lh{V1Q50YmqC`OS3!RcO^y)S4`7UuVVc46MxqCSAag5C2y&xQ zXyY&dZtjxRE;!6uRVo}C%gc&@!Gh#lP)nk^HGBtIBQ^~Me_HTPsBWnxPTDwc(-Nfk&%eW>>pQDUix zePxL-QKEh}8J@jbQA0sg8hv6EJR~Tllh0G@hM)_88ShaD?Z^-SAYSfWg+T}p(30RV zd5bu9FTWitLUEIh3L(TO5)3q;@CR7AZ!V1t)v1gamRc2Ll```th=a(HQcVr&slKXogia&iE94@sKnjEd^PitH2_q=*lytK+NoA2zRIHORKtNo9nL^kt-(D7lO%Ad# zQ49e92opk43?v726>{~g7l`2Gu6!4PgylnCPK^m1=0eFT!MduO>9(>v+kIFtcjE-K zp@VWf4!#_d?leiFQw1{z=dm#4k|2&(IxJ1Fh7;{U>r`49;2p!Xw2P;nbP$#`!9&Se zX>AK3@`J{xbFo7NMO&>E@%H<67@^H^${0fuWTG-Q1X6?~PZ;2^R{?_RnF)BVt|$K$+BUME@I{HUn~ytJoFEAD%E=%{Rku>Rq`2fphzafJd}p3L;oY-^LfDn zz&%p_&oFk6glI&%6p>rif~~yoUBUB4 z-cK%wtJUuKda+{c^yBI2%e9p{(L+>4&HzFHsGd+D)fH=@6>LNS;wtdSp|(J_QA~E> zfFLHR5)O=GCeXT5oDb`u;si-mR9dN3X-idBP_jfybq*q7A}I)%kRo9Swkc$alG>{h zlq(TRlMo)gkuqAT1M=+NDvOyVk|(G9GvikhSpmW%^aGqdy5ERTT_BgLu=GUQ*PD7x zza9A)54l|RCqf&u5zL4_uAw4Ezi^bV5RH@Qf`pB2>VpX&94_=Y<5$>AVA+j*Xp+O~ ztY_m*a~Y$njD|U5q2KE^#`sbSMV0UQLA=Yb6jK?I_Q zM3q5DWZ6|r#?s8i%3B&F%M6tZMwN)85?HS*MiG`K)@Y9b+9Sa1PtO%1c5OS(cRLg0 z$?t_AMMf3QFmOXGhDmH3CwPD};y8q>vw}m10Hh%W)W}GC;)9Tixd#?8%n6YAwi+YT zx-v!}=$$ORZBh3$j3m-YHdGNssX%u)P*hJnAeOJ!3czOiRcn3tCNW`e5O7+pO~pKf zRjBW2_O~+U7vk)}VJ|*8L&2zE!&W3qmLdmR2_~rs+!{d6XmB={;R*=$RqcyIKw?Za zQX*83&AZCO~v5xQGc*ATbl$ zX93r=GP6?&j4>l@tECbXps4A%>XLeLKqlLGqCK*aMGBEn-CHrtpgG0LY7;L3elQDM z0&rZZf@;NpFiYaCVF(6{Dq2{!i)k#PNFeTHG10gX;#bfF9)UXIouL{DB@Drd5NmNH zx)Lf{s8U4;(jZWXI#E`sMm3}(35Z+NwhAegO3T4OgiC}M0B>e5MO;ITix^>6V+BHb(H2L$}HrU#>aBN-xc{f!>5m%qrUQ>mYwoYSW7eSO_P^#8( z;&9@e*iTo`IGtka2qI!MW4A;^l60TpL1la_3$ch9u8FG*XC%-l7k5s`>gQ`P zt<%$7#|-hth~dK?Cr5B*F%mBLjq@Rc#ho<9rdX~ufwK#}4;qYs@(2=emI{fWbyHz# zT@)z=*~?IJ1{k2uSkR~{cnQjdi-m#}$SxG4k}gwn;i9*y8q;ScNzAXF)t2V0qk?W_ ziBfR)PA*F_n;WAnt1McRDjE`L1O;MTbUAVd42z`c8L|f;b2U>}MpG>FGbF)VDy5Nh zm@!j~gBoO@V`ywuszu}!2q?m|2#|r%2@r%qs9FVM!>lcUn9OYisybLk(vUDzbh5Ex z3mJ@uAh0?Jf!YEghaH6kWh;g&L^P(0q-!v6k(yRkez`TXVhYM6Q7?jMRQm2%gE5pi z!;IAvVqS$9h%t%-j}CI{k8ZsyhiE&9`opg7Nt|bqh#`|PyCB?Fm2&nPf(JvJOvt+| zRyJhWHfmf}Bb>7|+g41gKSp7_uym>!UGLP!_kGsUlaPwTbUEz9d_M<^_IsT*xf(>0 zY(qs2#3qJIP1A0c9(7X24dhQSL(@IXMP8$-$7Rk@d`X2H4XnLF7!^4~(YoPv;Ami` z<16P&ih>1*W>qmb)efaYg5c9)T83g6tyT#6EjO-Y(}mFFRm0^z+#`T<7z_(#4P6Lm znPybu)@;m;BNG#P&6#M>$)jY-O>(t{3=vA%y@--c4avc@KyH>z?#2+^RdzP1Zm( zWm1i7f>(Z;A_4zNb}r-RvJoK&vg5{IluJ={?5D=SEWdd|qF!eEi7uR?Snh-D1P%p2 z0q6uDMdw}5t{x9P%=2_`bmHsd@Z1Gur?dY!}IPek}e2`H*64)X~03{f--;Clt) zVJr$OS`FgFxboECF^hz-=Npi}2`0`h87nEVopd8X$uQp8iK1zSOd^B?rA96eTF9-3 zL1F>qxbPIdC{Sh<6WvzDjSC3N*$m?gF~=BYCk2^7hZd}`*rjn9Mg}C#=-nE#mKwBS zs|}Rdx^9iznwqORIIC@yRk@=45sIl60un2D!&@y& zQrVS7Symj8Bx06}ZK~~6NkJ8A0TuF61JjJLWJN~>e6>sh8Yb+?y*CV4n1dB$E;#)Y0`AlQNsR5r$JMvqmJ+S{F&qjv>0m2Sc)$#!_R1bI5r| za67DUVo5tYb&XxTyBlvexKJEbWT|SbNs29!O?afh;!wiFR8m@6Ld6y;tT<65!dV3z z8_Ypqt%$<$uv>^=O95I4j2uZI=2;E!s}x~aSt;tg?M=K~>(h9d+FL5VR!;xt@Lu_o0RBBDaV#H2(uK@h|QT-c0>jZ#rSL@_B0QxKBP zED$g-$tpz@qozX>ETm@=7)vt3(-JCDiY6%?X|$7u<~sP5kJq-70~Egl#E$1?sDb zw8Di_oQZc95xuNuvwn8zn5n^3vKlH$g-GhEpWOcKmUZeWD@1E-y1-AGUlx+?5Gaiy@)GH5A6ZUqz+O@QqrY$^{7M35YctF}Oj z=L8z5Ylw?%NhK|EFkty?CJOuPJ$lwg_>wdTjx=%wA(>716{|uLCPF1@il-n~h^qj+ zgm{_fBqZU8;RXnC54w}1qobsbh-BeQ+B+-4kdzHk1qDY#3IRxp1Dw@oMTvAPNY_4U zW@bdwF_Q$U8ACWQ=p9nUZqgzg6q|%FHNB%7_p;jc4iw&@8GbSM_EW*qpun0yy zPH{vf$0v4|1>#>3g8cld`P@Dpz+~LdK_7Z}j~l>_b`7QM3lF_=BhE$s{PG*3D7;Sq zkV=p;fP$$XZbLwjp3*NAgcEMX&eUt2w9{PfUMBorhy)!y5uyH&3HgL zACF+7aYvwf!JEE_jo?uEK7d7Fwu#&)W3@a&)DF}2zghCFG3mrL?oOA^SU5%_1MZQ( zz-bfS?oR!OD+g9wBqn&3h|fz7(EIrKvk}&wK8|OOF@;TVUxif)`B`#{$x_0WP|lbP zSsVC~;oWW+I}7ze9~>zlY*!RcJ2C=}1Yf`muJE|5GpVoR?Px>|)+C57t+Wq^x3!2I zrl<@q8vMWFjTBVnKsryaz21G}4W)Y!=+O`X^!(vL^$3CoZl{COuccxKus4s@2ew#J z9*9DO4zM6)2d`0jH*`JzVuJIYw*gf*RJ7<9cd?{0nox8E22c-W9h3u5L$QL0^qCG$ zgbw)T>opd^qh5-)&G+e`6vi(MH(aA9Shm%KA(&dX)o zKDiXCWM3w|WqDU@MH;IPErT&>eTX%oE-h0d&glM#2)&N*pgze}K&sx;(_ip3g z!QI2#?RIi+Wki7ij6>Pnpyy9d*5C^|!tQL~MZ8}s(xskfs+d#E!_0;1^c#6XDNteV zsD%eQaGTt=sGXQqKNHW19j*yEKQqf(p+1(Hz;-9qGSqp4peimBd)}Y=E#xXDb0Q@G zu!T5kQ1L$LrJk9s3QLYTVz#ofDh#EIu%Lm)C5)Saf=TA?;szw(G)Q-o+3zvZkaQXBOmY}v z@GT4nTPCwhs~WXg5gN=MO)!sQp2iYtk)NvBA1q$_D)SxVYi)f&XfILOG9VuW9YqX^ zQTOH_R9@)m7hc)uSrggVr^C>1s-d7$F#M3b`5TFt5y**=B2>FZ5dQzd_57X<}R5(}~5NC<^3FGl3F=DZH= zOGW7%KbeyW{jY)Ms%ZZi`yaFZ_wnT?HQ@XIYsbCOb1QPnf>yxiX-6w(r2pMv(>&PV zotT|44#ay9F~K_!TyT0KW(7JFl~lGC#jsT(t);79ry%`rVXvY3F;yEWgk%@B4*1>*<$n1lDZ1W!|f^oqE@VKzkD+{%v6?6{0UBZPW!j^tcK@ zTKn*?1!)6ESfm1InfPz3f;;dXkTAg62NZEd_t8vo42Z7TBq1XL5hB)#0xNmg(?NT~ z_rDbBdqLWLGvl7o2m5V!8mXy<7(Z?L&vV@IZ|HMF_IS=?=ZvE9T2o6(&5q*5j7=!( zr7q0ijL_YiHLx&8kD2a8Fl&LPb7s?`18^l`+ z(8Tk!(=#6kh+w$21rcV+(y%V~j0i8%vQb%M8gbWJ@TrXGxev zB4ZyCqU<7BvXyN}%Md1pq_JjSvW=bLne&|IdCu?m{^x$~KlhJ&@A=&2-1~kJ8z>og zX23HM)$V;~F}`Q{*rzdqW!au3*$#oRXo>Zc?u&P_cuW-FB!Uai4T2j}iC{3+X5?)3 zCC`EwyVuf>{_zc)uRVVC_G=dbFR9DbjWl7_m?-9dW}HF;Fi%EKGl^b~pMD z;2dm#X*buBBbf9#q0955LxyQR6&yibsFBP};gxsVmyC5$A}TK?W-Oj4V2GQ zKVsw>ciY&$-fM^fZ&jN!{Z_yEUD&+a@DgZ&VIusjr>BFE`q|h~(mG}e%^Nf@#%VU4 zNY+^MZMpqg{qXoQ$|J{Q03|~Il*lzyZmz!h*~eG4@xcTagXf!LAU0gxiZ3fJ!Leqp z9NujS)AYmUXx`RtjY|QbW9fE-HLjn)(c&i10T9EbO!g+F_U<%fY-}a$*2d1>-p2H| zoR0w|grqHwyq$ui@OAgOh$ z!7i)JKI0ZVq_KFr`e7xbhu{}82uR-a>JF6D)dnT9y1I#p^y?Y@MN+3?8gveo0@l5IQ`_j$=6h*h zl&I6iExy9x{kM$qb zuC;q)+Hs=X!LSF-vF1DPlaFR$);%8w`NIHX_j}z`5sOCFh&M&^x_BvL#fx=5lB*T+ zGKSj|8{6wgL~gFQTQa7cMrL9XK+xzFbE^*F96b(wM7m6V@0RJO%~YvW>j4*`)GX$P zp!=oQeN?*ySQ0B)Nf1fam-X}$%JOk2&&t^avzTooK89DYgtzs!^5e~ACHqqyyz44^qa}BvH7P{u6k1N zJGu(&HNbR5B!F%Hxr0kHG1;+1ur~j#tYuVr#QmUxL@|+wBB-D!%cZ=yKRR&)<$LFf zl=ZD#+7*?Q6q%4+0;nq_)%Bl@l$BNH*Q-=}O{Fv!a$$pLOdaujPcZq->S=X{*#K|y z@_bTD=zVhY6V`A}nu&S1Xp-(eH$<*=LAU5Wi$_2-kA*#eEpl`+>|{1K)Fa!YB&+Lf z_~gN#Mp|T57Zh}S;^xi!X{`-)*#q$7iyHwzdKM)<$V5m6?s&_YT>0%)vNPIWFjTdd zaUa_&^C2Gj3E8em05IQivkVQ%Uim)3Rog~i-eDNI*l3`g|IU#=^foYyB0bWfJtR`Q zF5ttd9n`Fqxv{(~=&VT0dDCk%k%U%o3LD}_kw^!m0tM?ht&TI{jP)B`S#u8ly*)WU zGP8Ox-uP}I!g&va+112!Y}4)5w<}QG{CaM44*&GhA|mZJf6UOnOZ#-sZzlypqo6QU z5ealNJsJyP`1J#yKmSIb z53oAqyG7HUU^!l{QG-U-aNHggE|xlHcC8Dmm!E26(ZQrai<-`~>78#0|pnPhL)ykmQ=`X%m<5@U-``bEG@h;)-FCIH4>UoCnz<2r~k( z^C(0~ypm87P%Xqr39AGseqZo3_|4Cfm%Tk>0#iU9@XP`*2Xtz`tvs4XrV)g!Hf5^mLzru&~+Q!<)`(Hu#q>x}iHhDJi)ws=I@~w9o z`}Jj|XD&Azk4$W#tG0=LhA$4S2HcSV5~DxuY*GrADqH!KBFpWIo3|(!V*Ha#%)r*< zrRbZio68vXcG(JMp>|hCGl5t$mMr(|;OyciC5rJNQTDFP(Zdd{e_$KVn$KiFGvAbxXJ~UAxo2VYnv;+$0;Y8Z0LiH8%1#xrP-m86Ev<`ud zk!_h5w9|uT?eJ_%INrd#;v`egj)~ErV=%R{*|qe|V@~sP90qKVyMXJ@0JCm&@2guX z^m$G69n8^9*O(XFQgF~Na6+CXnBxwBrOVUZ)u_f;#OQ~ne@o1VGH+94O2pu&)TTax)3KG@H|u_7x_V}1mAPj)G!v}> zPOd0-ICR>0>ABu=v5L5Otw!&kSD}uitvyY*CtqQwilrA#2Tu^kcFAfa+ymR4NK;bZ z_LsOQxcKa&I4``9nUK@=oS&0#{BYH^;t(+O91HBgeq4@3*Ai{gaMNFGj%f@29_tT+ zw(B>$JBB>J?REwr-^roi82r1Aim9Fvt2`22Ec9kI52}=c6AV6w77ah|3glYdx0p*Z zcj1Ok27mqhzDwLdEW?KC_v)&`bpRxrg>L~UXwwJ4zW$)UA)fV4g__$iHy-+!dPofD z-;A8qSPA;2RIbs^qxmIXsNC_fX9-@iYiIL} ziaR2Lugk%RxQfL0o3+s1_o1@0J&v@&IMJUsuKmUWp^hK++F~b;WM)IV*PV4$D#E2& z>9Taa(ovbE?%1J#W$)8>t;YT_mJHAf(GsgwZRuY{zaBJQ{(@P(bpwr)td`Q(k+Pc2 zgoUN41r^mj2&=PH?+vdyLVtTa!3;fZWGOs)F-bbD@lFIhe1M+2qKPIdUC@9+yq76U zXr3$IWg&=%9T1#wJDBt;zA!lHiHv*;A?TkMPv<9<4CM9n9P*xt7_t)rdUb206-hlN zh(WVop*2f)68`ACrWlzffW0K2KV8YwLi8fOJA^1)L6GlZlGv}J%TEp_3-F0x_2@qP z@-lmg3_CYph(hioC?0N;UZl^hVJu=SrB8(H>=-4{7ot10y7Sh3gpA@8EC!z|344jPkq zb)-D!>-o~>4Ygs$EHW=ScD}^RA&5hi8^MSj*amo1>e#|jn?VUOTdBIX z2$#zk0PDe{xhAxMmWoWeENsS;Z$aO>AaVvak_C9-z>xKR^qAx5ALjw>`h#b!YHv3> zgaGXTOU6GFf@VE}k)J4W71pjLFJ=?40y8^>qe=_S>}*0DsgP?ARlMX!_$T7*ke?Ld zAlQ;M9-4;0bmNmKI(^B$Bqu=8Um$t?+ap#8eUMvVOKuj+LQwI#gnPo`(j(~KaSC?H zgy*|IUx;#Mtu%*4?-^$-mp#k;7M)q?vjxBftnK0%$4@EL&s`^z#wriDmxp6HE9{Pb zVbqd=wMR9dwA;DU-PmQdRlu^*_^#VOo$x~UjB>qlO0t9V))xyJs_%}6rf4QINNHVw zC(1;Z*2y*2vl^!EK>-1-?k{a*Yy;^pyjwjMV3%TZRnz7+%0a}t{fgjt{PNBN;B-4E z9*N|avY16=A&JUw>>GW)E>}_--f7acz@IK=T<6Jxwu5nuL#lD~+qI^fg#Nm(8VYqo z3!{M=Avk~*+VR8Zr&5CQ;RaZ35-ycw!P8XW&eyL&>s5{`$zGd@+{;9d>&zTRc$*@N z61cHIrXLoipCy)Tir*B3Wj1;n-5qQjgM4H!N-+ooMW-5t7`_*1O_|}~+VdTH%fcb3 z?6vY>c7#4L`%?RRKteZ(Ln$J3R3BUO%Ch+CRM4hp%&O#|i2b zv0pNS^8WT$?-)0gc%d1wzkaVX*7LB+&}XsF*Oy}l$tMV5pB|l@@Bi2sGU2=yc14S- z4;mC|$eB9IL{ynk-YEUdzWSlwix}^eI75E1zMyqeJv^i?Aq89vO@LP8qM4$>(8t!p zPAE8I2_~bFdePckn}!E)2%Ot_G{YiONKgsn0=wf#An1F00@`l#TTx6bje`dMBKG(g z+|ME=vIZ|%yNDa>0vj<&;BcvlLiau&X3*tIvYluxYtH1uw0+HTjN0qn!i`sz+mXJy z=FHYsFO*Ijfo;;y$S&Gght8AN|ojb2`cDd(_UG9HtY1h zEty?bVSOdzi>cM&S{q#nw?%XW)VG#F_>>NFf@(~+U5l%3*_?p=U+BtT^0&x#+?< z9bq2x!ZCjd4s{B^FKcJls!yWC)?sacf$_~1r8^}Rs+LKXCJ5653*34SQ{GY8fD!wLfKj@?E6NzW>XEt_h3>10ThSSP> zy4(u`jvU6r4-WSZtLU?p)0l`AuH=UcQyXeQ2bY~wg{wH=(n<#wMr}gO(w3x84pdZ9i^xYWwR~nf>xR zW%=*bA&s^1D*EctQshTJkIv(_EBC^hbH`L%6%`ddJnm@`XIIuPILYnStZ!d^O`hGD ze|Y8hgy~}K(e}iZxMcFw($FLExqVG7dfya=FX%rCw6L)HZ~X5vtYzF!^=0oI4UG}# z9GU$SfhjloKQeWmI9#s({Wql9u@e6uEe504nkhez_c6r6+2gQluU4%cozu2f_gm@7 zS`YTtg2To%Uz?Uv7Pq$S<@`1#`WLn^a;AR=7K54`rAGd(@fXI$|E^ztVa)oZV{-kG z#s#kb1w-Te2jRrsBVd6D9xv From 23e83c7cf4e012f8c128e86c79c098015b6f3a46 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:55:53 +0100 Subject: [PATCH 42/50] update vignettes with new epiparameter constructor --- vignettes/epiparameter.Rmd | 6 ++++-- vignettes/extract_convert.Rmd | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/vignettes/epiparameter.Rmd b/vignettes/epiparameter.Rmd index 5a4ced39b..d3f5d5e39 100644 --- a/vignettes/epiparameter.Rmd +++ b/vignettes/epiparameter.Rmd @@ -93,8 +93,10 @@ covid_incubation <- epiparameter( disease = "COVID-19", pathogen = "SARS-CoV-2", epi_dist = "incubation period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 2, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 2, scale = 1) + ), summary_stats = create_summary_stats(mean = 2), citation = create_citation( author = person( diff --git a/vignettes/extract_convert.Rmd b/vignettes/extract_convert.Rmd index cc5160b87..85e8e1089 100644 --- a/vignettes/extract_convert.Rmd +++ b/vignettes/extract_convert.Rmd @@ -82,8 +82,10 @@ ep <- epiparameter( disease = "", pathogen = "", epi_dist = "", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 2.5, scale = 1.5) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 2.5, scale = 1.5) + ) ) convert_params_to_summary_stats(ep) ``` From 245614e526bcf74ff1b4fb8aee62ced4e96ca028 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:56:32 +0100 Subject: [PATCH 43/50] update .calc_dist_params tests for removed argument --- tests/testthat/test-calc_dist_params.R | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/testthat/test-calc_dist_params.R b/tests/testthat/test-calc_dist_params.R index 2a720ed58..5b9187b69 100644 --- a/tests/testthat/test-calc_dist_params.R +++ b/tests/testthat/test-calc_dist_params.R @@ -1,7 +1,6 @@ test_that(".calc_dist_params works as expected converting from mean and sd", { params <- .calc_dist_params( prob_distribution = "gamma", - prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, sd = 2), sample_size = NA ) @@ -13,7 +12,6 @@ test_that(".calc_dist_params works as expected converting from mean and sd", { test_that(".calc_dist_params works as expected converting for different dist", { params <- .calc_dist_params( prob_distribution = "lnorm", - prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, sd = 2), sample_size = NA ) @@ -26,7 +24,6 @@ test_that(".calc_dist_params works as expected extracting from percentiles", { # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( prob_distribution = "gamma", - prob_distribution_params = NA, summary_stats = create_summary_stats( quantiles = c("25" = 10, "75" = 20) ), @@ -39,7 +36,6 @@ test_that(".calc_dist_params works as expected extracting from percentiles", { # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( prob_distribution = "lnorm", - prob_distribution_params = NA, summary_stats = create_summary_stats( quantiles = c("25" = 10, "75" = 20) ), @@ -54,7 +50,6 @@ test_that(".calc_dist_params works as expected extracting from median & range", # messages for numerical optimisation suppressed params <- suppressMessages(.calc_dist_params( prob_distribution = "gamma", - prob_distribution_params = NA, summary_stats = create_summary_stats( median = 10, lower_range = 5, @@ -71,7 +66,6 @@ test_that(".calc_dist_params fails as expected extracting without sample size", expect_message( params <- .calc_dist_params( prob_distribution = "gamma", - prob_distribution_params = NA, summary_stats = create_summary_stats( median = 10, lower_range = 5, @@ -89,7 +83,6 @@ test_that(".calc_dist_params messages as expected without summary stats", { expect_message( params <- .calc_dist_params( prob_distribution = "gamma", - prob_distribution_params = NA, summary_stats = create_summary_stats(mean = 5, median = 5), sample_size = NA ), From ffb870baa44680cd6f2ca0267416a0b8c8bc13eb Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:58:10 +0100 Subject: [PATCH 44/50] update tests and snapshots using new epiparameter constructor signature --- tests/testthat/_snaps/epiparameter.md | 9 +- tests/testthat/_snaps/print.md | 12 +- tests/testthat/test-accessors.R | 28 +- tests/testthat/test-checkers.R | 6 +- tests/testthat/test-convert_params.R | 8 +- tests/testthat/test-epiparameter.R | 419 ++++++++++++++++---------- 6 files changed, 306 insertions(+), 176 deletions(-) diff --git a/tests/testthat/_snaps/epiparameter.md b/tests/testthat/_snaps/epiparameter.md index 47936b5fb..a42605a8b 100644 --- a/tests/testthat/_snaps/epiparameter.md +++ b/tests/testthat/_snaps/epiparameter.md @@ -1,8 +1,8 @@ # epiparameter.print works as expected Code - epiparameter(disease = "ebola", epi_dist = "incubation", prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1)) + epiparameter(disease = "ebola", epi_dist = "incubation", prob_distribution = create_prob_distribution( + prob_distribution = "gamma", prob_distribution_params = c(shape = 1, scale = 1))) Message Citation cannot be created as author, year, journal or title is missing Output @@ -18,8 +18,9 @@ --- Code - epiparameter(disease = "ebola", epi_dist = "incubation", prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), discretise = TRUE) + epiparameter(disease = "ebola", epi_dist = "incubation", prob_distribution = create_prob_distribution( + prob_distribution = "gamma", prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE)) Message Citation cannot be created as author, year, journal or title is missing Output diff --git a/tests/testthat/_snaps/print.md b/tests/testthat/_snaps/print.md index e1f8c93bb..98820ff0b 100644 --- a/tests/testthat/_snaps/print.md +++ b/tests/testthat/_snaps/print.md @@ -23,8 +23,8 @@ . Distribution: lnorm Parameters: - meanlog: 1.247 - sdlog: 0.975 + meanlog: 1.723 + sdlog: 0.231 [[2]] Disease: Human Coronavirus @@ -37,8 +37,8 @@ . Distribution: lnorm Parameters: - meanlog: 0.742 - sdlog: 0.918 + meanlog: 1.163 + sdlog: 0.140 [[3]] Disease: SARS @@ -51,8 +51,8 @@ . Distribution: lnorm Parameters: - meanlog: 0.660 - sdlog: 1.205 + meanlog: 1.386 + sdlog: 0.593 # i 122 more elements # i Use `print(n = ...)` to see more elements. diff --git a/tests/testthat/test-accessors.R b/tests/testthat/test-accessors.R index 431dcbd1a..5c7dd94b4 100644 --- a/tests/testthat/test-accessors.R +++ b/tests/testthat/test-accessors.R @@ -11,7 +11,7 @@ test_that("get_parameters works as expected for unparameterised epiparameter", { epiparameter( disease = "Ebola", epi_dist = "incubation period", - prob_distribution = "gamma" + prob_distribution = create_prob_distribution(prob_distribution = "gamma") ) ) expect_true(is.na(get_parameters(ep))) @@ -22,8 +22,10 @@ test_that("get_parameters works as expected for continuous epiparameter", { epiparameter( disease = "Ebola", epi_dist = "incubation period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) params <- get_parameters(ep) @@ -36,9 +38,11 @@ test_that("get_parameters works as expected for discretised epiparameter", { epiparameter( disease = "Ebola", epi_dist = "incubation period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) params <- get_parameters(ep) @@ -66,8 +70,10 @@ test_that("get_citation works as expected for manual epiparameter", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ), citation = create_citation( author = person(given = "John F.", family = "Smith"), year = 2000, @@ -86,8 +92,10 @@ test_that("get_citation works as expected for epiparameter missing citation", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) citation <- get_citation(ep) diff --git a/tests/testthat/test-checkers.R b/tests/testthat/test-checkers.R index c8d19117e..8b0329c80 100644 --- a/tests/testthat/test-checkers.R +++ b/tests/testthat/test-checkers.R @@ -3,8 +3,10 @@ test_that("is_parameterised works as expected with epiparameter parameters", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_true(is_parameterised(ep)) }) diff --git a/tests/testthat/test-convert_params.R b/tests/testthat/test-convert_params.R index f968dfad4..02e673da4 100644 --- a/tests/testthat/test-convert_params.R +++ b/tests/testthat/test-convert_params.R @@ -2,8 +2,10 @@ ep <- suppressMessages( epiparameter( disease = "Ebola", epi_dist = "incubation period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ), summary_stats = create_summary_stats(mean = 1, sd = 1) ) ) @@ -196,7 +198,7 @@ test_that("convert_params_to_summary_stats.character fails as expected", { }) test_that("convert_params_to_summary_stats.epiparameter fails as expected", { - ep$prob_dist <- "lnorm" + ep$prob_distribution <- "lnorm" expect_error( convert_params_to_summary_stats(ep), regexp = " supplied has no parameters and none are suppled" diff --git a/tests/testthat/test-epiparameter.R b/tests/testthat/test-epiparameter.R index 06cbc8d73..b374d9e1f 100644 --- a/tests/testthat/test-epiparameter.R +++ b/tests/testthat/test-epiparameter.R @@ -3,8 +3,10 @@ test_that("epiparameter works with minimal viable input", { ebola_dist <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_s3_class(ebola_dist, class = "epiparameter") @@ -18,8 +20,10 @@ test_that("epiparameter works with all arguments set", { disease = "MERS", pathogen = "MERS_CoV", epi_dist = "serial_interval", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 2, sdlog = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 2, sdlog = 1) + ), uncertainty = list( meanlog = create_uncertainty( ci_limits = c(1, 3), @@ -84,15 +88,20 @@ test_that("epiparameter works with default helper functions", { disease = "SARS", pathogen = "SARS_CoV", epi_dist = "onset_to_death", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 2, sdlog = 1), - uncertainty = create_uncertainty(), + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 2, sdlog = 1), + discretise = FALSE, + truncation = NA + ), + uncertainty = list( + meanlog = create_uncertainty(), + sdlog = create_uncertainty() + ), summary_stats = create_summary_stats(), citation = create_citation(), metadata = create_metadata(), method_assess = create_method_assess(), - discretise = FALSE, - truncation = NA, notes = "No notes" )) @@ -105,8 +114,10 @@ test_that("epiparameter fails as expected", { epiparameter( disease = 1, epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ), regexp = paste0( "Assertion on 'disease' failed: Must be of type ", @@ -118,8 +129,10 @@ test_that("epiparameter fails as expected", { epiparameter( disease = "ebola", epi_dist = 1, - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ), regexp = paste0( "Assertion on 'epi_dist' failed: Must be of type ", @@ -131,12 +144,10 @@ test_that("epiparameter fails as expected", { epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = 1, - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = 1 ), regexp = paste0( - "(Assertion on 'prob_distribution' failed)*(Must be of type)*", - "(character)*(NULL)*(double)" + "epiparameter must contain a or or NA" ) ) @@ -161,8 +172,10 @@ test_that("epiparameter.print works as expected", { expect_snapshot(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) }) @@ -170,9 +183,11 @@ test_that("epiparameter.print works as expected", { expect_snapshot(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) }) @@ -180,8 +195,10 @@ test_that("epiparameter.plot does not produce an error", { ebola_dist <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) @@ -198,8 +215,10 @@ test_that("epiparameter.plot works with non-default x-axis", { ebola_dist <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_silent( @@ -225,10 +244,12 @@ test_that("new_epiparameter works with minimal viable input", { epiparameter_obj <- suppressMessages( new_epiparameter( disease = "ebola", - pathogen = "ebola_virus", + pathogen = "ebola virus", epi_dist = "incubation", - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ), uncertainty = list( shape = create_uncertainty( ci_limits = c(0, 2), @@ -247,8 +268,6 @@ test_that("new_epiparameter works with minimal viable input", { title = "Ebola incubation", journal = "Journal of Epi" ), - discretise = FALSE, - truncation = NA, notes = "No notes" ) ) @@ -264,8 +283,12 @@ test_that("assert_epiparameter passes when expected", { disease = "ebola", pathogen = "ebola_virus", epi_dist = "incubation", - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distributions_params = c(shape = 1, scale = 1), + discretise = FALSE, + truncation = NA + ), uncertainty = list( shape = create_uncertainty( ci_limits = c(0, 2), @@ -285,9 +308,8 @@ test_that("assert_epiparameter passes when expected", { journal = "Journal of Epi", doi = "10.1872372hc" ), - discretise = FALSE, - truncation = NA, - notes = "No notes" + notes = "No notes", + auto_calc_params = FALSE ) ) @@ -299,8 +321,12 @@ test_that("assert_epiparameter catches class faults when expected", { disease = "ebola", pathogen = "ebola_virus", epi_dist = "incubation", - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_dist_params = c(shape = 1, scale = 1), + discretise = FALSE, + truncation = NA + ), uncertainty = list( shape = create_uncertainty( ci_limits = c(0, 2), @@ -314,8 +340,7 @@ test_that("assert_epiparameter catches class faults when expected", { ) ), citation = "Smith (2002) <10.128372837>", - discretise = FALSE, - truncation = NA + auto_calc_params = FALSE ) epiparameter_obj$disease <- NULL @@ -329,8 +354,12 @@ test_that("assert_epiparameter catches class faults when expected", { disease = "ebola", pathogen = "ebola_virus", epi_dist = "incubation", - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_dist_params = c(shape = 1, scale = 1), + discretise = FALSE, + truncation = NA + ), uncertainty = list( shape = create_uncertainty( ci_limits = c(0, 2), @@ -344,8 +373,7 @@ test_that("assert_epiparameter catches class faults when expected", { ) ), citation = "Smith (2002) <10.128372837>", - discretise = FALSE, - truncation = NA + auto_calc_params = FALSE ) epiparameter_obj$disease <- factor("disease") @@ -359,8 +387,12 @@ test_that("assert_epiparameter catches class faults when expected", { disease = "ebola", pathogen = "ebola_virus", epi_dist = "incubation", - prob_dist = "gamma", - prob_dist_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_dist_params = c(shape = 1, scale = 1), + discretise = FALSE, + truncation = NA + ), uncertainty = list( shape = create_uncertainty( ci_limits = c(0, 2), @@ -374,8 +406,7 @@ test_that("assert_epiparameter catches class faults when expected", { ) ), citation = "Smith (2002) <10.128372837>", - discretise = FALSE, - truncation = NA + auto_calc_params = FALSE ) epiparameter_obj$epi_dist <- c("incubation", "period") @@ -421,8 +452,10 @@ test_that("density works as expected on continuous epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -452,9 +485,11 @@ test_that("density works as expected on discrete epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -485,8 +520,10 @@ test_that("density works as expected on continuous epiparameter object with vect epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -502,9 +539,11 @@ test_that("density works as expected on discrete epiparameter object with vector epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -519,8 +558,10 @@ test_that("cdf works as expected on continuous epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -554,9 +595,11 @@ test_that("cdf works as expected on discrete epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -591,8 +634,10 @@ test_that("cdf works as expected on continuous epiparameter object with vector epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -609,9 +654,11 @@ test_that("cdf works as expected on discrete epiparameter object with vector epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -627,8 +674,10 @@ test_that("quantile works as expected on continuous epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -653,9 +702,11 @@ test_that("quantile works as expected on discrete epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -681,8 +732,10 @@ test_that("quantile works as expected on continuous epiparameter object with vec epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -698,9 +751,11 @@ test_that("quantile works as expected on discrete epiparameter object with vecto epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -715,8 +770,10 @@ test_that("generate works as expected on continuous epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -736,9 +793,11 @@ test_that("generate works as expected on discrete epiparameter object", { epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -759,8 +818,10 @@ test_that("generate fails as expected on continuous epiparameter object with vec epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) @@ -773,9 +834,11 @@ test_that("generate fails as expected on discrete epiparameter object with vecto epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) ) @@ -787,8 +850,10 @@ test_that("is_epiparameter returns TRUE when expected", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "serial_interval", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_true(is_epiparameter(ep)) @@ -798,8 +863,10 @@ test_that("is_epiparameter returns FALSE when expected", { false_ep <- list( disease = "ebola", epi_dist = "serial_interval", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) expect_false(is_epiparameter(false_ep)) @@ -810,8 +877,10 @@ test_that("discretise works as expected on continuous gamma", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) ep <- discretise(ep) @@ -825,8 +894,10 @@ test_that("discretise works as expected on continuous lognormal", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) )) ep <- discretise(ep) @@ -840,9 +911,11 @@ test_that("discretise works as expected on discretised dist", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) expect_message( discretise(ep), @@ -859,9 +932,11 @@ test_that("discretise works as expected on truncated dist", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - truncation = 10 + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + truncation = 10 + ) )) expect_warning( @@ -896,8 +971,10 @@ test_that("parameters works as expected on continuous gamma", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) params <- get_parameters(ep) @@ -910,8 +987,10 @@ test_that("parameters works as expected on continuous lognormal", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) )) params <- get_parameters(ep) @@ -924,9 +1003,11 @@ test_that("parameters works as expected on discretised dist", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) params <- get_parameters(ep) @@ -939,9 +1020,11 @@ test_that("parameters works as expected on truncated dist", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - truncation = 10 + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + truncation = 10 + ) )) params <- get_parameters(ep) @@ -972,8 +1055,10 @@ test_that("family works as expected for distributional", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) )) expect_identical(family(ep), "lnorm") }) @@ -983,9 +1068,11 @@ test_that("family works as expected for distcrete", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) expect_identical(family(ep), "gamma") }) @@ -995,9 +1082,11 @@ test_that("family works as expected for distributional truncated", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "weibull", - prob_distribution_params = c(shape = 1, scale = 1), - truncation = 10 + prob_distribution = create_prob_distribution( + prob_distribution = "weibull", + prob_distribution_params = c(shape = 1, scale = 1), + truncation = 10 + ) )) expect_identical(family(ep), "weibull") }) @@ -1007,8 +1096,10 @@ test_that("is_truncated works as expected for continuous distributions", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_false(is_truncated(ep)) }) @@ -1018,9 +1109,11 @@ test_that("is_truncated works as expected for discretised distributions", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) expect_false(is_truncated(ep)) }) @@ -1030,9 +1123,11 @@ test_that("is_truncated works as expected for truncated distributions", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - truncation = 10 + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + truncation = 10 + ) )) expect_true(is_truncated(ep)) }) @@ -1042,16 +1137,20 @@ test_that("is_continuous works as expected for continuous distributions", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) )) expect_true(is_continuous(ep)) ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_true(is_continuous(ep)) }) @@ -1061,17 +1160,21 @@ test_that("is_continuous works as expected for discrete distributions", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "offspring distribution", - prob_distribution = "nbinom", - prob_distribution_params = c(mean = 2, dispersion = 0.5) + prob_distribution = create_prob_distribution( + prob_distribution = "nbinom", + prob_distribution_params = c(mean = 2, dispersion = 0.5) + ) )) expect_false(is_continuous(ep)) ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) )) expect_false(is_continuous(ep)) }) @@ -1093,8 +1196,10 @@ test_that("mean works as expected with params and no mean", { epiparameter( disease = "Ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) ) expect_identical(mean(ep), 1) @@ -1128,8 +1233,10 @@ test_that("as.function works as expected for density", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) ep_func <- as.function(ep, func_type = "density") expect_type(ep_func, type = "closure") @@ -1141,8 +1248,10 @@ test_that("as.function works as expected for cdf", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) ep_func <- as.function(ep, func_type = "cdf") expect_type(ep_func, type = "closure") @@ -1154,8 +1263,10 @@ test_that("as.function works as expected for generate", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) ep_func <- as.function(ep, func_type = "generate") expect_type(ep_func, type = "closure") @@ -1167,8 +1278,10 @@ test_that("as.function works as expected for quantile", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) ep_func <- as.function(ep, func_type = "quantile") expect_type(ep_func, type = "closure") @@ -1180,8 +1293,10 @@ test_that("as.function fails as expected", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) expect_error( as.function(ep, func_type = "random"), @@ -1205,8 +1320,10 @@ test_that("as.data.frame works for ", { ep <- suppressMessages(epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) )) df <- as.data.frame(ep) expect_s3_class(df, class = "data.frame") From c3172f4776a9ff7d3cf455d1497a442e51ce5ae9 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 16:58:31 +0100 Subject: [PATCH 45/50] update as_epiparameter test to expect error --- tests/testthat/test-coercion.R | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/testthat/test-coercion.R b/tests/testthat/test-coercion.R index 8f8014f6d..354968cff 100644 --- a/tests/testthat/test-coercion.R +++ b/tests/testthat/test-coercion.R @@ -176,13 +176,12 @@ test_that("as_epiparameter fails as expected with overwritten prob_dist", { ebola_params$article_label == "Fallah 2015 (1)" ), ] - # suppress warning and message about citation - ebola_si_lnorm <- suppressWarnings( - suppressMessages( - as_epiparameter(ebola_si, prob_dist = "lnorm") - ) + expect_error( + suppressWarnings( + suppressMessages( + as_epiparameter(ebola_si, prob_dist = "lnorm") + ) + ), + regexp = "Incorrect parameters provided for probability distribution." ) - expect_s3_class(ebola_si_lnorm, class = "epiparameter") - expect_false(is_parameterised(ebola_si_lnorm)) - expect_identical(family(ebola_si_lnorm), "lnorm") }) From 48260cbc4ed54ba7b1876eaff6184216e75385eb Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 17:02:49 +0100 Subject: [PATCH 46/50] update function documentation for new function signatures --- R/epiparameter-utils.R | 2 +- man/create_prob_distribution.Rd | 4 +-- man/dot-calc_dist_params.Rd | 9 ++++--- man/dot-clean_params.Rd | 7 ++++- man/epiparameter.Rd | 40 ++++++++++----------------- man/new_epiparameter.Rd | 48 +++++++++++++++------------------ 6 files changed, 50 insertions(+), 60 deletions(-) diff --git a/R/epiparameter-utils.R b/R/epiparameter-utils.R index e8d306266..7896fb5a0 100644 --- a/R/epiparameter-utils.R +++ b/R/epiparameter-utils.R @@ -484,7 +484,7 @@ create_method_assess <- function(censored = NA, #' This check for valid parameters is independent of whether the distribution #' is truncated or discretised. #' -#' @inheritParams epiparameter +#' @inheritParams create_prob_distribution #' #' @return A boolean `logical`. #' @export diff --git a/man/create_prob_distribution.Rd b/man/create_prob_distribution.Rd index 164333b28..3c9adb308 100644 --- a/man/create_prob_distribution.Rd +++ b/man/create_prob_distribution.Rd @@ -22,8 +22,8 @@ geometric is \code{geom}).} parameters.} \item{discretise}{A boolean \code{logical} whether the distribution is -discretised. -Default is FALSE which assumes a continuous probability distribution} +discretised. Default is \code{FALSE} which assumes a continuous probability +distribution.} \item{truncation}{A \code{numeric} specifying the truncation point if the inferred distribution was truncated, \code{NA} if not or unknown.} diff --git a/man/dot-calc_dist_params.Rd b/man/dot-calc_dist_params.Rd index a185160c1..ea6f8f14f 100644 --- a/man/dot-calc_dist_params.Rd +++ b/man/dot-calc_dist_params.Rd @@ -8,10 +8,11 @@ summary statistics} .calc_dist_params(prob_distribution, summary_stats, sample_size) } \arguments{ -\item{prob_distribution}{A \code{character} string specifying the probability -distribution. This should match the \R naming convention of probability -distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and -geometric is \code{geom}).} +\item{prob_distribution}{An S3 class containing the probability +distribution or a character string if the parameters of the probability +distribution are unknown but the name of the distribution is known, or \code{NA} +if the distribution name and parameters are unknown. Use +\code{\link[=create_prob_distribution]{create_prob_distribution()}} to create \code{prob_distribution}.} \item{summary_stats}{A list of summary statistics, use \code{\link[=create_summary_stats]{create_summary_stats()}} to create list. This list can include diff --git a/man/dot-clean_params.Rd b/man/dot-clean_params.Rd index c2af46247..409aeb3d6 100644 --- a/man/dot-clean_params.Rd +++ b/man/dot-clean_params.Rd @@ -28,7 +28,12 @@ .clean_params_exp(prob_dist_params) } \arguments{ -\item{prob_dist_params}{A named vector of probability distribution +\item{prob_distribution}{A \code{character} string specifying the probability +distribution. This should match the \R naming convention of probability +distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and +geometric is \code{geom}).} + +\item{prob_distribution_params}{A named vector of probability distribution parameters.} } \value{ diff --git a/man/epiparameter.Rd b/man/epiparameter.Rd index 67c23cd50..a302612fa 100644 --- a/man/epiparameter.Rd +++ b/man/epiparameter.Rd @@ -8,17 +8,14 @@ epiparameter( disease, pathogen = NA_character_, epi_dist, - prob_distribution = NA_character_, - prob_distribution_params = NA_real_, + prob_distribution = create_prob_distribution(prob_distribution = NA_character_), uncertainty = create_uncertainty(), summary_stats = create_summary_stats(), - auto_calc_params = TRUE, citation = create_citation(), metadata = create_metadata(), method_assess = create_method_assess(), - discretise = FALSE, - truncation = NA_real_, notes = NULL, + auto_calc_params = TRUE, ... ) } @@ -31,13 +28,11 @@ disease, or \code{NA} if not known.} \item{epi_dist}{A \code{character} string with the name of the epidemiological distribution type.} -\item{prob_distribution}{A \code{character} string specifying the probability -distribution. This should match the \R naming convention of probability -distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and -geometric is \code{geom}).} - -\item{prob_distribution_params}{A named vector of probability distribution -parameters.} +\item{prob_distribution}{An S3 class containing the probability +distribution or a character string if the parameters of the probability +distribution are unknown but the name of the distribution is known, or \code{NA} +if the distribution name and parameters are unknown. Use +\code{\link[=create_prob_distribution]{create_prob_distribution()}} to create \code{prob_distribution}.} \item{uncertainty}{A list of named vectors with the uncertainty around the probability distribution parameters. If uncertainty around the parameter @@ -53,13 +48,6 @@ data used to fit the distribution such as lower and upper range. The summary statistics can also include uncertainty around metrics such as confidence interval around mean and standard deviation.} -\item{auto_calc_params}{A boolean \code{logical} determining whether to try and -calculate the probability distribution parameters from summary statistics if -distribution parameters are not provided. Default is \code{TRUE}. In the case when -sufficient summary statistics are provided and the parameter(s) of the -distribution are not, the \code{\link[=.calc_dist_params]{.calc_dist_params()}} function is called to -calculate the parameters and add them to the \code{epiparameter} object created.} - \item{citation}{A \verb{} with the citation of the source of the data or the paper that inferred the distribution parameters, use \code{\link[=create_citation]{create_citation()}} to create citation.} @@ -76,16 +64,16 @@ delay distribution such as extrinsic incubation period) unless the distribution, use \code{\link[=create_method_assess]{create_method_assess()}} to create method assessment.} -\item{discretise}{A boolean \code{logical} whether the distribution is -discretised. -Default is FALSE which assumes a continuous probability distribution} - -\item{truncation}{A \code{numeric} specifying the truncation point if the inferred -distribution was truncated, \code{NA} if not or unknown.} - \item{notes}{A \code{character} string with any additional information about the data, inference method or disease.} +\item{auto_calc_params}{A boolean \code{logical} determining whether to try and +calculate the probability distribution parameters from summary statistics if +distribution parameters are not provided. Default is \code{TRUE}. In the case when +sufficient summary statistics are provided and the parameter(s) of the +distribution are not, the \code{\link[=.calc_dist_params]{.calc_dist_params()}} function is called to +calculate the parameters and add them to the \code{epiparameter} object created.} + \item{...}{\link{dots} Extra arguments to be passed to internal functions. This is most commonly used to pass arguments to \code{\link[distcrete:distcrete]{distcrete::distcrete()}} diff --git a/man/new_epiparameter.Rd b/man/new_epiparameter.Rd index 7719ff079..f5e39bc30 100644 --- a/man/new_epiparameter.Rd +++ b/man/new_epiparameter.Rd @@ -8,17 +8,14 @@ new_epiparameter( disease = character(), pathogen = character(), epi_dist = character(), - prob_dist = list(), - prob_dist_params = numeric(), + prob_distribution = list(), uncertainty = list(), summary_stats = list(), - auto_calc_params = logical(), citation = character(), metadata = list(), method_assess = list(), - discretise = logical(), - truncation = numeric(), notes = character(), + auto_calc_params = logical(), ... ) } @@ -31,13 +28,11 @@ disease, or \code{NA} if not known.} \item{epi_dist}{A \code{character} string with the name of the epidemiological distribution type.} -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability -distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and -geometric is \code{geom}).} - -\item{prob_dist_params}{A named vector of probability distribution -parameters.} +\item{prob_distribution}{An S3 class containing the probability +distribution or a character string if the parameters of the probability +distribution are unknown but the name of the distribution is known, or \code{NA} +if the distribution name and parameters are unknown. Use +\code{\link[=create_prob_distribution]{create_prob_distribution()}} to create \code{prob_distribution}.} \item{uncertainty}{A list of named vectors with the uncertainty around the probability distribution parameters. If uncertainty around the parameter @@ -53,13 +48,6 @@ data used to fit the distribution such as lower and upper range. The summary statistics can also include uncertainty around metrics such as confidence interval around mean and standard deviation.} -\item{auto_calc_params}{A boolean \code{logical} determining whether to try and -calculate the probability distribution parameters from summary statistics if -distribution parameters are not provided. Default is \code{TRUE}. In the case when -sufficient summary statistics are provided and the parameter(s) of the -distribution are not, the \code{\link[=.calc_dist_params]{.calc_dist_params()}} function is called to -calculate the parameters and add them to the \code{epiparameter} object created.} - \item{citation}{A \verb{} with the citation of the source of the data or the paper that inferred the distribution parameters, use \code{\link[=create_citation]{create_citation()}} to create citation.} @@ -76,22 +64,30 @@ delay distribution such as extrinsic incubation period) unless the distribution, use \code{\link[=create_method_assess]{create_method_assess()}} to create method assessment.} -\item{discretise}{A boolean \code{logical} whether the distribution is -discretised. -Default is FALSE which assumes a continuous probability distribution} - -\item{truncation}{A \code{numeric} specifying the truncation point if the inferred -distribution was truncated, \code{NA} if not or unknown.} - \item{notes}{A \code{character} string with any additional information about the data, inference method or disease.} +\item{auto_calc_params}{A boolean \code{logical} determining whether to try and +calculate the probability distribution parameters from summary statistics if +distribution parameters are not provided. Default is \code{TRUE}. In the case when +sufficient summary statistics are provided and the parameter(s) of the +distribution are not, the \code{\link[=.calc_dist_params]{.calc_dist_params()}} function is called to +calculate the parameters and add them to the \code{epiparameter} object created.} + \item{...}{\link{dots} Extra arguments to be passed to internal functions. This is most commonly used to pass arguments to \code{\link[distcrete:distcrete]{distcrete::distcrete()}} that construct the discretised distribution S3 object. To see which arguments can be adjusted for discretised distributions see \code{\link[distcrete:distcrete]{distcrete::distcrete()}}.} + +\item{prob_dist}{A character string specifying the probability +distribution. This should match the R naming convention of probability +distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and +geometric is \code{geom}).} + +\item{prob_dist_params}{A named vector of probability distribution +parameters.} } \value{ An \verb{} object. From b183fffbc14a84fbfd2a4f2ac3b09989d71c83f8 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 18:15:21 +0100 Subject: [PATCH 47/50] update examples to use new epiparameter function signature --- R/checkers.R | 6 ++- R/epiparameter.R | 88 ++++++++++++++++++++++++-------------- R/plot.R | 6 ++- man/discretise.Rd | 6 ++- man/epiparameter.Rd | 24 +++++++---- man/family.epiparameter.Rd | 14 +++--- man/format.epiparameter.Rd | 6 ++- man/is_continuous.Rd | 12 ++++-- man/is_epiparameter.Rd | 6 ++- man/is_parameterised.Rd | 6 ++- man/is_truncated.Rd | 14 +++--- man/plot.epiparameter.Rd | 6 ++- man/print.epiparameter.Rd | 6 ++- 13 files changed, 130 insertions(+), 70 deletions(-) diff --git a/R/checkers.R b/R/checkers.R index 35139714b..2de76462b 100644 --- a/R/checkers.R +++ b/R/checkers.R @@ -16,8 +16,10 @@ #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' is_parameterised(ep) #' diff --git a/R/epiparameter.R b/R/epiparameter.R index 7fca67868..4c3dac102 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -173,17 +173,21 @@ new_epiparameter <- function(disease = character(), #' ebola_incubation <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' #' # minimal input required for discrete `epiparameter` #' ebola_incubation <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1), -#' discretise = TRUE +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), +#' discretise = TRUE +#' ) #' ) #' #' # example with more fields filled in @@ -191,8 +195,12 @@ new_epiparameter <- function(disease = character(), #' disease = "ebola", #' pathogen = "ebola_virus", #' epi_dist = "incubation", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1), +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1), +#' discretise = FALSE, +#' truncation = NA +#' ), #' uncertainty = create_uncertainty(), #' summary_stats = create_summary_stats(mean = 2, sd = 1), #' citation = create_citation( @@ -211,8 +219,6 @@ new_epiparameter <- function(disease = character(), #' method_assess = create_method_assess( #' censored = TRUE #' ), -#' discretise = FALSE, -#' truncation = NA, #' notes = "No notes" #' ) epiparameter <- function(disease, @@ -381,8 +387,10 @@ test_epiparameter <- function(x) { # nolint cyclocomp_linter #' epiparameter <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' epiparameter print.epiparameter <- function(x, ...) { @@ -401,8 +409,10 @@ print.epiparameter <- function(x, ...) { #' epiparameter <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' format(epiparameter) format.epiparameter <- function(x, ...) { @@ -463,8 +473,10 @@ format.epiparameter <- function(x, ...) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "serial_interval", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' #' is_epiparameter(ep) @@ -615,8 +627,10 @@ generate.epiparameter <- function(x, times, ...) { #' ebola_incubation <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' discretise(ebola_incubation) discretise <- function(x, ...) { @@ -710,8 +724,10 @@ discretise.default <- function(x, ...) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' family(ep) #' @@ -719,9 +735,11 @@ discretise.default <- function(x, ...) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "lnorm", -#' prob_distribution_params = c(meanlog = 1, sdlog = 1), -#' discretise = TRUE +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "lnorm", +#' prob_distribution_params = c(meanlog = 1, sdlog = 1), +#' discretise = TRUE +#' ) #' ) #' family(ep) family.epiparameter <- function(object, ...) { @@ -775,17 +793,21 @@ family.epiparameter <- function(object, ...) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "lnorm", -#' prob_distribution_params = c(meanlog = 1, sdlog = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "lnorm", +#' prob_distribution_params = c(meanlog = 1, sdlog = 1) +#' ) #' ) #' is_truncated(ep) #' #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "lnorm", -#' prob_distribution_params = c(meanlog = 1, sdlog = 1), -#' truncation = 10 +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "lnorm", +#' prob_distribution_params = c(meanlog = 1, sdlog = 1), +#' truncation = 10 +#' ) #' ) #' is_truncated(ep) is_truncated <- function(x) { @@ -830,8 +852,10 @@ is_truncated <- function(x) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "lnorm", -#' prob_distribution_params = c(meanlog = 1, sdlog = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "lnorm", +#' prob_distribution_params = c(meanlog = 1, sdlog = 1) +#' ) #' ) #' is_continuous(ep) #' is_continuous(discretise(ep)) @@ -839,8 +863,10 @@ is_truncated <- function(x) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "offspring distribution", -#' prob_distribution = "nbinom", -#' prob_distribution_params = c(mean = 2, dispersion = 0.5) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "nbinom", +#' prob_distribution_params = c(mean = 2, dispersion = 0.5) +#' ) #' ) #' is_continuous(ep) is_continuous <- function(x) { diff --git a/R/plot.R b/R/plot.R index 38836a0f9..bea286975 100644 --- a/R/plot.R +++ b/R/plot.R @@ -26,8 +26,10 @@ #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 2, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 2, scale = 1) +#' ) #' ) #' plot(ep) #' diff --git a/man/discretise.Rd b/man/discretise.Rd index bb0b25ae1..878728996 100644 --- a/man/discretise.Rd +++ b/man/discretise.Rd @@ -35,8 +35,10 @@ discretised distribution (using an object from the \code{{distcrete}} package). ebola_incubation <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) discretise(ebola_incubation) } diff --git a/man/epiparameter.Rd b/man/epiparameter.Rd index a302612fa..0a3fccc5d 100644 --- a/man/epiparameter.Rd +++ b/man/epiparameter.Rd @@ -119,17 +119,21 @@ Accepted \verb{} distribution parameterisations are: ebola_incubation <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) # minimal input required for discrete `epiparameter` ebola_incubation <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = TRUE + ) ) # example with more fields filled in @@ -137,8 +141,12 @@ ebola_incubation <- epiparameter( disease = "ebola", pathogen = "ebola_virus", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1), + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1), + discretise = FALSE, + truncation = NA + ), uncertainty = create_uncertainty(), summary_stats = create_summary_stats(mean = 2, sd = 1), citation = create_citation( @@ -157,8 +165,6 @@ ebola_incubation <- epiparameter( method_assess = create_method_assess( censored = TRUE ), - discretise = FALSE, - truncation = NA, notes = "No notes" ) } diff --git a/man/family.epiparameter.Rd b/man/family.epiparameter.Rd index 0417b2251..ab14c2e7e 100644 --- a/man/family.epiparameter.Rd +++ b/man/family.epiparameter.Rd @@ -26,8 +26,10 @@ output irrespective of the internal distribution class. ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) family(ep) @@ -35,9 +37,11 @@ family(ep) ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1), - discretise = TRUE + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1), + discretise = TRUE + ) ) family(ep) } diff --git a/man/format.epiparameter.Rd b/man/format.epiparameter.Rd index 930f74db3..07bf8e618 100644 --- a/man/format.epiparameter.Rd +++ b/man/format.epiparameter.Rd @@ -22,8 +22,10 @@ Format method for \verb{} class epiparameter <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) format(epiparameter) } diff --git a/man/is_continuous.Rd b/man/is_continuous.Rd index 0ce293433..8743e0f5a 100644 --- a/man/is_continuous.Rd +++ b/man/is_continuous.Rd @@ -26,8 +26,10 @@ binomial), and all \verb{} objects are discrete. ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) ) is_continuous(ep) is_continuous(discretise(ep)) @@ -35,8 +37,10 @@ is_continuous(discretise(ep)) ep <- epiparameter( disease = "ebola", epi_dist = "offspring distribution", - prob_distribution = "nbinom", - prob_distribution_params = c(mean = 2, dispersion = 0.5) + prob_distribution = create_prob_distribution( + prob_distribution = "nbinom", + prob_distribution_params = c(mean = 2, dispersion = 0.5) + ) ) is_continuous(ep) } diff --git a/man/is_epiparameter.Rd b/man/is_epiparameter.Rd index 489a357c0..37bca1ec2 100644 --- a/man/is_epiparameter.Rd +++ b/man/is_epiparameter.Rd @@ -20,8 +20,10 @@ Check object is an \verb{} ep <- epiparameter( disease = "ebola", epi_dist = "serial_interval", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) is_epiparameter(ep) diff --git a/man/is_parameterised.Rd b/man/is_parameterised.Rd index 3ca83db4c..c34eaaa06 100644 --- a/man/is_parameterised.Rd +++ b/man/is_parameterised.Rd @@ -31,8 +31,10 @@ distribution and distribution parameters ep <- epiparameter( disease = "ebola", epi_dist = "incubation", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) is_parameterised(ep) diff --git a/man/is_truncated.Rd b/man/is_truncated.Rd index d86c81f36..546784b00 100644 --- a/man/is_truncated.Rd +++ b/man/is_truncated.Rd @@ -26,17 +26,21 @@ return \code{FALSE} by default. ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1) + ) ) is_truncated(ep) ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "lnorm", - prob_distribution_params = c(meanlog = 1, sdlog = 1), - truncation = 10 + prob_distribution = create_prob_distribution( + prob_distribution = "lnorm", + prob_distribution_params = c(meanlog = 1, sdlog = 1), + truncation = 10 + ) ) is_truncated(ep) } diff --git a/man/plot.epiparameter.Rd b/man/plot.epiparameter.Rd index d9f32bfe8..49d8ac80a 100644 --- a/man/plot.epiparameter.Rd +++ b/man/plot.epiparameter.Rd @@ -32,8 +32,10 @@ first and last day to plot on the x-axis can be supplied to \code{xlim} ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 2, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 2, scale = 1) + ) ) plot(ep) diff --git a/man/print.epiparameter.Rd b/man/print.epiparameter.Rd index ac3b04e75..263d4af00 100644 --- a/man/print.epiparameter.Rd +++ b/man/print.epiparameter.Rd @@ -21,8 +21,10 @@ Print method for \verb{} class epiparameter <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) epiparameter } From 3c72803c47c11e495e25fbc9684ca343246ae93d Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 18:30:55 +0100 Subject: [PATCH 48/50] remove outdated argument documentation from new_epiparameter --- R/epiparameter.R | 6 ------ man/new_epiparameter.Rd | 8 -------- 2 files changed, 14 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 4c3dac102..001e58bca 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -9,12 +9,6 @@ #' `{distributional}` when `discretise = FALSE`, or a `distcrete` object from #' `{distcrete}` when `discretise = TRUE`. #' -#' @param prob_dist A character string specifying the probability -#' distribution. This should match the R naming convention of probability -#' distributions (e.g. lognormal is `lnorm`, negative binomial is `nbinom`, and -#' geometric is `geom`). -#' @param prob_dist_params A named vector of probability distribution -#' parameters. #' @inheritParams epiparameter #' #' @inherit epiparameter return diff --git a/man/new_epiparameter.Rd b/man/new_epiparameter.Rd index f5e39bc30..fbac046fc 100644 --- a/man/new_epiparameter.Rd +++ b/man/new_epiparameter.Rd @@ -80,14 +80,6 @@ This is most commonly used to pass arguments to \code{\link[distcrete:distcrete] that construct the discretised distribution S3 object. To see which arguments can be adjusted for discretised distributions see \code{\link[distcrete:distcrete]{distcrete::distcrete()}}.} - -\item{prob_dist}{A character string specifying the probability -distribution. This should match the R naming convention of probability -distributions (e.g. lognormal is \code{lnorm}, negative binomial is \code{nbinom}, and -geometric is \code{geom}).} - -\item{prob_dist_params}{A named vector of probability distribution -parameters.} } \value{ An \verb{} object. From 9b197d98592a85310f18abc3d5075c27dc906138 Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 18:33:00 +0100 Subject: [PATCH 49/50] correctly specify uncertainty in epiparameter() example --- R/epiparameter.R | 5 ++++- man/epiparameter.Rd | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 001e58bca..61d4597c8 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -195,7 +195,10 @@ new_epiparameter <- function(disease = character(), #' discretise = FALSE, #' truncation = NA #' ), -#' uncertainty = create_uncertainty(), +#' uncertainty = list( +#' shape = create_uncertainty(), +#' scale = create_uncertainty() +#' ), #' summary_stats = create_summary_stats(mean = 2, sd = 1), #' citation = create_citation( #' author = person(given = "John", family = "Smith"), diff --git a/man/epiparameter.Rd b/man/epiparameter.Rd index 0a3fccc5d..3474b0fe4 100644 --- a/man/epiparameter.Rd +++ b/man/epiparameter.Rd @@ -147,7 +147,10 @@ ebola_incubation <- epiparameter( discretise = FALSE, truncation = NA ), - uncertainty = create_uncertainty(), + uncertainty = list( + shape = create_uncertainty(), + scale = create_uncertainty() + ), summary_stats = create_summary_stats(mean = 2, sd = 1), citation = create_citation( author = person(given = "John", family = "Smith"), From d3453e04bc411da115c32cfe410b7838749ccc9d Mon Sep 17 00:00:00 2001 From: Joshua Lambert Date: Wed, 25 Sep 2024 18:38:33 +0100 Subject: [PATCH 50/50] fix epiparameter example --- R/epiparameter.R | 6 ++++-- man/epiparameter_distribution_functions.Rd | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/R/epiparameter.R b/R/epiparameter.R index 61d4597c8..9dd2031cc 100644 --- a/R/epiparameter.R +++ b/R/epiparameter.R @@ -516,8 +516,10 @@ is_epiparameter <- function(x) { #' ep <- epiparameter( #' disease = "ebola", #' epi_dist = "incubation_period", -#' prob_distribution = "gamma", -#' prob_distribution_params = c(shape = 1, scale = 1) +#' prob_distribution = create_prob_distribution( +#' prob_distribution = "gamma", +#' prob_distribution_params = c(shape = 1, scale = 1) +#' ) #' ) #' #' # example of each distribution method for an `epiparameter` object diff --git a/man/epiparameter_distribution_functions.Rd b/man/epiparameter_distribution_functions.Rd index 89b5c3296..d2c4e06c9 100644 --- a/man/epiparameter_distribution_functions.Rd +++ b/man/epiparameter_distribution_functions.Rd @@ -46,8 +46,10 @@ functions. These operate on any distribution that can be included in an ep <- epiparameter( disease = "ebola", epi_dist = "incubation_period", - prob_distribution = "gamma", - prob_distribution_params = c(shape = 1, scale = 1) + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 1, scale = 1) + ) ) # example of each distribution method for an `epiparameter` object